@mindfoldhq/trellis 0.6.0-beta.2 → 0.6.0-beta.20

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 (330) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +1 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +58 -2
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/channel/adapters/claude.d.ts +29 -0
  7. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  8. package/dist/commands/channel/adapters/claude.js +203 -0
  9. package/dist/commands/channel/adapters/claude.js.map +1 -0
  10. package/dist/commands/channel/adapters/codex.d.ts +85 -0
  11. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  12. package/dist/commands/channel/adapters/codex.js +505 -0
  13. package/dist/commands/channel/adapters/codex.js.map +1 -0
  14. package/dist/commands/channel/adapters/index.d.ts +84 -0
  15. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  16. package/dist/commands/channel/adapters/index.js +115 -0
  17. package/dist/commands/channel/adapters/index.js.map +1 -0
  18. package/dist/commands/channel/adapters/types.d.ts +33 -0
  19. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  20. package/dist/commands/channel/adapters/types.js +2 -0
  21. package/dist/commands/channel/adapters/types.js.map +1 -0
  22. package/dist/commands/channel/agent-loader.d.ts +32 -0
  23. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  24. package/dist/commands/channel/agent-loader.js +154 -0
  25. package/dist/commands/channel/agent-loader.js.map +1 -0
  26. package/dist/commands/channel/context-loader.d.ts +26 -0
  27. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  28. package/dist/commands/channel/context-loader.js +290 -0
  29. package/dist/commands/channel/context-loader.js.map +1 -0
  30. package/dist/commands/channel/context.d.ts +16 -0
  31. package/dist/commands/channel/context.d.ts.map +1 -0
  32. package/dist/commands/channel/context.js +83 -0
  33. package/dist/commands/channel/context.js.map +1 -0
  34. package/dist/commands/channel/create.d.ts +27 -0
  35. package/dist/commands/channel/create.d.ts.map +1 -0
  36. package/dist/commands/channel/create.js +39 -0
  37. package/dist/commands/channel/create.js.map +1 -0
  38. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  39. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  40. package/dist/commands/channel/dev-parse-trace.js +70 -0
  41. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  42. package/dist/commands/channel/guard.d.ts +150 -0
  43. package/dist/commands/channel/guard.d.ts.map +1 -0
  44. package/dist/commands/channel/guard.js +474 -0
  45. package/dist/commands/channel/guard.js.map +1 -0
  46. package/dist/commands/channel/index.d.ts +3 -0
  47. package/dist/commands/channel/index.d.ts.map +1 -0
  48. package/dist/commands/channel/index.js +531 -0
  49. package/dist/commands/channel/index.js.map +1 -0
  50. package/dist/commands/channel/interrupt.d.ts +10 -0
  51. package/dist/commands/channel/interrupt.d.ts.map +1 -0
  52. package/dist/commands/channel/interrupt.js +22 -0
  53. package/dist/commands/channel/interrupt.js.map +1 -0
  54. package/dist/commands/channel/kill.d.ts +7 -0
  55. package/dist/commands/channel/kill.d.ts.map +1 -0
  56. package/dist/commands/channel/kill.js +121 -0
  57. package/dist/commands/channel/kill.js.map +1 -0
  58. package/dist/commands/channel/list.d.ts +17 -0
  59. package/dist/commands/channel/list.d.ts.map +1 -0
  60. package/dist/commands/channel/list.js +233 -0
  61. package/dist/commands/channel/list.js.map +1 -0
  62. package/dist/commands/channel/messages.d.ts +15 -0
  63. package/dist/commands/channel/messages.d.ts.map +1 -0
  64. package/dist/commands/channel/messages.js +245 -0
  65. package/dist/commands/channel/messages.js.map +1 -0
  66. package/dist/commands/channel/rm.d.ts +27 -0
  67. package/dist/commands/channel/rm.d.ts.map +1 -0
  68. package/dist/commands/channel/rm.js +216 -0
  69. package/dist/commands/channel/rm.js.map +1 -0
  70. package/dist/commands/channel/run.d.ts +30 -0
  71. package/dist/commands/channel/run.d.ts.map +1 -0
  72. package/dist/commands/channel/run.js +130 -0
  73. package/dist/commands/channel/run.js.map +1 -0
  74. package/dist/commands/channel/send.d.ts +11 -0
  75. package/dist/commands/channel/send.d.ts.map +1 -0
  76. package/dist/commands/channel/send.js +24 -0
  77. package/dist/commands/channel/send.js.map +1 -0
  78. package/dist/commands/channel/spawn.d.ts +40 -0
  79. package/dist/commands/channel/spawn.d.ts.map +1 -0
  80. package/dist/commands/channel/spawn.js +244 -0
  81. package/dist/commands/channel/spawn.js.map +1 -0
  82. package/dist/commands/channel/store/events.d.ts +39 -0
  83. package/dist/commands/channel/store/events.d.ts.map +1 -0
  84. package/dist/commands/channel/store/events.js +87 -0
  85. package/dist/commands/channel/store/events.js.map +1 -0
  86. package/dist/commands/channel/store/filter.d.ts +3 -0
  87. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  88. package/dist/commands/channel/store/filter.js +2 -0
  89. package/dist/commands/channel/store/filter.js.map +1 -0
  90. package/dist/commands/channel/store/lock.d.ts +23 -0
  91. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  92. package/dist/commands/channel/store/lock.js +99 -0
  93. package/dist/commands/channel/store/lock.js.map +1 -0
  94. package/dist/commands/channel/store/paths.d.ts +63 -0
  95. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  96. package/dist/commands/channel/store/paths.js +246 -0
  97. package/dist/commands/channel/store/paths.js.map +1 -0
  98. package/dist/commands/channel/store/schema.d.ts +27 -0
  99. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  100. package/dist/commands/channel/store/schema.js +34 -0
  101. package/dist/commands/channel/store/schema.js.map +1 -0
  102. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  103. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  104. package/dist/commands/channel/store/thread-state.js +16 -0
  105. package/dist/commands/channel/store/thread-state.js.map +1 -0
  106. package/dist/commands/channel/store/watch.d.ts +19 -0
  107. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  108. package/dist/commands/channel/store/watch.js +146 -0
  109. package/dist/commands/channel/store/watch.js.map +1 -0
  110. package/dist/commands/channel/supervisor/idle.d.ts +46 -0
  111. package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
  112. package/dist/commands/channel/supervisor/idle.js +72 -0
  113. package/dist/commands/channel/supervisor/idle.js.map +1 -0
  114. package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
  115. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  116. package/dist/commands/channel/supervisor/inbox.js +160 -0
  117. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  118. package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
  119. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  120. package/dist/commands/channel/supervisor/shutdown.js +146 -0
  121. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  122. package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
  123. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  124. package/dist/commands/channel/supervisor/stdout.js +121 -0
  125. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  126. package/dist/commands/channel/supervisor/turns.d.ts +31 -0
  127. package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
  128. package/dist/commands/channel/supervisor/turns.js +45 -0
  129. package/dist/commands/channel/supervisor/turns.js.map +1 -0
  130. package/dist/commands/channel/supervisor/warning.d.ts +48 -0
  131. package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
  132. package/dist/commands/channel/supervisor/warning.js +77 -0
  133. package/dist/commands/channel/supervisor/warning.js.map +1 -0
  134. package/dist/commands/channel/supervisor.d.ts +59 -0
  135. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  136. package/dist/commands/channel/supervisor.js +344 -0
  137. package/dist/commands/channel/supervisor.js.map +1 -0
  138. package/dist/commands/channel/text-body.d.ts +13 -0
  139. package/dist/commands/channel/text-body.d.ts.map +1 -0
  140. package/dist/commands/channel/text-body.js +47 -0
  141. package/dist/commands/channel/text-body.js.map +1 -0
  142. package/dist/commands/channel/threads.d.ts +39 -0
  143. package/dist/commands/channel/threads.d.ts.map +1 -0
  144. package/dist/commands/channel/threads.js +106 -0
  145. package/dist/commands/channel/threads.js.map +1 -0
  146. package/dist/commands/channel/title.d.ts +12 -0
  147. package/dist/commands/channel/title.d.ts.map +1 -0
  148. package/dist/commands/channel/title.js +24 -0
  149. package/dist/commands/channel/title.js.map +1 -0
  150. package/dist/commands/channel/wait.d.ts +17 -0
  151. package/dist/commands/channel/wait.d.ts.map +1 -0
  152. package/dist/commands/channel/wait.js +75 -0
  153. package/dist/commands/channel/wait.js.map +1 -0
  154. package/dist/commands/init.d.ts +2 -0
  155. package/dist/commands/init.d.ts.map +1 -1
  156. package/dist/commands/init.js +97 -42
  157. package/dist/commands/init.js.map +1 -1
  158. package/dist/commands/mem.d.ts +13 -117
  159. package/dist/commands/mem.d.ts.map +1 -1
  160. package/dist/commands/mem.js +168 -1074
  161. package/dist/commands/mem.js.map +1 -1
  162. package/dist/commands/uninstall.d.ts.map +1 -1
  163. package/dist/commands/uninstall.js +28 -2
  164. package/dist/commands/uninstall.js.map +1 -1
  165. package/dist/commands/update.d.ts.map +1 -1
  166. package/dist/commands/update.js +31 -111
  167. package/dist/commands/update.js.map +1 -1
  168. package/dist/commands/upgrade.d.ts +28 -0
  169. package/dist/commands/upgrade.d.ts.map +1 -0
  170. package/dist/commands/upgrade.js +84 -0
  171. package/dist/commands/upgrade.js.map +1 -0
  172. package/dist/commands/workflow.d.ts +35 -0
  173. package/dist/commands/workflow.d.ts.map +1 -0
  174. package/dist/commands/workflow.js +219 -0
  175. package/dist/commands/workflow.js.map +1 -0
  176. package/dist/configurators/claude.d.ts.map +1 -1
  177. package/dist/configurators/claude.js +1 -0
  178. package/dist/configurators/claude.js.map +1 -1
  179. package/dist/configurators/codex.d.ts.map +1 -1
  180. package/dist/configurators/codex.js +5 -3
  181. package/dist/configurators/codex.js.map +1 -1
  182. package/dist/configurators/shared.js +4 -4
  183. package/dist/configurators/shared.js.map +1 -1
  184. package/dist/configurators/workflow.d.ts +8 -0
  185. package/dist/configurators/workflow.d.ts.map +1 -1
  186. package/dist/configurators/workflow.js +3 -2
  187. package/dist/configurators/workflow.js.map +1 -1
  188. package/dist/migrations/manifests/0.5.10.json +9 -0
  189. package/dist/migrations/manifests/0.5.11.json +16 -0
  190. package/dist/migrations/manifests/0.5.12.json +9 -0
  191. package/dist/migrations/manifests/0.5.13.json +9 -0
  192. package/dist/migrations/manifests/0.5.14.json +9 -0
  193. package/dist/migrations/manifests/0.5.15.json +9 -0
  194. package/dist/migrations/manifests/0.5.16.json +9 -0
  195. package/dist/migrations/manifests/0.5.17.json +9 -0
  196. package/dist/migrations/manifests/0.5.18.json +9 -0
  197. package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
  198. package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
  199. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  200. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  201. package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
  202. package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
  203. package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
  204. package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
  205. package/dist/migrations/manifests/0.6.0-beta.18.json +16 -0
  206. package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
  207. package/dist/migrations/manifests/0.6.0-beta.20.json +9 -0
  208. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  209. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  210. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  211. package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
  212. package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
  213. package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
  214. package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
  215. package/dist/templates/claude/agents/trellis-check.md +13 -7
  216. package/dist/templates/claude/agents/trellis-implement.md +8 -7
  217. package/dist/templates/claude/settings.json +4 -4
  218. package/dist/templates/codebuddy/agents/trellis-check.md +13 -7
  219. package/dist/templates/codebuddy/agents/trellis-implement.md +8 -7
  220. package/dist/templates/codebuddy/settings.json +4 -4
  221. package/dist/templates/codex/agents/trellis-check.toml +4 -4
  222. package/dist/templates/codex/agents/trellis-implement.toml +4 -4
  223. package/dist/templates/codex/config.toml +5 -3
  224. package/dist/templates/codex/hooks/session-start.py +205 -119
  225. package/dist/templates/codex/hooks.json +2 -2
  226. package/dist/templates/codex/skills/before-dev/SKILL.md +12 -6
  227. package/dist/templates/codex/skills/brainstorm/SKILL.md +69 -457
  228. package/dist/templates/codex/skills/check/SKILL.md +86 -18
  229. package/dist/templates/codex/skills/start/SKILL.md +33 -323
  230. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +7 -4
  231. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +1 -1
  232. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +3 -2
  233. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +5 -5
  234. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +1 -1
  235. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +35 -6
  236. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +5 -4
  237. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/SKILL.md +41 -0
  238. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/mcp-setup.md +90 -0
  239. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/repository-analysis.md +59 -0
  240. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-task-planning.md +61 -0
  241. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-writing.md +70 -0
  242. package/dist/templates/common/commands/continue.md +6 -5
  243. package/dist/templates/common/commands/start.md +9 -6
  244. package/dist/templates/common/skills/before-dev.md +12 -6
  245. package/dist/templates/common/skills/brainstorm.md +68 -504
  246. package/dist/templates/common/skills/check.md +7 -1
  247. package/dist/templates/copilot/hooks/session-start.py +219 -101
  248. package/dist/templates/copilot/hooks.json +2 -2
  249. package/dist/templates/copilot/prompts/before-dev.prompt.md +12 -6
  250. package/dist/templates/copilot/prompts/brainstorm.prompt.md +69 -457
  251. package/dist/templates/copilot/prompts/check.prompt.md +86 -18
  252. package/dist/templates/copilot/prompts/parallel.prompt.md +16 -8
  253. package/dist/templates/copilot/prompts/start.prompt.md +33 -367
  254. package/dist/templates/cursor/agents/trellis-check.md +13 -7
  255. package/dist/templates/cursor/agents/trellis-implement.md +8 -7
  256. package/dist/templates/cursor/hooks.json +1 -7
  257. package/dist/templates/droid/droids/trellis-check.md +13 -7
  258. package/dist/templates/droid/droids/trellis-implement.md +8 -7
  259. package/dist/templates/droid/settings.json +4 -4
  260. package/dist/templates/gemini/agents/trellis-check.md +11 -5
  261. package/dist/templates/gemini/agents/trellis-implement.md +7 -6
  262. package/dist/templates/gemini/settings.json +2 -2
  263. package/dist/templates/kiro/agents/trellis-check.json +1 -1
  264. package/dist/templates/kiro/agents/trellis-implement.json +1 -1
  265. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +127 -9
  266. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +171 -6
  267. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +333 -43
  268. package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
  269. package/dist/templates/opencode/agents/trellis-check.md +13 -7
  270. package/dist/templates/opencode/agents/trellis-implement.md +9 -8
  271. package/dist/templates/opencode/lib/session-utils.js +212 -123
  272. package/dist/templates/opencode/lib/trellis-context.js +73 -11
  273. package/dist/templates/opencode/plugins/inject-subagent-context.js +131 -29
  274. package/dist/templates/opencode/plugins/inject-workflow-state.js +9 -5
  275. package/dist/templates/opencode/plugins/session-start.js +9 -1
  276. package/dist/templates/pi/agents/trellis-check.md +5 -4
  277. package/dist/templates/pi/agents/trellis-implement.md +5 -4
  278. package/dist/templates/pi/extensions/trellis/index.ts.txt +1357 -754
  279. package/dist/templates/qoder/agents/trellis-check.md +11 -5
  280. package/dist/templates/qoder/agents/trellis-implement.md +7 -6
  281. package/dist/templates/qoder/settings.json +4 -4
  282. package/dist/templates/shared-hooks/index.d.ts.map +1 -1
  283. package/dist/templates/shared-hooks/index.js +0 -1
  284. package/dist/templates/shared-hooks/index.js.map +1 -1
  285. package/dist/templates/shared-hooks/inject-subagent-context.py +36 -14
  286. package/dist/templates/shared-hooks/inject-workflow-state.py +40 -42
  287. package/dist/templates/shared-hooks/session-start.py +222 -171
  288. package/dist/templates/trellis/config.yaml +38 -0
  289. package/dist/templates/trellis/index.d.ts +1 -0
  290. package/dist/templates/trellis/index.d.ts.map +1 -1
  291. package/dist/templates/trellis/index.js +2 -0
  292. package/dist/templates/trellis/index.js.map +1 -1
  293. package/dist/templates/trellis/scripts/add_session.py +50 -24
  294. package/dist/templates/trellis/scripts/common/config.py +57 -1
  295. package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
  296. package/dist/templates/trellis/scripts/common/session_context.py +384 -137
  297. package/dist/templates/trellis/scripts/common/task_context.py +3 -3
  298. package/dist/templates/trellis/scripts/common/task_store.py +161 -15
  299. package/dist/templates/trellis/scripts/common/workflow_phase.py +7 -10
  300. package/dist/templates/trellis/scripts/task.py +3 -3
  301. package/dist/templates/trellis/workflow.md +119 -98
  302. package/dist/utils/cwd-guard.d.ts +38 -0
  303. package/dist/utils/cwd-guard.d.ts.map +1 -0
  304. package/dist/utils/cwd-guard.js +62 -0
  305. package/dist/utils/cwd-guard.js.map +1 -0
  306. package/dist/utils/file-writer.d.ts +13 -0
  307. package/dist/utils/file-writer.d.ts.map +1 -1
  308. package/dist/utils/file-writer.js +59 -1
  309. package/dist/utils/file-writer.js.map +1 -1
  310. package/dist/utils/manifest-prune.d.ts +61 -0
  311. package/dist/utils/manifest-prune.d.ts.map +1 -0
  312. package/dist/utils/manifest-prune.js +136 -0
  313. package/dist/utils/manifest-prune.js.map +1 -0
  314. package/dist/utils/task-json.d.ts +9 -42
  315. package/dist/utils/task-json.d.ts.map +1 -1
  316. package/dist/utils/task-json.js +8 -45
  317. package/dist/utils/task-json.js.map +1 -1
  318. package/dist/utils/template-hash.d.ts +32 -6
  319. package/dist/utils/template-hash.d.ts.map +1 -1
  320. package/dist/utils/template-hash.js +53 -31
  321. package/dist/utils/template-hash.js.map +1 -1
  322. package/dist/utils/uninstall-scrubbers.d.ts +1 -0
  323. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
  324. package/dist/utils/uninstall-scrubbers.js +21 -0
  325. package/dist/utils/uninstall-scrubbers.js.map +1 -1
  326. package/dist/utils/workflow-resolver.d.ts +86 -0
  327. package/dist/utils/workflow-resolver.d.ts.map +1 -0
  328. package/dist/utils/workflow-resolver.js +265 -0
  329. package/dist/utils/workflow-resolver.js.map +1 -0
  330. package/package.json +9 -8
