@namewta/speculo 0.1.10 → 0.1.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/dist/src/index.js +6 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/workflows.d.ts +12 -14
- package/dist/src/workflows.js +44 -158
- package/dist/src/workflows.js.map +1 -1
- package/package.json +4 -1
- package/template/workflows/dev/00-INDEX.md +7 -5
- package/template/workflows/dev/H-diagnose/H-diagnose.md +38 -1
- package/template/workflows/dev/H-diagnose/diagnose-fix.md +1 -1
- package/template/workflows/dev/H-diagnose/diagnose-guide.md +30 -0
- package/template/workflows/dev/H-diagnose/diagnose-loop.md +11 -2
- package/template/workflows/dev/I-to-issues/I-to-issues.md +44 -2
- package/template/workflows/dev/I-to-issues/issues-slices.md +37 -6
- package/template/workflows/dev/R-review/R-review.md +46 -1
- package/template/workflows/dev/R-review/review-axes.md +6 -2
- package/template/workflows/dev/R-review/review-setup.md +31 -5
- package/template/workflows/dev/R-review/review-verdict.md +3 -0
package/dist/src/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cp, mkdir, rm } from "node:fs/promises";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
import { pathExists } from "./utils.js";
|
|
4
|
-
import { discoverWorkflowCatalog,
|
|
4
|
+
import { discoverWorkflowCatalog, promptCategorySelection, scanInstalledWorkflows, selectAllFromCatalog, isInteractive, } from "./workflows.js";
|
|
5
5
|
const INIT_ASSETS = [".speculo", "commands", "skills", "workflows"];
|
|
6
6
|
const UPDATE_ASSETS = ["commands", "skills", "workflows"];
|
|
7
7
|
// Assets install under a single `speculo/` directory inside the target,
|
|
@@ -95,7 +95,7 @@ async function resolveSelection(packageRoot, root, options, mode) {
|
|
|
95
95
|
// Interactive mode
|
|
96
96
|
const catalog = await discoverWorkflowCatalog(packageRoot);
|
|
97
97
|
if (mode === 'update') {
|
|
98
|
-
//
|
|
98
|
+
// Pre-select categories that already have at least one workflow installed
|
|
99
99
|
let installed = [];
|
|
100
100
|
try {
|
|
101
101
|
installed = await scanInstalledWorkflows(root);
|
|
@@ -103,9 +103,11 @@ async function resolveSelection(packageRoot, root, options, mode) {
|
|
|
103
103
|
catch {
|
|
104
104
|
// root not readable — treat as empty
|
|
105
105
|
}
|
|
106
|
-
|
|
106
|
+
const preSelectedCategories = new Set(installed.map((w) => w.category));
|
|
107
|
+
return promptCategorySelection(catalog, { preSelectedCategories });
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
+
// Init mode: no pre-selected categories
|
|
110
|
+
return promptCategorySelection(catalog);
|
|
109
111
|
}
|
|
110
112
|
async function initFresh(targetArg = ".", options = {}) {
|
|
111
113
|
const target = resolve(targetArg);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/workflows.d.ts
CHANGED
|
@@ -29,21 +29,19 @@ export declare function scanInstalledWorkflows(installRoot: string): Promise<{
|
|
|
29
29
|
/** Returns true when stdin is a TTY (interactive terminal). */
|
|
30
30
|
export declare function isInteractive(): boolean;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
32
|
+
* Interactive category-level workflow selection using @inquirer checkbox.
|
|
33
|
+
*
|
|
34
|
+
* In init mode, no categories are pre-selected — the user picks what they want.
|
|
35
|
+
* In update mode, categories already installed are pre-selected (checked by default).
|
|
36
|
+
*
|
|
37
|
+
* Returns a WorkflowSelection containing every workflow in the selected categories.
|
|
38
|
+
* If no categories are selected, returns an empty selection (only .speculo, commands,
|
|
39
|
+
* and skills are installed).
|
|
40
|
+
*
|
|
41
|
+
* When stdin is not a TTY (pipe, redirect), falls back to selecting all categories.
|
|
34
42
|
*/
|
|
35
|
-
export declare function
|
|
36
|
-
|
|
37
|
-
}): Promise<WorkflowSelection>;
|
|
38
|
-
/**
|
|
39
|
-
* Show a menu for update mode: split workflows into installed (refreshable)
|
|
40
|
-
* and new (available to add). Returns the combined selection.
|
|
41
|
-
*/
|
|
42
|
-
export declare function promptUpdateSelection(catalog: WorkflowCatalog, installed: {
|
|
43
|
-
category: string;
|
|
44
|
-
name: string;
|
|
45
|
-
}[], options?: {
|
|
46
|
-
all?: boolean;
|
|
43
|
+
export declare function promptCategorySelection(catalog: WorkflowCatalog, options?: {
|
|
44
|
+
preSelectedCategories?: Set<string>;
|
|
47
45
|
}): Promise<WorkflowSelection>;
|
|
48
46
|
/** Build a WorkflowSelection that selects every workflow in the catalog. */
|
|
49
47
|
export declare function selectAllFromCatalog(catalog: WorkflowCatalog): WorkflowSelection;
|
package/dist/src/workflows.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readdir, readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { checkbox } from "@inquirer/prompts";
|
|
4
4
|
// ---- Discovery ----
|
|
5
5
|
const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
|
|
6
6
|
const FIELD_RE = /^(\w+):\s*(.+)$/;
|
|
@@ -103,175 +103,61 @@ export async function scanInstalledWorkflows(installRoot) {
|
|
|
103
103
|
export function isInteractive() {
|
|
104
104
|
return process.stdin.isTTY === true;
|
|
105
105
|
}
|
|
106
|
-
function flattenCatalog(catalog) {
|
|
107
|
-
const flat = [];
|
|
108
|
-
const sortedCategories = [...catalog.keys()].sort();
|
|
109
|
-
for (const cat of sortedCategories) {
|
|
110
|
-
const workflows = catalog.get(cat);
|
|
111
|
-
for (const wf of workflows) {
|
|
112
|
-
flat.push({ entry: wf, index: flat.length + 1 });
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return flat;
|
|
116
|
-
}
|
|
117
|
-
function printCatalogMenu(catalog) {
|
|
118
|
-
const sortedCategories = [...catalog.keys()].sort();
|
|
119
|
-
let num = 1;
|
|
120
|
-
for (const cat of sortedCategories) {
|
|
121
|
-
console.log(`\n [${cat}]`);
|
|
122
|
-
const workflows = catalog.get(cat);
|
|
123
|
-
for (const wf of workflows) {
|
|
124
|
-
const desc = wf.description ? ` — ${wf.description.slice(0, 60)}${wf.description.length > 60 ? "..." : ""}` : "";
|
|
125
|
-
console.log(` ${String(num).padStart(2)}. ${wf.displayName}${desc}`);
|
|
126
|
-
num++;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
console.log("");
|
|
130
|
-
return num - 1;
|
|
131
|
-
}
|
|
132
|
-
function parseSelection(input, maxIndex) {
|
|
133
|
-
const trimmed = input.trim().toLowerCase();
|
|
134
|
-
if (trimmed === "" || trimmed === "all")
|
|
135
|
-
return "all";
|
|
136
|
-
const numbers = [];
|
|
137
|
-
const parts = trimmed.split(/[,\s]+/);
|
|
138
|
-
for (const part of parts) {
|
|
139
|
-
if (part === "")
|
|
140
|
-
continue;
|
|
141
|
-
const n = Number(part);
|
|
142
|
-
if (!Number.isInteger(n) || n < 1 || n > maxIndex)
|
|
143
|
-
return null;
|
|
144
|
-
numbers.push(n);
|
|
145
|
-
}
|
|
146
|
-
return numbers.length > 0 ? numbers : null;
|
|
147
|
-
}
|
|
148
106
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
107
|
+
* Build the choices array for the @inquirer/checkbox prompt.
|
|
108
|
+
* Each category becomes one checkbox option showing its name and workflow count.
|
|
151
109
|
*/
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
110
|
+
function buildCategoryChoices(catalog, preSelected) {
|
|
111
|
+
const sortedCategories = [...catalog.keys()].sort();
|
|
112
|
+
return sortedCategories.map((cat) => {
|
|
113
|
+
const wfs = catalog.get(cat);
|
|
114
|
+
const count = wfs.length;
|
|
115
|
+
const description = `${count} workflow${count > 1 ? "s" : ""}`;
|
|
116
|
+
return {
|
|
117
|
+
name: cat,
|
|
118
|
+
value: cat,
|
|
119
|
+
description,
|
|
120
|
+
checked: preSelected?.has(cat) ?? false,
|
|
121
|
+
};
|
|
164
122
|
});
|
|
165
|
-
let attempts = 0;
|
|
166
|
-
const maxAttempts = 3;
|
|
167
|
-
while (attempts < maxAttempts) {
|
|
168
|
-
const answer = await rl.question(`Select workflows (1-${maxIndex}, comma/space separated, or "all"): `);
|
|
169
|
-
attempts++;
|
|
170
|
-
const result = parseSelection(answer, maxIndex);
|
|
171
|
-
if (result === "all") {
|
|
172
|
-
rl.close();
|
|
173
|
-
return selectAllFromCatalog(catalog);
|
|
174
|
-
}
|
|
175
|
-
if (result !== null) {
|
|
176
|
-
rl.close();
|
|
177
|
-
const workflows = result.map((i) => ({
|
|
178
|
-
category: flat[i - 1].entry.category,
|
|
179
|
-
name: flat[i - 1].entry.name,
|
|
180
|
-
}));
|
|
181
|
-
const categories = new Set(workflows.map((w) => w.category));
|
|
182
|
-
return { workflows, categories };
|
|
183
|
-
}
|
|
184
|
-
console.log(`Invalid selection. Enter numbers 1-${maxIndex} (comma/space separated), or "all".`);
|
|
185
|
-
}
|
|
186
|
-
rl.close();
|
|
187
|
-
throw new Error(`Too many invalid attempts. Please run with --all to install all workflows.`);
|
|
188
123
|
}
|
|
189
124
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
125
|
+
* Interactive category-level workflow selection using @inquirer checkbox.
|
|
126
|
+
*
|
|
127
|
+
* In init mode, no categories are pre-selected — the user picks what they want.
|
|
128
|
+
* In update mode, categories already installed are pre-selected (checked by default).
|
|
129
|
+
*
|
|
130
|
+
* Returns a WorkflowSelection containing every workflow in the selected categories.
|
|
131
|
+
* If no categories are selected, returns an empty selection (only .speculo, commands,
|
|
132
|
+
* and skills are installed).
|
|
133
|
+
*
|
|
134
|
+
* When stdin is not a TTY (pipe, redirect), falls back to selecting all categories.
|
|
192
135
|
*/
|
|
193
|
-
export async function
|
|
194
|
-
// Non-interactive
|
|
195
|
-
if (!isInteractive()
|
|
136
|
+
export async function promptCategorySelection(catalog, options) {
|
|
137
|
+
// Non-interactive → select all
|
|
138
|
+
if (!isInteractive()) {
|
|
196
139
|
return selectAllFromCatalog(catalog);
|
|
197
140
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
for (const w of installed) {
|
|
207
|
-
const catWfs = catalog.get(w.category);
|
|
208
|
-
if (!catWfs || !catWfs.some((e) => e.name === w.name)) {
|
|
209
|
-
staleWarnings.push(`${w.category}/${w.name}`);
|
|
210
|
-
}
|
|
141
|
+
const choices = buildCategoryChoices(catalog, options?.preSelectedCategories);
|
|
142
|
+
const selectedCategories = await checkbox({
|
|
143
|
+
message: "Select workflow categories to install (space to toggle, enter to confirm):",
|
|
144
|
+
choices,
|
|
145
|
+
pageSize: 10,
|
|
146
|
+
});
|
|
147
|
+
if (selectedCategories.length === 0) {
|
|
148
|
+
console.log("No categories selected. No workflows will be installed.\n");
|
|
211
149
|
}
|
|
212
|
-
// Build
|
|
213
|
-
|
|
150
|
+
// Build WorkflowSelection from selected categories
|
|
151
|
+
const workflows = [];
|
|
152
|
+
const categories = new Set();
|
|
153
|
+
for (const cat of selectedCategories) {
|
|
154
|
+
categories.add(cat);
|
|
155
|
+
const wfs = catalog.get(cat) ?? [];
|
|
214
156
|
for (const wf of wfs) {
|
|
215
|
-
|
|
216
|
-
refreshable.push(wf);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
newOnly.push(wf);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
if (staleWarnings.length > 0) {
|
|
224
|
-
console.log(`\n ⚠ Stale (installed but no longer available): ${staleWarnings.join(", ")}`);
|
|
225
|
-
}
|
|
226
|
-
let num = 1;
|
|
227
|
-
const flatWithLabels = [];
|
|
228
|
-
if (refreshable.length > 0) {
|
|
229
|
-
console.log("\n [Installed — select to refresh]");
|
|
230
|
-
for (const wf of refreshable) {
|
|
231
|
-
const desc = wf.description ? ` — ${wf.description.slice(0, 50)}${wf.description.length > 50 ? "..." : ""}` : "";
|
|
232
|
-
console.log(` ${String(num).padStart(2)}. ${wf.displayName} (${wf.category})${desc}`);
|
|
233
|
-
flatWithLabels.push({ entry: wf, label: "installed", index: num });
|
|
234
|
-
num++;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
if (newOnly.length > 0) {
|
|
238
|
-
console.log("\n [NEW — select to add]");
|
|
239
|
-
for (const wf of newOnly) {
|
|
240
|
-
const desc = wf.description ? ` — ${wf.description.slice(0, 50)}${wf.description.length > 50 ? "..." : ""}` : "";
|
|
241
|
-
console.log(` ${String(num).padStart(2)}. ${wf.displayName} (${wf.category}) [NEW]${desc}`);
|
|
242
|
-
flatWithLabels.push({ entry: wf, label: "new", index: num });
|
|
243
|
-
num++;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
console.log("");
|
|
247
|
-
const maxIndex = num - 1;
|
|
248
|
-
const rl = createInterface({
|
|
249
|
-
input: process.stdin,
|
|
250
|
-
output: process.stdout,
|
|
251
|
-
});
|
|
252
|
-
let attempts = 0;
|
|
253
|
-
const maxAttempts = 3;
|
|
254
|
-
while (attempts < maxAttempts) {
|
|
255
|
-
const answer = await rl.question(`Select workflows (1-${maxIndex}, comma/space separated, or "all"): `);
|
|
256
|
-
attempts++;
|
|
257
|
-
const result = parseSelection(answer, maxIndex);
|
|
258
|
-
if (result === "all") {
|
|
259
|
-
rl.close();
|
|
260
|
-
return selectAllFromCatalog(catalog);
|
|
261
|
-
}
|
|
262
|
-
if (result !== null) {
|
|
263
|
-
rl.close();
|
|
264
|
-
const workflows = result.map((i) => ({
|
|
265
|
-
category: flatWithLabels[i - 1].entry.category,
|
|
266
|
-
name: flatWithLabels[i - 1].entry.name,
|
|
267
|
-
}));
|
|
268
|
-
const categories = new Set(workflows.map((w) => w.category));
|
|
269
|
-
return { workflows, categories };
|
|
157
|
+
workflows.push({ category: wf.category, name: wf.name });
|
|
270
158
|
}
|
|
271
|
-
console.log(`Invalid selection. Enter numbers 1-${maxIndex} (comma/space separated), or "all".`);
|
|
272
159
|
}
|
|
273
|
-
|
|
274
|
-
throw new Error(`Too many invalid attempts. Please run with --all to update all workflows.`);
|
|
160
|
+
return { workflows, categories };
|
|
275
161
|
}
|
|
276
162
|
/** Build a WorkflowSelection that selects every workflow in the catalog. */
|
|
277
163
|
export function selectAllFromCatalog(catalog) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/workflows.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/workflows.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@namewta/speculo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "Speculo — specification-driven development framework assets, with a CLI to install and update them across AI coding tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -50,5 +50,8 @@
|
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^22.15.30",
|
|
52
52
|
"typescript": "^5.8.3"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@inquirer/prompts": "^8.5.2"
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -22,9 +22,9 @@ keywords: [dev, 开发, workflow, index, 状态]
|
|
|
22
22
|
| `dev/02` | `02-prd/02-prd.md` | zoom-out 全景理解与 PRD 综合 |
|
|
23
23
|
| `dev/03` | `03-tdd/03-tdd.md` | 垂直切片 TDD 实现 |
|
|
24
24
|
| `dev/04` | `04-finalize/04-finalize.md` | 完成前验证、状态收尾与归档 |
|
|
25
|
-
| `dev/I` | `I-to-issues/I-to-issues.md` | 垂直切片 issue 分解,可嵌入其他 dev workflow |
|
|
26
|
-
| `dev/H` | `H-diagnose/H-diagnose.md` | hotfix / bug /
|
|
27
|
-
| `dev/R` | `R-review/R-review.md` | Spec / Engineering / Standards 三维度 diff
|
|
25
|
+
| `dev/I` | `I-to-issues/I-to-issues.md` | 垂直切片 issue 分解,可嵌入其他 dev workflow,也可独立进入 |
|
|
26
|
+
| `dev/H` | `H-diagnose/H-diagnose.md` | hotfix / bug / 性能回退诊断,零依赖,可独立进入 |
|
|
27
|
+
| `dev/R` | `R-review/R-review.md` | Spec / Engineering / Standards 三维度 diff 审查,零依赖,可独立进入 |
|
|
28
28
|
| `dev/D` | `D-docs-sync/D-docs-sync.md` | 基于 git diff 同步 README、CHANGELOG、AGENTS 等对外文档 |
|
|
29
29
|
|
|
30
30
|
## 进入协议
|
|
@@ -42,11 +42,13 @@ keywords: [dev, 开发, workflow, index, 状态]
|
|
|
42
42
|
- `full`:`dev/01` -> `dev/02` -> `dev/I` -> `dev/03` -> `dev/04`。
|
|
43
43
|
- `planning-only`:`dev/01` -> `dev/02` -> `dev/I`,不进入实现。
|
|
44
44
|
- `implementation-only`:已有 PRD、issue 或明确任务时,从 `dev/03` 开始。
|
|
45
|
-
- `hotfix`:Bug、异常、性能回退时,从 `dev/H`
|
|
46
|
-
- `review`:已有 fixed point 或用户要求审查时,从 `dev/R`
|
|
45
|
+
- `hotfix`:Bug、异常、性能回退时,从 `dev/H` 开始(零依赖,无需上游工作流产物);修复阶段可嵌入 `dev/03` 的 TDD 回归循环。
|
|
46
|
+
- `review`:已有 fixed point 或用户要求审查时,从 `dev/R` 开始(零依赖,无需上游工作流产物)。
|
|
47
47
|
- `finalize`:实现完成、需要完成前验证与状态收尾归档时,从 `dev/04` 开始。
|
|
48
48
|
- `docs-sync`:需要基于 git 差异刷新对外文档时,从 `dev/D` 开始。
|
|
49
49
|
|
|
50
|
+
> **独立入口说明:** `dev/H`、`dev/I`、`dev/R` 三个横向工作流均为零硬依赖设计。用户可直接从任一入口进入,无需预先执行 `dev/01`、`dev/02` 等主线工作流。当同 change 目录下缺少上游产物时,各工作流会自行通过代码库探索(git 考古、grep 搜索、文档扫描)采集所需上下文,仅在代码库无法确定的决策点上询问用户。
|
|
51
|
+
|
|
50
52
|
## 状态汇报
|
|
51
53
|
|
|
52
54
|
输出 dev 状态时至少包含:
|
|
@@ -39,6 +39,43 @@ keywords: [diagnose, hotfix, bug, debug, performance, 回归]
|
|
|
39
39
|
|
|
40
40
|
详细诊断纪律在同目录 `diagnose-guide.md`。必须由人类操作才能复现时,按 `scripts/hitl-loop.template.sh` 建立结构化 HITL 循环。
|
|
41
41
|
|
|
42
|
+
### 独立使用
|
|
43
|
+
|
|
44
|
+
本工作流**零硬依赖**,无需预先执行 dev/01、dev/02 等其他工作流即可独立进入。只需用户描述 Bug/异常/性能症状 + 当前 git 仓库即可启动。
|
|
45
|
+
|
|
46
|
+
**独立进入流程:**
|
|
47
|
+
|
|
48
|
+
1. **change 目录**:若用户未指定 `<change>` 目录,按 `YYYY-MM-DD-<kebab-name>` 格式创建(如 `2026-06-17-fix-login-timeout`),初始化 `.status.json` 并更新 `dev-status.json`。
|
|
49
|
+
2. **信息自采集**:若同 change 目录下无上游产物(PRD、decision-log 等),**自行通过代码库探索采集诊断所需上下文**,不要求用户先执行其他工作流:
|
|
50
|
+
- `git log --oneline -30` 查找近期相关变更
|
|
51
|
+
- 搜索错误信息/堆栈中的关键符号(`grep -rn` 在项目中定位)
|
|
52
|
+
- 读取相关模块的代码、测试和配置文件
|
|
53
|
+
- 检查 `speculo/.speculo/.config/` 下的项目规则与 ADR
|
|
54
|
+
3. **深度搜索**:反馈循环构建受阻时,不轻易放弃——按 `diagnose-guide.md` 的 10 种方法逐项尝试;代码库中找不到线索时,搜索项目文档、issue tracker、CI 日志。
|
|
55
|
+
4. **仅必要时询问**:仅在代码库探索无法确定的关键决策点(如需要访问外部环境、需要用户提供日志文件)使用 `AskUserQuestion`。
|
|
56
|
+
|
|
57
|
+
### 缺少 change 目录时的自初始化
|
|
58
|
+
|
|
59
|
+
若当前无对应 change 目录,按以下步骤创建:
|
|
60
|
+
|
|
61
|
+
1. 从用户报告的 Bug/异常提取 `<kebab-name>`(如 `fix-login-timeout`、`fix-payment-npe`)
|
|
62
|
+
2. 创建 `speculo/.speculo/dev/<YYYY-MM-DD>-<kebab-name>/`
|
|
63
|
+
3. 初始化 `.status.json`:
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"dev_entry": "dev/H",
|
|
67
|
+
"current_phase": "1. Diagnose Loop",
|
|
68
|
+
"phase_history": [],
|
|
69
|
+
"change_status": "active",
|
|
70
|
+
"embedded_guides": ["diagnose"],
|
|
71
|
+
"feedback_loop": "none",
|
|
72
|
+
"hypothesis_status": "open",
|
|
73
|
+
"regression_test": "blocked",
|
|
74
|
+
"debug_artifacts": []
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
4. 在 `speculo/.speculo/dev-status.json` 的 `active` 数组中追加该 change 目录名
|
|
78
|
+
|
|
42
79
|
## 阶段
|
|
43
80
|
|
|
44
81
|
### 1. Diagnose Loop — 反馈循环与假设
|
|
@@ -61,8 +98,8 @@ keywords: [diagnose, hotfix, bug, debug, performance, 回归]
|
|
|
61
98
|
|
|
62
99
|
## 依赖
|
|
63
100
|
|
|
64
|
-
- 软依赖:无
|
|
65
101
|
- 硬依赖:无
|
|
102
|
+
- 软依赖:无。若同 change 目录下存在其他工作流产物(如 diagnosis.md),可继承其信息加速执行;缺失时自行采集,不阻塞流程。修复阶段可嵌入 `../03-tdd/03-tdd.md` 的 Slice Loop 执行 TDD 修复,此为可选加速而非必须。
|
|
66
103
|
|
|
67
104
|
## 状态扩展字段
|
|
68
105
|
|
|
@@ -4,6 +4,36 @@
|
|
|
4
4
|
|
|
5
5
|
一套针对疑难 Bug 的纪律。仅在明确合理时才跳过阶段。
|
|
6
6
|
|
|
7
|
+
## 独立诊断时的信息采集
|
|
8
|
+
|
|
9
|
+
当本工作流独立进入(无上游 PRD、decision-log 等产物)时,在构建反馈循环之前先执行以下信息采集。不要求用户先跑其他工作流。
|
|
10
|
+
|
|
11
|
+
### 1. 快速环境扫描
|
|
12
|
+
|
|
13
|
+
- `git log --oneline -30` 查看近期变更,关注可能与 Bug 相关的 commit
|
|
14
|
+
- `git log --oneline --all -- <相关文件路径>` 追溯问题模块的变更历史
|
|
15
|
+
- 读取 `speculo/.speculo/.config/RULES.md` 了解项目规则
|
|
16
|
+
- 读取相关模块的 `README.md` 或 `AGENTS.md` 了解架构约定
|
|
17
|
+
|
|
18
|
+
### 2. 症状定位
|
|
19
|
+
|
|
20
|
+
- 若有错误信息/堆栈:`grep -rn "<关键符号>"` 在项目中全局搜索,定位所有相关代码路径
|
|
21
|
+
- 若有性能回退:搜索相关模块最近的性能敏感变更(循环、查询、缓存)
|
|
22
|
+
- 若为测试失败:读取失败测试文件及其覆盖的源代码,理解预期行为
|
|
23
|
+
- 搜索项目中是否已有类似的 issue、TODO、FIXME 提及该问题
|
|
24
|
+
|
|
25
|
+
### 3. 相关模块深度探索
|
|
26
|
+
|
|
27
|
+
- 读取问题代码路径的所有相关文件(调用链上下游)
|
|
28
|
+
- 阅读现有测试了解模块契约
|
|
29
|
+
- 检查 `speculo/.speculo/.config/adr/` 中与问题模块相关的架构决策
|
|
30
|
+
- 搜索 `speculo/.speculo/doc/` 中已有的领域文档
|
|
31
|
+
|
|
32
|
+
### 4. 信息仍不足时
|
|
33
|
+
|
|
34
|
+
- 用 `AskUserQuestion` 向用户索取:复现环境、日志文件、HAR 捕获、核心转储等——但仅在代码库探索穷尽后
|
|
35
|
+
- 不要因缺少上游产物而放弃或要求用户先执行 dev/01、dev/02
|
|
36
|
+
|
|
7
37
|
探索代码库时,使用项目的领域术语表来建立相关模块的清晰心智模型,并查阅你所触及区域的 ADR。
|
|
8
38
|
|
|
9
39
|
## 阶段 1 —— 构建反馈循环
|
|
@@ -4,8 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
- 用户描述的失败现象、日志、trace、性能症状或失败测试
|
|
6
6
|
- 可运行的测试、脚本、服务、CLI 或浏览器自动化
|
|
7
|
-
- `H-diagnose.md`
|
|
8
|
-
- 同目录 `diagnose-guide.md
|
|
7
|
+
- `H-diagnose.md` 中的内置诊断指引(含独立使用协议与自初始化步骤)
|
|
8
|
+
- 同目录 `diagnose-guide.md`(含独立诊断时的信息采集协议)
|
|
9
|
+
|
|
10
|
+
### 独立进入时的上下文自采集
|
|
11
|
+
|
|
12
|
+
若无上游工作流产物(PRD、decision-log 等),在进入反馈循环构建前,按 `diagnose-guide.md` 的「独立诊断时的信息采集」执行以下快速自采集,**不要求用户先执行其他工作流**:
|
|
13
|
+
|
|
14
|
+
1. `git log --oneline -30` + 搜索错误关键符号 → 定位相关代码区域
|
|
15
|
+
2. 读取问题模块及其测试 → 理解预期行为
|
|
16
|
+
3. 检查 `speculo/.speculo/.config/` 下的项目规则与 ADR → 了解约束
|
|
17
|
+
4. 仅在代码库探索穷尽后,使用 `AskUserQuestion` 向用户索取无法从仓库获取的信息(复现环境、日志文件等)
|
|
9
18
|
|
|
10
19
|
## 产物
|
|
11
20
|
|
|
@@ -50,6 +50,48 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
50
50
|
- **复用优先于新造**:能复用就不新建,在切片「复用」字段与 §1 REUSE 列显式记录。
|
|
51
51
|
- **重型小节按需**:风险登记、退役清单、架构上下文是条件段——复杂 change 铺开,单文件小改可省。
|
|
52
52
|
|
|
53
|
+
### 独立使用
|
|
54
|
+
|
|
55
|
+
本工作流**零硬依赖**,无需预先执行 dev/01、dev/02 等其他工作流即可独立进入。只需用户描述任务意图 + 当前 git 仓库即可启动。
|
|
56
|
+
|
|
57
|
+
**独立进入流程:**
|
|
58
|
+
|
|
59
|
+
1. **change 目录**:若用户未指定 `<change>` 目录,按 `YYYY-MM-DD-<kebab-name>` 格式创建(如 `2026-06-17-refactor-auth`),初始化 `.status.json` 并更新 `dev-status.json`。
|
|
60
|
+
2. **信息自采集**:若同 change 目录下无上游产物(PRD、decision-log、diagnosis 等),**自行通过代码库探索采集切片所需上下文**,不要求用户先执行其他工作流:
|
|
61
|
+
- 探索项目目录结构,建立模块心智模型(`src/`、`core/`、`tests/` 等)
|
|
62
|
+
- 读取 `AGENTS.md`、`README.md`、`CONTRIBUTING.md` 了解项目规范与架构约定
|
|
63
|
+
- `git log --oneline -30` 了解近期变更趋势和相关模块
|
|
64
|
+
- 搜索相关代码区域的注释、TODO、FIXME 和现有 issue 引用
|
|
65
|
+
- 读取 `speculo/.speculo/.config/RULES.md` 和 `speculo/.speculo/.config/adr/` 了解项目决策
|
|
66
|
+
3. **深度搜索**:信息仍不足时,执行以下顺序的深度探寻:
|
|
67
|
+
- 搜索项目中与用户意图关键词匹配的代码、注释和文档
|
|
68
|
+
- 追溯相关模块的 git history(`git log -p -- <path>`)
|
|
69
|
+
- 搜索 `speculo/.speculo/doc/` 和 `speculo/.speculo/archive/` 中已有的领域文档
|
|
70
|
+
- 检查现有测试文件了解模块契约和边界行为
|
|
71
|
+
4. **存疑即问**:仅在代码库探索无法确定的决策分支上,按「存疑时的提问协议」使用 `AskUserQuestion` 一次一问、带推荐、逐步锁定。
|
|
72
|
+
|
|
73
|
+
### 缺少 change 目录时的自初始化
|
|
74
|
+
|
|
75
|
+
若当前无对应 change 目录,按以下步骤创建:
|
|
76
|
+
|
|
77
|
+
1. 从用户意图提取 `<kebab-name>`(如 `refactor-auth`、`add-export-feature`)
|
|
78
|
+
2. 创建 `speculo/.speculo/dev/<YYYY-MM-DD>-<kebab-name>/`
|
|
79
|
+
3. 初始化 `.status.json`:
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"dev_entry": "dev/I",
|
|
83
|
+
"current_phase": "1. Slice Issues",
|
|
84
|
+
"phase_history": [],
|
|
85
|
+
"change_status": "active",
|
|
86
|
+
"embedded_guides": ["to-issues"],
|
|
87
|
+
"slice_count": 0,
|
|
88
|
+
"hitl_slice_count": 0,
|
|
89
|
+
"published_issue_refs": [],
|
|
90
|
+
"issue_tracker_mode": "local-only"
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
4. 在 `speculo/.speculo/dev-status.json` 的 `active` 数组中追加该 change 目录名
|
|
94
|
+
|
|
53
95
|
## 阶段
|
|
54
96
|
|
|
55
97
|
### 1. Slice Issues — 垂直切片分解
|
|
@@ -65,8 +107,8 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
65
107
|
|
|
66
108
|
## 依赖
|
|
67
109
|
|
|
68
|
-
-
|
|
69
|
-
-
|
|
110
|
+
- 硬依赖:无
|
|
111
|
+
- 软依赖:无。若同 change 目录下存在其他工作流产物(如 prd.md、decision-log.md、diagnosis.md),可继承其信息加速执行;缺失时自行采集,不阻塞流程。完成后通常移交 `../03-tdd/03-tdd.md`,此为推荐后续而非必须。
|
|
70
112
|
|
|
71
113
|
## 状态扩展字段
|
|
72
114
|
|
|
@@ -4,12 +4,43 @@
|
|
|
4
4
|
> `slices.md` 借鉴高质量 plan 的纪律——以厚 Context(已确认决策 + 关键核实结论)开篇,按依赖排序的切片展开,
|
|
5
5
|
> 每切片标注保留/不动,并以分层验证收口;同时保留 HITL/AFK 标记、用户确认与 issue 发布流程。
|
|
6
6
|
|
|
7
|
+
## 独立进入时的深度搜索协议
|
|
8
|
+
|
|
9
|
+
当本工作流独立进入(无上游 PRD、decision-log、diagnosis 等产物)时,在执行切片分解前先按以下步骤自行采集上下文。**不要求用户先执行 dev/01、dev/02 或其他工作流。**
|
|
10
|
+
|
|
11
|
+
### 第一轮:项目全景扫描
|
|
12
|
+
|
|
13
|
+
1. **目录结构探索**:遍历项目顶层目录(`src/`、`core/`、`tests/`、`docs/` 等),建立模块边界心智模型
|
|
14
|
+
2. **项目规范读取**:读取 `AGENTS.md`、`README.md`、`CONTRIBUTING.md`,提取架构约定、命名规范、测试策略
|
|
15
|
+
3. **配置与依赖**:读取 `package.json`(或等效构建文件),了解技术栈、依赖和脚本入口
|
|
16
|
+
4. **Speculo 状态读取**:读取 `speculo/.speculo/.config/RULES.md`、`speculo/.speculo/.config/adr/`、`speculo/.speculo/dev-status.json`,了解项目决策与当前活跃 change
|
|
17
|
+
5. **近期变更趋势**:`git log --oneline -30` 了解近期工作方向
|
|
18
|
+
|
|
19
|
+
### 第二轮:领域上下文采集
|
|
20
|
+
|
|
21
|
+
6. **搜索相关代码**:按用户意图关键词在项目中 `grep -rn`,定位所有相关代码路径、注释、TODO
|
|
22
|
+
7. **文档检索**:搜索 `speculo/.speculo/doc/` 和 `speculo/.speculo/archive/` 中已有的领域分析、设计文档
|
|
23
|
+
8. **测试即规格**:阅读相关模块的现有测试文件——测试描述了系统契约和边界行为
|
|
24
|
+
9. **git 考古**:对关键路径执行 `git log -p -- <path>` 理解模块的演进动机
|
|
25
|
+
|
|
26
|
+
### 第三轮:锁定未决分支
|
|
27
|
+
|
|
28
|
+
10. **已确认决策的底线**:从以上探索中能确定的事实写入 §0「已确认决策」;无法从代码/文档确定的分支标记为 `[待确认]`
|
|
29
|
+
11. **提问收敛**:对标记 `[待确认]` 的决策分支,按「存疑时的提问协议」逐一锁定——但仅在代码库探索穷尽后
|
|
30
|
+
|
|
31
|
+
### 采集成果写入
|
|
32
|
+
|
|
33
|
+
- 探索确认的事实 → §0「关键核实结论」(注明行号近似)
|
|
34
|
+
- 从代码/文档提取的约束 → §1 IN/REUSE/OUT、§2 架构约束
|
|
35
|
+
- 无法从代码库确定的 → `[待确认]` 标记,按提问协议处理
|
|
36
|
+
- 从 `prd-overview.md` 或现有文档继承的风险 → §6 风险与回滚
|
|
37
|
+
|
|
7
38
|
## 输入
|
|
8
39
|
|
|
9
|
-
- `prd.md`、`decision-log.md`、`diagnosis.md`、现有 issue
|
|
40
|
+
- `prd.md`、`decision-log.md`、`diagnosis.md`、现有 issue 或用户计划(均为可选;缺失时按「独立进入时的深度搜索协议」自行采集)
|
|
10
41
|
- 可选 issue tracker 配置和标签词汇表
|
|
11
|
-
- `I-to-issues.md`
|
|
12
|
-
- 同级 change 目录下已有的 `context-map.md`、`decision-log.md`、`prd-overview.md`(若存在,用于继承领域术语、已确认决策、风险与 ADR
|
|
42
|
+
- `I-to-issues.md` 中的内置切片指引、「切片计划质量准则」与「独立使用」协议
|
|
43
|
+
- 同级 change 目录下已有的 `context-map.md`、`decision-log.md`、`prd-overview.md`(若存在,用于继承领域术语、已确认决策、风险与 ADR 引用;不存在则按深度搜索协议自采集)
|
|
13
44
|
|
|
14
45
|
## 产物
|
|
15
46
|
|
|
@@ -112,12 +143,12 @@ change 级验证 roll-up,补足每切片「验收切片」的整体闭环(
|
|
|
112
143
|
|
|
113
144
|
## 存疑时的提问协议(决策树)
|
|
114
145
|
|
|
115
|
-
切分切片或填 §0
|
|
146
|
+
切分切片或填 §0「已确认决策」时若有未决分支,**不要臆测**——先用代码库探索尝试确定,无法确定时再用 `AskUserQuestion` 按决策树逐一锁定;本协议产出的共识即写入 §0:
|
|
116
147
|
|
|
117
148
|
1. **定位关键问题**:识别当前最影响方案正确性的那一个未决问题。
|
|
118
|
-
2. **先查后问**:若答案能用本地代码 / 文档 /
|
|
149
|
+
2. **先查后问**:若答案能用本地代码 / 文档 / 配置确认,先读相关材料;搜索 `grep -rn`、`git log`、读取测试文件。能从仓库确定则不问。
|
|
119
150
|
3. **一次一问**:每次只问一个问题,不打包问题组。
|
|
120
|
-
4.
|
|
151
|
+
4. **带推荐**:每个问题给出推荐答案并说明理由(基于已探索的代码库上下文)。
|
|
121
152
|
5. **回答后收敛**:用户回答后,更新 §0「已确认决策」与剩余分支。
|
|
122
153
|
6. **遍历至共识**:沿决策树继续,直到核心分支达成共识或用户叫停。
|
|
123
154
|
|
|
@@ -60,6 +60,51 @@ keywords: [review, diff, spec, engineering, standards, security, solid, pr, 审
|
|
|
60
60
|
- `code-quality-checklist.md`:检查错误处理、性能 / 缓存、边界条件时读取。
|
|
61
61
|
- `removal-checklist.md`:识别死代码与删除候选、产出删除 / 推迟计划时读取。
|
|
62
62
|
|
|
63
|
+
### 独立使用
|
|
64
|
+
|
|
65
|
+
本工作流**零硬依赖**,无需预先执行 dev/01、dev/02、dev/I 等其他工作流即可独立进入。只需用户提供 fixed point(分支/commit/tag)+ 当前 git 仓库即可启动。
|
|
66
|
+
|
|
67
|
+
**独立进入流程:**
|
|
68
|
+
|
|
69
|
+
1. **fixed point**:若用户未指定,先询问;拿到前不继续。在 worktree 模式下默认取 `base_branch`。
|
|
70
|
+
2. **change 目录**:若用户未指定 `<change>` 目录,按 `YYYY-MM-DD-<kebab-name>` 格式创建(如 `2026-06-17-review-auth-refactor`),初始化 `.status.json` 并更新 `dev-status.json`。
|
|
71
|
+
3. **信息自采集**:若同 change 目录下无上游产物(PRD、slices、decision-log 等),**自行通过代码库探索采集审查所需上下文**,不要求用户先执行其他工作流:
|
|
72
|
+
- `git log <fixed-point>..HEAD --oneline` 提取 commit message 中的 issue/PR 引用
|
|
73
|
+
- 搜索仓库中与变更模块匹配的 spec 文档、README、设计文档
|
|
74
|
+
- 从代码注释、TODO/FIXME 和 commit message 正文推断需求意图
|
|
75
|
+
- 搜索 `speculo/.speculo/.config/RULES.md`、`speculo/.speculo/.config/adr/`、`AGENTS.md`、`CONTRIBUTING.md` 获取标准来源
|
|
76
|
+
- 搜索 `.editorconfig`、`eslint.config.*`、`biome.json`、`prettier.config.*`、`tsconfig.json` 获取机器强制标准
|
|
77
|
+
4. **深度搜索**:Spec 和 Standards 来源仍不足时:
|
|
78
|
+
- 对关键路径(auth/支付/数据写入/网络)执行额外的代码库考古(`git log -p -- <path>`)
|
|
79
|
+
- 搜索 `speculo/.speculo/doc/` 和 `speculo/.speculo/archive/` 中的领域文档
|
|
80
|
+
- 检查变更模块的现有测试文件以推断预期行为
|
|
81
|
+
5. **诚实优先**:找不到 spec 时明确记录 `no spec available`,不编造;找不到成文标准时记录覆盖空白,不把缺失当作"无问题"。Engineering 维度始终执行,不依赖任何外部产物。
|
|
82
|
+
|
|
83
|
+
### 缺少 change 目录时的自初始化
|
|
84
|
+
|
|
85
|
+
若当前无对应 change 目录,按以下步骤创建:
|
|
86
|
+
|
|
87
|
+
1. 从审查意图提取 `<kebab-name>`(如 `review-auth-refactor`、`review-api-changes`)
|
|
88
|
+
2. 创建 `speculo/.speculo/dev/<YYYY-MM-DD>-<kebab-name>/`
|
|
89
|
+
3. 初始化 `.status.json`:
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"dev_entry": "dev/R",
|
|
93
|
+
"current_phase": "1. Review Setup",
|
|
94
|
+
"phase_history": [],
|
|
95
|
+
"change_status": "active",
|
|
96
|
+
"review_fixed_point": null,
|
|
97
|
+
"review_diff_command": null,
|
|
98
|
+
"review_axes": ["spec", "engineering", "standards"],
|
|
99
|
+
"standards_sources": [],
|
|
100
|
+
"spec_sources": [],
|
|
101
|
+
"severity_summary": { "p0": 0, "p1": 0, "p2": 0, "p3": 0 },
|
|
102
|
+
"review_verdict": null,
|
|
103
|
+
"review_status": "collecting"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
4. 在 `speculo/.speculo/dev-status.json` 的 `active` 数组中追加该 change 目录名
|
|
107
|
+
|
|
63
108
|
## 阶段
|
|
64
109
|
|
|
65
110
|
### 1. Review Setup — 固定点、范围与来源收集
|
|
@@ -93,8 +138,8 @@ keywords: [review, diff, spec, engineering, standards, security, solid, pr, 审
|
|
|
93
138
|
|
|
94
139
|
## 依赖
|
|
95
140
|
|
|
96
|
-
- 软依赖:`../02-prd/02-prd.md` 或 `../I-to-issues/I-to-issues.md`,scope: same-change
|
|
97
141
|
- 硬依赖:无;用户提供 fixed point 即可进入
|
|
142
|
+
- 软依赖:无。若同 change 目录下存在其他工作流产物(如 prd.md、slices.md、decision-log.md),可继承其信息增强 Spec 维度审查;缺失时自行采集(commit message、代码注释、项目文档),不阻塞流程。审查完成后是否进入修复(`../03-tdd/03-tdd.md`)或归档(`../04-finalize/04-finalize.md`)由用户决定。
|
|
98
143
|
|
|
99
144
|
## 状态扩展字段
|
|
100
145
|
|
|
@@ -18,9 +18,13 @@
|
|
|
18
18
|
|
|
19
19
|
### Spec 维度(做对了吗)
|
|
20
20
|
|
|
21
|
-
1. 先读 spec
|
|
21
|
+
1. 先读 spec(若有),再读 diff;若无 spec 且 `review-setup.md` 记录为 `no spec available`,则从以下自推断来源检查一致性:
|
|
22
|
+
- **commit message 推断**:commit message 中描述的需求是否在 diff 中完整实现
|
|
23
|
+
- **测试推断**:新增/修改的测试所描述的预期行为是否在 diff 中正确实现
|
|
24
|
+
- **代码注释推断**:diff 中 TODO/FIXME/HACK 标记的意图是否被正确落实
|
|
25
|
+
- **自推断仍不足时**:整区写 `no spec available — unable to verify spec compliance`
|
|
22
26
|
2. 报告:缺失需求、范围蔓延(spec 外的实现)、看似实现但有问题的需求。
|
|
23
|
-
3. 每条引用 spec
|
|
27
|
+
3. 每条引用 spec 原文(若有)或推断来源(commit message/测试/注释)。
|
|
24
28
|
|
|
25
29
|
### Engineering 维度(做好了吗)
|
|
26
30
|
|
|
@@ -6,6 +6,28 @@
|
|
|
6
6
|
- 当前 git 仓库
|
|
7
7
|
- 当前 change 目录:`speculo/.speculo/dev/<change>/`
|
|
8
8
|
|
|
9
|
+
## 独立进入时的来源深度搜索
|
|
10
|
+
|
|
11
|
+
当本工作流独立进入(无上游 PRD、slices、decision-log 等产物)时,在收集 spec 和 standards 来源时执行以下扩展搜索。**不要求用户先执行 dev/01、dev/02 或其他工作流。**
|
|
12
|
+
|
|
13
|
+
### Spec 来源的扩展发现(按优先级)
|
|
14
|
+
|
|
15
|
+
1. **commit message 提取**:`git log <fixed-point>..HEAD --oneline` + `git log <fixed-point>..HEAD --format="%B"` 提取全部 commit message 正文,搜索 issue/PR 引用(`#\d+`、`fixes #`、`closes #`、JIRA key 模式)
|
|
16
|
+
2. **commit message 全文搜索**:`git log <fixed-point>..HEAD --grep="<关键词>"` 搜索与变更主题相关的 commit
|
|
17
|
+
3. **代码注释/TODO 提取**:在 diff 涉及的文件中搜索注释、TODO、FIXME 和 HACK 标记——这些常包含需求意图
|
|
18
|
+
4. **本地 spec 文档搜索**:搜索仓库中与分支名、变更模块名匹配的 `.md` 文档、`docs/` 目录、`spec/` 目录
|
|
19
|
+
5. **Speculo 文档搜索**:搜索 `speculo/.speculo/doc/`、`speculo/.speculo/archive/` 中与变更模块相关的领域文档
|
|
20
|
+
6. **测试文件读取**:读取 diff 中测试文件的变更——新增测试描述了预期行为
|
|
21
|
+
7. **上游产物继承**(若存在):`speculo/.speculo/dev/<change>/prd.md`、`slices.md`、`decision-log.md`
|
|
22
|
+
8. **以上均无时**:记录 `no spec available`——Spec 维度跳过,不编造来源
|
|
23
|
+
|
|
24
|
+
### Standards 来源的扩展发现
|
|
25
|
+
|
|
26
|
+
1. **Speculo 配置搜索**:`speculo/.speculo/.config/RULES.md`、`speculo/.speculo/.config/adr/`、`speculo/.speculo/.config/context/`
|
|
27
|
+
2. **项目根文档搜索**:`AGENTS.md`、`CONTRIBUTING.md`、`CLAUDE.md`、`README.md`
|
|
28
|
+
3. **工具配置搜索**:`.editorconfig`、`eslint.config.*`、`biome.json`、`prettier.config.*`、`tsconfig.json`、`pyproject.toml`
|
|
29
|
+
4. **全部缺失时**:记录覆盖空白说明(如"仓库无 RULES.md、无 ADR、无 CONTRIBUTING.md——Standards 维度仅检查通用工程实践"),不把缺失当作"无问题"
|
|
30
|
+
|
|
9
31
|
## 产物
|
|
10
32
|
|
|
11
33
|
- `speculo/.speculo/dev/<change>/review-sources.md`,由 `../_templates/review-sources-template.md` 填写
|
|
@@ -19,17 +41,21 @@
|
|
|
19
41
|
- **大 diff(> 500 行)**:先按文件 / 模块汇总,再按模块或功能分批审查。
|
|
20
42
|
- **混合关注点**:按逻辑功能分组,不只按文件顺序。
|
|
21
43
|
4. 标识关键路径:auth / 授权、支付 / 金额、数据写入、网络 / 外部调用、并发 —— 这些区域在 Engineering 维度需重点审查。
|
|
22
|
-
5. 寻找 spec
|
|
23
|
-
- commit message 中的 issue / PR 引用
|
|
44
|
+
5. 寻找 spec 来源,按「独立进入时的来源深度搜索」中的 Spec 扩展发现顺序执行:
|
|
45
|
+
- commit message 中的 issue / PR 引用 → commit message 全文搜索
|
|
24
46
|
- 用户作为参数传入的路径
|
|
25
|
-
-
|
|
47
|
+
- 代码注释/TODO/FIXME 中的需求线索
|
|
26
48
|
- 仓库中与分支名或功能匹配的规格文档
|
|
27
|
-
|
|
49
|
+
- `speculo/.speculo/dev/<change>/prd.md`、`slices.md`、`decision-log.md`(若存在)
|
|
50
|
+
- `speculo/.speculo/doc/` 和 `speculo/.speculo/archive/` 中的领域文档
|
|
51
|
+
- 以上均无时记录 `no spec available`
|
|
52
|
+
6. 寻找 standards 来源,按「独立进入时的来源深度搜索」中的 Standards 扩展发现顺序执行:
|
|
28
53
|
- `speculo/.speculo/.config/RULES.md`
|
|
29
54
|
- `speculo/.speculo/.config/context/`
|
|
30
55
|
- `speculo/.speculo/.config/adr/`
|
|
31
|
-
- `AGENTS.md`、`CONTRIBUTING.md`
|
|
56
|
+
- `AGENTS.md`、`CONTRIBUTING.md`、`CLAUDE.md`
|
|
32
57
|
- `.editorconfig`、`eslint.config.*`、`biome.json`、`prettier.config.*`、`tsconfig.json`
|
|
58
|
+
- 全部缺失时记录覆盖空白说明
|
|
33
59
|
7. 机器强制的标准只记录来源,不重复检查工具已覆盖的内容。
|
|
34
60
|
8. Engineering 维度不需要外部来源,但记录将依据同目录的 `solid-checklist.md`、`security-checklist.md`、`code-quality-checklist.md`、`removal-checklist.md`。
|
|
35
61
|
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
2. 仅修复 P0 / P1
|
|
26
26
|
3. 修复指定项(由用户点名)
|
|
27
27
|
4. 不改动,审查到此为止
|
|
28
|
+
- 若选择修复且仓库支持,移交 `../03-tdd/03-tdd.md` 的红绿重构循环
|
|
29
|
+
- 若选择不改动且 change 已完成其使命,可移交 `../04-finalize/04-finalize.md` 归档
|
|
30
|
+
- 独立进入时(无上下游工作流),以上移交均为可选推荐,由用户决定后续路径
|
|
28
31
|
5. 用户选择修复时,移交 `../03-tdd/03-tdd.md` 的红绿重构循环执行,并在该 change 内继续维护状态。
|
|
29
32
|
|
|
30
33
|
## 边界
|