@chinhae/atw-cli 0.1.0

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 (710) hide show
  1. package/COPYRIGHT +14 -0
  2. package/LICENSE +77 -0
  3. package/README.md +122 -0
  4. package/bin/atw.js +3 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +299 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/commands/ablate.d.ts +14 -0
  10. package/dist/commands/ablate.d.ts.map +1 -0
  11. package/dist/commands/ablate.js +307 -0
  12. package/dist/commands/ablate.js.map +1 -0
  13. package/dist/commands/channel/adapters/claude.d.ts +53 -0
  14. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  15. package/dist/commands/channel/adapters/claude.js +225 -0
  16. package/dist/commands/channel/adapters/claude.js.map +1 -0
  17. package/dist/commands/channel/adapters/codex.d.ts +93 -0
  18. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  19. package/dist/commands/channel/adapters/codex.js +573 -0
  20. package/dist/commands/channel/adapters/codex.js.map +1 -0
  21. package/dist/commands/channel/adapters/index.d.ts +94 -0
  22. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  23. package/dist/commands/channel/adapters/index.js +116 -0
  24. package/dist/commands/channel/adapters/index.js.map +1 -0
  25. package/dist/commands/channel/adapters/types.d.ts +33 -0
  26. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  27. package/dist/commands/channel/adapters/types.js +2 -0
  28. package/dist/commands/channel/adapters/types.js.map +1 -0
  29. package/dist/commands/channel/agent-loader.d.ts +32 -0
  30. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  31. package/dist/commands/channel/agent-loader.js +158 -0
  32. package/dist/commands/channel/agent-loader.js.map +1 -0
  33. package/dist/commands/channel/context-loader.d.ts +26 -0
  34. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  35. package/dist/commands/channel/context-loader.js +311 -0
  36. package/dist/commands/channel/context-loader.js.map +1 -0
  37. package/dist/commands/channel/context-trust.d.ts +31 -0
  38. package/dist/commands/channel/context-trust.d.ts.map +1 -0
  39. package/dist/commands/channel/context-trust.js +139 -0
  40. package/dist/commands/channel/context-trust.js.map +1 -0
  41. package/dist/commands/channel/context.d.ts +16 -0
  42. package/dist/commands/channel/context.d.ts.map +1 -0
  43. package/dist/commands/channel/context.js +83 -0
  44. package/dist/commands/channel/context.js.map +1 -0
  45. package/dist/commands/channel/create.d.ts +27 -0
  46. package/dist/commands/channel/create.d.ts.map +1 -0
  47. package/dist/commands/channel/create.js +39 -0
  48. package/dist/commands/channel/create.js.map +1 -0
  49. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  50. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  51. package/dist/commands/channel/dev-parse-trace.js +70 -0
  52. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  53. package/dist/commands/channel/guard.d.ts +150 -0
  54. package/dist/commands/channel/guard.d.ts.map +1 -0
  55. package/dist/commands/channel/guard.js +479 -0
  56. package/dist/commands/channel/guard.js.map +1 -0
  57. package/dist/commands/channel/index.d.ts +3 -0
  58. package/dist/commands/channel/index.d.ts.map +1 -0
  59. package/dist/commands/channel/index.js +535 -0
  60. package/dist/commands/channel/index.js.map +1 -0
  61. package/dist/commands/channel/interrupt.d.ts +10 -0
  62. package/dist/commands/channel/interrupt.d.ts.map +1 -0
  63. package/dist/commands/channel/interrupt.js +22 -0
  64. package/dist/commands/channel/interrupt.js.map +1 -0
  65. package/dist/commands/channel/kill.d.ts +7 -0
  66. package/dist/commands/channel/kill.d.ts.map +1 -0
  67. package/dist/commands/channel/kill.js +130 -0
  68. package/dist/commands/channel/kill.js.map +1 -0
  69. package/dist/commands/channel/list.d.ts +17 -0
  70. package/dist/commands/channel/list.d.ts.map +1 -0
  71. package/dist/commands/channel/list.js +233 -0
  72. package/dist/commands/channel/list.js.map +1 -0
  73. package/dist/commands/channel/messages.d.ts +15 -0
  74. package/dist/commands/channel/messages.d.ts.map +1 -0
  75. package/dist/commands/channel/messages.js +245 -0
  76. package/dist/commands/channel/messages.js.map +1 -0
  77. package/dist/commands/channel/rm.d.ts +27 -0
  78. package/dist/commands/channel/rm.d.ts.map +1 -0
  79. package/dist/commands/channel/rm.js +216 -0
  80. package/dist/commands/channel/rm.js.map +1 -0
  81. package/dist/commands/channel/run.d.ts +30 -0
  82. package/dist/commands/channel/run.d.ts.map +1 -0
  83. package/dist/commands/channel/run.js +130 -0
  84. package/dist/commands/channel/run.js.map +1 -0
  85. package/dist/commands/channel/send.d.ts +11 -0
  86. package/dist/commands/channel/send.d.ts.map +1 -0
  87. package/dist/commands/channel/send.js +24 -0
  88. package/dist/commands/channel/send.js.map +1 -0
  89. package/dist/commands/channel/spawn.d.ts +43 -0
  90. package/dist/commands/channel/spawn.d.ts.map +1 -0
  91. package/dist/commands/channel/spawn.js +247 -0
  92. package/dist/commands/channel/spawn.js.map +1 -0
  93. package/dist/commands/channel/store/events.d.ts +22 -0
  94. package/dist/commands/channel/store/events.d.ts.map +1 -0
  95. package/dist/commands/channel/store/events.js +43 -0
  96. package/dist/commands/channel/store/events.js.map +1 -0
  97. package/dist/commands/channel/store/filter.d.ts +3 -0
  98. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  99. package/dist/commands/channel/store/filter.js +2 -0
  100. package/dist/commands/channel/store/filter.js.map +1 -0
  101. package/dist/commands/channel/store/lock.d.ts +23 -0
  102. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  103. package/dist/commands/channel/store/lock.js +99 -0
  104. package/dist/commands/channel/store/lock.js.map +1 -0
  105. package/dist/commands/channel/store/paths.d.ts +77 -0
  106. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  107. package/dist/commands/channel/store/paths.js +272 -0
  108. package/dist/commands/channel/store/paths.js.map +1 -0
  109. package/dist/commands/channel/store/schema.d.ts +27 -0
  110. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  111. package/dist/commands/channel/store/schema.js +34 -0
  112. package/dist/commands/channel/store/schema.js.map +1 -0
  113. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  114. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  115. package/dist/commands/channel/store/thread-state.js +16 -0
  116. package/dist/commands/channel/store/thread-state.js.map +1 -0
  117. package/dist/commands/channel/store/watch.d.ts +19 -0
  118. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  119. package/dist/commands/channel/store/watch.js +153 -0
  120. package/dist/commands/channel/store/watch.js.map +1 -0
  121. package/dist/commands/channel/supervisor/idle.d.ts +45 -0
  122. package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
  123. package/dist/commands/channel/supervisor/idle.js +70 -0
  124. package/dist/commands/channel/supervisor/idle.js.map +1 -0
  125. package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
  126. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  127. package/dist/commands/channel/supervisor/inbox.js +160 -0
  128. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  129. package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
  130. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  131. package/dist/commands/channel/supervisor/shutdown.js +146 -0
  132. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  133. package/dist/commands/channel/supervisor/stdout.d.ts +71 -0
  134. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  135. package/dist/commands/channel/supervisor/stdout.js +229 -0
  136. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  137. package/dist/commands/channel/supervisor/turns.d.ts +31 -0
  138. package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
  139. package/dist/commands/channel/supervisor/turns.js +45 -0
  140. package/dist/commands/channel/supervisor/turns.js.map +1 -0
  141. package/dist/commands/channel/supervisor/warning.d.ts +48 -0
  142. package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
  143. package/dist/commands/channel/supervisor/warning.js +77 -0
  144. package/dist/commands/channel/supervisor/warning.js.map +1 -0
  145. package/dist/commands/channel/supervisor.d.ts +91 -0
  146. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  147. package/dist/commands/channel/supervisor.js +463 -0
  148. package/dist/commands/channel/supervisor.js.map +1 -0
  149. package/dist/commands/channel/text-body.d.ts +13 -0
  150. package/dist/commands/channel/text-body.d.ts.map +1 -0
  151. package/dist/commands/channel/text-body.js +47 -0
  152. package/dist/commands/channel/text-body.js.map +1 -0
  153. package/dist/commands/channel/threads.d.ts +39 -0
  154. package/dist/commands/channel/threads.d.ts.map +1 -0
  155. package/dist/commands/channel/threads.js +106 -0
  156. package/dist/commands/channel/threads.js.map +1 -0
  157. package/dist/commands/channel/title.d.ts +12 -0
  158. package/dist/commands/channel/title.d.ts.map +1 -0
  159. package/dist/commands/channel/title.js +24 -0
  160. package/dist/commands/channel/title.js.map +1 -0
  161. package/dist/commands/channel/wait.d.ts +17 -0
  162. package/dist/commands/channel/wait.d.ts.map +1 -0
  163. package/dist/commands/channel/wait.js +75 -0
  164. package/dist/commands/channel/wait.js.map +1 -0
  165. package/dist/commands/init.d.ts +71 -0
  166. package/dist/commands/init.d.ts.map +1 -0
  167. package/dist/commands/init.js +1612 -0
  168. package/dist/commands/init.js.map +1 -0
  169. package/dist/commands/mem.d.ts +30 -0
  170. package/dist/commands/mem.d.ts.map +1 -0
  171. package/dist/commands/mem.js +423 -0
  172. package/dist/commands/mem.js.map +1 -0
  173. package/dist/commands/uninstall.d.ts +36 -0
  174. package/dist/commands/uninstall.d.ts.map +1 -0
  175. package/dist/commands/uninstall.js +205 -0
  176. package/dist/commands/uninstall.js.map +1 -0
  177. package/dist/commands/update.d.ts +133 -0
  178. package/dist/commands/update.d.ts.map +1 -0
  179. package/dist/commands/update.js +2255 -0
  180. package/dist/commands/update.js.map +1 -0
  181. package/dist/commands/upgrade.d.ts +28 -0
  182. package/dist/commands/upgrade.d.ts.map +1 -0
  183. package/dist/commands/upgrade.js +84 -0
  184. package/dist/commands/upgrade.js.map +1 -0
  185. package/dist/commands/workflow.d.ts +35 -0
  186. package/dist/commands/workflow.d.ts.map +1 -0
  187. package/dist/commands/workflow.js +232 -0
  188. package/dist/commands/workflow.js.map +1 -0
  189. package/dist/configurators/antigravity.d.ts +7 -0
  190. package/dist/configurators/antigravity.d.ts.map +1 -0
  191. package/dist/configurators/antigravity.js +11 -0
  192. package/dist/configurators/antigravity.js.map +1 -0
  193. package/dist/configurators/claude.d.ts +23 -0
  194. package/dist/configurators/claude.d.ts.map +1 -0
  195. package/dist/configurators/claude.js +123 -0
  196. package/dist/configurators/claude.js.map +1 -0
  197. package/dist/configurators/codebuddy.d.ts +10 -0
  198. package/dist/configurators/codebuddy.d.ts.map +1 -0
  199. package/dist/configurators/codebuddy.js +24 -0
  200. package/dist/configurators/codebuddy.js.map +1 -0
  201. package/dist/configurators/codex.d.ts +57 -0
  202. package/dist/configurators/codex.d.ts.map +1 -0
  203. package/dist/configurators/codex.js +170 -0
  204. package/dist/configurators/codex.js.map +1 -0
  205. package/dist/configurators/copilot.d.ts +18 -0
  206. package/dist/configurators/copilot.d.ts.map +1 -0
  207. package/dist/configurators/copilot.js +50 -0
  208. package/dist/configurators/copilot.js.map +1 -0
  209. package/dist/configurators/cursor.d.ts +10 -0
  210. package/dist/configurators/cursor.d.ts.map +1 -0
  211. package/dist/configurators/cursor.js +23 -0
  212. package/dist/configurators/cursor.js.map +1 -0
  213. package/dist/configurators/devin.d.ts +8 -0
  214. package/dist/configurators/devin.d.ts.map +1 -0
  215. package/dist/configurators/devin.js +12 -0
  216. package/dist/configurators/devin.js.map +1 -0
  217. package/dist/configurators/droid.d.ts +10 -0
  218. package/dist/configurators/droid.d.ts.map +1 -0
  219. package/dist/configurators/droid.js +24 -0
  220. package/dist/configurators/droid.js.map +1 -0
  221. package/dist/configurators/dsh.d.ts +29 -0
  222. package/dist/configurators/dsh.d.ts.map +1 -0
  223. package/dist/configurators/dsh.js +64 -0
  224. package/dist/configurators/dsh.js.map +1 -0
  225. package/dist/configurators/gemini.d.ts +19 -0
  226. package/dist/configurators/gemini.d.ts.map +1 -0
  227. package/dist/configurators/gemini.js +40 -0
  228. package/dist/configurators/gemini.js.map +1 -0
  229. package/dist/configurators/grok.d.ts +17 -0
  230. package/dist/configurators/grok.d.ts.map +1 -0
  231. package/dist/configurators/grok.js +38 -0
  232. package/dist/configurators/grok.js.map +1 -0
  233. package/dist/configurators/index.d.ts +68 -0
  234. package/dist/configurators/index.d.ts.map +1 -0
  235. package/dist/configurators/index.js +191 -0
  236. package/dist/configurators/index.js.map +1 -0
  237. package/dist/configurators/kilo.d.ts +7 -0
  238. package/dist/configurators/kilo.d.ts.map +1 -0
  239. package/dist/configurators/kilo.js +11 -0
  240. package/dist/configurators/kilo.js.map +1 -0
  241. package/dist/configurators/kimi.d.ts +26 -0
  242. package/dist/configurators/kimi.d.ts.map +1 -0
  243. package/dist/configurators/kimi.js +74 -0
  244. package/dist/configurators/kimi.js.map +1 -0
  245. package/dist/configurators/kiro.d.ts +11 -0
  246. package/dist/configurators/kiro.d.ts.map +1 -0
  247. package/dist/configurators/kiro.js +30 -0
  248. package/dist/configurators/kiro.js.map +1 -0
  249. package/dist/configurators/omp.d.ts +6 -0
  250. package/dist/configurators/omp.d.ts.map +1 -0
  251. package/dist/configurators/omp.js +28 -0
  252. package/dist/configurators/omp.js.map +1 -0
  253. package/dist/configurators/opencode.d.ts +5 -0
  254. package/dist/configurators/opencode.d.ts.map +1 -0
  255. package/dist/configurators/opencode.js +80 -0
  256. package/dist/configurators/opencode.js.map +1 -0
  257. package/dist/configurators/pi.d.ts +5 -0
  258. package/dist/configurators/pi.d.ts.map +1 -0
  259. package/dist/configurators/pi.js +39 -0
  260. package/dist/configurators/pi.js.map +1 -0
  261. package/dist/configurators/qoder.d.ts +12 -0
  262. package/dist/configurators/qoder.d.ts.map +1 -0
  263. package/dist/configurators/qoder.js +30 -0
  264. package/dist/configurators/qoder.js.map +1 -0
  265. package/dist/configurators/reasonix.d.ts +17 -0
  266. package/dist/configurators/reasonix.d.ts.map +1 -0
  267. package/dist/configurators/reasonix.js +37 -0
  268. package/dist/configurators/reasonix.js.map +1 -0
  269. package/dist/configurators/shared.d.ts +196 -0
  270. package/dist/configurators/shared.d.ts.map +1 -0
  271. package/dist/configurators/shared.js +600 -0
  272. package/dist/configurators/shared.js.map +1 -0
  273. package/dist/configurators/snow.d.ts +25 -0
  274. package/dist/configurators/snow.d.ts.map +1 -0
  275. package/dist/configurators/snow.js +69 -0
  276. package/dist/configurators/snow.js.map +1 -0
  277. package/dist/configurators/trae.d.ts +16 -0
  278. package/dist/configurators/trae.d.ts.map +1 -0
  279. package/dist/configurators/trae.js +34 -0
  280. package/dist/configurators/trae.js.map +1 -0
  281. package/dist/configurators/workflow.d.ts +51 -0
  282. package/dist/configurators/workflow.d.ts.map +1 -0
  283. package/dist/configurators/workflow.js +210 -0
  284. package/dist/configurators/workflow.js.map +1 -0
  285. package/dist/configurators/zcode.d.ts +19 -0
  286. package/dist/configurators/zcode.d.ts.map +1 -0
  287. package/dist/configurators/zcode.js +51 -0
  288. package/dist/configurators/zcode.js.map +1 -0
  289. package/dist/constants/paths.d.ts +74 -0
  290. package/dist/constants/paths.d.ts.map +1 -0
  291. package/dist/constants/paths.js +83 -0
  292. package/dist/constants/paths.js.map +1 -0
  293. package/dist/constants/version.d.ts +9 -0
  294. package/dist/constants/version.d.ts.map +1 -0
  295. package/dist/constants/version.js +15 -0
  296. package/dist/constants/version.js.map +1 -0
  297. package/dist/index.d.ts +9 -0
  298. package/dist/index.d.ts.map +1 -0
  299. package/dist/index.js +9 -0
  300. package/dist/index.js.map +1 -0
  301. package/dist/migrations/index.d.ts +65 -0
  302. package/dist/migrations/index.d.ts.map +1 -0
  303. package/dist/migrations/index.js +202 -0
  304. package/dist/migrations/index.js.map +1 -0
  305. package/dist/templates/atw/agents/implement-agent.md +69 -0
  306. package/dist/templates/atw/agents/review.md +68 -0
  307. package/dist/templates/atw/config.yaml +158 -0
  308. package/dist/templates/atw/gitattributes.txt +9 -0
  309. package/dist/templates/atw/gitignore.txt +32 -0
  310. package/dist/templates/atw/index.d.ts +70 -0
  311. package/dist/templates/atw/index.d.ts.map +1 -0
  312. package/dist/templates/atw/index.js +137 -0
  313. package/dist/templates/atw/index.js.map +1 -0
  314. package/dist/templates/atw/scripts/__init__.py +5 -0
  315. package/dist/templates/atw/scripts/add_session.py +1545 -0
  316. package/dist/templates/atw/scripts/common/__init__.py +94 -0
  317. package/dist/templates/atw/scripts/common/active_task.py +857 -0
  318. package/dist/templates/atw/scripts/common/atw_config.py +239 -0
  319. package/dist/templates/atw/scripts/common/cli_adapter.py +949 -0
  320. package/dist/templates/atw/scripts/common/config.py +482 -0
  321. package/dist/templates/atw/scripts/common/developer.py +192 -0
  322. package/dist/templates/atw/scripts/common/git.py +203 -0
  323. package/dist/templates/atw/scripts/common/git_context.py +106 -0
  324. package/dist/templates/atw/scripts/common/io.py +160 -0
  325. package/dist/templates/atw/scripts/common/log.py +45 -0
  326. package/dist/templates/atw/scripts/common/packages_context.py +238 -0
  327. package/dist/templates/atw/scripts/common/paths.py +543 -0
  328. package/dist/templates/atw/scripts/common/safe_commit.py +322 -0
  329. package/dist/templates/atw/scripts/common/session_context.py +892 -0
  330. package/dist/templates/atw/scripts/common/task_context.py +470 -0
  331. package/dist/templates/atw/scripts/common/task_queue.py +188 -0
  332. package/dist/templates/atw/scripts/common/task_store.py +1940 -0
  333. package/dist/templates/atw/scripts/common/task_utils.py +498 -0
  334. package/dist/templates/atw/scripts/common/tasks.py +122 -0
  335. package/dist/templates/atw/scripts/common/types.py +110 -0
  336. package/dist/templates/atw/scripts/common/workflow_phase.py +242 -0
  337. package/dist/templates/atw/scripts/get_context.py +16 -0
  338. package/dist/templates/atw/scripts/get_developer.py +26 -0
  339. package/dist/templates/atw/scripts/github_sync.py +391 -0
  340. package/dist/templates/atw/scripts/hooks/linear_sync.py +243 -0
  341. package/dist/templates/atw/scripts/init_developer.py +51 -0
  342. package/dist/templates/atw/scripts/task.py +833 -0
  343. package/dist/templates/atw/scripts/tickets.py +495 -0
  344. package/dist/templates/atw/tasks/.gitkeep +0 -0
  345. package/dist/templates/atw/workflow.md +754 -0
  346. package/dist/templates/claude/agents/atw-implement-agent.md +107 -0
  347. package/dist/templates/claude/agents/atw-review.md +113 -0
  348. package/dist/templates/claude/hooks/statusline.py +332 -0
  349. package/dist/templates/claude/index.d.ts +31 -0
  350. package/dist/templates/claude/index.d.ts.map +1 -0
  351. package/dist/templates/claude/index.js +57 -0
  352. package/dist/templates/claude/index.js.map +1 -0
  353. package/dist/templates/claude/settings.json +73 -0
  354. package/dist/templates/codebuddy/agents/atw-implement-agent.md +107 -0
  355. package/dist/templates/codebuddy/agents/atw-review.md +113 -0
  356. package/dist/templates/codebuddy/index.d.ts +15 -0
  357. package/dist/templates/codebuddy/index.d.ts.map +1 -0
  358. package/dist/templates/codebuddy/index.js +15 -0
  359. package/dist/templates/codebuddy/index.js.map +1 -0
  360. package/dist/templates/codebuddy/settings.json +69 -0
  361. package/dist/templates/codex/agents/atw-implement-agent.toml +37 -0
  362. package/dist/templates/codex/agents/atw-review.toml +56 -0
  363. package/dist/templates/codex/config.toml +39 -0
  364. package/dist/templates/codex/hooks/session-start.py +514 -0
  365. package/dist/templates/codex/hooks.json +27 -0
  366. package/dist/templates/codex/index.d.ts +35 -0
  367. package/dist/templates/codex/index.d.ts.map +1 -0
  368. package/dist/templates/codex/index.js +67 -0
  369. package/dist/templates/codex/index.js.map +1 -0
  370. package/dist/templates/common/bundled-skills/atw-askme/SKILL.md +7 -0
  371. package/dist/templates/common/bundled-skills/atw-askme/agents/openai.yaml +5 -0
  372. package/dist/templates/common/bundled-skills/atw-askme-with-docs/SKILL.md +7 -0
  373. package/dist/templates/common/bundled-skills/atw-askme-with-docs/agents/openai.yaml +5 -0
  374. package/dist/templates/common/bundled-skills/atw-channel/SKILL.md +67 -0
  375. package/dist/templates/common/bundled-skills/atw-channel/references/command-reference.md +480 -0
  376. package/dist/templates/common/bundled-skills/atw-channel/references/forum.md +233 -0
  377. package/dist/templates/common/bundled-skills/atw-channel/references/progress-debugging.md +226 -0
  378. package/dist/templates/common/bundled-skills/atw-channel/references/workers.md +274 -0
  379. package/dist/templates/common/bundled-skills/atw-channel/references/workflows.md +125 -0
  380. package/dist/templates/common/bundled-skills/atw-code-review/SKILL.md +113 -0
  381. package/dist/templates/common/bundled-skills/atw-code-review/agents/openai.yaml +3 -0
  382. package/dist/templates/common/bundled-skills/atw-codebase-design/DEEPENING.md +37 -0
  383. package/dist/templates/common/bundled-skills/atw-codebase-design/DESIGN-IT-TWICE.md +44 -0
  384. package/dist/templates/common/bundled-skills/atw-codebase-design/SKILL.md +114 -0
  385. package/dist/templates/common/bundled-skills/atw-codebase-design/agents/openai.yaml +3 -0
  386. package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/SKILL.md +138 -0
  387. package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/agents/openai.yaml +3 -0
  388. package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  389. package/dist/templates/common/bundled-skills/atw-domain-modeling/ADR-FORMAT.md +47 -0
  390. package/dist/templates/common/bundled-skills/atw-domain-modeling/CONTEXT-FORMAT.md +60 -0
  391. package/dist/templates/common/bundled-skills/atw-domain-modeling/SKILL.md +74 -0
  392. package/dist/templates/common/bundled-skills/atw-domain-modeling/agents/openai.yaml +3 -0
  393. package/dist/templates/common/bundled-skills/atw-handoff/SKILL.md +16 -0
  394. package/dist/templates/common/bundled-skills/atw-handoff/agents/openai.yaml +5 -0
  395. package/dist/templates/common/bundled-skills/atw-implement/SKILL.md +21 -0
  396. package/dist/templates/common/bundled-skills/atw-implement/agents/openai.yaml +5 -0
  397. package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/HTML-REPORT.md +123 -0
  398. package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/SKILL.md +71 -0
  399. package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/agents/openai.yaml +5 -0
  400. package/dist/templates/common/bundled-skills/atw-init-repo/SKILL.md +130 -0
  401. package/dist/templates/common/bundled-skills/atw-init-repo/references/domain.md +51 -0
  402. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw-local.md +133 -0
  403. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw.md +109 -0
  404. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-github.md +45 -0
  405. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-gitlab.md +46 -0
  406. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-local.md +30 -0
  407. package/dist/templates/common/bundled-skills/atw-init-repo/references/triage-labels.md +15 -0
  408. package/dist/templates/common/bundled-skills/atw-interview/SKILL.md +22 -0
  409. package/dist/templates/common/bundled-skills/atw-interview/agents/openai.yaml +3 -0
  410. package/dist/templates/common/bundled-skills/atw-map/SKILL.md +128 -0
  411. package/dist/templates/common/bundled-skills/atw-map/agents/openai.yaml +5 -0
  412. package/dist/templates/common/bundled-skills/atw-merge/SKILL.md +14 -0
  413. package/dist/templates/common/bundled-skills/atw-merge/agents/openai.yaml +3 -0
  414. package/dist/templates/common/bundled-skills/atw-meta/SKILL.md +85 -0
  415. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/add-project-local-conventions.md +83 -0
  416. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-agents.md +55 -0
  417. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-context-loading.md +80 -0
  418. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-hooks.md +57 -0
  419. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-skills-or-commands.md +123 -0
  420. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-spec-structure.md +83 -0
  421. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-task-lifecycle.md +91 -0
  422. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/change-workflow.md +59 -0
  423. package/dist/templates/common/bundled-skills/atw-meta/references/customize-local/overview.md +55 -0
  424. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/bundled-skills.md +159 -0
  425. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/context-injection.md +68 -0
  426. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/generated-files.md +80 -0
  427. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/multi-agent-channel.md +69 -0
  428. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/overview.md +51 -0
  429. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/spec-system.md +102 -0
  430. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/task-system.md +126 -0
  431. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/workflow.md +79 -0
  432. package/dist/templates/common/bundled-skills/atw-meta/references/local-architecture/workspace-memory.md +71 -0
  433. package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/agents.md +80 -0
  434. package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/hooks-and-settings.md +72 -0
  435. package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/overview.md +59 -0
  436. package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/platform-map.md +112 -0
  437. package/dist/templates/common/bundled-skills/atw-meta/references/platform-files/skills-and-commands.md +86 -0
  438. package/dist/templates/common/bundled-skills/atw-prototype/LOGIC.md +67 -0
  439. package/dist/templates/common/bundled-skills/atw-prototype/SKILL.md +26 -0
  440. package/dist/templates/common/bundled-skills/atw-prototype/UI.md +112 -0
  441. package/dist/templates/common/bundled-skills/atw-prototype/agents/openai.yaml +3 -0
  442. package/dist/templates/common/bundled-skills/atw-research/SKILL.md +14 -0
  443. package/dist/templates/common/bundled-skills/atw-research/agents/openai.yaml +3 -0
  444. package/dist/templates/common/bundled-skills/atw-session-insight/SKILL.md +81 -0
  445. package/dist/templates/common/bundled-skills/atw-session-insight/references/cli-quick-reference.md +65 -0
  446. package/dist/templates/common/bundled-skills/atw-session-insight/references/triggering-patterns.md +93 -0
  447. package/dist/templates/common/bundled-skills/atw-spec/SKILL.md +75 -0
  448. package/dist/templates/common/bundled-skills/atw-spec/agents/openai.yaml +5 -0
  449. package/dist/templates/common/bundled-skills/atw-spec-bootstrap/SKILL.md +41 -0
  450. package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/mcp-setup.md +90 -0
  451. package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/repository-analysis.md +59 -0
  452. package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/spec-task-planning.md +61 -0
  453. package/dist/templates/common/bundled-skills/atw-spec-bootstrap/references/spec-writing.md +70 -0
  454. package/dist/templates/common/bundled-skills/atw-tdd/SKILL.md +38 -0
  455. package/dist/templates/common/bundled-skills/atw-tdd/agents/openai.yaml +3 -0
  456. package/dist/templates/common/bundled-skills/atw-tdd/mocking.md +59 -0
  457. package/dist/templates/common/bundled-skills/atw-tdd/tests.md +77 -0
  458. package/dist/templates/common/bundled-skills/atw-tickets/SKILL.md +105 -0
  459. package/dist/templates/common/bundled-skills/atw-tickets/agents/openai.yaml +5 -0
  460. package/dist/templates/common/bundled-skills/atw-triage/AGENT-BRIEF.md +207 -0
  461. package/dist/templates/common/bundled-skills/atw-triage/OUT-OF-SCOPE.md +105 -0
  462. package/dist/templates/common/bundled-skills/atw-triage/SKILL.md +112 -0
  463. package/dist/templates/common/bundled-skills/atw-triage/agents/openai.yaml +5 -0
  464. package/dist/templates/common/commands/continue.md +55 -0
  465. package/dist/templates/common/commands/finish-work.md +69 -0
  466. package/dist/templates/common/commands/start.md +68 -0
  467. package/dist/templates/common/index.d.ts +48 -0
  468. package/dist/templates/common/index.d.ts.map +1 -0
  469. package/dist/templates/common/index.js +104 -0
  470. package/dist/templates/common/index.js.map +1 -0
  471. package/dist/templates/common/skills/before-dev.md +44 -0
  472. package/dist/templates/common/skills/brainstorm.md +194 -0
  473. package/dist/templates/common/skills/update-spec.md +351 -0
  474. package/dist/templates/copilot/copilot-instructions.md +11 -0
  475. package/dist/templates/copilot/hooks/session-start.py +510 -0
  476. package/dist/templates/copilot/hooks.json +19 -0
  477. package/dist/templates/copilot/index.d.ts +23 -0
  478. package/dist/templates/copilot/index.d.ts.map +1 -0
  479. package/dist/templates/copilot/index.js +48 -0
  480. package/dist/templates/copilot/index.js.map +1 -0
  481. package/dist/templates/cursor/agents/atw-implement-agent.md +106 -0
  482. package/dist/templates/cursor/agents/atw-review.md +112 -0
  483. package/dist/templates/cursor/hooks.json +24 -0
  484. package/dist/templates/cursor/index.d.ts +13 -0
  485. package/dist/templates/cursor/index.d.ts.map +1 -0
  486. package/dist/templates/cursor/index.js +13 -0
  487. package/dist/templates/cursor/index.js.map +1 -0
  488. package/dist/templates/droid/droids/atw-implement-agent.md +99 -0
  489. package/dist/templates/droid/droids/atw-review.md +105 -0
  490. package/dist/templates/droid/index.d.ts +15 -0
  491. package/dist/templates/droid/index.d.ts.map +1 -0
  492. package/dist/templates/droid/index.js +15 -0
  493. package/dist/templates/droid/index.js.map +1 -0
  494. package/dist/templates/droid/settings.json +69 -0
  495. package/dist/templates/dsh/DSH.md +56 -0
  496. package/dist/templates/dsh/index.d.ts +21 -0
  497. package/dist/templates/dsh/index.d.ts.map +1 -0
  498. package/dist/templates/dsh/index.js +25 -0
  499. package/dist/templates/dsh/index.js.map +1 -0
  500. package/dist/templates/extract.d.ts +40 -0
  501. package/dist/templates/extract.d.ts.map +1 -0
  502. package/dist/templates/extract.js +106 -0
  503. package/dist/templates/extract.js.map +1 -0
  504. package/dist/templates/gemini/agents/atw-implement-agent.md +99 -0
  505. package/dist/templates/gemini/agents/atw-review.md +105 -0
  506. package/dist/templates/gemini/index.d.ts +13 -0
  507. package/dist/templates/gemini/index.d.ts.map +1 -0
  508. package/dist/templates/gemini/index.js +13 -0
  509. package/dist/templates/gemini/index.js.map +1 -0
  510. package/dist/templates/gemini/settings.json +40 -0
  511. package/dist/templates/grok/agents/atw-implement-agent.md +115 -0
  512. package/dist/templates/grok/agents/atw-review.md +105 -0
  513. package/dist/templates/grok/index.d.ts +15 -0
  514. package/dist/templates/grok/index.d.ts.map +1 -0
  515. package/dist/templates/grok/index.js +18 -0
  516. package/dist/templates/grok/index.js.map +1 -0
  517. package/dist/templates/kimi/agents/atw-implement-agent.md +114 -0
  518. package/dist/templates/kimi/agents/atw-review.md +103 -0
  519. package/dist/templates/kimi/index.d.ts +20 -0
  520. package/dist/templates/kimi/index.d.ts.map +1 -0
  521. package/dist/templates/kimi/index.js +23 -0
  522. package/dist/templates/kimi/index.js.map +1 -0
  523. package/dist/templates/kiro/agents/atw-implement-agent.json +26 -0
  524. package/dist/templates/kiro/agents/atw-review.json +26 -0
  525. package/dist/templates/kiro/agents/atw.json +34 -0
  526. package/dist/templates/kiro/hooks/atw-workflow-state.kiro.hook +14 -0
  527. package/dist/templates/kiro/index.d.ts +32 -0
  528. package/dist/templates/kiro/index.d.ts.map +1 -0
  529. package/dist/templates/kiro/index.js +28 -0
  530. package/dist/templates/kiro/index.js.map +1 -0
  531. package/dist/templates/markdown/agents.md +21 -0
  532. package/dist/templates/markdown/gitignore.txt +15 -0
  533. package/dist/templates/markdown/index.d.ts +27 -0
  534. package/dist/templates/markdown/index.d.ts.map +1 -0
  535. package/dist/templates/markdown/index.js +52 -0
  536. package/dist/templates/markdown/index.js.map +1 -0
  537. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  538. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  539. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  540. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  541. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  542. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  543. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  544. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  545. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  546. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  547. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  548. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  549. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  550. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
  551. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +290 -0
  552. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +634 -0
  553. package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
  554. package/dist/templates/markdown/workspace-index.md +125 -0
  555. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  556. package/dist/templates/omp/agents/atw-implement-agent.md +45 -0
  557. package/dist/templates/omp/agents/atw-review.md +41 -0
  558. package/dist/templates/omp/extensions/atw/index.ts.txt +1109 -0
  559. package/dist/templates/omp/index.d.ts +4 -0
  560. package/dist/templates/omp/index.d.ts.map +1 -0
  561. package/dist/templates/omp/index.js +9 -0
  562. package/dist/templates/omp/index.js.map +1 -0
  563. package/dist/templates/opencode/agents/atw-implement-agent.md +115 -0
  564. package/dist/templates/opencode/agents/atw-review.md +120 -0
  565. package/dist/templates/opencode/lib/atw-context.js +637 -0
  566. package/dist/templates/opencode/lib/context-visibility.js +148 -0
  567. package/dist/templates/opencode/lib/session-utils.js +474 -0
  568. package/dist/templates/opencode/package.json +6 -0
  569. package/dist/templates/opencode/plugins/inject-subagent-context.js +390 -0
  570. package/dist/templates/opencode/plugins/inject-workflow-state.js +240 -0
  571. package/dist/templates/opencode/plugins/session-start.js +65 -0
  572. package/dist/templates/pi/agents/atw-implement-agent.md +42 -0
  573. package/dist/templates/pi/agents/atw-review.md +37 -0
  574. package/dist/templates/pi/extensions/atw/index.ts.txt +2014 -0
  575. package/dist/templates/pi/index.d.ts +5 -0
  576. package/dist/templates/pi/index.d.ts.map +1 -0
  577. package/dist/templates/pi/index.js +12 -0
  578. package/dist/templates/pi/index.js.map +1 -0
  579. package/dist/templates/pi/settings.json +9 -0
  580. package/dist/templates/qoder/agents/atw-implement-agent.md +100 -0
  581. package/dist/templates/qoder/agents/atw-review.md +106 -0
  582. package/dist/templates/qoder/index.d.ts +15 -0
  583. package/dist/templates/qoder/index.d.ts.map +1 -0
  584. package/dist/templates/qoder/index.js +15 -0
  585. package/dist/templates/qoder/index.js.map +1 -0
  586. package/dist/templates/qoder/settings.json +59 -0
  587. package/dist/templates/reasonix/agents/atw-implement-agent.md +41 -0
  588. package/dist/templates/reasonix/agents/atw-review.md +36 -0
  589. package/dist/templates/reasonix/index.d.ts +13 -0
  590. package/dist/templates/reasonix/index.d.ts.map +1 -0
  591. package/dist/templates/reasonix/index.js +16 -0
  592. package/dist/templates/reasonix/index.js.map +1 -0
  593. package/dist/templates/shared-hooks/index.d.ts +77 -0
  594. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  595. package/dist/templates/shared-hooks/index.js +140 -0
  596. package/dist/templates/shared-hooks/index.js.map +1 -0
  597. package/dist/templates/shared-hooks/inject-shell-session-context.py +292 -0
  598. package/dist/templates/shared-hooks/inject-subagent-context.py +1178 -0
  599. package/dist/templates/shared-hooks/inject-workflow-state.py +488 -0
  600. package/dist/templates/shared-hooks/session-start.py +889 -0
  601. package/dist/templates/snow/SNOW.md +86 -0
  602. package/dist/templates/snow/agents/atw-implement-agent.md +152 -0
  603. package/dist/templates/snow/agents/atw-review.md +135 -0
  604. package/dist/templates/snow/hooks/beforeSubAgentStart.json +15 -0
  605. package/dist/templates/snow/hooks/onSessionStart.json +15 -0
  606. package/dist/templates/snow/hooks/onUserMessage.json +15 -0
  607. package/dist/templates/snow/hooks/write-atw-context.py +637 -0
  608. package/dist/templates/snow/index.d.ts +25 -0
  609. package/dist/templates/snow/index.d.ts.map +1 -0
  610. package/dist/templates/snow/index.js +35 -0
  611. package/dist/templates/snow/index.js.map +1 -0
  612. package/dist/templates/template-utils.d.ts +26 -0
  613. package/dist/templates/template-utils.d.ts.map +1 -0
  614. package/dist/templates/template-utils.js +64 -0
  615. package/dist/templates/template-utils.js.map +1 -0
  616. package/dist/templates/trae/agents/atw-implement-agent.md +100 -0
  617. package/dist/templates/trae/agents/atw-review.md +106 -0
  618. package/dist/templates/trae/hooks.json +39 -0
  619. package/dist/templates/trae/index.d.ts +15 -0
  620. package/dist/templates/trae/index.d.ts.map +1 -0
  621. package/dist/templates/trae/index.js +15 -0
  622. package/dist/templates/trae/index.js.map +1 -0
  623. package/dist/templates/zcode/agents/atw-implement-agent.md +108 -0
  624. package/dist/templates/zcode/agents/atw-review.md +109 -0
  625. package/dist/templates/zcode/config.json +52 -0
  626. package/dist/templates/zcode/index.d.ts +22 -0
  627. package/dist/templates/zcode/index.d.ts.map +1 -0
  628. package/dist/templates/zcode/index.js +26 -0
  629. package/dist/templates/zcode/index.js.map +1 -0
  630. package/dist/types/ai-tools.d.ts +95 -0
  631. package/dist/types/ai-tools.d.ts.map +1 -0
  632. package/dist/types/ai-tools.js +494 -0
  633. package/dist/types/ai-tools.js.map +1 -0
  634. package/dist/types/migration.d.ts +125 -0
  635. package/dist/types/migration.d.ts.map +1 -0
  636. package/dist/types/migration.js +8 -0
  637. package/dist/types/migration.js.map +1 -0
  638. package/dist/utils/ablation-store.d.ts +123 -0
  639. package/dist/utils/ablation-store.d.ts.map +1 -0
  640. package/dist/utils/ablation-store.js +749 -0
  641. package/dist/utils/ablation-store.js.map +1 -0
  642. package/dist/utils/agent-refs.d.ts +31 -0
  643. package/dist/utils/agent-refs.d.ts.map +1 -0
  644. package/dist/utils/agent-refs.js +63 -0
  645. package/dist/utils/agent-refs.js.map +1 -0
  646. package/dist/utils/atomic-write.d.ts +12 -0
  647. package/dist/utils/atomic-write.d.ts.map +1 -0
  648. package/dist/utils/atomic-write.js +30 -0
  649. package/dist/utils/atomic-write.js.map +1 -0
  650. package/dist/utils/compare-versions.d.ts +12 -0
  651. package/dist/utils/compare-versions.d.ts.map +1 -0
  652. package/dist/utils/compare-versions.js +86 -0
  653. package/dist/utils/compare-versions.js.map +1 -0
  654. package/dist/utils/cwd-guard.d.ts +38 -0
  655. package/dist/utils/cwd-guard.d.ts.map +1 -0
  656. package/dist/utils/cwd-guard.js +62 -0
  657. package/dist/utils/cwd-guard.js.map +1 -0
  658. package/dist/utils/file-writer.d.ts +36 -0
  659. package/dist/utils/file-writer.d.ts.map +1 -0
  660. package/dist/utils/file-writer.js +204 -0
  661. package/dist/utils/file-writer.js.map +1 -0
  662. package/dist/utils/managed-paths.d.ts +5 -0
  663. package/dist/utils/managed-paths.d.ts.map +1 -0
  664. package/dist/utils/managed-paths.js +51 -0
  665. package/dist/utils/managed-paths.js.map +1 -0
  666. package/dist/utils/managed-removal.d.ts +74 -0
  667. package/dist/utils/managed-removal.d.ts.map +1 -0
  668. package/dist/utils/managed-removal.js +270 -0
  669. package/dist/utils/managed-removal.js.map +1 -0
  670. package/dist/utils/manifest-prune.d.ts +61 -0
  671. package/dist/utils/manifest-prune.d.ts.map +1 -0
  672. package/dist/utils/manifest-prune.js +135 -0
  673. package/dist/utils/manifest-prune.js.map +1 -0
  674. package/dist/utils/posix.d.ts +13 -0
  675. package/dist/utils/posix.d.ts.map +1 -0
  676. package/dist/utils/posix.js +15 -0
  677. package/dist/utils/posix.js.map +1 -0
  678. package/dist/utils/project-detector.d.ts +46 -0
  679. package/dist/utils/project-detector.d.ts.map +1 -0
  680. package/dist/utils/project-detector.js +666 -0
  681. package/dist/utils/project-detector.js.map +1 -0
  682. package/dist/utils/proxy.d.ts +25 -0
  683. package/dist/utils/proxy.d.ts.map +1 -0
  684. package/dist/utils/proxy.js +60 -0
  685. package/dist/utils/proxy.js.map +1 -0
  686. package/dist/utils/registry-config.d.ts +7 -0
  687. package/dist/utils/registry-config.d.ts.map +1 -0
  688. package/dist/utils/registry-config.js +172 -0
  689. package/dist/utils/registry-config.js.map +1 -0
  690. package/dist/utils/task-json.d.ts +13 -0
  691. package/dist/utils/task-json.d.ts.map +1 -0
  692. package/dist/utils/task-json.js +12 -0
  693. package/dist/utils/task-json.js.map +1 -0
  694. package/dist/utils/template-fetcher.d.ts +161 -0
  695. package/dist/utils/template-fetcher.d.ts.map +1 -0
  696. package/dist/utils/template-fetcher.js +994 -0
  697. package/dist/utils/template-fetcher.js.map +1 -0
  698. package/dist/utils/template-hash.d.ts +127 -0
  699. package/dist/utils/template-hash.d.ts.map +1 -0
  700. package/dist/utils/template-hash.js +335 -0
  701. package/dist/utils/template-hash.js.map +1 -0
  702. package/dist/utils/uninstall-scrubbers.d.ts +66 -0
  703. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  704. package/dist/utils/uninstall-scrubbers.js +417 -0
  705. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  706. package/dist/utils/workflow-resolver.d.ts +86 -0
  707. package/dist/utils/workflow-resolver.d.ts.map +1 -0
  708. package/dist/utils/workflow-resolver.js +265 -0
  709. package/dist/utils/workflow-resolver.js.map +1 -0
  710. package/package.json +93 -0
