@uoyo/mvtt 2.0.0-beta.1 → 2.0.0-beta.3

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 (84) hide show
  1. package/README.md +184 -193
  2. package/dist/build/section-loader.d.ts.map +1 -1
  3. package/dist/build/section-loader.js +18 -8
  4. package/dist/build/section-loader.js.map +1 -1
  5. package/dist/fs/materialize.d.ts.map +1 -1
  6. package/dist/fs/materialize.js +5 -0
  7. package/dist/fs/materialize.js.map +1 -1
  8. package/dist/scripts/session-update.cjs +7568 -0
  9. package/install-manifest.yaml +2 -0
  10. package/package.json +3 -2
  11. package/registry.yaml +6 -0
  12. package/sources/defaults/config.yaml +7 -7
  13. package/sources/defaults/session.yaml +9 -16
  14. package/sources/scripts/session-update.js +351 -0
  15. package/sources/sections/activation-load-context.md +4 -0
  16. package/sources/sections/footer-next-steps.md +1 -1
  17. package/sources/sections/output-language-constraint.md +11 -11
  18. package/sources/sections/session-update.md +115 -47
  19. package/sources/skills/mvt-analyze/business.md +7 -7
  20. package/sources/skills/mvt-analyze/manifest.yaml +1 -0
  21. package/sources/skills/mvt-analyze-code/manifest.yaml +110 -96
  22. package/sources/skills/mvt-bug-detect/business.md +99 -0
  23. package/sources/skills/mvt-bug-detect/manifest.yaml +84 -0
  24. package/sources/skills/mvt-check-context/business.md +3 -5
  25. package/sources/skills/mvt-check-context/manifest.yaml +70 -63
  26. package/sources/skills/mvt-cleanup/business.md +49 -23
  27. package/sources/skills/mvt-cleanup/manifest.yaml +15 -10
  28. package/sources/skills/mvt-config/business.md +1 -2
  29. package/sources/skills/mvt-config/manifest.yaml +103 -96
  30. package/sources/skills/mvt-create-skill/business.md +84 -76
  31. package/sources/skills/mvt-create-skill/manifest.yaml +107 -95
  32. package/sources/skills/mvt-design/business.md +3 -6
  33. package/sources/skills/mvt-design/manifest.yaml +109 -96
  34. package/sources/skills/mvt-fix/business.md +39 -9
  35. package/sources/skills/mvt-fix/manifest.yaml +88 -72
  36. package/sources/skills/mvt-help/business.md +2 -4
  37. package/sources/skills/mvt-help/manifest.yaml +75 -67
  38. package/sources/skills/mvt-implement/business.md +4 -5
  39. package/sources/skills/mvt-implement/manifest.yaml +93 -80
  40. package/sources/skills/mvt-init/business.md +2 -2
  41. package/sources/skills/mvt-init/manifest.yaml +102 -101
  42. package/sources/skills/mvt-manage-context/business.md +186 -175
  43. package/sources/skills/mvt-manage-context/manifest.yaml +134 -123
  44. package/sources/skills/mvt-plan-dev/business.md +101 -20
  45. package/sources/skills/mvt-plan-dev/manifest.yaml +90 -91
  46. package/sources/skills/mvt-quick-dev/business.md +2 -1
  47. package/sources/skills/mvt-quick-dev/manifest.yaml +84 -69
  48. package/sources/skills/mvt-refactor/business.md +2 -1
  49. package/sources/skills/mvt-refactor/manifest.yaml +104 -86
  50. package/sources/skills/mvt-resume/business.md +28 -68
  51. package/sources/skills/mvt-resume/manifest.yaml +81 -71
  52. package/sources/skills/mvt-review/business.md +3 -3
  53. package/sources/skills/mvt-review/manifest.yaml +108 -87
  54. package/sources/skills/mvt-status/business.md +14 -18
  55. package/sources/skills/mvt-status/manifest.yaml +74 -66
  56. package/sources/skills/mvt-sync-context/business.md +155 -150
  57. package/sources/skills/mvt-sync-context/manifest.yaml +99 -96
  58. package/sources/skills/mvt-template/business.md +0 -2
  59. package/sources/skills/mvt-template/manifest.yaml +68 -63
  60. package/sources/skills/mvt-test/business.md +3 -3
  61. package/sources/skills/mvt-test/manifest.yaml +115 -102
  62. package/sources/skills/mvt-update-plan/business.md +83 -72
  63. package/sources/skills/mvt-update-plan/manifest.yaml +124 -132
  64. package/sources/templates/analyze-output/body.md +15 -15
  65. package/sources/templates/design-output/body.md +17 -17
  66. package/sources/templates/implement-output/body.md +11 -11
  67. package/sources/templates/review-output/body.md +11 -11
  68. package/sources/templates/test-output/body.md +7 -7
  69. package/dist/build/plan-validator.d.ts +0 -26
  70. package/dist/build/plan-validator.d.ts.map +0 -1
  71. package/dist/build/plan-validator.js +0 -225
  72. package/dist/build/plan-validator.js.map +0 -1
  73. package/dist/commands/build.d.ts +0 -5
  74. package/dist/commands/build.d.ts.map +0 -1
  75. package/dist/commands/build.js +0 -46
  76. package/dist/commands/build.js.map +0 -1
  77. package/dist/commands/migrate.d.ts +0 -18
  78. package/dist/commands/migrate.d.ts.map +0 -1
  79. package/dist/commands/migrate.js +0 -163
  80. package/dist/commands/migrate.js.map +0 -1
  81. package/dist/fs/protection.d.ts +0 -15
  82. package/dist/fs/protection.d.ts.map +0 -1
  83. package/dist/fs/protection.js +0 -16
  84. package/dist/fs/protection.js.map +0 -1
