cc-devflow 4.2.0 → 4.3.0

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 (119) hide show
  1. package/.claude/commands/flow/CLAUDE.md +0 -4
  2. package/.claude/docs/examples/design-inspiration-pool.md +59 -0
  3. package/.claude/docs/examples/ui-prototype-constitution-checklist.md +75 -0
  4. package/.claude/docs/implementation-summary-v7.md +449 -0
  5. package/.claude/docs/spec-format-guide.md +349 -0
  6. package/.claude/docs/state-consolidation-design.md +323 -0
  7. package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +85 -386
  8. package/.claude/docs/templates/DESIGN_TEMPLATE.md +157 -0
  9. package/.claude/docs/templates/PROPOSAL_TEMPLATE.md +91 -0
  10. package/.claude/docs/templates/SPEC_TEMPLATE_DELTA.md +139 -0
  11. package/.claude/docs/templates/SPEC_TEMPLATE_PROJECT.md +93 -0
  12. package/.claude/docs/templates/STYLE_TEMPLATE.md +114 -901
  13. package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +143 -1205
  14. package/.claude/hooks/inject-agent-context.ts +9 -9
  15. package/.claude/scripts/.claude/commands/flow/export-openspec.md +221 -0
  16. package/.claude/scripts/.claude/commands/flow/import-openspec.md +171 -0
  17. package/.claude/scripts/__tests__/openspec.test.js +212 -0
  18. package/.claude/scripts/delta-parser.ts +112 -2
  19. package/.claude/scripts/export-openspec.js +222 -0
  20. package/.claude/scripts/import-openspec.js +272 -0
  21. package/.claude/scripts/validate-scope.sh +200 -0
  22. package/.claude/skills/{workflow/flow-init → flow-init}/SKILL.md +25 -4
  23. package/.claude/skills/{workflow/flow-release → flow-release}/SKILL.md +14 -3
  24. package/.claude/skills/{workflow/flow-spec → flow-spec}/SKILL.md +30 -2
  25. package/.claude/skills/utility/npm-release/CLAUDE.md +55 -0
  26. package/.claude/skills/utility/npm-release/SKILL.md +111 -46
  27. package/.claude/skills/utility/npm-release/references/version-decision-guide.md +134 -0
  28. package/.claude/skills/utility/npm-release/scripts/atomic-version-bump.sh +95 -0
  29. package/.claude/skills/utility/npm-release/scripts/validate-version-sync.sh +82 -0
  30. package/.claude/skills/utility/npm-release/scripts/version-decision-tree.sh +44 -0
  31. package/.claude/tsc-cache/70d2fc6d-2936-429b-b529-429f1aae8c88/affected-repos.txt +1 -0
  32. package/.claude/tsc-cache/70d2fc6d-2936-429b-b529-429f1aae8c88/edited-files.log +2 -0
  33. package/CHANGELOG.md +40 -0
  34. package/README.md +2 -1
  35. package/README.zh-CN.md +2 -1
  36. package/docs/v4.3.0-migration-guide.md +276 -0
  37. package/lib/harness/CLAUDE.md +5 -4
  38. package/lib/harness/__tests__/planner.tdd.test.js +125 -0
  39. package/lib/harness/index.js +4 -2
  40. package/lib/harness/operations/dispatch.js +13 -0
  41. package/lib/harness/operations/plan.js +55 -1
  42. package/lib/harness/operations/release.js +87 -0
  43. package/lib/harness/operations/verify.js +14 -0
  44. package/lib/harness/planner.js +131 -0
  45. package/lib/harness/query.js +126 -0
  46. package/lib/harness/schemas.js +22 -1
  47. package/package.json +1 -1
  48. package/.claude/commands/flow/checklist.md +0 -18
  49. package/.claude/commands/flow/clarify.md +0 -18
  50. package/.claude/commands/flow/new.md +0 -23
  51. package/.claude/commands/flow/quality.md +0 -21
  52. package/.claude/docs/templates/EPIC_TEMPLATE.md +0 -805
  53. package/.claude/docs/templates/PRD_TEMPLATE.md +0 -562
  54. package/.claude/docs/templates/TASKS_TEMPLATE.md +0 -523
  55. package/.claude/docs/templates/TECH_DESIGN_TEMPLATE.md +0 -1019
  56. package/.claude/skills/workflow/CLAUDE.md +0 -24
  57. /package/.claude/skills/{domain/attention-refresh → attention-refresh}/SKILL.md +0 -0
  58. /package/.claude/skills/{domain/brainstorming → brainstorming}/SKILL.md +0 -0
  59. /package/.claude/skills/{guardrail/constitution-guardian → constitution-guardian}/SKILL.md +0 -0
  60. /package/.claude/skills/{utility/constitution-quick-ref → constitution-quick-ref}/SKILL.md +0 -0
  61. /package/.claude/skills/{domain/debugging → debugging}/SKILL.md +0 -0
  62. /package/.claude/skills/{utility/file-standards → file-standards}/SKILL.md +0 -0
  63. /package/.claude/skills/{domain/finishing-branch → finishing-branch}/SKILL.md +0 -0
  64. /package/.claude/skills/{workflow/flow-dev → flow-dev}/CLAUDE.md +0 -0
  65. /package/.claude/skills/{workflow/flow-dev → flow-dev}/SKILL.md +0 -0
  66. /package/.claude/skills/{workflow/flow-dev → flow-dev}/assets/IMPLEMENTATION_PLAN_TEMPLATE.md +0 -0
  67. /package/.claude/skills/{workflow/flow-dev → flow-dev}/context.jsonl +0 -0
  68. /package/.claude/skills/{workflow/flow-dev → flow-dev}/dev-implementer.jsonl +0 -0
  69. /package/.claude/skills/{workflow/flow-dev → flow-dev}/scripts/entry-gate.sh +0 -0
  70. /package/.claude/skills/{workflow/flow-dev → flow-dev}/scripts/exit-gate.sh +0 -0
  71. /package/.claude/skills/{workflow/flow-dev → flow-dev}/scripts/task-orchestrator.sh +0 -0
  72. /package/.claude/skills/{workflow/flow-fix → flow-fix}/SKILL.md +0 -0
  73. /package/.claude/skills/{workflow/flow-fix → flow-fix}/context.jsonl +0 -0
  74. /package/.claude/skills/{workflow/flow-fix → flow-fix}/references/bug-analyzer.md +0 -0
  75. /package/.claude/skills/{workflow/flow-init → flow-init}/assets/BRAINSTORM_TEMPLATE.md +0 -0
  76. /package/.claude/skills/{workflow/flow-init → flow-init}/assets/INIT_FLOW_TEMPLATE.md +0 -0
  77. /package/.claude/skills/{workflow/flow-init → flow-init}/assets/RESEARCH_TEMPLATE.md +0 -0
  78. /package/.claude/skills/{workflow/flow-init → flow-init}/context.jsonl +0 -0
  79. /package/.claude/skills/{workflow/flow-init → flow-init}/references/flow-researcher.md +0 -0
  80. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/check-prerequisites.sh +0 -0
  81. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/consolidate-research.sh +0 -0
  82. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/create-requirement.sh +0 -0
  83. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/generate-research-tasks.sh +0 -0
  84. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/populate-research-tasks.sh +0 -0
  85. /package/.claude/skills/{workflow/flow-init → flow-init}/scripts/validate-research.sh +0 -0
  86. /package/.claude/skills/{workflow/flow-quality → flow-quality}/SKILL.md +0 -0
  87. /package/.claude/skills/{workflow/flow-quality → flow-quality}/context.jsonl +0 -0
  88. /package/.claude/skills/{workflow/flow-quality → flow-quality}/references/code-quality-reviewer.md +0 -0
  89. /package/.claude/skills/{workflow/flow-quality → flow-quality}/references/qa-tester.md +0 -0
  90. /package/.claude/skills/{workflow/flow-quality → flow-quality}/references/security-reviewer.md +0 -0
  91. /package/.claude/skills/{workflow/flow-quality → flow-quality}/references/spec-reviewer.md +0 -0
  92. /package/.claude/skills/{workflow/flow-release → flow-release}/context.jsonl +0 -0
  93. /package/.claude/skills/{workflow/flow-release → flow-release}/references/release-manager.md +0 -0
  94. /package/.claude/skills/{workflow/flow-spec → flow-spec}/CLAUDE.md +0 -0
  95. /package/.claude/skills/{workflow/flow-spec → flow-spec}/context.jsonl +0 -0
  96. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/entry-gate.sh +0 -0
  97. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/exit-gate.sh +0 -0
  98. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/parallel-orchestrator.sh +0 -0
  99. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/team-communication.sh +0 -0
  100. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/team-init.sh +0 -0
  101. /package/.claude/skills/{workflow/flow-spec → flow-spec}/scripts/test-team-mode.sh +0 -0
  102. /package/.claude/skills/{workflow/flow-spec → flow-spec}/team-config.json +0 -0
  103. /package/.claude/skills/{workflow/flow-verify → flow-verify}/CLAUDE.md +0 -0
  104. /package/.claude/skills/{workflow/flow-verify → flow-verify}/SKILL.md +0 -0
  105. /package/.claude/skills/{workflow/flow-verify → flow-verify}/context.jsonl +0 -0
  106. /package/.claude/skills/{utility/fractal-docs → fractal-docs}/SKILL.md +0 -0
  107. /package/.claude/skills/{utility/journey-checker → journey-checker}/SKILL.md +0 -0
  108. /package/.claude/skills/{utility/journey-checker → journey-checker}/pressure-scenarios.md +0 -0
  109. /package/.claude/skills/{domain/receiving-review → receiving-review}/SKILL.md +0 -0
  110. /package/.claude/skills/{utility/skill-creator → skill-creator}/LICENSE.txt +0 -0
  111. /package/.claude/skills/{utility/skill-creator → skill-creator}/SKILL.md +0 -0
  112. /package/.claude/skills/{utility/skill-creator → skill-creator}/references/output-patterns.md +0 -0
  113. /package/.claude/skills/{utility/skill-creator → skill-creator}/references/workflows.md +0 -0
  114. /package/.claude/skills/{utility/skill-creator → skill-creator}/scripts/init_skill.py +0 -0
  115. /package/.claude/skills/{utility/skill-creator → skill-creator}/scripts/package_skill.py +0 -0
  116. /package/.claude/skills/{utility/skill-creator → skill-creator}/scripts/quick_validate.py +0 -0
  117. /package/.claude/skills/{domain/tdd → tdd}/SKILL.md +0 -0
  118. /package/.claude/skills/{guardrail/tdd-enforcer → tdd-enforcer}/SKILL.md +0 -0
  119. /package/.claude/skills/{domain/verification → verification}/SKILL.md +0 -0
