@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
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Resolve a list of `--file` / `--jsonl` specs into the concatenated context
3
+ * string to be embedded in the worker's system prompt.
4
+ *
5
+ * --file <path-or-glob> direct file inclusion (glob expanded via fs.globSync)
6
+ * --jsonl <path> parse a Trellis jsonl manifest where each line is
7
+ * {"file": "<path>", "reason": "<why>"} and include
8
+ * each referenced file (reason becomes part of header)
9
+ *
10
+ * All paths are resolved relative to `cwd` (the spawn caller's cwd).
11
+ * Missing files are skipped with a stderr warning, not fatal.
12
+ * Each block is delimited with a header so the model can attribute content
13
+ * to its source file.
14
+ */
15
+ import fs from "node:fs";
16
+ import path from "node:path";
17
+ const MAX_PER_FILE_BYTES = 1_000_000; // 1MB hard cap per file
18
+ const WARN_PER_FILE_BYTES = 200_000; // stderr warn at 200KB
19
+ const WARN_TOTAL_BYTES = 500_000; // stderr warn when assembled context > 500KB
20
+ /**
21
+ * Path-traversal guard: resolve `target` and `cwd` to realpaths and
22
+ * verify `target` is `cwd` or a descendant. Refuses absolute paths
23
+ * outside cwd, `..`-escapes, and symlinks pointing outside.
24
+ *
25
+ * Returns the resolved realpath, or null if blocked (with stderr warning).
26
+ */
27
+ function jailedRealpath(target, cwd) {
28
+ const cwdReal = fs.realpathSync(cwd);
29
+ let real;
30
+ try {
31
+ real = fs.realpathSync(target);
32
+ }
33
+ catch {
34
+ // Target doesn't exist — fall back to the lexical resolution. The
35
+ // existence check happens later; we just need to ensure the lexical
36
+ // form is inside the jail.
37
+ real = path.resolve(target);
38
+ }
39
+ if (real !== cwdReal && !real.startsWith(cwdReal + path.sep)) {
40
+ process.stderr.write(`[channel spawn] context path escapes cwd, refusing: ${path.relative(cwd, target) || target}\n`);
41
+ return null;
42
+ }
43
+ return real;
44
+ }
45
+ /** Strip control characters that would break header lines in the system prompt. */
46
+ function safeHeader(s) {
47
+ // eslint-disable-next-line no-control-regex
48
+ return s.replace(/[\r\n\x00-\x08\x0b-\x1f\x7f]/g, " ");
49
+ }
50
+ export function assembleContext(cwd, files = [], jsonls = []) {
51
+ const blocks = [];
52
+ const manifestPaths = [];
53
+ for (const spec of files) {
54
+ for (const resolved of expandGlob(cwd, spec)) {
55
+ const jailed = jailedRealpath(resolved, cwd);
56
+ if (!jailed)
57
+ continue;
58
+ const block = readFileBlock(jailed, cwd, "file");
59
+ if (block)
60
+ blocks.push(block);
61
+ }
62
+ }
63
+ for (const jsonlPath of jsonls) {
64
+ const jailedJsonl = jailedRealpath(path.resolve(cwd, jsonlPath), cwd);
65
+ if (!jailedJsonl)
66
+ continue;
67
+ if (!fs.existsSync(jailedJsonl)) {
68
+ process.stderr.write(`[channel spawn] --jsonl: file not found, skipping: ${jsonlPath}\n`);
69
+ continue;
70
+ }
71
+ // Record the manifest path BEFORE consuming entries, so the spawned
72
+ // event reflects "user passed this manifest" even if it's empty.
73
+ manifestPaths.push(path.relative(cwd, jailedJsonl) || jsonlPath);
74
+ // Stream the manifest line-by-line instead of `readFileSync + split`,
75
+ // so a giant jsonl file doesn't double-allocate the string into memory.
76
+ for (const line of iterFileLines(jailedJsonl)) {
77
+ const t = line.trim();
78
+ if (!t)
79
+ continue;
80
+ let obj;
81
+ try {
82
+ obj = JSON.parse(t);
83
+ }
84
+ catch {
85
+ process.stderr.write(`[channel spawn] --jsonl: skipping unparseable line in ${jsonlPath}\n`);
86
+ continue;
87
+ }
88
+ if (obj._example !== undefined)
89
+ continue;
90
+ if (!obj.file)
91
+ continue;
92
+ const jailed = jailedRealpath(path.resolve(cwd, obj.file), cwd);
93
+ if (!jailed)
94
+ continue;
95
+ const block = readFileBlock(jailed, cwd, "jsonl", obj.reason);
96
+ if (block)
97
+ blocks.push(block);
98
+ }
99
+ }
100
+ if (blocks.length === 0) {
101
+ return { prompt: "", paths: [], manifests: manifestPaths };
102
+ }
103
+ // Use Buffer.byteLength so multi-byte (CJK / emoji etc.) content isn't
104
+ // undercounted vs. its on-the-wire size. The user is paying tokens by
105
+ // bytes, not characters.
106
+ const totalBytes = blocks.reduce((n, b) => n + Buffer.byteLength(b.content, "utf-8"), 0);
107
+ if (totalBytes > WARN_TOTAL_BYTES) {
108
+ process.stderr.write(`[channel spawn] warning: context is ${Math.round(totalBytes / 1024)}KB across ${blocks.length} files — large system prompt may exceed model context\n`);
109
+ }
110
+ return {
111
+ prompt: blocks.map(formatBlock).join("\n\n---\n\n"),
112
+ paths: blocks.map((b) => b.path),
113
+ manifests: manifestPaths,
114
+ };
115
+ }
116
+ /**
117
+ * Stream a UTF-8 file line by line without loading the whole file as one
118
+ * giant string. Yields each line (without trailing `\n`). Crashes /
119
+ * non-UTF8 content fall back gracefully.
120
+ */
121
+ function* iterFileLines(filePath) {
122
+ const fd = fs.openSync(filePath, "r");
123
+ try {
124
+ const buf = Buffer.allocUnsafe(64 * 1024);
125
+ let carry = "";
126
+ while (true) {
127
+ const n = fs.readSync(fd, buf, 0, buf.length, null);
128
+ if (n <= 0)
129
+ break;
130
+ const chunk = carry + buf.subarray(0, n).toString("utf-8");
131
+ const lines = chunk.split("\n");
132
+ carry = lines.pop() ?? "";
133
+ for (const line of lines)
134
+ yield line;
135
+ }
136
+ if (carry.length > 0)
137
+ yield carry;
138
+ }
139
+ finally {
140
+ try {
141
+ fs.closeSync(fd);
142
+ }
143
+ catch {
144
+ // ignore
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Minimal glob matcher. Supports:
150
+ * foo/bar.md — literal path
151
+ * foo/* .md — single segment wildcard within a directory
152
+ * foo/** /*.md — recursive subtree
153
+ * foo/** /*.md — recursive subtree
154
+ *
155
+ * Doesn't aim for full POSIX semantics — `?`, `{a,b}`, character classes etc.
156
+ * are out of scope for MVP. Quoting passes the literal pattern from shell.
157
+ */
158
+ function expandGlob(cwd, spec) {
159
+ if (!/[*?[]/.test(spec)) {
160
+ return [path.resolve(cwd, spec)];
161
+ }
162
+ // Split into static prefix + glob segments
163
+ const segments = spec.split(/[\\/]/).filter(Boolean);
164
+ let baseDir = cwd;
165
+ let i = 0;
166
+ while (i < segments.length && !/[*?[]/.test(segments[i])) {
167
+ baseDir = path.resolve(baseDir, segments[i]);
168
+ i++;
169
+ }
170
+ const globSegs = segments.slice(i);
171
+ if (globSegs.length === 0)
172
+ return [path.resolve(cwd, spec)];
173
+ if (!fs.existsSync(baseDir)) {
174
+ process.stderr.write(`[channel spawn] --file: glob base not found: ${path.relative(cwd, baseDir)}\n`);
175
+ return [];
176
+ }
177
+ const matches = [];
178
+ walkGlob(baseDir, globSegs, matches);
179
+ if (matches.length === 0) {
180
+ process.stderr.write(`[channel spawn] --file: glob matched no files: ${spec}\n`);
181
+ }
182
+ return matches;
183
+ }
184
+ function walkGlob(dir, segs, out) {
185
+ if (segs.length === 0)
186
+ return;
187
+ const [head, ...rest] = segs;
188
+ let entries;
189
+ try {
190
+ entries = fs.readdirSync(dir, { withFileTypes: true });
191
+ }
192
+ catch {
193
+ return;
194
+ }
195
+ if (head === "**") {
196
+ // ** matches zero or more directories.
197
+ // Zero case: try matching `rest` from current dir.
198
+ if (rest.length > 0)
199
+ walkGlob(dir, rest, out);
200
+ // Recurse into subdirs with ** still in front.
201
+ for (const e of entries) {
202
+ if (e.isDirectory()) {
203
+ walkGlob(path.join(dir, e.name), segs, out);
204
+ }
205
+ }
206
+ return;
207
+ }
208
+ const re = segmentToRegex(head);
209
+ for (const e of entries) {
210
+ if (!re.test(e.name))
211
+ continue;
212
+ const child = path.join(dir, e.name);
213
+ if (rest.length === 0) {
214
+ if (e.isFile())
215
+ out.push(child);
216
+ }
217
+ else if (e.isDirectory()) {
218
+ walkGlob(child, rest, out);
219
+ }
220
+ }
221
+ }
222
+ function segmentToRegex(seg) {
223
+ let re = "^";
224
+ for (const ch of seg) {
225
+ if (ch === "*")
226
+ re += "[^/]*";
227
+ else if (ch === "?")
228
+ re += "[^/]";
229
+ else if (".+()|^$\\{}[]".includes(ch))
230
+ re += "\\" + ch;
231
+ else
232
+ re += ch;
233
+ }
234
+ return new RegExp(re + "$");
235
+ }
236
+ function readFileBlock(absPath, cwd, source, reason) {
237
+ if (!fs.existsSync(absPath)) {
238
+ process.stderr.write(`[channel spawn] --${source}: file not found, skipping: ${path.relative(cwd, absPath)}\n`);
239
+ return null;
240
+ }
241
+ // lstat first: if it's a symlink, the realpath inside jailedRealpath
242
+ // has already verified the target stays inside cwd. Defense-in-depth:
243
+ // explicitly note symlinks so we never read through one we didn't
244
+ // realpath-check.
245
+ let lstat;
246
+ try {
247
+ lstat = fs.lstatSync(absPath);
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ if (lstat.isSymbolicLink()) {
253
+ // Should be impossible — jailedRealpath replaced absPath with the
254
+ // resolved realpath. Be defensive anyway.
255
+ process.stderr.write(`[channel spawn] --${source}: refusing unresolved symlink: ${path.relative(cwd, absPath)}\n`);
256
+ return null;
257
+ }
258
+ let stat;
259
+ try {
260
+ stat = fs.statSync(absPath);
261
+ }
262
+ catch {
263
+ return null;
264
+ }
265
+ if (!stat.isFile())
266
+ return null;
267
+ if (stat.size > MAX_PER_FILE_BYTES) {
268
+ process.stderr.write(`[channel spawn] --${source}: file too large (${Math.round(stat.size / 1024)}KB > ${MAX_PER_FILE_BYTES / 1024}KB cap), skipping: ${path.relative(cwd, absPath)}\n`);
269
+ return null;
270
+ }
271
+ if (stat.size > WARN_PER_FILE_BYTES) {
272
+ process.stderr.write(`[channel spawn] warning: large file (${Math.round(stat.size / 1024)}KB) included: ${path.relative(cwd, absPath)}\n`);
273
+ }
274
+ const content = fs.readFileSync(absPath, "utf-8");
275
+ return {
276
+ path: path.relative(cwd, absPath),
277
+ source,
278
+ reason,
279
+ content,
280
+ };
281
+ }
282
+ function formatBlock(b) {
283
+ const safePath = safeHeader(b.path);
284
+ const safeReason = b.reason ? safeHeader(b.reason) : undefined;
285
+ const header = b.source === "jsonl" && safeReason
286
+ ? `# Context: ${safePath}\n# Reason: ${safeReason}`
287
+ : `# Context: ${safePath}`;
288
+ return `${header}\n\n${b.content.trimEnd()}`;
289
+ }
290
+ //# sourceMappingURL=context-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-loader.js","sourceRoot":"","sources":["../../../src/commands/channel/context-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,kBAAkB,GAAG,SAAS,CAAC,CAAC,wBAAwB;AAC9D,MAAM,mBAAmB,GAAG,OAAO,CAAC,CAAC,uBAAuB;AAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,6CAA6C;AAE/E;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,MAAc,EAAE,GAAW;IACjD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,oEAAoE;QACpE,2BAA2B;QAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uDAAuD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,IAAI,CAChG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mFAAmF;AACnF,SAAS,UAAU,CAAC,CAAS;IAC3B,4CAA4C;IAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAaD,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,QAAkB,EAAE,EACpB,SAAmB,EAAE;IAErB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDAAsD,SAAS,IAAI,CACpE,CAAC;YACF,SAAS;QACX,CAAC;QACD,oEAAoE;QACpE,iEAAiE;QACjE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,SAAS,CAAC,CAAC;QACjE,sEAAsE;QACtE,wEAAwE;QACxE,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,IAAI,GAA2D,CAAC;YAChE,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yDAAyD,SAAS,IAAI,CACvE,CAAC;gBACF,SAAS;YACX,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACzC,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,SAAS;YACxB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC7D,CAAC;IAED,uEAAuE;IACvE,sEAAsE;IACtE,yBAAyB;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EACnD,CAAC,CACF,CAAC;IACF,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,yDAAyD,CACxJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACnD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChC,SAAS,EAAE,aAAa;KACzB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,QAAQ,CAAC,CAAC,aAAa,CAAC,QAAgB;IACtC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM;YAClB,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,MAAM,IAAI,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,CAAC;IACN,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gDAAgD,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAChF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kDAAkD,IAAI,IAAI,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAc,EAAE,GAAa;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7B,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,uCAAuC;QACvC,mDAAmD;QACnD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,+CAA+C;QAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,MAAM,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3B,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,EAAE,KAAK,GAAG;YAAE,EAAE,IAAI,OAAO,CAAC;aACzB,IAAI,EAAE,KAAK,GAAG;YAAE,EAAE,IAAI,MAAM,CAAC;aAC7B,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;;YAClD,EAAE,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CACpB,OAAe,EACf,GAAW,EACX,MAAwB,EACxB,MAAe;IAEf,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,MAAM,+BAA+B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAC1F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qEAAqE;IACrE,sEAAsE;IACtE,kEAAkE;IAClE,kBAAkB;IAClB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3B,kEAAkE;QAClE,0CAA0C;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,MAAM,kCAAkC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAC7F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,GAAG,kBAAkB,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,MAAM,qBAAqB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,kBAAkB,GAAG,IAAI,sBAAsB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CACnK,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,mBAAmB,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CACrH,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;QACjC,MAAM;QACN,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAe;IAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,MAAM,GACV,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,UAAU;QAChC,CAAC,CAAC,cAAc,QAAQ,eAAe,UAAU,EAAE;QACnD,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC;IAC/B,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ContextMutateCliOptions {
2
+ as?: string;
3
+ scope?: string;
4
+ thread?: string;
5
+ file?: string[];
6
+ raw?: string[];
7
+ }
8
+ export interface ContextListCliOptions {
9
+ scope?: string;
10
+ thread?: string;
11
+ raw?: boolean;
12
+ }
13
+ export declare function channelContextAdd(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
14
+ export declare function channelContextDelete(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
15
+ export declare function channelContextList(channelName: string, opts: ContextListCliOptions): Promise<void>;
16
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,83 @@
1
+ import { addChannelContext, addThreadContext, buildContextEntries, deleteChannelContext, deleteThreadContext, listChannelContext, listThreadContext, } from "@mindfoldhq/trellis-core/channel";
2
+ import { parseChannelScope } from "./store/schema.js";
3
+ export async function channelContextAdd(channelName, opts) {
4
+ const context = buildContextEntries(opts.file, opts.raw);
5
+ if (!context) {
6
+ throw new Error("Provide at least one --file <abs-path> or --raw <text>");
7
+ }
8
+ const scope = parseChannelScope(opts.scope);
9
+ const event = opts.thread
10
+ ? await addThreadContext({
11
+ channel: channelName,
12
+ by: opts.as ?? "main",
13
+ thread: opts.thread,
14
+ context,
15
+ ...(scope !== undefined ? { scope } : {}),
16
+ origin: "cli",
17
+ })
18
+ : await addChannelContext({
19
+ channel: channelName,
20
+ by: opts.as ?? "main",
21
+ context,
22
+ ...(scope !== undefined ? { scope } : {}),
23
+ origin: "cli",
24
+ });
25
+ console.log(JSON.stringify(event));
26
+ }
27
+ export async function channelContextDelete(channelName, opts) {
28
+ const context = buildContextEntries(opts.file, opts.raw);
29
+ if (!context) {
30
+ throw new Error("Provide at least one --file <abs-path> or --raw <text>");
31
+ }
32
+ const scope = parseChannelScope(opts.scope);
33
+ const event = opts.thread
34
+ ? await deleteThreadContext({
35
+ channel: channelName,
36
+ by: opts.as ?? "main",
37
+ thread: opts.thread,
38
+ context,
39
+ ...(scope !== undefined ? { scope } : {}),
40
+ origin: "cli",
41
+ })
42
+ : await deleteChannelContext({
43
+ channel: channelName,
44
+ by: opts.as ?? "main",
45
+ context,
46
+ ...(scope !== undefined ? { scope } : {}),
47
+ origin: "cli",
48
+ });
49
+ console.log(JSON.stringify(event));
50
+ }
51
+ export async function channelContextList(channelName, opts) {
52
+ const scope = parseChannelScope(opts.scope);
53
+ const entries = opts.thread
54
+ ? await listThreadContext({
55
+ channel: channelName,
56
+ thread: opts.thread,
57
+ ...(scope !== undefined ? { scope } : {}),
58
+ })
59
+ : await listChannelContext({
60
+ channel: channelName,
61
+ ...(scope !== undefined ? { scope } : {}),
62
+ });
63
+ if (opts.raw) {
64
+ for (const entry of entries)
65
+ console.log(JSON.stringify(entry));
66
+ return;
67
+ }
68
+ if (entries.length === 0) {
69
+ console.log("(no context)");
70
+ return;
71
+ }
72
+ for (const entry of entries) {
73
+ if (entry.type === "file") {
74
+ console.log(`file ${entry.path}`);
75
+ }
76
+ else {
77
+ const oneLine = entry.text.replace(/\s+/g, " ").trim();
78
+ const display = oneLine.length > 200 ? `${oneLine.slice(0, 200)}…` : oneLine;
79
+ console.log(`raw ${display}`);
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface CreateOptions {
2
+ task?: string;
3
+ project?: string;
4
+ labels?: string;
5
+ cwd?: string;
6
+ scope?: string;
7
+ type?: string;
8
+ description?: string;
9
+ /** New canonical flag list. */
10
+ contextFile?: string[];
11
+ contextRaw?: string[];
12
+ /** Legacy aliases accepted while users migrate scripts. */
13
+ linkedContextFile?: string[];
14
+ linkedContextRaw?: string[];
15
+ by?: string;
16
+ force?: boolean;
17
+ ephemeral?: boolean;
18
+ /**
19
+ * Optional mode marker for callers like `channel run` that produce
20
+ * one-shot channels. Stored as `meta.trellis.createMode` so the
21
+ * channel event keeps an `origin: "cli"` write entrypoint while still
22
+ * exposing the mode for downstream consumers.
23
+ */
24
+ origin?: string;
25
+ }
26
+ export declare function createChannel(name: string, opts: CreateOptions): Promise<void>;
27
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,39 @@
1
+ import { buildContextEntries, createChannel as coreCreateChannel, resolveChannelRef, } from "@mindfoldhq/trellis-core/channel";
2
+ import { parseChannelScope, parseChannelType, parseCsv, } from "./store/schema.js";
3
+ export async function createChannel(name, opts) {
4
+ const scope = parseChannelScope(opts.scope) ?? "project";
5
+ const channelType = parseChannelType(opts.type);
6
+ const context = buildContextEntries([...(opts.contextFile ?? []), ...(opts.linkedContextFile ?? [])], [...(opts.contextRaw ?? []), ...(opts.linkedContextRaw ?? [])]);
7
+ const labels = parseCsv(opts.labels);
8
+ const createMode = opts.origin;
9
+ const event = await coreCreateChannel({
10
+ channel: name,
11
+ by: opts.by ?? "main",
12
+ scope,
13
+ type: channelType,
14
+ ...(opts.cwd ? { cwd: opts.cwd } : {}),
15
+ ...(opts.task ? { task: opts.task } : {}),
16
+ ...(opts.project ? { project: opts.project } : {}),
17
+ ...(labels ? { labels } : {}),
18
+ ...(opts.description ? { description: opts.description } : {}),
19
+ ...(context ? { context } : {}),
20
+ ...(opts.ephemeral ? { ephemeral: true } : {}),
21
+ ...(opts.force ? { force: true } : {}),
22
+ origin: "cli",
23
+ ...(createMode ? { meta: { trellis: { createMode } } } : {}),
24
+ });
25
+ console.log(`Created channel '${name}' (${channelType}) at ${channelDirFromEvent(name, event.scope, opts.cwd)}`);
26
+ if (opts.ephemeral) {
27
+ process.stderr.write("ephemeral channel is hidden from `channel list`; use `channel list --all` or `channel prune --ephemeral`\n");
28
+ }
29
+ }
30
+ function channelDirFromEvent(name, scope, cwd) {
31
+ const ref = resolveChannelRef({
32
+ channel: name,
33
+ scope,
34
+ forCreate: true,
35
+ ...(cwd !== undefined ? { cwd } : {}),
36
+ });
37
+ return ref.dir;
38
+ }
39
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Dev-only command: feed a recorded stream-json / wire trace into the
3
+ * matching adapter and print the resulting channel events as JSON lines.
4
+ *
5
+ * Not user-facing; used during adapter development to verify against
6
+ * real-CLI fixtures (see research/probes/).
7
+ *
8
+ * NOTE: codex traces only contain inbound lines (server → us). For probe
9
+ * fixtures recorded by codex-probe.mjs, outbound request ids are not in the
10
+ * trace; we pre-seed the ctx with the ids the probe used (1 for initialize,
11
+ * 2 for thread/start, 3 for turn/start) so id-matching works.
12
+ */
13
+ export declare function parseTrace(adapter: "claude" | "codex", file: string): void;
14
+ //# sourceMappingURL=dev-parse-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-parse-trace.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/dev-parse-trace.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA6B1E"}
@@ -0,0 +1,70 @@
1
+ import fs from "node:fs";
2
+ import { parseClaudeLine } from "./adapters/claude.js";
3
+ import { createCodexCtx, parseCodexLine } from "./adapters/codex.js";
4
+ /**
5
+ * Dev-only command: feed a recorded stream-json / wire trace into the
6
+ * matching adapter and print the resulting channel events as JSON lines.
7
+ *
8
+ * Not user-facing; used during adapter development to verify against
9
+ * real-CLI fixtures (see research/probes/).
10
+ *
11
+ * NOTE: codex traces only contain inbound lines (server → us). For probe
12
+ * fixtures recorded by codex-probe.mjs, outbound request ids are not in the
13
+ * trace; we pre-seed the ctx with the ids the probe used (1 for initialize,
14
+ * 2 for thread/start, 3 for turn/start) so id-matching works.
15
+ */
16
+ export function parseTrace(adapter, file) {
17
+ const raw = fs.readFileSync(file, "utf-8");
18
+ const lines = raw.split("\n");
19
+ let lineNo = 0;
20
+ if (adapter === "claude") {
21
+ for (const line of lines) {
22
+ lineNo++;
23
+ if (!line.trim())
24
+ continue;
25
+ const result = parseClaudeLine(line);
26
+ printResult(lineNo, result);
27
+ }
28
+ return;
29
+ }
30
+ // adapter === "codex"
31
+ const ctx = createCodexCtx();
32
+ // Pre-seed pending so the recorded responses (id=1,2,3) match.
33
+ ctx.pending.set(1, "initialize");
34
+ ctx.pending.set(2, "thread/start");
35
+ ctx.pending.set(3, "turn/start");
36
+ ctx.nextId = 4;
37
+ for (const line of lines) {
38
+ lineNo++;
39
+ if (!line.trim())
40
+ continue;
41
+ const result = parseCodexLine(line, ctx);
42
+ printResult(lineNo, result);
43
+ }
44
+ }
45
+ function printResult(lineNo, result) {
46
+ for (const ev of result.events) {
47
+ console.log(JSON.stringify({ line: lineNo, ...ev }));
48
+ }
49
+ if (result.side) {
50
+ const { reply, resolved, ...persist } = result.side;
51
+ if (Object.keys(persist).length > 0) {
52
+ console.log(JSON.stringify({ line: lineNo, kind: "<side-effect>", ...persist }));
53
+ }
54
+ if (reply && reply.length > 0) {
55
+ for (const r of reply) {
56
+ console.log(JSON.stringify({
57
+ line: lineNo,
58
+ kind: "<outbound>",
59
+ text: r.trim(),
60
+ }));
61
+ }
62
+ }
63
+ if (resolved && resolved.length > 0) {
64
+ for (const r of resolved) {
65
+ console.log(JSON.stringify({ line: lineNo, kind: "<rpc-resolved>", ...r }));
66
+ }
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=dev-parse-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-parse-trace.js","sourceRoot":"","sources":["../../../src/commands/channel/dev-parse-trace.ts"],"names":[],"mappings":"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"}