@mindfoldhq/trellis 0.4.0 → 0.5.0-beta.10

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 (427) hide show
  1. package/dist/cli/index.js +0 -1
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/commands/init.d.ts +10 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +382 -120
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/update.d.ts +5 -0
  8. package/dist/commands/update.d.ts.map +1 -1
  9. package/dist/commands/update.js +178 -61
  10. package/dist/commands/update.js.map +1 -1
  11. package/dist/configurators/antigravity.d.ts +3 -4
  12. package/dist/configurators/antigravity.d.ts.map +1 -1
  13. package/dist/configurators/antigravity.js +17 -10
  14. package/dist/configurators/antigravity.js.map +1 -1
  15. package/dist/configurators/claude.d.ts +5 -28
  16. package/dist/configurators/claude.d.ts.map +1 -1
  17. package/dist/configurators/claude.js +30 -51
  18. package/dist/configurators/claude.js.map +1 -1
  19. package/dist/configurators/codebuddy.d.ts +6 -7
  20. package/dist/configurators/codebuddy.d.ts.map +1 -1
  21. package/dist/configurators/codebuddy.js +23 -51
  22. package/dist/configurators/codebuddy.js.map +1 -1
  23. package/dist/configurators/codex.d.ts +3 -6
  24. package/dist/configurators/codex.d.ts.map +1 -1
  25. package/dist/configurators/codex.js +29 -12
  26. package/dist/configurators/codex.js.map +1 -1
  27. package/dist/configurators/copilot.d.ts +6 -5
  28. package/dist/configurators/copilot.d.ts.map +1 -1
  29. package/dist/configurators/copilot.js +42 -13
  30. package/dist/configurators/copilot.js.map +1 -1
  31. package/dist/configurators/cursor.d.ts +6 -1
  32. package/dist/configurators/cursor.d.ts.map +1 -1
  33. package/dist/configurators/cursor.js +22 -45
  34. package/dist/configurators/cursor.js.map +1 -1
  35. package/dist/configurators/droid.d.ts +6 -1
  36. package/dist/configurators/droid.d.ts.map +1 -1
  37. package/dist/configurators/droid.js +23 -41
  38. package/dist/configurators/droid.js.map +1 -1
  39. package/dist/configurators/gemini.d.ts +8 -4
  40. package/dist/configurators/gemini.d.ts.map +1 -1
  41. package/dist/configurators/gemini.js +28 -47
  42. package/dist/configurators/gemini.js.map +1 -1
  43. package/dist/configurators/index.d.ts +1 -1
  44. package/dist/configurators/index.d.ts.map +1 -1
  45. package/dist/configurators/index.js +146 -100
  46. package/dist/configurators/index.js.map +1 -1
  47. package/dist/configurators/kilo.d.ts +3 -4
  48. package/dist/configurators/kilo.d.ts.map +1 -1
  49. package/dist/configurators/kilo.js +19 -46
  50. package/dist/configurators/kilo.js.map +1 -1
  51. package/dist/configurators/kiro.d.ts +4 -4
  52. package/dist/configurators/kiro.d.ts.map +1 -1
  53. package/dist/configurators/kiro.js +18 -14
  54. package/dist/configurators/kiro.js.map +1 -1
  55. package/dist/configurators/opencode.d.ts +7 -25
  56. package/dist/configurators/opencode.d.ts.map +1 -1
  57. package/dist/configurators/opencode.js +57 -56
  58. package/dist/configurators/opencode.js.map +1 -1
  59. package/dist/configurators/qoder.d.ts +6 -3
  60. package/dist/configurators/qoder.d.ts.map +1 -1
  61. package/dist/configurators/qoder.js +27 -46
  62. package/dist/configurators/qoder.js.map +1 -1
  63. package/dist/configurators/shared.d.ts +68 -3
  64. package/dist/configurators/shared.d.ts.map +1 -1
  65. package/dist/configurators/shared.js +274 -3
  66. package/dist/configurators/shared.js.map +1 -1
  67. package/dist/configurators/windsurf.d.ts +3 -4
  68. package/dist/configurators/windsurf.d.ts.map +1 -1
  69. package/dist/configurators/windsurf.js +17 -10
  70. package/dist/configurators/windsurf.js.map +1 -1
  71. package/dist/configurators/workflow.d.ts +0 -3
  72. package/dist/configurators/workflow.d.ts.map +1 -1
  73. package/dist/configurators/workflow.js +1 -7
  74. package/dist/configurators/workflow.js.map +1 -1
  75. package/dist/migrations/manifests/0.4.0.json +1 -1
  76. package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
  77. package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
  78. package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
  79. package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
  80. package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
  81. package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
  82. package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
  83. package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
  84. package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
  85. package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
  86. package/dist/templates/claude/agents/{check.md → trellis-check.md} +3 -31
  87. package/dist/templates/claude/agents/{implement.md → trellis-implement.md} +1 -2
  88. package/dist/templates/claude/agents/trellis-research.md +137 -0
  89. package/dist/templates/claude/index.d.ts +5 -37
  90. package/dist/templates/claude/index.d.ts.map +1 -1
  91. package/dist/templates/claude/index.js +3 -42
  92. package/dist/templates/claude/index.js.map +1 -1
  93. package/dist/templates/claude/settings.json +6 -4
  94. package/dist/templates/{iflow/agents/check.md → codebuddy/agents/trellis-check.md} +3 -31
  95. package/dist/templates/{iflow/agents/implement.md → codebuddy/agents/trellis-implement.md} +1 -2
  96. package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
  97. package/dist/templates/codebuddy/index.d.ts +6 -16
  98. package/dist/templates/codebuddy/index.d.ts.map +1 -1
  99. package/dist/templates/codebuddy/index.js +6 -36
  100. package/dist/templates/codebuddy/index.js.map +1 -1
  101. package/dist/templates/codebuddy/settings.json +59 -0
  102. package/dist/templates/codex/agents/trellis-check.toml +38 -0
  103. package/dist/templates/codex/agents/{implement.toml → trellis-implement.toml} +1 -1
  104. package/dist/templates/codex/agents/trellis-research.toml +60 -0
  105. package/dist/templates/codex/config.toml +10 -0
  106. package/dist/templates/codex/hooks/session-start.py +65 -29
  107. package/dist/templates/codex/hooks.json +11 -0
  108. package/dist/templates/codex/index.d.ts +0 -1
  109. package/dist/templates/codex/index.d.ts.map +1 -1
  110. package/dist/templates/codex/index.js +1 -8
  111. package/dist/templates/codex/index.js.map +1 -1
  112. package/dist/templates/codex/skills/start/SKILL.md +1 -1
  113. package/dist/templates/common/commands/continue.md +51 -0
  114. package/dist/templates/common/commands/finish-work.md +32 -0
  115. package/dist/templates/common/commands/start.md +56 -0
  116. package/dist/templates/common/index.d.ts +28 -0
  117. package/dist/templates/common/index.d.ts.map +1 -0
  118. package/dist/templates/common/index.js +55 -0
  119. package/dist/templates/common/index.js.map +1 -0
  120. package/dist/templates/{droid/commands/trellis → common/skills}/brainstorm.md +51 -12
  121. package/dist/templates/{iflow/commands/trellis → common/skills}/break-loop.md +4 -4
  122. package/dist/templates/common/skills/check.md +87 -0
  123. package/dist/templates/{codebuddy/commands/trellis → common/skills}/update-spec.md +18 -21
  124. package/dist/templates/copilot/hooks/session-start.py +65 -29
  125. package/dist/templates/copilot/hooks.json +8 -0
  126. package/dist/templates/copilot/prompts/start.prompt.md +13 -16
  127. package/dist/templates/cursor/agents/trellis-check.md +94 -0
  128. package/dist/templates/cursor/agents/trellis-implement.md +94 -0
  129. package/dist/templates/cursor/agents/trellis-research.md +137 -0
  130. package/dist/templates/cursor/hooks.json +24 -0
  131. package/dist/templates/cursor/index.d.ts +6 -17
  132. package/dist/templates/cursor/index.d.ts.map +1 -1
  133. package/dist/templates/cursor/index.js +6 -37
  134. package/dist/templates/cursor/index.js.map +1 -1
  135. package/dist/templates/droid/droids/trellis-check.md +94 -0
  136. package/dist/templates/droid/droids/trellis-implement.md +94 -0
  137. package/dist/templates/droid/droids/trellis-research.md +137 -0
  138. package/dist/templates/droid/index.d.ts +7 -19
  139. package/dist/templates/droid/index.d.ts.map +1 -1
  140. package/dist/templates/droid/index.js +7 -39
  141. package/dist/templates/droid/index.js.map +1 -1
  142. package/dist/templates/droid/settings.json +59 -0
  143. package/dist/templates/extract.d.ts +7 -193
  144. package/dist/templates/extract.d.ts.map +1 -1
  145. package/dist/templates/extract.js +7 -310
  146. package/dist/templates/extract.js.map +1 -1
  147. package/dist/templates/gemini/agents/trellis-check.md +94 -0
  148. package/dist/templates/gemini/agents/trellis-implement.md +94 -0
  149. package/dist/templates/gemini/agents/trellis-research.md +137 -0
  150. package/dist/templates/gemini/index.d.ts +6 -14
  151. package/dist/templates/gemini/index.d.ts.map +1 -1
  152. package/dist/templates/gemini/index.js +6 -37
  153. package/dist/templates/gemini/index.js.map +1 -1
  154. package/dist/templates/gemini/settings.json +28 -0
  155. package/dist/templates/kiro/agents/trellis-check.json +13 -0
  156. package/dist/templates/kiro/agents/trellis-implement.json +13 -0
  157. package/dist/templates/kiro/agents/trellis-research.json +21 -0
  158. package/dist/templates/kiro/index.d.ts +11 -11
  159. package/dist/templates/kiro/index.d.ts.map +1 -1
  160. package/dist/templates/kiro/index.js +11 -33
  161. package/dist/templates/kiro/index.js.map +1 -1
  162. package/dist/templates/opencode/agents/{check.md → trellis-check.md} +3 -30
  163. package/dist/templates/opencode/agents/{implement.md → trellis-implement.md} +1 -1
  164. package/dist/templates/opencode/agents/{research.md → trellis-research.md} +1 -2
  165. package/dist/templates/opencode/plugins/inject-subagent-context.js +18 -190
  166. package/dist/templates/opencode/plugins/inject-workflow-state.js +172 -0
  167. package/dist/templates/opencode/plugins/session-start.js +76 -39
  168. package/dist/templates/qoder/agents/trellis-check.md +94 -0
  169. package/dist/templates/qoder/agents/trellis-implement.md +94 -0
  170. package/dist/templates/qoder/agents/trellis-research.md +137 -0
  171. package/dist/templates/qoder/index.d.ts +7 -10
  172. package/dist/templates/qoder/index.d.ts.map +1 -1
  173. package/dist/templates/qoder/index.js +7 -32
  174. package/dist/templates/qoder/index.js.map +1 -1
  175. package/dist/templates/qoder/settings.json +47 -0
  176. package/dist/templates/shared-hooks/index.d.ts +19 -0
  177. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  178. package/dist/templates/shared-hooks/index.js +30 -0
  179. package/dist/templates/shared-hooks/index.js.map +1 -0
  180. package/dist/templates/{iflow/hooks → shared-hooks}/inject-subagent-context.py +77 -266
  181. package/dist/templates/shared-hooks/inject-workflow-state.py +244 -0
  182. package/dist/templates/{claude/hooks → shared-hooks}/session-start.py +172 -55
  183. package/dist/templates/template-utils.d.ts +26 -0
  184. package/dist/templates/template-utils.d.ts.map +1 -0
  185. package/dist/templates/template-utils.js +60 -0
  186. package/dist/templates/template-utils.js.map +1 -0
  187. package/dist/templates/trellis/config.yaml +6 -0
  188. package/dist/templates/trellis/index.d.ts +1 -15
  189. package/dist/templates/trellis/index.d.ts.map +1 -1
  190. package/dist/templates/trellis/index.js +2 -29
  191. package/dist/templates/trellis/index.js.map +1 -1
  192. package/dist/templates/trellis/scripts/common/cli_adapter.py +31 -8
  193. package/dist/templates/trellis/scripts/common/config.py +126 -1
  194. package/dist/templates/trellis/scripts/common/git_context.py +25 -2
  195. package/dist/templates/trellis/scripts/common/task_context.py +23 -28
  196. package/dist/templates/trellis/scripts/common/task_store.py +0 -12
  197. package/dist/templates/trellis/scripts/common/types.py +0 -2
  198. package/dist/templates/trellis/scripts/common/workflow_phase.py +176 -0
  199. package/dist/templates/trellis/scripts/task.py +13 -35
  200. package/dist/templates/trellis/workflow.md +283 -298
  201. package/dist/types/ai-tools.d.ts +30 -3
  202. package/dist/types/ai-tools.d.ts.map +1 -1
  203. package/dist/types/ai-tools.js +119 -15
  204. package/dist/types/ai-tools.js.map +1 -1
  205. package/dist/types/migration.d.ts +8 -1
  206. package/dist/types/migration.d.ts.map +1 -1
  207. package/dist/utils/project-detector.d.ts +2 -0
  208. package/dist/utils/project-detector.d.ts.map +1 -1
  209. package/dist/utils/project-detector.js +120 -11
  210. package/dist/utils/project-detector.js.map +1 -1
  211. package/dist/utils/task-json.d.ts +46 -0
  212. package/dist/utils/task-json.d.ts.map +1 -0
  213. package/dist/utils/task-json.js +49 -0
  214. package/dist/utils/task-json.js.map +1 -0
  215. package/package.json +3 -2
  216. package/dist/configurators/iflow.d.ts +0 -33
  217. package/dist/configurators/iflow.d.ts.map +0 -1
  218. package/dist/configurators/iflow.js +0 -99
  219. package/dist/configurators/iflow.js.map +0 -1
  220. package/dist/templates/antigravity/index.d.ts +0 -12
  221. package/dist/templates/antigravity/index.d.ts.map +0 -1
  222. package/dist/templates/antigravity/index.js +0 -29
  223. package/dist/templates/antigravity/index.js.map +0 -1
  224. package/dist/templates/claude/agents/debug.md +0 -106
  225. package/dist/templates/claude/agents/dispatch.md +0 -213
  226. package/dist/templates/claude/agents/plan.md +0 -396
  227. package/dist/templates/claude/agents/research.md +0 -120
  228. package/dist/templates/claude/commands/trellis/brainstorm.md +0 -487
  229. package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
  230. package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
  231. package/dist/templates/claude/commands/trellis/check.md +0 -25
  232. package/dist/templates/claude/commands/trellis/create-command.md +0 -154
  233. package/dist/templates/claude/commands/trellis/finish-work.md +0 -153
  234. package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
  235. package/dist/templates/claude/commands/trellis/onboard.md +0 -358
  236. package/dist/templates/claude/commands/trellis/parallel.md +0 -192
  237. package/dist/templates/claude/commands/trellis/record-session.md +0 -62
  238. package/dist/templates/claude/commands/trellis/start.md +0 -393
  239. package/dist/templates/claude/commands/trellis/update-spec.md +0 -354
  240. package/dist/templates/claude/hooks/inject-subagent-context.py +0 -803
  241. package/dist/templates/claude/hooks/ralph-loop.py +0 -396
  242. package/dist/templates/codebuddy/commands/trellis/before-dev.md +0 -29
  243. package/dist/templates/codebuddy/commands/trellis/brainstorm.md +0 -487
  244. package/dist/templates/codebuddy/commands/trellis/break-loop.md +0 -107
  245. package/dist/templates/codebuddy/commands/trellis/check-cross-layer.md +0 -153
  246. package/dist/templates/codebuddy/commands/trellis/check.md +0 -25
  247. package/dist/templates/codebuddy/commands/trellis/create-command.md +0 -154
  248. package/dist/templates/codebuddy/commands/trellis/finish-work.md +0 -143
  249. package/dist/templates/codebuddy/commands/trellis/integrate-skill.md +0 -219
  250. package/dist/templates/codebuddy/commands/trellis/onboard.md +0 -358
  251. package/dist/templates/codebuddy/commands/trellis/record-session.md +0 -61
  252. package/dist/templates/codebuddy/commands/trellis/start.md +0 -373
  253. package/dist/templates/codex/agents/check.toml +0 -23
  254. package/dist/templates/codex/agents/research.toml +0 -26
  255. package/dist/templates/codex/codex-skills/parallel/SKILL.md +0 -194
  256. package/dist/templates/cursor/commands/trellis-before-dev.md +0 -29
  257. package/dist/templates/cursor/commands/trellis-brainstorm.md +0 -487
  258. package/dist/templates/cursor/commands/trellis-break-loop.md +0 -107
  259. package/dist/templates/cursor/commands/trellis-check-cross-layer.md +0 -153
  260. package/dist/templates/cursor/commands/trellis-check.md +0 -25
  261. package/dist/templates/cursor/commands/trellis-create-command.md +0 -154
  262. package/dist/templates/cursor/commands/trellis-finish-work.md +0 -143
  263. package/dist/templates/cursor/commands/trellis-integrate-skill.md +0 -219
  264. package/dist/templates/cursor/commands/trellis-onboard.md +0 -358
  265. package/dist/templates/cursor/commands/trellis-record-session.md +0 -62
  266. package/dist/templates/cursor/commands/trellis-start.md +0 -373
  267. package/dist/templates/cursor/commands/trellis-update-spec.md +0 -354
  268. package/dist/templates/droid/commands/trellis/before-dev.md +0 -33
  269. package/dist/templates/droid/commands/trellis/break-loop.md +0 -111
  270. package/dist/templates/droid/commands/trellis/check-cross-layer.md +0 -157
  271. package/dist/templates/droid/commands/trellis/check.md +0 -29
  272. package/dist/templates/droid/commands/trellis/create-command.md +0 -158
  273. package/dist/templates/droid/commands/trellis/finish-work.md +0 -147
  274. package/dist/templates/droid/commands/trellis/integrate-skill.md +0 -223
  275. package/dist/templates/droid/commands/trellis/onboard.md +0 -362
  276. package/dist/templates/droid/commands/trellis/record-session.md +0 -66
  277. package/dist/templates/droid/commands/trellis/start.md +0 -377
  278. package/dist/templates/droid/commands/trellis/update-spec.md +0 -358
  279. package/dist/templates/gemini/commands/trellis/before-dev.toml +0 -33
  280. package/dist/templates/gemini/commands/trellis/brainstorm.toml +0 -435
  281. package/dist/templates/gemini/commands/trellis/break-loop.toml +0 -129
  282. package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +0 -147
  283. package/dist/templates/gemini/commands/trellis/check.toml +0 -29
  284. package/dist/templates/gemini/commands/trellis/create-command.toml +0 -119
  285. package/dist/templates/gemini/commands/trellis/finish-work.toml +0 -133
  286. package/dist/templates/gemini/commands/trellis/integrate-skill.toml +0 -104
  287. package/dist/templates/gemini/commands/trellis/onboard.toml +0 -111
  288. package/dist/templates/gemini/commands/trellis/record-session.toml +0 -66
  289. package/dist/templates/gemini/commands/trellis/start.toml +0 -354
  290. package/dist/templates/gemini/commands/trellis/update-spec.toml +0 -132
  291. package/dist/templates/iflow/agents/debug.md +0 -106
  292. package/dist/templates/iflow/agents/dispatch.md +0 -213
  293. package/dist/templates/iflow/agents/plan.md +0 -396
  294. package/dist/templates/iflow/agents/research.md +0 -120
  295. package/dist/templates/iflow/commands/trellis/before-dev.md +0 -29
  296. package/dist/templates/iflow/commands/trellis/brainstorm.md +0 -487
  297. package/dist/templates/iflow/commands/trellis/check-cross-layer.md +0 -153
  298. package/dist/templates/iflow/commands/trellis/check.md +0 -25
  299. package/dist/templates/iflow/commands/trellis/create-command.md +0 -152
  300. package/dist/templates/iflow/commands/trellis/finish-work.md +0 -153
  301. package/dist/templates/iflow/commands/trellis/integrate-skill.md +0 -219
  302. package/dist/templates/iflow/commands/trellis/onboard.md +0 -358
  303. package/dist/templates/iflow/commands/trellis/parallel.md +0 -192
  304. package/dist/templates/iflow/commands/trellis/record-session.md +0 -62
  305. package/dist/templates/iflow/commands/trellis/start.md +0 -393
  306. package/dist/templates/iflow/commands/trellis/update-spec.md +0 -354
  307. package/dist/templates/iflow/hooks/ralph-loop.py +0 -395
  308. package/dist/templates/iflow/hooks/session-start.py +0 -403
  309. package/dist/templates/iflow/index.d.ts +0 -54
  310. package/dist/templates/iflow/index.d.ts.map +0 -1
  311. package/dist/templates/iflow/index.js +0 -85
  312. package/dist/templates/iflow/index.js.map +0 -1
  313. package/dist/templates/iflow/settings.json +0 -60
  314. package/dist/templates/kilo/index.d.ts +0 -16
  315. package/dist/templates/kilo/index.d.ts.map +0 -1
  316. package/dist/templates/kilo/index.js +0 -39
  317. package/dist/templates/kilo/index.js.map +0 -1
  318. package/dist/templates/kilo/workflows/before-dev.md +0 -29
  319. package/dist/templates/kilo/workflows/brainstorm.md +0 -487
  320. package/dist/templates/kilo/workflows/break-loop.md +0 -125
  321. package/dist/templates/kilo/workflows/check-cross-layer.md +0 -153
  322. package/dist/templates/kilo/workflows/check.md +0 -25
  323. package/dist/templates/kilo/workflows/create-command.md +0 -152
  324. package/dist/templates/kilo/workflows/finish-work.md +0 -129
  325. package/dist/templates/kilo/workflows/integrate-skill.md +0 -219
  326. package/dist/templates/kilo/workflows/onboard.md +0 -358
  327. package/dist/templates/kilo/workflows/parallel.md +0 -193
  328. package/dist/templates/kilo/workflows/record-session.md +0 -62
  329. package/dist/templates/kilo/workflows/start.md +0 -387
  330. package/dist/templates/kilo/workflows/update-spec.md +0 -285
  331. package/dist/templates/kiro/skills/before-dev/SKILL.md +0 -34
  332. package/dist/templates/kiro/skills/brainstorm/SKILL.md +0 -492
  333. package/dist/templates/kiro/skills/break-loop/SKILL.md +0 -130
  334. package/dist/templates/kiro/skills/check/SKILL.md +0 -30
  335. package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +0 -158
  336. package/dist/templates/kiro/skills/create-command/SKILL.md +0 -101
  337. package/dist/templates/kiro/skills/finish-work/SKILL.md +0 -148
  338. package/dist/templates/kiro/skills/integrate-skill/SKILL.md +0 -221
  339. package/dist/templates/kiro/skills/onboard/SKILL.md +0 -363
  340. package/dist/templates/kiro/skills/record-session/SKILL.md +0 -67
  341. package/dist/templates/kiro/skills/start/SKILL.md +0 -351
  342. package/dist/templates/kiro/skills/update-spec/SKILL.md +0 -335
  343. package/dist/templates/markdown/spec/backend/directory-structure.md +0 -292
  344. package/dist/templates/markdown/spec/backend/index.md +0 -40
  345. package/dist/templates/markdown/spec/backend/script-conventions.md +0 -742
  346. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +0 -118
  347. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +0 -394
  348. package/dist/templates/opencode/agents/debug.md +0 -129
  349. package/dist/templates/opencode/agents/dispatch.md +0 -223
  350. package/dist/templates/opencode/agents/trellis-plan.md +0 -427
  351. package/dist/templates/opencode/commands/trellis/before-dev.md +0 -29
  352. package/dist/templates/opencode/commands/trellis/brainstorm.md +0 -487
  353. package/dist/templates/opencode/commands/trellis/break-loop.md +0 -125
  354. package/dist/templates/opencode/commands/trellis/check-cross-layer.md +0 -153
  355. package/dist/templates/opencode/commands/trellis/check.md +0 -25
  356. package/dist/templates/opencode/commands/trellis/create-command.md +0 -154
  357. package/dist/templates/opencode/commands/trellis/finish-work.md +0 -144
  358. package/dist/templates/opencode/commands/trellis/integrate-skill.md +0 -219
  359. package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
  360. package/dist/templates/opencode/commands/trellis/onboard.md +0 -358
  361. package/dist/templates/opencode/commands/trellis/parallel.md +0 -193
  362. package/dist/templates/opencode/commands/trellis/record-session.md +0 -62
  363. package/dist/templates/opencode/commands/trellis/start.md +0 -351
  364. package/dist/templates/opencode/commands/trellis/update-spec.md +0 -354
  365. package/dist/templates/qoder/skills/before-dev/SKILL.md +0 -34
  366. package/dist/templates/qoder/skills/brainstorm/SKILL.md +0 -492
  367. package/dist/templates/qoder/skills/break-loop/SKILL.md +0 -130
  368. package/dist/templates/qoder/skills/check/SKILL.md +0 -30
  369. package/dist/templates/qoder/skills/check-cross-layer/SKILL.md +0 -158
  370. package/dist/templates/qoder/skills/create-command/SKILL.md +0 -101
  371. package/dist/templates/qoder/skills/finish-work/SKILL.md +0 -134
  372. package/dist/templates/qoder/skills/integrate-skill/SKILL.md +0 -221
  373. package/dist/templates/qoder/skills/onboard/SKILL.md +0 -363
  374. package/dist/templates/qoder/skills/record-session/SKILL.md +0 -67
  375. package/dist/templates/qoder/skills/start/SKILL.md +0 -388
  376. package/dist/templates/qoder/skills/update-spec/SKILL.md +0 -290
  377. package/dist/templates/trellis/scripts/common/phase.py +0 -254
  378. package/dist/templates/trellis/scripts/common/registry.py +0 -335
  379. package/dist/templates/trellis/scripts/common/worktree.py +0 -305
  380. package/dist/templates/trellis/scripts/create_bootstrap.py +0 -298
  381. package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
  382. package/dist/templates/trellis/scripts/multi_agent/_bootstrap.py +0 -17
  383. package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -398
  384. package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -620
  385. package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -213
  386. package/dist/templates/trellis/scripts/multi_agent/start.py +0 -539
  387. package/dist/templates/trellis/scripts/multi_agent/status.py +0 -76
  388. package/dist/templates/trellis/scripts/multi_agent/status_display.py +0 -542
  389. package/dist/templates/trellis/scripts/multi_agent/status_monitor.py +0 -225
  390. package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
  391. package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
  392. package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
  393. package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
  394. package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
  395. package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
  396. package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
  397. package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
  398. package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
  399. package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
  400. package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
  401. package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
  402. package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
  403. package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
  404. package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
  405. package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
  406. package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
  407. package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
  408. package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
  409. package/dist/templates/trellis/worktree.yaml +0 -47
  410. package/dist/templates/windsurf/index.d.ts +0 -21
  411. package/dist/templates/windsurf/index.d.ts.map +0 -1
  412. package/dist/templates/windsurf/index.js +0 -44
  413. package/dist/templates/windsurf/index.js.map +0 -1
  414. package/dist/templates/windsurf/workflows/trellis-before-dev.md +0 -31
  415. package/dist/templates/windsurf/workflows/trellis-brainstorm.md +0 -491
  416. package/dist/templates/windsurf/workflows/trellis-break-loop.md +0 -111
  417. package/dist/templates/windsurf/workflows/trellis-check-cross-layer.md +0 -157
  418. package/dist/templates/windsurf/workflows/trellis-check.md +0 -27
  419. package/dist/templates/windsurf/workflows/trellis-create-command.md +0 -154
  420. package/dist/templates/windsurf/workflows/trellis-finish-work.md +0 -147
  421. package/dist/templates/windsurf/workflows/trellis-integrate-skill.md +0 -220
  422. package/dist/templates/windsurf/workflows/trellis-onboard.md +0 -362
  423. package/dist/templates/windsurf/workflows/trellis-record-session.md +0 -66
  424. package/dist/templates/windsurf/workflows/trellis-start.md +0 -373
  425. package/dist/templates/windsurf/workflows/trellis-update-spec.md +0 -358
  426. /package/dist/templates/{claude/commands/trellis → common/skills}/before-dev.md +0 -0
  427. /package/dist/templates/{claude/hooks → shared-hooks}/statusline.py +0 -0
