aiwcli 0.15.5 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +108 -1124
  2. package/bin/run.js +0 -4
  3. package/dist/capabilities/branch/adapters.d.ts +2 -0
  4. package/dist/capabilities/branch/adapters.js +21 -0
  5. package/dist/capabilities/branch/contracts.d.ts +57 -0
  6. package/dist/capabilities/branch/contracts.js +1 -0
  7. package/dist/capabilities/branch/control-plane.d.ts +2 -0
  8. package/dist/capabilities/branch/control-plane.js +343 -0
  9. package/dist/capabilities/branch/runtime-core.d.ts +5 -0
  10. package/dist/capabilities/branch/runtime-core.js +36 -0
  11. package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
  12. package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
  13. package/dist/capabilities/installation/control-plane/clear-command.d.ts +162 -0
  14. package/dist/capabilities/installation/control-plane/clear-command.js +1249 -0
  15. package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
  16. package/dist/capabilities/installation/control-plane/init-command.js +449 -0
  17. package/dist/capabilities/launch/contracts.d.ts +86 -0
  18. package/dist/capabilities/launch/contracts.js +1 -0
  19. package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
  20. package/dist/capabilities/launch/control-plane/execute-launch.js +261 -0
  21. package/dist/capabilities/launch/runtime-core/launch-decisions.d.ts +82 -0
  22. package/dist/capabilities/launch/runtime-core/launch-decisions.js +202 -0
  23. package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
  24. package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
  25. package/dist/cli/base-command.d.ts +18 -0
  26. package/dist/cli/base-command.js +55 -0
  27. package/dist/commands/branch.d.ts +1 -21
  28. package/dist/commands/branch.js +25 -417
  29. package/dist/commands/clean.d.ts +1 -41
  30. package/dist/commands/clean.js +1 -196
  31. package/dist/commands/clear.d.ts +1 -161
  32. package/dist/commands/clear.js +1 -1121
  33. package/dist/commands/init/index.d.ts +1 -98
  34. package/dist/commands/init/index.js +4 -478
  35. package/dist/commands/launch.d.ts +32 -12
  36. package/dist/commands/launch.js +107 -166
  37. package/dist/lib/claude-settings-types.d.ts +31 -19
  38. package/dist/lib/config.js +1 -2
  39. package/dist/lib/context/context-formatter.d.ts +74 -0
  40. package/dist/lib/context/context-formatter.js +493 -0
  41. package/dist/lib/context/context-selector.d.ts +42 -0
  42. package/dist/lib/context/context-selector.js +451 -0
  43. package/dist/lib/context/context-store.d.ts +100 -0
  44. package/dist/lib/context/context-store.js +644 -0
  45. package/dist/lib/context/plan-manager.d.ts +54 -0
  46. package/dist/lib/context/plan-manager.js +282 -0
  47. package/dist/lib/context/task-tracker.d.ts +44 -0
  48. package/dist/lib/context/task-tracker.js +146 -0
  49. package/dist/lib/core-ide-base.d.ts +4 -0
  50. package/dist/lib/core-ide-base.js +77 -0
  51. package/dist/lib/core-installer.d.ts +5 -0
  52. package/dist/lib/core-installer.js +33 -0
  53. package/dist/lib/debug.d.ts +0 -10
  54. package/dist/lib/debug.js +0 -10
  55. package/dist/lib/env-sanitizer.d.ts +25 -0
  56. package/dist/lib/env-sanitizer.js +46 -0
  57. package/dist/lib/errors.d.ts +0 -13
  58. package/dist/lib/errors.js +0 -15
  59. package/dist/lib/git-exclude-manager.d.ts +2 -2
  60. package/dist/lib/git-exclude-manager.js +3 -3
  61. package/dist/lib/hooks/context-monitor-logic.d.ts +6 -0
  62. package/dist/lib/hooks/context-monitor-logic.js +25 -0
  63. package/dist/lib/hooks/hook-utils.d.ts +143 -0
  64. package/dist/lib/hooks/hook-utils.js +620 -0
  65. package/dist/lib/hooks/prompt-binding-logic.d.ts +7 -0
  66. package/dist/lib/hooks/prompt-binding-logic.js +50 -0
  67. package/dist/lib/hooks/session-end-logic.d.ts +5 -0
  68. package/dist/lib/hooks/session-end-logic.js +51 -0
  69. package/dist/lib/hooks-merger.js +25 -19
  70. package/dist/lib/ide-path-resolver.d.ts +19 -7
  71. package/dist/lib/ide-path-resolver.js +25 -9
  72. package/dist/lib/install-state.d.ts +34 -0
  73. package/dist/lib/install-state.js +154 -0
  74. package/dist/lib/json-io.d.ts +12 -0
  75. package/dist/lib/json-io.js +30 -0
  76. package/dist/lib/lsp-patch.d.ts +12 -0
  77. package/dist/lib/lsp-patch.js +156 -0
  78. package/dist/lib/multiplexer.d.ts +65 -0
  79. package/dist/lib/multiplexer.js +38 -0
  80. package/dist/lib/multiplexers/psmux.d.ts +55 -0
  81. package/dist/lib/multiplexers/psmux.js +324 -0
  82. package/dist/lib/multiplexers/tmux.d.ts +36 -0
  83. package/dist/lib/multiplexers/tmux.js +221 -0
  84. package/dist/lib/multiplexers/wezterm.d.ts +38 -0
  85. package/dist/lib/multiplexers/wezterm.js +225 -0
  86. package/dist/lib/mux-utils.d.ts +6 -0
  87. package/dist/lib/mux-utils.js +36 -0
  88. package/dist/lib/paths.d.ts +2 -2
  89. package/dist/lib/paths.js +2 -2
  90. package/dist/lib/platform-commands.d.ts +27 -0
  91. package/dist/lib/platform-commands.js +49 -0
  92. package/dist/lib/prompt-file-manager.d.ts +23 -0
  93. package/dist/lib/prompt-file-manager.js +41 -0
  94. package/dist/lib/runtime/agent-launcher.d.ts +67 -0
  95. package/dist/lib/runtime/agent-launcher.js +262 -0
  96. package/dist/lib/runtime/aiw-cli.d.ts +39 -0
  97. package/dist/lib/runtime/aiw-cli.js +76 -0
  98. package/dist/lib/runtime/atomic-write.d.ts +19 -0
  99. package/dist/lib/runtime/atomic-write.js +121 -0
  100. package/dist/lib/runtime/cli-args.d.ts +58 -0
  101. package/dist/lib/runtime/cli-args.js +200 -0
  102. package/dist/lib/runtime/constants.d.ts +56 -0
  103. package/dist/lib/runtime/constants.js +230 -0
  104. package/dist/lib/runtime/executable-policy.d.ts +16 -0
  105. package/dist/lib/runtime/executable-policy.js +57 -0
  106. package/dist/lib/runtime/git-state.d.ts +9 -0
  107. package/dist/lib/runtime/git-state.js +59 -0
  108. package/dist/lib/runtime/inference.d.ts +37 -0
  109. package/dist/lib/runtime/inference.js +251 -0
  110. package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
  111. package/dist/lib/runtime/lint-dispatch.js +285 -0
  112. package/dist/lib/runtime/logger.d.ts +66 -0
  113. package/dist/lib/runtime/logger.js +201 -0
  114. package/dist/lib/runtime/models.d.ts +20 -0
  115. package/dist/lib/runtime/models.js +20 -0
  116. package/dist/lib/runtime/platform-adapter.d.ts +7 -0
  117. package/dist/lib/runtime/platform-adapter.js +21 -0
  118. package/dist/lib/runtime/preflight.d.ts +24 -0
  119. package/dist/lib/runtime/preflight.js +65 -0
  120. package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
  121. package/dist/lib/runtime/sentinel-ipc.js +67 -0
  122. package/dist/lib/runtime/state-io.d.ts +31 -0
  123. package/dist/lib/runtime/state-io.js +179 -0
  124. package/dist/lib/runtime/stop-words.d.ts +20 -0
  125. package/dist/lib/runtime/stop-words.js +150 -0
  126. package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
  127. package/dist/lib/runtime/subprocess-utils.js +96 -0
  128. package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
  129. package/dist/lib/runtime/tmux-preflight.js +78 -0
  130. package/dist/lib/runtime/utils.d.ts +62 -0
  131. package/dist/lib/runtime/utils.js +192 -0
  132. package/dist/lib/schemas.d.ts +250 -0
  133. package/dist/lib/schemas.js +216 -0
  134. package/dist/lib/sentinel-manager.d.ts +32 -0
  135. package/dist/lib/sentinel-manager.js +62 -0
  136. package/dist/lib/sentinel-wrapper.d.ts +10 -0
  137. package/dist/lib/sentinel-wrapper.js +29 -0
  138. package/dist/lib/settings-hierarchy.js +3 -20
  139. package/dist/lib/shell-adapters/bash-adapter.d.ts +18 -0
  140. package/dist/lib/shell-adapters/bash-adapter.js +69 -0
  141. package/dist/lib/shell-adapters/index.d.ts +5 -0
  142. package/dist/lib/shell-adapters/index.js +7 -0
  143. package/dist/lib/shell-adapters/powershell-adapter.d.ts +18 -0
  144. package/dist/lib/shell-adapters/powershell-adapter.js +62 -0
  145. package/dist/lib/shell-adapters/shell-adapter.d.ts +45 -0
  146. package/dist/lib/shell-adapters/shell-adapter.js +5 -0
  147. package/dist/lib/shell-quoting.d.ts +5 -0
  148. package/dist/lib/shell-quoting.js +17 -0
  149. package/dist/lib/spawn-errors.d.ts +9 -0
  150. package/dist/lib/spawn-errors.js +29 -0
  151. package/dist/lib/spawn.js +5 -11
  152. package/dist/lib/spinner.d.ts +0 -5
  153. package/dist/lib/spinner.js +0 -16
  154. package/dist/lib/template-installer.d.ts +14 -5
  155. package/dist/lib/template-installer.js +40 -38
  156. package/dist/lib/template-resolver.d.ts +6 -7
  157. package/dist/lib/template-resolver.js +26 -21
  158. package/dist/lib/template-settings-reconstructor.d.ts +7 -2
  159. package/dist/lib/template-settings-reconstructor.js +76 -45
  160. package/dist/lib/terminal-strategy.d.ts +12 -0
  161. package/dist/lib/terminal-strategy.js +55 -0
  162. package/dist/lib/terminal.d.ts +34 -4
  163. package/dist/lib/terminal.js +192 -119
  164. package/dist/lib/tmux-pane-placement.d.ts +17 -0
  165. package/dist/lib/tmux-pane-placement.js +58 -0
  166. package/dist/lib/tmux-primitives.d.ts +3 -0
  167. package/dist/lib/tmux-primitives.js +11 -0
  168. package/dist/lib/tmux-session.d.ts +32 -0
  169. package/dist/lib/tmux-session.js +87 -0
  170. package/dist/lib/tty-detection.js +1 -1
  171. package/dist/lib/types.d.ts +168 -0
  172. package/dist/lib/types.js +6 -0
  173. package/dist/lib/version.d.ts +1 -1
  174. package/dist/lib/version.js +1 -1
  175. package/dist/lib/windsurf-hooks-hierarchy.js +6 -23
  176. package/dist/platform/launch.d.ts +11 -0
  177. package/dist/platform/launch.js +11 -0
  178. package/dist/templates/CLAUDE.md +30 -40
  179. package/dist/templates/cc-native/.claude/settings.json +26 -36
  180. package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
  181. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +20 -12
  182. package/dist/templates/cc-native/_cc-native/cc-native.config.json +2 -6
  183. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +39 -59
  184. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +9 -11
  185. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
  186. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +4 -5
  187. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +4 -4
  188. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -27
  189. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +7 -7
  190. package/dist/templates/cc-native/_cc-native/lib-ts/.mocharc.json +9 -0
  191. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/aggregate-agents.test.ts +118 -0
  192. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/artifacts.test.ts +234 -0
  193. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cc-native-state.test.ts +170 -0
  194. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cli-output-parser.test.ts +73 -0
  195. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/config.test.ts +64 -0
  196. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/constants.test.ts +40 -0
  197. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/debug.test.ts +42 -0
  198. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/exports.test.ts +58 -0
  199. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/helpers.ts +107 -0
  200. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/add-plan-context.hook.test.ts +97 -0
  201. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-questions.hook.test.ts +81 -0
  202. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-review.hook.test.ts +71 -0
  203. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/json-parser.test.ts +99 -0
  204. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts +288 -0
  205. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator.test.ts +48 -0
  206. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/reviewers.test.ts +32 -0
  207. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/state.test.ts +124 -0
  208. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/verdict.test.ts +93 -0
  209. package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -0
  210. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +6 -14
  211. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/format.ts +597 -599
  212. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/index.ts +26 -26
  213. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/tracker.ts +106 -107
  214. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/write.ts +118 -119
  215. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -0
  216. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +17 -16
  217. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +132 -10
  218. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
  219. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +6 -6
  220. package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -0
  221. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +2 -3
  222. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/graduation.ts +132 -132
  223. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +88 -86
  224. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +5 -6
  225. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/orchestrator.ts +70 -70
  226. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/output-builder.ts +130 -121
  227. package/dist/templates/cc-native/_cc-native/lib-ts/package-lock.json +1679 -0
  228. package/dist/templates/cc-native/_cc-native/lib-ts/package.json +24 -0
  229. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +5 -5
  230. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +1 -6
  231. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/plan-questions.ts +101 -101
  232. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/review-pipeline.ts +511 -543
  233. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/__tests__/agent-providers.test.ts +262 -0
  234. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/agent.ts +71 -85
  235. package/dist/templates/{_shared/lib-ts/agent-exec → cc-native/_cc-native/lib-ts/reviewers/base}/base-agent.ts +138 -150
  236. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/index.ts +12 -12
  237. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/claude-agent.ts +66 -57
  238. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/codex-agent.ts +185 -200
  239. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/gemini-agent.ts +39 -40
  240. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/orchestrator-claude-agent.ts +196 -225
  241. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/schemas.ts +201 -201
  242. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/types.ts +21 -23
  243. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/hyde.test.ts +365 -0
  244. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/ollama-client.test.ts +223 -0
  245. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +12 -16
  246. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +3 -2
  247. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +31 -31
  248. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +7 -8
  249. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +7 -9
  250. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +16 -19
  251. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +37 -41
  252. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +33 -43
  253. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +20 -20
  254. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +9 -10
  255. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +3 -4
  256. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +50 -126
  257. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +20 -22
  258. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
  259. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +14 -89
  260. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/verdict.ts +72 -72
  261. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +38 -1
  262. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
  263. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
  264. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +38 -16
  265. package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
  266. package/dist/templates/cc-native/_cc-native/scripts/council_debate.ts +242 -0
  267. package/dist/templates/cc-native/_cc-native/scripts/council_debate_simple.ts +294 -0
  268. package/dist/templates/cc-native/_cc-native/{plan-review/workflows → workflows}/specdev.md +9 -9
  269. package/dist/templates/core/.claude/skills/codex/SKILL.md +25 -0
  270. package/dist/templates/core/.claude/skills/devin/SKILL.md +25 -0
  271. package/dist/templates/core/.claude/skills/handoff/SKILL.md +11 -0
  272. package/dist/templates/core/.claude/skills/handoff-resume/SKILL.md +11 -0
  273. package/dist/templates/core/.claude/skills/meta-plan/SKILL.md +13 -0
  274. package/dist/templates/core/.codex/skills/codex/SKILL.md +13 -0
  275. package/dist/templates/core/.codex/skills/devin/SKILL.md +19 -0
  276. package/dist/templates/core/.codex/skills/handoff/SKILL.md +11 -0
  277. package/dist/templates/core/.codex/skills/handoff-resume/SKILL.md +11 -0
  278. package/dist/templates/core/.codex/skills/meta-plan/SKILL.md +13 -0
  279. package/dist/templates/core/.devin/AGENTS.md +5 -0
  280. package/dist/templates/core/.devin/config.json +12 -0
  281. package/dist/templates/core/.devin/skills/codex/SKILL.md +19 -0
  282. package/dist/templates/core/.devin/skills/devin/SKILL.md +13 -0
  283. package/dist/templates/core/.devin/skills/handoff/SKILL.md +11 -0
  284. package/dist/templates/core/.devin/skills/handoff-resume/SKILL.md +11 -0
  285. package/dist/templates/core/.devin/skills/meta-plan/SKILL.md +13 -0
  286. package/dist/templates/core/.windsurf/workflows/handoff-resume.md +9 -0
  287. package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
  288. package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
  289. package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
  290. package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +15 -44
  291. package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
  292. package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
  293. package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +5 -22
  294. package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
  295. package/dist/templates/core/hooks-ts/pre_compact.ts +36 -0
  296. package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
  297. package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
  298. package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
  299. package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
  300. package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
  301. package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
  302. package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
  303. package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
  304. package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
  305. package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +59 -20
  306. package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
  307. package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
  308. package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
  309. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +179 -41
  310. package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
  311. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +82 -0
  312. package/dist/templates/core/lib-ts/package.json +19 -0
  313. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +369 -0
  314. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +108 -0
  315. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
  316. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +24 -8
  317. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
  318. package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
  319. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
  320. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +60 -23
  321. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
  322. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
  323. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +9 -2
  324. package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
  325. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
  326. package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
  327. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +20 -11
  328. package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
  329. package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
  330. package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
  331. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +34 -4
  332. package/dist/templates/core/lib-ts/schemas.ts +233 -0
  333. package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
  334. package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
  335. package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
  336. package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
  337. package/dist/templates/core/scripts/resolve-run.ts +93 -0
  338. package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
  339. package/dist/templates/{_shared → core}/scripts/status_line.ts +26 -21
  340. package/dist/templates/core/skills/codex/CLAUDE.md +83 -0
  341. package/dist/templates/{_shared → core}/skills/codex/SKILL.md +27 -18
  342. package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +79 -113
  343. package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +134 -148
  344. package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
  345. package/dist/templates/core/skills/devin/CLAUDE.md +122 -0
  346. package/dist/templates/core/skills/devin/SKILL.md +73 -0
  347. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +300 -0
  348. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +258 -0
  349. package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
  350. package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
  351. package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
  352. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
  353. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
  354. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
  355. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
  356. package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
  357. package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
  358. package/oclif.manifest.json +89 -13
  359. package/package.json +13 -12
  360. package/dist/lib/base-command.d.ts +0 -114
  361. package/dist/lib/base-command.js +0 -153
  362. package/dist/lib/env-compat.d.ts +0 -18
  363. package/dist/lib/env-compat.js +0 -23
  364. package/dist/lib/stdin.d.ts +0 -48
  365. package/dist/lib/stdin.js +0 -60
  366. package/dist/templates/_shared/.claude/settings.json +0 -120
  367. package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
  368. package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
  369. package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
  370. package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
  371. package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
  372. package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
  373. package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
  374. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
  375. package/dist/templates/_shared/hooks-ts/pre_compact.ts +0 -49
  376. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
  377. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
  378. package/dist/templates/_shared/lib-ts/agent-exec/backends/headless.ts +0 -33
  379. package/dist/templates/_shared/lib-ts/agent-exec/backends/index.ts +0 -6
  380. package/dist/templates/_shared/lib-ts/agent-exec/backends/tmux.ts +0 -119
  381. package/dist/templates/_shared/lib-ts/agent-exec/execution-backend.ts +0 -50
  382. package/dist/templates/_shared/lib-ts/agent-exec/index.ts +0 -6
  383. package/dist/templates/_shared/lib-ts/agent-exec/structured-output.ts +0 -166
  384. package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
  385. package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
  386. package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
  387. package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
  388. package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
  389. package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
  390. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
  391. package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
  392. package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
  393. package/dist/templates/_shared/lib-ts/package.json +0 -20
  394. package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
  395. package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
  396. package/dist/templates/cc-native/_cc-native/CLAUDE.md +0 -73
  397. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +0 -64
  398. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +0 -70
  399. package/dist/templates/cc-native/_cc-native/plan-review/CODING-STANDARDS-CHECKLIST.md +0 -75
  400. package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +0 -143
  401. package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +0 -213
  402. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +0 -70
  403. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +0 -62
  404. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +0 -61
  405. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +0 -62
  406. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +0 -56
  407. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +0 -53
  408. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +0 -66
  409. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +0 -70
  410. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +0 -62
  411. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +0 -72
  412. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +0 -61
  413. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +0 -64
  414. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +0 -56
  415. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +0 -86
  416. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +0 -59
  417. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +0 -58
  418. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +0 -66
  419. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +0 -62
  420. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +0 -66
  421. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +0 -71
  422. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +0 -74
  423. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +0 -77
  424. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +0 -62
  425. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +0 -68
  426. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +0 -61
  427. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +0 -71
  428. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +0 -61
  429. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +0 -61
  430. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +0 -67
  431. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +0 -65
  432. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +0 -74
  433. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +0 -69
  434. package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +0 -172
  435. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +0 -7
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Devin session discovery and summarization.
3
+ *
4
+ * Session discovery strategy (priority order):
5
+ * 1. `devin list --format json` → match session by cwd + timestamp, then
6
+ * extract transcript from SQLite `message_nodes` table
7
+ * 2. Tmux pane scrollback capture (`tmux capture-pane -p -t <paneId>`)
8
+ *
9
+ * If no session transcript is found, falls back to SUMMARY_UNAVAILABLE_MESSAGE.
10
+ */
11
+
12
+ import * as fs from "node:fs";
13
+ import * as os from "node:os";
14
+ import path from "node:path";
15
+
16
+ import { inference } from "../../../lib-ts/runtime/inference.js";
17
+ import { logDebug, logWarn } from "../../../lib-ts/runtime/logger.js";
18
+ import { execFileAsync, findExecutable } from "../../../lib-ts/runtime/subprocess-utils.js";
19
+
20
+ // Re-export shared symbols for consumers
21
+ export {
22
+ type PaneWatchTarget,
23
+ looksLikeBadSummary,
24
+ persistSummary,
25
+ samePath,
26
+ waitForPaneClose,
27
+ } from "../../../lib-ts/runtime/agent-launcher.js";
28
+
29
+ import {
30
+ looksLikeBadSummary,
31
+ samePath,
32
+ } from "../../../lib-ts/runtime/agent-launcher.js";
33
+
34
+ export const SUMMARY_UNAVAILABLE_MESSAGE = "Devin session completed. Summary unavailable.";
35
+
36
+ const DEVIN_LIST_TIMEOUT_MS = 10_000;
37
+ const SUMMARY_TIMEOUT_SEC = 10;
38
+ const MAX_SCROLLBACK_LINES = 300;
39
+ const MAX_LINE_LENGTH = 500;
40
+ const MAX_TRANSCRIPT_LINES = 220;
41
+
42
+ const SESSIONS_DB_PATH = path.join(
43
+ os.homedir(), ".local", "share", "devin", "cli", "sessions.db",
44
+ );
45
+
46
+ const TRANSCRIPT_SUMMARY_PROMPT = `Summarize this Devin session transcript excerpt.
47
+ Return 3-5 concise bullet points.
48
+ Focus on:
49
+ - what was accomplished
50
+ - files changed
51
+ - errors or blockers
52
+ Do not ask follow-up questions.
53
+ Do not request additional input.
54
+ If information is partial, provide best-effort summary from available text.`;
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Session Discovery via `devin list`
58
+ // ---------------------------------------------------------------------------
59
+
60
+ /** Matches the actual `devin list --format json` output schema. */
61
+ interface DevinSession {
62
+ id?: string;
63
+ short_id?: string;
64
+ title?: string;
65
+ working_directory?: string;
66
+ working_directory_display?: string;
67
+ last_activity_at?: number;
68
+ last_activity_ago?: string;
69
+ }
70
+
71
+ async function getDevinSessions(): Promise<DevinSession[]> {
72
+ try {
73
+ const result = await execFileAsync("devin", ["list", "--format", "json"], {
74
+ timeout: DEVIN_LIST_TIMEOUT_MS,
75
+ });
76
+
77
+ if (result.exitCode !== 0) {
78
+ logDebug("devin-watcher", `devin list failed: exit=${result.exitCode}`);
79
+ return [];
80
+ }
81
+
82
+ const parsed = JSON.parse(result.stdout.trim());
83
+ if (!Array.isArray(parsed)) return [];
84
+ return parsed as DevinSession[];
85
+ } catch (error) {
86
+ logDebug("devin-watcher", `devin list parse failed: ${String(error)}`);
87
+ return [];
88
+ }
89
+ }
90
+
91
+ async function findDevinSessionViaList(
92
+ projectRoot: string,
93
+ launchStartedAtMs: number,
94
+ ): Promise<DevinSession | null> {
95
+ const sessions = await getDevinSessions();
96
+ if (sessions.length === 0) return null;
97
+
98
+ const launchStartedAtSec = Math.floor(launchStartedAtMs / 1000);
99
+
100
+ const candidates = sessions.filter((s) => {
101
+ if (s.working_directory && !samePath(s.working_directory, projectRoot)) return false;
102
+ if (s.last_activity_at) {
103
+ // last_activity_at is unix timestamp in seconds
104
+ if (s.last_activity_at < launchStartedAtSec - 5) return false;
105
+ }
106
+ return true;
107
+ });
108
+
109
+ if (candidates.length === 0) return null;
110
+
111
+ // Most recent first
112
+ candidates.sort((a, b) => (b.last_activity_at ?? 0) - (a.last_activity_at ?? 0));
113
+
114
+ return candidates[0] ?? null;
115
+ }
116
+
117
+ // ---------------------------------------------------------------------------
118
+ // Session Transcript Extraction via SQLite
119
+ // ---------------------------------------------------------------------------
120
+
121
+ /**
122
+ * Extract user and assistant message text from the Devin session's
123
+ * `message_nodes` table in `~/.local/share/devin/cli/sessions.db`.
124
+ *
125
+ * Uses `python3 -c` to query SQLite (avoids native module dependency).
126
+ * Returns tagged transcript lines like `collectTranscriptLines` in
127
+ * the Codex watcher.
128
+ */
129
+ async function collectTranscriptFromDb(sessionId: string): Promise<string[]> {
130
+ if (!fs.existsSync(SESSIONS_DB_PATH)) {
131
+ logDebug("devin-watcher", "sessions.db not found");
132
+ return [];
133
+ }
134
+
135
+ const script = `
136
+ import sqlite3, json, sys
137
+ conn = sqlite3.connect(sys.argv[1])
138
+ cur = conn.cursor()
139
+ cur.execute(
140
+ "SELECT chat_message FROM message_nodes WHERE session_id = ? ORDER BY node_id",
141
+ (sys.argv[2],),
142
+ )
143
+ for (raw,) in cur.fetchall():
144
+ try:
145
+ msg = json.loads(raw)
146
+ except Exception:
147
+ continue
148
+ role = msg.get("role", "")
149
+ if role not in ("user", "assistant"):
150
+ continue
151
+ content = msg.get("content", "")
152
+ if isinstance(content, list):
153
+ content = " ".join(
154
+ c.get("text", "") for c in content if isinstance(c, dict)
155
+ )
156
+ if not isinstance(content, str) or not content.strip():
157
+ continue
158
+ print(json.dumps({"role": role, "text": content.strip()}))
159
+ conn.close()
160
+ `.trim();
161
+
162
+ try {
163
+ const result = await execFileAsync(
164
+ "python3", ["-c", script, SESSIONS_DB_PATH, sessionId],
165
+ { timeout: 10_000 },
166
+ );
167
+
168
+ if (result.exitCode !== 0) {
169
+ logDebug("devin-watcher", `SQLite transcript query failed: exit=${result.exitCode}`);
170
+ return [];
171
+ }
172
+
173
+ const out: string[] = [];
174
+ const seen = new Set<string>();
175
+
176
+ for (const line of result.stdout.split(/\r?\n/)) {
177
+ if (!line.trim()) continue;
178
+ try {
179
+ const { role, text } = JSON.parse(line) as { role: string; text: string };
180
+ const normalized = text
181
+ .replaceAll("\r", "")
182
+ .replaceAll(/\p{Cc}/gu, "")
183
+ .replaceAll(/\s+/g, " ")
184
+ .trim();
185
+ if (!normalized) continue;
186
+ const truncated = normalized.length > MAX_LINE_LENGTH
187
+ ? `${normalized.slice(0, MAX_LINE_LENGTH)}...`
188
+ : normalized;
189
+ const tagged = `${role}: ${truncated}`;
190
+ if (seen.has(tagged)) continue;
191
+ seen.add(tagged);
192
+ out.push(tagged);
193
+ } catch { /* skip malformed lines */ }
194
+ }
195
+
196
+ return out.slice(-MAX_TRANSCRIPT_LINES);
197
+ } catch (error) {
198
+ logDebug("devin-watcher", `SQLite transcript extraction failed: ${String(error)}`);
199
+ return [];
200
+ }
201
+ }
202
+
203
+ // ---------------------------------------------------------------------------
204
+ // Tmux Pane Scrollback Capture
205
+ // ---------------------------------------------------------------------------
206
+
207
+ async function capturePaneScrollback(paneId: string | null | undefined): Promise<string | null> {
208
+ if (!paneId) return null;
209
+
210
+ const tmuxPath = findExecutable("tmux");
211
+ if (!tmuxPath) return null;
212
+
213
+ try {
214
+ const result = await execFileAsync(tmuxPath, [
215
+ "capture-pane", "-p", "-t", paneId, "-S", `-${MAX_SCROLLBACK_LINES}`,
216
+ ], { timeout: 5000 });
217
+
218
+ if (result.exitCode !== 0 || !result.stdout.trim()) return null;
219
+
220
+ const lines = result.stdout.split(/\r?\n/)
221
+ .map((line) => {
222
+ const trimmed = line.trim();
223
+ return trimmed.length > MAX_LINE_LENGTH
224
+ ? `${trimmed.slice(0, MAX_LINE_LENGTH)}...`
225
+ : trimmed;
226
+ })
227
+ .filter(Boolean);
228
+
229
+ return lines.length > 0 ? lines.join("\n") : null;
230
+ } catch {
231
+ return null;
232
+ }
233
+ }
234
+
235
+ // ---------------------------------------------------------------------------
236
+ // Summarization
237
+ // ---------------------------------------------------------------------------
238
+
239
+ async function summarizeTranscript(transcript: string): Promise<string | null> {
240
+ const result = inference(
241
+ TRANSCRIPT_SUMMARY_PROMPT,
242
+ `Session transcript excerpt:\n\n${transcript}`,
243
+ "fast",
244
+ SUMMARY_TIMEOUT_SEC,
245
+ );
246
+
247
+ if (result.success && result.output?.trim() && !looksLikeBadSummary(result.output)) {
248
+ return result.output.trim();
249
+ }
250
+
251
+ logWarn("devin-watcher", `Transcript summary failed: ${result.error ?? "empty or low-signal output"}`);
252
+ return null;
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // Main Entry Point
257
+ // ---------------------------------------------------------------------------
258
+
259
+ /**
260
+ * Discover and summarize a Devin session.
261
+ * Tries multiple sources in priority order:
262
+ * 1. devin list → match session → extract transcript from SQLite message_nodes
263
+ * 2. tmux pane scrollback → raw text summary
264
+ */
265
+ export async function summarizeDevinSession(
266
+ projectRoot: string,
267
+ launchStartedAtMs: number,
268
+ paneId?: string | null,
269
+ ): Promise<string | null> {
270
+ // Source 1: devin list → session ID → SQLite transcript
271
+ const session = await findDevinSessionViaList(projectRoot, launchStartedAtMs);
272
+ if (session?.id) {
273
+ logDebug("devin-watcher", `Found session via devin list: ${session.id}`);
274
+
275
+ const transcriptLines = await collectTranscriptFromDb(session.id);
276
+ if (transcriptLines.length > 0) {
277
+ logDebug("devin-watcher", `Extracted ${transcriptLines.length} transcript lines from SQLite`);
278
+ const transcript = transcriptLines.join("\n");
279
+ const summary = await summarizeTranscript(transcript);
280
+ if (summary) return summary;
281
+ }
282
+ }
283
+
284
+ // Source 2: tmux pane scrollback
285
+ const scrollback = await capturePaneScrollback(paneId);
286
+ if (scrollback) {
287
+ logDebug("devin-watcher", `Using tmux scrollback (${scrollback.length} chars)`);
288
+ const summary = await summarizeTranscript(scrollback);
289
+ if (summary) return summary;
290
+
291
+ // Raw fallback: return scrollback lines directly
292
+ const lines = scrollback.split("\n").slice(-12);
293
+ if (lines.length > 0) {
294
+ return `Devin session completed. Transcript fallback:\n- ${lines.join("\n- ")}`;
295
+ }
296
+ }
297
+
298
+ logWarn("devin-watcher", "No session data found from any source");
299
+ return null;
300
+ }
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Launch Devin in a visible pane (tmux/window) and pass the prompt at startup.
4
+ *
5
+ * Usage:
6
+ * bun launch-devin.ts [--model <model>] [--no-watch] [--context <id>] [--prompt <text>] plan
7
+ * bun launch-devin.ts [--model <model>] [--no-watch] [--context <id>] [--prompt <text>] --file <path>
8
+ * bun launch-devin.ts [--model <model>] [--no-watch] [--context <id>] [--prompt <text>] <inline text...>
9
+ */
10
+ import * as fs from "node:fs";
11
+ import path from "node:path";
12
+
13
+ import { findLatestPlan } from "../../../lib-ts/context/plan-manager.js";
14
+ import {
15
+ cleanupSentinel,
16
+ eprint,
17
+ findLatestPlanByMtime,
18
+ getWellKnownSummaryPath,
19
+ resolveContextForLaunch,
20
+ writeFileRefPromptFile,
21
+ writeInlinePromptFile,
22
+ } from "../../../lib-ts/runtime/agent-launcher.js";
23
+ import { aiwLaunch } from "../../../lib-ts/runtime/aiw-cli.js";
24
+ import { resolveDevinModel, buildCliInvocation, type CliArgSpec } from "../../../lib-ts/runtime/cli-args.js";
25
+ import { getProjectRoot } from "../../../lib-ts/runtime/constants.js";
26
+ import { logDebug, logWarn } from "../../../lib-ts/runtime/logger.js";
27
+ import { DEVIN_MODELS } from "../../../lib-ts/runtime/models.js";
28
+ import { displayPath } from "../../../lib-ts/runtime/utils.js";
29
+
30
+ /** Devin-specific model abbreviations. Checked before tier resolution. */
31
+ const DEVIN_ALIASES: Record<string, string> = {
32
+ swe: DEVIN_MODELS.swe,
33
+ gpt: DEVIN_MODELS.gpt,
34
+ opus: DEVIN_MODELS.opus,
35
+ };
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Arg parsing
39
+ // ---------------------------------------------------------------------------
40
+
41
+ const rawArgs = process.argv.slice(2);
42
+
43
+ if (rawArgs.length === 0) {
44
+ eprint("Usage: launch-devin.ts [--model <model>] [--no-watch] [--context <id>] [--prompt <text>] plan | --file <path> | <text...>");
45
+ process.exit(1);
46
+ }
47
+
48
+ let modelFlag: string | undefined;
49
+ let contextFlag: string | undefined;
50
+ let extraPrompt: string | undefined;
51
+ let taskId: string | undefined;
52
+ let watch = true;
53
+ const args: string[] = [];
54
+
55
+ for (let i = 0; i < rawArgs.length; i++) {
56
+ if (rawArgs[i] === "--model" && i + 1 < rawArgs.length) {
57
+ modelFlag = rawArgs[++i];
58
+ } else if (rawArgs[i] === "--context" && i + 1 < rawArgs.length) {
59
+ contextFlag = rawArgs[++i];
60
+ } else if (rawArgs[i] === "--prompt" && i + 1 < rawArgs.length) {
61
+ extraPrompt = rawArgs[++i];
62
+ } else if (rawArgs[i] === "--task-id" && i + 1 < rawArgs.length) {
63
+ taskId = rawArgs[++i];
64
+ } else if (rawArgs[i] === "--no-watch") {
65
+ watch = false;
66
+ } else if (rawArgs[i] === "--prompt") {
67
+ eprint("Error: --prompt requires a text argument.");
68
+ process.exit(1);
69
+ } else {
70
+ args.push(rawArgs[i]);
71
+ }
72
+ }
73
+
74
+ if (args.length === 0) {
75
+ eprint("Usage: launch-devin.ts [--model <model>] [--no-watch] [--context <id>] [--prompt <text>] plan | --file <path> | <text...>");
76
+ process.exit(1);
77
+ }
78
+
79
+ // Resolve model: alias first, then tier/pass-through
80
+ let resolvedModel: string | undefined;
81
+ if (modelFlag) {
82
+ const lower = modelFlag.toLowerCase();
83
+ resolvedModel = lower in DEVIN_ALIASES
84
+ ? DEVIN_ALIASES[lower]
85
+ : resolveDevinModel(modelFlag);
86
+ }
87
+
88
+ let promptPath: string | null = null;
89
+
90
+ const projectRoot = getProjectRoot(process.cwd());
91
+ const ctx = resolveContextForLaunch(contextFlag, projectRoot);
92
+
93
+ if (args[0] === "plan") {
94
+ let planPath: string | null = null;
95
+
96
+ if (ctx) {
97
+ planPath = findLatestPlan(ctx.id, projectRoot);
98
+ }
99
+
100
+ if (!planPath) {
101
+ planPath = findLatestPlanByMtime(projectRoot);
102
+ }
103
+
104
+ if (!planPath) {
105
+ eprint("Error: No plan found. Create a plan first (use plan mode), then run this command.");
106
+ process.exit(1);
107
+ }
108
+
109
+ console.log(`Found plan: ${displayPath(planPath)}`);
110
+ promptPath = writeFileRefPromptFile({
111
+ fileReferencePath: path.resolve(planPath),
112
+ label: "plan",
113
+ extraPrompt,
114
+ ctx,
115
+ projectRoot,
116
+ tempFilePrefix: "devin",
117
+ });
118
+
119
+ } else if (args[0] === "--file") {
120
+ if (!args[1]) {
121
+ eprint("Error: --file requires a path argument.");
122
+ process.exit(1);
123
+ }
124
+ const filePath = path.resolve(args[1]);
125
+ if (!fs.existsSync(filePath)) {
126
+ eprint(`Error: File not found: ${filePath}`);
127
+ process.exit(1);
128
+ }
129
+ promptPath = writeFileRefPromptFile({
130
+ fileReferencePath: filePath,
131
+ label: "file",
132
+ extraPrompt,
133
+ ctx,
134
+ projectRoot,
135
+ tempFilePrefix: "devin",
136
+ });
137
+
138
+ } else {
139
+ promptPath = writeInlinePromptFile({
140
+ text: args.join(" "),
141
+ extraPrompt,
142
+ ctx,
143
+ projectRoot,
144
+ tempFilePrefix: "devin",
145
+ });
146
+ }
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Launch Devin
150
+ // ---------------------------------------------------------------------------
151
+
152
+ const launchCwd = process.env.AIW_CALLER_CWD?.trim() || process.cwd();
153
+
154
+ // Generate task ID if not provided by caller.
155
+ if (!taskId) {
156
+ taskId = `${Date.now()}-${process.pid}`;
157
+ }
158
+ const wellKnownPath = getWellKnownSummaryPath("devin", taskId, projectRoot);
159
+ console.log(`Task ID: ${taskId}`);
160
+ console.log(`Summary will be at: ${wellKnownPath}`);
161
+
162
+ if (resolvedModel) console.log(`Model: ${resolvedModel}${modelFlag !== resolvedModel ? ` (from "${modelFlag}")` : ""}`);
163
+
164
+ logDebug("devin-skill", `Launching: model=${resolvedModel ?? "default"}, taskId=${taskId}, extraPrompt=${Boolean(extraPrompt)}, source=${args[0]}, bytes=${promptPath ? fs.statSync(promptPath).size : 0}`);
165
+
166
+ const launchStartedAtMs = Date.now();
167
+
168
+ const result = await aiwLaunch({
169
+ devin: true,
170
+ wait: false,
171
+ json: true,
172
+ split: "auto",
173
+ promptPath: promptPath ?? undefined,
174
+ cwd: launchCwd,
175
+ });
176
+
177
+ if (!result.launched) {
178
+ // Fallback: non-interactive devin -p mode
179
+ eprint(`Note: Pane launch unavailable (${result.reason ?? "unknown"}). Using devin exec mode (non-interactive).`);
180
+
181
+ const execSpec: CliArgSpec = {
182
+ provider: "devin",
183
+ model: resolvedModel ?? DEVIN_MODELS.swe,
184
+ mode: "print",
185
+ extraArgs: promptPath ? ["--prompt-file", promptPath] : [],
186
+ };
187
+ const execInv = buildCliInvocation(execSpec);
188
+
189
+ const { execFileAsync } = await import("../../../lib-ts/runtime/subprocess-utils.js");
190
+ const execResult = await execFileAsync(execInv.cliName, execInv.args, {
191
+ env: { ...process.env, ...execInv.env },
192
+ shell: process.platform === "win32",
193
+ });
194
+
195
+ if (execResult.stdout) console.log(execResult.stdout);
196
+ if (execResult.exitCode !== 0) {
197
+ eprint(`Devin exec exited with code ${execResult.exitCode}`);
198
+ if (execResult.stderr) eprint(execResult.stderr);
199
+ process.exit(1);
200
+ }
201
+
202
+ console.log("Devin exec completed (non-interactive mode).");
203
+ process.exit(0);
204
+ }
205
+
206
+ const backendLabel = result.backend === "tmux" ? "tmux pane" : result.backend === "psmux" ? "psmux pane" : "window";
207
+ if (result.paneId) {
208
+ console.log(`Devin launched in ${backendLabel}: ${result.paneId}`);
209
+ } else {
210
+ console.log(`Devin launched in ${backendLabel}.`);
211
+ }
212
+
213
+ if (watch && (result.paneId || result.sentinelPath)) {
214
+ try {
215
+ const {
216
+ SUMMARY_UNAVAILABLE_MESSAGE,
217
+ summarizeDevinSession,
218
+ waitForPaneClose,
219
+ persistSummary,
220
+ } = await import("../lib/devin-watcher.js");
221
+
222
+ await waitForPaneClose({
223
+ backend: result.backend,
224
+ paneId: result.paneId,
225
+ sentinelPath: result.sentinelPath,
226
+ });
227
+
228
+ const summary = (await summarizeDevinSession(projectRoot, launchStartedAtMs, result.paneId))
229
+ ?? SUMMARY_UNAVAILABLE_MESSAGE;
230
+ const summaryPath = persistSummary(summary, "devin", undefined, taskId, projectRoot);
231
+
232
+ console.log("\n--- Devin Session Summary ---");
233
+ console.log(summary);
234
+ console.log(`\n[well_known_summary:${wellKnownPath}]`);
235
+ if (summaryPath) {
236
+ console.log(`[summary_file:${summaryPath}]`);
237
+ }
238
+ } catch (error) {
239
+ logWarn("devin-skill", `Watch flow failed: ${String(error)}`);
240
+ const { persistSummary: persistFallback } = await import("../lib/devin-watcher.js");
241
+ const fallbackMsg = "Devin session completed. Summary unavailable (watch error).";
242
+ const fallbackPath = persistFallback(fallbackMsg, "devin", undefined, taskId, projectRoot);
243
+ console.log("\n--- Devin Session Summary ---");
244
+ console.log(fallbackMsg);
245
+ console.log(`\n[well_known_summary:${wellKnownPath}]`);
246
+ if (fallbackPath) {
247
+ console.log(`[summary_file:${fallbackPath}]`);
248
+ }
249
+ } finally {
250
+ cleanupSentinel(result.sentinelPath);
251
+ }
252
+ } else {
253
+ cleanupSentinel(result.sentinelPath);
254
+ }
255
+
256
+ if (result.reason) {
257
+ eprint(`Warning: ${result.reason}`);
258
+ }