fixo-cli 1.0.3 → 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.
Potentially problematic release.
This version of fixo-cli might be problematic. Click here for more details.
- package/CHANGELOG.md +62 -0
- package/README.md +18 -14
- package/dist/agent/agent-client.d.ts +28 -6
- package/dist/agent/agent-client.d.ts.map +1 -1
- package/dist/agent/agent-client.js +118 -39
- package/dist/agent/agent-client.js.map +1 -1
- package/dist/agent/agent-pool.d.ts +55 -6
- package/dist/agent/agent-pool.d.ts.map +1 -1
- package/dist/agent/agent-pool.js +120 -20
- package/dist/agent/agent-pool.js.map +1 -1
- package/dist/agent/auto-verifier.d.ts +55 -0
- package/dist/agent/auto-verifier.d.ts.map +1 -0
- package/dist/agent/auto-verifier.js +50 -0
- package/dist/agent/auto-verifier.js.map +1 -0
- package/dist/agent/command-parser.d.ts +37 -0
- package/dist/agent/command-parser.d.ts.map +1 -1
- package/dist/agent/command-parser.js +473 -1
- package/dist/agent/command-parser.js.map +1 -1
- package/dist/agent/context-builder.d.ts +24 -0
- package/dist/agent/context-builder.d.ts.map +1 -0
- package/dist/agent/context-builder.js +197 -0
- package/dist/agent/context-builder.js.map +1 -0
- package/dist/agent/conversation.d.ts +32 -2
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +84 -9
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/duration.d.ts +24 -0
- package/dist/agent/duration.d.ts.map +1 -0
- package/dist/agent/duration.js +42 -0
- package/dist/agent/duration.js.map +1 -0
- package/dist/agent/file-writing-rules.d.ts +19 -0
- package/dist/agent/file-writing-rules.d.ts.map +1 -0
- package/dist/agent/file-writing-rules.js +31 -0
- package/dist/agent/file-writing-rules.js.map +1 -0
- package/dist/agent/mcp-bridge.js +1 -1
- package/dist/agent/mcp-bridge.js.map +1 -1
- package/dist/agent/orchestrator.d.ts +45 -0
- package/dist/agent/orchestrator.d.ts.map +1 -1
- package/dist/agent/orchestrator.js +140 -3
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/parser-adapter.d.ts +17 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -1
- package/dist/agent/parser-adapter.js +311 -7
- package/dist/agent/parser-adapter.js.map +1 -1
- package/dist/agent/predictive-gate.d.ts.map +1 -1
- package/dist/agent/predictive-gate.js +4 -1
- package/dist/agent/predictive-gate.js.map +1 -1
- package/dist/agent/provider-cooldown.d.ts.map +1 -1
- package/dist/agent/provider-cooldown.js +3 -2
- package/dist/agent/provider-cooldown.js.map +1 -1
- package/dist/agent/providers-manager.d.ts +5 -0
- package/dist/agent/providers-manager.d.ts.map +1 -1
- package/dist/agent/providers-manager.js +119 -8
- package/dist/agent/providers-manager.js.map +1 -1
- package/dist/agent/repo-map.d.ts +18 -1
- package/dist/agent/repo-map.d.ts.map +1 -1
- package/dist/agent/repo-map.js +144 -54
- package/dist/agent/repo-map.js.map +1 -1
- package/dist/agent/retry.js +1 -2
- package/dist/agent/retry.js.map +1 -1
- package/dist/agent/single-agent.d.ts +13 -0
- package/dist/agent/single-agent.d.ts.map +1 -1
- package/dist/agent/single-agent.js +225 -37
- package/dist/agent/single-agent.js.map +1 -1
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +2 -1
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/subagent.js +2 -2
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/task-router.d.ts +46 -0
- package/dist/agent/task-router.d.ts.map +1 -0
- package/dist/agent/task-router.js +352 -0
- package/dist/agent/task-router.js.map +1 -0
- package/dist/agent/telemetry.d.ts +29 -1
- package/dist/agent/telemetry.d.ts.map +1 -1
- package/dist/agent/telemetry.js +29 -11
- package/dist/agent/telemetry.js.map +1 -1
- package/dist/agent/tool-definitions.d.ts +3 -0
- package/dist/agent/tool-definitions.d.ts.map +1 -0
- package/dist/agent/tool-definitions.js +519 -0
- package/dist/agent/tool-definitions.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +6 -1
- package/dist/agent/tool-executor.d.ts.map +1 -1
- package/dist/agent/tool-executor.js +99 -553
- package/dist/agent/tool-executor.js.map +1 -1
- package/dist/agent/tools/command-tools.d.ts +6 -0
- package/dist/agent/tools/command-tools.d.ts.map +1 -0
- package/dist/agent/tools/command-tools.js +104 -0
- package/dist/agent/tools/command-tools.js.map +1 -0
- package/dist/agent/tools/file-tools.d.ts +15 -0
- package/dist/agent/tools/file-tools.d.ts.map +1 -0
- package/dist/agent/tools/file-tools.js +551 -0
- package/dist/agent/tools/file-tools.js.map +1 -0
- package/dist/agent/tools/todo-tools.d.ts +3 -0
- package/dist/agent/tools/todo-tools.d.ts.map +1 -0
- package/dist/agent/tools/todo-tools.js +70 -0
- package/dist/agent/tools/todo-tools.js.map +1 -0
- package/dist/agent/web-impl.d.ts.map +1 -1
- package/dist/agent/web-impl.js +45 -0
- package/dist/agent/web-impl.js.map +1 -1
- package/dist/agent/worker-agent.d.ts +3 -1
- package/dist/agent/worker-agent.d.ts.map +1 -1
- package/dist/agent/worker-agent.js +56 -16
- package/dist/agent/worker-agent.js.map +1 -1
- package/dist/config.d.ts +253 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +81 -1
- package/dist/config.js.map +1 -1
- package/dist/git/git-manager.d.ts +33 -2
- package/dist/git/git-manager.d.ts.map +1 -1
- package/dist/git/git-manager.js +111 -15
- package/dist/git/git-manager.js.map +1 -1
- package/dist/git/git-ops.d.ts.map +1 -1
- package/dist/git/git-ops.js +2 -1
- package/dist/git/git-ops.js.map +1 -1
- package/dist/index.js +89 -8
- package/dist/index.js.map +1 -1
- package/dist/lsp/lsp-manager.js +1 -1
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/model-outcomes.d.ts.map +1 -1
- package/dist/model-outcomes.js +2 -1
- package/dist/model-outcomes.js.map +1 -1
- package/dist/planner.d.ts +0 -9
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +0 -9
- package/dist/planner.js.map +1 -1
- package/dist/project-memory.d.ts +12 -1
- package/dist/project-memory.d.ts.map +1 -1
- package/dist/project-memory.js +8 -6
- package/dist/project-memory.js.map +1 -1
- package/dist/runtime/loop-mitigation.d.ts +119 -0
- package/dist/runtime/loop-mitigation.d.ts.map +1 -0
- package/dist/runtime/loop-mitigation.js +192 -0
- package/dist/runtime/loop-mitigation.js.map +1 -0
- package/dist/runtime/os-sandbox.d.ts +100 -0
- package/dist/runtime/os-sandbox.d.ts.map +1 -0
- package/dist/runtime/os-sandbox.js +246 -0
- package/dist/runtime/os-sandbox.js.map +1 -0
- package/dist/runtime/run-inventory.d.ts +17 -0
- package/dist/runtime/run-inventory.d.ts.map +1 -0
- package/dist/runtime/run-inventory.js +49 -0
- package/dist/runtime/run-inventory.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +52 -2
- package/dist/runtime/session-snapshots.d.ts.map +1 -1
- package/dist/runtime/session-snapshots.js +76 -1
- package/dist/runtime/session-snapshots.js.map +1 -1
- package/dist/runtime/staging.d.ts.map +1 -1
- package/dist/runtime/staging.js +4 -1
- package/dist/runtime/staging.js.map +1 -1
- package/dist/runtime/task-session.d.ts +14 -0
- package/dist/runtime/task-session.d.ts.map +1 -1
- package/dist/runtime/task-session.js +26 -0
- package/dist/runtime/task-session.js.map +1 -1
- package/dist/setup-wizard.d.ts +11 -3
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +113 -15
- package/dist/setup-wizard.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/commands/context-commands.d.ts +7 -0
- package/dist/ui/commands/context-commands.d.ts.map +1 -0
- package/dist/ui/commands/context-commands.js +241 -0
- package/dist/ui/commands/context-commands.js.map +1 -0
- package/dist/ui/commands/index.d.ts +3 -0
- package/dist/ui/commands/index.d.ts.map +1 -0
- package/dist/ui/commands/index.js +46 -0
- package/dist/ui/commands/index.js.map +1 -0
- package/dist/ui/commands/info-commands.d.ts +15 -0
- package/dist/ui/commands/info-commands.d.ts.map +1 -0
- package/dist/ui/commands/info-commands.js +122 -0
- package/dist/ui/commands/info-commands.js.map +1 -0
- package/dist/ui/commands/model-commands.d.ts +5 -0
- package/dist/ui/commands/model-commands.d.ts.map +1 -0
- package/dist/ui/commands/model-commands.js +417 -0
- package/dist/ui/commands/model-commands.js.map +1 -0
- package/dist/ui/commands/session-commands.d.ts +5 -0
- package/dist/ui/commands/session-commands.d.ts.map +1 -0
- package/dist/ui/commands/session-commands.js +154 -0
- package/dist/ui/commands/session-commands.js.map +1 -0
- package/dist/ui/commands/task-commands.d.ts +8 -0
- package/dist/ui/commands/task-commands.d.ts.map +1 -0
- package/dist/ui/commands/task-commands.js +152 -0
- package/dist/ui/commands/task-commands.js.map +1 -0
- package/dist/ui/commands/types.d.ts +46 -0
- package/dist/ui/commands/types.d.ts.map +1 -0
- package/dist/ui/commands/types.js +2 -0
- package/dist/ui/commands/types.js.map +1 -0
- package/dist/ui/commands/workspace-commands.d.ts +8 -0
- package/dist/ui/commands/workspace-commands.d.ts.map +1 -0
- package/dist/ui/commands/workspace-commands.js +131 -0
- package/dist/ui/commands/workspace-commands.js.map +1 -0
- package/dist/ui/loading-animation.d.ts +24 -0
- package/dist/ui/loading-animation.d.ts.map +1 -0
- package/dist/ui/loading-animation.js +123 -0
- package/dist/ui/loading-animation.js.map +1 -0
- package/dist/ui/markdown-stream.js +2 -2
- package/dist/ui/markdown-stream.js.map +1 -1
- package/dist/ui/prompt.d.ts +7 -0
- package/dist/ui/prompt.d.ts.map +1 -1
- package/dist/ui/prompt.js +461 -1143
- package/dist/ui/prompt.js.map +1 -1
- package/dist/ui/render-primitives.d.ts +6 -0
- package/dist/ui/render-primitives.d.ts.map +1 -1
- package/dist/ui/render-primitives.js +30 -13
- package/dist/ui/render-primitives.js.map +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/session-header.d.ts +13 -0
- package/dist/ui/session-header.d.ts.map +1 -1
- package/dist/ui/session-header.js +6 -0
- package/dist/ui/session-header.js.map +1 -1
- package/package.json +22 -4
- package/scripts/check-vendor-wasm.js +55 -0
- package/vendor/tree-sitter-bash.wasm +0 -0
- package/vendor/tree-sitter-go.wasm +0 -0
- package/vendor/tree-sitter-javascript.wasm +0 -0
- package/vendor/tree-sitter-python.wasm +0 -0
- package/vendor/tree-sitter-rust.wasm +0 -0
- package/vendor/tree-sitter-tsx.wasm +0 -0
- package/vendor/tree-sitter-typescript.wasm +0 -0
- package/vendor/tree-sitter.wasm +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-verifier.js","sourceRoot":"","sources":["../../src/agent/auto-verifier.ts"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA0B;IACzD,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAKD;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9E,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,OAAO,CACL,yEAAyE;QACzE,mHAAmH;QACnH,YAAY,CACb,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
import { ParserFactory, type ParsedCommand } from './parser-adapter.js';
|
|
2
2
|
export { ParserFactory };
|
|
3
3
|
export type { ParsedCommand } from './parser-adapter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where in a command a write target was discovered. Used so error
|
|
6
|
+
* messages can explain *why* the path was flagged (e.g. "redirect"
|
|
7
|
+
* vs "sed -i" vs "python -c open(...,'w')").
|
|
8
|
+
*/
|
|
9
|
+
export type WriteTargetKind = 'redirect' | 'sed-in-place' | 'tee' | 'mv-cp-dest' | 'interpreter-script';
|
|
10
|
+
export interface WriteTarget {
|
|
11
|
+
/** Raw path string as it appeared in the command. */
|
|
12
|
+
path: string;
|
|
13
|
+
/** What surface revealed this as a write target. */
|
|
14
|
+
kind: WriteTargetKind;
|
|
15
|
+
/** Optional binary that owned the write (e.g. "python3", "sed"). */
|
|
16
|
+
via?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detects file paths that a shell command will write to, even when
|
|
20
|
+
* the write happens via redirects, sed -i, tee, mv/cp, or interpreter
|
|
21
|
+
* `-c`/`-e` payloads.
|
|
22
|
+
*
|
|
23
|
+
* This is the shell-side counterpart to the platform-path lock that
|
|
24
|
+
* the surgical/write/edit tools already enforce. The point is to stop
|
|
25
|
+
* an agent from doing
|
|
26
|
+
* `python3 -c "open('src/foo.ts','w').write(...)"`
|
|
27
|
+
* to side-step `PlatformPathLockedError`.
|
|
28
|
+
*
|
|
29
|
+
* Implementation notes:
|
|
30
|
+
* - Operates on the raw command string (regex), not the parsed AST,
|
|
31
|
+
* because tree-sitter strips redirects from the per-command arg
|
|
32
|
+
* list. We deliberately accept some false positives here — the
|
|
33
|
+
* callsite turns them into a "needs human confirmation" prompt,
|
|
34
|
+
* never a silent allow.
|
|
35
|
+
* - For interpreter `-c`/`-e` payloads we extract quoted-string
|
|
36
|
+
* file targets via a conservative regex. Anything we cannot
|
|
37
|
+
* classify is reported as `interpreter-script` so the caller
|
|
38
|
+
* can decide whether to require confirmation.
|
|
39
|
+
*/
|
|
40
|
+
export declare function extractWriteTargets(raw: string): WriteTarget[];
|
|
4
41
|
/**
|
|
5
42
|
* Parses a shell command string into individual binary and arguments sets.
|
|
6
43
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../../src/agent/command-parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGjF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"command-parser.d.ts","sourceRoot":"","sources":["../../src/agent/command-parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,cAAc,GACd,KAAK,GACL,YAAY,GACZ,oBAAoB,CAAC;AAEzB,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,eAAe,CAAC;IACtB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAqF9D;AAqHD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGjF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqLD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoMxG;AAID;;;;;;GAMG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD"}
|
|
@@ -1,8 +1,235 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
import os from 'os';
|
|
3
|
-
import { WorkspaceGuard } from '../workspace-guard.js';
|
|
3
|
+
import { WorkspaceGuard, PlatformPathLockedError } from '../workspace-guard.js';
|
|
4
4
|
import { ParserFactory } from './parser-adapter.js';
|
|
5
5
|
export { ParserFactory };
|
|
6
|
+
/**
|
|
7
|
+
* Detects file paths that a shell command will write to, even when
|
|
8
|
+
* the write happens via redirects, sed -i, tee, mv/cp, or interpreter
|
|
9
|
+
* `-c`/`-e` payloads.
|
|
10
|
+
*
|
|
11
|
+
* This is the shell-side counterpart to the platform-path lock that
|
|
12
|
+
* the surgical/write/edit tools already enforce. The point is to stop
|
|
13
|
+
* an agent from doing
|
|
14
|
+
* `python3 -c "open('src/foo.ts','w').write(...)"`
|
|
15
|
+
* to side-step `PlatformPathLockedError`.
|
|
16
|
+
*
|
|
17
|
+
* Implementation notes:
|
|
18
|
+
* - Operates on the raw command string (regex), not the parsed AST,
|
|
19
|
+
* because tree-sitter strips redirects from the per-command arg
|
|
20
|
+
* list. We deliberately accept some false positives here — the
|
|
21
|
+
* callsite turns them into a "needs human confirmation" prompt,
|
|
22
|
+
* never a silent allow.
|
|
23
|
+
* - For interpreter `-c`/`-e` payloads we extract quoted-string
|
|
24
|
+
* file targets via a conservative regex. Anything we cannot
|
|
25
|
+
* classify is reported as `interpreter-script` so the caller
|
|
26
|
+
* can decide whether to require confirmation.
|
|
27
|
+
*/
|
|
28
|
+
export function extractWriteTargets(raw) {
|
|
29
|
+
const out = [];
|
|
30
|
+
const seen = new Set();
|
|
31
|
+
const push = (t) => {
|
|
32
|
+
const key = `${t.kind}|${t.path}`;
|
|
33
|
+
if (seen.has(key))
|
|
34
|
+
return;
|
|
35
|
+
seen.add(key);
|
|
36
|
+
out.push(t);
|
|
37
|
+
};
|
|
38
|
+
// 1. Redirects: `> file`, `>> file`, `1> file`, `&> file`.
|
|
39
|
+
// Skip `2>&1`, `>&2` etc. by requiring a path-like token after.
|
|
40
|
+
const redirectRe = /(?:^|[\s;&|()])(?:&|\d)?>{1,2}\s*([^\s;&|()<>]+)/g;
|
|
41
|
+
for (const m of raw.matchAll(redirectRe)) {
|
|
42
|
+
const target = stripQuotes(m[1]);
|
|
43
|
+
// `>&1`, `>&2` are fd duplications, not file paths.
|
|
44
|
+
if (/^&\d+$/.test(target))
|
|
45
|
+
continue;
|
|
46
|
+
if (target.startsWith('/dev/'))
|
|
47
|
+
continue;
|
|
48
|
+
push({ path: target, kind: 'redirect' });
|
|
49
|
+
}
|
|
50
|
+
// 2. `tee [-a] file…` writes each non-flag arg.
|
|
51
|
+
const teeRe = /(?:^|[\s;&|()])tee\b([^;&|()]*)/g;
|
|
52
|
+
for (const m of raw.matchAll(teeRe)) {
|
|
53
|
+
for (const arg of splitArgs(m[1])) {
|
|
54
|
+
if (arg.startsWith('-'))
|
|
55
|
+
continue;
|
|
56
|
+
push({ path: stripQuotes(arg), kind: 'tee', via: 'tee' });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 3. `sed -i[''] … file…` and `perl -i … file…` (in-place edit).
|
|
60
|
+
const inPlaceRe = /(?:^|[\s;&|()])(sed|perl|gawk|awk)\s+([^;&|()]*?-i\b[^;&|()]*)/g;
|
|
61
|
+
for (const m of raw.matchAll(inPlaceRe)) {
|
|
62
|
+
const bin = m[1];
|
|
63
|
+
const args = splitArgs(m[2]);
|
|
64
|
+
let sawScript = false;
|
|
65
|
+
for (const arg of args) {
|
|
66
|
+
if (arg.startsWith('-'))
|
|
67
|
+
continue;
|
|
68
|
+
// The first non-flag arg is the sed/perl script, not a file.
|
|
69
|
+
// Subsequent non-flag args are file targets.
|
|
70
|
+
if (!sawScript) {
|
|
71
|
+
sawScript = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
push({ path: stripQuotes(arg), kind: 'sed-in-place', via: bin });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 4. `mv SRC DEST` / `cp SRC DEST` — last positional is destination.
|
|
78
|
+
const mvCpRe = /(?:^|[\s;&|()])(mv|cp)\b([^;&|()]*)/g;
|
|
79
|
+
for (const m of raw.matchAll(mvCpRe)) {
|
|
80
|
+
const args = splitArgs(m[2]).filter((a) => !a.startsWith('-'));
|
|
81
|
+
if (args.length >= 2) {
|
|
82
|
+
const dest = stripQuotes(args[args.length - 1]);
|
|
83
|
+
push({ path: dest, kind: 'mv-cp-dest', via: m[1] });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 5. Interpreter scripts: `python3 -c "..."`, `node -e "..."`, etc.
|
|
87
|
+
// We can't use the coarse segment splitter here because the
|
|
88
|
+
// script body often contains `(`, `)`, `|`, `&` etc. that the
|
|
89
|
+
// splitter would treat as command boundaries. Instead, find the
|
|
90
|
+
// interpreter+flag, then walk the string capturing the quoted
|
|
91
|
+
// payload that follows.
|
|
92
|
+
const scriptHostRe = /(?:^|[\s;&|()`])(python3?|node|perl|ruby|bash|sh|zsh)\s+(?:[^\s;&|()`]*\s+)?(-[ce])\b\s*/g;
|
|
93
|
+
for (const m of raw.matchAll(scriptHostRe)) {
|
|
94
|
+
const bin = m[1];
|
|
95
|
+
const payloadStart = m.index + m[0].length;
|
|
96
|
+
const payload = readQuotedPayloadAt(raw, payloadStart);
|
|
97
|
+
if (!payload)
|
|
98
|
+
continue;
|
|
99
|
+
for (const p of extractScriptWriteTargets(payload)) {
|
|
100
|
+
push({ path: p, kind: 'interpreter-script', via: bin });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 6. Heredoc: `cat > file << EOF … EOF` already caught by #1, but
|
|
104
|
+
// `python3 << 'PYEOF' … PYEOF` smuggles writes inside the body.
|
|
105
|
+
const heredocRe = /<<\s*['"]?(\w+)['"]?\s*\n([\s\S]*?)\n\1\b/g;
|
|
106
|
+
for (const m of raw.matchAll(heredocRe)) {
|
|
107
|
+
for (const p of extractScriptWriteTargets(m[2])) {
|
|
108
|
+
push({ path: p, kind: 'interpreter-script', via: 'heredoc' });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
function stripQuotes(s) {
|
|
114
|
+
const t = s.trim();
|
|
115
|
+
if (t.length < 2)
|
|
116
|
+
return t;
|
|
117
|
+
const f = t[0];
|
|
118
|
+
const l = t[t.length - 1];
|
|
119
|
+
if ((f === '"' || f === "'") && f === l)
|
|
120
|
+
return t.slice(1, -1);
|
|
121
|
+
return t;
|
|
122
|
+
}
|
|
123
|
+
function splitArgs(s) {
|
|
124
|
+
// Very small splitter: respects single/double quotes; we do not
|
|
125
|
+
// try to be a full shell lexer — the regexes above already
|
|
126
|
+
// sectioned the command on `;`, `&`, `|`, parens.
|
|
127
|
+
const out = [];
|
|
128
|
+
let buf = '';
|
|
129
|
+
let q = null;
|
|
130
|
+
for (const ch of s) {
|
|
131
|
+
if (q) {
|
|
132
|
+
buf += ch;
|
|
133
|
+
if (ch === q)
|
|
134
|
+
q = null;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (ch === '"' || ch === "'") {
|
|
138
|
+
q = ch;
|
|
139
|
+
buf += ch;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (/\s/.test(ch)) {
|
|
143
|
+
if (buf) {
|
|
144
|
+
out.push(buf);
|
|
145
|
+
buf = '';
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
buf += ch;
|
|
150
|
+
}
|
|
151
|
+
if (buf)
|
|
152
|
+
out.push(buf);
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function extractQuotedPayload(s) {
|
|
156
|
+
// Capture the first single- or double-quoted block. Falls back to
|
|
157
|
+
// nothing if the command spans across our coarse splitter and the
|
|
158
|
+
// payload is malformed — that's fine; the heredoc branch handles
|
|
159
|
+
// the remaining cases.
|
|
160
|
+
const dq = s.match(/"([\s\S]*?)"/);
|
|
161
|
+
if (dq)
|
|
162
|
+
return dq[1];
|
|
163
|
+
const sq = s.match(/'([\s\S]*?)'/);
|
|
164
|
+
if (sq)
|
|
165
|
+
return sq[1];
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Read a single-, double-, or backtick-quoted string starting at
|
|
170
|
+
* `start` (or skip leading whitespace first). Backslash escapes
|
|
171
|
+
* are honoured so that `\"` inside a `"…"` block doesn't terminate
|
|
172
|
+
* the payload. Returns the inner contents on success, `null` if no
|
|
173
|
+
* quoted payload was found.
|
|
174
|
+
*/
|
|
175
|
+
function readQuotedPayloadAt(raw, start) {
|
|
176
|
+
let i = start;
|
|
177
|
+
while (i < raw.length && /\s/.test(raw[i]))
|
|
178
|
+
i++;
|
|
179
|
+
if (i >= raw.length)
|
|
180
|
+
return null;
|
|
181
|
+
const q = raw[i];
|
|
182
|
+
if (q !== '"' && q !== "'" && q !== '`')
|
|
183
|
+
return null;
|
|
184
|
+
i++;
|
|
185
|
+
let out = '';
|
|
186
|
+
while (i < raw.length) {
|
|
187
|
+
const ch = raw[i];
|
|
188
|
+
if (ch === '\\' && i + 1 < raw.length) {
|
|
189
|
+
out += raw[i + 1];
|
|
190
|
+
i += 2;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (ch === q)
|
|
194
|
+
return out;
|
|
195
|
+
out += ch;
|
|
196
|
+
i++;
|
|
197
|
+
}
|
|
198
|
+
return out; // unterminated — be lenient
|
|
199
|
+
}
|
|
200
|
+
function extractScriptWriteTargets(script) {
|
|
201
|
+
const targets = new Set();
|
|
202
|
+
// Python: open('X','w'), open("X", "w"), Path('X').write_text(...)
|
|
203
|
+
const pyOpen = /open\s*\(\s*['"]([^'"]+)['"]\s*,\s*['"][wax][+bt]*['"]/g;
|
|
204
|
+
for (const m of script.matchAll(pyOpen))
|
|
205
|
+
targets.add(m[1]);
|
|
206
|
+
const pyPath = /Path\s*\(\s*['"]([^'"]+)['"]\s*\)\s*\.\s*write_(text|bytes)\b/g;
|
|
207
|
+
for (const m of script.matchAll(pyPath))
|
|
208
|
+
targets.add(m[1]);
|
|
209
|
+
// Node: fs.writeFile(Sync), fs.appendFile(Sync), writeFile(Sync),
|
|
210
|
+
// fs.createWriteStream, fs.promises.writeFile
|
|
211
|
+
const nodeWrite = /(?:fs(?:\.promises)?\.)?(?:writeFile(?:Sync)?|appendFile(?:Sync)?|createWriteStream)\s*\(\s*['"]([^'"]+)['"]/g;
|
|
212
|
+
for (const m of script.matchAll(nodeWrite))
|
|
213
|
+
targets.add(m[1]);
|
|
214
|
+
// Perl: open(FH, '>', 'X') or open(FH, '>X')
|
|
215
|
+
const perl1 = /open\s*\(\s*\w+\s*,\s*['"]>\s*([^'"]+)['"]/g;
|
|
216
|
+
for (const m of script.matchAll(perl1))
|
|
217
|
+
targets.add(m[1]);
|
|
218
|
+
const perl2 = /open\s*\(\s*\w+\s*,\s*['"]>+['"]\s*,\s*['"]([^'"]+)['"]/g;
|
|
219
|
+
for (const m of script.matchAll(perl2))
|
|
220
|
+
targets.add(m[1]);
|
|
221
|
+
// Ruby: File.open('X','w'), File.write('X', ...)
|
|
222
|
+
const ruby = /File\s*\.\s*(?:open\s*\(\s*['"]([^'"]+)['"]\s*,\s*['"][wax][+bt]*['"]|write\s*\(\s*['"]([^'"]+)['"])/g;
|
|
223
|
+
for (const m of script.matchAll(ruby))
|
|
224
|
+
targets.add(m[1] ?? m[2]);
|
|
225
|
+
// Embedded shell redirects inside the script body.
|
|
226
|
+
for (const m of script.matchAll(/(?:^|[\s;&|()])(?:&|\d)?>{1,2}\s*([^\s;&|()<>]+)/g)) {
|
|
227
|
+
const t = stripQuotes(m[1]);
|
|
228
|
+
if (!/^&\d+$/.test(t) && !t.startsWith('/dev/'))
|
|
229
|
+
targets.add(t);
|
|
230
|
+
}
|
|
231
|
+
return [...targets];
|
|
232
|
+
}
|
|
6
233
|
/**
|
|
7
234
|
* Parses a shell command string into individual binary and arguments sets.
|
|
8
235
|
*
|
|
@@ -23,6 +250,72 @@ const DANGEROUS_MODIFIERS = new Set([
|
|
|
23
250
|
const DANGEROUS_READERS = new Set([
|
|
24
251
|
'cat', 'less', 'more', 'grep', 'head', 'tail'
|
|
25
252
|
]);
|
|
253
|
+
const KNOWN_SCAFFOLDERS = [
|
|
254
|
+
{
|
|
255
|
+
bin: 'npx',
|
|
256
|
+
isScaffolder: (args) => args.length > 0 && args[0].startsWith('create-'),
|
|
257
|
+
extractTargetPath: (args) => {
|
|
258
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
259
|
+
return posArgs.length > 1 ? posArgs[1] : null;
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
bin: 'npm',
|
|
264
|
+
isScaffolder: (args) => args.length > 0 && (args[0] === 'create' || args[0] === 'init'),
|
|
265
|
+
extractTargetPath: (args) => {
|
|
266
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
267
|
+
return posArgs.length > 2 ? posArgs[2] : null;
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
bin: 'yarn',
|
|
272
|
+
isScaffolder: (args) => args.length > 0 && args[0] === 'create',
|
|
273
|
+
extractTargetPath: (args) => {
|
|
274
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
275
|
+
return posArgs.length > 2 ? posArgs[2] : null;
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
bin: 'pnpm',
|
|
280
|
+
isScaffolder: (args) => args.length > 0 && args[0] === 'create',
|
|
281
|
+
extractTargetPath: (args) => {
|
|
282
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
283
|
+
return posArgs.length > 2 ? posArgs[2] : null;
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
bin: 'git',
|
|
288
|
+
isScaffolder: (args) => args.length > 0 && args[0] === 'clone',
|
|
289
|
+
extractTargetPath: (args) => {
|
|
290
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
291
|
+
if (posArgs.length > 2)
|
|
292
|
+
return posArgs[2];
|
|
293
|
+
if (posArgs.length === 2) {
|
|
294
|
+
const url = posArgs[1];
|
|
295
|
+
let base = url.split('/').pop() || '';
|
|
296
|
+
if (base.endsWith('.git'))
|
|
297
|
+
base = base.slice(0, -4);
|
|
298
|
+
return base || null;
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
bin: 'degit',
|
|
305
|
+
isScaffolder: () => true,
|
|
306
|
+
extractTargetPath: (args) => {
|
|
307
|
+
const posArgs = args.filter(a => !a.startsWith('-'));
|
|
308
|
+
if (posArgs.length > 1)
|
|
309
|
+
return posArgs[1];
|
|
310
|
+
if (posArgs.length === 1) {
|
|
311
|
+
const repo = posArgs[0];
|
|
312
|
+
const parts = repo.split('/');
|
|
313
|
+
return parts.length > 0 ? parts[parts.length - 1] : null;
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
];
|
|
26
319
|
/**
|
|
27
320
|
* System binaries that the agent is permitted to invoke even when
|
|
28
321
|
* referenced via an absolute or workspace-relative path that resolves
|
|
@@ -48,6 +341,75 @@ function unquote(str) {
|
|
|
48
341
|
}
|
|
49
342
|
return str;
|
|
50
343
|
}
|
|
344
|
+
function expandHome(p) {
|
|
345
|
+
if (p === '~')
|
|
346
|
+
return os.homedir();
|
|
347
|
+
if (p.startsWith('~/') || p.startsWith('~\\')) {
|
|
348
|
+
return path.join(os.homedir(), p.slice(2));
|
|
349
|
+
}
|
|
350
|
+
return p;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Phase 1a — value-arg-aware positional extraction.
|
|
354
|
+
*
|
|
355
|
+
* Given the raw arg list of a command, return the positional args
|
|
356
|
+
* (i.e. NOT flags AND NOT the value of a known value-taking flag).
|
|
357
|
+
*
|
|
358
|
+
* Without this, `find . -type f` would expose `f` as a positional —
|
|
359
|
+
* the directory-creation heuristic then mistakes it for a new
|
|
360
|
+
* directory name. The list covers the value-taking flags of the
|
|
361
|
+
* common POSIX inspection tools (`find`, `grep`, `awk`, etc.) that
|
|
362
|
+
* are most often confused.
|
|
363
|
+
*/
|
|
364
|
+
const VALUE_TAKING_FLAGS = new Set([
|
|
365
|
+
// `find` predicates that consume the next arg
|
|
366
|
+
'-type', '-name', '-iname', '-path', '-ipath', '-regex', '-iregex',
|
|
367
|
+
'-perm', '-newer', '-mtime', '-atime', '-ctime', '-mmin', '-amin', '-cmin',
|
|
368
|
+
'-size', '-user', '-group', '-uid', '-gid',
|
|
369
|
+
'-maxdepth', '-mindepth', '-depth',
|
|
370
|
+
'-exec', '-execdir', '-ok', '-okdir',
|
|
371
|
+
'-printf', '-fprintf', '-fprint',
|
|
372
|
+
// grep / ripgrep style
|
|
373
|
+
'-e', '-f', '--include', '--exclude', '--include-dir', '--exclude-dir',
|
|
374
|
+
'--max-count', '--max-depth', '--context', '--before-context', '--after-context',
|
|
375
|
+
// common short flags that take a value
|
|
376
|
+
'-A', '-B', '-C', '-o', '-n',
|
|
377
|
+
// sed/awk
|
|
378
|
+
'-F',
|
|
379
|
+
]);
|
|
380
|
+
function stripFlagValues(args) {
|
|
381
|
+
const out = [];
|
|
382
|
+
for (let i = 0; i < args.length; i++) {
|
|
383
|
+
const a = args[i];
|
|
384
|
+
if (a.startsWith('-')) {
|
|
385
|
+
// If this is a known value-taking flag AND there's a next arg
|
|
386
|
+
// that isn't itself a flag, skip the next arg too.
|
|
387
|
+
if (VALUE_TAKING_FLAGS.has(a) && i + 1 < args.length && !args[i + 1].startsWith('-')) {
|
|
388
|
+
i++; // consume the value
|
|
389
|
+
}
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
out.push(a);
|
|
393
|
+
}
|
|
394
|
+
return out;
|
|
395
|
+
}
|
|
396
|
+
function describeKind(t) {
|
|
397
|
+
switch (t.kind) {
|
|
398
|
+
case 'redirect': return 'shell redirect (>, >>)';
|
|
399
|
+
case 'sed-in-place': return `${t.via ?? 'sed'} -i in-place edit`;
|
|
400
|
+
case 'tee': return 'tee';
|
|
401
|
+
case 'mv-cp-dest': return `${t.via ?? 'mv/cp'} destination`;
|
|
402
|
+
case 'interpreter-script':
|
|
403
|
+
return `${t.via ?? 'interpreter'} -c/-e script payload`;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
function isSensitiveFilename(filename, fullPath) {
|
|
407
|
+
return (filename === '.env' ||
|
|
408
|
+
filename.includes('.env.') ||
|
|
409
|
+
filename === 'id_rsa' ||
|
|
410
|
+
filename === 'credentials' ||
|
|
411
|
+
(filename === 'config' && fullPath.includes('.aws')));
|
|
412
|
+
}
|
|
51
413
|
/**
|
|
52
414
|
* Checks whether a shell command is safe to execute based on active path safety rules.
|
|
53
415
|
* Flags modifications outside the workspace root and checks for sensitive file access.
|
|
@@ -55,6 +417,50 @@ function unquote(str) {
|
|
|
55
417
|
export async function isCommandSafe(command, workspaceRoot) {
|
|
56
418
|
const parsed = await parseShellCommand(command);
|
|
57
419
|
const guard = new WorkspaceGuard(workspaceRoot);
|
|
420
|
+
// ── Step 0: shell-side write-target scan ─────────────────────────
|
|
421
|
+
// Catch cat > / sed -i / tee / mv / cp / python -c / heredoc smuggling
|
|
422
|
+
// *before* the per-command AST loop, because tree-sitter strips
|
|
423
|
+
// redirects from the per-command arg list. These are the patterns
|
|
424
|
+
// the agent has historically used to bypass PlatformPathLockedError.
|
|
425
|
+
for (const target of extractWriteTargets(command)) {
|
|
426
|
+
const cleaned = expandHome(stripQuotes(target.path));
|
|
427
|
+
const resolved = path.resolve(workspaceRoot, cleaned);
|
|
428
|
+
// a. Outside workspace? Hard reject.
|
|
429
|
+
if (!guard.isInside(resolved)) {
|
|
430
|
+
return {
|
|
431
|
+
safe: false,
|
|
432
|
+
reason: `Shell write blocked: ${describeKind(target)} targets a path outside the workspace (${target.path})`,
|
|
433
|
+
affectedPath: resolved,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
// b. Inside the platform's own runtime? Hard reject with the
|
|
437
|
+
// same message the surgical/write tools surface, so the agent
|
|
438
|
+
// sees an identical signal regardless of which tool it tried.
|
|
439
|
+
try {
|
|
440
|
+
guard.assertNotPlatformPath(resolved);
|
|
441
|
+
}
|
|
442
|
+
catch (err) {
|
|
443
|
+
if (err instanceof PlatformPathLockedError) {
|
|
444
|
+
return {
|
|
445
|
+
safe: false,
|
|
446
|
+
reason: `Shell write blocked: ${describeKind(target)} would modify a Fixo CLI ` +
|
|
447
|
+
`core architecture file (${err.relative}). Use the write_file or ` +
|
|
448
|
+
`surgical_edit tool instead — shell file-writing is sandboxed.`,
|
|
449
|
+
affectedPath: err.resolved,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
throw err;
|
|
453
|
+
}
|
|
454
|
+
// c. Sensitive credential file? Same rules as DANGEROUS_MODIFIERS.
|
|
455
|
+
const filename = path.basename(resolved).toLowerCase();
|
|
456
|
+
if (isSensitiveFilename(filename, resolved)) {
|
|
457
|
+
return {
|
|
458
|
+
safe: false,
|
|
459
|
+
reason: `Shell write blocked: ${describeKind(target)} targets a sensitive credentials file (${filename})`,
|
|
460
|
+
affectedPath: resolved,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
}
|
|
58
464
|
for (const cmd of parsed) {
|
|
59
465
|
const binaryLower = cmd.binary.toLowerCase();
|
|
60
466
|
// Compare per-arg safety checks against the basename so a binary
|
|
@@ -76,6 +482,72 @@ export async function isCommandSafe(command, workspaceRoot) {
|
|
|
76
482
|
};
|
|
77
483
|
}
|
|
78
484
|
}
|
|
485
|
+
// Identify scaffolders and extract target path
|
|
486
|
+
const scaffolder = KNOWN_SCAFFOLDERS.find(s => s.bin === binBasename);
|
|
487
|
+
if (scaffolder && scaffolder.isScaffolder(cmd.arguments)) {
|
|
488
|
+
const targetPath = scaffolder.extractTargetPath(cmd.arguments);
|
|
489
|
+
if (targetPath) {
|
|
490
|
+
const cleanArg = unquote(targetPath);
|
|
491
|
+
// Expand home paths
|
|
492
|
+
let targetFullPath = cleanArg;
|
|
493
|
+
if (cleanArg === '~') {
|
|
494
|
+
targetFullPath = os.homedir();
|
|
495
|
+
}
|
|
496
|
+
else if (cleanArg.startsWith('~/') || cleanArg.startsWith('~\\')) {
|
|
497
|
+
targetFullPath = path.join(os.homedir(), cleanArg.slice(2));
|
|
498
|
+
}
|
|
499
|
+
const resolved = path.resolve(workspaceRoot, targetFullPath);
|
|
500
|
+
if (!guard.isInside(resolved)) {
|
|
501
|
+
return {
|
|
502
|
+
safe: false,
|
|
503
|
+
reason: `Scaffolding command '${cmd.binary}' attempts to create a project outside the workspace root (${targetPath})`,
|
|
504
|
+
affectedPath: resolved
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
// Unknown command that might be directory-creating.
|
|
511
|
+
//
|
|
512
|
+
// Phase 1a — the original heuristic flagged every bare positional
|
|
513
|
+
// arg matching /^[a-zA-Z0-9_-]+$/ as "looks like a new directory".
|
|
514
|
+
// Two bugs:
|
|
515
|
+
// 1. Standard POSIX inspection tools (`find`, `awk`, `sed`, etc.)
|
|
516
|
+
// were not in the non-scaffolder allowlist, so they fell into
|
|
517
|
+
// this branch.
|
|
518
|
+
// 2. Value-args of known flags (`-type f`, `-name foo`) were
|
|
519
|
+
// treated as positional. `find . -type f` flagged `f` as a
|
|
520
|
+
// new directory name. Comically wrong; observed in the
|
|
521
|
+
// June 22, 2026 log session.
|
|
522
|
+
//
|
|
523
|
+
// Fix: extend the allowlist for tools known never to create
|
|
524
|
+
// directories from a bare arg, AND strip value-args of known
|
|
525
|
+
// value-taking flags before computing positionals.
|
|
526
|
+
const COMMON_NON_SCAFFOLDERS = new Set([
|
|
527
|
+
'echo', 'git', 'node', 'npm', 'npx', 'yarn', 'pnpm', 'bash', 'sh',
|
|
528
|
+
'cat', 'grep', 'mkdir', 'rm', 'ls', 'cd', 'pwd', 'mv', 'cp', 'touch',
|
|
529
|
+
'python', 'python3', 'go', 'cargo', 'docker', 'docker-compose',
|
|
530
|
+
// Phase 1a additions — standard POSIX inspection/transform tools
|
|
531
|
+
// that take bare args as filters or input files, never as new
|
|
532
|
+
// directory targets.
|
|
533
|
+
'find', 'awk', 'sed', 'xargs', 'jq', 'tar', 'head', 'tail', 'sort',
|
|
534
|
+
'uniq', 'wc', 'tr', 'cut', 'tee', 'less', 'more', 'file', 'stat',
|
|
535
|
+
'basename', 'dirname', 'readlink', 'which', 'whereis',
|
|
536
|
+
]);
|
|
537
|
+
if (!COMMON_NON_SCAFFOLDERS.has(binBasename) && !DANGEROUS_MODIFIERS.has(binBasename) && !DANGEROUS_READERS.has(binBasename) && cmd.arguments.length > 0) {
|
|
538
|
+
const positionalArgs = stripFlagValues(cmd.arguments);
|
|
539
|
+
if (positionalArgs.length > 0) {
|
|
540
|
+
const lastArg = unquote(positionalArgs[positionalArgs.length - 1]);
|
|
541
|
+
if (lastArg.match(/^[a-zA-Z0-9_-]+$/) && !lastArg.startsWith('./') && !lastArg.startsWith('/') && !lastArg.startsWith('~')) {
|
|
542
|
+
return {
|
|
543
|
+
safe: false,
|
|
544
|
+
reason: `Command '${cmd.binary}' looks like it might create a new directory ('${lastArg}'). Please confirm execution.`,
|
|
545
|
+
affectedPath: path.resolve(workspaceRoot, lastArg)
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
79
551
|
for (const arg of cmd.arguments) {
|
|
80
552
|
if (arg.startsWith('-'))
|
|
81
553
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../../src/agent/command-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command-parser.js","sourceRoot":"","sources":["../../src/agent/command-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LspManager } from '../lsp/lsp-manager.js';
|
|
2
|
+
/** A file the run intends to mutate; symbols may be left implicit. */
|
|
3
|
+
export interface ReferenceTarget {
|
|
4
|
+
/** Absolute path to the file to inspect. */
|
|
5
|
+
file: string;
|
|
6
|
+
/**
|
|
7
|
+
* Optional explicit list of symbol names to look up. When omitted,
|
|
8
|
+
* the helper extracts top-level exported symbols from the file
|
|
9
|
+
* (capped at {@link MAX_SYMBOLS_PER_FILE}) and uses those.
|
|
10
|
+
*/
|
|
11
|
+
symbols?: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Build a markdown block describing cross-file references for the
|
|
15
|
+
* given targets. Returns an empty string when no targets, no LSP
|
|
16
|
+
* support, or no references were found — making this safe to splice
|
|
17
|
+
* unconditionally into a system prompt.
|
|
18
|
+
*
|
|
19
|
+
* `getLspManager` is taken as a callable rather than imported
|
|
20
|
+
* directly so this module stays out of the tool-executor's import
|
|
21
|
+
* cycle and is testable with a stub.
|
|
22
|
+
*/
|
|
23
|
+
export declare function gatherReferencesForTargets(cwd: string, targets: ReferenceTarget[], getLspManager: () => LspManager | null): Promise<string>;
|
|
24
|
+
//# sourceMappingURL=context-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/agent/context-builder.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,eAAe,EAAE,EAC1B,aAAa,EAAE,MAAM,UAAU,GAAG,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAmFjB"}
|