@paretools/go 0.8.5 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/formatters.d.ts +33 -9
  5. package/dist/lib/formatters.d.ts.map +1 -1
  6. package/dist/lib/formatters.js +291 -34
  7. package/dist/lib/formatters.js.map +1 -1
  8. package/dist/lib/go-runner.d.ts +1 -1
  9. package/dist/lib/go-runner.d.ts.map +1 -1
  10. package/dist/lib/go-runner.js +3 -3
  11. package/dist/lib/go-runner.js.map +1 -1
  12. package/dist/lib/parsers.d.ts +47 -12
  13. package/dist/lib/parsers.d.ts.map +1 -1
  14. package/dist/lib/parsers.js +653 -45
  15. package/dist/lib/parsers.js.map +1 -1
  16. package/dist/schemas/index.d.ts +218 -4
  17. package/dist/schemas/index.d.ts.map +1 -1
  18. package/dist/schemas/index.js +142 -5
  19. package/dist/schemas/index.js.map +1 -1
  20. package/dist/tools/build.d.ts.map +1 -1
  21. package/dist/tools/build.js +97 -12
  22. package/dist/tools/build.js.map +1 -1
  23. package/dist/tools/env.d.ts.map +1 -1
  24. package/dist/tools/env.js +15 -13
  25. package/dist/tools/env.js.map +1 -1
  26. package/dist/tools/fmt.d.ts.map +1 -1
  27. package/dist/tools/fmt.js +28 -12
  28. package/dist/tools/fmt.js.map +1 -1
  29. package/dist/tools/generate.d.ts.map +1 -1
  30. package/dist/tools/generate.js +77 -12
  31. package/dist/tools/generate.js.map +1 -1
  32. package/dist/tools/get.d.ts.map +1 -1
  33. package/dist/tools/get.js +91 -11
  34. package/dist/tools/get.js.map +1 -1
  35. package/dist/tools/golangci-lint.d.ts.map +1 -1
  36. package/dist/tools/golangci-lint.js +145 -13
  37. package/dist/tools/golangci-lint.js.map +1 -1
  38. package/dist/tools/list.d.ts.map +1 -1
  39. package/dist/tools/list.js +77 -13
  40. package/dist/tools/list.js.map +1 -1
  41. package/dist/tools/mod-tidy.d.ts.map +1 -1
  42. package/dist/tools/mod-tidy.js +119 -12
  43. package/dist/tools/mod-tidy.js.map +1 -1
  44. package/dist/tools/run.d.ts.map +1 -1
  45. package/dist/tools/run.js +108 -16
  46. package/dist/tools/run.js.map +1 -1
  47. package/dist/tools/test.d.ts.map +1 -1
  48. package/dist/tools/test.js +112 -11
  49. package/dist/tools/test.js.map +1 -1
  50. package/dist/tools/vet.d.ts.map +1 -1
  51. package/dist/tools/vet.js +55 -13
  52. package/dist/tools/vet.js.map +1 -1
  53. package/package.json +2 -2
@@ -1,33 +1,140 @@
1
1
  import { z } from "zod";
2
- import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
6
  import { goCmd } from "../lib/go-runner.js";
4
7
  import { parseGoModTidyOutput } from "../lib/parsers.js";
5
8
  import { formatGoModTidy, compactModTidyMap, formatModTidyCompact } from "../lib/formatters.js";
6
9
  import { GoModTidyResultSchema } from "../schemas/index.js";
