aiwcli 0.15.5 → 0.15.7
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 +6 -3
- 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 +160 -0
- package/dist/capabilities/installation/control-plane/clear-command.js +1220 -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 +51 -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 +222 -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 +0 -20
- package/dist/commands/branch.js +24 -416
- 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 +36 -11
- package/dist/commands/launch.js +135 -159
- package/dist/lib/base-command.d.ts +1 -114
- package/dist/lib/base-command.js +1 -153
- package/dist/lib/claude-settings-types.d.ts +31 -19
- 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 +618 -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 +54 -0
- package/dist/lib/git-exclude-manager.d.ts +2 -2
- package/dist/lib/git-exclude-manager.js +3 -3
- package/dist/lib/hooks/hook-utils.d.ts +143 -0
- package/dist/lib/hooks/hook-utils.js +609 -0
- package/dist/lib/hooks/session-end-logic.d.ts +5 -0
- package/dist/lib/hooks/session-end-logic.js +63 -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 +161 -0
- package/dist/lib/launch-options.d.ts +1 -0
- package/dist/lib/launch-options.js +1 -0
- package/dist/lib/lsp-patch.d.ts +12 -0
- package/dist/lib/lsp-patch.js +156 -0
- package/dist/lib/multiplexer.d.ts +57 -0
- package/dist/lib/multiplexer.js +19 -0
- package/dist/lib/multiplexers/psmux.d.ts +75 -0
- package/dist/lib/multiplexers/psmux.js +384 -0
- package/dist/lib/multiplexers/tmux.d.ts +44 -0
- package/dist/lib/multiplexers/tmux.js +262 -0
- package/dist/lib/mux-utils.d.ts +5 -0
- package/dist/lib/mux-utils.js +42 -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/runtime/aiw-cli.d.ts +37 -0
- package/dist/lib/runtime/aiw-cli.js +74 -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 +55 -0
- package/dist/lib/runtime/cli-args.js +185 -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 +262 -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 +14 -0
- package/dist/lib/runtime/models.js +14 -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 +30 -0
- package/dist/lib/runtime/state-io.js +174 -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 +54 -0
- package/dist/lib/runtime/utils.js +162 -0
- package/dist/lib/sentinel-wrapper.d.ts +9 -0
- package/dist/lib/sentinel-wrapper.js +20 -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 +6 -0
- package/dist/lib/spawn-errors.js +15 -0
- package/dist/lib/spawn.js +5 -11
- package/dist/lib/template-installer.d.ts +4 -5
- package/dist/lib/template-installer.js +36 -34
- 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 +11 -0
- package/dist/lib/terminal-strategy.js +49 -0
- package/dist/lib/terminal.d.ts +28 -0
- package/dist/lib/terminal.js +162 -112
- 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 +5 -0
- package/dist/lib/tmux-primitives.js +15 -0
- package/dist/lib/tmux-session.d.ts +32 -0
- package/dist/lib/tmux-session.js +86 -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/platform/launch.d.ts +10 -0
- package/dist/platform/launch.js +10 -0
- package/dist/templates/CLAUDE.md +31 -40
- package/dist/templates/cc-native/.claude/settings.json +27 -27
- package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +10 -9
- package/dist/templates/cc-native/_cc-native/CLAUDE.md +18 -18
- package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +3 -3
- package/dist/templates/cc-native/_cc-native/artifacts/lib/format.ts +14 -14
- package/dist/templates/cc-native/_cc-native/artifacts/lib/tracker.ts +1 -1
- package/dist/templates/cc-native/_cc-native/artifacts/lib/write.ts +3 -3
- package/dist/templates/cc-native/_cc-native/cc-native.config.json +3 -3
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +16 -15
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +3 -3
- 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 +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +3 -3
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -2
- package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +3 -3
- package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +8 -8
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +4 -4
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +1 -1
- package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +8 -8
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +3 -3
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +3 -3
- package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +3 -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 +37 -15
- package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +16 -69
- package/dist/templates/cc-native/_cc-native/plan-review/lib/orchestrator.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/output-builder.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/plan-questions.ts +2 -2
- package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
- package/dist/templates/cc-native/_cc-native/plan-review/lib/review-pipeline.ts +7 -7
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +3 -3
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/index.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/claude-agent.ts +2 -2
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/codex-agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/gemini-agent.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/orchestrator-claude-agent.ts +5 -6
- package/dist/templates/core/.codex/workflows/codex.md +17 -0
- package/dist/templates/core/.codex/workflows/handoff.md +5 -0
- package/dist/templates/core/.codex/workflows/meta-plan.md +7 -0
- package/dist/templates/core/.cognition/AGENTS.md +5 -0
- package/dist/templates/core/.cognition/config.json +12 -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 +14 -23
- 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 +4 -3
- package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
- package/dist/templates/{_shared → core}/hooks-ts/pre_compact.ts +5 -5
- 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/agent-exec/backends/headless.ts +3 -2
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/tmux.ts +44 -15
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/base-agent.ts +6 -4
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/execution-backend.ts +1 -1
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/index.ts +2 -2
- package/dist/templates/{_shared → core}/lib-ts/agent-exec/structured-output.ts +4 -5
- 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 +32 -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 +168 -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 +93 -0
- package/dist/templates/core/lib-ts/package.json +19 -0
- package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +295 -0
- package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +106 -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 +8 -6
- 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 +59 -10
- 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 +2 -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 +11 -7
- 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 +4 -3
- 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 +61 -0
- package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
- package/dist/templates/{_shared → core}/scripts/status_line.ts +25 -20
- package/dist/templates/core/skills/codex/CLAUDE.md +78 -0
- package/dist/templates/{_shared → core}/skills/codex/SKILL.md +21 -18
- package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +76 -103
- package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +119 -133
- package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
- package/dist/templates/core/skills/devin/CLAUDE.md +65 -0
- package/dist/templates/core/skills/devin/SKILL.md +73 -0
- package/dist/templates/core/skills/devin/lib/devin-watcher.ts +280 -0
- package/dist/templates/core/skills/devin/scripts/launch-devin.ts +257 -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/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/task_create_capture.ts +0 -48
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
- 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/{_shared → core}/lib-ts/agent-exec/backends/index.ts +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { checkVersionCompatibility, configureTmuxSession, detectMultiplexer, ensureLspPatch, findExecutable, findToolPath, getClaudeCodeVersion, launchTerminal, ProcessSpawnError, quoteForSh, readSentinelExitCode, spawnProcess, waitForSentinelFile, } from '../../../platform/launch.js';
|
|
3
|
+
import { EXIT_CODES } from '../../../types/index.js';
|
|
4
|
+
import { buildSpawnedWindowArgs, buildUniqueSessionName, parseExtraEnv, resolvePromptText, sanitizeSessionName, } from '../runtime-core/launch-options.js';
|
|
5
|
+
function buildCodexArgs(platform) {
|
|
6
|
+
if (platform !== 'win32')
|
|
7
|
+
return ['--yolo'];
|
|
8
|
+
return ['-c', 'shell_type="bash"', '--yolo'];
|
|
9
|
+
}
|
|
10
|
+
function buildDevinArgs() {
|
|
11
|
+
return ['--permission-mode', 'dangerous'];
|
|
12
|
+
}
|
|
13
|
+
function toJsonLaunchResult(result, exitCode) {
|
|
14
|
+
return {
|
|
15
|
+
launched: result.launched,
|
|
16
|
+
backend: result.backend,
|
|
17
|
+
paneId: result.paneId ?? null,
|
|
18
|
+
sentinelPath: result.sentinelPath ?? null,
|
|
19
|
+
exitCode,
|
|
20
|
+
reason: result.reason ?? null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function resolveWaitExitCode(result, wait) {
|
|
24
|
+
if (!wait || !result.launched || !result.sentinelPath) {
|
|
25
|
+
return result.exitCode ?? null;
|
|
26
|
+
}
|
|
27
|
+
const finished = await waitForSentinelFile(result.sentinelPath, 14_400_000);
|
|
28
|
+
return finished ? readSentinelExitCode(result.sentinelPath, 1) : -1;
|
|
29
|
+
}
|
|
30
|
+
export async function executeLaunch(request, dependencies) {
|
|
31
|
+
const { cwd, flags, interactiveTty, platform, readPromptFile } = request;
|
|
32
|
+
const { host, now, pid, tempDir, writePromptFile } = dependencies;
|
|
33
|
+
delete process.env['CLAUDECODE'];
|
|
34
|
+
delete process.env['CLAUDE_CODE_ENTRYPOINT'];
|
|
35
|
+
const useCodex = flags.codex;
|
|
36
|
+
const useDevin = flags.devin;
|
|
37
|
+
if (platform === 'win32' && !useCodex && !useDevin) {
|
|
38
|
+
await ensureLspPatch({
|
|
39
|
+
debugLog: (message) => host.debug(message),
|
|
40
|
+
warn(message) {
|
|
41
|
+
host.warn(message);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const cliCommand = useDevin ? 'devin' : useCodex ? 'codex' : 'claude';
|
|
46
|
+
const cliArgs = useDevin ? buildDevinArgs() : useCodex ? buildCodexArgs(platform) : ['--dangerously-skip-permissions'];
|
|
47
|
+
const launchFlag = useDevin ? '--devin' : useCodex ? '--codex' : '';
|
|
48
|
+
const disableTmux = flags['no-tmux'];
|
|
49
|
+
const wantJson = flags.json;
|
|
50
|
+
const wantWait = flags.wait;
|
|
51
|
+
let extraEnv = {};
|
|
52
|
+
try {
|
|
53
|
+
extraEnv = parseExtraEnv(flags.env);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
host.error(error instanceof Error ? error.message : '--env must be a valid JSON object string', {
|
|
57
|
+
exit: EXIT_CODES.INVALID_USAGE,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const promptPath = flags['prompt-path']?.trim() || undefined;
|
|
61
|
+
const promptText = resolvePromptText(flags.prompt, flags['prompt-file'], readPromptFile);
|
|
62
|
+
if (flags.new) {
|
|
63
|
+
host.debug(`Launching new terminal in: ${cwd}`);
|
|
64
|
+
let promptFilePath;
|
|
65
|
+
if (!promptPath && promptText) {
|
|
66
|
+
promptFilePath = path.join(tempDir, `aiwcli-prompt-${now()}-${pid}.txt`);
|
|
67
|
+
writePromptFile(promptFilePath, promptText);
|
|
68
|
+
}
|
|
69
|
+
const launchArgs = buildSpawnedWindowArgs({
|
|
70
|
+
useCodex,
|
|
71
|
+
useDevin,
|
|
72
|
+
disableTmux,
|
|
73
|
+
...(promptPath ? { promptPath } : {}),
|
|
74
|
+
...(promptFilePath ? { promptFilePath } : {}),
|
|
75
|
+
...(flags.env ? { rawEnvJson: flags.env } : {}),
|
|
76
|
+
...(flags['tmux-session'] ? { tmuxSessionFlag: flags['tmux-session'] } : {}),
|
|
77
|
+
});
|
|
78
|
+
const launchCmd = launchArgs.map((arg) => quoteForSh(arg)).join(' ');
|
|
79
|
+
const result = await launchTerminal({
|
|
80
|
+
cwd,
|
|
81
|
+
command: launchCmd,
|
|
82
|
+
windowsShellPreference: platform === 'win32' ? 'mintty' : 'default',
|
|
83
|
+
debugLog: (message) => host.debug(message),
|
|
84
|
+
});
|
|
85
|
+
if (!result.success) {
|
|
86
|
+
host.error(`Failed to launch new terminal: ${result.error}`, { exit: EXIT_CODES.GENERAL_ERROR });
|
|
87
|
+
}
|
|
88
|
+
host.log(`New terminal launched with aiw launch${launchFlag ? ` ${launchFlag}` : ''}`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (useCodex) {
|
|
92
|
+
host.debug('Launching Codex with --yolo flag');
|
|
93
|
+
}
|
|
94
|
+
else if (useDevin) {
|
|
95
|
+
host.debug('Launching Devin with --permission-mode dangerous');
|
|
96
|
+
}
|
|
97
|
+
const [versionCheck, mux] = await Promise.all([
|
|
98
|
+
useCodex || useDevin
|
|
99
|
+
? null
|
|
100
|
+
: getClaudeCodeVersion().then((v) => checkVersionCompatibility(v)),
|
|
101
|
+
disableTmux ? null : detectMultiplexer(platform),
|
|
102
|
+
]);
|
|
103
|
+
if (versionCheck) {
|
|
104
|
+
host.debug(`Claude Code version: ${versionCheck.version ?? 'unknown'}`);
|
|
105
|
+
host.debug(`Compatibility status: ${versionCheck.compatible ? 'compatible' : 'incompatible'}`);
|
|
106
|
+
if (versionCheck.warning) {
|
|
107
|
+
host.warn(versionCheck.warning);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
let exitCode = 0;
|
|
111
|
+
try {
|
|
112
|
+
if (!mux) {
|
|
113
|
+
if (disableTmux) {
|
|
114
|
+
host.logInfo('Multiplexer disabled via --no-tmux — launching inline');
|
|
115
|
+
}
|
|
116
|
+
else if (!interactiveTty) {
|
|
117
|
+
host.logInfo('Non-interactive terminal — launching inline');
|
|
118
|
+
}
|
|
119
|
+
else if (platform === 'win32') {
|
|
120
|
+
host.logInfo('No multiplexer found — launching inline. Install psmux for session management: winget install psmux');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
host.logInfo('No multiplexer found — launching inline. Install tmux for session management.');
|
|
124
|
+
}
|
|
125
|
+
exitCode = await spawnProcess(cliCommand, promptText ? [...cliArgs, promptText] : cliArgs);
|
|
126
|
+
}
|
|
127
|
+
else if (mux.isInsideSession()) {
|
|
128
|
+
host.logInfo(`Inside ${mux.backend} session — splitting new pane`);
|
|
129
|
+
if (mux.backend === 'tmux') {
|
|
130
|
+
configureTmuxSession();
|
|
131
|
+
}
|
|
132
|
+
let effectivePromptPath = promptPath;
|
|
133
|
+
if (!effectivePromptPath && promptText) {
|
|
134
|
+
effectivePromptPath = path.join(tempDir, `aiwcli-prompt-${now()}-${pid}.txt`);
|
|
135
|
+
writePromptFile(effectivePromptPath, promptText);
|
|
136
|
+
}
|
|
137
|
+
const splitResult = await mux.splitPane({
|
|
138
|
+
toolName: cliCommand,
|
|
139
|
+
args: cliArgs,
|
|
140
|
+
env: extraEnv,
|
|
141
|
+
cwd,
|
|
142
|
+
split: flags.split ?? 'auto',
|
|
143
|
+
promptPath: effectivePromptPath,
|
|
144
|
+
sentinel: wantWait || wantJson,
|
|
145
|
+
});
|
|
146
|
+
if (wantJson) {
|
|
147
|
+
const jsonExitCode = await resolveWaitExitCode(splitResult, wantWait);
|
|
148
|
+
host.log(JSON.stringify(toJsonLaunchResult(splitResult, jsonExitCode)));
|
|
149
|
+
host.exit(jsonExitCode ?? 0);
|
|
150
|
+
}
|
|
151
|
+
if (splitResult.launched) {
|
|
152
|
+
if (splitResult.paneId) {
|
|
153
|
+
host.logInfo(`Launched in ${mux.backend} pane: ${splitResult.paneId}`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
host.logInfo(`Launched in ${mux.backend}`);
|
|
157
|
+
}
|
|
158
|
+
if (wantWait && splitResult.sentinelPath) {
|
|
159
|
+
const waitedExitCode = await resolveWaitExitCode(splitResult, true);
|
|
160
|
+
host.exit(waitedExitCode ?? 1);
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
host.logWarning(`Pane split failed (${splitResult.reason}), launching directly`);
|
|
165
|
+
exitCode = await spawnProcess(cliCommand, promptText ? [...cliArgs, promptText] : cliArgs);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const resolvedPath = mux.backend === 'psmux' ? findExecutable(cliCommand) : findToolPath(cliCommand);
|
|
169
|
+
if (resolvedPath) {
|
|
170
|
+
const sessionFromFlag = flags['tmux-session']?.trim();
|
|
171
|
+
const reattach = Boolean(sessionFromFlag && sessionFromFlag.length > 0);
|
|
172
|
+
const sessionName = reattach
|
|
173
|
+
? sanitizeSessionName(sessionFromFlag)
|
|
174
|
+
: buildUniqueSessionName(`aiw-${path.basename(cwd)}`, now(), pid);
|
|
175
|
+
if (reattach) {
|
|
176
|
+
host.logInfo(`Launching in ${mux.backend} session: ${sessionName} (reuse/attach)`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
host.logInfo(`Launching in new ${mux.backend} session: ${sessionName}`);
|
|
180
|
+
}
|
|
181
|
+
const result = await mux.createSession({
|
|
182
|
+
sessionName,
|
|
183
|
+
reattach,
|
|
184
|
+
toolPath: resolvedPath,
|
|
185
|
+
toolArgs: cliArgs,
|
|
186
|
+
promptText,
|
|
187
|
+
});
|
|
188
|
+
if (result.usedMux) {
|
|
189
|
+
exitCode = result.exitCode;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
if (result.reason) {
|
|
193
|
+
if (result.reason.includes('not found') || result.reason.includes('unavailable')) {
|
|
194
|
+
host.logWarning(`${mux.backend} unavailable — launching inline. ${mux.backend === 'psmux' ? 'Install with: winget install psmux' : ''}`);
|
|
195
|
+
}
|
|
196
|
+
else if (result.reason.includes('too old')) {
|
|
197
|
+
host.logWarning(`${result.reason} — launching inline. ${mux.backend === 'psmux' ? 'Update with: winget upgrade psmux' : ''}`);
|
|
198
|
+
}
|
|
199
|
+
else if (mux.backend === 'psmux' && result.reason.includes('attach failed')) {
|
|
200
|
+
host.logWarning(`${result.reason} — launching inline. Recovery: run "psmux kill-server" and relaunch if this persists.`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
host.logWarning(`${result.reason} — launching inline`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exitCode = await spawnProcess(cliCommand, promptText ? [...cliArgs, promptText] : cliArgs);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
host.logWarning(`${cliCommand} not found on PATH (install from https://claude.ai/download)`);
|
|
211
|
+
exitCode = await spawnProcess(cliCommand, promptText ? [...cliArgs, promptText] : cliArgs);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error instanceof ProcessSpawnError) {
|
|
217
|
+
host.error(error.message, { exit: EXIT_CODES.ENVIRONMENT_ERROR });
|
|
218
|
+
}
|
|
219
|
+
host.error('Unexpected launch failure.', { exit: EXIT_CODES.GENERAL_ERROR });
|
|
220
|
+
}
|
|
221
|
+
host.exit(exitCode);
|
|
222
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface BuildSpawnedWindowArgsParams {
|
|
2
|
+
disableTmux: boolean;
|
|
3
|
+
promptFilePath?: string | undefined;
|
|
4
|
+
promptPath?: string | undefined;
|
|
5
|
+
rawEnvJson?: string | undefined;
|
|
6
|
+
tmuxSessionFlag?: string | undefined;
|
|
7
|
+
useCodex: boolean;
|
|
8
|
+
useDevin?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseExtraEnv(raw: string | undefined): Record<string, string>;
|
|
11
|
+
export declare function resolvePromptText(promptFlag: string | undefined, promptFileFlag: string | undefined, readFile: (filePath: string) => string | undefined): string | undefined;
|
|
12
|
+
export declare function buildSpawnedWindowArgs(params: BuildSpawnedWindowArgsParams): string[];
|
|
13
|
+
export declare function sanitizeSessionName(input: string): string;
|
|
14
|
+
export declare function buildUniqueSessionName(base: string, now?: number, pid?: number): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export function parseExtraEnv(raw) {
|
|
2
|
+
if (!raw)
|
|
3
|
+
return {};
|
|
4
|
+
let parsed;
|
|
5
|
+
try {
|
|
6
|
+
parsed = JSON.parse(raw);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
throw new Error('--env must be a valid JSON object string');
|
|
10
|
+
}
|
|
11
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
12
|
+
throw new Error('--env must be a valid JSON object string');
|
|
13
|
+
}
|
|
14
|
+
return parsed;
|
|
15
|
+
}
|
|
16
|
+
export function resolvePromptText(promptFlag, promptFileFlag, readFile) {
|
|
17
|
+
const promptText = promptFlag?.trim();
|
|
18
|
+
if (promptText)
|
|
19
|
+
return promptText;
|
|
20
|
+
const promptFilePath = promptFileFlag?.trim();
|
|
21
|
+
if (!promptFilePath)
|
|
22
|
+
return undefined;
|
|
23
|
+
try {
|
|
24
|
+
const fromFile = readFile(promptFilePath)?.trim();
|
|
25
|
+
return fromFile || undefined;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function buildSpawnedWindowArgs(params) {
|
|
32
|
+
const { useCodex, useDevin, disableTmux, promptFilePath, promptPath, rawEnvJson, tmuxSessionFlag } = params;
|
|
33
|
+
const parts = ['aiw', 'launch', '--spawned-window'];
|
|
34
|
+
if (useDevin)
|
|
35
|
+
parts.push('--devin');
|
|
36
|
+
else if (useCodex)
|
|
37
|
+
parts.push('--codex');
|
|
38
|
+
if (disableTmux)
|
|
39
|
+
parts.push('--no-tmux');
|
|
40
|
+
const tmuxSession = tmuxSessionFlag?.trim();
|
|
41
|
+
if (tmuxSession) {
|
|
42
|
+
parts.push('--tmux-session', tmuxSession);
|
|
43
|
+
}
|
|
44
|
+
const envJson = rawEnvJson?.trim();
|
|
45
|
+
if (envJson) {
|
|
46
|
+
parts.push('--env', envJson);
|
|
47
|
+
}
|
|
48
|
+
if (promptPath) {
|
|
49
|
+
parts.push('--prompt-path', promptPath);
|
|
50
|
+
}
|
|
51
|
+
else if (promptFilePath) {
|
|
52
|
+
parts.push('--prompt-file', promptFilePath);
|
|
53
|
+
}
|
|
54
|
+
return parts;
|
|
55
|
+
}
|
|
56
|
+
export function sanitizeSessionName(input) {
|
|
57
|
+
const trimmed = input.trim().toLowerCase();
|
|
58
|
+
const safe = trimmed
|
|
59
|
+
.replaceAll(/[^a-z0-9_-]/g, '-')
|
|
60
|
+
.replaceAll(/-+/g, '-')
|
|
61
|
+
.replaceAll(/^[-_]+|[-_]+$/g, '');
|
|
62
|
+
return safe || 'aiw';
|
|
63
|
+
}
|
|
64
|
+
export function buildUniqueSessionName(base, now = Date.now(), pid = process.pid) {
|
|
65
|
+
const safeBase = sanitizeSessionName(base);
|
|
66
|
+
const timestamp = now.toString(36);
|
|
67
|
+
const pidPart = pid.toString(36);
|
|
68
|
+
return sanitizeSessionName(`${safeBase}-${timestamp}-${pidPart}`);
|
|
69
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { type Ora } from 'ora';
|
|
3
|
+
export default abstract class BaseCommand extends Command {
|
|
4
|
+
static baseFlags: {
|
|
5
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
6
|
+
help: import("@oclif/core/interfaces").BooleanFlag<void>;
|
|
7
|
+
quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
};
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
protected isQuiet(): boolean;
|
|
11
|
+
protected logDebug(message: string): void;
|
|
12
|
+
protected logError(message: string): void;
|
|
13
|
+
protected logInfo(message: string): void;
|
|
14
|
+
protected logSuccess(message: string): void;
|
|
15
|
+
protected logWarning(message: string): void;
|
|
16
|
+
abstract run(): Promise<void>;
|
|
17
|
+
protected spinner(text: string): Ora;
|
|
18
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { debugVersion, setDebugEnabled } from '../lib/debug.js';
|
|
3
|
+
import { logDebug, logError, logInfo, logSuccess, logWarning } from '../lib/output.js';
|
|
4
|
+
import { isQuietMode, setQuietMode } from '../lib/quiet.js';
|
|
5
|
+
import { createSpinner } from '../lib/spinner.js';
|
|
6
|
+
export default class BaseCommand extends Command {
|
|
7
|
+
static baseFlags = {
|
|
8
|
+
debug: Flags.boolean({
|
|
9
|
+
char: 'd',
|
|
10
|
+
description: 'Enable verbose debug logging',
|
|
11
|
+
default: false,
|
|
12
|
+
}),
|
|
13
|
+
help: Flags.help({
|
|
14
|
+
char: 'h',
|
|
15
|
+
description: 'Show help for command',
|
|
16
|
+
}),
|
|
17
|
+
quiet: Flags.boolean({
|
|
18
|
+
char: 'q',
|
|
19
|
+
description: 'Suppress informational output (errors still shown)',
|
|
20
|
+
default: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
async init() {
|
|
24
|
+
await super.init();
|
|
25
|
+
const { flags } = await this.parse(this.constructor);
|
|
26
|
+
const debugEnabled = flags.debug ?? false;
|
|
27
|
+
const quietEnabled = flags.quiet ?? false;
|
|
28
|
+
setDebugEnabled(debugEnabled);
|
|
29
|
+
setQuietMode(quietEnabled);
|
|
30
|
+
if (debugEnabled) {
|
|
31
|
+
debugVersion();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
isQuiet() {
|
|
35
|
+
return isQuietMode();
|
|
36
|
+
}
|
|
37
|
+
logDebug(message) {
|
|
38
|
+
logDebug(message);
|
|
39
|
+
}
|
|
40
|
+
logError(message) {
|
|
41
|
+
logError(message);
|
|
42
|
+
}
|
|
43
|
+
logInfo(message) {
|
|
44
|
+
logInfo(message, this.isQuiet());
|
|
45
|
+
}
|
|
46
|
+
logSuccess(message) {
|
|
47
|
+
logSuccess(message, this.isQuiet());
|
|
48
|
+
}
|
|
49
|
+
logWarning(message) {
|
|
50
|
+
logWarning(message, this.isQuiet());
|
|
51
|
+
}
|
|
52
|
+
spinner(text) {
|
|
53
|
+
return createSpinner(text, { quiet: isQuietMode() });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -22,24 +22,4 @@ export default class BranchCommand extends BaseCommand {
|
|
|
22
22
|
quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
23
23
|
};
|
|
24
24
|
run(): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* Handle --delete flag: Delete git branch and worktree folder
|
|
27
|
-
*/
|
|
28
|
-
private handleDelete;
|
|
29
|
-
/**
|
|
30
|
-
* Handle --delete --all flags: Clean up all worktrees safely
|
|
31
|
-
*/
|
|
32
|
-
private handleDeleteAll;
|
|
33
|
-
/**
|
|
34
|
-
* Handle --main flag: Launch aiw in main/master branch
|
|
35
|
-
*/
|
|
36
|
-
private handleMainBranch;
|
|
37
|
-
/**
|
|
38
|
-
* Handle --launch flag: Create or open worktree in sibling folder
|
|
39
|
-
*/
|
|
40
|
-
private handleWorktreeLaunch;
|
|
41
|
-
/**
|
|
42
|
-
* Check if current directory is a git repository
|
|
43
|
-
*/
|
|
44
|
-
private isGitRepository;
|
|
45
25
|
}
|