@ibotor/smart-trellis 0.5.19

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 (520) hide show
  1. package/LICENSE +235 -0
  2. package/README.md +263 -0
  3. package/bin/smart-trellis.js +3 -0
  4. package/bin/trellis.js +3 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +132 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/smart.d.ts +2 -0
  10. package/dist/cli/smart.d.ts.map +1 -0
  11. package/dist/cli/smart.js +41 -0
  12. package/dist/cli/smart.js.map +1 -0
  13. package/dist/commands/init.d.ts +56 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +1466 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/smart-init.d.ts +22 -0
  18. package/dist/commands/smart-init.d.ts.map +1 -0
  19. package/dist/commands/smart-init.js +122 -0
  20. package/dist/commands/smart-init.js.map +1 -0
  21. package/dist/commands/uninstall.d.ts +27 -0
  22. package/dist/commands/uninstall.d.ts.map +1 -0
  23. package/dist/commands/uninstall.js +339 -0
  24. package/dist/commands/uninstall.js.map +1 -0
  25. package/dist/commands/update.d.ts +72 -0
  26. package/dist/commands/update.d.ts.map +1 -0
  27. package/dist/commands/update.js +1926 -0
  28. package/dist/commands/update.js.map +1 -0
  29. package/dist/configurators/antigravity.d.ts +7 -0
  30. package/dist/configurators/antigravity.d.ts.map +1 -0
  31. package/dist/configurators/antigravity.js +19 -0
  32. package/dist/configurators/antigravity.js.map +1 -0
  33. package/dist/configurators/claude.d.ts +9 -0
  34. package/dist/configurators/claude.d.ts.map +1 -0
  35. package/dist/configurators/claude.js +72 -0
  36. package/dist/configurators/claude.js.map +1 -0
  37. package/dist/configurators/codebuddy.d.ts +10 -0
  38. package/dist/configurators/codebuddy.d.ts.map +1 -0
  39. package/dist/configurators/codebuddy.js +30 -0
  40. package/dist/configurators/codebuddy.js.map +1 -0
  41. package/dist/configurators/codex.d.ts +8 -0
  42. package/dist/configurators/codex.d.ts.map +1 -0
  43. package/dist/configurators/codex.js +85 -0
  44. package/dist/configurators/codex.js.map +1 -0
  45. package/dist/configurators/copilot.d.ts +10 -0
  46. package/dist/configurators/copilot.d.ts.map +1 -0
  47. package/dist/configurators/copilot.js +51 -0
  48. package/dist/configurators/copilot.js.map +1 -0
  49. package/dist/configurators/cursor.d.ts +10 -0
  50. package/dist/configurators/cursor.d.ts.map +1 -0
  51. package/dist/configurators/cursor.js +29 -0
  52. package/dist/configurators/cursor.js.map +1 -0
  53. package/dist/configurators/droid.d.ts +10 -0
  54. package/dist/configurators/droid.d.ts.map +1 -0
  55. package/dist/configurators/droid.js +30 -0
  56. package/dist/configurators/droid.js.map +1 -0
  57. package/dist/configurators/gemini.d.ts +16 -0
  58. package/dist/configurators/gemini.d.ts.map +1 -0
  59. package/dist/configurators/gemini.js +38 -0
  60. package/dist/configurators/gemini.js.map +1 -0
  61. package/dist/configurators/index.d.ts +65 -0
  62. package/dist/configurators/index.d.ts.map +1 -0
  63. package/dist/configurators/index.js +367 -0
  64. package/dist/configurators/index.js.map +1 -0
  65. package/dist/configurators/kilo.d.ts +7 -0
  66. package/dist/configurators/kilo.d.ts.map +1 -0
  67. package/dist/configurators/kilo.js +19 -0
  68. package/dist/configurators/kilo.js.map +1 -0
  69. package/dist/configurators/kiro.d.ts +8 -0
  70. package/dist/configurators/kiro.d.ts.map +1 -0
  71. package/dist/configurators/kiro.js +24 -0
  72. package/dist/configurators/kiro.js.map +1 -0
  73. package/dist/configurators/opencode.d.ts +14 -0
  74. package/dist/configurators/opencode.d.ts.map +1 -0
  75. package/dist/configurators/opencode.js +96 -0
  76. package/dist/configurators/opencode.js.map +1 -0
  77. package/dist/configurators/pi.d.ts +3 -0
  78. package/dist/configurators/pi.d.ts.map +1 -0
  79. package/dist/configurators/pi.js +45 -0
  80. package/dist/configurators/pi.js.map +1 -0
  81. package/dist/configurators/qoder.d.ts +11 -0
  82. package/dist/configurators/qoder.d.ts.map +1 -0
  83. package/dist/configurators/qoder.js +31 -0
  84. package/dist/configurators/qoder.js.map +1 -0
  85. package/dist/configurators/shared.d.ts +178 -0
  86. package/dist/configurators/shared.d.ts.map +1 -0
  87. package/dist/configurators/shared.js +538 -0
  88. package/dist/configurators/shared.js.map +1 -0
  89. package/dist/configurators/windsurf.d.ts +7 -0
  90. package/dist/configurators/windsurf.d.ts.map +1 -0
  91. package/dist/configurators/windsurf.js +19 -0
  92. package/dist/configurators/windsurf.js.map +1 -0
  93. package/dist/configurators/workflow.d.ts +29 -0
  94. package/dist/configurators/workflow.d.ts.map +1 -0
  95. package/dist/configurators/workflow.js +163 -0
  96. package/dist/configurators/workflow.js.map +1 -0
  97. package/dist/constants/paths.d.ts +70 -0
  98. package/dist/constants/paths.d.ts.map +1 -0
  99. package/dist/constants/paths.js +79 -0
  100. package/dist/constants/paths.js.map +1 -0
  101. package/dist/constants/version.d.ts +9 -0
  102. package/dist/constants/version.d.ts.map +1 -0
  103. package/dist/constants/version.js +15 -0
  104. package/dist/constants/version.js.map +1 -0
  105. package/dist/index.d.ts +10 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +10 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/migrations/index.d.ts +62 -0
  110. package/dist/migrations/index.d.ts.map +1 -0
  111. package/dist/migrations/index.js +187 -0
  112. package/dist/migrations/index.js.map +1 -0
  113. package/dist/migrations/manifests/0.1.9.json +30 -0
  114. package/dist/migrations/manifests/0.2.0.json +49 -0
  115. package/dist/migrations/manifests/0.2.12.json +9 -0
  116. package/dist/migrations/manifests/0.2.13.json +9 -0
  117. package/dist/migrations/manifests/0.2.14.json +175 -0
  118. package/dist/migrations/manifests/0.2.15.json +33 -0
  119. package/dist/migrations/manifests/0.3.0-beta.0.json +297 -0
  120. package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
  121. package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
  122. package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
  123. package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
  124. package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
  125. package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
  126. package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
  127. package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
  128. package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
  129. package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
  130. package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
  131. package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
  132. package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
  133. package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
  134. package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
  135. package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
  136. package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
  137. package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
  138. package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
  139. package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
  140. package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
  141. package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
  142. package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
  143. package/dist/migrations/manifests/0.3.0.json +11 -0
  144. package/dist/migrations/manifests/0.3.1.json +9 -0
  145. package/dist/migrations/manifests/0.3.10.json +9 -0
  146. package/dist/migrations/manifests/0.3.2.json +9 -0
  147. package/dist/migrations/manifests/0.3.3.json +9 -0
  148. package/dist/migrations/manifests/0.3.4.json +21 -0
  149. package/dist/migrations/manifests/0.3.5.json +9 -0
  150. package/dist/migrations/manifests/0.3.6.json +9 -0
  151. package/dist/migrations/manifests/0.3.7.json +9 -0
  152. package/dist/migrations/manifests/0.3.8.json +9 -0
  153. package/dist/migrations/manifests/0.3.9.json +9 -0
  154. package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
  155. package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
  156. package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
  157. package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
  158. package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
  159. package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
  160. package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
  161. package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
  162. package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
  163. package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
  164. package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
  165. package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
  166. package/dist/migrations/manifests/0.4.0.json +9 -0
  167. package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
  168. package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
  169. package/dist/migrations/manifests/0.5.0-beta.10.json +9 -0
  170. package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
  171. package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
  172. package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
  173. package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
  174. package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
  175. package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
  176. package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
  177. package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
  178. package/dist/migrations/manifests/0.5.0-beta.19.json +9 -0
  179. package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
  180. package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
  181. package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
  182. package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
  183. package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
  184. package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
  185. package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
  186. package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
  187. package/dist/migrations/manifests/0.5.0-rc.0.json +9 -0
  188. package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
  189. package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
  190. package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
  191. package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
  192. package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
  193. package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
  194. package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
  195. package/dist/migrations/manifests/0.5.0.json +9 -0
  196. package/dist/migrations/manifests/0.5.1.json +9 -0
  197. package/dist/migrations/manifests/0.5.10.json +9 -0
  198. package/dist/migrations/manifests/0.5.11.json +16 -0
  199. package/dist/migrations/manifests/0.5.12.json +9 -0
  200. package/dist/migrations/manifests/0.5.13.json +9 -0
  201. package/dist/migrations/manifests/0.5.14.json +9 -0
  202. package/dist/migrations/manifests/0.5.15.json +9 -0
  203. package/dist/migrations/manifests/0.5.16.json +9 -0
  204. package/dist/migrations/manifests/0.5.17.json +9 -0
  205. package/dist/migrations/manifests/0.5.18.json +9 -0
  206. package/dist/migrations/manifests/0.5.19.json +9 -0
  207. package/dist/migrations/manifests/0.5.2.json +9 -0
  208. package/dist/migrations/manifests/0.5.3.json +9 -0
  209. package/dist/migrations/manifests/0.5.4.json +9 -0
  210. package/dist/migrations/manifests/0.5.5.json +9 -0
  211. package/dist/migrations/manifests/0.5.6.json +9 -0
  212. package/dist/migrations/manifests/0.5.7.json +16 -0
  213. package/dist/migrations/manifests/0.5.8.json +9 -0
  214. package/dist/migrations/manifests/0.5.9.json +9 -0
  215. package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
  216. package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
  217. package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
  218. package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
  219. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  220. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  221. package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
  222. package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
  223. package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
  224. package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
  225. package/dist/migrations/manifests/0.6.0-beta.18.json +16 -0
  226. package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
  227. package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
  228. package/dist/migrations/manifests/0.6.0-beta.20.json +9 -0
  229. package/dist/migrations/manifests/0.6.0-beta.21.json +9 -0
  230. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  231. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  232. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  233. package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
  234. package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
  235. package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
  236. package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
  237. package/dist/templates/claude/agents/trellis-check.md +109 -0
  238. package/dist/templates/claude/agents/trellis-implement.md +109 -0
  239. package/dist/templates/claude/agents/trellis-research.md +137 -0
  240. package/dist/templates/claude/index.d.ts +22 -0
  241. package/dist/templates/claude/index.d.ts.map +1 -0
  242. package/dist/templates/claude/index.js +46 -0
  243. package/dist/templates/claude/index.js.map +1 -0
  244. package/dist/templates/claude/settings.json +73 -0
  245. package/dist/templates/codebuddy/agents/trellis-check.md +109 -0
  246. package/dist/templates/codebuddy/agents/trellis-implement.md +109 -0
  247. package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
  248. package/dist/templates/codebuddy/index.d.ts +15 -0
  249. package/dist/templates/codebuddy/index.d.ts.map +1 -0
  250. package/dist/templates/codebuddy/index.js +15 -0
  251. package/dist/templates/codebuddy/index.js.map +1 -0
  252. package/dist/templates/codebuddy/settings.json +59 -0
  253. package/dist/templates/codex/agents/trellis-check.toml +84 -0
  254. package/dist/templates/codex/agents/trellis-implement.toml +65 -0
  255. package/dist/templates/codex/agents/trellis-research.toml +73 -0
  256. package/dist/templates/codex/config.toml +28 -0
  257. package/dist/templates/codex/hooks/session-start.py +481 -0
  258. package/dist/templates/codex/hooks.json +15 -0
  259. package/dist/templates/codex/index.d.ts +39 -0
  260. package/dist/templates/codex/index.d.ts.map +1 -0
  261. package/dist/templates/codex/index.js +85 -0
  262. package/dist/templates/codex/index.js.map +1 -0
  263. package/dist/templates/codex/skills/before-dev/SKILL.md +34 -0
  264. package/dist/templates/codex/skills/brainstorm/SKILL.md +500 -0
  265. package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
  266. package/dist/templates/codex/skills/check/SKILL.md +30 -0
  267. package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
  268. package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
  269. package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
  270. package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -0
  271. package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
  272. package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
  273. package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
  274. package/dist/templates/codex/skills/start/SKILL.md +354 -0
  275. package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
  276. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
  277. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
  278. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
  279. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +81 -0
  280. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
  281. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +78 -0
  282. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
  283. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
  284. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +64 -0
  285. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
  286. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
  287. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
  288. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
  289. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
  290. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +101 -0
  291. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
  292. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
  293. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +79 -0
  294. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
  295. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
  296. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +74 -0
  297. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +83 -0
  298. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/SKILL.md +41 -0
  299. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/mcp-setup.md +90 -0
  300. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/repository-analysis.md +59 -0
  301. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-task-planning.md +61 -0
  302. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-writing.md +70 -0
  303. package/dist/templates/common/commands/continue.md +55 -0
  304. package/dist/templates/common/commands/finish-work.md +66 -0
  305. package/dist/templates/common/commands/start.md +58 -0
  306. package/dist/templates/common/index.d.ts +48 -0
  307. package/dist/templates/common/index.d.ts.map +1 -0
  308. package/dist/templates/common/index.js +104 -0
  309. package/dist/templates/common/index.js.map +1 -0
  310. package/dist/templates/common/skills/before-dev.md +29 -0
  311. package/dist/templates/common/skills/brainstorm.md +543 -0
  312. package/dist/templates/common/skills/break-loop.md +125 -0
  313. package/dist/templates/common/skills/check.md +87 -0
  314. package/dist/templates/common/skills/update-spec.md +351 -0
  315. package/dist/templates/copilot/hooks/session-start.py +454 -0
  316. package/dist/templates/copilot/hooks.json +19 -0
  317. package/dist/templates/copilot/index.d.ts +23 -0
  318. package/dist/templates/copilot/index.d.ts.map +1 -0
  319. package/dist/templates/copilot/index.js +54 -0
  320. package/dist/templates/copilot/index.js.map +1 -0
  321. package/dist/templates/copilot/prompts/before-dev.prompt.md +33 -0
  322. package/dist/templates/copilot/prompts/brainstorm.prompt.md +499 -0
  323. package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
  324. package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
  325. package/dist/templates/copilot/prompts/check.prompt.md +29 -0
  326. package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
  327. package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
  328. package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
  329. package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
  330. package/dist/templates/copilot/prompts/parallel.prompt.md +196 -0
  331. package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
  332. package/dist/templates/copilot/prompts/start.prompt.md +397 -0
  333. package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
  334. package/dist/templates/cursor/agents/trellis-check.md +108 -0
  335. package/dist/templates/cursor/agents/trellis-implement.md +108 -0
  336. package/dist/templates/cursor/agents/trellis-research.md +136 -0
  337. package/dist/templates/cursor/hooks.json +24 -0
  338. package/dist/templates/cursor/index.d.ts +13 -0
  339. package/dist/templates/cursor/index.d.ts.map +1 -0
  340. package/dist/templates/cursor/index.js +13 -0
  341. package/dist/templates/cursor/index.js.map +1 -0
  342. package/dist/templates/droid/droids/trellis-check.md +101 -0
  343. package/dist/templates/droid/droids/trellis-implement.md +101 -0
  344. package/dist/templates/droid/droids/trellis-research.md +137 -0
  345. package/dist/templates/droid/index.d.ts +15 -0
  346. package/dist/templates/droid/index.d.ts.map +1 -0
  347. package/dist/templates/droid/index.js +15 -0
  348. package/dist/templates/droid/index.js.map +1 -0
  349. package/dist/templates/droid/settings.json +59 -0
  350. package/dist/templates/extract.d.ts +40 -0
  351. package/dist/templates/extract.d.ts.map +1 -0
  352. package/dist/templates/extract.js +106 -0
  353. package/dist/templates/extract.js.map +1 -0
  354. package/dist/templates/gemini/agents/trellis-check.md +101 -0
  355. package/dist/templates/gemini/agents/trellis-implement.md +101 -0
  356. package/dist/templates/gemini/agents/trellis-research.md +136 -0
  357. package/dist/templates/gemini/index.d.ts +13 -0
  358. package/dist/templates/gemini/index.d.ts.map +1 -0
  359. package/dist/templates/gemini/index.js +13 -0
  360. package/dist/templates/gemini/index.js.map +1 -0
  361. package/dist/templates/gemini/settings.json +28 -0
  362. package/dist/templates/kiro/agents/trellis-check.json +26 -0
  363. package/dist/templates/kiro/agents/trellis-implement.json +26 -0
  364. package/dist/templates/kiro/agents/trellis-research.json +30 -0
  365. package/dist/templates/kiro/index.d.ts +18 -0
  366. package/dist/templates/kiro/index.d.ts.map +1 -0
  367. package/dist/templates/kiro/index.js +18 -0
  368. package/dist/templates/kiro/index.js.map +1 -0
  369. package/dist/templates/markdown/agents.md +21 -0
  370. package/dist/templates/markdown/gitignore.txt +15 -0
  371. package/dist/templates/markdown/index.d.ts +27 -0
  372. package/dist/templates/markdown/index.d.ts.map +1 -0
  373. package/dist/templates/markdown/index.js +52 -0
  374. package/dist/templates/markdown/index.js.map +1 -0
  375. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  376. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  377. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  378. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  379. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  380. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  381. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  382. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  383. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  384. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  385. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  386. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  387. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  388. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +105 -0
  389. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +162 -0
  390. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +595 -0
  391. package/dist/templates/markdown/spec/guides/index.md.txt +79 -0
  392. package/dist/templates/markdown/workspace-index.md +125 -0
  393. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  394. package/dist/templates/opencode/agents/trellis-check.md +116 -0
  395. package/dist/templates/opencode/agents/trellis-implement.md +117 -0
  396. package/dist/templates/opencode/agents/trellis-research.md +145 -0
  397. package/dist/templates/opencode/lib/session-utils.js +432 -0
  398. package/dist/templates/opencode/lib/trellis-context.js +381 -0
  399. package/dist/templates/opencode/package.json +5 -0
  400. package/dist/templates/opencode/plugins/inject-subagent-context.js +497 -0
  401. package/dist/templates/opencode/plugins/inject-workflow-state.js +162 -0
  402. package/dist/templates/opencode/plugins/session-start.js +101 -0
  403. package/dist/templates/pi/agents/trellis-check.md +36 -0
  404. package/dist/templates/pi/agents/trellis-implement.md +41 -0
  405. package/dist/templates/pi/agents/trellis-research.md +25 -0
  406. package/dist/templates/pi/extensions/trellis/index.ts.txt +1172 -0
  407. package/dist/templates/pi/index.d.ts +5 -0
  408. package/dist/templates/pi/index.d.ts.map +1 -0
  409. package/dist/templates/pi/index.js +12 -0
  410. package/dist/templates/pi/index.js.map +1 -0
  411. package/dist/templates/pi/settings.json +21 -0
  412. package/dist/templates/qoder/agents/trellis-check.md +102 -0
  413. package/dist/templates/qoder/agents/trellis-implement.md +102 -0
  414. package/dist/templates/qoder/agents/trellis-research.md +137 -0
  415. package/dist/templates/qoder/index.d.ts +15 -0
  416. package/dist/templates/qoder/index.d.ts.map +1 -0
  417. package/dist/templates/qoder/index.js +15 -0
  418. package/dist/templates/qoder/index.js.map +1 -0
  419. package/dist/templates/qoder/settings.json +47 -0
  420. package/dist/templates/shared-hooks/index.d.ts +50 -0
  421. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  422. package/dist/templates/shared-hooks/index.js +88 -0
  423. package/dist/templates/shared-hooks/index.js.map +1 -0
  424. package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
  425. package/dist/templates/shared-hooks/inject-subagent-context.py +749 -0
  426. package/dist/templates/shared-hooks/inject-workflow-state.py +387 -0
  427. package/dist/templates/shared-hooks/session-start.py +797 -0
  428. package/dist/templates/template-utils.d.ts +26 -0
  429. package/dist/templates/template-utils.d.ts.map +1 -0
  430. package/dist/templates/template-utils.js +60 -0
  431. package/dist/templates/template-utils.js.map +1 -0
  432. package/dist/templates/trellis/config.yaml +90 -0
  433. package/dist/templates/trellis/gitignore.txt +32 -0
  434. package/dist/templates/trellis/index.d.ts +52 -0
  435. package/dist/templates/trellis/index.d.ts.map +1 -0
  436. package/dist/templates/trellis/index.js +97 -0
  437. package/dist/templates/trellis/index.js.map +1 -0
  438. package/dist/templates/trellis/scripts/__init__.py +5 -0
  439. package/dist/templates/trellis/scripts/add_session.py +547 -0
  440. package/dist/templates/trellis/scripts/common/__init__.py +92 -0
  441. package/dist/templates/trellis/scripts/common/active_task.py +626 -0
  442. package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
  443. package/dist/templates/trellis/scripts/common/config.py +445 -0
  444. package/dist/templates/trellis/scripts/common/developer.py +190 -0
  445. package/dist/templates/trellis/scripts/common/git.py +31 -0
  446. package/dist/templates/trellis/scripts/common/git_context.py +106 -0
  447. package/dist/templates/trellis/scripts/common/io.py +37 -0
  448. package/dist/templates/trellis/scripts/common/log.py +45 -0
  449. package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
  450. package/dist/templates/trellis/scripts/common/paths.py +447 -0
  451. package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
  452. package/dist/templates/trellis/scripts/common/session_context.py +821 -0
  453. package/dist/templates/trellis/scripts/common/task_context.py +223 -0
  454. package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
  455. package/dist/templates/trellis/scripts/common/task_store.py +697 -0
  456. package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
  457. package/dist/templates/trellis/scripts/common/tasks.py +112 -0
  458. package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
  459. package/dist/templates/trellis/scripts/common/types.py +110 -0
  460. package/dist/templates/trellis/scripts/common/workflow_phase.py +215 -0
  461. package/dist/templates/trellis/scripts/get_context.py +16 -0
  462. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  463. package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
  464. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  465. package/dist/templates/trellis/scripts/task.py +500 -0
  466. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  467. package/dist/templates/trellis/workflow.md +690 -0
  468. package/dist/types/ai-tools.d.ts +95 -0
  469. package/dist/types/ai-tools.d.ts.map +1 -0
  470. package/dist/types/ai-tools.js +280 -0
  471. package/dist/types/ai-tools.js.map +1 -0
  472. package/dist/types/migration.d.ts +125 -0
  473. package/dist/types/migration.d.ts.map +1 -0
  474. package/dist/types/migration.js +8 -0
  475. package/dist/types/migration.js.map +1 -0
  476. package/dist/utils/compare-versions.d.ts +12 -0
  477. package/dist/utils/compare-versions.d.ts.map +1 -0
  478. package/dist/utils/compare-versions.js +86 -0
  479. package/dist/utils/compare-versions.js.map +1 -0
  480. package/dist/utils/cwd-guard.d.ts +38 -0
  481. package/dist/utils/cwd-guard.d.ts.map +1 -0
  482. package/dist/utils/cwd-guard.js +62 -0
  483. package/dist/utils/cwd-guard.js.map +1 -0
  484. package/dist/utils/file-writer.d.ts +36 -0
  485. package/dist/utils/file-writer.d.ts.map +1 -0
  486. package/dist/utils/file-writer.js +203 -0
  487. package/dist/utils/file-writer.js.map +1 -0
  488. package/dist/utils/manifest-prune.d.ts +61 -0
  489. package/dist/utils/manifest-prune.d.ts.map +1 -0
  490. package/dist/utils/manifest-prune.js +136 -0
  491. package/dist/utils/manifest-prune.js.map +1 -0
  492. package/dist/utils/posix.d.ts +13 -0
  493. package/dist/utils/posix.d.ts.map +1 -0
  494. package/dist/utils/posix.js +15 -0
  495. package/dist/utils/posix.js.map +1 -0
  496. package/dist/utils/project-detector.d.ts +46 -0
  497. package/dist/utils/project-detector.d.ts.map +1 -0
  498. package/dist/utils/project-detector.js +666 -0
  499. package/dist/utils/project-detector.js.map +1 -0
  500. package/dist/utils/proxy.d.ts +25 -0
  501. package/dist/utils/proxy.d.ts.map +1 -0
  502. package/dist/utils/proxy.js +60 -0
  503. package/dist/utils/proxy.js.map +1 -0
  504. package/dist/utils/task-json.d.ts +46 -0
  505. package/dist/utils/task-json.d.ts.map +1 -0
  506. package/dist/utils/task-json.js +49 -0
  507. package/dist/utils/task-json.js.map +1 -0
  508. package/dist/utils/template-fetcher.d.ts +150 -0
  509. package/dist/utils/template-fetcher.d.ts.map +1 -0
  510. package/dist/utils/template-fetcher.js +907 -0
  511. package/dist/utils/template-fetcher.js.map +1 -0
  512. package/dist/utils/template-hash.d.ts +123 -0
  513. package/dist/utils/template-hash.d.ts.map +1 -0
  514. package/dist/utils/template-hash.js +334 -0
  515. package/dist/utils/template-hash.js.map +1 -0
  516. package/dist/utils/uninstall-scrubbers.d.ts +66 -0
  517. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  518. package/dist/utils/uninstall-scrubbers.js +342 -0
  519. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  520. package/package.json +89 -0
