ai-spector 0.9.21 → 0.9.25

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 (99) hide show
  1. package/contracts/bootstrap/config/prototype-screen-map.json +25 -0
  2. package/contracts/bootstrap/config/prototype.config.json +17 -0
  3. package/contracts/bootstrap/config/review-queue-pending.json +4 -0
  4. package/contracts/bootstrap/config/review-queue-registry.json +4 -0
  5. package/contracts/bootstrap/config/review.config.json +5 -0
  6. package/contracts/bootstrap/docs/ENTITY_REGISTRY_MIGRATION.md +192 -0
  7. package/contracts/bootstrap/docs/MIGRATION.md +463 -0
  8. package/contracts/bootstrap/docs/README.md +48 -0
  9. package/contracts/bootstrap/docs/adapters/README.md +32 -0
  10. package/contracts/bootstrap/docs/guides/COMMENTS_ENTITY_MIGRATION.md +195 -0
  11. package/contracts/bootstrap/docs/guides/DOCOPS_MANUAL_FALLBACK.md +177 -0
  12. package/contracts/bootstrap/docs/guides/PROJECT_LAYOUT.md +84 -0
  13. package/contracts/bootstrap/docs/modules/comments.md +77 -0
  14. package/contracts/bootstrap/docs/modules/generate.md +25 -0
  15. package/contracts/bootstrap/docs/modules/graph.md +31 -0
  16. package/contracts/bootstrap/docs/modules/prototype.md +26 -0
  17. package/contracts/bootstrap/docs/modules/review.md +25 -0
  18. package/contracts/bootstrap/docs/modules/translate.md +26 -0
  19. package/contracts/bootstrap/scripts/migrate-entity-registry.sh +55 -0
  20. package/contracts/bootstrap/templates/basic-design/db-design-template.md +177 -0
  21. package/contracts/bootstrap/templates/basic-design/detail-api-template.md +278 -0
  22. package/contracts/bootstrap/templates/basic-design/detail-screen-template.md +281 -0
  23. package/contracts/bootstrap/templates/basic-design/list-api-template.md +130 -0
  24. package/contracts/bootstrap/templates/basic-design/list-screen-template.md +242 -0
  25. package/contracts/bootstrap/templates/detail-design/common/architecture-overview-template.md +302 -0
  26. package/contracts/bootstrap/templates/detail-design/common/deployment-infrastructure-template.md +461 -0
  27. package/contracts/bootstrap/templates/detail-design/common/error-handling-patterns-template.md +460 -0
  28. package/contracts/bootstrap/templates/detail-design/common/integration-patterns-template.md +410 -0
  29. package/contracts/bootstrap/templates/detail-design/common/performance-standards-template.md +406 -0
  30. package/contracts/bootstrap/templates/detail-design/common/security-patterns-template.md +395 -0
  31. package/contracts/bootstrap/templates/detail-design/feature-detail-design-template.md +773 -0
  32. package/contracts/bootstrap/templates/detail-design/feature-list-template.md +39 -0
  33. package/contracts/bootstrap/templates/srs/1-introduction.md +58 -0
  34. package/contracts/bootstrap/templates/srs/2-overall-description.md +91 -0
  35. package/contracts/bootstrap/templates/srs/3-use-case-detail-template.md +142 -0
  36. package/contracts/bootstrap/templates/srs/3-use-cases.md +53 -0
  37. package/contracts/bootstrap/templates/srs/4-system-feature-detail-template.md +131 -0
  38. package/contracts/bootstrap/templates/srs/4-system-features-list-template.md +39 -0
  39. package/contracts/bootstrap/templates/srs/5-data-requirements.md +59 -0
  40. package/contracts/bootstrap/templates/srs/6-external-interfaces.md +56 -0
  41. package/contracts/bootstrap/templates/srs/7-quality-attributes.md +74 -0
  42. package/contracts/bootstrap/templates/srs/8-internationalization.md +36 -0
  43. package/contracts/bootstrap/templates/srs/9-other-requirements.md +46 -0
  44. package/contracts/examples/full-docops.config.json +54 -0
  45. package/contracts/examples/migrate-lifecycle.json +18 -0
  46. package/contracts/examples/minimal-comment-thread/comment-root.json +10 -0
  47. package/contracts/examples/minimal-comment-thread/meta_data.json +22 -0
  48. package/contracts/examples/minimal-docops.config.json +33 -0
  49. package/contracts/examples/minimal-lifecycle.json +17 -0
  50. package/contracts/examples/minimal-prototype.config.json +18 -0
  51. package/contracts/examples/minimal-screen-map.json +25 -0
  52. package/contracts/examples/registry/minimal-document.entity.json +15 -0
  53. package/contracts/examples/registry/minimal-manifest.json +7 -0
  54. package/contracts/examples/registry/minimal-screen.entity.json +11 -0
  55. package/contracts/examples/review/minimal-pending.json +14 -0
  56. package/contracts/examples/review/minimal-registry.json +31 -0
  57. package/contracts/examples/review/minimal-review.config.json +7 -0
  58. package/contracts/schemas/comments/comment_body.schema.json +19 -0
  59. package/contracts/schemas/comments/meta_data.schema.json +59 -0
  60. package/contracts/schemas/docops.config.schema.json +97 -0
  61. package/contracts/schemas/lifecycle.schema.json +43 -0
  62. package/contracts/schemas/prototype/config.schema.json +56 -0
  63. package/contracts/schemas/prototype/screen-map.schema.json +51 -0
  64. package/contracts/schemas/registry/document.entity.schema.json +38 -0
  65. package/contracts/schemas/registry/manifest.schema.json +18 -0
  66. package/contracts/schemas/registry/screen.entity.schema.json +28 -0
  67. package/contracts/schemas/review/registry.schema.json +72 -0
  68. package/contracts/schemas/review/review.config.schema.json +42 -0
  69. package/dist/cli.js +26 -1
  70. package/dist/cli.js.map +1 -1
  71. package/dist/core/docops/bootstrap.d.ts +4 -1
  72. package/dist/core/docops/bootstrap.d.ts.map +1 -1
  73. package/dist/core/docops/bootstrap.js +16 -9
  74. package/dist/core/docops/bootstrap.js.map +1 -1
  75. package/dist/core/docops/guide.d.ts +78 -0
  76. package/dist/core/docops/guide.d.ts.map +1 -0
  77. package/dist/core/docops/guide.js +554 -0
  78. package/dist/core/docops/guide.js.map +1 -0
  79. package/dist/core/docops/migrate.d.ts.map +1 -1
  80. package/dist/core/docops/migrate.js +40 -6
  81. package/dist/core/docops/migrate.js.map +1 -1
  82. package/dist/core/operations/docops.d.ts +8 -0
  83. package/dist/core/operations/docops.d.ts.map +1 -1
  84. package/dist/core/operations/docops.js +40 -0
  85. package/dist/core/operations/docops.js.map +1 -1
  86. package/dist/core/upgrade/checklist.json +2 -2
  87. package/package.json +2 -1
  88. package/scaffold/claude/.claude/skills/_skill-router.md +11 -8
  89. package/scaffold/claude/.claude/skills/ai-spector/references/cli-failures.md +3 -3
  90. package/scaffold/claude/.claude/skills/ai-spector/references/docops-migrate.md +112 -0
  91. package/scaffold/claude/.claude/skills/ai-spector/references/help.md +1 -1
  92. package/scaffold/claude/.claude/skills/ai-spector/references/runbook.md +49 -26
  93. package/scaffold/claude/.claude/skills/ai-spector/skill.md +3 -2
  94. package/scaffold/cursor/skills/_skill-router.md +11 -8
  95. package/scaffold/cursor/skills/ai-spector/SKILL.md +3 -2
  96. package/scaffold/cursor/skills/ai-spector/references/cli-failures.md +3 -3
  97. package/scaffold/cursor/skills/ai-spector/references/docops-migrate.md +112 -0
  98. package/scaffold/cursor/skills/ai-spector/references/help.md +1 -1
  99. package/scaffold/cursor/skills/ai-spector/references/runbook.md +49 -26
