又開發了一個優雅的小工具!

在開源項目中,Issues是一個強大的功能,用于跟蹤bug、功能請求和任務。然而,隨著項目的發展,Issues可能會變得難以管理,特別是當你需要離線訪問或進行深入分析時。

當然GitHub Issues除了上述功能以外,做在線筆記也非常的方便,它支持Markdown語法,還能打標簽、分層等等,還天然的支持評論功能。由于我本人就非常熱衷于使用Issue做筆記,但是問題就是在離線環境下無法使用,那么能不能把Issue作為離線Markdown文件下載到本地呢?

答案顯然是可以的,也是我本次項目的主要功能之一。

issue2file是一個用Go語言編寫的命令行工具,它可以將GitHub倉庫中的Issues導出為本地Markdown文件,并提供多種強大的功能:

1)完整內容保留:保留Issue的標題、內容、標簽、狀態、創建時間等信息

2)評論支持:可選擇性地下載Issue的所有評論

除此之外,我想了想能不能通過AI擴展一下?答案顯然也是可以的,所以還補充了如下功能:

3)AI分析:集成AI功能,可以對Issues進行智能分析和總結

4)數據可視化:自動生成多種圖表,包括Issue狀態分布、標簽分布和時間趨勢等

項目介紹

還是先說一下使用方式吧,當然如果想要支持私有倉庫和AI功能的話,需要拿到自己的Github Token和DeepSeek的API Token。

1)倉庫地址

https://github.com/ibarryyan/issue2file

2)工具構建

go mod tidy 
go build 

3)使用方式

最簡單的使用方式就是直接運行可執行文件,加上倉庫鏈接作為參數,比如

./issue2file ibarryyan/golang-tips-100

如果想要拉取自己的私有倉庫就要先生成一個自己的Github Token,然后使用命令行參數或者配置文件進行啟動,詳細說明可以參考:

https://github.com/ibarryyan/issue2file/blob/master/README.md

當然了,還有額外的參數能支持生成圖表分析倉庫的所有Issue,主要有Issue創建時間趨勢、狀態分析和標簽分布等幾個維度:

技術實現

issue2file采用模塊化設計,主要包含以下幾個核心組件:

1)配置管理:使用Viper庫處理配置文件

2)GitHub API交互:使用go-github庫獲取Issues數據

3)Markdown生成:將Issue數據轉換為Markdown格式

4)AI分析:集成AI能力對Issues進行分析

5)圖表生成:使用go-echarts庫生成數據可視化圖表

關鍵技術點

1)配置管理

項目使用Viper庫來處理配置,支持從配置文件中讀取各種參數:

func InitConfig() {viper.SetConfigName("config")viper.SetConfigType("conf")viper.AddConfigPath(".")if err := viper.ReadInConfig(); err != nil {log.Fatalf("Error reading config file: %s", err)}// 讀取配置項Config.GitHubToken = viper.GetString("gitHubToken")Config.AIToken = viper.GetString("aiToken")Config.CommentEnable = viper.GetBool("commentEnable")Config.AIEnable = viper.GetBool("aiEnable")Config.ChartEnable = viper.GetBool("chartEnable")Config.OutputDir = viper.GetString("outputDir")Config.SummaryFile = viper.GetString("summaryFile")
}

2)GitHub API交互

使用go-github庫與GitHub API進行交互,獲取Issues數據:

func FetchIssues(owner, repo string) ([]*github.Issue, error) {ctx := context.Background()ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: Config.GitHubToken},)tc := oauth2.NewClient(ctx, ts)client := github.NewClient(tc)opt := &github.IssueListByRepoOptions{State:     "all",Sort:      "created",Direction: "desc",ListOptions: github.ListOptions{PerPage: 100,},}var allIssues []*github.Issuefor {issues, resp, err := client.Issues.ListByRepo(ctx, owner, repo, opt)if err != nil {return nil, err}allIssues = append(allIssues, issues...)if resp.NextPage == 0 {break}opt.Page = resp.NextPage}return allIssues, nil
}

3)Markdown生成

將Issue數據轉換為結構化的Markdown文件:

func GenerateMarkdown(issue *github.Issue, comments []*github.IssueComment) string {var md strings.Builder// 添加標題md.WriteString(fmt.Sprintf("# %s\n\n", *issue.Title))// 添加元數據md.WriteString(fmt.Sprintf("- **Issue編號**: #%d\n", *issue.Number))md.WriteString(fmt.Sprintf("- **創建者**: %s\n", *issue.User.Login))md.WriteString(fmt.Sprintf("- **創建時間**: %s\n", issue.CreatedAt.Format("2006-01-02 15:04:05")))md.WriteString(fmt.Sprintf("- **狀態**: %s\n", *issue.State))// 添加標簽if len(issue.Labels) > 0 {md.WriteString("- **標簽**: ")for i, label := range issue.Labels {if i > 0 {md.WriteString(", ")}md.WriteString(*label.Name)}md.WriteString("\n")}// 添加正文md.WriteString("\n## 內容\n\n")md.WriteString(*issue.Body)// 添加評論if len(comments) > 0 {md.WriteString("\n\n## 評論\n\n")for _, comment := range comments {md.WriteString(fmt.Sprintf("### %s 評論于 %s\n\n", *comment.User.Login, comment.CreatedAt.Format("2006-01-02 15:04:05")))md.WriteString(*comment.Body)md.WriteString("\n\n---\n\n")}}return md.String()
}