@@ -0,0 +1,447 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Common path utilities for Trellis workflow.
4
+
5
+ Provides:
6
+ get_repo_root - Get repository root directory
7
+ get_developer - Get developer name
8
+ get_workspace_dir - Get developer workspace directory
9
+ get_tasks_dir - Get tasks directory
10
+ get_active_journal_file - Get current journal file
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import re
16
+ from datetime import datetime
17
+ from pathlib import Path
18
+
19
+
20
+ # =============================================================================
21
+ # Path Constants (change here to rename directories)
22
+ # =============================================================================
23
+
24
+ # Directory names
25
+ DIR_WORKFLOW = ".trellis"
26
+ DIR_WORKSPACE = "workspace"
27
+ DIR_TASKS = "tasks"
28
+ DIR_ARCHIVE = "archive"
29
+ DIR_SPEC = "spec"
30
+ DIR_SCRIPTS = "scripts"
31
+
32
+ # File names
33
+ FILE_DEVELOPER = ".developer"
34
+ FILE_CURRENT_TASK = ".current-task"
35
+ FILE_TASK_JSON = "task.json"
36
+ FILE_JOURNAL_PREFIX = "journal-"
37
+
38
+
39
+ # =============================================================================
40
+ # Repository Root
41
+ # =============================================================================
42
+
43
+ def get_repo_root(start_path: Path | None = None) -> Path:
44
+ """Find the nearest directory containing .trellis/ folder.
45
+
46
+ This handles nested git repos correctly (e.g., test project inside another repo).
47
+
48
+ Args:
49
+ start_path: Starting directory to search from. Defaults to current directory.
50
+
51
+ Returns:
52
+ Path to repository root, or current directory if no .trellis/ found.
53
+ """
54
+ current = (start_path or Path.cwd()).resolve()
55
+
56
+ while current != current.parent:
57
+ if (current / DIR_WORKFLOW).is_dir():
58
+ return current
59
+ current = current.parent
60
+
61
+ # Fallback to current directory if no .trellis/ found
62
+ return Path.cwd().resolve()
63
+
64
+
65
+ # =============================================================================
66
+ # Developer
67
+ # =============================================================================
68
+
69
+ def get_developer(repo_root: Path | None = None) -> str | None:
70
+ """Get developer name from .developer file.
71
+
72
+ Args:
73
+ repo_root: Repository root path. Defaults to auto-detected.
74
+
75
+ Returns:
76
+ Developer name or None if not initialized.
77
+ """
78
+ if repo_root is None:
79
+ repo_root = get_repo_root()
80
+
81
+ dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER
82
+
83
+ if not dev_file.is_file():
84
+ return None
85
+
86
+ try:
87
+ content = dev_file.read_text(encoding="utf-8")
88
+ for line in content.splitlines():
89
+ if line.startswith("name="):
90
+ return line.split("=", 1)[1].strip()
91
+ except (OSError, IOError):
92
+ pass
93
+
94
+ return None
95
+
96
+
97
+ def check_developer(repo_root: Path | None = None) -> bool:
98
+ """Check if developer is initialized.
99
+
100
+ Args:
101
+ repo_root: Repository root path. Defaults to auto-detected.
102
+
103
+ Returns:
104
+ True if developer is initialized.
105
+ """
106
+ return get_developer(repo_root) is not None
107
+
108
+
109
+ # =============================================================================
110
+ # Tasks Directory
111
+ # =============================================================================
112
+
113
+ def get_tasks_dir(repo_root: Path | None = None) -> Path:
114
+ """Get tasks directory path.
115
+
116
+ Args:
117
+ repo_root: Repository root path. Defaults to auto-detected.
118
+
119
+ Returns:
120
+ Path to tasks directory.
121
+ """
122
+ if repo_root is None:
123
+ repo_root = get_repo_root()
124
+ return repo_root / DIR_WORKFLOW / DIR_TASKS
125
+
126
+
127
+ # =============================================================================
128
+ # Workspace Directory
129
+ # =============================================================================
130
+
131
+ def get_workspace_dir(repo_root: Path | None = None) -> Path | None:
132
+ """Get developer workspace directory.
133
+
134
+ Args:
135
+ repo_root: Repository root path. Defaults to auto-detected.
136
+
137
+ Returns:
138
+ Path to workspace directory or None if developer not set.
139
+ """
140
+ if repo_root is None:
141
+ repo_root = get_repo_root()
142
+
143
+ developer = get_developer(repo_root)
144
+ if developer:
145
+ return repo_root / DIR_WORKFLOW / DIR_WORKSPACE / developer
146
+ return None
147
+
148
+
149
+ # =============================================================================
150
+ # Journal File
151
+ # =============================================================================
152
+
153
+ def get_active_journal_file(repo_root: Path | None = None) -> Path | None:
154
+ """Get the current active journal file.
155
+
156
+ Args:
157
+ repo_root: Repository root path. Defaults to auto-detected.
158
+
159
+ Returns:
160
+ Path to active journal file or None if not found.
161
+ """
162
+ if repo_root is None:
163
+ repo_root = get_repo_root()
164
+
165
+ workspace_dir = get_workspace_dir(repo_root)
166
+ if workspace_dir is None or not workspace_dir.is_dir():
167
+ return None
168
+
169
+ latest: Path | None = None
170
+ highest = 0
171
+
172
+ for f in workspace_dir.glob(f"{FILE_JOURNAL_PREFIX}*.md"):
173
+ if not f.is_file():
174
+ continue
175
+
176
+ # Extract number from filename
177
+ name = f.stem # e.g., "journal-1"
178
+ match = re.search(r"(\d+)$", name)
179
+ if match:
180
+ num = int(match.group(1))
181
+ if num > highest:
182
+ highest = num
183
+ latest = f
184
+
185
+ return latest
186
+
187
+
188
+ def count_lines(file_path: Path) -> int:
189
+ """Count lines in a file.
190
+
191
+ Args:
192
+ file_path: Path to file.
193
+
194
+ Returns:
195
+ Number of lines, or 0 if file doesn't exist.
196
+ """
197
+ if not file_path.is_file():
198
+ return 0
199
+
200
+ try:
201
+ return len(file_path.read_text(encoding="utf-8").splitlines())
202
+ except (OSError, IOError):
203
+ return 0
204
+
205
+
206
+ # =============================================================================
207
+ # Current Task Management
208
+ # =============================================================================
209
+
210
+ def normalize_task_ref(task_ref: str) -> str:
211
+ """Normalize a task ref for stable runtime storage.
212
+
213
+ Stored refs should prefer repo-relative POSIX paths like
214
+ `.trellis/tasks/03-27-my-task`, even on Windows. Absolute paths are preserved
215
+ unless they can later be converted back to repo-relative form by callers.
216
+ """
217
+ normalized = task_ref.strip()
218
+ if not normalized:
219
+ return ""
220
+
221
+ path_obj = Path(normalized)
222
+ if path_obj.is_absolute():
223
+ return str(path_obj)
224
+
225
+ normalized = normalized.replace("\\", "/")
226
+ while normalized.startswith("./"):
227
+ normalized = normalized[2:]
228
+
229
+ if normalized.startswith(f"{DIR_TASKS}/"):
230
+ return f"{DIR_WORKFLOW}/{normalized}"
231
+
232
+ return normalized
233
+
234
+
235
+ def resolve_task_ref(task_ref: str, repo_root: Path | None = None) -> Path | None:
236
+ """Resolve a task ref to an absolute task directory path."""
237
+ if repo_root is None:
238
+ repo_root = get_repo_root()
239
+
240
+ normalized = normalize_task_ref(task_ref)
241
+ if not normalized:
242
+ return None
243
+
244
+ path_obj = Path(normalized)
245
+ if path_obj.is_absolute():
246
+ return path_obj
247
+
248
+ if normalized.startswith(f"{DIR_WORKFLOW}/"):
249
+ return repo_root / path_obj
250
+
251
+ return repo_root / DIR_WORKFLOW / DIR_TASKS / path_obj
252
+
253
+
254
+ def get_current_task(
255
+ repo_root: Path | None = None,
256
+ platform_input: dict | None = None,
257
+ platform: str | None = None,
258
+ ) -> str | None:
259
+ """Get current task directory path (relative to repo_root).
260
+
261
+ Args:
262
+ repo_root: Repository root path. Defaults to auto-detected.
263
+
264
+ Returns:
265
+ Relative path to current task directory or None.
266
+ """
267
+ if repo_root is None:
268
+ repo_root = get_repo_root()
269
+
270
+ from .active_task import resolve_active_task
271
+
272
+ return resolve_active_task(repo_root, platform_input, platform).task_path
273
+
274
+
275
+ def get_current_task_abs(
276
+ repo_root: Path | None = None,
277
+ platform_input: dict | None = None,
278
+ platform: str | None = None,
279
+ ) -> Path | None:
280
+ """Get current task directory absolute path.
281
+
282
+ Args:
283
+ repo_root: Repository root path. Defaults to auto-detected.
284
+
285
+ Returns:
286
+ Absolute path to current task directory or None.
287
+ """
288
+ if repo_root is None:
289
+ repo_root = get_repo_root()
290
+
291
+ relative = get_current_task(repo_root, platform_input, platform)
292
+ if relative:
293
+ return resolve_task_ref(relative, repo_root)
294
+ return None
295
+
296
+
297
+ def get_current_task_source(
298
+ repo_root: Path | None = None,
299
+ platform_input: dict | None = None,
300
+ platform: str | None = None,
301
+ ) -> tuple[str, str | None, str | None]:
302
+ """Get active task source as (`source`, `context_key`, `task_path`)."""
303
+ if repo_root is None:
304
+ repo_root = get_repo_root()
305
+
306
+ from .active_task import get_current_task_source as _get_source
307
+
308
+ return _get_source(repo_root, platform_input, platform)
309
+
310
+
311
+ def set_current_task(
312
+ task_path: str,
313
+ repo_root: Path | None = None,
314
+ platform_input: dict | None = None,
315
+ platform: str | None = None,
316
+ ) -> bool:
317
+ """Set current task in session scope.
318
+
319
+ Args:
320
+ task_path: Task directory path (relative to repo_root).
321
+ repo_root: Repository root path. Defaults to auto-detected.
322
+
323
+ Returns:
324
+ True on success, False on error.
325
+ """
326
+ if repo_root is None:
327
+ repo_root = get_repo_root()
328
+
329
+ from .active_task import set_active_task
330
+
331
+ return set_active_task(
332
+ task_path,
333
+ repo_root,
334
+ platform_input=platform_input,
335
+ platform=platform,
336
+ ) is not None
337
+
338
+
339
+ def clear_current_task(
340
+ repo_root: Path | None = None,
341
+ platform_input: dict | None = None,
342
+ platform: str | None = None,
343
+ ) -> bool:
344
+ """Clear current task in session scope.
345
+
346
+ Args:
347
+ repo_root: Repository root path. Defaults to auto-detected.
348
+
349
+ Returns:
350
+ True on success.
351
+ """
352
+ if repo_root is None:
353
+ repo_root = get_repo_root()
354
+
355
+ from .active_task import clear_active_task
356
+
357
+ clear_active_task(
358
+ repo_root,
359
+ platform_input=platform_input,
360
+ platform=platform,
361
+ )
362
+ return True
363
+
364
+
365
+ def has_current_task(repo_root: Path | None = None) -> bool:
366
+ """Check if has current task.
367
+
368
+ Args:
369
+ repo_root: Repository root path. Defaults to auto-detected.
370
+
371
+ Returns:
372
+ True if current task is set.
373
+ """
374
+ return get_current_task(repo_root) is not None
375
+
376
+
377
+ # =============================================================================
378
+ # Task ID Generation
379
+ # =============================================================================
380
+
381
+ def generate_task_date_prefix() -> str:
382
+ """Generate task ID based on date (MM-DD format).
383
+
384
+ Returns:
385
+ Date prefix string (e.g., "01-21").
386
+ """
387
+ return datetime.now().strftime("%m-%d")
388
+
389
+
390
+ # =============================================================================
391
+ # Monorepo / Package Paths
392
+ # =============================================================================
393
+
394
+
395
+ def get_spec_dir(package: str | None = None, repo_root: Path | None = None) -> Path:
396
+ """Get the spec directory path.
397
+
398
+ Single-repo: .trellis/spec
399
+ Monorepo with package: .trellis/spec/<package>
400
+
401
+ Uses lazy import to avoid circular dependency with config.py.
402
+ """
403
+ if repo_root is None:
404
+ repo_root = get_repo_root()
405
+
406
+ from .config import get_spec_base
407
+
408
+ base = get_spec_base(package, repo_root)
409
+ return repo_root / DIR_WORKFLOW / base
410
+
411
+
412
+ def get_package_path(package: str, repo_root: Path | None = None) -> Path | None:
413
+ """Get a package's source directory absolute path from config.
414
+
415
+ Returns:
416
+ Absolute path to the package directory, or None if not found.
417
+ """
418
+ if repo_root is None:
419
+ repo_root = get_repo_root()
420
+
421
+ from .config import get_packages
422
+
423
+ packages = get_packages(repo_root)
424
+ if not packages or package not in packages:
425
+ return None
426
+
427
+ info = packages[package]
428
+ if isinstance(info, dict):
429
+ rel_path = info.get("path", package)
430
+ else:
431
+ rel_path = str(info)
432
+
433
+ return repo_root / rel_path
434
+
435
+
436
+ # =============================================================================
437
+ # Main Entry (for testing)
438
+ # =============================================================================
439
+
440
+ if __name__ == "__main__":
441
+ repo = get_repo_root()
442
+ print(f"Repository root: {repo}")
443
+ print(f"Developer: {get_developer(repo)}")
444
+ print(f"Tasks dir: {get_tasks_dir(repo)}")
445
+ print(f"Workspace dir: {get_workspace_dir(repo)}")
446
+ print(f"Journal file: {get_active_journal_file(repo)}")
447
+ print(f"Current task: {get_current_task(repo)}")