@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
@@ -22,7 +22,7 @@ You are the Implement Agent in the Trellis workflow.
22
22
  Otherwise, load context yourself:
23
23
 
24
24
  1. Read `.trellis/.current-task` → get task directory (e.g., `.trellis/tasks/xxx`)
25
- 2. Read `{task_dir}/implement.jsonl` (or `spec.jsonl` as fallback)
25
+ 2. Read `{task_dir}/implement.jsonl`
26
26
  3. For each entry in JSONL:
27
27
  - If `path` is a file → Read it
28
28
  - If `path` is a directory → Read all `.md` files in it
@@ -23,8 +23,7 @@ You are the Research Agent in the Trellis workflow.
23
23
  Otherwise, if task-specific research is needed:
24
24
 
25
25
  1. Read `.trellis/.current-task` → get task directory (if exists)
26
- 2. Read `{task_dir}/research.jsonl` if exists
27
- 3. For each entry in JSONL:
26
+ 2. For each entry in JSONL (if task dir exists):
28
27
  - If `path` is a file → Read it
29
28
  - If `path` is a directory → Read all `.md` files in it
30
29
 
@@ -5,60 +5,13 @@
5
5
  * Uses OpenCode's tool.execute.before hook.
6
6
  */
7
7
 
8
- import { existsSync, writeFileSync, readdirSync } from "fs"
8
+ import { existsSync, readdirSync } from "fs"
9
9
  import { join } from "path"
10
10
  import { TrellisContext, debugLog } from "../lib/trellis-context.js"
11
11
 
12
12
  // Supported subagent types
13
- const AGENTS_ALL = ["implement", "check", "debug", "research"]
14
- const AGENTS_REQUIRE_TASK = ["implement", "check", "debug"]
15
- // Agents that don't update phase (can be called at any time)
16
- const AGENTS_NO_PHASE_UPDATE = ["debug", "research"]
17
-
18
- /**
19
- * Update current_phase in task.json based on subagent_type
20
- */
21
- function updateCurrentPhase(ctx, taskDir, subagentType) {
22
- if (AGENTS_NO_PHASE_UPDATE.includes(subagentType)) {
23
- return
24
- }
25
-
26
- const taskJsonPath = join(ctx.directory, taskDir, "task.json")
27
- const content = ctx.readFile(taskJsonPath)
28
- if (!content) return
29
-
30
- try {
31
- const taskData = JSON.parse(content)
32
- const currentPhase = taskData.current_phase || 0
33
- const nextActions = taskData.next_action || []
34
-
35
- const actionToAgent = {
36
- "implement": "implement",
37
- "check": "check",
38
- "finish": "check"
39
- }
40
-
41
- let newPhase = null
42
- for (const action of nextActions) {
43
- const phaseNum = action.phase || 0
44
- const actionName = action.action || ""
45
- const expectedAgent = actionToAgent[actionName]
46
-
47
- if (phaseNum > currentPhase && expectedAgent === subagentType) {
48
- newPhase = phaseNum
49
- break
50
- }
51
- }
52
-
53
- if (newPhase !== null) {
54
- taskData.current_phase = newPhase
55
- writeFileSync(taskJsonPath, JSON.stringify(taskData, null, 2))
56
- debugLog("inject", "Updated current_phase to:", newPhase)
57
- }
58
- } catch (e) {
59
- debugLog("inject", "Error updating phase:", e.message)
60
- }
61
- }
13
+ const AGENTS_ALL = ["implement", "check", "research"]
14
+ const AGENTS_REQUIRE_TASK = ["implement", "check"]
62
15
 