10
+ /** Compute a quick hash of a file's contents, or return undefined if the file doesn't exist. */
11
+ async function hashFile(filePath) {
12
+ try {
13
+ const content = await readFile(filePath);
14
+ return createHash("md5").update(content).digest("hex");
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
7
20
  /** Registers the `mod-tidy` tool on the given MCP server. */
8
21
  export function registerModTidyTool(server) {
9
22
  server.registerTool("mod-tidy", {
10
23
  title: "Go Mod Tidy",
11
- description: "Runs go mod tidy to add missing and remove unused module dependencies. Use instead of running `go mod tidy` in the terminal.",
24
+ description: "Runs go mod tidy to add missing and remove unused module dependencies.",
12
25
  inputSchema: {
13
- path: z
14
- .string()
15
- .max(INPUT_LIMITS.PATH_MAX)
26
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Project root path"),
27
+ diff: z
28
+ .boolean()
16
29
  .optional()
17
- .describe("Project root path (default: cwd)"),
18
- compact: z
30
+ .default(false)
31
+ .describe("Non-destructive check mode: show what changes would be made without modifying files (-diff)"),
32
+ verbose: z
19
33
  .boolean()
20
34
  .optional()
21
- .default(true)
22
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
35
+ .default(false)
36
+ .describe("Print information about removed modules (-v)"),
37
+ continueOnError: z
38
+ .boolean()
39
+ .optional()
40
+ .default(false)
41
+ .describe("Attempt to proceed despite errors encountered while loading packages (-e)"),
42
+ goVersion: z
43
+ .string()
44
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
45
+ .optional()
46
+ .describe("Set the expected Go language version (-go=<version>). Example: '1.21'"),
47
+ compat: z
48
+ .string()
49
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
50
+ .optional()
51
+ .describe("Preserve backward compatibility with the specified Go version (-compat=<version>). Example: '1.20'"),
52
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
23
53
  },
24
54
  outputSchema: GoModTidyResultSchema,
25
- }, async ({ path, compact }) => {
55
+ }, async ({ path, diff, verbose, continueOnError, goVersion, compat, compact }) => {
26
56
  const cwd = path || process.cwd();
27
- const result = await goCmd(["mod", "tidy"], cwd);
28
- const data = parseGoModTidyOutput(result.stdout, result.stderr, result.exitCode);
57
+ if (goVersion)
58
+ assertNoFlagInjection(goVersion, "goVersion");
59
+ if (compat)
60
+ assertNoFlagInjection(compat, "compat");
61
+ // Hash go.mod and go.sum before tidy to detect changes (Gap #156)
62
+ const goModPath = join(cwd, "go.mod");
63
+ const goSumPath = join(cwd, "go.sum");
64
+ const [goModHashBefore, goSumHashBefore] = await Promise.all([
65
+ hashFile(goModPath),
66
+ hashFile(goSumPath),
67
+ ]);
68
+ const goModBefore = await readGoMod(goModPath);
69
+ const args = ["mod", "tidy"];
70
+ if (diff)
71
+ args.push("-diff");
72
+ if (verbose)
73
+ args.push("-v");
74
+ if (continueOnError)
75
+ args.push("-e");
76
+ if (goVersion)
77
+ args.push(`-go=${goVersion}`);
78
+ if (compat)
79
+ args.push(`-compat=${compat}`);
80
+ const result = await goCmd(args, cwd);
81
+ // Hash go.mod and go.sum after tidy
82
+ const [goModHashAfter, goSumHashAfter] = await Promise.all([
83
+ hashFile(goModPath),
84
+ hashFile(goSumPath),
85
+ ]);
86
+ const goModAfter = await readGoMod(goModPath);
87
+ const { addedModules, removedModules } = diffGoModRequirements(goModBefore, goModAfter);
88
+ const data = parseGoModTidyOutput(result.stdout, result.stderr, result.exitCode, goModHashBefore, goModHashAfter, goSumHashBefore, goSumHashAfter, addedModules, removedModules);
29
89
  const rawOutput = (result.stdout + "\n" + result.stderr).trim();
30
90
  return compactDualOutput(data, rawOutput, formatGoModTidy, compactModTidyMap, formatModTidyCompact, compact === false);
31
91
  });
32
92
  }
93
+ async function readGoMod(goModPath) {
94
+ try {
95
+ return await readFile(goModPath, "utf-8");
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ function diffGoModRequirements(before, after) {
102
+ if (before === undefined || after === undefined) {
103
+ return { addedModules: [], removedModules: [] };
104
+ }
105
+ const beforeSet = parseRequireSet(before);
106
+ const afterSet = parseRequireSet(after);
107
+ return {
108
+ addedModules: [...afterSet].filter((r) => !beforeSet.has(r)).sort(),
109
+ removedModules: [...beforeSet].filter((r) => !afterSet.has(r)).sort(),
110
+ };
111
+ }
112
+ function parseRequireSet(goMod) {
113
+ const result = new Set();
114
+ let inBlock = false;
115
+ for (const rawLine of goMod.split("\n")) {
116
+ const line = rawLine.trim();
117
+ if (!line || line.startsWith("//"))
118
+ continue;
119
+ if (line.startsWith("require (")) {
120
+ inBlock = true;
121
+ continue;
122
+ }
123
+ if (inBlock && line === ")") {
124
+ inBlock = false;
125
+ continue;
126
+ }
127
+ const target = inBlock
128
+ ? line
129
+ : line.startsWith("require ")
130
+ ? line.slice("require ".length)
131
+ : "";
132
+ if (!target)
133
+ continue;
134
+ const cleaned = target.replace(/\s+\/\/.*$/, "").trim();
135
+ if (cleaned)
136
+ result.add(cleaned);
137
+ }
138
+ return result;
139
+ }
33
140
  //# sourceMappingURL=mod-tidy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod-tidy.js","sourceRoot":"","sources":["../../src/tools/mod-tidy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,qBAAqB;KACpC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,iBAAiB,CACtB,IAAI,EACJ,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mod-tidy.js","sourceRoot":"","sources":["../../src/tools/mod-tidy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/tools/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAkEhD"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/tools/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QA2KhD"}
package/dist/tools/run.js CHANGED
@@ -8,13 +8,9 @@ import { GoRunResultSchema } from "../schemas/index.js";
8
8
  export function registerRunTool(server) {
9
9
  server.registerTool("run", {
10
10
  title: "Go Run",
11
- description: "Runs a Go program and returns structured output (stdout, stderr, exit code). Use instead of running `go run` in the terminal.",
11
+ description: "Runs a Go program and returns structured output (stdout, stderr, exit code).",
12
12
  inputSchema: {
13
- path: z
14
- .string()
15
- .max(INPUT_LIMITS.PATH_MAX)
16
- .optional()
17
- .describe("Project root path (default: cwd)"),
13
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Project root path"),
18
14
  file: z
19
15
  .string()
20
16
  .max(INPUT_LIMITS.PATH_MAX)
@@ -32,30 +28,126 @@ export function registerRunTool(server) {
32
28
  .max(INPUT_LIMITS.ARRAY_MAX)
33
29
  .optional()
34
30
  .default([])
35
- .describe("Build flags to pass to go run (e.g., -race, -tags)"),
36
- compact: z
31
+ .describe("Build flags to pass to go run (e.g., '-tags=integration'). " +
32
+ "Note: flags like -race and -tags have dedicated params for discoverability, " +
33
+ "but can also be passed here. Flag injection checks are not applied to buildArgs " +
34
+ "since they are intentionally build flags."),
35
+ race: z.boolean().optional().default(false).describe("Enable data race detection (-race)"),
36
+ tags: z
37
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
38
+ .max(INPUT_LIMITS.ARRAY_MAX)
39
+ .optional()
40
+ .describe("Build tags for conditional compilation (-tags)"),
41
+ timeout: z
42
+ .number()
43
+ .int()
44
+ .min(1000)
45
+ .max(600000)
46
+ .optional()
47
+ .describe("Program execution timeout in milliseconds. Overrides the default 300s build timeout. " +
48
+ "Min: 1000 (1s), Max: 600000 (10m)."),
49
+ exec: z
50
+ .string()
51
+ .max(INPUT_LIMITS.PATH_MAX)
52
+ .optional()
53
+ .describe("Custom execution wrapper (-exec). The built binary is passed to this command instead of being run directly."),
54
+ maxOutput: z
55
+ .number()
56
+ .int()
57
+ .min(1024)
58
+ .max(1048576)
59
+ .optional()
60
+ .describe("Maximum length in characters for stdout/stderr output. Output exceeding this limit will be truncated. " +
61
+ "Default: no limit. Max: 1048576 (1MB)."),
62
+ stream: z
37
63
  .boolean()
38
64
  .optional()
39
- .default(true)
40
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
65
+ .default(false)
66
+ .describe("Return tail-focused output for long-running programs. This is a streaming-like mode that keeps recent lines."),
67
+ tailLines: z
68
+ .number()
69
+ .int()
70
+ .min(10)
71
+ .max(5000)
72
+ .optional()
73
+ .default(200)
74
+ .describe("When stream is true, keep this many trailing stdout/stderr lines"),
75
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
41
76
  },
42
77
  outputSchema: GoRunResultSchema,
43
- }, async ({ path, file, args, buildArgs, compact }) => {
78
+ }, async ({ path, file, args, buildArgs, race, tags, timeout, exec: execWrapper, maxOutput, stream, tailLines, compact, }) => {
44
79
  const cwd = path || process.cwd();
45
80
  const target = file || ".";
46
81
  assertNoFlagInjection(target, "file");
47
- for (const a of buildArgs ?? []) {
48
- assertNoFlagInjection(a, "buildArgs");
82
+ if (execWrapper)
83
+ assertNoFlagInjection(execWrapper, "exec");
84
+ // buildArgs are intentionally build flags (e.g., -race, -tags, -ldflags)
85
+ // so assertNoFlagInjection is not applied to them.
86
+ const cmdArgs = ["run"];
87
+ if (race)
88
+ cmdArgs.push("-race");
89
+ if (tags && tags.length > 0) {
90
+ for (const t of tags) {
91
+ assertNoFlagInjection(t, "tags");
92
+ }
93
+ cmdArgs.push("-tags", tags.join(","));
49
94
  }
50
- const cmdArgs = ["run", ...(buildArgs || []), target];
95
+ if (execWrapper)
96
+ cmdArgs.push(`-exec=${execWrapper}`);
97
+ cmdArgs.push(...(buildArgs || []), target);
51
98
  const programArgs = args || [];
52
99
  if (programArgs.length > 0) {
53
100
  cmdArgs.push("--", ...programArgs);
54
101
  }
55
- const result = await goCmd(cmdArgs, cwd);
56
- const data = parseGoRunOutput(result.stdout, result.stderr, result.exitCode);
102
+ let timedOut = false;
103
+ let signal;
104
+ let result;
105
+ try {
106
+ const runResult = await goCmd(cmdArgs, cwd, timeout);
107
+ result = runResult;
108
+ }
109
+ catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ if (msg.includes("timed out")) {
112
+ timedOut = true;
113
+ signal = extractSignal(msg);
114
+ result = { stdout: "", stderr: msg, exitCode: 124 };
115
+ }
116
+ else {
117
+ throw err;
118
+ }
119
+ }
120
+ const data = parseGoRunOutput(result.stdout, result.stderr, result.exitCode, timedOut, signal);
121
+ if (stream) {
122
+ const lineCap = tailLines ?? 200;
123
+ if (data.stdout)
124
+ data.stdout = tailOutput(data.stdout, lineCap);
125
+ if (data.stderr)
126
+ data.stderr = tailOutput(data.stderr, lineCap);
127
+ }
128
+ // Apply maxOutput truncation with truncation flag tracking
129
+ if (maxOutput) {
130
+ if (data.stdout && data.stdout.length > maxOutput) {
131
+ data.stdout = data.stdout.slice(0, maxOutput) + "\n... (truncated)";
132
+ data.stdoutTruncated = true;
133
+ }
134
+ if (data.stderr && data.stderr.length > maxOutput) {
135
+ data.stderr = data.stderr.slice(0, maxOutput) + "\n... (truncated)";
136
+ data.stderrTruncated = true;
137
+ }
138
+ }
57
139
  const rawOutput = (result.stdout + "\n" + result.stderr).trim();
58
140
  return compactDualOutput(data, rawOutput, formatGoRun, compactRunMap, formatRunCompact, compact === false);
59
141
  });
60
142
  }
143
+ function tailOutput(text, lineCount) {
144
+ const lines = text.split("\n");
145
+ if (lines.length <= lineCount)
146
+ return text;
147
+ return lines.slice(-lineCount).join("\n");
148
+ }
149
+ function extractSignal(message) {
150
+ const match = message.match(/\((SIG[A-Z0-9]+)\)/);
151
+ return match?.[1];
152
+ }
61
153
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/tools/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/tools/run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/tools/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAwDjD"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/tools/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QA4KjD"}
@@ -8,13 +8,9 @@ import { GoTestResultSchema } from "../schemas/index.js";
8
8
  export function registerTestTool(server) {
9
9
  server.registerTool("test", {
10
10
  title: "Go Test",
11
- description: "Runs go test and returns structured test results (name, status, package, elapsed). Use instead of running `go test` in the terminal.",
11
+ description: "Runs go test and returns structured test results (name, status, package, elapsed).",
12
12
  inputSchema: {
13
- path: z
14
- .string()
15
- .max(INPUT_LIMITS.PATH_MAX)
16
- .optional()
17
- .describe("Project root path (default: cwd)"),
13
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Project root path"),
18
14
  packages: z
19
15
  .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
20
16
  .max(INPUT_LIMITS.ARRAY_MAX)
@@ -26,21 +22,126 @@ export function registerTestTool(server) {
26
22
  .max(INPUT_LIMITS.SHORT_STRING_MAX)
27
23
  .optional()
28
24
  .describe("Test name filter regex"),
29
- compact: z
25
+ bench: z
26
+ .string()
27
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
28
+ .optional()
29
+ .describe("Benchmark name filter regex (-bench)"),
30
+ benchtime: z
31
+ .string()
32
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
33
+ .optional()
34
+ .describe("Benchmark run duration or count (-benchtime), e.g. '3s' or '100x'"),
35
+ benchmem: z
36
+ .boolean()
37
+ .optional()
38
+ .default(false)
39
+ .describe("Print memory allocation stats for benchmarks (-benchmem)"),
40
+ failfast: z
41
+ .boolean()
42
+ .optional()
43
+ .default(false)
44
+ .describe("Stop running tests after the first failure (-failfast). Saves time and tokens."),
45
+ short: z
46
+ .boolean()
47
+ .optional()
48
+ .default(false)
49
+ .describe("Tell long-running tests to shorten their run time (-short). Enables quick smoke tests."),
50
+ race: z
51
+ .boolean()
52
+ .optional()
53
+ .default(false)
54
+ .describe("Enable data race detection during tests (-race)"),
55
+ timeout: z
56
+ .string()
57
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
58
+ .optional()
59
+ .describe("Test execution timeout (-timeout <d>). Examples: '30s', '5m', '1h'. Default: 10m."),
60
+ count: z
61
+ .number()
62
+ .int()
63
+ .min(1)
64
+ .max(1000)
65
+ .optional()
66
+ .describe("Run each test and benchmark N times (-count <n>). Useful for verifying flaky test fixes."),
67
+ cover: z
30
68
  .boolean()
31
69
  .optional()
32
- .default(true)
33
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
70
+ .default(false)
71
+ .describe("Enable test coverage analysis (-cover)"),
72
+ coverprofile: z
73
+ .string()
74
+ .max(INPUT_LIMITS.PATH_MAX)
75
+ .optional()
76
+ .describe("Write a coverage profile to the named file (-coverprofile <file>). Implies -cover."),
77
+ tags: z
78
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
79
+ .max(INPUT_LIMITS.ARRAY_MAX)
80
+ .optional()
81
+ .describe("Build tags required to run tests correctly (-tags)"),
82
+ parallel: z
83
+ .number()
84
+ .int()
85
+ .min(1)
86
+ .max(1000)
87
+ .optional()
88
+ .describe("Maximum number of tests to run in parallel (-parallel <n>). Default: GOMAXPROCS."),
89
+ shuffle: z
90
+ .enum(["on", "off"])
91
+ .optional()
92
+ .describe("Randomize test execution order (-shuffle). 'on' uses a random seed, 'off' is the default."),
93
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
34
94
  },
35
95
  outputSchema: GoTestResultSchema,
36
- }, async ({ path, packages, run: runFilter, compact }) => {
96
+ }, async ({ path, packages, run: runFilter, bench, benchtime, benchmem, failfast, short, race, timeout, count, cover, coverprofile, tags, parallel, shuffle, compact, }) => {
37
97
  const cwd = path || process.cwd();
38
98
  for (const p of packages ?? []) {
39
99
  assertNoFlagInjection(p, "packages");
40
100
  }
41
101
  if (runFilter)
42
102
  assertNoFlagInjection(runFilter, "run");
43
- const args = ["test", "-json", ...(packages || ["./..."])];
103
+ if (bench)
104
+ assertNoFlagInjection(bench, "bench");
105
+ if (benchtime)
106
+ assertNoFlagInjection(benchtime, "benchtime");
107
+ if (timeout)
108
+ assertNoFlagInjection(timeout, "timeout");
109
+ if (coverprofile)
110
+ assertNoFlagInjection(coverprofile, "coverprofile");
111
+ const args = ["test", "-json"];
112
+ if (failfast)
113
+ args.push("-failfast");
114
+ if (short)
115
+ args.push("-short");
116
+ if (race)
117
+ args.push("-race");
118
+ if (timeout)
119
+ args.push("-timeout", timeout);
120
+ if (count !== undefined)
121
+ args.push("-count", String(count));
122
+ if (bench)
123
+ args.push("-bench", bench);
124
+ if (benchtime)
125
+ args.push("-benchtime", benchtime);
126
+ if (benchmem)
127
+ args.push("-benchmem");
128
+ if (coverprofile) {
129
+ args.push("-coverprofile", coverprofile);
130
+ }
131
+ else if (cover) {
132
+ args.push("-cover");
133
+ }
134
+ if (tags && tags.length > 0) {
135
+ for (const t of tags) {
136
+ assertNoFlagInjection(t, "tags");
137
+ }
138
+ args.push("-tags", tags.join(","));
139
+ }
140
+ if (parallel !== undefined)
141
+ args.push("-parallel", String(parallel));
142
+ if (shuffle === "on")
143
+ args.push("-shuffle=on");
144
+ args.push(...(packages || ["./..."]));
44
145
  if (runFilter)
45
146
  args.push("-run", runFilter);
46
147
  const result = await goCmd(args, cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tools/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;iBACpD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;iBAClB,QAAQ,CAAC,mCAAmC,CAAC;YAChD,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,wBAAwB,CAAC;YACrC,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,qBAAqB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,SAAS;YAAE,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tools/test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../src/tools/vet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QA+ChD"}
1
+ {"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../src/tools/vet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAsFhD"}
package/dist/tools/vet.js CHANGED
@@ -8,33 +8,75 @@ import { GoVetResultSchema } from "../schemas/index.js";
8
8
  export function registerVetTool(server) {
9
9
  server.registerTool("vet", {
10
10
  title: "Go Vet",
11
- description: "Runs go vet and returns structured static analysis diagnostics. Use instead of running `go vet` in the terminal.",
11
+ description: "Runs go vet and returns structured static analysis diagnostics with analyzer names. Uses -json flag for native JSON output with automatic text fallback.",
12
12
  inputSchema: {
13
- path: z
14
- .string()
15
- .max(INPUT_LIMITS.PATH_MAX)
16
- .optional()
17
- .describe("Project root path (default: cwd)"),
13
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Project root path"),
18
14
  packages: z
19
15
  .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
20
16
  .max(INPUT_LIMITS.ARRAY_MAX)
21
17
  .optional()
22
18
  .default(["./..."])
23
19
  .describe("Packages to vet (default: ./...)"),
24
- compact: z
25
- .boolean()
20
+ analyzers: z
21
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
22
+ .max(INPUT_LIMITS.ARRAY_MAX)
23
+ .optional()
24
+ .describe("Specific analyzers to enable or disable. Prefix with '-' to disable. Example: ['shadow', '-printf']"),
25
+ tags: z
26
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
27
+ .max(INPUT_LIMITS.ARRAY_MAX)
28
+ .optional()
29
+ .describe("Build tags for correct vetting of conditionally compiled code (-tags)"),
30
+ contextLines: z
31
+ .number()
32
+ .int()
33
+ .min(0)
34
+ .max(50)
26
35
  .optional()
27
- .default(true)
28
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
36
+ .describe("Number of context lines to include around each diagnostic (-c=N)"),
37
+ vettool: z
38
+ .string()
39
+ .max(INPUT_LIMITS.PATH_MAX)
40
+ .optional()
41
+ .describe("Path to a custom analyzer tool binary (-vettool)"),
42
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
29
43
  },
30
44
  outputSchema: GoVetResultSchema,
31
- }, async ({ path, packages, compact }) => {
45
+ }, async ({ path, packages, analyzers, tags, contextLines, vettool, compact }) => {
32
46
  const cwd = path || process.cwd();
33
47
  for (const p of packages ?? []) {
34
48
  assertNoFlagInjection(p, "packages");
35
49
  }
36
- const result = await goCmd(["vet", ...(packages || ["./..."])], cwd);
37
- const data = parseGoVetOutput(result.stdout, result.stderr);
50
+ if (vettool)
51
+ assertNoFlagInjection(vettool, "vettool");
52
+ const args = ["vet", "-json"];
53
+ if (tags && tags.length > 0) {
54
+ for (const t of tags) {
55
+ assertNoFlagInjection(t, "tags");
56
+ }
57
+ args.push("-tags", tags.join(","));
58
+ }
59
+ if (contextLines !== undefined)
60
+ args.push(`-c=${contextLines}`);
61
+ if (vettool)
62
+ args.push(`-vettool=${vettool}`);
63
+ if (analyzers && analyzers.length > 0) {
64
+ for (const a of analyzers) {
65
+ assertNoFlagInjection(a, "analyzers");
66
+ // Analyzers are passed as -<name> (disable) or -<name>=true (enable)
67
+ if (a.startsWith("-")) {
68
+ // Disable: go vet -<name>=false
69
+ args.push(`${a}=false`);
70
+ }
71
+ else {
72
+ // Enable: go vet -<name>
73
+ args.push(`-${a}`);
74
+ }
75
+ }
76
+ }
77
+ args.push(...(packages || ["./..."]));
78
+ const result = await goCmd(args, cwd);
79
+ const data = parseGoVetOutput(result.stdout, result.stderr, result.exitCode);
38
80
  const rawOutput = (result.stdout + "\n" + result.stderr).trim();
39
81
  return compactDualOutput(data, rawOutput, formatGoVet, compactVetMap, formatVetCompact, compact === false);
40
82
  });
@@ -1 +1 @@
1
- {"version":3,"file":"vet.js","sourceRoot":"","sources":["../../src/tools/vet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,YAAY,CACjB,KAAK,EACL;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,kHAAkH;QACpH,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;iBACpD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;iBAClB,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,iBAAiB;KAChC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,qBAAqB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,iBAAiB,CACtB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"vet.js","sourceRoot":"","sources":["../../src/tools/vet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,YAAY,CACjB,KAAK,EACL;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,0JAA0J;QAC5J,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACpF,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;iBACpD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,QAAQ,EAAE;iBACV,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;iBAClB,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,SAAS,EAAE,CAAC;iBACT,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;iBACpD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,QAAQ,EAAE;iBACV,QAAQ,CACP,qGAAqG,CACtG;YACH,IAAI,EAAE,CAAC;iBACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;iBACpD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,QAAQ,EAAE;iBACV,QAAQ,CAAC,uEAAuE,CAAC;YACpF,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAChF;QACD,YAAY,EAAE,iBAAiB;KAChC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5E,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,qBAAqB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,OAAO;YAAE,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,qBAAqB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;QAChE,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QAC9C,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBACtC,qEAAqE;gBACrE,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,gCAAgC;oBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,iBAAiB,CACtB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}