cc-devflow 4.5.7 → 4.5.9

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.
Files changed (105) hide show
  1. package/.claude/skills/cc-act/CHANGELOG.md +33 -0
  2. package/.claude/skills/cc-act/PLAYBOOK.md +18 -4
  3. package/.claude/skills/cc-act/SKILL.md +76 -7
  4. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_INDEX_TEMPLATE.md +30 -0
  5. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_PRINCIPLES_TEMPLATE.md +29 -0
  6. package/.claude/skills/cc-act/assets/PROJECT_POSTMORTEM_TEMPLATE.md +103 -0
  7. package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +60 -4
  8. package/.claude/skills/cc-act/references/closure-contract.md +7 -0
  9. package/.claude/skills/cc-act/references/git-commit-guidelines.md +342 -37
  10. package/.claude/skills/cc-act/scripts/cc-act-common.sh +29 -1
  11. package/.claude/skills/cc-act/scripts/detect-ship-target.sh +27 -0
  12. package/.claude/skills/cc-act/scripts/ensure-ship-branch.sh +93 -0
  13. package/.claude/skills/cc-act/scripts/generate-status-report.sh +6 -0
  14. package/.claude/skills/cc-act/scripts/render-pr-brief.sh +170 -0
  15. package/.claude/skills/cc-act/scripts/sync-act-docs.sh +15 -1
  16. package/.claude/skills/cc-dev/CHANGELOG.md +5 -0
  17. package/.claude/skills/cc-dev/PLAYBOOK.md +63 -0
  18. package/.claude/skills/cc-dev/SKILL.md +168 -0
  19. package/.claude/skills/cc-do/CHANGELOG.md +17 -0
  20. package/.claude/skills/cc-do/SKILL.md +41 -13
  21. package/.claude/skills/cc-do/scripts/build-task-context.sh +9 -5
  22. package/.claude/skills/cc-do/scripts/mark-task-complete.sh +0 -6
  23. package/.claude/skills/cc-investigate/CHANGELOG.md +17 -0
  24. package/.claude/skills/cc-investigate/PLAYBOOK.md +15 -0
  25. package/.claude/skills/cc-investigate/SKILL.md +46 -1
  26. package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +47 -0
  27. package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +21 -2
  28. package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +28 -58
  29. package/.claude/skills/cc-investigate/references/investigation-contract.md +14 -0
  30. package/.claude/skills/cc-next/CHANGELOG.md +11 -0
  31. package/.claude/skills/cc-next/PLAYBOOK.md +74 -0
  32. package/.claude/skills/cc-next/SKILL.md +196 -0
  33. package/.claude/skills/cc-plan/CHANGELOG.md +25 -0
  34. package/.claude/skills/cc-plan/PLAYBOOK.md +25 -20
  35. package/.claude/skills/cc-plan/SKILL.md +116 -13
  36. package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +67 -0
  37. package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +85 -0
  38. package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +57 -182
  39. package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +46 -0
  40. package/.claude/skills/cc-plan/references/planning-contract.md +51 -26
  41. package/.claude/skills/cc-pr-land/CHANGELOG.md +5 -0
  42. package/.claude/skills/cc-pr-land/PLAYBOOK.md +45 -0
  43. package/.claude/skills/cc-pr-land/SKILL.md +157 -0
  44. package/.claude/skills/cc-pr-review/CHANGELOG.md +5 -0
  45. package/.claude/skills/cc-pr-review/PLAYBOOK.md +46 -0
  46. package/.claude/skills/cc-pr-review/SKILL.md +142 -0
  47. package/.claude/skills/cc-review/CHANGELOG.md +21 -0
  48. package/.claude/skills/cc-review/PLAYBOOK.md +64 -10
  49. package/.claude/skills/cc-review/SKILL.md +185 -18
  50. package/.claude/skills/cc-review/references/e2e-and-plugin-verification.md +4 -0
  51. package/.claude/skills/cc-review/references/implementation-review-branch.md +37 -0
  52. package/.claude/skills/cc-review/references/plan-review-branch.md +36 -1
  53. package/.claude/skills/cc-review/references/review-methods.md +98 -3
  54. package/.claude/skills/cc-review/scripts/collect-review-context.sh +80 -0
  55. package/.claude/skills/cc-roadmap/CHANGELOG.md +6 -0
  56. package/.claude/skills/cc-roadmap/PLAYBOOK.md +30 -0
  57. package/.claude/skills/cc-roadmap/SKILL.md +45 -8
  58. package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +8 -0
  59. package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +22 -0
  60. package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +32 -1
  61. package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +14 -14
  62. package/.claude/skills/cc-simplify/CHANGELOG.md +6 -0
  63. package/.claude/skills/cc-simplify/SKILL.md +19 -8
  64. package/CHANGELOG.md +20 -1
  65. package/README.md +60 -9
  66. package/README.zh-CN.md +60 -9
  67. package/config/distributable-skills.json +8 -0
  68. package/docs/assets/cc-devflow-pr-harness-en.svg +153 -0
  69. package/docs/assets/cc-devflow-pr-harness-zh.svg +152 -0
  70. package/docs/assets/wechat-group-qr.jpg +0 -0
  71. package/docs/examples/example-bindings.json +11 -7
  72. package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
  73. package/docs/examples/full-design-blocked/README.md +1 -1
  74. package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
  75. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +1 -1
  76. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/task-manifest.json +102 -82
  77. package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +45 -1
  78. package/docs/examples/full-design-blocked/roadmap.json +1 -1
  79. package/docs/examples/local-handoff/BACKLOG.md +1 -1
  80. package/docs/examples/local-handoff/README.md +1 -1
  81. package/docs/examples/local-handoff/ROADMAP.md +1 -1
  82. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +1 -1
  83. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/task-manifest.json +70 -61
  84. package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +35 -1
  85. package/docs/examples/local-handoff/roadmap.json +1 -1
  86. package/docs/examples/pdca-loop/BACKLOG.md +1 -1
  87. package/docs/examples/pdca-loop/README.md +1 -1
  88. package/docs/examples/pdca-loop/ROADMAP.md +1 -1
  89. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +64 -0
  90. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +1 -1
  91. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +71 -81
  92. package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +35 -1
  93. package/docs/examples/pdca-loop/roadmap.json +1 -1
  94. package/docs/examples/scripts/check-example-bindings.sh +24 -2
  95. package/docs/get-shit-done-strategy-audit.md +4 -4
  96. package/docs/guides/artifact-contract.md +44 -0
  97. package/docs/guides/getting-started.md +1 -1
  98. package/docs/guides/getting-started.zh-CN.md +1 -1
  99. package/docs/guides/project-postmortem.md +78 -0
  100. package/lib/skill-runtime/__tests__/planner.tdd.test.js +2 -2
  101. package/lib/skill-runtime/__tests__/schemas.test.js +33 -2
  102. package/lib/skill-runtime/planner.js +1 -2
  103. package/lib/skill-runtime/query.js +1 -1
  104. package/lib/skill-runtime/schemas.js +5 -3
  105. package/package.json +6 -1
