aiwcli 0.15.4 → 0.15.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +6 -3
  2. package/dist/capabilities/branch/adapters.d.ts +2 -0
  3. package/dist/capabilities/branch/adapters.js +21 -0
  4. package/dist/capabilities/branch/contracts.d.ts +57 -0
  5. package/dist/capabilities/branch/contracts.js +1 -0
  6. package/dist/capabilities/branch/control-plane.d.ts +2 -0
  7. package/dist/capabilities/branch/control-plane.js +343 -0
  8. package/dist/capabilities/branch/runtime-core.d.ts +5 -0
  9. package/dist/capabilities/branch/runtime-core.js +36 -0
  10. package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
  11. package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
  12. package/dist/capabilities/installation/control-plane/clear-command.d.ts +160 -0
  13. package/dist/capabilities/installation/control-plane/clear-command.js +1220 -0
  14. package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
  15. package/dist/capabilities/installation/control-plane/init-command.js +449 -0
  16. package/dist/capabilities/launch/contracts.d.ts +51 -0
  17. package/dist/capabilities/launch/contracts.js +1 -0
  18. package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
  19. package/dist/capabilities/launch/control-plane/execute-launch.js +222 -0
  20. package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
  21. package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
  22. package/dist/cli/base-command.d.ts +18 -0
  23. package/dist/cli/base-command.js +55 -0
  24. package/dist/commands/branch.d.ts +0 -20
  25. package/dist/commands/branch.js +24 -416
  26. package/dist/commands/clean.d.ts +1 -41
  27. package/dist/commands/clean.js +1 -196
  28. package/dist/commands/clear.d.ts +1 -161
  29. package/dist/commands/clear.js +1 -1121
  30. package/dist/commands/init/index.d.ts +1 -98
  31. package/dist/commands/init/index.js +4 -478
  32. package/dist/commands/launch.d.ts +36 -11
  33. package/dist/commands/launch.js +135 -159
  34. package/dist/lib/base-command.d.ts +1 -114
  35. package/dist/lib/base-command.js +1 -153
  36. package/dist/lib/claude-settings-types.d.ts +31 -19
  37. package/dist/lib/context/context-formatter.d.ts +74 -0
  38. package/dist/lib/context/context-formatter.js +493 -0
  39. package/dist/lib/context/context-selector.d.ts +42 -0
  40. package/dist/lib/context/context-selector.js +451 -0
  41. package/dist/lib/context/context-store.d.ts +100 -0
  42. package/dist/lib/context/context-store.js +618 -0
  43. package/dist/lib/context/plan-manager.d.ts +54 -0
  44. package/dist/lib/context/plan-manager.js +282 -0
  45. package/dist/lib/context/task-tracker.d.ts +44 -0
  46. package/dist/lib/context/task-tracker.js +146 -0
  47. package/dist/lib/core-ide-base.d.ts +4 -0
  48. package/dist/lib/core-ide-base.js +77 -0
  49. package/dist/lib/core-installer.d.ts +5 -0
  50. package/dist/lib/core-installer.js +54 -0
  51. package/dist/lib/git-exclude-manager.d.ts +2 -2
  52. package/dist/lib/git-exclude-manager.js +3 -3
  53. package/dist/lib/hooks/hook-utils.d.ts +143 -0
  54. package/dist/lib/hooks/hook-utils.js +609 -0
  55. package/dist/lib/hooks/session-end-logic.d.ts +5 -0
  56. package/dist/lib/hooks/session-end-logic.js +63 -0
  57. package/dist/lib/hooks-merger.js +25 -19
  58. package/dist/lib/ide-path-resolver.d.ts +19 -7
  59. package/dist/lib/ide-path-resolver.js +25 -9
  60. package/dist/lib/install-state.d.ts +34 -0
  61. package/dist/lib/install-state.js +161 -0
  62. package/dist/lib/launch-options.d.ts +1 -0
  63. package/dist/lib/launch-options.js +1 -0
  64. package/dist/lib/lsp-patch.d.ts +12 -0
  65. package/dist/lib/lsp-patch.js +156 -0
  66. package/dist/lib/multiplexer.d.ts +57 -0
  67. package/dist/lib/multiplexer.js +19 -0
  68. package/dist/lib/multiplexers/psmux.d.ts +75 -0
  69. package/dist/lib/multiplexers/psmux.js +384 -0
  70. package/dist/lib/multiplexers/tmux.d.ts +44 -0
  71. package/dist/lib/multiplexers/tmux.js +262 -0
  72. package/dist/lib/mux-utils.d.ts +5 -0
  73. package/dist/lib/mux-utils.js +42 -0
  74. package/dist/lib/paths.d.ts +2 -2
  75. package/dist/lib/paths.js +2 -2
  76. package/dist/lib/platform-commands.d.ts +27 -0
  77. package/dist/lib/platform-commands.js +49 -0
  78. package/dist/lib/runtime/aiw-cli.d.ts +37 -0
  79. package/dist/lib/runtime/aiw-cli.js +74 -0
  80. package/dist/lib/runtime/atomic-write.d.ts +19 -0
  81. package/dist/lib/runtime/atomic-write.js +121 -0
  82. package/dist/lib/runtime/cli-args.d.ts +55 -0
  83. package/dist/lib/runtime/cli-args.js +185 -0
  84. package/dist/lib/runtime/constants.d.ts +56 -0
  85. package/dist/lib/runtime/constants.js +230 -0
  86. package/dist/lib/runtime/executable-policy.d.ts +16 -0
  87. package/dist/lib/runtime/executable-policy.js +57 -0
  88. package/dist/lib/runtime/git-state.d.ts +9 -0
  89. package/dist/lib/runtime/git-state.js +59 -0
  90. package/dist/lib/runtime/inference.d.ts +37 -0
  91. package/dist/lib/runtime/inference.js +262 -0
  92. package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
  93. package/dist/lib/runtime/lint-dispatch.js +285 -0
  94. package/dist/lib/runtime/logger.d.ts +66 -0
  95. package/dist/lib/runtime/logger.js +201 -0
  96. package/dist/lib/runtime/models.d.ts +14 -0
  97. package/dist/lib/runtime/models.js +14 -0
  98. package/dist/lib/runtime/platform-adapter.d.ts +7 -0
  99. package/dist/lib/runtime/platform-adapter.js +21 -0
  100. package/dist/lib/runtime/preflight.d.ts +24 -0
  101. package/dist/lib/runtime/preflight.js +65 -0
  102. package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
  103. package/dist/lib/runtime/sentinel-ipc.js +67 -0
  104. package/dist/lib/runtime/state-io.d.ts +30 -0
  105. package/dist/lib/runtime/state-io.js +174 -0
  106. package/dist/lib/runtime/stop-words.d.ts +20 -0
  107. package/dist/lib/runtime/stop-words.js +150 -0
  108. package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
  109. package/dist/lib/runtime/subprocess-utils.js +96 -0
  110. package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
  111. package/dist/lib/runtime/tmux-preflight.js +78 -0
  112. package/dist/lib/runtime/utils.d.ts +54 -0
  113. package/dist/lib/runtime/utils.js +162 -0
  114. package/dist/lib/sentinel-wrapper.d.ts +9 -0
  115. package/dist/lib/sentinel-wrapper.js +20 -0
  116. package/dist/lib/shell-quoting.d.ts +5 -0
  117. package/dist/lib/shell-quoting.js +17 -0
  118. package/dist/lib/spawn-errors.d.ts +6 -0
  119. package/dist/lib/spawn-errors.js +15 -0
  120. package/dist/lib/spawn.js +5 -11
  121. package/dist/lib/template-installer.d.ts +4 -5
  122. package/dist/lib/template-installer.js +36 -34
  123. package/dist/lib/template-resolver.d.ts +6 -7
  124. package/dist/lib/template-resolver.js +26 -21
  125. package/dist/lib/template-settings-reconstructor.d.ts +7 -2
  126. package/dist/lib/template-settings-reconstructor.js +76 -45
  127. package/dist/lib/terminal-strategy.d.ts +11 -0
  128. package/dist/lib/terminal-strategy.js +49 -0
  129. package/dist/lib/terminal.d.ts +28 -0
  130. package/dist/lib/terminal.js +162 -112
  131. package/dist/lib/tmux-pane-placement.d.ts +17 -0
  132. package/dist/lib/tmux-pane-placement.js +58 -0
  133. package/dist/lib/tmux-primitives.d.ts +5 -0
  134. package/dist/lib/tmux-primitives.js +15 -0
  135. package/dist/lib/tmux-session.d.ts +32 -0
  136. package/dist/lib/tmux-session.js +86 -0
  137. package/dist/lib/tty-detection.js +1 -1
  138. package/dist/lib/types.d.ts +168 -0
  139. package/dist/lib/types.js +6 -0
  140. package/dist/lib/version.d.ts +1 -1
  141. package/dist/lib/version.js +1 -1
  142. package/dist/platform/launch.d.ts +10 -0
  143. package/dist/platform/launch.js +10 -0
  144. package/dist/templates/CLAUDE.md +31 -40
  145. package/dist/templates/cc-native/.claude/settings.json +27 -27
  146. package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
  147. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +10 -9
  148. package/dist/templates/cc-native/_cc-native/CLAUDE.md +18 -18
  149. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +3 -3
  150. package/dist/templates/cc-native/_cc-native/artifacts/lib/format.ts +14 -14
  151. package/dist/templates/cc-native/_cc-native/artifacts/lib/tracker.ts +1 -1
  152. package/dist/templates/cc-native/_cc-native/artifacts/lib/write.ts +3 -3
  153. package/dist/templates/cc-native/_cc-native/cc-native.config.json +3 -3
  154. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +16 -15
  155. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +3 -3
  156. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
  157. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +2 -2
  158. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +3 -3
  159. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -2
  160. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +3 -3
  161. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +8 -8
  162. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +1 -1
  163. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +4 -4
  164. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +1 -1
  165. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
  166. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +1 -1
  167. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +1 -1
  168. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +2 -2
  169. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +1 -1
  170. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +2 -2
  171. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +1 -1
  172. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +8 -8
  173. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +3 -3
  174. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
  175. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +3 -3
  176. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +3 -1
  177. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
  178. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
  179. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +37 -15
  180. package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +16 -69
  181. package/dist/templates/cc-native/_cc-native/plan-review/lib/orchestrator.ts +1 -1
  182. package/dist/templates/cc-native/_cc-native/plan-review/lib/output-builder.ts +1 -1
  183. package/dist/templates/cc-native/_cc-native/plan-review/lib/plan-questions.ts +2 -2
  184. package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
  185. package/dist/templates/cc-native/_cc-native/plan-review/lib/review-pipeline.ts +7 -7
  186. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/agent.ts +4 -4
  187. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +3 -3
  188. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/index.ts +1 -1
  189. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/claude-agent.ts +2 -2
  190. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/codex-agent.ts +4 -4
  191. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/gemini-agent.ts +1 -1
  192. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/providers/orchestrator-claude-agent.ts +5 -6
  193. package/dist/templates/core/.codex/workflows/codex.md +17 -0
  194. package/dist/templates/core/.codex/workflows/handoff.md +5 -0
  195. package/dist/templates/core/.codex/workflows/meta-plan.md +7 -0
  196. package/dist/templates/core/.cognition/AGENTS.md +5 -0
  197. package/dist/templates/core/.cognition/config.json +12 -0
  198. package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
  199. package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
  200. package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
  201. package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +14 -23
  202. package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
  203. package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
  204. package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +4 -3
  205. package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
  206. package/dist/templates/{_shared → core}/hooks-ts/pre_compact.ts +5 -5
  207. package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
  208. package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
  209. package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
  210. package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
  211. package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
  212. package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
  213. package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/headless.ts +3 -2
  214. package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/tmux.ts +44 -15
  215. package/dist/templates/{_shared → core}/lib-ts/agent-exec/base-agent.ts +6 -4
  216. package/dist/templates/{_shared → core}/lib-ts/agent-exec/execution-backend.ts +1 -1
  217. package/dist/templates/{_shared → core}/lib-ts/agent-exec/index.ts +2 -2
  218. package/dist/templates/{_shared → core}/lib-ts/agent-exec/structured-output.ts +4 -5
  219. package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
  220. package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
  221. package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
  222. package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +32 -20
  223. package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
  224. package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
  225. package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
  226. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +168 -41
  227. package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
  228. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +93 -0
  229. package/dist/templates/core/lib-ts/package.json +19 -0
  230. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +295 -0
  231. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +106 -0
  232. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
  233. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +8 -6
  234. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
  235. package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
  236. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
  237. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +59 -10
  238. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
  239. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
  240. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +2 -2
  241. package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
  242. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
  243. package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
  244. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +11 -7
  245. package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
  246. package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
  247. package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
  248. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +4 -3
  249. package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
  250. package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
  251. package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
  252. package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
  253. package/dist/templates/core/scripts/resolve-run.ts +61 -0
  254. package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
  255. package/dist/templates/{_shared → core}/scripts/status_line.ts +25 -20
  256. package/dist/templates/core/skills/codex/CLAUDE.md +78 -0
  257. package/dist/templates/{_shared → core}/skills/codex/SKILL.md +21 -18
  258. package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +76 -103
  259. package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +119 -133
  260. package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
  261. package/dist/templates/core/skills/devin/CLAUDE.md +65 -0
  262. package/dist/templates/core/skills/devin/SKILL.md +73 -0
  263. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +280 -0
  264. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +257 -0
  265. package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
  266. package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
  267. package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
  268. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
  269. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
  270. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
  271. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
  272. package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
  273. package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
  274. package/oclif.manifest.json +89 -13
  275. package/package.json +13 -12
  276. package/dist/templates/_shared/.claude/settings.json +0 -120
  277. package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
  278. package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
  279. package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
  280. package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
  281. package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
  282. package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
  283. package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
  284. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
  285. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
  286. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
  287. package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
  288. package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
  289. package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
  290. package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
  291. package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
  292. package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
  293. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
  294. package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
  295. package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
  296. package/dist/templates/_shared/lib-ts/package.json +0 -20
  297. package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
  298. package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
  299. /package/dist/templates/{_shared → core}/lib-ts/agent-exec/backends/index.ts +0 -0