@@ -68,19 +68,31 @@ def _normalize_windows_shell_path(path_str: str) -> str:
68
68
 
69
69
 
70
70
  FIRST_REPLY_NOTICE = """<first-reply-notice>
71
- On the first visible assistant reply in this session, begin with exactly one short Chinese sentence:
72
- Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。
73
- Then continue directly with the user's request. This notice is one-shot: do not repeat it after the first assistant reply in the same session.
71
+ First visible reply: say once in Chinese that Trellis SessionStart context is loaded, then answer directly.
72
+ This notice is one-shot: do not repeat it after the first assistant reply in the same session.
74
73
  </first-reply-notice>"""
75
74
 
76
- # IMPORTANT: Force stdout to use UTF-8 on Windows
77
- # This fixes UnicodeEncodeError when outputting non-ASCII characters
75
+ # Force UTF-8 on stdin/stdout/stderr on Windows. Default codepage there is
76
+ # cp936 / cp1252 / etc. non-ASCII content (Chinese task names, prd snippets)
77
+ # both in stdin (hook payload from host CLI) and stdout (our emitted blocks)
78
+ # raises UnicodeDecodeError / UnicodeEncodeError. Equivalent to `python -X utf8`
79
+ # but applied per-stream so we don't depend on host CLI's command wiring.
78
80
  if sys.platform.startswith("win"):
