aiwcli 0.15.5 → 0.15.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,75 @@
1
+ /**
2
+ * PsmuxMultiplexer — unified psmux (Windows ConPTY) backend.
3
+ * Consolidates PsmuxLauncher + launchInPsmuxSession + command building from pane-driver.
4
+ */
5
+ import type { CreateSessionOptions, CreateSessionResult, Multiplexer, SplitPaneOptions, SplitPaneResult } from '../multiplexer.js';
6
+ /** @internal */
7
+ export interface PsmuxVersion {
8
+ major: number;
9
+ minor: number;
10
+ patch: number;
11
+ }
12
+ /** @internal */
13
+ export declare function meetsMinVersion(v: PsmuxVersion): boolean;
14
+ /** @internal */
15
+ export declare function parseVersionString(stdout: string): null | PsmuxVersion;
16
+ /** @internal */
17
+ export declare function buildCommandArgs(args: string[], mode: 'exec' | 'repl', promptPath?: string): string[];
18
+ /** @internal */
19
+ export declare function buildPowerShellToolCommand(params: {
20
+ args: string[];
21
+ env: Record<string, string>;
22
+ mode: 'exec' | 'repl';
23
+ promptPath?: string;
24
+ toolPath: string;
25
+ }): string;
26
+ /** @internal */
27
+ export declare function buildCreateSessionArgs(params: {
28
+ cwd: string;
29
+ encodedCommand: string;
30
+ sessionName: string;
31
+ }): string[];
32
+ /** @internal */
33
+ export declare function buildSplitWindowArgs(params: {
34
+ cwd?: string;
35
+ encodedCommand: string;
36
+ splitFlag: '-h' | '-v';
37
+ splitTarget?: string | undefined;
38
+ }): string[];
39
+ /** @internal */
40
+ export declare function buildAttachArgs(sessionName: string): string[];
41
+ export declare class PsmuxMultiplexer implements Multiplexer {
42
+ readonly backend: "psmux";
43
+ private readonly psmuxPath;
44
+ private constructor();
45
+ /**
46
+ * Check if psmux is installed and meets version requirements.
47
+ * Checks PATH first, then probes the winget install directory
48
+ * (winget install doesn't always add packages to PATH).
49
+ * Returns a PsmuxMultiplexer instance or null.
50
+ */
51
+ static create(): Promise<null | PsmuxMultiplexer>;
52
+ /**
53
+ * Create a new psmux session.
54
+ * Injects PSMUX_PANE=1 into the PowerShell command so child processes
55
+ * can detect they're inside a psmux session.
56
+ */
57
+ createSession(options: CreateSessionOptions): Promise<CreateSessionResult>;
58
+ /**
59
+ * Detect if we're inside a psmux session we created.
60
+ * Uses PSMUX_PANE env var that we inject in createSession().
61
+ */
62
+ isInsideSession(): boolean;
63
+ kill(paneId: string): Promise<void>;
64
+ splitPane(options: SplitPaneOptions): Promise<SplitPaneResult>;
65
+ private applyBootstrapDefaults;
66
+ private hasSession;
67
+ private resolveAutoSplit;
68
+ private waitForSessionReady;
69
+ }
70
+ /** @internal */
71
+ export declare function buildPsmuxBootstrapCommands(enableMouse?: boolean): string[][];
72
+ /** @internal */
73
+ export declare function buildPsmuxShellCommand(opts: CreateSessionOptions, promptFilePath?: string): string;
74
+ /** @internal */
75
+ export declare function formatPromptPathForBootstrap(promptPath: string): string;
@@ -0,0 +1,384 @@
1
+ /**
2
+ * PsmuxMultiplexer — unified psmux (Windows ConPTY) backend.
3
+ * Consolidates PsmuxLauncher + launchInPsmuxSession + command building from pane-driver.
4
+ */
5
+ import { existsSync, readdirSync, writeFileSync } from 'node:fs';
6
+ import * as os from 'node:os';
7
+ import path from 'node:path';
8
+ import { cleanClaudeEnv, getLastLine, spawnAttached, splitFlagFromDimensions } from '../mux-utils.js';
9
+ import { cleanupSentinelIpc, createSentinelIpcPaths } from '../runtime/sentinel-ipc.js';
10
+ import { execFileAsync, findExecutable } from '../runtime/subprocess-utils.js';
11
+ import { wrapSentinelPowerShell } from '../sentinel-wrapper.js';
12
+ import { quoteForPowerShell, toEncodedPowerShell } from '../shell-quoting.js';
13
+ const MIN_VERSION = { major: 0, minor: 4, patch: 0 };
14
+ const ATTACH_RETRY_DELAY_MS = 200;
15
+ const SESSION_READY_BACKOFF_MS = [50, 100, 150, 250];
16
+ const PSMUX_TERMINAL_OVERRIDES = ',*:Ss@:Se@:Cs@:Cr@';
17
+ /** @internal */
18
+ export function meetsMinVersion(v) {
19
+ if (v.major > MIN_VERSION.major)
20
+ return true;
21
+ if (v.major < MIN_VERSION.major)
22
+ return false;
23
+ if (v.minor > MIN_VERSION.minor)
24
+ return true;
25
+ if (v.minor < MIN_VERSION.minor)
26
+ return false;
27
+ return v.patch >= MIN_VERSION.patch;
28
+ }
29
+ /** @internal */
30
+ export function parseVersionString(stdout) {
31
+ const match = stdout.trim().match(/(\d+)\.(\d+)\.(\d+)/);
32
+ if (!match)
33
+ return null;
34
+ return {
35
+ major: Number(match[1]),
36
+ minor: Number(match[2]),
37
+ patch: Number(match[3]),
38
+ };
39
+ }
40
+ /** @internal */
41
+ export function buildCommandArgs(args, mode, promptPath) {
42
+ if (mode !== 'repl' || !promptPath)
43
+ return args;
44
+ const absolutePromptPath = path.resolve(promptPath);
45
+ const bootstrap = `Read startup instructions from this file path before taking action: ${formatPromptPathForBootstrap(absolutePromptPath)}. Use that file as the initial context.`;
46
+ return [...args, bootstrap];
47
+ }
48
+ /** @internal */
49
+ export function buildPowerShellToolCommand(params) {
50
+ const { toolPath, args, env, mode, promptPath } = params;
51
+ const envPrefix = Object.entries(env)
52
+ .map(([key, value]) => `$env:${key}=${quoteForPowerShell(value)}`)
53
+ .join('; ');
54
+ const commandArgs = buildCommandArgs(args, mode, promptPath);
55
+ const argArray = commandArgs.map((arg) => quoteForPowerShell(arg)).join(', ');
56
+ const invocation = `& ${quoteForPowerShell(toolPath)}${argArray ? ` @(${argArray})` : ''}`;
57
+ const body = mode === 'exec' && promptPath
58
+ ? `Get-Content -Raw -Path ${quoteForPowerShell(promptPath)} | ${invocation}`
59
+ : invocation;
60
+ return [envPrefix, body].filter(Boolean).join('; ');
61
+ }
62
+ /** @internal */
63
+ export function buildCreateSessionArgs(params) {
64
+ return ['new-session', '-d', '-c', params.cwd, '-s', params.sessionName, params.encodedCommand];
65
+ }
66
+ /** @internal */
67
+ export function buildSplitWindowArgs(params) {
68
+ const args = ['split-window', params.splitFlag, '-P', '-F', '#{pane_id}'];
69
+ if (params.cwd) {
70
+ args.push('-c', params.cwd);
71
+ }
72
+ if (params.splitTarget?.trim()) {
73
+ args.push('-t', params.splitTarget.trim());
74
+ }
75
+ args.push(params.encodedCommand);
76
+ return args;
77
+ }
78
+ /** @internal */
79
+ export function buildAttachArgs(sessionName) {
80
+ return ['attach', '-t', sessionName];
81
+ }
82
+ export class PsmuxMultiplexer {
83
+ backend = 'psmux';
84
+ psmuxPath;
85
+ constructor(psmuxPath) {
86
+ this.psmuxPath = psmuxPath;
87
+ }
88
+ /**
89
+ * Check if psmux is installed and meets version requirements.
90
+ * Checks PATH first, then probes the winget install directory
91
+ * (winget install doesn't always add packages to PATH).
92
+ * Returns a PsmuxMultiplexer instance or null.
93
+ */
94
+ static async create() {
95
+ if (process.platform !== 'win32')
96
+ return null;
97
+ const psmuxPath = findExecutable('psmux') ?? findPsmuxInWinget();
98
+ if (!psmuxPath)
99
+ return null;
100
+ const result = await execFileAsync(psmuxPath, ['-V'], { timeout: 3000 });
101
+ if (result.exitCode !== 0)
102
+ return null;
103
+ const version = parseVersionString(result.stdout);
104
+ if (!version)
105
+ return null;
106
+ if (!meetsMinVersion(version))
107
+ return null;
108
+ return new PsmuxMultiplexer(psmuxPath);
109
+ }
110
+ /**
111
+ * Create a new psmux session.
112
+ * Injects PSMUX_PANE=1 into the PowerShell command so child processes
113
+ * can detect they're inside a psmux session.
114
+ */
115
+ async createSession(options) {
116
+ const { sessionName, reattach, enableMouse = true } = options;
117
+ let promptFilePath;
118
+ if (options.promptText) {
119
+ promptFilePath = path.join(os.tmpdir(), `aiwcli-prompt-${Date.now()}-${process.pid}.txt`);
120
+ writeFileSync(promptFilePath, options.promptText, { encoding: 'utf8', mode: 0o600 });
121
+ }
122
+ // Build the PowerShell command to run inside the psmux session
123
+ const shellCommand = buildPsmuxShellCommand(options, promptFilePath);
124
+ // Inject PSMUX_PANE=1 for inside-session detection
125
+ const commandWithEnv = `$env:PSMUX_PANE='1'; ${shellCommand}`;
126
+ const psmuxArgs = buildCreateSessionArgs({
127
+ sessionName,
128
+ cwd: process.cwd(),
129
+ encodedCommand: toEncodedPowerShell(commandWithEnv),
130
+ });
131
+ if (reattach) {
132
+ const exists = await this.hasSession(sessionName);
133
+ if (!exists) {
134
+ const detachedCreate = await execFileAsync(this.psmuxPath, psmuxArgs, { timeout: 5000 });
135
+ if (detachedCreate.exitCode !== 0) {
136
+ const stderr = detachedCreate.stderr.trim();
137
+ return {
138
+ exitCode: detachedCreate.exitCode ?? 1,
139
+ usedMux: false,
140
+ reason: stderr ? `psmux new-session failed: ${stderr}` : 'psmux new-session failed',
141
+ };
142
+ }
143
+ }
144
+ }
145
+ else {
146
+ const detachedCreate = await execFileAsync(this.psmuxPath, psmuxArgs, { timeout: 5000 });
147
+ if (detachedCreate.exitCode !== 0) {
148
+ const stderr = detachedCreate.stderr.trim();
149
+ return {
150
+ exitCode: detachedCreate.exitCode ?? 1,
151
+ usedMux: false,
152
+ reason: stderr ? `psmux new-session failed: ${stderr}` : 'psmux new-session failed',
153
+ };
154
+ }
155
+ }
156
+ const ready = await this.waitForSessionReady(sessionName);
157
+ if (!ready) {
158
+ return {
159
+ exitCode: 1,
160
+ usedMux: false,
161
+ reason: `psmux session '${sessionName}' not ready for attach`,
162
+ };
163
+ }
164
+ await this.applyBootstrapDefaults(enableMouse);
165
+ const attachArgs = buildAttachArgs(sessionName);
166
+ const env = cleanClaudeEnv();
167
+ const firstAttach = await spawnAttached(this.psmuxPath, attachArgs, env, this.backend);
168
+ if (firstAttach.usedMux || firstAttach.exitCode !== 1)
169
+ return firstAttach;
170
+ await waitMs(ATTACH_RETRY_DELAY_MS);
171
+ const secondAttach = await spawnAttached(this.psmuxPath, attachArgs, env, this.backend);
172
+ if (secondAttach.usedMux || secondAttach.exitCode !== 1)
173
+ return secondAttach;
174
+ return {
175
+ ...secondAttach,
176
+ reason: 'psmux attach failed after retry (auth/session readiness race)',
177
+ usedMux: false,
178
+ };
179
+ }
180
+ /**
181
+ * Detect if we're inside a psmux session we created.
182
+ * Uses PSMUX_PANE env var that we inject in createSession().
183
+ */
184
+ isInsideSession() {
185
+ return Boolean(process.env.PSMUX_PANE);
186
+ }
187
+ async kill(paneId) {
188
+ if (!paneId)
189
+ return;
190
+ await execFileAsync(this.psmuxPath, ['kill-pane', '-t', paneId], { timeout: 3000 });
191
+ }
192
+ async splitPane(options) {
193
+ const mode = options.mode ?? 'repl';
194
+ const args = options.args ?? [];
195
+ const envVars = options.env ?? {};
196
+ const cwd = options.cwd ?? process.cwd();
197
+ // Resolve tool path — psmux uses native Windows paths directly
198
+ const toolPath = findExecutable(options.toolName);
199
+ if (!toolPath) {
200
+ return { launched: false, backend: this.backend, reason: `${options.toolName} not found on PATH` };
201
+ }
202
+ // Sentinel IPC
203
+ const useSentinel = options.sentinel !== false;
204
+ const sentinel = useSentinel ? createSentinelIpcPaths(`aiwcli-pane-${options.toolName}`) : null;
205
+ try {
206
+ const baseCommand = buildPowerShellToolCommand({
207
+ toolPath,
208
+ args,
209
+ env: envVars,
210
+ mode,
211
+ ...(options.promptPath ? { promptPath: options.promptPath } : {}),
212
+ });
213
+ let paneCommand = baseCommand;
214
+ if (sentinel) {
215
+ const holdMessage = options.holdMessage ?? '[aiwcli] Driver exited. Pane held open.';
216
+ paneCommand = wrapSentinelPowerShell({
217
+ command: baseCommand,
218
+ sentinelPath: sentinel.sentinelPath,
219
+ autoClose: Boolean(options.autoClose),
220
+ holdPane: Boolean(options.holdPane),
221
+ holdMessage,
222
+ });
223
+ }
224
+ // Wrap in PowerShell using -EncodedCommand to avoid double-quote expansion issues
225
+ const effectivePaneCommand = toEncodedPowerShell(paneCommand);
226
+ // Resolve split direction
227
+ const splitDirection = options.split ?? 'auto';
228
+ let splitFlag;
229
+ if (splitDirection === 'auto') {
230
+ splitFlag = await this.resolveAutoSplit();
231
+ }
232
+ else {
233
+ splitFlag = splitDirection === 'v' ? '-v' : '-h';
234
+ }
235
+ await this.applyBootstrapDefaults();
236
+ // Build psmux split-window command
237
+ const psmuxArgs = buildSplitWindowArgs({
238
+ splitFlag,
239
+ encodedCommand: effectivePaneCommand,
240
+ cwd,
241
+ splitTarget: options.splitTarget,
242
+ });
243
+ const split = await execFileAsync(this.psmuxPath, psmuxArgs, { timeout: 5000 });
244
+ if (split.exitCode !== 0) {
245
+ if (sentinel)
246
+ cleanupSentinelIpc(sentinel);
247
+ return {
248
+ launched: false,
249
+ backend: this.backend,
250
+ reason: 'psmux split-window failed',
251
+ stderr: split.stderr.trim() || undefined,
252
+ };
253
+ }
254
+ const paneId = getLastLine(split.stdout) || undefined;
255
+ return {
256
+ launched: true,
257
+ backend: this.backend,
258
+ paneId,
259
+ sentinelPath: sentinel?.sentinelPath,
260
+ };
261
+ }
262
+ catch (error) {
263
+ if (sentinel)
264
+ cleanupSentinelIpc(sentinel);
265
+ return {
266
+ launched: false,
267
+ backend: this.backend,
268
+ reason: `pane launch failed: ${String(error)}`,
269
+ };
270
+ }
271
+ }
272
+ async applyBootstrapDefaults(enableMouse = true) {
273
+ await runBootstrapCommands(this.psmuxPath, buildPsmuxBootstrapCommands(enableMouse));
274
+ }
275
+ async hasSession(sessionName) {
276
+ try {
277
+ const result = await execFileAsync(this.psmuxPath, ['has-session', '-t', sessionName], { timeout: 3000 });
278
+ return result.exitCode === 0;
279
+ }
280
+ catch {
281
+ return false;
282
+ }
283
+ }
284
+ async resolveAutoSplit() {
285
+ try {
286
+ const size = await execFileAsync(this.psmuxPath, ['display-message', '-p', '#{pane_width} #{pane_height}'], { timeout: 3000 });
287
+ if (size.exitCode !== 0)
288
+ return '-h';
289
+ const parts = size.stdout.trim().split(/\s+/);
290
+ if (parts.length < 2)
291
+ return '-h';
292
+ const width = Number.parseInt(parts[0] ?? '', 10);
293
+ const height = Number.parseInt(parts[1] ?? '', 10);
294
+ if (!Number.isFinite(width) || !Number.isFinite(height))
295
+ return '-h';
296
+ return splitFlagFromDimensions(width, height);
297
+ }
298
+ catch {
299
+ return '-h';
300
+ }
301
+ }
302
+ async waitForSessionReady(sessionName) {
303
+ if (await this.hasSession(sessionName))
304
+ return true;
305
+ const poll = async (index) => {
306
+ const backoffMs = SESSION_READY_BACKOFF_MS[index];
307
+ if (backoffMs === undefined)
308
+ return false;
309
+ await waitMs(backoffMs);
310
+ if (await this.hasSession(sessionName))
311
+ return true;
312
+ return poll(index + 1);
313
+ };
314
+ return poll(0);
315
+ }
316
+ }
317
+ // Probe winget package dir for psmux.exe.
318
+ // winget install drops the binary under %LOCALAPPDATA%/Microsoft/WinGet/Packages/
319
+ // but does not always add it to PATH.
320
+ function findPsmuxInWinget() {
321
+ const localAppData = process.env.LOCALAPPDATA;
322
+ if (!localAppData)
323
+ return null;
324
+ const packagesDir = path.join(localAppData, 'Microsoft', 'WinGet', 'Packages');
325
+ if (!existsSync(packagesDir))
326
+ return null;
327
+ try {
328
+ const entries = readdirSync(packagesDir);
329
+ const psmuxDir = entries.find((e) => e.startsWith('marlocarlo.psmux'));
330
+ if (!psmuxDir)
331
+ return null;
332
+ const candidate = path.join(packagesDir, psmuxDir, 'psmux.exe');
333
+ return existsSync(candidate) ? candidate : null;
334
+ }
335
+ catch {
336
+ return null;
337
+ }
338
+ }
339
+ /** @internal */
340
+ export function buildPsmuxBootstrapCommands(enableMouse = true) {
341
+ const commands = [];
342
+ if (enableMouse) {
343
+ commands.push(['set-option', '-g', 'mouse', 'on']);
344
+ }
345
+ commands.push(['set-option', '-g', 'history-limit', '50000'], ['set-option', '-g', 'cursor-blink', 'off'], ['set-option', '-g', 'cursor-style', 'block'], ['set-option', '-g', 'status-interval', '0'], ['set-option', '-g', 'terminal-overrides', PSMUX_TERMINAL_OVERRIDES]);
346
+ return commands;
347
+ }
348
+ /** @internal */
349
+ export function buildPsmuxShellCommand(opts, promptFilePath) {
350
+ const { toolPath, toolArgs } = opts;
351
+ const cmdParts = [];
352
+ cmdParts.push(`& ${quoteForPowerShell(toolPath)}`);
353
+ for (const arg of toolArgs) {
354
+ cmdParts.push(quoteForPowerShell(arg));
355
+ }
356
+ if (promptFilePath) {
357
+ const bootstrap = `Read startup instructions from this file path before taking action: ${formatPromptPathForBootstrap(promptFilePath)}. Use that file as the initial context.`;
358
+ cmdParts.push(quoteForPowerShell(bootstrap));
359
+ }
360
+ return cmdParts.join(' ');
361
+ }
362
+ /** @internal */
363
+ export function formatPromptPathForBootstrap(promptPath) {
364
+ if (process.platform !== 'win32')
365
+ return promptPath;
366
+ return promptPath.replaceAll('\\', '/');
367
+ }
368
+ async function runBootstrapCommands(psmuxPath, commands, index = 0) {
369
+ const command = commands[index];
370
+ if (!command)
371
+ return;
372
+ try {
373
+ await execFileAsync(psmuxPath, command, { timeout: 3000 });
374
+ }
375
+ catch {
376
+ // Best effort only.
377
+ }
378
+ await runBootstrapCommands(psmuxPath, commands, index + 1);
379
+ }
380
+ function waitMs(ms) {
381
+ return new Promise((resolve) => {
382
+ setTimeout(resolve, ms);
383
+ });
384
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * TmuxMultiplexer — unified tmux backend.
3
+ * Consolidates TmuxLauncher + launchInTmuxSession + command building from pane-driver.
4
+ */
5
+ import type { CreateSessionOptions, CreateSessionResult, Multiplexer, SplitPaneOptions, SplitPaneResult } from '../multiplexer.js';
6
+ /** @internal */
7
+ export declare function buildEnvPrefix(env: Record<string, string>): string;
8
+ /** @internal */
9
+ export declare function buildShToolCommand(params: {
10
+ args: string[];
11
+ env: Record<string, string>;
12
+ mode: 'exec' | 'repl';
13
+ promptPath?: string;
14
+ promptText?: string | undefined;
15
+ toolPath: string;
16
+ }): string;
17
+ /** @internal */
18
+ export declare function buildCommandArgs(args: string[], mode: 'exec' | 'repl', promptText?: string): string[];
19
+ /** @internal */
20
+ export declare function withWindowsTmuxBootstrap(command: string, platform?: NodeJS.Platform): string;
21
+ /** @internal */
22
+ export declare function buildTmuxSplitWindowArgs(params: {
23
+ command: string;
24
+ cwd?: string | undefined;
25
+ splitFlag: '-h' | '-v';
26
+ splitTarget?: string | undefined;
27
+ }): string[];
28
+ /** @internal */
29
+ export declare function buildTmuxCreateSessionArgs(params: {
30
+ cwd: string;
31
+ reattach?: boolean | undefined;
32
+ sessionName: string;
33
+ shellCommand: string;
34
+ }): string[];
35
+ export declare class TmuxMultiplexer implements Multiplexer {
36
+ readonly backend: "tmux";
37
+ private readonly tmuxPath;
38
+ private constructor();
39
+ static create(): null | TmuxMultiplexer;
40
+ createSession(options: CreateSessionOptions): Promise<CreateSessionResult>;
41
+ isInsideSession(): boolean;
42
+ kill(paneId: string): Promise<void>;
43
+ splitPane(options: SplitPaneOptions): Promise<SplitPaneResult>;
44
+ }