cc-devflow 4.5.4 → 4.5.5
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/.claude/skills/cc-act/CHANGELOG.md +6 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +21 -5
- package/.claude/skills/cc-act/SKILL.md +21 -11
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +10 -0
- package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +8 -0
- package/.claude/skills/cc-act/references/closure-contract.md +3 -0
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +48 -0
- package/.claude/skills/cc-act/scripts/generate-status-report.sh +3 -0
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +6 -0
- package/.claude/skills/cc-act/scripts/sync-act-docs.sh +13 -0
- package/.claude/skills/cc-do/CHANGELOG.md +6 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +7 -6
- package/.claude/skills/cc-do/SKILL.md +27 -12
- package/.claude/skills/cc-do/references/execution-recovery.md +9 -0
- package/.claude/skills/cc-investigate/CHANGELOG.md +6 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +5 -1
- package/.claude/skills/cc-investigate/SKILL.md +22 -5
- package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +14 -0
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +1 -0
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +9 -1
- package/.claude/skills/cc-investigate/references/investigation-contract.md +2 -0
- package/.claude/skills/cc-plan/CHANGELOG.md +23 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +38 -18
- package/.claude/skills/cc-plan/SKILL.md +81 -47
- package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +68 -3
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +28 -5
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +54 -2
- package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +44 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +29 -15
- package/.claude/skills/cc-roadmap/CHANGELOG.md +12 -0
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +15 -9
- package/.claude/skills/cc-roadmap/SKILL.md +22 -16
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +3 -1
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +11 -1
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +57 -10
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/markdown.js +68 -3
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/schema.js +120 -0
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/store.js +25 -1
- package/.claude/skills/cc-roadmap/scripts/locate-roadmap-item.sh +13 -5
- package/.claude/skills/cc-roadmap/scripts/roadmap-tracking.js +3 -3
- package/.claude/skills/cc-roadmap/scripts/sync-roadmap-progress.sh +3 -3
- package/CHANGELOG.md +7 -0
- package/README.md +5 -5
- package/README.zh-CN.md +5 -5
- package/docs/CLAUDE.md +1 -1
- package/docs/examples/START-HERE.md +3 -3
- package/docs/examples/example-bindings.json +26 -9
- package/docs/examples/full-design-blocked/BACKLOG.md +4 -2
- package/docs/examples/full-design-blocked/README.md +4 -4
- package/docs/examples/full-design-blocked/ROADMAP.md +16 -2
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +39 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +41 -0
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +8 -1
- package/docs/examples/full-design-blocked/roadmap.json +123 -0
- package/docs/examples/local-handoff/BACKLOG.md +4 -2
- package/docs/examples/local-handoff/README.md +4 -4
- package/docs/examples/local-handoff/ROADMAP.md +16 -2
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +19 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +26 -0
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +8 -1
- package/docs/examples/local-handoff/roadmap.json +121 -0
- package/docs/examples/pdca-loop/BACKLOG.md +4 -2
- package/docs/examples/pdca-loop/README.md +4 -4
- package/docs/examples/pdca-loop/ROADMAP.md +16 -2
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +19 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +22 -3
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +8 -1
- package/docs/examples/pdca-loop/roadmap.json +191 -0
- package/docs/examples/scripts/check-example-bindings.sh +7 -4
- package/docs/guides/getting-started.md +2 -2
- package/docs/guides/getting-started.zh-CN.md +2 -2
- package/lib/compiler/__tests__/skills-registry.test.js +17 -3
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +9 -1
- package/package.json +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"outputPolicy": {
|
|
4
|
+
"documentLanguage": "en"
|
|
5
|
+
},
|
|
6
|
+
"meta": {
|
|
7
|
+
"roadmapVersion": "roadmap.v1",
|
|
8
|
+
"skillVersion": "5.0.0",
|
|
9
|
+
"status": "active",
|
|
10
|
+
"lastUpdated": "2026-04-19",
|
|
11
|
+
"currentFocusStage": "Stage 1"
|
|
12
|
+
},
|
|
13
|
+
"context": {
|
|
14
|
+
"planningPosture": "",
|
|
15
|
+
"evidenceMaturity": "",
|
|
16
|
+
"canonicalTerms": [],
|
|
17
|
+
"durableDecisionSources": []
|
|
18
|
+
},
|
|
19
|
+
"evidence": [],
|
|
20
|
+
"route": {
|
|
21
|
+
"recommended": "",
|
|
22
|
+
"whyThisWinsNow": "",
|
|
23
|
+
"rejectedRoutes": [],
|
|
24
|
+
"firstSignal": "",
|
|
25
|
+
"killSignal": ""
|
|
26
|
+
},
|
|
27
|
+
"stages": [],
|
|
28
|
+
"items": [
|
|
29
|
+
{
|
|
30
|
+
"rmId": "RM-001",
|
|
31
|
+
"item": "Add one-click copy action to the share dialog",
|
|
32
|
+
"stage": "Stage 1",
|
|
33
|
+
"priority": "P1",
|
|
34
|
+
"primaryCapability": "cap-invite-links",
|
|
35
|
+
"secondaryCapabilities": [],
|
|
36
|
+
"expectedSpecDelta": "tighten invite-link copy truth",
|
|
37
|
+
"dependsOn": [],
|
|
38
|
+
"status": "In review",
|
|
39
|
+
"req": "REQ-001",
|
|
40
|
+
"progress": "100%",
|
|
41
|
+
"backlog": {
|
|
42
|
+
"capabilityGap": "share dialog exposes invite URL but not direct copy action",
|
|
43
|
+
"evidence": "repeated support friction",
|
|
44
|
+
"parallelWith": [],
|
|
45
|
+
"unknowns": "copied-state feedback shape",
|
|
46
|
+
"nextDecision": "freeze tiny design and execute",
|
|
47
|
+
"ready": true,
|
|
48
|
+
"whyNow": "it removes the first visible collaboration friction in the beta flow",
|
|
49
|
+
"successSignal": "users can copy the invite link with one click",
|
|
50
|
+
"entryConstraints": "no backend changes, no share dialog redesign",
|
|
51
|
+
"openRisks": "clipboard failure copy may still need follow-up UX",
|
|
52
|
+
"firstPlanningQuestion": "can this stay a tiny-design patch without changing contracts?",
|
|
53
|
+
"requiredContextToLoad": "current share dialog, current invite URL source, existing tests",
|
|
54
|
+
"whyReadyNow": "the ask is narrow, the evidence is real, and the dependency surface is already known",
|
|
55
|
+
"parked": false,
|
|
56
|
+
"parkedReason": "",
|
|
57
|
+
"triggerToReopen": "",
|
|
58
|
+
"missingEvidence": ""
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"rmId": "RM-002",
|
|
63
|
+
"item": "Add copied-state feedback to the share dialog",
|
|
64
|
+
"stage": "Stage 1",
|
|
65
|
+
"priority": "P2",
|
|
66
|
+
"primaryCapability": "cap-invite-links",
|
|
67
|
+
"secondaryCapabilities": [],
|
|
68
|
+
"expectedSpecDelta": "extend invite-link feedback truth",
|
|
69
|
+
"dependsOn": [
|
|
70
|
+
"RM-001"
|
|
71
|
+
],
|
|
72
|
+
"status": "Planned",
|
|
73
|
+
"req": "",
|
|
74
|
+
"progress": "0%",
|
|
75
|
+
"backlog": {
|
|
76
|
+
"capabilityGap": "invite links lack durable copied-state feedback after action completion",
|
|
77
|
+
"evidence": "likely useful after RM-001",
|
|
78
|
+
"parallelWith": [],
|
|
79
|
+
"unknowns": "toast vs inline state",
|
|
80
|
+
"nextDecision": "decide after first patch ships",
|
|
81
|
+
"ready": false,
|
|
82
|
+
"whyNow": "",
|
|
83
|
+
"successSignal": "",
|
|
84
|
+
"entryConstraints": "",
|
|
85
|
+
"openRisks": "",
|
|
86
|
+
"firstPlanningQuestion": "",
|
|
87
|
+
"requiredContextToLoad": "",
|
|
88
|
+
"whyReadyNow": "",
|
|
89
|
+
"parked": false,
|
|
90
|
+
"parkedReason": "",
|
|
91
|
+
"triggerToReopen": "",
|
|
92
|
+
"missingEvidence": ""
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"rmId": "RM-004",
|
|
97
|
+
"item": "Collaboration analytics follow-up",
|
|
98
|
+
"stage": "",
|
|
99
|
+
"priority": "",
|
|
100
|
+
"primaryCapability": "",
|
|
101
|
+
"secondaryCapabilities": [],
|
|
102
|
+
"expectedSpecDelta": "",
|
|
103
|
+
"dependsOn": [],
|
|
104
|
+
"status": "",
|
|
105
|
+
"req": "",
|
|
106
|
+
"progress": "",
|
|
107
|
+
"backlog": {
|
|
108
|
+
"capabilityGap": "",
|
|
109
|
+
"evidence": "",
|
|
110
|
+
"parallelWith": [],
|
|
111
|
+
"unknowns": "",
|
|
112
|
+
"nextDecision": "",
|
|
113
|
+
"ready": false,
|
|
114
|
+
"whyNow": "",
|
|
115
|
+
"successSignal": "",
|
|
116
|
+
"entryConstraints": "",
|
|
117
|
+
"openRisks": "",
|
|
118
|
+
"firstPlanningQuestion": "",
|
|
119
|
+
"requiredContextToLoad": "",
|
|
120
|
+
"whyReadyNow": "",
|
|
121
|
+
"parked": true,
|
|
122
|
+
"parkedReason": "collaboration analytics is premature before Stage 1 and 2 prove usage",
|
|
123
|
+
"triggerToReopen": "repeated invite usage after beta activation",
|
|
124
|
+
"missingEvidence": "stable collaboration volume"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"handoff": {
|
|
129
|
+
"readyForCcPlan": [
|
|
130
|
+
"RM-001"
|
|
131
|
+
],
|
|
132
|
+
"parked": [
|
|
133
|
+
"RM-004"
|
|
134
|
+
],
|
|
135
|
+
"serialSpine": [
|
|
136
|
+
"RM-001 -> RM-002"
|
|
137
|
+
],
|
|
138
|
+
"parallelWaves": [
|
|
139
|
+
"none until RM-001 proves the copy action shape"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"architecture": {
|
|
143
|
+
"diagramType": "flowchart",
|
|
144
|
+
"nodes": [
|
|
145
|
+
{
|
|
146
|
+
"id": "roadmap_json",
|
|
147
|
+
"label": "roadmap.json"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "roadmap_md",
|
|
151
|
+
"label": "ROADMAP.md"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "backlog_md",
|
|
155
|
+
"label": "BACKLOG.md (deprecated)"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"id": "cc_plan",
|
|
159
|
+
"label": "cc-plan"
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"edges": [
|
|
163
|
+
{
|
|
164
|
+
"from": "roadmap_json",
|
|
165
|
+
"to": "roadmap_md",
|
|
166
|
+
"label": "renders"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"from": "roadmap_json",
|
|
170
|
+
"to": "backlog_md",
|
|
171
|
+
"label": "projects"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"from": "roadmap_md",
|
|
175
|
+
"to": "cc_plan",
|
|
176
|
+
"label": "hands off"
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
"backlogMeta": {
|
|
181
|
+
"roadmapVersion": "roadmap.v1",
|
|
182
|
+
"skillVersion": "4.4.1",
|
|
183
|
+
"currentFocusStage": "Stage 1"
|
|
184
|
+
},
|
|
185
|
+
"dependencyHandoff": {
|
|
186
|
+
"serialSpine": "RM-001 -> RM-002",
|
|
187
|
+
"parallelReadyNextWave": "none until RM-001 proves the copy action shape",
|
|
188
|
+
"notesOnBlockers": "RM-002 should reuse the final interaction contract from RM-001, not race it"
|
|
189
|
+
},
|
|
190
|
+
"lastSyncedAt": "2026-04-19"
|
|
191
|
+
}
|
|
@@ -67,7 +67,7 @@ while IFS= read -r encoded; do
|
|
|
67
67
|
review_dir="$change_dir/review"
|
|
68
68
|
handoff_dir="$change_dir/handoff"
|
|
69
69
|
|
|
70
|
-
for file in "$readme" "$root/ROADMAP.md" "$root/BACKLOG.md" "$root/roadmap
|
|
70
|
+
for file in "$readme" "$root/ROADMAP.md" "$root/BACKLOG.md" "$root/roadmap.json" "$planning_dir/design.md" "$planning_dir/tasks.md" "$planning_dir/task-manifest.json"; do
|
|
71
71
|
if [[ ! -f "$file" ]]; then
|
|
72
72
|
echo "Example $example_id is missing required file: $file" >&2
|
|
73
73
|
exit 1
|
|
@@ -75,14 +75,17 @@ while IFS= read -r encoded; do
|
|
|
75
75
|
done
|
|
76
76
|
|
|
77
77
|
assert_contains "$root/ROADMAP.md" "- Skill version: \`$ROADMAP_VERSION\`"
|
|
78
|
-
assert_contains "$root/ROADMAP.md" "-
|
|
78
|
+
assert_contains "$root/ROADMAP.md" "- Roadmap state source: \`roadmap.json\`"
|
|
79
|
+
assert_contains "$root/ROADMAP.md" "## Technical Architecture"
|
|
80
|
+
assert_contains "$root/ROADMAP.md" "\`\`\`mermaid"
|
|
79
81
|
assert_contains "$root/BACKLOG.md" "- Skill version: \`$ROADMAP_VERSION\`"
|
|
80
|
-
assert_contains "$root/BACKLOG.md" "
|
|
82
|
+
assert_contains "$root/BACKLOG.md" "> Deprecated projection. Edit \`roadmap.json\` instead."
|
|
83
|
+
assert_contains "$root/BACKLOG.md" "- Roadmap state source: \`roadmap.json\`"
|
|
81
84
|
assert_contains "$root/BACKLOG.md" "| RM-ID | Title | Source Stage | Priority | Primary Capability | Secondary Capabilities | Capability Gap | Expected Spec Delta | Evidence | Depends On | Parallel With | Unknowns | Next Decision | Ready |"
|
|
82
85
|
assert_contains "$root/BACKLOG.md" "## Ready For Req-Plan"
|
|
83
86
|
assert_contains "$root/BACKLOG.md" " - Primary Capability:"
|
|
84
87
|
assert_contains "$root/BACKLOG.md" " - Expected spec delta:"
|
|
85
|
-
jq -er '.version ==
|
|
88
|
+
jq -er '.version == 3 and (.items | length) > 0 and (.meta | type == "object") and (.handoff | type == "object") and (.architecture.nodes | length) > 0 and any(.items[]; .backlog != null)' "$root/roadmap.json" >/dev/null
|
|
86
89
|
assert_contains "$planning_dir/design.md" "- CC-Plan skill version: \`$REQ_PLAN_VERSION\`"
|
|
87
90
|
assert_contains "$planning_dir/tasks.md" "- CC-Plan skill version: \`$REQ_PLAN_VERSION\`"
|
|
88
91
|
|
|
@@ -83,7 +83,7 @@ Use the skills in this order:
|
|
|
83
83
|
|
|
84
84
|
Typical outputs:
|
|
85
85
|
|
|
86
|
-
- `cc-roadmap` writes `devflow/
|
|
86
|
+
- `cc-roadmap` writes `devflow/roadmap.json` as the editable roadmap truth, then generates `devflow/ROADMAP.md` and deprecated `devflow/BACKLOG.md`
|
|
87
87
|
- `cc-spec-init` writes `devflow/specs/INDEX.md`, capability specs, and `change-meta.json`
|
|
88
88
|
- `cc-plan` writes `planning/design.md`, `planning/tasks.md`, `task-manifest.json`, and `change-meta.json`
|
|
89
89
|
- `cc-investigate` writes `planning/analysis.md`, `planning/tasks.md`, `task-manifest.json`, and `change-meta.json`
|
|
@@ -94,7 +94,7 @@ Capability truth lives in `devflow/specs/`.
|
|
|
94
94
|
Change truth lives in `devflow/changes/<change>/`.
|
|
95
95
|
|
|
96
96
|
- Keep `INDEX.md` plus capability markdown under `devflow/specs/`.
|
|
97
|
-
- Name new change directories as `REQ-<number>-<description>` for requirements or `FIX-<number>-<description>` for bug fixes; old lowercase directories are compatibility reads only.
|
|
97
|
+
- Name new change directories as `REQ-<number>-<description>` for requirements or `FIX-<number>-<description>` for bug fixes. `REQ` and `FIX` are separate number sequences; old lowercase directories are compatibility reads only.
|
|
98
98
|
- Keep `change-state.json`, `change-meta.json`, planning docs, `task-manifest.json`, optional `team-state.json`, task `checkpoint.json`, `report-card.json`, and one final handoff file under each `devflow/changes/<change>/`.
|
|
99
99
|
- Worker prompts, journals, assignments, and session logs belong under `devflow/workspaces/<change>/` as ephemeral scratch.
|
|
100
100
|
|
|
@@ -83,7 +83,7 @@ find .codex/skills -mindepth 2 -maxdepth 2 -name SKILL.md | sort
|
|
|
83
83
|
|
|
84
84
|
常见产物:
|
|
85
85
|
|
|
86
|
-
- `cc-roadmap`
|
|
86
|
+
- `cc-roadmap` 产出可编辑真相 `devflow/roadmap.json`,再生成 `devflow/ROADMAP.md` 和 deprecated `devflow/BACKLOG.md`
|
|
87
87
|
- `cc-spec-init` 产出 `devflow/specs/INDEX.md`、capability spec 和 `change-meta.json`
|
|
88
88
|
- `cc-plan` 产出 `planning/design.md`、`planning/tasks.md`、`task-manifest.json` 和 `change-meta.json`
|
|
89
89
|
- `cc-investigate` 产出 `planning/analysis.md`、`planning/tasks.md`、`task-manifest.json` 和 `change-meta.json`
|
|
@@ -93,7 +93,7 @@ find .codex/skills -mindepth 2 -maxdepth 2 -name SKILL.md | sort
|
|
|
93
93
|
durable truth 分两层:
|
|
94
94
|
|
|
95
95
|
- `devflow/specs/`:capability 真相,保留 `INDEX.md` 与 `capabilities/*.md`
|
|
96
|
-
- 新 change 目录必须命名为 `REQ-<number>-<description>`(需求)或 `FIX-<number>-<description
|
|
96
|
+
- 新 change 目录必须命名为 `REQ-<number>-<description>`(需求)或 `FIX-<number>-<description>`(修复);`REQ` 和 `FIX` 分别维护自己的递增编号,旧小写目录只作为历史兼容读取。
|
|
97
97
|
- `devflow/changes/<change>/`:变更真相,保留 `change-state.json`、`change-meta.json`、planning 文档、`task-manifest.json`、可选 `team-state.json`、任务级 `checkpoint.json`、`report-card.json` 和唯一的最终 handoff 文件。
|
|
98
98
|
- worker prompt、journal、assignment、session log 统一放到 `devflow/workspaces/<change>/`,作为 ephemeral scratch。
|
|
99
99
|
|
|
@@ -195,7 +195,7 @@ describe('Skills Registry Generator', () => {
|
|
|
195
195
|
);
|
|
196
196
|
});
|
|
197
197
|
|
|
198
|
-
test('should publish roadmap outputs under devflow', async () => {
|
|
198
|
+
test('should publish unified roadmap state outputs under devflow', async () => {
|
|
199
199
|
const { generateSkillsRegistryV2 } = require('../skills-registry');
|
|
200
200
|
|
|
201
201
|
const result = await generateSkillsRegistryV2('.claude/skills');
|
|
@@ -204,14 +204,28 @@ describe('Skills Registry Generator', () => {
|
|
|
204
204
|
expect(roadmap).toBeDefined();
|
|
205
205
|
expect(roadmap.writes).toEqual(
|
|
206
206
|
expect.arrayContaining([
|
|
207
|
-
expect.objectContaining({
|
|
208
|
-
|
|
207
|
+
expect.objectContaining({
|
|
208
|
+
path: 'devflow/roadmap.json',
|
|
209
|
+
durability: 'durable',
|
|
210
|
+
required: true
|
|
211
|
+
}),
|
|
212
|
+
expect.objectContaining({
|
|
213
|
+
path: 'devflow/ROADMAP.md',
|
|
214
|
+
durability: 'durable',
|
|
215
|
+
required: true
|
|
216
|
+
}),
|
|
217
|
+
expect.objectContaining({
|
|
218
|
+
path: 'devflow/BACKLOG.md',
|
|
219
|
+
durability: 'durable',
|
|
220
|
+
required: false
|
|
221
|
+
})
|
|
209
222
|
])
|
|
210
223
|
);
|
|
211
224
|
expect(roadmap.writes).not.toEqual(
|
|
212
225
|
expect.arrayContaining([
|
|
213
226
|
expect.objectContaining({ path: 'ROADMAP.md' }),
|
|
214
227
|
expect.objectContaining({ path: 'BACKLOG.md' }),
|
|
228
|
+
expect.objectContaining({ path: 'devflow/roadmap-tracking.json', required: true }),
|
|
215
229
|
expect.objectContaining({ path: 'devflow/roadmap/roadmap.md' }),
|
|
216
230
|
expect.objectContaining({ path: 'devflow/roadmap/backlog.md' })
|
|
217
231
|
])
|
|
@@ -229,6 +229,11 @@ describe('cc-devflow cli distribution bootstrap', () => {
|
|
|
229
229
|
);
|
|
230
230
|
expect(codexRoadmapSkill.data.writes).toEqual(
|
|
231
231
|
expect.arrayContaining([
|
|
232
|
+
expect.objectContaining({
|
|
233
|
+
path: 'devflow/roadmap.json',
|
|
234
|
+
durability: 'durable',
|
|
235
|
+
required: true
|
|
236
|
+
}),
|
|
232
237
|
expect.objectContaining({
|
|
233
238
|
path: 'devflow/ROADMAP.md',
|
|
234
239
|
durability: 'durable',
|
|
@@ -237,10 +242,13 @@ describe('cc-devflow cli distribution bootstrap', () => {
|
|
|
237
242
|
expect.objectContaining({
|
|
238
243
|
path: 'devflow/BACKLOG.md',
|
|
239
244
|
durability: 'durable',
|
|
240
|
-
required:
|
|
245
|
+
required: false
|
|
241
246
|
})
|
|
242
247
|
])
|
|
243
248
|
);
|
|
249
|
+
expect(codexRoadmapSkill.data.writes).not.toEqual(
|
|
250
|
+
expect.arrayContaining([expect.objectContaining({ path: 'devflow/roadmap-tracking.json', required: true })])
|
|
251
|
+
);
|
|
244
252
|
});
|
|
245
253
|
|
|
246
254
|
test('adapt mirrors Codex skills without baking project YAML output policy', () => {
|