79
81
  import io as _io
80
- if hasattr(sys.stdout, "reconfigure"):
81
- sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
82
- elif hasattr(sys.stdout, "detach"):
83
- sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr]
82
+ for _stream_name in ("stdin", "stdout", "stderr"):
83
+ _stream = getattr(sys, _stream_name, None)
84
+ if _stream is None:
85
+ continue
86
+ if hasattr(_stream, "reconfigure"):
87
+ try:
88
+ _stream.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
89
+ except Exception:
90
+ pass
91
+ elif hasattr(_stream, "detach"):
92
+ try:
93
+ setattr(sys, _stream_name, _io.TextIOWrapper(_stream.detach(), encoding="utf-8", errors="replace"))
94
+ except Exception:
95
+ pass
84
96
 
85
97
 
86
98
 
@@ -136,6 +148,41 @@ def read_file(path: Path, fallback: str = "") -> str:
136
148
  return fallback
137
149
 
138
150
 
151
+ def _repo_relative(repo_root: Path, path: Path) -> str:
152
+ try:
153
+ return path.relative_to(repo_root).as_posix()
154
+ except ValueError:
155
+ return str(path)
156
+
157
+
158
+ def _run_git(repo_root: Path, args: list[str]) -> str:
159
+ try:
160
+ result = subprocess.run(
161
+ ["git", *args],
162
+ capture_output=True,
163
+ text=True,
164
+ encoding="utf-8",
165
+ errors="replace",
166
+ timeout=3,
167
+ cwd=str(repo_root),
168
+ )
169
+ except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError):
170
+ return ""
171
+ if result.returncode != 0:
172
+ return ""
173
+ return result.stdout.strip()
174
+
175
+
176
+ def _format_git_state(repo_root: Path) -> str:
177
+ branch = _run_git(repo_root, ["branch", "--show-current"]) or "(detached)"
178
+ dirty_lines = [
179
+ line for line in _run_git(repo_root, ["status", "--porcelain"]).splitlines()
180
+ if line.strip()
181
+ ]
182
+ dirty_text = "clean" if not dirty_lines else f"dirty {len(dirty_lines)} paths"
183
+ return f"Git: branch {branch}; {dirty_text}."
184
+
185
+
139
186
  def _detect_platform(input_data: dict) -> str | None:
