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.
Files changed (299) hide show
  1. package/README.md +6 -3
  2. package/dist/capabilities/branch/adapters.d.ts +2 -0
  3. package/dist/capabilities/branch/adapters.js +21 -0
  4. package/dist/capabilities/branch/contracts.d.ts +57 -0
  5. package/dist/capabilities/branch/contracts.js +1 -0
  6. package/dist/capabilities/branch/control-plane.d.ts +2 -0
  7. package/dist/capabilities/branch/control-plane.js +343 -0
  8. package/dist/capabilities/branch/runtime-core.d.ts +5 -0
  9. package/dist/capabilities/branch/runtime-core.js +36 -0
  10. package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
  11. package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
  12. package/dist/capabilities/installation/control-plane/clear-command.d.ts +160 -0
  13. package/dist/capabilities/installation/control-plane/clear-command.js +1220 -0
  14. package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
  15. package/dist/capabilities/installation/control-plane/init-command.js +449 -0
  16. package/dist/capabilities/launch/contracts.d.ts +51 -0
  17. package/dist/capabilities/launch/contracts.js +1 -0
  18. package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
  19. package/dist/capabilities/launch/control-plane/execute-launch.js +222 -0
  20. package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
  21. package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
  22. package/dist/cli/base-command.d.ts +18 -0
  23. package/dist/cli/base-command.js +55 -0
  24. package/dist/commands/branch.d.ts +0 -20
  25. package/dist/commands/branch.js +24 -416
  26. package/dist/commands/clean.d.ts +1 -41
  27. package/dist/commands/clean.js +1 -196
  28. package/dist/commands/clear.d.ts +1 -161
  29. package/dist/commands/clear.js +1 -1121
  30. package/dist/commands/init/index.d.ts +1 -98
  31. package/dist/commands/init/index.js +4 -478
  32. package/dist/commands/launch.d.ts +36 -11
  33. package/dist/commands/launch.js +135 -159
  34. package/dist/lib/base-command.d.ts +1 -114
  35. package/dist/lib/base-command.js +1 -153
  36. package/dist/lib/claude-settings-types.d.ts +31 -19
  37. package/dist/lib/context/context-formatter.d.ts +74 -0
  38. package/dist/lib/context/context-formatter.js +493 -0
  39. package/dist/lib/context/context-selector.d.ts +42 -0
  40. package/dist/lib/context/context-selector.js +451 -0
  41. package/dist/lib/context/context-store.d.ts +100 -0
  42. package/dist/lib/context/context-store.js +618 -0
  43. package/dist/lib/context/plan-manager.d.ts +54 -0
  44. package/dist/lib/context/plan-manager.js +282 -0
  45. package/dist/lib/context/task-tracker.d.ts +44 -0
  46. package/dist/lib/context/task-tracker.js +146 -0
  47. package/dist/lib/core-ide-base.d.ts +4 -0
  48. package/dist/lib/core-ide-base.js +77 -0
  49. package/dist/lib/core-installer.d.ts +5 -0
  50. package/dist/lib/core-installer.js +54 -0
  51. package/dist/lib/git-exclude-manager.d.ts +2 -2
  52. package/dist/lib/git-exclude-manager.js +3 -3
  53. package/dist/lib/hooks/hook-utils.d.ts +143 -0
  54. package/dist/lib/hooks/hook-utils.js +609 -0
  55. package/dist/lib/hooks/session-end-logic.d.ts +5 -0
  56. package/dist/lib/hooks/session-end-logic.js +63 -0
  57. package/dist/lib/hooks-merger.js +25 -19
  58. package/dist/lib/ide-path-resolver.d.ts +19 -7
  59. package/dist/lib/ide-path-resolver.js +25 -9
  60. package/dist/lib/install-state.d.ts +34 -0
  61. package/dist/lib/install-state.js +161 -0
  62. package/dist/lib/launch-options.d.ts +1 -0
  63. package/dist/lib/launch-options.js +1 -0
  64. package/dist/lib/lsp-patch.d.ts +12 -0
  65. package/dist/lib/lsp-patch.js +156 -0
  66. package/dist/lib/multiplexer.d.ts +57 -0
  67. package/dist/lib/multiplexer.js +19 -0
  68. package/dist/lib/multiplexers/psmux.d.ts +75 -0
  69. package/dist/lib/multiplexers/psmux.js +384 -0
  70. package/dist/lib/multiplexers/tmux.d.ts +44 -0
  71. package/dist/lib/multiplexers/tmux.js +262 -0
  72. package/dist/lib/mux-utils.d.ts +5 -0
  73. package/dist/lib/mux-utils.js +42 -0
  74. package/dist/lib/paths.d.ts +2 -2
  75. package/dist/lib/paths.js +2 -2
  76. package/dist/lib/platform-commands.d.ts +27 -0
  77. package/dist/lib/platform-commands.js +49 -0
  78. package/dist/lib/runtime/aiw-cli.d.ts +37 -0
  79. package/dist/lib/runtime/aiw-cli.js +74 -0
  80. package/dist/lib/runtime/atomic-write.d.ts +19 -0
  81. package/dist/lib/runtime/atomic-write.js +121 -0
  82. package/dist/lib/runtime/cli-args.d.ts +55 -0
  83. package/dist/lib/runtime/cli-args.js +185 -0
  84. package/dist/lib/runtime/constants.d.ts +56 -0
  85. package/dist/lib/runtime/constants.js +230 -0
  86. package/dist/lib/runtime/executable-policy.d.ts +16 -0
  87. package/dist/lib/runtime/executable-policy.js +57 -0
  88. package/dist/lib/runtime/git-state.d.ts +9 -0
  89. package/dist/lib/runtime/git-state.js +59 -0
  90. package/dist/lib/runtime/inference.d.ts +37 -0
  91. package/dist/lib/runtime/inference.js +262 -0
  92. package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
  93. package/dist/lib/runtime/lint-dispatch.js +285 -0
  94. package/dist/lib/runtime/logger.d.ts +66 -0
  95. package/dist/lib/runtime/logger.js +201 -0
  96. package/dist/lib/runtime/models.d.ts +14 -0
  97. package/dist/lib/runtime/models.js +14 -0
  98. package/dist/lib/runtime/platform-adapter.d.ts +7 -0
  99. package/dist/lib/runtime/platform-adapter.js +21 -0
  100. package/dist/lib/runtime/preflight.d.ts +24 -0
  101. package/dist/lib/runtime/preflight.js +65 -0
  102. package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
  103. package/dist/lib/runtime/sentinel-ipc.js +67 -0
  104. package/dist/lib/runtime/state-io.d.ts +30 -0
  105. package/dist/lib/runtime/state-io.js +174 -0
  106. package/dist/lib/runtime/stop-words.d.ts +20 -0
  107. package/dist/lib/runtime/stop-words.js +150 -0
  108. package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
  109. package/dist/lib/runtime/subprocess-utils.js +96 -0
  110. package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
  111. package/dist/lib/runtime/tmux-preflight.js +78 -0
  112. package/dist/lib/runtime/utils.d.ts +54 -0
  113. package/dist/lib/runtime/utils.js +162 -0
  114. package/dist/lib/sentinel-wrapper.d.ts +9 -0
  115. package/dist/lib/sentinel-wrapper.js +20 -0
  116. package/dist/lib/shell-quoting.d.ts +5 -0
  117. package/dist/lib/shell-quoting.js +17 -0
  118. package/dist/lib/spawn-errors.d.ts +6 -0
  119. package/dist/lib/spawn-errors.js +15 -0
  120. package/dist/lib/spawn.js +5 -11
  121. package/dist/lib/template-installer.d.ts +4 -5
  122. package/dist/lib/template-installer.js +36 -34
  123. package/dist/lib/template-resolver.d.ts +6 -7
  124. package/dist/lib/template-resolver.js +26 -21
  125. package/dist/lib/template-settings-reconstructor.d.ts +7 -2
  126. package/dist/lib/template-settings-reconstructor.js +76 -45
  127. package/dist/lib/terminal-strategy.d.ts +11 -0
  128. package/dist/lib/terminal-strategy.js +49 -0
  129. package/dist/lib/terminal.d.ts +28 -0
  130. package/dist/lib/terminal.js +162 -112
  131. package/dist/lib/tmux-pane-placement.d.ts +17 -0
  132. package/dist/lib/tmux-pane-placement.js +58 -0
  133. package/dist/lib/tmux-primitives.d.ts +5 -0
  134. package/dist/lib/tmux-primitives.js +15 -0
  135. package/dist/lib/tmux-session.d.ts +32 -0
  136. package/dist/lib/tmux-session.js +86 -0
  137. package/dist/lib/tty-detection.js +1 -1
  138. package/dist/lib/types.d.ts +168 -0
  139. package/dist/lib/types.js +6 -0
  140. package/dist/lib/version.d.ts +1 -1
  141. package/dist/lib/version.js +1 -1
  142. package/dist/platform/launch.d.ts +10 -0
  143. package/dist/platform/launch.js +10 -0
  144. package/dist/templates/CLAUDE.md +31 -40
  145. package/dist/templates/cc-native/.claude/settings.json +27 -27
  146. package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
  147. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +10 -9
  148. package/dist/templates/cc-native/_cc-native/CLAUDE.md +18 -18
  149. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +3 -3
  150. package/dist/templates/cc-native/_cc-native/artifacts/lib/format.ts +14 -14
  151. package/dist/templates/cc-native/_cc-native/artifacts/lib/tracker.ts +1 -1
  152. package/dist/templates/cc-native/_cc-native/artifacts/lib/write.ts +3 -3
  153. package/dist/templates/cc-native/_cc-native/cc-native.config.json +3 -3
  154. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +16 -15
  155. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +3 -3
  156. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
  157. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +2 -2
  158. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +3 -3
  159. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -2
  160. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +3 -3
  161. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +8 -8
  162. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +1 -1
  163. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +4 -4
  164. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +1 -1
  165. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
  166. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +1 -1
  167. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +1 -1
  168. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +2 -2
  169. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +1 -1
  170. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +2 -2
  171. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +1 -1
  172. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +8 -8
  173. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +3 -3
  174. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
  175. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +3 -3
  176. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +3 -1
  177. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
  178. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
  179. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +37 -15
  180. package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +16 -69
  181. package/dist/templates/cc-native/_cc-native/plan-review/lib/orchestrator.ts +1 -1
  182. package/dist/templates/cc-native/_cc-native/plan-review/lib/output-builder.ts +1 -1
  183. package/dist/templates/cc-native/_cc-native/plan-review/lib/plan-questions.ts +2 -2
  184. package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
  185. package/dist/templates/cc-native/_cc-native/plan-review/lib/review-pipeline.ts +7 -7
  186. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/agent.ts +4 -4
  187. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +3 -3
  188. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/index.ts +1 -1
  189. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/claude-agent.ts +2 -2
  190. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/codex-agent.ts +4 -4
  191. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/gemini-agent.ts +1 -1
  192. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/orchestrator-claude-agent.ts +5 -6
  193. package/dist/templates/core/.codex/workflows/codex.md +17 -0
  194. package/dist/templates/core/.codex/workflows/handoff.md +5 -0
  195. package/dist/templates/core/.codex/workflows/meta-plan.md +7 -0
  196. package/dist/templates/core/.cognition/AGENTS.md +5 -0
  197. package/dist/templates/core/.cognition/config.json +12 -0
  198. package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
  199. package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
  200. package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
  201. package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +14 -23
  202. package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
  203. package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
  204. package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +4 -3
  205. package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
  206. package/dist/templates/{_shared → core}/hooks-ts/pre_compact.ts +5 -5
  207. package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
  208. package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
  209. package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
  210. package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
  211. package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
  212. package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
  213. package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/headless.ts +3 -2
  214. package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/tmux.ts +44 -15
  215. package/dist/templates/{_shared → core}/lib-ts/agent-exec/base-agent.ts +6 -4
  216. package/dist/templates/{_shared → core}/lib-ts/agent-exec/execution-backend.ts +1 -1
  217. package/dist/templates/{_shared → core}/lib-ts/agent-exec/index.ts +2 -2
  218. package/dist/templates/{_shared → core}/lib-ts/agent-exec/structured-output.ts +4 -5
  219. package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
  220. package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
  221. package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
  222. package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +32 -20
  223. package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
  224. package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
  225. package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
  226. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +168 -41
  227. package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
  228. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +93 -0
  229. package/dist/templates/core/lib-ts/package.json +19 -0
  230. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +295 -0
  231. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +106 -0
  232. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
  233. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +8 -6
  234. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
  235. package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
  236. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
  237. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +59 -10
  238. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
  239. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
  240. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +2 -2
  241. package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
  242. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
  243. package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
  244. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +11 -7
  245. package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
  246. package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
  247. package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
  248. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +4 -3
  249. package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
  250. package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
  251. package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
  252. package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
  253. package/dist/templates/core/scripts/resolve-run.ts +61 -0
  254. package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
  255. package/dist/templates/{_shared → core}/scripts/status_line.ts +25 -20
  256. package/dist/templates/core/skills/codex/CLAUDE.md +78 -0
  257. package/dist/templates/{_shared → core}/skills/codex/SKILL.md +21 -18
  258. package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +76 -103
  259. package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +119 -133
  260. package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
  261. package/dist/templates/core/skills/devin/CLAUDE.md +65 -0
  262. package/dist/templates/core/skills/devin/SKILL.md +73 -0
  263. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +280 -0
  264. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +257 -0
  265. package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
  266. package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
  267. package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
  268. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
  269. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
  270. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
  271. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
  272. package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
  273. package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
  274. package/oclif.manifest.json +89 -13
  275. package/package.json +13 -12
  276. package/dist/templates/_shared/.claude/settings.json +0 -120
  277. package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
  278. package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
  279. package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
  280. package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
  281. package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
  282. package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
  283. package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
  284. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
  285. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
  286. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
  287. package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
  288. package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
  289. package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
  290. package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
  291. package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
  292. package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
  293. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
  294. package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
  295. package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
  296. package/dist/templates/_shared/lib-ts/package.json +0 -20
  297. package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
  298. package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
  299. /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 _shared/lib-ts/base/preflight.ts.
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 "../../../_shared/lib-ts/base/cli-args.js";
12
- import { logInfo, logWarn } from "../../../_shared/lib-ts/base/logger.js";
13
- import { checkProviderModel, type PreflightCommandConfig } from "../../../_shared/lib-ts/base/preflight.js";
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 = 15000;
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
- // Run All Checks
31
+ // Pure Functions (extracted for direct testing)
30
32
  // ---------------------------------------------------------------------------
