workflow-ai 1.1.0 → 1.3.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 (599) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +37 -377
  3. package/configs/pipeline.yaml +113 -4
  4. package/package.json +54 -44
  5. package/src/lib/operations/tickets.mjs +305 -207
  6. package/src/lib/utils.mjs +286 -286
  7. package/src/runner.mjs +316 -35
  8. package/src/scripts/check-conditions.js +2 -2
  9. package/src/scripts/check-relevance.js +3 -1
  10. package/src/scripts/get-next-id.js +144 -41
  11. package/src/scripts/mark-blocked.js +160 -0
  12. package/src/scripts/move-ticket.js +305 -83
  13. package/src/scripts/pick-next-task.js +782 -93
  14. package/src/skills/__test-cal-001-1777553217513/SKILL.md +2 -0
  15. package/src/skills/__test-runner-1777553217483/SKILL.md +5 -0
  16. package/src/skills/coach/SKILL.md +2 -2
  17. package/src/skills/execute-task/SKILL.md +1 -1
  18. package/src/skills/manual-testing/SKILL.md +2 -0
  19. package/src/skills/review-result/SKILL.md +23 -1
  20. package/src/scripts/tests/timeout-cascade.test.js +0 -28
  21. package/src/skills/analyze-report/README.md +0 -44
  22. package/src/skills/analyze-report/algorithms/progress-assessment.md +0 -108
  23. package/src/skills/analyze-report/knowledge/analysis-frameworks.md +0 -66
  24. package/src/skills/analyze-report/knowledge/report-structure.md +0 -61
  25. package/src/skills/analyze-report/scripts/calc-plan-metrics.js +0 -234
  26. package/src/skills/analyze-report/templates/analysis-report.md +0 -80
  27. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +0 -5
  28. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +0 -98
  29. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +0 -99
  30. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +0 -163
  31. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -89
  32. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -88
  33. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -100
  34. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-1.md +0 -77
  35. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-2.md +0 -64
  36. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-3.md +0 -110
  37. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-1.md +0 -74
  38. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-2.md +0 -38
  39. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-3.md +0 -61
  40. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +0 -115
  41. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001-evidence-from-log.yaml +0 -60
  42. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-1.md +0 -90
  43. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-2.md +0 -89
  44. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +0 -5
  45. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/judge.json +0 -163
  46. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-1.md +0 -84
  47. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-2.md +0 -77
  48. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-3.md +0 -89
  49. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-1.md +0 -103
  50. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-2.md +0 -103
  51. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-3.md +0 -103
  52. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-1.md +0 -93
  53. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-2.md +0 -93
  54. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-3.md +0 -86
  55. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/meta.json +0 -115
  56. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002-result-block-format.yaml +0 -44
  57. package/src/skills/analyze-report/tests/fixtures/REPORT-002-incorrect-attribution.md +0 -27
  58. package/src/skills/analyze-report/tests/fixtures/pipeline-2026-04-06_qa-001-skip.log +0 -32
  59. package/src/skills/analyze-report/tests/index.yaml +0 -25
  60. package/src/skills/analyze-report/tests/rubrics/evidence-from-log.md +0 -22
  61. package/src/skills/analyze-report/tests/rubrics/result-block-format.md +0 -22
  62. package/src/skills/analyze-report/workflows/progress.md +0 -158
  63. package/src/skills/analyze-report/workflows/retrospective.md +0 -143
  64. package/src/skills/coach/README.md +0 -43
  65. package/src/skills/coach/SKILL.md.legacy +0 -157
  66. package/src/skills/coach/algorithms/gap-analysis.md +0 -69
  67. package/src/skills/coach/algorithms/improvement-prioritization.md +0 -62
  68. package/src/skills/coach/algorithms/skill-scoring.md +0 -80
  69. package/src/skills/coach/knowledge/audit-applied-changes-clean.txt +0 -11
  70. package/src/skills/coach/knowledge/backlog-management.md +0 -67
  71. package/src/skills/coach/knowledge/backlog-management.md.legacy +0 -90
  72. package/src/skills/coach/knowledge/common-antipatterns.md +0 -76
  73. package/src/skills/coach/knowledge/prompt-engineering.md +0 -45
  74. package/src/skills/coach/knowledge/shared-knowledge-guide.md +0 -44
  75. package/src/skills/coach/knowledge/skill-anatomy.md +0 -49
  76. package/src/skills/coach/knowledge/test-authorship.md +0 -141
  77. package/src/skills/coach/templates/audit-report.md +0 -39
  78. package/src/skills/coach/templates/coach-backlog-init.yaml +0 -14
  79. package/src/skills/coach/templates/coach-backlog-init.yaml.legacy +0 -10
  80. package/src/skills/coach/templates/improvement-plan.md +0 -42
  81. package/src/skills/coach/templates/new-skill.md +0 -95
  82. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-1.md +0 -58
  83. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-2.md +0 -65
  84. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-3.md +0 -58
  85. package/src/skills/coach/tests/cases/TC-COACH-001/current/judge.json +0 -151
  86. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-1.md +0 -46
  87. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-2.md +0 -0
  88. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-3.md +0 -75
  89. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-1.md +0 -81
  90. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-2.md +0 -101
  91. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-3.md +0 -91
  92. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-1.md +0 -48
  93. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-2.md +0 -30
  94. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-3.md +0 -55
  95. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +0 -94
  96. package/src/skills/coach/tests/cases/TC-COACH-001-evidence-based-temporal-diagram.yaml +0 -53
  97. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-1.md +0 -46
  98. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-2.md +0 -50
  99. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-3.md +0 -48
  100. package/src/skills/coach/tests/cases/TC-COACH-002/current/judge.json +0 -151
  101. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-1.md +0 -0
  102. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-2.md +0 -37
  103. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-3.md +0 -30
  104. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-1.md +0 -23
  105. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-2.md +0 -29
  106. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-3.md +0 -35
  107. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-1.md +0 -13
  108. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-2.md +0 -19
  109. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-3.md +0 -33
  110. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +0 -94
  111. package/src/skills/coach/tests/cases/TC-COACH-002-root-cause-first.yaml +0 -57
  112. package/src/skills/coach/tests/fixtures/pipeline-2026-04-06_id-collision.log +0 -77
  113. package/src/skills/coach/tests/index.yaml +0 -29
  114. package/src/skills/coach/tests/rubrics/calibration/evidence-based-bad.md +0 -13
  115. package/src/skills/coach/tests/rubrics/calibration/evidence-based-good.md +0 -29
  116. package/src/skills/coach/tests/rubrics/evidence-based.md +0 -26
  117. package/src/skills/coach/tests/rubrics/root-cause-first.md +0 -21
  118. package/src/skills/coach/workflows/analyze.md +0 -79
  119. package/src/skills/coach/workflows/analyze.md.legacy +0 -64
  120. package/src/skills/coach/workflows/audit.md +0 -74
  121. package/src/skills/coach/workflows/audit.md.legacy +0 -59
  122. package/src/skills/coach/workflows/create.md +0 -80
  123. package/src/skills/coach/workflows/create.md.legacy +0 -67
  124. package/src/skills/coach/workflows/improve.md +0 -71
  125. package/src/skills/coach/workflows/improve.md.legacy +0 -60
  126. package/src/skills/coach/workflows/research.md +0 -55
  127. package/src/skills/coach/workflows/review.md +0 -52
  128. package/src/skills/coach/workflows/review.md.legacy +0 -48
  129. package/src/skills/coach/workflows/test.md +0 -97
  130. package/src/skills/create-plan/README.md +0 -39
  131. package/src/skills/create-plan/algorithms/risk-assessment.md +0 -73
  132. package/src/skills/create-plan/knowledge/plan-completeness.md +0 -67
  133. package/src/skills/create-plan/knowledge/plan-lifecycle.md +0 -33
  134. package/src/skills/create-plan/knowledge/task-verification-pairs.md +0 -151
  135. package/src/skills/create-plan/knowledge/test-hygiene.md +0 -47
  136. package/src/skills/create-plan/scripts/validate-completeness.js +0 -182
  137. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-1.md +0 -5
  138. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-2.md +0 -39
  139. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-3.md +0 -35
  140. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/judge.json +0 -167
  141. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -5
  142. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -10
  143. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -5
  144. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-1.md +0 -26
  145. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-2.md +0 -86
  146. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-3.md +0 -5
  147. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-1.md +0 -11
  148. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-2.md +0 -15
  149. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-3.md +0 -14
  150. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/meta.json +0 -119
  151. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001-validate-completeness.yaml +0 -41
  152. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-1.md +0 -25
  153. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-2.md +0 -30
  154. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-3.md +0 -37
  155. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/judge.json +0 -164
  156. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -3
  157. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -11
  158. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -13
  159. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-1.md +0 -44
  160. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-2.md +0 -5
  161. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-3.md +0 -49
  162. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-1.md +0 -6
  163. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-2.md +0 -11
  164. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-3.md +0 -16
  165. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/meta.json +0 -116
  166. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002-task-granularity.yaml +0 -39
  167. package/src/skills/create-plan/tests/index.yaml +0 -25
  168. package/src/skills/create-plan/tests/rubrics/task-granularity.md +0 -21
  169. package/src/skills/create-plan/tests/rubrics/validate-completeness.md +0 -21
  170. package/src/skills/create-plan/workflows/create.md +0 -136
  171. package/src/skills/create-report/README.md +0 -40
  172. package/src/skills/create-report/algorithms/metric-calculation.md +0 -93
  173. package/src/skills/create-report/knowledge/report-metrics.md +0 -82
  174. package/src/skills/create-report/scripts/calc-metrics.js +0 -383
  175. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-1.md +0 -25
  176. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-2.md +0 -26
  177. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-3.md +0 -28
  178. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/judge.json +0 -163
  179. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -4
  180. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -3
  181. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -6
  182. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-1.md +0 -8
  183. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-2.md +0 -12
  184. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-3.md +0 -7
  185. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-1.md +0 -12
  186. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-2.md +0 -22
  187. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-3.md +0 -13
  188. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/meta.json +0 -115
  189. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001-root-cause-attribution.yaml +0 -57
  190. package/src/skills/create-report/tests/index.yaml +0 -20
  191. package/src/skills/create-report/tests/rubrics/root-cause-attribution.md +0 -21
  192. package/src/skills/create-report/workflows/standard.md +0 -175
  193. package/src/skills/decompose-gaps/README.md +0 -39
  194. package/src/skills/decompose-gaps/algorithms/scope-check.md +0 -110
  195. package/src/skills/decompose-gaps/knowledge/scope-validation.md +0 -65
  196. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +0 -41
  197. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +0 -41
  198. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +0 -56
  199. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +0 -164
  200. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-1.md +0 -25
  201. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +0 -17
  202. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +0 -22
  203. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +0 -25
  204. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-2.md +0 -5
  205. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +0 -29
  206. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +0 -27
  207. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +0 -35
  208. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +0 -18
  209. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +0 -116
  210. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001-scope-exclusion.yaml +0 -46
  211. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +0 -27
  212. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +0 -30
  213. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +0 -27
  214. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +0 -163
  215. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -0
  216. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +0 -15
  217. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +0 -7
  218. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +0 -21
  219. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +0 -38
  220. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +0 -16
  221. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +0 -5
  222. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +0 -10
  223. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +0 -9
  224. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +0 -115
  225. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002-glob-before-write.yaml +0 -36
  226. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +0 -30
  227. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +0 -30
  228. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +0 -30
  229. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +0 -165
  230. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +0 -5
  231. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +0 -26
  232. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +0 -5
  233. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +0 -39
  234. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +0 -37
  235. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +0 -45
  236. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +0 -26
  237. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +0 -27
  238. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +0 -7
  239. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +0 -117
  240. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +0 -41
  241. package/src/skills/decompose-gaps/tests/index.yaml +0 -30
  242. package/src/skills/decompose-gaps/tests/rubrics/glob-before-write.md +0 -21
  243. package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +0 -22
  244. package/src/skills/decompose-gaps/tests/rubrics/scope-exclusion.md +0 -21
  245. package/src/skills/decompose-gaps/workflows/decompose.md +0 -123
  246. package/src/skills/decompose-plan/README.md +0 -43
  247. package/src/skills/decompose-plan/algorithms/deduplication.md +0 -101
  248. package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +0 -139
  249. package/src/skills/decompose-plan/knowledge/capabilities.md +0 -68
  250. package/src/skills/decompose-plan/knowledge/human-task-rules.md +0 -82
  251. package/src/skills/decompose-plan/knowledge/scope-guard-checklist.md +0 -73
  252. package/src/skills/decompose-plan/scripts/check-atomicity-limit.js +0 -47
  253. package/src/skills/decompose-plan/scripts/check-duplicates.js +0 -323
  254. package/src/skills/decompose-plan/scripts/verify-atomicity.js +0 -408
  255. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-1.md +0 -30
  256. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-2.md +0 -36
  257. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-3.md +0 -37
  258. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/judge.json +0 -163
  259. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -20
  260. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -17
  261. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -28
  262. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-1.md +0 -114
  263. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-2.md +0 -137
  264. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-3.md +0 -188
  265. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-1.md +0 -0
  266. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-2.md +0 -32
  267. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-3.md +0 -110
  268. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/meta.json +0 -115
  269. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001-atomicity-no-1to1.yaml +0 -56
  270. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-1.md +0 -47
  271. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-2.md +0 -54
  272. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-3.md +0 -43
  273. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/judge.json +0 -163
  274. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -15
  275. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -5
  276. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -12
  277. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-1.md +0 -34
  278. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-2.md +0 -30
  279. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-3.md +0 -35
  280. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-1.md +0 -0
  281. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-2.md +0 -31
  282. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-3.md +0 -0
  283. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/meta.json +0 -115
  284. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002-get-next-id-mandatory.yaml +0 -44
  285. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-1.md +0 -21
  286. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-2.md +0 -38
  287. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-3.md +0 -30
  288. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/judge.json +0 -163
  289. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-1.md +0 -31
  290. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-2.md +0 -35
  291. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-3.md +0 -48
  292. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-1.md +0 -167
  293. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-2.md +0 -62
  294. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-3.md +0 -174
  295. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-1.md +0 -0
  296. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-2.md +0 -0
  297. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-3.md +0 -0
  298. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/meta.json +0 -115
  299. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003-verbatim-dod-transfer.yaml +0 -42
  300. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +0 -55
  301. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +0 -49
  302. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +0 -49
  303. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +0 -163
  304. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +0 -104
  305. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +0 -45
  306. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +0 -58
  307. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +0 -193
  308. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +0 -202
  309. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +0 -155
  310. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +0 -52
  311. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +0 -17
  312. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
  313. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +0 -115
  314. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +0 -64
  315. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +0 -59
  316. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +0 -204
  317. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +0 -213
  318. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +0 -163
  319. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
  320. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +0 -57
  321. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +0 -54
  322. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +0 -147
  323. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +0 -165
  324. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +0 -133
  325. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +0 -81
  326. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +0 -108
  327. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +0 -3
  328. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +0 -114
  329. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +0 -78
  330. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +0 -225
  331. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +0 -66
  332. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +0 -36
  333. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +0 -163
  334. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +0 -42
  335. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +0 -67
  336. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +0 -40
  337. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +0 -122
  338. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +0 -131
  339. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +0 -138
  340. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +0 -41
  341. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +0 -88
  342. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
  343. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +0 -115
  344. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +0 -72
  345. package/src/skills/decompose-plan/tests/index.yaml +0 -45
  346. package/src/skills/decompose-plan/tests/rubrics/atomicity-no-1to1.md +0 -21
  347. package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +0 -21
  348. package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +0 -21
  349. package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +0 -21
  350. package/src/skills/decompose-plan/tests/rubrics/get-next-id-mandatory.md +0 -21
  351. package/src/skills/decompose-plan/tests/rubrics/verbatim-dod-transfer.md +0 -21
  352. package/src/skills/decompose-plan/workflows/decompose.md +0 -305
  353. package/src/skills/deep-research/README.md +0 -36
  354. package/src/skills/deep-research/algorithms/source-scoring.md +0 -63
  355. package/src/skills/deep-research/algorithms/synthesis.md +0 -67
  356. package/src/skills/deep-research/knowledge/data-validation.md +0 -44
  357. package/src/skills/deep-research/knowledge/perplexity-config.md +0 -30
  358. package/src/skills/deep-research/knowledge/research-methodology.md +0 -54
  359. package/src/skills/deep-research/knowledge/source-evaluation.md +0 -33
  360. package/src/skills/deep-research/scripts/perplexity-research.js +0 -315
  361. package/src/skills/deep-research/templates/brief-summary.md +0 -25
  362. package/src/skills/deep-research/templates/research-report.md +0 -76
  363. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-1.md +0 -48
  364. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-2.md +0 -88
  365. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-3.md +0 -56
  366. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/judge.json +0 -163
  367. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-1.md +0 -58
  368. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-2.md +0 -249
  369. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-3.md +0 -44
  370. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-1.md +0 -96
  371. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-2.md +0 -56
  372. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-3.md +0 -94
  373. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-1.md +0 -11
  374. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-2.md +0 -1
  375. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-3.md +0 -1
  376. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/meta.json +0 -115
  377. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001-self-check-url.yaml +0 -58
  378. package/src/skills/deep-research/tests/index.yaml +0 -20
  379. package/src/skills/deep-research/tests/rubrics/self-check-url.md +0 -34
  380. package/src/skills/deep-research/workflows/base-checklist.md +0 -19
  381. package/src/skills/deep-research/workflows/benchmark.md +0 -38
  382. package/src/skills/deep-research/workflows/competitor.md +0 -44
  383. package/src/skills/deep-research/workflows/custom.md +0 -32
  384. package/src/skills/deep-research/workflows/market.md +0 -44
  385. package/src/skills/deep-research/workflows/technology.md +0 -40
  386. package/src/skills/deep-research/workflows/trend.md +0 -40
  387. package/src/skills/execute-task/README.md +0 -44
  388. package/src/skills/execute-task/algorithms/execution-strategy.md +0 -136
  389. package/src/skills/execute-task/knowledge/context-checkpoints.md +0 -75
  390. package/src/skills/execute-task/knowledge/ticket-structure.md +0 -70
  391. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-1.md +0 -5
  392. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-2.md +0 -5
  393. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-3.md +0 -5
  394. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/judge.json +0 -124
  395. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-1.md +0 -4
  396. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-2.md +0 -4
  397. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-3.md +0 -4
  398. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-1.md +0 -4
  399. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-2.md +0 -4
  400. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-3.md +0 -11
  401. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +0 -88
  402. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001-no-ticket-creation.yaml +0 -48
  403. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-1.md +0 -5
  404. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-2.md +0 -6
  405. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-3.md +0 -5
  406. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/judge.json +0 -124
  407. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-1.md +0 -4
  408. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-2.md +0 -4
  409. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-3.md +0 -8
  410. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-1.md +0 -9
  411. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-2.md +0 -26
  412. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-3.md +0 -4
  413. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/meta.json +0 -89
  414. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002-no-duplicate-dod.yaml +0 -44
  415. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-1.md +0 -5
  416. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-2.md +0 -5
  417. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-3.md +0 -5
  418. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/judge.json +0 -46
  419. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/meta.json +0 -37
  420. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003-verification-proportionality.yaml +0 -46
  421. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-1.md +0 -18
  422. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-2.md +0 -16
  423. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-3.md +0 -14
  424. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/judge.json +0 -124
  425. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-1.md +0 -5
  426. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-2.md +0 -5
  427. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-3.md +0 -1
  428. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-1.md +0 -8
  429. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-2.md +0 -5
  430. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-3.md +0 -4
  431. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/meta.json +0 -89
  432. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004-no-foreign-ticket-edit.yaml +0 -50
  433. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-1.md +0 -5
  434. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-2.md +0 -5
  435. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-3.md +0 -5
  436. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/judge.json +0 -124
  437. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-1.md +0 -15
  438. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-2.md +0 -4
  439. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-3.md +0 -5
  440. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-1.md +0 -11
  441. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-2.md +0 -11
  442. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-3.md +0 -4
  443. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +0 -88
  444. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005-ticket-fields-updated.yaml +0 -39
  445. package/src/skills/execute-task/tests/fixtures/IMPL-902-create-file.md +0 -41
  446. package/src/skills/execute-task/tests/fixtures/IMPL-904-current-task.md +0 -40
  447. package/src/skills/execute-task/tests/fixtures/IMPL-906-fill-ticket.md +0 -42
  448. package/src/skills/execute-task/tests/fixtures/QA-901-button-click.md +0 -41
  449. package/src/skills/execute-task/tests/fixtures/QA-903-visual-figma.md +0 -40
  450. package/src/skills/execute-task/tests/fixtures/TASK-905-done-with-typo.md +0 -36
  451. package/src/skills/execute-task/tests/index.yaml +0 -39
  452. package/src/skills/execute-task/tests/rubrics/no-duplicate-dod.md +0 -22
  453. package/src/skills/execute-task/tests/rubrics/no-foreign-ticket-edit.md +0 -20
  454. package/src/skills/execute-task/tests/rubrics/no-ticket-creation.md +0 -21
  455. package/src/skills/execute-task/tests/rubrics/ticket-fields-updated.md +0 -23
  456. package/src/skills/execute-task/tests/rubrics/verification-proportionality.md +0 -22
  457. package/src/skills/execute-task/workflows/execute.md +0 -104
  458. package/src/skills/manual-testing/README.md +0 -63
  459. package/src/skills/manual-testing/algorithms/blocked-tool-strategy.md +0 -74
  460. package/src/skills/manual-testing/algorithms/bug-severity.md +0 -73
  461. package/src/skills/manual-testing/algorithms/mcp-budget.md +0 -97
  462. package/src/skills/manual-testing/algorithms/test-prioritization.md +0 -69
  463. package/src/skills/manual-testing/knowledge/browser-extension-testing.md +0 -102
  464. package/src/skills/manual-testing/knowledge/browser-tools.md +0 -114
  465. package/src/skills/manual-testing/knowledge/desktop-tools-advanced.md +0 -92
  466. package/src/skills/manual-testing/knowledge/desktop-tools-core.md +0 -76
  467. package/src/skills/manual-testing/knowledge/sandbox-advanced.md +0 -83
  468. package/src/skills/manual-testing/knowledge/sandbox-core.md +0 -67
  469. package/src/skills/manual-testing/knowledge/stateful-edge-cases.md +0 -69
  470. package/src/skills/manual-testing/knowledge/test-case-design.md +0 -107
  471. package/src/skills/manual-testing/knowledge/testing-types.md +0 -45
  472. package/src/skills/manual-testing/templates/bug-report.md +0 -52
  473. package/src/skills/manual-testing/templates/test-case.md +0 -34
  474. package/src/skills/manual-testing/templates/test-plan.md +0 -97
  475. package/src/skills/manual-testing/templates/test-session-report.md +0 -56
  476. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +0 -34
  477. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +0 -32
  478. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +0 -30
  479. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +0 -163
  480. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-1.md +0 -0
  481. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-2.md +0 -7
  482. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-3.md +0 -0
  483. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-1.md +0 -4
  484. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-2.md +0 -15
  485. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-3.md +0 -8
  486. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-1.md +0 -5
  487. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-2.md +0 -7
  488. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-3.md +0 -7
  489. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +0 -114
  490. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001-sandbox-mandatory.yaml +0 -38
  491. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +0 -44
  492. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +0 -32
  493. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +0 -47
  494. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +0 -163
  495. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-1.md +0 -19
  496. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-2.md +0 -15
  497. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-3.md +0 -24
  498. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-1.md +0 -19
  499. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-2.md +0 -13
  500. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-3.md +0 -18
  501. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-1.md +0 -21
  502. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-2.md +0 -15
  503. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-3.md +0 -14
  504. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +0 -114
  505. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002-visual-tc-screenshot.yaml +0 -37
  506. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +0 -76
  507. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +0 -71
  508. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +0 -85
  509. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +0 -46
  510. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +0 -36
  511. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +0 -65
  512. package/src/skills/manual-testing/tests/index.yaml +0 -30
  513. package/src/skills/manual-testing/tests/last-run-tc001-sonnet.log +0 -140
  514. package/src/skills/manual-testing/tests/last-run-tc002.log +0 -1
  515. package/src/skills/manual-testing/tests/last-run.log +0 -1469
  516. package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +0 -31
  517. package/src/skills/manual-testing/tests/rubrics/sandbox-mandatory.md +0 -20
  518. package/src/skills/manual-testing/tests/rubrics/visual-tc-screenshot.md +0 -21
  519. package/src/skills/manual-testing/workflows/acceptance.md +0 -80
  520. package/src/skills/manual-testing/workflows/exploratory.md +0 -84
  521. package/src/skills/manual-testing/workflows/regression.md +0 -76
  522. package/src/skills/manual-testing/workflows/smoke.md +0 -109
  523. package/src/skills/manual-testing/workflows/test-plan.md +0 -75
  524. package/src/skills/review-result/README.md +0 -59
  525. package/src/skills/review-result/algorithms/verification.md +0 -112
  526. package/src/skills/review-result/knowledge/baseline-snapshot-validation.md +0 -67
  527. package/src/skills/review-result/knowledge/dod-patterns.md +0 -116
  528. package/src/skills/review-result/knowledge/test-hygiene.md +0 -44
  529. package/src/skills/review-result/scripts/verify-artifacts.js +0 -497
  530. package/src/skills/review-result/templates/verdict.md +0 -153
  531. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-1.md +0 -22
  532. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-2.md +0 -7
  533. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-3.md +0 -21
  534. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +0 -6
  535. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +0 -6
  536. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +0 -6
  537. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +0 -164
  538. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-1.md +0 -5
  539. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-2.md +0 -7
  540. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-3.md +0 -6
  541. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-1.md +0 -49
  542. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-2.md +0 -28
  543. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-3.md +0 -37
  544. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-1.md +0 -22
  545. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-2.md +0 -13
  546. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-3.md +0 -21
  547. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +0 -116
  548. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001-visual-tc-trigger.yaml +0 -51
  549. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-1.md +0 -23
  550. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-2.md +0 -22
  551. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-3.md +0 -28
  552. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-1.md +0 -4
  553. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +0 -4
  554. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-3.md +0 -4
  555. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +0 -163
  556. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-1.md +0 -4
  557. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-2.md +0 -0
  558. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-3.md +0 -4
  559. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-1.md +0 -39
  560. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-2.md +0 -25
  561. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-3.md +0 -32
  562. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-1.md +0 -34
  563. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-2.md +0 -8
  564. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-3.md +0 -23
  565. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +0 -115
  566. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002-path-line-suffix.yaml +0 -39
  567. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +0 -40
  568. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +0 -15
  569. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +0 -7
  570. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +0 -163
  571. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +0 -5
  572. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +0 -5
  573. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +0 -11
  574. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +0 -16
  575. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +0 -18
  576. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +0 -17
  577. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +0 -17
  578. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +0 -31
  579. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +0 -5
  580. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +0 -115
  581. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +0 -50
  582. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-1.md +0 -5
  583. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-2.md +0 -5
  584. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-3.md +0 -6
  585. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/judge.json +0 -46
  586. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/meta.json +0 -37
  587. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004-baseline-snapshot.yaml +0 -50
  588. package/src/skills/review-result/tests/fixtures/IMPL-902-path-with-line.md +0 -43
  589. package/src/skills/review-result/tests/fixtures/QA-901-visual-button.md +0 -46
  590. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +0 -51
  591. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +0 -36
  592. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/QA-905.md +0 -62
  593. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/baseline.test.mjs +0 -124
  594. package/src/skills/review-result/tests/index.yaml +0 -35
  595. package/src/skills/review-result/tests/rubrics/baseline-snapshot.md +0 -20
  596. package/src/skills/review-result/tests/rubrics/path-line-suffix.md +0 -19
  597. package/src/skills/review-result/tests/rubrics/test-isolation.md +0 -20
  598. package/src/skills/review-result/tests/rubrics/visual-tc-trigger.md +0 -19
  599. package/src/skills/review-result/workflows/review.md +0 -209
