Skip to content

Commit 693bb70

Browse files
authored
Llm (#3)
1 parent c3d6314 commit 693bb70

File tree

10 files changed

+292
-78
lines changed

10 files changed

+292
-78
lines changed

README.md

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
# Ingest
22

3-
Ingest is a command-line tool designed to parse directories of plain text files, such as source code, into a single markdown file.
3+
Ingest is a tool I've written to make my life easier when preparing content for LLMs.
44

5-
It's intended use case is for preparing content to be provided to AI/LLMs.
5+
It parses directories of plain text files, such as source code, into a single markdown file suitable for ingestion by AI/LLMs.
66

7-
![ingest screenshot](screenshot.png)
7+
![ingest with --llm](screenshot.png)
88

99
## Features
1010

1111
- Traverse directory structures and generate a tree view
1212
- Include/exclude files based on glob patterns
13-
- Parse output directly to Ollama for processing
13+
- Parse output directly to LLMs such as Ollama or any OpenAI compatible API for processing
1414
- Generate and include git diffs and logs
1515
- Count approximate tokens for LLM compatibility
1616
- Customisable output templates
@@ -74,39 +74,41 @@ Generate a prompt and save to a file:
7474
ingest -o output.md /path/to/project
7575
```
7676

77-
## Ollama Integration
77+
## LLM Integration
7878

79-
Ingest can pass the generated prompt to [Ollama](https://ollama.com) for processing.
80-
81-
![ingest ollama](ollama-ingest.png)
79+
Ingest can pass the generated prompt to LLMs that have an OpenAI compatible API such as [Ollama](https://ollama.com) for processing.
8280

8381
```shell
84-
ingest --ollama /path/to/project
82+
ingest --llm /path/to/project
8583
```
8684

87-
By default this will ask you to enter a prompt:
85+
By default this will use any prompt suffix from your configuration file:
8886

8987
```shell
90-
./ingest utils.go --ollama
88+
./ingest utils.go --llm
9189
⠋ Traversing directory and building tree... [0s]
92-
[!] Enter Ollama prompt:
93-
explain this code
9490
This is Go code for a file named `utils.go`. It contains various utility functions for
9591
handling terminal output, clipboard operations, and configuration directories.
9692
...
9793
```
9894

95+
You can provide a prompt suffix to append to the generated prompt:
96+
97+
```shell
98+
ingest --llm -p "explain this code" /path/to/project
99+
```
100+
99101
## Configuration
100102

101103
Ingest uses a configuration file located at `~/.config/ingest/config.json`.
102104

103-
You can make Ollama processing run without prompting setting `"ollama_auto_run": true` in the config file.
105+
You can make Ollama processing run without prompting setting `"llm_auto_run": true` in the config file.
104106

105107
The config file also contains:
106108

107-
- `ollama_model`: The model to use for processing the prompt, e.g. "llama3.1:8b-q5_k_m".
108-
- `ollama_prompt_prefix`: An optional prefix to prepend to the prompt, e.g. "This is my application."
109-
- `ollama_prompt_suffix`: An optional suffix to append to the prompt, e.g. "explain this code"
109+
- `llm_model`: The model to use for processing the prompt, e.g. "llama3.1:8b-q5_k_m".
110+
- `llm_prompt_prefix`: An optional prefix to prepend to the prompt, e.g. "This is my application."
111+
- `llm_prompt_suffix`: An optional suffix to append to the prompt, e.g. "explain this code"
110112

111113
Ingest uses the following directories for user-specific configuration:
112114

config/config.go

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,27 @@ import (
1010
)
1111

1212
type OllamaConfig struct {
13-
Model string `json:"ollama_model"`
14-
PromptPrefix string `json:"ollama_prompt_prefix"`
15-
PromptSuffix string `json:"ollama_prompt_suffix"`
16-
AutoRun bool `json:"ollama_auto_run"`
13+
Model string `json:"llm_model"`
14+
PromptPrefix string `json:"llm_prompt_prefix"`
15+
PromptSuffix string `json:"llm_prompt_suffix"`
16+
AutoRun bool `json:"llm_auto_run"`
1717
}
1818

1919
type Config struct {
2020
Ollama []OllamaConfig `json:"ollama"`
21+
LLM LLMConfig `json:"llm"`
22+
}
23+
24+
type LLMConfig struct {
25+
AuthToken string `json:"llm_auth_token"`
26+
BaseURL string `json:"llm_base_url"`
27+
Model string `json:"llm_model"`
28+
MaxTokens int `json:"llm_max_tokens"`
29+
Temperature *float32 `json:"llm_temperature,omitempty"`
30+
TopP *float32 `json:"llm_top_p,omitempty"`
31+
PresencePenalty *float32 `json:"llm_presence_penalty,omitempty"`
32+
FrequencyPenalty *float32 `json:"llm_frequency_penalty,omitempty"`
33+
APIType string `json:"llm_api_type"`
2134
}
2235

2336
func LoadConfig() (*Config, error) {
@@ -41,6 +54,23 @@ func LoadConfig() (*Config, error) {
4154
return nil, fmt.Errorf("failed to parse config file: %w", err)
4255
}
4356

57+
// Set default values for LLM config
58+
if config.LLM.AuthToken == "" {
59+
config.LLM.AuthToken = os.Getenv("OPENAI_API_KEY")
60+
}
61+
if config.LLM.BaseURL == "" {
62+
config.LLM.BaseURL = getDefaultBaseURL()
63+
}
64+
if config.LLM.Model == "" {
65+
config.LLM.Model = "llama3.1:8b-instruct-q6_K"
66+
}
67+
if config.LLM.MaxTokens == 0 {
68+
config.LLM.MaxTokens = 2048
69+
}
70+
if config.LLM.APIType == "" {
71+
config.LLM.APIType = "OPEN_AI"
72+
}
73+
4474
return &config, nil
4575
}
4676

@@ -54,9 +84,14 @@ func createDefaultConfig(configPath string) (*Config, error) {
5484
AutoRun: false,
5585
},
5686
},
87+
LLM: LLMConfig{
88+
BaseURL: getDefaultBaseURL(),
89+
Model: "llama3.1:8b-instruct-q6_K",
90+
MaxTokens: 2048,
91+
},
5792
}
5893

59-
err := os.MkdirAll(filepath.Dir(configPath), 0755)
94+
err := os.MkdirAll(filepath.Dir(configPath), 0750)
6095
if err != nil {
6196
return nil, fmt.Errorf("failed to create config directory: %w", err)
6297
}
@@ -72,3 +107,13 @@ func createDefaultConfig(configPath string) (*Config, error) {
72107

73108
return &defaultConfig, nil
74109
}
110+
111+
func getDefaultBaseURL() string {
112+
if url := os.Getenv("OPENAI_API_BASE"); url != "" {
113+
return url
114+
}
115+
if url := os.Getenv("llm_HOST"); url != "" {
116+
return url + "/v1"
117+
}
118+
return "http://localhost:11434/v1"
119+
}

filesystem/filesystem.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ func ReadExcludePatterns(patternExclude string) ([]string, error) {
6969
return patterns, nil
7070
}
7171

72-
7372
func readGlobFile(filename string) ([]string, error) {
7473
file, err := os.Open(filename)
7574
if err != nil {
@@ -268,7 +267,6 @@ func PrintDefaultExcludes() {
268267
fmt.Println(strings.Join(excludes, "\n"))
269268
}
270269

271-
272270
func processFile(path, relPath string, rootPath string, lineNumber, relativePaths, noCodeblock bool, mu *sync.Mutex, files *[]FileInfo) {
273271
// Check if the file is binary
274272
isBinary, err := isBinaryFile(path)

go.mod

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,38 @@ go 1.22.5
55
require (
66
github.com/atotto/clipboard v0.1.4
77
github.com/bmatcuk/doublestar/v4 v4.6.1
8+
github.com/charmbracelet/glamour v0.7.0
89
github.com/fatih/color v1.17.0
910
github.com/mitchellh/go-homedir v1.1.0
1011
github.com/pkoukk/tiktoken-go v0.1.7
1112
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
13+
github.com/sashabaranov/go-openai v1.27.1
1214
github.com/schollz/progressbar/v3 v3.14.4
1315
github.com/spf13/cobra v1.8.1
1416
)
1517

1618
require (
19+
github.com/alecthomas/chroma/v2 v2.8.0 // indirect
20+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
21+
github.com/aymerick/douceur v0.2.0 // indirect
1722
github.com/dlclark/regexp2 v1.10.0 // indirect
1823
github.com/google/uuid v1.3.0 // indirect
24+
github.com/gorilla/css v1.0.0 // indirect
1925
github.com/inconshreveable/mousetrap v1.1.0 // indirect
26+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
2027
github.com/mattn/go-colorable v0.1.13 // indirect
2128
github.com/mattn/go-isatty v0.0.20 // indirect
29+
github.com/mattn/go-runewidth v0.0.14 // indirect
30+
github.com/microcosm-cc/bluemonday v1.0.25 // indirect
2231
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
32+
github.com/muesli/reflow v0.3.0 // indirect
33+
github.com/muesli/termenv v0.15.2 // indirect
34+
github.com/olekukonko/tablewriter v0.0.5 // indirect
2335
github.com/rivo/uniseg v0.4.7 // indirect
2436
github.com/spf13/pflag v1.0.5 // indirect
37+
github.com/yuin/goldmark v1.5.4 // indirect
38+
github.com/yuin/goldmark-emoji v1.0.2 // indirect
39+
golang.org/x/net v0.17.0 // indirect
2540
golang.org/x/sys v0.20.0 // indirect
2641
golang.org/x/term v0.20.0 // indirect
2742
)

go.sum

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1+
github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink=
2+
github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
3+
github.com/alecthomas/chroma/v2 v2.8.0 h1:w9WJUjFFmHHB2e8mRpL9jjy3alYDlU0QLDezj1xE264=
4+
github.com/alecthomas/chroma/v2 v2.8.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw=
5+
github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
6+
github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
17
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
28
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
9+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
10+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
11+
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
12+
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
313
github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
414
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
15+
github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng=
16+
github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps=
517
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
618
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
719
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -12,27 +24,49 @@ github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
1224
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
1325
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
1426
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
27+
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
28+
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
29+
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
30+
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
1531
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
1632
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
1733
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
34+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
35+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
1836
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
1937
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
2038
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
2139
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
2240
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
41+
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
42+
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
43+
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
44+
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
45+
github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg=
46+
github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE=
2347
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
2448
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
2549
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
2650
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
51+
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
52+
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
53+
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
54+
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
55+
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
56+
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
2757
github.com/pkoukk/tiktoken-go v0.1.7 h1:qOBHXX4PHtvIvmOtyg1EeKlwFRiMKAcoMp4Q+bLQDmw=
2858
github.com/pkoukk/tiktoken-go v0.1.7/go.mod h1:9NiV+i9mJKGj1rYOT+njbv+ZwA/zJxYdewGl6qVatpg=
2959
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3060
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
61+
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
62+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
3163
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
3264
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
3365
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
3466
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI=
3567
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs=
68+
github.com/sashabaranov/go-openai v1.27.1 h1:7Nx6db5NXbcoutNmAUQulEQZEpHG/SkzfexP2X5RWMk=
69+
github.com/sashabaranov/go-openai v1.27.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
3670
github.com/schollz/progressbar/v3 v3.14.4 h1:W9ZrDSJk7eqmQhd3uxFNNcTr0QL+xuGNI9dEMrw0r74=
3771
github.com/schollz/progressbar/v3 v3.14.4/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI=
3872
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
@@ -44,6 +78,13 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
4478
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
4579
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
4680
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
81+
github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
82+
github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU=
83+
github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
84+
github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s=
85+
github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY=
86+
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
87+
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
4788
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4889
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4990
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=

0 commit comments

Comments
 (0)