llm-agent-cli 2.0.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 (89) hide show
  1. package/dist/agent.d.ts +112 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +730 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/audit.d.ts +24 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +94 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/auth.d.ts +36 -0
  10. package/dist/auth.d.ts.map +1 -0
  11. package/dist/auth.js +236 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/config.d.ts +35 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +92 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/context.d.ts +48 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +94 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/diff.d.ts +27 -0
  22. package/dist/diff.d.ts.map +1 -0
  23. package/dist/diff.js +174 -0
  24. package/dist/diff.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +905 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/input.d.ts +13 -0
  30. package/dist/input.d.ts.map +1 -0
  31. package/dist/input.js +88 -0
  32. package/dist/input.js.map +1 -0
  33. package/dist/memory.d.ts +32 -0
  34. package/dist/memory.d.ts.map +1 -0
  35. package/dist/memory.js +103 -0
  36. package/dist/memory.js.map +1 -0
  37. package/dist/preprocessor.d.ts +12 -0
  38. package/dist/preprocessor.d.ts.map +1 -0
  39. package/dist/preprocessor.js +138 -0
  40. package/dist/preprocessor.js.map +1 -0
  41. package/dist/project.d.ts +10 -0
  42. package/dist/project.d.ts.map +1 -0
  43. package/dist/project.js +145 -0
  44. package/dist/project.js.map +1 -0
  45. package/dist/renderer.d.ts +2 -0
  46. package/dist/renderer.d.ts.map +1 -0
  47. package/dist/renderer.js +31 -0
  48. package/dist/renderer.js.map +1 -0
  49. package/dist/session.d.ts +36 -0
  50. package/dist/session.d.ts.map +1 -0
  51. package/dist/session.js +78 -0
  52. package/dist/session.js.map +1 -0
  53. package/dist/tools/filesystem.d.ts +138 -0
  54. package/dist/tools/filesystem.d.ts.map +1 -0
  55. package/dist/tools/filesystem.js +539 -0
  56. package/dist/tools/filesystem.js.map +1 -0
  57. package/dist/tools/git.d.ts +60 -0
  58. package/dist/tools/git.d.ts.map +1 -0
  59. package/dist/tools/git.js +188 -0
  60. package/dist/tools/git.js.map +1 -0
  61. package/dist/tools/index.d.ts +386 -0
  62. package/dist/tools/index.d.ts.map +1 -0
  63. package/dist/tools/index.js +142 -0
  64. package/dist/tools/index.js.map +1 -0
  65. package/dist/tools/linter.d.ts +44 -0
  66. package/dist/tools/linter.d.ts.map +1 -0
  67. package/dist/tools/linter.js +426 -0
  68. package/dist/tools/linter.js.map +1 -0
  69. package/dist/tools/network.d.ts +17 -0
  70. package/dist/tools/network.d.ts.map +1 -0
  71. package/dist/tools/network.js +121 -0
  72. package/dist/tools/network.js.map +1 -0
  73. package/dist/tools/search.d.ts +33 -0
  74. package/dist/tools/search.d.ts.map +1 -0
  75. package/dist/tools/search.js +263 -0
  76. package/dist/tools/search.js.map +1 -0
  77. package/dist/tools/security.d.ts +18 -0
  78. package/dist/tools/security.d.ts.map +1 -0
  79. package/dist/tools/security.js +242 -0
  80. package/dist/tools/security.js.map +1 -0
  81. package/dist/tools/shell.d.ts +14 -0
  82. package/dist/tools/shell.d.ts.map +1 -0
  83. package/dist/tools/shell.js +68 -0
  84. package/dist/tools/shell.js.map +1 -0
  85. package/dist/tools/types.d.ts +5 -0
  86. package/dist/tools/types.d.ts.map +1 -0
  87. package/dist/tools/types.js +2 -0
  88. package/dist/tools/types.js.map +1 -0
  89. package/package.json +59 -0
