@travisennis/acai 0.0.9 → 0.0.11
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 +51 -760
- package/bin/acai +52 -0
- package/dist/agent/index.d.ts +12 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +380 -199
- package/dist/agent/sub-agent.d.ts +23 -0
- package/dist/agent/sub-agent.d.ts.map +1 -0
- package/dist/agent/sub-agent.js +109 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/{cli.js → cli/index.js} +84 -77
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +2 -1
- package/dist/cli/stdin.d.ts.map +1 -0
- package/dist/{stdin.js → cli/stdin.js} +11 -0
- package/dist/commands/copy/index.js +2 -2
- package/dist/commands/copy/utils.d.ts.map +1 -1
- package/dist/commands/copy/utils.js +15 -13
- package/dist/commands/generate-rules/index.d.ts +1 -1
- package/dist/commands/generate-rules/index.d.ts.map +1 -1
- package/dist/commands/generate-rules/index.js +16 -101
- package/dist/commands/generate-rules/service.d.ts +22 -0
- package/dist/commands/generate-rules/service.d.ts.map +1 -0
- package/dist/commands/generate-rules/service.js +103 -0
- package/dist/commands/handoff/index.js +2 -2
- package/dist/commands/health/index.js +1 -1
- package/dist/commands/health/utils.d.ts +3 -2
- package/dist/commands/health/utils.d.ts.map +1 -1
- package/dist/commands/health/utils.js +6 -0
- package/dist/commands/history/index.d.ts +1 -1
- package/dist/commands/history/index.d.ts.map +1 -1
- package/dist/commands/history/index.js +17 -18
- package/dist/commands/history/types.d.ts +38 -0
- package/dist/commands/history/types.d.ts.map +1 -1
- package/dist/commands/history/utils.d.ts.map +1 -1
- package/dist/commands/history/utils.js +63 -58
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +3 -8
- package/dist/commands/init-project/index.d.ts.map +1 -1
- package/dist/commands/init-project/index.js +3 -3
- package/dist/commands/init-project/utils.d.ts +2 -1
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +10 -2
- package/dist/commands/list-tools/index.d.ts.map +1 -1
- package/dist/commands/list-tools/index.js +7 -31
- package/dist/commands/manager.d.ts +2 -2
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +55 -33
- package/dist/commands/model/index.d.ts.map +1 -1
- package/dist/commands/model/index.js +20 -151
- package/dist/commands/model/model-panel.d.ts +4 -0
- package/dist/commands/model/model-panel.d.ts.map +1 -0
- package/dist/commands/model/model-panel.js +144 -0
- package/dist/commands/paste/index.d.ts.map +1 -1
- package/dist/commands/paste/index.js +59 -62
- package/dist/commands/paste/utils.d.ts.map +1 -1
- package/dist/commands/paste/utils.js +88 -58
- package/dist/commands/pickup/index.d.ts.map +1 -1
- package/dist/commands/pickup/index.js +6 -3
- package/dist/commands/pickup/utils.js +3 -3
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +33 -50
- package/dist/commands/review/index.d.ts.map +1 -1
- package/dist/commands/review/index.js +3 -117
- package/dist/commands/review/review-panel.d.ts +3 -0
- package/dist/commands/review/review-panel.d.ts.map +1 -0
- package/dist/commands/review/review-panel.js +186 -0
- package/dist/commands/review/utils.d.ts +15 -1
- package/dist/commands/review/utils.d.ts.map +1 -1
- package/dist/commands/review/utils.js +127 -68
- package/dist/commands/session/index.d.ts +1 -1
- package/dist/commands/session/index.d.ts.map +1 -1
- package/dist/commands/session/index.js +124 -135
- package/dist/commands/shell/index.d.ts.map +1 -1
- package/dist/commands/shell/index.js +16 -1
- package/dist/commands/types.d.ts +2 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/{config.d.ts → config/index.d.ts} +20 -9
- package/dist/config/index.d.ts.map +1 -0
- package/dist/{config.js → config/index.js} +43 -42
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +75 -55
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -141
- package/dist/middleware/cache.d.ts.map +1 -1
- package/dist/middleware/cache.js +18 -36
- package/dist/models/ai-config.d.ts +1 -0
- package/dist/models/ai-config.d.ts.map +1 -1
- package/dist/models/ai-config.js +4 -3
- package/dist/models/anthropic-provider.d.ts +2 -5
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +3 -70
- package/dist/models/deepseek-provider.d.ts +1 -0
- package/dist/models/deepseek-provider.d.ts.map +1 -1
- package/dist/models/google-provider.d.ts +2 -3
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +0 -26
- package/dist/models/groq-provider.d.ts +1 -0
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/manager.d.ts +13 -2
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +20 -8
- package/dist/models/openai-provider.d.ts +2 -5
- package/dist/models/openai-provider.d.ts.map +1 -1
- package/dist/models/openai-provider.js +0 -52
- package/dist/models/opencode-go-provider.d.ts +25 -0
- package/dist/models/opencode-go-provider.d.ts.map +1 -0
- package/dist/models/opencode-go-provider.js +78 -0
- package/dist/models/opencode-zen-provider.d.ts +7 -3
- package/dist/models/opencode-zen-provider.d.ts.map +1 -1
- package/dist/models/opencode-zen-provider.js +49 -10
- package/dist/models/openrouter-provider.d.ts +27 -31
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +121 -180
- package/dist/models/providers.d.ts +3 -3
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +6 -0
- package/dist/models/xai-provider.d.ts +4 -3
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +18 -18
- package/dist/modes/manager.d.ts +24 -0
- package/dist/modes/manager.d.ts.map +1 -0
- package/dist/modes/manager.js +77 -0
- package/dist/modes/prompts.d.ts +2 -0
- package/dist/modes/prompts.d.ts.map +1 -0
- package/dist/modes/prompts.js +142 -0
- package/dist/prompts/mentions.d.ts +11 -0
- package/dist/prompts/mentions.d.ts.map +1 -0
- package/dist/{mentions.js → prompts/mentions.js} +55 -85
- package/dist/{prompts.d.ts → prompts/system-prompt.d.ts} +7 -2
- package/dist/prompts/system-prompt.d.ts.map +1 -0
- package/dist/{prompts.js → prompts/system-prompt.js} +31 -16
- package/dist/repl/index.d.ts +174 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/{repl-new.js → repl/index.js} +397 -76
- package/dist/repl/project-status.d.ts +1 -0
- package/dist/repl/project-status.d.ts.map +1 -1
- package/dist/repl/project-status.js +4 -1
- package/dist/sessions/manager.d.ts +92 -0
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +262 -9
- package/dist/sessions/summary.d.ts +4 -0
- package/dist/sessions/summary.d.ts.map +1 -0
- package/dist/sessions/summary.js +30 -0
- package/dist/skills/index.d.ts +29 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +294 -0
- package/dist/subagents/index.d.ts +16 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +231 -0
- package/dist/terminal/control.d.ts +1 -1
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +3 -3
- package/dist/terminal/east-asian-width.d.ts.map +1 -1
- package/dist/terminal/east-asian-width.js +404 -351
- package/dist/terminal/keys.d.ts +17 -0
- package/dist/terminal/keys.d.ts.map +1 -1
- package/dist/terminal/keys.js +37 -0
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +24 -12
- package/dist/terminal/string-width.d.ts.map +1 -1
- package/dist/terminal/string-width.js +25 -27
- package/dist/terminal/style.d.ts.map +1 -1
- package/dist/terminal/style.js +4 -7
- package/dist/terminal/supports-color.d.ts.map +1 -1
- package/dist/terminal/supports-color.js +41 -27
- package/dist/terminal/table/cell.d.ts +12 -0
- package/dist/terminal/table/cell.d.ts.map +1 -1
- package/dist/terminal/table/cell.js +40 -25
- package/dist/terminal/table/layout-manager.d.ts.map +1 -1
- package/dist/terminal/table/layout-manager.js +100 -68
- package/dist/terminal/table/utils.d.ts +1 -1
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/table/utils.js +17 -10
- package/dist/terminal/wrap-ansi.d.ts.map +1 -1
- package/dist/terminal/wrap-ansi.js +174 -105
- package/dist/tokens/tracker.d.ts +1 -0
- package/dist/tokens/tracker.d.ts.map +1 -1
- package/dist/tokens/tracker.js +3 -0
- package/dist/tools/agent.d.ts +27 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +81 -0
- package/dist/tools/apply-patch.d.ts +62 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +377 -0
- package/dist/tools/bash.d.ts +4 -3
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +349 -141
- package/dist/tools/directory-tree.d.ts +3 -3
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +8 -5
- package/dist/tools/dynamic-tool-loader.d.ts +3 -6
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +20 -4
- package/dist/tools/edit-file.d.ts +7 -7
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +292 -85
- package/dist/tools/glob.d.ts +6 -6
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +110 -63
- package/dist/tools/grep.d.ts +15 -12
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +315 -193
- package/dist/tools/index.d.ts +114 -9
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +39 -24
- package/dist/tools/ls.d.ts +2 -2
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +7 -5
- package/dist/tools/read-file.d.ts +4 -6
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +84 -39
- package/dist/tools/save-file.d.ts +3 -3
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +36 -31
- package/dist/tools/skill.d.ts +23 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +65 -0
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +2 -9
- package/dist/tools/utils.d.ts +2 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +12 -0
- package/dist/tools/web-fetch.d.ts +50 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +446 -0
- package/dist/tools/web-search.d.ts +44 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +226 -0
- package/dist/tui/autocomplete/attachment-provider.d.ts +3 -6
- package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/attachment-provider.js +25 -78
- package/dist/tui/autocomplete/base-provider.d.ts +1 -0
- package/dist/tui/autocomplete/base-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/combined-provider.d.ts +1 -4
- package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/combined-provider.js +3 -17
- package/dist/tui/autocomplete/command-provider.d.ts +1 -0
- package/dist/tui/autocomplete/command-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/command-provider.js +3 -0
- package/dist/tui/autocomplete/file-search-provider.d.ts +2 -1
- package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/file-search-provider.js +37 -17
- package/dist/tui/autocomplete/skill-provider.d.ts +17 -0
- package/dist/tui/autocomplete/skill-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/skill-provider.js +49 -0
- package/dist/tui/autocomplete/utils.d.ts +2 -1
- package/dist/tui/autocomplete/utils.d.ts.map +1 -1
- package/dist/tui/autocomplete/utils.js +25 -23
- package/dist/tui/autocomplete.d.ts +2 -2
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +3 -5
- package/dist/tui/components/assistant-message.d.ts.map +1 -1
- package/dist/tui/components/assistant-message.js +0 -4
- package/dist/tui/components/editor.d.ts +18 -3
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +211 -237
- package/dist/tui/components/footer.d.ts +6 -4
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +49 -25
- package/dist/tui/components/markdown.d.ts +10 -7
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +57 -39
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +35 -33
- package/dist/tui/components/notification.d.ts +13 -2
- package/dist/tui/components/notification.d.ts.map +1 -1
- package/dist/tui/components/notification.js +36 -2
- package/dist/tui/components/progress-bar.js +1 -1
- package/dist/tui/components/select-list.d.ts +1 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +14 -11
- package/dist/tui/components/text.d.ts +16 -0
- package/dist/tui/components/text.d.ts.map +1 -1
- package/dist/tui/components/text.js +72 -57
- package/dist/tui/components/thinking-block.d.ts +9 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -1
- package/dist/tui/components/thinking-block.js +43 -11
- package/dist/tui/components/tool-execution.d.ts +5 -1
- package/dist/tui/components/tool-execution.d.ts.map +1 -1
- package/dist/tui/components/tool-execution.js +19 -10
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/user-message.js +0 -3
- package/dist/tui/components/welcome.d.ts +2 -1
- package/dist/tui/components/welcome.d.ts.map +1 -1
- package/dist/tui/components/welcome.js +2 -2
- package/dist/tui/editor-launcher.d.ts +3 -2
- package/dist/tui/editor-launcher.d.ts.map +1 -1
- package/dist/tui/index.d.ts +0 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +10 -2
- package/dist/tui/tui.d.ts +43 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +166 -41
- package/dist/tui/utils.d.ts +1 -5
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +271 -44
- package/dist/utils/bash/parse.d.ts +19 -0
- package/dist/utils/bash/parse.d.ts.map +1 -0
- package/dist/utils/bash/parse.js +223 -0
- package/dist/utils/bash/quote.d.ts +6 -0
- package/dist/utils/bash/quote.d.ts.map +1 -0
- package/dist/utils/bash/quote.js +23 -0
- package/dist/utils/bash.d.ts.map +1 -1
- package/dist/utils/bash.js +211 -126
- package/dist/utils/command-protection.d.ts +28 -0
- package/dist/utils/command-protection.d.ts.map +1 -0
- package/dist/utils/command-protection.js +324 -0
- package/dist/utils/dedent.d.ts.map +1 -0
- package/dist/utils/env-expand.d.ts +2 -0
- package/dist/utils/env-expand.d.ts.map +1 -0
- package/dist/utils/env-expand.js +8 -0
- package/dist/utils/filesystem/path-display.d.ts +11 -0
- package/dist/utils/filesystem/path-display.d.ts.map +1 -0
- package/dist/utils/filesystem/path-display.js +32 -0
- package/dist/utils/filesystem/security.d.ts +2 -2
- package/dist/utils/filesystem/security.d.ts.map +1 -1
- package/dist/utils/filesystem/security.js +28 -30
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/{formatting.js → utils/formatting.js} +1 -1
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +30 -0
- package/dist/utils/glob.d.ts +1 -1
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/{logger.js → utils/logger.js} +1 -1
- package/dist/utils/parsing.d.ts.map +1 -0
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +90 -37
- package/dist/utils/templates.d.ts +2 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +24 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/{version.js → utils/version.js} +1 -1
- package/package.json +35 -26
- package/dist/cli.d.ts +0 -23
- package/dist/cli.d.ts.map +0 -1
- package/dist/commands/add-directory/types.d.ts +0 -6
- package/dist/commands/add-directory/types.d.ts.map +0 -1
- package/dist/commands/add-directory/types.js +0 -1
- package/dist/commands/copy/types.d.ts +0 -3
- package/dist/commands/copy/types.d.ts.map +0 -1
- package/dist/commands/copy/types.js +0 -1
- package/dist/commands/exit/index.d.ts +0 -10
- package/dist/commands/exit/index.d.ts.map +0 -1
- package/dist/commands/exit/index.js +0 -21
- package/dist/commands/exit/types.d.ts +0 -8
- package/dist/commands/exit/types.d.ts.map +0 -1
- package/dist/commands/exit/types.js +0 -1
- package/dist/commands/exit/utils.d.ts +0 -2
- package/dist/commands/exit/utils.d.ts.map +0 -1
- package/dist/commands/exit/utils.js +0 -13
- package/dist/commands/prompt/index.d.ts +0 -5
- package/dist/commands/prompt/index.d.ts.map +0 -1
- package/dist/commands/prompt/index.js +0 -122
- package/dist/commands/prompt/types.d.ts +0 -15
- package/dist/commands/prompt/types.d.ts.map +0 -1
- package/dist/commands/prompt/types.js +0 -1
- package/dist/commands/prompt/utils.d.ts +0 -12
- package/dist/commands/prompt/utils.d.ts.map +0 -1
- package/dist/commands/prompt/utils.js +0 -107
- package/dist/commands/reset/index.d.ts +0 -3
- package/dist/commands/reset/index.d.ts.map +0 -1
- package/dist/commands/reset/index.js +0 -25
- package/dist/commands/reset/types.d.ts +0 -1
- package/dist/commands/reset/types.d.ts.map +0 -1
- package/dist/commands/reset/types.js +0 -3
- package/dist/commands/review/types.d.ts +0 -12
- package/dist/commands/review/types.d.ts.map +0 -1
- package/dist/commands/review/types.js +0 -1
- package/dist/commands/save/index.d.ts +0 -3
- package/dist/commands/save/index.d.ts.map +0 -1
- package/dist/commands/save/index.js +0 -19
- package/dist/config.d.ts.map +0 -1
- package/dist/dedent.d.ts.map +0 -1
- package/dist/formatting.d.ts.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/mentions.d.ts +0 -14
- package/dist/mentions.d.ts.map +0 -1
- package/dist/parsing.d.ts.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/repl-new.d.ts +0 -65
- package/dist/repl-new.d.ts.map +0 -1
- package/dist/skills.d.ts +0 -16
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js +0 -233
- package/dist/stdin.d.ts.map +0 -1
- package/dist/tui/autocomplete/path-provider.d.ts +0 -21
- package/dist/tui/autocomplete/path-provider.d.ts.map +0 -1
- package/dist/tui/autocomplete/path-provider.js +0 -164
- package/dist/utils/iterables.d.ts +0 -2
- package/dist/utils/iterables.d.ts.map +0 -1
- package/dist/utils/iterables.js +0 -6
- package/dist/version.d.ts.map +0 -1
- /package/dist/{dedent.d.ts → utils/dedent.d.ts} +0 -0
- /package/dist/{dedent.js → utils/dedent.js} +0 -0
- /package/dist/{formatting.d.ts → utils/formatting.d.ts} +0 -0
- /package/dist/{logger.d.ts → utils/logger.d.ts} +0 -0
- /package/dist/{parsing.d.ts → utils/parsing.d.ts} +0 -0
- /package/dist/{parsing.js → utils/parsing.js} +0 -0
- /package/dist/{version.d.ts → utils/version.d.ts} +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { initExecutionEnvironment } from "../../execution/index.js";
|
|
3
|
+
import { getTerminalSize } from "../../terminal/control.js";
|
|
4
|
+
import style from "../../terminal/style.js";
|
|
5
|
+
import { Markdown } from "../../tui/components/markdown.js";
|
|
6
|
+
import { Spacer } from "../../tui/components/spacer.js";
|
|
7
|
+
import { Container, SelectList, Text, } from "../../tui/index.js";
|
|
8
|
+
import { formatFileDiffForDisplay, getUntrackedFiles, openFileInEditor, parseGitDiffFiles, } from "./utils.js";
|
|
9
|
+
export async function showReviewPanel(tui, container, inputContainer, editor) {
|
|
10
|
+
try {
|
|
11
|
+
const execEnv = await initExecutionEnvironment();
|
|
12
|
+
const stagedResult = await execEnv.executeCommand("git diff --cached", {
|
|
13
|
+
cwd: process.cwd(),
|
|
14
|
+
timeout: 5000,
|
|
15
|
+
preserveOutputOnError: true,
|
|
16
|
+
captureStderr: true,
|
|
17
|
+
throwOnError: false,
|
|
18
|
+
});
|
|
19
|
+
const unstagedResult = await execEnv.executeCommand("git diff", {
|
|
20
|
+
cwd: process.cwd(),
|
|
21
|
+
timeout: 5000,
|
|
22
|
+
preserveOutputOnError: true,
|
|
23
|
+
captureStderr: true,
|
|
24
|
+
throwOnError: false,
|
|
25
|
+
});
|
|
26
|
+
const untrackedResult = await execEnv.executeCommand("git ls-files --others --exclude-standard", {
|
|
27
|
+
cwd: process.cwd(),
|
|
28
|
+
timeout: 5000,
|
|
29
|
+
preserveOutputOnError: true,
|
|
30
|
+
captureStderr: true,
|
|
31
|
+
throwOnError: false,
|
|
32
|
+
});
|
|
33
|
+
const stagedOutput = stagedResult.exitCode === 0 ? stagedResult.output : "";
|
|
34
|
+
const unstagedOutput = unstagedResult.exitCode === 0 ? unstagedResult.output : "";
|
|
35
|
+
const untrackedOutput = untrackedResult.exitCode === 0 ? untrackedResult.output : "";
|
|
36
|
+
const combinedOutput = stagedOutput +
|
|
37
|
+
(stagedOutput && unstagedOutput ? "\n" : "") +
|
|
38
|
+
unstagedOutput;
|
|
39
|
+
if (!combinedOutput.trim()) {
|
|
40
|
+
container.addChild(new Spacer(1));
|
|
41
|
+
container.addChild(new Markdown("No changes detected in the current directory.", {
|
|
42
|
+
customBgRgb: {
|
|
43
|
+
r: 52,
|
|
44
|
+
g: 53,
|
|
45
|
+
b: 65,
|
|
46
|
+
},
|
|
47
|
+
paddingX: 1,
|
|
48
|
+
paddingY: 1,
|
|
49
|
+
}));
|
|
50
|
+
tui.requestRender();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const fileChanges = parseGitDiffFiles(combinedOutput);
|
|
54
|
+
const untrackedFiles = await getUntrackedFiles(untrackedOutput, process.cwd());
|
|
55
|
+
fileChanges.push(...untrackedFiles);
|
|
56
|
+
if (fileChanges.length === 0) {
|
|
57
|
+
container.addChild(new Spacer(1));
|
|
58
|
+
container.addChild(new Markdown("No file changes could be parsed.", {
|
|
59
|
+
customBgRgb: {
|
|
60
|
+
r: 52,
|
|
61
|
+
g: 53,
|
|
62
|
+
b: 65,
|
|
63
|
+
},
|
|
64
|
+
paddingX: 1,
|
|
65
|
+
paddingY: 1,
|
|
66
|
+
}));
|
|
67
|
+
tui.requestRender();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const selectItems = fileChanges.map((file) => ({
|
|
71
|
+
value: file.fileName,
|
|
72
|
+
label: file.fileName,
|
|
73
|
+
description: file.stats,
|
|
74
|
+
}));
|
|
75
|
+
const selectList = new SelectList(selectItems, 10);
|
|
76
|
+
const selectContainer = new Container();
|
|
77
|
+
const { columns } = getTerminalSize();
|
|
78
|
+
selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
79
|
+
selectContainer.addChild(new Spacer(1));
|
|
80
|
+
selectContainer.addChild(selectList);
|
|
81
|
+
selectContainer.addChild(new Spacer(1));
|
|
82
|
+
selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
83
|
+
const originalEditor = editor;
|
|
84
|
+
inputContainer.clear();
|
|
85
|
+
inputContainer.addChild(selectContainer);
|
|
86
|
+
tui.setFocus(selectList);
|
|
87
|
+
selectList.onSelect = (selectedItem) => {
|
|
88
|
+
const selectedFile = fileChanges.find((file) => file.fileName === selectedItem.value);
|
|
89
|
+
if (!selectedFile) {
|
|
90
|
+
container.addChild(new Spacer(1));
|
|
91
|
+
container.addChild(new Markdown(style.red("Error: Selected file not found."), {
|
|
92
|
+
customBgRgb: {
|
|
93
|
+
r: 52,
|
|
94
|
+
g: 53,
|
|
95
|
+
b: 65,
|
|
96
|
+
},
|
|
97
|
+
paddingX: 1,
|
|
98
|
+
paddingY: 1,
|
|
99
|
+
}));
|
|
100
|
+
tui.requestRender();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const actionItems = [
|
|
104
|
+
{ value: "diff", label: "View diff", description: "Show changes" },
|
|
105
|
+
{
|
|
106
|
+
value: "edit",
|
|
107
|
+
label: "Open in editor",
|
|
108
|
+
description: `Open in ${process.env["EDITOR"] || process.env["VISUAL"] || "vi"}`,
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
const actionSelectList = new SelectList(actionItems, 5);
|
|
112
|
+
const actionContainer = new Container();
|
|
113
|
+
actionContainer.addChild(new Spacer(1));
|
|
114
|
+
actionContainer.addChild(new Text(style.blue(`Selected: ${selectedFile.fileName}`), 0, 0));
|
|
115
|
+
actionContainer.addChild(new Spacer(1));
|
|
116
|
+
actionContainer.addChild(actionSelectList);
|
|
117
|
+
actionContainer.addChild(new Spacer(1));
|
|
118
|
+
actionContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
119
|
+
inputContainer.clear();
|
|
120
|
+
inputContainer.addChild(actionContainer);
|
|
121
|
+
tui.setFocus(actionSelectList);
|
|
122
|
+
tui.requestRender();
|
|
123
|
+
actionSelectList.onSelect = (actionItem) => {
|
|
124
|
+
if (actionItem.value === "diff") {
|
|
125
|
+
container.addChild(new Spacer(1));
|
|
126
|
+
container.addChild(new Markdown(formatFileDiffForDisplay(selectedFile.fileName, selectedFile.diff), {
|
|
127
|
+
customBgRgb: {
|
|
128
|
+
r: 52,
|
|
129
|
+
g: 53,
|
|
130
|
+
b: 65,
|
|
131
|
+
},
|
|
132
|
+
paddingX: 1,
|
|
133
|
+
paddingY: 1,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
else if (actionItem.value === "edit") {
|
|
137
|
+
const filePath = join(process.cwd(), selectedFile.fileName);
|
|
138
|
+
const result = openFileInEditor(filePath, tui.getTerminal());
|
|
139
|
+
if (!result.success) {
|
|
140
|
+
container.addChild(new Spacer(1));
|
|
141
|
+
container.addChild(new Markdown(`Failed to open file in editor: ${result.error || "Unknown error"}`, {
|
|
142
|
+
customBgRgb: {
|
|
143
|
+
r: 52,
|
|
144
|
+
g: 53,
|
|
145
|
+
b: 65,
|
|
146
|
+
},
|
|
147
|
+
paddingX: 1,
|
|
148
|
+
paddingY: 1,
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
inputContainer.clear();
|
|
153
|
+
inputContainer.addChild(originalEditor);
|
|
154
|
+
tui.setFocus(originalEditor);
|
|
155
|
+
tui.requestRender();
|
|
156
|
+
};
|
|
157
|
+
actionSelectList.onCancel = () => {
|
|
158
|
+
inputContainer.clear();
|
|
159
|
+
inputContainer.addChild(selectContainer);
|
|
160
|
+
tui.setFocus(selectList);
|
|
161
|
+
tui.requestRender();
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
selectList.onCancel = () => {
|
|
165
|
+
inputContainer.clear();
|
|
166
|
+
inputContainer.addChild(originalEditor);
|
|
167
|
+
tui.setFocus(originalEditor);
|
|
168
|
+
tui.requestRender();
|
|
169
|
+
};
|
|
170
|
+
tui.requestRender();
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error("Error executing git diff:", error);
|
|
174
|
+
container.addChild(new Spacer(1));
|
|
175
|
+
container.addChild(new Markdown("Failed to retrieve git changes. Ensure git is installed and initialized.", {
|
|
176
|
+
customBgRgb: {
|
|
177
|
+
r: 52,
|
|
178
|
+
g: 53,
|
|
179
|
+
b: 65,
|
|
180
|
+
},
|
|
181
|
+
paddingX: 1,
|
|
182
|
+
paddingY: 1,
|
|
183
|
+
}));
|
|
184
|
+
tui.requestRender();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Terminal } from "../../tui/terminal.ts";
|
|
2
|
+
interface FileChange {
|
|
3
|
+
fileName: string;
|
|
4
|
+
diff: string;
|
|
5
|
+
stats: string;
|
|
6
|
+
}
|
|
2
7
|
export declare function parseGitDiffFiles(diffOutput: string): FileChange[];
|
|
3
8
|
export declare function formatFileDiffForDisplay(fileName: string, diff: string): string;
|
|
9
|
+
export declare function getUntrackedFiles(untrackedOutput: string, cwd: string): Promise<FileChange[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Open a file in the user's preferred editor ($EDITOR or $VISUAL)
|
|
12
|
+
*/
|
|
13
|
+
export declare function openFileInEditor(filePath: string, terminal: Terminal): {
|
|
14
|
+
success: boolean;
|
|
15
|
+
error?: string;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
4
18
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/review/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/review/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AA6CD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAwBlE;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,CAaR;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,EAAE,CAAC,CAsCvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBtC"}
|
|
@@ -1,87 +1,146 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
function isDiffContentLine(line) {
|
|
5
|
+
return ((line.startsWith("+") && !line.startsWith("+++")) ||
|
|
6
|
+
(line.startsWith("-") && !line.startsWith("---")) ||
|
|
7
|
+
line.startsWith(" ") ||
|
|
8
|
+
line.startsWith("index") ||
|
|
9
|
+
line.startsWith("old mode") ||
|
|
10
|
+
line.startsWith("new mode") ||
|
|
11
|
+
line.startsWith("deleted file") ||
|
|
12
|
+
line.startsWith("new file"));
|
|
13
|
+
}
|
|
14
|
+
function parseHunkStats(line, isNewFile) {
|
|
15
|
+
const statsMatch = line.match(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
|
|
16
|
+
if (!statsMatch) {
|
|
17
|
+
return "Additions: 1, Deletions: 0";
|
|
18
|
+
}
|
|
19
|
+
const deletions = isNewFile ? 0 : Number.parseInt(statsMatch[2], 10);
|
|
20
|
+
const additions = Number.parseInt(statsMatch[4], 10);
|
|
21
|
+
return `Additions: ${additions}, Deletions: ${deletions}`;
|
|
22
|
+
}
|
|
23
|
+
function startNewFile(state, line) {
|
|
24
|
+
if (state.currentFile) {
|
|
25
|
+
state.fileChanges.push(state.currentFile);
|
|
26
|
+
}
|
|
27
|
+
const fileMatch = line.match(/diff --git a\/(.*) b\/(.*)/);
|
|
28
|
+
if (!fileMatch)
|
|
29
|
+
return;
|
|
30
|
+
state.currentFile = { fileName: fileMatch[1], diff: "", stats: "" };
|
|
31
|
+
state.inDiff = true;
|
|
32
|
+
state.isNewFile =
|
|
33
|
+
fileMatch[1] === "/dev/null" || fileMatch[2] === "/dev/null";
|
|
34
|
+
}
|
|
1
35
|
export function parseGitDiffFiles(diffOutput) {
|
|
2
36
|
const lines = diffOutput.split("\n");
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
37
|
+
const state = {
|
|
38
|
+
fileChanges: [],
|
|
39
|
+
currentFile: null,
|
|
40
|
+
inDiff: false,
|
|
41
|
+
isNewFile: false,
|
|
42
|
+
};
|
|
7
43
|
for (const line of lines) {
|
|
8
44
|
if (line.startsWith("diff --git")) {
|
|
9
|
-
|
|
10
|
-
fileChanges.push(currentFile);
|
|
11
|
-
}
|
|
12
|
-
const fileMatch = line.match(/diff --git a\/(.*) b\/(.*)/);
|
|
13
|
-
if (fileMatch) {
|
|
14
|
-
currentFile = {
|
|
15
|
-
fileName: fileMatch[1],
|
|
16
|
-
diff: "",
|
|
17
|
-
stats: "",
|
|
18
|
-
};
|
|
19
|
-
inDiff = true;
|
|
20
|
-
isNewFile =
|
|
21
|
-
fileMatch[1] === "/dev/null" || fileMatch[2] === "/dev/null";
|
|
22
|
-
}
|
|
45
|
+
startNewFile(state, line);
|
|
23
46
|
}
|
|
24
|
-
else if (line.startsWith("@@")) {
|
|
25
|
-
|
|
26
|
-
if (statsMatch && currentFile) {
|
|
27
|
-
const deletions = Number.parseInt(statsMatch[2], 10);
|
|
28
|
-
const additions = Number.parseInt(statsMatch[4], 10);
|
|
29
|
-
const actualDeletions = isNewFile ? 0 : deletions;
|
|
30
|
-
currentFile.stats = `Additions: ${additions}, Deletions: ${actualDeletions}`;
|
|
31
|
-
}
|
|
32
|
-
else if (currentFile) {
|
|
33
|
-
currentFile.stats = "Additions: 1, Deletions: 0";
|
|
34
|
-
}
|
|
47
|
+
else if (line.startsWith("@@") && state.currentFile) {
|
|
48
|
+
state.currentFile.stats = parseHunkStats(line, state.isNewFile);
|
|
35
49
|
}
|
|
36
|
-
else if (inDiff && currentFile) {
|
|
37
|
-
|
|
38
|
-
(line.startsWith("-") && !line.startsWith("---")) ||
|
|
39
|
-
line.startsWith(" ") ||
|
|
40
|
-
line.startsWith("index") ||
|
|
41
|
-
line.startsWith("old mode") ||
|
|
42
|
-
line.startsWith("new mode") ||
|
|
43
|
-
line.startsWith("deleted file") ||
|
|
44
|
-
line.startsWith("new file")) {
|
|
45
|
-
currentFile.diff += `${line}\n`;
|
|
46
|
-
}
|
|
50
|
+
else if (state.inDiff && state.currentFile && isDiffContentLine(line)) {
|
|
51
|
+
state.currentFile.diff += `${line}\n`;
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
|
-
if (currentFile) {
|
|
50
|
-
fileChanges.push(currentFile);
|
|
54
|
+
if (state.currentFile) {
|
|
55
|
+
state.fileChanges.push(state.currentFile);
|
|
51
56
|
}
|
|
52
|
-
return fileChanges;
|
|
57
|
+
return state.fileChanges;
|
|
58
|
+
}
|
|
59
|
+
function formatDiffLine(line) {
|
|
60
|
+
if (line.trim() === "")
|
|
61
|
+
return null;
|
|
62
|
+
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
63
|
+
return `+${line.substring(1)}`;
|
|
64
|
+
}
|
|
65
|
+
if (line.startsWith("-") && !line.startsWith("---")) {
|
|
66
|
+
return `-${line.substring(1)}`;
|
|
67
|
+
}
|
|
68
|
+
if (line.startsWith(" ")) {
|
|
69
|
+
return ` ${line.substring(1)}`;
|
|
70
|
+
}
|
|
71
|
+
return line;
|
|
53
72
|
}
|
|
54
73
|
export function formatFileDiffForDisplay(fileName, diff) {
|
|
55
|
-
// Note: Cannot use style here as it's a UI concern - this is a display utility
|
|
56
74
|
const lines = diff.split("\n");
|
|
57
|
-
const formattedLines = [];
|
|
58
|
-
formattedLines.push(`### ${fileName}`);
|
|
59
|
-
formattedLines.push("");
|
|
75
|
+
const formattedLines = [`### ${fileName}`, "", "```diff"];
|
|
60
76
|
for (const line of lines) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
else if (line.startsWith("-") && !line.startsWith("---")) {
|
|
65
|
-
formattedLines.push(`-${line.substring(1)}`);
|
|
77
|
+
const formatted = formatDiffLine(line);
|
|
78
|
+
if (formatted !== null) {
|
|
79
|
+
formattedLines.push(formatted);
|
|
66
80
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
}
|
|
82
|
+
formattedLines.push("```");
|
|
83
|
+
return formattedLines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
export async function getUntrackedFiles(untrackedOutput, cwd) {
|
|
86
|
+
const fileChanges = [];
|
|
87
|
+
const untrackedFiles = untrackedOutput
|
|
88
|
+
.trim()
|
|
89
|
+
.split("\n")
|
|
90
|
+
.filter((file) => file.length > 0);
|
|
91
|
+
for (const fileName of untrackedFiles) {
|
|
92
|
+
try {
|
|
93
|
+
const filePath = join(cwd, fileName);
|
|
94
|
+
const fileContent = await fs.promises.readFile(filePath, "utf-8");
|
|
95
|
+
const lines = fileContent.split("\n").length;
|
|
96
|
+
// Create a diff-like representation for the untracked file
|
|
97
|
+
const diff = `diff --git a/${fileName} b/${fileName}
|
|
98
|
+
new file mode 100644
|
|
99
|
+
index 0000000..0000000
|
|
100
|
+
--- /dev/null
|
|
101
|
+
+++ b/${fileName}
|
|
102
|
+
@@ -0,0 +1,${lines} @@
|
|
103
|
+
${fileContent
|
|
104
|
+
.split("\n")
|
|
105
|
+
.map((line) => `+${line}`)
|
|
106
|
+
.join("\n")}
|
|
107
|
+
`;
|
|
108
|
+
fileChanges.push({
|
|
109
|
+
fileName,
|
|
110
|
+
diff,
|
|
111
|
+
stats: `Additions: ${lines}, Deletions: 0`,
|
|
112
|
+
});
|
|
79
113
|
}
|
|
80
|
-
|
|
114
|
+
catch (error) {
|
|
115
|
+
// Skip files that can't be read (e.g., directories, binary files)
|
|
116
|
+
console.error(`Failed to read untracked file: ${fileName}`, error);
|
|
81
117
|
}
|
|
82
|
-
|
|
83
|
-
|
|
118
|
+
}
|
|
119
|
+
return fileChanges;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Open a file in the user's preferred editor ($EDITOR or $VISUAL)
|
|
123
|
+
*/
|
|
124
|
+
export function openFileInEditor(filePath, terminal) {
|
|
125
|
+
const editor = process.env["EDITOR"] || process.env["VISUAL"] || "vi";
|
|
126
|
+
terminal.enterExternalMode();
|
|
127
|
+
try {
|
|
128
|
+
const result = spawnSync(editor, [filePath], {
|
|
129
|
+
stdio: "inherit",
|
|
130
|
+
});
|
|
131
|
+
if (result.error) {
|
|
132
|
+
return { success: false, error: result.error.message };
|
|
84
133
|
}
|
|
134
|
+
// Note: Editors often exit with non-zero codes (e.g., :cq in vim, or when
|
|
135
|
+
// quitting without saving). We only treat spawn errors as failures, not
|
|
136
|
+
// exit codes, since the user may intentionally exit with an error code.
|
|
137
|
+
return { success: true };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
141
|
+
return { success: false, error: errorMessage };
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
terminal.exitExternalMode();
|
|
85
145
|
}
|
|
86
|
-
return formattedLines.join("\n");
|
|
87
146
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { CommandOptions, ReplCommand } from "../types.ts";
|
|
2
|
-
export declare function sessionCommand({ config, tokenCounter, modelManager, sessionManager
|
|
2
|
+
export declare function sessionCommand({ config, tokenCounter, modelManager, sessionManager, workspace, tokenTracker, }: CommandOptions): ReplCommand;
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoH/D,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,YAAY,GACb,EAAE,cAAc,GAAG,WAAW,CAgK9B"}
|