31
33
 
32
- export async function runPreflight(
34
+ /** @internal */
35
+ export function collectPreflightChecks(
33
36
  modelsConfig: ModelsConfig,
34
- timeoutMs?: number,
35
- ): Promise<PreflightReport> {
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 (!PREFLIGHT_COMMANDS[provider]) {
46
- logWarn(HOOK, `No preflight command for provider '${provider}', skipping`);
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 { checks: results, available, allFailed, totalMs };
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 { getContextReviewsDir, getContextDir, getReviewFolderPath } from "../../../_shared/lib-ts/base/constants.js";
19
- import { logDiagnostic } from "../../../_shared/lib-ts/base/hook-utils.js";
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 "../../../_shared/lib-ts/base/logger.js";
26
- import { eprint } from "../../../_shared/lib-ts/base/utils.js";
27
- import { getContextBySessionId, getAllContexts } from "../../../_shared/lib-ts/context/context-store.js";
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 _shared/lib-ts/agent-exec/base-agent.ts.
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 { BaseCliAgent, type AgentExecutionConfig, type AgentDebugLogger } from "../../../../../_shared/lib-ts/agent-exec/base-agent.js";
7
- export type { ExecutionResult as ExecResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
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 { BaseCliAgent, type AgentExecutionConfig, type AgentDebugLogger } from "./base/base-agent.js";
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";
@@ -3,8 +3,8 @@
3
3
  * Uses claude CLI with --json-schema and --system-prompt flags.
4
4
  */
5
5
 
6
- import { buildCliInvocation, reviewSpec } from "../../../../../_shared/lib-ts/base/cli-args.js";
7
- import type { ExecutionResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
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";
@@ -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 { buildCliInvocation } from "../../../../../_shared/lib-ts/base/cli-args.js";
11
- import type { ExecutionResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
12
- import { logDebug, logWarn } from "../../../../../_shared/lib-ts/base/logger.js";
13
- import { getInternalSubprocessEnv, normalizePathForCli, shellQuoteWin } from "../../../../../_shared/lib-ts/base/subprocess-utils.js";
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";
@@ -3,7 +3,7 @@
3
3
  * Placeholder for future implementation.
4
4
  */
5
5
 
6
- import type { ExecutionResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
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 { buildCliInvocation, reviewSpec, type CliProvider } from "../../../../../_shared/lib-ts/base/cli-args.js";
7
- import type { ExecutionBackend } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
8
- import type { ExecutionResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
9
- import { parseStructuredOutput } from "../../../../../_shared/lib-ts/agent-exec/structured-output.js";
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 ?? DEFAULT_AGENT_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,5 @@
1
+ # Handoff
2
+
3
+ Load and execute the handoff workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff.md`.
4
+
5
+ **Triggers:** "/handoff", "write a handoff", "create a session summary", "document what we did", "end session with notes"
@@ -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.
@@ -0,0 +1,12 @@
1
+ {
2
+ "permissions": {
3
+ "allow": ["read", "edit", "grep", "glob", "exec", "mcp__*"],
4
+ "deny": [],
5
+ "ask": []
6
+ },
7
+ "read_config_from": {
8
+ "cursor": true,
9
+ "windsurf": true,
10
+ "claude": true
11
+ }
12
+ }
@@ -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/_shared/skills/handoff-system/workflows/handoff.md`.
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/_shared/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis — not as steps to execute.
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
 
@@ -0,0 +1,2 @@
1
+ // Re-export from shared library — canonical location is lib-ts/runtime/git-state.ts
2
+ export { getGitState } from "../../lib-ts/runtime/git-state.js";
@@ -6,16 +6,15 @@
6
6
  */
7
7
  import * as fs from "node:fs";
8
8
  import * as os from "node:os";
9
- import * as path from "node:path";
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, any>, projectRoot: string): null | 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, any>;
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 any).stop_hook_active) {
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 projectRoot = getProjectRoot(payload.cwd);
109
- const sessionId = payload.session_id;
110
- if (!sessionId) {
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, any>, projectRoot);
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");