140
187
  if isinstance(input_data.get("cursor_version"), str):
141
188
  return "cursor"
@@ -274,44 +321,26 @@ def _resolve_task_dir(trellis_dir: Path, task_ref: str) -> Path:
274
321
 
275
322
 
276
323
  def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
277
- """Check current task status and return structured status string with explicit next action.
278
-
279
- Returns a block with three fields:
280
- - Status: current state
281
- - Task: task identifier (when applicable)
282
- - Next-Action: explicit skill/command/tool call the AI should invoke
283
- """
324
+ """Return compact active-task status, artifact presence, and next action."""
284
325
  active = _resolve_active_task(trellis_dir, input_data)
285
326
 
286
- # Case 1: No active task — waiting for user to describe intent
287
327
  if not active.task_path:
288
328
  return (
289
329
  "Status: NO ACTIVE TASK\n"
290
- f"Source: {active.source}\n"
291
- "Next-Action: After the user describes their intent, load skill `trellis-brainstorm` "
292
- "to clarify requirements and create a task via `python3 ./.trellis/scripts/task.py create`.\n"
293
- "Research reminder: for research-heavy tasks (comparing tools, reading external docs, "
294
- "cross-platform surveys), spawn `trellis-research` sub-agents via the Task tool — "
295
- "they persist findings to `{TASK_DIR}/research/*.md` and keep main context clean. "
296
- "Do NOT do 10+ inline WebFetch/WebSearch in the main conversation.\n"
297
- "User override (per-turn escape hatch): if the user's first message explicitly opts "
298
- "out of the workflow (\"跳过 trellis\" / \"别走流程\" / \"小修一下\" / \"直接改\" / "
299
- "\"skip trellis\" / \"no task\" / \"just do it\"), honor it for this turn — "
300
- "acknowledge briefly and proceed without creating a task. Per-turn only."
330
+ "Next-Action: Classify the current turn before creating any Trellis task. "
331
+ "Simple conversation / small task asks only whether this turn should create a Trellis task. "
332
+ "Complex task asks whether task creation and planning are allowed."
301
333
  )
302
334
 
303
- # Case 2: Stale pointer — task dir was deleted
304
335
  task_ref = active.task_path