4)AI分析

集成AI能力,對Issues進行智能分析和總結:

func AnalyzeIssues(issues []*github.Issue) (string, error) {if !Config.AIEnable || Config.AIToken == "" {return "", errors.New("AI analysis is disabled or token is not provided")}// 準備AI分析的輸入數據var input strings.Builderinput.WriteString("請分析以下GitHub Issues,并提供總結報告:\n\n")for _, issue := range issues {input.WriteString(fmt.Sprintf("Issue #%d: %s\n", *issue.Number, *issue.Title))input.WriteString(fmt.Sprintf("狀態: %s\n", *issue.State))input.WriteString(fmt.Sprintf("創建時間: %s\n", issue.CreatedAt.Format("2006-01-02")))input.WriteString("標簽: ")for i, label := range issue.Labels {if i > 0 {input.WriteString(", ")}input.WriteString(*label.Name)}input.WriteString("\n\n")// 限制內容長度,避免超出AI API的限制body := *issue.Bodyif len(body) > 500 {body = body[:500] + "..."}input.WriteString(body)input.WriteString("\n\n---\n\n")}// 調用AI API進行分析analysis, err := callAIAPI(input.String())if err != nil {return "", err}return analysis, nil
}

5)圖表生成

使用go-echarts庫生成數據可視化圖表:

func GenerateCharts(issues []*github.Issue, outputDir string) error {if !Config.ChartEnable {return nil}// 生成狀態分布圖if err := generateStatusChart(issues, outputDir); err != nil {return err}// 生成標簽分布圖if err := generateTagsChart(issues, outputDir); err != nil {return err}// 生成時間趨勢圖if err := generateTimeChart(issues, outputDir); err != nil {return err}return nil
}

全部代碼目前已經開源,大家可以去Github上拉取~~

開源成果

issue2file項目在開源后的一周內就獲得了29個star,這種積極的社區反饋不僅驗證了項目的價值,也為未來的發展提供了動力。

在這里主要感謝@ruanyf老師在《科技愛好者周刊》中的推薦!

總結與規劃

issue2file成功地實現了將GitHub Issues轉換為本地Markdown文件的核心功能,并通過AI分析和數據可視化等特性提供了額外的價值。

基于社區反饋和項目愿景,未來的發展計劃包括:

功能增強

  • 添加增量更新功能,只下載新的或更新的Issues
  • 增強AI分析能力,提供更深入的洞察

用戶體驗改進

  • 提供Web界面,使非技術用戶也能輕松使用
  • 添加進度顯示和更詳細的日志
  • 完善文檔和示例

如果你對這個項目感興趣,歡迎訪問GitHub倉庫(https://github.com/ibarryyan/issue2file),給項目點個star,或者貢獻代碼!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94068.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【安裝教程】Docker Desktop 安裝與使用教程

文章目錄一、環境要求二、安裝步驟2.1 安裝 WSL 2(適用于非專業版 Windows 10 及 Windows 11)2.2 安裝 Docker Desktop2.3 漢化 DDocker Desktop2.4 卸載 Docker Desktop三、使用 Docker3.1驗證安裝3.2. 拉取鏡像3.3. 運行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感詞檢測)

package cn.hutool.dfa;WordTree 繼承自 HashMap<Character, WordTree>&#xff0c;表示一個字符到子樹的映射&#xff0c;構成一顆“詞樹”&#xff08;類似 Trie 樹&#xff09;&#xff0c;用于快速匹配字符串中的詞語&#xff08;敏感詞檢測、關鍵詞匹配等&#xff0…

Makefile 從入門到精通:自動化構建的藝術

引入 在軟件開發的世界里&#xff0c;“編譯” 是繞不開的環節&#xff0c;但手動編譯大型項目時&#xff0c;重復輸入編譯命令的痛苦&#xff0c;相信每個開發者都深有體會。Makefile 作為自動化構建的基石&#xff0c;能讓編譯過程“一鍵完成”&#xff0c;甚至智能判斷文件變…

利用DeepSeek將Rust程序的緩沖輸出改寫為C語言實現提高輸出效率

在前面多語言測試中&#xff0c;遇到一個難以置信的問題&#xff0c;rust的輸出到文件比c語言還快&#xff0c;這是不合情理的&#xff0c;通過對兩者輸出語句的比較&#xff0c;發現了不同。 rust程序在輸出到stdout前有這么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 類教程詳解

一、Optional 類核心定位Optional 是 Java 8 引入的函數式容器類&#xff08;java.util.Optional&#xff09;&#xff0c;專為??顯式空值處理??設計。其核心價值在于&#xff1a;消除 60% 以上的傳統 null 檢查代碼通過類型系統強制空值聲明&#xff0c;降低 NPE 風險支持…

