cc-devflow 4.5.10 → 4.5.12
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 +23 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +17 -269
- package/.claude/skills/cc-act/SKILL.md +38 -418
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +2 -13
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +1 -9
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +21 -177
- package/.claude/skills/cc-act/references/closure-contract.md +12 -63
- package/.claude/skills/cc-act/references/git-commit-guidelines.md +5 -5
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +5 -322
- package/.claude/skills/cc-act/scripts/detect-ship-target.sh +11 -2
- package/.claude/skills/cc-act/scripts/inspect-git-index.sh +58 -0
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +40 -440
- package/.claude/skills/cc-act/scripts/verify-act-gate.sh +10 -50
- package/.claude/skills/cc-check/CHANGELOG.md +24 -0
- package/.claude/skills/cc-check/PLAYBOOK.md +19 -273
- package/.claude/skills/cc-check/SKILL.md +33 -454
- package/.claude/skills/cc-check/references/review-contract.md +12 -147
- package/.claude/skills/cc-dev/CHANGELOG.md +20 -0
- package/.claude/skills/cc-dev/PLAYBOOK.md +1 -1
- package/.claude/skills/cc-dev/SKILL.md +52 -130
- package/.claude/skills/cc-dev/scripts/resolve-cc-devflow.sh +181 -0
- package/.claude/skills/cc-do/CHANGELOG.md +17 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +19 -113
- package/.claude/skills/cc-do/SKILL.md +39 -236
- package/.claude/skills/cc-do/references/execution-recovery.md +15 -109
- package/.claude/skills/cc-do/scripts/cc-do-common.sh +5 -57
- package/.claude/skills/cc-do/scripts/check-task-status.sh +35 -65
- package/.claude/skills/cc-do/scripts/mark-task-complete.sh +9 -46
- package/.claude/skills/cc-do/scripts/select-ready-tasks.sh +29 -97
- package/.claude/skills/cc-investigate/CHANGELOG.md +23 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +20 -180
- package/.claude/skills/cc-investigate/SKILL.md +65 -513
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +48 -95
- package/.claude/skills/cc-investigate/references/investigation-contract.md +14 -217
- package/.claude/skills/cc-next/CHANGELOG.md +6 -0
- package/.claude/skills/cc-next/PLAYBOOK.md +12 -8
- package/.claude/skills/cc-next/SKILL.md +34 -140
- package/.claude/skills/cc-plan/CHANGELOG.md +29 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +22 -161
- package/.claude/skills/cc-plan/SKILL.md +47 -640
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +30 -225
- package/.claude/skills/cc-plan/references/planning-contract.md +24 -160
- package/.claude/skills/cc-plan/scripts/next-change-key.sh +8 -44
- package/.claude/skills/cc-plan/scripts/parse-task-dependencies.js +2 -2
- package/.claude/skills/cc-plan/scripts/validate-scope.sh +1 -1
- package/.claude/skills/cc-pr-land/SKILL.md +14 -114
- package/.claude/skills/cc-pr-review/CHANGELOG.md +4 -0
- package/.claude/skills/cc-pr-review/SKILL.md +20 -103
- package/.claude/skills/cc-review/CHANGELOG.md +17 -0
- package/.claude/skills/cc-review/PLAYBOOK.md +13 -86
- package/.claude/skills/cc-review/SKILL.md +53 -241
- package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +2 -2
- package/.claude/skills/cc-review/references/implementation-review-branch.md +7 -147
- package/.claude/skills/cc-review/references/plan-review-branch.md +5 -147
- package/.claude/skills/cc-review/references/review-methods.md +10 -218
- package/.claude/skills/cc-review/scripts/collect-review-context.sh +4 -63
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +1 -1
- package/.claude/skills/cc-roadmap/SKILL.md +3 -3
- package/.claude/skills/cc-simplify/CHANGELOG.md +7 -0
- package/.claude/skills/cc-simplify/SKILL.md +26 -21
- package/.claude/skills/cc-spec-init/PLAYBOOK.md +12 -48
- package/.claude/skills/cc-spec-init/SKILL.md +29 -132
- package/.claude/skills/cc-spec-init/references/spec-contract.md +8 -17
- package/CHANGELOG.md +27 -0
- package/README.md +5 -3
- package/README.zh-CN.md +5 -3
- package/bin/cc-devflow-cli.js +20 -260
- package/bin/cc-devflow.js +44 -7
- package/docs/commands/README.md +1 -1
- package/docs/commands/README.zh-CN.md +1 -1
- package/docs/examples/README.md +1 -1
- package/docs/examples/START-HERE.md +14 -14
- package/docs/examples/example-bindings.json +11 -11
- package/docs/examples/full-design-blocked/README.md +4 -6
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/{planning/tasks.md → task.md} +20 -15
- package/docs/examples/local-handoff/README.md +8 -11
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/pr-brief.md +31 -0
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/{planning/tasks.md → task.md} +18 -13
- package/docs/examples/pdca-loop/README.md +6 -9
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +9 -11
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/{planning/tasks.md → task.md} +18 -13
- package/docs/examples/scripts/check-example-bindings.sh +11 -62
- package/docs/guides/artifact-contract.md +10 -36
- package/docs/guides/getting-started.md +8 -7
- package/docs/guides/getting-started.zh-CN.md +8 -7
- package/docs/guides/minimize-artifacts.md +16 -116
- package/docs/guides/project-postmortem.md +14 -71
- package/lib/compiler/__tests__/skills-registry.test.js +9 -8
- package/lib/compiler/resource-copier.js +29 -0
- package/lib/skill-runtime/__tests__/archive-change.test.js +2 -2
- package/lib/skill-runtime/__tests__/benchmark-skills.test.js +109 -0
- package/lib/skill-runtime/__tests__/cli-bootstrap.integration.test.js +14 -4
- package/lib/skill-runtime/errors.js +3 -3
- package/lib/skill-runtime/index.js +5 -23
- package/lib/skill-runtime/paths.js +5 -52
- package/lib/skill-runtime/query-registry.js +4 -4
- package/lib/skill-runtime/query.js +89 -201
- package/lib/skill-runtime/store.js +4 -40
- package/lib/skill-runtime/trace.js +2 -2
- package/package.json +5 -7
- package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +0 -29
- package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +0 -54
- package/.claude/skills/cc-act/scripts/generate-status-report.sh +0 -92
- package/.claude/skills/cc-act/scripts/sync-act-docs.sh +0 -355
- package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +0 -234
- package/.claude/skills/cc-check/scripts/render-report-card.js +0 -438
- package/.claude/skills/cc-check/scripts/verify-gate.sh +0 -85
- package/.claude/skills/cc-do/scripts/build-task-context.sh +0 -175
- package/.claude/skills/cc-do/scripts/record-review-decision.sh +0 -88
- package/.claude/skills/cc-do/scripts/recover-workflow.sh +0 -82
- package/.claude/skills/cc-do/scripts/run-problem-analysis.sh +0 -70
- package/.claude/skills/cc-do/scripts/verify-task-gates.sh +0 -109
- package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +0 -92
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +0 -225
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +0 -179
- package/.claude/skills/cc-spec-init/assets/CHANGE_META_TEMPLATE.json +0 -28
- package/.claude/skills/cc-spec-init/scripts/validate-spec-links.sh +0 -45
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +0 -234
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +0 -488
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +0 -189
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/resume-index.md +0 -39
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/handoff/status.md +0 -29
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +0 -123
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +0 -292
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +0 -136
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/status.md +0 -29
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +0 -124
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +0 -292
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +0 -136
- package/docs/get-shit-done-strategy-audit.md +0 -518
- package/docs/skill-runtime-migration.md +0 -46
- package/lib/skill-runtime/__tests__/approve.test.js +0 -92
- package/lib/skill-runtime/__tests__/autopilot.test.js +0 -253
- package/lib/skill-runtime/__tests__/benchmark-artifacts.test.js +0 -165
- package/lib/skill-runtime/__tests__/delegation.test.js +0 -97
- package/lib/skill-runtime/__tests__/dispatch.test.js +0 -237
- package/lib/skill-runtime/__tests__/intent.test.js +0 -203
- package/lib/skill-runtime/__tests__/lifecycle.test.js +0 -169
- package/lib/skill-runtime/__tests__/planner.tdd.test.js +0 -331
- package/lib/skill-runtime/__tests__/prepare-pr.test.js +0 -126
- package/lib/skill-runtime/__tests__/query.test.js +0 -860
- package/lib/skill-runtime/__tests__/readiness.test.js +0 -53
- package/lib/skill-runtime/__tests__/release.test.js +0 -85
- package/lib/skill-runtime/__tests__/review-check-integration.test.js +0 -148
- package/lib/skill-runtime/__tests__/review-records.test.js +0 -619
- package/lib/skill-runtime/__tests__/runtime.integration.test.js +0 -351
- package/lib/skill-runtime/__tests__/schemas.test.js +0 -337
- package/lib/skill-runtime/__tests__/task-contract-migrate.test.js +0 -137
- package/lib/skill-runtime/__tests__/task-contract.test.js +0 -783
- package/lib/skill-runtime/__tests__/team-state.test.js +0 -51
- package/lib/skill-runtime/__tests__/verify-artifacts.test.js +0 -203
- package/lib/skill-runtime/__tests__/worker-run.test.js +0 -275
- package/lib/skill-runtime/__tests__/worker.test.js +0 -56
- package/lib/skill-runtime/__tests__/workflow-context-legacy-fallback.test.js +0 -31
- package/lib/skill-runtime/__tests__/workflow-context.test.js +0 -98
- package/lib/skill-runtime/artifacts.js +0 -88
- package/lib/skill-runtime/context-index.js +0 -545
- package/lib/skill-runtime/delegation.js +0 -533
- package/lib/skill-runtime/intent.js +0 -309
- package/lib/skill-runtime/lifecycle.js +0 -294
- package/lib/skill-runtime/operations/CLAUDE.md +0 -19
- package/lib/skill-runtime/operations/approve.js +0 -81
- package/lib/skill-runtime/operations/autopilot-core.js +0 -337
- package/lib/skill-runtime/operations/autopilot-execution.js +0 -307
- package/lib/skill-runtime/operations/autopilot-shared.js +0 -48
- package/lib/skill-runtime/operations/autopilot.js +0 -163
- package/lib/skill-runtime/operations/dispatch.js +0 -416
- package/lib/skill-runtime/operations/init.js +0 -60
- package/lib/skill-runtime/operations/janitor.js +0 -61
- package/lib/skill-runtime/operations/plan.js +0 -59
- package/lib/skill-runtime/operations/prepare-pr.js +0 -25
- package/lib/skill-runtime/operations/release.js +0 -99
- package/lib/skill-runtime/operations/resume.js +0 -126
- package/lib/skill-runtime/operations/review-records.js +0 -265
- package/lib/skill-runtime/operations/snapshot.js +0 -45
- package/lib/skill-runtime/operations/task-contract.js +0 -524
- package/lib/skill-runtime/operations/verify.js +0 -170
- package/lib/skill-runtime/operations/worker-run.js +0 -531
- package/lib/skill-runtime/operations/worker.js +0 -33
- package/lib/skill-runtime/planner.js +0 -539
- package/lib/skill-runtime/readiness.js +0 -84
- package/lib/skill-runtime/review-records.js +0 -123
- package/lib/skill-runtime/review.js +0 -855
- package/lib/skill-runtime/schemas.js +0 -746
- package/lib/skill-runtime/task-contract.js +0 -187
- package/lib/skill-runtime/team-state.js +0 -122
- package/lib/skill-runtime/workflow-context.js +0 -748
package/bin/cc-devflow-cli.js
CHANGED
|
@@ -60,8 +60,6 @@ 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
|
|
65
63
|
next-change-key Compute the next REQ/FIX change key
|
|
66
64
|
archive-change Archive a completed change to devflow/changes/archive/YYYY-MM/
|
|
67
65
|
restore-change Restore an archived change back to devflow/changes/
|
|
@@ -115,11 +113,7 @@ Examples:
|
|
|
115
113
|
cc-devflow config set output.document_language zh-CN --user
|
|
116
114
|
cc-devflow config resolve --cwd /path/to/project --format policy
|
|
117
115
|
cc-devflow query list
|
|
118
|
-
cc-devflow query ship-readiness --cwd /path/to/project --change REQ-123
|
|
119
116
|
cc-devflow query workflow-context --cwd /path/to/project --change REQ-123 --change-key REQ-123-my-feature --data-only --no-trace --compact
|
|
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
|
|
123
117
|
`);
|
|
124
118
|
}
|
|
125
119
|
|
|
@@ -183,6 +177,9 @@ function copyManagedDirectory(src, dest, options = {}) {
|
|
|
183
177
|
const stats = fs.statSync(src);
|
|
184
178
|
if (stats.isDirectory()) {
|
|
185
179
|
fs.mkdirSync(dest, { recursive: true });
|
|
180
|
+
if (force) {
|
|
181
|
+
pruneManagedDirectory(src, dest);
|
|
182
|
+
}
|
|
186
183
|
const entries = fs.readdirSync(src);
|
|
187
184
|
for (const entry of entries) {
|
|
188
185
|
copyManagedDirectory(path.join(src, entry), path.join(dest, entry), options);
|
|
@@ -212,6 +209,23 @@ function copyManagedDirectory(src, dest, options = {}) {
|
|
|
212
209
|
}
|
|
213
210
|
}
|
|
214
211
|
|
|
212
|
+
function pruneManagedDirectory(src, dest) {
|
|
213
|
+
if (!fs.existsSync(dest) || !fs.statSync(dest).isDirectory()) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const sourceEntries = new Set(fs.readdirSync(src));
|
|
218
|
+
for (const entry of fs.readdirSync(dest)) {
|
|
219
|
+
if (sourceEntries.has(entry)) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const targetPath = path.join(dest, entry);
|
|
224
|
+
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
225
|
+
console.log(`[DELETE] ${path.relative(process.cwd(), targetPath)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
215
229
|
function syncDistributedSkills(targetRoot, options = {}) {
|
|
216
230
|
const { force = false } = options;
|
|
217
231
|
const targetClaudeDir = path.join(targetRoot, '.claude');
|
|
@@ -540,252 +554,6 @@ async function runQueryCommand(args) {
|
|
|
540
554
|
return result.ok ? 0 : 2;
|
|
541
555
|
}
|
|
542
556
|
|
|
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
|
-
|
|
789
557
|
function runNextChangeKey(args) {
|
|
790
558
|
const parsed = { prefix: null, description: null, cwd: null };
|
|
791
559
|
|
|
@@ -948,14 +716,6 @@ async function main() {
|
|
|
948
716
|
return runQueryCommand(rest);
|
|
949
717
|
}
|
|
950
718
|
|
|
951
|
-
if (command === 'task-contract') {
|
|
952
|
-
return runTaskContractCommand(rest);
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
if (command === 'review') {
|
|
956
|
-
return runReviewCommand(rest);
|
|
957
|
-
}
|
|
958
|
-
|
|
959
719
|
if (command === 'next-change-key') {
|
|
960
720
|
return runNextChangeKey(rest);
|
|
961
721
|
}
|
package/bin/cc-devflow.js
CHANGED
|
@@ -1,16 +1,53 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const ClaudeAdapter = require('../lib/adapters/claude-adapter');
|
|
5
|
-
const CodexAdapter = require('../lib/adapters/codex-adapter');
|
|
6
|
-
const { validateConfig, getDefaultConfig } = require('../lib/adapters/config-validator');
|
|
7
|
-
const logger = require('../lib/adapters/logger');
|
|
8
|
-
const fs = require('fs');
|
|
3
|
+
const { spawnSync } = require('child_process');
|
|
9
4
|
const path = require('path');
|
|
10
|
-
|
|
5
|
+
|
|
6
|
+
const CLI_BIN = path.resolve(__dirname, 'cc-devflow-cli.js');
|
|
7
|
+
const CLI_COMMANDS = new Set([
|
|
8
|
+
'help',
|
|
9
|
+
'--help',
|
|
10
|
+
'-h',
|
|
11
|
+
'init',
|
|
12
|
+
'adapt',
|
|
13
|
+
'config',
|
|
14
|
+
'query',
|
|
15
|
+
'next-change-key',
|
|
16
|
+
'archive-change',
|
|
17
|
+
'restore-change',
|
|
18
|
+
'list-archived'
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
function runCli(args) {
|
|
22
|
+
const result = spawnSync(process.execPath, [CLI_BIN, ...args], {
|
|
23
|
+
stdio: 'inherit'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (result.error) {
|
|
27
|
+
console.error(`Failed to run cc-devflow CLI: ${result.error.message}`);
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return typeof result.status === 'number' ? result.status : 1;
|
|
32
|
+
}
|
|
11
33
|
|
|
12
34
|
async function main() {
|
|
13
35
|
try {
|
|
36
|
+
const cliArgs = process.argv.slice(2);
|
|
37
|
+
const cliCommand = cliArgs[0];
|
|
38
|
+
|
|
39
|
+
if (!cliCommand || CLI_COMMANDS.has(cliCommand)) {
|
|
40
|
+
process.exit(runCli(cliArgs));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const AdapterRegistry = require('../lib/adapters/registry');
|
|
44
|
+
const ClaudeAdapter = require('../lib/adapters/claude-adapter');
|
|
45
|
+
const CodexAdapter = require('../lib/adapters/codex-adapter');
|
|
46
|
+
const { validateConfig, getDefaultConfig } = require('../lib/adapters/config-validator');
|
|
47
|
+
const logger = require('../lib/adapters/logger');
|
|
48
|
+
const fs = require('fs');
|
|
49
|
+
const yaml = require('js-yaml');
|
|
50
|
+
|
|
14
51
|
// 1. Initialize Registry
|
|
15
52
|
const registry = AdapterRegistry.getInstance();
|
|
16
53
|
|
package/docs/commands/README.md
CHANGED
|
@@ -20,7 +20,7 @@ IDCA: cc-investigate -> cc-do -> cc-check -> cc-act
|
|
|
20
20
|
|
|
21
21
|
Use maintenance skills separately when needed:
|
|
22
22
|
|
|
23
|
-
- `cc-spec-init`: bootstrap or repair `devflow/specs/` and
|
|
23
|
+
- `cc-spec-init`: bootstrap or repair `devflow/specs/` and ``
|
|
24
24
|
- `cc-simplify`: cleanup pass before ship
|
|
25
25
|
|
|
26
26
|
Use [skills.sh CLI](https://skills.sh/docs/cli) when you only want one skill:
|
|
@@ -20,7 +20,7 @@ IDCA: cc-investigate -> cc-do -> cc-check -> cc-act
|
|
|
20
20
|
|
|
21
21
|
维护类动作按需单独调用:
|
|
22
22
|
|
|
23
|
-
- `cc-spec-init`:初始化或修复 `devflow/specs/` 与
|
|
23
|
+
- `cc-spec-init`:初始化或修复 `devflow/specs/` 与 ``
|
|
24
24
|
- `cc-simplify`:ship 前做清理和坏味道检查
|
|
25
25
|
|
|
26
26
|
如果你只想安装单个 Skill,再使用 [skills.sh CLI](https://skills.sh/docs/cli):
|
package/docs/examples/README.md
CHANGED
|
@@ -33,6 +33,6 @@ If you need to verify that examples still match the current skill contracts, use
|
|
|
33
33
|
- Shows:
|
|
34
34
|
- work that is truly verified
|
|
35
35
|
- a case where remote / PR actions are intentionally skipped
|
|
36
|
-
- `cc-act` leaving exactly one final handoff
|
|
36
|
+
- `cc-act` leaving exactly one final `handoff/pr-brief.md` file for local handoff
|
|
37
37
|
|
|
38
38
|
If you need symptom routing or artifact-based lookup, go back to [START-HERE.md](./START-HERE.md).
|
|
@@ -30,7 +30,7 @@ npm run verify:publish
|
|
|
30
30
|
|
|
31
31
|
## Fast Route
|
|
32
32
|
|
|
33
|
-
### 1. Do you already have a
|
|
33
|
+
### 1. Do you already have a verification verdict?
|
|
34
34
|
|
|
35
35
|
- If **no**, start with [the happy path example](./pdca-loop/README.md) to understand the full loop once.
|
|
36
36
|
- If **yes**, continue below.
|
|
@@ -67,14 +67,13 @@ 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
|
-
| `
|
|
72
|
-
|
|
|
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) |
|
|
70
|
+
| `task.md` | `cc-plan`, `cc-investigate`, or `cc-do` | [pdca-loop/task.md](./pdca-loop/changes/REQ-001-copy-invite-link/task.md) |
|
|
71
|
+
| Git diff / commit | `cc-do` or `cc-check` | current branch history and working tree |
|
|
72
|
+
| current response verdict | `cc-check` | the verification summary from the latest run |
|
|
74
73
|
| `pr-brief.md` | `cc-act` | [pdca-loop/pr-brief.md](./pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md) |
|
|
75
|
-
| `
|
|
74
|
+
| local `pr-brief.md` | `cc-act` with `local-handoff` | [local-handoff/pr-brief.md](./local-handoff/changes/REQ-003-audit-log-export/handoff/pr-brief.md) |
|
|
76
75
|
|
|
77
|
-
### Read
|
|
76
|
+
### Read The Verification Verdict Like This
|
|
78
77
|
|
|
79
78
|
| Verdict | Reroute | Meaning |
|
|
80
79
|
| --- | --- | --- |
|
|
@@ -83,7 +82,7 @@ Use this when the only thing you know is the file in front of you.
|
|
|
83
82
|
| `blocked` | `cc-do` | proof or execution prerequisites are missing |
|
|
84
83
|
| `blocked` | `cc-plan` | design or scope truth is broken; do not keep coding blindly |
|
|
85
84
|
|
|
86
|
-
### Read
|
|
85
|
+
### Read Local Handoff Like This
|
|
87
86
|
|
|
88
87
|
Ask only:
|
|
89
88
|
|
|
@@ -118,17 +117,17 @@ If both are true, you are usually in `cc-act` local handoff territory, not back
|
|
|
118
117
|
|
|
119
118
|
## Wrong Turns To Avoid
|
|
120
119
|
|
|
121
|
-
- Do not jump from `
|
|
122
|
-
- Do not treat green tests as stronger than a `
|
|
123
|
-
- Do not treat `
|
|
120
|
+
- Do not jump from `task.md` straight to `cc-act`
|
|
121
|
+
- Do not treat green tests as stronger than a `cc-check` reroute
|
|
122
|
+
- Do not treat `local-handoff` as proof that planning failed; it may simply mean remote actions are intentionally unavailable
|
|
124
123
|
|
|
125
124
|
## One-Minute Rule
|
|
126
125
|
|
|
127
126
|
If you only have one minute, open these files in order:
|
|
128
127
|
|
|
129
128
|
1. example `README.md`
|
|
130
|
-
2. change `
|
|
131
|
-
3. `
|
|
129
|
+
2. change `task.md`
|
|
130
|
+
3. `handoff/pr-brief.md` when present; otherwise the latest Git commit and current verification response
|
|
132
131
|
|
|
133
132
|
That should already tell you:
|
|
134
133
|
|
|
@@ -140,7 +139,8 @@ That should already tell you:
|
|
|
140
139
|
|
|
141
140
|
`devflow/changes/<change>/` should stay lean.
|
|
142
141
|
|
|
143
|
-
- Durable truth only: `
|
|
142
|
+
- Durable truth only: `task.md`, optional `handoff/pr-brief.md`, and incident postmortem files when a real recurring failure needs one. Do not generate process files.
|
|
143
|
+
- Workflow state is Git-owned: keep `task.md` current and commit each completed stage.
|
|
144
144
|
- Legacy `planning/design.md`, `planning/analysis.md`, and `cc-review-*.md` are readable fallback inputs for older examples, not new default writes.
|
|
145
145
|
- Runtime scratch belongs in `devflow/workspaces/<change>/`, not beside the durable record.
|
|
146
146
|
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
"updatedAt": "2026-05-13",
|
|
3
3
|
"skills": {
|
|
4
4
|
"cc-roadmap": "5.3.0",
|
|
5
|
-
"cc-next": "1.
|
|
6
|
-
"cc-dev": "1.
|
|
7
|
-
"cc-plan": "3.
|
|
8
|
-
"cc-investigate": "1.
|
|
9
|
-
"cc-do": "1.
|
|
10
|
-
"cc-review": "2.
|
|
11
|
-
"cc-pr-review": "1.
|
|
12
|
-
"cc-pr-land": "1.
|
|
13
|
-
"cc-check": "1.
|
|
14
|
-
"cc-act": "1.
|
|
15
|
-
"cc-spec-init": "1.
|
|
5
|
+
"cc-next": "1.1.1",
|
|
6
|
+
"cc-dev": "1.1.2",
|
|
7
|
+
"cc-plan": "3.10.1",
|
|
8
|
+
"cc-investigate": "1.6.1",
|
|
9
|
+
"cc-do": "1.7.1",
|
|
10
|
+
"cc-review": "2.1.2",
|
|
11
|
+
"cc-pr-review": "1.1.1",
|
|
12
|
+
"cc-pr-land": "1.1.0",
|
|
13
|
+
"cc-check": "1.12.1",
|
|
14
|
+
"cc-act": "1.9.1",
|
|
15
|
+
"cc-spec-init": "1.2.0"
|
|
16
16
|
},
|
|
17
17
|
"examples": [
|
|
18
18
|
{
|
|
@@ -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.10.1`, `cc-do@1.7.1`, `cc-check@1.12.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
|
|
|
@@ -13,7 +13,7 @@ The shape is intentional:
|
|
|
13
13
|
- roadmap item is real enough to matter
|
|
14
14
|
- design requires `full-design`
|
|
15
15
|
- tasks were executed far enough to produce evidence
|
|
16
|
-
-
|
|
16
|
+
- the verification verdict is still `blocked`
|
|
17
17
|
- reroute is `cc-plan`, not `cc-do`
|
|
18
18
|
|
|
19
19
|
## Scenario
|
|
@@ -43,10 +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/
|
|
47
|
-
- `changes/REQ-002-bulk-invite-import/
|
|
48
|
-
- `changes/REQ-002-bulk-invite-import/planning/task-manifest.json`
|
|
49
|
-
- `changes/REQ-002-bulk-invite-import/review/report-card.json`
|
|
46
|
+
- `changes/REQ-002-bulk-invite-import/task.md`
|
|
47
|
+
- `changes/REQ-002-bulk-invite-import/task.md`
|
|
50
48
|
|
|
51
49
|
## Why There Is No `cc-act` Output
|
|
52
50
|
|
|
@@ -4,7 +4,7 @@
|
|
|
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.10.1`
|
|
8
8
|
- Work branch: `REQ/002-bulk-invite-import`
|
|
9
9
|
- Source roadmap item: `RM-010`
|
|
10
10
|
- Source roadmap version: `roadmap.v2`
|
|
@@ -43,20 +43,25 @@
|
|
|
43
43
|
ClaudeCode / Codex 执行本计划时,必须把本文件当成任务模板合同,而不是普通 TODO 列表。
|
|
44
44
|
|
|
45
45
|
- Template source: `assets/TASKS_TEMPLATE.md`
|
|
46
|
-
-
|
|
47
|
-
-
|
|
46
|
+
- CLI resolver: all workflow commands must run through `.claude/skills/cc-dev/scripts/resolve-cc-devflow.sh` or `.codex/skills/cc-dev/scripts/resolve-cc-devflow.sh`; if it cannot prove `query workflow-context` and `next-change-key`, stop blocked.
|
|
47
|
+
- Context first: run resolved CLI `query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compact` before opening deep sections.
|
|
48
|
+
- Task selection: use `scripts/select-ready-tasks.sh --tasks devflow/changes/<change-key>/task.md`.
|
|
48
49
|
- Task block rule: read the full task block before coding; title-only execution is invalid.
|
|
49
|
-
- Completion rule: after verification and review gates pass, run
|
|
50
|
-
-
|
|
50
|
+
- Completion rule: after verification and review gates pass, run `scripts/mark-task-complete.sh --tasks devflow/changes/<change-key>/task.md --task <task-id>`.
|
|
51
|
+
- Runtime file ban: do not generate process files beyond this `task.md`.
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
|
-
cc-
|
|
54
|
-
|
|
54
|
+
DEVFLOW=".claude/skills/cc-dev/scripts/resolve-cc-devflow.sh"
|
|
55
|
+
if [[ ! -f "$DEVFLOW" && -f ".codex/skills/cc-dev/scripts/resolve-cc-devflow.sh" ]]; then
|
|
56
|
+
DEVFLOW=".codex/skills/cc-dev/scripts/resolve-cc-devflow.sh"
|
|
57
|
+
fi
|
|
58
|
+
bash "$DEVFLOW" require query workflow-context next-change-key
|
|
59
|
+
bash "$DEVFLOW" query workflow-context --change <changeId> --change-key <changeKey> --cwd <repo-root> --data-only --no-trace --compactSCRIPT_ROOT=".claude/skills/cc-do/scripts"
|
|
55
60
|
if [[ ! -d "$SCRIPT_ROOT" && -d ".codex/skills/cc-do/scripts" ]]; then
|
|
56
61
|
SCRIPT_ROOT=".codex/skills/cc-do/scripts"
|
|
57
62
|
fi
|
|
58
|
-
bash "$SCRIPT_ROOT/select-ready-tasks.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/
|
|
59
|
-
bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/
|
|
63
|
+
bash "$SCRIPT_ROOT/select-ready-tasks.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/
|
|
64
|
+
bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task <task-id>
|
|
60
65
|
```
|
|
61
66
|
|
|
62
67
|
## Phase 1: Rule Matrix
|
|
@@ -68,7 +73,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
68
73
|
Read first: `design.md`, `src/invite/bulk-import.ts`
|
|
69
74
|
Verification: `npm test -- src/invite/bulk-import.test.ts`
|
|
70
75
|
Evidence: failing output
|
|
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/
|
|
76
|
+
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/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task T001`; do not hand-edit status.
|
|
72
77
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
73
78
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
74
79
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -81,7 +86,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
81
86
|
Read first: `design.md`, `src/invite/bulk-import.test.ts`
|
|
82
87
|
Verification: `npm test -- src/invite/bulk-import.test.ts`
|
|
83
88
|
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/
|
|
89
|
+
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/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task T002`; do not hand-edit status.
|
|
85
90
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
86
91
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
87
92
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -96,7 +101,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
96
101
|
Read first: `design.md`, `src/admin/BulkInvitePanel.tsx`
|
|
97
102
|
Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
98
103
|
Evidence: failing output
|
|
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/
|
|
104
|
+
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/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task T003`; do not hand-edit status.
|
|
100
105
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
101
106
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
102
107
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -109,7 +114,7 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
109
114
|
Read first: `design.md`, `src/admin/BulkInvitePanel.test.tsx`
|
|
110
115
|
Verification: `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
111
116
|
Evidence: passing output + review notes
|
|
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/
|
|
117
|
+
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/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task T004`; do not hand-edit status.
|
|
113
118
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
114
119
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
115
120
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|
|
@@ -121,12 +126,12 @@ bash "$SCRIPT_ROOT/mark-task-complete.sh" --manifest docs/examples/full-design-b
|
|
|
121
126
|
Goal: 为 `cc-check` 准备 bulk invite 的新鲜证据。
|
|
122
127
|
TDD phase: evidence
|
|
123
128
|
Files: `src/admin/BulkInvitePanel.tsx`, `src/invite/bulk-import.ts`
|
|
124
|
-
Read first: `
|
|
129
|
+
Read first: `task.md`
|
|
125
130
|
Verification:
|
|
126
131
|
- `npm test -- src/invite/bulk-import.test.ts`
|
|
127
132
|
- `npm test -- src/admin/BulkInvitePanel.test.tsx`
|
|
128
133
|
Evidence: passing output + review notes
|
|
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/
|
|
134
|
+
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/ --tasks docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/task.md --task T005`; do not hand-edit status.
|
|
130
135
|
Test seam: bulk invite rules and admin upload UI behavior
|
|
131
136
|
Public verification path: Run the bulk invite rule and admin panel tests through their public flows
|
|
132
137
|
Allowed mocks: file upload boundary / billing / seat limit boundary
|