305
336
  task_dir = _resolve_task_dir(trellis_dir, task_ref)
306
337
  if active.stale or not task_dir.is_dir():
307
338
  return (
308
339
  f"Status: STALE POINTER\nTask: {task_ref}\n"
309
- f"Source: {active.source}\n"
310
340
  f"Next-Action: Run `python3 ./.trellis/scripts/task.py finish` to clear the stale pointer, "
311
341
  "then ask the user what to work on next."
312
342
  )
313
343
 
314
- # Read task.json
315
344
  task_json_path = task_dir / "task.json"
316
345
  task_data = {}
317
346
  if task_json_path.is_file():
@@ -322,62 +351,65 @@ def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
322
351
 
323
352
  task_title = task_data.get("title", task_ref)
324
353
  task_status = task_data.get("status", "unknown")
354
+ artifact_names = ("prd.md", "design.md", "implement.md", "implement.jsonl", "check.jsonl")
355
+ present = [name for name in artifact_names if (task_dir / name).is_file()]
356
+ if (task_dir / "research").is_dir():
357
+ present.append("research/")
358
+ present_line = ", ".join(present) if present else "(none)"
325
359
 
326
- # Case 3: Task completed — time to archive
327
360
  if task_status == "completed":
328
361
  return (
329
362
  f"Status: COMPLETED\nTask: {task_title}\n"
330
- f"Source: {active.source}\n"
331
- f"Next-Action: Load skill `trellis-update-spec` to capture learnings, "
332
- f"then archive with `python3 ./.trellis/scripts/task.py archive {task_dir.name}`."
363
+ f"Present: {present_line}\n"
364
+ "Next-Action: Run `/trellis:finish-work`. If the working tree is dirty, return to Phase 3.4 first."
333
365
  )
334
366
 
335
367
  has_prd = (task_dir / "prd.md").is_file()
368
+ has_design = (task_dir / "design.md").is_file()
369
+ has_implement_plan = (task_dir / "implement.md").is_file()
370
+ implement_jsonl = task_dir / "implement.jsonl"
371
+ check_jsonl = task_dir / "check.jsonl"
372
+ jsonl_ready = (
373
+ (not implement_jsonl.is_file() or _has_curated_jsonl_entry(implement_jsonl))
374
+ and (not check_jsonl.is_file() or _has_curated_jsonl_entry(check_jsonl))
375
+ )
336
376
 
337
- # Case 4: No PRD still in Plan phase
338
- if not has_prd:
377
+ if task_status == "planning" and not has_prd:
339
378
  return (
340
379
  f"Status: PLANNING\nTask: {task_title}\n"
341
- f"Source: {active.source}\n"
342
- "Next-Action: Load skill `trellis-brainstorm` to clarify requirements with the user "
343
- "and produce prd.md in the task directory.\n"
344
- "Research reminder: when the task needs external research (tool comparison, docs, "
345
- "conventions survey), spawn `trellis-research` sub-agents — don't WebFetch/WebSearch "
346
- "inline in the main session. Findings go to `{task_dir}/research/*.md`; PRD only links to them."
380
+ f"Present: {present_line}\n"
381
+ "Next-Action: Load `trellis-brainstorm` and write `prd.md`. Stay in planning."
347
382
  )
348
383
 
349
- # Case 4b: PRD exists but implement.jsonl has only seed (no curated entries) — Phase 1.3 gate
350
- implement_jsonl = task_dir / "implement.jsonl"
351
- if implement_jsonl.is_file() and not _has_curated_jsonl_entry(implement_jsonl):
384
+ if task_status == "planning":
385
+ missing_complex = [
386
+ name for name, exists in (
387
+ ("design.md", has_design),
388
+ ("implement.md", has_implement_plan),
389
+ )
390
+ if not exists
391
+ ]
392
+ next_bits: list[str] = []
393
+ if missing_complex:
394
+ next_bits.append(
395
+ "Lightweight task can request start review with PRD-only; "
396
+ f"complex task must add {', '.join(missing_complex)} before start"
397
+ )
398
+ else:
399
+ next_bits.append("Planning artifacts are present; ask for review before `task.py start`")
400
+ if not jsonl_ready:
401
+ next_bits.append("curate `implement.jsonl` and `check.jsonl` before sub-agent mode start")
352
402
  return (
353
- f"Status: PLANNING (Phase 1.3)\nTask: {task_title}\n"
354
- f"Source: {active.source}\n"
355
- "Next-Action: Curate `implement.jsonl` and `check.jsonl` with the spec + research files "
356
- "the Phase 2 sub-agents will need. Only spec paths (`.trellis/spec/**/*.md`) and research "
357
- "files (`{TASK_DIR}/research/*.md`) — no code paths. Run "
358
- "`python3 ./.trellis/scripts/get_context.py --mode packages` to list available specs, "
359
- "then edit the jsonl files or use `python3 ./.trellis/scripts/task.py add-context`. "
360
- "See `.trellis/workflow.md` Phase 1.3 for details."
403
+ f"Status: PLANNING\nTask: {task_title}\n"
404
+ f"Present: {present_line}\n"
405
+ f"Next-Action: {'; '.join(next_bits)}. Do not enter implementation until the user confirms start."
361
406
  )
362
407
 
363
- # Case 5: PRD + curated jsonl (or agent-less platform with no jsonl) — enter Execute phase
364
408
  return (
365
- f"Status: READY\nTask: {task_title}\n"
366
- f"Source: {active.source}\n"
367
- "Next required action: dispatch `trellis-implement` per Phase 2.1. "
368
- "For agent-capable platforms, the default is to NOT edit code in the main session. "
369
- "After implementation, dispatch `trellis-check` per Phase 2.2 before reporting completion.\n"
370
- "Sub-agent roster: `trellis-implement` (writes code), `trellis-check` (verifies + self-fixes), "
371
- "`trellis-research` (persists findings to `research/*.md` — use when you'd otherwise do "
372
- "multiple WebFetch/WebSearch inline).\n"
373
- "Sub-agent self-exemption: if you are reading this as a `trellis-implement` or "
374
- "`trellis-check` sub-agent (your own role / agent name reflects that), this dispatch "
375
- "instruction does NOT apply to you — you are already the dispatched sub-agent. "
376
- "Implement / check directly without spawning another sub-agent of the same kind.\n"
377
- "User override (per-turn escape hatch): if the user's CURRENT message explicitly tells the "
378
- "main session to handle it directly (\"你直接改\" / \"别派 sub-agent\" / \"main session 写就行\" / "
379
- "\"do it inline\" / \"不用 sub-agent\"), honor it for this turn and edit code directly. "
380
- "Per-turn only; do NOT invent an override the user did not say."
409
+ f"Status: {str(task_status).upper()}\nTask: {task_title}\n"
410
+ f"Present: {present_line}\n"
411
+ "Next-Action: Follow the matching per-turn workflow-state. "
412
+ "Implementation/check context order is jsonl entries -> `prd.md` -> `design.md if present` -> `implement.md if present`."
381
413
  )