@@ -0,0 +1,554 @@
1
+ import { join } from "node:path";
2
+ import { assessDocopsProject } from "./assess.js";
3
+ import { checkDocopsConfig } from "./check.js";
4
+ import { mergeDocopsDefaults, readDocopsConfig } from "./config.js";
5
+ import { LAYER_DEFAULTS, OPTIONAL_DISABLED_LAYERS } from "./layer-defaults.js";
6
+ import { probeDocopsLayout } from "./layout.js";
7
+ import { migrateDocopsLayout } from "./migrate.js";
8
+ import { packagedContractsRoot, resolveBootstrapRoot } from "./bootstrap.js";
9
+ import { DEFAULT_DOCOPS_PATHS, DOCOPS_CONFIG_REL, LEGACY_DOCFLOW_CONFIG_REL, isNonCanonicalDocTypePath, normalizeDocTypePath, } from "./paths.js";
10
+ import { pathExists } from "../util/fs.js";
11
+ const LAYER_KEYS = ["srs", "basicDesign", "detailDesign"];
12
+ function recommendedCliCommand(action) {
13
+ switch (action) {
14
+ case "init":
15
+ return "npx ai-spector docops init";
16
+ case "migrate":
17
+ return "npx ai-spector docops migrate";
18
+ case "repair":
19
+ return "npx ai-spector docops migrate --repair";
20
+ default:
21
+ return "npx ai-spector docops status";
22
+ }
23
+ }
24
+ function inferTargetPath(key, configuredPath, onDiskRoots, docsRoot) {
25
+ const fallback = LAYER_DEFAULTS[key]?.path ?? `docs/${key}`;
26
+ const primary = onDiskRoots.reduce((best, root) => (root.fileCount > best.fileCount ? root : best), { path: "", fileCount: 0 });
27
+ if (primary.fileCount > 0) {
28
+ const canonical = normalizeDocTypePath(key, primary.path, docsRoot);
29
+ if (configuredPath && configuredPath !== canonical) {
30
+ return {
31
+ path: canonical,
32
+ note: `Docs found under ${primary.path} (${primary.fileCount} file(s)) — point docTypes.${key}.path here; do not move markdown.`,
33
+ };
34
+ }
35
+ return { path: canonical };
36
+ }
37
+ if (configuredPath?.trim()) {
38
+ return { path: normalizeDocTypePath(key, configuredPath, docsRoot) };
39
+ }
40
+ return { path: fallback };
41
+ }
42
+ function buildTargetState(assessment, layout, config, gaps) {
43
+ const docsRoot = config?.docsRoot?.trim() || "docs";
44
+ const docTypes = {};
45
+ const notes = [];
46
+ for (const key of LAYER_KEYS) {
47
+ const existing = config?.docTypes?.[key];
48
+ const onDisk = layout.onDisk[key];
49
+ const inferred = inferTargetPath(key, existing?.path, onDisk?.roots ?? [], docsRoot);
50
+ if (inferred.note)
51
+ notes.push(inferred.note);
52
+ const hasDocs = (onDisk?.roots ?? []).some((r) => r.fileCount > 0);
53
+ docTypes[key] = {
54
+ enabled: existing?.enabled ?? (hasDocs ? true : key !== "detailDesign"),
55
+ path: inferred.path,
56
+ templatesPath: existing?.templatesPath?.trim() ||
57
+ LAYER_DEFAULTS[key]?.templatesPath,
58
+ };
59
+ }
60
+ for (const key of OPTIONAL_DISABLED_LAYERS) {
61
+ if (docTypes[key])
62
+ continue;
63
+ const base = LAYER_DEFAULTS[key];
64
+ if (!base)
65
+ continue;
66
+ docTypes[key] = {
67
+ enabled: false,
68
+ path: base.path,
69
+ ...(base.templatesPath ? { templatesPath: base.templatesPath } : {}),
70
+ };
71
+ notes.push(`docTypes.${key} must exist with enabled: false unless the project already enables it.`);
72
+ }
73
+ if (assessment.layout === "legacy") {
74
+ notes.push("Legacy docflow.config.json present — prefer npx ai-spector docops migrate --from-docflow only when .docops/docops.config.json is missing.");
75
+ }
76
+ if (assessment.layout === "mixed") {
77
+ notes.push("Mixed layout — gap-fill .docops/ contract files from legacy paths; never overwrite existing destinations.");
78
+ }
79
+ notes.push("Repo-root-relative docTypes.*.path (e.g. docs/srs) — bare srs is invalid.");
80
+ notes.push("Do not move existing markdown — edit config to match on-disk folders.");
81
+ const examples = buildExamples(assessment, layout, config, docTypes, gaps);
82
+ return { docTypes, notes, examples };
83
+ }
84
+ function buildExampleDocopsConfig(config, docTypes) {
85
+ const merged = mergeDocopsDefaults(config ?? {});
86
+ const languages = merged.languages.length > 0
87
+ ? merged.languages.map((l) => ({
88
+ code: l.code,
89
+ label: l.label,
90
+ path: l.path ?? l.code,
91
+ }))
92
+ : [{ code: "en", label: "English", path: "en" }];
93
+ const exampleDocTypes = {};
94
+ for (const [key, target] of Object.entries(docTypes)) {
95
+ if (!target)
96
+ continue;
97
+ const existing = merged.docTypes?.[key];
98
+ exampleDocTypes[key] = {
99
+ enabled: target.enabled,
100
+ path: target.path,
101
+ label: existing?.label ?? LAYER_DEFAULTS[key]?.label ?? key,
102
+ ...(target.templatesPath ? { templatesPath: target.templatesPath } : {}),
103
+ };
104
+ }
105
+ return {
106
+ schemaVersion: "1.0",
107
+ layout: "docops",
108
+ docsRoot: merged.docsRoot ?? "docs",
109
+ languages,
110
+ primaryLanguage: merged.primaryLanguage ?? languages[0]?.code ?? "en",
111
+ docTypes: exampleDocTypes,
112
+ paths: { ...DEFAULT_DOCOPS_PATHS, ...merged.paths },
113
+ capabilities: { ...merged.capabilities },
114
+ };
115
+ }
116
+ function buildWrongVsCorrect(config, docTypes, gaps) {
117
+ const rows = [];
118
+ const docsRoot = config?.docsRoot?.trim() || "docs";
119
+ for (const [key, target] of Object.entries(docTypes)) {
120
+ if (!target)
121
+ continue;
122
+ const current = config?.docTypes?.[key]?.path?.trim();
123
+ if (!current || current === target.path)
124
+ continue;
125
+ rows.push({
126
+ field: `docTypes.${key}.path`,
127
+ wrong: `"${current}"`,
128
+ correct: `"${target.path}"`,
129
+ reason: "Paths must be repo-root-relative (e.g. docs/srs). Writer does not expand bare segment names.",
130
+ });
131
+ }
132
+ for (const gap of gaps) {
133
+ if (gap.id.startsWith("DOCOPS-PATH-") && gap.message.includes('expected "')) {
134
+ const match = gap.message.match(/is "([^"]+)".*expected "([^"]+)"/);
135
+ if (match) {
136
+ const field = gap.id.replace("DOCOPS-PATH-", "docTypes.") + ".path";
137
+ if (!rows.some((r) => r.field === field)) {
138
+ rows.push({
139
+ field,
140
+ wrong: `"${match[1]}"`,
141
+ correct: `"${match[2]}"`,
142
+ reason: gap.message,
143
+ });
144
+ }
145
+ }
146
+ }
147
+ }
148
+ if (config?.docTypes) {
149
+ for (const [key, dt] of Object.entries(config.docTypes)) {
150
+ if (!dt?.path?.trim() || !docTypes[key])
151
+ continue;
152
+ const layerPath = dt.path.trim();
153
+ if (isNonCanonicalDocTypePath(key, layerPath, docsRoot)) {
154
+ const canonical = normalizeDocTypePath(key, layerPath, docsRoot);
155
+ if (!rows.some((r) => r.field === `docTypes.${key}.path`)) {
156
+ rows.push({
157
+ field: `docTypes.${key}.path`,
158
+ wrong: `"${layerPath}"`,
159
+ correct: `"${canonical}"`,
160
+ reason: "Short paths like srs are invalid — use docs/<layer>.",
161
+ });
162
+ }
163
+ }
164
+ }
165
+ }
166
+ for (const key of OPTIONAL_DISABLED_LAYERS) {
167
+ if (config?.docTypes?.[key])
168
+ continue;
169
+ const base = LAYER_DEFAULTS[key];
170
+ if (!base)
171
+ continue;
172
+ rows.push({
173
+ field: `docTypes.${key}`,
174
+ wrong: "(missing)",
175
+ correct: JSON.stringify({
176
+ enabled: false,
177
+ path: base.path,
178
+ label: base.label,
179
+ ...(base.templatesPath ? { templatesPath: base.templatesPath } : {}),
180
+ }),
181
+ reason: "Required optional layer — must exist in config even when disabled.",
182
+ });
183
+ }
184
+ if (!config) {
185
+ rows.push({
186
+ field: DOCOPS_CONFIG_REL,
187
+ wrong: "(missing)",
188
+ correct: "(create from example docopsConfig below)",
189
+ reason: "Writer contract manifest is required.",
190
+ });
191
+ }
192
+ return rows;
193
+ }
194
+ function buildDocumentPathExamples(docTypes, languages, layout) {
195
+ const paths = [];
196
+ const primaryLang = languages[0]?.path ?? languages[0]?.code ?? "en";
197
+ for (const key of LAYER_KEYS) {
198
+ const target = docTypes[key];
199
+ if (!target?.enabled)
200
+ continue;
201
+ const onDisk = layout.onDisk[key];
202
+ const sampleRoot = onDisk?.roots.find((r) => r.fileCount > 0)?.path ?? target.path;
203
+ const langLayout = onDisk?.languageLayout ?? "per-language";
204
+ if (langLayout === "flat") {
205
+ paths.push(`${sampleRoot}/01-overview.md`);
206
+ }
207
+ else {
208
+ paths.push(`${sampleRoot}/${primaryLang}/01-overview.md`);
209
+ if (languages.length > 1) {
210
+ const second = languages[1]?.path ?? languages[1]?.code;
211
+ if (second)
212
+ paths.push(`${sampleRoot}/${second}/01-overview.md`);
213
+ }
214
+ }
215
+ }
216
+ return paths;
217
+ }
218
+ function buildScaffoldPathExamples(docTypes) {
219
+ const paths = [
220
+ ".docops/docops.config.json",
221
+ ".docops/guide/README.md",
222
+ ".docops/review.config.json",
223
+ ".docops/review-queue/registry.json",
224
+ ".docops/review-queue/pending.json",
225
+ ".docops/comments/",
226
+ ".docops/registry/",
227
+ ".docops/prototype/config.json",
228
+ ".docops/prototype/screen-map.json",
229
+ ];
230
+ for (const dt of Object.values(docTypes)) {
231
+ if (dt?.templatesPath) {
232
+ paths.push(`${dt.templatesPath}/*.md`);
233
+ }
234
+ }
235
+ paths.push(".docops/templates/detail-design/*.md");
236
+ return [...new Set(paths)];
237
+ }
238
+ async function buildCurrentState(projectRoot, assessment, layout, check, scaffoldPaths) {
239
+ const onDiskDocRoots = {};
240
+ for (const key of LAYER_KEYS) {
241
+ const layer = layout.onDisk[key];
242
+ const primary = layer?.roots.find((r) => r.fileCount > 0);
243
+ if (primary)
244
+ onDiskDocRoots[key] = primary.path;
245
+ }
246
+ const missingScaffold = [];
247
+ for (const rel of scaffoldPaths) {
248
+ const normalized = rel.replace(/\/\*\.md$/, "").replace(/\/$/, "");
249
+ if (!(await pathExists(join(projectRoot, normalized)))) {
250
+ missingScaffold.push(rel);
251
+ }
252
+ }
253
+ return {
254
+ layout: assessment.layout,
255
+ writerReady: assessment.writerReady,
256
+ configExists: check.configExists,
257
+ configPath: check.configPath,
258
+ legacyPathsFound: assessment.legacyPathsFound,
259
+ docopsPathsFound: assessment.docopsPathsFound,
260
+ onDiskDocRoots,
261
+ missingScaffold,
262
+ configValid: check.valid,
263
+ };
264
+ }
265
+ function buildBootstrapCopyMap(bundleRoot) {
266
+ return [
267
+ { source: `${bundleRoot}/docs/`, destination: ".docops/guide/" },
268
+ { source: `${bundleRoot}/../schemas/`, destination: ".docops/guide/schemas/" },
269
+ { source: `${bundleRoot}/../examples/`, destination: ".docops/guide/examples/" },
270
+ { source: `${bundleRoot}/config/review.config.json`, destination: ".docops/review.config.json" },
271
+ {
272
+ source: `${bundleRoot}/config/review-queue-registry.json`,
273
+ destination: ".docops/review-queue/registry.json",
274
+ },
275
+ {
276
+ source: `${bundleRoot}/config/review-queue-pending.json`,
277
+ destination: ".docops/review-queue/pending.json",
278
+ },
279
+ { source: `${bundleRoot}/config/prototype.config.json`, destination: ".docops/prototype/config.json" },
280
+ {
281
+ source: `${bundleRoot}/config/prototype-screen-map.json`,
282
+ destination: ".docops/prototype/screen-map.json",
283
+ },
284
+ { source: `${bundleRoot}/templates/srs/`, destination: ".docops/templates/srs/" },
285
+ { source: `${bundleRoot}/templates/basic-design/`, destination: ".docops/templates/basic-design/" },
286
+ {
287
+ source: `${bundleRoot}/templates/detail-design/`,
288
+ destination: ".docops/templates/detail-design/",
289
+ },
290
+ ];
291
+ }
292
+ function buildExamples(assessment, layout, config, docTypes, gaps) {
293
+ const docopsConfig = buildExampleDocopsConfig(config, docTypes);
294
+ const languages = docopsConfig.languages ?? [];
295
+ const wrongVsCorrect = buildWrongVsCorrect(config, docTypes, gaps);
296
+ const documentPaths = buildDocumentPathExamples(docTypes, languages, layout);
297
+ const scaffoldPaths = buildScaffoldPathExamples(docTypes);
298
+ const bootstrapRoot = resolveBootstrapRoot();
299
+ const contractsRoot = packagedContractsRoot();
300
+ let engineJson;
301
+ if (assessment.layout === "legacy" || assessment.layout === "mixed") {
302
+ engineJson = {
303
+ schemaVersion: 1,
304
+ scaffoldVersion: "(from legacy docflow.config.json scaffoldVersion, or installed ai-spector version)",
305
+ artifacts: {
306
+ graph: ".ai-spector/graph/traceability.graph.json",
307
+ registry: ".ai-spector/registry/section-registry.json",
308
+ },
309
+ readiness: { profile: "general" },
310
+ };
311
+ }
312
+ return {
313
+ docopsConfig,
314
+ wrongVsCorrect,
315
+ documentPaths,
316
+ scaffoldPaths,
317
+ bundle: { bootstrapRoot, contractsRoot },
318
+ bootstrapCopyMap: buildBootstrapCopyMap(bootstrapRoot),
319
+ ...(engineJson ? { engineJson } : {}),
320
+ };
321
+ }
322
+ function buildAgentTasks(assessment, check, target, cli) {
323
+ const tasks = [];
324
+ let priority = 1;
325
+ if (cli.blockers.length > 0) {
326
+ for (const blocker of cli.blockers) {
327
+ tasks.push({
328
+ id: `CLI-${priority}`,
329
+ priority: priority++,
330
+ task: blocker,
331
+ });
332
+ }
333
+ }
334
+ for (const gap of assessment.gaps.filter((g) => g.severity === "blocking")) {
335
+ tasks.push({
336
+ id: gap.id,
337
+ priority: priority++,
338
+ task: gap.fix ? `${gap.message} — ${gap.fix}` : gap.message,
339
+ rationale: gap.fix,
340
+ });
341
+ }
342
+ const pathNotes = target.notes.filter((n) => n.includes("point docTypes"));
343
+ for (const note of pathNotes) {
344
+ tasks.push({
345
+ id: `PATH-${priority}`,
346
+ priority: priority++,
347
+ task: `Edit .docops/docops.config.json: ${note}`,
348
+ });
349
+ }
350
+ if (check.configDrift || assessment.gaps.some((g) => g.id.startsWith("DOCOPS-CFG"))) {
351
+ tasks.push({
352
+ id: "CONFIG-MERGE",
353
+ priority: priority++,
354
+ task: "Merge missing keys into .docops/docops.config.json — use targetState.examples.docopsConfig as the correct shape (merge, do not blind replace).",
355
+ });
356
+ }
357
+ if (cli.repairPreview.length > 0) {
358
+ tasks.push({
359
+ id: "SCAFFOLD-GAP",
360
+ priority: priority++,
361
+ task: "Gap-fill scaffold files from bootstrap bundle — copy only when destination missing (templates, review-queue, guide/). Follow .docops/guide/guides/DOCOPS_MANUAL_FALLBACK.md §3–4.",
362
+ rationale: cli.repairPreview.slice(0, 5).join("; "),
363
+ });
364
+ }
365
+ else if (!assessment.writerReady) {
366
+ tasks.push({
367
+ id: "SCAFFOLD-GAP",
368
+ priority: priority++,
369
+ task: "Run npx ai-spector docops migrate --repair --dry-run; if CLI fails, manual gap-fill per DOCOPS_MANUAL_FALLBACK.md.",
370
+ });
371
+ }
372
+ for (const action of check.actions.filter((a) => a.severity === "warning")) {
373
+ if (tasks.some((t) => t.id === action.id))
374
+ continue;
375
+ tasks.push({
376
+ id: action.id,
377
+ priority: priority++,
378
+ task: action.command
379
+ ? `${action.message} — run: ${action.command}`
380
+ : `${action.message} — ${action.fix}`,
381
+ });
382
+ }
383
+ tasks.push({
384
+ id: "VERIFY",
385
+ priority: priority++,
386
+ task: "Verify: npx ai-spector docops check --json (expect valid: true, writerReady: true). Report written vs skipped paths.",
387
+ });
388
+ return tasks;
389
+ }
390
+ function buildAgentPrompt(result) {
391
+ const lines = [
392
+ "Docops migration — achieve the expected structure below. User asked to migrate; execute tasks without re-asking unless destructive.",
393
+ "",
394
+ `Layout: ${result.layout} | writerReady: ${result.writerReady} | recommended: ${result.recommendedAction}`,
395
+ "",
396
+ "── Current state (on disk now) ──",
397
+ `- config: ${result.currentState.configExists ? result.currentState.configPath : "(missing)"}`,
398
+ `- legacy paths: ${result.currentState.legacyPathsFound.join(", ") || "none"}`,
399
+ `- doc roots: ${Object.entries(result.currentState.onDiskDocRoots).map(([k, p]) => `${k}=${p}`).join(", ") || "none detected"}`,
400
+ ];
401
+ if (result.currentState.missingScaffold.length > 0) {
402
+ lines.push(`- missing scaffold (${result.currentState.missingScaffold.length}):`);
403
+ for (const p of result.currentState.missingScaffold.slice(0, 10)) {
404
+ lines.push(` · ${p}`);
405
+ }
406
+ if (result.currentState.missingScaffold.length > 10) {
407
+ lines.push(` · ... and ${result.currentState.missingScaffold.length - 10} more`);
408
+ }
409
+ }
410
+ else if (!result.writerReady) {
411
+ lines.push("- missing scaffold: (run repair preview / gap-fill tasks below)");
412
+ }
413
+ else {
414
+ lines.push("- scaffold: complete");
415
+ }
416
+ lines.push("", "── Expected (target — merge config, gap-fill files; never overwrite existing) ──", `Automated CLI (try first): ${result.cli.primaryCommand}`, "");
417
+ if (result.cli.blockers.length > 0) {
418
+ lines.push("Why CLI may fail:");
419
+ for (const [i, b] of result.cli.blockers.entries()) {
420
+ lines.push(`${i + 1}. ${b}`);
421
+ }
422
+ lines.push("");
423
+ }
424
+ lines.push("Target docTypes (correct paths — edit config to match; do not move docs unless user asks):");
425
+ for (const [key, dt] of Object.entries(result.targetState.docTypes)) {
426
+ if (!dt)
427
+ continue;
428
+ const tpl = dt.templatesPath ? ` templatesPath: ${dt.templatesPath}` : "";
429
+ lines.push(`- ${key}: enabled=${String(dt.enabled)} path=${dt.path}${tpl}`);
430
+ }
431
+ const examples = result.targetState.examples;
432
+ if (examples.wrongVsCorrect.length > 0) {
433
+ lines.push("", "Wrong vs correct (this project):");
434
+ for (const row of examples.wrongVsCorrect) {
435
+ lines.push(`- ${row.field}: wrong ${row.wrong ?? "—"} → correct ${row.correct}`);
436
+ lines.push(` (${row.reason})`);
437
+ }
438
+ }
439
+ lines.push("", "Example .docops/docops.config.json for this repo (merge into existing file):", "```json", JSON.stringify(examples.docopsConfig, null, 2), "```");
440
+ if (examples.documentPaths.length > 0) {
441
+ lines.push("", "Example document paths (should already exist on disk — do not move):");
442
+ for (const p of examples.documentPaths) {
443
+ lines.push(`- ${p}`);
444
+ }
445
+ }
446
+ if (examples.scaffoldPaths.length > 0) {
447
+ lines.push("", "Contract scaffold (gap-fill only — skip if path exists):");
448
+ for (const p of examples.scaffoldPaths.slice(0, 12)) {
449
+ lines.push(`- ${p}`);
450
+ }
451
+ if (examples.scaffoldPaths.length > 12) {
452
+ lines.push(`- ... and ${examples.scaffoldPaths.length - 12} more`);
453
+ }
454
+ }
455
+ if (examples.engineJson) {
456
+ lines.push("", "Example .ai-spector/engine.json (create if missing during upgrade):", "```json", JSON.stringify(examples.engineJson, null, 2), "```");
457
+ }
458
+ lines.push("", "Bundled in ai-spector CLI (standalone — no monorepo required):", `- bootstrap: ${examples.bundle.bootstrapRoot}`, `- contracts (schemas/examples): ${examples.bundle.contractsRoot}`, "", "Bootstrap gap-fill copy map (skip if destination exists):");
459
+ for (const row of examples.bootstrapCopyMap) {
460
+ lines.push(`- ${row.source} → ${row.destination}`);
461
+ }
462
+ if (result.targetState.notes.length > 0) {
463
+ lines.push("", "Rules:");
464
+ for (const note of result.targetState.notes) {
465
+ lines.push(`- ${note}`);
466
+ }
467
+ }
468
+ if (result.layoutSuggestions.length > 0) {
469
+ lines.push("", "Layout probe:");
470
+ for (const s of result.layoutSuggestions) {
471
+ lines.push(`- ${s}`);
472
+ }
473
+ }
474
+ if (result.cli.repairPreview.length > 0) {
475
+ lines.push("", "Repair preview (dry-run — safe to apply via CLI or manual gap-fill):");
476
+ for (const line of result.cli.repairPreview.slice(0, 15)) {
477
+ lines.push(`- ${line}`);
478
+ }
479
+ if (result.cli.repairPreview.length > 15) {
480
+ lines.push(`- ... and ${result.cli.repairPreview.length - 15} more`);
481
+ }
482
+ }
483
+ lines.push("", "Tasks (in order):");
484
+ for (const task of result.agentTasks) {
485
+ lines.push(`${task.priority}. [${task.id}] ${task.task}`);
486
+ }
487
+ lines.push("", "Reference (read in repo):", ...result.referenceGuides.map((g) => `- ${g}`), "", "After changes: " + result.verifyCommands.join(" → "));
488
+ return lines.join("\n");
489
+ }
490
+ async function detectCliBlockers(projectRoot, assessment) {
491
+ const blockers = [];
492
+ const hasDocops = await pathExists(join(projectRoot, DOCOPS_CONFIG_REL));
493
+ const hasDocflow = await pathExists(join(projectRoot, LEGACY_DOCFLOW_CONFIG_REL));
494
+ if (assessment.recommendedAction === "migrate" && hasDocops) {
495
+ blockers.push(`${DOCOPS_CONFIG_REL} already exists — use docops migrate --repair (not bare migrate) or docops guide for agent gap-fill.`);
496
+ }
497
+ if (assessment.recommendedAction === "migrate" && !hasDocflow && !hasDocops) {
498
+ blockers.push("No legacy docflow.config.json — use docops init instead of migrate.");
499
+ }
500
+ if (assessment.recommendedAction === "init" && hasDocops) {
501
+ blockers.push(`${DOCOPS_CONFIG_REL} already exists — use docops migrate --repair or docops init --force (fills gaps only).`);
502
+ }
503
+ if (hasDocops && hasDocflow && assessment.layout === "mixed") {
504
+ blockers.push("Mixed legacy + docops layout — automated migrate may skip existing files; agent must gap-fill per targetState.");
505
+ }
506
+ return blockers;
507
+ }
508
+ export async function buildDocopsMigrateGuide(projectRoot) {
509
+ const assessment = await assessDocopsProject(projectRoot);
510
+ const check = await checkDocopsConfig(projectRoot);
511
+ const layout = await probeDocopsLayout(projectRoot);
512
+ const config = await readDocopsConfig(projectRoot);
513
+ const repairDry = config
514
+ ? await migrateDocopsLayout({ projectRoot, repair: true, dryRun: true })
515
+ : { actions: [] };
516
+ const repairPreview = repairDry.actions.filter((a) => !a.startsWith("skip"));
517
+ const blockers = await detectCliBlockers(projectRoot, assessment);
518
+ const primaryCommand = recommendedCliCommand(assessment.recommendedAction);
519
+ const targetState = buildTargetState(assessment, layout, config, assessment.gaps);
520
+ const currentState = await buildCurrentState(projectRoot, assessment, layout, check, targetState.examples.scaffoldPaths);
521
+ const partial = {
522
+ generatedAt: new Date().toISOString(),
523
+ layout: assessment.layout,
524
+ writerReady: assessment.writerReady,
525
+ recommendedAction: assessment.recommendedAction,
526
+ currentState,
527
+ cli: {
528
+ primaryCommand,
529
+ fallbackCommand: "npx ai-spector docops guide --prompt",
530
+ autoRepairWouldRun: repairPreview.length > 0,
531
+ blockers,
532
+ repairPreview,
533
+ },
534
+ gaps: assessment.gaps,
535
+ layoutSuggestions: layout.suggestions,
536
+ targetState,
537
+ agentTasks: [],
538
+ verifyCommands: [
539
+ "npx ai-spector docops check --json",
540
+ "npx ai-spector docops status --json",
541
+ ],
542
+ referenceGuides: [
543
+ ".docops/guide/guides/DOCOPS_MANUAL_FALLBACK.md",
544
+ ".docops/guide/guides/PROJECT_LAYOUT.md",
545
+ ".docops/guide/MIGRATION.md",
546
+ ],
547
+ };
548
+ partial.agentTasks = buildAgentTasks(assessment, check, targetState, partial.cli);
549
+ return {
550
+ ...partial,
551
+ agentPrompt: buildAgentPrompt(partial),
552
+ };
553
+ }
554
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../../../src/core/docops/guide.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/core/docops/migrate.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAkID,+EAA+E;AAC/E,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,YAAY,CAAC,CAEvB;AA2JD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,wBAAwB,CAAC,CAsCnC;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAsF9B"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/core/docops/migrate.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAkID,+EAA+E;AAC/E,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,YAAY,CAAC,CAEvB;AA2JD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,wBAAwB,CAAC,CA0EnC;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAsF9B"}
@@ -198,6 +198,10 @@ export async function migrateFromDocflow(projectRoot, opts = {}) {
198
198
  if (!(await pathExists(docflowPath))) {
199
199
  return { migrated: false, reason: "docflow.config.json missing", docopsPath, enginePath, actions };
200
200
  }
201
+ const docopsConfigPath = join(projectRoot, DOCOPS_CONFIG_REL);
202
+ const engineConfigPath = join(projectRoot, ".ai-spector/engine.json");
203
+ const hasDocops = await pathExists(docopsConfigPath);
204
+ const hasEngine = await pathExists(engineConfigPath);
201
205
  const { config: docflow } = await loadDocflowConfig(projectRoot);
202
206
  const docTypes = buildDocTypesFromLayers(undefined, await inferDocTypesFromTree(projectRoot));
203
207
  const docops = docopsConfigFromDocflow(docflow, docTypes);
@@ -210,17 +214,47 @@ export async function migrateFromDocflow(projectRoot, opts = {}) {
210
214
  engine.artifacts.graph = docflow.paths.graph;
211
215
  if (docflow.paths?.registry)
212
216
  engine.artifacts.registry = docflow.paths.registry;
217
+ if (hasDocops && hasEngine) {
218
+ return {
219
+ migrated: false,
220
+ reason: `${DOCOPS_CONFIG_REL} and engine.json already exist — use docops migrate --repair or docops guide --prompt`,
221
+ docopsPath,
222
+ enginePath,
223
+ actions: [`skip — ${DOCOPS_CONFIG_REL} and engine.json already exist`],
224
+ };
225
+ }
213
226
  await copyLegacyArtifacts(projectRoot, actions, dryRun);
214
- actions.push(`${dryRun ? "would write" : "write"} ${DOCOPS_CONFIG_REL}`);
215
- actions.push(`${dryRun ? "would write" : "write"} .ai-spector/engine.json`);
216
- if (write) {
217
- await writeDocopsConfig(projectRoot, docops);
218
- await writeEngineConfig(projectRoot, engine);
227
+ if (!hasDocops) {
228
+ actions.push(`${dryRun ? "would write" : "write"} ${DOCOPS_CONFIG_REL}`);
229
+ if (write) {
230
+ await writeDocopsConfig(projectRoot, docops);
231
+ }
232
+ }
233
+ else {
234
+ actions.push(`skip — ${DOCOPS_CONFIG_REL} already exists`);
235
+ }
236
+ if (!hasEngine) {
237
+ actions.push(`${dryRun ? "would write" : "write"} .ai-spector/engine.json`);
238
+ if (write) {
239
+ await writeEngineConfig(projectRoot, engine);
240
+ }
241
+ }
242
+ else {
243
+ actions.push("skip — .ai-spector/engine.json already exists");
244
+ }
245
+ const bootstrapConfig = hasDocops ? (await readDocopsConfig(projectRoot)) ?? docops : docops;
246
+ if (bootstrapConfig) {
247
+ await bootstrapDocopsContract(projectRoot, bootstrapConfig, docflow, actions, dryRun);
219
248
  }
220
- await bootstrapDocopsContract(projectRoot, docops, docflow, actions, dryRun);
221
249
  if (!dryRun) {
222
250
  await bootstrapEntityRegistry(projectRoot, { actions });
223
251
  }
252
+ if (hasDocops && !hasEngine) {
253
+ const existing = await readDocopsConfig(projectRoot);
254
+ if (existing) {
255
+ await repairDocopsGaps(projectRoot, existing, actions, dryRun);
256
+ }
257
+ }
224
258
  return { migrated: true, docopsPath, enginePath, actions };
225
259
  }
226
260
  export async function migrateDocopsLayout(opts) {