@jahanxu/trellis 0.4.1

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 (422) hide show
  1. package/LICENSE +235 -0
  2. package/README.md +212 -0
  3. package/bin/trellis.js +3 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +97 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/commands/init.d.ts +21 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +527 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/update.d.ts +27 -0
  13. package/dist/commands/update.d.ts.map +1 -0
  14. package/dist/commands/update.js +1289 -0
  15. package/dist/commands/update.js.map +1 -0
  16. package/dist/configurators/antigravity.d.ts +8 -0
  17. package/dist/configurators/antigravity.d.ts.map +1 -0
  18. package/dist/configurators/antigravity.js +18 -0
  19. package/dist/configurators/antigravity.js.map +1 -0
  20. package/dist/configurators/claude.d.ts +32 -0
  21. package/dist/configurators/claude.d.ts.map +1 -0
  22. package/dist/configurators/claude.js +98 -0
  23. package/dist/configurators/claude.js.map +1 -0
  24. package/dist/configurators/codex.d.ts +8 -0
  25. package/dist/configurators/codex.d.ts.map +1 -0
  26. package/dist/configurators/codex.js +20 -0
  27. package/dist/configurators/codex.js.map +1 -0
  28. package/dist/configurators/cursor.d.ts +5 -0
  29. package/dist/configurators/cursor.d.ts.map +1 -0
  30. package/dist/configurators/cursor.js +52 -0
  31. package/dist/configurators/cursor.js.map +1 -0
  32. package/dist/configurators/gemini.d.ts +8 -0
  33. package/dist/configurators/gemini.d.ts.map +1 -0
  34. package/dist/configurators/gemini.js +52 -0
  35. package/dist/configurators/gemini.js.map +1 -0
  36. package/dist/configurators/iflow.d.ts +33 -0
  37. package/dist/configurators/iflow.d.ts.map +1 -0
  38. package/dist/configurators/iflow.js +99 -0
  39. package/dist/configurators/iflow.js.map +1 -0
  40. package/dist/configurators/index.d.ts +55 -0
  41. package/dist/configurators/index.d.ts.map +1 -0
  42. package/dist/configurators/index.js +220 -0
  43. package/dist/configurators/index.js.map +1 -0
  44. package/dist/configurators/kilo.d.ts +8 -0
  45. package/dist/configurators/kilo.d.ts.map +1 -0
  46. package/dist/configurators/kilo.js +51 -0
  47. package/dist/configurators/kilo.js.map +1 -0
  48. package/dist/configurators/kiro.d.ts +8 -0
  49. package/dist/configurators/kiro.d.ts.map +1 -0
  50. package/dist/configurators/kiro.js +20 -0
  51. package/dist/configurators/kiro.js.map +1 -0
  52. package/dist/configurators/opencode.d.ts +32 -0
  53. package/dist/configurators/opencode.d.ts.map +1 -0
  54. package/dist/configurators/opencode.js +92 -0
  55. package/dist/configurators/opencode.js.map +1 -0
  56. package/dist/configurators/shared.d.ts +12 -0
  57. package/dist/configurators/shared.d.ts.map +1 -0
  58. package/dist/configurators/shared.js +21 -0
  59. package/dist/configurators/shared.js.map +1 -0
  60. package/dist/configurators/workflow.d.ts +28 -0
  61. package/dist/configurators/workflow.d.ts.map +1 -0
  62. package/dist/configurators/workflow.js +134 -0
  63. package/dist/configurators/workflow.js.map +1 -0
  64. package/dist/constants/paths.d.ts +68 -0
  65. package/dist/constants/paths.d.ts.map +1 -0
  66. package/dist/constants/paths.js +77 -0
  67. package/dist/constants/paths.js.map +1 -0
  68. package/dist/constants/version.d.ts +9 -0
  69. package/dist/constants/version.d.ts.map +1 -0
  70. package/dist/constants/version.js +15 -0
  71. package/dist/constants/version.js.map +1 -0
  72. package/dist/index.d.ts +9 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +9 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/migrations/index.d.ts +54 -0
  77. package/dist/migrations/index.d.ts.map +1 -0
  78. package/dist/migrations/index.js +160 -0
  79. package/dist/migrations/index.js.map +1 -0
  80. package/dist/migrations/manifests/0.1.9.json +30 -0
  81. package/dist/migrations/manifests/0.2.0.json +49 -0
  82. package/dist/migrations/manifests/0.2.12.json +9 -0
  83. package/dist/migrations/manifests/0.2.13.json +9 -0
  84. package/dist/migrations/manifests/0.2.14.json +175 -0
  85. package/dist/migrations/manifests/0.2.15.json +33 -0
  86. package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
  87. package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
  88. package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
  89. package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
  90. package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
  91. package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
  92. package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
  93. package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
  94. package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
  95. package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
  96. package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
  97. package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
  98. package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
  99. package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
  100. package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
  101. package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
  102. package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
  103. package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
  104. package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
  105. package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
  106. package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
  107. package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
  108. package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
  109. package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
  110. package/dist/migrations/manifests/0.3.0.json +11 -0
  111. package/dist/templates/antigravity/index.d.ts +12 -0
  112. package/dist/templates/antigravity/index.d.ts.map +1 -0
  113. package/dist/templates/antigravity/index.js +29 -0
  114. package/dist/templates/antigravity/index.js.map +1 -0
  115. package/dist/templates/claude/agents/check.md +122 -0
  116. package/dist/templates/claude/agents/debug.md +106 -0
  117. package/dist/templates/claude/agents/dispatch.md +214 -0
  118. package/dist/templates/claude/agents/implement.md +96 -0
  119. package/dist/templates/claude/agents/plan.md +396 -0
  120. package/dist/templates/claude/agents/research.md +120 -0
  121. package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
  122. package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
  123. package/dist/templates/claude/commands/trellis/before-role-work.md +364 -0
  124. package/dist/templates/claude/commands/trellis/brainstorm.md +474 -0
  125. package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
  126. package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
  127. package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
  128. package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
  129. package/dist/templates/claude/commands/trellis/create-command.md +154 -0
  130. package/dist/templates/claude/commands/trellis/finish-work.md +153 -0
  131. package/dist/templates/claude/commands/trellis/handoff.md +445 -0
  132. package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
  133. package/dist/templates/claude/commands/trellis/onboard.md +358 -0
  134. package/dist/templates/claude/commands/trellis/parallel.md +193 -0
  135. package/dist/templates/claude/commands/trellis/pick-task.md +515 -0
  136. package/dist/templates/claude/commands/trellis/record-session.md +62 -0
  137. package/dist/templates/claude/commands/trellis/start.md +373 -0
  138. package/dist/templates/claude/commands/trellis/update-spec.md +354 -0
  139. package/dist/templates/claude/hooks/inject-subagent-context.py +873 -0
  140. package/dist/templates/claude/hooks/ralph-loop.py +388 -0
  141. package/dist/templates/claude/hooks/session-start.py +200 -0
  142. package/dist/templates/claude/index.d.ts +54 -0
  143. package/dist/templates/claude/index.d.ts.map +1 -0
  144. package/dist/templates/claude/index.js +85 -0
  145. package/dist/templates/claude/index.js.map +1 -0
  146. package/dist/templates/claude/settings.json +41 -0
  147. package/dist/templates/codex/index.d.ts +18 -0
  148. package/dist/templates/codex/index.d.ts.map +1 -0
  149. package/dist/templates/codex/index.js +40 -0
  150. package/dist/templates/codex/index.js.map +1 -0
  151. package/dist/templates/codex/skills/before-backend-dev/SKILL.md +18 -0
  152. package/dist/templates/codex/skills/before-frontend-dev/SKILL.md +18 -0
  153. package/dist/templates/codex/skills/brainstorm/SKILL.md +479 -0
  154. package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
  155. package/dist/templates/codex/skills/check-backend/SKILL.md +18 -0
  156. package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
  157. package/dist/templates/codex/skills/check-frontend/SKILL.md +18 -0
  158. package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
  159. package/dist/templates/codex/skills/finish-work/SKILL.md +148 -0
  160. package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
  161. package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
  162. package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
  163. package/dist/templates/codex/skills/start/SKILL.md +330 -0
  164. package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
  165. package/dist/templates/cursor/commands/trellis-before-backend-dev.md +13 -0
  166. package/dist/templates/cursor/commands/trellis-before-frontend-dev.md +13 -0
  167. package/dist/templates/cursor/commands/trellis-brainstorm.md +474 -0
  168. package/dist/templates/cursor/commands/trellis-break-loop.md +107 -0
  169. package/dist/templates/cursor/commands/trellis-check-backend.md +13 -0
  170. package/dist/templates/cursor/commands/trellis-check-cross-layer.md +153 -0
  171. package/dist/templates/cursor/commands/trellis-check-frontend.md +13 -0
  172. package/dist/templates/cursor/commands/trellis-create-command.md +154 -0
  173. package/dist/templates/cursor/commands/trellis-finish-work.md +143 -0
  174. package/dist/templates/cursor/commands/trellis-integrate-skill.md +219 -0
  175. package/dist/templates/cursor/commands/trellis-onboard.md +358 -0
  176. package/dist/templates/cursor/commands/trellis-record-session.md +62 -0
  177. package/dist/templates/cursor/commands/trellis-start.md +366 -0
  178. package/dist/templates/cursor/commands/trellis-update-spec.md +354 -0
  179. package/dist/templates/cursor/index.d.ts +24 -0
  180. package/dist/templates/cursor/index.d.ts.map +1 -0
  181. package/dist/templates/cursor/index.js +44 -0
  182. package/dist/templates/cursor/index.js.map +1 -0
  183. package/dist/templates/extract.d.ts +166 -0
  184. package/dist/templates/extract.d.ts.map +1 -0
  185. package/dist/templates/extract.js +296 -0
  186. package/dist/templates/extract.js.map +1 -0
  187. package/dist/templates/gemini/commands/trellis/before-backend-dev.toml +17 -0
  188. package/dist/templates/gemini/commands/trellis/before-frontend-dev.toml +17 -0
  189. package/dist/templates/gemini/commands/trellis/brainstorm.toml +420 -0
  190. package/dist/templates/gemini/commands/trellis/break-loop.toml +129 -0
  191. package/dist/templates/gemini/commands/trellis/check-backend.toml +17 -0
  192. package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +147 -0
  193. package/dist/templates/gemini/commands/trellis/check-frontend.toml +17 -0
  194. package/dist/templates/gemini/commands/trellis/create-command.toml +119 -0
  195. package/dist/templates/gemini/commands/trellis/finish-work.toml +133 -0
  196. package/dist/templates/gemini/commands/trellis/integrate-skill.toml +104 -0
  197. package/dist/templates/gemini/commands/trellis/onboard.toml +111 -0
  198. package/dist/templates/gemini/commands/trellis/record-session.toml +66 -0
  199. package/dist/templates/gemini/commands/trellis/start.toml +292 -0
  200. package/dist/templates/gemini/commands/trellis/update-spec.toml +132 -0
  201. package/dist/templates/gemini/index.d.ts +21 -0
  202. package/dist/templates/gemini/index.d.ts.map +1 -0
  203. package/dist/templates/gemini/index.js +44 -0
  204. package/dist/templates/gemini/index.js.map +1 -0
  205. package/dist/templates/iflow/agents/check.md +122 -0
  206. package/dist/templates/iflow/agents/debug.md +106 -0
  207. package/dist/templates/iflow/agents/dispatch.md +214 -0
  208. package/dist/templates/iflow/agents/implement.md +96 -0
  209. package/dist/templates/iflow/agents/plan.md +396 -0
  210. package/dist/templates/iflow/agents/research.md +120 -0
  211. package/dist/templates/iflow/commands/trellis/before-backend-dev.md +13 -0
  212. package/dist/templates/iflow/commands/trellis/before-frontend-dev.md +13 -0
  213. package/dist/templates/iflow/commands/trellis/brainstorm.md +474 -0
  214. package/dist/templates/iflow/commands/trellis/break-loop.md +125 -0
  215. package/dist/templates/iflow/commands/trellis/check-backend.md +13 -0
  216. package/dist/templates/iflow/commands/trellis/check-cross-layer.md +153 -0
  217. package/dist/templates/iflow/commands/trellis/check-frontend.md +13 -0
  218. package/dist/templates/iflow/commands/trellis/create-command.md +152 -0
  219. package/dist/templates/iflow/commands/trellis/finish-work.md +153 -0
  220. package/dist/templates/iflow/commands/trellis/integrate-skill.md +219 -0
  221. package/dist/templates/iflow/commands/trellis/onboard.md +358 -0
  222. package/dist/templates/iflow/commands/trellis/parallel.md +193 -0
  223. package/dist/templates/iflow/commands/trellis/record-session.md +62 -0
  224. package/dist/templates/iflow/commands/trellis/start.md +373 -0
  225. package/dist/templates/iflow/commands/trellis/update-spec.md +354 -0
  226. package/dist/templates/iflow/hooks/inject-subagent-context.py +788 -0
  227. package/dist/templates/iflow/hooks/ralph-loop.py +388 -0
  228. package/dist/templates/iflow/hooks/session-start.py +143 -0
  229. package/dist/templates/iflow/index.d.ts +54 -0
  230. package/dist/templates/iflow/index.d.ts.map +1 -0
  231. package/dist/templates/iflow/index.js +85 -0
  232. package/dist/templates/iflow/index.js.map +1 -0
  233. package/dist/templates/iflow/settings.json +40 -0
  234. package/dist/templates/kilo/commands/trellis/before-backend-dev.md +13 -0
  235. package/dist/templates/kilo/commands/trellis/before-frontend-dev.md +13 -0
  236. package/dist/templates/kilo/commands/trellis/brainstorm.md +474 -0
  237. package/dist/templates/kilo/commands/trellis/break-loop.md +125 -0
  238. package/dist/templates/kilo/commands/trellis/check-backend.md +13 -0
  239. package/dist/templates/kilo/commands/trellis/check-cross-layer.md +153 -0
  240. package/dist/templates/kilo/commands/trellis/check-frontend.md +13 -0
  241. package/dist/templates/kilo/commands/trellis/create-command.md +152 -0
  242. package/dist/templates/kilo/commands/trellis/finish-work.md +129 -0
  243. package/dist/templates/kilo/commands/trellis/integrate-skill.md +219 -0
  244. package/dist/templates/kilo/commands/trellis/onboard.md +358 -0
  245. package/dist/templates/kilo/commands/trellis/parallel.md +194 -0
  246. package/dist/templates/kilo/commands/trellis/record-session.md +62 -0
  247. package/dist/templates/kilo/commands/trellis/start.md +321 -0
  248. package/dist/templates/kilo/commands/trellis/update-spec.md +285 -0
  249. package/dist/templates/kilo/index.d.ts +16 -0
  250. package/dist/templates/kilo/index.d.ts.map +1 -0
  251. package/dist/templates/kilo/index.js +39 -0
  252. package/dist/templates/kilo/index.js.map +1 -0
  253. package/dist/templates/kiro/index.d.ts +18 -0
  254. package/dist/templates/kiro/index.d.ts.map +1 -0
  255. package/dist/templates/kiro/index.js +40 -0
  256. package/dist/templates/kiro/index.js.map +1 -0
  257. package/dist/templates/kiro/skills/before-backend-dev/SKILL.md +18 -0
  258. package/dist/templates/kiro/skills/before-frontend-dev/SKILL.md +18 -0
  259. package/dist/templates/kiro/skills/brainstorm/SKILL.md +479 -0
  260. package/dist/templates/kiro/skills/break-loop/SKILL.md +130 -0
  261. package/dist/templates/kiro/skills/check-backend/SKILL.md +18 -0
  262. package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +158 -0
  263. package/dist/templates/kiro/skills/check-frontend/SKILL.md +18 -0
  264. package/dist/templates/kiro/skills/create-command/SKILL.md +101 -0
  265. package/dist/templates/kiro/skills/finish-work/SKILL.md +148 -0
  266. package/dist/templates/kiro/skills/integrate-skill/SKILL.md +221 -0
  267. package/dist/templates/kiro/skills/onboard/SKILL.md +363 -0
  268. package/dist/templates/kiro/skills/record-session/SKILL.md +67 -0
  269. package/dist/templates/kiro/skills/start/SKILL.md +330 -0
  270. package/dist/templates/kiro/skills/update-spec/SKILL.md +335 -0
  271. package/dist/templates/markdown/agents.md +18 -0
  272. package/dist/templates/markdown/gitignore.txt +12 -0
  273. package/dist/templates/markdown/index.d.ts +27 -0
  274. package/dist/templates/markdown/index.d.ts.map +1 -0
  275. package/dist/templates/markdown/index.js +52 -0
  276. package/dist/templates/markdown/index.js.map +1 -0
  277. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  278. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  279. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  280. package/dist/templates/markdown/spec/backend/index.md +40 -0
  281. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  282. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  283. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  284. package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
  285. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  286. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  287. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  288. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  289. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  290. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  291. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  292. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
  293. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
  294. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
  295. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
  296. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
  297. package/dist/templates/markdown/spec/guides/index.md.txt +79 -0
  298. package/dist/templates/markdown/workspace-index.md +123 -0
  299. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  300. package/dist/templates/opencode/agents/check.md +146 -0
  301. package/dist/templates/opencode/agents/debug.md +129 -0
  302. package/dist/templates/opencode/agents/dispatch.md +223 -0
  303. package/dist/templates/opencode/agents/implement.md +120 -0
  304. package/dist/templates/opencode/agents/research.md +147 -0
  305. package/dist/templates/opencode/agents/trellis-plan.md +427 -0
  306. package/dist/templates/opencode/commands/trellis/before-backend-dev.md +13 -0
  307. package/dist/templates/opencode/commands/trellis/before-frontend-dev.md +13 -0
  308. package/dist/templates/opencode/commands/trellis/brainstorm.md +474 -0
  309. package/dist/templates/opencode/commands/trellis/break-loop.md +125 -0
  310. package/dist/templates/opencode/commands/trellis/check-backend.md +13 -0
  311. package/dist/templates/opencode/commands/trellis/check-cross-layer.md +153 -0
  312. package/dist/templates/opencode/commands/trellis/check-frontend.md +13 -0
  313. package/dist/templates/opencode/commands/trellis/create-command.md +154 -0
  314. package/dist/templates/opencode/commands/trellis/finish-work.md +144 -0
  315. package/dist/templates/opencode/commands/trellis/integrate-skill.md +219 -0
  316. package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
  317. package/dist/templates/opencode/commands/trellis/onboard.md +358 -0
  318. package/dist/templates/opencode/commands/trellis/parallel.md +194 -0
  319. package/dist/templates/opencode/commands/trellis/record-session.md +62 -0
  320. package/dist/templates/opencode/commands/trellis/start.md +338 -0
  321. package/dist/templates/opencode/commands/trellis/update-spec.md +354 -0
  322. package/dist/templates/opencode/lib/trellis-context.js +436 -0
  323. package/dist/templates/opencode/package.json +5 -0
  324. package/dist/templates/opencode/plugin/inject-subagent-context.js +538 -0
  325. package/dist/templates/opencode/plugin/session-start.js +192 -0
  326. package/dist/templates/trellis/VERSION +1 -0
  327. package/dist/templates/trellis/deliverables/README.md +51 -0
  328. package/dist/templates/trellis/gitignore.txt +29 -0
  329. package/dist/templates/trellis/index.d.ts +49 -0
  330. package/dist/templates/trellis/index.d.ts.map +1 -0
  331. package/dist/templates/trellis/index.js +92 -0
  332. package/dist/templates/trellis/index.js.map +1 -0
  333. package/dist/templates/trellis/paths.README.md +277 -0
  334. package/dist/templates/trellis/paths.yaml +41 -0
  335. package/dist/templates/trellis/pool/implementations.json +5 -0
  336. package/dist/templates/trellis/pool/prototypes.json +5 -0
  337. package/dist/templates/trellis/pool/requirements.json +5 -0
  338. package/dist/templates/trellis/scripts/__init__.py +5 -0
  339. package/dist/templates/trellis/scripts/add_session.py +391 -0
  340. package/dist/templates/trellis/scripts/common/__init__.py +80 -0
  341. package/dist/templates/trellis/scripts/common/cli_adapter.py +522 -0
  342. package/dist/templates/trellis/scripts/common/developer.py +189 -0
  343. package/dist/templates/trellis/scripts/common/git_context.py +383 -0
  344. package/dist/templates/trellis/scripts/common/paths.py +346 -0
  345. package/dist/templates/trellis/scripts/common/phase.py +253 -0
  346. package/dist/templates/trellis/scripts/common/project_paths.py +189 -0
  347. package/dist/templates/trellis/scripts/common/registry.py +365 -0
  348. package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
  349. package/dist/templates/trellis/scripts/common/task_utils.py +177 -0
  350. package/dist/templates/trellis/scripts/common/worktree.py +218 -0
  351. package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
  352. package/dist/templates/trellis/scripts/get_context.py +16 -0
  353. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  354. package/dist/templates/trellis/scripts/handoff_generator.py +380 -0
  355. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  356. package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
  357. package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
  358. package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
  359. package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
  360. package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
  361. package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
  362. package/dist/templates/trellis/scripts/pool.py +373 -0
  363. package/dist/templates/trellis/scripts/task.py +1162 -0
  364. package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
  365. package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
  366. package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
  367. package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
  368. package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
  369. package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
  370. package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
  371. package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
  372. package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
  373. package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
  374. package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
  375. package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
  376. package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
  377. package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
  378. package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
  379. package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
  380. package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
  381. package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
  382. package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
  383. package/dist/templates/trellis/spec/roles/designer/index.md +243 -0
  384. package/dist/templates/trellis/spec/roles/designer/mock-data-standards.md +481 -0
  385. package/dist/templates/trellis/spec/roles/designer/prototype-guidelines.md +429 -0
  386. package/dist/templates/trellis/spec/roles/frontend-impl/api-integration.md +565 -0
  387. package/dist/templates/trellis/spec/roles/frontend-impl/index.md +321 -0
  388. package/dist/templates/trellis/spec/roles/frontend-impl/state-management.md +599 -0
  389. package/dist/templates/trellis/spec/roles/pm/index.md +112 -0
  390. package/dist/templates/trellis/spec/roles/pm/prd-template.md +124 -0
  391. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  392. package/dist/templates/trellis/workflow.md +416 -0
  393. package/dist/templates/trellis/worktree.yaml +47 -0
  394. package/dist/types/ai-tools.d.ts +56 -0
  395. package/dist/types/ai-tools.d.ts.map +1 -0
  396. package/dist/types/ai-tools.js +103 -0
  397. package/dist/types/ai-tools.js.map +1 -0
  398. package/dist/types/migration.d.ts +86 -0
  399. package/dist/types/migration.d.ts.map +1 -0
  400. package/dist/types/migration.js +8 -0
  401. package/dist/types/migration.js.map +1 -0
  402. package/dist/utils/compare-versions.d.ts +12 -0
  403. package/dist/utils/compare-versions.d.ts.map +1 -0
  404. package/dist/utils/compare-versions.js +76 -0
  405. package/dist/utils/compare-versions.js.map +1 -0
  406. package/dist/utils/file-writer.d.ts +23 -0
  407. package/dist/utils/file-writer.d.ts.map +1 -0
  408. package/dist/utils/file-writer.js +140 -0
  409. package/dist/utils/file-writer.js.map +1 -0
  410. package/dist/utils/project-detector.d.ts +16 -0
  411. package/dist/utils/project-detector.d.ts.map +1 -0
  412. package/dist/utils/project-detector.js +186 -0
  413. package/dist/utils/project-detector.js.map +1 -0
  414. package/dist/utils/template-fetcher.d.ts +51 -0
  415. package/dist/utils/template-fetcher.d.ts.map +1 -0
  416. package/dist/utils/template-fetcher.js +174 -0
  417. package/dist/utils/template-fetcher.js.map +1 -0
  418. package/dist/utils/template-hash.d.ts +78 -0
  419. package/dist/utils/template-hash.d.ts.map +1 -0
  420. package/dist/utils/template-hash.js +233 -0
  421. package/dist/utils/template-hash.js.map +1 -0
  422. package/package.json +87 -0