382
414
 
383
415
 
@@ -530,6 +562,97 @@ def _resolve_spec_scope(
530
562
  return None # Unknown scope type: full scan
531
563
 
532
564
 
565
+ def _collect_spec_index_paths(trellis_dir: Path, allowed_pkgs: set | None) -> list[str]:
566
+ paths: list[str] = []
567
+ guides_index = trellis_dir / "spec" / "guides" / "index.md"
568
+ if guides_index.is_file():
569
+ paths.append(".trellis/spec/guides/index.md")
570
+
571
+ spec_dir = trellis_dir / "spec"
572
+ if not spec_dir.is_dir():
573
+ return paths
574
+
575
+ for sub in sorted(spec_dir.iterdir()):
576
+ if not sub.is_dir() or sub.name.startswith(".") or sub.name == "guides":
577
+ continue
578
+
579
+ index_file = sub / "index.md"
580
+ if index_file.is_file():
581
+ paths.append(f".trellis/spec/{sub.name}/index.md")
582
+ continue
583
+
584
+ if allowed_pkgs is not None and sub.name not in allowed_pkgs:
585
+ continue
586
+ for nested in sorted(sub.iterdir()):
587
+ if not nested.is_dir():
588
+ continue
589
+ nested_index = nested / "index.md"
590
+ if nested_index.is_file():
591
+ paths.append(f".trellis/spec/{sub.name}/{nested.name}/index.md")
592
+
593
+ return paths
594
+
595
+
596
+ def _build_compact_current_state(
597
+ trellis_dir: Path,
598
+ input_data: dict,
599
+ spec_index_paths: list[str],
600
+ ) -> str:
601
+ repo_root = trellis_dir.parent
602
+ lines: list[str] = []
603
+
604
+ try:
605
+ from common.paths import get_active_journal_file, get_developer, get_tasks_dir, count_lines # type: ignore[import-not-found]
606
+ from common.tasks import iter_active_tasks # type: ignore[import-not-found]
607
+ except Exception:
608
+ get_active_journal_file = None # type: ignore[assignment]
609
+ get_developer = None # type: ignore[assignment]
610
+ get_tasks_dir = None # type: ignore[assignment]
611
+ count_lines = None # type: ignore[assignment]
612
+ iter_active_tasks = None # type: ignore[assignment]
613
+
614
+ developer = get_developer(repo_root) if get_developer else None
615
+ lines.append(f"Developer: {developer or '(not initialized)'}")
616
+ lines.append(_format_git_state(repo_root))
617
+
618
+ active = _resolve_active_task(trellis_dir, input_data)
619
+ if active.task_path:
620
+ task_dir = _resolve_task_dir(trellis_dir, active.task_path)
621
+ status = "unknown"
622
+ task_json = task_dir / "task.json"
623
+ if task_json.is_file():
624
+ try:
625
+ data = json.loads(task_json.read_text(encoding="utf-8"))
626
+ if isinstance(data, dict):
627
+ status = str(data.get("status") or "unknown")
628
+ except (json.JSONDecodeError, OSError):
629
+ pass
630
+ lines.append(f"Current task: {_repo_relative(repo_root, task_dir)}; status={status}.")
631
+ else:
632
+ lines.append("Current task: none.")
633
+
634
+ if get_tasks_dir and iter_active_tasks:
635
+ try:
636
+ task_count = sum(1 for _ in iter_active_tasks(get_tasks_dir(repo_root)))
637
+ lines.append(
638
+ f"Active tasks: {task_count} total. Use `python3 ./.trellis/scripts/task.py list --mine` only if needed."
639
+ )
640
+ except Exception:
641
+ pass
642
+
643
+ if get_active_journal_file and count_lines:
644
+ journal = get_active_journal_file(repo_root)
645
+ if journal:
646
+ lines.append(
647
+ f"Journal: {_repo_relative(repo_root, journal)}, {count_lines(journal)} / 2000 lines."
648
+ )
649
+
650
+ if spec_index_paths:
651
+ lines.append(f"Spec indexes: {len(spec_index_paths)} available.")
652
+
653
+ return "\n".join(lines)
654
+
655
+
533
656
  def _extract_range(content: str, start_header: str, end_header: str) -> str:
534
657
  """Extract lines starting at `## start_header` up to (but excluding) `## end_header`.
535
658
 
@@ -570,51 +693,25 @@ def _strip_breadcrumb_tag_blocks(content: str) -> str:
570
693
  payload already covers the full step bodies, so re-inlining the
571
694
  breadcrumbs here would just duplicate context.
572
695
  """
573
- return _BREADCRUMB_TAG_RE.sub("", content)
696
+ stripped = _BREADCRUMB_TAG_RE.sub("", content)
697
+ stripped = re.sub(r"<!--.*?-->", "", stripped, flags=re.DOTALL)
698
+ stripped = re.sub(r"^\[(?!/?workflow-state:)/?[^\]\n]+\]\s*\n?", "", stripped, flags=re.MULTILINE)
699
+ return re.sub(r"\n{3,}", "\n\n", stripped).strip()
574
700
 
575
701
 
576
702
  def _build_workflow_overview(workflow_path: Path) -> str:
577
- """Inject the workflow guide for the session.
578
-
579
- Contents:
580
- 1. Section index (all `## ` headings — navigation)
581
- 2. Phase Index section (rules, skill routing table, anti-rationalization table)
582
- 3. Phase 1/2/3 step-level details (the actual how-to for each step)
583
-
584
- The meta sections (Core Principles / Trellis System / Customizing
585
- Trellis) are NOT injected — Core Principles is short prose the AI can
586
- Read on demand; Trellis System lists reference commands duplicated in
587
- step bodies; Customizing Trellis is for forks. Workflow-state breadcrumb
588
- tag blocks (which now live inside Phase Index since v0.5.0-rc.0) are
589
- stripped from the extracted range — they're consumed by the
590
- UserPromptSubmit hook, not the session-start preamble.
591
-
592
- Total budget: Phase Index ~2 KB + Phase 1/2/3 ~7 KB = ~9 KB.
593
- """
703
+ """Inject only the compact Phase Index summary for SessionStart."""
594
704
  content = read_file(workflow_path)
595
705
  if not content:
596
706
  return "No workflow.md found"
597
707
 
598
708
  out_lines = [
599
- "# Development Workflow Section Index",
600
- "Full guide: .trellis/workflow.md (read on demand)",
709
+ "# Development Workflow - Session Summary",
710
+ "Full guide: .trellis/workflow.md. Step detail: `python3 ./.trellis/scripts/get_context.py --mode phase --step <X.Y>`.",
601
711
  "",
602
- "## Table of Contents",
603
712
  ]
604
- for line in content.splitlines():
605
- if line.startswith("## "):
606
- out_lines.append(line)
607
- out_lines += ["", "---", ""]
608
-
609
- # Extract Phase Index through the end of Phase 3 (before "Customizing
610
- # Trellis" — the docs-for-forks footer added in v0.5.0-rc.0). Since
611
- # sections appear in order Phase Index → Phase 1 → Phase 2 → Phase 3 →
612
- # Customizing Trellis, a single range grab captures all four. The
613
- # breadcrumb tag blocks now embedded inside Phase Index are stripped so
614
- # they don't duplicate the per-turn UserPromptSubmit injection.
615
- phases = _extract_range(
616
- content, "Phase Index", "Customizing Trellis (for forks)"
617
- )
713
+
714
+ phases = _extract_range(content, "Phase Index", "Phase 1: Plan")
618
715
  if phases:
619
716
  out_lines.append(_strip_breadcrumb_tag_blocks(phases).rstrip())
620
717
 
@@ -665,9 +762,10 @@ def main():
665
762
 
666
763
  output = StringIO()
667
764
 
765
+ spec_index_paths = _collect_spec_index_paths(trellis_dir, allowed_pkgs)
766
+
668
767
  output.write("""<session-context>
669
- You are starting a new session in a Trellis-managed project.
670
- Read and follow all instructions below carefully.
768
+ Trellis compact SessionStart context. Use it to orient the session; load details on demand.
671
769
  </session-context>
672
770
 
673
771
  """)
@@ -680,72 +778,23 @@ Read and follow all instructions below carefully.
680
778
  output.write(f"<migration-warning>\n{legacy_warning}\n</migration-warning>\n\n")
681
779
 
682
780
  output.write("<current-state>\n")
683
- context_script = trellis_dir / "scripts" / "get_context.py"
684
- output.write(run_script(context_script, context_key))
781
+ output.write(_build_compact_current_state(trellis_dir, hook_input, spec_index_paths))
685
782
  output.write("\n</current-state>\n\n")
686
783
 
687
- output.write("<workflow>\n")
784
+ output.write("<trellis-workflow>\n")
688
785
  output.write(_build_workflow_overview(trellis_dir / "workflow.md"))
689
- output.write("\n</workflow>\n\n")
786
+ output.write("\n</trellis-workflow>\n\n")
690
787
 
691
788
  output.write("<guidelines>\n")
692
789
  output.write(
693
- "Project spec indexes are listed by path below. Each index contains a "
694
- "**Pre-Development Checklist** listing the specific guideline files to "
695
- "read before coding.\n\n"
696
- "- If you're spawning an implement/check sub-agent, context is injected "
697
- "or loaded by the sub-agent via `{task}/implement.jsonl` / `check.jsonl`. "
698
- "You do NOT need to read these indexes yourself.\n"
699
- "- For agent-capable platforms, the default is to dispatch "
700
- "`trellis-implement` and `trellis-check` (so JSONL context is loaded by "
701
- "the sub-agents) rather than editing code in the main session. "
702
- "Honor a per-turn user override only if the user's current message "
703
- "explicitly opts out (see <task-status> below for override phrases).\n"
704
- "- Sub-agent self-exemption: if you are reading this as a `trellis-implement` "
705
- "or `trellis-check` sub-agent, the \"dispatch trellis-implement / trellis-check\" "
706
- "rule above does NOT apply to you — you are already the dispatched sub-agent. "
707
- "Do NOT spawn another sub-agent of the same kind; implement / check directly.\n\n"
790
+ "Task context order for implementation/check: jsonl entries -> `prd.md` -> "
791
+ "`design.md if present` -> `implement.md if present`. Missing optional artifacts "
792
+ "are skipped for lightweight tasks.\n\n"
708
793
  )
709
794
 
710
- # guides/ is cross-package thinking — always include inline (small, broadly useful)
711
- guides_index = trellis_dir / "spec" / "guides" / "index.md"
712
- if guides_index.is_file():
713
- output.write("## guides (inlined — cross-package thinking guides)\n")
714
- output.write(read_file(guides_index))
715
- output.write("\n\n")
716
-
717
- # Other spec indexes — paths only (main agent reads on demand;
718
- # sub-agents get their specific specs via jsonl injection)
719
- paths: list[str] = []
720
- spec_dir = trellis_dir / "spec"
721
- if spec_dir.is_dir():
722
- for sub in sorted(spec_dir.iterdir()):
723
- if not sub.is_dir() or sub.name.startswith("."):
724
- continue
725
- if sub.name == "guides":
726
- continue # already inlined above
727
-
728
- index_file = sub / "index.md"
729
- if index_file.is_file():
730
- # Flat spec dir (single-repo layer like spec/backend/)
731
- paths.append(f".trellis/spec/{sub.name}/index.md")
732
- else:
733
- # Nested package dirs (monorepo: spec/<pkg>/<layer>/index.md)
734
- # Apply scope filter
735
- if allowed_pkgs is not None and sub.name not in allowed_pkgs:
736
- continue
737
- for nested in sorted(sub.iterdir()):
738
- if not nested.is_dir():
739
- continue
740
- nested_index = nested / "index.md"
741
- if nested_index.is_file():
742
- paths.append(
743
- f".trellis/spec/{sub.name}/{nested.name}/index.md"
744
- )
745
-
746
- if paths:
747
- output.write("## Available spec indexes (read on demand)\n")
748
- for p in paths:
795
+ if spec_index_paths:
796
+ output.write("## Available indexes (read on demand)\n")
797
+ for p in spec_index_paths:
749
798
  output.write(f"- {p}\n")
750
799
  output.write("\n")
751
800
 
@@ -760,16 +809,18 @@ Read and follow all instructions below carefully.
760
809
  output.write(f"<task-status>\n{task_status}\n</task-status>\n\n")
761
810
 
762
811
  output.write("""<ready>
763
- Context loaded. Workflow index, project state, and guidelines are already injected above — do NOT re-read them.
764
- When the user sends the first message, follow <task-status> and the workflow guide.
765
- If a task is READY, execute its Next required action without asking whether to continue.
812
+ Context loaded. Follow <task-status>. Load workflow/spec/task details only when needed.
766
813
  </ready>""")
767
814
 
815
+ context_text = output.getvalue()
768
816
  result = {
817
+ # Claude Code / Qoder / CodeBuddy / Droid / Gemini / Copilot format
769
818
  "hookSpecificOutput": {
770
819
  "hookEventName": "SessionStart",
771
- "additionalContext": output.getvalue(),
772
- }
820
+ "additionalContext": context_text,
821
+ },
822
+ # Cursor sessionStart format (top-level snake_case per Cursor docs)
823
+ "additional_context": context_text,
773
824
  }