63
16
  /**
64
17
  * Get context for implement agent
@@ -66,14 +19,8 @@ function updateCurrentPhase(ctx, taskDir, subagentType) {
66
19
  function getImplementContext(ctx, taskDir) {
67
20
  const parts = []
68
21
 
69
- let jsonlPath = join(ctx.directory, taskDir, "implement.jsonl")
70
- let entries = ctx.readJsonlWithFiles(jsonlPath)
71
-
72
- if (entries.length === 0) {
73
- jsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
74
- entries = ctx.readJsonlWithFiles(jsonlPath)
75
- }
76
-
22
+ const jsonlPath = join(ctx.directory, taskDir, "implement.jsonl")
23
+ const entries = ctx.readJsonlWithFiles(jsonlPath)
77
24
  if (entries.length > 0) {
78
25
  parts.push(ctx.buildContextFromEntries(entries))
79
26
  }
@@ -99,32 +46,13 @@ function getCheckContext(ctx, taskDir) {
99
46
 
100
47
  const jsonlPath = join(ctx.directory, taskDir, "check.jsonl")
101
48
  const entries = ctx.readJsonlWithFiles(jsonlPath)
102
-
103
49
  if (entries.length > 0) {
104
50
  parts.push(ctx.buildContextFromEntries(entries))
105
- } else {
106
- const checkFiles = [
107
- [".opencode/commands/trellis/finish-work.md", "Finish work checklist"],
108
- [".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
109
- [".opencode/commands/trellis/check.md", "Check spec"],
110
- ]
111
- for (const [f, description] of checkFiles) {
112
- const content = ctx.readProjectFile(f)
113
- if (content) {
114
- parts.push(`=== ${f} (${description}) ===\n${content}`)
115
- }
116
- }
117
-
118
- const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
119
- const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
120
- for (const entry of specEntries) {
121
- parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
122
- }
123
51
  }
124
52
 
125
53
  const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
126
54
  if (prd) {
127
- parts.push(`=== ${taskDir}/prd.md (Requirements - for understanding intent) ===\n${prd}`)
55
+ parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
128
56
  }
129
57
 
130
58
  return parts.join("\n\n")
@@ -134,75 +62,15 @@ function getCheckContext(ctx, taskDir) {
134
62
  * Get context for finish phase (final check before PR)
135
63
  */
136
64
  function getFinishContext(ctx, taskDir) {
137
- const parts = []
138
-
139
- const jsonlPath = join(ctx.directory, taskDir, "finish.jsonl")
140
- const entries = ctx.readJsonlWithFiles(jsonlPath)
141
-
142
- if (entries.length > 0) {
143
- parts.push(ctx.buildContextFromEntries(entries))
144
- } else {
145
- const finishWork = ctx.readProjectFile(".opencode/commands/trellis/finish-work.md")
146
- if (finishWork) {
147
- parts.push(`=== .opencode/commands/trellis/finish-work.md (Finish checklist) ===\n${finishWork}`)
148
- }
149
- }
150
-
151
- const updateSpec = ctx.readProjectFile(".opencode/commands/trellis/update-spec.md")
152
- if (updateSpec) {
153
- parts.push(`=== .opencode/commands/trellis/update-spec.md (Spec update process) ===\n${updateSpec}`)
154
- }
155
-
156
- const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
157
- if (prd) {
158
- parts.push(`=== ${taskDir}/prd.md (Requirements - verify all met) ===\n${prd}`)
159
- }
160
-
161
- return parts.join("\n\n")
65
+ // Finish reuses check context (same JSONL source)
66
+ return getCheckContext(ctx, taskDir)
162
67
  }
163
68
 