package/src/runner.mjs CHANGED
@@ -176,7 +176,8 @@ class Logger {
176
176
  */
177
177
  stageStart(stageId, agentId, skillId) {
178
178
  this.stats.stagesStarted++;
179
- this.info(`START stage="${stageId}" agent="${agentId}" skill="${skillId}"`, stageId);
179
+ const ticketInfo = this.context && this.context.ticket_id ? ` ticket="${this.context.ticket_id}"` : "";
180
+ this.info(`START stage="${stageId}" agent="${agentId}" skill="${skillId}"${ticketInfo}`, stageId);
180
181
  }
181
182
 
182
183
  /**
@@ -1406,6 +1407,38 @@ class StageExecutor {
1406
1407
  class PipelineRunner {
1407
1408
  constructor(config, args) {
1408
1409
  this.config = config;
1410
+
1411
+ // Validate manual-gate stages in pipeline.yaml at startup
1412
+ if (config.pipeline && config.pipeline.stages) {
1413
+ for (const [stageId, stage] of Object.entries(config.pipeline.stages)) {
1414
+ if (stage.type === 'manual-gate') {
1415
+ // Validate goto.approved
1416
+ if (!stage.goto || !stage.goto.approved) {
1417
+ throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): missing required 'goto.approved'`);
1418
+ }
1419
+
1420
+ // Validate goto.rejected
1421
+ if (!stage.goto || !stage.goto.rejected) {
1422
+ throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): missing required 'goto.rejected'`);
1423
+ }
1424
+
1425
+ // Validate poll_interval_ms if present
1426
+ if (stage.poll_interval_ms !== undefined) {
1427
+ if (typeof stage.poll_interval_ms !== 'number' || stage.poll_interval_ms < 100) {
1428
+ throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): poll_interval_ms must be a number >= 100`);
1429
+ }
1430
+ }
1431
+
1432
+ // Validate timeout_seconds if present
1433
+ if (stage.timeout_seconds !== undefined) {
1434
+ if (typeof stage.timeout_seconds !== 'number' || stage.timeout_seconds <= 0) {
1435
+ throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): timeout_seconds must be a number > 0`);
1436
+ }
1437
+ }
1438
+ }
1439
+ }
1440
+ }
1441
+
1409
1442
  this.args = args;
1410
1443
  this.pipeline = config.pipeline;
1411
1444
  this.context = { ...this.pipeline.context };
@@ -1464,36 +1497,266 @@ class PipelineRunner {
1464
1497
  }
1465
1498
  }
1466
1499
 
1467
- /**
1468
- * Выполняет встроенный стейдж типа update-counter:
1469
- * инкрементирует счётчик и возвращает статус для goto-перехода.
1470
- *
1471
- * Конфигурация стейджа:
1472
- * type: update-counter
1473
- * counter: <name> — имя счётчика
1474
- * max: <number> — максимальное значение (опционально)
1475
- * goto:
1476
- * default: <stage> — следующий стейдж
1477
- * max_reached: <stage> — стейдж при достижении max
1478
- */
1479
- executeUpdateCounter(stageId, stage) {
1480
- const counterName = stage.counter;
1481
- if (!counterName) {
1482
- throw new Error(`Stage "${stageId}" has type update-counter but no counter specified`);
1483
- }
1500
+ /**
1501
+ * Вычисляет детерминированный идентификатор шага для approval-файла.
1502
+ * Формат: {ticket_id}_{stageId}_{attempt}
1503
+ *
1504
+ * @param {Object} context - Контекст выполнения пайплайна
1505
+ * @param {string} [context.ticket_id] - ID тикета (может быть undefined)
1506
+ * @param {string} stageId - Идентификатор стадии
1507
+ * @param {Object} counters - Счётчики выполнения
1508
+ * @param {number} [counters.task_attempts] - Номер попытки выполнения (0 если не задано)
1509
+ * @returns {string} Детерминированный step_id
1510
+ */
1511
+ computeStepId(context, stageId, counters) {
1512
+ const ticketId = context.ticket_id || 'no-ticket';
1513
+ const attempt = counters.task_attempts ?? 0;
1514
+ return `${ticketId}_${stageId}_${attempt}`;
1515
+ }
1516
+
1517
+ /**
1518
+ * Создаёт approval-файл со статусом "pending" (идемпотентно).
1519
+ * Если файл уже существует — не перезаписывает, возвращает его содержимое.
1520
+ *
1521
+ * @param {string} filePath - Путь к approval-файлу (абсолютный)
1522
+ * @param {Object} payload - Данные для approval-файла
1523
+ * @param {string} payload.step_id - Идентификатор шага (должен совпадать с именем файла)
1524
+ * @param {string} payload.ticket_id - ID тикета
1525
+ * @param {string} payload.stage_id - ID стадии
1526
+ * @param {number} payload.attempt - Номер попытки
1527
+ * @param {Object} [payload.context_snapshot] - Снапшот контекста (опционально)
1528
+ * @returns {Promise<Object>} Объект approval-файла (прочитанный или созданный)
1529
+ * @throws {Error} При ошибке создания директории или записи файла
1530
+ */
1531
+ async writeApprovalPending(filePath, payload) {
1532
+ // Создаём директорию заранее (recursive, безопасно)
1533
+ const dir = path.dirname(filePath);
1534
+ await fs.promises.mkdir(dir, { recursive: true });
1535
+
1536
+ // Формируем данные approval-файла
1537
+ const now = new Date().toISOString();
1538
+ const approvalData = {
1539
+ step_id: payload.step_id,
1540
+ ticket_id: payload.ticket_id,
1541
+ stage_id: payload.stage_id,
1542
+ attempt: payload.attempt,
1543
+ status: 'pending',
1544
+ created_at: now,
1545
+ updated_at: now,
1546
+ decided_by: null,
1547
+ comment: null,
1548
+ context_snapshot: payload.context_snapshot || {}
1549
+ };
1484
1550
 
1485
- this.counters[counterName] = (this.counters[counterName] || 0) + 1;
1486
- const value = this.counters[counterName];
1551
+ const content = JSON.stringify(approvalData, null, 2);
1487
1552
 
1488
- if (this.logger) {
1489
- this.logger.info(`Counter "${counterName}" incremented to ${value}`, stageId);
1553
+ // Атомарно создаём файл с флагом 'wx' (fail if exists)
1554
+ try {
1555
+ const handle = await fs.promises.open(filePath, 'wx');
1556
+ await handle.write(content);
1557
+ await handle.close();
1558
+ return approvalData;
1559
+ } catch (err) {
1560
+ if (err.code === 'EEXIST') {
1561
+ // Файл уже был создан (например, при recovery) — читаем и возвращаем
1562
+ const existing = await fs.promises.readFile(filePath, 'utf8');
1563
+ return JSON.parse(existing);
1564
+ }
1565
+ throw err;
1566
+ }
1567
+ }
1568
+
1569
+ /**
1570
+ * Читает approval-файл и парсит его как JSON.
1571
+ *
1572
+ * @param {string} filePath - Путь к approval-файлу (абсолютный)
1573
+ * @returns {Promise<Object|null>} Объект approval-файла или null если файл не существует
1574
+ * @throws {Error} При невалидном JSON — с сообщением "corrupt approval file at {path}: {parse error}"
1575
+ */
1576
+ async readApprovalFile(filePath) {
1577
+ try {
1578
+ const content = await fs.promises.readFile(filePath, 'utf8');
1579
+ return JSON.parse(content);
1580
+ } catch (err) {
1581
+ if (err.code === 'ENOENT') {
1582
+ return null;
1583
+ }
1584
+ if (err instanceof SyntaxError) {
1585
+ throw new Error(`corrupt approval file at ${filePath}: ${err.message}`);
1586
+ }
1587
+ // Перебрасываем другие ошибки (например, fs-ошибки) без изменений
1588
+ throw err;
1589
+ }
1590
+ }
1591
+
1592
+ /**
1593
+ * Выполняет встроенный стейдж типа update-counter:
1594
+ * инкрементирует счётчик и возвращает статус для goto-перехода.
1595
+ *
1596
+ * Конфигурация стейджа:
1597
+ * type: update-counter
1598
+ * counter: <name> — имя счётчика
1599
+ * max: <number> — максимальное значение (опционально)
1600
+ * goto:
1601
+ * default: <stage> — следующий стейдж
1602
+ * max_reached: <stage> — стейдж при достижении max
1603
+ */
1604
+ executeUpdateCounter(stageId, stage) {
1605
+ const counterName = stage.counter;
1606
+ if (!counterName) {
1607
+ throw new Error(`Stage "${stageId}" has type update-counter but no counter specified`);
1608
+ }
1609
+
1610
+ this.counters[counterName] = (this.counters[counterName] || 0) + 1;
1611
+ const value = this.counters[counterName];
1612
+
1613
+ if (this.logger) {
1614
+ this.logger.info(`Counter "${counterName}" incremented to ${value}`, stageId);
1615
+ }
1616
+
1617
+ const max = stage.max;
1618
+ const status = (max && value >= max) ? 'max_reached' : 'default';
1619
+
1620
+ return { status, result: { counter: counterName, value } };
1490
1621
  }
1491
1622
 
1492
- const max = stage.max;
1493
- const status = (max && value >= max) ? 'max_reached' : 'default';
1623
+ /**
1624
+ * Выполняет встроенный стейдж типа manual-gate: создаёт approval-файл
1625
+ * и ждёт решения (approved/rejected) через polling файловой системы.
1626
+ *
1627
+ * Конфигурация стейджа:
1628
+ * type: manual-gate
1629
+ * poll_interval_ms: <number> — интервал опроса в мс (опц., default 2000)
1630
+ * timeout_seconds: <number> — таймаут в секундах (опц., default null)
1631
+ * goto:
1632
+ * approved: <stage> — обязательный, при одобрении
1633
+ * rejected: <stage> — обязательный, при отклонении
1634
+ * timeout: <stage> — опц., при истечении таймаута
1635
+ * aborted: <stage> — опц., при остановке runner'а
1636
+ *
1637
+ * @param {string} stageId - ID стадии
1638
+ * @param {object} stage - конфигурация стадии
1639
+ * @returns {Promise<{status: 'approved'|'rejected'|'timeout'|'aborted', result: object}>}
1640
+ */
1641
+ async executeManualGate(stageId, stage) {
1642
+ const stepId = this.computeStepId(this.context, stageId, this.counters);
1643
+ const filePath = path.join(this.projectRoot, '.workflow', 'approvals', `${stepId}.json`);
1644
+
1645
+ const payload = {
1646
+ step_id: stepId,
1647
+ ticket_id: this.context.ticket_id || 'no-ticket',
1648
+ stage_id: stageId,
1649
+ attempt: this.counters.task_attempts || 0,
1650
+ context_snapshot: { ...this.context }
1651
+ };
1494
1652
 
1495
- return { status, result: { counter: counterName, value } };
1496
- }
1653
+ const existing = await this.writeApprovalPending(filePath, payload);
1654
+
1655
+ // Если файл уже был и статус уже resolved — сразу возвращаем результат (recovery)
1656
+ if (existing.status === 'approved' || existing.status === 'rejected') {
1657
+ if (this.logger) {
1658
+ this.logger.info(
1659
+ `[${stageId}] manual-gate: already ${existing.status} by ${existing.decided_by || 'unknown'}${existing.comment ? `, comment="${existing.comment}"` : ''}`,
1660
+ stageId
1661
+ );
1662
+ }
1663
+ return {
1664
+ status: existing.status,
1665
+ result: {
1666
+ step_id: stepId,
1667
+ decided_by: existing.decided_by,
1668
+ comment: existing.comment
1669
+ }
1670
+ };
1671
+ }
1672
+
1673
+ // Создан новый pending-файл
1674
+ if (this.logger) {
1675
+ this.logger.info(`[${stageId}] manual-gate: created pending approval at ${filePath}`, stageId);
1676
+ }
1677
+
1678
+ const pollIntervalMs = stage.poll_interval_ms || 2000;
1679
+ const timeoutSeconds = stage.timeout_seconds || null;
1680
+ const startTime = Date.now();
1681
+
1682
+ // Polling-цикл
1683
+ while (this.running) {
1684
+ await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
1685
+
1686
+ // Проверка остановки runner'а
1687
+ if (!this.running) {
1688
+ if (this.logger) {
1689
+ this.logger.warn(`[${stageId}] manual-gate: aborted (runner stopped)`, stageId);
1690
+ }
1691
+ return { status: 'aborted', result: { step_id: stepId } };
1692
+ }
1693
+
1694
+ // Проверка таймаута
1695
+ if (timeoutSeconds !== null) {
1696
+ const elapsed = (Date.now() - startTime) / 1000;
1697
+ if (elapsed >= timeoutSeconds) {
1698
+ if (this.logger) {
1699
+ this.logger.warn(`[${stageId}] manual-gate: timeout after ${timeoutSeconds}s, no decision`, stageId);
1700
+ }
1701
+ return { status: 'timeout', result: { step_id: stepId } };
1702
+ }
1703
+ }
1704
+
1705
+ // Читаем текущее состояние файла
1706
+ let data;
1707
+ try {
1708
+ data = await this.readApprovalFile(filePath);
1709
+ } catch (err) {
1710
+ // Corrupt JSON — пробрасываем ошибку для goto.error
1711
+ throw err;
1712
+ }
1713
+
1714
+ if (data && data.status === 'approved') {
1715
+ if (this.logger) {
1716
+ this.logger.info(
1717
+ `[${stageId}] manual-gate: approved by ${data.decided_by || 'unknown'}${data.comment ? `, comment="${data.comment}"` : ''}`,
1718
+ stageId
1719
+ );
1720
+ }
1721
+ return {
1722
+ status: 'approved',
1723
+ result: {
1724
+ step_id: stepId,
1725
+ decided_by: data.decided_by,
1726
+ comment: data.comment
1727
+ }
1728
+ };
1729
+ }
1730
+
1731
+ if (data && data.status === 'rejected') {
1732
+ if (this.logger) {
1733
+ this.logger.info(
1734
+ `[${stageId}] manual-gate: rejected by ${data.decided_by || 'unknown'}${data.comment ? `, comment="${data.comment}"` : ''}`,
1735
+ stageId
1736
+ );
1737
+ }
1738
+ return {
1739
+ status: 'rejected',
1740
+ result: {
1741
+ step_id: stepId,
1742
+ decided_by: data.decided_by,
1743
+ comment: data.comment
1744
+ }
1745
+ };
1746
+ }
1747
+
1748
+ // DEBUG-лог polling (оставляем только если нужен)
1749
+ if (this.logger && this.logger.level === 'debug') {
1750
+ this.logger.debug(`[${stageId}] manual-gate: polling, current status=pending`, stageId);
1751
+ }
1752
+ }
1753
+
1754
+ // Выход по this.running = false
1755
+ if (this.logger) {
1756
+ this.logger.warn(`[${stageId}] manual-gate: aborted (runner stopped)`, stageId);
1757
+ }
1758
+ return { status: 'aborted', result: { step_id: stepId } };
1759
+ }
1497
1760
 
1498
1761
  /**
1499
1762
  * Запускает основной цикл выполнения
@@ -1528,16 +1791,18 @@ class PipelineRunner {
1528
1791
  throw new Error(`Stage not found: ${this.currentStage}`);
1529
1792
  }
1530
1793
 
1531
- let result;
1794
+ let result;
1532
1795
 
1533
- // Встроенный тип стейджа: update-counter инкрементирует счётчик без вызова агента
1534
- if (stage.type === 'update-counter') {
1535
- result = this.executeUpdateCounter(this.currentStage, stage);
1536
- } else {
1537
- this.currentExecutor = new StageExecutor(this.config, this.context, this.counters, {}, this.fileGuard, this.logger, this.projectRoot);
1538
- result = await this.currentExecutor.execute(this.currentStage);
1539
- this.currentExecutor = null;
1540
- }
1796
+ // Встроенные типы стейджавыполняются без вызова внешних агентов
1797
+ if (stage.type === 'update-counter') {
1798
+ result = this.executeUpdateCounter(this.currentStage, stage);
1799
+ } else if (stage.type === 'manual-gate') {
1800
+ result = await this.executeManualGate(this.currentStage, stage);
1801
+ } else {
1802
+ this.currentExecutor = new StageExecutor(this.config, this.context, this.counters, {}, this.fileGuard, this.logger, this.projectRoot);
1803
+ result = await this.currentExecutor.execute(this.currentStage);
1804
+ this.currentExecutor = null;
1805
+ }
1541
1806
 
1542
1807
  this.logger.info(`Stage ${this.currentStage} completed with status: ${result.status}`, 'PipelineRunner');
1543
1808
 
@@ -1843,6 +2108,22 @@ function validateConfig(config) {
1843
2108
  errors.push(`Stage "${stageId}" references non-existent agent: ${resolvedAgent}`);
1844
2109
  }
1845
2110
 
2111
+ // Валидация для manual-gate стадии
2112
+ if (stage.type === 'manual-gate') {
2113
+ if (!stage.goto || !stage.goto.approved) {
2114
+ errors.push(`Stage "${stageId}" has type manual-gate but missing required goto.approved`);
2115
+ }
2116
+ if (!stage.goto || !stage.goto.rejected) {
2117
+ errors.push(`Stage "${stageId}" has type manual-gate but missing required goto.rejected`);
2118
+ }
2119
+ if (stage.poll_interval_ms !== undefined && (typeof stage.poll_interval_ms !== 'number' || stage.poll_interval_ms < 100)) {
2120
+ errors.push(`Stage "${stageId}" has invalid poll_interval_ms: must be a number >= 100`);
2121
+ }
2122
+ if (stage.timeout_seconds !== undefined && (typeof stage.timeout_seconds !== 'number' || stage.timeout_seconds <= 0)) {
2123
+ errors.push(`Stage "${stageId}" has invalid timeout_seconds: must be a number > 0`);
2124
+ }
2125
+ }
2126
+
1846
2127
  if (stage.goto) {
1847
2128
  for (const [status, transition] of Object.entries(stage.goto)) {
1848
2129
  if (status === 'default') continue;
@@ -46,10 +46,10 @@ function checkCondition(condition) {
46
46
 
47
47
  switch (type) {
48
48
  case 'file_exists':
49
- return fs.existsSync(path.join(PROJECT_DIR, value));
49
+ return fs.existsSync(path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value));
50
50
 
51
51
  case 'file_not_exists':
52
- return !fs.existsSync(path.join(PROJECT_DIR, value));
52
+ return !fs.existsSync(path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value));
53
53
 
54
54
  case 'tasks_completed': {
55
55
  if (!value || (Array.isArray(value) && value.length === 0)) return true;
@@ -100,10 +100,12 @@ function findTicketInColumns(ticketId) {
100
100
 
101
101
  async function checkRelevance(ticketPath) {
102
102
  if (!fs.existsSync(ticketPath)) {
103
+ // file_not_found — это не ошибка скрипта (verdict=relevant — fail-safe).
104
+ // Не выходим с exit=1, чтобы pipeline продолжил выполнение следующего стейджа.
103
105
  return {
104
106
  verdict: "relevant",
105
107
  reason: "file_not_found",
106
- error: `Ticket file not found: ${ticketPath}`,
108
+ warning: `Ticket file not found: ${ticketPath}`,
107
109
  };
108
110
  }
109
111
 
@@ -1,36 +1,102 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ /**
4
+ * get-next-id.js - Универсальный генератор ID для тикетов, планов и других артефактов
5
+ *
6
+ * Режимы:
7
+ *
8
+ * 1) Одиночный префикс (legacy, для create-plan / create-report):
9
+ * node get-next-id.js --prefix TASK --dir tickets
10
+ * node get-next-id.js --prefix PLAN --dir plans
11
+ * Вывод: { status: "success", id: "TASK-007" }
12
+ *
13
+ * 2) Карта по всем префиксам из config.yaml (для decompose-plan):
14
+ * node get-next-id.js --all-from-config
15
+ * Читает .workflow/config/config.yaml → task_types.*.prefix,
16
+ * для каждого префикса возвращает следующий свободный номер по .workflow/tickets/.
17
+ * Вывод: { status: "success", id_ranges: { TASK: 8, QA: 26, HUMAN: 2, ... } }
18
+ */
19
+
3
20
  import fs from "fs";
4
21
  import path from "path";
5
- import { findProjectRoot } from "../lib/find-root.mjs";
6
- import { printResult } from "../lib/utils.mjs";
7
- import { getNextId } from "../lib/operations/tickets.mjs";
22
+ import { findProjectRoot } from "workflow-ai/lib/find-root.mjs";
23
+ import { printResult } from "workflow-ai/lib/utils.mjs";
24
+ import { getNextId } from "workflow-ai/lib/operations/tickets.mjs";
8
25
 
9
26
  const PROJECT_DIR = findProjectRoot();
10
27
 
11
28
  function parseArgs() {
12
29
  const args = process.argv.slice(2);
13
- const result = { prefix: null, dir: null, allFromConfig: false };
30
+ let prefix = null;
31
+ let dir = null;
32
+ let allFromConfig = false;
33
+
14
34
  for (let i = 0; i < args.length; i++) {
15
- if (args[i] === "--prefix" && i + 1 < args.length) result.prefix = args[++i];
16
- else if (args[i] === "--dir" && i + 1 < args.length) result.dir = args[++i];
17
- else if (args[i] === "--all-from-config") result.allFromConfig = true;
35
+ if (args[i] === "--prefix" && i + 1 < args.length) {
36
+ prefix = args[i + 1];
37
+ i++;
38
+ } else if (args[i] === "--dir" && i + 1 < args.length) {
39
+ dir = args[i + 1];
40
+ i++;
41
+ } else if (args[i] === "--all-from-config") {
42
+ allFromConfig = true;
43
+ }
44
+ }
45
+
46
+ return { prefix, dir, allFromConfig };
47
+ }
48
+
49
+ function findMaxNumber(targetDir, prefix) {
50
+ let maxNum = 0;
51
+ const regex = new RegExp(`^${prefix}-(\\d+)\\.md$`, "i");
52
+
53
+ function scanDirectory(dir) {
54
+ if (!fs.existsSync(dir)) {
55
+ return;
56
+ }
57
+
58
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
59
+
60
+ for (const entry of entries) {
61
+ const fullPath = path.join(dir, entry.name);
62
+
63
+ if (entry.isDirectory()) {
64
+ scanDirectory(fullPath);
65
+ } else if (entry.isFile()) {
66
+ const match = entry.name.match(regex);
67
+ if (match) {
68
+ const num = parseInt(match[1], 10);
69
+ if (num > maxNum) {
70
+ maxNum = num;
71
+ }
72
+ }
73
+ }
74
+ }
18
75
  }
19
- return result;
76
+
77
+ scanDirectory(targetDir);
78
+ return maxNum;
20
79
  }
21
80
 
22
81
  function readPrefixesFromConfig() {
23
82
  const configPath = path.join(PROJECT_DIR, ".workflow", "config", "config.yaml");
24
- if (!fs.existsSync(configPath)) throw new Error("config.yaml not found");
25
83
 
26
- const text = fs.readFileSync(configPath, "utf8");
27
- const prefixes = [];
84
+ if (!fs.existsSync(configPath)) {
85
+ throw new Error(`config.yaml not found: ${configPath}`);
86
+ }
87
+
88
+ const text = fs.readFileSync(configPath, "utf8");
28
89
  const lines = text.split(/\r?\n/);
29
- let inTaskTypes = false, taskTypesIndent = -1;
90
+
91
+ const prefixes = [];
92
+ let inTaskTypes = false;
93
+ let taskTypesIndent = -1;
30
94
 
31
95
  for (const rawLine of lines) {
96
+ // Убрать комментарии
32
97
  const line = rawLine.replace(/\s+#.*$/, "").replace(/^#.*$/, "");
33
- if (!line.trim()) continue;
98
+ if (line.trim() === "") continue;
99
+
34
100
  const indent = line.length - line.trimStart().length;
35
101
 
36
102
  if (!inTaskTypes) {
@@ -41,48 +107,85 @@ function readPrefixesFromConfig() {
41
107
  continue;
42
108
  }
43
109
 
44
- if (indent <= taskTypesIndent && line.trim()) break;
110
+ // Вышли из секции task_types (вернулись на тот же или меньший отступ с новым ключом)
111
+ if (indent <= taskTypesIndent && line.trim() !== "") {
112
+ break;
113
+ }
114
+
45
115
  const m = line.match(/^\s*prefix\s*:\s*["']?([A-Z][A-Z0-9_]*)["']?\s*$/);
46
- if (m && !prefixes.includes(m[1])) prefixes.push(m[1]);
116
+ if (m) {
117
+ const p = m[1];
118
+ if (!prefixes.includes(p)) {
119
+ prefixes.push(p);
120
+ }
121
+ }
122
+ }
123
+
124
+ if (prefixes.length === 0) {
125
+ throw new Error("No prefixes found in config.yaml → task_types.*.prefix");
47
126
  }
48
127
 
49
128
  return prefixes;
50
129
  }
51
130
 
52
- function resolveTargetDir(dir) {
53
- if (dir === "tickets") return path.join(PROJECT_DIR, ".workflow", "tickets");
54
- if (dir === "plans") return path.join(PROJECT_DIR, ".workflow", "plans");
55
- return path.join(PROJECT_DIR, dir);
131
+ async function runSinglePrefix(prefix, dir) {
132
+ try {
133
+ const nextId = await getNextId(PROJECT_DIR, prefix, { dir });
134
+ printResult({ status: "success", id: nextId });
135
+ } catch (err) {
136
+ console.error(err.message);
137
+ printResult({ status: "error", error: err.message });
138
+ process.exit(1);
139
+ }
140
+ }
141
+
142
+ async function runAllFromConfig() {
143
+ const prefixes = readPrefixesFromConfig();
144
+ const ticketsDir = path.join(PROJECT_DIR, ".workflow", "tickets");
145
+
146
+ const idRanges = {};
147
+ for (const prefix of prefixes) {
148
+ const maxNum = fs.existsSync(ticketsDir) ? findMaxNumber(ticketsDir, prefix) : 0;
149
+ idRanges[prefix] = maxNum + 1;
150
+ }
151
+
152
+ // Параллельно возвращаем JSON-строку, потому что runner workflow-ai
153
+ // при подстановке $context.<key> в строку instructions применяет неявный
154
+ // toString() — объекты превращаются в "[object Object]". Скалярная
155
+ // JSON-строка подставляется корректно, декомпозитор распарсит её сам.
156
+ printResult({
157
+ status: "success",
158
+ id_ranges: idRanges,
159
+ id_ranges_json: JSON.stringify(idRanges),
160
+ });
56
161
  }
57
162
 
58
163
  async function main() {
59
164
  const { prefix, dir, allFromConfig } = parseArgs();
60
165
 
61
- try {
62
- if (allFromConfig) {
63
- const prefixes = readPrefixesFromConfig();
64
- const idRanges = {};
65
- for (const p of prefixes) {
66
- const id = await getNextId(PROJECT_DIR, p);
67
- const num = parseInt(id.split("-")[1], 10);
68
- idRanges[p] = num;
69
- }
70
- const bulkResult = { status: "success", id_ranges: idRanges, id_ranges_json: JSON.stringify(idRanges) };
71
- console.log("---RESULT---");
72
- console.log(JSON.stringify(bulkResult, null, 2));
73
- console.log("---RESULT---");
74
- } else {
75
- if (!prefix || !dir) {
76
- throw new Error("Either --all-from-config, or both --prefix and --dir required");
77
- }
78
- const id = await getNextId(PROJECT_DIR, prefix);
79
- printResult({ status: "success", id });
166
+ if (allFromConfig) {
167
+ try {
168
+ await runAllFromConfig();
169
+ } catch (err) {
170
+ console.error(err.message);
171
+ printResult({ status: "error", error: err.message });
172
+ process.exit(1);
80
173
  }
81
- } catch (err) {
82
- console.error(err.message);
83
- printResult({ status: "error", error: err.message });
174
+ return;
175
+ }
176
+
177
+ if (!prefix || !dir) {
178
+ console.error("Usage:");
179
+ console.error(" node get-next-id.js --prefix <PREFIX> --dir <DIRECTORY>");
180
+ console.error(" node get-next-id.js --all-from-config");
181
+ printResult({
182
+ status: "error",
183
+ error: "Missing required arguments: either --all-from-config, or both --prefix and --dir",
184
+ });
84
185
  process.exit(1);
85
186
  }
187
+
188
+ await runSinglePrefix(prefix, dir);
86
189
  }
87
190
 
88
191
  main();