774
825
 
775
826
  # Output JSON - stdout is already configured for UTF-8
@@ -14,6 +14,24 @@ session_commit_message: "chore: record journal"
14
14
  # Maximum lines per journal file before rotating to a new one
15
15
  max_journal_lines: 2000
16
16
 
17
+ #-------------------------------------------------------------------------------
18
+ # Session Auto-Commit
19
+ #-------------------------------------------------------------------------------
20
+
21
+ # Auto-commit behavior for session journal + task archive operations.
22
+ # - true (default): scripts auto-stage and auto-commit journal / task changes
23
+ # after add_session.py / task.py archive runs.
24
+ # - false: scripts do not touch git. Files (journal-*.md, task archive moves)
25
+ # are still written to disk; you decide whether to git add / commit.
26
+ #
27
+ # Use `false` if your project's .gitignore intentionally excludes `.trellis/`
28
+ # and you want session data kept local-only, or if you prefer to review
29
+ # staged changes manually before each commit.
30
+ #
31
+ # Accepts: true / false / yes / no / 1 / 0 / on / off (case-insensitive).
32
+ #
33
+ # session_auto_commit: true
34
+
17
35
  #-------------------------------------------------------------------------------
18
36
  # Task Lifecycle Hooks
19
37
  #-------------------------------------------------------------------------------