@@ -120,7 +120,7 @@ describe('TDD Order Validation', () => {
120
120
  });
121
121
  });
122
122
 
123
- test('should write currentTaskId and activePhase into manifest', async () => {
123
+ test('should write currentTaskId while deriving activePhase from the task graph', async () => {
124
124
  const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'cc-devflow-planner-'));
125
125
  const changeId = 'REQ-321';
126
126
  const tasksPath = path.join(repoRoot, 'devflow', 'changes', `${changeId}-change`, 'planning', 'tasks.md');
@@ -146,7 +146,7 @@ describe('TDD Order Validation', () => {
146
146
  overwrite: true
147
147
  });
148
148
 
149
- expect(manifest.activePhase).toBe(1);
149
+ expect(manifest.activePhase).toBeUndefined();
150
150
  expect(manifest.currentTaskId).toBe('T002');
151
151
  expect(manifest.tasks[1].reviews).toEqual({ spec: 'pending', code: 'pending' });
152
152
  });
@@ -8,7 +8,6 @@ describe('Manifest schema hard constraints', () => {
8
8
  createdAt: '2026-04-10T01:00:00.000Z',
9
9
  updatedAt: '2026-04-10T01:05:00.000Z',
10
10
  currentTaskId: 'T001',
11
- activePhase: 1,
12
11
  tasks: [
13
12
  {
14
13
  id: 'T001',
@@ -73,7 +72,39 @@ describe('Manifest schema hard constraints', () => {
73
72
  });
74
73
 
75
74
  expect(manifest.currentTaskId).toBe('T001');
76
- expect(manifest.activePhase).toBe(1);
75
+ expect(manifest.activePhase).toBeUndefined();
76
+ });
77
+
78
+ test('accepts legacy activePhase input without preserving the retired field', () => {
79
+ const manifest = parseManifest({
80
+ changeId: 'REQ-560',
81
+ goal: 'Validate legacy manifest compatibility',
82
+ createdAt: '2026-04-10T01:00:00.000Z',
83
+ updatedAt: '2026-04-10T01:05:00.000Z',
84
+ currentTaskId: 'T001',
85
+ activePhase: 1,
86
+ tasks: [
87
+ {
88
+ id: 'T001',
89
+ title: '[TEST] Counter behavior',
90
+ type: 'OTHER',
91
+ phase: 1,
92
+ dependsOn: [],
93
+ run: ['echo ok'],
94
+ status: 'pending',
95
+ attempts: 0,
96
+ maxRetries: 1
97
+ }
98
+ ],
99
+ metadata: {
100
+ source: 'default',
101
+ generatedBy: 'test',
102
+ planVersion: 1
103
+ }
104
+ });
105
+
106
+ expect(manifest.currentTaskId).toBe('T001');
107
+ expect(manifest.activePhase).toBeUndefined();
77
108
  });
78
109
 
79
110
  test('rejects invalid currentTaskId for tasks.md manifest', () => {
@@ -480,7 +480,7 @@ function deriveManifestExecutionState(tasks) {
480
480
  function applyManifestExecutionState(manifest, updatedAt = nowIso()) {
481
481
  const executionState = deriveManifestExecutionState(manifest.tasks || []);
482
482
  manifest.currentTaskId = executionState.currentTaskId;
483
- manifest.activePhase = executionState.activePhase;
483
+ delete manifest.activePhase;
484
484
  manifest.updatedAt = updatedAt;
485
485
  return manifest;
486
486
  }
@@ -504,7 +504,6 @@ async function createTaskManifest({ repoRoot, changeId, goal, overwrite = false
504
504
  createdAt: previous?.createdAt || nowIso(),
505
505
  updatedAt: nowIso(),
506
506
  currentTaskId: null,
507
- activePhase: null,
508
507
  tasks,
509
508
  metadata: {
510
509
  source: hasTasksFile ? 'tasks.md' : 'default',
@@ -81,7 +81,7 @@ async function getNextTask(repoRoot, changeId, options = {}) {
81
81
  const manifestPath = getTaskManifestPath(repoRoot, changeId, options);
82
82
  const manifest = await readQueryArtifact(manifestPath);
83
83
  const executionState = deriveManifestExecutionState(manifest.tasks || []);
84
- const activePhase = manifest.activePhase ?? executionState.activePhase;
84
+ const activePhase = executionState.activePhase;
85
85
  const completedIds = new Set(
86
86
  (manifest.tasks || [])
87
87
  .filter((task) => isTaskCompletedStatus(task.status))
@@ -107,7 +107,7 @@ const ManifestSchema = z.object({
107
107
  createdAt: z.string().datetime(),
108
108
  updatedAt: z.string().datetime(),
109
109
  currentTaskId: z.string().regex(TASK_ID_PATTERN).nullable().default(null),
110
- activePhase: z.number().int().min(1).nullable().default(null),
110
+ activePhase: z.number().int().min(1).nullable().optional(),
111
111
  tasks: z.array(TaskSchema),
112
112
  metadata: z.object({
113
113
  source: z.enum(['tasks.md', 'default']).default('default'),
@@ -161,7 +161,7 @@ const ManifestSchema = z.object({
161
161
  ? Math.min(...unfinished.map((task) => task.phase || 1))
162
162
  : null;
163
163
 
164
- if (manifest.activePhase !== null && manifest.activePhase !== derivedActivePhase) {
164
+ if (manifest.activePhase !== undefined && manifest.activePhase !== null && manifest.activePhase !== derivedActivePhase) {
165
165
  ctx.addIssue({
166
166
  code: z.ZodIssueCode.custom,
167
167
  path: ['activePhase'],
@@ -542,7 +542,9 @@ function parseWithSchema(schema, input, label) {
542
542
  }
543
543
 
544
544
  function parseManifest(input) {
545
- return parseWithSchema(ManifestSchema, input, 'Manifest');
545
+ const manifest = parseWithSchema(ManifestSchema, input, 'Manifest');
546
+ delete manifest.activePhase;
547
+ return manifest;
546
548
  }
547
549
 
548
550
  function parseCheckpoint(input) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-devflow",
3
- "version": "4.5.7",
3
+ "version": "4.5.9",
4
4
  "description": "Multi-platform CLI and skill pack for agent coding",
5
5
  "main": "bin/cc-devflow.js",
6
6
  "bin": {
@@ -10,11 +10,16 @@
10
10
  "bin/",
11
11
  "lib/",
12
12
  "config/",
13
+ "docs/assets/",
13
14
  ".claude/skills/cc-roadmap/",
15
+ ".claude/skills/cc-next/",
16
+ ".claude/skills/cc-dev/",
14
17
  ".claude/skills/cc-plan/",
15
18
  ".claude/skills/cc-investigate/",
16
19
  ".claude/skills/cc-do/",
17
20
  ".claude/skills/cc-review/",
21
+ ".claude/skills/cc-pr-review/",
22
+ ".claude/skills/cc-pr-land/",
18
23
  ".claude/skills/cc-check/",
19
24
  ".claude/skills/cc-act/",
20
25
  ".claude/skills/cc-spec-init/",