@prestyj/cli 5.8.0 → 5.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.
- package/README.md +1 -1
- package/assets/skills/evidence-led-ui/LICENSES.md +12 -0
- package/assets/skills/evidence-led-ui/SKILL.md +15 -7
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
- package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
- package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
- package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
- package/dist/app-sidecar-sessions.d.ts +8 -0
- package/dist/app-sidecar-sessions.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.js +31 -0
- package/dist/app-sidecar-sessions.js.map +1 -0
- package/dist/app-sidecar-sessions.test.d.ts +2 -0
- package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.test.js +83 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -0
- package/dist/app-sidecar.js +623 -120
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/general.test.js +5 -3
- package/dist/chat-agents/general.test.js.map +1 -1
- package/dist/chat-agents/memory.d.ts.map +1 -1
- package/dist/chat-agents/memory.js +14 -5
- package/dist/chat-agents/memory.js.map +1 -1
- package/dist/chat-agents/memory.test.js +11 -1
- package/dist/chat-agents/memory.test.js.map +1 -1
- package/dist/chat-agents/shared.js +1 -1
- package/dist/chat-agents/shared.js.map +1 -1
- package/dist/chat-agents/specialists.test.js +3 -2
- package/dist/chat-agents/specialists.test.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -30
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -2
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +61 -1
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-mcp-passthrough.test.d.ts +2 -0
- package/dist/core/agent-mcp-passthrough.test.d.ts.map +1 -0
- package/dist/core/agent-mcp-passthrough.test.js +61 -0
- package/dist/core/agent-mcp-passthrough.test.js.map +1 -0
- package/dist/core/agent-session-add-dir.test.d.ts +2 -0
- package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
- package/dist/core/agent-session-add-dir.test.js +110 -0
- package/dist/core/agent-session-add-dir.test.js.map +1 -0
- package/dist/core/agent-session-compaction.test.js +23 -7
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-marker-anchors.test.d.ts +2 -0
- package/dist/core/agent-session-marker-anchors.test.d.ts.map +1 -0
- package/dist/core/agent-session-marker-anchors.test.js +147 -0
- package/dist/core/agent-session-marker-anchors.test.js.map +1 -0
- package/dist/core/agent-session-memory-tail.test.js +4 -7
- package/dist/core/agent-session-memory-tail.test.js.map +1 -1
- package/dist/core/agent-session-queue.test.js +4 -7
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-session-subagent-policy.test.js +7 -3
- package/dist/core/agent-session-subagent-policy.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +46 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +177 -19
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-tools-allowlist.test.js +5 -3
- package/dist/core/agent-tools-allowlist.test.js.map +1 -1
- package/dist/core/agents.d.ts +12 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +25 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/agents.test.d.ts +2 -0
- package/dist/core/agents.test.d.ts.map +1 -0
- package/dist/core/agents.test.js +67 -0
- package/dist/core/agents.test.js.map +1 -0
- package/dist/core/auth-providers.js +1 -1
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +20 -11
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +17 -4
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +1 -1
- package/dist/core/compaction/token-estimator.test.js.map +1 -1
- package/dist/core/encode-cwd.d.ts +17 -0
- package/dist/core/encode-cwd.d.ts.map +1 -1
- package/dist/core/encode-cwd.js +20 -7
- package/dist/core/encode-cwd.js.map +1 -1
- package/dist/core/encode-cwd.test.js +20 -1
- package/dist/core/encode-cwd.test.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +6 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-controller.test.js +3 -3
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/ideal-review.d.ts.map +1 -1
- package/dist/core/ideal-review.js +6 -1
- package/dist/core/ideal-review.js.map +1 -1
- package/dist/core/ideal-review.test.js +7 -2
- package/dist/core/ideal-review.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/input-normalization.test.d.ts +2 -0
- package/dist/core/input-normalization.test.d.ts.map +1 -0
- package/dist/core/input-normalization.test.js +75 -0
- package/dist/core/input-normalization.test.js.map +1 -0
- package/dist/core/local-endpoint-store.d.ts +50 -0
- package/dist/core/local-endpoint-store.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.js +201 -0
- package/dist/core/local-endpoint-store.js.map +1 -0
- package/dist/core/local-endpoint-store.test.d.ts +2 -0
- package/dist/core/local-endpoint-store.test.d.ts.map +1 -0
- package/dist/core/local-endpoint-store.test.js +131 -0
- package/dist/core/local-endpoint-store.test.js.map +1 -0
- package/dist/core/loop-breaker.d.ts +38 -1
- package/dist/core/loop-breaker.d.ts.map +1 -1
- package/dist/core/loop-breaker.js +84 -2
- package/dist/core/loop-breaker.js.map +1 -1
- package/dist/core/loop-breaker.test.js +108 -1
- package/dist/core/loop-breaker.test.js.map +1 -1
- package/dist/core/lsp/client.d.ts +50 -0
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +158 -13
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/jsonrpc.d.ts +38 -1
- package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
- package/dist/core/lsp/jsonrpc.js +13 -1
- package/dist/core/lsp/jsonrpc.js.map +1 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +23 -2
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/manager.test.js +32 -1
- package/dist/core/lsp/manager.test.js.map +1 -1
- package/dist/core/lsp/test-support.d.ts +18 -0
- package/dist/core/lsp/test-support.d.ts.map +1 -0
- package/dist/core/lsp/test-support.js +27 -0
- package/dist/core/lsp/test-support.js.map +1 -0
- package/dist/core/lsp/uri.test.d.ts +2 -0
- package/dist/core/lsp/uri.test.d.ts.map +1 -0
- package/dist/core/lsp/uri.test.js +56 -0
- package/dist/core/lsp/uri.test.js.map +1 -0
- package/dist/core/lsp/windows.test.d.ts +2 -0
- package/dist/core/lsp/windows.test.d.ts.map +1 -0
- package/dist/core/lsp/windows.test.js +251 -0
- package/dist/core/lsp/windows.test.js.map +1 -0
- package/dist/core/mcp/resolve-stdio.d.ts +35 -0
- package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
- package/dist/core/mcp/resolve-stdio.js +80 -1
- package/dist/core/mcp/resolve-stdio.js.map +1 -1
- package/dist/core/mcp/resolve-stdio.test.js +99 -4
- package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
- package/dist/core/message-images.d.ts +12 -0
- package/dist/core/message-images.d.ts.map +1 -0
- package/dist/core/message-images.js +52 -0
- package/dist/core/message-images.js.map +1 -0
- package/dist/core/message-images.test.d.ts +2 -0
- package/dist/core/message-images.test.d.ts.map +1 -0
- package/dist/core/message-images.test.js +62 -0
- package/dist/core/message-images.test.js.map +1 -0
- package/dist/core/network-guard.d.ts +47 -0
- package/dist/core/network-guard.d.ts.map +1 -0
- package/dist/core/network-guard.js +208 -0
- package/dist/core/network-guard.js.map +1 -0
- package/dist/core/network-guard.test.d.ts +2 -0
- package/dist/core/network-guard.test.d.ts.map +1 -0
- package/dist/core/network-guard.test.js +72 -0
- package/dist/core/network-guard.test.js.map +1 -0
- package/dist/core/persistent-shell.d.ts +3 -1
- package/dist/core/persistent-shell.d.ts.map +1 -1
- package/dist/core/persistent-shell.js +13 -3
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager-dev-server-repro.test.js +34 -12
- package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
- package/dist/core/process-manager.d.ts +1 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +23 -13
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts +8 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +145 -62
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +131 -1
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +89 -156
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +4 -10
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/radio.test.js +4 -1
- package/dist/core/radio.test.js.map +1 -1
- package/dist/core/runtime-mode.d.ts +2 -0
- package/dist/core/runtime-mode.d.ts.map +1 -1
- package/dist/core/runtime-mode.js +4 -0
- package/dist/core/runtime-mode.js.map +1 -1
- package/dist/core/session-export.d.ts +98 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +356 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-export.test.d.ts +2 -0
- package/dist/core/session-export.test.d.ts.map +1 -0
- package/dist/core/session-export.test.js +353 -0
- package/dist/core/session-export.test.js.map +1 -0
- package/dist/core/session-manager.d.ts +27 -7
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +257 -124
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +57 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +592 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/session-storage.test.d.ts +2 -0
- package/dist/core/session-storage.test.d.ts.map +1 -0
- package/dist/core/session-storage.test.js +272 -0
- package/dist/core/session-storage.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +7 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +17 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/setup-history.d.ts +0 -6
- package/dist/core/setup-history.d.ts.map +1 -1
- package/dist/core/setup-history.js +2 -18
- package/dist/core/setup-history.js.map +1 -1
- package/dist/core/setup-history.test.js +11 -26
- package/dist/core/setup-history.test.js.map +1 -1
- package/dist/core/sidecar-error-reporter.d.ts +12 -0
- package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.js +57 -0
- package/dist/core/sidecar-error-reporter.js.map +1 -0
- package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
- package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.test.js +61 -0
- package/dist/core/sidecar-error-reporter.test.js.map +1 -0
- package/dist/core/skills-routing.test.js +3 -1
- package/dist/core/skills-routing.test.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +18 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +42 -10
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/slash-commands.test.d.ts +2 -0
- package/dist/core/slash-commands.test.d.ts.map +1 -0
- package/dist/core/slash-commands.test.js +59 -0
- package/dist/core/slash-commands.test.js.map +1 -0
- package/dist/core/speed-benchmark.test.js +9 -3
- package/dist/core/speed-benchmark.test.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +8 -1
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +35 -2
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +34 -0
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/subagent-store.test.js +14 -2
- package/dist/core/subagent-store.test.js.map +1 -1
- package/dist/core/verify-commands.d.ts.map +1 -1
- package/dist/core/verify-commands.js +1 -6
- package/dist/core/verify-commands.js.map +1 -1
- package/dist/core/verify-commands.test.js +1 -5
- package/dist/core/verify-commands.test.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +40 -0
- package/dist/core/workspace-guard.d.ts.map +1 -0
- package/dist/core/workspace-guard.js +115 -0
- package/dist/core/workspace-guard.js.map +1 -0
- package/dist/core/workspace-guard.test.d.ts +2 -0
- package/dist/core/workspace-guard.test.d.ts.map +1 -0
- package/dist/core/workspace-guard.test.js +107 -0
- package/dist/core/workspace-guard.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/json-mode.d.ts +7 -0
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +10 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +2 -0
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +11 -0
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -101
- package/dist/session.js.map +1 -1
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +35 -0
- package/dist/session.test.js.map +1 -0
- package/dist/system-prompt.d.ts +23 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +119 -31
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +154 -14
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/test-support/fake-home.d.ts +20 -0
- package/dist/test-support/fake-home.d.ts.map +1 -0
- package/dist/test-support/fake-home.js +37 -0
- package/dist/test-support/fake-home.js.map +1 -0
- package/dist/tools/bash.d.ts +4 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +57 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +156 -8
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/edit-robustness.test.js +3 -1
- package/dist/tools/edit-robustness.test.js.map +1 -1
- package/dist/tools/edit.d.ts +2 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +7 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +7 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/exit-plan.d.ts.map +1 -1
- package/dist/tools/exit-plan.js +15 -4
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/exit-plan.test.d.ts +2 -0
- package/dist/tools/exit-plan.test.d.ts.map +1 -0
- package/dist/tools/exit-plan.test.js +72 -0
- package/dist/tools/exit-plan.test.js.map +1 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +4 -1
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.d.ts +3 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +143 -14
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +59 -0
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/overflow.test.js +4 -7
- package/dist/tools/overflow.test.js.map +1 -1
- package/dist/tools/path-utils.d.ts +15 -0
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js +17 -0
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/path-utils.test.js +7 -2
- package/dist/tools/path-utils.test.js.map +1 -1
- package/dist/tools/prompt-hints.js +1 -1
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/search-code.d.ts.map +1 -1
- package/dist/tools/search-code.js +6 -4
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +4 -2
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/source-path.d.ts.map +1 -1
- package/dist/tools/source-path.js +9 -0
- package/dist/tools/source-path.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +1 -1
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent-shared.test.js +21 -1
- package/dist/tools/subagent-shared.test.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +8 -0
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +2 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +17 -6
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +34 -0
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +2 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +34 -7
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write.d.ts +2 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +7 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +12 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +22 -85
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +11 -12
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +10 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/Footer.d.ts +1 -1
- package/dist/ui/components/Footer.js +2 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/Footer.test.js +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +5 -2
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +49 -8
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -2
- package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js +2 -5
- package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +2 -30
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/ui/login.js +1 -1
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/terminal-history-status-renderers.d.ts +1 -2
- package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -1
- package/dist/ui/terminal-history-status-renderers.js +2 -15
- package/dist/ui/terminal-history-status-renderers.js.map +1 -1
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +2 -4
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/thinking-level-cycle.test.js +8 -8
- package/dist/ui/thinking-level-cycle.test.js.map +1 -1
- package/dist/ui/transcript/MiscRows.d.ts +1 -4
- package/dist/ui/transcript/MiscRows.d.ts.map +1 -1
- package/dist/ui/transcript/MiscRows.js +2 -7
- package/dist/ui/transcript/MiscRows.js.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js +1 -3
- package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
- package/dist/ui/transcript/presentation.d.ts +1 -9
- package/dist/ui/transcript/presentation.d.ts.map +1 -1
- package/dist/ui/transcript/presentation.js +0 -9
- package/dist/ui/transcript/presentation.js.map +1 -1
- package/dist/ui/transcript/spacing.d.ts +2 -2
- package/dist/ui/transcript/spacing.d.ts.map +1 -1
- package/dist/ui/transcript/spacing.js +0 -1
- package/dist/ui/transcript/spacing.js.map +1 -1
- package/dist/ui/transcript/spacing.test.js +1 -3
- package/dist/ui/transcript/spacing.test.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +2 -9
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/utils/github.d.ts +20 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +65 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/github.test.d.ts +2 -0
- package/dist/utils/github.test.d.ts.map +1 -0
- package/dist/utils/github.test.js +23 -0
- package/dist/utils/github.test.js.map +1 -0
- package/dist/utils/http-body.d.ts +19 -0
- package/dist/utils/http-body.d.ts.map +1 -0
- package/dist/utils/http-body.js +58 -0
- package/dist/utils/http-body.js.map +1 -0
- package/dist/utils/http-body.test.d.ts +2 -0
- package/dist/utils/http-body.test.d.ts.map +1 -0
- package/dist/utils/http-body.test.js +68 -0
- package/dist/utils/http-body.test.js.map +1 -0
- package/dist/utils/process.d.ts +26 -3
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +68 -10
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/process.test.d.ts +2 -0
- package/dist/utils/process.test.d.ts.map +1 -0
- package/dist/utils/process.test.js +42 -0
- package/dist/utils/process.test.js.map +1 -0
- package/dist/utils/text.d.ts +9 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +11 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +4 -4
package/dist/system-prompt.d.ts
CHANGED
|
@@ -2,7 +2,26 @@ import { type Skill } from "./core/skills.js";
|
|
|
2
2
|
import type { LanguageId } from "./core/language-detector.js";
|
|
3
3
|
import type { Provider } from "@prestyj/ai";
|
|
4
4
|
import type { GoalMode } from "./core/runtime-mode.js";
|
|
5
|
+
/** Combined byte budget for all project instruction files (Codex default). */
|
|
6
|
+
export declare const PROJECT_CONTEXT_MAX_BYTES: number;
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic hierarchical instruction resolver.
|
|
9
|
+
*
|
|
10
|
+
* Walks from cwd up to the filesystem root picking at most ONE instruction
|
|
11
|
+
* file per directory (CONTEXT_FILES priority order, first match wins), skips
|
|
12
|
+
* empty files, strips BOMs, and renders root-first (broad → narrow) so the
|
|
13
|
+
* nearest file lands last — where LLM recency bias weights it most. A 32 KiB
|
|
14
|
+
* combined budget is filled nearest-first (the nearest instructions are the
|
|
15
|
+
* most binding); files dropped by the cap are reported in a one-line note.
|
|
16
|
+
*/
|
|
5
17
|
export declare function collectProjectContext(cwd: string): Promise<string[]>;
|
|
18
|
+
/** Extra Environment-section facts that vary per session rather than per host. */
|
|
19
|
+
export interface SystemPromptEnvironment {
|
|
20
|
+
/** Extra workspace roots added with `/add-dir`. */
|
|
21
|
+
additionalRoots?: readonly string[];
|
|
22
|
+
/** Hosts the network allowlist permits, when `networkMode` is `allowlist`. */
|
|
23
|
+
networkAllow?: readonly string[];
|
|
24
|
+
}
|
|
6
25
|
/**
|
|
7
26
|
* Build the system prompt dynamically based on cwd and context.
|
|
8
27
|
*
|
|
@@ -11,6 +30,9 @@ export declare function collectProjectContext(cwd: string): Promise<string[]>;
|
|
|
11
30
|
* exactly what the model can call. Defaults to the full built-in set.
|
|
12
31
|
* @param provider — the active LLM provider. Drives the product identity
|
|
13
32
|
* (`anthropic` → "Claude Code", everything else → "EZ Coder").
|
|
33
|
+
* @param environmentArg — extra Environment-section facts (additional workspace
|
|
34
|
+
* roots, network allowlist). This sits in the cached prefix, so changing it
|
|
35
|
+
* costs exactly one cache-miss turn.
|
|
14
36
|
*/
|
|
15
|
-
export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[], activeLanguages?: Set<LanguageId>, provider?: Provider,
|
|
37
|
+
export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[], activeLanguages?: Set<LanguageId>, provider?: Provider, goalModeOrEnvironment?: GoalMode | SystemPromptEnvironment, environmentArg?: SystemPromptEnvironment): Promise<string>;
|
|
16
38
|
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAYvD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAqMnD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwD1E;AAWD,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AA+BD;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,EACjC,QAAQ,CAAC,EAAE,QAAQ,EACnB,qBAAqB,GAAE,QAAQ,GAAG,uBAA+B,EACjE,cAAc,CAAC,EAAE,uBAAuB,GACvC,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
package/dist/system-prompt.js
CHANGED
|
@@ -2,10 +2,22 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { formatSkillsForPrompt } from "./core/skills.js";
|
|
4
4
|
import { TOOL_PROMPT_HINTS, buildToolSteering, DEFAULT_TOOL_NAMES } from "./tools/prompt-hints.js";
|
|
5
|
+
import { stripBom } from "./utils/text.js";
|
|
6
|
+
import { resolveShell } from "./core/shell.js";
|
|
5
7
|
import { renderStylePacksSection } from "./core/style-packs/index.js";
|
|
6
8
|
import { detectVerifyCommands, renderVerifySection } from "./core/verify-commands.js";
|
|
7
9
|
import { extractPlanSteps } from "./utils/plan-steps.js";
|
|
8
|
-
|
|
10
|
+
// One instruction file per directory, first match wins (Codex-style selection).
|
|
11
|
+
// AGENTS.override.md lets a user shadow a checked-in AGENTS.md locally.
|
|
12
|
+
const CONTEXT_FILES = [
|
|
13
|
+
"AGENTS.override.md",
|
|
14
|
+
"AGENTS.md",
|
|
15
|
+
"CLAUDE.md",
|
|
16
|
+
".cursorrules",
|
|
17
|
+
"CONVENTIONS.md",
|
|
18
|
+
];
|
|
19
|
+
/** Combined byte budget for all project instruction files (Codex default). */
|
|
20
|
+
export const PROJECT_CONTEXT_MAX_BYTES = 32 * 1024;
|
|
9
21
|
const UNCACHED_MARKER = "<!-- uncached -->";
|
|
10
22
|
/**
|
|
11
23
|
* The agent's product identity. Anthropic models run as "Claude Code" (matching
|
|
@@ -36,25 +48,24 @@ function renderIdentitySection(provider, goalMode) {
|
|
|
36
48
|
}
|
|
37
49
|
function renderTalkSection() {
|
|
38
50
|
return (`## How to Talk\n\n` +
|
|
39
|
-
`
|
|
40
|
-
`**First
|
|
41
|
-
`**
|
|
42
|
-
`**
|
|
43
|
-
`**
|
|
44
|
-
`**
|
|
45
|
-
`**No unresolved "it depends."** Always resolve: "Default to X; switch to Y if [condition]." Say what TO do, never what NOT to do. End with one next action or nothing.\n\n` +
|
|
51
|
+
`Write for severe ADHD: fast scanning, low working memory, easy action.\n\n` +
|
|
52
|
+
`**First line = actionable state.** Done: lead with the outcome. Blocked or handing off: lead with the ONE next action. Final replies: 1–2 sentences, hard cap 5.\n\n` +
|
|
53
|
+
`**Default to action.** Do all safe, reversible steps implied by the goal—never ask permission, merely suggest them, or leave them for the user. If blocked, ask for the ONE action that unblocks you.\n\n` +
|
|
54
|
+
`**Keep progress visible.** State what works now and the blocker or next step; never bury completed work.\n\n` +
|
|
55
|
+
`**Easy to scan.** One idea per line; **bold** key words. Number steps; cap lists at 5. Recommend ONE approach, not a menu — unless a command's flow defines its own options.\n\n` +
|
|
56
|
+
`**Be concrete and decisive.** Give measured outcomes. Default to X; switch to Y only when [condition]. Say what TO do.\n\n` +
|
|
46
57
|
`Stay silent between tool calls unless you hit a decision, tradeoff, finding, or question. No preamble, no recap, no hedging, no output dumps. ` +
|
|
47
|
-
`Surface tradeoffs and unverified claims plainly.
|
|
58
|
+
`Surface tradeoffs and unverified claims plainly. Rarely and at random (roughly 1 in 6 replies), drop ONE short, absurd, cringey interjection with an emoji — a fart confession (“Woops I just farted!”), a sudden weird craving, misplaced pride in a semicolon, an unprompted pigeon fact… invent fresh ones; never repeat, never force, never explain.`);
|
|
48
59
|
}
|
|
49
60
|
function renderWorkSection() {
|
|
50
61
|
return (`## How to Work\n\n` +
|
|
51
62
|
`- Read before \`edit\`/\`write\`; re-read after formatters, \`lint --fix\`, codemods, codegen, checkout, or any disk mutator.\n` +
|
|
52
63
|
`- Compute in bash; write with \`edit\`/\`write\` so read-tracking, partial apply, and diagnostics stay intact.\n` +
|
|
53
|
-
`- Match neighbors (components/tokens/tone). When none exist, infer from the task and project; ask only when a missing product or taste decision would materially change the result. Keep edits small; plan multi-file work
|
|
54
|
-
`-
|
|
64
|
+
`- Match neighbors (components/tokens/tone). When none exist, infer from the task and project; ask only when a missing product or taste decision would materially change the result. Keep edits small; plan only complex/risky multi-file work—edit routine changes directly.\n` +
|
|
65
|
+
`- Stop only for user decisions, secrets/access, cost, destructive risk, data loss, or unrelated disruption; otherwise continue through completion.\n` +
|
|
55
66
|
`- Preserve user work: investigate unexpected files, branches, or locks before touching them. \`.gitignore\` generated artifacts, secrets, logs, scratch, and \`.env\`.\n` +
|
|
56
67
|
`- Rule precedence: project context files → file/module patterns → applicable skill instructions → Language Style Packs → this prompt.\n` +
|
|
57
|
-
`-
|
|
68
|
+
`- Skip checks after simple edits. At coherent checkpoints or after risky/non-obvious changes, run one targeted check; fix failures. Never claim unrun checks passed.`);
|
|
58
69
|
}
|
|
59
70
|
function renderPlanModeSection() {
|
|
60
71
|
return (`## Plan Mode (ACTIVE)\n\n` +
|
|
@@ -109,20 +120,30 @@ async function renderApprovedPlanSection(approvedPlanPath, goalMode) {
|
|
|
109
120
|
`- Follow step order. Don't deviate without user confirmation.` +
|
|
110
121
|
stepInstruction);
|
|
111
122
|
}
|
|
112
|
-
function renderResearchSection(toolNames) {
|
|
123
|
+
function renderResearchSection(toolNames, provider) {
|
|
113
124
|
const active = new Set(toolNames ?? DEFAULT_TOOL_NAMES);
|
|
114
|
-
//
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
125
|
+
// Kencode usage details (literal/RE2, broad→narrow, path semantics) live in
|
|
126
|
+
// the Tools section hints — one home, no duplication. Research only says WHEN
|
|
127
|
+
// to reach for public code. With deferred MCP loading the kencode tools sit
|
|
128
|
+
// in the tool_search catalog until promoted, so point at discovery instead of
|
|
129
|
+
// naming tools the model can't call yet. Never reference an unavailable tool.
|
|
118
130
|
const publicCode = active.has("mcp__kencode-search__searchCode")
|
|
119
|
-
? `For public code, use
|
|
131
|
+
? ` For real public GitHub code, use the kencode-search tools (usage in Tools below).`
|
|
120
132
|
: active.has("tool_search")
|
|
121
|
-
? `For public GitHub code and design references, call \`tool_search\` first (e.g. "search public code" or "UI design screens") — it unlocks the matching tools for your next step
|
|
133
|
+
? ` For public GitHub code and design references, call \`tool_search\` first (e.g. "search public code" or "UI design screens") — it unlocks the matching tools for your next step.`
|
|
122
134
|
: "";
|
|
135
|
+
// Only reference `web_search` when it's actually in the active tool set, and
|
|
136
|
+
// only claim native server-side search on providers that really have it
|
|
137
|
+
// (Anthropic). Naming an unavailable tool or capability trains the model to
|
|
138
|
+
// rely on something that doesn't exist.
|
|
139
|
+
const docs = active.has("web_search")
|
|
140
|
+
? `use \`web_search\` then \`web_fetch\` for authoritative docs`
|
|
141
|
+
: provider === "anthropic"
|
|
142
|
+
? `use \`web_fetch\` for authoritative docs (native web search is available)`
|
|
143
|
+
: `use \`web_fetch\` for authoritative docs`;
|
|
123
144
|
return (`## Research & Verification\n\n` +
|
|
124
145
|
`Your training data has a cutoff; the real current date is the final line of this prompt. Assume your knowledge of library versions, APIs, CLI flags, config schema, defaults, and best practices has changed since then — treat it as a stale hint to verify, never as ground truth. ` +
|
|
125
|
-
`Do not rely on memory for APIs, CLI flags, config schema, internals, or error wording — verify first. Use \`source_path\` for installed deps and inspect with read/grep/find/ls;
|
|
146
|
+
`Do not rely on memory for APIs, CLI flags, config schema, internals, or error wording — verify first. Use \`source_path\` for installed deps and inspect with read/grep/find/ls; ${docs}. ` +
|
|
126
147
|
publicCode +
|
|
127
148
|
`When driving a programmatic Goal run, model the intended experience, choose proportional local/free proof, and block only with exact user instructions for true external prerequisites. ` +
|
|
128
149
|
`Run targeted checks when they are relevant to the change; read/fix failures; never report unrun or failing checks as passing.`);
|
|
@@ -153,37 +174,99 @@ function renderToolsSection(toolNames) {
|
|
|
153
174
|
parts.push(toolLines.join("\n"));
|
|
154
175
|
return parts.length > 0 ? `## Tools\n\n${parts.join("\n\n")}` : null;
|
|
155
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Deterministic hierarchical instruction resolver.
|
|
179
|
+
*
|
|
180
|
+
* Walks from cwd up to the filesystem root picking at most ONE instruction
|
|
181
|
+
* file per directory (CONTEXT_FILES priority order, first match wins), skips
|
|
182
|
+
* empty files, strips BOMs, and renders root-first (broad → narrow) so the
|
|
183
|
+
* nearest file lands last — where LLM recency bias weights it most. A 32 KiB
|
|
184
|
+
* combined budget is filled nearest-first (the nearest instructions are the
|
|
185
|
+
* most binding); files dropped by the cap are reported in a one-line note.
|
|
186
|
+
*/
|
|
156
187
|
export async function collectProjectContext(cwd) {
|
|
157
|
-
|
|
188
|
+
// Nearest-first collection order (cwd → root).
|
|
189
|
+
const collected = [];
|
|
158
190
|
let dir = cwd;
|
|
159
191
|
const visited = new Set();
|
|
160
192
|
while (!visited.has(dir)) {
|
|
161
193
|
visited.add(dir);
|
|
162
194
|
for (const name of CONTEXT_FILES) {
|
|
163
195
|
const filePath = path.join(dir, name);
|
|
196
|
+
let content;
|
|
164
197
|
try {
|
|
165
|
-
|
|
166
|
-
const relPath = path.relative(cwd, filePath) || name;
|
|
167
|
-
contextParts.push(`### ${relPath}\n\n${content.trim()}`);
|
|
198
|
+
content = await fs.readFile(filePath, "utf-8");
|
|
168
199
|
}
|
|
169
200
|
catch {
|
|
170
|
-
// File doesn't exist
|
|
201
|
+
continue; // File doesn't exist — try the next candidate name.
|
|
171
202
|
}
|
|
203
|
+
const trimmed = stripBom(content).trim();
|
|
204
|
+
const relPath = path.relative(cwd, filePath) || name;
|
|
205
|
+
// Empty/whitespace-only files still claim the directory slot — an empty
|
|
206
|
+
// AGENTS.override.md deliberately silences the directory's instructions.
|
|
207
|
+
if (trimmed) {
|
|
208
|
+
collected.push({ relPath, content: trimmed, bytes: Buffer.byteLength(trimmed, "utf-8") });
|
|
209
|
+
}
|
|
210
|
+
break; // One file per directory — first match wins.
|
|
172
211
|
}
|
|
173
212
|
const parent = path.dirname(dir);
|
|
174
213
|
if (parent === dir)
|
|
175
214
|
break;
|
|
176
215
|
dir = parent;
|
|
177
216
|
}
|
|
217
|
+
// Budget nearest-first: the closest files are the most binding.
|
|
218
|
+
let budget = PROJECT_CONTEXT_MAX_BYTES;
|
|
219
|
+
const kept = new Set();
|
|
220
|
+
const skipped = [];
|
|
221
|
+
for (let i = 0; i < collected.length; i++) {
|
|
222
|
+
const file = collected[i];
|
|
223
|
+
if (file.bytes <= budget) {
|
|
224
|
+
kept.add(i);
|
|
225
|
+
budget -= file.bytes;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
skipped.push(`${file.relPath} (${Math.round(file.bytes / 1024)}KB)`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Render root-first (broad → narrow): reverse of collection order.
|
|
232
|
+
const contextParts = [];
|
|
233
|
+
for (let i = collected.length - 1; i >= 0; i--) {
|
|
234
|
+
if (!kept.has(i))
|
|
235
|
+
continue;
|
|
236
|
+
const file = collected[i];
|
|
237
|
+
contextParts.push(`### ${file.relPath}\n\n${file.content}`);
|
|
238
|
+
}
|
|
239
|
+
if (skipped.length > 0) {
|
|
240
|
+
contextParts.push(`_Skipped (context budget): ${skipped.join(", ")}_`);
|
|
241
|
+
}
|
|
178
242
|
return contextParts;
|
|
179
243
|
}
|
|
180
244
|
function renderProjectContextSection(contextParts) {
|
|
181
245
|
if (contextParts.length === 0)
|
|
182
246
|
return null;
|
|
183
|
-
return `## Project Context\n\n
|
|
247
|
+
return (`## Project Context\n\n` +
|
|
248
|
+
`Files are ordered broadest → nearest. On conflict, the nearest file wins; explicit user instructions win over all files.\n\n` +
|
|
249
|
+
contextParts.join("\n\n"));
|
|
184
250
|
}
|
|
185
|
-
function renderEnvironmentSection(cwd) {
|
|
186
|
-
|
|
251
|
+
function renderEnvironmentSection(cwd, environment) {
|
|
252
|
+
// Static per host, so it lives in the cached prompt body: which shell bash
|
|
253
|
+
// commands actually execute under (cmd.exe fallback on bash-less Windows).
|
|
254
|
+
const shellLine = resolveShell("").isCmdFallback
|
|
255
|
+
? "- Shell: cmd.exe (no bash found)"
|
|
256
|
+
: "- Shell: bash (POSIX)";
|
|
257
|
+
const lines = [`- Working directory: ${cwd}`];
|
|
258
|
+
const roots = environment?.additionalRoots ?? [];
|
|
259
|
+
if (roots.length > 0) {
|
|
260
|
+
// Added with /add-dir: tools take absolute paths into these roots and
|
|
261
|
+
// writes there are allowed.
|
|
262
|
+
lines.push(`- Additional roots: ${roots.join(", ")}`);
|
|
263
|
+
}
|
|
264
|
+
lines.push(`- Platform: ${process.platform}`, shellLine);
|
|
265
|
+
const allow = environment?.networkAllow ?? [];
|
|
266
|
+
if (allow.length > 0) {
|
|
267
|
+
lines.push(`- Network allowlist: ${allow.join(", ")} (other hosts are blocked)`);
|
|
268
|
+
}
|
|
269
|
+
return `## Environment\n\n${lines.join("\n")}`;
|
|
187
270
|
}
|
|
188
271
|
function renderUncachedDateSuffix() {
|
|
189
272
|
const today = new Date();
|
|
@@ -200,8 +283,13 @@ function renderUncachedDateSuffix() {
|
|
|
200
283
|
* exactly what the model can call. Defaults to the full built-in set.
|
|
201
284
|
* @param provider — the active LLM provider. Drives the product identity
|
|
202
285
|
* (`anthropic` → "Claude Code", everything else → "EZ Coder").
|
|
286
|
+
* @param environmentArg — extra Environment-section facts (additional workspace
|
|
287
|
+
* roots, network allowlist). This sits in the cached prefix, so changing it
|
|
288
|
+
* costs exactly one cache-miss turn.
|
|
203
289
|
*/
|
|
204
|
-
export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages, provider,
|
|
290
|
+
export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages, provider, goalModeOrEnvironment = "off", environmentArg) {
|
|
291
|
+
const goalMode = typeof goalModeOrEnvironment === "string" ? goalModeOrEnvironment : "off";
|
|
292
|
+
const environment = typeof goalModeOrEnvironment === "string" ? environmentArg : goalModeOrEnvironment;
|
|
205
293
|
const hasKencode = hasKencodeSearch(toolNames ?? DEFAULT_TOOL_NAMES);
|
|
206
294
|
const sections = [
|
|
207
295
|
renderIdentitySection(provider, goalMode),
|
|
@@ -219,7 +307,7 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
|
|
|
219
307
|
const approvedPlanSection = await renderApprovedPlanSection(approvedPlanPath, goalMode);
|
|
220
308
|
if (approvedPlanSection)
|
|
221
309
|
sections.push(approvedPlanSection);
|
|
222
|
-
sections.push(renderResearchSection(toolNames), renderCodeQualitySection());
|
|
310
|
+
sections.push(renderResearchSection(toolNames, provider), renderCodeQualitySection());
|
|
223
311
|
const toolsSection = renderToolsSection(toolNames);
|
|
224
312
|
if (toolsSection)
|
|
225
313
|
sections.push(toolsSection);
|
|
@@ -240,7 +328,7 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
|
|
|
240
328
|
if (skillsSection)
|
|
241
329
|
sections.push(skillsSection);
|
|
242
330
|
}
|
|
243
|
-
sections.push(renderEnvironmentSection(cwd), renderUncachedDateSuffix());
|
|
331
|
+
sections.push(renderEnvironmentSection(cwd, environment), renderUncachedDateSuffix());
|
|
244
332
|
return sections.join("\n\n");
|
|
245
333
|
}
|
|
246
334
|
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAc,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { buildSystemPrompt } from "./system-prompt.js";
|
|
5
|
+
import { buildSystemPrompt, collectProjectContext, PROJECT_CONTEXT_MAX_BYTES, } from "./system-prompt.js";
|
|
6
6
|
const tempDirs = [];
|
|
7
7
|
async function makeProject(files = {}) {
|
|
8
8
|
const cwd = await fs.mkdtemp(path.join(os.tmpdir(), "ezcoder-system-prompt-"));
|
|
@@ -40,6 +40,10 @@ function promptAudit(prompt) {
|
|
|
40
40
|
"generic tests, scripts, screenshots, benchmarks, or simulations; use them by default",
|
|
41
41
|
"After meaningful edits, run the relevant verification commands below",
|
|
42
42
|
"Run relevant checks after edits",
|
|
43
|
+
"Run only targeted verification needed for the change",
|
|
44
|
+
"Run targeted verification that is appropriate to the change before calling work complete",
|
|
45
|
+
"plan multi-file work first",
|
|
46
|
+
"otherwise follow through and verify",
|
|
43
47
|
];
|
|
44
48
|
for (const phrase of obsoleteOrContradictory) {
|
|
45
49
|
if (prompt.includes(phrase))
|
|
@@ -75,7 +79,10 @@ describe("buildSystemPrompt", () => {
|
|
|
75
79
|
expect(sectionIndex(prompt, "## How to Work")).toBeLessThan(sectionIndex(prompt, "## Research & Verification"));
|
|
76
80
|
expect(sectionIndex(prompt, "## Research & Verification")).toBeLessThan(sectionIndex(prompt, "## Code Quality"));
|
|
77
81
|
expect(prompt).toContain("Woops I just farted!");
|
|
78
|
-
expect(prompt).toContain("
|
|
82
|
+
expect(prompt).toContain("never repeat, never force, never explain");
|
|
83
|
+
// The one-approach rule must carve out command flows that ship their own
|
|
84
|
+
// A/B/C option list, or the model second-guesses those prompts.
|
|
85
|
+
expect(prompt).toContain("Recommend ONE approach, not a menu — unless a command's flow defines its own options.");
|
|
79
86
|
expect(prompt).not.toContain("Do not default to generic tests, scripts, screenshots, benchmarks, or simulations");
|
|
80
87
|
expect(sectionIndex(prompt, "## Code Quality")).toBeLessThan(sectionIndex(prompt, "## Tools"));
|
|
81
88
|
expect(sectionIndex(prompt, "## Tools")).toBeLessThan(sectionIndex(prompt, "## Project Context"));
|
|
@@ -152,6 +159,10 @@ describe("buildSystemPrompt", () => {
|
|
|
152
159
|
"works directly in the user's codebase",
|
|
153
160
|
"completing tasks end-to-end",
|
|
154
161
|
"Final replies: 1–2 sentences, hard cap 5",
|
|
162
|
+
"Do all safe, reversible steps implied by the goal",
|
|
163
|
+
"never ask permission, merely suggest them, or leave them for the user",
|
|
164
|
+
"ONE action that unblocks you",
|
|
165
|
+
"State what works now and the blocker or next step",
|
|
155
166
|
"Read before `edit`/`write`",
|
|
156
167
|
"re-read after formatters",
|
|
157
168
|
"Compute in bash; write with `edit`/`write`",
|
|
@@ -159,8 +170,9 @@ describe("buildSystemPrompt", () => {
|
|
|
159
170
|
"When none exist, infer from the task and project",
|
|
160
171
|
"ask only when a missing product or taste decision would materially change the result",
|
|
161
172
|
"Keep edits small",
|
|
162
|
-
"
|
|
163
|
-
"
|
|
173
|
+
"plan only complex/risky multi-file work",
|
|
174
|
+
"Stop only for user decisions, secrets/access, cost",
|
|
175
|
+
"otherwise continue through completion",
|
|
164
176
|
"Preserve user work",
|
|
165
177
|
"Rule precedence: project context files",
|
|
166
178
|
"file/module patterns → applicable skill instructions",
|
|
@@ -169,13 +181,21 @@ describe("buildSystemPrompt", () => {
|
|
|
169
181
|
"Do not rely on memory for APIs",
|
|
170
182
|
"Use `source_path`",
|
|
171
183
|
"web_search` then `web_fetch",
|
|
172
|
-
"
|
|
173
|
-
"
|
|
174
|
-
"
|
|
175
|
-
"
|
|
184
|
+
"use the kencode-search tools (usage in Tools below)",
|
|
185
|
+
"curated, categorized reference repos",
|
|
186
|
+
"Search GitHub repos live",
|
|
187
|
+
"literal text or RE2 regex; NOT semantic",
|
|
188
|
+
"Skip checks after simple edits",
|
|
189
|
+
"At coherent checkpoints or after risky/non-obvious changes",
|
|
190
|
+
"run one targeted check",
|
|
176
191
|
]) {
|
|
177
192
|
expect(prompt).toContain(required);
|
|
178
193
|
}
|
|
194
|
+
expect(prompt).not.toContain("doable in under 2 minutes");
|
|
195
|
+
expect(prompt).not.toContain("Estimate time only when");
|
|
196
|
+
expect(prompt).not.toContain("plan multi-file work first");
|
|
197
|
+
expect(prompt).not.toContain("otherwise follow through and verify");
|
|
198
|
+
expect(prompt).not.toContain("Run only targeted verification needed for the change");
|
|
179
199
|
});
|
|
180
200
|
it("keeps kencode guidance concise while separating repo discovery from exact search", async () => {
|
|
181
201
|
const cwd = await makeProject();
|
|
@@ -203,14 +223,14 @@ describe("buildSystemPrompt", () => {
|
|
|
203
223
|
"tool_search",
|
|
204
224
|
]);
|
|
205
225
|
// Research section must not name tools the model can't call yet…
|
|
206
|
-
expect(deferred).not.toContain("
|
|
226
|
+
expect(deferred).not.toContain("kencode-search tools");
|
|
207
227
|
expect(deferred).not.toContain("ReferenceSources");
|
|
208
228
|
// …and must point discovery at tool_search instead (research + tools hint).
|
|
209
229
|
expect(deferred).toContain("call `tool_search` first");
|
|
210
230
|
expect(deferred).toContain("Check the catalog BEFORE concluding");
|
|
211
231
|
// Neither kencode nor tool_search active: the public-code sentence is omitted.
|
|
212
232
|
const bare = await buildSystemPrompt(cwd, undefined, false, undefined, ["read", "bash"]);
|
|
213
|
-
expect(bare).not.toContain("
|
|
233
|
+
expect(bare).not.toContain("kencode-search tools");
|
|
214
234
|
expect(bare).not.toContain("tool_search");
|
|
215
235
|
});
|
|
216
236
|
it("measures representative system prompt sizes", async () => {
|
|
@@ -271,10 +291,10 @@ describe("buildSystemPrompt", () => {
|
|
|
271
291
|
typescriptProjectContextToolsSkills: promptSize(typescriptPrompt),
|
|
272
292
|
};
|
|
273
293
|
console.info(`system prompt size measurements: ${JSON.stringify(measurements)}`);
|
|
274
|
-
// Ceilings include the fork's longer branding
|
|
275
|
-
//
|
|
276
|
-
expect(measurements.normal.characters).toBeLessThan(
|
|
277
|
-
expect(measurements.planMode.characters).toBeLessThan(
|
|
294
|
+
// Ceilings include the fork's longer branding and Goal guidance plus the
|
|
295
|
+
// upstream shell, network-policy, context-precedence, and skill-routing instructions.
|
|
296
|
+
expect(measurements.normal.characters).toBeLessThan(5_500);
|
|
297
|
+
expect(measurements.planMode.characters).toBeLessThan(6_700);
|
|
278
298
|
expect(measurements.typescriptProjectContextToolsSkills.characters).toBeLessThan(9_800);
|
|
279
299
|
expect(measurements.planMode.characters).toBeGreaterThan(measurements.normal.characters);
|
|
280
300
|
expect(measurements.typescriptProjectContextToolsSkills.characters).toBeGreaterThan(measurements.normal.characters);
|
|
@@ -304,6 +324,48 @@ describe("buildSystemPrompt", () => {
|
|
|
304
324
|
expect(audit.size.characters).toBeLessThan(9_500);
|
|
305
325
|
expect(audit.size.sections).toBeGreaterThanOrEqual(8);
|
|
306
326
|
});
|
|
327
|
+
it("only references web_search in Research when it is an active tool", async () => {
|
|
328
|
+
const cwd = await makeProject();
|
|
329
|
+
// Anthropic-shaped tool set: no client-side web_search tool, but native
|
|
330
|
+
// server-side search really exists — the prompt may claim it.
|
|
331
|
+
const anthropicNoSearch = await buildSystemPrompt(cwd, undefined, false, undefined, ["read", "bash", "web_fetch"], undefined, "anthropic");
|
|
332
|
+
expect(anthropicNoSearch).not.toContain("web_search");
|
|
333
|
+
expect(anthropicNoSearch).toContain("use `web_fetch` for authoritative docs (native web search is available)");
|
|
334
|
+
// Non-Anthropic provider without the web_search tool: no native-search
|
|
335
|
+
// capability exists, so the prompt must not claim one.
|
|
336
|
+
const otherNoSearch = await buildSystemPrompt(cwd, undefined, false, undefined, ["read", "bash", "web_fetch"], undefined, "openai");
|
|
337
|
+
expect(otherNoSearch).not.toContain("web_search");
|
|
338
|
+
expect(otherNoSearch).not.toContain("native web search is available");
|
|
339
|
+
expect(otherNoSearch).toContain("use `web_fetch` for authoritative docs");
|
|
340
|
+
const withSearch = await buildSystemPrompt(cwd, undefined, false, undefined, [
|
|
341
|
+
"read",
|
|
342
|
+
"bash",
|
|
343
|
+
"web_search",
|
|
344
|
+
"web_fetch",
|
|
345
|
+
]);
|
|
346
|
+
expect(withSearch).toContain("use `web_search` then `web_fetch` for authoritative docs");
|
|
347
|
+
});
|
|
348
|
+
it("reports the resolved shell in the Environment section", async () => {
|
|
349
|
+
const cwd = await makeProject();
|
|
350
|
+
const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"]);
|
|
351
|
+
// Non-Windows hosts (and Windows with Git Bash) run POSIX bash.
|
|
352
|
+
expect(prompt).toContain("- Shell: bash (POSIX)");
|
|
353
|
+
});
|
|
354
|
+
it("lists additional roots and the network allowlist in the Environment section", async () => {
|
|
355
|
+
const cwd = await makeProject();
|
|
356
|
+
const plain = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"]);
|
|
357
|
+
expect(plain).not.toContain("Additional roots:");
|
|
358
|
+
expect(plain).not.toContain("Network allowlist:");
|
|
359
|
+
const scoped = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"], undefined, undefined, { additionalRoots: ["/work/sdk"], networkAllow: ["*.github.com"] });
|
|
360
|
+
expect(scoped).toContain("- Additional roots: /work/sdk");
|
|
361
|
+
expect(scoped).toContain("- Network allowlist: *.github.com");
|
|
362
|
+
});
|
|
363
|
+
it("states the nearest-wins precedence rule in the project context section", async () => {
|
|
364
|
+
const cwd = await makeProject({ "AGENTS.md": "Project rules." });
|
|
365
|
+
const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"]);
|
|
366
|
+
expect(prompt).toContain("Files are ordered broadest → nearest.");
|
|
367
|
+
expect(prompt).toContain("the nearest file wins");
|
|
368
|
+
});
|
|
307
369
|
it("uses the Claude Code identity for Anthropic and EZ Coder for other providers", async () => {
|
|
308
370
|
const cwd = await makeProject();
|
|
309
371
|
const anthropic = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"], undefined, "anthropic");
|
|
@@ -314,4 +376,82 @@ describe("buildSystemPrompt", () => {
|
|
|
314
376
|
expect(openai).not.toContain("You are Claude Code");
|
|
315
377
|
});
|
|
316
378
|
});
|
|
379
|
+
describe("collectProjectContext", () => {
|
|
380
|
+
it("picks one file per directory — AGENTS.md shadows CLAUDE.md and the rest", async () => {
|
|
381
|
+
const cwd = await makeProject({
|
|
382
|
+
"AGENTS.md": "agents rules",
|
|
383
|
+
"CLAUDE.md": "claude rules",
|
|
384
|
+
".cursorrules": "cursor rules",
|
|
385
|
+
});
|
|
386
|
+
const parts = await collectProjectContext(cwd);
|
|
387
|
+
expect(parts).toHaveLength(1);
|
|
388
|
+
expect(parts[0]).toContain("AGENTS.md");
|
|
389
|
+
expect(parts[0]).toContain("agents rules");
|
|
390
|
+
expect(parts.join("\n")).not.toContain("claude rules");
|
|
391
|
+
expect(parts.join("\n")).not.toContain("cursor rules");
|
|
392
|
+
});
|
|
393
|
+
it("AGENTS.override.md beats AGENTS.md in the same directory", async () => {
|
|
394
|
+
const cwd = await makeProject({
|
|
395
|
+
"AGENTS.override.md": "local override rules",
|
|
396
|
+
"AGENTS.md": "checked-in rules",
|
|
397
|
+
});
|
|
398
|
+
const parts = await collectProjectContext(cwd);
|
|
399
|
+
expect(parts).toHaveLength(1);
|
|
400
|
+
expect(parts[0]).toContain("AGENTS.override.md");
|
|
401
|
+
expect(parts[0]).toContain("local override rules");
|
|
402
|
+
expect(parts.join("\n")).not.toContain("checked-in rules");
|
|
403
|
+
});
|
|
404
|
+
it("renders broad → narrow: the nearest file comes last", async () => {
|
|
405
|
+
const root = await makeProject({
|
|
406
|
+
"AGENTS.md": "root-level rules",
|
|
407
|
+
"nested/CLAUDE.md": "nested rules",
|
|
408
|
+
});
|
|
409
|
+
const cwd = path.join(root, "nested");
|
|
410
|
+
const parts = await collectProjectContext(cwd);
|
|
411
|
+
const rendered = parts.join("\n\n");
|
|
412
|
+
expect(rendered.indexOf("root-level rules")).toBeGreaterThanOrEqual(0);
|
|
413
|
+
expect(rendered.indexOf("root-level rules")).toBeLessThan(rendered.indexOf("nested rules"));
|
|
414
|
+
expect(parts[parts.length - 1]).toContain("CLAUDE.md");
|
|
415
|
+
});
|
|
416
|
+
it("skips empty or whitespace-only files", async () => {
|
|
417
|
+
const cwd = await makeProject({ "AGENTS.md": " \n\t\n" });
|
|
418
|
+
expect(await collectProjectContext(cwd)).toHaveLength(0);
|
|
419
|
+
});
|
|
420
|
+
it("strips a BOM so the content renders clean", async () => {
|
|
421
|
+
const cwd = await makeProject({ "AGENTS.md": "\uFEFFbom rules" });
|
|
422
|
+
const parts = await collectProjectContext(cwd);
|
|
423
|
+
expect(parts).toHaveLength(1);
|
|
424
|
+
expect(parts[0]).toContain("bom rules");
|
|
425
|
+
expect(parts[0]).not.toContain("\uFEFF");
|
|
426
|
+
});
|
|
427
|
+
it("budgets nearest-first at 32 KiB and reports skipped files", async () => {
|
|
428
|
+
const bigParent = "x".repeat(PROJECT_CONTEXT_MAX_BYTES + 1_000);
|
|
429
|
+
const root = await makeProject({
|
|
430
|
+
"AGENTS.md": bigParent,
|
|
431
|
+
"nested/CLAUDE.md": "nearest rules survive",
|
|
432
|
+
});
|
|
433
|
+
const cwd = path.join(root, "nested");
|
|
434
|
+
const parts = await collectProjectContext(cwd);
|
|
435
|
+
const rendered = parts.join("\n\n");
|
|
436
|
+
expect(rendered).toContain("nearest rules survive");
|
|
437
|
+
expect(rendered).not.toContain(bigParent);
|
|
438
|
+
expect(rendered).toContain("Skipped (context budget)");
|
|
439
|
+
expect(rendered).toMatch(/Skipped \(context budget\): .*AGENTS\.md \(\d+KB\)/);
|
|
440
|
+
});
|
|
441
|
+
it("keeps the nearest file when the budget cannot fit both", async () => {
|
|
442
|
+
const nearBig = "n".repeat(PROJECT_CONTEXT_MAX_BYTES - 100);
|
|
443
|
+
const parentRules = `parent rules ${"p".repeat(200)}`; // larger than the 100B leftover
|
|
444
|
+
const root = await makeProject({
|
|
445
|
+
"AGENTS.md": parentRules,
|
|
446
|
+
"nested/AGENTS.md": nearBig,
|
|
447
|
+
});
|
|
448
|
+
const cwd = path.join(root, "nested");
|
|
449
|
+
const parts = await collectProjectContext(cwd);
|
|
450
|
+
const rendered = parts.join("\n\n");
|
|
451
|
+
// The nearest (big) file consumed the budget; the parent was dropped.
|
|
452
|
+
expect(rendered).toContain(nearBig);
|
|
453
|
+
expect(rendered).not.toContain(parentRules);
|
|
454
|
+
expect(rendered).toContain("Skipped (context budget)");
|
|
455
|
+
});
|
|
456
|
+
});
|
|
317
457
|
//# sourceMappingURL=system-prompt.test.js.map
|