workflow-ai 1.1.0 → 1.2.1
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.
- package/CHANGELOG.md +49 -0
- package/README.md +105 -7
- package/configs/pipeline.yaml +23 -2
- package/package.json +44 -44
- package/src/lib/operations/tickets.mjs +305 -207
- package/src/lib/utils.mjs +286 -286
- package/src/runner.mjs +314 -34
- package/src/scripts/check-conditions.js +2 -2
- package/src/scripts/get-next-id.js +144 -41
- package/src/scripts/move-ticket.js +225 -68
- package/src/scripts/pick-next-task.js +753 -93
- package/src/skills/coach/SKILL.md +1 -1
- package/src/skills/manual-testing/SKILL.md +2 -0
- package/src/scripts/tests/timeout-cascade.test.js +0 -28
- package/src/skills/analyze-report/README.md +0 -44
- package/src/skills/analyze-report/algorithms/progress-assessment.md +0 -108
- package/src/skills/analyze-report/knowledge/analysis-frameworks.md +0 -66
- package/src/skills/analyze-report/knowledge/report-structure.md +0 -61
- package/src/skills/analyze-report/scripts/calc-plan-metrics.js +0 -234
- package/src/skills/analyze-report/templates/analysis-report.md +0 -80
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +0 -5
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +0 -98
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +0 -99
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +0 -163
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -88
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -100
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-1.md +0 -77
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-2.md +0 -64
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-3.md +0 -110
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-1.md +0 -74
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-2.md +0 -38
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-3.md +0 -61
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +0 -115
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001-evidence-from-log.yaml +0 -60
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-1.md +0 -90
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-2.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +0 -5
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/judge.json +0 -163
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-1.md +0 -84
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-2.md +0 -77
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-3.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-1.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-2.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-3.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-1.md +0 -93
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-2.md +0 -93
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-3.md +0 -86
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/meta.json +0 -115
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002-result-block-format.yaml +0 -44
- package/src/skills/analyze-report/tests/fixtures/REPORT-002-incorrect-attribution.md +0 -27
- package/src/skills/analyze-report/tests/fixtures/pipeline-2026-04-06_qa-001-skip.log +0 -32
- package/src/skills/analyze-report/tests/index.yaml +0 -25
- package/src/skills/analyze-report/tests/rubrics/evidence-from-log.md +0 -22
- package/src/skills/analyze-report/tests/rubrics/result-block-format.md +0 -22
- package/src/skills/analyze-report/workflows/progress.md +0 -158
- package/src/skills/analyze-report/workflows/retrospective.md +0 -143
- package/src/skills/coach/README.md +0 -43
- package/src/skills/coach/SKILL.md.legacy +0 -157
- package/src/skills/coach/algorithms/gap-analysis.md +0 -69
- package/src/skills/coach/algorithms/improvement-prioritization.md +0 -62
- package/src/skills/coach/algorithms/skill-scoring.md +0 -80
- package/src/skills/coach/knowledge/audit-applied-changes-clean.txt +0 -11
- package/src/skills/coach/knowledge/backlog-management.md +0 -67
- package/src/skills/coach/knowledge/backlog-management.md.legacy +0 -90
- package/src/skills/coach/knowledge/common-antipatterns.md +0 -76
- package/src/skills/coach/knowledge/prompt-engineering.md +0 -45
- package/src/skills/coach/knowledge/shared-knowledge-guide.md +0 -44
- package/src/skills/coach/knowledge/skill-anatomy.md +0 -49
- package/src/skills/coach/knowledge/test-authorship.md +0 -141
- package/src/skills/coach/templates/audit-report.md +0 -39
- package/src/skills/coach/templates/coach-backlog-init.yaml +0 -14
- package/src/skills/coach/templates/coach-backlog-init.yaml.legacy +0 -10
- package/src/skills/coach/templates/improvement-plan.md +0 -42
- package/src/skills/coach/templates/new-skill.md +0 -95
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-1.md +0 -58
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-2.md +0 -65
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-3.md +0 -58
- package/src/skills/coach/tests/cases/TC-COACH-001/current/judge.json +0 -151
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-1.md +0 -46
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-2.md +0 -0
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-3.md +0 -75
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-1.md +0 -81
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-2.md +0 -101
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-3.md +0 -91
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-1.md +0 -48
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-2.md +0 -30
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-3.md +0 -55
- package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +0 -94
- package/src/skills/coach/tests/cases/TC-COACH-001-evidence-based-temporal-diagram.yaml +0 -53
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-1.md +0 -46
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-2.md +0 -50
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-3.md +0 -48
- package/src/skills/coach/tests/cases/TC-COACH-002/current/judge.json +0 -151
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-2.md +0 -37
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-3.md +0 -30
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-1.md +0 -23
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-2.md +0 -29
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-3.md +0 -35
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-1.md +0 -13
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-2.md +0 -19
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-3.md +0 -33
- package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +0 -94
- package/src/skills/coach/tests/cases/TC-COACH-002-root-cause-first.yaml +0 -57
- package/src/skills/coach/tests/fixtures/pipeline-2026-04-06_id-collision.log +0 -77
- package/src/skills/coach/tests/index.yaml +0 -29
- package/src/skills/coach/tests/rubrics/calibration/evidence-based-bad.md +0 -13
- package/src/skills/coach/tests/rubrics/calibration/evidence-based-good.md +0 -29
- package/src/skills/coach/tests/rubrics/evidence-based.md +0 -26
- package/src/skills/coach/tests/rubrics/root-cause-first.md +0 -21
- package/src/skills/coach/workflows/analyze.md +0 -79
- package/src/skills/coach/workflows/analyze.md.legacy +0 -64
- package/src/skills/coach/workflows/audit.md +0 -74
- package/src/skills/coach/workflows/audit.md.legacy +0 -59
- package/src/skills/coach/workflows/create.md +0 -80
- package/src/skills/coach/workflows/create.md.legacy +0 -67
- package/src/skills/coach/workflows/improve.md +0 -71
- package/src/skills/coach/workflows/improve.md.legacy +0 -60
- package/src/skills/coach/workflows/research.md +0 -55
- package/src/skills/coach/workflows/review.md +0 -52
- package/src/skills/coach/workflows/review.md.legacy +0 -48
- package/src/skills/coach/workflows/test.md +0 -97
- package/src/skills/create-plan/README.md +0 -39
- package/src/skills/create-plan/algorithms/risk-assessment.md +0 -73
- package/src/skills/create-plan/knowledge/plan-completeness.md +0 -67
- package/src/skills/create-plan/knowledge/plan-lifecycle.md +0 -33
- package/src/skills/create-plan/knowledge/task-verification-pairs.md +0 -151
- package/src/skills/create-plan/knowledge/test-hygiene.md +0 -47
- package/src/skills/create-plan/scripts/validate-completeness.js +0 -182
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-1.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-2.md +0 -39
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-3.md +0 -35
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/judge.json +0 -167
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -10
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-1.md +0 -26
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-2.md +0 -86
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-3.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-1.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-2.md +0 -15
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-3.md +0 -14
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/meta.json +0 -119
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001-validate-completeness.yaml +0 -41
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-1.md +0 -25
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-3.md +0 -37
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/judge.json +0 -164
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -3
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -13
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-1.md +0 -44
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-2.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-3.md +0 -49
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-1.md +0 -6
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-2.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-3.md +0 -16
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/meta.json +0 -116
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002-task-granularity.yaml +0 -39
- package/src/skills/create-plan/tests/index.yaml +0 -25
- package/src/skills/create-plan/tests/rubrics/task-granularity.md +0 -21
- package/src/skills/create-plan/tests/rubrics/validate-completeness.md +0 -21
- package/src/skills/create-plan/workflows/create.md +0 -136
- package/src/skills/create-report/README.md +0 -40
- package/src/skills/create-report/algorithms/metric-calculation.md +0 -93
- package/src/skills/create-report/knowledge/report-metrics.md +0 -82
- package/src/skills/create-report/scripts/calc-metrics.js +0 -383
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-1.md +0 -25
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-2.md +0 -26
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-3.md +0 -28
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/judge.json +0 -163
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -4
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -3
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -6
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-1.md +0 -8
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-2.md +0 -12
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-3.md +0 -7
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-1.md +0 -12
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-2.md +0 -22
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-3.md +0 -13
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/meta.json +0 -115
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001-root-cause-attribution.yaml +0 -57
- package/src/skills/create-report/tests/index.yaml +0 -20
- package/src/skills/create-report/tests/rubrics/root-cause-attribution.md +0 -21
- package/src/skills/create-report/workflows/standard.md +0 -175
- package/src/skills/decompose-gaps/README.md +0 -39
- package/src/skills/decompose-gaps/algorithms/scope-check.md +0 -110
- package/src/skills/decompose-gaps/knowledge/scope-validation.md +0 -65
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +0 -41
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +0 -41
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +0 -56
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +0 -164
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-1.md +0 -25
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +0 -17
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +0 -22
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +0 -25
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-2.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +0 -29
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +0 -35
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +0 -18
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +0 -116
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001-scope-exclusion.yaml +0 -46
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +0 -163
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +0 -15
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +0 -21
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +0 -38
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +0 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +0 -10
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +0 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +0 -115
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002-glob-before-write.yaml +0 -36
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +0 -165
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +0 -26
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +0 -39
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +0 -37
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +0 -45
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +0 -26
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +0 -117
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +0 -41
- package/src/skills/decompose-gaps/tests/index.yaml +0 -30
- package/src/skills/decompose-gaps/tests/rubrics/glob-before-write.md +0 -21
- package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +0 -22
- package/src/skills/decompose-gaps/tests/rubrics/scope-exclusion.md +0 -21
- package/src/skills/decompose-gaps/workflows/decompose.md +0 -123
- package/src/skills/decompose-plan/README.md +0 -43
- package/src/skills/decompose-plan/algorithms/deduplication.md +0 -101
- package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +0 -139
- package/src/skills/decompose-plan/knowledge/capabilities.md +0 -68
- package/src/skills/decompose-plan/knowledge/human-task-rules.md +0 -82
- package/src/skills/decompose-plan/knowledge/scope-guard-checklist.md +0 -73
- package/src/skills/decompose-plan/scripts/check-atomicity-limit.js +0 -47
- package/src/skills/decompose-plan/scripts/check-duplicates.js +0 -323
- package/src/skills/decompose-plan/scripts/verify-atomicity.js +0 -408
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-1.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-2.md +0 -36
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-3.md +0 -37
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -20
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -17
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -28
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-1.md +0 -114
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-2.md +0 -137
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-3.md +0 -188
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-2.md +0 -32
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-3.md +0 -110
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001-atomicity-no-1to1.yaml +0 -56
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-1.md +0 -47
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-2.md +0 -54
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-3.md +0 -43
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -15
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -5
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -12
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-1.md +0 -34
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-2.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-3.md +0 -35
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-2.md +0 -31
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002-get-next-id-mandatory.yaml +0 -44
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-1.md +0 -21
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-2.md +0 -38
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-1.md +0 -31
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-2.md +0 -35
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-3.md +0 -48
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-1.md +0 -167
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-2.md +0 -62
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-3.md +0 -174
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-2.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003-verbatim-dod-transfer.yaml +0 -42
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +0 -55
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +0 -49
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +0 -49
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +0 -104
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +0 -45
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +0 -58
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +0 -193
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +0 -202
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +0 -155
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +0 -52
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +0 -17
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +0 -64
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +0 -59
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +0 -204
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +0 -213
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +0 -57
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +0 -54
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +0 -147
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +0 -165
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +0 -133
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +0 -81
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +0 -108
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +0 -3
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +0 -114
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +0 -78
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +0 -225
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +0 -66
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +0 -36
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +0 -42
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +0 -67
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +0 -40
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +0 -122
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +0 -131
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +0 -138
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +0 -41
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +0 -88
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +0 -72
- package/src/skills/decompose-plan/tests/index.yaml +0 -45
- package/src/skills/decompose-plan/tests/rubrics/atomicity-no-1to1.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/get-next-id-mandatory.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/verbatim-dod-transfer.md +0 -21
- package/src/skills/decompose-plan/workflows/decompose.md +0 -305
- package/src/skills/deep-research/README.md +0 -36
- package/src/skills/deep-research/algorithms/source-scoring.md +0 -63
- package/src/skills/deep-research/algorithms/synthesis.md +0 -67
- package/src/skills/deep-research/knowledge/data-validation.md +0 -44
- package/src/skills/deep-research/knowledge/perplexity-config.md +0 -30
- package/src/skills/deep-research/knowledge/research-methodology.md +0 -54
- package/src/skills/deep-research/knowledge/source-evaluation.md +0 -33
- package/src/skills/deep-research/scripts/perplexity-research.js +0 -315
- package/src/skills/deep-research/templates/brief-summary.md +0 -25
- package/src/skills/deep-research/templates/research-report.md +0 -76
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-1.md +0 -48
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-2.md +0 -88
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-3.md +0 -56
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/judge.json +0 -163
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-1.md +0 -58
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-2.md +0 -249
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-3.md +0 -44
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-1.md +0 -96
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-2.md +0 -56
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-3.md +0 -94
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-1.md +0 -11
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-2.md +0 -1
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-3.md +0 -1
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/meta.json +0 -115
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001-self-check-url.yaml +0 -58
- package/src/skills/deep-research/tests/index.yaml +0 -20
- package/src/skills/deep-research/tests/rubrics/self-check-url.md +0 -34
- package/src/skills/deep-research/workflows/base-checklist.md +0 -19
- package/src/skills/deep-research/workflows/benchmark.md +0 -38
- package/src/skills/deep-research/workflows/competitor.md +0 -44
- package/src/skills/deep-research/workflows/custom.md +0 -32
- package/src/skills/deep-research/workflows/market.md +0 -44
- package/src/skills/deep-research/workflows/technology.md +0 -40
- package/src/skills/deep-research/workflows/trend.md +0 -40
- package/src/skills/execute-task/README.md +0 -44
- package/src/skills/execute-task/algorithms/execution-strategy.md +0 -136
- package/src/skills/execute-task/knowledge/context-checkpoints.md +0 -75
- package/src/skills/execute-task/knowledge/ticket-structure.md +0 -70
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-3.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +0 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001-no-ticket-creation.yaml +0 -48
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-2.md +0 -6
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-3.md +0 -8
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-1.md +0 -9
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-2.md +0 -26
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/meta.json +0 -89
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002-no-duplicate-dod.yaml +0 -44
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/judge.json +0 -46
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/meta.json +0 -37
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003-verification-proportionality.yaml +0 -46
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-1.md +0 -18
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-2.md +0 -16
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-3.md +0 -14
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-3.md +0 -1
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-1.md +0 -8
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/meta.json +0 -89
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004-no-foreign-ticket-edit.yaml +0 -50
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-1.md +0 -15
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-1.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-2.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +0 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005-ticket-fields-updated.yaml +0 -39
- package/src/skills/execute-task/tests/fixtures/IMPL-902-create-file.md +0 -41
- package/src/skills/execute-task/tests/fixtures/IMPL-904-current-task.md +0 -40
- package/src/skills/execute-task/tests/fixtures/IMPL-906-fill-ticket.md +0 -42
- package/src/skills/execute-task/tests/fixtures/QA-901-button-click.md +0 -41
- package/src/skills/execute-task/tests/fixtures/QA-903-visual-figma.md +0 -40
- package/src/skills/execute-task/tests/fixtures/TASK-905-done-with-typo.md +0 -36
- package/src/skills/execute-task/tests/index.yaml +0 -39
- package/src/skills/execute-task/tests/rubrics/no-duplicate-dod.md +0 -22
- package/src/skills/execute-task/tests/rubrics/no-foreign-ticket-edit.md +0 -20
- package/src/skills/execute-task/tests/rubrics/no-ticket-creation.md +0 -21
- package/src/skills/execute-task/tests/rubrics/ticket-fields-updated.md +0 -23
- package/src/skills/execute-task/tests/rubrics/verification-proportionality.md +0 -22
- package/src/skills/execute-task/workflows/execute.md +0 -104
- package/src/skills/manual-testing/README.md +0 -63
- package/src/skills/manual-testing/algorithms/blocked-tool-strategy.md +0 -74
- package/src/skills/manual-testing/algorithms/bug-severity.md +0 -73
- package/src/skills/manual-testing/algorithms/mcp-budget.md +0 -97
- package/src/skills/manual-testing/algorithms/test-prioritization.md +0 -69
- package/src/skills/manual-testing/knowledge/browser-extension-testing.md +0 -102
- package/src/skills/manual-testing/knowledge/browser-tools.md +0 -114
- package/src/skills/manual-testing/knowledge/desktop-tools-advanced.md +0 -92
- package/src/skills/manual-testing/knowledge/desktop-tools-core.md +0 -76
- package/src/skills/manual-testing/knowledge/sandbox-advanced.md +0 -83
- package/src/skills/manual-testing/knowledge/sandbox-core.md +0 -67
- package/src/skills/manual-testing/knowledge/stateful-edge-cases.md +0 -69
- package/src/skills/manual-testing/knowledge/test-case-design.md +0 -107
- package/src/skills/manual-testing/knowledge/testing-types.md +0 -45
- package/src/skills/manual-testing/templates/bug-report.md +0 -52
- package/src/skills/manual-testing/templates/test-case.md +0 -34
- package/src/skills/manual-testing/templates/test-plan.md +0 -97
- package/src/skills/manual-testing/templates/test-session-report.md +0 -56
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +0 -34
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +0 -32
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +0 -163
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-2.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-3.md +0 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-1.md +0 -4
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-3.md +0 -8
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-1.md +0 -5
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-2.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-3.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +0 -114
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001-sandbox-mandatory.yaml +0 -38
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +0 -44
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +0 -32
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +0 -47
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +0 -163
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-1.md +0 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-3.md +0 -24
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-1.md +0 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-2.md +0 -13
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-3.md +0 -18
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-1.md +0 -21
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-3.md +0 -14
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +0 -114
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002-visual-tc-screenshot.yaml +0 -37
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +0 -76
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +0 -71
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +0 -85
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +0 -46
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +0 -36
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +0 -65
- package/src/skills/manual-testing/tests/index.yaml +0 -30
- package/src/skills/manual-testing/tests/last-run-tc001-sonnet.log +0 -140
- package/src/skills/manual-testing/tests/last-run-tc002.log +0 -1
- package/src/skills/manual-testing/tests/last-run.log +0 -1469
- package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +0 -31
- package/src/skills/manual-testing/tests/rubrics/sandbox-mandatory.md +0 -20
- package/src/skills/manual-testing/tests/rubrics/visual-tc-screenshot.md +0 -21
- package/src/skills/manual-testing/workflows/acceptance.md +0 -80
- package/src/skills/manual-testing/workflows/exploratory.md +0 -84
- package/src/skills/manual-testing/workflows/regression.md +0 -76
- package/src/skills/manual-testing/workflows/smoke.md +0 -109
- package/src/skills/manual-testing/workflows/test-plan.md +0 -75
- package/src/skills/review-result/README.md +0 -59
- package/src/skills/review-result/algorithms/verification.md +0 -112
- package/src/skills/review-result/knowledge/baseline-snapshot-validation.md +0 -67
- package/src/skills/review-result/knowledge/dod-patterns.md +0 -116
- package/src/skills/review-result/knowledge/test-hygiene.md +0 -44
- package/src/skills/review-result/scripts/verify-artifacts.js +0 -497
- package/src/skills/review-result/templates/verdict.md +0 -153
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-1.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-2.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-3.md +0 -21
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +0 -164
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-2.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-3.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-1.md +0 -49
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-2.md +0 -28
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-3.md +0 -37
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-1.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-2.md +0 -13
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-3.md +0 -21
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +0 -116
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001-visual-tc-trigger.yaml +0 -51
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-1.md +0 -23
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-2.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-3.md +0 -28
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-1.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-3.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +0 -163
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-1.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-2.md +0 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-3.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-1.md +0 -39
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-2.md +0 -25
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-3.md +0 -32
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-1.md +0 -34
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-2.md +0 -8
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-3.md +0 -23
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +0 -115
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002-path-line-suffix.yaml +0 -39
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +0 -40
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +0 -15
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +0 -163
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +0 -11
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +0 -16
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +0 -18
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +0 -17
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +0 -17
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +0 -31
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +0 -115
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +0 -50
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-1.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-2.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-3.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/judge.json +0 -46
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/meta.json +0 -37
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004-baseline-snapshot.yaml +0 -50
- package/src/skills/review-result/tests/fixtures/IMPL-902-path-with-line.md +0 -43
- package/src/skills/review-result/tests/fixtures/QA-901-visual-button.md +0 -46
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +0 -51
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +0 -36
- package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/QA-905.md +0 -62
- package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/baseline.test.mjs +0 -124
- package/src/skills/review-result/tests/index.yaml +0 -35
- package/src/skills/review-result/tests/rubrics/baseline-snapshot.md +0 -20
- package/src/skills/review-result/tests/rubrics/path-line-suffix.md +0 -19
- package/src/skills/review-result/tests/rubrics/test-isolation.md +0 -20
- package/src/skills/review-result/tests/rubrics/visual-tc-trigger.md +0 -19
- package/src/skills/review-result/workflows/review.md +0 -209
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { findProjectRoot } from '../find-root.mjs';
|
|
2
|
-
import { parseFrontmatter, serializeFrontmatter, getLastReviewStatus
|
|
2
|
+
import { parseFrontmatter, serializeFrontmatter, getLastReviewStatus } from '../utils.mjs';
|
|
3
3
|
import { existsSync, readdirSync, promises as fs } from 'node:fs';
|
|
4
4
|
import { resolve, join } from 'node:path';
|
|
5
5
|
|
|
6
|
+
// Доступные статусы
|
|
6
7
|
const VALID_STATUSES = [
|
|
7
|
-
"backlog",
|
|
8
|
+
"backlog",
|
|
9
|
+
"ready",
|
|
10
|
+
"in-progress",
|
|
11
|
+
"blocked",
|
|
12
|
+
"review",
|
|
13
|
+
"done",
|
|
14
|
+
"archive",
|
|
8
15
|
];
|
|
9
16
|
|
|
17
|
+
// Таблица допустимых переходов
|
|
10
18
|
const VALID_TRANSITIONS = {
|
|
11
19
|
backlog: ["ready", "blocked", "done"],
|
|
12
20
|
ready: ["in-progress", "review", "backlog"],
|
|
@@ -17,316 +25,406 @@ const VALID_TRANSITIONS = {
|
|
|
17
25
|
archive: ["backlog"],
|
|
18
26
|
};
|
|
19
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Форматирует номер с ведущими нулями (1 → 001)
|
|
30
|
+
*/
|
|
20
31
|
function formatNumber(num) {
|
|
21
32
|
return String(num).padStart(3, '0');
|
|
22
33
|
}
|
|
23
34
|
|
|
24
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Находит следующий свободный ID для указанного типа тикетов
|
|
37
|
+
* @param {string} projectRoot - Корень проекта
|
|
38
|
+
* @param {string} type - Тип тикета (например, IMPL, QA)
|
|
39
|
+
* @param {object} options - Опции
|
|
40
|
+
* @param {string} [options.dir] - Опциональный override директории для сканирования (например, 'tickets', 'reports', или абсолютный путь)
|
|
41
|
+
* @returns {Promise<string>} Следующий ID в формате TYPE-NNN
|
|
42
|
+
*/
|
|
43
|
+
export async function getNextId(projectRoot, type, options = {}) {
|
|
44
|
+
// Если projectRoot не предоставлен, ищем его сами
|
|
25
45
|
const root = projectRoot || findProjectRoot();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
46
|
+
|
|
47
|
+
// Определяем директорию для сканирования
|
|
48
|
+
let targetDir;
|
|
49
|
+
if (options.dir) {
|
|
50
|
+
// Если dir указан, используем resolveTargetId-like логику
|
|
51
|
+
if (options.dir === "tickets") {
|
|
52
|
+
targetDir = join(root, '.workflow', 'tickets');
|
|
53
|
+
} else if (options.dir === "plans") {
|
|
54
|
+
targetDir = join(root, '.workflow', 'plans');
|
|
55
|
+
} else {
|
|
56
|
+
targetDir = join(root, options.dir);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
// По умолчанию используем .workflow/tickets
|
|
60
|
+
targetDir = join(root, '.workflow', 'tickets');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Если директория не существует, возвращаем первый ID
|
|
64
|
+
if (!existsSync(targetDir)) {
|
|
65
|
+
return `${type}-001`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Рекурсивный поиск всех файлов {TYPE}-*.md
|
|
69
|
+
const maxNum = findMaxNumber(targetDir, type);
|
|
70
|
+
const nextNum = maxNum + 1;
|
|
71
|
+
return `${type}-${formatNumber(nextNum)}`;
|
|
30
72
|
}
|
|
31
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Рекурсивно ищет максимальный номер для файлов с заданным префиксом
|
|
76
|
+
* @param {string} targetDir - Директория для поиска
|
|
77
|
+
* @param {string} prefix - Префикс файла (например, IMPL)
|
|
78
|
+
* @returns {number} Максимальный найденный номер
|
|
79
|
+
*/
|
|
32
80
|
function findMaxNumber(targetDir, prefix) {
|
|
33
81
|
let maxNum = 0;
|
|
34
82
|
const regex = new RegExp(`^${prefix}-(\\d+)\\.md$`, "i");
|
|
83
|
+
|
|
35
84
|
function scanDirectory(dir) {
|
|
36
|
-
if (!existsSync(dir))
|
|
85
|
+
if (!existsSync(dir)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
37
89
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
90
|
+
|
|
38
91
|
for (const entry of entries) {
|
|
39
92
|
const fullPath = join(dir, entry.name);
|
|
40
|
-
|
|
41
|
-
|
|
93
|
+
|
|
94
|
+
if (entry.isDirectory()) {
|
|
95
|
+
scanDirectory(fullPath);
|
|
96
|
+
} else if (entry.isFile()) {
|
|
42
97
|
const match = entry.name.match(regex);
|
|
43
|
-
if (match)
|
|
98
|
+
if (match) {
|
|
99
|
+
const num = parseInt(match[1], 10);
|
|
100
|
+
if (num > maxNum) {
|
|
101
|
+
maxNum = num;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
44
104
|
}
|
|
45
105
|
}
|
|
46
106
|
}
|
|
107
|
+
|
|
47
108
|
scanDirectory(targetDir);
|
|
48
109
|
return maxNum;
|
|
49
110
|
}
|
|
50
111
|
|
|
112
|
+
/**
|
|
113
|
+
* Определяет текущий статус тикета по расположению файла
|
|
114
|
+
*/
|
|
51
115
|
function getStatusFromPath(ticketId, ticketsDir) {
|
|
52
116
|
for (const status of VALID_STATUSES) {
|
|
53
|
-
|
|
117
|
+
const statusDir = join(ticketsDir, status);
|
|
118
|
+
const expectedPath = join(statusDir, `${ticketId}.md`);
|
|
119
|
+
if (existsSync(expectedPath)) {
|
|
120
|
+
return status;
|
|
121
|
+
}
|
|
54
122
|
}
|
|
55
123
|
return null;
|
|
56
124
|
}
|
|
57
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Проверяет допустимость перехода и бросает ошибку если недопустим
|
|
128
|
+
*/
|
|
58
129
|
function assertValidTransition(from, to) {
|
|
59
|
-
if (!VALID_STATUSES.includes(from)
|
|
130
|
+
if (!VALID_STATUSES.includes(from)) {
|
|
131
|
+
throw { code: 'INVALID_TRANSITION', from, to, id: null };
|
|
132
|
+
}
|
|
133
|
+
if (!VALID_STATUSES.includes(to)) {
|
|
60
134
|
throw { code: 'INVALID_TRANSITION', from, to, id: null };
|
|
61
135
|
}
|
|
62
|
-
|
|
136
|
+
|
|
137
|
+
const allowedTransitions = VALID_TRANSITIONS[from] || [];
|
|
138
|
+
if (!allowedTransitions.includes(to)) {
|
|
63
139
|
throw { code: 'INVALID_TRANSITION', from, to, id: null };
|
|
64
140
|
}
|
|
65
141
|
}
|
|
66
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Перемещает тикет между колонками канбан-доски
|
|
145
|
+
* @param {string} projectRoot - Корень проекта
|
|
146
|
+
* @param {string} id - ID тикета
|
|
147
|
+
* @param {string} target - Целевой статус
|
|
148
|
+
* @returns {{from: string, to: string, path: string}} Результат перемещения
|
|
149
|
+
*/
|
|
67
150
|
export async function moveTicket(projectRoot, id, target) {
|
|
68
151
|
const root = projectRoot || findProjectRoot();
|
|
69
152
|
const ticketsDir = join(root, '.workflow', 'tickets');
|
|
153
|
+
|
|
154
|
+
// Найти текущий статус тикета
|
|
70
155
|
const from = getStatusFromPath(id, ticketsDir);
|
|
71
|
-
if (!from)
|
|
156
|
+
if (!from) {
|
|
157
|
+
throw { code: 'INVALID_TRANSITION', from: null, to: target, id };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Проверить допустимость перехода
|
|
72
161
|
assertValidTransition(from, target);
|
|
73
162
|
|
|
74
163
|
const sourcePath = join(ticketsDir, from, `${id}.md`);
|
|
75
164
|
const targetDir = join(ticketsDir, target);
|
|
76
165
|
const targetPath = join(targetDir, `${id}.md`);
|
|
77
166
|
|
|
78
|
-
|
|
79
|
-
let
|
|
167
|
+
// Чтение файла тикета
|
|
168
|
+
let content;
|
|
169
|
+
try {
|
|
170
|
+
content = await fs.readFile(sourcePath, 'utf8');
|
|
171
|
+
} catch (e) {
|
|
172
|
+
throw new Error(`Не удалось прочитать файл: ${e.message}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Парсинг frontmatter
|
|
176
|
+
let frontmatter, body;
|
|
177
|
+
try {
|
|
178
|
+
({ frontmatter, body } = parseFrontmatter(content));
|
|
179
|
+
} catch (e) {
|
|
180
|
+
throw new Error(e.message);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Обновление frontmatter
|
|
80
184
|
const now = new Date().toISOString();
|
|
81
185
|
frontmatter.updated_at = now;
|
|
82
|
-
|
|
83
|
-
|
|
186
|
+
|
|
187
|
+
// Если переход в done, добавляем completed_at
|
|
188
|
+
if (target === "done" && from !== "done") {
|
|
189
|
+
frontmatter.completed_at = now;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Fallback: если тикет идёт в done из review, но агент не записал секцию "## Ревью" — дописываем
|
|
193
|
+
if (
|
|
194
|
+
target === "done" &&
|
|
195
|
+
from === "review" &&
|
|
196
|
+
getLastReviewStatus(content) === null
|
|
197
|
+
) {
|
|
84
198
|
const date = now.slice(0, 16).replace("T", " ");
|
|
85
|
-
|
|
199
|
+
const reviewSection = `\n## Ревью\n\n| Дата | Статус | Самари |\n|------|--------|--------|\n| ${date} | ✅ passed | Pipeline fallback: агент не записал секцию ревью |\n`;
|
|
200
|
+
body = body.trimEnd() + "\n" + reviewSection;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Если переход из blocked, удаляем blocked_reason
|
|
204
|
+
if (from === "blocked" && frontmatter.blocked_reason) {
|
|
205
|
+
delete frontmatter.blocked_reason;
|
|
86
206
|
}
|
|
87
|
-
if (from === "blocked" && frontmatter.blocked_reason) delete frontmatter.blocked_reason;
|
|
88
207
|
|
|
208
|
+
// Сериализация нового контента
|
|
89
209
|
const newContent = serializeFrontmatter(frontmatter) + body;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
210
|
+
|
|
211
|
+
// Создание целевой директории если не существует
|
|
212
|
+
if (!existsSync(targetDir)) {
|
|
213
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Перемещение файла
|
|
217
|
+
try {
|
|
218
|
+
await fs.rename(sourcePath, targetPath);
|
|
219
|
+
} catch (e) {
|
|
220
|
+
throw new Error(`Не удалось переместить файл: ${e.message}`);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Запись обновлённого контента
|
|
224
|
+
try {
|
|
225
|
+
await fs.writeFile(targetPath, newContent, 'utf8');
|
|
226
|
+
} catch (e) {
|
|
227
|
+
throw new Error(`Не удалось записать файл: ${e.message}`);
|
|
228
|
+
}
|
|
229
|
+
|
|
93
230
|
return { from, to: target, path: targetPath };
|
|
94
231
|
}
|
|
95
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Проверяет одно условие (condition) тикета
|
|
235
|
+
*/
|
|
96
236
|
function checkCondition(projectRoot, condition) {
|
|
97
237
|
const { type, value } = condition;
|
|
238
|
+
|
|
98
239
|
switch (type) {
|
|
99
|
-
case 'file_exists':
|
|
100
|
-
|
|
101
|
-
|
|
240
|
+
case 'file_exists':
|
|
241
|
+
return existsSync(join(projectRoot, value));
|
|
242
|
+
|
|
243
|
+
case 'file_not_exists':
|
|
244
|
+
return !existsSync(join(projectRoot, value));
|
|
245
|
+
|
|
246
|
+
case 'tasks_completed': {
|
|
102
247
|
if (!value || (Array.isArray(value) && value.length === 0)) return true;
|
|
103
248
|
const ids = Array.isArray(value) ? value : [value];
|
|
104
249
|
const doneDir = join(projectRoot, '.workflow', 'tickets', 'done');
|
|
105
250
|
const archiveDir = join(projectRoot, '.workflow', 'tickets', 'archive');
|
|
106
|
-
return ids.every(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
251
|
+
return ids.every(taskId =>
|
|
252
|
+
existsSync(join(doneDir, `${taskId}.md`)) ||
|
|
253
|
+
existsSync(join(archiveDir, `${taskId}.md`))
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
case 'date_after':
|
|
258
|
+
return new Date() > new Date(value);
|
|
259
|
+
|
|
260
|
+
case 'date_before':
|
|
261
|
+
return new Date() < new Date(value);
|
|
262
|
+
|
|
263
|
+
case 'manual_approval':
|
|
264
|
+
return false;
|
|
265
|
+
|
|
266
|
+
default:
|
|
267
|
+
return true;
|
|
111
268
|
}
|
|
112
269
|
}
|
|
113
270
|
|
|
271
|
+
/**
|
|
272
|
+
* Проверяет зависимости тикета
|
|
273
|
+
*/
|
|
114
274
|
function checkDependencies(projectRoot, dependencies) {
|
|
115
275
|
if (!dependencies || dependencies.length === 0) return true;
|
|
116
276
|
const doneDir = join(projectRoot, '.workflow', 'tickets', 'done');
|
|
117
277
|
const archiveDir = join(projectRoot, '.workflow', 'tickets', 'archive');
|
|
118
278
|
return dependencies.every(depId =>
|
|
119
|
-
existsSync(join(doneDir, `${depId}.md`)) ||
|
|
279
|
+
existsSync(join(doneDir, `${depId}.md`)) ||
|
|
280
|
+
existsSync(join(archiveDir, `${depId}.md`))
|
|
120
281
|
);
|
|
121
282
|
}
|
|
122
283
|
|
|
284
|
+
/**
|
|
285
|
+
* Создаёт новый тикет в tickets/backlog/ с автоинкрементированным ID
|
|
286
|
+
* @param {string} projectRoot - Корень проекта
|
|
287
|
+
* @param {object} data - Данные для frontmatter (title, type, priority, tags, context, etc.)
|
|
288
|
+
* @returns {Promise<{id: string, path: string}>} Созданный ID и абсолютный путь
|
|
289
|
+
*/
|
|
123
290
|
export async function createTicket(projectRoot, data) {
|
|
124
291
|
const root = projectRoot || findProjectRoot();
|
|
125
292
|
const ticketsDir = join(root, '.workflow', 'tickets');
|
|
126
293
|
const backlogDir = join(ticketsDir, 'backlog');
|
|
294
|
+
|
|
295
|
+
// 1. Получить следующий ID
|
|
127
296
|
const type = data.type ?? 'impl';
|
|
128
297
|
const id = await getNextId(root, type);
|
|
298
|
+
|
|
299
|
+
// 2. Сформировать frontmatter
|
|
129
300
|
const frontmatter = {
|
|
130
|
-
id,
|
|
301
|
+
id,
|
|
302
|
+
title: data.title ?? '',
|
|
303
|
+
priority: data.priority ?? 3,
|
|
304
|
+
type: data.type ?? 'impl',
|
|
131
305
|
required_capabilities: data.required_capabilities ?? [],
|
|
132
|
-
created_at: new Date().toISOString(),
|
|
133
|
-
|
|
134
|
-
|
|
306
|
+
created_at: new Date().toISOString(),
|
|
307
|
+
updated_at: new Date().toISOString(),
|
|
308
|
+
completed_at: '',
|
|
309
|
+
parent_plan: data.parent_plan ?? '',
|
|
310
|
+
parent_task: data.parent_task ?? '',
|
|
311
|
+
dependencies: data.dependencies ?? [],
|
|
312
|
+
conditions: data.conditions ?? [],
|
|
135
313
|
context: data.context ?? { files: [], references: [], notes: '' },
|
|
136
|
-
complexity: data.complexity ?? 'medium',
|
|
314
|
+
complexity: data.complexity ?? 'medium',
|
|
315
|
+
tags: data.tags ?? []
|
|
137
316
|
};
|
|
138
|
-
if (data.type === 'human') frontmatter.executor_type = 'human';
|
|
139
|
-
if (!existsSync(backlogDir)) await fs.mkdir(backlogDir, { recursive: true });
|
|
140
|
-
const path = join(backlogDir, `${id}.md`);
|
|
141
|
-
const content = serializeFrontmatter(frontmatter) + '\n## Описание\n\n\n## Критерии готовности (Definition of Done)\n\n- [ ] \n';
|
|
142
|
-
await fs.writeFile(path, content, 'utf8');
|
|
143
|
-
return { id, path };
|
|
144
|
-
}
|
|
145
317
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const resultSectionRegex = /^##\s*(Результат выполнения|Result)\s*$/m;
|
|
151
|
-
const sectionStart = body.search(resultSectionRegex);
|
|
152
|
-
if (sectionStart === -1) return false;
|
|
153
|
-
const nextSectionRegex = /^##\s+/gm;
|
|
154
|
-
nextSectionRegex.lastIndex = sectionStart + 1;
|
|
155
|
-
const nextSectionMatch = nextSectionRegex.exec(body);
|
|
156
|
-
const sectionEnd = nextSectionMatch ? nextSectionMatch.index : body.length;
|
|
157
|
-
const sectionContent = body.substring(sectionStart, sectionEnd);
|
|
158
|
-
const summaryRegex = /^###\s*(Summary|Что сделано)\s*$/m;
|
|
159
|
-
const summaryStart = sectionContent.search(summaryRegex);
|
|
160
|
-
if (summaryStart === -1) return false;
|
|
161
|
-
const nextSubsectionRegex = /^###\s+/gm;
|
|
162
|
-
nextSubsectionRegex.lastIndex = summaryStart + 1;
|
|
163
|
-
const nextSubsectionMatch = nextSubsectionRegex.exec(sectionContent);
|
|
164
|
-
const summaryEnd = nextSubsectionMatch ? nextSubsectionMatch.index : sectionContent.length;
|
|
165
|
-
const summaryContent = sectionContent.substring(summaryStart, summaryEnd);
|
|
166
|
-
const withoutComments = summaryContent.replace(/<!--[\s\S]*?-->/g, '').trim();
|
|
167
|
-
return withoutComments.length > 0;
|
|
168
|
-
}
|
|
318
|
+
// 3. Добавить executor_type если type === 'human'
|
|
319
|
+
if (data.type === 'human') {
|
|
320
|
+
frontmatter.executor_type = 'human';
|
|
321
|
+
}
|
|
169
322
|
|
|
170
|
-
|
|
171
|
-
if (!
|
|
172
|
-
|
|
173
|
-
}
|
|
323
|
+
// 4. Записать файл в backlog/
|
|
324
|
+
if (!existsSync(backlogDir)) {
|
|
325
|
+
await fs.mkdir(backlogDir, { recursive: true });
|
|
326
|
+
}
|
|
174
327
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const pa = a.frontmatter.priority || 999, pb = b.frontmatter.priority || 999;
|
|
178
|
-
if (pa !== pb) return pa - pb;
|
|
179
|
-
const da = new Date(a.frontmatter.created_at || '9999-12-31');
|
|
180
|
-
const db = new Date(b.frontmatter.created_at || '9999-12-31');
|
|
181
|
-
return da - db;
|
|
182
|
-
});
|
|
183
|
-
}
|
|
328
|
+
const path = join(backlogDir, `${id}.md`);
|
|
329
|
+
const content = serializeFrontmatter(frontmatter) + '\n## Описание\n\n\n## Критерии готовности (Definition of Done)\n\n- [ ] \n';
|
|
184
330
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const conditions = frontmatter.conditions || [];
|
|
190
|
-
if (!conditions.every(c => checkCondition(projectRoot, c))) return false;
|
|
191
|
-
|
|
192
|
-
// Проверка дубликатов - исключаем тикет если он находится в других директориях
|
|
193
|
-
// checkDuplicates может быть true (исключить все кроме currentDir) или false/[] (не проверять)
|
|
194
|
-
if (checkDuplicates === true || (Array.isArray(checkDuplicates) && checkDuplicates.length > 0)) {
|
|
195
|
-
const allDirs = ['ready', 'done', 'in-progress', 'review', 'blocked'].filter(d => d !== currentDir).map(d =>
|
|
196
|
-
join(projectRoot, '.workflow', 'tickets', d));
|
|
197
|
-
if (allDirs.some(dir => existsSync(join(dir, `${id}.md`)))) return false;
|
|
331
|
+
try {
|
|
332
|
+
await fs.writeFile(path, content, 'utf8');
|
|
333
|
+
} catch (e) {
|
|
334
|
+
throw new Error(`Не удалось записать файл: ${e.message}`);
|
|
198
335
|
}
|
|
199
|
-
|
|
336
|
+
|
|
337
|
+
return { id, path };
|
|
200
338
|
}
|
|
201
339
|
|
|
202
340
|
/**
|
|
203
|
-
* Выбирает следующий доступный тикет
|
|
341
|
+
* Выбирает следующий доступный тикет из директории ready/
|
|
204
342
|
* @param {string} projectRoot - Корень проекта
|
|
205
|
-
* @
|
|
206
|
-
* @returns {Promise<object>} Результат выбора
|
|
343
|
+
* @returns {Promise<object>} {ticket} если найден, или {empty: true, reason}
|
|
207
344
|
*/
|
|
208
345
|
export async function pickNext(projectRoot) {
|
|
209
346
|
const root = projectRoot || findProjectRoot();
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
// 1. ready/ тикеты
|
|
216
|
-
const readyFiles = existsSync(readyDir) ? readdirSync(readyDir).filter(f => f.endsWith('.md') && f !== '.gitkeep.md') : [];
|
|
217
|
-
const readyTickets = [];
|
|
218
|
-
for (const file of readyFiles) {
|
|
219
|
-
try {
|
|
220
|
-
const content = await fs.readFile(join(readyDir, file), 'utf8');
|
|
221
|
-
const { frontmatter } = parseFrontmatter(content);
|
|
222
|
-
readyTickets.push({ id: frontmatter.id || file.replace('.md', ''), frontmatter, filePath: join(readyDir, file) });
|
|
223
|
-
} catch (e) {}
|
|
224
|
-
}
|
|
225
|
-
if (readyTickets.length === 0) {
|
|
347
|
+
const readyDir = join(root, '.workflow', 'tickets', 'ready');
|
|
348
|
+
|
|
349
|
+
// 1. Проверка пустой ready/
|
|
350
|
+
if (!existsSync(readyDir)) {
|
|
226
351
|
return { empty: true, reason: 'no_ready_tickets' };
|
|
227
352
|
}
|
|
228
|
-
const eligibleReady = readyTickets.filter(t => isTicketEligible(root, t, true, 'ready'));
|
|
229
|
-
if (eligibleReady.length > 0) {
|
|
230
|
-
const selected = sortTickets(eligibleReady)[0];
|
|
231
|
-
return { ticket: { id: selected.id, ...selected.frontmatter, path: selected.filePath } };
|
|
232
|
-
}
|
|
233
|
-
return { empty: true, reason: 'no_eligible_tickets' };
|
|
234
|
-
}
|
|
235
353
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
export async function pickNextEffective(projectRoot, planId) {
|
|
240
|
-
const root = projectRoot || findProjectRoot();
|
|
241
|
-
const ticketsDir = join(root, '.workflow', 'tickets');
|
|
242
|
-
const readyDir = join(ticketsDir, 'ready');
|
|
243
|
-
const reviewDir = join(ticketsDir, 'review');
|
|
244
|
-
const inProgressDir = join(ticketsDir, 'in-progress');
|
|
245
|
-
|
|
246
|
-
// 1. ready/
|
|
247
|
-
const readyFiles = existsSync(readyDir) ? readdirSync(readyDir).filter(f => f.endsWith('.md') && f !== '.gitkeep.md') : [];
|
|
248
|
-
const readyTickets = [];
|
|
249
|
-
for (const file of readyFiles) {
|
|
250
|
-
try {
|
|
251
|
-
const content = await fs.readFile(join(readyDir, file), 'utf8');
|
|
252
|
-
const { frontmatter } = parseFrontmatter(content);
|
|
253
|
-
readyTickets.push({ id: frontmatter.id || file.replace('.md', ''), frontmatter, filePath: join(readyDir, file) });
|
|
254
|
-
} catch (e) {}
|
|
255
|
-
}
|
|
256
|
-
const eligibleReady = readyTickets.filter(t => isTicketEligible(root, t, true, 'ready'));
|
|
257
|
-
if (eligibleReady.length > 0) {
|
|
258
|
-
const selected = sortTickets(eligibleReady)[0];
|
|
259
|
-
return { status: 'found', ticket_id: selected.id, priority: selected.frontmatter.priority,
|
|
260
|
-
title: selected.frontmatter.title, type: selected.frontmatter.type,
|
|
261
|
-
required_capabilities: JSON.stringify(selected.frontmatter.required_capabilities || []) };
|
|
354
|
+
const files = readdirSync(readyDir).filter(f => f.endsWith('.md') && f !== '.gitkeep.md');
|
|
355
|
+
if (files.length === 0) {
|
|
356
|
+
return { empty: true, reason: 'no_ready_tickets' };
|
|
262
357
|
}
|
|
263
358
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
for (const file of
|
|
359
|
+
const tickets = [];
|
|
360
|
+
|
|
361
|
+
// 2. Чтение и парсинг тикетов
|
|
362
|
+
for (const file of files) {
|
|
363
|
+
const filePath = join(readyDir, file);
|
|
268
364
|
try {
|
|
269
|
-
const content = await fs.readFile(
|
|
365
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
270
366
|
const { frontmatter } = parseFrontmatter(content);
|
|
271
|
-
reviewTickets.push({ id: frontmatter.id || file.replace('.md', ''), frontmatter, filePath: join(reviewDir, file) });
|
|
272
|
-
} catch (e) {}
|
|
273
|
-
}
|
|
274
|
-
if (reviewTickets.length > 0) {
|
|
275
|
-
const eligibleReview = reviewTickets.filter(t => isTicketEligible(root, t, true, 'review'));
|
|
276
|
-
if (eligibleReview.length > 0) {
|
|
277
|
-
const selected = sortTickets(eligibleReview)[0];
|
|
278
|
-
return { status: 'in_review', ticket_id: selected.id, priority: selected.frontmatter.priority,
|
|
279
|
-
title: selected.frontmatter.title, type: selected.frontmatter.type,
|
|
280
|
-
required_capabilities: JSON.stringify(selected.frontmatter.required_capabilities || []) };
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
367
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if (hasFilledResult(body)) {
|
|
292
|
-
completedInProgress.push({ id: frontmatter.id || file.replace('.md', ''), frontmatter, filePath: join(inProgressDir, file) });
|
|
293
|
-
}
|
|
294
|
-
} catch (e) {}
|
|
295
|
-
}
|
|
296
|
-
if (completedInProgress.length > 0) {
|
|
297
|
-
const eligibleCompleted = completedInProgress.filter(t => isTicketEligible(root, t, true, 'in-progress'));
|
|
298
|
-
if (eligibleCompleted.length > 0) {
|
|
299
|
-
const selected = sortTickets(eligibleCompleted)[0];
|
|
300
|
-
return { status: 'completed_in_progress', ticket_id: selected.id,
|
|
301
|
-
required_capabilities: JSON.stringify(selected.frontmatter.required_capabilities || []) };
|
|
368
|
+
tickets.push({
|
|
369
|
+
id: frontmatter.id || file.replace('.md', ''),
|
|
370
|
+
frontmatter,
|
|
371
|
+
path: filePath
|
|
372
|
+
});
|
|
373
|
+
} catch (e) {
|
|
374
|
+
// Пропускаем битые файлы
|
|
302
375
|
}
|
|
303
376
|
}
|
|
304
377
|
|
|
305
|
-
//
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
378
|
+
// 3. Фильтрация по условиям и зависимостям
|
|
379
|
+
const eligibleTickets = tickets.filter(ticket => {
|
|
380
|
+
const { frontmatter, id, path: filePath } = ticket;
|
|
381
|
+
|
|
382
|
+
// Пропускаем human-тики
|
|
383
|
+
if (frontmatter.type === 'human') return false;
|
|
384
|
+
|
|
385
|
+
// Проверка зависимостей
|
|
386
|
+
const depsMet = checkDependencies(root, frontmatter.dependencies || []);
|
|
387
|
+
if (!depsMet) return false;
|
|
388
|
+
|
|
389
|
+
// Проверка условий
|
|
390
|
+
const conditions = frontmatter.conditions || [];
|
|
391
|
+
const conditionsMet = conditions.every(c => checkCondition(root, c));
|
|
392
|
+
if (!conditionsMet) return false;
|
|
393
|
+
|
|
394
|
+
// Проверка на дубликаты (тикет не должен быть в in-progress, review, done и т.д.)
|
|
395
|
+
const otherDirs = ['done', 'in-progress', 'review', 'blocked'].map(d =>
|
|
396
|
+
join(root, '.workflow', 'tickets', d)
|
|
397
|
+
);
|
|
398
|
+
const duplicate = otherDirs.some(dir =>
|
|
399
|
+
existsSync(join(dir, `${id}.md`))
|
|
400
|
+
);
|
|
401
|
+
if (duplicate) return false;
|
|
402
|
+
|
|
403
|
+
return true;
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
if (eligibleTickets.length === 0) {
|
|
407
|
+
return { empty: true, reason: 'no_eligible_tickets' };
|
|
324
408
|
}
|
|
325
409
|
|
|
326
|
-
//
|
|
327
|
-
|
|
328
|
-
|
|
410
|
+
// 4. Сортировка: приоритет (меньше = важнее), затем created_at (старые первые)
|
|
411
|
+
eligibleTickets.sort((a, b) => {
|
|
412
|
+
const priorityA = a.frontmatter.priority || 999;
|
|
413
|
+
const priorityB = b.frontmatter.priority || 999;
|
|
414
|
+
if (priorityA !== priorityB) return priorityA - priorityB;
|
|
329
415
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
416
|
+
const dateA = new Date(a.frontmatter.created_at || '9999-12-31');
|
|
417
|
+
const dateB = new Date(b.frontmatter.created_at || '9999-12-31');
|
|
418
|
+
return dateA - dateB;
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
// 5. Возврат первого подходящего
|
|
422
|
+
const selected = eligibleTickets[0];
|
|
423
|
+
return {
|
|
424
|
+
ticket: {
|
|
425
|
+
id: selected.id,
|
|
426
|
+
...selected.frontmatter,
|
|
427
|
+
path: selected.path
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
}
|