aiwcli 0.15.5 → 0.17.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 +108 -1124
- package/bin/run.js +0 -4
- package/dist/capabilities/branch/adapters.d.ts +2 -0
- package/dist/capabilities/branch/adapters.js +21 -0
- package/dist/capabilities/branch/contracts.d.ts +57 -0
- package/dist/capabilities/branch/contracts.js +1 -0
- package/dist/capabilities/branch/control-plane.d.ts +2 -0
- package/dist/capabilities/branch/control-plane.js +343 -0
- package/dist/capabilities/branch/runtime-core.d.ts +5 -0
- package/dist/capabilities/branch/runtime-core.js +36 -0
- package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
- package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
- package/dist/capabilities/installation/control-plane/clear-command.d.ts +162 -0
- package/dist/capabilities/installation/control-plane/clear-command.js +1249 -0
- package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
- package/dist/capabilities/installation/control-plane/init-command.js +449 -0
- package/dist/capabilities/launch/contracts.d.ts +86 -0
- package/dist/capabilities/launch/contracts.js +1 -0
- package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
- package/dist/capabilities/launch/control-plane/execute-launch.js +261 -0
- package/dist/capabilities/launch/runtime-core/launch-decisions.d.ts +82 -0
- package/dist/capabilities/launch/runtime-core/launch-decisions.js +202 -0
- package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
- package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
- package/dist/cli/base-command.d.ts +18 -0
- package/dist/cli/base-command.js +55 -0
- package/dist/commands/branch.d.ts +1 -21
- package/dist/commands/branch.js +25 -417
- package/dist/commands/clean.d.ts +1 -41
- package/dist/commands/clean.js +1 -196
- package/dist/commands/clear.d.ts +1 -161
- package/dist/commands/clear.js +1 -1121
- package/dist/commands/init/index.d.ts +1 -98
- package/dist/commands/init/index.js +4 -478
- package/dist/commands/launch.d.ts +32 -12
- package/dist/commands/launch.js +107 -166
- package/dist/lib/claude-settings-types.d.ts +31 -19
- package/dist/lib/config.js +1 -2
- package/dist/lib/context/context-formatter.d.ts +74 -0
- package/dist/lib/context/context-formatter.js +493 -0
- package/dist/lib/context/context-selector.d.ts +42 -0
- package/dist/lib/context/context-selector.js +451 -0
- package/dist/lib/context/context-store.d.ts +100 -0
- package/dist/lib/context/context-store.js +644 -0
- package/dist/lib/context/plan-manager.d.ts +54 -0
- package/dist/lib/context/plan-manager.js +282 -0
- package/dist/lib/context/task-tracker.d.ts +44 -0
- package/dist/lib/context/task-tracker.js +146 -0
- package/dist/lib/core-ide-base.d.ts +4 -0
- package/dist/lib/core-ide-base.js +77 -0
- package/dist/lib/core-installer.d.ts +5 -0
- package/dist/lib/core-installer.js +33 -0
- package/dist/lib/debug.d.ts +0 -10
- package/dist/lib/debug.js +0 -10
- package/dist/lib/env-sanitizer.d.ts +25 -0
- package/dist/lib/env-sanitizer.js +46 -0
- package/dist/lib/errors.d.ts +0 -13
- package/dist/lib/errors.js +0 -15
- package/dist/lib/git-exclude-manager.d.ts +2 -2
- package/dist/lib/git-exclude-manager.js +3 -3
- package/dist/lib/hooks/context-monitor-logic.d.ts +6 -0
- package/dist/lib/hooks/context-monitor-logic.js +25 -0
- package/dist/lib/hooks/hook-utils.d.ts +143 -0
- package/dist/lib/hooks/hook-utils.js +620 -0
- package/dist/lib/hooks/prompt-binding-logic.d.ts +7 -0
- package/dist/lib/hooks/prompt-binding-logic.js +50 -0
- package/dist/lib/hooks/session-end-logic.d.ts +5 -0
- package/dist/lib/hooks/session-end-logic.js +51 -0
- package/dist/lib/hooks-merger.js +25 -19
- package/dist/lib/ide-path-resolver.d.ts +19 -7
- package/dist/lib/ide-path-resolver.js +25 -9
- package/dist/lib/install-state.d.ts +34 -0
- package/dist/lib/install-state.js +154 -0
- package/dist/lib/json-io.d.ts +12 -0
- package/dist/lib/json-io.js +30 -0
- package/dist/lib/lsp-patch.d.ts +12 -0
- package/dist/lib/lsp-patch.js +156 -0
- package/dist/lib/multiplexer.d.ts +65 -0
- package/dist/lib/multiplexer.js +38 -0
- package/dist/lib/multiplexers/psmux.d.ts +55 -0
- package/dist/lib/multiplexers/psmux.js +324 -0
- package/dist/lib/multiplexers/tmux.d.ts +36 -0
- package/dist/lib/multiplexers/tmux.js +221 -0
- package/dist/lib/multiplexers/wezterm.d.ts +38 -0
- package/dist/lib/multiplexers/wezterm.js +225 -0
- package/dist/lib/mux-utils.d.ts +6 -0
- package/dist/lib/mux-utils.js +36 -0
- package/dist/lib/paths.d.ts +2 -2
- package/dist/lib/paths.js +2 -2
- package/dist/lib/platform-commands.d.ts +27 -0
- package/dist/lib/platform-commands.js +49 -0
- package/dist/lib/prompt-file-manager.d.ts +23 -0
- package/dist/lib/prompt-file-manager.js +41 -0
- package/dist/lib/runtime/agent-launcher.d.ts +67 -0
- package/dist/lib/runtime/agent-launcher.js +262 -0
- package/dist/lib/runtime/aiw-cli.d.ts +39 -0
- package/dist/lib/runtime/aiw-cli.js +76 -0
- package/dist/lib/runtime/atomic-write.d.ts +19 -0
- package/dist/lib/runtime/atomic-write.js +121 -0
- package/dist/lib/runtime/cli-args.d.ts +58 -0
- package/dist/lib/runtime/cli-args.js +200 -0
- package/dist/lib/runtime/constants.d.ts +56 -0
- package/dist/lib/runtime/constants.js +230 -0
- package/dist/lib/runtime/executable-policy.d.ts +16 -0
- package/dist/lib/runtime/executable-policy.js +57 -0
- package/dist/lib/runtime/git-state.d.ts +9 -0
- package/dist/lib/runtime/git-state.js +59 -0
- package/dist/lib/runtime/inference.d.ts +37 -0
- package/dist/lib/runtime/inference.js +251 -0
- package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
- package/dist/lib/runtime/lint-dispatch.js +285 -0
- package/dist/lib/runtime/logger.d.ts +66 -0
- package/dist/lib/runtime/logger.js +201 -0
- package/dist/lib/runtime/models.d.ts +20 -0
- package/dist/lib/runtime/models.js +20 -0
- package/dist/lib/runtime/platform-adapter.d.ts +7 -0
- package/dist/lib/runtime/platform-adapter.js +21 -0
- package/dist/lib/runtime/preflight.d.ts +24 -0
- package/dist/lib/runtime/preflight.js +65 -0
- package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
- package/dist/lib/runtime/sentinel-ipc.js +67 -0
- package/dist/lib/runtime/state-io.d.ts +31 -0
- package/dist/lib/runtime/state-io.js +179 -0
- package/dist/lib/runtime/stop-words.d.ts +20 -0
- package/dist/lib/runtime/stop-words.js +150 -0
- package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
- package/dist/lib/runtime/subprocess-utils.js +96 -0
- package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
- package/dist/lib/runtime/tmux-preflight.js +78 -0
- package/dist/lib/runtime/utils.d.ts +62 -0
- package/dist/lib/runtime/utils.js +192 -0
- package/dist/lib/schemas.d.ts +250 -0
- package/dist/lib/schemas.js +216 -0
- package/dist/lib/sentinel-manager.d.ts +32 -0
- package/dist/lib/sentinel-manager.js +62 -0
- package/dist/lib/sentinel-wrapper.d.ts +10 -0
- package/dist/lib/sentinel-wrapper.js +29 -0
- package/dist/lib/settings-hierarchy.js +3 -20
- package/dist/lib/shell-adapters/bash-adapter.d.ts +18 -0
- package/dist/lib/shell-adapters/bash-adapter.js +69 -0
- package/dist/lib/shell-adapters/index.d.ts +5 -0
- package/dist/lib/shell-adapters/index.js +7 -0
- package/dist/lib/shell-adapters/powershell-adapter.d.ts +18 -0
- package/dist/lib/shell-adapters/powershell-adapter.js +62 -0
- package/dist/lib/shell-adapters/shell-adapter.d.ts +45 -0
- package/dist/lib/shell-adapters/shell-adapter.js +5 -0
- package/dist/lib/shell-quoting.d.ts +5 -0
- package/dist/lib/shell-quoting.js +17 -0
- package/dist/lib/spawn-errors.d.ts +9 -0
- package/dist/lib/spawn-errors.js +29 -0
- package/dist/lib/spawn.js +5 -11
- package/dist/lib/spinner.d.ts +0 -5
- package/dist/lib/spinner.js +0 -16
- package/dist/lib/template-installer.d.ts +14 -5
- package/dist/lib/template-installer.js +40 -38
- package/dist/lib/template-resolver.d.ts +6 -7
- package/dist/lib/template-resolver.js +26 -21
- package/dist/lib/template-settings-reconstructor.d.ts +7 -2
- package/dist/lib/template-settings-reconstructor.js +76 -45
- package/dist/lib/terminal-strategy.d.ts +12 -0
- package/dist/lib/terminal-strategy.js +55 -0
- package/dist/lib/terminal.d.ts +34 -4
- package/dist/lib/terminal.js +192 -119
- package/dist/lib/tmux-pane-placement.d.ts +17 -0
- package/dist/lib/tmux-pane-placement.js +58 -0
- package/dist/lib/tmux-primitives.d.ts +3 -0
- package/dist/lib/tmux-primitives.js +11 -0
- package/dist/lib/tmux-session.d.ts +32 -0
- package/dist/lib/tmux-session.js +87 -0
- package/dist/lib/tty-detection.js +1 -1
- package/dist/lib/types.d.ts +168 -0
- package/dist/lib/types.js +6 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/lib/windsurf-hooks-hierarchy.js +6 -23
- package/dist/platform/launch.d.ts +11 -0
- package/dist/platform/launch.js +11 -0
- package/dist/templates/CLAUDE.md +30 -40
- package/dist/templates/cc-native/.claude/settings.json +26 -36
- package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +20 -12
- package/dist/templates/cc-native/_cc-native/cc-native.config.json +2 -6
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +39 -59
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +9 -11
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +4 -5
- package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +4 -4
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -27
- package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +7 -7
- package/dist/templates/cc-native/_cc-native/lib-ts/.mocharc.json +9 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/aggregate-agents.test.ts +118 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/artifacts.test.ts +234 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cc-native-state.test.ts +170 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cli-output-parser.test.ts +73 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/config.test.ts +64 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/constants.test.ts +40 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/debug.test.ts +42 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/exports.test.ts +58 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/helpers.ts +107 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/add-plan-context.hook.test.ts +97 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-questions.hook.test.ts +81 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-review.hook.test.ts +71 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/json-parser.test.ts +99 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts +288 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator.test.ts +48 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/reviewers.test.ts +32 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/state.test.ts +124 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/verdict.test.ts +93 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +6 -14
- package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/format.ts +597 -599
- package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/index.ts +26 -26
- package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/tracker.ts +106 -107
- package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/write.ts +118 -119
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +17 -16
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +132 -10
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +6 -6
- package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +2 -3
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/graduation.ts +132 -132
- package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +88 -86
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +5 -6
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/orchestrator.ts +70 -70
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/output-builder.ts +130 -121
- package/dist/templates/cc-native/_cc-native/lib-ts/package-lock.json +1679 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/package.json +24 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +5 -5
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +1 -6
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/plan-questions.ts +101 -101
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/review-pipeline.ts +511 -543
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/__tests__/agent-providers.test.ts +262 -0
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/agent.ts +71 -85
- package/dist/templates/{_shared/lib-ts/agent-exec → cc-native/_cc-native/lib-ts/reviewers/base}/base-agent.ts +138 -150
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/index.ts +12 -12
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/claude-agent.ts +66 -57
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/codex-agent.ts +185 -200
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/gemini-agent.ts +39 -40
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/orchestrator-claude-agent.ts +196 -225
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/schemas.ts +201 -201
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/types.ts +21 -23
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/hyde.test.ts +365 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/ollama-client.test.ts +223 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +12 -16
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +3 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +31 -31
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +7 -8
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +7 -9
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +16 -19
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +37 -41
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +33 -43
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +20 -20
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +9 -10
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +3 -4
- package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +50 -126
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +20 -22
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +14 -89
- package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/verdict.ts +72 -72
- package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +38 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
- package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
- package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +38 -16
- package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
- package/dist/templates/cc-native/_cc-native/scripts/council_debate.ts +242 -0
- package/dist/templates/cc-native/_cc-native/scripts/council_debate_simple.ts +294 -0
- package/dist/templates/cc-native/_cc-native/{plan-review/workflows → workflows}/specdev.md +9 -9
- package/dist/templates/core/.claude/skills/codex/SKILL.md +25 -0
- package/dist/templates/core/.claude/skills/devin/SKILL.md +25 -0
- package/dist/templates/core/.claude/skills/handoff/SKILL.md +11 -0
- package/dist/templates/core/.claude/skills/handoff-resume/SKILL.md +11 -0
- package/dist/templates/core/.claude/skills/meta-plan/SKILL.md +13 -0
- package/dist/templates/core/.codex/skills/codex/SKILL.md +13 -0
- package/dist/templates/core/.codex/skills/devin/SKILL.md +19 -0
- package/dist/templates/core/.codex/skills/handoff/SKILL.md +11 -0
- package/dist/templates/core/.codex/skills/handoff-resume/SKILL.md +11 -0
- package/dist/templates/core/.codex/skills/meta-plan/SKILL.md +13 -0
- package/dist/templates/core/.devin/AGENTS.md +5 -0
- package/dist/templates/core/.devin/config.json +12 -0
- package/dist/templates/core/.devin/skills/codex/SKILL.md +19 -0
- package/dist/templates/core/.devin/skills/devin/SKILL.md +13 -0
- package/dist/templates/core/.devin/skills/handoff/SKILL.md +11 -0
- package/dist/templates/core/.devin/skills/handoff-resume/SKILL.md +11 -0
- package/dist/templates/core/.devin/skills/meta-plan/SKILL.md +13 -0
- package/dist/templates/core/.windsurf/workflows/handoff-resume.md +9 -0
- package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
- package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
- package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
- package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +15 -44
- package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
- package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
- package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +5 -22
- package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
- package/dist/templates/core/hooks-ts/pre_compact.ts +36 -0
- package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
- package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
- package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
- package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
- package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
- package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
- package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
- package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
- package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
- package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +59 -20
- package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
- package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
- package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +179 -41
- package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
- package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +82 -0
- package/dist/templates/core/lib-ts/package.json +19 -0
- package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +369 -0
- package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +108 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +24 -8
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
- package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +60 -23
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +9 -2
- package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
- package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +20 -11
- package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
- package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
- package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
- package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +34 -4
- package/dist/templates/core/lib-ts/schemas.ts +233 -0
- package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
- package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
- package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
- package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
- package/dist/templates/core/scripts/resolve-run.ts +93 -0
- package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
- package/dist/templates/{_shared → core}/scripts/status_line.ts +26 -21
- package/dist/templates/core/skills/codex/CLAUDE.md +83 -0
- package/dist/templates/{_shared → core}/skills/codex/SKILL.md +27 -18
- package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +79 -113
- package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +134 -148
- package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
- package/dist/templates/core/skills/devin/CLAUDE.md +122 -0
- package/dist/templates/core/skills/devin/SKILL.md +73 -0
- package/dist/templates/core/skills/devin/lib/devin-watcher.ts +300 -0
- package/dist/templates/core/skills/devin/scripts/launch-devin.ts +258 -0
- package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
- package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
- package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
- package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
- package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
- package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
- package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
- package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
- package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
- package/oclif.manifest.json +89 -13
- package/package.json +13 -12
- package/dist/lib/base-command.d.ts +0 -114
- package/dist/lib/base-command.js +0 -153
- package/dist/lib/env-compat.d.ts +0 -18
- package/dist/lib/env-compat.js +0 -23
- package/dist/lib/stdin.d.ts +0 -48
- package/dist/lib/stdin.js +0 -60
- package/dist/templates/_shared/.claude/settings.json +0 -120
- package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
- package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
- package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
- package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
- package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
- package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
- package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
- package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
- package/dist/templates/_shared/hooks-ts/pre_compact.ts +0 -49
- package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
- package/dist/templates/_shared/lib-ts/agent-exec/backends/headless.ts +0 -33
- package/dist/templates/_shared/lib-ts/agent-exec/backends/index.ts +0 -6
- package/dist/templates/_shared/lib-ts/agent-exec/backends/tmux.ts +0 -119
- package/dist/templates/_shared/lib-ts/agent-exec/execution-backend.ts +0 -50
- package/dist/templates/_shared/lib-ts/agent-exec/index.ts +0 -6
- package/dist/templates/_shared/lib-ts/agent-exec/structured-output.ts +0 -166
- package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
- package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
- package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
- package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
- package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
- package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
- package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
- package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
- package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
- package/dist/templates/_shared/lib-ts/package.json +0 -20
- package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
- package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
- package/dist/templates/cc-native/_cc-native/CLAUDE.md +0 -73
- package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +0 -64
- package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +0 -70
- package/dist/templates/cc-native/_cc-native/plan-review/CODING-STANDARDS-CHECKLIST.md +0 -75
- package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +0 -143
- package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +0 -213
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +0 -70
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +0 -62
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +0 -61
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +0 -62
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +0 -56
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +0 -53
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +0 -66
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +0 -70
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +0 -62
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +0 -72
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +0 -61
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +0 -64
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +0 -56
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +0 -86
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +0 -59
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +0 -58
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +0 -66
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +0 -62
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +0 -66
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +0 -71
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +0 -74
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +0 -77
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +0 -62
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +0 -68
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +0 -61
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +0 -71
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +0 -61
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +0 -61
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +0 -67
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +0 -65
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +0 -74
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +0 -69
- package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +0 -172
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +0 -7
package/dist/lib/terminal.js
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* ## Supported Platforms
|
|
8
8
|
* - **Windows**: Windows Terminal (wt.exe) with PowerShell 7 (pwsh) fallback to PowerShell 5.1
|
|
9
|
-
* - **macOS**: Terminal.app via
|
|
9
|
+
* - **macOS**: Terminal.app via `open` + temporary `.command` script
|
|
10
10
|
* - **WSL**: Windows Terminal (wt.exe) via wsl.exe, falls back to Linux emulators
|
|
11
|
-
* - **Linux**: gnome-terminal, konsole, xterm
|
|
11
|
+
* - **Linux**: x-terminal-emulator, gnome-terminal, konsole, xterm (in order of preference)
|
|
12
12
|
*
|
|
13
13
|
* ## Usage
|
|
14
14
|
* ```typescript
|
|
@@ -27,38 +27,77 @@
|
|
|
27
27
|
*
|
|
28
28
|
* @module lib/terminal
|
|
29
29
|
*/
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
30
|
+
import { spawn } from 'node:child_process';
|
|
31
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
32
|
+
import { tmpdir } from 'node:os';
|
|
33
|
+
import path from 'node:path';
|
|
34
|
+
import { sanitizedProcessEnv as cleanClaudeEnv } from './env-sanitizer.js';
|
|
35
|
+
import { isCommandAvailable } from './runtime/executable-policy.js';
|
|
36
|
+
import { isWindowsPlatform } from './runtime/platform-adapter.js';
|
|
37
|
+
import { findMsysBash } from './runtime/tmux-preflight.js';
|
|
38
|
+
import { escapeSingleQuotedPath } from './shell-quoting.js';
|
|
39
|
+
import { defaultShell, detectPowerShell, findAvailableLinuxTerminal, isWSL, resolveWindowsTerminalStrategy, } from './terminal-strategy.js';
|
|
40
|
+
/** @internal */
|
|
41
|
+
export function resolveTerminalPlatform(platform, isWSLResult) {
|
|
42
|
+
if (isWindowsPlatform(platform))
|
|
43
|
+
return 'windows';
|
|
44
|
+
if (platform === 'darwin')
|
|
45
|
+
return 'darwin';
|
|
46
|
+
if (isWSLResult)
|
|
47
|
+
return 'wsl';
|
|
48
|
+
return 'linux';
|
|
47
49
|
}
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
50
|
+
/** @internal */
|
|
51
|
+
export function buildMacTerminalScriptContent(cwd, command, shellPath = defaultShell()) {
|
|
52
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
|
|
53
|
+
const escapedShell = escapeSingleQuotedPath(shellPath, 'bash');
|
|
54
|
+
const fullCommand = `cd '${escapedPath}' && ${command}; exec '${escapedShell}' -l`;
|
|
55
|
+
const escapedCommand = escapeSingleQuotedPath(fullCommand, 'bash');
|
|
56
|
+
return `#!/bin/sh
|
|
57
|
+
exec '${escapedShell}' -lc '${escapedCommand}'
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
/** @internal */
|
|
61
|
+
export function buildMacTerminalSpawnArgs(scriptPath) {
|
|
62
|
+
return {
|
|
63
|
+
command: 'open',
|
|
64
|
+
args: ['-a', 'Terminal', scriptPath],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** @internal */
|
|
68
|
+
export function buildWindowsTerminalSpawnArgs(cwd, command, powershellCmd) {
|
|
69
|
+
return {
|
|
70
|
+
command: 'wt',
|
|
71
|
+
args: ['-d', cwd, powershellCmd, '-NoExit', '-Command', command],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** @internal */
|
|
75
|
+
export function buildPowerShellFallbackSpawnArgs(cwd, command, powershellCmd) {
|
|
76
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'powershell');
|
|
77
|
+
const psCommand = `Start-Process ${powershellCmd} -ArgumentList '-NoExit','-Command',"cd '${escapedPath}'; ${command}"`;
|
|
78
|
+
return {
|
|
79
|
+
command: powershellCmd,
|
|
80
|
+
args: ['-Command', psCommand],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** @internal */
|
|
84
|
+
export function buildLinuxTerminalSpawnArgs(cwd, command, terminalInfo) {
|
|
85
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
|
|
86
|
+
const fullCommand = `cd '${escapedPath}' && ${command}`;
|
|
87
|
+
return {
|
|
88
|
+
command: terminalInfo.cmd,
|
|
89
|
+
args: terminalInfo.getArgs(fullCommand),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** @internal */
|
|
93
|
+
export function buildWSLTerminalSpawnArgs(cwd, command) {
|
|
94
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
|
|
95
|
+
const shell = defaultShell();
|
|
96
|
+
const shellCmd = `cd '${escapedPath}' && ${command}; exec ${shell}`;
|
|
97
|
+
return {
|
|
98
|
+
command: 'wt.exe',
|
|
99
|
+
args: ['wsl.exe', '--', shell, '-c', shellCmd],
|
|
100
|
+
};
|
|
62
101
|
}
|
|
63
102
|
/**
|
|
64
103
|
* Launch PowerShell fallback when Windows Terminal is not available.
|
|
@@ -70,13 +109,12 @@ function detectPowerShell() {
|
|
|
70
109
|
*/
|
|
71
110
|
async function launchPowerShellFallback(cwd, command, powershellCmd, debugLog) {
|
|
72
111
|
return new Promise((resolve) => {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const terminal = spawn(powershellCmd, ['-Command', psCommand], {
|
|
112
|
+
const spawnArgs = buildPowerShellFallbackSpawnArgs(cwd, command, powershellCmd);
|
|
113
|
+
debugLog?.(`Launching PowerShell fallback with command: ${spawnArgs.args[1]}`);
|
|
114
|
+
const terminal = spawn(spawnArgs.command, spawnArgs.args, {
|
|
77
115
|
detached: true,
|
|
78
116
|
stdio: 'ignore',
|
|
79
|
-
env:
|
|
117
|
+
env: cleanClaudeEnv(),
|
|
80
118
|
});
|
|
81
119
|
terminal.on('error', (err) => {
|
|
82
120
|
resolve({ success: false, error: `Failed to launch PowerShell: ${err.message}` });
|
|
@@ -90,52 +128,121 @@ async function launchPowerShellFallback(cwd, command, powershellCmd, debugLog) {
|
|
|
90
128
|
*
|
|
91
129
|
* @param cwd - Working directory
|
|
92
130
|
* @param command - Command to execute
|
|
131
|
+
* @param shellPreference - Preferred shell for Windows launches
|
|
93
132
|
* @param debugLog - Optional debug logging function
|
|
94
133
|
*/
|
|
95
|
-
async function launchWindowsTerminal(cwd, command, debugLog) {
|
|
96
|
-
const powershellCmd = detectPowerShell();
|
|
97
|
-
debugLog?.(`Detected PowerShell: ${powershellCmd}`);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
134
|
+
async function launchWindowsTerminal(cwd, command, shellPreference, debugLog) {
|
|
135
|
+
const powershellCmd = detectPowerShell(isCommandAvailable);
|
|
136
|
+
debugLog?.(`Detected PowerShell: ${powershellCmd}; shell preference: ${shellPreference}`);
|
|
137
|
+
const gitBashPath = findMsysBash();
|
|
138
|
+
const minttyPath = gitBashPath
|
|
139
|
+
? path.join(path.dirname(gitBashPath), 'mintty.exe')
|
|
140
|
+
: null;
|
|
141
|
+
const hasMintty = Boolean(minttyPath && existsSync(minttyPath));
|
|
142
|
+
const strategyOrder = resolveWindowsTerminalStrategy(shellPreference, gitBashPath, hasMintty, powershellCmd);
|
|
143
|
+
const tryStrategy = async (strategy) => {
|
|
144
|
+
if (strategy === 'powershell-fallback') {
|
|
145
|
+
debugLog?.('Using PowerShell fallback launcher');
|
|
146
|
+
return launchPowerShellFallback(cwd, command, powershellCmd, debugLog);
|
|
147
|
+
}
|
|
148
|
+
if (strategy === 'mintty') {
|
|
149
|
+
if (!minttyPath || !gitBashPath) {
|
|
150
|
+
return { success: false, error: 'mintty or Git Bash not found' };
|
|
111
151
|
}
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
|
|
153
|
+
const bashCmd = `cd '${escapedPath}' && ${command}; exec bash`;
|
|
154
|
+
debugLog?.(`Using mintty for Windows terminal: ${minttyPath}`);
|
|
155
|
+
return new Promise((resolve) => {
|
|
156
|
+
const terminal = spawn(minttyPath, [gitBashPath, '-lc', bashCmd], {
|
|
157
|
+
detached: true,
|
|
158
|
+
stdio: 'ignore',
|
|
159
|
+
env: cleanClaudeEnv(),
|
|
160
|
+
windowsHide: true,
|
|
161
|
+
});
|
|
162
|
+
terminal.on('error', (err) => {
|
|
163
|
+
resolve({ success: false, error: `mintty launch failed: ${err.message}` });
|
|
164
|
+
});
|
|
165
|
+
terminal.unref();
|
|
166
|
+
resolve({ success: true });
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (strategy === 'git-bash-in-wt') {
|
|
170
|
+
if (!gitBashPath) {
|
|
171
|
+
return { success: false, error: 'Git Bash not found' };
|
|
114
172
|
}
|
|
173
|
+
const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
|
|
174
|
+
const bashCmd = `cd '${escapedPath}' && ${command}; exec bash`;
|
|
175
|
+
debugLog?.(`Using Git Bash for Windows terminal: ${gitBashPath}`);
|
|
176
|
+
return new Promise((resolve) => {
|
|
177
|
+
const terminal = spawn('wt', ['-d', cwd, gitBashPath, '-lc', bashCmd], {
|
|
178
|
+
detached: true,
|
|
179
|
+
stdio: 'ignore',
|
|
180
|
+
env: cleanClaudeEnv(),
|
|
181
|
+
});
|
|
182
|
+
terminal.on('error', (err) => {
|
|
183
|
+
resolve({ success: false, error: `Git Bash launch via wt failed: ${err.message}` });
|
|
184
|
+
});
|
|
185
|
+
terminal.unref();
|
|
186
|
+
resolve({ success: true });
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
debugLog?.('Using Windows Terminal with PowerShell');
|
|
190
|
+
return new Promise((resolve) => {
|
|
191
|
+
const spawnArgs = buildWindowsTerminalSpawnArgs(cwd, command, powershellCmd);
|
|
192
|
+
const terminal = spawn(spawnArgs.command, spawnArgs.args, {
|
|
193
|
+
detached: true,
|
|
194
|
+
stdio: 'ignore',
|
|
195
|
+
env: cleanClaudeEnv(),
|
|
196
|
+
});
|
|
197
|
+
terminal.on('error', (err) => {
|
|
198
|
+
resolve({ success: false, error: `Failed to launch terminal: ${err.message}` });
|
|
199
|
+
});
|
|
200
|
+
terminal.unref();
|
|
201
|
+
resolve({ success: true });
|
|
115
202
|
});
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
203
|
+
};
|
|
204
|
+
const tryStrategies = async (index = 0) => {
|
|
205
|
+
const strategy = strategyOrder[index];
|
|
206
|
+
if (!strategy) {
|
|
207
|
+
return { success: false, error: 'Failed to launch Windows terminal with all available strategies' };
|
|
208
|
+
}
|
|
209
|
+
const result = await tryStrategy(strategy);
|
|
210
|
+
if (result.success)
|
|
211
|
+
return result;
|
|
212
|
+
debugLog?.(`Strategy ${strategy} failed: ${result.error}`);
|
|
213
|
+
return tryStrategies(index + 1);
|
|
214
|
+
};
|
|
215
|
+
return tryStrategies();
|
|
119
216
|
}
|
|
120
217
|
/**
|
|
121
|
-
* Launch macOS Terminal.app with command.
|
|
218
|
+
* Launch macOS Terminal.app with a temporary `.command` script.
|
|
219
|
+
*
|
|
220
|
+
* Avoids AppleScript/Automation prompts by delegating to `open(1)` instead of
|
|
221
|
+
* sending Apple Events to Terminal.app.
|
|
122
222
|
*
|
|
123
223
|
* @param cwd - Working directory
|
|
124
224
|
* @param command - Command to execute
|
|
125
225
|
* @param debugLog - Optional debug logging function
|
|
126
226
|
*/
|
|
127
227
|
async function launchMacTerminal(cwd, command, debugLog) {
|
|
228
|
+
const scriptPath = path.join(tmpdir(), `aiwcli-terminal-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.command`);
|
|
229
|
+
try {
|
|
230
|
+
writeFileSync(scriptPath, buildMacTerminalScriptContent(cwd, command), {
|
|
231
|
+
encoding: 'utf8',
|
|
232
|
+
mode: 0o700,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
237
|
+
return { success: false, error: `Failed to prepare Terminal launch script: ${message}` };
|
|
238
|
+
}
|
|
128
239
|
return new Promise((resolve) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
// Escape double quotes and backslashes for AppleScript context
|
|
133
|
-
const escapedCommand = fullCommand.replaceAll('\\', '\\\\').replaceAll('"', String.raw `\"`);
|
|
134
|
-
debugLog?.(`Launching macOS Terminal with command: ${fullCommand}`);
|
|
135
|
-
const terminal = spawn('osascript', ['-e', `tell application "Terminal" to do script "${escapedCommand}"`], {
|
|
240
|
+
const spawnArgs = buildMacTerminalSpawnArgs(scriptPath);
|
|
241
|
+
debugLog?.(`Launching macOS Terminal with script: ${scriptPath}`);
|
|
242
|
+
const terminal = spawn(spawnArgs.command, spawnArgs.args, {
|
|
136
243
|
detached: true,
|
|
137
244
|
stdio: 'ignore',
|
|
138
|
-
env:
|
|
245
|
+
env: cleanClaudeEnv(),
|
|
139
246
|
});
|
|
140
247
|
terminal.on('error', (err) => {
|
|
141
248
|
resolve({ success: false, error: `Failed to launch Terminal.app: ${err.message}` });
|
|
@@ -145,55 +252,23 @@ async function launchMacTerminal(cwd, command, debugLog) {
|
|
|
145
252
|
});
|
|
146
253
|
}
|
|
147
254
|
/**
|
|
148
|
-
*
|
|
149
|
-
*/
|
|
150
|
-
const LINUX_TERMINALS = [
|
|
151
|
-
{ cmd: 'gnome-terminal', getArgs: (command) => ['--', 'bash', '-c', `${command}; exec bash`] },
|
|
152
|
-
{ cmd: 'konsole', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
|
|
153
|
-
{ cmd: 'xterm', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
|
|
154
|
-
{ cmd: 'x-terminal-emulator', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
|
|
155
|
-
];
|
|
156
|
-
/**
|
|
157
|
-
* Find the first available Linux terminal emulator.
|
|
158
|
-
* Checks gnome-terminal, konsole, xterm, x-terminal-emulator in order.
|
|
255
|
+
* Launch Windows Terminal (wt.exe) from WSL, running the command inside a new shell session.
|
|
159
256
|
*
|
|
160
|
-
*
|
|
161
|
-
|
|
162
|
-
function findAvailableLinuxTerminal() {
|
|
163
|
-
for (const terminal of LINUX_TERMINALS) {
|
|
164
|
-
try {
|
|
165
|
-
execSync(`which ${terminal.cmd}`, { stdio: 'ignore' });
|
|
166
|
-
return terminal;
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
// Terminal not found, try next
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
function isWSL() {
|
|
176
|
-
return Boolean(process.env['WSL_DISTRO_NAME']);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Launch Windows Terminal (wt.exe) from WSL, running the command inside a new bash session.
|
|
180
|
-
*
|
|
181
|
-
* Uses wt.exe → wsl.exe → bash so the new terminal inherits the correct WSL distro.
|
|
182
|
-
* Claude Code nesting-detection vars are stripped via cleanTerminalEnv().
|
|
257
|
+
* Uses wt.exe → wsl.exe → $SHELL so the new terminal inherits the correct WSL distro.
|
|
258
|
+
* Claude Code nesting-detection vars are stripped via cleanClaudeEnv().
|
|
183
259
|
*
|
|
184
260
|
* @param cwd - Working directory (WSL path)
|
|
185
261
|
* @param command - Command to execute
|
|
186
262
|
* @param debugLog - Optional debug logging function
|
|
187
263
|
*/
|
|
188
264
|
async function launchWSLTerminal(cwd, command, debugLog) {
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
debugLog?.(`Launching WSL via wt.exe with command: ${bashCmd}`);
|
|
265
|
+
const spawnArgs = buildWSLTerminalSpawnArgs(cwd, command);
|
|
266
|
+
debugLog?.(`Launching WSL via wt.exe with command: ${spawnArgs.args[4]}`);
|
|
192
267
|
return new Promise((resolve) => {
|
|
193
|
-
const proc = spawn(
|
|
268
|
+
const proc = spawn(spawnArgs.command, spawnArgs.args, {
|
|
194
269
|
detached: true,
|
|
195
270
|
stdio: 'ignore',
|
|
196
|
-
env:
|
|
271
|
+
env: cleanClaudeEnv(),
|
|
197
272
|
});
|
|
198
273
|
proc.on('error', (err) => {
|
|
199
274
|
resolve({ success: false, error: `wt.exe failed: ${err.message}` });
|
|
@@ -212,23 +287,21 @@ async function launchWSLTerminal(cwd, command, debugLog) {
|
|
|
212
287
|
*/
|
|
213
288
|
async function launchLinuxTerminal(cwd, command, debugLog) {
|
|
214
289
|
// Find available terminal first (synchronous)
|
|
215
|
-
const terminal = findAvailableLinuxTerminal();
|
|
290
|
+
const terminal = findAvailableLinuxTerminal(isCommandAvailable);
|
|
216
291
|
if (!terminal) {
|
|
217
292
|
return {
|
|
218
293
|
error: 'No supported terminal emulator found. Please install gnome-terminal, konsole, or xterm.',
|
|
219
294
|
success: false,
|
|
220
295
|
};
|
|
221
296
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const fullCommand = `cd '${escapedPath}' && ${command}`;
|
|
225
|
-
debugLog?.(`Launching ${terminal.cmd} with command: ${fullCommand}`);
|
|
297
|
+
const spawnArgs = buildLinuxTerminalSpawnArgs(cwd, command, terminal);
|
|
298
|
+
debugLog?.(`Launching ${terminal.cmd} with command: cd '${escapeSingleQuotedPath(cwd, 'bash')}' && ${command}`);
|
|
226
299
|
// Launch terminal (single async operation)
|
|
227
300
|
return new Promise((resolve) => {
|
|
228
|
-
const proc = spawn(
|
|
301
|
+
const proc = spawn(spawnArgs.command, spawnArgs.args, {
|
|
229
302
|
detached: true,
|
|
230
303
|
stdio: 'ignore',
|
|
231
|
-
env:
|
|
304
|
+
env: cleanClaudeEnv(),
|
|
232
305
|
});
|
|
233
306
|
proc.on('error', (err) => {
|
|
234
307
|
resolve({ error: `Failed to launch ${terminal.cmd}: ${err.message}`, success: false });
|
|
@@ -243,9 +316,9 @@ async function launchLinuxTerminal(cwd, command, debugLog) {
|
|
|
243
316
|
* This function automatically detects the platform and uses the appropriate
|
|
244
317
|
* terminal emulator:
|
|
245
318
|
* - **Windows**: Windows Terminal (wt.exe) with PowerShell, falls back to PowerShell directly
|
|
246
|
-
* - **macOS**: Terminal.app via
|
|
319
|
+
* - **macOS**: Terminal.app via `open` + temporary `.command` script
|
|
247
320
|
* - **WSL**: Windows Terminal (wt.exe) via wsl.exe, falls back to Linux terminals
|
|
248
|
-
* - **Linux**: Tries gnome-terminal, konsole, xterm
|
|
321
|
+
* - **Linux**: Tries x-terminal-emulator, gnome-terminal, konsole, xterm in order
|
|
249
322
|
*
|
|
250
323
|
* The terminal is launched in detached mode, allowing the parent process to exit
|
|
251
324
|
* without affecting the new terminal.
|
|
@@ -269,12 +342,12 @@ async function launchLinuxTerminal(cwd, command, debugLog) {
|
|
|
269
342
|
* ```
|
|
270
343
|
*/
|
|
271
344
|
export async function launchTerminal(options) {
|
|
272
|
-
const { cwd, command, debugLog } = options;
|
|
345
|
+
const { cwd, command, debugLog, windowsShellPreference = 'default' } = options;
|
|
273
346
|
const { platform } = process;
|
|
274
347
|
debugLog?.(`Launching terminal in ${cwd} with command: ${command}`);
|
|
275
348
|
debugLog?.(`Platform: ${platform}`);
|
|
276
|
-
if (platform
|
|
277
|
-
return launchWindowsTerminal(cwd, command, debugLog);
|
|
349
|
+
if (isWindowsPlatform(platform)) {
|
|
350
|
+
return launchWindowsTerminal(cwd, command, windowsShellPreference, debugLog);
|
|
278
351
|
}
|
|
279
352
|
if (platform === 'darwin') {
|
|
280
353
|
return launchMacTerminal(cwd, command, debugLog);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BSP split algorithm for tmux pane placement.
|
|
3
|
+
* Extracted from template core/lib-ts/base/tmux-pane-placement.ts.
|
|
4
|
+
*/
|
|
5
|
+
export type TmuxSplitFlag = '-h' | '-v';
|
|
6
|
+
export interface TmuxPaneInfo {
|
|
7
|
+
active: boolean;
|
|
8
|
+
height: number;
|
|
9
|
+
paneId: string;
|
|
10
|
+
width: number;
|
|
11
|
+
}
|
|
12
|
+
export interface PlacementResult {
|
|
13
|
+
splitFlag: TmuxSplitFlag;
|
|
14
|
+
targetPane: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function listPanes(tmuxPath: string): Promise<TmuxPaneInfo[]>;
|
|
17
|
+
export declare function findBestSplit(panes: TmuxPaneInfo[]): null | PlacementResult;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BSP split algorithm for tmux pane placement.
|
|
3
|
+
* Extracted from template core/lib-ts/base/tmux-pane-placement.ts.
|
|
4
|
+
*/
|
|
5
|
+
import { execFileAsync } from './runtime/subprocess-utils.js';
|
|
6
|
+
const LIST_PANES_FORMAT = '#{pane_id} #{pane_width} #{pane_height} #{pane_active}';
|
|
7
|
+
export async function listPanes(tmuxPath) {
|
|
8
|
+
const result = await execFileAsync(tmuxPath, ['list-panes', '-F', LIST_PANES_FORMAT], {
|
|
9
|
+
timeout: 3000,
|
|
10
|
+
});
|
|
11
|
+
if (result.exitCode !== 0)
|
|
12
|
+
return [];
|
|
13
|
+
const panes = [];
|
|
14
|
+
for (const rawLine of result.stdout.split(/\r?\n/)) {
|
|
15
|
+
const line = rawLine.trim();
|
|
16
|
+
if (!line)
|
|
17
|
+
continue;
|
|
18
|
+
const parts = line.split(/\s+/);
|
|
19
|
+
if (parts.length < 4)
|
|
20
|
+
continue;
|
|
21
|
+
const paneId = parts[0] ?? '';
|
|
22
|
+
const width = Number.parseInt(parts[1] ?? '', 10);
|
|
23
|
+
const height = Number.parseInt(parts[2] ?? '', 10);
|
|
24
|
+
const activeRaw = parts[3] ?? '';
|
|
25
|
+
if (!paneId || !Number.isFinite(width) || !Number.isFinite(height))
|
|
26
|
+
continue;
|
|
27
|
+
panes.push({
|
|
28
|
+
paneId,
|
|
29
|
+
width,
|
|
30
|
+
height,
|
|
31
|
+
active: activeRaw === '1',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return panes;
|
|
35
|
+
}
|
|
36
|
+
export function findBestSplit(panes) {
|
|
37
|
+
if (panes.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
let best = panes[0];
|
|
40
|
+
let bestArea = best.width * best.height;
|
|
41
|
+
for (let i = 1; i < panes.length; i++) {
|
|
42
|
+
const pane = panes[i];
|
|
43
|
+
if (!pane)
|
|
44
|
+
continue;
|
|
45
|
+
const area = pane.width * pane.height;
|
|
46
|
+
if (area > bestArea) {
|
|
47
|
+
best = pane;
|
|
48
|
+
bestArea = area;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const CELL_ASPECT_RATIO = 2;
|
|
52
|
+
const visualWidth = best.width;
|
|
53
|
+
const visualHeight = best.height * CELL_ASPECT_RATIO;
|
|
54
|
+
return {
|
|
55
|
+
targetPane: best.paneId,
|
|
56
|
+
splitFlag: visualWidth >= visualHeight ? '-h' : '-v',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { quoteForSh } from './shell-quoting.js';
|
|
2
|
+
/** Convert Windows path to MSYS2 POSIX path for tmux args. C:\foo\bar → /c/foo/bar */
|
|
3
|
+
export function toMsysPosixPath(winPath) {
|
|
4
|
+
if (process.platform !== 'win32')
|
|
5
|
+
return winPath;
|
|
6
|
+
const normalized = winPath.replaceAll('\\', '/');
|
|
7
|
+
const match = normalized.match(/^([A-Za-z]):\/(.*)/u);
|
|
8
|
+
if (!match)
|
|
9
|
+
return normalized;
|
|
10
|
+
return `/${match[1].toLowerCase()}/${match[2]}`;
|
|
11
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface TmuxSessionOptions {
|
|
2
|
+
/** Prepend tmux mouse enable command (default true). */
|
|
3
|
+
enableMouse?: boolean;
|
|
4
|
+
/** Platform override for deterministic tests. */
|
|
5
|
+
platform?: NodeJS.Platform | undefined;
|
|
6
|
+
/** Optional prompt text to deliver as a positional arg via temp file. */
|
|
7
|
+
promptText?: string | undefined;
|
|
8
|
+
reattach?: boolean;
|
|
9
|
+
sessionName: string;
|
|
10
|
+
/** CLI args (e.g. ['--dangerously-skip-permissions']). */
|
|
11
|
+
toolArgs: string[];
|
|
12
|
+
/** Absolute path to tool binary (or bare command name on Unix). */
|
|
13
|
+
toolPath: string;
|
|
14
|
+
}
|
|
15
|
+
export type TmuxColorMode = 'c256' | 'truecolor';
|
|
16
|
+
export declare function buildTmuxRuntimeBootstrapCommands(platform?: NodeJS.Platform, enableMouse?: boolean): string[];
|
|
17
|
+
/** Color mode policy for tmux-launched sessions. */
|
|
18
|
+
export declare function resolveTmuxColorMode(platform?: NodeJS.Platform): TmuxColorMode;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the absolute path to a tool binary (e.g. 'claude', 'codex').
|
|
21
|
+
* On Windows prefers .exe, then extensionless, then .cmd.
|
|
22
|
+
* Returns null when the tool is not on PATH.
|
|
23
|
+
*/
|
|
24
|
+
export declare function findToolPath(name: string): null | string;
|
|
25
|
+
/** Build the shell command string from structured options. */
|
|
26
|
+
export declare function buildShellCommand(opts: TmuxSessionOptions): string;
|
|
27
|
+
/**
|
|
28
|
+
* Best-effort configure tmux session: mouse, scrollback, 256-color, and truecolor.
|
|
29
|
+
* Batches all settings into a single tmux invocation using \; command separator.
|
|
30
|
+
* Unix only — Windows uses psmux (native ConPTY handles mouse/color natively).
|
|
31
|
+
*/
|
|
32
|
+
export declare function configureTmuxSession(): void;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { buildBootstrapPrompt } from './mux-utils.js';
|
|
6
|
+
import { resolveExecutable } from './runtime/executable-policy.js';
|
|
7
|
+
import { isNonWindowsPlatform, resolveTmuxColorModeForPlatform, } from './runtime/platform-adapter.js';
|
|
8
|
+
import { quoteForSh } from './tmux-primitives.js';
|
|
9
|
+
export function buildTmuxRuntimeBootstrapCommands(platform = process.platform, enableMouse = true) {
|
|
10
|
+
const commands = [];
|
|
11
|
+
if (enableMouse) {
|
|
12
|
+
commands.push('tmux set-option -g mouse on >/dev/null 2>&1 || true');
|
|
13
|
+
}
|
|
14
|
+
// Increase scrollback buffer from default 2000
|
|
15
|
+
commands.push('tmux set-option -g history-limit 50000 >/dev/null 2>&1 || true');
|
|
16
|
+
// Configure terminal overrides for truecolor on Unix.
|
|
17
|
+
// Note: default-terminal is set before session creation.
|
|
18
|
+
// Windows uses psmux (native ConPTY) which handles color/cursor natively.
|
|
19
|
+
if (isNonWindowsPlatform(platform)) {
|
|
20
|
+
commands.push('tmux set -a terminal-overrides ",xterm*:Tc,alacritty:Tc" >/dev/null 2>&1 || true');
|
|
21
|
+
}
|
|
22
|
+
return commands;
|
|
23
|
+
}
|
|
24
|
+
/** Color mode policy for tmux-launched sessions. */
|
|
25
|
+
export function resolveTmuxColorMode(platform = process.platform) {
|
|
26
|
+
return resolveTmuxColorModeForPlatform(platform);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the absolute path to a tool binary (e.g. 'claude', 'codex').
|
|
30
|
+
* On Windows prefers .exe, then extensionless, then .cmd.
|
|
31
|
+
* Returns null when the tool is not on PATH.
|
|
32
|
+
*/
|
|
33
|
+
export function findToolPath(name) {
|
|
34
|
+
return resolveExecutable(name, { windowsProfile: 'exeThenExtensionlessThenCmd' });
|
|
35
|
+
}
|
|
36
|
+
/** Build the shell command string from structured options. */
|
|
37
|
+
export function buildShellCommand(opts) {
|
|
38
|
+
const { toolPath, toolArgs, promptText, enableMouse = true, platform = process.platform } = opts;
|
|
39
|
+
const colorMode = resolveTmuxColorMode(platform);
|
|
40
|
+
const parts = buildTmuxRuntimeBootstrapCommands(platform, enableMouse);
|
|
41
|
+
const cmdParts = [];
|
|
42
|
+
cmdParts.push(quoteForSh(toolPath));
|
|
43
|
+
for (const arg of toolArgs) {
|
|
44
|
+
cmdParts.push(quoteForSh(arg));
|
|
45
|
+
}
|
|
46
|
+
// Deliver prompt via temp file — avoids nested bash→tmux→sh quoting
|
|
47
|
+
if (promptText) {
|
|
48
|
+
const tmpFile = path.join(os.tmpdir(), `aiwcli-prompt-${Date.now()}-${process.pid}.txt`);
|
|
49
|
+
writeFileSync(tmpFile, promptText, { encoding: 'utf8', mode: 0o600 });
|
|
50
|
+
const bootstrap = buildBootstrapPrompt(tmpFile);
|
|
51
|
+
cmdParts.push(quoteForSh(bootstrap));
|
|
52
|
+
}
|
|
53
|
+
// Export COLORTERM only when truecolor is intentionally enabled.
|
|
54
|
+
if (colorMode === 'truecolor') {
|
|
55
|
+
parts.push('export COLORTERM=truecolor');
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
parts.push('unset COLORTERM');
|
|
59
|
+
}
|
|
60
|
+
parts.push(`exec ${cmdParts.join(' ')}`);
|
|
61
|
+
return parts.join('; ');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Best-effort configure tmux session: mouse, scrollback, 256-color, and truecolor.
|
|
65
|
+
* Batches all settings into a single tmux invocation using \; command separator.
|
|
66
|
+
* Unix only — Windows uses psmux (native ConPTY handles mouse/color natively).
|
|
67
|
+
*/
|
|
68
|
+
export function configureTmuxSession() {
|
|
69
|
+
if (!isNonWindowsPlatform())
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
execSync('tmux set-option -g mouse on \\; ' +
|
|
73
|
+
'set-option -g history-limit 50000 \\; ' +
|
|
74
|
+
'set -g default-terminal "tmux-256color" \\; ' +
|
|
75
|
+
'set -a terminal-overrides ",xterm*:Tc,alacritty:Tc"', { stdio: 'ignore', timeout: 3000 });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Fallback: tmux-256color may not be in terminfo — try screen-256color
|
|
79
|
+
try {
|
|
80
|
+
execSync('tmux set-option -g mouse on \\; ' +
|
|
81
|
+
'set-option -g history-limit 50000 \\; ' +
|
|
82
|
+
'set -g default-terminal "screen-256color" \\; ' +
|
|
83
|
+
'set -a terminal-overrides ",xterm*:Tc,alacritty:Tc"', { stdio: 'ignore', timeout: 3000 });
|
|
84
|
+
}
|
|
85
|
+
catch { /* best-effort */ }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -36,7 +36,7 @@ export function shouldUseColors(proc = process) {
|
|
|
36
36
|
const env = proc.env ?? process.env;
|
|
37
37
|
const noColor = env.NO_COLOR;
|
|
38
38
|
const forceColor = env.FORCE_COLOR;
|
|
39
|
-
// NO_COLOR takes precedence (
|
|
39
|
+
// NO_COLOR takes precedence (unknown value disables colors)
|
|
40
40
|
if (noColor !== undefined) {
|
|
41
41
|
return false;
|
|
42
42
|
}
|