@namewta/speculo 0.5.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.
Files changed (110) hide show
  1. package/README.md +7 -4
  2. package/dist/src/cli.js +2 -2
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.js +37 -1
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/migrate.d.ts +14 -1
  7. package/dist/src/migrate.js +308 -11
  8. package/dist/src/migrate.js.map +1 -1
  9. package/package.json +3 -2
  10. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +133 -141
  11. package/template/canonical/canonical-specdev-goal-plan.md +394 -377
  12. package/template/canonical/canonical-specdev-grill-with-docs.md +241 -178
  13. package/template/canonical/canonical-specdev-spec.md +132 -122
  14. package/template/canonical/canonical-specdev-tickets.md +176 -156
  15. package/template/canonical/canonical-specdev-wayfinder.md +106 -108
  16. package/template/commands/archive-and-consolidate.md +10 -8
  17. package/template/commands/handoff.md +2 -0
  18. package/template/commands/retro.md +3 -3
  19. package/template/commands/status.md +5 -4
  20. package/template/skills/archive-and-consolidate/SKILL.md +5 -9
  21. package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +1 -1
  22. package/template/skills/archive-and-consolidate/references/archive-rules.md +4 -4
  23. package/template/skills/archive-and-consolidate/references/consolidation-rules.md +7 -8
  24. package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +5 -2
  25. package/template/skills/github-npm-ops/SKILL.md +4 -2
  26. package/template/skills/github-npm-ops/references/issue-transport.md +26 -0
  27. package/template/skills/github-npm-ops/scripts/issue-transport.mjs +227 -0
  28. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +31 -145
  29. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +4 -6
  30. package/template/workflows/specdev/C-code-review/C-code-review.md +42 -0
  31. package/template/workflows/specdev/C-code-review/code-review-template.md +42 -0
  32. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +45 -48
  33. package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +44 -40
  34. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +41 -0
  35. package/template/workflows/specdev/D-diagnose-bugs/hypothesis-and-instrumentation.md +32 -0
  36. package/template/workflows/specdev/D-diagnose-bugs/scripts/hitl-loop.template.sh +26 -0
  37. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +3 -3
  38. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +5 -20
  39. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +17 -10
  40. package/template/workflows/specdev/G-grill-with-docs/adr-format.md +31 -17
  41. package/template/workflows/specdev/G-grill-with-docs/context-format.md +9 -29
  42. package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +10 -5
  43. package/template/workflows/specdev/G-grill-with-docs/stakeholder-questionnaire.md +45 -0
  44. package/template/workflows/specdev/I-implement/I-implement.md +29 -14
  45. package/template/workflows/specdev/I-implement/delegated-evidence-template.md +11 -0
  46. package/template/workflows/specdev/I-implement/evidence-template.md +24 -10
  47. package/template/workflows/specdev/I-implement/execution-preflight.md +4 -4
  48. package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +20 -0
  49. package/template/workflows/specdev/I-implement/tdd-mocking.md +19 -0
  50. package/template/workflows/specdev/I-implement/tdd-rules.md +14 -12
  51. package/template/workflows/specdev/I-implement/tdd-test-design.md +25 -0
  52. package/template/workflows/specdev/I-init-setup/I-init-setup.md +12 -9
  53. package/template/workflows/specdev/I-init-setup/config-template.json +1 -1
  54. package/template/workflows/specdev/I-init-setup/domain-layout-template.md +2 -2
  55. package/template/workflows/specdev/I-init-setup/status-template.json +2 -3
  56. package/template/workflows/specdev/I-init-setup/tracking-template.md +3 -0
  57. package/template/workflows/specdev/INDEX.md +64 -26
  58. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +48 -38
  59. package/template/workflows/specdev/P-goal-plan/completion-control.md +19 -53
  60. package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +33 -0
  61. package/template/workflows/specdev/P-goal-plan/delegated-execution.md +53 -0
  62. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +9 -40
  63. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +16 -68
  64. package/template/workflows/specdev/P-goal-plan/planning-modes.md +20 -48
  65. package/template/workflows/specdev/P-prototype/P-prototype.md +46 -0
  66. package/template/workflows/specdev/P-prototype/logic-prototype.md +24 -0
  67. package/template/workflows/specdev/P-prototype/prototype-record-template.md +46 -0
  68. package/template/workflows/specdev/P-prototype/ui-prototype.md +21 -0
  69. package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +1 -1
  70. package/template/workflows/specdev/S-spec/S-spec.md +2 -1
  71. package/template/workflows/specdev/T-tickets/T-tickets.md +3 -2
  72. package/template/workflows/specdev/T-tickets/ticket-readiness.md +1 -1
  73. package/template/workflows/specdev/T-tickets/ticket-template.md +1 -1
  74. package/template/workflows/specdev/T-tickets/tickets-map-template.md +1 -1
  75. package/template/workflows/specdev/T-triage/T-triage.md +65 -26
  76. package/template/workflows/specdev/T-triage/intake-protocol.md +32 -0
  77. package/template/workflows/specdev/T-triage/reconcile-protocol.md +34 -0
  78. package/template/workflows/specdev/T-triage/source-template.md +30 -0
  79. package/template/workflows/specdev/T-triage/triage-template.md +38 -24
  80. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +3 -1
  81. package/template/workflows/specdev/_state/status.json +2 -3
  82. package/template/workflows/specdev/common/README.md +9 -2
  83. package/template/workflows/specdev/common/rules/artifact-contract.md +20 -9
  84. package/template/workflows/specdev/common/rules/change-completion.md +33 -0
  85. package/template/workflows/specdev/common/rules/deviation-control.md +2 -2
  86. package/template/workflows/specdev/common/rules/evidence-and-verification.md +1 -1
  87. package/template/workflows/specdev/common/rules/path-ownership.md +3 -3
  88. package/template/workflows/specdev/common/schemas/change-status.schema.json +43 -0
  89. package/template/workflows/specdev/common/schemas/code-review.schema.json +22 -0
  90. package/template/workflows/specdev/common/schemas/diagnosis.schema.json +19 -0
  91. package/template/workflows/specdev/common/schemas/prototype-record.schema.json +24 -0
  92. package/template/workflows/specdev/common/schemas/source.schema.json +20 -0
  93. package/template/workflows/specdev/common/schemas/status.schema.json +20 -78
  94. package/template/workflows/specdev/common/schemas/triage.schema.json +21 -0
  95. package/template/workflows/specdev/common/skills/code-review/SKILL.md +49 -0
  96. package/template/workflows/specdev/common/skills/code-review/references/fowler-smells.md +18 -0
  97. package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +13 -0
  98. package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +22 -0
  99. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +12 -9
  100. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +18 -13
  101. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +8 -6
  102. package/template/workflows/specdev/common/skills/research/SKILL.md +38 -26
  103. package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +3 -5
  104. package/template/workflows/specdev/common/tools/README.md +3 -0
  105. package/template/workflows/specdev/common/tools/validate-specdev.mjs +496 -30
  106. package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +0 -15
  107. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +0 -32
  108. package/template/workflows/specdev/I-implement/code-review-process.md +0 -17
  109. package/template/workflows/specdev/I-implement/tdd-examples.md +0 -14
  110. 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 transitional v3 state to current v3 contract. Dry-run by default; `--apply` to perform the staged, rollback-safe migration. |
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
- ### 4 Commands
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** | 7 | Full-cycle specification-driven development: init-setup, diagnose-bugs, grill-with-docs, implement, spec, tickets, wayfinder |
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 or transitional v3 state to the current v3 contract.",
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 legacy Speculo state detected in " + result.target);
110
+ console.log("No Speculo state migration required in " + result.target);
111
111
  return 0;
112
112
  }
113
113
  console.log(result.applied
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
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("Legacy Speculo state detected. Run `speculo migrate " +
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
  }
@@ -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":"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"}
@@ -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>;
@@ -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
- return (await legacyCommandRunNames(root)).length > 0;
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
- : "none";
231
- const legacyDetected = sourceLayout !== "none";
232
- const blockers = [];
233
- const actions = [];
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 v3 Migration Report",
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-layout-v3";
753
+ const stem = now.slice(0, 10) + "-workspace-migration";
483
754
  let reportPath = join(reportRoot, stem + ".md");
484
- let suffix = 2;
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
  }