@@ -1,620 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Multi-Agent Pipeline: Create PR.
4
-
5
- Usage:
6
- python3 create_pr.py [task-dir] [--dry-run]
7
-
8
- This script:
9
- 1. Handles submodule changes (commit, push, PR) if any submodules are configured
10
- 2. Stages and commits all main-repo changes (excluding workspace/)
11
- 3. Pushes to origin
12
- 4. Creates a Draft PR using `gh pr create`
13
- 5. Updates task.json with status="completed", pr_url, submodule_prs, and current_phase
14
-
15
- Note: This is the only action that performs git commit, as it's the final
16
- step after all implementation and checks are complete.
17
- """
18
-
19
- from __future__ import annotations
20
-
21
- import argparse
22
- import subprocess
23
- import sys
24
- from pathlib import Path
25
-
26
- import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path
27
-
28
- from common.config import get_submodule_packages
29
- from common.git import run_git
30
- from common.io import read_json, write_json
31
- from common.log import Colors
32
- from common.paths import (
33
- DIR_WORKFLOW,
34
- FILE_TASK_JSON,
35
- get_current_task,
36
- get_repo_root,
37
- )
38
- from common.phase import get_phase_for_action
39
-
40
- # Colors, read_json, write_json
41
- # are now imported from common.log and common.io above.
42
-
43
-
44
- # =============================================================================
45
- # Submodule PR Helpers
46
- # =============================================================================
47
-
48
- # Warning message prepended to main PR body when submodule PRs exist
49
- _SUBMODULE_SQUASH_WARNING_MARKER = (
50
- "Merge submodule PR(s) first. If squash-merged, update submodule ref after merge."
51
- )
52
-
53
-
54
- def _get_submodule_default_branch(submodule_abs: Path) -> str:
55
- """Get the default branch of a submodule repository.
56
-
57
- Uses `git symbolic-ref refs/remotes/origin/HEAD` for portability
58
- (no grep, no English-dependent output).
59
-
60
- Returns:
61
- Default branch name (e.g. "main"), falls back to "main" on failure.
62
- """
63
- ret, out, _ = run_git(
64
- ["symbolic-ref", "refs/remotes/origin/HEAD"], cwd=submodule_abs
65
- )
66
- if ret == 0 and out.strip():
67
- # Output: "refs/remotes/origin/main" -> "main"
68
- ref = out.strip()
69
- prefix = "refs/remotes/origin/"
70
- if ref.startswith(prefix):
71
- return ref[len(prefix):]
72
- return "main"
73
-
74
-
75
- def _process_submodule_changes(
76
- repo_root: Path,
77
- current_branch: str,
78
- commit_prefix: str,
79
- scope: str,
80
- task_name: str,
81
- task_data: dict,
82
- task_json: Path,
83
- dry_run: bool,
84
- ) -> tuple[dict[str, str], list[str], bool]:
85
- """Process submodule changes: commit, push, create PRs.
86
-
87
- Returns:
88
- Tuple of (submodule_prs dict, changed_submodule_paths list, success bool).
89
- On failure, submodule_prs contains URLs persisted so far.
90
- """
91
- submodule_packages = get_submodule_packages(repo_root)
92
- if not submodule_packages:
93
- return {}, [], True
94
-
95
- # Load existing submodule_prs for incremental merge
96
- raw_prs = task_data.get("submodule_prs")
97
- submodule_prs: dict[str, str] = dict(raw_prs) if isinstance(raw_prs, dict) else {}
98
-
99
- # Detect which submodules have changes
100
- changed: list[tuple[str, str]] = [] # (name, path)
101
- for pkg_name, pkg_path in submodule_packages.items():
102
- sub_abs = repo_root / pkg_path
103
- if not sub_abs.is_dir():
104
- continue
105
-
106
- ret, status_out, _ = run_git(
107
- ["status", "--porcelain"], cwd=sub_abs
108
- )
109
- if ret != 0:
110
- continue
111
- if status_out.strip():
112
- changed.append((pkg_name, pkg_path))
113
-
114
- if not changed:
115
- return submodule_prs, [], True
116
-
117
- # Determine submodule branch name: <repo-dir-name>/<main-branch>
118
- repo_dir_name = repo_root.name
119
- sub_branch = f"{repo_dir_name}/{current_branch}"
120
-
121
- print(f"\n{Colors.BLUE}=== Submodule Changes Detected ==={Colors.NC}")
122
- for pkg_name, pkg_path in changed:
123
- print(f" - {pkg_name} ({pkg_path})")
124
- print()
125
-
126
- changed_paths: list[str] = []
127
-
128
- for pkg_name, pkg_path in changed:
129
- sub_abs = repo_root / pkg_path
130
- sub_base = _get_submodule_default_branch(sub_abs)
131
- sub_commit_msg = f"{commit_prefix}({scope}): {task_name}"
132
-
133
- print(f"{Colors.YELLOW}Processing submodule: {pkg_name} ({pkg_path}){Colors.NC}")
134
- print(f" Submodule base branch: {sub_base}")
135
- print(f" Submodule branch: {sub_branch}")
136
-
137
- if dry_run:
138
- print(f" [DRY-RUN] Would checkout branch: {sub_branch}")
139
- print(f" [DRY-RUN] Would commit: {sub_commit_msg}")
140
- print(f" [DRY-RUN] Would push to: origin/{sub_branch}")
141
- print(f" [DRY-RUN] Would create PR: {sub_branch} -> {sub_base}")
142
- submodule_prs[pkg_name] = "https://github.com/example/repo/pull/DRY-RUN"
143
- changed_paths.append(pkg_path)
144
- continue
145
-
146
- # --- Checkout or create branch in submodule ---
147
- ret, _, _ = run_git(
148
- ["show-ref", "--verify", "--quiet", f"refs/heads/{sub_branch}"],
149
- cwd=sub_abs,
150
- )
151
- if ret == 0:
152
- # Branch exists, checkout
153
- ret, _, err = run_git(
154
- ["checkout", sub_branch], cwd=sub_abs
155
- )
156
- if ret != 0:
157
- print(f"{Colors.RED}Failed to checkout branch in {pkg_name}: {err}{Colors.NC}")
158
- return submodule_prs, changed_paths, False
159
-
160
- # Check for divergence (reuse risk)
161
- ret_anc, _, _ = run_git(
162
- ["merge-base", "--is-ancestor", sub_base, sub_branch],
163
- cwd=sub_abs,
164
- )
165
- if ret_anc != 0:
166
- print(
167
- f" {Colors.YELLOW}[WARN] submodule branch has diverged history, "
168
- f"consider recreating{Colors.NC}"
169
- )
170
- else:
171
- # Create new branch
172
- ret, _, err = run_git(
173
- ["checkout", "-b", sub_branch], cwd=sub_abs
174
- )
175
- if ret != 0:
176
- print(f"{Colors.RED}Failed to create branch in {pkg_name}: {err}{Colors.NC}")
177
- return submodule_prs, changed_paths, False
178
-
179
- # --- Stage and commit ---
180
- run_git(["add", "-A"], cwd=sub_abs)
181
-
182
- ret, _, _ = run_git(["diff", "--cached", "--quiet"], cwd=sub_abs)
183
- if ret != 0:
184
- # Has staged changes
185
- ret, _, err = run_git(
186
- ["commit", "-m", sub_commit_msg], cwd=sub_abs
187
- )
188
- if ret != 0:
189
- print(f"{Colors.RED}Failed to commit in {pkg_name}: {err}{Colors.NC}")
190
- return submodule_prs, changed_paths, False
191
- print(f" {Colors.GREEN}Committed in {pkg_name}{Colors.NC}")
192
- else:
193
- print(f" No staged changes in {pkg_name}, skipping commit")
194
-
195
- # --- Push ---
196
- ret, _, err = run_git(
197
- ["push", "-u", "origin", sub_branch], cwd=sub_abs
198
- )
199
- if ret != 0:
200
- print(f"{Colors.RED}Failed to push {pkg_name}: {err}{Colors.NC}")
201
- return submodule_prs, changed_paths, False
202
- print(f" {Colors.GREEN}Pushed {pkg_name} to origin/{sub_branch}{Colors.NC}")
203
-
204
- # --- Create or reuse PR ---
205
- result = subprocess.run(
206
- [
207
- "gh", "pr", "list",
208
- "--head", sub_branch,
209
- "--base", sub_base,
210
- "--json", "url",
211
- "--jq", ".[0].url",
212
- ],
213
- capture_output=True,
214
- text=True,
215
- encoding="utf-8",
216
- errors="replace",
217
- cwd=str(sub_abs),
218
- )
219
- existing_sub_pr = result.stdout.strip()
220
-
221
- if existing_sub_pr:
222
- print(f" {Colors.YELLOW}PR already exists: {existing_sub_pr}{Colors.NC}")
223
- sub_pr_url = existing_sub_pr
224
- else:
225
- result = subprocess.run(
226
- [
227
- "gh", "pr", "create",
228
- "--draft",
229
- "--base", sub_base,
230
- "--title", f"{commit_prefix}({scope}): {task_name} [{pkg_name}]",
231
- "--body", f"Submodule changes for {task_name}",
232
- ],
233
- capture_output=True,
234
- text=True,
235
- encoding="utf-8",
236
- errors="replace",
237
- cwd=str(sub_abs),
238
- )
239
- if result.returncode != 0:
240
- print(
241
- f"{Colors.RED}Failed to create PR for {pkg_name}: "
242
- f"{result.stderr}{Colors.NC}"
243
- )
244
- return submodule_prs, changed_paths, False
245
-
246
- sub_pr_url = result.stdout.strip()
247
- print(f" {Colors.GREEN}PR created for {pkg_name}: {sub_pr_url}{Colors.NC}")
248
-
249
- # Persist immediately (incremental, supports re-entry)
250
- submodule_prs[pkg_name] = sub_pr_url
251
- task_data["submodule_prs"] = submodule_prs
252
- write_json(task_json, task_data)
253
-
254
- changed_paths.append(pkg_path)
255
-
256
- return submodule_prs, changed_paths, True
257
-
258
-
259
- def _build_submodule_warning(submodule_prs: dict[str, str]) -> str:
260
- """Build the squash-merge warning block for the main PR body."""
261
- pr_lines = "\n".join(f"> - {name}: {url}" for name, url in submodule_prs.items())
262
- return (
263
- f"> {_SUBMODULE_SQUASH_WARNING_MARKER}\n"
264
- f">\n"
265
- f"> Submodule PRs:\n"
266
- f"{pr_lines}\n"
267
- f"\n---\n\n"
268
- )
269
-
270
-
271
- def _ensure_submodule_warning_on_existing_pr(
272
- submodule_prs: dict[str, str],
273
- dry_run: bool,
274
- ) -> None:
275
- """Read-modify-write: add squash warning to existing PR if missing."""
276
- if dry_run:
277
- print("[DRY-RUN] Would check/add submodule warning to existing PR")
278
- return
279
-
280
- # Read current PR body
281
- result = subprocess.run(
282
- [
283
- "gh", "pr", "view",
284
- "--json", "body",
285
- "--jq", ".body",
286
- ],
287
- capture_output=True,
288
- text=True,
289
- encoding="utf-8",
290
- errors="replace",
291
- )
292
- if result.returncode != 0:
293
- return
294
-
295
- current_body = result.stdout.strip()
296
- if _SUBMODULE_SQUASH_WARNING_MARKER in current_body:
297
- return # Warning already present
298
-
299
- # Prepend warning to existing body
300
- warning = _build_submodule_warning(submodule_prs)
301
- new_body = warning + current_body
302
-
303
- subprocess.run(
304
- ["gh", "pr", "edit", "--body", new_body],
305
- capture_output=True,
306
- text=True,
307
- encoding="utf-8",
308
- errors="replace",
309
- )
310
- print(f" {Colors.GREEN}Added submodule merge warning to existing PR{Colors.NC}")
311
-
312
-
313
- # =============================================================================
314
- # Main
315
- # =============================================================================
316
-
317
-
318
- def main() -> int:
319
- """Main entry point."""
320
- parser = argparse.ArgumentParser(description="Multi-Agent Pipeline: Create PR")
321
- parser.add_argument("dir", nargs="?", help="Task directory")
322
- parser.add_argument(
323
- "--dry-run", action="store_true", help="Show what would be done"
324
- )
325
-
326
- args = parser.parse_args()
327
- repo_root = get_repo_root()
328
-
329
- # =============================================================================
330
- # Get Task Directory
331
- # =============================================================================
332
- target_dir = args.dir
333
- if not target_dir:
334
- # Try to get from .current-task
335
- current_task = get_current_task(repo_root)
336
- if current_task:
337
- target_dir = current_task
338
-
339
- if not target_dir:
340
- print(
341
- f"{Colors.RED}Error: No task directory specified and no current task set{Colors.NC}"
342
- )
343
- print("Usage: python3 create_pr.py [task-dir] [--dry-run]")
344
- return 1
345
-
346
- # Support relative paths
347
- if not target_dir.startswith("/"):
348
- target_dir_path = repo_root / target_dir
349
- else:
350
- target_dir_path = Path(target_dir)
351
-
352
- task_json = target_dir_path / FILE_TASK_JSON
353
- if not task_json.is_file():
354
- print(f"{Colors.RED}Error: task.json not found at {target_dir_path}{Colors.NC}")
355
- return 1
356
-
357
- # =============================================================================
358
- # Main
359
- # =============================================================================
360
- print(f"{Colors.BLUE}=== Create PR ==={Colors.NC}")
361
- if args.dry_run:
362
- print(
363
- f"{Colors.YELLOW}[DRY-RUN MODE] No actual changes will be made{Colors.NC}"
364
- )
365
- print()
366
-
367
- # Read task config
368
- task_data = read_json(task_json)
369
- if not task_data:
370
- print(f"{Colors.RED}Error: Failed to read task.json{Colors.NC}")
371
- return 1
372
-
373
- task_name = task_data.get("name", "")
374
- base_branch = task_data.get("base_branch", "main")
375
- scope = task_data.get("scope", "core")
376
- dev_type = task_data.get("dev_type", "feature")
377
-
378
- # Map dev_type to commit prefix
379
- prefix_map = {
380
- "feature": "feat",
381
- "frontend": "feat",
382
- "backend": "feat",
383
- "fullstack": "feat",
384
- "bugfix": "fix",
385
- "fix": "fix",
386
- "refactor": "refactor",
387
- "docs": "docs",
388
- "test": "test",
389
- }
390
- commit_prefix = prefix_map.get(dev_type, "feat")
391
-
392
- print(f"Task: {task_name}")
393
- print(f"Base branch: {base_branch}")
394
- print(f"Scope: {scope}")
395
- print(f"Commit prefix: {commit_prefix}")
396
- print()
397
-
398
- # Get current branch
399
- _, branch_out, _ = run_git(["branch", "--show-current"])
400
- current_branch = branch_out.strip()
401
- print(f"Current branch: {current_branch}")
402
-
403
- # =============================================================================
404
- # Submodule PR Flow (runs BEFORE main repo staging)
405
- # =============================================================================
406
- submodule_prs, changed_submodule_paths, sub_success = _process_submodule_changes(
407
- repo_root=repo_root,
408
- current_branch=current_branch,
409
- commit_prefix=commit_prefix,
410
- scope=scope,
411
- task_name=task_name,
412
- task_data=task_data,
413
- task_json=task_json,
414
- dry_run=args.dry_run,
415
- )
416
-
417
- if not sub_success:
418
- print(
419
- f"\n{Colors.RED}Submodule PR flow failed. "
420
- f"Skipping main repo commit/PR.{Colors.NC}"
421
- )
422
- print("Already-created submodule PRs have been saved to task.json.")
423
- return 1
424
-
425
- # =============================================================================
426
- # Main Repo: Stage, Commit, Push, PR
427
- # =============================================================================
428
-
429
- # Check for changes
430
- print(f"{Colors.YELLOW}Checking for changes...{Colors.NC}")
431
-
432
- # Stage changes
433
- run_git(["add", "-A"])
434
-
435
- # Exclude workspace and temp files
436
- run_git(["reset", f"{DIR_WORKFLOW}/workspace/"])
437
- run_git(["reset", ".agent-log", ".session-id"])
438
-
439
- # If submodules changed, ensure their ref updates are staged
440
- for sub_path in changed_submodule_paths:
441
- run_git(["add", sub_path])
442
-
443
- # Check if there are staged changes
444
- ret, _, _ = run_git(["diff", "--cached", "--quiet"])
445
- has_staged_changes = ret != 0
446
-
447
- if not has_staged_changes:
448
- print(f"{Colors.YELLOW}No staged changes to commit{Colors.NC}")
449
-
450
- # Check for unpushed commits
451
- ret, log_out, _ = run_git(
452
- ["log", f"origin/{current_branch}..HEAD", "--oneline"]
453
- )
454
- unpushed = len([line for line in log_out.splitlines() if line.strip()])
455
-
456
- if unpushed == 0:
457
- if args.dry_run:
458
- run_git(["reset", "HEAD"])
459
- print(f"{Colors.RED}No changes to create PR{Colors.NC}")
460
- return 1
461
-
462
- print(f"Found {unpushed} unpushed commit(s)")
463
- else:
464
- # Commit changes
465
- print(f"{Colors.YELLOW}Committing changes...{Colors.NC}")
466
- commit_msg = f"{commit_prefix}({scope}): {task_name}"
467
-
468
- if args.dry_run:
469
- print(f"[DRY-RUN] Would commit with message: {commit_msg}")
470
- print("[DRY-RUN] Staged files:")
471
- _, staged_out, _ = run_git(["diff", "--cached", "--name-only"])
472
- for line in staged_out.splitlines():
473
- print(f" - {line}")
474
- else:
475
- run_git(["commit", "-m", commit_msg])
476
- print(f"{Colors.GREEN}Committed: {commit_msg}{Colors.NC}")
477
-
478
- # Push to remote
479
- print(f"{Colors.YELLOW}Pushing to remote...{Colors.NC}")
480
- if args.dry_run:
481
- print(f"[DRY-RUN] Would push to: origin/{current_branch}")
482
- else:
483
- ret, _, err = run_git(["push", "-u", "origin", current_branch])
484
- if ret != 0:
485
- print(f"{Colors.RED}Failed to push: {err}{Colors.NC}")
486
- return 1
487
- print(f"{Colors.GREEN}Pushed to origin/{current_branch}{Colors.NC}")
488
-
489
- # Create PR
490
- print(f"{Colors.YELLOW}Creating PR...{Colors.NC}")
491
- pr_title = f"{commit_prefix}({scope}): {task_name}"
492
- pr_url = ""
493
-
494
- # Build PR body with optional submodule warning
495
- has_submodule_prs = bool(submodule_prs)
496
-
497
- if args.dry_run:
498
- print("[DRY-RUN] Would create PR:")
499
- print(f" Title: {pr_title}")
500
- print(f" Base: {base_branch}")
501
- print(f" Head: {current_branch}")
502
- prd_file = target_dir_path / "prd.md"
503
- if prd_file.is_file():
504
- print(" Body: (from prd.md)")
505
- if has_submodule_prs:
506
- print(" Body includes submodule merge warning")
507
- pr_url = "https://github.com/example/repo/pull/DRY-RUN"
508
- else:
509
- # Check if PR already exists
510
- result = subprocess.run(
511
- [
512
- "gh",
513
- "pr",
514
- "list",
515
- "--head",
516
- current_branch,
517
- "--base",
518
- base_branch,
519
- "--json",
520
- "url",
521
- "--jq",
522
- ".[0].url",
523
- ],
524
- capture_output=True,
525
- text=True,
526
- encoding="utf-8",
527
- errors="replace",
528
- )
529
- existing_pr = result.stdout.strip()
530
-
531
- if existing_pr:
532
- print(f"{Colors.YELLOW}PR already exists: {existing_pr}{Colors.NC}")
533
- pr_url = existing_pr
534
-
535
- # Read-modify-write: add submodule warning if missing
536
- if has_submodule_prs:
537
- _ensure_submodule_warning_on_existing_pr(
538
- submodule_prs, args.dry_run
539
- )
540
- else:
541
- # Read PRD as PR body
542
- pr_body = ""
543
- prd_file = target_dir_path / "prd.md"
544
- if prd_file.is_file():
545
- pr_body = prd_file.read_text(encoding="utf-8")
546
-
547
- # Prepend submodule warning if applicable
548
- if has_submodule_prs:
549
- pr_body = _build_submodule_warning(submodule_prs) + pr_body
550
-
551
- # Create PR
552
- result = subprocess.run(
553
- [
554
- "gh",
555
- "pr",
556
- "create",
557
- "--draft",
558
- "--base",
559
- base_branch,
560
- "--title",
561
- pr_title,
562
- "--body",
563
- pr_body,
564
- ],
565
- capture_output=True,
566
- text=True,
567
- encoding="utf-8",
568
- errors="replace",
569
- )
570
-
571
- if result.returncode != 0:
572
- print(f"{Colors.RED}Failed to create PR: {result.stderr}{Colors.NC}")
573
- return 1
574
-
575
- pr_url = result.stdout.strip()
576
- print(f"{Colors.GREEN}PR created: {pr_url}{Colors.NC}")
577
-
578
- # Update task.json
579
- print(f"{Colors.YELLOW}Updating task status...{Colors.NC}")
580
- if args.dry_run:
581
- print("[DRY-RUN] Would update task.json:")
582
- print(" status: completed")
583
- print(f" pr_url: {pr_url}")
584
- if has_submodule_prs:
585
- print(f" submodule_prs: {submodule_prs}")
586
- print(" current_phase: (set to create-pr phase)")
587
- else:
588
- # Get the phase number for create-pr action
589
- create_pr_phase = get_phase_for_action(task_json, "create-pr")
590
- if not create_pr_phase:
591
- create_pr_phase = 4 # Default fallback
592
-
593
- task_data["status"] = "completed"
594
- task_data["pr_url"] = pr_url
595
- task_data["current_phase"] = create_pr_phase
596
- if has_submodule_prs:
597
- task_data["submodule_prs"] = submodule_prs
598
-
599
- write_json(task_json, task_data)
600
- print(
601
- f"{Colors.GREEN}Task status updated to 'completed', phase {create_pr_phase}{Colors.NC}"
602
- )
603
-
604
- # In dry-run, reset the staging area
605
- if args.dry_run:
606
- run_git(["reset", "HEAD"])
607
-
608
- print()
609
- print(f"{Colors.GREEN}=== PR Created Successfully ==={Colors.NC}")
610
- print(f"PR URL: {pr_url}")
611
- if has_submodule_prs:
612
- print("Submodule PRs:")
613
- for name, url in submodule_prs.items():
614
- print(f" - {name}: {url}")
615
-
616
- return 0
617
-
618
-
619
- if __name__ == "__main__":
620
- sys.exit(main())