Skip to content

Commit 75367d4

Browse files
knabbenAmim Knabben
authored andcommitted
Adding Github MCP server and a new panel for querying the non-existent
github issues
1 parent 8b3479c commit 75367d4

File tree

8 files changed

+1049
-266
lines changed

8 files changed

+1049
-266
lines changed

README.md

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ Prerequisites
3737

3838
* Go 1.24 or later
3939
* Git
40-
* Github Token PAT
40+
* Github Token PAT (required for GitHub integration and MCP server)
41+
* Anthropic API Key (optional, required for AI-powered analysis in MCP client)
4142
* Kubernetes cluster (kind)
4243

4344
### Prerequisites
@@ -58,6 +59,64 @@ export SIGNALHOUND_GITHUB_TOKEN=<github.pat.for.signalhound>
5859
export GITHUB_TOKEN=<github.pat.default>
5960
```
6061

62+
## Model Context Protocol (MCP) Integration
63+
64+
Signalhound includes a Model Context Protocol (MCP) integration that enables AI-powered analysis of failing tests and GitHub issues. The MCP system consists of two components:
65+
66+
### MCP Server
67+
68+
The MCP server runs automatically when you start the `abstract` command. It provides tools for querying GitHub project issues and is accessible at `http://localhost:8080/mcp` by default.
69+
70+
**Required Environment Variables:**
71+
- `GITHUB_TOKEN` or `SIGNALHOUND_GITHUB_TOKEN` - GitHub Personal Access Token with `read:project` scope (required for the MCP server to query GitHub project issues)
72+
73+
**Features:**
74+
- Lists all issues from the SIG Signal project board
75+
- Filters issues by latest Kubernetes release version and FAILING status
76+
- Returns issue details including number, title, body, state, and URL
77+
78+
### MCP Client
79+
80+
The MCP client is used by the TUI to analyze failing tests and compare them with existing GitHub issues using Anthropic's Claude AI.
81+
82+
**Required Environment Variables:**
83+
- `ANTHROPIC_API_KEY` or `SIGNALHOUND_ANTHROPIC_API_KEY` - Anthropic API key for Claude AI analysis (required for AI-powered issue comparison)
84+
- `MCP_SERVER_ENDPOINT` - MCP server endpoint URL (optional, defaults to `http://localhost:8080/mcp`)
85+
86+
**Features:**
87+
- Compares currently failing tests with existing GitHub issues
88+
- Identifies tests that don't have corresponding GitHub issues
89+
- Provides AI-generated summaries and recommendations
90+
91+
### Complete Setup
92+
93+
To enable all MCP features, set the following environment variables:
94+
95+
```bash
96+
# GitHub token for MCP server (to query project issues)
97+
export GITHUB_TOKEN=<your-github-pat>
98+
# or
99+
export SIGNALHOUND_GITHUB_TOKEN=<your-github-pat>
100+
101+
# Anthropic API key for MCP client (for AI analysis)
102+
export ANTHROPIC_API_KEY=<your-anthropic-api-key>
103+
# or
104+
export SIGNALHOUND_ANTHROPIC_API_KEY=<your-anthropic-api-key>
105+
106+
# Optional: Custom MCP server endpoint (defaults to http://localhost:8080/mcp)
107+
export MCP_SERVER_ENDPOINT=http://localhost:8080/mcp
108+
```
109+
110+
### Getting an Anthropic API Key
111+
112+
1. Visit [Anthropic's Console](https://console.anthropic.com/)
113+
2. Sign up or log in to your account
114+
3. Navigate to API Keys section
115+
4. Create a new API key
116+
5. Copy the key and set it as `ANTHROPIC_API_KEY` or `SIGNALHOUND_ANTHROPIC_API_KEY`
117+
118+
**Note:** The Anthropic API key is only required if you want to use the AI-powered analysis feature in the TUI. The MCP server will still work for listing issues without it, but the comparison and analysis features will not be available.
119+
61120
### Running at runtime
62121

63122
```bash

cmd/abstract.go

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@
33
package cmd
44

55
import (
6+
"context"
67
"fmt"
8+
"log"
9+
"net/http"
710
"os"
8-
"time"
911

1012
"github.com/spf13/cobra"
1113
"sigs.k8s.io/signalhound/api/v1alpha1"
14+
"sigs.k8s.io/signalhound/internal/mcp"
1215
"sigs.k8s.io/signalhound/internal/testgrid"
1316
"sigs.k8s.io/signalhound/internal/tui"
1417
)
1518

19+
const MCP_SERVER = "localhost:8080"
20+
1621
// abstractCmd represents the abstract command
1722
var abstractCmd = &cobra.Command{
1823
Use: "abstract",
@@ -21,9 +26,7 @@ var abstractCmd = &cobra.Command{
2126
}
2227

2328
var (
24-
tg = testgrid.NewTestGrid(testgrid.URL)
2529
minFailure, minFlake int
26-
refreshInterval int
2730
token string
2831
)
2932

@@ -32,50 +35,46 @@ func init() {
3235

3336
abstractCmd.PersistentFlags().IntVarP(&minFailure, "min-failure", "f", 2, "minimum threshold for test failures")
3437
abstractCmd.PersistentFlags().IntVarP(&minFlake, "min-flake", "m", 3, "minimum threshold for test flakeness")
35-
abstractCmd.PersistentFlags().IntVarP(&refreshInterval, "refresh-interval", "r", 0,
36-
"refresh interval in seconds (0 to disable auto-refresh)")
37-
3838
token = os.Getenv("SIGNALHOUND_GITHUB_TOKEN")
3939
if token == "" {
4040
token = os.Getenv("GITHUB_TOKEN")
4141
}
4242
}
4343

44-
// FetchTabSummary fetches all dashboard tabs from TestGrid.
45-
func FetchTabSummary() ([]*v1alpha1.DashboardTab, error) {
46-
var dashboardTabs []*v1alpha1.DashboardTab
47-
for _, dashboard := range []string{"sig-release-master-blocking", "sig-release-master-informing"} {
48-
dashSummaries, err := tg.FetchTabSummary(dashboard, v1alpha1.ERROR_STATUSES)
49-
if err != nil {
50-
return nil, err
51-
}
52-
for _, dashSummary := range dashSummaries {
53-
dashTab, err := tg.FetchTabTests(&dashSummary, minFailure, minFlake)
54-
if err != nil {
55-
fmt.Println(fmt.Errorf("error fetching table : %s", err))
56-
continue
57-
}
58-
if len(dashTab.TestRuns) > 0 {
59-
dashboardTabs = append(dashboardTabs, dashTab)
60-
}
61-
}
62-
}
63-
return dashboardTabs, nil
64-
}
65-
6644
// RunAbstract starts the main command to scrape TestGrid.
6745
func RunAbstract(cmd *cobra.Command, args []string) error {
68-
dashboardTabs, err := FetchTabSummary()
69-
if err != nil {
70-
return err
71-
}
46+
var (
47+
tg = testgrid.NewTestGrid(testgrid.URL)
48+
dashboardTabs []*v1alpha1.DashboardTab
49+
dashboards = []string{"sig-release-master-blocking", "sig-release-master-informing"}
50+
)
7251

73-
var refreshFunc func() ([]*v1alpha1.DashboardTab, error)
74-
if refreshInterval > 0 {
75-
refreshFunc = func() ([]*v1alpha1.DashboardTab, error) {
76-
return FetchTabSummary()
77-
}
52+
// start the MCP server in the background
53+
go startMCPServer()
54+
55+
fmt.Println("Scraping the testgrid dashboard, wait...")
56+
tuiInstance := tui.NewMultiWindowTUI(dashboardTabs, token)
57+
tuiInstance.SetRefreshConfig(tg, dashboards, minFailure, minFlake)
58+
return tuiInstance.Run()
59+
}
60+
61+
// startMCPServer starts the MCP server in the background
62+
func startMCPServer() {
63+
ctx := context.Background()
64+
mcpToken := os.Getenv("ANTHROPIC_API_KEY")
65+
if mcpToken == "" {
66+
log.Println("Warning: ANTHROPIC_API_KEY not set, MCP server will not start")
67+
return
68+
}
69+
githubToken := os.Getenv("GITHUB_TOKEN")
70+
if githubToken == "" {
71+
log.Println("Warning: GITHUB_TOKEN not set, MCP server will not start")
72+
return
7873
}
7974

80-
return tui.RenderVisual(dashboardTabs, token, time.Duration(refreshInterval)*time.Second, refreshFunc)
75+
server := mcp.NewMCPServer(ctx, githubToken)
76+
log.Printf("MCP handler listening at %s", MCP_SERVER)
77+
if err := http.ListenAndServe(MCP_SERVER, server.NewHTTPHandler()); err != nil {
78+
log.Printf("MCP server error: %v", err)
79+
}
8180
}

go.mod

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ module sigs.k8s.io/signalhound
33
go 1.25.1
44

55
require (
6+
github.com/anthropics/anthropic-sdk-go v1.18.0
67
github.com/gdamore/tcell/v2 v2.9.0
78
github.com/go-logr/logr v1.4.3
8-
github.com/google/go-github/v65 v65.0.0
9+
github.com/knabben/signalhound v0.0.0-20251105184622-765beecf6f94
10+
github.com/modelcontextprotocol/go-sdk v1.1.0
911
github.com/onsi/ginkgo/v2 v2.22.0
1012
github.com/onsi/gomega v1.36.1
11-
github.com/prometheus/client_golang v1.23.0
12-
github.com/prometheus/common v0.65.0
1313
github.com/rivo/tview v0.42.0
1414
github.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7
1515
github.com/spf13/cobra v1.8.1
@@ -53,8 +53,10 @@ require (
5353
github.com/google/cel-go v0.22.0 // indirect
5454
github.com/google/gnostic-models v0.6.8 // indirect
5555
github.com/google/go-cmp v0.7.0 // indirect
56+
github.com/google/go-github/v65 v65.0.0 // indirect
5657
github.com/google/go-querystring v1.1.0 // indirect
5758
github.com/google/gofuzz v1.2.0 // indirect
59+
github.com/google/jsonschema-go v0.3.0 // indirect
5860
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect
5961
github.com/google/uuid v1.6.0 // indirect
6062
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect
@@ -70,14 +72,21 @@ require (
7072
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
7173
github.com/pkg/errors v0.9.1 // indirect
7274
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
75+
github.com/prometheus/client_golang v1.23.0 // indirect
7376
github.com/prometheus/client_model v0.6.2 // indirect
77+
github.com/prometheus/common v0.65.0 // indirect
7478
github.com/prometheus/otlptranslator v0.0.2 // indirect
7579
github.com/prometheus/procfs v0.17.0 // indirect
7680
github.com/rivo/uniseg v0.4.7 // indirect
7781
github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 // indirect
7882
github.com/spf13/pflag v1.0.5 // indirect
7983
github.com/stoewer/go-strcase v1.3.0 // indirect
84+
github.com/tidwall/gjson v1.18.0 // indirect
85+
github.com/tidwall/match v1.1.1 // indirect
86+
github.com/tidwall/pretty v1.2.1 // indirect
87+
github.com/tidwall/sjson v1.2.5 // indirect
8088
github.com/x448/float16 v0.8.4 // indirect
89+
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
8190
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
8291
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
8392
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect

go.sum

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo=
22
cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
3+
github.com/anthropics/anthropic-sdk-go v1.18.0 h1:jfxRA7AqZoCm83nHO/OVQp8xuwjUKtBziEdMbfmofHU=
4+
github.com/anthropics/anthropic-sdk-go v1.18.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE=
35
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
46
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
57
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
@@ -72,6 +74,8 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17
7274
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
7375
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
7476
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
77+
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
78+
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
7579
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
7680
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
7781
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
@@ -84,14 +88,14 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
8488
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
8589
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
8690
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
87-
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
88-
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
8991
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
9092
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
9193
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
9294
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
9395
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
9496
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
97+
github.com/knabben/signalhound v0.0.0-20251105184622-765beecf6f94 h1:dbortsxtsvJHirHBHVrCmuqrvL3gpzbnIHD59de7omg=
98+
github.com/knabben/signalhound v0.0.0-20251105184622-765beecf6f94/go.mod h1:wgrrnQNfE19ISgFRzf/HAcaGSOFN+snbeZexSP5xwD4=
9599
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
96100
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
97101
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -107,15 +111,15 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
107111
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
108112
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
109113
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
114+
github.com/modelcontextprotocol/go-sdk v1.1.0 h1:Qjayg53dnKC4UZ+792W21e4BpwEZBzwgRW6LrjLWSwA=
115+
github.com/modelcontextprotocol/go-sdk v1.1.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10=
110116
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
111117
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
112118
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
113119
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
114120
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
115121
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
116122
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
117-
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
118-
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
119123
github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
120124
github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
121125
github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
@@ -162,8 +166,20 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
162166
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
163167
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
164168
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
169+
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
170+
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
171+
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
172+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
173+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
174+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
175+
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
176+
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
177+
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
178+
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
165179
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
166180
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
181+
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
182+
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
167183
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
168184
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
169185
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
@@ -276,8 +292,6 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSP
276292
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
277293
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
278294
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
279-
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
280-
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
281295
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
282296
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
283297
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)