@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.
- package/README.md +184 -193
- package/dist/build/section-loader.d.ts.map +1 -1
- package/dist/build/section-loader.js +18 -8
- package/dist/build/section-loader.js.map +1 -1
- package/dist/fs/materialize.d.ts.map +1 -1
- package/dist/fs/materialize.js +5 -0
- package/dist/fs/materialize.js.map +1 -1
- package/dist/scripts/session-update.cjs +7568 -0
- package/install-manifest.yaml +2 -0
- package/package.json +3 -2
- package/registry.yaml +6 -0
- package/sources/defaults/config.yaml +7 -7
- package/sources/defaults/session.yaml +9 -16
- package/sources/scripts/session-update.js +351 -0
- package/sources/sections/activation-load-context.md +4 -0
- package/sources/sections/footer-next-steps.md +1 -1
- package/sources/sections/output-language-constraint.md +11 -11
- package/sources/sections/session-update.md +115 -47
- package/sources/skills/mvt-analyze/business.md +7 -7
- package/sources/skills/mvt-analyze/manifest.yaml +1 -0
- package/sources/skills/mvt-analyze-code/manifest.yaml +110 -96
- package/sources/skills/mvt-bug-detect/business.md +99 -0
- package/sources/skills/mvt-bug-detect/manifest.yaml +84 -0
- package/sources/skills/mvt-check-context/business.md +3 -5
- package/sources/skills/mvt-check-context/manifest.yaml +70 -63
- package/sources/skills/mvt-cleanup/business.md +49 -23
- package/sources/skills/mvt-cleanup/manifest.yaml +15 -10
- package/sources/skills/mvt-config/business.md +1 -2
- package/sources/skills/mvt-config/manifest.yaml +103 -96
- package/sources/skills/mvt-create-skill/business.md +84 -76
- package/sources/skills/mvt-create-skill/manifest.yaml +107 -95
- package/sources/skills/mvt-design/business.md +3 -6
- package/sources/skills/mvt-design/manifest.yaml +109 -96
- package/sources/skills/mvt-fix/business.md +39 -9
- package/sources/skills/mvt-fix/manifest.yaml +88 -72
- package/sources/skills/mvt-help/business.md +2 -4
- package/sources/skills/mvt-help/manifest.yaml +75 -67
- package/sources/skills/mvt-implement/business.md +4 -5
- package/sources/skills/mvt-implement/manifest.yaml +93 -80
- package/sources/skills/mvt-init/business.md +2 -2
- package/sources/skills/mvt-init/manifest.yaml +102 -101
- package/sources/skills/mvt-manage-context/business.md +186 -175
- package/sources/skills/mvt-manage-context/manifest.yaml +134 -123
- package/sources/skills/mvt-plan-dev/business.md +101 -20
- package/sources/skills/mvt-plan-dev/manifest.yaml +90 -91
- package/sources/skills/mvt-quick-dev/business.md +2 -1
- package/sources/skills/mvt-quick-dev/manifest.yaml +84 -69
- package/sources/skills/mvt-refactor/business.md +2 -1
- package/sources/skills/mvt-refactor/manifest.yaml +104 -86
- package/sources/skills/mvt-resume/business.md +28 -68
- package/sources/skills/mvt-resume/manifest.yaml +81 -71
- package/sources/skills/mvt-review/business.md +3 -3
- package/sources/skills/mvt-review/manifest.yaml +108 -87
- package/sources/skills/mvt-status/business.md +14 -18
- package/sources/skills/mvt-status/manifest.yaml +74 -66
- package/sources/skills/mvt-sync-context/business.md +155 -150
- package/sources/skills/mvt-sync-context/manifest.yaml +99 -96
- package/sources/skills/mvt-template/business.md +0 -2
- package/sources/skills/mvt-template/manifest.yaml +68 -63
- package/sources/skills/mvt-test/business.md +3 -3
- package/sources/skills/mvt-test/manifest.yaml +115 -102
- package/sources/skills/mvt-update-plan/business.md +83 -72
- package/sources/skills/mvt-update-plan/manifest.yaml +124 -132
- package/sources/templates/analyze-output/body.md +15 -15
- package/sources/templates/design-output/body.md +17 -17
- package/sources/templates/implement-output/body.md +11 -11
- package/sources/templates/review-output/body.md +11 -11
- package/sources/templates/test-output/body.md +7 -7
- package/dist/build/plan-validator.d.ts +0 -26
- package/dist/build/plan-validator.d.ts.map +0 -1
- package/dist/build/plan-validator.js +0 -225
- package/dist/build/plan-validator.js.map +0 -1
- package/dist/commands/build.d.ts +0 -5
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -46
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/migrate.d.ts +0 -18
- package/dist/commands/migrate.d.ts.map +0 -1
- package/dist/commands/migrate.js +0 -163
- package/dist/commands/migrate.js.map +0 -1
- package/dist/fs/protection.d.ts +0 -15
- package/dist/fs/protection.d.ts.map +0 -1
- package/dist/fs/protection.js +0 -16
- 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.
|
|
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.
|
|
59
|
-
level: "BLOCK"
|
|
60
|
-
message: 'No active plan. Run `/mvt-plan-dev` to create one
|
|
61
|
-
|
|
62
|
-
- type: inline
|
|
63
|
-
content: |
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- **
|
|
84
|
-
- **
|
|
85
|
-
- **
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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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"}
|