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,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: handoff-resume
|
|
3
|
+
description: Resume session from a handoff document. USE WHEN resume handoff OR continue from handoff OR restore session context OR pick up where we left off.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Handoff Resume
|
|
8
|
+
|
|
9
|
+
Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
|
|
10
|
+
|
|
11
|
+
**Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meta-plan
|
|
3
|
+
description: Prompt amplifier for complex problems. USE WHEN meta-plan OR chain reasoning OR dissect problem OR help me figure out the right approach.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MetaPlan -- Prompt Amplifier
|
|
8
|
+
|
|
9
|
+
Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis -- not as steps to execute.
|
|
10
|
+
|
|
11
|
+
**Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
|
|
12
|
+
|
|
13
|
+
**Produces:** An amplified request document (problem decomposition, approaches, trade-offs, risks, recommendation). Does NOT produce implementation steps -- those are the next session's job.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Devin Notes
|
|
2
|
+
|
|
3
|
+
On Windows, keep any filesystem paths that appear in `.devin` config text or agent instructions in forward-slash form when they are meant to be read by Devin.
|
|
4
|
+
|
|
5
|
+
Reason: raw backslash paths like `C:\tmp\foo.txt` are easy for the runtime to preserve but easy for the model-side parser to misread or de-escape. Use `C:/tmp/foo.txt` in human-readable instructions; keep native Windows paths only where a shell or PowerShell command is actually executing them.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codex
|
|
3
|
+
description: Delegate implementation to Codex sub-agents. USE WHEN codex OR send to codex OR codex implement OR hand off to codex OR launch codex OR run codex.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Codex Workflow
|
|
8
|
+
|
|
9
|
+
Delegate work to a Codex sub-agent. The launch script handles prompt construction internally — you just run the command and pass the mode/flags.
|
|
10
|
+
|
|
11
|
+
**IMPORTANT:** Never include the launch command path, script path, or any `.aiwcli/` internal paths in the delegation prompt or inline text arguments. The script constructs Codex's prompt internally. Leaking internal paths into the prompt causes Codex to recurse.
|
|
12
|
+
|
|
13
|
+
## Command
|
|
14
|
+
|
|
15
|
+
`bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [flags] <mode>`
|
|
16
|
+
|
|
17
|
+
**Modes:** `plan` | `--file <path>` | `<inline text...>`
|
|
18
|
+
|
|
19
|
+
**Flags:** `--model <name>`, `--sandbox <mode>`, `--context <id>`, `--prompt <text>`, `--no-yolo`, `--no-watch`
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devin
|
|
3
|
+
description: "Self-reference guard: you ARE Devin. Do not invoke this skill."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Devin (Self-Reference Guard)
|
|
8
|
+
|
|
9
|
+
**You are already running as Devin.** Do not attempt to launch another Devin instance.
|
|
10
|
+
|
|
11
|
+
If asked to delegate work to Devin, you should perform the work directly — you are the Devin agent.
|
|
12
|
+
|
|
13
|
+
To delegate to a *different* agent, use the codex skill instead.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: handoff
|
|
3
|
+
description: Create handoff document to preserve session context for future sessions. USE WHEN handoff OR write a handoff OR create session summary OR document what we did OR end session with notes.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Handoff
|
|
8
|
+
|
|
9
|
+
Load and execute the handoff workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff.md`.
|
|
10
|
+
|
|
11
|
+
**Triggers:** "/handoff", "write a handoff", "create a session summary", "document what we did", "end session with notes"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: handoff-resume
|
|
3
|
+
description: Resume session from a handoff document. USE WHEN resume handoff OR continue from handoff OR restore session context OR pick up where we left off.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Handoff Resume
|
|
8
|
+
|
|
9
|
+
Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
|
|
10
|
+
|
|
11
|
+
**Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meta-plan
|
|
3
|
+
description: Prompt amplifier for complex problems. USE WHEN meta-plan OR chain reasoning OR dissect problem OR help me figure out the right approach.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MetaPlan -- Prompt Amplifier
|
|
8
|
+
|
|
9
|
+
Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis -- not as steps to execute.
|
|
10
|
+
|
|
11
|
+
**Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
|
|
12
|
+
|
|
13
|
+
**Produces:** An amplified request document (problem decomposition, approaches, trade-offs, risks, recommendation). Does NOT produce implementation steps -- those are the next session's job.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Resume session from a handoff document
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Handoff Resume
|
|
6
|
+
|
|
7
|
+
Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
|
|
8
|
+
|
|
9
|
+
**Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
|
|
@@ -4,6 +4,6 @@ description: Create handoff document to preserve session context for future sess
|
|
|
4
4
|
|
|
5
5
|
# Handoff
|
|
6
6
|
|
|
7
|
-
Load and execute the handoff workflow from `.aiwcli/
|
|
7
|
+
Load and execute the handoff workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff.md`.
|
|
8
8
|
|
|
9
9
|
**Triggers:** "/handoff", "write a handoff", "create a session summary", "document what we did", "end session with notes"
|
|
@@ -4,7 +4,7 @@ description: Prompt amplifier for complex problems — analyzes a request throug
|
|
|
4
4
|
|
|
5
5
|
# MetaPlan — Prompt Amplifier
|
|
6
6
|
|
|
7
|
-
Load and engage with the reasoning framework at `.aiwcli/
|
|
7
|
+
Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis — not as steps to execute.
|
|
8
8
|
|
|
9
9
|
**Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
|
|
10
10
|
|
|
@@ -6,42 +6,21 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from "node:fs";
|
|
8
8
|
import * as os from "node:os";
|
|
9
|
-
import
|
|
9
|
+
import path from "node:path";
|
|
10
10
|
|
|
11
|
-
import { getContextDir, getProjectRoot } from "../lib-ts/base/constants.js";
|
|
12
|
-
import {
|
|
13
|
-
loadHookInput, logDebug, logError, logInfo, logWarn, runHookAsync,
|
|
14
|
-
} from "../lib-ts/base/hook-utils.js";
|
|
15
|
-
import { getContextBySessionId } from "../lib-ts/context/context-store.js";
|
|
16
11
|
import {
|
|
17
12
|
archivePlan, extractPlanPathFromResult, findPlanPathInTranscript,
|
|
18
13
|
} from "../lib-ts/context/plan-manager.js";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
25
|
-
let best: null | { mtime: number; path: string; } = null;
|
|
26
|
-
for (const e of entries) {
|
|
27
|
-
if (!e.isFile() || !e.name.endsWith(".md")) continue;
|
|
28
|
-
const fullPath = path.join(dir, e.name);
|
|
29
|
-
const stat = fs.statSync(fullPath);
|
|
30
|
-
if (!best || stat.mtimeMs > best.mtime) {
|
|
31
|
-
best = { path: fullPath, mtime: stat.mtimeMs };
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return best?.path ?? null;
|
|
36
|
-
} catch {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
14
|
+
import {
|
|
15
|
+
loadHookInput, logDebug, logError, logInfo, logWarn, requireBoundSession, runHookAsync,
|
|
16
|
+
} from "../lib-ts/hooks/hook-utils.js";
|
|
17
|
+
import { getContextDir } from "../lib-ts/runtime/constants.js";
|
|
18
|
+
import { mostRecentMd } from "../lib-ts/runtime/utils.js";
|
|
40
19
|
|
|
41
20
|
/** Multi-strategy plan path discovery */
|
|
42
|
-
function findPlanPath(payload: Record<string,
|
|
21
|
+
function findPlanPath(payload: Record<string, unknown>, projectRoot: string): null | string {
|
|
43
22
|
const toolResult = payload.tool_result as string | undefined;
|
|
44
|
-
const toolInput = (payload.tool_input ?? {}) as Record<string,
|
|
23
|
+
const toolInput = (payload.tool_input ?? {}) as Record<string, unknown>;
|
|
45
24
|
const transcriptPath = payload.transcript_path as string | undefined;
|
|
46
25
|
|
|
47
26
|
// Strategy 1: Extract from tool result
|
|
@@ -100,20 +79,17 @@ async function asyncMain(): Promise<void> {
|
|
|
100
79
|
}
|
|
101
80
|
|
|
102
81
|
// Check stop flag
|
|
103
|
-
if ((payload as
|
|
82
|
+
if ((payload as unknown).stop_hook_active) {
|
|
104
83
|
logDebug("archive_plan", "stop_hook_active set, skipping");
|
|
105
84
|
return;
|
|
106
85
|
}
|
|
107
86
|
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
logWarn("archive_plan", "No session_id");
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
87
|
+
const bound = requireBoundSession("archive_plan", payload);
|
|
88
|
+
if (!bound) return;
|
|
89
|
+
const { projectRoot, state } = bound;
|
|
114
90
|
|
|
115
91
|
// Find plan path
|
|
116
|
-
let planPath = findPlanPath(payload as Record<string,
|
|
92
|
+
let planPath = findPlanPath(payload as Record<string, unknown>, projectRoot);
|
|
117
93
|
if (!planPath) {
|
|
118
94
|
logWarn("archive_plan", "Could not locate plan file");
|
|
119
95
|
return;
|
|
@@ -130,13 +106,6 @@ async function asyncMain(): Promise<void> {
|
|
|
130
106
|
return;
|
|
131
107
|
}
|
|
132
108
|
|
|
133
|
-
// Find bound context
|
|
134
|
-
const state = getContextBySessionId(sessionId, projectRoot);
|
|
135
|
-
if (!state) {
|
|
136
|
-
logWarn("archive_plan", `No context bound to session ${sessionId}`);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
109
|
// Archive the plan (async — uses AI for slug generation)
|
|
141
110
|
const [archivedPath, planHash, _planSignature] = await archivePlan(planPath, state.id, projectRoot);
|
|
142
111
|
|
|
@@ -157,3 +126,5 @@ async function asyncMain(): Promise<void> {
|
|
|
157
126
|
}
|
|
158
127
|
|
|
159
128
|
runHookAsync(asyncMain, "archive_plan");
|
|
129
|
+
|
|
130
|
+
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* UserPromptSubmit hook: One-shot Codex codebase exploration for first plan-mode prompt.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
emitContext, loadHookInput, logDebug, logInfo, logWarn, runHookAsync,
|
|
10
|
+
} from "../lib-ts/hooks/hook-utils.js";
|
|
11
|
+
import { getOutputDir, getProjectRoot } from "../lib-ts/runtime/constants.js";
|
|
12
|
+
import { codexInferAsync } from "../lib-ts/runtime/inference.js";
|
|
13
|
+
import { CODEX_MODELS } from "../lib-ts/runtime/models.js";
|
|
14
|
+
|
|
15
|
+
const MAX_PROMPT_CHARS = 8000;
|
|
16
|
+
const SPARK_TIMEOUT_SECONDS = 50;
|
|
17
|
+
const FIRED_FILENAME = ".codex-explorer-fired";
|
|
18
|
+
const MAX_FIRED_LINES = 200;
|
|
19
|
+
const PRUNE_KEEP = 100;
|
|
20
|
+
|
|
21
|
+
function getCacheFilePath(projectRoot: string): string {
|
|
22
|
+
return path.join(getOutputDir(projectRoot), FIRED_FILENAME);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function hasSessionFired(sessionId: string, projectRoot: string): boolean {
|
|
26
|
+
const filePath = getCacheFilePath(projectRoot);
|
|
27
|
+
try {
|
|
28
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
29
|
+
return content.split("\n").includes(sessionId);
|
|
30
|
+
} catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function markSessionFired(sessionId: string, projectRoot: string): void {
|
|
36
|
+
const filePath = getCacheFilePath(projectRoot);
|
|
37
|
+
const outputDir = getOutputDir(projectRoot);
|
|
38
|
+
|
|
39
|
+
if (!fs.existsSync(outputDir)) {
|
|
40
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fs.appendFileSync(filePath, sessionId + "\n");
|
|
44
|
+
|
|
45
|
+
// Prune if over limit
|
|
46
|
+
try {
|
|
47
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
48
|
+
const lines = content.split("\n").filter(Boolean);
|
|
49
|
+
if (lines.length > MAX_FIRED_LINES) {
|
|
50
|
+
const pruned = lines.slice(lines.length - PRUNE_KEEP);
|
|
51
|
+
fs.writeFileSync(filePath, pruned.join("\n") + "\n");
|
|
52
|
+
logDebug("codex_explorer", `Pruned fired cache from ${lines.length} to ${pruned.length} entries`);
|
|
53
|
+
}
|
|
54
|
+
} catch (error) {
|
|
55
|
+
logWarn("codex_explorer", `Failed to prune fired cache: ${error}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Parse Codex JSONL output into clean agent message text.
|
|
61
|
+
* Codex --json returns streaming events; we extract only agent_message text.
|
|
62
|
+
*/
|
|
63
|
+
function parseCodexOutput(raw: string): string {
|
|
64
|
+
const lines = raw.split("\n").filter(Boolean);
|
|
65
|
+
const parts: string[] = [];
|
|
66
|
+
for (const line of lines) {
|
|
67
|
+
try {
|
|
68
|
+
const event = JSON.parse(line);
|
|
69
|
+
if (event.type !== "item.completed") continue;
|
|
70
|
+
const item = event.item;
|
|
71
|
+
if (item?.type === "agent_message" && item.text) {
|
|
72
|
+
parts.push(item.text);
|
|
73
|
+
}
|
|
74
|
+
} catch { /* skip non-JSON lines */ }
|
|
75
|
+
}
|
|
76
|
+
return parts.join("\n\n") || raw;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function buildExplorerPrompt(userPrompt: string): string {
|
|
80
|
+
const trimmed = userPrompt.trim();
|
|
81
|
+
const clipped = trimmed.length > MAX_PROMPT_CHARS
|
|
82
|
+
? `${trimmed.slice(0, MAX_PROMPT_CHARS)}...`
|
|
83
|
+
: trimmed;
|
|
84
|
+
|
|
85
|
+
return [
|
|
86
|
+
"You are a codebase explorer.",
|
|
87
|
+
"The user is starting planning work in plan mode.",
|
|
88
|
+
"Search the current repository and identify the most relevant files, patterns, and types.",
|
|
89
|
+
"",
|
|
90
|
+
"Focus on:",
|
|
91
|
+
"- Files likely to require changes",
|
|
92
|
+
"- Existing utilities/helpers that match the request",
|
|
93
|
+
"- Key functions, classes, types, and interfaces",
|
|
94
|
+
"- Relevant tests and configuration files",
|
|
95
|
+
"",
|
|
96
|
+
"Return a concise report (maximum ~2000 characters).",
|
|
97
|
+
"Do not suggest implementation steps. Only report what exists and where.",
|
|
98
|
+
"",
|
|
99
|
+
"User prompt:",
|
|
100
|
+
"---",
|
|
101
|
+
clipped,
|
|
102
|
+
"---",
|
|
103
|
+
].join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main(): Promise<void> {
|
|
107
|
+
const payload = loadHookInput();
|
|
108
|
+
if (!payload) return;
|
|
109
|
+
|
|
110
|
+
const permissionMode = payload.permission_mode ?? "";
|
|
111
|
+
if (permissionMode !== "plan") {
|
|
112
|
+
logDebug("codex_explorer", `Skip: permission_mode=${permissionMode || "none"}`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const prompt = (payload as unknown as { prompt?: string }).prompt?.trim() ?? "";
|
|
117
|
+
if (!prompt) {
|
|
118
|
+
logDebug("codex_explorer", "Skip: no prompt");
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const sessionId = payload.session_id;
|
|
123
|
+
if (!sessionId) {
|
|
124
|
+
logDebug("codex_explorer", "Skip: no session_id");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const projectRoot = getProjectRoot(payload.cwd);
|
|
129
|
+
|
|
130
|
+
if (hasSessionFired(sessionId, projectRoot)) {
|
|
131
|
+
logDebug("codex_explorer", `Skip: already fired for session ${sessionId}`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const startedAt = Date.now();
|
|
136
|
+
const explorerPrompt = buildExplorerPrompt(prompt);
|
|
137
|
+
const result = await codexInferAsync(
|
|
138
|
+
explorerPrompt,
|
|
139
|
+
CODEX_MODELS.spark,
|
|
140
|
+
{ sandbox: "read-only", timeout: SPARK_TIMEOUT_SECONDS },
|
|
141
|
+
);
|
|
142
|
+
const elapsedMs = Date.now() - startedAt;
|
|
143
|
+
|
|
144
|
+
if (!result.success || !result.output) {
|
|
145
|
+
logWarn(
|
|
146
|
+
"codex_explorer",
|
|
147
|
+
`Explorer inference failed after ${elapsedMs}ms: ${result.error ?? "empty output"}`,
|
|
148
|
+
);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const cleanOutput = parseCodexOutput(result.output);
|
|
153
|
+
emitContext(cleanOutput);
|
|
154
|
+
logInfo("codex_explorer", `Explorer context emitted in ${elapsedMs}ms`);
|
|
155
|
+
|
|
156
|
+
markSessionFired(sessionId, projectRoot);
|
|
157
|
+
logDebug("codex_explorer", `Marked session ${sessionId} as fired`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
runHookAsync(main, "codex_explorer");
|
|
@@ -3,53 +3,28 @@
|
|
|
3
3
|
* PostToolUse:* hook: Monitor context window usage, trigger mode transitions,
|
|
4
4
|
* and progressive-save state when context runs low.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { getContextBySessionId, saveState } from "../lib-ts/context/context-store.js";
|
|
7
|
+
import { selectWarningMessage } from "../lib-ts/hooks/context-monitor-logic.js";
|
|
7
8
|
import {
|
|
8
9
|
emitContext, getContextPercentRemaining, hookLog,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from "../lib-ts/
|
|
12
|
-
import { nowIso } from "../lib-ts/base/utils.js";
|
|
13
|
-
import { getContextBySessionId, maybeActivate, saveState } from "../lib-ts/context/context-store.js";
|
|
10
|
+
requireBoundSession, logDebug, logDiagnostic, logInfo, runHook, safeMaybeActivate,
|
|
11
|
+
} from "../lib-ts/hooks/hook-utils.js";
|
|
12
|
+
import { nowIso } from "../lib-ts/runtime/utils.js";
|
|
14
13
|
import type { ContextState } from "../lib-ts/types.js";
|
|
15
14
|
|
|
16
15
|
const WRITE_TOOLS = new Set(["Bash", "Edit", "NotebookEdit", "Write"]);
|
|
17
16
|
|
|
18
17
|
const SAVE_STATE_THRESHOLD = 60;
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
"This session is approaching its context limit. Consider:\n\n" +
|
|
22
|
-
"- Completing your current task, then pausing for the user to decide next steps\n" +
|
|
23
|
-
"- If significant work remains, mention that `/aiwcli-shared:handoff` can capture progress " +
|
|
24
|
-
"for a fresh session\n\n" +
|
|
25
|
-
"Do not rush or cut corners — finish the current task properly. " +
|
|
26
|
-
"Just be aware that starting large new tasks may not complete before context runs out.";
|
|
27
|
-
|
|
28
|
-
const CONTEXT_WARNING_15 = "## Context Window: ~15% Remaining — Wrap Up Now\n\n" +
|
|
29
|
-
"Context is critically low. After completing your current step:\n\n" +
|
|
30
|
-
"1. **Stop taking on new work**\n" +
|
|
31
|
-
"2. Summarize what was accomplished and what remains\n" +
|
|
32
|
-
"3. Offer to run `/aiwcli-shared:handoff` so progress transfers to a fresh session\n\n" +
|
|
33
|
-
"Do not start new multi-step tasks. Focus on clean closure.";
|
|
34
|
-
|
|
35
|
-
const WARNING_THRESHOLDS = [
|
|
36
|
-
{ pct: 15, msg: CONTEXT_WARNING_15 }, // Most urgent first
|
|
37
|
-
{ pct: 30, msg: CONTEXT_WARNING_30 },
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
/** Transition idle/has_plan → active when implementation tools are used. */
|
|
19
|
+
/** Transition idle/has_staged_work → active when implementation tools are used. */
|
|
41
20
|
function checkAndTransitionMode(
|
|
42
|
-
|
|
21
|
+
stateId: string,
|
|
43
22
|
toolName: string | undefined,
|
|
44
23
|
permissionMode: string,
|
|
45
24
|
projectRoot: string,
|
|
46
25
|
): void {
|
|
47
26
|
if (!toolName || !WRITE_TOOLS.has(toolName)) return;
|
|
48
|
-
|
|
49
|
-
maybeActivate(state.id, permissionMode, projectRoot, "context_monitor");
|
|
50
|
-
} catch (error) {
|
|
51
|
-
logWarn("context_monitor", `maybeActivate failed (non-critical): ${error}`);
|
|
52
|
-
}
|
|
27
|
+
safeMaybeActivate(stateId, permissionMode, projectRoot, "context_monitor");
|
|
53
28
|
}
|
|
54
29
|
|
|
55
30
|
/** Save state snapshot at SAVE_STATE_THRESHOLD. */
|
|
@@ -82,38 +57,31 @@ function checkContextWarnings(
|
|
|
82
57
|
state.last_session = {};
|
|
83
58
|
}
|
|
84
59
|
const fired = state.last_session.context_warnings_fired ?? [];
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
60
|
+
const warning = selectWarningMessage(pctRemaining, fired);
|
|
61
|
+
if (!warning) return;
|
|
62
|
+
|
|
63
|
+
emitContext(warning.msg);
|
|
64
|
+
state.last_session.context_warnings_fired = [...fired, warning.pct];
|
|
65
|
+
saveState(state.id, state, projectRoot);
|
|
66
|
+
logInfo(
|
|
67
|
+
"context_monitor",
|
|
68
|
+
`Context warning emitted at ${warning.pct}% threshold`,
|
|
69
|
+
);
|
|
95
70
|
}
|
|
96
71
|
|
|
97
72
|
function main(): void {
|
|
98
|
-
const
|
|
99
|
-
if (!
|
|
73
|
+
const bound = requireBoundSession("context_monitor");
|
|
74
|
+
if (!bound) return;
|
|
100
75
|
|
|
101
|
-
const sessionId =
|
|
102
|
-
if (!sessionId) return;
|
|
103
|
-
|
|
104
|
-
const projectRoot = getProjectRoot(payload.cwd);
|
|
76
|
+
const { payload, sessionId, projectRoot } = bound;
|
|
105
77
|
const permissionMode = payload.permission_mode ?? "";
|
|
106
78
|
const toolName = payload.tool_name;
|
|
107
79
|
|
|
108
80
|
// Initial context lookup
|
|
109
|
-
let state =
|
|
110
|
-
if (!state) {
|
|
111
|
-
logDebug("context_monitor", `No context for session ${sessionId}`);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
81
|
+
let state = bound.state;
|
|
114
82
|
|
|
115
83
|
// Phase 1: Mode transition for write tools
|
|
116
|
-
checkAndTransitionMode(state, toolName, permissionMode, projectRoot);
|
|
84
|
+
checkAndTransitionMode(state.id, toolName, permissionMode, projectRoot);
|
|
117
85
|
|
|
118
86
|
// Phase 2: Context window check (log only, no warnings emitted)
|
|
119
87
|
const [pctRemaining, tokensUsed, maxTokens] = getContextPercentRemaining(payload);
|
|
@@ -4,32 +4,14 @@
|
|
|
4
4
|
* Outputs a plain JSON array (NOT hookSpecificOutput).
|
|
5
5
|
*/
|
|
6
6
|
import * as fs from "node:fs";
|
|
7
|
-
import
|
|
7
|
+
import path from "node:path";
|
|
8
8
|
|
|
9
|
-
import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/base/constants.js";
|
|
10
|
-
import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/base/hook-utils.js";
|
|
11
9
|
import { getAllContexts, getContextBySessionId } from "../lib-ts/context/context-store.js";
|
|
10
|
+
import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/hooks/hook-utils.js";
|
|
11
|
+
import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/runtime/constants.js";
|
|
12
|
+
import { getMdFilesByMtime } from "../lib-ts/runtime/utils.js";
|
|
12
13
|
import type { ContextState } from "../lib-ts/types.js";
|
|
13
14
|
|
|
14
|
-
/** Get .md files sorted by mtime descending */
|
|
15
|
-
function getMdFilesByMtime(dir: string): string[] {
|
|
16
|
-
try {
|
|
17
|
-
if (!fs.existsSync(dir)) return [];
|
|
18
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
19
|
-
const mdFiles = entries
|
|
20
|
-
.filter(e => e.isFile() && e.name.endsWith(".md"))
|
|
21
|
-
.map(e => {
|
|
22
|
-
const fullPath = path.join(dir, e.name);
|
|
23
|
-
const stat = fs.statSync(fullPath);
|
|
24
|
-
return { path: fullPath, mtime: stat.mtimeMs };
|
|
25
|
-
})
|
|
26
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
27
|
-
return mdFiles.map(f => f.path);
|
|
28
|
-
} catch {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
15
|
/** Find latest folder-based document (subdirectory with index.md) */
|
|
34
16
|
function getLatestFolderDoc(dir: string): null | string {
|
|
35
17
|
try {
|
|
@@ -128,3 +110,4 @@ function main(): void {
|
|
|
128
110
|
}
|
|
129
111
|
|
|
130
112
|
runHook(main, "file-suggestion");
|
|
113
|
+
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* PostToolUse:Write|Edit hook: Run linter on edited files, feed errors to Claude.
|
|
4
4
|
* Uses emitContext() for non-blocking context injection — Claude sees errors and self-corrects.
|
|
5
5
|
*/
|
|
6
|
-
import { getProjectRoot } from "../lib-ts/base/constants.js";
|
|
7
6
|
import {
|
|
8
|
-
emitContext,
|
|
9
|
-
} from "../lib-ts/
|
|
10
|
-
import {
|
|
7
|
+
emitContext, logDebug, requireToolInput, runHook,
|
|
8
|
+
} from "../lib-ts/hooks/hook-utils.js";
|
|
9
|
+
import { getProjectRoot } from "../lib-ts/runtime/constants.js";
|
|
10
|
+
import { formatLintErrors, getLinterForFile, runLinter } from "../lib-ts/runtime/lint-dispatch.js";
|
|
11
11
|
|
|
12
12
|
// Extensions with no lint value
|
|
13
13
|
const SKIP_EXTENSIONS = new Set([
|
|
@@ -31,11 +31,9 @@ function shouldSkip(filePath: string): boolean {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
function main(): void {
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
36
|
-
|
|
37
|
-
const toolInput = getToolInput(payload);
|
|
38
|
-
if (!toolInput) return;
|
|
34
|
+
const context = requireToolInput("lint_after_edit");
|
|
35
|
+
if (!context) return;
|
|
36
|
+
const { payload, toolInput } = context;
|
|
39
37
|
|
|
40
38
|
const filePath = toolInput.file_path as string | undefined;
|
|
41
39
|
if (!filePath) return;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* PreCompact hook: Save state.json snapshot before context compaction.
|
|
4
|
+
* Captures git state and session metadata for recovery.
|
|
5
|
+
*/
|
|
6
|
+
import { saveState } from "../lib-ts/context/context-store.js";
|
|
7
|
+
import {
|
|
8
|
+
logError, logInfo, requireBoundSession, runHook,
|
|
9
|
+
} from "../lib-ts/hooks/hook-utils.js";
|
|
10
|
+
import { getGitState } from "../lib-ts/runtime/git-state.js";
|
|
11
|
+
import { nowIso } from "../lib-ts/runtime/utils.js";
|
|
12
|
+
|
|
13
|
+
function main(): void {
|
|
14
|
+
const bound = requireBoundSession("pre_compact");
|
|
15
|
+
if (!bound) return;
|
|
16
|
+
const { sessionId, projectRoot, state } = bound;
|
|
17
|
+
|
|
18
|
+
const gitState = getGitState(projectRoot);
|
|
19
|
+
|
|
20
|
+
state.last_session = {
|
|
21
|
+
...state.last_session,
|
|
22
|
+
session_id: sessionId,
|
|
23
|
+
saved_at: nowIso(),
|
|
24
|
+
save_reason: "pre_compact",
|
|
25
|
+
git_state: gitState,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const [ok, err] = saveState(state.id, state, projectRoot);
|
|
29
|
+
if (ok) {
|
|
30
|
+
logInfo("pre_compact", `Saved pre-compact snapshot for ${state.id}`);
|
|
31
|
+
} else {
|
|
32
|
+
logError("pre_compact", `Failed to save state: ${err}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
runHook(main, "pre_compact");
|