@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,150 +0,0 @@
1
- #!/bin/bash
2
- # =============================================================================
3
- # Phase Management Utilities
4
- # =============================================================================
5
- # Centralized phase tracking for multi-agent pipeline
6
- #
7
- # Usage:
8
- # source common/phase.sh
9
- #
10
- # get_current_phase "$task_json" # Returns current phase number
11
- # get_total_phases "$task_json" # Returns total phase count
12
- # get_phase_action "$task_json" "$phase" # Returns action name for phase
13
- # get_phase_info "$task_json" # Returns "N/M (action)" format
14
- # set_phase "$task_json" "$phase" # Sets current_phase
15
- # advance_phase "$task_json" # Advances to next phase
16
- # get_phase_for_action "$task_json" "$action" # Returns phase number for action
17
- # =============================================================================
18
-
19
- # Get current phase number
20
- get_current_phase() {
21
- local task_json="$1"
22
- if [ ! -f "$task_json" ]; then
23
- echo "0"
24
- return
25
- fi
26
- jq -r '.current_phase // 0' "$task_json"
27
- }
28
-
29
- # Get total number of phases
30
- get_total_phases() {
31
- local task_json="$1"
32
- if [ ! -f "$task_json" ]; then
33
- echo "0"
34
- return
35
- fi
36
- jq -r '.next_action | length // 0' "$task_json"
37
- }
38
-
39
- # Get action name for a specific phase
40
- get_phase_action() {
41
- local task_json="$1"
42
- local phase="$2"
43
- if [ ! -f "$task_json" ]; then
44
- echo "unknown"
45
- return
46
- fi
47
- jq -r --argjson phase "$phase" '.next_action[] | select(.phase == $phase) | .action // "unknown"' "$task_json"
48
- }
49
-
50
- # Get formatted phase info: "N/M (action)"
51
- get_phase_info() {
52
- local task_json="$1"
53
- if [ ! -f "$task_json" ]; then
54
- echo "N/A"
55
- return
56
- fi
57
-
58
- local current_phase=$(get_current_phase "$task_json")
59
- local total_phases=$(get_total_phases "$task_json")
60
- local action_name=$(get_phase_action "$task_json" "$current_phase")
61
-
62
- if [ "$current_phase" = "0" ] || [ "$current_phase" = "null" ]; then
63
- echo "0/${total_phases} (pending)"
64
- else
65
- echo "${current_phase}/${total_phases} (${action_name})"
66
- fi
67
- }
68
-
69
- # Set current phase to a specific value
70
- set_phase() {
71
- local task_json="$1"
72
- local phase="$2"
73
-
74
- if [ ! -f "$task_json" ]; then
75
- echo "Error: task.json not found: $task_json" >&2
76
- return 1
77
- fi
78
-
79
- jq --argjson phase "$phase" '.current_phase = $phase' "$task_json" > "${task_json}.tmp"
80
- mv "${task_json}.tmp" "$task_json"
81
- }
82
-
83
- # Advance to next phase
84
- advance_phase() {
85
- local task_json="$1"
86
-
87
- if [ ! -f "$task_json" ]; then
88
- echo "Error: task.json not found: $task_json" >&2
89
- return 1
90
- fi
91
-
92
- local current=$(get_current_phase "$task_json")
93
- local total=$(get_total_phases "$task_json")
94
- local next=$((current + 1))
95
-
96
- if [ "$next" -gt "$total" ]; then
97
- echo "Warning: Already at final phase" >&2
98
- return 0
99
- fi
100
-
101
- set_phase "$task_json" "$next"
102
- }
103
-
104
- # Get phase number for a specific action name
105
- get_phase_for_action() {
106
- local task_json="$1"
107
- local action="$2"
108
-
109
- if [ ! -f "$task_json" ]; then
110
- echo "0"
111
- return
112
- fi
113
-
114
- jq -r --arg action "$action" '.next_action[] | select(.action == $action) | .phase // 0' "$task_json"
115
- }
116
-
117
- # Map subagent type to action name
118
- # Used by hooks to determine which action a subagent corresponds to
119
- map_subagent_to_action() {
120
- local subagent_type="$1"
121
-
122
- case "$subagent_type" in
123
- implement) echo "implement" ;;
124
- check) echo "check" ;;
125
- debug) echo "debug" ;;
126
- research) echo "research" ;;
127
- # finish uses check agent but is a different action
128
- *) echo "$subagent_type" ;;
129
- esac
130
- }
131
-
132
- # Check if a phase is completed (current_phase > phase)
133
- is_phase_completed() {
134
- local task_json="$1"
135
- local phase="$2"
136
-
137
- local current=$(get_current_phase "$task_json")
138
- [ "$current" -gt "$phase" ]
139
- }
140
-
141
- # Check if we're at a specific action
142
- is_current_action() {
143
- local task_json="$1"
144
- local action="$2"
145
-
146
- local current=$(get_current_phase "$task_json")
147
- local action_phase=$(get_phase_for_action "$task_json" "$action")
148
-
149
- [ "$current" = "$action_phase" ]
150
- }
@@ -1,247 +0,0 @@
1
- #!/bin/bash
2
- # Registry utility functions for multi-agent pipeline
3
- #
4
- # Usage: source this file in other scripts
5
- # source "$(dirname "$0")/common/registry.sh"
6
- #
7
- # Provides:
8
- # registry_get_file - Get registry file path
9
- # registry_get_agent_by_id - Find agent by ID
10
- # registry_get_agent_by_worktree - Find agent by worktree path
11
- # registry_get_task_dir - Get task dir for a worktree
12
- # registry_remove_by_id - Remove agent by ID
13
- # registry_remove_by_worktree - Remove agent by worktree path
14
- # registry_add_agent - Add agent to registry
15
-
16
- # Ensure dependencies are loaded
17
- if ! type get_repo_root &>/dev/null; then
18
- echo "Error: paths.sh must be sourced before registry.sh" >&2
19
- exit 1
20
- fi
21
-
22
- if ! type get_agents_dir &>/dev/null; then
23
- echo "Error: developer.sh must be sourced before registry.sh" >&2
24
- exit 1
25
- fi
26
-
27
- # =============================================================================
28
- # Registry File Access
29
- # =============================================================================
30
-
31
- # Get registry file path
32
- # Args: [repo_root]
33
- # Returns: path to registry.json
34
- registry_get_file() {
35
- local repo_root="${1:-$(get_repo_root)}"
36
- local agents_dir=$(get_agents_dir "$repo_root")
37
- echo "${agents_dir}/registry.json"
38
- }
39
-
40
- # Ensure registry file exists with valid structure
41
- # Args: [repo_root]
42
- _ensure_registry() {
43
- local repo_root="${1:-$(get_repo_root)}"
44
- local registry_file=$(registry_get_file "$repo_root")
45
- local agents_dir=$(dirname "$registry_file")
46
-
47
- mkdir -p "$agents_dir"
48
-
49
- if [[ ! -f "$registry_file" ]]; then
50
- echo '{"agents":[]}' > "$registry_file"
51
- fi
52
- }
53
-
54
- # =============================================================================
55
- # Agent Lookup
56
- # =============================================================================
57
-
58
- # Get agent by ID
59
- # Args: agent_id, [repo_root]
60
- # Returns: agent JSON object (compact), or empty if not found
61
- registry_get_agent_by_id() {
62
- local agent_id="$1"
63
- local repo_root="${2:-$(get_repo_root)}"
64
- local registry_file=$(registry_get_file "$repo_root")
65
-
66
- if [[ ! -f "$registry_file" ]]; then
67
- return 1
68
- fi
69
-
70
- local agent=$(jq -c --arg id "$agent_id" '.agents[] | select(.id == $id)' "$registry_file" 2>/dev/null)
71
-
72
- if [[ -n "$agent" ]] && [[ "$agent" != "null" ]]; then
73
- echo "$agent"
74
- return 0
75
- fi
76
-
77
- return 1
78
- }
79
-
80
- # Get agent by worktree path
81
- # Args: worktree_path, [repo_root]
82
- # Returns: agent JSON object (compact), or empty if not found
83
- registry_get_agent_by_worktree() {
84
- local worktree_path="$1"
85
- local repo_root="${2:-$(get_repo_root)}"
86
- local registry_file=$(registry_get_file "$repo_root")
87
-
88
- if [[ ! -f "$registry_file" ]]; then
89
- return 1
90
- fi
91
-
92
- local agent=$(jq -c --arg path "$worktree_path" '.agents[] | select(.worktree_path == $path)' "$registry_file" 2>/dev/null)
93
-
94
- if [[ -n "$agent" ]] && [[ "$agent" != "null" ]]; then
95
- echo "$agent"
96
- return 0
97
- fi
98
-
99
- return 1
100
- }
101
-
102
- # Search agent by ID or task_dir containing search term
103
- # Args: search_term, [repo_root]
104
- # Returns: first matching agent JSON object (compact), or empty if not found
105
- registry_search_agent() {
106
- local search="$1"
107
- local repo_root="${2:-$(get_repo_root)}"
108
- local registry_file=$(registry_get_file "$repo_root")
109
-
110
- if [[ ! -f "$registry_file" ]]; then
111
- return 1
112
- fi
113
-
114
- local agent=$(jq -c --arg search "$search" \
115
- '[.agents[] | select(.id == $search or (.task_dir | contains($search)))] | first' \
116
- "$registry_file" 2>/dev/null)
117
-
118
- if [[ -n "$agent" ]] && [[ "$agent" != "null" ]]; then
119
- echo "$agent"
120
- return 0
121
- fi
122
-
123
- return 1
124
- }
125
-
126
- # Get task directory for a worktree
127
- # Args: worktree_path, [repo_root]
128
- # Returns: task_dir value, or empty if not found
129
- registry_get_task_dir() {
130
- local worktree_path="$1"
131
- local repo_root="${2:-$(get_repo_root)}"
132
- local registry_file=$(registry_get_file "$repo_root")
133
-
134
- if [[ ! -f "$registry_file" ]]; then
135
- return 1
136
- fi
137
-
138
- local task_dir=$(jq -r --arg path "$worktree_path" \
139
- '.agents[] | select(.worktree_path == $path) | .task_dir' \
140
- "$registry_file" 2>/dev/null)
141
-
142
- if [[ -n "$task_dir" ]] && [[ "$task_dir" != "null" ]]; then
143
- echo "$task_dir"
144
- return 0
145
- fi
146
-
147
- return 1
148
- }
149
-
150
- # =============================================================================
151
- # Agent Modification
152
- # =============================================================================
153
-
154
- # Remove agent by ID
155
- # Args: agent_id, [repo_root]
156
- # Returns: 0 on success
157
- registry_remove_by_id() {
158
- local agent_id="$1"
159
- local repo_root="${2:-$(get_repo_root)}"
160
- local registry_file=$(registry_get_file "$repo_root")
161
-
162
- if [[ ! -f "$registry_file" ]]; then
163
- return 0
164
- fi
165
-
166
- local updated=$(jq --arg id "$agent_id" \
167
- '.agents = [.agents[] | select(.id != $id)]' \
168
- "$registry_file")
169
-
170
- echo "$updated" | jq '.' > "$registry_file"
171
- return 0
172
- }
173
-
174
- # Remove agent by worktree path
175
- # Args: worktree_path, [repo_root]
176
- # Returns: 0 on success
177
- registry_remove_by_worktree() {
178
- local worktree_path="$1"
179
- local repo_root="${2:-$(get_repo_root)}"
180
- local registry_file=$(registry_get_file "$repo_root")
181
-
182
- if [[ ! -f "$registry_file" ]]; then
183
- return 0
184
- fi
185
-
186
- local updated=$(jq --arg path "$worktree_path" \
187
- '.agents = [.agents[] | select(.worktree_path != $path)]' \
188
- "$registry_file")
189
-
190
- echo "$updated" | jq '.' > "$registry_file"
191
- return 0
192
- }
193
-
194
- # Add agent to registry (replaces if same ID exists)
195
- # Args: agent_id, worktree_path, pid, task_dir, [repo_root]
196
- # Returns: 0 on success
197
- registry_add_agent() {
198
- local agent_id="$1"
199
- local worktree_path="$2"
200
- local pid="$3"
201
- local task_dir="$4"
202
- local repo_root="${5:-$(get_repo_root)}"
203
-
204
- _ensure_registry "$repo_root"
205
- local registry_file=$(registry_get_file "$repo_root")
206
-
207
- local started_at=$(date -Iseconds)
208
-
209
- # Remove existing agent with same ID
210
- local registry=$(jq --arg id "$agent_id" \
211
- '.agents = [.agents[] | select(.id != $id)]' \
212
- "$registry_file")
213
-
214
- # Create new agent record
215
- local new_agent=$(jq -n \
216
- --arg id "$agent_id" \
217
- --arg worktree "$worktree_path" \
218
- --arg pid "$pid" \
219
- --arg started_at "$started_at" \
220
- --arg task_dir "$task_dir" \
221
- '{
222
- id: $id,
223
- worktree_path: $worktree,
224
- pid: ($pid | tonumber),
225
- started_at: $started_at,
226
- task_dir: $task_dir
227
- }')
228
-
229
- # Add to registry
230
- echo "$registry" | jq --argjson agent "$new_agent" '.agents += [$agent]' > "$registry_file"
231
- return 0
232
- }
233
-
234
- # List all agents
235
- # Args: [repo_root]
236
- # Returns: JSON array of agents
237
- registry_list_agents() {
238
- local repo_root="${1:-$(get_repo_root)}"
239
- local registry_file=$(registry_get_file "$repo_root")
240
-
241
- if [[ ! -f "$registry_file" ]]; then
242
- echo '[]'
243
- return 0
244
- fi
245
-
246
- jq '.agents' "$registry_file"
247
- }
@@ -1,142 +0,0 @@
1
- #!/bin/bash
2
- # Task queue utility functions
3
- #
4
- # Usage: source this file in other scripts
5
- # source "$(dirname "$0")/common/task-queue.sh"
6
- #
7
- # Provides:
8
- # list_pending_tasks - List tasks with pending status
9
- # get_task_stats - Get P0/P1/P2/P3 counts
10
-
11
- # Ensure paths.sh is loaded
12
- if ! type get_repo_root &>/dev/null; then
13
- echo "Error: paths.sh must be sourced before task-queue.sh" >&2
14
- exit 1
15
- fi
16
-
17
- # =============================================================================
18
- # Public Functions
19
- # =============================================================================
20
-
21
- # List tasks by status
22
- # Args: [filter_status]
23
- # Output: formatted list to stdout
24
- list_tasks_by_status() {
25
- local filter_status="${1:-}"
26
- local repo_root="${2:-$(get_repo_root)}"
27
-
28
- local tasks_dir=$(get_tasks_dir "$repo_root")
29
-
30
- if [[ ! -d "$tasks_dir" ]]; then
31
- return 0
32
- fi
33
-
34
- for d in "$tasks_dir"/*/; do
35
- if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
36
- local task_json="$d/$FILE_TASK_JSON"
37
- if [[ -f "$task_json" ]]; then
38
- local id=$(jq -r '.id' "$task_json")
39
- local title=$(jq -r '.title // .name' "$task_json")
40
- local priority=$(jq -r '.priority // "P2"' "$task_json")
41
- local status=$(jq -r '.status // "planning"' "$task_json")
42
- local assignee=$(jq -r '.assignee // "-"' "$task_json")
43
-
44
- # Apply filter
45
- if [[ -n "$filter_status" ]] && [[ "$status" != "$filter_status" ]]; then
46
- continue
47
- fi
48
-
49
- echo "$priority|$id|$title|$status|$assignee"
50
- fi
51
- fi
52
- done
53
- }
54
-
55
- # List pending tasks
56
- list_pending_tasks() {
57
- list_tasks_by_status "planning" "$@"
58
- }
59
-
60
- # List tasks assigned to a specific developer
61
- # Args: developer_name, [filter_status], [repo_root]
62
- # Output: formatted list to stdout
63
- list_tasks_by_assignee() {
64
- local assignee="$1"
65
- local filter_status="${2:-}"
66
- local repo_root="${3:-$(get_repo_root)}"
67
-
68
- local tasks_dir=$(get_tasks_dir "$repo_root")
69
-
70
- if [[ ! -d "$tasks_dir" ]]; then
71
- return 0
72
- fi
73
-
74
- for d in "$tasks_dir"/*/; do
75
- if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
76
- local task_json="$d/$FILE_TASK_JSON"
77
- if [[ -f "$task_json" ]]; then
78
- local id=$(jq -r '.id' "$task_json")
79
- local title=$(jq -r '.title // .name' "$task_json")
80
- local priority=$(jq -r '.priority // "P2"' "$task_json")
81
- local status=$(jq -r '.status // "planning"' "$task_json")
82
- local task_assignee=$(jq -r '.assignee // "-"' "$task_json")
83
-
84
- # Apply assignee filter
85
- if [[ "$task_assignee" != "$assignee" ]]; then
86
- continue
87
- fi
88
-
89
- # Apply status filter
90
- if [[ -n "$filter_status" ]] && [[ "$status" != "$filter_status" ]]; then
91
- continue
92
- fi
93
-
94
- echo "$priority|$id|$title|$status|$task_assignee"
95
- fi
96
- fi
97
- done
98
- }
99
-
100
- # List my tasks (current developer)
101
- # Args: [filter_status], [repo_root]
102
- list_my_tasks() {
103
- local filter_status="${1:-}"
104
- local repo_root="${2:-$(get_repo_root)}"
105
- local developer=$(get_developer "$repo_root")
106
-
107
- if [[ -z "$developer" ]]; then
108
- echo "Error: Developer not set" >&2
109
- return 1
110
- fi
111
-
112
- list_tasks_by_assignee "$developer" "$filter_status" "$repo_root"
113
- }
114
-
115
- # Get task statistics
116
- # Output: "P0:N P1:N P2:N P3:N Total:N"
117
- get_task_stats() {
118
- local repo_root="${1:-$(get_repo_root)}"
119
- local tasks_dir=$(get_tasks_dir "$repo_root")
120
-
121
- local p0=0 p1=0 p2=0 p3=0 total=0
122
-
123
- if [[ -d "$tasks_dir" ]]; then
124
- for d in "$tasks_dir"/*/; do
125
- if [[ -d "$d" ]] && [[ "$(basename "$d")" != "archive" ]]; then
126
- local task_json="$d/$FILE_TASK_JSON"
127
- if [[ -f "$task_json" ]]; then
128
- local priority=$(jq -r '.priority // "P2"' "$task_json" 2>/dev/null)
129
- case "$priority" in
130
- P0) ((p0++)) ;;
131
- P1) ((p1++)) ;;
132
- P2) ((p2++)) ;;
133
- P3) ((p3++)) ;;
134
- esac
135
- ((total++))
136
- fi
137
- fi
138
- done
139
- fi
140
-
141
- echo "P0:$p0 P1:$p1 P2:$p2 P3:$p3 Total:$total"
142
- }
@@ -1,151 +0,0 @@
1
- #!/bin/bash
2
- # Task utility functions
3
- #
4
- # Usage: source this file in other scripts
5
- # source "$(dirname "$0")/common/task-utils.sh"
6
- #
7
- # Provides:
8
- # is_safe_task_path - Validate task path is safe to operate on
9
- # find_task_by_name - Find task directory by name
10
- # archive_task_dir - Archive task to monthly directory
11
-
12
- # Ensure dependencies are loaded
13
- if ! type get_repo_root &>/dev/null; then
14
- echo "Error: paths.sh must be sourced before task-utils.sh" >&2
15
- exit 1
16
- fi
17
-
18
- # =============================================================================
19
- # Path Safety
20
- # =============================================================================
21
-
22
- # Check if a relative task path is safe to operate on
23
- # Args: task_path (relative), repo_root
24
- # Returns: 0 if safe, 1 if dangerous
25
- # Outputs: error message to stderr if unsafe
26
- is_safe_task_path() {
27
- local task_path="$1"
28
- local repo_root="${2:-$(get_repo_root)}"
29
-
30
- # Check empty or null
31
- if [[ -z "$task_path" ]] || [[ "$task_path" = "null" ]]; then
32
- echo "Error: empty or null task path" >&2
33
- return 1
34
- fi
35
-
36
- # Reject absolute paths
37
- if [[ "$task_path" = /* ]]; then
38
- echo "Error: absolute path not allowed: $task_path" >&2
39
- return 1
40
- fi
41
-
42
- # Reject ".", "..", paths starting with "./" or "../", or containing ".."
43
- if [[ "$task_path" = "." ]] || [[ "$task_path" = ".." ]] || \
44
- [[ "$task_path" = "./" ]] || [[ "$task_path" == ./* ]] || \
45
- [[ "$task_path" == *".."* ]]; then
46
- echo "Error: path traversal not allowed: $task_path" >&2
47
- return 1
48
- fi
49
-
50
- # Final check: ensure resolved path is not the repo root
51
- local abs_path="${repo_root}/${task_path}"
52
- if [[ -e "$abs_path" ]]; then
53
- local resolved=$(realpath "$abs_path" 2>/dev/null)
54
- local root_resolved=$(realpath "$repo_root" 2>/dev/null)
55
- if [[ "$resolved" = "$root_resolved" ]]; then
56
- echo "Error: path resolves to repo root: $task_path" >&2
57
- return 1
58
- fi
59
- fi
60
-
61
- return 0
62
- }
63
-
64
- # =============================================================================
65
- # Task Lookup
66
- # =============================================================================
67
-
68
- # Find task directory by name (exact or suffix match)
69
- # Args: task_name, tasks_dir
70
- # Returns: absolute path to task directory, or empty if not found
71
- find_task_by_name() {
72
- local task_name="$1"
73
- local tasks_dir="$2"
74
-
75
- if [[ -z "$task_name" ]] || [[ -z "$tasks_dir" ]]; then
76
- return 1
77
- fi
78
-
79
- # Try exact match first
80
- local task_dir=$(find "$tasks_dir" -maxdepth 1 -type d -name "${task_name}" 2>/dev/null | head -1)
81
-
82
- # Try suffix match (e.g., "my-task" matches "01-21-my-task")
83
- if [[ -z "$task_dir" ]]; then
84
- task_dir=$(find "$tasks_dir" -maxdepth 1 -type d -name "*-${task_name}" 2>/dev/null | head -1)
85
- fi
86
-
87
- if [[ -n "$task_dir" ]] && [[ -d "$task_dir" ]]; then
88
- echo "$task_dir"
89
- return 0
90
- fi
91
-
92
- return 1
93
- }
94
-
95
- # =============================================================================
96
- # Archive Operations
97
- # =============================================================================
98
-
99
- # Archive a task directory to archive/{YYYY-MM}/
100
- # Args: task_dir_abs, [repo_root]
101
- # Returns: 0 on success, 1 on error
102
- # Outputs: archive destination path
103
- archive_task_dir() {
104
- local task_dir_abs="$1"
105
- local repo_root="${2:-$(get_repo_root)}"
106
-
107
- if [[ ! -d "$task_dir_abs" ]]; then
108
- echo "Error: task directory not found: $task_dir_abs" >&2
109
- return 1
110
- fi
111
-
112
- # Get tasks directory (parent of the task)
113
- local tasks_dir=$(dirname "$task_dir_abs")
114
- local archive_dir="$tasks_dir/archive"
115
- local year_month=$(date +%Y-%m)
116
- local month_dir="$archive_dir/$year_month"
117
-
118
- # Create archive directory
119
- mkdir -p "$month_dir"
120
-
121
- # Move task to archive
122
- local task_name=$(basename "$task_dir_abs")
123
- mv "$task_dir_abs" "$month_dir/"
124
-
125
- # Output the destination
126
- echo "$month_dir/$task_name"
127
- return 0
128
- }
129
-
130
- # Complete archive workflow: archive directory
131
- # Args: task_dir_abs, [repo_root]
132
- # Returns: 0 on success
133
- # Outputs: lines with status info
134
- archive_task_complete() {
135
- local task_dir_abs="$1"
136
- local repo_root="${2:-$(get_repo_root)}"
137
-
138
- if [[ ! -d "$task_dir_abs" ]]; then
139
- echo "Error: task directory not found: $task_dir_abs" >&2
140
- return 1
141
- fi
142
-
143
- # Archive the directory
144
- local archive_dest
145
- if archive_dest=$(archive_task_dir "$task_dir_abs" "$repo_root"); then
146
- echo "archived_to:$archive_dest"
147
- return 0
148
- fi
149
-
150
- return 1
151
- }