aiwcli 0.15.4 → 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
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* Validates provider+model combos work before committing agents to them.
|
|
4
4
|
* Runs minimal "ping" requests in parallel per unique provider:model combo.
|
|
5
5
|
*
|
|
6
|
-
* Uses shared checkProviderModel() from
|
|
6
|
+
* Uses shared checkProviderModel() from _core/lib-ts/runtime/preflight.ts.
|
|
7
7
|
* This module provides the batch orchestrator and provider registry specific
|
|
8
8
|
* to the plan review pipeline.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { preflightCommandConfig } from "../../../
|
|
12
|
-
import { logInfo, logWarn } from "../../../
|
|
13
|
-
import { checkProviderModel, type PreflightCommandConfig } from "../../../
|
|
11
|
+
import { preflightCommandConfig } from "../../../_core/lib-ts/runtime/cli-args.js";
|
|
12
|
+
import { logInfo, logWarn } from "../../../_core/lib-ts/runtime/logger.js";
|
|
13
|
+
import { checkProviderModel, type PreflightCommandConfig } from "../../../_core/lib-ts/runtime/preflight.js";
|
|
14
14
|
import type { ModelsConfig, PreflightCheckResult, PreflightReport } from "../../lib-ts/types.js";
|
|
15
15
|
|
|
16
16
|
const HOOK = "preflight";
|
|
17
|
-
const DEFAULT_TIMEOUT_MS =
|
|
17
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
18
18
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
// Provider Registry (built from centralized cli-args)
|
|
@@ -25,25 +25,25 @@ const PREFLIGHT_COMMANDS: Record<string, PreflightCommandConfig> = {
|
|
|
25
25
|
codex: preflightCommandConfig("codex"),
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
export const KNOWN_PROVIDERS = new Set(Object.keys(PREFLIGHT_COMMANDS));
|
|
29
|
+
|
|
28
30
|
// ---------------------------------------------------------------------------
|
|
29
|
-
//
|
|
31
|
+
// Pure Functions (extracted for direct testing)
|
|
30
32
|
// ---------------------------------------------------------------------------
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
/** @internal */
|
|
35
|
+
export function collectPreflightChecks(
|
|
33
36
|
modelsConfig: ModelsConfig,
|
|
34
|
-
|
|
35
|
-
):
|
|
36
|
-
const effectiveTimeout = timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
37
|
-
const start = Date.now();
|
|
38
|
-
|
|
39
|
-
// Collect unique provider:model combos from enabled providers
|
|
37
|
+
knownProviders: Set<string>,
|
|
38
|
+
): { checks: Array<{ provider: string; model: string }>; skippedProviders: string[] } {
|
|
40
39
|
const checks: Array<{ provider: string; model: string }> = [];
|
|
41
40
|
const seen = new Set<string>();
|
|
41
|
+
const skippedProviders: string[] = [];
|
|
42
42
|
|
|
43
43
|
for (const [provider, config] of Object.entries(modelsConfig.providers)) {
|
|
44
44
|
if (!config.enabled || config.models.length === 0) continue;
|
|
45
|
-
if (!
|
|
46
|
-
|
|
45
|
+
if (!knownProviders.has(provider)) {
|
|
46
|
+
skippedProviders.push(provider);
|
|
47
47
|
continue;
|
|
48
48
|
}
|
|
49
49
|
for (const model of config.models) {
|
|
@@ -55,6 +55,45 @@ export async function runPreflight(
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
return { checks, skippedProviders };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** @internal */
|
|
62
|
+
export function buildPreflightReport(
|
|
63
|
+
results: Array<{ provider: string; model: string; available: boolean; error?: string; latencyMs?: number }>,
|
|
64
|
+
totalMs: number,
|
|
65
|
+
): PreflightReport {
|
|
66
|
+
const available = new Map<string, Set<string>>();
|
|
67
|
+
for (const r of results) {
|
|
68
|
+
if (r.available) {
|
|
69
|
+
if (!available.has(r.provider)) available.set(r.provider, new Set());
|
|
70
|
+
available.get(r.provider)!.add(r.model);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const allFailed = available.size === 0;
|
|
75
|
+
|
|
76
|
+
return { checks: results as PreflightCheckResult[], available, allFailed, totalMs };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Run All Checks
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
export async function runPreflight(
|
|
84
|
+
modelsConfig: ModelsConfig,
|
|
85
|
+
timeoutMs?: number,
|
|
86
|
+
): Promise<PreflightReport> {
|
|
87
|
+
const effectiveTimeout = timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
88
|
+
const start = Date.now();
|
|
89
|
+
|
|
90
|
+
// Collect unique provider:model combos from enabled providers
|
|
91
|
+
const { checks, skippedProviders } = collectPreflightChecks(modelsConfig, KNOWN_PROVIDERS);
|
|
92
|
+
|
|
93
|
+
for (const provider of skippedProviders) {
|
|
94
|
+
logWarn(HOOK, `No preflight command for provider '${provider}', skipping`);
|
|
95
|
+
}
|
|
96
|
+
|
|
58
97
|
if (checks.length === 0) {
|
|
59
98
|
logWarn(HOOK, "No provider:model combos to check");
|
|
60
99
|
return { checks: [], available: new Map(), allFailed: true, totalMs: Date.now() - start };
|
|
@@ -69,17 +108,8 @@ export async function runPreflight(
|
|
|
69
108
|
),
|
|
70
109
|
);
|
|
71
110
|
|
|
72
|
-
// Build available map
|
|
73
|
-
const available = new Map<string, Set<string>>();
|
|
74
|
-
for (const r of results) {
|
|
75
|
-
if (r.available) {
|
|
76
|
-
if (!available.has(r.provider)) available.set(r.provider, new Set());
|
|
77
|
-
available.get(r.provider)!.add(r.model);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const allFailed = available.size === 0;
|
|
82
111
|
const totalMs = Date.now() - start;
|
|
112
|
+
const report = buildPreflightReport(results, totalMs);
|
|
83
113
|
|
|
84
114
|
// Log summary
|
|
85
115
|
const passed = results.filter(r => r.available).length;
|
|
@@ -92,5 +122,5 @@ export async function runPreflight(
|
|
|
92
122
|
}
|
|
93
123
|
}
|
|
94
124
|
|
|
95
|
-
return
|
|
125
|
+
return report;
|
|
96
126
|
}
|
|
@@ -8,24 +8,24 @@ import * as fs from "node:fs";
|
|
|
8
8
|
import * as path from "node:path";
|
|
9
9
|
|
|
10
10
|
import { resolveMandatoryAgents, assignModelsToAgents, selectAgents } from "./agent-selection.js";
|
|
11
|
-
import { runPreflight } from "./preflight.js";
|
|
12
11
|
import { computeCorroboratedDecision } from "./corroboration.js";
|
|
13
12
|
import { computePassEligible, extractTopIssuesForTracker, advanceIterationState } from "./graduation.js";
|
|
14
13
|
import { runOrchestrator } from "./orchestrator.js";
|
|
15
14
|
import { truncateAgentIssues, overrideVerdictsByThreshold, buildReviewOutput } from "./output-builder.js";
|
|
16
15
|
import { runPlanQuestions } from "./plan-questions.js";
|
|
16
|
+
import { runPreflight } from "./preflight.js";
|
|
17
17
|
import { runAgentReview } from "./reviewers/index.js";
|
|
18
|
-
import {
|
|
19
|
-
import { logDiagnostic } from "../../../
|
|
18
|
+
import { getContextBySessionId, getAllContexts } from "../../../_core/lib-ts/context/context-store.js";
|
|
19
|
+
import { logDiagnostic } from "../../../_core/lib-ts/hooks/hook-utils.js";
|
|
20
|
+
import { getContextReviewsDir, getContextDir, getReviewFolderPath } from "../../../_core/lib-ts/runtime/constants.js";
|
|
20
21
|
import {
|
|
21
22
|
logDebug,
|
|
22
23
|
logInfo,
|
|
23
24
|
logWarn,
|
|
24
25
|
logError,
|
|
25
|
-
} from "../../../
|
|
26
|
-
import { eprint } from "../../../
|
|
27
|
-
import {
|
|
28
|
-
import type { ContextState } from "../../../_shared/lib-ts/types.js";
|
|
26
|
+
} from "../../../_core/lib-ts/runtime/logger.js";
|
|
27
|
+
import { eprint } from "../../../_core/lib-ts/runtime/utils.js";
|
|
28
|
+
import type { ContextState } from "../../../_core/lib-ts/types.js";
|
|
29
29
|
import { writeCombinedArtifacts, buildCorroborationReport, buildHighIssuesDocument, writeReviewTracker } from "../../artifacts/lib/index.js";
|
|
30
30
|
import type { ReviewTrackerEntry } from "../../artifacts/lib/index.js";
|
|
31
31
|
import {
|
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
* See cc-native-plan-review-spec.md §4.10
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { ExecutionBackend } from "../../../../_shared/lib-ts/agent-exec/execution-backend.js";
|
|
8
|
-
import { logWarn } from "../../../../_shared/lib-ts/base/logger.js";
|
|
9
|
-
import { debugLog, debugRaw } from "../../../lib-ts/debug.js";
|
|
10
|
-
import type { AgentConfig, ReviewerResult, ReviewOptions } from "../../../lib-ts/types.js";
|
|
11
7
|
import { ClaudeAgent } from "./providers/claude-agent.js";
|
|
12
8
|
import { CodexAgent } from "./providers/codex-agent.js";
|
|
13
9
|
import { GeminiAgent } from "./providers/gemini-agent.js";
|
|
14
10
|
import type { Reviewer } from "./types.js";
|
|
15
11
|
import { makeResult } from "./types.js";
|
|
12
|
+
import type { ExecutionBackend } from "../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
13
|
+
import { logWarn } from "../../../../_core/lib-ts/runtime/logger.js";
|
|
14
|
+
import { debugLog, debugRaw } from "../../../lib-ts/debug.js";
|
|
15
|
+
import type { AgentConfig, ReviewerResult, ReviewOptions } from "../../../lib-ts/types.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Agent reviewer — runs a CLI instance with a custom persona.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Re-export shim — BaseCliAgent now lives in
|
|
2
|
+
* Re-export shim — BaseCliAgent now lives in _core/lib-ts/agent-exec/base-agent.ts.
|
|
3
3
|
* This file preserves all existing import paths for provider implementations.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export {
|
|
7
|
-
export type { ExecutionResult as ExecResult } from "../../../../../
|
|
6
|
+
export { type AgentDebugLogger, type AgentExecutionConfig, BaseCliAgent } from "../../../../../_core/lib-ts/agent-exec/base-agent.js";
|
|
7
|
+
export type { ExecutionResult as ExecResult } from "../../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
export { AgentReviewer, runAgentReview } from "./agent.js";
|
|
7
|
-
export {
|
|
7
|
+
export { type AgentDebugLogger, type AgentExecutionConfig, BaseCliAgent } from "./base/base-agent.js";
|
|
8
8
|
export { ClaudeAgent } from "./providers/claude-agent.js";
|
|
9
9
|
export { CodexAgent } from "./providers/codex-agent.js";
|
|
10
10
|
export { GeminiAgent } from "./providers/gemini-agent.js";
|
package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/claude-agent.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Uses claude CLI with --json-schema and --system-prompt flags.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
6
|
+
import type { ExecutionResult } from "../../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
7
|
+
import { buildCliInvocation, reviewSpec } from "../../../../../_core/lib-ts/runtime/cli-args.js";
|
|
8
8
|
import { parseCliOutput } from "../../../../lib-ts/cli-output-parser.js";
|
|
9
9
|
import { coerceToReview } from "../../../../lib-ts/json-parser.js";
|
|
10
10
|
import type { ReviewerResult } from "../../../../lib-ts/types.js";
|
package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/codex-agent.ts
CHANGED
|
@@ -7,10 +7,10 @@ import * as fs from "node:fs";
|
|
|
7
7
|
import * as os from "node:os";
|
|
8
8
|
import * as path from "node:path";
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import { logDebug, logWarn } from "../../../../../
|
|
13
|
-
import { getInternalSubprocessEnv, normalizePathForCli, shellQuoteWin } from "../../../../../
|
|
10
|
+
import type { ExecutionResult } from "../../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
11
|
+
import { buildCliInvocation } from "../../../../../_core/lib-ts/runtime/cli-args.js";
|
|
12
|
+
import { logDebug, logWarn } from "../../../../../_core/lib-ts/runtime/logger.js";
|
|
13
|
+
import { getInternalSubprocessEnv, normalizePathForCli, shellQuoteWin } from "../../../../../_core/lib-ts/runtime/subprocess-utils.js";
|
|
14
14
|
import { debugLog, debugRaw } from "../../../../lib-ts/debug.js";
|
|
15
15
|
import { parseJsonMaybe, coerceToReview } from "../../../../lib-ts/json-parser.js";
|
|
16
16
|
import type { ReviewerResult } from "../../../../lib-ts/types.js";
|
package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/gemini-agent.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Placeholder for future implementation.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { ExecutionResult } from "../../../../../
|
|
6
|
+
import type { ExecutionResult } from "../../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
7
7
|
import type { ReviewerResult } from "../../../../lib-ts/types.js";
|
|
8
8
|
import { BaseCliAgent } from "../base/base-agent.js";
|
|
9
9
|
import { makeResult } from "../types.js";
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
* Analyzes plan complexity and selects reviewer agents via Claude CLI.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import type
|
|
9
|
-
import {
|
|
10
|
-
import { logDebug } from "../../../../../_shared/lib-ts/base/logger.js";
|
|
6
|
+
import type { ExecutionBackend , ExecutionResult } from "../../../../../_core/lib-ts/agent-exec/execution-backend.js";
|
|
7
|
+
import { parseStructuredOutput } from "../../../../../_core/lib-ts/agent-exec/structured-output.js";
|
|
8
|
+
import { buildCliInvocation, reviewSpec, type CliProvider } from "../../../../../_core/lib-ts/runtime/cli-args.js";
|
|
9
|
+
import { logDebug } from "../../../../../_core/lib-ts/runtime/logger.js";
|
|
11
10
|
import { debugLog, debugRaw } from "../../../../lib-ts/debug.js";
|
|
12
11
|
import type { AgentConfig, AgentReviewSettings, AgentSelectionConfig, OrchestratorResult, ComplexityCategory } from "../../../../lib-ts/types.js";
|
|
13
12
|
import { BaseCliAgent } from "../base/base-agent.js";
|
|
@@ -78,7 +77,7 @@ export class OrchestratorClaudeAgent extends BaseCliAgent<OrchestratorResult> {
|
|
|
78
77
|
this.settings = settings;
|
|
79
78
|
|
|
80
79
|
const selection = settings.agentSelection ?? DEFAULT_AGENT_SELECTION;
|
|
81
|
-
this.fallbackCount = selection.fallbackCount ??
|
|
80
|
+
this.fallbackCount = selection.fallbackCount ?? 2;
|
|
82
81
|
this.mandatoryCount = agentLibrary.filter((a) => mandatoryNames.has(a.name)).length;
|
|
83
82
|
|
|
84
83
|
logDebug("orchestrator", `Mandatory agents (always run): ${[...mandatoryNames].sort().join(", ")}`);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Codex Workflow
|
|
2
|
+
|
|
3
|
+
Use Codex CLI handoff instructions from `.aiwcli/_core/skills/codex/SKILL.md`.
|
|
4
|
+
|
|
5
|
+
## Command
|
|
6
|
+
|
|
7
|
+
`bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [flags] <mode>`
|
|
8
|
+
|
|
9
|
+
**Modes:** `plan` | `--file <path>` | `<inline text...>`
|
|
10
|
+
|
|
11
|
+
## Behavior
|
|
12
|
+
|
|
13
|
+
Launches Codex in a visible pane when available (tmux session first; platform window fallback when applicable).
|
|
14
|
+
|
|
15
|
+
If pane launch is unavailable, it automatically falls back to non-interactive `codex exec` in the current terminal.
|
|
16
|
+
|
|
17
|
+
**Common flags:** `--model <name>`, `--sandbox <mode>`, `--context <id>`, `--prompt <text>`, `--no-yolo`, `--no-watch`
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# MetaPlan -- Prompt Amplifier
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
**Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
|
|
6
|
+
|
|
7
|
+
**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
|
+
# Cognition Notes
|
|
2
|
+
|
|
3
|
+
On Windows, keep any filesystem paths that appear in `.cognition` config text or agent instructions in forward-slash form when they are meant to be read by Devin/Cognition.
|
|
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.
|
|
@@ -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,16 +6,15 @@
|
|
|
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";
|
|
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";
|
|
19
18
|
|
|
20
19
|
/** Find the most recent .md file in a directory */
|
|
21
20
|
function mostRecentMd(dir: string): null | string {
|
|
@@ -39,9 +38,9 @@ function mostRecentMd(dir: string): null | string {
|
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
/** Multi-strategy plan path discovery */
|
|
42
|
-
function findPlanPath(payload: Record<string,
|
|
41
|
+
function findPlanPath(payload: Record<string, unknown>, projectRoot: string): null | string {
|
|
43
42
|
const toolResult = payload.tool_result as string | undefined;
|
|
44
|
-
const toolInput = (payload.tool_input ?? {}) as Record<string,
|
|
43
|
+
const toolInput = (payload.tool_input ?? {}) as Record<string, unknown>;
|
|
45
44
|
const transcriptPath = payload.transcript_path as string | undefined;
|
|
46
45
|
|
|
47
46
|
// Strategy 1: Extract from tool result
|
|
@@ -100,20 +99,17 @@ async function asyncMain(): Promise<void> {
|
|
|
100
99
|
}
|
|
101
100
|
|
|
102
101
|
// Check stop flag
|
|
103
|
-
if ((payload as
|
|
102
|
+
if ((payload as unknown).stop_hook_active) {
|
|
104
103
|
logDebug("archive_plan", "stop_hook_active set, skipping");
|
|
105
104
|
return;
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
logWarn("archive_plan", "No session_id");
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
107
|
+
const bound = requireBoundSession("archive_plan", payload);
|
|
108
|
+
if (!bound) return;
|
|
109
|
+
const { projectRoot, state } = bound;
|
|
114
110
|
|
|
115
111
|
// Find plan path
|
|
116
|
-
let planPath = findPlanPath(payload as Record<string,
|
|
112
|
+
let planPath = findPlanPath(payload as Record<string, unknown>, projectRoot);
|
|
117
113
|
if (!planPath) {
|
|
118
114
|
logWarn("archive_plan", "Could not locate plan file");
|
|
119
115
|
return;
|
|
@@ -130,13 +126,6 @@ async function asyncMain(): Promise<void> {
|
|
|
130
126
|
return;
|
|
131
127
|
}
|
|
132
128
|
|
|
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
129
|
// Archive the plan (async — uses AI for slug generation)
|
|
141
130
|
const [archivedPath, planHash, _planSignature] = await archivePlan(planPath, state.id, projectRoot);
|
|
142
131
|
|
|
@@ -157,3 +146,5 @@ async function asyncMain(): Promise<void> {
|
|
|
157
146
|
}
|
|
158
147
|
|
|
159
148
|
runHookAsync(asyncMain, "archive_plan");
|
|
149
|
+
|
|
150
|
+
|
|
@@ -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");
|