@@ -1,132 +1,124 @@
1
- name: mvt-update-plan
2
- output: .claude/skills/mvt-update-plan/SKILL.md
3
-
4
- frontmatter:
5
- name: mvt-update-plan
6
- description: "Update a single task in the active change's plan.yaml: change status, attach artifacts, leave notes, and auto-advance current_task. This skill should be used after a workflow skill finishes work that maps to a plan task, or whenever the user wants to mark a task as done, blocked, or skipped."
7
-
8
- sections:
9
- - type: inline
10
- content: |
11
- # MVT Update Plan
12
-
13
- ## Purpose
14
-
15
- Apply incremental updates to the active plan.yaml: mark a task done/blocked/skipped, attach the artifacts produced, and let the skill auto-advance `current_task` to the next executable task. AI may invoke this skill on the user's behalf when the user replies to a soft-prompt with `done` / `blocked: <reason>`.
16
-
17
- - type: shared
18
- source: sections/role-header.md
19
- params:
20
- role: Architect
21
- role_desc: "a Development Planner"
22
- decision_rules:
23
- - rule: "Task id provided AND target status valid -> Apply update, advance current_task, write back"
24
- - rule: "Task id missing AND only one task is in_progress -> Default to that task"
25
- - rule: "Target status would create an invalid current_task -> Recompute current_task automatically"
26
- - rule: "All tasks become done -> Set plan.status = done, current_task = null"
27
- - rule: "active_change.has_plan is false -> Stop and suggest /mvt-plan-dev"
28
-
29
- boundaries:
30
- - scope: "create new tasks or restructure the plan"
31
- skill: "/mvt-plan-dev"
32
- - scope: "create or modify the active change itself"
33
- skill: "/mvt-analyze"
34
- - scope: "implement code"
35
- skill: "/mvt-implement"
36
-
37
- - type: shared
38
- source: sections/activation-load-context.md
39
- params:
40
- extended_context:
41
- - "{active_change.plan_path} -- The plan to update (resolved from session.yaml)"
42
-
43
- - type: shared
44
- source: sections/activation-load-config.md
45
-
46
- - type: shared
47
- source: sections/output-language-constraint.md
48
-
49
- - type: shared
50
- source: sections/activation-preflight.md
51
- params:
52
- checks:
53
- - order: "1"
54
- field: "session.initialized_at"
55
- level: "WARN"
56
- message: 'Session not initialized. Run `/mvt-init` first.'
57
- - order: "2"
58
- field: "active_change.has_plan"
59
- level: "BLOCK"
60
- message: 'No active plan. Run `/mvt-plan-dev` to create one before updating.'
61
-
62
- - type: inline
63
- content: |
64
- ### Shortcut Operation Rules
65
- - Can execute at any time when an active plan exists
66
- - Performs surgical edits only -- never overwrites the whole plan structure
67
- - Re-validates the resulting plan before writing; aborts on validation failure
68
-
69
- - type: file
70
- source: ./business.md
71
-
72
- - type: inline
73
- content: |
74
- ## Output Format
75
-
76
- Render an inline summary (no external template). Structure:
77
-
78
- ```markdown
79
- ## Plan Update
80
-
81
- ### Change Applied
82
- - **Task**: {task_id} -- {task_title}
83
- - **Status**: {old_status} -> {new_status}
84
- - **Artifacts attached**: {comma_separated_list_or_"(none)"}
85
- - **Notes**: {notes_or_"(unchanged)"}
86
-
87
- ### Plan Progress
88
- | # | id | title | status |
89
- |---|----|----|--------|
90
- | ... |
91
-
92
- Progress: {done_count}/{total_count}
93
- Current task: {new_current_task_id_or_"(plan complete)"}
94
-
95
- ### Next
96
- {one-line guidance: continue to next task, resolve blocker, or run /mvt-cleanup}
97
- ```
98
-
99
- Every response MUST end with a Suggested Next Steps section.
100
-
101
- - type: shared
102
- source: sections/session-update.md
103
-
104
- - type: inline
105
- content: |
106
- ### Update-Plan Specific State Updates
107
-
108
- In addition to the mandatory updates above, this skill MUST refresh `recent_changes` for the active change:
109
-
110
- - Find the entry where `id == active_change.id`. If absent, append one (this should be rare; happens when the plan was created out-of-band).
111
- - Set `last_updated` to the current ISO 8601 timestamp.
112
- - Trim to max 5 entries (drop the oldest by `last_updated` ascending).
113
-
114
- Do NOT modify `active_change.has_plan` or `active_change.plan_path` here -- those are owned by `/mvt-plan-dev`.
115
-
116
- - type: shared
117
- source: sections/footer-next-steps.md
118
- params:
119
- current_skill: mvt-update-plan
120
- conditional_suggestions:
121
- conditions:
122
- - condition: "plan_done"
123
- primary: mvt-cleanup
124
- primary_desc: "All tasks complete -- clean up artifacts and prepare to start the next change"
125
- - condition: "default"
126
- primary: mvt-implement
127
- primary_desc: "Continue with the next current_task"
128
- alternatives:
129
- - skill: mvt-resume
130
- desc: "Refresh context after task transitions"
131
- - skill: mvt-status
132
- desc: "Inspect overall progress across changes"
1
+ name: mvt-update-plan
2
+ output: .claude/skills/mvt-update-plan/SKILL.md
3
+
4
+ frontmatter:
5
+ name: mvt-update-plan
6
+ description: "Update a single task in the active change's plan.yaml: change status, attach artifacts, leave notes, and auto-advance current_task. This skill should be used after a workflow skill finishes work that maps to a plan task, or whenever the user wants to mark a task as done, blocked, or skipped."
7
+
8
+ sections:
9
+ - type: inline
10
+ content: |
11
+ # MVT Update Plan
12
+
13
+ ## Purpose
14
+
15
+ Apply incremental updates to the active plan.yaml: mark a task done/blocked/skipped, attach the artifacts produced, and let the skill auto-advance `current_task` to the next executable task. AI may invoke this skill on the user's behalf when the user replies to a soft-prompt with `done` / `blocked: <reason>`.
16
+
17
+ - type: shared
18
+ source: sections/role-header.md
19
+ params:
20
+ role: Architect
21
+ role_desc: "a Development Planner"
22
+ decision_rules:
23
+ - rule: "Task id provided AND target status valid -> Apply update, advance current_task, write back"
24
+ - rule: "Task id missing AND only one task is in_progress -> Default to that task"
25
+ - rule: "Target status would create an invalid current_task -> Recompute current_task automatically"
26
+ - rule: "All tasks become done -> Set plan.status = done, current_task = null"
27
+ - rule: "active_change.plan_path is empty -> Stop and suggest /mvt-plan-dev"
28
+
29
+ boundaries:
30
+ - scope: "create new tasks or restructure the plan"
31
+ skill: "/mvt-plan-dev"
32
+ - scope: "create or modify the active change itself"
33
+ skill: "/mvt-analyze"
34
+ - scope: "implement code"
35
+ skill: "/mvt-implement"
36
+
37
+ - type: shared
38
+ source: sections/activation-load-context.md
39
+ params:
40
+ extended_context:
41
+ - "{active_change.plan_path} -- The plan to update (resolved from session.yaml)"
42
+
43
+ - type: shared
44
+ source: sections/activation-load-config.md
45
+
46
+ - type: shared
47
+ source: sections/output-language-constraint.md
48
+
49
+ - type: shared
50
+ source: sections/activation-preflight.md
51
+ params:
52
+ checks:
53
+ - order: "1"
54
+ field: "session.initialized_at"
55
+ level: "WARN"
56
+ message: 'Session not initialized. Run `/mvt-init` first.'
57
+ - order: "2"
58
+ field: "active_change.plan_path"
59
+ level: "BLOCK"
60
+ message: 'No active plan. Run `/mvt-plan-dev` to create one.'
61
+
62
+ - type: inline
63
+ content: |
64
+ ## Operation Mode: Shortcut
65
+
66
+ This skill operates as a shortcut it can execute at any time when an active plan exists.
67
+ - Performs surgical edits only never overwrites the whole plan structure.
68
+ - Re-validates the resulting plan before writing; aborts on validation failure.
69
+
70
+ - type: file
71
+ source: ./business.md
72
+
73
+ - type: inline
74
+ content: |
75
+ ## Output Format
76
+
77
+ Render an inline summary (no external template). Structure:
78
+
79
+ ```markdown
80
+ ## Plan Update
81
+
82
+ ### Change Applied
83
+ - **Task**: {task_id} -- {task_title}
84
+ - **Status**: {old_status} -> {new_status}
85
+ - **Artifacts attached**: {comma_separated_list_or_"(none)"}
86
+ - **Notes**: {notes_or_"(unchanged)"}
87
+
88
+ ### Plan Progress
89
+ | # | id | title | status |
90
+ |---|----|----|--------|
91
+ | ... |
92
+
93
+ Progress: {done_count}/{total_count}
94
+ Current task: {new_current_task_id_or_"(plan complete)"}
95
+
96
+ ### Next
97
+ {one-line guidance: continue to next task, resolve blocker, or run /mvt-cleanup}
98
+ ```
99
+
100
+ Every response MUST end with a Suggested Next Steps section.
101
+
102
+ - type: shared
103
+ source: sections/session-update.md
104
+ params:
105
+ current_skill: mvt-update-plan
106
+ update_change: true
107
+
108
+ - type: shared
109
+ source: sections/footer-next-steps.md
110
+ params:
111
+ current_skill: mvt-update-plan
112
+ conditional_suggestions:
113
+ conditions:
114
+ - condition: "plan_done"
115
+ primary: mvt-cleanup
116
+ primary_desc: "All tasks complete -- clean up artifacts and prepare to start the next change"
117
+ - condition: "default"
118
+ primary: mvt-implement
119
+ primary_desc: "Continue with the next current_task"
120
+ alternatives:
121
+ - skill: mvt-resume
122
+ desc: "Refresh context after task transitions"
123
+ - skill: mvt-status
124
+ desc: "Inspect overall progress across changes"
@@ -1,15 +1,15 @@
1
- # Requirements Analysis: {Feature Name}
2
-
3
- ## Feature Overview
4
-
5
- ## Actors
6
-
7
- ## Requirements
8
-
9
- ## Domain Concepts
10
-
11
- ## Business Rules
12
-
13
- ## Ambiguities & Questions
14
-
15
- ## Change Tracking
1
+ # Requirements Analysis: {Feature Name}
2
+
3
+ ## Feature Overview
4
+
5
+ ## Actors
6
+
7
+ ## Requirements
8
+
9
+ ## Domain Concepts
10
+
11
+ ## Business Rules
12
+
13
+ ## Ambiguities & Questions
14
+
15
+ ## Change Tracking
@@ -1,17 +1,17 @@
1
- # Architecture Design: {Feature Name}
2
-
3
- ## Overview
4
-
5
- ## Architecture Decision Records
6
-
7
- ## Module Design
8
-
9
- ## Key Interfaces
10
-
11
- ## Data Flow
12
-
13
- ## File Structure
14
-
15
- ## Implementation Guidelines
16
-
17
- ## Change Tracking
1
+ # Architecture Design: {Feature Name}
2
+
3
+ ## Overview
4
+
5
+ ## Architecture Decision Records
6
+
7
+ ## Module Design
8
+
9
+ ## Key Interfaces
10
+
11
+ ## Data Flow
12
+
13
+ ## File Structure
14
+
15
+ ## Implementation Guidelines
16
+
17
+ ## Change Tracking
@@ -1,11 +1,11 @@
1
- # Implementation: {Feature Name}
2
-
3
- ## Implementation Plan
4
-
5
- ## Changes
6
-
7
- ## Implementation Details
8
-
9
- ## Design Compliance
10
-
11
- ## Change Tracking
1
+ # Implementation: {Feature Name}
2
+
3
+ ## Implementation Plan
4
+
5
+ ## Changes
6
+
7
+ ## Implementation Details
8
+
9
+ ## Design Compliance
10
+
11
+ ## Change Tracking
@@ -1,11 +1,11 @@
1
- # Code Review Report
2
-
3
- ## Summary
4
-
5
- ## Critical Issues
6
-
7
- ## Warnings
8
-
9
- ## Suggestions
10
-
11
- ## Highlights
1
+ # Code Review Report
2
+
3
+ ## Summary
4
+
5
+ ## Critical Issues
6
+
7
+ ## Warnings
8
+
9
+ ## Suggestions
10
+
11
+ ## Highlights
@@ -1,7 +1,7 @@
1
- # Test Design: {Feature Name}
2
-
3
- ## Test Cases
4
-
5
- ## Test Code
6
-
7
- ## Coverage Analysis
1
+ # Test Design: {Feature Name}
2
+
3
+ ## Test Cases
4
+
5
+ ## Test Code
6
+
7
+ ## Coverage Analysis
@@ -1,26 +0,0 @@
1
- export interface PlanValidationError {
2
- path: string;
3
- message: string;
4
- }
5
- export interface PlanTask {
6
- id: string;
7
- title: string;
8
- status: string;
9
- depends_on: string[];
10
- skill_hint?: string;
11
- acceptance?: string[];
12
- artifacts?: string[];
13
- notes?: string;
14
- }
15
- export interface Plan {
16
- version: number;
17
- change_id: string;
18
- title: string;
19
- created_at: string;
20
- updated_at: string;
21
- status: string;
22
- current_task: string | null;
23
- tasks: PlanTask[];
24
- }
25
- export declare function validatePlan(rawYaml: string): PlanValidationError[];
26
- //# sourceMappingURL=plan-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-validator.d.ts","sourceRoot":"","sources":["../../src/build/plan-validator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAsID,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CA+GnE"}
@@ -1,225 +0,0 @@
1
- import { parse as parseYaml } from "yaml";
2
- const PLAN_STATUSES = new Set(["in_progress", "done", "abandoned"]);
3
- const TASK_STATUSES = new Set([
4
- "pending",
5
- "in_progress",
6
- "done",
7
- "blocked",
8
- "skipped",
9
- ]);
10
- function isString(v) {
11
- return typeof v === "string";
12
- }
13
- function isNonEmptyString(v) {
14
- return typeof v === "string" && v.length > 0;
15
- }
16
- function detectCycle(tasks) {
17
- const idIndex = new Map();
18
- for (const t of tasks)
19
- idIndex.set(t.id, t);
20
- const WHITE = 0;
21
- const GRAY = 1;
22
- const BLACK = 2;
23
- const color = new Map();
24
- for (const t of tasks)
25
- color.set(t.id, WHITE);
26
- const stack = [];
27
- function visit(id) {
28
- color.set(id, GRAY);
29
- stack.push(id);
30
- const task = idIndex.get(id);
31
- if (task) {
32
- for (const dep of task.depends_on ?? []) {
33
- const c = color.get(dep);
34
- if (c === GRAY) {
35
- const cycleStart = stack.indexOf(dep);
36
- return stack.slice(cycleStart).concat(dep);
37
- }
38
- if (c === WHITE) {
39
- const found = visit(dep);
40
- if (found)
41
- return found;
42
- }
43
- }
44
- }
45
- stack.pop();
46
- color.set(id, BLACK);
47
- return null;
48
- }
49
- for (const t of tasks) {
50
- if (color.get(t.id) === WHITE) {
51
- const cycle = visit(t.id);
52
- if (cycle)
53
- return cycle;
54
- }
55
- }
56
- return null;
57
- }
58
- function validateTask(task, index, knownIds, errors) {
59
- const base = `tasks[${index}]`;
60
- if (typeof task !== "object" || task === null) {
61
- errors.push({ path: base, message: "Task must be an object" });
62
- return null;
63
- }
64
- const t = task;
65
- if (!isNonEmptyString(t.id)) {
66
- errors.push({ path: `${base}.id`, message: "Missing or empty id" });
67
- return null;
68
- }
69
- if (!isNonEmptyString(t.title)) {
70
- errors.push({ path: `${base}.title`, message: "Missing or empty title" });
71
- }
72
- if (!isString(t.status) || !TASK_STATUSES.has(t.status)) {
73
- errors.push({
74
- path: `${base}.status`,
75
- message: `Invalid status "${String(t.status)}". Expected one of: ${[...TASK_STATUSES].join(", ")}`,
76
- });
77
- }
78
- if (!Array.isArray(t.depends_on)) {
79
- errors.push({
80
- path: `${base}.depends_on`,
81
- message: "depends_on must be an array (use [] for no dependencies)",
82
- });
83
- }
84
- else {
85
- for (let i = 0; i < t.depends_on.length; i++) {
86
- const dep = t.depends_on[i];
87
- if (!isNonEmptyString(dep)) {
88
- errors.push({
89
- path: `${base}.depends_on[${i}]`,
90
- message: "Dependency entries must be non-empty strings",
91
- });
92
- }
93
- }
94
- }
95
- if (t.skill_hint !== undefined && !isString(t.skill_hint)) {
96
- errors.push({ path: `${base}.skill_hint`, message: "skill_hint must be a string" });
97
- }
98
- if (t.acceptance !== undefined && !Array.isArray(t.acceptance)) {
99
- errors.push({ path: `${base}.acceptance`, message: "acceptance must be an array" });
100
- }
101
- if (t.artifacts !== undefined && !Array.isArray(t.artifacts)) {
102
- errors.push({ path: `${base}.artifacts`, message: "artifacts must be an array" });
103
- }
104
- if (t.notes !== undefined && !isString(t.notes)) {
105
- errors.push({ path: `${base}.notes`, message: "notes must be a string" });
106
- }
107
- if (knownIds.has(t.id)) {
108
- errors.push({ path: `${base}.id`, message: `Duplicate task id "${t.id}"` });
109
- }
110
- knownIds.add(t.id);
111
- return {
112
- id: t.id,
113
- title: isString(t.title) ? t.title : "",
114
- status: isString(t.status) ? t.status : "",
115
- depends_on: Array.isArray(t.depends_on) ? t.depends_on : [],
116
- skill_hint: isString(t.skill_hint) ? t.skill_hint : undefined,
117
- acceptance: Array.isArray(t.acceptance) ? t.acceptance : undefined,
118
- artifacts: Array.isArray(t.artifacts) ? t.artifacts : undefined,
119
- notes: isString(t.notes) ? t.notes : undefined,
120
- };
121
- }
122
- export function validatePlan(rawYaml) {
123
- const errors = [];
124
- let parsed;
125
- try {
126
- parsed = parseYaml(rawYaml);
127
- }
128
- catch (e) {
129
- errors.push({ path: "(root)", message: `Invalid YAML: ${e}` });
130
- return errors;
131
- }
132
- if (typeof parsed !== "object" || parsed === null) {
133
- errors.push({ path: "(root)", message: "Plan must be a YAML mapping" });
134
- return errors;
135
- }
136
- const plan = parsed;
137
- if (plan.version !== 1) {
138
- errors.push({
139
- path: "version",
140
- message: `Unsupported plan version "${String(plan.version)}". Expected 1.`,
141
- });
142
- }
143
- if (!isNonEmptyString(plan.change_id)) {
144
- errors.push({ path: "change_id", message: "Missing or empty change_id" });
145
- }
146
- if (!isNonEmptyString(plan.title)) {
147
- errors.push({ path: "title", message: "Missing or empty title" });
148
- }
149
- if (!isNonEmptyString(plan.created_at)) {
150
- errors.push({ path: "created_at", message: "Missing or empty created_at" });
151
- }
152
- if (!isNonEmptyString(plan.updated_at)) {
153
- errors.push({ path: "updated_at", message: "Missing or empty updated_at" });
154
- }
155
- if (!isString(plan.status) || !PLAN_STATUSES.has(plan.status)) {
156
- errors.push({
157
- path: "status",
158
- message: `Invalid status "${String(plan.status)}". Expected one of: ${[...PLAN_STATUSES].join(", ")}`,
159
- });
160
- }
161
- const currentTask = plan.current_task;
162
- if (currentTask !== null && !isString(currentTask)) {
163
- errors.push({
164
- path: "current_task",
165
- message: "current_task must be a task id string or null",
166
- });
167
- }
168
- if (!Array.isArray(plan.tasks)) {
169
- errors.push({ path: "tasks", message: "tasks must be an array" });
170
- return errors;
171
- }
172
- if (plan.tasks.length === 0) {
173
- errors.push({ path: "tasks", message: "Plan must contain at least one task" });
174
- return errors;
175
- }
176
- const knownIds = new Set();
177
- const validated = [];
178
- for (let i = 0; i < plan.tasks.length; i++) {
179
- const t = validateTask(plan.tasks[i], i, knownIds, errors);
180
- if (t)
181
- validated.push(t);
182
- }
183
- for (let i = 0; i < validated.length; i++) {
184
- const t = validated[i];
185
- for (let j = 0; j < t.depends_on.length; j++) {
186
- const dep = t.depends_on[j];
187
- if (!knownIds.has(dep)) {
188
- errors.push({
189
- path: `tasks[${i}].depends_on[${j}]`,
190
- message: `Unknown task id "${dep}"`,
191
- });
192
- }
193
- }
194
- }
195
- if (typeof currentTask === "string" && !knownIds.has(currentTask)) {
196
- errors.push({
197
- path: "current_task",
198
- message: `Unknown task id "${currentTask}"`,
199
- });
200
- }
201
- else if (typeof currentTask === "string" && knownIds.has(currentTask)) {
202
- const ct = validated.find((t) => t.id === currentTask);
203
- if (ct && ct.status !== "pending" && ct.status !== "in_progress") {
204
- errors.push({
205
- path: "current_task",
206
- message: `current_task "${currentTask}" must reference a task with status "pending" or "in_progress" (found "${ct.status}")`,
207
- });
208
- }
209
- }
210
- if (plan.status === "done" && currentTask !== null) {
211
- errors.push({
212
- path: "current_task",
213
- message: 'current_task must be null when plan status is "done"',
214
- });
215
- }
216
- const cycle = detectCycle(validated);
217
- if (cycle) {
218
- errors.push({
219
- path: "tasks",
220
- message: `Dependency cycle detected: ${cycle.join(" -> ")}`,
221
- });
222
- }
223
- return errors;
224
- }
225
- //# sourceMappingURL=plan-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan-validator.js","sourceRoot":"","sources":["../../src/build/plan-validator.ts"],"names":[],"mappings":"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"}