@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,803 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Multi-Agent Pipeline Context Injection Hook
5
-
6
- Core Design Philosophy:
7
- - Dispatch becomes a pure dispatcher, only responsible for "calling subagents"
8
- - Hook is responsible for injecting all context, subagent works autonomously with complete info
9
- - Each agent has a dedicated jsonl file defining its context
10
- - No resume needed, no segmentation, behavior controlled by code not prompt
11
-
12
- Trigger: PreToolUse (before Task tool call)
13
-
14
- Context Source: .trellis/.current-task points to task directory
15
- - implement.jsonl - Implement agent dedicated context
16
- - check.jsonl - Check agent dedicated context
17
- - debug.jsonl - Debug agent dedicated context
18
- - research.jsonl - Research agent dedicated context (optional, usually not needed)
19
- - cr.jsonl - Code review dedicated context
20
- - prd.md - Requirements document
21
- - info.md - Technical design
22
- - codex-review-output.txt - Code Review results
23
- """
24
-
25
- # IMPORTANT: Suppress all warnings FIRST
26
- import warnings
27
- warnings.filterwarnings("ignore")
28
-
29
- import json
30
- import os
31
- import sys
32
- from pathlib import Path
33
-
34
- # IMPORTANT: Force stdout to use UTF-8 on Windows
35
- # This fixes UnicodeEncodeError when outputting non-ASCII characters
36
- if sys.platform == "win32":
37
- import io as _io
38
- if hasattr(sys.stdout, "reconfigure"):
39
- sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
40
- elif hasattr(sys.stdout, "detach"):
41
- sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr]
42
-
43
- # =============================================================================
44
- # Path Constants (change here to rename directories)
45
- # =============================================================================
46
-
47
- DIR_WORKFLOW = ".trellis"
48
- DIR_WORKSPACE = "workspace"
49
- DIR_TASKS = "tasks"
50
- DIR_SPEC = "spec"
51
- FILE_CURRENT_TASK = ".current-task"
52
- FILE_TASK_JSON = "task.json"
53
-
54
- # Agents that don't update phase (can be called at any time)
55
- AGENTS_NO_PHASE_UPDATE = {"debug", "research"}
56
-
57
- # =============================================================================
58
- # Subagent Constants (change here to rename subagent types)
59
- # =============================================================================
60
-
61
- AGENT_IMPLEMENT = "implement"
62
- AGENT_CHECK = "check"
63
- AGENT_DEBUG = "debug"
64
- AGENT_RESEARCH = "research"
65
-
66
- # Agents that require a task directory
67
- AGENTS_REQUIRE_TASK = (AGENT_IMPLEMENT, AGENT_CHECK, AGENT_DEBUG)
68
- # All supported agents
69
- AGENTS_ALL = (AGENT_IMPLEMENT, AGENT_CHECK, AGENT_DEBUG, AGENT_RESEARCH)
70
-
71
-
72
- def find_repo_root(start_path: str) -> str | None:
73
- """
74
- Find git repo root from start_path upwards
75
-
76
- Returns:
77
- Repo root path, or None if not found
78
- """
79
- current = Path(start_path).resolve()
80
- while current != current.parent:
81
- if (current / ".git").exists():
82
- return str(current)
83
- current = current.parent
84
- return None
85
-
86
-
87
- def get_current_task(repo_root: str) -> str | None:
88
- """
89
- Read current task directory path from .trellis/.current-task
90
-
91
- Returns:
92
- Task directory relative path (relative to repo_root)
93
- None if not set
94
- """
95
- current_task_file = os.path.join(repo_root, DIR_WORKFLOW, FILE_CURRENT_TASK)
96
- if not os.path.exists(current_task_file):
97
- return None
98
-
99
- try:
100
- with open(current_task_file, "r", encoding="utf-8") as f:
101
- content = f.read().strip()
102
- if not content:
103
- return None
104
- normalized = content.replace("\\", "/")
105
- while normalized.startswith("./"):
106
- normalized = normalized[2:]
107
- if normalized.startswith("tasks/"):
108
- normalized = f".trellis/{normalized}"
109
- return normalized
110
- except Exception:
111
- return None
112
-
113
-
114
- def update_current_phase(repo_root: str, task_dir: str, subagent_type: str) -> None:
115
- """
116
- Update current_phase in task.json based on subagent_type.
117
-
118
- This ensures phase tracking is always accurate, regardless of whether
119
- dispatch agent remembers to update it.
120
-
121
- Logic:
122
- - Read next_action array from task.json
123
- - Find the next phase whose action matches subagent_type
124
- - Only move forward, never backward
125
- - Some agents (debug, research) don't update phase
126
- """
127
- if subagent_type in AGENTS_NO_PHASE_UPDATE:
128
- return
129
-
130
- task_json_path = os.path.join(repo_root, task_dir, FILE_TASK_JSON)
131
- if not os.path.exists(task_json_path):
132
- return
133
-
134
- try:
135
- with open(task_json_path, "r", encoding="utf-8") as f:
136
- task_data = json.load(f)
137
-
138
- current_phase = task_data.get("current_phase", 0)
139
- next_actions = task_data.get("next_action", [])
140
-
141
- # Map action names to subagent types
142
- # "implement" -> "implement", "check" -> "check", "finish" -> "check"
143
- action_to_agent = {
144
- "implement": "implement",
145
- "check": "check",
146
- "finish": "check", # finish uses check agent
147
- }
148
-
149
- # Find the next phase that matches this subagent_type
150
- new_phase = None
151
- for action in next_actions:
152
- phase_num = action.get("phase", 0)
153
- action_name = action.get("action", "")
154
- expected_agent = action_to_agent.get(action_name)
155
-
156
- # Only consider phases after current_phase
157
- if phase_num > current_phase and expected_agent == subagent_type:
158
- new_phase = phase_num
159
- break
160
-
161
- if new_phase is not None:
162
- task_data["current_phase"] = new_phase
163
-
164
- with open(task_json_path, "w", encoding="utf-8") as f:
165
- json.dump(task_data, f, indent=2, ensure_ascii=False)
166
- except Exception:
167
- # Don't fail the hook if phase update fails
168
- pass
169
-
170
-
171
- def read_file_content(base_path: str, file_path: str) -> str | None:
172
- """Read file content, return None if file doesn't exist"""
173
- full_path = os.path.join(base_path, file_path)
174
- if os.path.exists(full_path) and os.path.isfile(full_path):
175
- try:
176
- with open(full_path, "r", encoding="utf-8") as f:
177
- return f.read()
178
- except Exception:
179
- return None
180
- return None
181
-
182
-
183
- def read_directory_contents(
184
- base_path: str, dir_path: str, max_files: int = 20
185
- ) -> list[tuple[str, str]]:
186
- """
187
- Read all .md files in a directory
188
-
189
- Args:
190
- base_path: Base path (usually repo_root)
191
- dir_path: Directory relative path
192
- max_files: Max files to read (prevent huge directories)
193
-
194
- Returns:
195
- [(file_path, content), ...]
196
- """
197
- full_path = os.path.join(base_path, dir_path)
198
- if not os.path.exists(full_path) or not os.path.isdir(full_path):
199
- return []
200
-
201
- results = []
202
- try:
203
- # Only read .md files, sorted by filename
204
- md_files = sorted(
205
- [
206
- f
207
- for f in os.listdir(full_path)
208
- if f.endswith(".md") and os.path.isfile(os.path.join(full_path, f))
209
- ]
210
- )
211
-
212
- for filename in md_files[:max_files]:
213
- file_full_path = os.path.join(full_path, filename)
214
- relative_path = os.path.join(dir_path, filename)
215
- try:
216
- with open(file_full_path, "r", encoding="utf-8") as f:
217
- content = f.read()
218
- results.append((relative_path, content))
219
- except Exception:
220
- continue
221
- except Exception:
222
- pass
223
-
224
- return results
225
-
226
-
227
- def read_jsonl_entries(base_path: str, jsonl_path: str) -> list[tuple[str, str]]:
228
- """
229
- Read all file/directory contents referenced in jsonl file
230
-
231
- Schema:
232
- {"file": "path/to/file.md", "reason": "..."}
233
- {"file": "path/to/dir/", "type": "directory", "reason": "..."}
234
-
235
- Returns:
236
- [(path, content), ...]
237
- """
238
- full_path = os.path.join(base_path, jsonl_path)
239
- if not os.path.exists(full_path):
240
- return []
241
-
242
- results = []
243
- try:
244
- with open(full_path, "r", encoding="utf-8") as f:
245
- for line in f:
246
- line = line.strip()
247
- if not line:
248
- continue
249
- try:
250
- item = json.loads(line)
251
- file_path = item.get("file") or item.get("path")
252
- entry_type = item.get("type", "file")
253
-
254
- if not file_path:
255
- continue
256
-
257
- if entry_type == "directory":
258
- # Read all .md files in directory
259
- dir_contents = read_directory_contents(base_path, file_path)
260
- results.extend(dir_contents)
261
- else:
262
- # Read single file
263
- content = read_file_content(base_path, file_path)
264
- if content:
265
- results.append((file_path, content))
266
- except json.JSONDecodeError:
267
- continue
268
- except Exception:
269
- pass
270
-
271
- return results
272
-
273
-
274
- def get_agent_context(repo_root: str, task_dir: str, agent_type: str) -> str:
275
- """
276
- Get complete context for specified agent
277
-
278
- Prioritize agent-specific jsonl, fallback to spec.jsonl if not exists
279
- """
280
- context_parts = []
281
-
282
- # 1. Try agent-specific jsonl
283
- agent_jsonl = f"{task_dir}/{agent_type}.jsonl"
284
- agent_entries = read_jsonl_entries(repo_root, agent_jsonl)
285
-
286
- # 2. If agent-specific jsonl doesn't exist or empty, fallback to spec.jsonl
287
- if not agent_entries:
288
- agent_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl")
289
-
290
- # 3. Add all files from jsonl
291
- for file_path, content in agent_entries:
292
- context_parts.append(f"=== {file_path} ===\n{content}")
293
-
294
- return "\n\n".join(context_parts)
295
-
296
-
297
- def get_implement_context(repo_root: str, task_dir: str) -> str:
298
- """
299
- Complete context for Implement Agent
300
-
301
- Read order:
302
- 1. All files in implement.jsonl (dev specs)
303
- 2. prd.md (requirements)
304
- 3. info.md (technical design)
305
- """
306
- context_parts = []
307
-
308
- # 1. Read implement.jsonl (or fallback to spec.jsonl)
309
- base_context = get_agent_context(repo_root, task_dir, "implement")
310
- if base_context:
311
- context_parts.append(base_context)
312
-
313
- # 2. Requirements document
314
- prd_content = read_file_content(repo_root, f"{task_dir}/prd.md")
315
- if prd_content:
316
- context_parts.append(f"=== {task_dir}/prd.md (Requirements) ===\n{prd_content}")
317
-
318
- # 3. Technical design
319
- info_content = read_file_content(repo_root, f"{task_dir}/info.md")
320
- if info_content:
321
- context_parts.append(
322
- f"=== {task_dir}/info.md (Technical Design) ===\n{info_content}"
323
- )
324
-
325
- return "\n\n".join(context_parts)
326
-
327
-
328
- def get_check_context(repo_root: str, task_dir: str) -> str:
329
- """
330
- Complete context for Check Agent
331
-
332
- Read order:
333
- 1. All files in check.jsonl (check specs + dev specs)
334
- 2. prd.md (for understanding task intent)
335
- """
336
- context_parts = []
337
-
338
- # 1. Read check.jsonl (or fallback to spec.jsonl + hardcoded check files)
339
- check_entries = read_jsonl_entries(repo_root, f"{task_dir}/check.jsonl")
340
-
341
- if check_entries:
342
- for file_path, content in check_entries:
343
- context_parts.append(f"=== {file_path} ===\n{content}")
344
- else:
345
- # Fallback: use hardcoded check files + spec.jsonl
346
- check_files = [
347
- (".claude/commands/trellis/finish-work.md", "Finish work checklist"),
348
- (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"),
349
- (".claude/commands/trellis/check.md", "Code quality check spec"),
350
- ]
351
- for file_path, description in check_files:
352
- content = read_file_content(repo_root, file_path)
353
- if content:
354
- context_parts.append(f"=== {file_path} ({description}) ===\n{content}")
355
-
356
- # Add spec.jsonl
357
- spec_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl")
358
- for file_path, content in spec_entries:
359
- context_parts.append(f"=== {file_path} (Dev spec) ===\n{content}")
360
-
361
- # 2. Requirements document (for understanding task intent)
362
- prd_content = read_file_content(repo_root, f"{task_dir}/prd.md")
363
- if prd_content:
364
- context_parts.append(
365
- f"=== {task_dir}/prd.md (Requirements - for understanding intent) ===\n{prd_content}"
366
- )
367
-
368
- return "\n\n".join(context_parts)
369
-
370
-
371
- def get_finish_context(repo_root: str, task_dir: str) -> str:
372
- """
373
- Complete context for Finish phase (final check before PR)
374
-
375
- Read order:
376
- 1. All files in finish.jsonl (if exists)
377
- 2. Fallback to finish-work.md only (lightweight final check)
378
- 3. update-spec.md (for active spec sync)
379
- 4. prd.md (for verifying requirements are met)
380
- """
381
- context_parts = []
382
-
383
- # 1. Try finish.jsonl first
384
- finish_entries = read_jsonl_entries(repo_root, f"{task_dir}/finish.jsonl")
385
-
386
- if finish_entries:
387
- for file_path, content in finish_entries:
388
- context_parts.append(f"=== {file_path} ===\n{content}")
389
- else:
390
- # Fallback: only finish-work.md (lightweight)
391
- finish_work = read_file_content(
392
- repo_root, ".claude/commands/trellis/finish-work.md"
393
- )
394
- if finish_work:
395
- context_parts.append(
396
- f"=== .claude/commands/trellis/finish-work.md (Finish checklist) ===\n{finish_work}"
397
- )
398
-
399
- # 2. Spec update process (for active spec sync)
400
- update_spec = read_file_content(
401
- repo_root, ".claude/commands/trellis/update-spec.md"
402
- )
403
- if update_spec:
404
- context_parts.append(
405
- f"=== .claude/commands/trellis/update-spec.md (Spec update process) ===\n{update_spec}"
406
- )
407
-
408
- # 3. Requirements document (for verifying requirements are met)
409
- prd_content = read_file_content(repo_root, f"{task_dir}/prd.md")
410
- if prd_content:
411
- context_parts.append(
412
- f"=== {task_dir}/prd.md (Requirements - verify all met) ===\n{prd_content}"
413
- )
414
-
415
- return "\n\n".join(context_parts)
416
-
417
-
418
- def get_debug_context(repo_root: str, task_dir: str) -> str:
419
- """
420
- Complete context for Debug Agent
421
-
422
- Read order:
423
- 1. All files in debug.jsonl (specs needed for fixing)
424
- 2. codex-review-output.txt (Codex Review results)
425
- """
426
- context_parts = []
427
-
428
- # 1. Read debug.jsonl (or fallback to spec.jsonl + hardcoded check files)
429
- debug_entries = read_jsonl_entries(repo_root, f"{task_dir}/debug.jsonl")
430
-
431
- if debug_entries:
432
- for file_path, content in debug_entries:
433
- context_parts.append(f"=== {file_path} ===\n{content}")
434
- else:
435
- # Fallback: use spec.jsonl + hardcoded check files
436
- spec_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl")
437
- for file_path, content in spec_entries:
438
- context_parts.append(f"=== {file_path} (Dev spec) ===\n{content}")
439
-
440
- check_files = [
441
- (".claude/commands/trellis/check.md", "Code quality check spec"),
442
- (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"),
443
- ]
444
- for file_path, description in check_files:
445
- content = read_file_content(repo_root, file_path)
446
- if content:
447
- context_parts.append(f"=== {file_path} ({description}) ===\n{content}")
448
-
449
- # 2. Codex review output (if exists)
450
- codex_output = read_file_content(repo_root, f"{task_dir}/codex-review-output.txt")
451
- if codex_output:
452
- context_parts.append(
453
- f"=== {task_dir}/codex-review-output.txt (Codex Review Results) ===\n{codex_output}"
454
- )
455
-
456
- return "\n\n".join(context_parts)
457
-
458
-
459
- def build_implement_prompt(original_prompt: str, context: str) -> str:
460
- """Build complete prompt for Implement"""
461
- return f"""# Implement Agent Task
462
-
463
- You are the Implement Agent in the Multi-Agent Pipeline.
464
-
465
- ## Your Context
466
-
467
- All the information you need has been prepared for you:
468
-
469
- {context}
470
-
471
- ---
472
-
473
- ## Your Task
474
-
475
- {original_prompt}
476
-
477
- ---
478
-
479
- ## Workflow
480
-
481
- 1. **Understand specs** - All dev specs are injected above, understand them
482
- 2. **Understand requirements** - Read requirements document and technical design
483
- 3. **Implement feature** - Implement following specs and design
484
- 4. **Self-check** - Ensure code quality against check specs
485
-
486
- ## Important Constraints
487
-
488
- - Do NOT execute git commit, only code modifications
489
- - Follow all dev specs injected above
490
- - Report list of modified/created files when done"""
491
-
492
-
493
- def build_check_prompt(original_prompt: str, context: str) -> str:
494
- """Build complete prompt for Check"""
495
- return f"""# Check Agent Task
496
-
497
- You are the Check Agent in the Multi-Agent Pipeline (code and cross-layer checker).
498
-
499
- ## Your Context
500
-
501
- All check specs and dev specs you need:
502
-
503
- {context}
504
-
505
- ---
506
-
507
- ## Your Task
508
-
509
- {original_prompt}
510
-
511
- ---
512
-
513
- ## Workflow
514
-
515
- 1. **Get changes** - Run `git diff --name-only` and `git diff` to get code changes
516
- 2. **Check against specs** - Check item by item against specs above
517
- 3. **Self-fix** - Fix issues directly, don't just report
518
- 4. **Run verification** - Run project's lint and typecheck commands
519
-
520
- ## Important Constraints
521
-
522
- - Fix issues yourself, don't just report
523
- - Must execute complete checklist in check specs
524
- - Pay special attention to impact radius analysis (L1-L5)"""
525
-
526
-
527
- def build_finish_prompt(original_prompt: str, context: str) -> str:
528
- """Build complete prompt for Finish (final check before PR)"""
529
- return f"""# Finish Agent Task
530
-
531
- You are performing the final check before creating a PR.
532
-
533
- ## Your Context
534
-
535
- Finish checklist and requirements:
536
-
537
- {context}
538
-
539
- ---
540
-
541
- ## Your Task
542
-
543
- {original_prompt}
544
-
545
- ---
546
-
547
- ## Workflow
548
-
549
- 1. **Review changes** - Run `git diff --name-only` to see all changed files
550
- 2. **Verify requirements** - Check each requirement in prd.md is implemented
551
- 3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions
552
- - If new pattern/convention found: read target spec file → update it → update index.md if needed
553
- - If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md
554
- - If pure code fix with no new patterns: skip this step
555
- 4. **Run final checks** - Execute lint and typecheck
556
- 5. **Confirm ready** - Ensure code is ready for PR
557
-
558
- ## Important Constraints
559
-
560
- - You MAY update spec files when gaps are detected (use update-spec.md as guide)
561
- - MUST read the target spec file BEFORE editing (avoid duplicating existing content)
562
- - Do NOT update specs for trivial changes (typos, formatting, obvious fixes)
563
- - If critical CODE issues found, report them clearly (fix specs, not code)
564
- - Verify all acceptance criteria in prd.md are met"""
565
-
566
-
567
- def build_debug_prompt(original_prompt: str, context: str) -> str:
568
- """Build complete prompt for Debug"""
569
- return f"""# Debug Agent Task
570
-
571
- You are the Debug Agent in the Multi-Agent Pipeline (issue fixer).
572
-
573
- ## Your Context
574
-
575
- Dev specs and Codex Review results:
576
-
577
- {context}
578
-
579
- ---
580
-
581
- ## Your Task
582
-
583
- {original_prompt}
584
-
585
- ---
586
-
587
- ## Workflow
588
-
589
- 1. **Understand issues** - Analyze issues pointed out in Codex Review
590
- 2. **Locate code** - Find positions that need fixing
591
- 3. **Fix against specs** - Fix issues following dev specs
592
- 4. **Verify fixes** - Run typecheck to ensure no new issues
593
-
594
- ## Important Constraints
595
-
596
- - Do NOT execute git commit, only code modifications
597
- - Run typecheck after each fix to verify
598
- - Report which issues were fixed and which files were modified"""
599
-
600
-
601
- def get_research_context(repo_root: str, task_dir: str | None) -> str:
602
- """
603
- Context for Research Agent
604
-
605
- Research doesn't need much preset context, only needs:
606
- 1. Project structure overview (where spec directories are)
607
- 2. Optional research.jsonl (if there are specific search needs)
608
- """
609
- context_parts = []
610
-
611
- # 1. Project structure overview (dynamically discover spec directories)
612
- spec_path = f"{DIR_WORKFLOW}/{DIR_SPEC}"
613
- spec_root = Path(repo_root) / DIR_WORKFLOW / DIR_SPEC
614
-
615
- # Build spec tree dynamically
616
- tree_lines = [f"{spec_path}/"]
617
- if spec_root.is_dir():
618
- pkg_dirs = sorted(d for d in spec_root.iterdir() if d.is_dir())
619
- for i, pkg_dir in enumerate(pkg_dirs):
620
- is_last = i == len(pkg_dirs) - 1
621
- prefix = "└── " if is_last else "├── "
622
- layers = sorted(d.name for d in pkg_dir.iterdir() if d.is_dir())
623
- layer_info = f" ({', '.join(layers)})" if layers else ""
624
- tree_lines.append(f"{prefix}{pkg_dir.name}/{layer_info}")
625
-
626
- spec_tree = "\n".join(tree_lines)
627
-
628
- project_structure = f"""## Project Spec Directory Structure
629
-
630
- ```
631
- {spec_tree}
632
- ```
633
-
634
- To get structured package info, run: `python3 ./{DIR_WORKFLOW}/scripts/get_context.py --mode packages`
635
-
636
- ## Search Tips
637
-
638
- - Spec files: `{spec_path}/**/*.md`
639
- - Code search: Use Glob and Grep tools
640
- - Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa"""
641
-
642
- context_parts.append(project_structure)
643
-
644
- # 2. If task directory exists, try reading research.jsonl (optional)
645
- if task_dir:
646
- research_entries = read_jsonl_entries(repo_root, f"{task_dir}/research.jsonl")
647
- if research_entries:
648
- context_parts.append(
649
- "\n## Additional Search Context (from research.jsonl)\n"
650
- )
651
- for file_path, content in research_entries:
652
- context_parts.append(f"=== {file_path} ===\n{content}")
653
-
654
- return "\n\n".join(context_parts)
655
-
656
-
657
- def build_research_prompt(original_prompt: str, context: str) -> str:
658
- """Build complete prompt for Research"""
659
- return f"""# Research Agent Task
660
-
661
- You are the Research Agent in the Multi-Agent Pipeline (search researcher).
662
-
663
- ## Core Principle
664
-
665
- **You do one thing: find and explain information.**
666
-
667
- You are a documenter, not a reviewer.
668
-
669
- ## Project Info
670
-
671
- {context}
672
-
673
- ---
674
-
675
- ## Your Task
676
-
677
- {original_prompt}
678
-
679
- ---
680
-
681
- ## Workflow
682
-
683
- 1. **Understand query** - Determine search type (internal/external) and scope
684
- 2. **Plan search** - List search steps for complex queries
685
- 3. **Execute search** - Execute multiple independent searches in parallel
686
- 4. **Organize results** - Output structured report
687
-
688
- ## Search Tools
689
-
690
- | Tool | Purpose |
691
- |------|---------|
692
- | Glob | Search by filename pattern |
693
- | Grep | Search by content |
694
- | Read | Read file content |
695
- | mcp__exa__web_search_exa | External web search |
696
- | mcp__exa__get_code_context_exa | External code/doc search |
697
-
698
- ## Strict Boundaries
699
-
700
- **Only allowed**: Describe what exists, where it is, how it works
701
-
702
- **Forbidden** (unless explicitly asked):
703
- - Suggest improvements
704
- - Criticize implementation
705
- - Recommend refactoring
706
- - Modify any files
707
-
708
- ## Report Format
709
-
710
- Provide structured search results including:
711
- - List of files found (with paths)
712
- - Code pattern analysis (if applicable)
713
- - Related spec documents
714
- - External references (if any)"""
715
-
716
-
717
- def main():
718
- try:
719
- input_data = json.load(sys.stdin)
720
- except json.JSONDecodeError:
721
- sys.exit(0)
722
-
723
- tool_name = input_data.get("tool_name", "")
724
-
725
- if tool_name not in ("Task", "Agent"):
726
- sys.exit(0)
727
-
728
- tool_input = input_data.get("tool_input", {})
729
- subagent_type = tool_input.get("subagent_type", "")
730
- original_prompt = tool_input.get("prompt", "")
731
- cwd = input_data.get("cwd", os.getcwd())
732
-
733
- # Only handle subagent types we care about
734
- if subagent_type not in AGENTS_ALL:
735
- sys.exit(0)
736
-
737
- # Find repo root
738
- repo_root = find_repo_root(cwd)
739
- if not repo_root:
740
- sys.exit(0)
741
-
742
- # Get current task directory (research doesn't require it)
743
- task_dir = get_current_task(repo_root)
744
-
745
- # implement/check/debug need task directory
746
- if subagent_type in AGENTS_REQUIRE_TASK:
747
- if not task_dir:
748
- sys.exit(0)
749
- # Check if task directory exists
750
- task_dir_full = os.path.join(repo_root, task_dir)
751
- if not os.path.exists(task_dir_full):
752
- sys.exit(0)
753
-
754
- # Update current_phase in task.json (system-level enforcement)
755
- update_current_phase(repo_root, task_dir, subagent_type)
756
-
757
- # Check for [finish] marker in prompt (check agent with finish context)
758
- is_finish_phase = "[finish]" in original_prompt.lower()
759
-
760
- # Get context and build prompt based on subagent type
761
- if subagent_type == AGENT_IMPLEMENT:
762
- assert task_dir is not None # validated above
763
- context = get_implement_context(repo_root, task_dir)
764
- new_prompt = build_implement_prompt(original_prompt, context)
765
- elif subagent_type == AGENT_CHECK:
766
- assert task_dir is not None # validated above
767
- if is_finish_phase:
768
- # Finish phase: use finish context (lighter, focused on final verification)
769
- context = get_finish_context(repo_root, task_dir)
770
- new_prompt = build_finish_prompt(original_prompt, context)
771
- else:
772
- # Regular check phase: use check context (full specs for self-fix loop)
773
- context = get_check_context(repo_root, task_dir)
774
- new_prompt = build_check_prompt(original_prompt, context)
775
- elif subagent_type == AGENT_DEBUG:
776
- assert task_dir is not None # validated above
777
- context = get_debug_context(repo_root, task_dir)
778
- new_prompt = build_debug_prompt(original_prompt, context)
779
- elif subagent_type == AGENT_RESEARCH:
780
- # Research can work without task directory
781
- context = get_research_context(repo_root, task_dir)
782
- new_prompt = build_research_prompt(original_prompt, context)
783
- else:
784
- sys.exit(0)
785
-
786
- if not context:
787
- sys.exit(0)
788
-
789
- # Return updated input with correct Claude Code PreToolUse format
790
- output = {
791
- "hookSpecificOutput": {
792
- "hookEventName": "PreToolUse",
793
- "permissionDecision": "allow",
794
- "updatedInput": {**tool_input, "prompt": new_prompt},
795
- }
796
- }
797
-
798
- print(json.dumps(output, ensure_ascii=False))
799
- sys.exit(0)
800
-
801
-
802
- if __name__ == "__main__":
803
- main()