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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified multiplexer abstraction.
|
|
3
|
+
* Backends implement the Multiplexer interface: resolveStrategy() for context-aware
|
|
4
|
+
* decision making, split()/createSession() for pane management.
|
|
5
|
+
* Factory: detectMultiplexer() → Multiplexer | null
|
|
6
|
+
*/
|
|
7
|
+
export type LaunchStrategy = 'split' | 'create-session' | 'inline' | 'unavailable';
|
|
8
|
+
export interface StrategyContext {
|
|
9
|
+
calledFromRepl: boolean;
|
|
10
|
+
platform: NodeJS.Platform;
|
|
11
|
+
disableMux: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedStrategy {
|
|
14
|
+
strategy: LaunchStrategy;
|
|
15
|
+
reason: string;
|
|
16
|
+
}
|
|
17
|
+
export type SplitDirection = 'auto' | 'horizontal' | 'vertical';
|
|
18
|
+
export interface SplitOptions {
|
|
19
|
+
toolName: string;
|
|
20
|
+
args: string[];
|
|
21
|
+
cwd: string;
|
|
22
|
+
env: Record<string, string>;
|
|
23
|
+
mode: 'exec' | 'repl';
|
|
24
|
+
split: SplitDirection;
|
|
25
|
+
promptPath?: string | undefined;
|
|
26
|
+
sentinelPath: string;
|
|
27
|
+
holdPane: boolean;
|
|
28
|
+
retryOnQuickExit: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface LaunchResult {
|
|
31
|
+
launched: boolean;
|
|
32
|
+
backend: string;
|
|
33
|
+
handle?: string | undefined;
|
|
34
|
+
sentinelPath?: string | undefined;
|
|
35
|
+
exitCode?: number | undefined;
|
|
36
|
+
reason?: string | undefined;
|
|
37
|
+
}
|
|
38
|
+
export interface CreateSessionOptions {
|
|
39
|
+
sessionName: string;
|
|
40
|
+
toolPath: string;
|
|
41
|
+
toolArgs: string[];
|
|
42
|
+
cwd: string;
|
|
43
|
+
promptText?: string | undefined;
|
|
44
|
+
reattach: boolean;
|
|
45
|
+
enableMouse?: boolean | undefined;
|
|
46
|
+
}
|
|
47
|
+
export interface Multiplexer {
|
|
48
|
+
readonly backend: string;
|
|
49
|
+
resolveStrategy(ctx: StrategyContext): ResolvedStrategy;
|
|
50
|
+
split(options: SplitOptions): Promise<LaunchResult>;
|
|
51
|
+
createSession(options: CreateSessionOptions): Promise<LaunchResult>;
|
|
52
|
+
kill(handle: string): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the priority order of multiplexer backends for a given platform.
|
|
56
|
+
* Pure function — no I/O, no PATH checks. Used by detectMultiplexer().
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveMultiplexerPriority(platform: NodeJS.Platform, env?: Record<string, string | undefined>): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Detect the best available multiplexer for the current platform.
|
|
61
|
+
* Windows → WeztermMultiplexer (if inside WezTerm) → PsmuxMultiplexer (fallback)
|
|
62
|
+
* Unix → TmuxMultiplexer (if tmux binary on PATH)
|
|
63
|
+
* Returns null if no multiplexer is available.
|
|
64
|
+
*/
|
|
65
|
+
export declare function detectMultiplexer(platform?: NodeJS.Platform): Promise<Multiplexer | null>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified multiplexer abstraction.
|
|
3
|
+
* Backends implement the Multiplexer interface: resolveStrategy() for context-aware
|
|
4
|
+
* decision making, split()/createSession() for pane management.
|
|
5
|
+
* Factory: detectMultiplexer() → Multiplexer | null
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the priority order of multiplexer backends for a given platform.
|
|
9
|
+
* Pure function — no I/O, no PATH checks. Used by detectMultiplexer().
|
|
10
|
+
*/
|
|
11
|
+
export function resolveMultiplexerPriority(platform, env = {}) {
|
|
12
|
+
if (platform === 'win32') {
|
|
13
|
+
// Prefer WezTerm if we detect a WezTerm environment
|
|
14
|
+
if (env.WEZTERM_PANE || env.TERM_PROGRAM === 'WezTerm') {
|
|
15
|
+
return ['wezterm', 'psmux'];
|
|
16
|
+
}
|
|
17
|
+
return ['psmux'];
|
|
18
|
+
}
|
|
19
|
+
return ['tmux'];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detect the best available multiplexer for the current platform.
|
|
23
|
+
* Windows → WeztermMultiplexer (if inside WezTerm) → PsmuxMultiplexer (fallback)
|
|
24
|
+
* Unix → TmuxMultiplexer (if tmux binary on PATH)
|
|
25
|
+
* Returns null if no multiplexer is available.
|
|
26
|
+
*/
|
|
27
|
+
export async function detectMultiplexer(platform = process.platform) {
|
|
28
|
+
if (platform === 'win32') {
|
|
29
|
+
const { WeztermMultiplexer } = await import('./multiplexers/wezterm.js');
|
|
30
|
+
const wezterm = WeztermMultiplexer.create();
|
|
31
|
+
if (wezterm)
|
|
32
|
+
return wezterm;
|
|
33
|
+
const { PsmuxMultiplexer } = await import('./multiplexers/psmux.js');
|
|
34
|
+
return PsmuxMultiplexer.create();
|
|
35
|
+
}
|
|
36
|
+
const { TmuxMultiplexer } = await import('./multiplexers/tmux.js');
|
|
37
|
+
return TmuxMultiplexer.create();
|
|
38
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PsmuxMultiplexer — unified psmux (Windows ConPTY) backend.
|
|
3
|
+
* Composes with PowerShellAdapter for command building.
|
|
4
|
+
* Owns: version checking, session readiness polling, bootstrap defaults.
|
|
5
|
+
*/
|
|
6
|
+
import type { CreateSessionOptions, LaunchResult, Multiplexer, ResolvedStrategy, SplitOptions, StrategyContext } from '../multiplexer.js';
|
|
7
|
+
import type { ShellAdapter } from '../shell-adapters/shell-adapter.js';
|
|
8
|
+
/** @internal */
|
|
9
|
+
export interface PsmuxVersion {
|
|
10
|
+
major: number;
|
|
11
|
+
minor: number;
|
|
12
|
+
patch: number;
|
|
13
|
+
}
|
|
14
|
+
/** @internal */
|
|
15
|
+
export declare function meetsMinVersion(v: PsmuxVersion): boolean;
|
|
16
|
+
/** @internal */
|
|
17
|
+
export declare function parseVersionString(stdout: string): null | PsmuxVersion;
|
|
18
|
+
type PsmuxSplitFlag = '-h' | '-v';
|
|
19
|
+
/** @internal — translate unified SplitDirection to psmux flag. */
|
|
20
|
+
export declare function toPsmuxSplitFlag(direction: 'horizontal' | 'vertical'): PsmuxSplitFlag;
|
|
21
|
+
/** @internal */
|
|
22
|
+
export declare function buildCreateSessionArgs(params: {
|
|
23
|
+
cwd: string;
|
|
24
|
+
encodedCommand: string;
|
|
25
|
+
sessionName: string;
|
|
26
|
+
}): string[];
|
|
27
|
+
/** @internal */
|
|
28
|
+
export declare function buildSplitWindowArgs(params: {
|
|
29
|
+
cwd?: string;
|
|
30
|
+
encodedCommand: string;
|
|
31
|
+
splitFlag: '-h' | '-v';
|
|
32
|
+
splitTarget?: string | undefined;
|
|
33
|
+
}): string[];
|
|
34
|
+
/** @internal */
|
|
35
|
+
export declare function buildAttachArgs(sessionName: string): string[];
|
|
36
|
+
export declare class PsmuxMultiplexer implements Multiplexer {
|
|
37
|
+
readonly backend: "psmux";
|
|
38
|
+
private readonly psmuxPath;
|
|
39
|
+
private readonly shell;
|
|
40
|
+
private constructor();
|
|
41
|
+
static create(): Promise<null | PsmuxMultiplexer>;
|
|
42
|
+
resolveStrategy(ctx: StrategyContext): ResolvedStrategy;
|
|
43
|
+
createSession(options: CreateSessionOptions): Promise<LaunchResult>;
|
|
44
|
+
kill(handle: string): Promise<void>;
|
|
45
|
+
split(options: SplitOptions): Promise<LaunchResult>;
|
|
46
|
+
private applyBootstrapDefaults;
|
|
47
|
+
private hasSession;
|
|
48
|
+
private resolveAutoSplit;
|
|
49
|
+
private waitForSessionReady;
|
|
50
|
+
}
|
|
51
|
+
/** @internal */
|
|
52
|
+
export declare function buildPsmuxBootstrapCommands(enableMouse?: boolean): string[][];
|
|
53
|
+
/** @internal */
|
|
54
|
+
export declare function buildPsmuxShellCommand(shell: ShellAdapter, opts: CreateSessionOptions, promptFilePath?: string): string;
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PsmuxMultiplexer — unified psmux (Windows ConPTY) backend.
|
|
3
|
+
* Composes with PowerShellAdapter for command building.
|
|
4
|
+
* Owns: version checking, session readiness polling, bootstrap defaults.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readdirSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import * as os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { sanitizedProcessEnv } from '../env-sanitizer.js';
|
|
10
|
+
import { PANE_HOLD_MESSAGE, buildBootstrapPrompt, getLastLine, spawnAttached, splitFlagFromDimensions } from '../mux-utils.js';
|
|
11
|
+
import { execFileAsync, findExecutable } from '../runtime/subprocess-utils.js';
|
|
12
|
+
import { PowerShellAdapter } from '../shell-adapters/powershell-adapter.js';
|
|
13
|
+
const MIN_VERSION = { major: 0, minor: 4, patch: 0 };
|
|
14
|
+
const ATTACH_RETRY_DELAY_MS = 200;
|
|
15
|
+
const SESSION_READY_BACKOFF_MS = [50, 100, 150, 250];
|
|
16
|
+
const PSMUX_TERMINAL_OVERRIDES = ',*:Ss@:Se@:Cs@:Cr@';
|
|
17
|
+
/** @internal */
|
|
18
|
+
export function meetsMinVersion(v) {
|
|
19
|
+
if (v.major > MIN_VERSION.major)
|
|
20
|
+
return true;
|
|
21
|
+
if (v.major < MIN_VERSION.major)
|
|
22
|
+
return false;
|
|
23
|
+
if (v.minor > MIN_VERSION.minor)
|
|
24
|
+
return true;
|
|
25
|
+
if (v.minor < MIN_VERSION.minor)
|
|
26
|
+
return false;
|
|
27
|
+
return v.patch >= MIN_VERSION.patch;
|
|
28
|
+
}
|
|
29
|
+
/** @internal */
|
|
30
|
+
export function parseVersionString(stdout) {
|
|
31
|
+
const match = stdout.trim().match(/(\d+)\.(\d+)\.(\d+)/);
|
|
32
|
+
if (!match)
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
major: Number(match[1]),
|
|
36
|
+
minor: Number(match[2]),
|
|
37
|
+
patch: Number(match[3]),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** @internal — translate unified SplitDirection to psmux flag. */
|
|
41
|
+
export function toPsmuxSplitFlag(direction) {
|
|
42
|
+
return direction === 'horizontal' ? '-h' : '-v';
|
|
43
|
+
}
|
|
44
|
+
/** @internal */
|
|
45
|
+
export function buildCreateSessionArgs(params) {
|
|
46
|
+
return ['new-session', '-d', '-c', params.cwd, '-s', params.sessionName, params.encodedCommand];
|
|
47
|
+
}
|
|
48
|
+
/** @internal */
|
|
49
|
+
export function buildSplitWindowArgs(params) {
|
|
50
|
+
const args = ['split-window', params.splitFlag, '-P', '-F', '#{pane_id}'];
|
|
51
|
+
if (params.cwd) {
|
|
52
|
+
args.push('-c', params.cwd);
|
|
53
|
+
}
|
|
54
|
+
if (params.splitTarget?.trim()) {
|
|
55
|
+
args.push('-t', params.splitTarget.trim());
|
|
56
|
+
}
|
|
57
|
+
args.push(params.encodedCommand);
|
|
58
|
+
return args;
|
|
59
|
+
}
|
|
60
|
+
/** @internal */
|
|
61
|
+
export function buildAttachArgs(sessionName) {
|
|
62
|
+
return ['attach', '-t', sessionName];
|
|
63
|
+
}
|
|
64
|
+
export class PsmuxMultiplexer {
|
|
65
|
+
backend = 'psmux';
|
|
66
|
+
psmuxPath;
|
|
67
|
+
shell;
|
|
68
|
+
constructor(psmuxPath) {
|
|
69
|
+
this.psmuxPath = psmuxPath;
|
|
70
|
+
this.shell = new PowerShellAdapter();
|
|
71
|
+
}
|
|
72
|
+
static async create() {
|
|
73
|
+
if (process.platform !== 'win32')
|
|
74
|
+
return null;
|
|
75
|
+
const psmuxPath = findExecutable('psmux') ?? findPsmuxInWinget();
|
|
76
|
+
if (!psmuxPath)
|
|
77
|
+
return null;
|
|
78
|
+
const result = await execFileAsync(psmuxPath, ['-V'], { timeout: 3000 });
|
|
79
|
+
if (result.exitCode !== 0)
|
|
80
|
+
return null;
|
|
81
|
+
const version = parseVersionString(result.stdout);
|
|
82
|
+
if (!version)
|
|
83
|
+
return null;
|
|
84
|
+
if (!meetsMinVersion(version))
|
|
85
|
+
return null;
|
|
86
|
+
return new PsmuxMultiplexer(psmuxPath);
|
|
87
|
+
}
|
|
88
|
+
resolveStrategy(ctx) {
|
|
89
|
+
if (ctx.disableMux) {
|
|
90
|
+
return { strategy: 'inline', reason: 'Multiplexer disabled via --no-tmux' };
|
|
91
|
+
}
|
|
92
|
+
if (Boolean(process.env.PSMUX_PANE)) {
|
|
93
|
+
return { strategy: 'split', reason: 'Inside psmux session' };
|
|
94
|
+
}
|
|
95
|
+
return { strategy: 'create-session', reason: 'Outside psmux — will create new session' };
|
|
96
|
+
}
|
|
97
|
+
async createSession(options) {
|
|
98
|
+
const { sessionName, reattach, enableMouse = true, cwd } = options;
|
|
99
|
+
let promptFilePath;
|
|
100
|
+
if (options.promptText) {
|
|
101
|
+
promptFilePath = path.join(os.tmpdir(), `aiwcli-prompt-${Date.now()}-${process.pid}.txt`);
|
|
102
|
+
writeFileSync(promptFilePath, options.promptText, { encoding: 'utf8', mode: 0o600 });
|
|
103
|
+
}
|
|
104
|
+
const shellCommand = buildPsmuxShellCommand(this.shell, options, promptFilePath);
|
|
105
|
+
// Inject PSMUX_PANE=1 for inside-session detection + nesting cleanup
|
|
106
|
+
const nestingCleanup = this.shell.buildNestingCleanup();
|
|
107
|
+
const commandWithEnv = `$env:PSMUX_PANE='1'; ${nestingCleanup} ${shellCommand}`;
|
|
108
|
+
const psmuxArgs = buildCreateSessionArgs({
|
|
109
|
+
sessionName,
|
|
110
|
+
cwd,
|
|
111
|
+
encodedCommand: this.shell.encodeForExecution(commandWithEnv),
|
|
112
|
+
});
|
|
113
|
+
const shouldCreate = !reattach || !(await this.hasSession(sessionName));
|
|
114
|
+
if (shouldCreate) {
|
|
115
|
+
const detachedCreate = await execFileAsync(this.psmuxPath, psmuxArgs, { timeout: 5000 });
|
|
116
|
+
if (detachedCreate.exitCode !== 0) {
|
|
117
|
+
const stderr = detachedCreate.stderr.trim();
|
|
118
|
+
return {
|
|
119
|
+
launched: false,
|
|
120
|
+
exitCode: detachedCreate.exitCode ?? 1,
|
|
121
|
+
backend: this.backend,
|
|
122
|
+
reason: stderr ? `psmux new-session failed: ${stderr}` : 'psmux new-session failed',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const ready = await this.waitForSessionReady(sessionName);
|
|
127
|
+
if (!ready) {
|
|
128
|
+
return {
|
|
129
|
+
launched: false,
|
|
130
|
+
exitCode: 1,
|
|
131
|
+
backend: this.backend,
|
|
132
|
+
reason: `psmux session '${sessionName}' not ready for attach`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
await this.applyBootstrapDefaults(enableMouse);
|
|
136
|
+
const attachArgs = buildAttachArgs(sessionName);
|
|
137
|
+
const env = sanitizedProcessEnv();
|
|
138
|
+
const firstAttach = await spawnAttached(this.psmuxPath, attachArgs, env, this.backend);
|
|
139
|
+
if (firstAttach.launched || (firstAttach.exitCode !== undefined && firstAttach.exitCode !== 1))
|
|
140
|
+
return firstAttach;
|
|
141
|
+
await waitMs(ATTACH_RETRY_DELAY_MS);
|
|
142
|
+
const secondAttach = await spawnAttached(this.psmuxPath, attachArgs, env, this.backend);
|
|
143
|
+
if (secondAttach.launched || (secondAttach.exitCode !== undefined && secondAttach.exitCode !== 1))
|
|
144
|
+
return secondAttach;
|
|
145
|
+
return {
|
|
146
|
+
...secondAttach,
|
|
147
|
+
reason: 'psmux attach failed after retry (auth/session readiness race)',
|
|
148
|
+
launched: false,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async kill(handle) {
|
|
152
|
+
if (!handle)
|
|
153
|
+
return;
|
|
154
|
+
await execFileAsync(this.psmuxPath, ['kill-pane', '-t', handle], { timeout: 3000 });
|
|
155
|
+
}
|
|
156
|
+
async split(options) {
|
|
157
|
+
const { toolName, args, env, cwd, mode, sentinelPath } = options;
|
|
158
|
+
const nativePath = findExecutable(toolName);
|
|
159
|
+
if (!nativePath) {
|
|
160
|
+
return { launched: false, backend: this.backend, reason: `${toolName} not found on PATH` };
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const baseCommand = this.shell.buildToolCommand({
|
|
164
|
+
toolPath: nativePath,
|
|
165
|
+
args,
|
|
166
|
+
env,
|
|
167
|
+
mode,
|
|
168
|
+
...(options.promptPath ? { promptPath: options.promptPath } : {}),
|
|
169
|
+
});
|
|
170
|
+
const holdMessage = PANE_HOLD_MESSAGE;
|
|
171
|
+
const wrappedCommand = this.shell.wrapSentinel({
|
|
172
|
+
command: baseCommand,
|
|
173
|
+
sentinelPath,
|
|
174
|
+
autoClose: false,
|
|
175
|
+
holdPane: false,
|
|
176
|
+
holdMessage,
|
|
177
|
+
});
|
|
178
|
+
const effectiveCommand = this.shell.encodeForExecution(wrappedCommand);
|
|
179
|
+
// Resolve split direction
|
|
180
|
+
const splitDirection = options.split;
|
|
181
|
+
let splitFlag;
|
|
182
|
+
if (splitDirection === 'auto') {
|
|
183
|
+
splitFlag = await this.resolveAutoSplit();
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
splitFlag = toPsmuxSplitFlag(splitDirection);
|
|
187
|
+
}
|
|
188
|
+
await this.applyBootstrapDefaults();
|
|
189
|
+
const psmuxArgs = buildSplitWindowArgs({
|
|
190
|
+
splitFlag,
|
|
191
|
+
encodedCommand: effectiveCommand,
|
|
192
|
+
cwd,
|
|
193
|
+
});
|
|
194
|
+
const split = await execFileAsync(this.psmuxPath, psmuxArgs, { timeout: 5000 });
|
|
195
|
+
if (split.exitCode !== 0) {
|
|
196
|
+
return {
|
|
197
|
+
launched: false,
|
|
198
|
+
backend: this.backend,
|
|
199
|
+
reason: 'psmux split-window failed',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const handle = getLastLine(split.stdout) || undefined;
|
|
203
|
+
return {
|
|
204
|
+
launched: true,
|
|
205
|
+
backend: this.backend,
|
|
206
|
+
handle,
|
|
207
|
+
sentinelPath,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return {
|
|
212
|
+
launched: false,
|
|
213
|
+
backend: this.backend,
|
|
214
|
+
reason: `pane launch failed: ${String(error)}`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async applyBootstrapDefaults(enableMouse = true) {
|
|
219
|
+
await runBootstrapCommands(this.psmuxPath, buildPsmuxBootstrapCommands(enableMouse));
|
|
220
|
+
}
|
|
221
|
+
async hasSession(sessionName) {
|
|
222
|
+
try {
|
|
223
|
+
const result = await execFileAsync(this.psmuxPath, ['has-session', '-t', sessionName], { timeout: 3000 });
|
|
224
|
+
return result.exitCode === 0;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async resolveAutoSplit() {
|
|
231
|
+
try {
|
|
232
|
+
const size = await execFileAsync(this.psmuxPath, ['display-message', '-p', '#{pane_width} #{pane_height}'], { timeout: 3000 });
|
|
233
|
+
if (size.exitCode !== 0)
|
|
234
|
+
return '-h';
|
|
235
|
+
const parts = size.stdout.trim().split(/\s+/);
|
|
236
|
+
if (parts.length < 2)
|
|
237
|
+
return '-h';
|
|
238
|
+
const width = Number.parseInt(parts[0] ?? '', 10);
|
|
239
|
+
const height = Number.parseInt(parts[1] ?? '', 10);
|
|
240
|
+
if (!Number.isFinite(width) || !Number.isFinite(height))
|
|
241
|
+
return '-h';
|
|
242
|
+
return splitFlagFromDimensions(width, height);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return '-h';
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async waitForSessionReady(sessionName) {
|
|
249
|
+
if (await this.hasSession(sessionName))
|
|
250
|
+
return true;
|
|
251
|
+
const poll = async (index) => {
|
|
252
|
+
const backoffMs = SESSION_READY_BACKOFF_MS[index];
|
|
253
|
+
if (backoffMs === undefined)
|
|
254
|
+
return false;
|
|
255
|
+
await waitMs(backoffMs);
|
|
256
|
+
if (await this.hasSession(sessionName))
|
|
257
|
+
return true;
|
|
258
|
+
return poll(index + 1);
|
|
259
|
+
};
|
|
260
|
+
return poll(0);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function findPsmuxInWinget() {
|
|
264
|
+
const localAppData = process.env.LOCALAPPDATA;
|
|
265
|
+
if (!localAppData)
|
|
266
|
+
return null;
|
|
267
|
+
const packagesDir = path.join(localAppData, 'Microsoft', 'WinGet', 'Packages');
|
|
268
|
+
if (!existsSync(packagesDir))
|
|
269
|
+
return null;
|
|
270
|
+
try {
|
|
271
|
+
const entries = readdirSync(packagesDir);
|
|
272
|
+
const psmuxDir = entries.find((e) => e.startsWith('marlocarlo.psmux'));
|
|
273
|
+
if (!psmuxDir)
|
|
274
|
+
return null;
|
|
275
|
+
const candidate = path.join(packagesDir, psmuxDir, 'psmux.exe');
|
|
276
|
+
return existsSync(candidate) ? candidate : null;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/** @internal */
|
|
283
|
+
export function buildPsmuxBootstrapCommands(enableMouse = true) {
|
|
284
|
+
const commands = [];
|
|
285
|
+
if (enableMouse) {
|
|
286
|
+
commands.push(['set-option', '-g', 'mouse', 'on']);
|
|
287
|
+
}
|
|
288
|
+
commands.push(['set-option', '-g', 'history-limit', '50000'], ['set-option', '-g', 'cursor-blink', 'off'], ['set-option', '-g', 'cursor-style', 'block'], ['set-option', '-g', 'status-interval', '0'], ['set-option', '-g', 'terminal-overrides', PSMUX_TERMINAL_OVERRIDES]);
|
|
289
|
+
return commands;
|
|
290
|
+
}
|
|
291
|
+
/** @internal */
|
|
292
|
+
export function buildPsmuxShellCommand(shell, opts, promptFilePath) {
|
|
293
|
+
const { toolPath, toolArgs } = opts;
|
|
294
|
+
const cmdParts = [];
|
|
295
|
+
cmdParts.push(`& ${shell.quote(toolPath)}`);
|
|
296
|
+
for (const arg of toolArgs) {
|
|
297
|
+
cmdParts.push(shell.quote(arg));
|
|
298
|
+
}
|
|
299
|
+
if (promptFilePath) {
|
|
300
|
+
const formatted = process.platform === 'win32'
|
|
301
|
+
? promptFilePath.replaceAll('\\', '/')
|
|
302
|
+
: promptFilePath;
|
|
303
|
+
const bootstrap = buildBootstrapPrompt(formatted);
|
|
304
|
+
cmdParts.push(shell.quote(bootstrap));
|
|
305
|
+
}
|
|
306
|
+
return cmdParts.join(' ');
|
|
307
|
+
}
|
|
308
|
+
async function runBootstrapCommands(psmuxPath, commands, index = 0) {
|
|
309
|
+
const command = commands[index];
|
|
310
|
+
if (!command)
|
|
311
|
+
return;
|
|
312
|
+
try {
|
|
313
|
+
await execFileAsync(psmuxPath, command, { timeout: 3000 });
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// Best effort only.
|
|
317
|
+
}
|
|
318
|
+
await runBootstrapCommands(psmuxPath, commands, index + 1);
|
|
319
|
+
}
|
|
320
|
+
function waitMs(ms) {
|
|
321
|
+
return new Promise((resolve) => {
|
|
322
|
+
setTimeout(resolve, ms);
|
|
323
|
+
});
|
|
324
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TmuxMultiplexer — unified tmux backend.
|
|
3
|
+
* Composes with BashAdapter for command building.
|
|
4
|
+
* Owns: split direction resolution, tmux session config, Windows bootstrap.
|
|
5
|
+
*/
|
|
6
|
+
import type { CreateSessionOptions, LaunchResult, Multiplexer, ResolvedStrategy, SplitOptions, StrategyContext } from '../multiplexer.js';
|
|
7
|
+
import { type TmuxSplitFlag } from '../tmux-pane-placement.js';
|
|
8
|
+
/** @internal — translate unified SplitDirection to tmux flag. */
|
|
9
|
+
export declare function toTmuxSplitFlag(direction: 'horizontal' | 'vertical'): TmuxSplitFlag;
|
|
10
|
+
/** @internal */
|
|
11
|
+
export declare function withWindowsTmuxBootstrap(command: string, platform?: NodeJS.Platform): string;
|
|
12
|
+
/** @internal */
|
|
13
|
+
export declare function buildTmuxSplitWindowArgs(params: {
|
|
14
|
+
command: string;
|
|
15
|
+
cwd?: string | undefined;
|
|
16
|
+
splitFlag: '-h' | '-v';
|
|
17
|
+
splitTarget?: string | undefined;
|
|
18
|
+
}): string[];
|
|
19
|
+
/** @internal */
|
|
20
|
+
export declare function buildTmuxCreateSessionArgs(params: {
|
|
21
|
+
cwd: string;
|
|
22
|
+
reattach?: boolean | undefined;
|
|
23
|
+
sessionName: string;
|
|
24
|
+
shellCommand: string;
|
|
25
|
+
}): string[];
|
|
26
|
+
export declare class TmuxMultiplexer implements Multiplexer {
|
|
27
|
+
readonly backend: "tmux";
|
|
28
|
+
private readonly tmuxPath;
|
|
29
|
+
private readonly shell;
|
|
30
|
+
private constructor();
|
|
31
|
+
static create(): null | TmuxMultiplexer;
|
|
32
|
+
resolveStrategy(ctx: StrategyContext): ResolvedStrategy;
|
|
33
|
+
createSession(options: CreateSessionOptions): Promise<LaunchResult>;
|
|
34
|
+
kill(handle: string): Promise<void>;
|
|
35
|
+
split(options: SplitOptions): Promise<LaunchResult>;
|
|
36
|
+
}
|