@dungle-scrubs/tallow 0.8.23 → 0.8.24
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/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/workspace-transition-interactive.d.ts +1 -0
- package/dist/workspace-transition-interactive.d.ts.map +1 -1
- package/dist/workspace-transition-interactive.js +3 -0
- package/dist/workspace-transition-interactive.js.map +1 -1
- package/extensions/_shared/__tests__/shell-policy.test.ts +16 -13
- package/extensions/_shared/shell-policy.ts +8 -3
- package/extensions/hooks/__tests__/stale-cwd.test.ts +108 -0
- package/extensions/hooks/index.ts +52 -2
- package/extensions/plan-mode-tool/__tests__/index.test.ts +0 -1
- package/extensions/plan-mode-tool/__tests__/utils.test.ts +0 -57
- package/extensions/plan-mode-tool/extension.json +1 -10
- package/extensions/plan-mode-tool/index.ts +11 -284
- package/extensions/plan-mode-tool/utils.ts +0 -29
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/HISTORY.md +541 -0
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/README.md +109 -0
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/db.json +9342 -0
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/index.js +12 -0
- package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/package.json +56 -0
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.d.ts +13 -0
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.d.ts.map +1 -1
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.js +22 -2
- package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -0
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/package.json +1 -1
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/tui-diff-regression.test.ts +52 -0
- package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/tui.ts +23 -2
- package/package.json +11 -9
- package/packages/tallow-tui/node_modules/@types/mime-types/LICENSE +21 -0
- package/packages/tallow-tui/node_modules/@types/mime-types/README.md +28 -0
- package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +9 -0
- package/packages/tallow-tui/node_modules/@types/mime-types/package.json +25 -0
- package/packages/tallow-tui/node_modules/chalk/license +9 -0
- package/packages/tallow-tui/node_modules/chalk/package.json +83 -0
- package/packages/tallow-tui/node_modules/chalk/readme.md +297 -0
- package/packages/tallow-tui/node_modules/chalk/source/index.d.ts +325 -0
- package/packages/tallow-tui/node_modules/chalk/source/index.js +225 -0
- package/packages/tallow-tui/node_modules/chalk/source/utilities.js +33 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/index.d.ts +60 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/index.js +30 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/license +9 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +403 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +70 -0
- package/packages/tallow-tui/node_modules/get-east-asian-width/readme.md +65 -0
- package/packages/tallow-tui/node_modules/marked/LICENSE.md +44 -0
- package/packages/tallow-tui/node_modules/marked/README.md +106 -0
- package/packages/tallow-tui/node_modules/marked/bin/main.js +282 -0
- package/packages/tallow-tui/node_modules/marked/bin/marked.js +15 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +2211 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +7 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +728 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +728 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +2189 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +7 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +2213 -0
- package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +7 -0
- package/packages/tallow-tui/node_modules/marked/man/marked.1 +111 -0
- package/packages/tallow-tui/node_modules/marked/man/marked.1.md +92 -0
- package/packages/tallow-tui/node_modules/marked/marked.min.js +69 -0
- package/packages/tallow-tui/node_modules/marked/package.json +111 -0
- package/packages/tallow-tui/node_modules/mime-types/HISTORY.md +428 -0
- package/packages/tallow-tui/node_modules/mime-types/LICENSE +23 -0
- package/packages/tallow-tui/node_modules/mime-types/README.md +126 -0
- package/packages/tallow-tui/node_modules/mime-types/index.js +211 -0
- package/packages/tallow-tui/node_modules/mime-types/mimeScore.js +57 -0
- package/packages/tallow-tui/node_modules/mime-types/package.json +49 -0
- package/extensions/plan-mode-tool/__tests__/agent-end-execution.test.ts +0 -373
- package/packages/tallow-tui/dist/tui.js.map +0 -1
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/README.md +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.d.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.d.ts.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.js +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.js.map +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/__snapshots__/render.test.ts.snap +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-border.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-change-listener.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-ghost-text.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/fuzzy.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/image-component.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/keys.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/render.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/stdin-buffer.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/terminal-image.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/tui-render-scheduling.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/utils.test.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/autocomplete.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/border-styles.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/bordered-box.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/box.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/cancellable-loader.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/editor.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/image.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/input.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/loader.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/markdown.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/select-list.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/settings-list.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/spacer.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/text.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/truncated-text.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/editor-component.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/fuzzy.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/index.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/keybindings.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/keys.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/kill-ring.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/stdin-buffer.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/terminal-image.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/terminal.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/test-utils/capability-env.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/undo-stack.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/utils.ts +0 -0
- /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/tsconfig.build.json +0 -0
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RuntimePathProvider } from "./runtime-path-provider.js";
|
|
2
2
|
export declare const APP_NAME = "tallow";
|
|
3
|
-
export declare const TALLOW_VERSION = "0.8.
|
|
3
|
+
export declare const TALLOW_VERSION = "0.8.24";
|
|
4
4
|
export declare const CONFIG_DIR = ".tallow";
|
|
5
5
|
/** ~/.tallow (or override from ~/.config/tallow-work-dirs) — all user config, sessions, auth, extensions */
|
|
6
6
|
export declare const TALLOW_HOME: string;
|
package/dist/config.js
CHANGED
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url";
|
|
|
6
6
|
import { createRuntimePathProvider } from "./runtime-path-provider.js";
|
|
7
7
|
// ─── Identity ────────────────────────────────────────────────────────────────
|
|
8
8
|
export const APP_NAME = "tallow";
|
|
9
|
-
export const TALLOW_VERSION = "0.8.
|
|
9
|
+
export const TALLOW_VERSION = "0.8.24"; // x-release-please-version
|
|
10
10
|
export const CONFIG_DIR = ".tallow";
|
|
11
11
|
// ─── Paths ───────────────────────────────────────────────────────────────────
|
|
12
12
|
/** ~/.tallow (or override from ~/.config/tallow-work-dirs) — all user config, sessions, auth, extensions */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-transition-interactive.d.ts","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEpE,OAAO,EAEN,KAAK,uBAAuB,EAG5B,MAAM,2BAA2B,CAAC;AAOnC,sEAAsE;AACtE,UAAU,mBAAmB;IAC5B,aAAa,EAAE;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;IACjC,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACpC,gBAAgB,CAAC,EAAE;QAAE,IAAI,IAAI,IAAI,CAAA;KAAE,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;IAC5C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,qBAAqB,IAAI,IAAI,CAAC;IAC9B,gBAAgB,IAAI,IAAI,CAAC;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,IAAI,IAAI,CAAC;IACzB,EAAE,EAAE;QAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-transition-interactive.d.ts","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,9 @@ function resetInteractiveModeState(mode) {
|
|
|
115
115
|
mode.resetExtensionUI();
|
|
116
116
|
mode.unsubscribe?.();
|
|
117
117
|
mode.unsubscribe = undefined;
|
|
118
|
+
// Clear terminal scrollback so stale content from the previous session
|
|
119
|
+
// doesn't visually flow into the new session's startup output.
|
|
120
|
+
mode.ui.requestScrollbackClear?.();
|
|
118
121
|
}
|
|
119
122
|
/**
|
|
120
123
|
* Emit session_shutdown on the previous session before it is discarded.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -181,11 +181,15 @@ describe("policy evaluation", () => {
|
|
|
181
181
|
expect(verdict.trustLevel).toBe("explicit");
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
-
test("rm -rf
|
|
184
|
+
test("rm -rf of non-root targets is allowed without confirmation", () => {
|
|
185
185
|
const verdict = evaluateCommand("rm -rf ~/tmp/demo", "bash", process.cwd());
|
|
186
186
|
expect(verdict.allowed).toBe(true);
|
|
187
|
-
expect(verdict.requiresConfirmation).toBe(
|
|
188
|
-
|
|
187
|
+
expect(verdict.requiresConfirmation).toBe(false);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("rm -rf / is still hard-denied", () => {
|
|
191
|
+
const verdict = evaluateCommand("rm -rf /", "bash", process.cwd());
|
|
192
|
+
expect(verdict.allowed).toBe(false);
|
|
189
193
|
});
|
|
190
194
|
|
|
191
195
|
test("implicit commands are blocked while disabled", () => {
|
|
@@ -447,8 +451,8 @@ describe("process wrappers", () => {
|
|
|
447
451
|
});
|
|
448
452
|
|
|
449
453
|
describe("deriveAllowPattern", () => {
|
|
450
|
-
test("rm -rf →
|
|
451
|
-
expect(deriveAllowPattern("rm -rf ./dist")).
|
|
454
|
+
test("rm -rf → null (not high-risk, guarded by denylist and hooks)", () => {
|
|
455
|
+
expect(deriveAllowPattern("rm -rf ./dist")).toBeNull();
|
|
452
456
|
});
|
|
453
457
|
|
|
454
458
|
test("sudo → exact command", () => {
|
|
@@ -494,21 +498,20 @@ describe("deriveAllowPattern", () => {
|
|
|
494
498
|
expect(deriveAllowPattern("ls -la")).toBeNull();
|
|
495
499
|
});
|
|
496
500
|
|
|
497
|
-
test("
|
|
498
|
-
// "sudo rm -rf" matches rm -rf first (it appears first in pattern list)
|
|
501
|
+
test("sudo rm -rf matches sudo pattern", () => {
|
|
499
502
|
const pattern = deriveAllowPattern("sudo rm -rf /tmp/test");
|
|
500
503
|
expect(pattern).toBe("Bash(sudo rm -rf /tmp/test)");
|
|
501
504
|
});
|
|
502
505
|
|
|
503
506
|
test("trims whitespace from command", () => {
|
|
504
|
-
expect(deriveAllowPattern("
|
|
507
|
+
expect(deriveAllowPattern(" sudo apt upgrade ")).toBe("Bash(sudo apt upgrade)");
|
|
505
508
|
});
|
|
506
509
|
|
|
507
|
-
test("different
|
|
508
|
-
const pattern1 = deriveAllowPattern("
|
|
509
|
-
const pattern2 = deriveAllowPattern("
|
|
510
|
-
expect(pattern1).toBe("Bash(
|
|
511
|
-
expect(pattern2).toBe("Bash(
|
|
510
|
+
test("different args produce different patterns", () => {
|
|
511
|
+
const pattern1 = deriveAllowPattern("sudo apt install foo");
|
|
512
|
+
const pattern2 = deriveAllowPattern("sudo apt install bar");
|
|
513
|
+
expect(pattern1).toBe("Bash(sudo apt install foo)");
|
|
514
|
+
expect(pattern2).toBe("Bash(sudo apt install bar)");
|
|
512
515
|
expect(pattern1).not.toBe(pattern2);
|
|
513
516
|
});
|
|
514
517
|
});
|
|
@@ -133,9 +133,15 @@ const ALWAYS_BLOCK_PATTERNS: readonly RegExp[] = [
|
|
|
133
133
|
),
|
|
134
134
|
];
|
|
135
135
|
|
|
136
|
-
/** High-risk patterns: explicit sources require confirmation.
|
|
136
|
+
/** High-risk patterns: explicit sources require confirmation.
|
|
137
|
+
*
|
|
138
|
+
* NOTE: `rm -r` is intentionally absent. Catastrophic rm targets (/, ~, ., ..)
|
|
139
|
+
* are hard-denied by ALWAYS_BLOCK_PATTERNS above. Non-catastrophic recursive
|
|
140
|
+
* deletes (build dirs, caches, project subdirs) are normal dev workflow and
|
|
141
|
+
* should not prompt. Additional rm guardrails live in tallow-plugins hooks
|
|
142
|
+
* (rm_protection.py) which do proper token-parsed analysis.
|
|
143
|
+
*/
|
|
137
144
|
const HIGH_RISK_PATTERNS: readonly RegExp[] = [
|
|
138
|
-
new RegExp(`${COMMAND_SEGMENT_PREFIX}rm\\s+-\\w*r\\w*`, "i"),
|
|
139
145
|
new RegExp(`${COMMAND_SEGMENT_PREFIX}sudo\\b`, "i"),
|
|
140
146
|
new RegExp(`${COMMAND_SEGMENT_PREFIX}curl\\b[^\\n|]*\\|\\s*(?:ba)?sh\\b`, "i"),
|
|
141
147
|
new RegExp(`${COMMAND_SEGMENT_PREFIX}wget\\b[^\\n|]*\\|\\s*(?:ba)?sh\\b`, "i"),
|
|
@@ -184,7 +190,6 @@ const auditTrail: ShellAuditEntry[] =
|
|
|
184
190
|
* rather than a wildcard pattern.
|
|
185
191
|
*/
|
|
186
192
|
const HIGH_RISK_ALLOW_PATTERNS: readonly RegExp[] = [
|
|
187
|
-
/\brm\s+-\w*r\w*/i,
|
|
188
193
|
/\bsudo\b/i,
|
|
189
194
|
/\bcurl\b[^\n|]*\|\s*(?:ba)?sh\b/i,
|
|
190
195
|
/\bwget\b[^\n|]*\|\s*(?:ba)?sh\b/i,
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { type HookHandler, runAgentHook, runCommandHook } from "../index.js";
|
|
3
|
+
|
|
4
|
+
/** Nonexistent directory path — guaranteed to not exist on any system. */
|
|
5
|
+
const MISSING_CWD = "/tmp/tallow-test-nonexistent-dir-stale-cwd-bug193";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Build a minimal command hook handler for testing.
|
|
9
|
+
*
|
|
10
|
+
* @param command - Shell command to execute
|
|
11
|
+
* @returns Command-type hook handler
|
|
12
|
+
*/
|
|
13
|
+
function createCommandHandler(command: string): HookHandler {
|
|
14
|
+
return {
|
|
15
|
+
command,
|
|
16
|
+
timeout: 5,
|
|
17
|
+
type: "command",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Build a minimal agent hook handler for testing.
|
|
23
|
+
*
|
|
24
|
+
* @param agent - Agent name
|
|
25
|
+
* @returns Agent-type hook handler
|
|
26
|
+
*/
|
|
27
|
+
function createAgentHandler(agent: string): HookHandler {
|
|
28
|
+
return {
|
|
29
|
+
agent,
|
|
30
|
+
prompt: "test prompt",
|
|
31
|
+
timeout: 5,
|
|
32
|
+
type: "agent",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe("stale cwd handling", () => {
|
|
37
|
+
describe("runCommandHook", () => {
|
|
38
|
+
test("returns infrastructure error for nonexistent cwd", async () => {
|
|
39
|
+
const handler = createCommandHandler("echo ok");
|
|
40
|
+
const result = await runCommandHook(handler, {}, MISSING_CWD);
|
|
41
|
+
|
|
42
|
+
expect(result.ok).toBe(false);
|
|
43
|
+
expect(result.infrastructureError).toBe(true);
|
|
44
|
+
expect(result.reason).toContain("cwd no longer exists");
|
|
45
|
+
expect(result.reason).toContain(MISSING_CWD);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("does not set decision: block for missing cwd", async () => {
|
|
49
|
+
const handler = createCommandHandler("echo ok");
|
|
50
|
+
const result = await runCommandHook(handler, {}, MISSING_CWD);
|
|
51
|
+
|
|
52
|
+
expect(result.decision).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("still works normally with valid cwd", async () => {
|
|
56
|
+
const handler = createCommandHandler(
|
|
57
|
+
'node -e "process.stdout.write(JSON.stringify({ok:true}))"'
|
|
58
|
+
);
|
|
59
|
+
const result = await runCommandHook(handler, {}, process.cwd());
|
|
60
|
+
|
|
61
|
+
expect(result.ok).toBe(true);
|
|
62
|
+
expect(result.infrastructureError).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe("runAgentHook", () => {
|
|
67
|
+
test("returns infrastructure error for nonexistent cwd", async () => {
|
|
68
|
+
const handler = createAgentHandler("test-agent");
|
|
69
|
+
const result = await runAgentHook(handler, {}, MISSING_CWD, "/tmp");
|
|
70
|
+
|
|
71
|
+
expect(result.ok).toBe(false);
|
|
72
|
+
expect(result.infrastructureError).toBe(true);
|
|
73
|
+
expect(result.reason).toContain("cwd no longer exists");
|
|
74
|
+
expect(result.reason).toContain(MISSING_CWD);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("does not set decision: block for missing cwd", async () => {
|
|
78
|
+
const handler = createAgentHandler("test-agent");
|
|
79
|
+
const result = await runAgentHook(handler, {}, MISSING_CWD, "/tmp");
|
|
80
|
+
|
|
81
|
+
expect(result.decision).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe("infrastructure vs policy distinction", () => {
|
|
86
|
+
test("infrastructure error result shape differs from policy block", async () => {
|
|
87
|
+
// Infrastructure error: missing cwd
|
|
88
|
+
const infraHandler = createCommandHandler("echo ok");
|
|
89
|
+
const infraResult = await runCommandHook(infraHandler, {}, MISSING_CWD);
|
|
90
|
+
|
|
91
|
+
// Policy block: exit code 2
|
|
92
|
+
const policyHandler = createCommandHandler("exit 2");
|
|
93
|
+
const policyResult = await runCommandHook(policyHandler, {}, process.cwd());
|
|
94
|
+
|
|
95
|
+
// Both are ok: false
|
|
96
|
+
expect(infraResult.ok).toBe(false);
|
|
97
|
+
expect(policyResult.ok).toBe(false);
|
|
98
|
+
|
|
99
|
+
// Infrastructure error is flagged, policy block is not
|
|
100
|
+
expect(infraResult.infrastructureError).toBe(true);
|
|
101
|
+
expect(policyResult.infrastructureError).toBeUndefined();
|
|
102
|
+
|
|
103
|
+
// Policy block has decision: "block", infrastructure error does not
|
|
104
|
+
expect(policyResult.decision).toBe("block");
|
|
105
|
+
expect(infraResult.decision).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -75,6 +75,8 @@ export interface HookResult {
|
|
|
75
75
|
reason?: string;
|
|
76
76
|
additionalContext?: string;
|
|
77
77
|
decision?: "block" | "allow";
|
|
78
|
+
/** True when the hook failed due to infrastructure (missing cwd, spawn error), not a policy decision. */
|
|
79
|
+
infrastructureError?: boolean;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
// Events that support blocking via hook decisions.
|
|
@@ -831,6 +833,16 @@ export async function runCommandHook(
|
|
|
831
833
|
};
|
|
832
834
|
}
|
|
833
835
|
|
|
836
|
+
// Pre-spawn guard: bail early if the working directory no longer exists.
|
|
837
|
+
// This catches the common case of a workspace rename/delete while the session is active.
|
|
838
|
+
if (!fs.existsSync(cwd)) {
|
|
839
|
+
return {
|
|
840
|
+
ok: false,
|
|
841
|
+
reason: `Hook cwd no longer exists: ${cwd}`,
|
|
842
|
+
infrastructureError: true,
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
|
|
834
846
|
const timeoutMs = (handler.timeout ?? 600) * 1000;
|
|
835
847
|
const maxBufferBytes = getHookOutputMaxBufferBytes();
|
|
836
848
|
const hookEventJson = JSON.stringify(eventData);
|
|
@@ -894,7 +906,18 @@ export async function runCommandHook(
|
|
|
894
906
|
}
|
|
895
907
|
|
|
896
908
|
proc.once("error", (error) => {
|
|
897
|
-
|
|
909
|
+
const spawnError = error as NodeJS.ErrnoException;
|
|
910
|
+
// Belt-and-suspenders: if the cwd was deleted between the pre-spawn
|
|
911
|
+
// check and the actual spawn(), detect it here via ENOENT.
|
|
912
|
+
const isCwdMissing = spawnError.code === "ENOENT" && !fs.existsSync(cwd);
|
|
913
|
+
const reason = isCwdMissing
|
|
914
|
+
? `Hook cwd no longer exists: ${cwd}`
|
|
915
|
+
: error.message || "Hook command failed to start";
|
|
916
|
+
settle({
|
|
917
|
+
ok: false,
|
|
918
|
+
reason,
|
|
919
|
+
infrastructureError: isCwdMissing || spawnError.code === "ENOENT",
|
|
920
|
+
});
|
|
898
921
|
});
|
|
899
922
|
|
|
900
923
|
proc.once("close", (code) => {
|
|
@@ -962,6 +985,15 @@ export async function runAgentHook(
|
|
|
962
985
|
agentsDir: string,
|
|
963
986
|
signal?: AbortSignal
|
|
964
987
|
): Promise<HookResult> {
|
|
988
|
+
// Pre-spawn guard: bail early if the working directory no longer exists.
|
|
989
|
+
if (!fs.existsSync(cwd)) {
|
|
990
|
+
return {
|
|
991
|
+
ok: false,
|
|
992
|
+
reason: `Hook cwd no longer exists: ${cwd}`,
|
|
993
|
+
infrastructureError: true,
|
|
994
|
+
};
|
|
995
|
+
}
|
|
996
|
+
|
|
965
997
|
const timeoutMs = (handler.timeout ?? 60) * 1000;
|
|
966
998
|
const maxBufferBytes = getHookOutputMaxBufferBytes();
|
|
967
999
|
|
|
@@ -1136,6 +1168,9 @@ export default function (pi: ExtensionAPI) {
|
|
|
1136
1168
|
let ctx: ExtensionContext | null = null;
|
|
1137
1169
|
let stateManager: HookStateManager | null = null;
|
|
1138
1170
|
|
|
1171
|
+
/** Tracks whether the stale-cwd warning has been shown this session. */
|
|
1172
|
+
let staleCwdWarningShown = false;
|
|
1173
|
+
|
|
1139
1174
|
// Pending async hook results to deliver on next turn
|
|
1140
1175
|
const pendingAsyncResults: Array<{ event: string; result: HookResult }> = [];
|
|
1141
1176
|
|
|
@@ -1426,7 +1461,22 @@ export default function (pi: ExtensionAPI) {
|
|
|
1426
1461
|
additionalContext = `${(additionalContext || "") + result.additionalContext}\n`;
|
|
1427
1462
|
}
|
|
1428
1463
|
|
|
1429
|
-
|
|
1464
|
+
// Surface a user-visible warning once per session when hooks are
|
|
1465
|
+
// skipped due to infrastructure errors (e.g. workspace renamed).
|
|
1466
|
+
if (result.infrastructureError && !staleCwdWarningShown) {
|
|
1467
|
+
staleCwdWarningShown = true;
|
|
1468
|
+
ctx?.ui?.notify(
|
|
1469
|
+
`⚠️ Hook skipped: workspace directory no longer exists (${currentCwd}). ` +
|
|
1470
|
+
`Use /cd to switch to the new location.`,
|
|
1471
|
+
"warning"
|
|
1472
|
+
);
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
// Block only on deliberate policy decisions (decision: "block" or
|
|
1476
|
+
// exit code 2), never on infrastructure errors (missing cwd, spawn
|
|
1477
|
+
// failure). Infrastructure errors still produce ok: false so callers
|
|
1478
|
+
// know the hook didn't succeed, but they must not freeze the session.
|
|
1479
|
+
if (!result.ok && canBlock && !result.infrastructureError) {
|
|
1430
1480
|
shouldBlock = true;
|
|
1431
1481
|
blockReason = result.reason;
|
|
1432
1482
|
break; // First blocking hook wins
|
|
@@ -2,14 +2,11 @@ import { describe, expect, test } from "bun:test";
|
|
|
2
2
|
import {
|
|
3
3
|
cleanStepText,
|
|
4
4
|
detectPlanIntent,
|
|
5
|
-
extractDoneSteps,
|
|
6
5
|
extractTodoItems,
|
|
7
6
|
isPlanModeToolAllowed,
|
|
8
7
|
isSafeCommand,
|
|
9
|
-
markCompletedSteps,
|
|
10
8
|
PLAN_MODE_ALLOWED_TOOLS,
|
|
11
9
|
stripPlanIntent,
|
|
12
|
-
type TodoItem,
|
|
13
10
|
} from "../utils.js";
|
|
14
11
|
|
|
15
12
|
describe("isPlanModeToolAllowed", () => {
|
|
@@ -205,60 +202,6 @@ Let me know if this works.`;
|
|
|
205
202
|
});
|
|
206
203
|
});
|
|
207
204
|
|
|
208
|
-
describe("extractDoneSteps", () => {
|
|
209
|
-
test("extracts single done marker", () => {
|
|
210
|
-
expect(extractDoneSteps("I completed the task [DONE:1]")).toEqual([1]);
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
test("extracts multiple done markers", () => {
|
|
214
|
-
expect(extractDoneSteps("[DONE:1] and [DONE:3] are complete")).toEqual([1, 3]);
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
test("is case-insensitive", () => {
|
|
218
|
-
expect(extractDoneSteps("[done:2] finished")).toEqual([2]);
|
|
219
|
-
expect(extractDoneSteps("[Done:5] finished")).toEqual([5]);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
test("returns empty for no markers", () => {
|
|
223
|
-
expect(extractDoneSteps("No completion markers here")).toEqual([]);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
describe("markCompletedSteps", () => {
|
|
228
|
-
test("marks matching steps as completed", () => {
|
|
229
|
-
const items: TodoItem[] = [
|
|
230
|
-
{ step: 1, text: "First", completed: false },
|
|
231
|
-
{ step: 2, text: "Second", completed: false },
|
|
232
|
-
{ step: 3, text: "Third", completed: false },
|
|
233
|
-
];
|
|
234
|
-
|
|
235
|
-
const count = markCompletedSteps("[DONE:1] [DONE:3]", items);
|
|
236
|
-
expect(count).toBe(2);
|
|
237
|
-
expect(items[0].completed).toBe(true);
|
|
238
|
-
expect(items[1].completed).toBe(false);
|
|
239
|
-
expect(items[2].completed).toBe(true);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
test("returns 0 when no markers match", () => {
|
|
243
|
-
const items: TodoItem[] = [{ step: 1, text: "First", completed: false }];
|
|
244
|
-
expect(markCompletedSteps("No markers", items)).toBe(0);
|
|
245
|
-
expect(items[0].completed).toBe(false);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
test("ignores markers for non-existent steps", () => {
|
|
249
|
-
const items: TodoItem[] = [{ step: 1, text: "First", completed: false }];
|
|
250
|
-
const count = markCompletedSteps("[DONE:99]", items);
|
|
251
|
-
expect(count).toBe(1); // extractDoneSteps found 1 marker
|
|
252
|
-
expect(items[0].completed).toBe(false); // but step 1 wasn't marked
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
test("does not un-complete already completed steps", () => {
|
|
256
|
-
const items: TodoItem[] = [{ step: 1, text: "First", completed: true }];
|
|
257
|
-
markCompletedSteps("No new markers", items);
|
|
258
|
-
expect(items[0].completed).toBe(true);
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
|
|
262
205
|
describe("detectPlanIntent", () => {
|
|
263
206
|
// ── True positives ──────────────────────────────────────────────
|
|
264
207
|
test("detects 'plan only'", () => {
|
|
@@ -6,16 +6,7 @@
|
|
|
6
6
|
"capabilities": {
|
|
7
7
|
"tools": ["plan_mode"],
|
|
8
8
|
"commands": ["plan-mode", "todos"],
|
|
9
|
-
"events": [
|
|
10
|
-
"agent_end",
|
|
11
|
-
"before_agent_start",
|
|
12
|
-
"context",
|
|
13
|
-
"input",
|
|
14
|
-
"session_start",
|
|
15
|
-
"tool_call",
|
|
16
|
-
"tool_result",
|
|
17
|
-
"turn_end"
|
|
18
|
-
]
|
|
9
|
+
"events": ["agent_end", "before_agent_start", "context", "input", "session_start", "tool_call"]
|
|
19
10
|
},
|
|
20
11
|
"permissionSurface": {
|
|
21
12
|
"filesystem": "none",
|