164
- /**
165
- * Get context for debug agent
166
- */
167
- function getDebugContext(ctx, taskDir) {
168
- const parts = []
169
-
170
- const jsonlPath = join(ctx.directory, taskDir, "debug.jsonl")
171
- const entries = ctx.readJsonlWithFiles(jsonlPath)
172
-
173
- if (entries.length > 0) {
174
- parts.push(ctx.buildContextFromEntries(entries))
175
- } else {
176
- const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
177
- const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
178
- for (const entry of specEntries) {
179
- parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
180
- }
181
-
182
- const checkFiles = [
183
- [".opencode/commands/trellis/check.md", "Check spec"],
184
- [".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
185
- ]
186
- for (const [f, description] of checkFiles) {
187
- const content = ctx.readProjectFile(f)
188
- if (content) {
189
- parts.push(`=== ${f} (${description}) ===\n${content}`)
190
- }
191
- }
192
- }
193
-
194
- const codex = ctx.readProjectFile(join(taskDir, "codex-review-output.txt"))
195
- if (codex) {
196
- parts.push(`=== ${taskDir}/codex-review-output.txt (Codex Review Results) ===\n${codex}`)
197
- }
198
-
199
- return parts.join("\n\n")
200
- }
201
69
 
202
70
  /**
203
71
  * Get context for research agent
204
72
  */
205
- function getResearchContext(ctx, taskDir) {
73
+ function getResearchContext(ctx) {
206
74
  const parts = []
207
75
 
208
76
  // Dynamic project structure (scan actual spec directory)
@@ -251,15 +119,6 @@ function getResearchContext(ctx, taskDir) {
251
119
  - Code search: Use Glob and Grep tools
252
120
  - Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa`)
253
121
 
254
- if (taskDir) {
255
- const jsonlPath = join(ctx.directory, taskDir, "research.jsonl")
256
- const researchEntries = ctx.readJsonlWithFiles(jsonlPath)
257
- if (researchEntries.length > 0) {
258
- parts.push("\n## Additional Search Context\n")
259
- parts.push(ctx.buildContextFromEntries(researchEntries))
260
- }
261
- }
262
-
263
122
  return parts.join("\n\n")
264
123
  }
265
124
 
@@ -359,34 +218,6 @@ ${originalPrompt}
359
218
  - Fix issues yourself, don't just report
360
219
  - Must execute complete checklist`,
361
220
 
362
- debug: `# Debug Agent Task
363
-
364
- You are the Debug Agent in the Multi-Agent Pipeline.
365
-
366
- ## Your Context
367
-
368
- ${context}
369
-
370
- ---
371
-
372
- ## Your Task
373
-
374
- ${originalPrompt}
375
-
376
- ---
377
-
378
- ## Workflow
379
-
380
- 1. **Understand issues** - Analyze issues pointed out
381
- 2. **Locate code** - Find positions that need fixing
382
- 3. **Fix against specs** - Fix following dev specs
383
- 4. **Verify fixes** - Run typecheck
384
-
385
- ## Important Constraints
386
-
387
- - Do NOT execute git commit
388
- - Run typecheck after each fix`,
389
-
390
221
  research: `# Research Agent Task
391
222
 
392
223
  You are the Research Agent in the Multi-Agent Pipeline.
@@ -424,13 +255,16 @@ ${originalPrompt}
424
255
  return templates[agentType] || originalPrompt
425
256
  }
426
257
 
427
- export default {
428
- id: "trellis.inject-subagent-context",
429
- server: async ({ directory }) => {
430
- const ctx = new TrellisContext(directory)
431
- debugLog("inject", "Plugin loaded, directory:", directory)
258
+ // OpenCode plugin factory: `export default async (input) => hooks`.
259
+ // OpenCode 1.2.x iterates every module export and invokes it as a function
260
+ // (packages/opencode/src/plugin/index.ts — `for ([_, fn] of Object.entries(mod)) await fn(input)`);
261
+ // the previous `{ id, server }` object shape failed with
262
+ // `TypeError: fn is not a function` in 1.2.x.
263
+ export default async ({ directory }) => {
264
+ const ctx = new TrellisContext(directory)
265
+ debugLog("inject", "Plugin loaded, directory:", directory)
432
266
 
433
- return {
267
+ return {
434
268
  "tool.execute.before": async (input, output) => {
435
269
  try {
436
270
  debugLog("inject", "tool.execute.before called, tool:", input?.tool)
@@ -467,8 +301,6 @@ export default {
467
301
  debugLog("inject", "Skipping - task directory not found")
468
302
  return
469
303
  }
470
-
471
- updateCurrentPhase(ctx, taskDir, subagentType)
472
304
  }
473
305
 
474
306
  // Check for [finish] marker
@@ -485,9 +317,6 @@ export default {
485
317
  ? getFinishContext(ctx, taskDir)
486
318
  : getCheckContext(ctx, taskDir)
487
319
  break
488
- case "debug":
489
- context = getDebugContext(ctx, taskDir)
490
- break
491
320
  case "research":
492
321
  context = getResearchContext(ctx, taskDir)
493
322
  break
@@ -511,5 +340,4 @@ export default {
511
340
  }
512
341
  }
513
342
  }
514
- }
515
343
  }
@@ -0,0 +1,172 @@
1
+ /* global process */
2
+ /**
3
+ * Trellis Workflow State Injection Plugin
4
+ *
5
+ * Per-turn UserPromptSubmit equivalent for OpenCode.
6
+ *
7
+ * On every chat.message, if a Trellis task is active, inject a short
8
+ * <workflow-state> breadcrumb reminding the main AI what task is active
9
+ * and its expected flow. Breadcrumb text is pulled from the project's
10
+ * workflow.md [workflow-state:STATUS] tag blocks (single source of
11
+ * truth for users who fork the Trellis workflow), with hardcoded
12
+ * fallbacks so the hook never breaks when workflow.md is missing or
13
+ * malformed.
14
+ *
15
+ * Unlike session-start, this plugin does NOT dedupe — breadcrumb
16
+ * should surface on every turn so long conversations don't drift.
17
+ *
18
+ * Silently skips when:
19
+ * - No .trellis/ directory
20
+ * - No active task (.trellis/.current-task missing or stale)
21
+ * - task.json malformed or missing status
22
+ */
23
+
24
+ import { existsSync, readFileSync } from "fs"
25
+ import { join } from "path"
26
+ import { TrellisContext, debugLog } from "../lib/trellis-context.js"
27
+
28
+ // Supports STATUS values with letters, digits, underscores, hyphens
29
+ // (so "in-review" / "blocked-by-team" work alongside "in_progress").
30
+ const TAG_RE = /\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g
31
+
32
+ // Hardcoded defaults for built-in Trellis statuses. Used when workflow.md
33
+ // is missing, malformed, or lacks the tag for this status.
34
+ //
35
+ // `no_task` is a pseudo-status emitted when .current-task is missing — keeps
36
+ // the Next-Action reminder flowing per-turn even without an active task.
37
+ const FALLBACK_BREADCRUMBS = {
38
+ no_task:
39
+ "No active task.\n" +
40
+ "Trigger words in the user message that REQUIRE creating a task " +
41
+ "(non-negotiable, do NOT self-exempt): 重构 / 抽成 / 独立 / 分发 / " +
42
+ "拆出来 / 搞一个 / 做成 / 接入 / 集成 / refactor / rewrite / extract / " +
43
+ "productize / publish / build X / design Y.\n" +
44
+ "Task is NOT required ONLY if ALL three hold: (a) zero file writes " +
45
+ "this turn, (b) answer fits in one reply with no multi-round plan, " +
46
+ "(c) no research beyond reading 1-2 repo files.\n" +
47
+ "When in doubt: create task. Over-tasking is cheap; under-tasking " +
48
+ "leaks plans and research into main context.\n" +
49
+ "Flow: load `trellis-brainstorm` skill → it creates the task via " +
50
+ "`python3 ./.trellis/scripts/task.py create` and drives requirements Q&A. " +
51
+ "For research-heavy work (tool comparison, docs, cross-platform survey), " +
52
+ "spawn `trellis-research` sub-agents via Task tool — NEVER do 3+ inline " +
53
+ "WebFetch/WebSearch/`gh api` calls in the main conversation.",
54
+ planning:
55
+ "Complete prd.md via trellis-brainstorm skill; then run task.py start.\n" +
56
+ "Research belongs in `{task_dir}/research/*.md`, written by " +
57
+ "`trellis-research` sub-agents. Do NOT inline WebFetch/WebSearch in " +
58
+ "main session — PRD only links to research files.",
59
+ in_progress:
60
+ "Flow: trellis-implement → trellis-check → trellis-update-spec → finish\n" +
61
+ "Check conversation history + git status to determine current step; do NOT skip trellis-check.",
62
+ completed:
63
+ "User commits changes; then run task.py archive.",
64
+ }
65
+
66
+ /**
67
+ * Parse workflow.md for [workflow-state:STATUS] blocks.
68
+ * Returns {status: body}. Missing tags fall back to hardcoded defaults.
69
+ */
70
+ function loadBreadcrumbs(directory) {
71
+ const result = { ...FALLBACK_BREADCRUMBS }
72
+ const workflowPath = join(directory, ".trellis", "workflow.md")
73
+ if (!existsSync(workflowPath)) return result
74
+ let content
75
+ try {
76
+ content = readFileSync(workflowPath, "utf-8")
77
+ } catch {
78
+ return result
79
+ }
80
+ for (const match of content.matchAll(TAG_RE)) {
81
+ const status = match[1]
82
+ const body = match[2].trim()
83
+ if (body) result[status] = body
84
+ }
85
+ return result
86
+ }
87
+
88
+ /**
89
+ * Get (taskId, status) from active task, or null if no active task.
90
+ */
91
+ function getActiveTask(ctx) {
92
+ const taskRef = ctx.getCurrentTask()
93
+ if (!taskRef) return null
94
+ const taskDir = ctx.resolveTaskDir(taskRef)
95
+ if (!taskDir || !existsSync(taskDir)) return null
96
+ const taskJsonPath = join(taskDir, "task.json")
97
+ if (!existsSync(taskJsonPath)) return null
98
+ try {
99
+ const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
100
+ const status = typeof data.status === "string" ? data.status : ""
101
+ if (!status) return null
102
+ const id = data.id || taskRef.split("/").pop()
103
+ return { id, status }
104
+ } catch {
105
+ return null
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Build the <workflow-state>...</workflow-state> block.
111
+ * - Known status (templates or fallback) → detailed body
112
+ * - Unknown status → generic "refer to workflow.md"
113
+ * - no_task pseudo-status (id === null) → header omits task info
114
+ */
115
+ function buildBreadcrumb(id, status, templates) {
116
+ let body = templates[status]
117
+ if (body === undefined) {
118
+ body = "Refer to workflow.md for current step."
119
+ }
120
+ const header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
121
+ return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
122
+ }
123
+
124
+ // OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
125
+ export default async ({ directory }) => {
126
+ const ctx = new TrellisContext(directory)
127
+ debugLog("workflow-state", "Plugin loaded, directory:", directory)
128
+
129
+ return {
130
+ // chat.message fires on every user message. Inject breadcrumb in-place
131
+ // so it persists in conversation history.
132
+ "chat.message": async (input, output) => {
133
+ try {
134
+ if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
135
+ return
136
+ }
137
+ if (!ctx.isTrellisProject()) {
138
+ return
139
+ }
140
+ const templates = loadBreadcrumbs(directory)
141
+ const task = getActiveTask(ctx)
142
+ const breadcrumb = task
143
+ ? buildBreadcrumb(task.id, task.status, templates)
144
+ : buildBreadcrumb(null, "no_task", templates)
145
+
146
+ const parts = output?.parts || []
147
+ const textPartIndex = parts.findIndex(
148
+ p => p.type === "text" && p.text !== undefined,
149
+ )
150
+ if (textPartIndex !== -1) {
151
+ const originalText = parts[textPartIndex].text || ""
152
+ parts[textPartIndex].text = `${breadcrumb}\n\n${originalText}`
153
+ } else {
154
+ parts.unshift({ type: "text", text: breadcrumb })
155
+ }
156
+ debugLog(
157
+ "workflow-state",
158
+ "Injected breadcrumb for task",
159
+ task.id,
160
+ "status",
161
+ task.status,
162
+ )
163
+ } catch (error) {
164
+ debugLog(
165
+ "workflow-state",
166
+ "Error in chat.message:",
167
+ error instanceof Error ? error.message : String(error),
168
+ )
169
+ }
170
+ },
171
+ }
172
+ }
@@ -50,7 +50,7 @@ function getTaskStatus(ctx) {
50
50
  }
51
51
 
52
52
  let hasContext = false
53
- for (const jsonlName of ["implement.jsonl", "check.jsonl", "spec.jsonl"]) {
53
+ for (const jsonlName of ["implement.jsonl", "check.jsonl"]) {
54
54
  const jsonlPath = join(taskDir, jsonlName)
55
55
  if (existsSync(jsonlPath)) {
56
56
  try {
@@ -227,29 +227,74 @@ Read and follow all instructions below carefully.
227
227
  }
228
228
  }
229
229
 
230
- // 3. Workflow Guide (ToC only lazy-load the full file on demand)
230
+ // 3. Workflow Guide TOC + Phase Index + Phase 1/2/3 step details.
231
+ // Meta sections (Core Principles / Trellis System / Breadcrumbs) are NOT
232
+ // injected: Core Principles is short prose; Trellis System duplicates
233
+ // commands in step bodies; Breadcrumbs are consumed by UserPromptSubmit hook.
231
234
  const workflowContent = ctx.readProjectFile(".trellis/workflow.md")
232
235
  if (workflowContent) {
233
- const tocLines = [
236
+ const allLines = workflowContent.split("\n")
237
+ const overviewLines = [
234
238
  "# Development Workflow — Section Index",
235
239
  "Full guide: .trellis/workflow.md (read on demand)",
236
240
  "",
241
+ "## Table of Contents",
237
242
  ]
238
- for (const line of workflowContent.split("\n")) {
239
- if (line.startsWith("## ")) tocLines.push(line)
243
+ for (const line of allLines) {
244
+ if (line.startsWith("## ")) overviewLines.push(line)
240
245
  }
241
- tocLines.push("", "To read a section: use the Read tool on .trellis/workflow.md")
246
+ overviewLines.push("", "---", "")
247
+
248
+ // Extract range from "## Phase Index" up to (but excluding)
249
+ // "## Workflow State Breadcrumbs". Captures Phase Index + Phase 1/2/3.
250
+ let rangeStart = -1
251
+ let rangeEnd = allLines.length
252
+ for (let i = 0; i < allLines.length; i++) {
253
+ const stripped = allLines[i].trim()
254
+ if (rangeStart === -1 && stripped === "## Phase Index") {
255
+ rangeStart = i
256
+ } else if (rangeStart !== -1 && stripped === "## Workflow State Breadcrumbs") {
257
+ rangeEnd = i
258
+ break
259
+ }
260
+ }
261
+ if (rangeStart !== -1) {
262
+ overviewLines.push(...allLines.slice(rangeStart, rangeEnd))
263
+ }
264
+
242
265
  parts.push("<workflow>")
243
- parts.push(tocLines.join("\n"))
266
+ parts.push(overviewLines.join("\n").trimEnd())
244
267
  parts.push("</workflow>")
245
268
  }
246
269
 
247
- // 4. Guidelines Index (dynamic discovery, matching Claude's session-start.py)
270
+ // 4. Guidelines paths-only for most indexes; guides/ inlined (cross-package,
271
+ // broadly useful). Sub-agents get their specific specs via jsonl injection —
272
+ // main agent reads paths on demand when editing code directly.
248
273
  parts.push("<guidelines>")
249
- parts.push("**Note**: The guidelines below are index files — they list available guideline documents and their locations.")
250
- parts.push("During actual development, you MUST read the specific guideline files listed in each index's Pre-Development Checklist.\n")
274
+ parts.push(
275
+ "Project spec indexes are listed by path below. Each index contains a " +
276
+ "**Pre-Development Checklist** listing the specific guideline files to " +
277
+ "read before coding.\n\n" +
278
+ "- If you're spawning an implement/check sub-agent, context is injected " +
279
+ "automatically via `{task}/implement.jsonl` / `check.jsonl`. You do NOT " +
280
+ "need to read these indexes yourself.\n" +
281
+ "- If you're editing code directly in the main session, Read the relevant " +
282
+ "index(es) on-demand and follow their Pre-Dev Checklist.\n"
283
+ )
251
284
 
252
285
  const specDir = join(directory, ".trellis", "spec")
286
+
287
+ // guides/ inlined
288
+ const guidesIndex = join(specDir, "guides", "index.md")
289
+ if (existsSync(guidesIndex)) {
290
+ const content = ctx.readFile(guidesIndex)
291
+ if (content) {
292
+ parts.push(`## guides (inlined — cross-package thinking guides)\n${content}\n`)
293
+ }
294
+ }
295
+
296
+ // Other indexes — paths only
297
+ const paths = []
253
298
  if (existsSync(specDir)) {
254
299
  try {
255
300
  const subs = readdirSync(specDir).filter(name => {
@@ -262,27 +307,13 @@ Read and follow all instructions below carefully.
262
307
  }).sort()
263
308
 
264
309
  for (const sub of subs) {
265
- if (sub === "guides") {
266
- const indexFile = join(specDir, sub, "index.md")
267
- if (existsSync(indexFile)) {
268
- const content = ctx.readFile(indexFile)
269
- if (content) {
270
- parts.push(`## ${sub}\n${content}\n`)
271
- }
272
- }
273
- continue
274
- }
310
+ if (sub === "guides") continue // already inlined above
275
311
 
276
312
  const indexFile = join(specDir, sub, "index.md")
277
313
  if (existsSync(indexFile)) {
278
- const content = ctx.readFile(indexFile)
279
- if (content) {
280
- parts.push(`## ${sub}\n${content}\n`)
281
- }
314
+ paths.push(`.trellis/spec/${sub}/index.md`)
282
315
  } else {
283
- if (allowedPkgs !== null && !allowedPkgs.has(sub)) {
284
- continue
285
- }
316
+ if (allowedPkgs !== null && !allowedPkgs.has(sub)) continue
286
317
  try {
287
318
  const nested = readdirSync(join(specDir, sub)).filter(name => {
288
319
  try {
@@ -291,14 +322,10 @@ Read and follow all instructions below carefully.
291
322
  return false
292
323
  }
293
324
  }).sort()
294
-
295
325
  for (const layer of nested) {
296
326
  const nestedIndex = join(specDir, sub, layer, "index.md")
297
327
  if (existsSync(nestedIndex)) {
298
- const content = ctx.readFile(nestedIndex)
299
- if (content) {
300
- parts.push(`## ${sub}/${layer}\n${content}\n`)
301
- }
328
+ paths.push(`.trellis/spec/${sub}/${layer}/index.md`)
302
329
  }
303
330
  }
304
331
  } catch {
@@ -311,6 +338,18 @@ Read and follow all instructions below carefully.
311
338
  }
312
339
  }
313
340
 
341
+ if (paths.length > 0) {
342
+ parts.push("## Available spec indexes (read on demand)")
343
+ for (const p of paths) {
344
+ parts.push(`- ${p}`)
345
+ }
346
+ parts.push("")
347
+ }
348
+
349
+ parts.push(
350
+ "Discover more via: " +
351
+ "`python3 ./.trellis/scripts/get_context.py --mode packages`"
352
+ )
314
353
  parts.push("</guidelines>")
315
354
 
316
355
  // 6. Task status
@@ -393,13 +432,12 @@ async function hasPersistedInjectedContext(client, directory, sessionID) {
393
432
  }
394
433
  }
395
434
 
396
- export default {
397
- id: "trellis.session-start",
398
- server: async ({ directory, client }) => {
399
- const ctx = new TrellisContext(directory)
400
- debugLog("session", "Plugin loaded, directory:", directory)
435
+ // OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
436
+ export default async ({ directory, client }) => {
437
+ const ctx = new TrellisContext(directory)
438
+ debugLog("session", "Plugin loaded, directory:", directory)
401
439
 
402
- return {
440
+ return {
403
441
  // Clear in-memory dedupe after compaction so context can be re-injected.
404
442
  event: ({ event }) => {
405
443
  try {
@@ -472,6 +510,5 @@ export default {
472
510
  debugLog("session", "Error in chat.message:", error.message, error.stack)
473
511
  }
474
512
  }
475
- }
476
513
  }
477
514
  }