@namewta/speculo 0.6.0 → 0.6.1
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/README.md +7 -4
- package/dist/src/cli.js +2 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.js +37 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrate.d.ts +14 -1
- package/dist/src/migrate.js +308 -11
- package/dist/src/migrate.js.map +1 -1
- package/package.json +3 -2
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +133 -141
- package/template/canonical/canonical-specdev-goal-plan.md +394 -377
- package/template/canonical/canonical-specdev-grill-with-docs.md +241 -178
- package/template/canonical/canonical-specdev-spec.md +132 -122
- package/template/canonical/canonical-specdev-tickets.md +176 -156
- package/template/canonical/canonical-specdev-wayfinder.md +106 -108
- package/template/commands/archive-and-consolidate.md +10 -8
- package/template/commands/handoff.md +2 -0
- package/template/commands/retro.md +3 -3
- package/template/commands/status.md +5 -4
- package/template/skills/archive-and-consolidate/SKILL.md +5 -9
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +1 -1
- package/template/skills/archive-and-consolidate/references/archive-rules.md +4 -4
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +7 -8
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +5 -2
- package/template/skills/github-npm-ops/SKILL.md +4 -2
- package/template/skills/github-npm-ops/references/issue-transport.md +26 -0
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +227 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +31 -145
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +4 -6
- package/template/workflows/specdev/C-code-review/C-code-review.md +42 -0
- package/template/workflows/specdev/C-code-review/code-review-template.md +42 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +45 -48
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +44 -40
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +41 -0
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-and-instrumentation.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/scripts/hitl-loop.template.sh +26 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +3 -3
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +5 -20
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +17 -10
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +31 -17
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +9 -29
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +10 -5
- package/template/workflows/specdev/G-grill-with-docs/stakeholder-questionnaire.md +45 -0
- package/template/workflows/specdev/I-implement/I-implement.md +29 -14
- package/template/workflows/specdev/I-implement/delegated-evidence-template.md +11 -0
- package/template/workflows/specdev/I-implement/evidence-template.md +24 -10
- package/template/workflows/specdev/I-implement/execution-preflight.md +4 -4
- package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-mocking.md +19 -0
- package/template/workflows/specdev/I-implement/tdd-rules.md +14 -12
- package/template/workflows/specdev/I-implement/tdd-test-design.md +25 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +12 -9
- package/template/workflows/specdev/I-init-setup/config-template.json +1 -1
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +2 -2
- package/template/workflows/specdev/I-init-setup/status-template.json +2 -3
- package/template/workflows/specdev/I-init-setup/tracking-template.md +3 -0
- package/template/workflows/specdev/INDEX.md +64 -26
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +48 -38
- package/template/workflows/specdev/P-goal-plan/completion-control.md +19 -53
- package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +33 -0
- package/template/workflows/specdev/P-goal-plan/delegated-execution.md +53 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +9 -40
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +16 -68
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +20 -48
- package/template/workflows/specdev/P-prototype/P-prototype.md +46 -0
- package/template/workflows/specdev/P-prototype/logic-prototype.md +24 -0
- package/template/workflows/specdev/P-prototype/prototype-record-template.md +46 -0
- package/template/workflows/specdev/P-prototype/ui-prototype.md +21 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +1 -1
- package/template/workflows/specdev/S-spec/S-spec.md +2 -1
- package/template/workflows/specdev/T-tickets/T-tickets.md +3 -2
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +1 -1
- package/template/workflows/specdev/T-tickets/ticket-template.md +1 -1
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +1 -1
- package/template/workflows/specdev/T-triage/T-triage.md +65 -26
- package/template/workflows/specdev/T-triage/intake-protocol.md +32 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +34 -0
- package/template/workflows/specdev/T-triage/source-template.md +30 -0
- package/template/workflows/specdev/T-triage/triage-template.md +38 -24
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +3 -1
- package/template/workflows/specdev/_state/status.json +2 -3
- package/template/workflows/specdev/common/README.md +9 -2
- package/template/workflows/specdev/common/rules/artifact-contract.md +20 -9
- package/template/workflows/specdev/common/rules/change-completion.md +33 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +2 -2
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +1 -1
- package/template/workflows/specdev/common/rules/path-ownership.md +3 -3
- package/template/workflows/specdev/common/schemas/change-status.schema.json +43 -0
- package/template/workflows/specdev/common/schemas/code-review.schema.json +22 -0
- package/template/workflows/specdev/common/schemas/diagnosis.schema.json +19 -0
- package/template/workflows/specdev/common/schemas/prototype-record.schema.json +24 -0
- package/template/workflows/specdev/common/schemas/source.schema.json +20 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +20 -78
- package/template/workflows/specdev/common/schemas/triage.schema.json +21 -0
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +49 -0
- package/template/workflows/specdev/common/skills/code-review/references/fowler-smells.md +18 -0
- package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +13 -0
- package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +22 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +12 -9
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +18 -13
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +8 -6
- package/template/workflows/specdev/common/skills/research/SKILL.md +38 -26
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +3 -5
- package/template/workflows/specdev/common/tools/README.md +3 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +496 -30
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +0 -15
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +0 -32
- package/template/workflows/specdev/I-implement/code-review-process.md +0 -17
- package/template/workflows/specdev/I-implement/tdd-examples.md +0 -14
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +0 -55
package/README.md
CHANGED
|
@@ -32,20 +32,23 @@ Requires: Node.js ≥ 22.22.3
|
|
|
32
32
|
|
|
33
33
|
| Command | Description |
|
|
34
34
|
|---|---|
|
|
35
|
-
| `speculo init [--all] [target]` | Install or refresh Speculo core assets and selected workflow packages. Existing `speculo/.speculo/` state is never overwritten. |
|
|
36
|
-
| `speculo migrate [--apply] [target]` | Preview (or apply) migration from v2 or
|
|
35
|
+
| `speculo init [--all] [target]` | Install or refresh Speculo core assets and selected workflow packages. Existing `speculo/.speculo/` state is never overwritten. Projects with SpecDev installed also get an idempotent `specdev-worktree/` entry in the project-root `.gitignore`. |
|
|
36
|
+
| `speculo migrate [--apply] [target]` | Preview (or apply) migration from v2, transitional v3, or SpecDev global status v3 state to the current contract. Dry-run by default; `--apply` performs the staged, rollback-safe migration. |
|
|
37
|
+
| `speculo mirror-skills [--dry-run] [target]` | Mirror `.agents/skills/*` canonical skills into `.claude/skills/*` pointers; preview without writes with `--dry-run`. |
|
|
37
38
|
| `speculo update` | Deprecated. Delegates to `speculo init --all`. |
|
|
38
39
|
|
|
39
40
|
## Installed Runtime Assets
|
|
40
41
|
|
|
41
42
|
After initialization, the target project gains the following AI agent-callable assets:
|
|
42
43
|
|
|
43
|
-
###
|
|
44
|
+
### 6 Commands
|
|
44
45
|
|
|
45
46
|
| Command | Purpose |
|
|
46
47
|
|---|---|
|
|
47
48
|
| `docs-sync` | Clean workspace, sync project documentation and Agent handbooks from reproducible Git ranges |
|
|
48
49
|
| `archive-and-consolidate` | Knowledge lifecycle governance: archive stale content, consolidate scattered knowledge, clean up outdated assets |
|
|
50
|
+
| `git-repository-audit` | Read-only, reproducible audit of one or more local Git repositories |
|
|
51
|
+
| `handoff` | Persist a compact, resumable context handoff for another agent |
|
|
49
52
|
| `retro` | Retrospective analysis with `gh issue` creation |
|
|
50
53
|
| `status` | Summary of installed workflows, active changes, and anomalies |
|
|
51
54
|
|
|
@@ -64,7 +67,7 @@ After initialization, the target project gains the following AI agent-callable a
|
|
|
64
67
|
|
|
65
68
|
| Workflow | Work Entries | Description |
|
|
66
69
|
|---|---:|---|
|
|
67
|
-
| **specdev** |
|
|
70
|
+
| **specdev** | 14 | Local-first specification-driven development: archive, code review, diagnosis, mentoring, grilling, implementation, setup, goal planning, prototyping, architecture review, specs, tickets, triage, and wayfinding |
|
|
68
71
|
| **person** | 1 | Persona-methodology-based consulting workflow (Mao Zedong Cognitive OS) |
|
|
69
72
|
|
|
70
73
|
Every workflow ships an `INDEX.md` as its auto-generated work catalog. Work entries follow `<Letter>-<work_name>/<Letter>-<work_name>.md` naming with progressive-disclosure sub-files, and resolve runtime paths via `<Path>{roots.xxx}/...</Path>` pointers in `workspace.json`.
|
package/dist/src/cli.js
CHANGED
|
@@ -16,7 +16,7 @@ function usage() {
|
|
|
16
16
|
"Commands:",
|
|
17
17
|
" init Install or refresh Speculo core assets and selected workflow packages.",
|
|
18
18
|
" Existing workflow state under speculo/.speculo/ is never overwritten.",
|
|
19
|
-
" migrate Preview migration from v2
|
|
19
|
+
" migrate Preview migration from v2, transitional v3, or SpecDev status v3 state.",
|
|
20
20
|
" Pass --apply to perform the staged, rollback-safe migration.",
|
|
21
21
|
" mirror-skills Mirror .agents/skills/* canonical skills into .claude/skills/* pointers.",
|
|
22
22
|
" Idempotent; relocates full .claude skills into .agents canonical first.",
|
|
@@ -107,7 +107,7 @@ async function main(argv) {
|
|
|
107
107
|
apply: applyFlag,
|
|
108
108
|
});
|
|
109
109
|
if (!result.legacyDetected) {
|
|
110
|
-
console.log("No
|
|
110
|
+
console.log("No Speculo state migration required in " + result.target);
|
|
111
111
|
return 0;
|
|
112
112
|
}
|
|
113
113
|
console.log(result.applied
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AAEtB,SAAS,KAAK;IACZ,OAAO;QACL,QAAQ;QACR,iCAAiC;QACjC,sCAAsC;QACtC,8CAA8C;QAC9C,mBAAmB;QACnB,EAAE;QACF,WAAW;QACX,yFAAyF;QACzF,wFAAwF;QACxF,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -8,6 +8,7 @@ const INSTALL_SUBDIR = "speculo";
|
|
|
8
8
|
const WORKFLOW_ENTRY = "INDEX.md";
|
|
9
9
|
const STATE_TEMPLATE_DIR = "_state";
|
|
10
10
|
const SPECULO_TAG_RE = /<SPECULO>[\s\S]*?<\/SPECULO>/;
|
|
11
|
+
const SPECDEV_WORKTREE_IGNORE = "specdev-worktree/";
|
|
11
12
|
function assetRoot(packageRoot) {
|
|
12
13
|
return join(packageRoot, "template");
|
|
13
14
|
}
|
|
@@ -72,6 +73,35 @@ async function copyMissingTree(source, destination) {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
}
|
|
76
|
+
function hasSpecdevWorktreeIgnore(content) {
|
|
77
|
+
return content.split(/\r?\n/).some((line) => {
|
|
78
|
+
const pattern = line.trim();
|
|
79
|
+
if (!pattern || pattern.startsWith("#") || pattern.startsWith("!")) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return pattern.replace(/^\//, "").replace(/\/$/, "") === "specdev-worktree";
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async function ensureSpecdevWorktreeIgnore(target, root) {
|
|
86
|
+
if (!(await pathExists(join(root, "workflows", "specdev", WORKFLOW_ENTRY)))) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const ignorePath = join(target, ".gitignore");
|
|
90
|
+
if (!(await pathExists(ignorePath))) {
|
|
91
|
+
await writeFile(ignorePath, SPECDEV_WORKTREE_IGNORE + "\n", "utf8");
|
|
92
|
+
return ".gitignore (created specdev-worktree/)";
|
|
93
|
+
}
|
|
94
|
+
const content = await readFile(ignorePath, "utf8");
|
|
95
|
+
if (hasSpecdevWorktreeIgnore(content)) {
|
|
96
|
+
return ".gitignore (preserved specdev-worktree/)";
|
|
97
|
+
}
|
|
98
|
+
const newline = content.includes("\r\n") ? "\r\n" : "\n";
|
|
99
|
+
const separator = content.length === 0 || content.endsWith("\n")
|
|
100
|
+
? ""
|
|
101
|
+
: newline;
|
|
102
|
+
await writeFile(ignorePath, content + separator + SPECDEV_WORKTREE_IGNORE + newline, "utf8");
|
|
103
|
+
return ".gitignore (updated specdev-worktree/)";
|
|
104
|
+
}
|
|
75
105
|
function generateSpeculoContent(selection) {
|
|
76
106
|
const lines = [];
|
|
77
107
|
lines.push("## Speculo 运行时配置");
|
|
@@ -200,6 +230,9 @@ async function initFresh(targetArg, options) {
|
|
|
200
230
|
await mkdir(root, { recursive: true });
|
|
201
231
|
const copied = await copyCoreAssets(packageRoot, root, false);
|
|
202
232
|
copied.push(...await copyWorkflowPackages(packageRoot, root, selection, false));
|
|
233
|
+
const gitignoreResult = await ensureSpecdevWorktreeIgnore(target, root);
|
|
234
|
+
if (gitignoreResult)
|
|
235
|
+
copied.push(gitignoreResult);
|
|
203
236
|
copied.push(...await writeAgentFiles(target, packageRoot, selection));
|
|
204
237
|
return { target, mode: "init", copied };
|
|
205
238
|
}
|
|
@@ -210,6 +243,9 @@ async function initUpdate(targetArg, options) {
|
|
|
210
243
|
const selection = await resolveSelection(packageRoot, root, options, "update");
|
|
211
244
|
const updated = await copyCoreAssets(packageRoot, root, true);
|
|
212
245
|
updated.push(...await copyWorkflowPackages(packageRoot, root, selection, true));
|
|
246
|
+
const gitignoreResult = await ensureSpecdevWorktreeIgnore(target, root);
|
|
247
|
+
if (gitignoreResult)
|
|
248
|
+
updated.push(gitignoreResult);
|
|
213
249
|
updated.push(...await writeAgentFiles(target, packageRoot, selection));
|
|
214
250
|
return { target, mode: "update", updated };
|
|
215
251
|
}
|
|
@@ -220,7 +256,7 @@ export async function initSpeculo(targetArg = ".", options = {}) {
|
|
|
220
256
|
return initFresh(targetArg, options);
|
|
221
257
|
}
|
|
222
258
|
if (await detectLegacyState(target)) {
|
|
223
|
-
throw new Error("
|
|
259
|
+
throw new Error("Speculo state migration required. Run `speculo migrate " +
|
|
224
260
|
targetArg + "` to preview, then `speculo migrate --apply " +
|
|
225
261
|
targetArg + "` before updating.");
|
|
226
262
|
}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,GAErB,MAAM,gBAAgB,CAAC;AAexB,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AAC/E,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AACpC,MAAM,cAAc,GAAG,8BAA8B,CAAC;AACtD,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAEpD,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,KAAa;IAEb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,KAAK,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,WAAmB,EACnB,IAAY,EACZ,SAAkB;IAElB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,UAAU,IAAI,SAAS,EAAE,CAAC;YACtC,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,aAAa,IAAI,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,+DAA+D;gBAC/D,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YACtC,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE;YAC5B,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,CAAC,SAAS;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,WAAmB;IAEnB,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,eAAe,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE;gBACtC,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,kBAAkB,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,MAAc,EACd,IAAY;IAEZ,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,wCAAwC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,0CAA0C,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,OAAO,CAAC;IACZ,MAAM,SAAS,CACb,UAAU,EACV,OAAO,GAAG,SAAS,GAAG,uBAAuB,GAAG,OAAO,EACvD,MAAM,CACP,CAAC;IACF,OAAO,wCAAwC,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,SAA4B;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,2BAA2B,UAAU,aAAa,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,WAAmB,EACnB,SAA4B;IAE5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CACb,UAAU,EACV,uEAAuE,EACvE,MAAM,CACP,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,eAAuB,CAAC;QAC5B,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,eAAe,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,wCAAwC,CAAC;QAC7D,CAAC;QACD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACxE,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,IAAY,EACZ,SAA4B,EAC5B,SAAkB;IAElB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE;YAC5B,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,CAAC,SAAS;YACxB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,kBAAkB;SACxD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,UAAU,GAAG,qBAAqB,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE;gBACtC,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,WAAmB,EACnB,IAAY,EACZ,OAAuB,EACvB,IAAuB;IAEvB,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IAEhD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE1E,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,uBAAuB,CAAC,OAAO,EAAE;YACtC,sBAAsB,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,SAAiB,EACjB,OAAuB;IAEvB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CACnE,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxE,IAAI,eAAe;QAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,SAAiB,EACjB,OAAuB;IAEvB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE9D,OAAO,CAAC,IAAI,CACV,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAClE,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxE,IAAI,eAAe;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAS,GAAG,GAAG,EACf,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,SAAS,GAAG,8CAA8C;YAC1D,SAAS,GAAG,oBAAoB,CACjC,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/src/migrate.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type LegacyWorkflow = "dev" | "doc" | "person";
|
|
2
|
-
type MigrationSourceLayout = "none" | "v2" | "transitional-v3";
|
|
2
|
+
type MigrationSourceLayout = "none" | "v2" | "transitional-v3" | "specdev-status-v3";
|
|
3
3
|
type LegacyChange = {
|
|
4
4
|
sourceWorkflow: LegacyWorkflow;
|
|
5
5
|
sourcePath: string;
|
|
@@ -32,6 +32,19 @@ export type MigrateResult = {
|
|
|
32
32
|
applied: boolean;
|
|
33
33
|
actions: MigrationAction[];
|
|
34
34
|
};
|
|
35
|
+
type SpecdevActiveEntry = {
|
|
36
|
+
change: string;
|
|
37
|
+
current_work: string | null;
|
|
38
|
+
works_run: string[];
|
|
39
|
+
claimed_investigations?: Array<Record<string, unknown>>;
|
|
40
|
+
};
|
|
41
|
+
type SpecdevStatusV4 = {
|
|
42
|
+
schema_version: 4;
|
|
43
|
+
workflow: "specdev";
|
|
44
|
+
active: SpecdevActiveEntry[];
|
|
45
|
+
archived: string[];
|
|
46
|
+
};
|
|
47
|
+
export declare function migrateSpecdevStatusV3(status: Record<string, unknown>, root: string, blockers?: string[]): Promise<SpecdevStatusV4>;
|
|
35
48
|
export declare function detectLegacyState(target: string): Promise<boolean>;
|
|
36
49
|
export declare function planMigration(target: string): Promise<MigrationPlan>;
|
|
37
50
|
export declare function migrateSpeculo(targetArg?: string, options?: MigrateOptions): Promise<MigrateResult>;
|
package/dist/src/migrate.js
CHANGED
|
@@ -11,6 +11,7 @@ const V2_MARKERS = [
|
|
|
11
11
|
"doc",
|
|
12
12
|
];
|
|
13
13
|
const TRANSITIONAL_DOCS_STATE = join("commands", ".config", "docs-sync-state.json");
|
|
14
|
+
const SPECDEV_STATUS = join("specdev", "status.json");
|
|
14
15
|
const COMMAND_RUN_RE = /^\d{4}-\d{2}-\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
15
16
|
const LEGACY_ROOT_ENTRIES = new Set([
|
|
16
17
|
"AGENTS.md",
|
|
@@ -26,6 +27,86 @@ const LEGACY_ROOT_ENTRIES = new Set([
|
|
|
26
27
|
".DS_Store",
|
|
27
28
|
]);
|
|
28
29
|
const CHANGE_NAME_RE = /^(\d{4})-(\d{2})-(\d{2})-([a-z0-9]+(?:-[a-z0-9]+)*)$/;
|
|
30
|
+
function validateSpecdevStatusV4(status) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
const expectedTopLevel = ["active", "archived", "schema_version", "workflow"];
|
|
33
|
+
const actualTopLevel = Object.keys(status).sort();
|
|
34
|
+
if (JSON.stringify(actualTopLevel) !== JSON.stringify(expectedTopLevel)) {
|
|
35
|
+
errors.push("top-level fields must be schema_version, workflow, active, and archived");
|
|
36
|
+
}
|
|
37
|
+
if (status.schema_version !== 4 || status.workflow !== "specdev") {
|
|
38
|
+
errors.push("schema_version must be 4 and workflow must be specdev");
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(status.active) || !Array.isArray(status.archived)) {
|
|
41
|
+
errors.push("active and archived must be arrays");
|
|
42
|
+
return errors;
|
|
43
|
+
}
|
|
44
|
+
const activeNames = new Set();
|
|
45
|
+
for (const entry of status.active) {
|
|
46
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
47
|
+
errors.push("active entries must be objects");
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const value = entry;
|
|
51
|
+
const allowed = new Set([
|
|
52
|
+
"change",
|
|
53
|
+
"current_work",
|
|
54
|
+
"works_run",
|
|
55
|
+
"claimed_investigations",
|
|
56
|
+
]);
|
|
57
|
+
if (Object.keys(value).some((key) => !allowed.has(key))) {
|
|
58
|
+
errors.push("active entries contain unsupported fields");
|
|
59
|
+
}
|
|
60
|
+
if (typeof value.change !== "string" || !CHANGE_NAME_RE.test(value.change)) {
|
|
61
|
+
errors.push("active change names must use YYYY-MM-DD-kebab format");
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (activeNames.has(value.change)) {
|
|
65
|
+
errors.push("active change names must be unique: " + value.change);
|
|
66
|
+
}
|
|
67
|
+
activeNames.add(value.change);
|
|
68
|
+
if (value.current_work !== null &&
|
|
69
|
+
(typeof value.current_work !== "string" ||
|
|
70
|
+
!value.current_work.startsWith("specdev/"))) {
|
|
71
|
+
errors.push("current_work must be null or a specdev work id: " + value.change);
|
|
72
|
+
}
|
|
73
|
+
if (!Array.isArray(value.works_run) ||
|
|
74
|
+
value.works_run.some((work) => typeof work !== "string" || !work.startsWith("specdev/")) ||
|
|
75
|
+
new Set(value.works_run).size !== value.works_run.length) {
|
|
76
|
+
errors.push("works_run must contain unique specdev work ids: " + value.change);
|
|
77
|
+
}
|
|
78
|
+
if (value.claimed_investigations !== undefined) {
|
|
79
|
+
if (Array.isArray(value.claimed_investigations)) {
|
|
80
|
+
const allowedClaimKeys = new Set(["id", "owner", "session", "claimed_at"]);
|
|
81
|
+
if (value.claimed_investigations.some((claim) => claim &&
|
|
82
|
+
typeof claim === "object" &&
|
|
83
|
+
!Array.isArray(claim) &&
|
|
84
|
+
Object.keys(claim).some((key) => !allowedClaimKeys.has(key)))) {
|
|
85
|
+
errors.push("investigation claims contain unsupported fields: " + value.change);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const claimErrors = [];
|
|
89
|
+
mergeClaims([], value.claimed_investigations, value.change, claimErrors);
|
|
90
|
+
if (claimErrors.length > 0)
|
|
91
|
+
errors.push(...claimErrors);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const archivedNames = new Set();
|
|
95
|
+
for (const change of status.archived) {
|
|
96
|
+
if (typeof change !== "string" || !CHANGE_NAME_RE.test(change)) {
|
|
97
|
+
errors.push("archived change names must use YYYY-MM-DD-kebab format");
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (archivedNames.has(change)) {
|
|
101
|
+
errors.push("archived change names must be unique: " + change);
|
|
102
|
+
}
|
|
103
|
+
if (activeNames.has(change)) {
|
|
104
|
+
errors.push("change appears in both active and archived: " + change);
|
|
105
|
+
}
|
|
106
|
+
archivedNames.add(change);
|
|
107
|
+
}
|
|
108
|
+
return errors;
|
|
109
|
+
}
|
|
29
110
|
function installRoot(target) {
|
|
30
111
|
return join(resolve(target), "speculo");
|
|
31
112
|
}
|
|
@@ -51,6 +132,159 @@ async function readStatus(path, blockers) {
|
|
|
51
132
|
return undefined;
|
|
52
133
|
}
|
|
53
134
|
}
|
|
135
|
+
async function readJsonObject(path, blockers, label) {
|
|
136
|
+
if (!(await pathExists(path)))
|
|
137
|
+
return undefined;
|
|
138
|
+
try {
|
|
139
|
+
const value = JSON.parse(await readFile(path, "utf8"));
|
|
140
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
141
|
+
blockers.push(label + " must be a JSON object: " + path);
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
return value;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
blockers.push("Invalid " + label + " JSON: " + path);
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function mergeClaims(target, source, change, blockers) {
|
|
152
|
+
if (source === undefined)
|
|
153
|
+
return;
|
|
154
|
+
if (!Array.isArray(source)) {
|
|
155
|
+
blockers.push("Invalid claimed_investigations for active change: " + change);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const byId = new Map(target.map((claim) => [String(claim.id), claim]));
|
|
159
|
+
for (const claim of source) {
|
|
160
|
+
if (!claim || typeof claim !== "object" || Array.isArray(claim)) {
|
|
161
|
+
blockers.push("Invalid investigation claim for active change: " + change);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const value = claim;
|
|
165
|
+
if (typeof value.id !== "string" ||
|
|
166
|
+
typeof value.owner !== "string" ||
|
|
167
|
+
typeof value.claimed_at !== "string" ||
|
|
168
|
+
(value.session !== undefined &&
|
|
169
|
+
value.session !== null &&
|
|
170
|
+
typeof value.session !== "string")) {
|
|
171
|
+
blockers.push("Invalid investigation claim fields for active change: " + change);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const normalized = {
|
|
175
|
+
id: value.id,
|
|
176
|
+
owner: value.owner,
|
|
177
|
+
claimed_at: value.claimed_at,
|
|
178
|
+
};
|
|
179
|
+
if (value.session !== undefined)
|
|
180
|
+
normalized.session = value.session;
|
|
181
|
+
const existing = byId.get(value.id);
|
|
182
|
+
if (existing && JSON.stringify(existing) !== JSON.stringify(normalized)) {
|
|
183
|
+
blockers.push("Conflicting investigation claim " + value.id + " for active change: " + change);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (!existing) {
|
|
187
|
+
target.push(normalized);
|
|
188
|
+
byId.set(value.id, normalized);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export async function migrateSpecdevStatusV3(status, root, blockers = []) {
|
|
193
|
+
if (status.schema_version !== 3 || status.workflow !== "specdev") {
|
|
194
|
+
blockers.push("SpecDev status migration requires schema_version 3 and workflow specdev");
|
|
195
|
+
}
|
|
196
|
+
if (!Array.isArray(status.active)) {
|
|
197
|
+
blockers.push("SpecDev v3 status active must be an array");
|
|
198
|
+
}
|
|
199
|
+
if (!Array.isArray(status.work_history)) {
|
|
200
|
+
blockers.push("SpecDev v3 status work_history must be an array");
|
|
201
|
+
}
|
|
202
|
+
if (!Array.isArray(status.completed)) {
|
|
203
|
+
blockers.push("SpecDev v3 status completed must be an array");
|
|
204
|
+
}
|
|
205
|
+
const activeByChange = new Map();
|
|
206
|
+
for (const entry of Array.isArray(status.active) ? status.active : []) {
|
|
207
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
208
|
+
blockers.push("SpecDev v3 status contains an invalid active entry");
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const value = entry;
|
|
212
|
+
if (typeof value.change !== "string" || !CHANGE_NAME_RE.test(value.change)) {
|
|
213
|
+
blockers.push("Invalid active change name in SpecDev v3 status");
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (value.current_work !== null &&
|
|
217
|
+
(typeof value.current_work !== "string" ||
|
|
218
|
+
!value.current_work.startsWith("specdev/"))) {
|
|
219
|
+
blockers.push("Invalid current_work for active change: " + value.change);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (!Array.isArray(value.works_run) ||
|
|
223
|
+
value.works_run.some((work) => typeof work !== "string" || !work.startsWith("specdev/"))) {
|
|
224
|
+
blockers.push("Invalid works_run for active change: " + value.change);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const existing = activeByChange.get(value.change);
|
|
228
|
+
if (existing &&
|
|
229
|
+
existing.current_work !== value.current_work &&
|
|
230
|
+
existing.current_work !== null &&
|
|
231
|
+
value.current_work !== null) {
|
|
232
|
+
blockers.push("Conflicting current_work values for active change: " + value.change);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const migrated = existing ?? {
|
|
236
|
+
change: value.change,
|
|
237
|
+
current_work: value.current_work,
|
|
238
|
+
works_run: [],
|
|
239
|
+
};
|
|
240
|
+
if (migrated.current_work === null && typeof value.current_work === "string") {
|
|
241
|
+
migrated.current_work = value.current_work;
|
|
242
|
+
}
|
|
243
|
+
migrated.works_run = [
|
|
244
|
+
...new Set([...migrated.works_run, ...value.works_run]),
|
|
245
|
+
];
|
|
246
|
+
const claims = migrated.claimed_investigations ?? [];
|
|
247
|
+
mergeClaims(claims, value.claimed_investigations, value.change, blockers);
|
|
248
|
+
if (claims.length > 0 || value.claimed_investigations !== undefined) {
|
|
249
|
+
migrated.claimed_investigations = claims;
|
|
250
|
+
}
|
|
251
|
+
activeByChange.set(value.change, migrated);
|
|
252
|
+
}
|
|
253
|
+
const archived = [];
|
|
254
|
+
const archivedNames = new Set();
|
|
255
|
+
for (const entry of Array.isArray(status.completed) ? status.completed : []) {
|
|
256
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
257
|
+
blockers.push("SpecDev v3 status contains an invalid completed entry");
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const change = entry.change;
|
|
261
|
+
if (typeof change !== "string" || !CHANGE_NAME_RE.test(change)) {
|
|
262
|
+
blockers.push("Invalid archived change name in SpecDev v3 status");
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (!archivedNames.has(change)) {
|
|
266
|
+
const archivePath = join(root, "specdev", "archive", monthFromName(change), change);
|
|
267
|
+
if (!(await pathExists(archivePath))) {
|
|
268
|
+
blockers.push("Archived change directory is missing: " + archivePath);
|
|
269
|
+
}
|
|
270
|
+
archived.push(change);
|
|
271
|
+
archivedNames.add(change);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
for (const change of activeByChange.keys()) {
|
|
275
|
+
if (archivedNames.has(change)) {
|
|
276
|
+
blockers.push("SpecDev change appears in both active and archived: " + change);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const migrated = {
|
|
280
|
+
schema_version: 4,
|
|
281
|
+
workflow: "specdev",
|
|
282
|
+
active: [...activeByChange.values()],
|
|
283
|
+
archived,
|
|
284
|
+
};
|
|
285
|
+
blockers.push(...validateSpecdevStatusV4(migrated).map((issue) => "Migrated SpecDev status would be invalid: " + issue));
|
|
286
|
+
return migrated;
|
|
287
|
+
}
|
|
54
288
|
async function validateLegacyIndex(path, blockers) {
|
|
55
289
|
if (!(await pathExists(path)))
|
|
56
290
|
return;
|
|
@@ -195,7 +429,21 @@ export async function detectLegacyState(target) {
|
|
|
195
429
|
}
|
|
196
430
|
if (await pathExists(join(root, TRANSITIONAL_DOCS_STATE)))
|
|
197
431
|
return true;
|
|
198
|
-
|
|
432
|
+
if ((await legacyCommandRunNames(root)).length > 0)
|
|
433
|
+
return true;
|
|
434
|
+
const statusPath = join(root, SPECDEV_STATUS);
|
|
435
|
+
if (!(await pathExists(statusPath)))
|
|
436
|
+
return false;
|
|
437
|
+
try {
|
|
438
|
+
const value = JSON.parse(await readFile(statusPath, "utf8"));
|
|
439
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
440
|
+
return true;
|
|
441
|
+
const status = value;
|
|
442
|
+
return status.schema_version !== 4 || validateSpecdevStatusV4(status).length > 0;
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
199
447
|
}
|
|
200
448
|
async function detectV2State(target) {
|
|
201
449
|
const root = stateRoot(target);
|
|
@@ -220,18 +468,31 @@ async function legacyCommandRunNames(root) {
|
|
|
220
468
|
export async function planMigration(target) {
|
|
221
469
|
const resolvedTarget = resolve(target);
|
|
222
470
|
const root = stateRoot(resolvedTarget);
|
|
471
|
+
const blockers = [];
|
|
472
|
+
const actions = [];
|
|
473
|
+
const changes = [];
|
|
223
474
|
const v2Detected = await detectV2State(resolvedTarget);
|
|
224
475
|
const transitionalDetected = (await pathExists(join(root, TRANSITIONAL_DOCS_STATE))) ||
|
|
225
476
|
(await legacyCommandRunNames(root)).length > 0;
|
|
477
|
+
const specdevStatus = await readJsonObject(join(root, SPECDEV_STATUS), blockers, "SpecDev status");
|
|
478
|
+
const statusVersion = specdevStatus?.schema_version;
|
|
479
|
+
const statusV3Detected = statusVersion === 3;
|
|
480
|
+
if (specdevStatus &&
|
|
481
|
+
statusVersion !== 3 &&
|
|
482
|
+
statusVersion !== 4) {
|
|
483
|
+
blockers.push("Unsupported SpecDev status schema_version: " + String(statusVersion));
|
|
484
|
+
}
|
|
485
|
+
if (specdevStatus && statusVersion === 4) {
|
|
486
|
+
blockers.push(...validateSpecdevStatusV4(specdevStatus).map((issue) => "Invalid SpecDev status v4: " + issue));
|
|
487
|
+
}
|
|
226
488
|
const sourceLayout = v2Detected
|
|
227
489
|
? "v2"
|
|
228
490
|
: transitionalDetected
|
|
229
491
|
? "transitional-v3"
|
|
230
|
-
:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
const changes = [];
|
|
492
|
+
: statusV3Detected
|
|
493
|
+
? "specdev-status-v3"
|
|
494
|
+
: "none";
|
|
495
|
+
const legacyDetected = sourceLayout !== "none" || blockers.length > 0;
|
|
235
496
|
if (!legacyDetected) {
|
|
236
497
|
return {
|
|
237
498
|
target: resolvedTarget,
|
|
@@ -253,7 +514,8 @@ export async function planMigration(target) {
|
|
|
253
514
|
changes,
|
|
254
515
|
};
|
|
255
516
|
}
|
|
256
|
-
if (sourceLayout === "transitional-v3"
|
|
517
|
+
if (sourceLayout === "transitional-v3" ||
|
|
518
|
+
sourceLayout === "specdev-status-v3") {
|
|
257
519
|
const oldState = join(root, TRANSITIONAL_DOCS_STATE);
|
|
258
520
|
const newState = join(root, "commands", "docs-sync", "state.json");
|
|
259
521
|
if (await pathExists(oldState)) {
|
|
@@ -280,6 +542,15 @@ export async function planMigration(target) {
|
|
|
280
542
|
detail: "Preserve the old report directory without rewriting history",
|
|
281
543
|
});
|
|
282
544
|
}
|
|
545
|
+
if (statusV3Detected && specdevStatus) {
|
|
546
|
+
await migrateSpecdevStatusV3(specdevStatus, root, blockers);
|
|
547
|
+
actions.push({
|
|
548
|
+
kind: "migrate-specdev-status",
|
|
549
|
+
from: ".speculo/specdev/status.json (schema v3)",
|
|
550
|
+
to: ".speculo/specdev/status.json (schema v4)",
|
|
551
|
+
detail: "Reduce the global index to active and archived changes",
|
|
552
|
+
});
|
|
553
|
+
}
|
|
283
554
|
return {
|
|
284
555
|
target: resolvedTarget,
|
|
285
556
|
legacyDetected,
|
|
@@ -441,7 +712,7 @@ function migratedDocsSyncState(legacy) {
|
|
|
441
712
|
}
|
|
442
713
|
function reportMarkdown(plan, now) {
|
|
443
714
|
const lines = [
|
|
444
|
-
"# Speculo
|
|
715
|
+
"# Speculo Migration Report",
|
|
445
716
|
"",
|
|
446
717
|
"- Generated: " + now,
|
|
447
718
|
"- Target: " + plan.target,
|
|
@@ -479,9 +750,9 @@ async function preserveLegacyCommandEntries(source, destination) {
|
|
|
479
750
|
async function writeMigrationReport(stage, plan, now) {
|
|
480
751
|
const reportRoot = join(stage, "commands", "migrate");
|
|
481
752
|
await mkdir(reportRoot, { recursive: true });
|
|
482
|
-
const stem = now.slice(0, 10) + "-workspace-
|
|
753
|
+
const stem = now.slice(0, 10) + "-workspace-migration";
|
|
483
754
|
let reportPath = join(reportRoot, stem + ".md");
|
|
484
|
-
let suffix =
|
|
755
|
+
let suffix = 1;
|
|
485
756
|
while (await pathExists(reportPath)) {
|
|
486
757
|
reportPath = join(reportRoot, stem + "-" + String(suffix).padStart(2, "0") + ".md");
|
|
487
758
|
suffix += 1;
|
|
@@ -492,7 +763,8 @@ async function buildMigratedState(plan, packageRoot, stage) {
|
|
|
492
763
|
const root = stateRoot(plan.target);
|
|
493
764
|
const now = new Date().toISOString();
|
|
494
765
|
const templateRoot = join(packageRoot, "template");
|
|
495
|
-
if (plan.sourceLayout === "transitional-v3"
|
|
766
|
+
if (plan.sourceLayout === "transitional-v3" ||
|
|
767
|
+
plan.sourceLayout === "specdev-status-v3") {
|
|
496
768
|
await cp(root, stage, { recursive: true, force: true });
|
|
497
769
|
const workspaceDestination = join(stage, "workspace.json");
|
|
498
770
|
if (!(await pathExists(workspaceDestination))) {
|
|
@@ -516,6 +788,21 @@ async function buildMigratedState(plan, packageRoot, stage) {
|
|
|
516
788
|
await rm(oldConfigDir, { recursive: true, force: true });
|
|
517
789
|
}
|
|
518
790
|
}
|
|
791
|
+
const statusPath = join(stage, SPECDEV_STATUS);
|
|
792
|
+
if (await pathExists(statusPath)) {
|
|
793
|
+
const status = JSON.parse(await readFile(statusPath, "utf8"));
|
|
794
|
+
if (status.schema_version === 3) {
|
|
795
|
+
const migrationBlockers = [];
|
|
796
|
+
const migrated = await migrateSpecdevStatusV3(status, stage, migrationBlockers);
|
|
797
|
+
if (migrationBlockers.length > 0) {
|
|
798
|
+
throw new Error([
|
|
799
|
+
"SpecDev status changed after migration preview:",
|
|
800
|
+
...migrationBlockers.map((item) => "- " + item),
|
|
801
|
+
].join("\n"));
|
|
802
|
+
}
|
|
803
|
+
await writeFile(statusPath, JSON.stringify(migrated, null, 2) + "\n");
|
|
804
|
+
}
|
|
805
|
+
}
|
|
519
806
|
await writeMigrationReport(stage, plan, now);
|
|
520
807
|
return;
|
|
521
808
|
}
|
|
@@ -536,6 +823,7 @@ async function buildMigratedState(plan, packageRoot, stage) {
|
|
|
536
823
|
await writeFile(destination, JSON.stringify(docsSync, null, 2) + "\n");
|
|
537
824
|
}
|
|
538
825
|
const personActive = [];
|
|
826
|
+
const specdevArchived = [];
|
|
539
827
|
for (const change of plan.changes) {
|
|
540
828
|
const destination = join(stage, change.destinationRelative);
|
|
541
829
|
await mkdir(dirname(destination), { recursive: true });
|
|
@@ -556,7 +844,16 @@ async function buildMigratedState(plan, packageRoot, stage) {
|
|
|
556
844
|
updated_at: status.updated_at,
|
|
557
845
|
});
|
|
558
846
|
}
|
|
847
|
+
if (change.sourceWorkflow !== "person" && change.archived) {
|
|
848
|
+
specdevArchived.push(destinationName);
|
|
849
|
+
}
|
|
559
850
|
}
|
|
851
|
+
await writeFile(join(stage, "specdev", "status.json"), JSON.stringify({
|
|
852
|
+
schema_version: 4,
|
|
853
|
+
workflow: "specdev",
|
|
854
|
+
active: [],
|
|
855
|
+
archived: [...new Set(specdevArchived)],
|
|
856
|
+
}, null, 2) + "\n");
|
|
560
857
|
await writeFile(join(stage, "person", "status.json"), JSON.stringify({ schema_version: 1, workflow: "person", active: personActive }, null, 2) + "\n");
|
|
561
858
|
await writeMigrationReport(stage, plan, now);
|
|
562
859
|
}
|