@@ -72,9 +72,13 @@ function parseTasksMarkdown(content) {
72
72
  const dependsOn = parseDependsOn(tail, previousTaskId, isParallel);
73
73
  const title = normalizeTitle(tail).replace(TRAILING_PATHS, '').trim() || `Task ${taskId}`;
74
74
 
75
+ // 提取任务类型 [TEST] 或 [IMPL]
76
+ const taskType = extractTaskType(title);
77
+
75
78
  tasks.push({
76
79
  id: taskId,
77
80
  title,
81
+ type: taskType,
78
82
  dependsOn,
79
83
  touches,
80
84
  run: [`echo "[TASK ${taskId}] ${title}"`],
@@ -87,9 +91,136 @@ function parseTasksMarkdown(content) {
87
91
  previousTaskId = taskId;
88
92
  }
89
93
 
94
+ // TDD 顺序验证 (Constitution Article VI)
95
+ validateTDDOrder(tasks);
96
+
90
97
  return tasks;
91
98
  }
92
99
 
100
+ function extractTaskType(title) {
101
+ if (/\[TEST\]/i.test(title)) {
102
+ return 'TEST';
103
+ }
104
+ if (/\[IMPL\]/i.test(title)) {
105
+ return 'IMPL';
106
+ }
107
+ return 'OTHER';
108
+ }
109
+
110
+ /**
111
+ * TDD 顺序验证 (Constitution Article VI)
112
+ *
113
+ * 规则:
114
+ * 1. 每个 [IMPL] 任务必须有对应的 [TEST] 任务
115
+ * 2. [IMPL] 任务必须依赖对应的 [TEST] 任务 (通过 dependsOn)
116
+ * 3. [TEST] 任务不能依赖 [IMPL] 任务
117
+ *
118
+ * @param {Array} tasks - 任务列表
119
+ * @throws {Error} - TDD 顺序违规时抛出错误
120
+ */
121
+ function validateTDDOrder(tasks) {
122
+ const violations = [];
123
+ const testTasks = tasks.filter(t => t.type === 'TEST');
124
+ const implTasks = tasks.filter(t => t.type === 'IMPL');
125
+
126
+ // 为每个 IMPL 任务查找对应的 TEST 任务
127
+ for (const implTask of implTasks) {
128
+ // 提取功能名称 (去除 [IMPL] 标记后的主要描述)
129
+ const implFeature = extractFeatureName(implTask.title);
130
+
131
+ // 查找匹配的 TEST 任务 (使用模糊匹配)
132
+ const matchingTest = testTasks.find(testTask => {
133
+ const testFeature = extractFeatureName(testTask.title);
134
+ // 模糊匹配:检查是否包含相同的核心关键词
135
+ return isSimilarFeature(testFeature, implFeature);
136
+ });
137
+
138
+ if (!matchingTest) {
139
+ violations.push(
140
+ `Task ${implTask.id} (${implTask.title}) missing corresponding TEST task. ` +
141
+ `Constitution Article VI requires: NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.`
142
+ );
143
+ continue;
144
+ }
145
+
146
+ // 检查依赖关系
147
+ if (!implTask.dependsOn.includes(matchingTest.id)) {
148
+ violations.push(
149
+ `Task ${implTask.id} (${implTask.title}) must depend on ${matchingTest.id} (${matchingTest.title}). ` +
150
+ `TDD violation: Implementation must come AFTER test.`
151
+ );
152
+ }
153
+ }
154
+
155
+ // 检查 TEST 任务不能依赖 IMPL 任务
156
+ for (const testTask of testTasks) {
157
+ const implDeps = testTask.dependsOn.filter(depId => {
158
+ const depTask = tasks.find(t => t.id === depId);
159
+ return depTask && depTask.type === 'IMPL';
160
+ });
161
+
162
+ if (implDeps.length > 0) {
163
+ violations.push(
164
+ `Task ${testTask.id} (${testTask.title}) depends on IMPL tasks: ${implDeps.join(', ')}. ` +
165
+ `TDD violation: Tests must be written BEFORE implementation.`
166
+ );
167
+ }
168
+ }
169
+
170
+ if (violations.length > 0) {
171
+ throw new Error(
172
+ `TDD Order Validation Failed (Constitution Article VI):\n\n` +
173
+ violations.map((v, i) => `${i + 1}. ${v}`).join('\n\n') +
174
+ `\n\nFix TASKS.md to follow TDD sequence: [TEST] tasks BEFORE [IMPL] tasks.`
175
+ );
176
+ }
177
+ }
178
+
179
+ /**
180
+ * 从任务标题中提取功能名称
181
+ * 例如: "[TEST] 用户登录功能" -> "用户登录功能"
182
+ * "[IMPL] 用户登录功能" -> "用户登录功能"
183
+ */
184
+ function extractFeatureName(title) {
185
+ return title
186
+ .replace(/\[TEST\]/gi, '')
187
+ .replace(/\[IMPL\]/gi, '')
188
+ .replace(/\[P\]/gi, '')
189
+ .replace(/\(dependsOn:[^)]*\)/gi, '')
190
+ .replace(/\([^)]*\)/g, '')
191
+ .trim();
192
+ }
193
+
194
+ /**
195
+ * 判断两个功能名称是否相似
196
+ * 使用核心关键词匹配策略
197
+ */
198
+ function isSimilarFeature(feature1, feature2) {
199
+ // 提取核心关键词 (去除常见后缀如"测试"、"实现"、"功能"等)
200
+ const normalize = (str) => str
201
+ .replace(/测试$/g, '')
202
+ .replace(/实现$/g, '')
203
+ .replace(/功能$/g, '')
204
+ .replace(/开发$/g, '')
205
+ .replace(/编写$/g, '')
206
+ .trim();
207
+
208
+ const core1 = normalize(feature1);
209
+ const core2 = normalize(feature2);
210
+
211
+ // 精确匹配
212
+ if (core1 === core2) {
213
+ return true;
214
+ }
215
+
216
+ // 包含匹配 (较长的包含较短的)
217
+ if (core1.length > core2.length) {
218
+ return core1.includes(core2);
219
+ } else {
220
+ return core2.includes(core1);
221
+ }
222
+ }
223
+
93
224
  function buildDefaultTasks(changeId) {
94
225
  return [
95
226
  {
@@ -0,0 +1,126 @@
1
+ /**
2
+ * [INPUT]: 依赖 store 读取 harness-state/task-manifest/report-card,接收 repoRoot 和 changeId。
3
+ * [OUTPUT]: 对外提供 getProgress/getNextTask/getFullState 查询函数,聚合分散的状态信息。
4
+ * [POS]: harness 查询工具层,被 CLI 与 skills 调用以获取聚合状态视图。
5
+ * [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md
6
+ */
7
+
8
+ const {
9
+ getHarnessStatePath,
10
+ getTaskManifestPath,
11
+ getReportCardPath,
12
+ readJson
13
+ } = require('./store');
14
+
15
+ /**
16
+ * 获取任务进度统计
17
+ * @param {string} repoRoot - 仓库根目录
18
+ * @param {string} changeId - 需求 ID
19
+ * @returns {Promise<Object>} 进度统计对象
20
+ */
21
+ async function getProgress(repoRoot, changeId) {
22
+ const manifestPath = getTaskManifestPath(repoRoot, changeId);
23
+
24
+ try {
25
+ const manifest = await readJson(manifestPath);
26
+
27
+ return {
28
+ totalTasks: manifest.tasks.length,
29
+ completedTasks: manifest.tasks.filter(t => t.status === 'passed').length,
30
+ failedTasks: manifest.tasks.filter(t => t.status === 'failed').length,
31
+ pendingTasks: manifest.tasks.filter(t => t.status === 'pending').length,
32
+ runningTasks: manifest.tasks.filter(t => t.status === 'running').length,
33
+ skippedTasks: manifest.tasks.filter(t => t.status === 'skipped').length
34
+ };
35
+ } catch (error) {
36
+ return {
37
+ totalTasks: 0,
38
+ completedTasks: 0,
39
+ failedTasks: 0,
40
+ pendingTasks: 0,
41
+ runningTasks: 0,
42
+ skippedTasks: 0,
43
+ error: error.message
44
+ };
45
+ }
46
+ }
47
+
48
+ /**
49
+ * 获取下一个待执行的任务
50
+ * @param {string} repoRoot - 仓库根目录
51
+ * @param {string} changeId - 需求 ID
52
+ * @returns {Promise<Object|null>} 下一个任务对象或 null
53
+ */
54
+ async function getNextTask(repoRoot, changeId) {
55
+ const manifestPath = getTaskManifestPath(repoRoot, changeId);
56
+
57
+ try {
58
+ const manifest = await readJson(manifestPath);
59
+
60
+ // 找到第一个 pending 状态的任务
61
+ const nextTask = manifest.tasks.find(t => t.status === 'pending');
62
+
63
+ return nextTask || null;
64
+ } catch (error) {
65
+ return null;
66
+ }
67
+ }
68
+
69
+ /**
70
+ * 获取完整的聚合状态视图
71
+ * @param {string} repoRoot - 仓库根目录
72
+ * @param {string} changeId - 需求 ID
73
+ * @returns {Promise<Object>} 完整状态对象
74
+ */
75
+ async function getFullState(repoRoot, changeId) {
76
+ const statePath = getHarnessStatePath(repoRoot, changeId);
77
+ const reportPath = getReportCardPath(repoRoot, changeId);
78
+
79
+ try {
80
+ const state = await readJson(statePath);
81
+ const progress = await getProgress(repoRoot, changeId);
82
+ const nextTask = await getNextTask(repoRoot, changeId);
83
+
84
+ let report = null;
85
+ try {
86
+ report = await readJson(reportPath);
87
+ } catch {
88
+ // report-card.json 可能不存在(未执行 verify)
89
+ report = null;
90
+ }
91
+
92
+ return {
93
+ lifecycle: {
94
+ changeId: state.changeId,
95
+ goal: state.goal,
96
+ status: state.status,
97
+ initializedAt: state.initializedAt,
98
+ plannedAt: state.plannedAt,
99
+ verifiedAt: state.verifiedAt,
100
+ releasedAt: state.releasedAt,
101
+ updatedAt: state.updatedAt
102
+ },
103
+ progress,
104
+ nextTask,
105
+ quality: report ? {
106
+ overall: report.overall,
107
+ blockingFindings: report.blockingFindings,
108
+ timestamp: report.timestamp
109
+ } : null
110
+ };
111
+ } catch (error) {
112
+ return {
113
+ error: error.message,
114
+ lifecycle: null,
115
+ progress: null,
116
+ nextTask: null,
117
+ quality: null
118
+ };
119
+ }
120
+ }
121
+
122
+ module.exports = {
123
+ getProgress,
124
+ getNextTask,
125
+ getFullState
126
+ };
@@ -14,9 +14,23 @@ const ChangeIdSchema = z.string().regex(CHANGE_ID_PATTERN, 'Invalid changeId for
14
14
 
15
15
  const TaskStatusSchema = z.enum(['pending', 'running', 'passed', 'failed', 'skipped']);
16
16
 
17
+ const HarnessStatusSchema = z.enum(['initialized', 'planned', 'in_progress', 'verified', 'released']);
18
+
19
+ const HarnessStateSchema = z.object({
20
+ changeId: ChangeIdSchema,
21
+ goal: z.string().min(1),
22
+ status: HarnessStatusSchema,
23
+ initializedAt: z.string().datetime(),
24
+ plannedAt: z.string().datetime().optional(),
25
+ verifiedAt: z.string().datetime().optional(),
26
+ releasedAt: z.string().datetime().optional(),
27
+ updatedAt: z.string().datetime()
28
+ });
29
+
17
30
  const TaskSchema = z.object({
18
31
  id: z.string().regex(TASK_ID_PATTERN, 'Invalid task id'),
19
32
  title: z.string().min(1, 'Task title is required'),
33
+ type: z.enum(['TEST', 'IMPL', 'OTHER']).default('OTHER'),
20
34
  dependsOn: z.array(z.string().regex(TASK_ID_PATTERN)).default([]),
21
35
  touches: z.array(z.string().min(1)).default([]),
22
36
  run: z.array(z.string().min(1)).min(1, 'At least one run command is required'),
@@ -94,15 +108,22 @@ function parseReportCard(input) {
94
108
  return parseWithSchema(ReportCardSchema, input, 'ReportCard');
95
109
  }
96
110
 
111
+ function parseHarnessState(input) {
112
+ return parseWithSchema(HarnessStateSchema, input, 'HarnessState');
113
+ }
114
+
97
115
  module.exports = {
98
116
  ChangeIdSchema,
99
117
  TaskSchema,
100
118
  TaskStatusSchema,
119
+ HarnessStatusSchema,
120
+ HarnessStateSchema,
101
121
  ManifestSchema,
102
122
  CheckpointSchema,
103
123
  GateResultSchema,
104
124
  ReportCardSchema,
105
125
  parseManifest,
106
126
  parseCheckpoint,
107
- parseReportCard
127
+ parseReportCard,
128
+ parseHarnessState
108
129
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-devflow",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "DevFlow CLI tool",
5
5
  "main": "bin/cc-devflow.js",
6
6
  "bin": {
@@ -1,18 +0,0 @@
1
- ---
2
- name: flow-checklist
3
- description: 'Deprecated. Checklist stage merged into /flow:verify gates.'
4
- ---
5
-
6
- # /flow:checklist (Deprecated)
7
-
8
- `/flow:checklist` 已废弃。
9
-
10
- ## Migration
11
-
12
- - 使用:`/flow:verify "REQ-123"`
13
- - 严格模式:`/flow:verify "REQ-123" --strict`
14
-
15
- ## Reason
16
-
17
- - Checklist 功能已并入 report-card 门禁模型。
18
- - 统一 gate 输出为 `devflow/requirements/<REQ_ID>/report-card.json`。
@@ -1,18 +0,0 @@
1
- ---
2
- name: flow-clarify
3
- description: 'Deprecated. Clarification step removed from default workflow. Use /flow:spec directly.'
4
- ---
5
-
6
- # /flow:clarify (Deprecated)
7
-
8
- `/flow:clarify` 已从默认主链移除。
9
-
10
- ## Migration
11
-
12
- - 直接执行:`/flow:spec "REQ-123"`
13
- - 如需补充澄清,请将澄清结果写入:`devflow/requirements/<REQ_ID>/context-package.md`
14
-
15
- ## Reason
16
-
17
- - 独立澄清阶段导致链路变长且可恢复点分散。
18
- - 主链改为 `init -> spec -> dev -> verify -> release`。
@@ -1,23 +0,0 @@
1
- ---
2
- name: flow-new
3
- description: 'Deprecated. Use /flow:init -> /flow:spec -> /flow:dev -> /flow:verify -> /flow:release.'
4
- ---
5
-
6
- # /flow:new (Deprecated)
7
-
8
- `/flow:new` 已停止作为默认入口。
9
-
10
- ## Migration Path
11
-
12
- ```bash
13
- /flow:init "REQ-123|Feature|URLs?"
14
- /flow:spec "REQ-123"
15
- /flow:dev "REQ-123"
16
- /flow:verify "REQ-123" --strict
17
- /flow:release "REQ-123"
18
- ```
19
-
20
- ## Why
21
-
22
- - 旧一键编排耦合了已下线阶段(clarify/checklist/quality)。
23
- - 新主链将复杂度收敛到 harness 引擎,支持 checkpoint 恢复与分层门禁。
@@ -1,21 +0,0 @@
1
- ---
2
- name: flow-quality
3
- description: 'Deprecated. Use /flow:verify for quick/strict quality gates.'
4
- ---
5
-
6
- # /flow:quality (Deprecated)
7
-
8
- `/flow:quality` 已废弃。
9
-
10
- ## Migration
11
-
12
- ```bash
13
- /flow:verify "REQ-123"
14
- /flow:verify "REQ-123" --strict
15
- /flow:verify "REQ-123" --strict --skip-review
16
- ```
17
-
18
- ## Reason
19
-
20
- - 质量验证统一收口到 harness verify。
21
- - 门禁结果统一输出到 `report-card.json` 并作为 `/flow:release` 唯一准入条件。