cc-devflow 4.5.15 → 4.5.16
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 +5 -0
- package/.claude/skills/cc-act/SKILL.md +1 -1
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +3 -0
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +113 -33
- package/.claude/skills/cc-dev/CHANGELOG.md +5 -0
- package/.claude/skills/cc-dev/PLAYBOOK.md +6 -3
- package/.claude/skills/cc-dev/SKILL.md +10 -7
- package/.claude/skills/cc-dev/scripts/ensure-work-branch.sh +117 -0
- package/.claude/skills/cc-dev/scripts/prepare-change-worktree.sh +135 -0
- package/.claude/skills/cc-investigate/CHANGELOG.md +15 -0
- package/.claude/skills/cc-investigate/SKILL.md +85 -8
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +56 -0
- package/.claude/skills/cc-investigate/references/investigation-contract.md +1 -0
- package/.claude/skills/cc-plan/CHANGELOG.md +15 -0
- package/.claude/skills/cc-plan/SKILL.md +70 -6
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +41 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +1 -0
- package/.claude/skills/cc-pr-review/CHANGELOG.md +9 -0
- package/.claude/skills/cc-pr-review/PLAYBOOK.md +3 -0
- package/.claude/skills/cc-pr-review/SKILL.md +30 -1
- package/.claude/skills/cc-review/CHANGELOG.md +10 -0
- package/.claude/skills/cc-review/SKILL.md +53 -9
- package/.claude/skills/cc-review/references/implementation-review-branch.md +1 -0
- package/.claude/skills/cc-review/references/plan-review-branch.md +1 -0
- package/.claude/skills/cc-review/references/review-methods.md +30 -0
- package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
- package/.claude/skills/cc-roadmap/SKILL.md +1 -1
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/markdown.js +274 -69
- package/.claude/skills/cc-roadmap/scripts/lib/roadmap-tracking/schema.js +69 -15
- package/CHANGELOG.md +10 -4
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/docs/examples/example-bindings.json +8 -8
- package/docs/examples/full-design-blocked/BACKLOG.md +12 -1
- package/docs/examples/full-design-blocked/README.md +1 -1
- package/docs/examples/full-design-blocked/ROADMAP.md +2 -2
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md +23 -1
- package/docs/examples/full-design-blocked/roadmap.json +7 -2
- package/docs/examples/local-handoff/BACKLOG.md +12 -1
- package/docs/examples/local-handoff/README.md +1 -1
- package/docs/examples/local-handoff/ROADMAP.md +2 -2
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/task.md +23 -1
- package/docs/examples/local-handoff/roadmap.json +7 -2
- package/docs/examples/pdca-loop/BACKLOG.md +12 -1
- package/docs/examples/pdca-loop/README.md +1 -1
- package/docs/examples/pdca-loop/ROADMAP.md +2 -2
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/task.md +23 -1
- package/docs/examples/pdca-loop/roadmap.json +7 -2
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +2 -1
- package/lib/skill-runtime/__tests__/config.test.js +7 -2
- package/lib/skill-runtime/config.js +38 -6
- package/package.json +1 -1
|
@@ -51,6 +51,9 @@ const DEFAULT_BACKLOG = {
|
|
|
51
51
|
|
|
52
52
|
const DEFAULT_TRACKING = {
|
|
53
53
|
version: 2,
|
|
54
|
+
outputPolicy: {
|
|
55
|
+
documentLanguage: 'en'
|
|
56
|
+
},
|
|
54
57
|
lastSyncedAt: '',
|
|
55
58
|
backlogMeta: {
|
|
56
59
|
roadmapVersion: '',
|
|
@@ -115,7 +118,7 @@ function normalizeHeader(value) {
|
|
|
115
118
|
return String(value || '')
|
|
116
119
|
.trim()
|
|
117
120
|
.toLowerCase()
|
|
118
|
-
.replace(/[
|
|
121
|
+
.replace(/[^\p{L}\p{N}]+/gu, ' ');
|
|
119
122
|
}
|
|
120
123
|
|
|
121
124
|
function normalizeCell(value) {
|
|
@@ -159,7 +162,7 @@ function formatInlineCode(value) {
|
|
|
159
162
|
|
|
160
163
|
function normalizeBoolean(value) {
|
|
161
164
|
const normalized = normalizeCell(value).toLowerCase();
|
|
162
|
-
return normalized === 'yes' || normalized === 'true';
|
|
165
|
+
return normalized === 'yes' || normalized === 'true' || normalized === '是';
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
function emptyBacklog() {
|
|
@@ -219,6 +222,10 @@ function normalizeTracking(raw) {
|
|
|
219
222
|
|
|
220
223
|
return {
|
|
221
224
|
version: 2,
|
|
225
|
+
outputPolicy: {
|
|
226
|
+
...DEFAULT_TRACKING.outputPolicy,
|
|
227
|
+
...(raw.outputPolicy || {})
|
|
228
|
+
},
|
|
222
229
|
lastSyncedAt: String(raw.lastSyncedAt || '').trim(),
|
|
223
230
|
backlogMeta: {
|
|
224
231
|
roadmapVersion: String(backlogMeta.roadmapVersion || '').trim(),
|
|
@@ -268,6 +275,14 @@ function normalizeRoadmapState(raw = {}) {
|
|
|
268
275
|
const context = raw.context || {};
|
|
269
276
|
const route = raw.route || {};
|
|
270
277
|
const architecture = raw.architecture || {};
|
|
278
|
+
const normalizedMeta = {
|
|
279
|
+
...DEFAULT_ROADMAP_STATE.meta,
|
|
280
|
+
roadmapVersion: String(meta.roadmapVersion || tracking.backlogMeta.roadmapVersion).trim(),
|
|
281
|
+
skillVersion: String(meta.skillVersion || tracking.backlogMeta.skillVersion).trim(),
|
|
282
|
+
status: String(meta.status || DEFAULT_ROADMAP_STATE.meta.status).trim(),
|
|
283
|
+
lastUpdated: String(meta.lastUpdated || tracking.lastSyncedAt).trim(),
|
|
284
|
+
currentFocusStage: String(meta.currentFocusStage || tracking.backlogMeta.currentFocusStage).trim()
|
|
285
|
+
};
|
|
271
286
|
|
|
272
287
|
return {
|
|
273
288
|
...DEFAULT_ROADMAP_STATE,
|
|
@@ -276,14 +291,7 @@ function normalizeRoadmapState(raw = {}) {
|
|
|
276
291
|
...DEFAULT_ROADMAP_STATE.outputPolicy,
|
|
277
292
|
...(raw.outputPolicy || {})
|
|
278
293
|
},
|
|
279
|
-
meta:
|
|
280
|
-
...DEFAULT_ROADMAP_STATE.meta,
|
|
281
|
-
roadmapVersion: String(meta.roadmapVersion || tracking.backlogMeta.roadmapVersion).trim(),
|
|
282
|
-
skillVersion: String(meta.skillVersion || tracking.backlogMeta.skillVersion).trim(),
|
|
283
|
-
status: String(meta.status || DEFAULT_ROADMAP_STATE.meta.status).trim(),
|
|
284
|
-
lastUpdated: String(meta.lastUpdated || tracking.lastSyncedAt).trim(),
|
|
285
|
-
currentFocusStage: String(meta.currentFocusStage || tracking.backlogMeta.currentFocusStage).trim()
|
|
286
|
-
},
|
|
294
|
+
meta: normalizedMeta,
|
|
287
295
|
context: {
|
|
288
296
|
...DEFAULT_ROADMAP_STATE.context,
|
|
289
297
|
...context,
|
|
@@ -301,7 +309,11 @@ function normalizeRoadmapState(raw = {}) {
|
|
|
301
309
|
},
|
|
302
310
|
stages: Array.isArray(raw.stages) ? raw.stages : [],
|
|
303
311
|
items: tracking.items,
|
|
304
|
-
backlogMeta:
|
|
312
|
+
backlogMeta: {
|
|
313
|
+
roadmapVersion: normalizedMeta.roadmapVersion,
|
|
314
|
+
skillVersion: normalizedMeta.skillVersion,
|
|
315
|
+
currentFocusStage: normalizedMeta.currentFocusStage
|
|
316
|
+
},
|
|
305
317
|
dependencyHandoff: tracking.dependencyHandoff,
|
|
306
318
|
lastSyncedAt: tracking.lastSyncedAt,
|
|
307
319
|
handoff: buildRoadmapHandoff(tracking, raw.handoff || {}),
|
|
@@ -315,36 +327,78 @@ function normalizeRoadmapState(raw = {}) {
|
|
|
315
327
|
}
|
|
316
328
|
|
|
317
329
|
const ROADMAP_HEADER_TO_KEY = new Map(
|
|
318
|
-
|
|
330
|
+
[
|
|
331
|
+
...ROADMAP_COLUMNS,
|
|
332
|
+
['事项', 'item'],
|
|
333
|
+
['阶段', 'stage'],
|
|
334
|
+
['优先级', 'priority'],
|
|
335
|
+
['主能力', 'primaryCapability'],
|
|
336
|
+
['次能力', 'secondaryCapabilities'],
|
|
337
|
+
['预期规格变化', 'expectedSpecDelta'],
|
|
338
|
+
['依赖', 'dependsOn'],
|
|
339
|
+
['状态', 'status'],
|
|
340
|
+
['进度', 'progress']
|
|
341
|
+
].map(([header, key]) => [normalizeHeader(header), key])
|
|
319
342
|
);
|
|
320
343
|
|
|
321
344
|
const BACKLOG_QUEUE_HEADER_TO_KEY = new Map(
|
|
322
|
-
|
|
345
|
+
[
|
|
346
|
+
...BACKLOG_QUEUE_COLUMNS,
|
|
347
|
+
['标题', 'item'],
|
|
348
|
+
['来源阶段', 'stage'],
|
|
349
|
+
['优先级', 'priority'],
|
|
350
|
+
['主能力', 'primaryCapability'],
|
|
351
|
+
['次能力', 'secondaryCapabilities'],
|
|
352
|
+
['能力缺口', 'capabilityGap'],
|
|
353
|
+
['预期规格变化', 'expectedSpecDelta'],
|
|
354
|
+
['证据', 'evidence'],
|
|
355
|
+
['依赖', 'dependsOn'],
|
|
356
|
+
['可并行', 'parallelWith'],
|
|
357
|
+
['未知项', 'unknowns'],
|
|
358
|
+
['下一决策', 'nextDecision'],
|
|
359
|
+
['就绪', 'ready']
|
|
360
|
+
].map(([header, key]) => [normalizeHeader(header), key])
|
|
323
361
|
);
|
|
324
362
|
|
|
325
363
|
const READY_FIELD_MAP = new Map(
|
|
326
364
|
[
|
|
327
365
|
['Primary Capability', 'primaryCapability'],
|
|
366
|
+
['主能力', 'primaryCapability'],
|
|
328
367
|
['Secondary Capabilities', 'secondaryCapabilities'],
|
|
368
|
+
['次能力', 'secondaryCapabilities'],
|
|
329
369
|
['Why now', 'whyNow'],
|
|
370
|
+
['为什么现在做', 'whyNow'],
|
|
330
371
|
['Success signal', 'successSignal'],
|
|
372
|
+
['成功信号', 'successSignal'],
|
|
331
373
|
['Entry constraints', 'entryConstraints'],
|
|
374
|
+
['进入约束', 'entryConstraints'],
|
|
332
375
|
['Capability gap', 'capabilityGap'],
|
|
376
|
+
['能力缺口', 'capabilityGap'],
|
|
333
377
|
['Expected spec delta', 'expectedSpecDelta'],
|
|
378
|
+
['预期规格变化', 'expectedSpecDelta'],
|
|
334
379
|
['Open risks', 'openRisks'],
|
|
380
|
+
['未决风险', 'openRisks'],
|
|
335
381
|
['First planning question', 'firstPlanningQuestion'],
|
|
382
|
+
['首个规划问题', 'firstPlanningQuestion'],
|
|
336
383
|
['Required context to load', 'requiredContextToLoad'],
|
|
384
|
+
['必须加载的上下文', 'requiredContextToLoad'],
|
|
337
385
|
['Depends On', 'dependsOn'],
|
|
386
|
+
['依赖', 'dependsOn'],
|
|
338
387
|
['Parallel With', 'parallelWith'],
|
|
339
|
-
['
|
|
388
|
+
['可并行', 'parallelWith'],
|
|
389
|
+
['Why this is ready now', 'whyReadyNow'],
|
|
390
|
+
['为什么现在已就绪', 'whyReadyNow']
|
|
340
391
|
].map(([label, key]) => [normalizeHeader(label), key])
|
|
341
392
|
);
|
|
342
393
|
|
|
343
394
|
const PARKED_FIELD_MAP = new Map(
|
|
344
395
|
[
|
|
345
396
|
['Reason parked', 'parkedReason'],
|
|
397
|
+
['暂存原因', 'parkedReason'],
|
|
346
398
|
['Trigger to reopen', 'triggerToReopen'],
|
|
347
|
-
['
|
|
399
|
+
['重新打开触发条件', 'triggerToReopen'],
|
|
400
|
+
['Missing evidence', 'missingEvidence'],
|
|
401
|
+
['缺失证据', 'missingEvidence']
|
|
348
402
|
].map(([label, key]) => [normalizeHeader(label), key])
|
|
349
403
|
);
|
|
350
404
|
|
package/CHANGELOG.md
CHANGED
|
@@ -9,12 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
_No unreleased changes._
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
## [4.5.16] - 2026-05-17
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
15
17
|
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
+
- Updated `cc-plan`, `cc-investigate`, `cc-review`, and `cc-pr-review` to require ASCII branch-chain analysis in their task or review outputs.
|
|
19
|
+
- Added plan and investigation task-template fields that trace upstream sources, deepest affected code or prompt/provider layers, downstream impact, and verification seams.
|
|
20
|
+
- Clarified that ASCII branch-chain connector tokens stay ASCII while labels, findings, evidence, and explanatory text follow the configured output language.
|
|
21
|
+
- Replaced hard-coded English branch-chain templates with shared semantic label tables for English and Chinese outputs.
|
|
22
|
+
- Updated runtime output-policy rendering so `zh-CN` configurations describe the policy in Chinese instead of English-only prose.
|
|
23
|
+
- Added `Output language` metadata to generated roadmap and backlog projections.
|
|
18
24
|
|
|
19
25
|
### Removed
|
|
20
26
|
|
package/README.md
CHANGED
|
@@ -181,7 +181,7 @@ CC-DevFlow reads layered YAML config before durable workflow documents are writt
|
|
|
181
181
|
<repo>/.cc-devflow/config.local.yml
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
Precedence is deterministic: defaults < user < project < local < environment < CLI. `output.document_language` is machine-enforced and currently supports `en` and `zh-CN`. Non-standard preferences belong under `agent_preferences`; they guide style but do not override workflow contracts.
|
|
184
|
+
Precedence is deterministic: defaults < user < project < local < environment < CLI. `output.document_language` is machine-enforced and currently supports `en` and `zh-CN`. It controls durable planning, review, and handoff Markdown headings, prose, placeholders, evidence summaries, and PR/body drafts; code, commands, paths, schema keys, API names, and commit type/scope literals stay unchanged. Non-standard preferences belong under `agent_preferences`; they guide style but do not override workflow contracts.
|
|
185
185
|
|
|
186
186
|
```yaml
|
|
187
187
|
version: 1
|
package/README.zh-CN.md
CHANGED
|
@@ -181,7 +181,7 @@ CC-DevFlow 会在写入 durable workflow 文档前读取分层 YAML 配置:
|
|
|
181
181
|
<repo>/.cc-devflow/config.local.yml
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
优先级固定为:默认值 < 用户 < 项目 < 本地 < 环境变量 < CLI 参数。`output.document_language` 是机器约束,目前支持 `en` 和 `zh-CN
|
|
184
|
+
优先级固定为:默认值 < 用户 < 项目 < 本地 < 环境变量 < CLI 参数。`output.document_language` 是机器约束,目前支持 `en` 和 `zh-CN`。它约束 durable planning、review、handoff Markdown 的标题、正文、占位符、证据说明和 PR/body 草稿;代码、命令、路径、schema key、API 名、commit type/scope 等机器字面量保持原文。非标偏好放在 `agent_preferences` 下,只影响表达风格,不覆盖 workflow 契约。
|
|
185
185
|
|
|
186
186
|
```yaml
|
|
187
187
|
version: 1
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"updatedAt": "2026-05-
|
|
2
|
+
"updatedAt": "2026-05-17",
|
|
3
3
|
"skills": {
|
|
4
|
-
"cc-roadmap": "5.3.
|
|
4
|
+
"cc-roadmap": "5.3.1",
|
|
5
5
|
"cc-next": "1.1.1",
|
|
6
|
-
"cc-dev": "1.1.
|
|
7
|
-
"cc-plan": "3.10.
|
|
8
|
-
"cc-investigate": "1.6.
|
|
6
|
+
"cc-dev": "1.1.3",
|
|
7
|
+
"cc-plan": "3.10.7",
|
|
8
|
+
"cc-investigate": "1.6.5",
|
|
9
9
|
"cc-do": "1.7.2",
|
|
10
|
-
"cc-review": "2.2.
|
|
11
|
-
"cc-pr-review": "1.1.
|
|
10
|
+
"cc-review": "2.2.3",
|
|
11
|
+
"cc-pr-review": "1.1.3",
|
|
12
12
|
"cc-pr-land": "1.1.0",
|
|
13
13
|
"cc-check": "1.12.2",
|
|
14
|
-
"cc-act": "1.9.
|
|
14
|
+
"cc-act": "1.9.2",
|
|
15
15
|
"cc-spec-init": "1.2.0"
|
|
16
16
|
},
|
|
17
17
|
"examples": [
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
## Backlog Meta
|
|
6
6
|
|
|
7
7
|
- Roadmap version: `roadmap.v2`
|
|
8
|
-
- Skill version: `5.3.
|
|
8
|
+
- Skill version: `5.3.1`
|
|
9
9
|
- Last synced: `2026-04-19`
|
|
10
10
|
- Current focus stage: `Stage 2`
|
|
11
11
|
- Roadmap state source: `roadmap.json`
|
|
12
|
+
- Output language: en
|
|
12
13
|
|
|
13
14
|
## Queue
|
|
14
15
|
|
|
@@ -22,6 +23,16 @@
|
|
|
22
23
|
- Parallel-ready next wave: -
|
|
23
24
|
- Notes on blockers: verification is blocked until the import contract covers limits, duplicates, billing, and audit consistency
|
|
24
25
|
|
|
26
|
+
## Project Direction Handoff
|
|
27
|
+
|
|
28
|
+
- Project direction mode: -
|
|
29
|
+
- Direction mode rationale: -
|
|
30
|
+
- Direction-specific questions selected: -
|
|
31
|
+
- Direction-specific questions skipped: -
|
|
32
|
+
- Direction guardrails applied: -
|
|
33
|
+
- Planning posture: -
|
|
34
|
+
- Evidence maturity: -
|
|
35
|
+
|
|
25
36
|
## Ready For Req-Plan
|
|
26
37
|
|
|
27
38
|
- RM-010:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- Example version: `1.0.0`
|
|
6
6
|
- Last reviewed: `2026-04-17`
|
|
7
|
-
- Bound skills: `cc-roadmap@5.3.
|
|
7
|
+
- Bound skills: `cc-roadmap@5.3.1`, `cc-plan@3.10.7`, `cc-do@1.7.2`, `cc-check@1.12.2`
|
|
8
8
|
|
|
9
9
|
This example shows a requirement that **looked executable**, but `cc-check` correctly stopped it and sent it back to `cc-plan`.
|
|
10
10
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Roadmap Meta
|
|
4
4
|
|
|
5
5
|
- Roadmap version: `roadmap.v2`
|
|
6
|
-
- Skill version: `5.3.
|
|
6
|
+
- Skill version: `5.3.1`
|
|
7
7
|
- Status: `active`
|
|
8
8
|
- Last updated: `2026-04-16`
|
|
9
9
|
- Owner / decider: `product-owner`
|
|
@@ -60,6 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
## Implementation Tracking
|
|
62
62
|
- Roadmap state source: `roadmap.json`
|
|
63
|
+
- Output language: en
|
|
63
64
|
|
|
64
65
|
<!-- roadmap-tracking:start -->
|
|
65
66
|
| RM-ID | Item | Stage | Priority | Primary Capability | Secondary Capabilities | Expected Spec Delta | Depends On | Status | REQ | Progress |
|
|
@@ -67,7 +68,6 @@
|
|
|
67
68
|
| RM-010 | Add CSV bulk invite import for admins | Stage 2 | P1 | cap-bulk-invite-import | cap-workspace-membership | define import semantics before widening current truth | - | Verification blocked | REQ-002 | 80% |
|
|
68
69
|
<!-- roadmap-tracking:end -->
|
|
69
70
|
|
|
70
|
-
|
|
71
71
|
## Technical Architecture
|
|
72
72
|
|
|
73
73
|
```mermaid
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
- Requirement version: `REQ-002.v2`
|
|
6
6
|
- Design version: `design.v2`
|
|
7
|
-
- CC-Plan skill version: `3.10.
|
|
7
|
+
- CC-Plan skill version: `3.10.7`
|
|
8
8
|
- Work branch: `REQ/002-bulk-invite-import`
|
|
9
|
+
- Output language: en
|
|
9
10
|
- Source roadmap item: `RM-010`
|
|
10
11
|
- Source roadmap version: `roadmap.v2`
|
|
11
12
|
|
|
@@ -36,6 +37,27 @@
|
|
|
36
37
|
- Better architecture: later move bulk provisioning into a job-backed import workflow.
|
|
37
38
|
- Selected move: row classification first, then admin surface and audit mapping.
|
|
38
39
|
- Rejected tradeoff: no SCIM, background jobs, or rollback wizard in this requirement.
|
|
40
|
+
- ASCII Branch Chain Analysis:
|
|
41
|
+
Language rule: connector tokens stay ASCII; node text follows `Output language: en`.
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
Requirement Impact Chain
|
|
45
|
+
REQ: deterministic bulk invite row outcomes
|
|
46
|
+
|-- Upstream source: RM-010 + admin import failure cases
|
|
47
|
+
|-- Current code path: src/invite/bulk-import.ts
|
|
48
|
+
| |-- caller: src/admin/BulkInvitePanel.tsx
|
|
49
|
+
| |-- data or state: CSV rows, duplicate state, seat-limit state, audit rows
|
|
50
|
+
| `-- deepest affected layer: row-outcome matrix shared by invite and audit behavior
|
|
51
|
+
|-- Required change: classify each row before executing visible bulk results
|
|
52
|
+
`-- Verification seam: bulk-import and admin panel tests
|
|
53
|
+
|
|
54
|
+
Business Impact Chain
|
|
55
|
+
OUTCOME: admins can trust mixed CSV import results
|
|
56
|
+
|-- Direct behavior impact: duplicate, invalid, and over-limit rows get stable results
|
|
57
|
+
|-- Downstream impact: audit mapping and visible admin result rendering
|
|
58
|
+
|-- Risk branch: row semantics drift between UI and audit log
|
|
59
|
+
`-- Non-goal branch: SCIM, background jobs, and rollback wizard stay out
|
|
60
|
+
```
|
|
39
61
|
- Read first:
|
|
40
62
|
- `design.md`
|
|
41
63
|
- `src/admin/BulkInvitePanel.tsx`
|
|
@@ -5,12 +5,17 @@
|
|
|
5
5
|
},
|
|
6
6
|
"meta": {
|
|
7
7
|
"roadmapVersion": "roadmap.v2",
|
|
8
|
-
"skillVersion": "5.3.
|
|
8
|
+
"skillVersion": "5.3.1",
|
|
9
9
|
"status": "active",
|
|
10
10
|
"lastUpdated": "2026-04-19",
|
|
11
11
|
"currentFocusStage": "Stage 2"
|
|
12
12
|
},
|
|
13
13
|
"context": {
|
|
14
|
+
"projectDirectionMode": "",
|
|
15
|
+
"projectDirectionRationale": "",
|
|
16
|
+
"directionQuestionsSelected": [],
|
|
17
|
+
"directionQuestionsSkipped": [],
|
|
18
|
+
"directionGuardrailsApplied": [],
|
|
14
19
|
"planningPosture": "",
|
|
15
20
|
"evidenceMaturity": "",
|
|
16
21
|
"canonicalTerms": [],
|
|
@@ -127,7 +132,7 @@
|
|
|
127
132
|
},
|
|
128
133
|
"backlogMeta": {
|
|
129
134
|
"roadmapVersion": "roadmap.v2",
|
|
130
|
-
"skillVersion": "
|
|
135
|
+
"skillVersion": "5.3.1",
|
|
131
136
|
"currentFocusStage": "Stage 2"
|
|
132
137
|
},
|
|
133
138
|
"dependencyHandoff": {
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
## Backlog Meta
|
|
6
6
|
|
|
7
7
|
- Roadmap version: `roadmap.v2`
|
|
8
|
-
- Skill version: `5.3.
|
|
8
|
+
- Skill version: `5.3.1`
|
|
9
9
|
- Last synced: `2026-04-19`
|
|
10
10
|
- Current focus stage: `Stage 2`
|
|
11
11
|
- Roadmap state source: `roadmap.json`
|
|
12
|
+
- Output language: en
|
|
12
13
|
|
|
13
14
|
## Queue
|
|
14
15
|
|
|
@@ -22,6 +23,16 @@
|
|
|
22
23
|
- Parallel-ready next wave: -
|
|
23
24
|
- Notes on blockers: export work stays local-only until the next maintainer has remote access
|
|
24
25
|
|
|
26
|
+
## Project Direction Handoff
|
|
27
|
+
|
|
28
|
+
- Project direction mode: -
|
|
29
|
+
- Direction mode rationale: -
|
|
30
|
+
- Direction-specific questions selected: -
|
|
31
|
+
- Direction-specific questions skipped: -
|
|
32
|
+
- Direction guardrails applied: -
|
|
33
|
+
- Planning posture: -
|
|
34
|
+
- Evidence maturity: -
|
|
35
|
+
|
|
25
36
|
## Ready For Req-Plan
|
|
26
37
|
|
|
27
38
|
- RM-020:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- Example version: `1.0.0`
|
|
6
6
|
- Last reviewed: `2026-04-17`
|
|
7
|
-
- Bound skills: `cc-roadmap@5.3.
|
|
7
|
+
- Bound skills: `cc-roadmap@5.3.1`, `cc-plan@3.10.7`, `cc-do@1.7.2`, `cc-check@1.12.2`, `cc-act@1.9.2`
|
|
8
8
|
|
|
9
9
|
This example shows verified work that is **ready to move forward**, but `cc-act` still chooses `local-handoff`.
|
|
10
10
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Roadmap Meta
|
|
4
4
|
|
|
5
5
|
- Roadmap version: `roadmap.v3`
|
|
6
|
-
- Skill version: `5.3.
|
|
6
|
+
- Skill version: `5.3.1`
|
|
7
7
|
- Status: `active`
|
|
8
8
|
- Last updated: `2026-04-16`
|
|
9
9
|
- Owner / decider: `product-owner`
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
## Implementation Tracking
|
|
54
54
|
- Roadmap state source: `roadmap.json`
|
|
55
|
+
- Output language: en
|
|
55
56
|
|
|
56
57
|
<!-- roadmap-tracking:start -->
|
|
57
58
|
| RM-ID | Item | Stage | Priority | Primary Capability | Secondary Capabilities | Expected Spec Delta | Depends On | Status | REQ | Progress |
|
|
@@ -59,7 +60,6 @@
|
|
|
59
60
|
| RM-020 | Add an audit-log export summary download | Stage 2 | P1 | cap-audit-log-export | - | codify local export summary truth | - | Local handoff | REQ-003 | 100% |
|
|
60
61
|
<!-- roadmap-tracking:end -->
|
|
61
62
|
|
|
62
|
-
|
|
63
63
|
## Technical Architecture
|
|
64
64
|
|
|
65
65
|
```mermaid
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
- Requirement version: `REQ-003.v1`
|
|
6
6
|
- Design version: `design.v1`
|
|
7
|
-
- CC-Plan skill version: `3.10.
|
|
7
|
+
- CC-Plan skill version: `3.10.7`
|
|
8
8
|
- Work branch: `REQ/003-audit-log-export`
|
|
9
|
+
- Output language: en
|
|
9
10
|
- Source roadmap item: `RM-020`
|
|
10
11
|
- Source roadmap version: `roadmap.v3`
|
|
11
12
|
|
|
@@ -36,6 +37,27 @@
|
|
|
36
37
|
- Better architecture: later introduce a reporting backend for scheduled exports.
|
|
37
38
|
- Selected move: visible-row CSV download from the existing panel.
|
|
38
39
|
- Rejected tradeoff: no JSON export, scheduling, or shared reporting backend here.
|
|
40
|
+
- ASCII Branch Chain Analysis:
|
|
41
|
+
Language rule: connector tokens stay ASCII; node text follows `Output language: en`.
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
Requirement Impact Chain
|
|
45
|
+
REQ: CSV export for visible audit summary rows
|
|
46
|
+
|-- Upstream source: RM-020 + weekly admin reporting workflow
|
|
47
|
+
|-- Current code path: src/admin/AuditSummaryPanel.tsx
|
|
48
|
+
| |-- caller: admin audit summary panel action
|
|
49
|
+
| |-- data or state: visible summary rows
|
|
50
|
+
| `-- deepest affected layer: browser download/blob boundary for CSV output
|
|
51
|
+
|-- Required change: export visible rows without adding reporting storage
|
|
52
|
+
`-- Verification seam: src/admin/AuditSummaryPanel.test.tsx
|
|
53
|
+
|
|
54
|
+
Business Impact Chain
|
|
55
|
+
OUTCOME: admins stop manually copying weekly audit summaries
|
|
56
|
+
|-- Direct behavior impact: visible rows become a downloadable CSV
|
|
57
|
+
|-- Downstream impact: local handoff documents proof for CSV-only export
|
|
58
|
+
|-- Risk branch: exported rows diverge from visible panel state
|
|
59
|
+
`-- Non-goal branch: JSON export, scheduled reporting, and backend history stay out
|
|
60
|
+
```
|
|
39
61
|
- Read first:
|
|
40
62
|
- `design.md`
|
|
41
63
|
- `src/admin/AuditSummaryPanel.tsx`
|
|
@@ -5,12 +5,17 @@
|
|
|
5
5
|
},
|
|
6
6
|
"meta": {
|
|
7
7
|
"roadmapVersion": "roadmap.v2",
|
|
8
|
-
"skillVersion": "5.3.
|
|
8
|
+
"skillVersion": "5.3.1",
|
|
9
9
|
"status": "active",
|
|
10
10
|
"lastUpdated": "2026-04-19",
|
|
11
11
|
"currentFocusStage": "Stage 2"
|
|
12
12
|
},
|
|
13
13
|
"context": {
|
|
14
|
+
"projectDirectionMode": "",
|
|
15
|
+
"projectDirectionRationale": "",
|
|
16
|
+
"directionQuestionsSelected": [],
|
|
17
|
+
"directionQuestionsSkipped": [],
|
|
18
|
+
"directionGuardrailsApplied": [],
|
|
14
19
|
"planningPosture": "",
|
|
15
20
|
"evidenceMaturity": "",
|
|
16
21
|
"canonicalTerms": [],
|
|
@@ -123,7 +128,7 @@
|
|
|
123
128
|
},
|
|
124
129
|
"backlogMeta": {
|
|
125
130
|
"roadmapVersion": "roadmap.v2",
|
|
126
|
-
"skillVersion": "
|
|
131
|
+
"skillVersion": "5.3.1",
|
|
127
132
|
"currentFocusStage": "Stage 2"
|
|
128
133
|
},
|
|
129
134
|
"dependencyHandoff": {
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
## Backlog Meta
|
|
6
6
|
|
|
7
7
|
- Roadmap version: `roadmap.v1`
|
|
8
|
-
- Skill version: `5.3.
|
|
8
|
+
- Skill version: `5.3.1`
|
|
9
9
|
- Last synced: `2026-04-19`
|
|
10
10
|
- Current focus stage: `Stage 1`
|
|
11
11
|
- Roadmap state source: `roadmap.json`
|
|
12
|
+
- Output language: en
|
|
12
13
|
|
|
13
14
|
## Queue
|
|
14
15
|
|
|
@@ -23,6 +24,16 @@
|
|
|
23
24
|
- Parallel-ready next wave: none until RM-001 proves the copy action shape
|
|
24
25
|
- Notes on blockers: RM-002 should reuse the final interaction contract from RM-001, not race it
|
|
25
26
|
|
|
27
|
+
## Project Direction Handoff
|
|
28
|
+
|
|
29
|
+
- Project direction mode: -
|
|
30
|
+
- Direction mode rationale: -
|
|
31
|
+
- Direction-specific questions selected: -
|
|
32
|
+
- Direction-specific questions skipped: -
|
|
33
|
+
- Direction guardrails applied: -
|
|
34
|
+
- Planning posture: -
|
|
35
|
+
- Evidence maturity: -
|
|
36
|
+
|
|
26
37
|
## Ready For Req-Plan
|
|
27
38
|
|
|
28
39
|
- RM-001:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- Example version: `1.0.0`
|
|
6
6
|
- Last reviewed: `2026-04-17`
|
|
7
|
-
- Bound skills: `cc-roadmap@5.3.
|
|
7
|
+
- Bound skills: `cc-roadmap@5.3.1`, `cc-plan@3.10.7`, `cc-do@1.7.2`, `cc-check@1.12.2`, `cc-act@1.9.2`
|
|
8
8
|
|
|
9
9
|
This folder shows one minimal but complete `cc-roadmap -> cc-plan -> cc-do -> cc-check -> cc-act` loop.
|
|
10
10
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Roadmap Meta
|
|
4
4
|
|
|
5
5
|
- Roadmap version: `roadmap.v1`
|
|
6
|
-
- Skill version: `5.3.
|
|
6
|
+
- Skill version: `5.3.1`
|
|
7
7
|
- Status: `active`
|
|
8
8
|
- Last updated: `2026-04-15`
|
|
9
9
|
- Owner / decider: `product-owner`
|
|
@@ -138,6 +138,7 @@
|
|
|
138
138
|
|
|
139
139
|
## Implementation Tracking
|
|
140
140
|
- Roadmap state source: `roadmap.json`
|
|
141
|
+
- Output language: en
|
|
141
142
|
|
|
142
143
|
<!-- roadmap-tracking:start -->
|
|
143
144
|
| RM-ID | Item | Stage | Priority | Primary Capability | Secondary Capabilities | Expected Spec Delta | Depends On | Status | REQ | Progress |
|
|
@@ -147,7 +148,6 @@
|
|
|
147
148
|
| RM-004 | Collaboration analytics follow-up | - | - | - | - | - | - | - | - | - |
|
|
148
149
|
<!-- roadmap-tracking:end -->
|
|
149
150
|
|
|
150
|
-
|
|
151
151
|
## Technical Architecture
|
|
152
152
|
|
|
153
153
|
```mermaid
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
- Requirement version: `REQ-001.v1`
|
|
6
6
|
- Design version: `design.v1`
|
|
7
|
-
- CC-Plan skill version: `3.10.
|
|
7
|
+
- CC-Plan skill version: `3.10.7`
|
|
8
8
|
- Work branch: `REQ/001-copy-invite-link`
|
|
9
|
+
- Output language: en
|
|
9
10
|
- Source roadmap item: `RM-001`
|
|
10
11
|
- Source roadmap version: `roadmap.v1`
|
|
11
12
|
|
|
@@ -37,6 +38,27 @@
|
|
|
37
38
|
- Better architecture: centralize all share actions behind a richer share command model later.
|
|
38
39
|
- Selected move: same-dialog copy action with minimal copied-state confirmation.
|
|
39
40
|
- Rejected tradeoff: no broader share-service redesign in this bounded requirement.
|
|
41
|
+
- ASCII Branch Chain Analysis:
|
|
42
|
+
Language rule: connector tokens stay ASCII; node text follows `Output language: en`.
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
Requirement Impact Chain
|
|
46
|
+
REQ: one-click copy for the visible invite URL
|
|
47
|
+
|-- Upstream source: RM-001 + share dialog user story
|
|
48
|
+
|-- Current code path: src/features/share/ShareDialog.tsx
|
|
49
|
+
| |-- caller: share dialog render flow
|
|
50
|
+
| |-- data or state: existing invite URL prop + copied confirmation state
|
|
51
|
+
| `-- deepest affected layer: clipboard boundary in the dialog behavior
|
|
52
|
+
|-- Required change: add copy action without changing share-service contracts
|
|
53
|
+
`-- Verification seam: src/features/share/ShareDialog.test.tsx
|
|
54
|
+
|
|
55
|
+
Business Impact Chain
|
|
56
|
+
OUTCOME: users can share invites without manual text selection
|
|
57
|
+
|-- Direct behavior impact: visible invite URL copies from the dialog
|
|
58
|
+
|-- Downstream impact: tests and PR brief document the bounded copy behavior
|
|
59
|
+
|-- Risk branch: clipboard boundary failure or stale copied-state feedback
|
|
60
|
+
`-- Non-goal branch: invite generation, analytics, and fallback redesign stay out
|
|
61
|
+
```
|
|
40
62
|
- Read first:
|
|
41
63
|
- `design.md`
|
|
42
64
|
- `src/features/share/ShareDialog.tsx`
|
|
@@ -5,12 +5,17 @@
|
|
|
5
5
|
},
|
|
6
6
|
"meta": {
|
|
7
7
|
"roadmapVersion": "roadmap.v1",
|
|
8
|
-
"skillVersion": "5.3.
|
|
8
|
+
"skillVersion": "5.3.1",
|
|
9
9
|
"status": "active",
|
|
10
10
|
"lastUpdated": "2026-04-19",
|
|
11
11
|
"currentFocusStage": "Stage 1"
|
|
12
12
|
},
|
|
13
13
|
"context": {
|
|
14
|
+
"projectDirectionMode": "",
|
|
15
|
+
"projectDirectionRationale": "",
|
|
16
|
+
"directionQuestionsSelected": [],
|
|
17
|
+
"directionQuestionsSkipped": [],
|
|
18
|
+
"directionGuardrailsApplied": [],
|
|
14
19
|
"planningPosture": "",
|
|
15
20
|
"evidenceMaturity": "",
|
|
16
21
|
"canonicalTerms": [],
|
|
@@ -193,7 +198,7 @@
|
|
|
193
198
|
},
|
|
194
199
|
"backlogMeta": {
|
|
195
200
|
"roadmapVersion": "roadmap.v1",
|
|
196
|
-
"skillVersion": "
|
|
201
|
+
"skillVersion": "5.3.1",
|
|
197
202
|
"currentFocusStage": "Stage 1"
|
|
198
203
|
},
|
|
199
204
|
"dependencyHandoff": {
|
|
@@ -133,8 +133,9 @@ describe('cc-devflow cli distribution bootstrap', () => {
|
|
|
133
133
|
const doctorResult = runCli(['config', 'doctor', '--cwd', repoRoot], repoRoot);
|
|
134
134
|
|
|
135
135
|
expect(resolveResult.status).toBe(0);
|
|
136
|
-
expect(resolveResult.stdout).toContain('CC-DevFlow
|
|
136
|
+
expect(resolveResult.stdout).toContain('CC-DevFlow 输出策略');
|
|
137
137
|
expect(resolveResult.stdout).toContain('Output language: zh-CN');
|
|
138
|
+
expect(resolveResult.stdout).toContain('标题、正文、占位符、证据说明和 PR/body 草稿必须使用简体中文');
|
|
138
139
|
expect(resolveResult.stdout).toContain('Trace:');
|
|
139
140
|
expect(resolveResult.stdout).toContain('project');
|
|
140
141
|
expect(getResult.status).toBe(0);
|
|
@@ -100,8 +100,13 @@ describe('skill-runtime user config', () => {
|
|
|
100
100
|
'cli:output.document_language:zh-CN'
|
|
101
101
|
]);
|
|
102
102
|
expect(result.policy).toContain('Output language: zh-CN');
|
|
103
|
-
expect(result.policy).toContain('
|
|
104
|
-
expect(result.policy).toContain('
|
|
103
|
+
expect(result.policy).toContain('## CC-DevFlow 输出策略');
|
|
104
|
+
expect(result.policy).toContain('机器强制字段:output.document_language');
|
|
105
|
+
expect(result.policy).toContain('标题、正文、占位符、证据说明和 PR/body 草稿必须使用简体中文');
|
|
106
|
+
expect(result.policy).toContain('必须在元数据或首屏包含 `Output language: zh-CN`');
|
|
107
|
+
expect(result.policy).toContain('Agent 建议偏好:');
|
|
108
|
+
expect(result.policy).not.toContain('Machine-enforced fields');
|
|
109
|
+
expect(result.policy).not.toContain('Durable Markdown artifacts must include');
|
|
105
110
|
});
|
|
106
111
|
|
|
107
112
|
test('rejects unsupported language and unknown top-level fields', () => {
|