cc-devflow 4.5.9 → 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 +6 -0
- package/.claude/skills/cc-act/SKILL.md +12 -10
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +1 -1
- package/.claude/skills/cc-act/references/closure-contract.md +1 -1
- package/.claude/skills/cc-act/references/git-commit-guidelines.md +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 +12 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +7 -7
- package/.claude/skills/cc-do/SKILL.md +35 -37
- package/.claude/skills/cc-do/references/execution-recovery.md +18 -13
- package/.claude/skills/cc-do/scripts/build-task-context.sh +4 -17
- 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 +17 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +6 -5
- package/.claude/skills/cc-investigate/SKILL.md +56 -44
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +48 -5
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +4 -3
- package/.claude/skills/cc-investigate/assets/{ANALYSIS_TEMPLATE.md → legacy/ANALYSIS_TEMPLATE.md} +1 -0
- package/.claude/skills/cc-investigate/references/investigation-contract.md +2 -2
- package/.claude/skills/cc-investigate/scripts/bootstrap-analysis.sh +1 -1
- package/.claude/skills/cc-plan/CHANGELOG.md +19 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +55 -53
- package/.claude/skills/cc-plan/SKILL.md +101 -85
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +47 -14
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +4 -2
- package/.claude/skills/cc-plan/assets/{DESIGN_TEMPLATE.md → legacy/DESIGN_TEMPLATE.md} +1 -0
- package/.claude/skills/cc-plan/assets/{TINY_DESIGN_TEMPLATE.md → legacy/TINY_DESIGN_TEMPLATE.md} +1 -1
- package/.claude/skills/cc-plan/references/planning-contract.md +11 -10
- 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/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +40 -4
- package/CONTRIBUTING.zh-CN.md +40 -4
- package/README.md +20 -8
- package/README.zh-CN.md +20 -8
- package/bin/cc-devflow-cli.js +293 -36
- package/docs/examples/START-HERE.md +5 -4
- package/docs/examples/example-bindings.json +8 -8
- package/docs/examples/full-design-blocked/README.md +2 -2
- 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 +3 -2
- 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/local-handoff/README.md +2 -2
- 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 +3 -2
- 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/pdca-loop/README.md +2 -2
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +2 -2
- 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 +2 -1
- 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/scripts/check-example-bindings.sh +2 -0
- package/docs/get-shit-done-strategy-audit.md +22 -22
- package/docs/guides/artifact-contract.md +1 -1
- 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/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 +61 -0
- 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 +43 -0
- 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 +24 -11
- package/lib/skill-runtime/query-registry.js +2 -2
- package/lib/skill-runtime/query.js +15 -2
- package/lib/skill-runtime/review-records.js +123 -0
- package/lib/skill-runtime/review.js +246 -11
- package/lib/skill-runtime/schemas.js +174 -12
- 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
4
|
"cc-roadmap": "5.3.0",
|
|
5
5
|
"cc-next": "1.0.1",
|
|
6
|
-
"cc-dev": "1.0.
|
|
7
|
-
"cc-plan": "3.
|
|
8
|
-
"cc-investigate": "1.
|
|
9
|
-
"cc-do": "1.6.
|
|
10
|
-
"cc-review": "
|
|
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.3.0`, `cc-plan@3.
|
|
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
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
"requirementId": "REQ-002",
|
|
7
7
|
"requirementVersion": "REQ-002.v2",
|
|
8
8
|
"planningMeta": {
|
|
9
|
-
"reqPlanSkillVersion": "3.
|
|
9
|
+
"reqPlanSkillVersion": "3.9.0",
|
|
10
10
|
"designVersion": "design.v2",
|
|
11
|
+
"workBranch": "REQ/002-bulk-invite-import",
|
|
11
12
|
"approvedAt": null,
|
|
12
13
|
"basedOnOption": "Option B",
|
|
13
14
|
"aiLeverageDecisionLens": {
|
|
@@ -236,7 +237,7 @@
|
|
|
236
237
|
],
|
|
237
238
|
"evidence": [
|
|
238
239
|
"passing test output",
|
|
239
|
-
"
|
|
240
|
+
"CLI log summary"
|
|
240
241
|
],
|
|
241
242
|
"context": {
|
|
242
243
|
"readFiles": [
|
package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.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
|
- Source roadmap item: `RM-010`
|
|
9
10
|
- Source roadmap version: `roadmap.v2`
|
|
10
11
|
|
|
@@ -42,12 +43,14 @@
|
|
|
42
43
|
ClaudeCode / Codex 执行本计划时,必须把本文件当成任务模板合同,而不是普通 TODO 列表。
|
|
43
44
|
|
|
44
45
|
- Template source: `assets/TASKS_TEMPLATE.md`
|
|
46
|
+
- Context index first: run `cc-devflow query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compact` before opening deep sections; use `packetOnly` plus `mustNotForget` first, verify `sourceHashes`, open `defaultOpen` refs only when needed, and reserve `deepOpen` for matching `openWhen.conditions`.
|
|
45
47
|
- Task selection: read `planning/task-manifest.json.currentTaskId`; if empty, run the ready-task selector before choosing work.
|
|
46
48
|
- Task block rule: read the full task block before coding; title-only execution is invalid.
|
|
47
49
|
- Completion rule: after verification and review gates pass, run the completion script; do not manually edit checkbox, status, or `currentTaskId`.
|
|
48
|
-
- Completion failure: if the script fails, fix the missing
|
|
50
|
+
- Completion failure: if the script fails, fix the missing review / dependency evidence and rerun it. Do not bypass it by editing JSON or Markdown.
|
|
49
51
|
|
|
50
52
|
```bash
|
|
53
|
+
cc-devflow query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compact
|
|
51
54
|
SCRIPT_ROOT=".claude/skills/cc-do/scripts"
|
|
52
55
|
if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then
|
|
53
56
|
SCRIPT_ROOT=".codex/skills/cc-do/scripts"
|
|
@@ -65,7 +68,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
65
68
|
Read first: `design.md`, `src/invite/bulk-import.ts`
|
|
66
69
|
Verification: `npm test -- src/invite/bulk-import.test.ts`
|
|
67
70
|
Evidence: failing output
|
|
68
|
-
Completion: after verification evidence and required
|
|
71
|
+
Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T001`; do not hand-edit status.
|
|
69
72
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
70
73
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
71
74
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -77,8 +80,8 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
77
80
|
Files: `src/invite/bulk-import.ts`
|
|
78
81
|
Read first: `design.md`, `src/invite/bulk-import.test.ts`
|
|
79
82
|
Verification: `npm test -- src/invite/bulk-import.test.ts`
|
|
80
|
-
Evidence: passing output +
|
|
81
|
-
Completion: after verification evidence and required
|
|
83
|
+
Evidence: passing output + Git diff
|
|
84
|
+
Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T002`; do not hand-edit status.
|
|
82
85
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
83
86
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
84
87
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -93,7 +96,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
93
96
|
Read first: `design.md`, `src/admin/BulkInvitePanel.tsx`
|
|
94
97
|
Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
95
98
|
Evidence: failing output
|
|
96
|
-
Completion: after verification evidence and required
|
|
99
|
+
Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T003`; do not hand-edit status.
|
|
97
100
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
98
101
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
99
102
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -106,7 +109,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
106
109
|
Read first: `design.md`, `src/admin/BulkInvitePanel.test.tsx`
|
|
107
110
|
Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
108
111
|
Evidence: passing output + review notes
|
|
109
|
-
Completion: after verification evidence and required
|
|
112
|
+
Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T004`; do not hand-edit status.
|
|
110
113
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
111
114
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
112
115
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -123,7 +126,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
123
126
|
- `npm test -- src/invite/bulk-import.test.ts`
|
|
124
127
|
- `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
125
128
|
Evidence: passing output + review notes
|
|
126
|
-
Completion: after verification evidence and required
|
|
129
|
+
Completion: after verification evidence and required review records exist, run `SCRIPT_ROOT=".claude/skills/cc-do/scripts"; if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then SCRIPT_ROOT=".codex/skills/cc-do/scripts"; fi; bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md --task T005`; do not hand-edit status.
|
|
127
130
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
128
131
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
129
132
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
{
|
|
32
32
|
"claim": "requirements-met",
|
|
33
33
|
"requiredProof": "line-by-line planning/tasks.md and task-manifest.json checklist",
|
|
34
|
-
"commandOrArtifact": "planning/
|
|
34
|
+
"commandOrArtifact": "planning/tasks.md#Contract Summary + planning/task-manifest.json",
|
|
35
35
|
"exitStatus": null,
|
|
36
36
|
"keyObservation": "duplicate-email and seat-limit semantics are still underspecified",
|
|
37
37
|
"status": "blocked"
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"reviewPacket": {
|
|
130
130
|
"baseSha": "example-base",
|
|
131
131
|
"headSha": "example-head",
|
|
132
|
-
"requirements": "planning/
|
|
132
|
+
"requirements": "planning/tasks.md#Contract Summary",
|
|
133
133
|
"implemented": "bulk invite import implementation",
|
|
134
134
|
"reviewerContext": "requirement diff, plan completion, scope drift, docs staleness"
|
|
135
135
|
},
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"confidence": "high",
|
|
141
141
|
"source": "diff-review",
|
|
142
142
|
"summary": "duplicate-email behavior is still underspecified",
|
|
143
|
-
"evidence": "planning/
|
|
143
|
+
"evidence": "planning/tasks.md#Contract Summary does not freeze row-level duplicate semantics",
|
|
144
144
|
"action": "reroute-cc-plan",
|
|
145
145
|
"triageStatus": "clarification-needed",
|
|
146
146
|
"confidenceScore": 9,
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"confidence": "high",
|
|
154
154
|
"source": "diff-review",
|
|
155
155
|
"summary": "seat-limit partial-failure semantics are not frozen in design.md",
|
|
156
|
-
"evidence": "planning/
|
|
156
|
+
"evidence": "planning/tasks.md#Contract Summary lacks accepted row-outcome matrix",
|
|
157
157
|
"action": "reroute-cc-plan",
|
|
158
158
|
"triageStatus": "clarification-needed",
|
|
159
159
|
"confidenceScore": 9,
|
|
@@ -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.0`, `cc-plan@3.
|
|
7
|
+
- Bound skills: `cc-roadmap@5.3.0`, `cc-plan@3.9.0`, `cc-do@1.6.7`, `cc-check@1.11.1`, `cc-act@1.8.8`
|
|
8
8
|
|
|
9
9
|
This example shows verified work that is **ready to move forward**, but `cc-act` still chooses `local-handoff`.
|
|
10
10
|
|
|
@@ -39,8 +39,8 @@ But the current environment is local-only:
|
|
|
39
39
|
- `roadmap.json` (editable roadmap truth)
|
|
40
40
|
- `ROADMAP.md` (generated view)
|
|
41
41
|
- `BACKLOG.md` (deprecated projection)
|
|
42
|
-
- `changes/REQ-003-audit-log-export/planning/design.md`
|
|
43
42
|
- `changes/REQ-003-audit-log-export/planning/tasks.md`
|
|
43
|
+
- `changes/REQ-003-audit-log-export/planning/design.md` (legacy fallback sample)
|
|
44
44
|
- `changes/REQ-003-audit-log-export/planning/task-manifest.json`
|
|
45
45
|
- `changes/REQ-003-audit-log-export/review/report-card.json`
|
|
46
46
|
- `changes/REQ-003-audit-log-export/handoff/resume-index.md`
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
- Requirement version: `REQ-003.v1`
|
|
6
6
|
- Design version: `design.v1`
|
|
7
|
-
- CC-Plan skill version: `3.
|
|
7
|
+
- CC-Plan skill version: `3.9.0`
|
|
8
|
+
- Work branch: `REQ/003-audit-log-export`
|
|
8
9
|
- Requirement ID: `REQ-003`
|
|
9
10
|
- Design mode: `tiny-design`
|
|
10
11
|
- Why this stays `tiny-design`: the patch adds one export action inside the existing admin audit UI without changing data contracts
|