@@ -1,11 +1,7 @@
1
- import { promises as fs } from 'node:fs';
2
- import { basename, dirname, join, resolve } from 'node:path';
3
1
  import { Args, Flags } from '@oclif/core';
4
- import clipboardy from 'clipboardy';
2
+ import { createBranchCommandDependencies } from '../capabilities/branch/adapters.js';
3
+ import { executeBranchCommand } from '../capabilities/branch/control-plane.js';
5
4
  import BaseCommand from '../lib/base-command.js';
6
- import { branchExists, createWorktree, deleteBranch, deleteWorktreeFolder, getAllWorktrees, getCurrentBranch, getMainBranch, getWorktreePath, hasMergeRequest, hasUnpushedCommits, } from '../lib/git/index.js';
7
- import { launchTerminal } from '../lib/terminal.js';
8
- import { EXIT_CODES } from '../types/index.js';
9
5
  /**
10
6
  * Manage git branch operations: launch in main/master or delete branch and worktree.
11
7
  *
@@ -78,416 +74,28 @@ export default class BranchCommand extends BaseCommand {
78
74
  };
79
75
  async run() {
80
76
  const { args, flags } = await this.parse(BranchCommand);
81
- // Validate that one of the flags is provided
82
- if (!flags.main && !flags.launch && !flags.delete) {
83
- if (args.branchName) {
84
- // Bare positional arg = shorthand for --launch <name>
85
- await this.handleWorktreeLaunch(args.branchName);
86
- return;
87
- }
88
- this.error('Either provide a branch name directly (aiw branch <name>) or use --main, --launch, or --delete', { exit: EXIT_CODES.INVALID_USAGE });
89
- }
90
- // Route to appropriate handler
91
- if (flags.main) {
92
- await this.handleMainBranch();
93
- }
94
- else if (flags.launch) {
95
- await this.handleWorktreeLaunch(args.branchName);
96
- }
97
- else if (flags.delete && flags.all) {
98
- // Handle --delete --all: clean up all worktrees
99
- await this.handleDeleteAll();
100
- }
101
- else if (flags.delete) {
102
- // Handle --delete <branchName>: delete single branch
103
- await this.handleDelete(args.branchName);
104
- }
105
- }
106
- /**
107
- * Handle --delete flag: Delete git branch and worktree folder
108
- */
109
- async handleDelete(branchName) {
110
- try {
111
- // Validate branch name is provided
112
- if (!branchName) {
113
- this.error('Branch name is required with --delete flag\n\nUsage: aiw branch --delete <branchName>', {
114
- exit: EXIT_CODES.INVALID_USAGE,
115
- });
116
- }
117
- const cwd = process.cwd();
118
- // Check 1: Verify we are in a git repository
119
- this.debug('Checking if current directory is a git repository...');
120
- const isGitRepo = await this.isGitRepository(cwd);
121
- if (!isGitRepo) {
122
- this.error('Not a git repository. This command only works inside a git repository.', {
123
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
124
- });
125
- }
126
- this.debug('✓ Git repository detected');
127
- // Check 2: Prevent deletion of main/master branches
128
- if (branchName === 'main' || branchName === 'master') {
129
- this.error(`Cannot delete ${branchName} branch. This is a protected branch.`, {
130
- exit: EXIT_CODES.INVALID_USAGE,
131
- });
132
- }
133
- // Check 3: Verify the branch exists
134
- this.debug(`Checking if branch '${branchName}' exists...`);
135
- if (!branchExists(branchName)) {
136
- this.error(`Branch '${branchName}' does not exist.`, {
137
- exit: EXIT_CODES.INVALID_USAGE,
138
- });
139
- }
140
- this.debug(`✓ Branch '${branchName}' exists`);
141
- // Check 4: Get current branch to verify we're not on the branch being deleted
142
- this.debug('Getting current branch name...');
143
- let currentBranch;
144
- try {
145
- currentBranch = getCurrentBranch();
146
- }
147
- catch (error_) {
148
- const error = error_;
149
- this.error(`Failed to get current branch: ${error.message}`, {
150
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
151
- });
152
- }
153
- this.debug(`Current branch: ${currentBranch}`);
154
- if (currentBranch === branchName) {
155
- this.error(`Cannot delete branch '${branchName}' because you are currently on it.\n\n` +
156
- `Please switch to a different directory first.\n\n` +
157
- `Suggestion: 'aiw branch --main' has been copied to your clipboard.`, { exit: EXIT_CODES.INVALID_USAGE });
158
- // Copy suggestion to clipboard
159
- try {
160
- await clipboardy.write('aiw branch --main');
161
- this.debug('✓ Copied "aiw branch --main" to clipboard');
162
- }
163
- catch (clipboardError) {
164
- this.debug('Failed to copy to clipboard:', clipboardError);
165
- }
166
- return;
167
- }
168
- this.debug(`✓ Not currently on branch '${branchName}'`);
169
- // Check 5: Find the worktree path for this branch
170
- this.debug(`Finding worktree path for branch '${branchName}'...`);
171
- const worktreePath = getWorktreePath(branchName);
172
- // Delete the worktree folder first if it exists (must be done before deleting the branch)
173
- if (worktreePath) {
174
- this.logInfo(`Deleting worktree folder at ${worktreePath}...`);
175
- await deleteWorktreeFolder(worktreePath, { debugLog: (msg) => this.debug(msg) });
176
- this.debug(`✓ Worktree folder deleted`);
177
- }
178
- else {
179
- this.debug('No worktree folder found for this branch');
180
- }
181
- // Delete the git branch
182
- this.logInfo(`Deleting git branch '${branchName}'...`);
183
- deleteBranch(branchName, { debugLog: (msg) => this.debug(msg) });
184
- this.debug(`✓ Git branch '${branchName}' deleted`);
185
- this.logSuccess(`✓ Branch '${branchName}' and its worktree have been deleted`);
186
- }
187
- catch (error) {
188
- const err = error;
189
- // Check if error is already handled by this.error() calls above
190
- if (err.message?.includes('EEXIT')) {
191
- throw error;
192
- }
193
- // Handle unexpected errors
194
- this.error(`Failed to delete branch: ${err.message}`, {
195
- exit: EXIT_CODES.GENERAL_ERROR,
196
- });
197
- }
198
- }
199
- /**
200
- * Handle --delete --all flags: Clean up all worktrees safely
201
- */
202
- async handleDeleteAll() {
203
- try {
204
- const cwd = process.cwd();
205
- // Check 1: Verify we are in a git repository
206
- this.debug('Checking if current directory is a git repository...');
207
- const isGitRepo = await this.isGitRepository(cwd);
208
- if (!isGitRepo) {
209
- this.error('Not a git repository. This command only works inside a git repository.', {
210
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
211
- });
212
- }
213
- this.debug('✓ Git repository detected');
214
- // Get all worktrees
215
- this.logInfo('Scanning all worktrees in repository...');
216
- const allWorktrees = getAllWorktrees();
217
- this.debug(`Found ${allWorktrees.length} worktrees`);
218
- // Track results
219
- const deleted = [];
220
- const preserved = [];
221
- // Phase 1: Synchronous filtering
222
- const candidatesForAsyncCheck = [];
223
- const normalizedCwd = resolve(cwd);
224
- for (const worktree of allWorktrees) {
225
- const { branch, path } = worktree;
226
- // Skip if no branch (detached HEAD)
227
- if (!branch) {
228
- this.debug(`Skipping worktree at ${path} (detached HEAD)`);
229
- preserved.push({ branch, path, reason: 'detached HEAD' });
230
- continue;
231
- }
232
- // Skip main/master branches
233
- if (branch === 'main' || branch === 'master') {
234
- this.debug(`Skipping protected branch: ${branch}`);
235
- preserved.push({ branch, path, reason: 'protected branch (main/master)' });
236
- continue;
237
- }
238
- // Check if this is the current directory
239
- const normalizedPath = resolve(path);
240
- if (normalizedCwd === normalizedPath) {
241
- this.debug(`Skipping current directory worktree: ${path}`);
242
- preserved.push({ branch, path, reason: 'current directory (cannot delete while inside)' });
243
- continue;
244
- }
245
- // Passed synchronous checks, add to async check candidates
246
- candidatesForAsyncCheck.push({ branch, path });
247
- }
248
- // Phase 2: Parallel async safety checks (read-only operations)
249
- this.debug(`Running safety checks on ${candidatesForAsyncCheck.length} candidates in parallel...`);
250
- const debugLog = (msg) => this.debug(msg);
251
- const safetyCheckResults = await Promise.all(candidatesForAsyncCheck.map(async ({ branch, path }) => {
252
- this.debug(`Checking safety for branch '${branch}'...`);
253
- if (hasUnpushedCommits(branch, { debugLog })) {
254
- this.debug(`Branch '${branch}' has unpushed commits, skipping`);
255
- return { branch, path, safe: false, reason: 'has unpushed commits' };
256
- }
257
- if (hasMergeRequest(branch, { debugLog })) {
258
- this.debug(`Branch '${branch}' has an open PR, skipping`);
259
- return { branch, path, safe: false, reason: 'has open pull request' };
77
+ await executeBranchCommand({
78
+ args: {
79
+ branchName: args.branchName,
80
+ },
81
+ cwd: process.cwd(),
82
+ flags: {
83
+ all: flags.all,
84
+ delete: flags.delete,
85
+ launch: flags.launch,
86
+ main: flags.main,
87
+ },
88
+ }, {
89
+ debug: (...parts) => this.debug(...parts),
90
+ error: (message, options) => {
91
+ if (options?.exit === undefined) {
92
+ return this.error(message);
260
93
  }
261
- this.debug(`Branch '${branch}' is safe to delete`);
262
- return { branch, path, safe: true, reason: null };
263
- }));
264
- // Separate safe and unsafe candidates
265
- const safeToDelete = safetyCheckResults.filter((r) => r.safe);
266
- const unsafe = safetyCheckResults.filter((r) => !r.safe);
267
- // Add unsafe candidates to preserved list
268
- for (const { branch, path, reason } of unsafe) {
269
- preserved.push({ branch, path, reason: reason });
270
- }
271
- // Phase 3: Sequential deletions (destructive operations must be sequential)
272
- for (const { branch, path } of safeToDelete) {
273
- try {
274
- // eslint-disable-next-line no-await-in-loop -- Sequential deletion required: worktree must be deleted before branch
275
- await deleteWorktreeFolder(path, { debugLog });
276
- deleteBranch(branch, { debugLog });
277
- deleted.push({ branch, path });
278
- this.debug(`✓ Deleted branch '${branch}' and worktree at ${path}`);
279
- }
280
- catch (error) {
281
- const err = error;
282
- this.debug(`Failed to delete branch '${branch}': ${err.message}`);
283
- preserved.push({ branch, path, reason: `deletion failed: ${err.message}` });
284
- }
285
- }
286
- // Output results
287
- this.log('');
288
- this.logSuccess('✓ Worktree cleanup complete');
289
- this.log('');
290
- if (deleted.length > 0) {
291
- this.logInfo(`Deleted ${deleted.length} worktree${deleted.length === 1 ? '' : 's'}:`);
292
- for (const { branch, path } of deleted) {
293
- this.log(` - ${branch} (${path})`);
294
- }
295
- this.log('');
296
- }
297
- else {
298
- this.logInfo('No worktrees were deleted.');
299
- this.log('');
300
- }
301
- if (preserved.length > 0) {
302
- this.logInfo(`Preserved ${preserved.length} worktree${preserved.length === 1 ? '' : 's'}:`);
303
- for (const { branch, path, reason } of preserved) {
304
- this.log(` - ${branch ?? 'detached'} (${path})`);
305
- this.log(` Reason: ${reason}`);
306
- }
307
- }
308
- }
309
- catch (error) {
310
- const err = error;
311
- // Check if error is already handled by this.error() calls above
312
- if (err.message?.includes('EEXIT')) {
313
- throw error;
314
- }
315
- // Handle unexpected errors
316
- this.error(`Failed to clean up worktrees: ${err.message}`, {
317
- exit: EXIT_CODES.GENERAL_ERROR,
318
- });
319
- }
320
- }
321
- /**
322
- * Handle --main flag: Launch aiw in main/master branch
323
- */
324
- async handleMainBranch() {
325
- try {
326
- const cwd = process.cwd();
327
- // Check 1: Verify we are in a git repository
328
- this.debug('Checking if current directory is a git repository...');
329
- const isGitRepo = await this.isGitRepository(cwd);
330
- if (!isGitRepo) {
331
- this.error('Not a git repository. This command only works inside a git repository.', {
332
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
333
- });
334
- }
335
- this.debug('✓ Git repository detected');
336
- // Check 2: Get current branch
337
- this.debug('Getting current branch name...');
338
- let currentBranch;
339
- try {
340
- currentBranch = getCurrentBranch();
341
- }
342
- catch (error_) {
343
- const error = error_;
344
- this.error(`Failed to get current branch: ${error.message}`, {
345
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
346
- });
347
- }
348
- this.debug(`Current branch: ${currentBranch}`);
349
- // Check 3: Verify we are NOT on main/master
350
- if (currentBranch === 'main' || currentBranch === 'master') {
351
- this.error(`Already on ${currentBranch} branch. This command is for switching to main/master from another branch.`, {
352
- exit: EXIT_CODES.INVALID_USAGE,
353
- });
354
- }
355
- this.debug('✓ Currently on a feature branch');
356
- // Check 4: Determine which main branch exists (main or master)
357
- this.debug('Checking which main branch exists...');
358
- const mainBranch = getMainBranch();
359
- if (!mainBranch) {
360
- this.error('Neither "main" nor "master" branch exists in this repository.', {
361
- exit: EXIT_CODES.INVALID_USAGE,
362
- });
363
- }
364
- this.debug(`✓ Found main branch: ${mainBranch}`);
365
- // Get the worktree path for the main branch
366
- this.debug(`Finding worktree path for ${mainBranch} branch...`);
367
- const mainBranchPath = getWorktreePath(mainBranch);
368
- if (!mainBranchPath) {
369
- this.error(`Could not find worktree for ${mainBranch} branch.`, {
370
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
371
- });
372
- }
373
- this.debug(`✓ Found ${mainBranch} worktree at: ${mainBranchPath}`);
374
- // Launch new terminal with aiw launch in main/master branch
375
- this.logInfo(`Opening new terminal with aiw launch in ${mainBranch} branch...`);
376
- const result = await launchTerminal({
377
- cwd: mainBranchPath,
378
- command: 'aiw launch',
379
- debugLog: (msg) => this.debug(msg),
380
- });
381
- if (!result.success) {
382
- this.error(`Failed to launch terminal: ${result.error}`, { exit: EXIT_CODES.GENERAL_ERROR });
383
- }
384
- this.logSuccess(`✓ New terminal launched with aiw in ${mainBranch} branch`);
385
- }
386
- catch (error) {
387
- const err = error;
388
- // Check if error is already handled by this.error() calls above
389
- if (err.message?.includes('EEXIT')) {
390
- throw error;
391
- }
392
- // Handle unexpected errors
393
- this.error(`Failed to launch terminal: ${err.message}`, {
394
- exit: EXIT_CODES.GENERAL_ERROR,
395
- });
396
- }
397
- }
398
- /**
399
- * Handle --launch flag: Create or open worktree in sibling folder
400
- */
401
- async handleWorktreeLaunch(branchName) {
402
- // Validate branch name
403
- if (!branchName || branchName.trim().length === 0) {
404
- this.error('Branch name is required. Usage: aiw branch <name> or aiw branch --launch <name>', { exit: EXIT_CODES.INVALID_USAGE });
405
- }
406
- // Validate branch name format (no spaces, special chars that could cause issues)
407
- const validBranchNamePattern = /^[a-zA-Z0-9._/-]+$/;
408
- if (!validBranchNamePattern.test(branchName)) {
409
- this.error('Branch name contains invalid characters. Use only letters, numbers, dots, dashes, underscores, and slashes.', { exit: EXIT_CODES.INVALID_USAGE });
410
- }
411
- try {
412
- const cwd = process.cwd();
413
- // Check if we're in a git repository
414
- const isGitRepo = await this.isGitRepository(cwd);
415
- if (!isGitRepo) {
416
- this.error('Not a git repository. This command only works inside a git repository.', {
417
- exit: EXIT_CODES.ENVIRONMENT_ERROR,
418
- });
419
- }
420
- // Get current directory and derive sibling folder name
421
- const currentDirName = basename(cwd);
422
- const parentDir = dirname(cwd);
423
- const worktreeFolderName = `${currentDirName}-${branchName}`;
424
- const worktreePath = resolve(parentDir, worktreeFolderName);
425
- this.debug(`Checking for existing worktree at: ${worktreePath}`);
426
- // Check if worktree folder already exists
427
- let worktreeExists = false;
428
- try {
429
- await fs.access(worktreePath);
430
- worktreeExists = true;
431
- this.logInfo(`Worktree already exists at: ${worktreePath}`);
432
- this.logInfo(`Opening terminal in existing worktree...`);
433
- }
434
- catch {
435
- // Folder doesn't exist, we'll create it
436
- this.logInfo(`Creating worktree for branch: ${branchName}`);
437
- this.logInfo(`Worktree location: ${worktreePath}`);
438
- }
439
- if (!worktreeExists) {
440
- // Create git worktree
441
- await createWorktree(branchName, worktreePath);
442
- this.logSuccess(`✓ Created worktree at ${worktreePath}`);
443
- this.logSuccess(`✓ Created and checked out branch: ${branchName}`);
444
- }
445
- // Launch terminal in worktree path
446
- const result = await launchTerminal({
447
- cwd: worktreePath,
448
- command: 'aiw launch',
449
- debugLog: (msg) => this.debug(msg),
450
- });
451
- if (!result.success) {
452
- this.error(`Failed to launch terminal: ${result.error}`, { exit: EXIT_CODES.GENERAL_ERROR });
453
- }
454
- this.logSuccess('✓ Launched terminal with aiw launch');
455
- this.log('');
456
- this.logInfo('New terminal window opened at worktree location.');
457
- this.logInfo('Claude Code should be launching automatically.');
458
- }
459
- catch (error) {
460
- const err = error;
461
- // Check if error is already handled by this.error() calls above
462
- if (err.message?.includes('EEXIT')) {
463
- throw error;
464
- }
465
- // Handle git-specific errors
466
- if (err.message?.includes('already exists')) {
467
- this.error(`Branch '${branchName}' already exists. Choose a different name.`, {
468
- exit: EXIT_CODES.INVALID_USAGE,
469
- });
470
- }
471
- if (err.stderr?.includes('fatal: not a git repository')) {
472
- this.error('Not a git repository. Please run this command from a git repository root.', {
473
- exit: EXIT_CODES.INVALID_USAGE,
474
- });
475
- }
476
- // Generic error fallback
477
- this.error(`Failed to create/open worktree: ${err.message}`, { exit: EXIT_CODES.GENERAL_ERROR });
478
- }
479
- }
480
- /**
481
- * Check if current directory is a git repository
482
- */
483
- async isGitRepository(cwd) {
484
- try {
485
- const gitPath = join(cwd, '.git');
486
- await fs.access(gitPath);
487
- return true;
488
- }
489
- catch {
490
- return false;
491
- }
94
+ return this.error(message, { exit: options.exit });
95
+ },
96
+ log: (message) => this.log(message),
97
+ logInfo: (message) => this.logInfo(message),
98
+ logSuccess: (message) => this.logSuccess(message),
99
+ }, createBranchCommandDependencies());
492
100
  }
493
101
  }
