@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,833 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Task Management Script.
5
+
6
+ Usage:
7
+ python3 task.py create "<title>" --description "<desc>" [--slug <name>] [--assignee <dev>] [--priority P0|P1|P2|P3] [--parent <dir>] [--package <pkg>] [--no-start] [--force]
8
+ python3 task.py add-context <dir> <file> <path> [reason] # Add jsonl entry
9
+ python3 task.py validate <dir> # Validate jsonl files
10
+ python3 task.py list-context <dir> # List jsonl entries
11
+ python3 task.py start <dir> # Set active task, record current branch
12
+ python3 task.py current [--source] [--json] # Show active task
13
+ python3 task.py finish # Clear active task
14
+ python3 task.py set-branch <dir> <branch> # Set git branch
15
+ python3 task.py set-base-branch <dir> <branch> # Set PR target branch
16
+ python3 task.py set-scope <dir> <scope> # Set scope for PR title
17
+ python3 task.py set-meta <dir> <key> <value> # Set a task metadata key
18
+ python3 task.py set-status <dir> <status> # Move task to a workflow stage
19
+ python3 task.py rename <dir> <new-slug> [--dry-run] # Rename task + references
20
+ python3 task.py archive <task-dir> [--skip-branch-validation] # Archive completed task
21
+ python3 task.py list # List active tasks
22
+ python3 task.py list-archive [month] # List archived tasks
23
+ python3 task.py add-subtask <parent-dir> <child-dir> # Link child to parent
24
+ python3 task.py remove-subtask <parent-dir> <child-dir> # Unlink child from parent
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import argparse
30
+ import json
31
+ import sys
32
+ from pathlib import Path
33
+
34
+ from common.log import Colors, colored
35
+ from common.paths import (
36
+ DEVELOPER_HINT,
37
+ DIR_WORKFLOW,
38
+ DIR_TASKS,
39
+ FILE_TASK_JSON,
40
+ get_repo_root,
41
+ get_developer,
42
+ get_tasks_dir,
43
+ get_current_task,
44
+ )
45
+ from common.active_task import (
46
+ clear_active_task,
47
+ resolve_active_task,
48
+ resolve_context_key,
49
+ set_active_task,
50
+ )
51
+ from common.git import current_branch_name
52
+ from common.io import (
53
+ describe_json_read_failure,
54
+ read_json_checked,
55
+ write_json,
56
+ )
57
+ from common.task_utils import resolve_task_dir, run_task_hooks
58
+ from common.tasks import iter_active_tasks, children_progress
59
+
60
+ # Import command handlers from split modules (also re-exports for plan.py compatibility)
61
+ from common.task_store import (
62
+ STATUS_VALUES,
63
+ cmd_create,
64
+ cmd_rename,
65
+ cmd_archive,
66
+ cmd_set_branch,
67
+ cmd_set_base_branch,
68
+ cmd_set_scope,
69
+ cmd_set_meta,
70
+ cmd_set_status,
71
+ cmd_add_subtask,
72
+ cmd_remove_subtask,
73
+ )
74
+ from common.task_context import (
75
+ cmd_add_context,
76
+ cmd_validate,
77
+ cmd_list_context,
78
+ curated_entry_count,
79
+ )
80
+
81
+
82
+ # =============================================================================
83
+ # Command: start / finish
84
+ # =============================================================================
85
+
86
+ def _record_start_state(
87
+ task_json_path: Path,
88
+ repo_root: Path,
89
+ label: str = "",
90
+ ) -> None:
91
+ """Move a planning-stage task to `implement` and record its branch.
92
+
93
+ Both updates share one read/write: the status flip out of a planning stage,
94
+ and the checked-out branch when `branch` is still empty. Recording at start
95
+ is what keeps `branch` trustworthy at archive time — a task whose branch is
96
+ only ever set by hand tends to reach archive with `branch: null`.
97
+
98
+ Every stage before `implement` is a planning stage and all of them leave
99
+ through `start`; `implement` and later keep what they have, because `start`
100
+ is also how you resume a task after a checkout.
101
+
102
+ This used to flip `discover` only. That was equivalent back when there was
103
+ a single `planning` stage, but the six-stage split (C1/C2) turned it into
104
+ discover / specify / slice — and "flip the first one only" stranded every
105
+ sliced task: workflow.md's slice breadcrumb says "run `task.py start` to
106
+ enter implement", `start` silently did nothing, and the per-turn hook kept
107
+ re-issuing the slice breadcrumb forever. The complex path could not leave
108
+ Phase 1. Found by the N8 end-to-end walk; no source-tree criterion sees it.
109
+
110
+ Tolerant on purpose — a broken task.json does not fail `start`, because the
111
+ session pointer is the point of the command. But the read overwrites the
112
+ file it just read, so no failure may be silent: without a message the
113
+ absent status line looks like the task simply was past planning.
114
+ """
115
+ data, reason = read_json_checked(task_json_path)
116
+ if data is None:
117
+ problem, hint = describe_json_read_failure(task_json_path, reason)
118
+ print(
119
+ colored(f"Warning: {problem}; task.json not updated.", Colors.YELLOW),
120
+ file=sys.stderr,
121
+ )
122
+ print(hint, file=sys.stderr)
123
+ return
124
+
125
+ applied: list[str] = []
126
+
127
+ # 从 STATUS_VALUES 切出来,不另写一份名单:六阶段词表再改一次时这里跟着走。
128
+ planning_stages = STATUS_VALUES[: STATUS_VALUES.index("implement")]
129
+ previous_status = data.get("status")
130
+ if previous_status in planning_stages:
131
+ data["status"] = "implement"
132
+ applied.append(f"✓ Status: {previous_status} → implement{label}")
133
+
134
+ # Only fill an empty field: an explicit `set-branch` must survive a later
135
+ # `start` (re-starting a task after a checkout is a normal thing to do).
136
+ base_branch_conflict: str | None = None
137
+ if not data.get("branch"):
138
+ branch = current_branch_name(repo_root)
139
+ if branch:
140
+ data["branch"] = branch
141
+ applied.append(f"✓ Branch recorded: {branch}{label}")
142
+ if branch == data.get("base_branch"):
143
+ base_branch_conflict = branch
144
+ else:
145
+ print(
146
+ colored(
147
+ "Note: no checked-out branch (detached HEAD, or not a git "
148
+ "repository); task branch not recorded.",
149
+ Colors.YELLOW,
150
+ ),
151
+ file=sys.stderr,
152
+ )
153
+
154
+ if not applied:
155
+ return
156
+
157
+ if not write_json(task_json_path, data):
158
+ print(
159
+ colored(
160
+ f"Warning: Failed to write {task_json_path}; "
161
+ "status and branch are unchanged.",
162
+ Colors.YELLOW,
163
+ ),
164
+ file=sys.stderr,
165
+ )
166
+ return
167
+
168
+ for line in applied:
169
+ print(colored(line, Colors.GREEN))
170
+
171
+ if base_branch_conflict:
172
+ # Recorded anyway — the value is true, it just cannot describe a PR.
173
+ # Archive refuses this shape, so say so now rather than at the gate.
174
+ print(
175
+ colored(
176
+ f"Warning: '{base_branch_conflict}' is also this task's base_branch; "
177
+ "a PR cannot target its own branch, and archive will refuse it.",
178
+ Colors.YELLOW,
179
+ ),
180
+ file=sys.stderr,
181
+ )
182
+ print(
183
+ f"Once you branch off, run: python3 {DIR_WORKFLOW}/scripts/task.py "
184
+ "set-branch <task> <feature-branch>",
185
+ file=sys.stderr,
186
+ )
187
+
188
+
189
+ def cmd_start(args: argparse.Namespace) -> int:
190
+ """Set active task."""
191
+ repo_root = get_repo_root()
192
+ task_input = args.dir
193
+
194
+ if not task_input:
195
+ print(colored("Error: task directory or name required", Colors.RED))
196
+ return 1
197
+
198
+ # Resolve task directory (supports task name, relative path, or absolute path)
199
+ full_path = resolve_task_dir(task_input, repo_root)
200
+
201
+ if full_path is None:
202
+ # resolve_task_dir already named the exact reason on stderr. A second,
203
+ # generic line on stdout would split one diagnosis across two streams
204
+ # and bury the specific message.
205
+ return 1
206
+
207
+ if not full_path.is_dir():
208
+ print(colored(f"Error: Task not found: {task_input}", Colors.RED))
209
+ print("Hint: Use task name (e.g., 'my-task') or full path (e.g., '.atw/tasks/01-31-my-task')")
210
+ return 1
211
+
212
+ # Context-manifest gate: a seeded-but-uncurated implement/check
213
+ # manifest means every sub-agent dispatched for this task runs with zero
214
+ # spec context, and nothing downstream surfaces that to the main session.
215
+ # An absent manifest is not gated — create seeds the files only on
216
+ # sub-agent-capable platforms, so absence means no sub-agent reads them.
217
+ if not getattr(args, "allow_empty_context", False):
218
+ empty_manifests = [
219
+ name
220
+ for name in ("implement.jsonl", "check.jsonl")
221
+ if curated_entry_count(full_path / name) == 0
222
+ ]
223
+ if empty_manifests:
224
+ print(colored(
225
+ f"Error: {' and '.join(empty_manifests)} "
226
+ f"{'has' if len(empty_manifests) == 1 else 'have'} no curated entries",
227
+ Colors.RED,
228
+ ))
229
+ print("Sub-agents (implement/check) would run with zero spec context.")
230
+ print(f" Curate: python3 .atw/scripts/task.py add-context {task_input} implement <path> \"<why>\"")
231
+ print(f" Verify: python3 .atw/scripts/task.py validate {task_input}")
232
+ print(" Intentionally empty? Re-run start with --allow-empty-context")
233
+ return 1
234
+
235
+ # Convert to relative path for storage. repo_root is resolved because
236
+ # full_path already is (resolve_task_dir only returns paths inside the
237
+ # resolved root), so an unresolved repo_root would mismatch under a
238
+ # symlink (e.g. /tmp on macOS) and reject a perfectly normal task.
239
+ try:
240
+ task_dir = full_path.relative_to(repo_root.resolve()).as_posix()
241
+ except ValueError:
242
+ # resolve_task_dir already refused everything outside the repo, so
243
+ # this is unreachable in practice. Refuse rather than fall back to
244
+ # str(full_path) — that fallback (a lexical relative_to() paired with
245
+ # an absolute-path fallback) is exactly the pattern that let a `..`
246
+ # ref escape into storage before this fix.
247
+ print(colored(f"Error: Task not found: {task_input}", Colors.RED))
248
+ print("Hint: Use task name (e.g., 'my-task') or full path (e.g., '.atw/tasks/01-31-my-task')")
249
+ return 1
250
+
251
+ task_json_path = full_path / FILE_TASK_JSON
252
+
253
+ if not resolve_context_key():
254
+ # Degraded mode: no session identity available.
255
+ # Hook didn't inject ATW_CONTEXT_ID (common on Windows + Claude Code,
256
+ # --continue resume path, fork distribution, hooks disabled, etc.). Skip
257
+ # per-session pointer write; AI continues based on conversation context.
258
+ print(colored(
259
+ "ℹ Session identity not available; active-task pointer not persisted "
260
+ "this session (degraded mode). AI continues based on conversation context.",
261
+ Colors.YELLOW,
262
+ ))
263
+ print(colored(
264
+ "Hint: run inside an AI IDE/session that exposes session identity, "
265
+ "or set ATW_CONTEXT_ID before running task.py start.",
266
+ Colors.YELLOW,
267
+ ))
268
+
269
+ # Still flip task.json status: discover → implement so downstream phases proceed.
270
+ if task_json_path.is_file():
271
+ _record_start_state(task_json_path, repo_root, " (degraded)")
272
+ run_task_hooks("after_start", task_json_path, repo_root)
273
+ return 0
274
+
275
+ active = set_active_task(task_dir, repo_root)
276
+ if active:
277
+ print(colored(f"✓ Current task set to: {task_dir}", Colors.GREEN))
278
+ print(f"Source: {active.source}")
279
+
280
+ if task_json_path.is_file():
281
+ _record_start_state(task_json_path, repo_root)
282
+
283
+ print()
284
+ print(colored("The hook will now inject context from this task's jsonl files.", Colors.BLUE))
285
+
286
+ run_task_hooks("after_start", task_json_path, repo_root)
287
+ return 0
288
+ else:
289
+ print(colored("Error: Failed to set current task", Colors.RED))
290
+ return 1
291
+
292
+
293
+ def cmd_finish(args: argparse.Namespace) -> int:
294
+ """Clear active task."""
295
+ repo_root = get_repo_root()
296
+ active = clear_active_task(repo_root)
297
+ current = active.task_path
298
+
299
+ if not current:
300
+ print(colored("No current task set", Colors.YELLOW))
301
+ return 0
302
+
303
+ # Resolve task.json path before clearing
304
+ task_json_path = repo_root / current / FILE_TASK_JSON
305
+
306
+ print(colored(f"✓ Cleared current task (was: {current})", Colors.GREEN))
307
+ print(f"Source: {active.source}")
308
+
309
+ if task_json_path.is_file():
310
+ run_task_hooks("after_finish", task_json_path, repo_root)
311
+ return 0
312
+
313
+
314
+ def cmd_current(args: argparse.Namespace) -> int:
315
+ """Show active task."""
316
+ repo_root = get_repo_root()
317
+ active = resolve_active_task(repo_root)
318
+
319
+ if getattr(args, "json", False):
320
+ task_obj = None
321
+ read_error = None
322
+ if active.task_path:
323
+ task_json_path = repo_root / active.task_path / FILE_TASK_JSON
324
+ data, reason = read_json_checked(task_json_path)
325
+ if data is None:
326
+ # Without this, a corrupt task.json emits null for every field
327
+ # — indistinguishable from a task whose fields really are null.
328
+ problem, hint = describe_json_read_failure(task_json_path, reason)
329
+ read_error = {
330
+ "file": str(task_json_path),
331
+ "reason": reason,
332
+ "message": f"{problem}. {hint}",
333
+ }
334
+ data = {}
335
+ task_obj = {
336
+ "dir": active.task_path,
337
+ "id": data.get("id") or data.get("name"),
338
+ "title": data.get("title"),
339
+ "status": data.get("status"),
340
+ "parent": data.get("parent"),
341
+ "children": data.get("children", []),
342
+ "branch": data.get("branch"),
343
+ "base_branch": data.get("base_branch"),
344
+ }
345
+ payload = {
346
+ "current_task": task_obj,
347
+ "source": active.source,
348
+ "stale": active.stale,
349
+ }
350
+ # Only present when the read failed, so the healthy shape is unchanged.
351
+ if read_error:
352
+ payload["error"] = read_error
353
+ print(json.dumps(payload, ensure_ascii=False))
354
+ return 0 if active.task_path else 1
355
+
356
+ if args.source:
357
+ print(f"Current task: {active.task_path or '(none)'}")
358
+ print(f"Source: {active.source}")
359
+ if active.stale:
360
+ print("State: stale")
361
+ return 0 if active.task_path else 1
362
+
363
+ if active.task_path:
364
+ print(active.task_path)
365
+ return 0
366
+
367
+ return 1
368
+
369
+
370
+ # =============================================================================
371
+ # Command: list
372
+ # =============================================================================
373
+
374
+ def _display_status(t, all_statuses: dict) -> str:
375
+ """Return the status label to show for a task in `list` output.
376
+
377
+ A parent task's stored status stays "discover" until someone runs
378
+ `task.py start` on the parent directly, even while its children are
379
+ actively being worked — a misleading label for anyone scanning the
380
+ list. Show "active" instead when at least one child is
381
+ past "discover"; the stored status.json value is left untouched.
382
+ """
383
+ if t.status == "discover" and t.children:
384
+ child_in_flight = any(
385
+ all_statuses.get(c) not in (None, "discover") for c in t.children
386
+ )
387
+ if child_in_flight:
388
+ return "active"
389
+ return t.status
390
+
391
+
392
+ def cmd_list(args: argparse.Namespace) -> int:
393
+ """List active tasks."""
394
+ repo_root = get_repo_root()
395
+ tasks_dir = get_tasks_dir(repo_root)
396
+ current_task = get_current_task(repo_root)
397
+ developer = get_developer(repo_root)
398
+ filter_mine = args.mine
399
+ filter_status = args.status
400
+ as_json = getattr(args, "json", False)
401
+
402
+ # Single pass: collect all tasks via shared iterator
403
+ all_tasks = {t.dir_name: t for t in iter_active_tasks(tasks_dir)}
404
+ all_statuses = {name: t.status for name, t in all_tasks.items()}
405
+
406
+ if as_json:
407
+ if filter_mine and not developer:
408
+ print(
409
+ json.dumps({"error": "No developer set", "hint": DEVELOPER_HINT}),
410
+ file=sys.stderr,
411
+ )
412
+ return 1
413
+
414
+ items = []
415
+ for dir_name in sorted(all_tasks.keys()):
416
+ t = all_tasks[dir_name]
417
+ if filter_mine and (t.assignee or "-") != developer:
418
+ continue
419
+ if filter_status and t.status != filter_status:
420
+ continue
421
+ items.append({
422
+ "dir": f"{DIR_WORKFLOW}/{DIR_TASKS}/{dir_name}",
423
+ "id": t.raw.get("id") or dir_name,
424
+ "title": t.title,
425
+ "status": t.status,
426
+ "display_status": _display_status(t, all_statuses),
427
+ "priority": t.priority,
428
+ "assignee": t.assignee or None,
429
+ "parent": t.parent,
430
+ "children": list(t.children),
431
+ "package": t.package,
432
+ })
433
+ print(json.dumps({"tasks": items}, ensure_ascii=False))
434
+ return 0
435
+
436
+ if filter_mine:
437
+ if not developer:
438
+ print(colored("Error: No developer set. Run init_developer.py first", Colors.RED), file=sys.stderr)
439
+ print(DEVELOPER_HINT, file=sys.stderr)
440
+ return 1
441
+ print(colored(f"My tasks (assignee: {developer}):", Colors.BLUE))
442
+ else:
443
+ print(colored("All active tasks:", Colors.BLUE))
444
+ print()
445
+
446
+ # Display tasks hierarchically
447
+ count = 0
448
+
449
+ def _print_task(dir_name: str, indent: int = 0) -> None:
450
+ nonlocal count
451
+ t = all_tasks[dir_name]
452
+
453
+ # Apply --mine filter
454
+ if filter_mine and (t.assignee or "-") != developer:
455
+ return
456
+
457
+ # Apply --status filter
458
+ if filter_status and t.status != filter_status:
459
+ return
460
+
461
+ relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{dir_name}"
462
+ marker = ""
463
+ if relative_path == current_task:
464
+ marker = f" {colored('<- current', Colors.GREEN)}"
465
+
466
+ # Children progress
467
+ progress = children_progress(t.children, all_statuses)
468
+ status_label = _display_status(t, all_statuses)
469
+
470
+ # Package tag
471
+ pkg_tag = f" @{t.package}" if t.package else ""
472
+
473
+ prefix = " " * indent + " - "
474
+
475
+ if filter_mine:
476
+ print(f"{prefix}{dir_name}/ ({status_label}){pkg_tag}{progress}{marker}")
477
+ else:
478
+ print(f"{prefix}{dir_name}/ ({status_label}){pkg_tag}{progress} [{colored(t.assignee or '-', Colors.CYAN)}]{marker}")
479
+ count += 1
480
+
481
+ # Print children indented
482
+ for child_name in t.children:
483
+ if child_name in all_tasks:
484
+ _print_task(child_name, indent + 1)
485
+
486
+ # Display only top-level tasks: those without a parent, plus orphans
487
+ # whose recorded parent is not (or no longer) in the active set — a
488
+ # dangling parent ref must still render flat instead of disappearing.
489
+ for dir_name in sorted(all_tasks.keys()):
490
+ parent = all_tasks[dir_name].parent
491
+ if not parent or parent not in all_tasks:
492
+ _print_task(dir_name)
493
+
494
+ if count == 0:
495
+ if filter_mine:
496
+ print(" (no tasks assigned to you)")
497
+ else:
498
+ print(" (no active tasks)")
499
+
500
+ print()
501
+ print(f"Total: {count} task(s)")
502
+ return 0
503
+
504
+
505
+ # =============================================================================
506
+ # Command: list-archive
507
+ # =============================================================================
508
+
509
+ def cmd_list_archive(args: argparse.Namespace) -> int:
510
+ """List archived tasks."""
511
+ repo_root = get_repo_root()
512
+ tasks_dir = get_tasks_dir(repo_root)
513
+ archive_dir = tasks_dir / "archive"
514
+ month = args.month
515
+
516
+ print(colored("Archived tasks:", Colors.BLUE))
517
+ print()
518
+
519
+ if month:
520
+ month_dir = archive_dir / month
521
+ if month_dir.is_dir():
522
+ print(f"[{month}]")
523
+ for d in sorted(month_dir.iterdir()):
524
+ if d.is_dir():
525
+ print(f" - {d.name}/")
526
+ else:
527
+ print(f" No archives for {month}")
528
+ else:
529
+ if archive_dir.is_dir():
530
+ for month_dir in sorted(archive_dir.iterdir()):
531
+ if month_dir.is_dir():
532
+ month_name = month_dir.name
533
+ count = sum(1 for d in month_dir.iterdir() if d.is_dir())
534
+ print(f"[{month_name}] - {count} task(s)")
535
+
536
+ return 0
537
+
538
+
539
+ # =============================================================================
540
+ # Help
541
+ # =============================================================================
542
+
543
+ def show_usage() -> None:
544
+ """Show usage help."""
545
+ # Interpolated rather than spelled out: a hand-copied stage list drifts from
546
+ # the real one, and `--status <stale value>` then silently matches nothing.
547
+ statuses = " | ".join(STATUS_VALUES)
548
+ print(f"""Task Management Script
549
+
550
+ Usage:
551
+ python3 task.py create <title> --description <desc> Create new task directory (both required, non-empty)
552
+ python3 task.py create <title> --description <desc> --package <pkg> Create task for a specific package
553
+ python3 task.py create <title> --description <desc> --parent <dir> Create task as child of parent
554
+ python3 task.py create <title> --description <desc> --no-start Create without making it active in this session
555
+ python3 task.py add-context <dir> <jsonl> <path> [reason] Add entry to jsonl
556
+ python3 task.py validate <dir> Validate jsonl files
557
+ python3 task.py list-context <dir> List jsonl entries
558
+ python3 task.py start <dir> Set active task; records the checked-out branch when unset
559
+ python3 task.py current [--source] Show active task
560
+ python3 task.py finish Clear active task
561
+ python3 task.py set-branch <dir> <branch> Set git branch
562
+ python3 task.py set-base-branch <dir> <branch> Set PR target branch
563
+ python3 task.py set-scope <dir> <scope> Set scope for PR title
564
+ python3 task.py set-meta <dir> <key> <value> Set/overwrite a task metadata key
565
+ python3 task.py set-status <dir> <status> Move task to a workflow stage
566
+ python3 task.py rename <dir> <new-slug> Rename task, identity fields and references
567
+ python3 task.py archive <task-dir> Archive completed task
568
+ python3 task.py add-subtask <parent> <child> Link child task to parent
569
+ python3 task.py remove-subtask <parent> <child> Unlink child from parent
570
+ python3 task.py list [--mine] [--status <status>] [--json] List tasks
571
+ python3 task.py list-archive [YYYY-MM] List archived tasks
572
+
573
+ Monorepo options:
574
+ --package <pkg> Package name (validated against config.yaml packages)
575
+
576
+ Rename options:
577
+ --dry-run Print the change set without writing anything
578
+
579
+ Archive options:
580
+ --no-commit Skip the auto git commit after archiving
581
+ --skip-branch-validation Archive despite missing or self-referential branch metadata.
582
+ Archive normally refuses a task with no `branch` when it has a
583
+ `base_branch` and the repo has a remote, or with
584
+ `branch == base_branch`; repair those with `set-branch` /
585
+ `set-base-branch` instead. Use this flag only for tasks that
586
+ were never PR-backed. A recorded branch that was merged and
587
+ deleted is only a warning and needs no flag.
588
+
589
+ List options:
590
+ --mine, -m Show only tasks assigned to current developer
591
+ --status, -s <s> Filter by status ({statuses})
592
+ --json Output machine-readable JSON (also available on `current`)
593
+
594
+ Examples:
595
+ python3 task.py create "Add login feature" --description "Email + password sign-in" --slug add-login
596
+ python3 task.py create "Add login feature" --description "Email + password sign-in" --slug add-login --package cli
597
+ python3 task.py create "Add login feature" --description "Email + password sign-in" --meta linear=ENG-123 --meta epic=auth
598
+ python3 task.py create "Child task" --description "Session cookie handling" --slug child --parent .atw/tasks/01-21-parent
599
+ python3 task.py add-context <dir> implement .atw/spec/cli/backend/auth.md "Auth guidelines"
600
+ python3 task.py set-branch <dir> task/add-login
601
+ python3 task.py set-status add-login slice
602
+ python3 task.py start .atw/tasks/01-21-add-login
603
+ python3 task.py current --source
604
+ python3 task.py finish
605
+ python3 task.py rename add-login add-sso --dry-run # Preview the change set
606
+ python3 task.py rename add-login add-sso
607
+ python3 task.py archive add-login
608
+ python3 task.py archive add-login --skip-branch-validation # Task never had a branch of its own
609
+ python3 task.py add-subtask parent-task child-task # Link existing tasks
610
+ python3 task.py remove-subtask parent-task child-task
611
+ python3 task.py list # List all active tasks
612
+ python3 task.py list --mine # List my tasks only
613
+ python3 task.py list --mine --status implement # List my in-flight tasks
614
+ """)
615
+
616
+
617
+ # =============================================================================
618
+ # Main Entry
619
+ # =============================================================================
620
+
621
+ def main() -> int:
622
+ """CLI entry point."""
623
+ # Deprecation guard: `init-context` no longer exists.
624
+ # Detect early so argparse doesn't mask the real reason with a generic
625
+ # "invalid choice" error.
626
+ if len(sys.argv) >= 2 and sys.argv[1] == "init-context":
627
+ print(
628
+ colored(
629
+ "Error: `task.py init-context` has been removed.",
630
+ Colors.RED,
631
+ ),
632
+ file=sys.stderr,
633
+ )
634
+ print(
635
+ "check.jsonl is now seeded on `task.py create` for sub-agent-capable",
636
+ file=sys.stderr,
637
+ )
638
+ print(
639
+ "platforms and curated by the AI when sub-agents need spec context.",
640
+ file=sys.stderr,
641
+ )
642
+ print("See .atw/workflow.md planning artifact guidance or run:", file=sys.stderr)
643
+ print(
644
+ " python3 ./.atw/scripts/get_context.py --mode phase --step 1",
645
+ file=sys.stderr,
646
+ )
647
+ print(
648
+ "Use `task.py add-context <dir> implement|check <path> <reason>` to append entries.",
649
+ file=sys.stderr,
650
+ )
651
+ return 2
652
+
653
+ parser = argparse.ArgumentParser(
654
+ description="Task Management Script",
655
+ formatter_class=argparse.RawDescriptionHelpFormatter,
656
+ )
657
+ subparsers = parser.add_subparsers(dest="command", help="Commands")
658
+
659
+ # create
660
+ p_create = subparsers.add_parser("create", help="Create new task")
661
+ p_create.add_argument("title", help="Task title (required, non-empty)")
662
+ p_create.add_argument("--slug", "-s", help="Task slug without the MM-DD date prefix")
663
+ p_create.add_argument("--assignee", "-a", help="Assignee developer")
664
+ p_create.add_argument("--priority", "-p", default="P2", help="Priority (P0-P3)")
665
+ p_create.add_argument(
666
+ "--description",
667
+ "-d",
668
+ help="Task description (required, non-empty — an empty one is refused at archive)",
669
+ )
670
+ p_create.add_argument("--parent", help="Parent task directory (establishes subtask link)")
671
+ p_create.add_argument("--package", help="Package name for monorepo projects")
672
+ p_create.add_argument(
673
+ "--base-branch",
674
+ help="PR target branch (overrides origin/HEAD detection and the checked-out-branch fallback)",
675
+ )
676
+ p_create.add_argument(
677
+ "--meta",
678
+ action="append",
679
+ help="Task metadata key=value (repeatable)",
680
+ )
681
+ p_create.add_argument(
682
+ "--no-start",
683
+ action="store_true",
684
+ help="Create the task without making it active in this session",
685
+ )
686
+ p_create.add_argument(
687
+ "--force",
688
+ action="store_true",
689
+ help="Overwrite task.json when the task directory already exists",
690
+ )
691
+
692
+ # add-context
693
+ p_add = subparsers.add_parser("add-context", help="Add context entry")
694
+ p_add.add_argument("dir", help="Task directory")
695
+ p_add.add_argument("file", help="JSONL file (implement|check)")
696
+ p_add.add_argument("path", help="File path to add")
697
+ p_add.add_argument("reason", nargs="?", help="Reason for adding")
698
+
699
+ # validate
700
+ p_validate = subparsers.add_parser("validate", help="Validate context files")
701
+ p_validate.add_argument("dir", help="Task directory")
702
+
703
+ # list-context
704
+ p_listctx = subparsers.add_parser("list-context", help="List context entries")
705
+ p_listctx.add_argument("dir", help="Task directory")
706
+
707
+ # start
708
+ p_start = subparsers.add_parser("start", help="Set active task")
709
+ p_start.add_argument("dir", help="Task directory")
710
+ p_start.add_argument(
711
+ "--allow-empty-context",
712
+ action="store_true",
713
+ help="Start even when implement.jsonl / check.jsonl have no curated entries",
714
+ )
715
+
716
+ # current
717
+ p_current = subparsers.add_parser("current", help="Show active task")
718
+ p_current.add_argument("--source", action="store_true",
719
+ help="Show active task source")
720
+ p_current.add_argument("--json", action="store_true",
721
+ help="Output machine-readable JSON")
722
+
723
+ # finish
724
+ subparsers.add_parser("finish", help="Clear active task")
725
+
726
+ # set-branch
727
+ p_branch = subparsers.add_parser("set-branch", help="Set git branch")
728
+ p_branch.add_argument("dir", help="Task directory")
729
+ p_branch.add_argument("branch", help="Branch name")
730
+
731
+ # set-base-branch
732
+ p_base = subparsers.add_parser("set-base-branch", help="Set PR target branch")
733
+ p_base.add_argument("dir", help="Task directory")
734
+ p_base.add_argument("base_branch", help="Base branch name (PR target)")
735
+
736
+ # set-scope
737
+ p_scope = subparsers.add_parser("set-scope", help="Set scope")
738
+ p_scope.add_argument("dir", help="Task directory")
739
+ p_scope.add_argument("scope", help="Scope name")
740
+
741
+ # set-meta
742
+ p_setmeta = subparsers.add_parser("set-meta", help="Set/overwrite a task metadata key")
743
+ p_setmeta.add_argument("dir", help="Task directory")
744
+ p_setmeta.add_argument("key", help="Metadata key")
745
+ p_setmeta.add_argument("value", help="Metadata value")
746
+
747
+ # set-status
748
+ # `choices` is deliberately not used: argparse would exit 2 with a bare
749
+ # "invalid choice", while cmd_set_status names the rejected value and lists
750
+ # the allowed ones. Both refuse, only one tells you what to type instead.
751
+ p_setstatus = subparsers.add_parser("set-status", help="Move task to a workflow stage")
752
+ p_setstatus.add_argument("dir", help="Task directory")
753
+ p_setstatus.add_argument("status", help=f"Workflow stage ({' | '.join(STATUS_VALUES)})")
754
+
755
+ # rename
756
+ p_rename = subparsers.add_parser("rename", help="Rename task and its references")
757
+ p_rename.add_argument("name", help="Task directory or name")
758
+ p_rename.add_argument("new_slug", help="New slug without the MM-DD date prefix")
759
+ p_rename.add_argument(
760
+ "--dry-run",
761
+ action="store_true",
762
+ help="Print the change set without writing anything",
763
+ )
764
+
765
+ # archive
766
+ p_archive = subparsers.add_parser("archive", help="Archive task")
767
+ p_archive.add_argument("name", help="Task directory or name")
768
+ p_archive.add_argument("--no-commit", action="store_true", help="Skip auto git commit after archive")
769
+ p_archive.add_argument(
770
+ "--skip-branch-validation",
771
+ action="store_true",
772
+ help=(
773
+ "Archive even when branch metadata is missing or self-referential "
774
+ "(for tasks that were never PR-backed)"
775
+ ),
776
+ )
777
+
778
+ # list
779
+ p_list = subparsers.add_parser("list", help="List tasks")
780
+ p_list.add_argument("--mine", "-m", action="store_true", help="My tasks only")
781
+ p_list.add_argument("--status", "-s", help="Filter by status")
782
+ p_list.add_argument("--json", action="store_true", help="Output machine-readable JSON")
783
+
784
+ # add-subtask
785
+ p_addsub = subparsers.add_parser("add-subtask", help="Link child task to parent")
786
+ p_addsub.add_argument("parent_dir", help="Parent task directory")
787
+ p_addsub.add_argument("child_dir", help="Child task directory")
788
+
789
+ # remove-subtask
790
+ p_rmsub = subparsers.add_parser("remove-subtask", help="Unlink child task from parent")
791
+ p_rmsub.add_argument("parent_dir", help="Parent task directory")
792
+ p_rmsub.add_argument("child_dir", help="Child task directory")
793
+
794
+ # list-archive
795
+ p_listarch = subparsers.add_parser("list-archive", help="List archived tasks")
796
+ p_listarch.add_argument("month", nargs="?", help="Month (YYYY-MM)")
797
+
798
+ args = parser.parse_args()
799
+
800
+ if not args.command:
801
+ show_usage()
802
+ return 1
803
+
804
+ commands = {
805
+ "create": cmd_create,
806
+ "add-context": cmd_add_context,
807
+ "validate": cmd_validate,
808
+ "list-context": cmd_list_context,
809
+ "start": cmd_start,
810
+ "current": cmd_current,
811
+ "finish": cmd_finish,
812
+ "set-branch": cmd_set_branch,
813
+ "set-base-branch": cmd_set_base_branch,
814
+ "set-scope": cmd_set_scope,
815
+ "set-meta": cmd_set_meta,
816
+ "set-status": cmd_set_status,
817
+ "rename": cmd_rename,
818
+ "archive": cmd_archive,
819
+ "add-subtask": cmd_add_subtask,
820
+ "remove-subtask": cmd_remove_subtask,
821
+ "list": cmd_list,
822
+ "list-archive": cmd_list_archive,
823
+ }
824
+
825
+ if args.command in commands:
826
+ return commands[args.command](args)
827
+ else:
828
+ show_usage()
829
+ return 1
830
+
831
+
832
+ if __name__ == "__main__":
833
+ sys.exit(main())