Agent X MCP 把想法編譯成現實

多模態GUI智能體協作型AI魔搭社區MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快遞單號</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填寫快遞單號&…

[AI8051U入門第十二步]W5500-Modbus TCP從機

學習目標: 1、了解Modbus Tcp協議 2、學習Modbus Tcp 從機程序驅動 3、使用 Modbus Pull調試一、Modbus TCP介紹? Modbus TCP 是一種基于 TCP/IP 網絡的工業通信協議,是 Modbus 協議家族中的一員,專門為以太網環境設計。它是 Modbus RTU(串行通信)協議的擴展,將 Modbus…

Python編程基礎與實踐:Python循環結構基礎

循環結構 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中for循環和while循環的基本使用方法&#xff0c;了解如何利用循環結構來重復執行代碼塊&#xff0c;以及如何使用break和continue語句來控制循環的執行流程。 相關知識點 循環結構 學習內容 1 循環結構 1.1 …

趣談設計模式之模板方法模式-老板,你的數字咖啡制作好了,請享用!

模板方法模式 定義了一套算法的骨架&#xff0c;講某些具體的步驟延遲到子類中實現。 主要用于不改變算法結構的情況下重新定義算法的某些步驟&#xff0c;以適應新的需求。 模板方法的角色 抽象類&#xff1a; 作為算法的骨架&#xff0c;該抽象類中包含了算法的核心部分和…

技術棧:基于Java語言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平臺

一、市場背景1、社會發展與生活方式轉變城市化進程加快&#xff1a;隨著城市化不斷推進&#xff0c;大量人口涌入城市&#xff0c;人們生活的物理空間距離拉近了&#xff0c;但人際關系卻在一定程度上變得疏離。傳統的基于血緣、地緣建立起的緊密社交關系難以滿足城市生活中的多…

字典在VBA與VB.NET的區別,舉例說明

簡述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary對象&#xff0c;通過CreateObject("Scripting.Dictionary")創建。它需要引用Microsoft Scripting Runtime庫&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年網絡安全案例

以下是2024年造成嚴重損失的網絡安全典型案例&#xff0c;涵蓋市政系統、金融交易、區塊鏈平臺、國家級攻擊及全球性IT故障五大領域&#xff0c;按損失規模和技術危害性綜合排序&#xff1a;---一、市政基礎設施攻擊 1. 加拿大漢密爾頓市勒索軟件事件 - 損失&#xff1a;183…

PINN+貝葉斯:深度學習中的魔改新思路

2025深度學習發論文&模型漲點之——PINN貝葉斯PINN通過將物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神經網絡的損失函數中&#xff0c;使得模型能夠利用已知的物理規律來指導學習過程&#xff0c;從而在數據有限或噪聲較多的情況下實現更高的準確性。然而&…

零基礎-動手學深度學習-8.3. 語言模型和數據集

很至關重要的一章: 8.3.1. 學習語言模型 8.3.2. 馬爾可夫模型與n元語法 n元語法看的序列長度是固定的&#xff0c; 存儲的序列長是有限且可控的&#xff0c;使用統計方法的時候通常使用這個模型&#xff01;&#xff01;&#xff01;統計方法&#xff01;&#xff01;&#x…

C++ 模板初階

什么是模板&#xff1f; 模板&#xff08;Template&#xff09;是 C 中實現泛型編程的核心工具。它允許我們編寫與具體數據類型無關的代碼&#xff0c;從而實現代碼復用和類型安全。為什么需要模板&#xff1f; 舉個生活中的例子&#xff1a;如果你要造一個能裝水的杯子&#x…

DockerFile文件執行docker bulid自動構建鏡像

文章目錄一、Dockerfile介紹二、Dockerfile鏡像制作和流程使用三、Dockerfile文件的制作鏡像的分層結構四、Dockerfile文件格式五、Dockerfile相關指令5.1 FROML&#xff1a;指定基礎鏡像5.2 LABEL&#xff1a;指定鏡像元數據5.3 RUN&#xff1a;執行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函數分析之HW_CURSOR--NTLDR源代碼分析之設置光標

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及節點級別增刪改查技術

以下是針對 Elasticsearch 索引及節點級別增刪改查技術做的簡短總結&#xff1a; 一、索引操作創建索引 功能&#xff1a;指定分片、副本數及映射規則[2][4]。示例&#xff1a;PUT /<index_name>?&#xff0c;可定義 settings&#xff08;如分片數&#xff09;和 mappin…

烽火HG680-KD_海思MV320處理器-安卓9-原廠系統升級包-針對解決燒錄不進系統的問題

烽火HG680-KD_海思MV320處理器-安卓9-原廠系統升級包&#xff08;注意是&#xff08;原機系統&#xff09;&#xff09;-主要是針對解決TTL燒錄后仍然不進系統使用。HG680-KD&#xff0f;HG680-KE&#xff0f;HG680-KF&#xff0f;HG680-KX 均通用。 說明&#xff1a; 前一個…