cc-devflow 4.5.8 → 4.5.10
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 +33 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +9 -4
- package/.claude/skills/cc-act/SKILL.md +73 -12
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +30 -0
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +29 -0
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +103 -0
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +61 -5
- package/.claude/skills/cc-act/references/closure-contract.md +4 -1
- package/.claude/skills/cc-act/references/git-commit-guidelines.md +342 -37
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +29 -1
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +164 -0
- package/.claude/skills/cc-act/scripts/sync-act-docs.sh +1 -1
- package/.claude/skills/cc-check/CHANGELOG.md +17 -0
- package/.claude/skills/cc-check/PLAYBOOK.md +1 -0
- package/.claude/skills/cc-check/SKILL.md +9 -5
- package/.claude/skills/cc-check/references/review-contract.md +7 -0
- package/.claude/skills/cc-check/scripts/render-report-card.js +6 -1
- package/.claude/skills/cc-dev/CHANGELOG.md +5 -0
- package/.claude/skills/cc-dev/SKILL.md +26 -1
- package/.claude/skills/cc-do/CHANGELOG.md +23 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +7 -7
- package/.claude/skills/cc-do/SKILL.md +49 -45
- package/.claude/skills/cc-do/references/execution-recovery.md +18 -13
- package/.claude/skills/cc-do/scripts/build-task-context.sh +13 -22
- package/.claude/skills/cc-do/scripts/mark-task-complete.sh +0 -6
- package/.claude/skills/cc-do/scripts/record-review-decision.sh +4 -5
- package/.claude/skills/cc-do/scripts/recover-workflow.sh +9 -11
- package/.claude/skills/cc-do/scripts/verify-task-gates.sh +12 -10
- package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +7 -29
- package/.claude/skills/cc-investigate/CHANGELOG.md +34 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +21 -5
- package/.claude/skills/cc-investigate/SKILL.md +97 -40
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +66 -4
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +30 -59
- package/.claude/skills/cc-investigate/assets/{ANALYSIS_TEMPLATE.md → legacy/ANALYSIS_TEMPLATE.md} +48 -0
- package/.claude/skills/cc-investigate/references/investigation-contract.md +16 -2
- package/.claude/skills/cc-investigate/scripts/bootstrap-analysis.sh +1 -1
- package/.claude/skills/cc-next/CHANGELOG.md +6 -0
- package/.claude/skills/cc-next/PLAYBOOK.md +26 -4
- package/.claude/skills/cc-next/SKILL.md +39 -4
- package/.claude/skills/cc-plan/CHANGELOG.md +38 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +60 -53
- package/.claude/skills/cc-plan/SKILL.md +164 -87
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +101 -9
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +58 -229
- package/.claude/skills/cc-plan/assets/{DESIGN_TEMPLATE.md → legacy/DESIGN_TEMPLATE.md} +68 -0
- package/.claude/skills/cc-plan/assets/{TINY_DESIGN_TEMPLATE.md → legacy/TINY_DESIGN_TEMPLATE.md} +47 -1
- package/.claude/skills/cc-plan/references/planning-contract.md +48 -33
- package/.claude/skills/cc-review/CHANGELOG.md +6 -0
- package/.claude/skills/cc-review/PLAYBOOK.md +9 -11
- package/.claude/skills/cc-review/SKILL.md +37 -61
- package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +1 -1
- package/.claude/skills/cc-review/references/implementation-review-branch.md +5 -5
- package/.claude/skills/cc-review/references/plan-review-branch.md +1 -1
- package/.claude/skills/cc-review/references/review-methods.md +4 -4
- package/.claude/skills/cc-review/scripts/collect-review-context.sh +14 -7
- package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +30 -0
- package/.claude/skills/cc-roadmap/SKILL.md +45 -8
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +8 -0
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +22 -0
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +32 -1
- package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +14 -14
- package/CHANGELOG.md +28 -0
- package/CONTRIBUTING.md +40 -4
- package/CONTRIBUTING.zh-CN.md +40 -4
- package/README.md +57 -43
- package/README.zh-CN.md +57 -43
- package/bin/cc-devflow-cli.js +293 -36
- package/docs/examples/START-HERE.md +5 -4
- package/docs/examples/example-bindings.json +10 -10
- package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
- package/docs/examples/full-design-blocked/README.md +2 -2
- package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +2 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +29 -312
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +11 -8
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +4 -4
- package/docs/examples/full-design-blocked/roadmap.json +1 -1
- package/docs/examples/local-handoff/BACKLOG.md +1 -1
- package/docs/examples/local-handoff/README.md +2 -2
- package/docs/examples/local-handoff/ROADMAP.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +2 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +27 -210
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +9 -6
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +1 -1
- package/docs/examples/local-handoff/roadmap.json +1 -1
- package/docs/examples/pdca-loop/BACKLOG.md +1 -1
- package/docs/examples/pdca-loop/README.md +2 -2
- package/docs/examples/pdca-loop/ROADMAP.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +65 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +2 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +26 -228
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +9 -6
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +1 -1
- package/docs/examples/pdca-loop/roadmap.json +1 -1
- package/docs/examples/scripts/check-example-bindings.sh +11 -5
- package/docs/get-shit-done-strategy-audit.md +22 -22
- package/docs/guides/artifact-contract.md +44 -0
- package/docs/guides/getting-started.md +10 -8
- package/docs/guides/getting-started.zh-CN.md +10 -8
- package/docs/guides/minimize-artifacts.md +123 -0
- package/docs/guides/project-postmortem.md +78 -0
- package/lib/compiler/__tests__/skills-registry.test.js +2 -2
- package/lib/skill-runtime/CLAUDE.md +1 -1
- package/lib/skill-runtime/__tests__/autopilot.test.js +42 -6
- package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +165 -0
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +2 -2
- package/lib/skill-runtime/__tests__/dispatch.test.js +8 -38
- package/lib/skill-runtime/__tests__/intent.test.js +4 -20
- package/lib/skill-runtime/__tests__/lifecycle.test.js +1 -1
- package/lib/skill-runtime/__tests__/paths.test.js +7 -1
- package/lib/skill-runtime/__tests__/planner.tdd.test.js +63 -2
- package/lib/skill-runtime/__tests__/prepare-pr.test.js +3 -16
- package/lib/skill-runtime/__tests__/query.test.js +388 -7
- package/lib/skill-runtime/__tests__/review-check-integration.test.js +148 -0
- package/lib/skill-runtime/__tests__/review-records.test.js +619 -0
- package/lib/skill-runtime/__tests__/runtime.integration.test.js +64 -23
- package/lib/skill-runtime/__tests__/schemas.test.js +76 -2
- package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +137 -0
- package/lib/skill-runtime/__tests__/task-contract.test.js +783 -0
- package/lib/skill-runtime/__tests__/verify-artifacts.test.js +203 -0
- package/lib/skill-runtime/__tests__/worker-run.test.js +4 -11
- package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +31 -0
- package/lib/skill-runtime/__tests__/workflow-context.test.js +98 -0
- package/lib/skill-runtime/artifacts.js +0 -5
- package/lib/skill-runtime/context-index.js +545 -0
- package/lib/skill-runtime/intent.js +9 -33
- package/lib/skill-runtime/lifecycle.js +1 -1
- package/lib/skill-runtime/operations/CLAUDE.md +2 -2
- package/lib/skill-runtime/operations/dispatch.js +4 -42
- package/lib/skill-runtime/operations/init.js +2 -6
- package/lib/skill-runtime/operations/janitor.js +2 -18
- package/lib/skill-runtime/operations/resume.js +21 -38
- package/lib/skill-runtime/operations/review-records.js +265 -0
- package/lib/skill-runtime/operations/snapshot.js +1 -1
- package/lib/skill-runtime/operations/task-contract.js +524 -0
- package/lib/skill-runtime/operations/worker-run.js +2 -30
- package/lib/skill-runtime/paths.js +4 -4
- package/lib/skill-runtime/planner.js +25 -13
- package/lib/skill-runtime/query-registry.js +2 -2
- package/lib/skill-runtime/query.js +16 -3
- package/lib/skill-runtime/review-records.js +123 -0
- package/lib/skill-runtime/review.js +246 -11
- package/lib/skill-runtime/schemas.js +179 -15
- package/lib/skill-runtime/store.js +0 -10
- package/lib/skill-runtime/task-contract.js +187 -0
- package/lib/skill-runtime/workflow-context.js +748 -0
- package/package.json +7 -4
package/bin/cc-devflow-cli.js
CHANGED
|
@@ -60,6 +60,8 @@ Commands:
|
|
|
60
60
|
config doctor Validate config and local ignore safety
|
|
61
61
|
query list List typed runtime query ids
|
|
62
62
|
query <id> Run a typed runtime query as JSON
|
|
63
|
+
task-contract Compile task contract artifacts
|
|
64
|
+
review Record durable review ledger events
|
|
63
65
|
next-change-key Compute the next REQ/FIX change key
|
|
64
66
|
archive-change Archive a completed change to devflow/changes/archive/YYYY-MM/
|
|
65
67
|
restore-change Restore an archived change back to devflow/changes/
|
|
@@ -94,6 +96,9 @@ Query options:
|
|
|
94
96
|
--change <id> Change id, for example REQ-123
|
|
95
97
|
--change-id <id> Alias for --change
|
|
96
98
|
--change-key <key> Full change key, for example REQ-123-my-feature
|
|
99
|
+
--data-only Print only the query data payload when the query succeeds
|
|
100
|
+
--no-trace Omit trace metadata from the JSON output
|
|
101
|
+
--compact Print minified JSON instead of pretty JSON
|
|
97
102
|
|
|
98
103
|
Next-change-key options:
|
|
99
104
|
--prefix <REQ|FIX> Change type prefix (required)
|
|
@@ -111,7 +116,10 @@ Examples:
|
|
|
111
116
|
cc-devflow config resolve --cwd /path/to/project --format policy
|
|
112
117
|
cc-devflow query list
|
|
113
118
|
cc-devflow query ship-readiness --cwd /path/to/project --change REQ-123
|
|
119
|
+
cc-devflow query workflow-context --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature --data-only --no-trace --compact
|
|
114
120
|
cc-devflow query progress --change REQ-123 --change-key REQ-123-my-feature
|
|
121
|
+
cc-devflow task-contract compile --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature
|
|
122
|
+
cc-devflow review start --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature --base-sha abc --head-sha def
|
|
115
123
|
`);
|
|
116
124
|
}
|
|
117
125
|
|
|
@@ -456,56 +464,51 @@ function runConfig(args) {
|
|
|
456
464
|
return 0;
|
|
457
465
|
}
|
|
458
466
|
|
|
459
|
-
function
|
|
467
|
+
function parseChangeScopedArgs(args, options = {}) {
|
|
468
|
+
const { allowQueryFlags = false } = options;
|
|
460
469
|
const parsed = {
|
|
461
470
|
cwd: null,
|
|
462
471
|
changeId: null,
|
|
463
472
|
changeKey: null,
|
|
473
|
+
compact: false,
|
|
474
|
+
dataOnly: false,
|
|
475
|
+
noTrace: false,
|
|
464
476
|
rest: []
|
|
465
477
|
};
|
|
466
478
|
|
|
467
479
|
for (let i = 0; i < args.length; i++) {
|
|
468
480
|
const arg = args[i];
|
|
469
481
|
|
|
470
|
-
if (arg === '--cwd') {
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
if (arg
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
if (arg === '--change' || arg === '--change-id') {
|
|
481
|
-
parsed.changeId = args[++i];
|
|
482
|
-
continue;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
if (arg.startsWith('--change=')) {
|
|
486
|
-
parsed.changeId = arg.slice('--change='.length);
|
|
487
|
-
continue;
|
|
488
|
-
}
|
|
482
|
+
if (arg === '--cwd') { parsed.cwd = args[++i]; continue; }
|
|
483
|
+
if (arg.startsWith('--cwd=')) { parsed.cwd = arg.slice('--cwd='.length); continue; }
|
|
484
|
+
if (arg === '--change' || arg === '--change-id') { parsed.changeId = args[++i]; continue; }
|
|
485
|
+
if (arg.startsWith('--change=')) { parsed.changeId = arg.slice('--change='.length); continue; }
|
|
486
|
+
if (arg.startsWith('--change-id=')) { parsed.changeId = arg.slice('--change-id='.length); continue; }
|
|
487
|
+
if (arg === '--change-key') { parsed.changeKey = args[++i]; continue; }
|
|
488
|
+
if (arg.startsWith('--change-key=')) { parsed.changeKey = arg.slice('--change-key='.length); continue; }
|
|
489
|
+
if (allowQueryFlags && arg === '--compact') { parsed.compact = true; continue; }
|
|
490
|
+
if (allowQueryFlags && arg === '--data-only') { parsed.dataOnly = true; continue; }
|
|
491
|
+
if (allowQueryFlags && arg === '--no-trace') { parsed.noTrace = true; continue; }
|
|
489
492
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
continue;
|
|
493
|
-
}
|
|
493
|
+
parsed.rest.push(arg);
|
|
494
|
+
}
|
|
494
495
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
continue;
|
|
498
|
-
}
|
|
496
|
+
return parsed;
|
|
497
|
+
}
|
|
499
498
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
continue;
|
|
503
|
-
}
|
|
499
|
+
function formatQueryResult(result, options) {
|
|
500
|
+
let output = result;
|
|
504
501
|
|
|
505
|
-
|
|
502
|
+
if (options.dataOnly && result.ok) {
|
|
503
|
+
output = result.data;
|
|
504
|
+
} else if (options.noTrace && output && typeof output === 'object') {
|
|
505
|
+
const { trace, ...withoutTrace } = output;
|
|
506
|
+
output = withoutTrace;
|
|
506
507
|
}
|
|
507
508
|
|
|
508
|
-
return
|
|
509
|
+
return options.compact
|
|
510
|
+
? JSON.stringify(output)
|
|
511
|
+
: JSON.stringify(output, null, 2);
|
|
509
512
|
}
|
|
510
513
|
|
|
511
514
|
async function runQueryCommand(args) {
|
|
@@ -521,7 +524,7 @@ async function runQueryCommand(args) {
|
|
|
521
524
|
return 0;
|
|
522
525
|
}
|
|
523
526
|
|
|
524
|
-
const options =
|
|
527
|
+
const options = parseChangeScopedArgs(rest, { allowQueryFlags: true });
|
|
525
528
|
if (!options.changeId) {
|
|
526
529
|
console.error('Query --change is required.');
|
|
527
530
|
return 3;
|
|
@@ -533,10 +536,256 @@ async function runQueryCommand(args) {
|
|
|
533
536
|
changeKey: options.changeKey
|
|
534
537
|
});
|
|
535
538
|
|
|
536
|
-
process.stdout.write(`${
|
|
539
|
+
process.stdout.write(`${formatQueryResult(result, options)}\n`);
|
|
537
540
|
return result.ok ? 0 : 2;
|
|
538
541
|
}
|
|
539
542
|
|
|
543
|
+
async function runTaskContractCommand(args) {
|
|
544
|
+
const [subcommand, ...rest] = args;
|
|
545
|
+
|
|
546
|
+
if (!subcommand || subcommand === '--help' || subcommand === '-h') {
|
|
547
|
+
console.error('Use: cc-devflow task-contract <compile|validate|migrate> --change <changeId> [--change-key <key>] [--cwd <path>] [--fold-design] [--fold-analysis]');
|
|
548
|
+
return 3;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const options = parseChangeScopedArgs(rest);
|
|
552
|
+
if (!options.changeId) {
|
|
553
|
+
console.error('task-contract --change is required.');
|
|
554
|
+
return 3;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
if (subcommand === 'compile' || subcommand === 'validate' || subcommand === 'migrate') {
|
|
558
|
+
const {
|
|
559
|
+
runCompile,
|
|
560
|
+
runValidate,
|
|
561
|
+
runMigrate
|
|
562
|
+
} = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/task-contract.js'));
|
|
563
|
+
const runners = {
|
|
564
|
+
compile: runCompile,
|
|
565
|
+
validate: runValidate,
|
|
566
|
+
migrate: runMigrate
|
|
567
|
+
};
|
|
568
|
+
const runner = runners[subcommand];
|
|
569
|
+
const result = await runner({
|
|
570
|
+
repoRoot: path.resolve(options.cwd || process.cwd()),
|
|
571
|
+
changeId: options.changeId,
|
|
572
|
+
changeKey: options.changeKey,
|
|
573
|
+
foldDesign: options.rest.includes('--fold-design'),
|
|
574
|
+
foldAnalysis: options.rest.includes('--fold-analysis')
|
|
575
|
+
});
|
|
576
|
+
if (result.code !== 0) {
|
|
577
|
+
console.error(result.stderr || result.error || `task-contract ${subcommand} failed`);
|
|
578
|
+
return result.code;
|
|
579
|
+
}
|
|
580
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
581
|
+
return result.code;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
console.error(`Unknown task-contract command: ${subcommand}`);
|
|
585
|
+
return 3;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function parseReviewStartArgs(args) {
|
|
589
|
+
const scoped = parseChangeScopedArgs(args);
|
|
590
|
+
const parsed = {
|
|
591
|
+
...scoped,
|
|
592
|
+
mode: 'implementation',
|
|
593
|
+
scope: 'current-diff',
|
|
594
|
+
baseSha: 'unknown',
|
|
595
|
+
headSha: 'unknown',
|
|
596
|
+
selectedNodes: [],
|
|
597
|
+
skippedNodes: [],
|
|
598
|
+
riskLanes: []
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
for (let i = 0; i < scoped.rest.length; i++) {
|
|
602
|
+
const arg = scoped.rest[i];
|
|
603
|
+
if (arg === '--mode') { parsed.mode = scoped.rest[++i]; continue; }
|
|
604
|
+
if (arg.startsWith('--mode=')) { parsed.mode = arg.slice('--mode='.length); continue; }
|
|
605
|
+
if (arg === '--scope') { parsed.scope = scoped.rest[++i]; continue; }
|
|
606
|
+
if (arg.startsWith('--scope=')) { parsed.scope = arg.slice('--scope='.length); continue; }
|
|
607
|
+
if (arg === '--base-sha') { parsed.baseSha = scoped.rest[++i]; continue; }
|
|
608
|
+
if (arg.startsWith('--base-sha=')) { parsed.baseSha = arg.slice('--base-sha='.length); continue; }
|
|
609
|
+
if (arg === '--head-sha') { parsed.headSha = scoped.rest[++i]; continue; }
|
|
610
|
+
if (arg.startsWith('--head-sha=')) { parsed.headSha = arg.slice('--head-sha='.length); continue; }
|
|
611
|
+
if (arg === '--selected-node') { parsed.selectedNodes.push(scoped.rest[++i]); continue; }
|
|
612
|
+
if (arg.startsWith('--selected-node=')) { parsed.selectedNodes.push(arg.slice('--selected-node='.length)); continue; }
|
|
613
|
+
if (arg === '--skipped-node') { parsed.skippedNodes.push(scoped.rest[++i]); continue; }
|
|
614
|
+
if (arg.startsWith('--skipped-node=')) { parsed.skippedNodes.push(arg.slice('--skipped-node='.length)); continue; }
|
|
615
|
+
if (arg === '--risk-lane') { parsed.riskLanes.push(scoped.rest[++i]); continue; }
|
|
616
|
+
if (arg.startsWith('--risk-lane=')) { parsed.riskLanes.push(arg.slice('--risk-lane='.length)); continue; }
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
return parsed;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
function parseReviewEventArgs(args) {
|
|
623
|
+
const scoped = parseChangeScopedArgs(args);
|
|
624
|
+
const parsed = {
|
|
625
|
+
...scoped,
|
|
626
|
+
reviewId: null,
|
|
627
|
+
nodeId: null,
|
|
628
|
+
mode: 'implementation',
|
|
629
|
+
target: null,
|
|
630
|
+
status: null,
|
|
631
|
+
coverage: [],
|
|
632
|
+
evidenceRefs: [],
|
|
633
|
+
findings: [],
|
|
634
|
+
next: null,
|
|
635
|
+
findingId: null,
|
|
636
|
+
severity: null,
|
|
637
|
+
confidence: null,
|
|
638
|
+
displayTier: null,
|
|
639
|
+
fingerprint: null,
|
|
640
|
+
scope: null,
|
|
641
|
+
path: null,
|
|
642
|
+
evidence: null,
|
|
643
|
+
recommendation: null,
|
|
644
|
+
route: null,
|
|
645
|
+
blockingCount: null,
|
|
646
|
+
warningCount: null,
|
|
647
|
+
output: null
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
for (let i = 0; i < scoped.rest.length; i++) {
|
|
651
|
+
const arg = scoped.rest[i];
|
|
652
|
+
if (arg === '--review-id') { parsed.reviewId = scoped.rest[++i]; continue; }
|
|
653
|
+
if (arg.startsWith('--review-id=')) { parsed.reviewId = arg.slice('--review-id='.length); continue; }
|
|
654
|
+
if (arg === '--node-id') { parsed.nodeId = scoped.rest[++i]; continue; }
|
|
655
|
+
if (arg.startsWith('--node-id=')) { parsed.nodeId = arg.slice('--node-id='.length); continue; }
|
|
656
|
+
if (arg === '--mode') { parsed.mode = scoped.rest[++i]; continue; }
|
|
657
|
+
if (arg.startsWith('--mode=')) { parsed.mode = arg.slice('--mode='.length); continue; }
|
|
658
|
+
if (arg === '--target') { parsed.target = scoped.rest[++i]; continue; }
|
|
659
|
+
if (arg.startsWith('--target=')) { parsed.target = arg.slice('--target='.length); continue; }
|
|
660
|
+
if (arg === '--status') { parsed.status = scoped.rest[++i]; continue; }
|
|
661
|
+
if (arg.startsWith('--status=')) { parsed.status = arg.slice('--status='.length); continue; }
|
|
662
|
+
if (arg === '--coverage') { parsed.coverage.push(scoped.rest[++i]); continue; }
|
|
663
|
+
if (arg.startsWith('--coverage=')) { parsed.coverage.push(arg.slice('--coverage='.length)); continue; }
|
|
664
|
+
if (arg === '--evidence-ref') { parsed.evidenceRefs.push(scoped.rest[++i]); continue; }
|
|
665
|
+
if (arg.startsWith('--evidence-ref=')) { parsed.evidenceRefs.push(arg.slice('--evidence-ref='.length)); continue; }
|
|
666
|
+
if (arg === '--finding') { parsed.findings.push(scoped.rest[++i]); continue; }
|
|
667
|
+
if (arg.startsWith('--finding=')) { parsed.findings.push(arg.slice('--finding='.length)); continue; }
|
|
668
|
+
if (arg === '--next') { parsed.next = scoped.rest[++i]; continue; }
|
|
669
|
+
if (arg.startsWith('--next=')) { parsed.next = arg.slice('--next='.length); continue; }
|
|
670
|
+
if (arg === '--finding-id') { parsed.findingId = scoped.rest[++i]; continue; }
|
|
671
|
+
if (arg.startsWith('--finding-id=')) { parsed.findingId = arg.slice('--finding-id='.length); continue; }
|
|
672
|
+
if (arg === '--severity') { parsed.severity = scoped.rest[++i]; continue; }
|
|
673
|
+
if (arg.startsWith('--severity=')) { parsed.severity = arg.slice('--severity='.length); continue; }
|
|
674
|
+
if (arg === '--confidence') { parsed.confidence = scoped.rest[++i]; continue; }
|
|
675
|
+
if (arg.startsWith('--confidence=')) { parsed.confidence = arg.slice('--confidence='.length); continue; }
|
|
676
|
+
if (arg === '--display-tier') { parsed.displayTier = scoped.rest[++i]; continue; }
|
|
677
|
+
if (arg.startsWith('--display-tier=')) { parsed.displayTier = arg.slice('--display-tier='.length); continue; }
|
|
678
|
+
if (arg === '--fingerprint') { parsed.fingerprint = scoped.rest[++i]; continue; }
|
|
679
|
+
if (arg.startsWith('--fingerprint=')) { parsed.fingerprint = arg.slice('--fingerprint='.length); continue; }
|
|
680
|
+
if (arg === '--scope') { parsed.scope = scoped.rest[++i]; continue; }
|
|
681
|
+
if (arg.startsWith('--scope=')) { parsed.scope = arg.slice('--scope='.length); continue; }
|
|
682
|
+
if (arg === '--path') { parsed.path = scoped.rest[++i]; continue; }
|
|
683
|
+
if (arg.startsWith('--path=')) { parsed.path = arg.slice('--path='.length); continue; }
|
|
684
|
+
if (arg === '--evidence') { parsed.evidence = scoped.rest[++i]; continue; }
|
|
685
|
+
if (arg.startsWith('--evidence=')) { parsed.evidence = arg.slice('--evidence='.length); continue; }
|
|
686
|
+
if (arg === '--recommendation') { parsed.recommendation = scoped.rest[++i]; continue; }
|
|
687
|
+
if (arg.startsWith('--recommendation=')) { parsed.recommendation = arg.slice('--recommendation='.length); continue; }
|
|
688
|
+
if (arg === '--route') { parsed.route = scoped.rest[++i]; continue; }
|
|
689
|
+
if (arg.startsWith('--route=')) { parsed.route = arg.slice('--route='.length); continue; }
|
|
690
|
+
if (arg === '--blocking-count') { parsed.blockingCount = scoped.rest[++i]; continue; }
|
|
691
|
+
if (arg.startsWith('--blocking-count=')) { parsed.blockingCount = arg.slice('--blocking-count='.length); continue; }
|
|
692
|
+
if (arg === '--warning-count') { parsed.warningCount = scoped.rest[++i]; continue; }
|
|
693
|
+
if (arg.startsWith('--warning-count=')) { parsed.warningCount = arg.slice('--warning-count='.length); continue; }
|
|
694
|
+
if (arg === '--output') { parsed.output = scoped.rest[++i]; continue; }
|
|
695
|
+
if (arg.startsWith('--output=')) { parsed.output = arg.slice('--output='.length); continue; }
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return parsed;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
async function runReviewCommand(args) {
|
|
702
|
+
const [subcommand, ...rest] = args;
|
|
703
|
+
|
|
704
|
+
if (!subcommand || subcommand === '--help' || subcommand === '-h') {
|
|
705
|
+
console.error('Use: cc-devflow review start --change <changeId> [--change-key <key>] [--cwd <path>]');
|
|
706
|
+
return 3;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
const reviewRunners = {
|
|
710
|
+
start: null,
|
|
711
|
+
'record-node': 'runReviewRecordNode',
|
|
712
|
+
'add-finding': 'runReviewAddFinding',
|
|
713
|
+
close: 'runReviewClose',
|
|
714
|
+
render: 'runReviewRender'
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
if (subcommand === 'start') {
|
|
718
|
+
const options = parseReviewStartArgs(rest);
|
|
719
|
+
if (!options.changeId) {
|
|
720
|
+
console.error('review start --change is required.');
|
|
721
|
+
return 3;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
const { runReviewStart } = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/review-records.js'));
|
|
725
|
+
const result = await runReviewStart({
|
|
726
|
+
repoRoot: path.resolve(options.cwd || process.cwd()),
|
|
727
|
+
changeId: options.changeId,
|
|
728
|
+
changeKey: options.changeKey,
|
|
729
|
+
mode: options.mode,
|
|
730
|
+
scope: options.scope,
|
|
731
|
+
baseSha: options.baseSha,
|
|
732
|
+
headSha: options.headSha,
|
|
733
|
+
selectedNodes: options.selectedNodes,
|
|
734
|
+
skippedNodes: options.skippedNodes,
|
|
735
|
+
riskLanes: options.riskLanes
|
|
736
|
+
});
|
|
737
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
738
|
+
return result.code;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (reviewRunners[subcommand]) {
|
|
742
|
+
const options = parseReviewEventArgs(rest);
|
|
743
|
+
if (!options.changeId) {
|
|
744
|
+
console.error(`review ${subcommand} --change is required.`);
|
|
745
|
+
return 3;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
const runnerName = reviewRunners[subcommand];
|
|
749
|
+
const runners = require(path.join(PACKAGE_ROOT, 'lib/skill-runtime/operations/review-records.js'));
|
|
750
|
+
const result = await runners[runnerName]({
|
|
751
|
+
repoRoot: path.resolve(options.cwd || process.cwd()),
|
|
752
|
+
changeId: options.changeId,
|
|
753
|
+
changeKey: options.changeKey,
|
|
754
|
+
reviewId: options.reviewId,
|
|
755
|
+
nodeId: options.nodeId,
|
|
756
|
+
mode: options.mode,
|
|
757
|
+
target: options.target,
|
|
758
|
+
status: options.status,
|
|
759
|
+
coverage: options.coverage,
|
|
760
|
+
evidenceRefs: options.evidenceRefs,
|
|
761
|
+
findings: options.findings,
|
|
762
|
+
next: options.next,
|
|
763
|
+
findingId: options.findingId,
|
|
764
|
+
severity: options.severity,
|
|
765
|
+
confidence: options.confidence,
|
|
766
|
+
displayTier: options.displayTier,
|
|
767
|
+
fingerprint: options.fingerprint,
|
|
768
|
+
scope: options.scope,
|
|
769
|
+
path: options.path,
|
|
770
|
+
evidence: options.evidence,
|
|
771
|
+
recommendation: options.recommendation,
|
|
772
|
+
route: options.route,
|
|
773
|
+
blockingCount: options.blockingCount,
|
|
774
|
+
warningCount: options.warningCount,
|
|
775
|
+
output: options.output
|
|
776
|
+
});
|
|
777
|
+
if (result.code !== 0) {
|
|
778
|
+
console.error(result.stderr || result.error || `review ${subcommand} failed`);
|
|
779
|
+
return result.code;
|
|
780
|
+
}
|
|
781
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
782
|
+
return result.code;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
console.error(`Unknown review command: ${subcommand}`);
|
|
786
|
+
return 3;
|
|
787
|
+
}
|
|
788
|
+
|
|
540
789
|
function runNextChangeKey(args) {
|
|
541
790
|
const parsed = { prefix: null, description: null, cwd: null };
|
|
542
791
|
|
|
@@ -699,6 +948,14 @@ async function main() {
|
|
|
699
948
|
return runQueryCommand(rest);
|
|
700
949
|
}
|
|
701
950
|
|
|
951
|
+
if (command === 'task-contract') {
|
|
952
|
+
return runTaskContractCommand(rest);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
if (command === 'review') {
|
|
956
|
+
return runReviewCommand(rest);
|
|
957
|
+
}
|
|
958
|
+
|
|
702
959
|
if (command === 'next-change-key') {
|
|
703
960
|
return runNextChangeKey(rest);
|
|
704
961
|
}
|
|
@@ -67,8 +67,8 @@ Use this when the only thing you know is the file in front of you.
|
|
|
67
67
|
| `roadmap.json` | `cc-roadmap` editable machine truth source | [pdca-loop/roadmap.json](./pdca-loop/roadmap.json) |
|
|
68
68
|
| `ROADMAP.md` | `cc-roadmap` generated human view | [pdca-loop/ROADMAP.md](./pdca-loop/ROADMAP.md) |
|
|
69
69
|
| `BACKLOG.md` | deprecated `cc-roadmap` -> `cc-plan` projection | [pdca-loop/BACKLOG.md](./pdca-loop/BACKLOG.md) |
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
70
|
+
| `tasks.md` | `cc-plan`, `cc-investigate`, or `cc-do` | [pdca-loop/tasks.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md) |
|
|
71
|
+
| `design.md` | legacy `cc-plan` fallback | [pdca-loop/design.md](./pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md) or [full-design-blocked/design.md](./full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md) |
|
|
72
72
|
| `task-manifest.json` | `cc-do` | [pdca-loop/task-manifest.json](./pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json) |
|
|
73
73
|
| `report-card.json` | `cc-check` | [pdca-loop/report-card.json](./pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json), [full-design-blocked/report-card.json](./full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json), or [local-handoff/report-card.json](./local-handoff/changes/REQ-003-audit-log-export/review/report-card.json) |
|
|
74
74
|
| `pr-brief.md` | `cc-act` | [pdca-loop/pr-brief.md](./pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md) |
|
|
@@ -127,7 +127,7 @@ If both are true, you are usually in `cc-act` local handoff territory, not back
|
|
|
127
127
|
If you only have one minute, open these files in order:
|
|
128
128
|
|
|
129
129
|
1. example `README.md`
|
|
130
|
-
2. change `planning/
|
|
130
|
+
2. change `planning/tasks.md`
|
|
131
131
|
3. `report-card.json` or the single final handoff file
|
|
132
132
|
|
|
133
133
|
That should already tell you:
|
|
@@ -140,7 +140,8 @@ That should already tell you:
|
|
|
140
140
|
|
|
141
141
|
`devflow/changes/<change>/` should stay lean.
|
|
142
142
|
|
|
143
|
-
- Durable truth only: `change-
|
|
143
|
+
- Durable truth only: `change-meta.json`, `planning/tasks.md`, CLI-generated `task-manifest.json`, review ledger/findings records, optional CLI logs for debug/failure, `report-card.json`, and one final handoff file. Do not generate task `context.md`, `checkpoint.json`, or AI-written process files.
|
|
144
|
+
- Legacy `planning/design.md`, `planning/analysis.md`, and `cc-review-*.md` are readable fallback inputs for older examples, not new default writes.
|
|
144
145
|
- Runtime scratch belongs in `devflow/workspaces/<change>/`, not beside the durable record.
|
|
145
146
|
|
|
146
147
|
## If You Still Want The Split Views
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"updatedAt": "2026-05-
|
|
2
|
+
"updatedAt": "2026-05-13",
|
|
3
3
|
"skills": {
|
|
4
|
-
"cc-roadmap": "5.
|
|
5
|
-
"cc-next": "1.0.
|
|
6
|
-
"cc-dev": "1.0.
|
|
7
|
-
"cc-plan": "3.
|
|
8
|
-
"cc-investigate": "1.
|
|
9
|
-
"cc-do": "1.6.
|
|
10
|
-
"cc-review": "
|
|
4
|
+
"cc-roadmap": "5.3.0",
|
|
5
|
+
"cc-next": "1.0.1",
|
|
6
|
+
"cc-dev": "1.0.1",
|
|
7
|
+
"cc-plan": "3.9.0",
|
|
8
|
+
"cc-investigate": "1.5.0",
|
|
9
|
+
"cc-do": "1.6.7",
|
|
10
|
+
"cc-review": "2.0.0",
|
|
11
11
|
"cc-pr-review": "1.0.0",
|
|
12
12
|
"cc-pr-land": "1.0.0",
|
|
13
|
-
"cc-check": "1.
|
|
14
|
-
"cc-act": "1.8.
|
|
13
|
+
"cc-check": "1.11.1",
|
|
14
|
+
"cc-act": "1.8.8",
|
|
15
15
|
"cc-spec-init": "1.1.0"
|
|
16
16
|
},
|
|
17
17
|
"examples": [
|
|
@@ -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.
|
|
7
|
+
- Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.9.0`, `cc-do@1.6.7`, `cc-check@1.11.1`
|
|
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
|
|
|
@@ -43,8 +43,8 @@ The sample shows what happens when implementation moved before the integration d
|
|
|
43
43
|
- `roadmap.json` (editable roadmap truth)
|
|
44
44
|
- `ROADMAP.md` (generated view)
|
|
45
45
|
- `BACKLOG.md` (deprecated projection)
|
|
46
|
-
- `changes/REQ-002-bulk-invite-import/planning/design.md`
|
|
47
46
|
- `changes/REQ-002-bulk-invite-import/planning/tasks.md`
|
|
47
|
+
- `changes/REQ-002-bulk-invite-import/planning/design.md` (legacy fallback sample)
|
|
48
48
|
- `changes/REQ-002-bulk-invite-import/planning/task-manifest.json`
|
|
49
49
|
- `changes/REQ-002-bulk-invite-import/review/report-card.json`
|
|
50
50
|
|
package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
- Requirement version: `REQ-002.v2`
|
|
6
6
|
- Design version: `design.v2`
|
|
7
|
-
- CC-Plan skill version: `3.
|
|
7
|
+
- CC-Plan skill version: `3.9.0`
|
|
8
|
+
- Work branch: `REQ/002-bulk-invite-import`
|
|
8
9
|
- Requirement ID: `REQ-002`
|
|
9
10
|
- Design mode: `full-design`
|
|
10
11
|
- Why not `tiny-design`: the feature crosses import parsing, invite rules, billing limits, duplicate handling, and audit logging
|