@@ -1,41 +1 @@
1
- import BaseCommand from '../lib/base-command.js';
2
- /**
3
- * Clean output folder(s) for methods.
4
- * Removes all files and subdirectories from the method's output folder.
5
- */
6
- export default class CleanCommand extends BaseCommand {
7
- static description: string;
8
- static examples: string[];
9
- static flags: {
10
- all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
- 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
- force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
- method: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
- debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
- help: import("@oclif/core/interfaces").BooleanFlag<void>;
16
- quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
- };
18
- run(): Promise<void>;
19
- /**
20
- * Display contents of folders that will be deleted.
21
- *
22
- * @param allContents - Folders with their contents
23
- * @param targetDir - Base directory for relative path display
24
- */
25
- private displayContents;
26
- /**
27
- * Find all output folders in the target directory.
28
- * Matches folders with pattern _*-output (e.g., _bmad-output, _gsd-output).
29
- *
30
- * @param targetDir - Directory to search in
31
- * @returns Array of output folder names
32
- */
33
- private findAllOutputFolders;
34
- /**
35
- * Get all top-level contents of a directory.
36
- *
37
- * @param dirPath - Directory to list contents of
38
- * @returns Array of content items with path and type info
39
- */
40
- private getContents;
41
- }
1
+ export { default } from '../capabilities/installation/control-plane/clean-command.js';