@@ -58,6 +76,26 @@ max_journal_lines: 2000
58
76
  # Default package used when --package is not specified.
59
77
  # default_package: frontend
60
78
 
79
+ #-------------------------------------------------------------------------------
80
+ # Channel worker OOM guard
81
+ #-------------------------------------------------------------------------------
82
+ # Default safeguards for `trellis channel spawn` workers. The guard runs
83
+ # at spawn time (cleans expired idle workers, then enforces the live-worker
84
+ # budget) and inside each supervisor (self-terminates a worker that stays
85
+ # continuously idle past `idle_timeout`).
86
+ #
87
+ # Precedence: CLI flag > env var (TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT /
88
+ # TRELLIS_CHANNEL_MAX_LIVE_WORKERS) > this config > built-in default.
89
+ #
90
+ # `idle_timeout: 0` disables idle cleanup (workers can sit idle forever
91
+ # unless explicitly killed or given `--timeout`).
92
+ # `max_live_workers: 0` disables the spawn-time budget check.
93
+ #
94
+ channel:
95
+ worker_guard:
96
+ idle_timeout: 5m
97
+ max_live_workers: 6
98
+
61
99
  #-------------------------------------------------------------------------------
62
100
  # Codex (dispatch behavior)
63
101
  #-------------------------------------------------------------------------------
@@ -36,6 +36,7 @@ export declare const commonSessionContext: string;
36
36
  export declare const commonPackagesContext: string;
37
37
  export declare const commonWorkflowPhase: string;
38
38
  export declare const commonTrellisConfig: string;
39
+ export declare const commonSafeCommit: string;
39
40
  export declare const getDeveloperScript: string;
40
41
  export declare const initDeveloperScript: string;
41
42
  export declare const taskScript: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AAGF,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAGvE,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAGvE,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqCnD"}
@@ -46,6 +46,7 @@ export const commonSessionContext = readTemplate("scripts/common/session_context
46
46
  export const commonPackagesContext = readTemplate("scripts/common/packages_context.py");
47
47
  export const commonWorkflowPhase = readTemplate("scripts/common/workflow_phase.py");
48
48
  export const commonTrellisConfig = readTemplate("scripts/common/trellis_config.py");
49
+ export const commonSafeCommit = readTemplate("scripts/common/safe_commit.py");
49
50
  // Python scripts - main
50
51
  export const getDeveloperScript = readTemplate("scripts/get_developer.py");
51
52
  export const initDeveloperScript = readTemplate("scripts/init_developer.py");
@@ -84,6 +85,7 @@ export function getAllScripts() {
84
85
  scripts.set("common/packages_context.py", commonPackagesContext);
85
86
  scripts.set("common/workflow_phase.py", commonWorkflowPhase);
86
87
  scripts.set("common/trellis_config.py", commonTrellisConfig);
88
+ scripts.set("common/safe_commit.py", commonSafeCommit);
87
89
  // Main
88
90
  scripts.set("get_developer.py", getDeveloperScript);
89
91
  scripts.set("init_developer.py", initDeveloperScript);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,gCAAgC,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,mCAAmC,CACpC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,oCAAoC,CACrC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,kCAAkC,CACnC,CAAC;AAEF,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAEvE,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAExC,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;IAE7D,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAEhD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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"}