@@ -0,0 +1,637 @@
1
+ /**
2
+ * ATW Context Manager
3
+ *
4
+ * Utility class for OpenCode plugins providing file reading,
5
+ * JSONL parsing, and context building capabilities.
6
+ */
7
+
8
+ import { existsSync, readFileSync, appendFileSync, readdirSync, realpathSync, statSync } from "fs"
9
+ import { isAbsolute, join, relative } from "path"
10
+ import { platform } from "os"
11
+ import { execSync } from "child_process"
12
+ import { createHash } from "crypto"
13
+ import { Buffer, isUtf8 } from "buffer"
14
+ import process from "process"
15
+
16
+ const PYTHON_CMD = platform() === "win32" ? "python" : "python3"
17
+ // Debug logging
18
+ const DEBUG_LOG = "/tmp/atw-plugin-debug.log"
19
+
20
+ function debugLog(prefix, ...args) {
21
+ const timestamp = new Date().toISOString()
22
+ const msg = `[${timestamp}] [${prefix}] ${args.map(a => typeof a === "object" ? JSON.stringify(a) : a).join(" ")}\n`
23
+ try {
24
+ appendFileSync(DEBUG_LOG, msg)
25
+ } catch {
26
+ // ignore
27
+ }
28
+ }
29
+
30
+ function stringValue(value) {
31
+ return typeof value === "string" && value.trim() ? value.trim() : null
32
+ }
33
+
34
+ function sanitizeKey(raw) {
35
+ const safe = raw.trim().replace(/[^A-Za-z0-9._-]+/g, "_").replace(/^[._-]+|[._-]+$/g, "")
36
+ return safe ? safe.slice(0, 160) : ""
37
+ }
38
+
39
+ function hashValue(raw) {
40
+ return createHash("sha256").update(raw).digest("hex").slice(0, 24)
41
+ }
42
+
43
+ function lookupString(data, keys) {
44
+ if (!data || typeof data !== "object") return null
45
+ for (const key of keys) {
46
+ const value = stringValue(data[key])
47
+ if (value) return value
48
+ }
49
+ for (const nestedKey of ["input", "properties", "event", "hook_input", "hookInput"]) {
50
+ const nested = data[nestedKey]
51
+ if (nested && typeof nested === "object") {
52
+ const value = lookupString(nested, keys)
53
+ if (value) return value
54
+ }
55
+ }
56
+ return null
57
+ }
58
+
59
+ function buildContextKey(platformName, kind, value) {
60
+ if (kind === "transcript") {
61
+ return `${platformName}_transcript_${hashValue(value)}`
62
+ }
63
+ const safeValue = sanitizeKey(value)
64
+ return safeValue ? `${platformName}_${safeValue}` : `${platformName}_${hashValue(value)}`
65
+ }
66
+
67
+ // Matches `atw-implement-agent`, `atw-review` exactly — the same two names as
68
+ // `AGENTS_ALL` in shared-hooks/inject-subagent-context.py, which is the
69
+ // authority. Drifting from it does not raise: the sub-agent still spawns and
70
+ // injection simply never fires.
71
+ // Used by chat.message plugins to skip injection inside ATW sub-agent turns.
72
+ const ATW_SUBAGENT_RE = /^atw-(implement-agent|review)$/
73
+
74
+ /**
75
+ * Return true when the OpenCode `chat.message` input represents an ATW
76
+ * sub-agent turn. `input.agent` is set by OpenCode when a Task tool spawns a
77
+ * child session with a custom agent (see `packages/opencode/src/tool/task.ts`).
78
+ */
79
+ export function isAtwSubagent(input) {
80
+ if (!input || typeof input !== "object") return false
81
+ const agent = typeof input.agent === "string" ? input.agent.trim() : ""
82
+ return ATW_SUBAGENT_RE.test(agent)
83
+ }
84
+
85
+ // ============================================================
86
+ // Context Injection Limits
87
+ //
88
+ // Notice text and behavior mirrored byte-for-byte from the shared-hooks
89
+ // Python sub-agent context injection hook and the Pi extension. Changing
90
+ // wording here requires changing it there too.
91
+ // ============================================================
92
+
93
+ const DEFAULT_CONTEXT_INJECTION_LIMITS = {
94
+ max_file_bytes: 32768,
95
+ max_artifact_bytes: 65536,
96
+ max_total_bytes: 131072,
97
+ }
98
+
99
+ /**
100
+ * Truncate `buf` to at most `cap` bytes without splitting a UTF-8
101
+ * multi-byte sequence. `cap <= 0` means "no limit".
102
+ */
103
+ function truncateUtf8(buf, cap) {
104
+ if (cap <= 0 || buf.length <= cap) return buf
105
+ let i = cap
106
+ // Back off over continuation bytes (10xxxxxx) to find the lead byte.
107
+ while (i > 0 && (buf[i - 1] & 0xc0) === 0x80) i--
108
+ if (i === 0) return Buffer.alloc(0)
109
+ const lead = buf[i - 1]
110
+ if (lead & 0x80) {
111
+ let seqLen = 1
112
+ if ((lead & 0xe0) === 0xc0) seqLen = 2
113
+ else if ((lead & 0xf0) === 0xe0) seqLen = 3
114
+ else if ((lead & 0xf8) === 0xf0) seqLen = 4
115
+ // Drop the lead byte too if its full sequence didn't fit.
116
+ if (i - 1 + seqLen > cap) i--
117
+ }
118
+ return buf.subarray(0, i)
119
+ }
120
+
121
+ function stripInlineComment(value) {
122
+ let inQuote = null
123
+ for (let idx = 0; idx < value.length; idx++) {
124
+ const ch = value[idx]
125
+ if (inQuote) {
126
+ if (ch === inQuote) inQuote = null
127
+ continue
128
+ }
129
+ if (ch === '"' || ch === "'") {
130
+ inQuote = ch
131
+ continue
132
+ }
133
+ if (ch === "#" && (idx === 0 || /\s/.test(value[idx - 1]))) {
134
+ return value.slice(0, idx)
135
+ }
136
+ }
137
+ return value
138
+ }
139
+
140
+ function unquoteYaml(s) {
141
+ if (s.length >= 2 && s[0] === s[s.length - 1] && (s[0] === '"' || s[0] === "'")) {
142
+ return s.slice(1, -1)
143
+ }
144
+ return s
145
+ }
146
+
147
+ /**
148
+ * Line-based parser for ONLY the `context_injection:` block of
149
+ * `.atw/config.yaml`. Not a general YAML parser — mirrors
150
+ * `common.config.get_context_injection_limits()` semantics for this
151
+ * section only (missing keys keep the default; invalid/negative values
152
+ * fall back to the default for that key with a debugLog warning).
153
+ */
154
+ function readContextInjectionLimits(repoRoot) {
155
+ const limits = { ...DEFAULT_CONTEXT_INJECTION_LIMITS }
156
+ let text = null
157
+ try {
158
+ text = readFileSync(join(repoRoot, ".atw", "config.yaml"), "utf-8")
159
+ } catch {
160
+ return limits
161
+ }
162
+ if (!text) return limits
163
+
164
+ let inSection = false
165
+ let sectionIndent = -1
166
+ for (const rawLine of text.split(/\r?\n/)) {
167
+ const trimmed = rawLine.trim()
168
+ if (!inSection) {
169
+ if (/^context_injection\s*:\s*(#.*)?$/.test(trimmed)) {
170
+ inSection = true
171
+ sectionIndent = rawLine.length - rawLine.trimStart().length
172
+ }
173
+ continue
174
+ }
175
+ if (!trimmed || trimmed.startsWith("#")) continue
176
+ const indent = rawLine.length - rawLine.trimStart().length
177
+ if (indent <= sectionIndent) break
178
+ const m = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.*)$/)
179
+ if (!m) continue
180
+ const key = m[1]
181
+ if (!(key in limits)) continue
182
+ const raw = unquoteYaml(stripInlineComment(m[2]).trim()).trim()
183
+ if (!/^-?\d+$/.test(raw) || parseInt(raw, 10) < 0) {
184
+ // invalid/negative -> keep default (Python warns on stderr)
185
+ debugLog("context", `invalid context_injection.${key} value: ${raw}; using default ${limits[key]}`)
186
+ continue
187
+ }
188
+ limits[key] = parseInt(raw, 10)
189
+ }
190
+ return limits
191
+ }
192
+
193
+ /** Tracks the running total of bytes emitted into the sub-agent context. */
194
+ class ContextBudget {
195
+ constructor(maxTotalBytes) {
196
+ this.maxTotalBytes = maxTotalBytes
197
+ this.used = 0
198
+ }
199
+
200
+ hasRoom(size) {
201
+ if (this.maxTotalBytes <= 0) return true
202
+ return this.used + size <= this.maxTotalBytes
203
+ }
204
+
205
+ add(size) {
206
+ this.used += size
207
+ }
208
+ }
209
+
210
+ function truncateNotice(path, cap) {
211
+ return `\n[ATW: truncated at ${cap} bytes — read ${path} for the full content]`
212
+ }
213
+
214
+ function isBinaryContent(data) {
215
+ return data.includes(0) || !isUtf8(data)
216
+ }
217
+
218
+ function binaryNotice(path, size, reason) {
219
+ return `[ATW: not inlined (binary file) — ${path} (${size} bytes): ${reason}]`
220
+ }
221
+
222
+ function indexNotice(path, size, reason) {
223
+ return `[ATW: not inlined (total context limit reached) — ${path} (${size} bytes): ${reason}]`
224
+ }
225
+
226
+ /**
227
+ * Return an inlined `=== header ===` block, or degrade to an index
228
+ * notice once the total context budget is exhausted.
229
+ */
230
+ function budgetedBlock(budget, header, plainPath, content, reason, sizeForIndex) {
231
+ const block = `=== ${header} ===\n${content}`
232
+ const blockBytes = Buffer.byteLength(block, "utf-8")
233
+ if (!budget.hasRoom(blockBytes)) {
234
+ const notice = indexNotice(plainPath, sizeForIndex, reason)
235
+ budget.add(Buffer.byteLength(notice, "utf-8"))
236
+ return notice
237
+ }
238
+ budget.add(blockBytes)
239
+ return block
240
+ }
241
+
242
+ /** Read raw file bytes, return null if file doesn't exist. */
243
+ function readFileBytes(basePath, filePath) {
244
+ const fullPath = isAbsolute(filePath) ? filePath : join(basePath, filePath)
245
+ try {
246
+ if (!statSync(fullPath).isFile()) return null
247
+ } catch {
248
+ return null
249
+ }
250
+ try {
251
+ return readFileSync(fullPath)
252
+ } catch {
253
+ return null
254
+ }
255
+ }
256
+
257
+ /** Read a JSONL-referenced file, apply the per-file cap, then budget it. */
258
+ function materializeFile(basePath, filePath, reason, limits, budget) {
259
+ const data = readFileBytes(basePath, filePath)
260
+ if (data === null) return null
261
+
262
+ const size = data.length
263
+ if (isBinaryContent(data)) {
264
+ const notice = binaryNotice(filePath, size, reason)
265
+ budget.add(Buffer.byteLength(notice, "utf-8"))
266
+ return notice
267
+ }
268
+ const cap = limits.max_file_bytes
269
+ const truncated = truncateUtf8(data, cap)
270
+ let content = truncated.toString("utf-8")
271
+ if (truncated.length < size) content += truncateNotice(filePath, cap)
272
+
273
+ return budgetedBlock(budget, filePath, filePath, content, reason, size)
274
+ }
275
+
276
+ /**
277
+ * Read all .md files in a directory, applying the same per-file and
278
+ * total caps as a single-file JSONL entry.
279
+ */
280
+ function materializeDirectory(basePath, dirPath, reason, limits, budget, maxFiles = 20) {
281
+ const blocks = []
282
+ const fullPath = isAbsolute(dirPath) ? dirPath : join(basePath, dirPath)
283
+
284
+ let files
285
+ try {
286
+ if (!statSync(fullPath).isDirectory()) return blocks
287
+ files = readdirSync(fullPath)
288
+ .filter(f => f.endsWith(".md") && statSync(join(fullPath, f)).isFile())
289
+ .sort()
290
+ } catch {
291
+ return blocks
292
+ }
293
+
294
+ for (const filename of files.slice(0, maxFiles)) {
295
+ const relativePath = join(dirPath, filename)
296
+ const block = materializeFile(basePath, relativePath, reason, limits, budget)
297
+ if (block) blocks.push(block)
298
+ }
299
+ return blocks
300
+ }
301
+
302
+ /**
303
+ * Read a task artifact (`prd.md`), apply the per-artifact cap, then budget it.
304
+ */
305
+ function materializeArtifact(basePath, filePath, headerLabel, reason, limits, budget) {
306
+ const data = readFileBytes(basePath, filePath)
307
+ if (data === null) return null
308
+
309
+ const size = data.length
310
+ const cap = limits.max_artifact_bytes
311
+ const truncated = truncateUtf8(data, cap)
312
+ let content = truncated.toString("utf-8")
313
+ if (truncated.length < size) content += truncateNotice(filePath, cap)
314
+
315
+ return budgetedBlock(budget, headerLabel, filePath, content, reason, size)
316
+ }
317
+
318
+ /**
319
+ * ATW Context Manager
320
+ */
321
+ export class AtwContext {
322
+ constructor(directory) {
323
+ this.directory = directory
324
+ debugLog("context", "AtwContext initialized", { directory })
325
+ }
326
+
327
+ // ============================================================
328
+ // ATW Project Detection
329
+ // ============================================================
330
+
331
+ isAtwProject() {
332
+ return existsSync(join(this.directory, ".atw"))
333
+ }
334
+
335
+ // OpenCode exports no session identity into the environment: no OPENCODE_*
336
+ // name in the 1.17.18 binary or the 1.18.13 source carries one. The plugin
337
+ // hook input is the only source, and the `export ATW_CONTEXT_ID=` prefix
338
+ // this plugin adds to Bash commands is the only way that identity reaches a
339
+ // child process. ATW_CONTEXT_ID is honored here so a nested ATW run
340
+ // inherits its parent's key; do not add platform-native env names next to it
341
+ // without evidence a vendor sets them.
342
+ /**
343
+ * @param {Record<string, unknown> | null} [platformInput] OpenCode 的钩子输入;
344
+ * 缺省的 `null` 是「没有平台输入」,不是这个参数的类型。
345
+ * @returns {string | null}
346
+ */
347
+ getContextKey(platformInput = null) {
348
+ const override = stringValue(process.env.ATW_CONTEXT_ID)
349
+ if (override) {
350
+ return sanitizeKey(override) || hashValue(override)
351
+ }
352
+
353
+ const input = platformInput && typeof platformInput === "object" ? platformInput : null
354
+ if (!input) return null
355
+
356
+ const sessionID = lookupString(input, ["session_id", "sessionId", "sessionID"])
357
+ if (sessionID) return buildContextKey("opencode", "session", sessionID)
358
+
359
+ const conversationID = lookupString(input, ["conversation_id", "conversationId", "conversationID"])
360
+ if (conversationID) return buildContextKey("opencode", "conversation", conversationID)
361
+
362
+ const transcriptPath = lookupString(input, ["transcript_path", "transcriptPath", "transcript"])
363
+ if (transcriptPath) return buildContextKey("opencode", "transcript", transcriptPath)
364
+
365
+ return null
366
+ }
367
+
368
+ readContext(contextKey) {
369
+ try {
370
+ const contextPath = join(this.directory, ".atw", ".runtime", "sessions", `${contextKey}.json`)
371
+ if (!existsSync(contextPath)) return null
372
+ return JSON.parse(readFileSync(contextPath, "utf-8"))
373
+ } catch {
374
+ return null
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Get active task from session runtime context.
380
+ *
381
+ * Resolution order (mirrors Python `active_task.resolve_active_task`):
382
+ * 1. Lookup the runtime file for the input-derived context key.
383
+ * 2. If that misses and exactly one session runtime file exists locally,
384
+ * use it (`_resolveSingleSessionFallback`). Refuses to guess when 0 or
385
+ * ≥2 files exist so multi-window isolation holds.
386
+ *
387
+ * @param {Record<string, unknown> | null} [platformInput] 同 `getContextKey`。
388
+ * @returns {{ taskPath: string, source: string, stale: boolean }}
389
+ */
390
+ getActiveTask(platformInput = null) {
391
+ const contextKey = this.getContextKey(platformInput)
392
+ if (contextKey) {
393
+ const context = this.readContext(contextKey)
394
+ const taskRef = this.normalizeTaskRef(context?.current_task || "")
395
+ if (taskRef) {
396
+ const taskDir = this.resolveTaskDir(taskRef)
397
+ return {
398
+ taskPath: taskRef,
399
+ source: `session:${contextKey}`,
400
+ stale: !taskDir || !existsSync(taskDir),
401
+ }
402
+ }
403
+ }
404
+
405
+ const fallback = this._resolveSingleSessionFallback()
406
+ if (fallback) {
407
+ return fallback
408
+ }
409
+
410
+ return { taskPath: null, source: "none", stale: false }
411
+ }
412
+
413
+ /**
414
+ * Mirror of Python `_resolve_single_session_fallback`. Returns the task
415
+ * pointed at by the sole session runtime file when exactly one exists,
416
+ * else null.
417
+ */
418
+ _resolveSingleSessionFallback() {
419
+ const sessionsDir = join(this.directory, ".atw", ".runtime", "sessions")
420
+ if (!existsSync(sessionsDir)) return null
421
+
422
+ let files
423
+ try {
424
+ files = readdirSync(sessionsDir)
425
+ .filter(name => name.endsWith(".json"))
426
+ .sort()
427
+ } catch {
428
+ return null
429
+ }
430
+ if (files.length !== 1) return null
431
+
432
+ const sessionFile = join(sessionsDir, files[0])
433
+ let context
434
+ try {
435
+ context = JSON.parse(readFileSync(sessionFile, "utf-8"))
436
+ } catch {
437
+ return null
438
+ }
439
+ const taskRef = this.normalizeTaskRef(context?.current_task || "")
440
+ if (!taskRef) return null
441
+
442
+ const taskDir = this.resolveTaskDir(taskRef)
443
+ const fallbackKey = files[0].replace(/\.json$/, "")
444
+ return {
445
+ taskPath: taskRef,
446
+ source: `session-fallback:${fallbackKey}`,
447
+ stale: !taskDir || !existsSync(taskDir),
448
+ }
449
+ }
450
+
451
+ getCurrentTask(platformInput = null) {
452
+ return this.getActiveTask(platformInput).taskPath
453
+ }
454
+
455
+ normalizeTaskRef(taskRef) {
456
+ if (!taskRef) {
457
+ return ""
458
+ }
459
+
460
+ if (isAbsolute(taskRef)) {
461
+ return taskRef.trim()
462
+ }
463
+
464
+ let normalized = taskRef.trim().replace(/\\/g, "/")
465
+ while (normalized.startsWith("./")) {
466
+ normalized = normalized.slice(2)
467
+ }
468
+
469
+ if (normalized.startsWith("tasks/")) {
470
+ return `.atw/${normalized}`
471
+ }
472
+
473
+ return normalized
474
+ }
475
+
476
+ /**
477
+ * Return `candidate` when it lands inside the project, else null.
478
+ *
479
+ * A task ref is not always something the user typed. `task.py` now refuses
480
+ * to store one that leaves the project, but a session file written before
481
+ * that fix can still hold one, and `atw update` does not rewrite session
482
+ * files — so a poisoned pointer outlives the upgrade that closed the writer.
483
+ * Both sides are resolved so a task directory symlinked outside is refused
484
+ * too, but the original `candidate` is returned on success: callers build
485
+ * paths relative to `this.directory`, and handing them a realpath would break
486
+ * that whenever the project itself sits behind a symlink.
487
+ */
488
+ containInProject(candidate) {
489
+ try {
490
+ const rel = relative(realpathSync(this.directory), realpathSync(candidate))
491
+ if (rel !== "" && (rel.startsWith("..") || isAbsolute(rel))) {
492
+ return null
493
+ }
494
+ return candidate
495
+ } catch {
496
+ return null
497
+ }
498
+ }
499
+
500
+ resolveTaskDir(taskRef) {
501
+ const normalized = this.normalizeTaskRef(taskRef)
502
+ if (!normalized) {
503
+ return null
504
+ }
505
+
506
+ const candidate = isAbsolute(normalized)
507
+ ? normalized
508
+ : normalized.startsWith(".atw/")
509
+ ? join(this.directory, normalized)
510
+ : join(this.directory, ".atw", "tasks", normalized)
511
+
512
+ return this.containInProject(candidate)
513
+ }
514
+
515
+ // ============================================================
516
+ // File Reading Utilities
517
+ // ============================================================
518
+
519
+ readFile(filePath) {
520
+ try {
521
+ if (existsSync(filePath)) {
522
+ return readFileSync(filePath, "utf-8")
523
+ }
524
+ } catch {
525
+ // Ignore read errors
526
+ }
527
+ return null
528
+ }
529
+
530
+ readProjectFile(relativePath) {
531
+ return this.readFile(join(this.directory, relativePath))
532
+ }
533
+
534
+ runScript(scriptPath, cwd = null, contextKey = null) {
535
+ try {
536
+ const result = execSync(`${PYTHON_CMD} "${scriptPath}"`, {
537
+ cwd: cwd || this.directory,
538
+ timeout: 10000,
539
+ encoding: "utf-8",
540
+ stdio: ["pipe", "pipe", "pipe"],
541
+ env: {
542
+ ...process.env,
543
+ ...(contextKey ? { ATW_CONTEXT_ID: contextKey } : {}),
544
+ },
545
+ })
546
+ return result || ""
547
+ } catch {
548
+ return ""
549
+ }
550
+ }
551
+
552
+ // ============================================================
553
+ // JSONL Reading
554
+ // ============================================================
555
+
556
+ /**
557
+ * Read a JSONL file and materialize referenced files/directories into
558
+ * context blocks, applying per-file caps and the shared total budget
559
+ *. Mirrors Python `_materialize_jsonl_entries`.
560
+ * Supports:
561
+ * {"file": "path/to/file.md", "reason": "..."}
562
+ * {"file": "path/to/dir/", "type": "directory", "reason": "..."}
563
+ *
564
+ * Missing referenced files are skipped silently (Python `_materialize_file`
565
+ * returns None for them).
566
+ */
567
+ readJsonlWithFiles(jsonlPath, limits, budget) {
568
+ const blocks = []
569
+ const content = this.readFile(jsonlPath)
570
+ if (!content) return blocks
571
+
572
+ for (const line of content.split("\n")) {
573
+ if (!line.trim()) continue
574
+ try {
575
+ const item = JSON.parse(line)
576
+ const file = item.file || item.path
577
+ const entryType = item.type || "file"
578
+ const reason = item.reason || "-"
579
+
580
+ if (!file) continue
581
+
582
+ if (entryType === "directory") {
583
+ blocks.push(...materializeDirectory(this.directory, file, reason, limits, budget))
584
+ } else {
585
+ const block = materializeFile(this.directory, file, reason, limits, budget)
586
+ if (block) blocks.push(block)
587
+ }
588
+ } catch {
589
+ // Ignore parse errors for individual lines
590
+ }
591
+ }
592
+ return blocks
593
+ }
594
+
595
+ buildContextFromEntries(blocks) {
596
+ return blocks.join("\n\n")
597
+ }
598
+ }
599
+
600
+ // ============================================================
601
+ // Context Collector (for session deduplication)
602
+ // ============================================================
603
+
604
+ class ContextCollector {
605
+ constructor() {
606
+ this.processed = new Set()
607
+ }
608
+
609
+ markProcessed(sessionID) {
610
+ this.processed.add(sessionID)
611
+ }
612
+
613
+ isProcessed(sessionID) {
614
+ return this.processed.has(sessionID)
615
+ }
616
+
617
+ clear(sessionID) {
618
+ this.processed.delete(sessionID)
619
+ }
620
+ }
621
+
622
+ // Singleton instance
623
+ export const contextCollector = new ContextCollector()
624
+
625
+ // Export debug log for plugins
626
+ export { debugLog }
627
+
628
+ // Context injection limits — exported for plugins and tests
629
+ export {
630
+ DEFAULT_CONTEXT_INJECTION_LIMITS,
631
+ truncateUtf8,
632
+ readContextInjectionLimits,
633
+ ContextBudget,
634
+ materializeFile,
635
+ materializeDirectory,
636
+ materializeArtifact,
637
+ }