@@ -0,0 +1,290 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Create Bootstrap Task for First-Time Setup.
4
+
5
+ Creates a guided task to help users fill in project guidelines
6
+ after initializing Trellis for the first time.
7
+
8
+ Usage:
9
+ python3 create_bootstrap.py [project-type]
10
+
11
+ Arguments:
12
+ project-type: frontend | backend | fullstack (default: fullstack)
13
+
14
+ Prerequisites:
15
+ - .trellis/.developer must exist (run init_developer.py first)
16
+
17
+ Creates:
18
+ .trellis/tasks/00-bootstrap-guidelines/
19
+ - task.json # Task metadata
20
+ - prd.md # Task description and guidance
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import json
26
+ import sys
27
+ from datetime import datetime
28
+ from pathlib import Path
29
+
30
+ from common.paths import (
31
+ DIR_WORKFLOW,
32
+ DIR_SCRIPTS,
33
+ DIR_TASKS,
34
+ get_repo_root,
35
+ get_developer,
36
+ get_tasks_dir,
37
+ set_current_task,
38
+ )
39
+
40
+
41
+ # =============================================================================
42
+ # Constants
43
+ # =============================================================================
44
+
45
+ TASK_NAME = "00-bootstrap-guidelines"
46
+
47
+
48
+ # =============================================================================
49
+ # PRD Content
50
+ # =============================================================================
51
+
52
+ def write_prd_header() -> str:
53
+ """Write PRD header section."""
54
+ return """# Bootstrap: Fill Project Development Guidelines
55
+
56
+ ## Purpose
57
+
58
+ Welcome to Trellis! This is your first task.
59
+
60
+ AI agents use `.trellis/spec/` to understand YOUR project's coding conventions.
61
+ **Empty templates = AI writes generic code that doesn't match your project style.**
62
+
63
+ Filling these guidelines is a one-time setup that pays off for every future AI session.
64
+
65
+ ---
66
+
67
+ ## Your Task
68
+
69
+ Fill in the guideline files based on your **existing codebase**.
70
+ """
71
+
72
+
73
+ def write_prd_backend_section() -> str:
74
+ """Write PRD backend section."""
75
+ return """
76
+
77
+ ### Backend Guidelines
78
+
79
+ | File | What to Document |
80
+ |------|------------------|
81
+ | `.trellis/spec/backend/directory-structure.md` | Where different file types go (routes, services, utils) |
82
+ | `.trellis/spec/backend/database-guidelines.md` | ORM, migrations, query patterns, naming conventions |
83
+ | `.trellis/spec/backend/error-handling.md` | How errors are caught, logged, and returned |
84
+ | `.trellis/spec/backend/logging-guidelines.md` | Log levels, format, what to log |
85
+ | `.trellis/spec/backend/quality-guidelines.md` | Code review standards, testing requirements |
86
+ """
87
+
88
+
89
+ def write_prd_frontend_section() -> str:
90
+ """Write PRD frontend section."""
91
+ return """
92
+
93
+ ### Frontend Guidelines
94
+
95
+ | File | What to Document |
96
+ |------|------------------|
97
+ | `.trellis/spec/frontend/directory-structure.md` | Component/page/hook organization |
98
+ | `.trellis/spec/frontend/component-guidelines.md` | Component patterns, props conventions |
99
+ | `.trellis/spec/frontend/hook-guidelines.md` | Custom hook naming, patterns |
100
+ | `.trellis/spec/frontend/state-management.md` | State library, patterns, what goes where |
101
+ | `.trellis/spec/frontend/type-safety.md` | TypeScript conventions, type organization |
102
+ | `.trellis/spec/frontend/quality-guidelines.md` | Linting, testing, accessibility |
103
+ """
104
+
105
+
106
+ def write_prd_footer() -> str:
107
+ """Write PRD footer section."""
108
+ return """
109
+
110
+ ### Thinking Guides (Optional)
111
+
112
+ The `.trellis/spec/guides/` directory contains thinking guides that are already
113
+ filled with general best practices. You can customize them for your project if needed.
114
+
115
+ ---
116
+
117
+ ## How to Fill Guidelines
118
+
119
+ ### Principle: Document Reality, Not Ideals
120
+
121
+ Write what your codebase **actually does**, not what you wish it did.
122
+ AI needs to match existing patterns, not introduce new ones.
123
+
124
+ ### Steps
125
+
126
+ 1. **Look at existing code** - Find 2-3 examples of each pattern
127
+ 2. **Document the pattern** - Describe what you see
128
+ 3. **Include file paths** - Reference real files as examples
129
+ 4. **List anti-patterns** - What does your team avoid?
130
+
131
+ ---
132
+
133
+ ## Tips for Using AI
134
+
135
+ Ask AI to help analyze your codebase:
136
+
137
+ - "Look at my codebase and document the patterns you see"
138
+ - "Analyze my code structure and summarize the conventions"
139
+ - "Find error handling patterns and document them"
140
+
141
+ The AI will read your code and help you document it.
142
+
143
+ ---
144
+
145
+ ## Completion Checklist
146
+
147
+ - [ ] Guidelines filled for your project type
148
+ - [ ] At least 2-3 real code examples in each guideline
149
+ - [ ] Anti-patterns documented
150
+
151
+ When done:
152
+
153
+ ```bash
154
+ python3 ./.trellis/scripts/task.py finish
155
+ python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Why This Matters
161
+
162
+ After completing this task:
163
+
164
+ 1. AI will write code that matches your project style
165
+ 2. Relevant `/trellis:before-*-dev` commands will inject real context
166
+ 3. `/trellis:check-*` commands will validate against your actual standards
167
+ 4. Future developers (human or AI) will onboard faster
168
+ """
169
+
170
+
171
+ def write_prd(task_dir: Path, project_type: str) -> None:
172
+ """Write prd.md file."""
173
+ content = write_prd_header()
174
+
175
+ if project_type == "frontend":
176
+ content += write_prd_frontend_section()
177
+ elif project_type == "backend":
178
+ content += write_prd_backend_section()
179
+ else: # fullstack
180
+ content += write_prd_backend_section()
181
+ content += write_prd_frontend_section()
182
+
183
+ content += write_prd_footer()
184
+
185
+ prd_file = task_dir / "prd.md"
186
+ prd_file.write_text(content, encoding="utf-8")
187
+
188
+
189
+ # =============================================================================
190
+ # Task JSON
191
+ # =============================================================================
192
+
193
+ def write_task_json(task_dir: Path, developer: str, project_type: str) -> None:
194
+ """Write task.json file."""
195
+ today = datetime.now().strftime("%Y-%m-%d")
196
+
197
+ # Generate subtasks and related files based on project type
198
+ if project_type == "frontend":
199
+ subtasks = [
200
+ {"name": "Fill frontend guidelines", "status": "pending"},
201
+ {"name": "Add code examples", "status": "pending"},
202
+ ]
203
+ related_files = [".trellis/spec/frontend/"]
204
+ elif project_type == "backend":
205
+ subtasks = [
206
+ {"name": "Fill backend guidelines", "status": "pending"},
207
+ {"name": "Add code examples", "status": "pending"},
208
+ ]
209
+ related_files = [".trellis/spec/backend/"]
210
+ else: # fullstack
211
+ subtasks = [
212
+ {"name": "Fill backend guidelines", "status": "pending"},
213
+ {"name": "Fill frontend guidelines", "status": "pending"},
214
+ {"name": "Add code examples", "status": "pending"},
215
+ ]
216
+ related_files = [".trellis/spec/backend/", ".trellis/spec/frontend/"]
217
+
218
+ task_data = {
219
+ "id": TASK_NAME,
220
+ "name": "Bootstrap Guidelines",
221
+ "description": "Fill in project development guidelines for AI agents",
222
+ "status": "in_progress",
223
+ "dev_type": "docs",
224
+ "priority": "P1",
225
+ "creator": developer,
226
+ "assignee": developer,
227
+ "createdAt": today,
228
+ "completedAt": None,
229
+ "commit": None,
230
+ "subtasks": subtasks,
231
+ "relatedFiles": related_files,
232
+ "notes": f"First-time setup task created by trellis init ({project_type} project)",
233
+ }
234
+
235
+ task_json = task_dir / "task.json"
236
+ task_json.write_text(json.dumps(task_data, indent=2, ensure_ascii=False), encoding="utf-8")
237
+
238
+
239
+ # =============================================================================
240
+ # Main
241
+ # =============================================================================
242
+
243
+ def main() -> int:
244
+ """Main entry point."""
245
+ # Parse project type argument
246
+ project_type = "fullstack"
247
+ if len(sys.argv) > 1:
248
+ project_type = sys.argv[1]
249
+
250
+ # Validate project type
251
+ if project_type not in ("frontend", "backend", "fullstack"):
252
+ print(f"Unknown project type: {project_type}, defaulting to fullstack")
253
+ project_type = "fullstack"
254
+
255
+ repo_root = get_repo_root()
256
+ developer = get_developer(repo_root)
257
+
258
+ # Check developer initialized
259
+ if not developer:
260
+ print("Error: Developer not initialized")
261
+ print(f"Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <your-name>")
262
+ return 1
263
+
264
+ tasks_dir = get_tasks_dir(repo_root)
265
+ task_dir = tasks_dir / TASK_NAME
266
+ relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{TASK_NAME}"
267
+
268
+ # Check if already exists
269
+ if task_dir.exists():
270
+ print(f"Bootstrap task already exists: {relative_path}")
271
+ return 0
272
+
273
+ # Create task directory
274
+ task_dir.mkdir(parents=True, exist_ok=True)
275
+
276
+ # Write files
277
+ write_task_json(task_dir, developer, project_type)
278
+ write_prd(task_dir, project_type)
279
+
280
+ # Set as current task
281
+ set_current_task(relative_path, repo_root)
282
+
283
+ # Silent output - init command handles user-facing messages
284
+ # Only output the task path for programmatic use
285
+ print(relative_path)
286
+ return 0
287
+
288
+
289
+ if __name__ == "__main__":
290
+ sys.exit(main())
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Get Session Context for AI Agent.
4
+
5
+ Usage:
6
+ python3 get_context.py Output context in text format
7
+ python3 get_context.py --json Output context in JSON format
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from common.git_context import main
13
+
14
+
15
+ if __name__ == "__main__":
16
+ main()
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Get current developer name.
4
+
5
+ This is a wrapper that uses common/paths.py
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import sys
11
+
12
+ from common.paths import get_developer
13
+
14
+
15
+ def main() -> None:
16
+ """CLI entry point."""
17
+ developer = get_developer()
18
+ if developer:
19
+ print(developer)
20
+ else:
21
+ print("Developer not initialized", file=sys.stderr)
22
+ sys.exit(1)
23
+
24
+
25
+ if __name__ == "__main__":
26
+ main()
@@ -0,0 +1,380 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ HANDOFF Document Generator
5
+
6
+ Generates role-specific handoff documents for three-role collaboration.
7
+
8
+ Templates:
9
+ - PM: Summarize PRD core requirements
10
+ - Designer: Design rationale + Mock data locations
11
+ - Frontend: Implementation details + API integration points
12
+ """
13
+
14
+ import sys
15
+ from datetime import datetime
16
+ from pathlib import Path
17
+ from typing import Optional
18
+
19
+ # Add parent directory to path for imports
20
+ sys.path.insert(0, str(Path(__file__).parent))
21
+
22
+ from common.paths import get_developer, get_repo_root
23
+
24
+ # =============================================================================
25
+ # Template Functions
26
+ # =============================================================================
27
+
28
+
29
+ def generate_handoff_pm(task_dir: Path, task_data: dict) -> str:
30
+ """Generate HANDOFF.md for PM role."""
31
+ task_id = task_data.get("id", "unknown")
32
+ title = task_data.get("title", "未命名任务")
33
+ developer = get_developer(get_repo_root()) or "unknown"
34
+ now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
35
+
36
+ # Read PRD content
37
+ prd_file = task_dir / "prd.md"
38
+ prd_content = ""
39
+ if prd_file.exists():
40
+ prd_content = prd_file.read_text(encoding="utf-8")
41
+
42
+ template = f"""# {title} - 需求交接文档
43
+
44
+ ## 📋 任务信息
45
+ - **功能ID**: {task_id}
46
+ - **功能名称**: {title}
47
+ - **完成人**: {developer}
48
+ - **完成时间**: {now}
49
+
50
+ ## 🎯 核心需求
51
+
52
+ **请AI根据PRD总结核心要点(2-3段)**
53
+
54
+ PRD位置:`{task_dir.name}/prd.md`
55
+
56
+ ## 📄 产出文件
57
+
58
+ - `prd.md` - 产品需求文档
59
+ - `user-stories.md` - 用户故事(如有)
60
+ - 其他补充文档(如有)
61
+
62
+ ## 🔑 关键设计要点
63
+
64
+ **请Designer重点关注**:
65
+
66
+ 1. [TODO: AI填写关键功能点1]
67
+ 2. [TODO: AI填写关键功能点2]
68
+ 3. [TODO: AI填写关键功能点3]
69
+
70
+ ## ⚠️ 特别注意事项
71
+
72
+ **设计实现时需要注意**:
73
+
74
+ - [TODO: AI填写注意事项1 - 如UI布局要求]
75
+ - [TODO: AI填写注意事项2 - 如交互特殊要求]
76
+ - [TODO: AI填写注意事项3 - 如性能要求]
77
+
78
+ ## 🔗 相关资源
79
+
80
+ - 设计稿: [TODO: 填写Figma链接]
81
+ - API文档: [TODO: 填写API文档链接]
82
+ - 参考资料: [TODO: 填写其他资源]
83
+
84
+ ## 📞 联系方式
85
+
86
+ 如有疑问,请联系 {developer}
87
+
88
+ ---
89
+
90
+ ## 附录:PRD内容摘要
91
+
92
+ ```
93
+ {prd_content[:500]}...
94
+ ```
95
+
96
+ > 完整PRD请查看 `{task_dir.name}/prd.md`
97
+ """
98
+
99
+ return template
100
+
101
+
102
+ def generate_handoff_designer(task_dir: Path, task_data: dict, source_data: Optional[dict] = None) -> str:
103
+ """Generate HANDOFF.md for Designer role."""
104
+ task_id = task_data.get("id", "unknown")
105
+ title = task_data.get("title", "未命名任务")
106
+ developer = get_developer(get_repo_root()) or "unknown"
107
+ now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
108
+
109
+ # Get upstream info
110
+ based_on = "N/A"
111
+ if source_data and "based_on" in source_data:
112
+ based_on = f"{source_data['based_on']['type']}/{source_data['based_on']['id']}"
113
+
114
+ template = f"""# {title} - 原型交接文档
115
+
116
+ ## 📋 任务信息
117
+ - **功能ID**: {task_id}
118
+ - **基于需求**: {based_on}
119
+ - **完成人**: {developer}
120
+ - **完成时间**: {now}
121
+
122
+ ## 🎨 设计说明
123
+
124
+ **请AI总结设计思路(2-3段)**:
125
+
126
+ - 整体布局思路
127
+ - 主要组件设计
128
+ - 交互流程设计
129
+
130
+ ## 📄 产出文件
131
+
132
+ **请列出所有组件文件**:
133
+
134
+ - `[ComponentName].tsx` - 组件说明
135
+ - `[ComponentName].tsx` - 组件说明
136
+ - ...
137
+
138
+ ## 🧩 组件结构
139
+
140
+ ```
141
+ [TODO: AI绘制组件树]
142
+ App
143
+ ├── LoginPage
144
+ │ ├── LoginForm
145
+ │ │ ├── EmailInput
146
+ │ │ └── PasswordInput
147
+ │ └── SocialLoginButtons
148
+ └── ...
149
+ ```
150
+
151
+ ## 💾 Mock数据说明
152
+
153
+ **当前使用的Mock数据**:
154
+
155
+ ```typescript
156
+ // [TODO: AI填写Mock数据示例]
157
+ const mockUser = {{
158
+ id: "1",
159
+ email: "test@example.com",
160
+ name: "Test User"
161
+ }};
162
+
163
+ // Mock登录逻辑位置:[TODO: 文件名:行号]
164
+ const handleLogin = async () => {{
165
+ // TODO: 替换为真实API调用
166
+ setTimeout(() => setUser(mockUser), 1000);
167
+ }};
168
+ ```
169
+
170
+ ## 🔄 需要Frontend补充的逻辑
171
+
172
+ **请Frontend开发重点处理**:
173
+
174
+ 1. **API集成** - 替换Mock为真实API调用
175
+ - 位置: [TODO: 文件名:行号]
176
+ - 需要调用: [TODO: API端点]
177
+
178
+ 2. **错误处理** - 添加网络错误和业务错误处理
179
+ - 网络超时
180
+ - 登录失败提示
181
+ - 表单验证错误
182
+
183
+ 3. **状态管理** - 添加全局状态管理(如需要)
184
+ - 用户登录状态
185
+ - Token存储
186
+
187
+ 4. **持久化** - 实现"记住我"功能
188
+ - localStorage/Cookie
189
+ - Token刷新逻辑
190
+
191
+ ## ⚠️ 特别注意事项
192
+
193
+ **保留以下设计**:
194
+
195
+ - [TODO: 需要保留的交互细节]
196
+ - [TODO: 需要保留的UI元素]
197
+ - [TODO: 需要保留的样式]
198
+
199
+ **可以优化的部分**:
200
+
201
+ - [TODO: 可以优化的性能点]
202
+ - [TODO: 可以调整的代码结构]
203
+
204
+ ## 📞 联系方式
205
+
206
+ 如有疑问,请联系 {developer}
207
+ """
208
+
209
+ return template
210
+
211
+
212
+ def generate_handoff_frontend(task_dir: Path, task_data: dict, source_data: Optional[dict] = None) -> str:
213
+ """Generate HANDOFF.md for Frontend role."""
214
+ task_id = task_data.get("id", "unknown")
215
+ title = task_data.get("title", "未命名任务")
216
+ developer = get_developer(get_repo_root()) or "unknown"
217
+ now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
218
+
219
+ # Get upstream info
220
+ based_on = "N/A"
221
+ if source_data and "based_on" in source_data:
222
+ based_on = f"{source_data['based_on']['type']}/{source_data['based_on']['id']}"
223
+
224
+ template = f"""# {title} - 生产代码交接文档
225
+
226
+ ## 📋 任务信息
227
+ - **功能ID**: {task_id}
228
+ - **基于原型**: {based_on}
229
+ - **完成人**: {developer}
230
+ - **完成时间**: {now}
231
+
232
+ ## 🎯 实现总结
233
+
234
+ **请AI总结实现要点(2-3段)**:
235
+
236
+ - 主要功能实现
237
+ - API集成情况
238
+ - 状态管理方案
239
+
240
+ ## 📄 产出文件
241
+
242
+ **请列出修改的文件**:
243
+
244
+ - `[FileName].tsx` - 修改说明
245
+ - `[FileName].ts` - 修改说明
246
+ - ...
247
+
248
+ ## 🔌 API集成
249
+
250
+ **已集成的API**:
251
+
252
+ | 端点 | 方法 | 用途 | 位置 |
253
+ |------|------|------|------|
254
+ | [TODO] | POST | [TODO] | [TODO:文件:行号] |
255
+
256
+ ## 🧪 测试说明
257
+
258
+ **已添加的测试**:
259
+
260
+ - [ ] 单元测试: [TODO: 测试文件]
261
+ - [ ] 集成测试: [TODO: 测试文件]
262
+ - [ ] E2E测试: [TODO: 测试文件]
263
+
264
+ **测试覆盖率**: [TODO: X%]
265
+
266
+ ## 🐛 已知问题
267
+
268
+ **遗留问题**(如有):
269
+
270
+ 1. [TODO: 问题描述]
271
+ - 影响: [TODO]
272
+ - 计划修复时间: [TODO]
273
+
274
+ ## ⚠️ 部署注意事项
275
+
276
+ **环境变量**:
277
+
278
+ ```bash
279
+ # [TODO: 列出需要的环境变量]
280
+ VITE_API_BASE_URL=https://api.example.com
281
+ ```
282
+
283
+ **依赖项**:
284
+
285
+ - [TODO: 新增的npm包]
286
+
287
+ **数据库迁移**(如需要):
288
+
289
+ - [TODO: 迁移脚本]
290
+
291
+ ## 📞 联系方式
292
+
293
+ 如有疑问,请联系 {developer}
294
+ """
295
+
296
+ return template
297
+
298
+
299
+ # =============================================================================
300
+ # Main Function
301
+ # =============================================================================
302
+
303
+
304
+ def generate_handoff(task_dir: Path, role: str, task_data: dict, source_data: Optional[dict] = None) -> str:
305
+ """Generate HANDOFF.md based on role.
306
+
307
+ Args:
308
+ task_dir: Task directory path
309
+ role: Role type (pm, designer, frontend)
310
+ task_data: Task metadata from task.json
311
+ source_data: Source reference from source.json (optional)
312
+
313
+ Returns:
314
+ HANDOFF.md content
315
+ """
316
+ generators = {
317
+ "pm": generate_handoff_pm,
318
+ "designer": generate_handoff_designer,
319
+ "frontend": generate_handoff_frontend,
320
+ }
321
+
322
+ if role not in generators:
323
+ raise ValueError(f"Invalid role: {role}. Must be one of {list(generators.keys())}")
324
+
325
+ # Designer and Frontend can use source_data
326
+ if role in ("designer", "frontend"):
327
+ return generators[role](task_dir, task_data, source_data)
328
+ else:
329
+ return generators[role](task_dir, task_data)
330
+
331
+
332
+ # =============================================================================
333
+ # CLI Entry Point
334
+ # =============================================================================
335
+
336
+
337
+ def main() -> int:
338
+ """CLI entry point for testing."""
339
+ import argparse
340
+ import json
341
+
342
+ parser = argparse.ArgumentParser(description="HANDOFF Document Generator")
343
+ parser.add_argument("task_dir", help="Task directory path")
344
+ parser.add_argument("role", choices=["pm", "designer", "frontend"], help="Role type")
345
+ parser.add_argument("--output", "-o", help="Output file path (default: HANDOFF.md in task dir)")
346
+
347
+ args = parser.parse_args()
348
+
349
+ task_dir = Path(args.task_dir)
350
+ if not task_dir.exists():
351
+ print(f"Error: Task directory not found: {task_dir}", file=sys.stderr)
352
+ return 1
353
+
354
+ # Read task.json
355
+ task_json = task_dir / "task.json"
356
+ if not task_json.exists():
357
+ print(f"Error: task.json not found in {task_dir}", file=sys.stderr)
358
+ return 1
359
+
360
+ task_data = json.loads(task_json.read_text(encoding="utf-8"))
361
+
362
+ # Read source.json (optional)
363
+ source_json = task_dir / "source.json"
364
+ source_data = None
365
+ if source_json.exists():
366
+ source_data = json.loads(source_json.read_text(encoding="utf-8"))
367
+
368
+ # Generate HANDOFF
369
+ handoff_content = generate_handoff(task_dir, args.role, task_data, source_data)
370
+
371
+ # Output
372
+ output_file = Path(args.output) if args.output else task_dir / "HANDOFF.md"
373
+ output_file.write_text(handoff_content, encoding="utf-8")
374
+
375
+ print(f"✓ Generated HANDOFF.md: {output_file}")
376
+ return 0
377
+
378
+
379
+ if __name__ == "__main__":
380
+ sys.exit(main())