@@ -0,0 +1,142 @@
1
+ import { zodToJsonSchema } from "zod-to-json-schema";
2
+ import { ApplyDiffSchema, CreateDirectorySchema, DeleteFileSchema, GetFileInfoSchema, ListDirectorySchema, MoveFileSchema, ReadFileSchema, SearchReplaceAllSchema, ShowDiffSchema, WriteToFileSchema, apply_diff, create_directory, delete_file, get_file_info, list_directory, move_file, read_file, search_and_replace_all, show_diff, write_to_file, } from "./filesystem.js";
3
+ import { FindFilesSchema, SearchFilesSchema, find_files, search_files, } from "./search.js";
4
+ import { FetchUrlSchema, fetch_url } from "./network.js";
5
+ import { RunBashCommandSchema, run_bash_command } from "./shell.js";
6
+ import { GitBlameSchema, GitDiffSchema, GitLogSchema, GitStashSchema, GitStatusSchema, git_blame, git_diff, git_log, git_stash, git_status, } from "./git.js";
7
+ import { RunLinterSchema, RunTestsSchema, SecurityScanSchema, run_linter, run_tests, security_scan, } from "./linter.js";
8
+ import { getRuntimeConfig, setRuntimeConfig, } from "./security.js";
9
+ const TOOL_REGISTRY = {
10
+ read_file: {
11
+ description: "Read a local file. Supports optional line-range reads via start_line/end_line.",
12
+ schema: ReadFileSchema,
13
+ handler: (args) => read_file(args),
14
+ },
15
+ write_to_file: {
16
+ description: "Write content to a local file. In standard mode this requires confirmation.",
17
+ schema: WriteToFileSchema,
18
+ handler: (args) => write_to_file(args),
19
+ },
20
+ apply_diff: {
21
+ description: "Safely replace one exact text block in an existing file. Fails if match count is not exactly one.",
22
+ schema: ApplyDiffSchema,
23
+ handler: (args) => apply_diff(args),
24
+ },
25
+ list_directory: {
26
+ description: "List files and folders in a directory.",
27
+ schema: ListDirectorySchema,
28
+ handler: (args) => list_directory(args),
29
+ },
30
+ create_directory: {
31
+ description: "Create a directory (and optionally parent directories).",
32
+ schema: CreateDirectorySchema,
33
+ handler: (args) => create_directory(args),
34
+ },
35
+ delete_file: {
36
+ description: "Delete a file (or directory with recursive=true). In standard mode this requires confirmation.",
37
+ schema: DeleteFileSchema,
38
+ handler: (args) => delete_file(args),
39
+ },
40
+ move_file: {
41
+ description: "Move or rename a file/directory path. In standard mode this requires confirmation.",
42
+ schema: MoveFileSchema,
43
+ handler: (args) => move_file(args),
44
+ },
45
+ get_file_info: {
46
+ description: "Get file metadata (type, size, timestamps, permissions) for a path.",
47
+ schema: GetFileInfoSchema,
48
+ handler: (args) => get_file_info(args),
49
+ },
50
+ search_files: {
51
+ description: "Search file contents using ripgrep (or fallback scan). Returns file:line:content matches.",
52
+ schema: SearchFilesSchema,
53
+ handler: (args) => search_files(args),
54
+ },
55
+ find_files: {
56
+ description: "Find files by glob pattern, for example **/*.ts. Returns absolute paths.",
57
+ schema: FindFilesSchema,
58
+ handler: (args) => find_files(args),
59
+ },
60
+ show_diff: {
61
+ description: "Show a colored unified diff between a file on disk and proposed new content. Use before write_to_file to preview changes.",
62
+ schema: ShowDiffSchema,
63
+ handler: (args) => show_diff(args),
64
+ },
65
+ search_and_replace_all: {
66
+ description: "Search for a pattern across all files in a directory and replace it. Use dry_run=true (default) to preview before writing.",
67
+ schema: SearchReplaceAllSchema,
68
+ handler: (args) => search_and_replace_all(args),
69
+ },
70
+ fetch_url: {
71
+ description: "Fetch an HTTP/HTTPS URL and return the response text (with optional truncation).",
72
+ schema: FetchUrlSchema,
73
+ handler: (args, context) => fetch_url(args, context),
74
+ },
75
+ run_bash_command: {
76
+ description: "Run a shell command in the current working directory. Dangerous patterns are blocked.",
77
+ schema: RunBashCommandSchema,
78
+ handler: (args, context) => run_bash_command(args, context),
79
+ },
80
+ git_status: {
81
+ description: "Show git working tree status (short format with branch info).",
82
+ schema: GitStatusSchema,
83
+ handler: (args) => git_status(args),
84
+ },
85
+ git_diff: {
86
+ description: "Show git diff for the working tree, staged changes, or against a base commit/branch.",
87
+ schema: GitDiffSchema,
88
+ handler: (args) => git_diff(args),
89
+ },
90
+ git_log: {
91
+ description: "Show recent git commit history, optionally filtered to a file.",
92
+ schema: GitLogSchema,
93
+ handler: (args) => git_log(args),
94
+ },
95
+ git_blame: {
96
+ description: "Show who last modified each line of a file (git blame).",
97
+ schema: GitBlameSchema,
98
+ handler: (args) => git_blame(args),
99
+ },
100
+ git_stash: {
101
+ description: "List all stashes or show the diff of the top stash.",
102
+ schema: GitStashSchema,
103
+ handler: (args) => git_stash(args),
104
+ },
105
+ run_linter: {
106
+ description: "Run a linter (eslint, tsc, ruff, mypy, clippy, golangci-lint — auto-detected from project files).",
107
+ schema: RunLinterSchema,
108
+ handler: (args) => run_linter(args),
109
+ },
110
+ run_tests: {
111
+ description: "Run the project's test suite (vitest, jest, pytest, cargo test, go test — auto-detected).",
112
+ schema: RunTestsSchema,
113
+ handler: (args) => run_tests(args),
114
+ },
115
+ security_scan: {
116
+ description: "Scan source files for security issues: hardcoded secrets, XSS, SQL injection, eval usage, weak crypto, etc.",
117
+ schema: SecurityScanSchema,
118
+ handler: (args) => security_scan(args),
119
+ },
120
+ };
121
+ export const TOOL_DEFINITIONS = Object.entries(TOOL_REGISTRY).map(([name, entry]) => ({
122
+ type: "function",
123
+ function: {
124
+ name,
125
+ description: entry.description,
126
+ parameters: zodToJsonSchema(entry.schema, { target: "openAi" }),
127
+ },
128
+ }));
129
+ export const TOOL_MAP = Object.fromEntries(Object.entries(TOOL_REGISTRY).map(([name, entry]) => [name, entry.handler]));
130
+ export function configureToolRuntime(config) {
131
+ setRuntimeConfig(config);
132
+ }
133
+ export function listAvailableTools() {
134
+ return Object.entries(TOOL_REGISTRY).map(([name, entry]) => ({
135
+ name: name,
136
+ description: entry.description,
137
+ }));
138
+ }
139
+ export function getToolRuntime() {
140
+ return getRuntimeConfig();
141
+ }
142
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ export declare const RunLinterSchema: z.ZodObject<{
3
+ path: z.ZodOptional<z.ZodString>;
4
+ linter: z.ZodDefault<z.ZodEnum<["auto", "eslint", "tsc", "ruff", "mypy", "clippy", "golangci", "biome"]>>;
5
+ fix: z.ZodDefault<z.ZodBoolean>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ linter: "eslint" | "tsc" | "ruff" | "mypy" | "clippy" | "golangci" | "biome" | "auto";
8
+ fix: boolean;
9
+ path?: string | undefined;
10
+ }, {
11
+ path?: string | undefined;
12
+ linter?: "eslint" | "tsc" | "ruff" | "mypy" | "clippy" | "golangci" | "biome" | "auto" | undefined;
13
+ fix?: boolean | undefined;
14
+ }>;
15
+ export declare function run_linter(args: z.infer<typeof RunLinterSchema>): Promise<string>;
16
+ export declare const RunTestsSchema: z.ZodObject<{
17
+ path: z.ZodOptional<z.ZodString>;
18
+ runner: z.ZodDefault<z.ZodEnum<["auto", "vitest", "jest", "npm_test", "pytest", "cargo_test", "go_test"]>>;
19
+ pattern: z.ZodOptional<z.ZodString>;
20
+ bail: z.ZodDefault<z.ZodBoolean>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ runner: "npm_test" | "vitest" | "jest" | "pytest" | "cargo_test" | "go_test" | "auto";
23
+ bail: boolean;
24
+ path?: string | undefined;
25
+ pattern?: string | undefined;
26
+ }, {
27
+ path?: string | undefined;
28
+ pattern?: string | undefined;
29
+ runner?: "npm_test" | "vitest" | "jest" | "pytest" | "cargo_test" | "go_test" | "auto" | undefined;
30
+ bail?: boolean | undefined;
31
+ }>;
32
+ export declare function run_tests(args: z.infer<typeof RunTestsSchema>): Promise<string>;
33
+ export declare const SecurityScanSchema: z.ZodObject<{
34
+ path: z.ZodString;
35
+ include_low_severity: z.ZodDefault<z.ZodBoolean>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ path: string;
38
+ include_low_severity: boolean;
39
+ }, {
40
+ path: string;
41
+ include_low_severity?: boolean | undefined;
42
+ }>;
43
+ export declare function security_scan(args: z.infer<typeof SecurityScanSchema>): Promise<string>;
44
+ //# sourceMappingURL=linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/tools/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8IxB,eAAO,MAAM,eAAe;;;;;;;;;;;;EAe1B,CAAC;AAEH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAID,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAmBzB,CAAC;AAEH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CAkEjB;AAID,eAAO,MAAM,kBAAkB;;;;;;;;;EAQ7B,CAAC;AA4EH,wBAAsB,aAAa,CACjC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC,CA4GjB"}
@@ -0,0 +1,426 @@
1
+ import { exec } from "child_process";
2
+ import { promisify } from "util";
3
+ import fs from "fs/promises";
4
+ import path from "path";
5
+ import { z } from "zod";
6
+ import { resolveProtectedPath, getRuntimeConfig } from "./security.js";
7
+ const execAsync = promisify(exec);
8
+ const LINTER_TIMEOUT_MS = 60_000;
9
+ const MAX_OUTPUT_CHARS = 30_000;
10
+ async function runCmd(command, cwd, timeoutMs = LINTER_TIMEOUT_MS) {
11
+ try {
12
+ const { stdout, stderr } = await execAsync(command, {
13
+ cwd,
14
+ timeout: timeoutMs,
15
+ maxBuffer: 1024 * 1024 * 4,
16
+ });
17
+ return { stdout, stderr, exitCode: 0 };
18
+ }
19
+ catch (err) {
20
+ const e = err;
21
+ return {
22
+ stdout: e.stdout ?? "",
23
+ stderr: e.stderr ?? e.message ?? String(err),
24
+ exitCode: e.code ?? 1,
25
+ };
26
+ }
27
+ }
28
+ function truncate(text) {
29
+ const t = text.trim();
30
+ return t.length > MAX_OUTPUT_CHARS
31
+ ? t.slice(0, MAX_OUTPUT_CHARS) + "\n[output truncated]"
32
+ : t;
33
+ }
34
+ // ─── Auto-detection helpers ─────────────────────────────────────────────────
35
+ async function fileExists(p) {
36
+ try {
37
+ await fs.access(p);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ async function detectLinter(dir) {
45
+ const hits = [];
46
+ const [hasPkg, hasCargo, hasGoMod, hasPyproject, hasSetup, hasEslint, hasBiome] = await Promise.all([
47
+ fileExists(path.join(dir, "package.json")),
48
+ fileExists(path.join(dir, "Cargo.toml")),
49
+ fileExists(path.join(dir, "go.mod")),
50
+ fileExists(path.join(dir, "pyproject.toml")),
51
+ fileExists(path.join(dir, "setup.py")),
52
+ fileExists(path.join(dir, ".eslintrc.js")).then((v) => v
53
+ ? true
54
+ : fileExists(path.join(dir, ".eslintrc.json")).then((v2) => v2
55
+ ? true
56
+ : fileExists(path.join(dir, ".eslintrc.cjs")).then((v3) => v3
57
+ ? true
58
+ : fileExists(path.join(dir, "eslint.config.js")).then((v4) => v4 || fileExists(path.join(dir, "eslint.config.mjs")))))),
59
+ fileExists(path.join(dir, "biome.json")).then((v) => v || fileExists(path.join(dir, "biome.jsonc"))),
60
+ ]);
61
+ if (hasBiome)
62
+ hits.push("biome");
63
+ if (hasPkg && hasEslint)
64
+ hits.push("eslint");
65
+ if (hasPkg)
66
+ hits.push("tsc");
67
+ if (hasCargo)
68
+ hits.push("clippy");
69
+ if (hasGoMod)
70
+ hits.push("golangci");
71
+ if (hasPyproject || hasSetup) {
72
+ hits.push("ruff");
73
+ hits.push("mypy");
74
+ }
75
+ return hits.length > 0 ? hits : ["unknown"];
76
+ }
77
+ async function detectTestRunner(dir) {
78
+ const [hasPkg, hasCargo, hasGoMod, hasPyproject, hasSetup] = await Promise.all([
79
+ fileExists(path.join(dir, "package.json")),
80
+ fileExists(path.join(dir, "Cargo.toml")),
81
+ fileExists(path.join(dir, "go.mod")),
82
+ fileExists(path.join(dir, "pyproject.toml")),
83
+ fileExists(path.join(dir, "setup.py")),
84
+ ]);
85
+ if (hasPkg) {
86
+ try {
87
+ const raw = await fs.readFile(path.join(dir, "package.json"), "utf-8");
88
+ const pkg = JSON.parse(raw);
89
+ const deps = {
90
+ ...pkg.dependencies,
91
+ ...pkg.devDependencies,
92
+ };
93
+ if ("vitest" in deps)
94
+ return "vitest";
95
+ if ("jest" in deps || "@jest/core" in deps)
96
+ return "jest";
97
+ }
98
+ catch {
99
+ // fall through
100
+ }
101
+ return "npm_test";
102
+ }
103
+ if (hasCargo)
104
+ return "cargo_test";
105
+ if (hasGoMod)
106
+ return "go_test";
107
+ if (hasPyproject || hasSetup)
108
+ return "pytest";
109
+ return "unknown";
110
+ }
111
+ // ─── run_linter ─────────────────────────────────────────────────────────────
112
+ export const RunLinterSchema = z.object({
113
+ path: z
114
+ .string()
115
+ .optional()
116
+ .describe("Optional path to lint (file or directory). Defaults to workspace root."),
117
+ linter: z
118
+ .enum(["auto", "eslint", "tsc", "ruff", "mypy", "clippy", "golangci", "biome"])
119
+ .default("auto")
120
+ .describe("Which linter to run. 'auto' detects from project files."),
121
+ fix: z
122
+ .boolean()
123
+ .default(false)
124
+ .describe("Attempt to auto-fix lint errors where supported"),
125
+ });
126
+ export async function run_linter(args) {
127
+ const parsed = RunLinterSchema.parse(args);
128
+ const cwd = getRuntimeConfig().workspaceRoot;
129
+ let targetPath = cwd;
130
+ if (parsed.path) {
131
+ try {
132
+ targetPath = await resolveProtectedPath(parsed.path);
133
+ }
134
+ catch {
135
+ return "Error: path is outside workspace root";
136
+ }
137
+ }
138
+ const kinds = parsed.linter === "auto"
139
+ ? await detectLinter(cwd)
140
+ : [parsed.linter];
141
+ const results = [];
142
+ for (const kind of kinds) {
143
+ let cmd = "";
144
+ switch (kind) {
145
+ case "eslint": {
146
+ const fixFlag = parsed.fix ? " --fix" : "";
147
+ cmd = `npx --no-install eslint${fixFlag} "${targetPath}"`;
148
+ break;
149
+ }
150
+ case "tsc":
151
+ cmd = `npx --no-install tsc --noEmit`;
152
+ break;
153
+ case "ruff": {
154
+ const fixFlag = parsed.fix ? " --fix" : "";
155
+ cmd = `ruff check${fixFlag} "${targetPath}"`;
156
+ break;
157
+ }
158
+ case "mypy":
159
+ cmd = `mypy "${targetPath}"`;
160
+ break;
161
+ case "clippy": {
162
+ const fixFlag = parsed.fix ? " --fix --allow-dirty" : "";
163
+ cmd = `cargo clippy${fixFlag} 2>&1`;
164
+ break;
165
+ }
166
+ case "golangci":
167
+ cmd = `golangci-lint run "${targetPath}/..."`;
168
+ break;
169
+ case "biome": {
170
+ const fixFlag = parsed.fix ? " --write" : "";
171
+ cmd = `npx --no-install biome check${fixFlag} "${targetPath}"`;
172
+ break;
173
+ }
174
+ default:
175
+ results.push("No linter detected. Install eslint, ruff, clippy, or golangci-lint.");
176
+ continue;
177
+ }
178
+ const { stdout, stderr, exitCode } = await runCmd(cmd, cwd);
179
+ const combined = [stdout, stderr].filter(Boolean).join("\n");
180
+ const header = `[${kind}] (exit ${exitCode})`;
181
+ results.push(`${header}\n${truncate(combined) || "(no output — clean!)"}`);
182
+ }
183
+ return results.join("\n\n---\n\n");
184
+ }
185
+ // ─── run_tests ──────────────────────────────────────────────────────────────
186
+ export const RunTestsSchema = z.object({
187
+ path: z
188
+ .string()
189
+ .optional()
190
+ .describe("Optional test file or directory to run. Defaults to workspace test suite."),
191
+ runner: z
192
+ .enum(["auto", "vitest", "jest", "npm_test", "pytest", "cargo_test", "go_test"])
193
+ .default("auto")
194
+ .describe("Test runner to use. 'auto' detects from project files."),
195
+ pattern: z
196
+ .string()
197
+ .optional()
198
+ .describe("Optional filter pattern to match specific test names"),
199
+ bail: z
200
+ .boolean()
201
+ .default(false)
202
+ .describe("Stop on first failure"),
203
+ });
204
+ export async function run_tests(args) {
205
+ const parsed = RunTestsSchema.parse(args);
206
+ const cwd = getRuntimeConfig().workspaceRoot;
207
+ let targetPath = "";
208
+ if (parsed.path) {
209
+ try {
210
+ targetPath = await resolveProtectedPath(parsed.path);
211
+ }
212
+ catch {
213
+ return "Error: path is outside workspace root";
214
+ }
215
+ }
216
+ const runner = parsed.runner === "auto" ? await detectTestRunner(cwd) : parsed.runner;
217
+ const bailFlag = parsed.bail;
218
+ let cmd = "";
219
+ switch (runner) {
220
+ case "vitest": {
221
+ const pattern = parsed.pattern ? ` -t "${parsed.pattern}"` : "";
222
+ const bail = bailFlag ? " --bail" : "";
223
+ const file = targetPath ? ` "${targetPath}"` : "";
224
+ cmd = `npx --no-install vitest run${file}${pattern}${bail}`;
225
+ break;
226
+ }
227
+ case "jest": {
228
+ const pattern = parsed.pattern ? ` -t "${parsed.pattern}"` : "";
229
+ const bail = bailFlag ? " --bail" : "";
230
+ const file = targetPath ? ` "${targetPath}"` : "";
231
+ cmd = `npx --no-install jest${file}${pattern}${bail} --no-coverage`;
232
+ break;
233
+ }
234
+ case "npm_test": {
235
+ const file = targetPath ? ` -- "${targetPath}"` : "";
236
+ cmd = `npm test${file}`;
237
+ break;
238
+ }
239
+ case "pytest": {
240
+ const pattern = parsed.pattern ? ` -k "${parsed.pattern}"` : "";
241
+ const bail = bailFlag ? " -x" : "";
242
+ const file = targetPath ? ` "${targetPath}"` : "";
243
+ cmd = `python -m pytest${file}${pattern}${bail} -v`;
244
+ break;
245
+ }
246
+ case "cargo_test": {
247
+ const pattern = parsed.pattern ? ` "${parsed.pattern}"` : "";
248
+ cmd = `cargo test${pattern}`;
249
+ break;
250
+ }
251
+ case "go_test": {
252
+ const file = targetPath || "./...";
253
+ const bail = bailFlag ? " -failfast" : "";
254
+ cmd = `go test${bail} -v "${file}"`;
255
+ break;
256
+ }
257
+ default:
258
+ return "No test runner detected. Install vitest, jest, pytest, cargo, or go.";
259
+ }
260
+ const { stdout, stderr, exitCode } = await runCmd(cmd, cwd, 120_000);
261
+ const combined = [stdout, stderr].filter(Boolean).join("\n");
262
+ const status = exitCode === 0 ? "PASSED" : "FAILED";
263
+ return `[${runner}] Tests ${status} (exit ${exitCode})\n\n${truncate(combined)}`;
264
+ }
265
+ // ─── Security scan ──────────────────────────────────────────────────────────
266
+ export const SecurityScanSchema = z.object({
267
+ path: z
268
+ .string()
269
+ .describe("Absolute path to file or directory to scan"),
270
+ include_low_severity: z
271
+ .boolean()
272
+ .default(false)
273
+ .describe("Include low-severity findings (default: only medium+)"),
274
+ });
275
+ const SCAN_RULES = [
276
+ // Critical
277
+ { pattern: /eval\s*\(/, severity: "critical", rule: "EVAL_001: eval() usage" },
278
+ { pattern: /child_process.*exec\s*\(|subprocess\.call|os\.system/, severity: "critical", rule: "EXEC_001: Shell exec with variable input" },
279
+ { pattern: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/, severity: "critical", rule: "SECRET_001: Private key in source" },
280
+ // High
281
+ { pattern: /\bpassword\s*=\s*["'][^"']{4,}["']/i, severity: "high", rule: "SECRET_002: Hardcoded password" },
282
+ { pattern: /\bsecret\s*=\s*["'][^"']{4,}["']/i, severity: "high", rule: "SECRET_003: Hardcoded secret" },
283
+ { pattern: /\bapi[_-]?key\s*=\s*["'][^"']{4,}["']/i, severity: "high", rule: "SECRET_004: Hardcoded API key" },
284
+ { pattern: /\bsk-[A-Za-z0-9]{20,}/, severity: "high", rule: "SECRET_005: OpenAI key pattern" },
285
+ { pattern: /innerHTML\s*=/, severity: "high", rule: "XSS_001: innerHTML assignment (potential XSS)" },
286
+ { pattern: /document\.write\s*\(/, severity: "high", rule: "XSS_002: document.write() (potential XSS)" },
287
+ { pattern: /dangerouslySetInnerHTML/, severity: "high", rule: "XSS_003: React dangerouslySetInnerHTML" },
288
+ { pattern: /SELECT.+FROM.+WHERE.+[+].+req\.|input|user/i, severity: "high", rule: "SQLI_001: Potential SQL injection" },
289
+ // Medium
290
+ { pattern: /console\.log\(.*(?:password|secret|token|key)/i, severity: "medium", rule: "LOG_001: Sensitive data in console.log" },
291
+ { pattern: /Math\.random\(\)/, severity: "medium", rule: "CRYPTO_001: Math.random() for security — use crypto.getRandomValues" },
292
+ { pattern: /md5|sha1\b/i, severity: "medium", rule: "CRYPTO_002: Weak hash algorithm" },
293
+ { pattern: /http:\/\/(?!localhost|127\.0\.0\.1)/, severity: "medium", rule: "TLS_001: Non-HTTPS URL (except localhost)" },
294
+ { pattern: /TODO[:\s].*(?:security|auth|fix|hack|remove)/i, severity: "medium", rule: "TODO_001: Security-related TODO" },
295
+ // Low
296
+ { pattern: /\/\/\s*NOSONAR|eslint-disable/, severity: "low", rule: "LINT_001: Lint/analysis suppression comment" },
297
+ { pattern: /debugger;/, severity: "low", rule: "DEBUG_001: debugger statement" },
298
+ ];
299
+ async function scanFile(filePath, includeLow) {
300
+ let content;
301
+ try {
302
+ content = await fs.readFile(filePath, "utf-8");
303
+ }
304
+ catch {
305
+ return [];
306
+ }
307
+ const lines = content.split("\n");
308
+ const findings = [];
309
+ for (const { pattern, severity, rule } of SCAN_RULES) {
310
+ if (!includeLow && severity === "low")
311
+ continue;
312
+ for (let lineNo = 0; lineNo < lines.length; lineNo++) {
313
+ const line = lines[lineNo] ?? "";
314
+ // Reset lastIndex for global patterns
315
+ pattern.lastIndex = 0;
316
+ const match = pattern.exec(line);
317
+ if (match) {
318
+ findings.push({
319
+ file: filePath,
320
+ line: lineNo + 1,
321
+ severity,
322
+ rule,
323
+ match: line.trim().slice(0, 120),
324
+ });
325
+ }
326
+ }
327
+ }
328
+ return findings;
329
+ }
330
+ export async function security_scan(args) {
331
+ const parsed = SecurityScanSchema.parse(args);
332
+ let scanPath;
333
+ try {
334
+ scanPath = await resolveProtectedPath(parsed.path);
335
+ }
336
+ catch {
337
+ return "Error: path is outside workspace root";
338
+ }
339
+ const stat = await fs.stat(scanPath).catch(() => null);
340
+ if (!stat)
341
+ return `Error: path not found: ${scanPath}`;
342
+ const TEXT_EXTS = new Set([
343
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
344
+ ".py", ".rb", ".go", ".rs", ".java", ".kt", ".swift",
345
+ ".php", ".sh", ".bash", ".zsh", ".env", ".yaml", ".yml",
346
+ ".json", ".toml", ".tf", ".hcl", ".sql",
347
+ ]);
348
+ const filesToScan = [];
349
+ if (stat.isFile()) {
350
+ filesToScan.push(scanPath);
351
+ }
352
+ else if (stat.isDirectory()) {
353
+ const walk = async (dir) => {
354
+ let entries;
355
+ try {
356
+ entries = await fs.readdir(dir, { withFileTypes: true, encoding: "utf-8" });
357
+ }
358
+ catch {
359
+ return;
360
+ }
361
+ for (const entry of entries) {
362
+ const full = path.join(dir, entry.name);
363
+ if (entry.isDirectory()) {
364
+ if (!["node_modules", ".git", "dist", "build", "__pycache__", ".next"].includes(entry.name)) {
365
+ await walk(full);
366
+ }
367
+ }
368
+ else if (entry.isFile() && TEXT_EXTS.has(path.extname(entry.name))) {
369
+ filesToScan.push(full);
370
+ }
371
+ }
372
+ };
373
+ await walk(scanPath);
374
+ }
375
+ if (filesToScan.length === 0) {
376
+ return "No scannable source files found at the specified path.";
377
+ }
378
+ const allFindings = [];
379
+ for (const file of filesToScan) {
380
+ const findings = await scanFile(file, parsed.include_low_severity);
381
+ allFindings.push(...findings);
382
+ }
383
+ if (allFindings.length === 0) {
384
+ return `Security scan complete — no issues found in ${filesToScan.length} file(s).`;
385
+ }
386
+ // Sort by severity then file+line
387
+ const order = {
388
+ critical: 0,
389
+ high: 1,
390
+ medium: 2,
391
+ low: 3,
392
+ };
393
+ allFindings.sort((a, b) => order[a.severity] - order[b.severity] || a.file.localeCompare(b.file) || a.line - b.line);
394
+ const cwd = getRuntimeConfig().workspaceRoot;
395
+ const lines = [
396
+ `Security scan: ${allFindings.length} finding(s) in ${filesToScan.length} file(s)`,
397
+ "",
398
+ ];
399
+ const bySeverity = {};
400
+ for (const f of allFindings) {
401
+ (bySeverity[f.severity] ??= []).push(f);
402
+ }
403
+ for (const severity of ["critical", "high", "medium", "low"]) {
404
+ const group = bySeverity[severity];
405
+ if (!group?.length)
406
+ continue;
407
+ lines.push(`── ${severity.toUpperCase()} (${group.length}) ──`);
408
+ for (const f of group) {
409
+ const rel = path.relative(cwd, f.file);
410
+ lines.push(` ${rel}:${f.line} [${f.rule}]`);
411
+ lines.push(` ${f.match}`);
412
+ }
413
+ lines.push("");
414
+ }
415
+ const total = allFindings.length;
416
+ const crits = bySeverity["critical"]?.length ?? 0;
417
+ const highs = bySeverity["high"]?.length ?? 0;
418
+ lines.push(`Summary: ${crits} critical, ${highs} high, ` +
419
+ `${bySeverity["medium"]?.length ?? 0} medium, ` +
420
+ `${bySeverity["low"]?.length ?? 0} low (${total} total)`);
421
+ const result = lines.join("\n");
422
+ return result.length > MAX_OUTPUT_CHARS
423
+ ? result.slice(0, MAX_OUTPUT_CHARS) + "\n[output truncated]"
424
+ : result;
425
+ }
426
+ //# sourceMappingURL=linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/tools/linter.ts"],"names":[],"mappings":"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"}