ai-spector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +173 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/analyze.d.ts +9 -0
  8. package/dist/commands/analyze.d.ts.map +1 -0
  9. package/dist/commands/analyze.js +62 -0
  10. package/dist/commands/analyze.js.map +1 -0
  11. package/dist/commands/bootstrap.d.ts +4 -0
  12. package/dist/commands/bootstrap.d.ts.map +1 -0
  13. package/dist/commands/bootstrap.js +58 -0
  14. package/dist/commands/bootstrap.js.map +1 -0
  15. package/dist/commands/graph-impact.d.ts +10 -0
  16. package/dist/commands/graph-impact.d.ts.map +1 -0
  17. package/dist/commands/graph-impact.js +31 -0
  18. package/dist/commands/graph-impact.js.map +1 -0
  19. package/dist/commands/graph-merge.d.ts +11 -0
  20. package/dist/commands/graph-merge.d.ts.map +1 -0
  21. package/dist/commands/graph-merge.js +88 -0
  22. package/dist/commands/graph-merge.js.map +1 -0
  23. package/dist/commands/graph-query.d.ts +10 -0
  24. package/dist/commands/graph-query.d.ts.map +1 -0
  25. package/dist/commands/graph-query.js +31 -0
  26. package/dist/commands/graph-query.js.map +1 -0
  27. package/dist/commands/graph-visualize.d.ts +10 -0
  28. package/dist/commands/graph-visualize.d.ts.map +1 -0
  29. package/dist/commands/graph-visualize.js +72 -0
  30. package/dist/commands/graph-visualize.js.map +1 -0
  31. package/dist/commands/init.d.ts +6 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +47 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/validate.d.ts +10 -0
  36. package/dist/commands/validate.d.ts.map +1 -0
  37. package/dist/commands/validate.js +89 -0
  38. package/dist/commands/validate.js.map +1 -0
  39. package/dist/config/load.d.ts +21 -0
  40. package/dist/config/load.d.ts.map +1 -0
  41. package/dist/config/load.js +77 -0
  42. package/dist/config/load.js.map +1 -0
  43. package/dist/config/types.d.ts +22 -0
  44. package/dist/config/types.d.ts.map +1 -0
  45. package/dist/config/types.js +2 -0
  46. package/dist/config/types.js.map +1 -0
  47. package/dist/graph/InMemoryGraph.d.ts +20 -0
  48. package/dist/graph/InMemoryGraph.d.ts.map +1 -0
  49. package/dist/graph/InMemoryGraph.js +181 -0
  50. package/dist/graph/InMemoryGraph.js.map +1 -0
  51. package/dist/graph/defaults.d.ts +10 -0
  52. package/dist/graph/defaults.d.ts.map +1 -0
  53. package/dist/graph/defaults.js +10 -0
  54. package/dist/graph/defaults.js.map +1 -0
  55. package/dist/graph/impact.d.ts +32 -0
  56. package/dist/graph/impact.d.ts.map +1 -0
  57. package/dist/graph/impact.js +88 -0
  58. package/dist/graph/impact.js.map +1 -0
  59. package/dist/graph/knowledge.d.ts +53 -0
  60. package/dist/graph/knowledge.d.ts.map +1 -0
  61. package/dist/graph/knowledge.js +79 -0
  62. package/dist/graph/knowledge.js.map +1 -0
  63. package/dist/graph/load.d.ts +4 -0
  64. package/dist/graph/load.d.ts.map +1 -0
  65. package/dist/graph/load.js +12 -0
  66. package/dist/graph/load.js.map +1 -0
  67. package/dist/graph/loadGraph.d.ts +3 -0
  68. package/dist/graph/loadGraph.d.ts.map +1 -0
  69. package/dist/graph/loadGraph.js +7 -0
  70. package/dist/graph/loadGraph.js.map +1 -0
  71. package/dist/graph/merge.d.ts +15 -0
  72. package/dist/graph/merge.d.ts.map +1 -0
  73. package/dist/graph/merge.js +63 -0
  74. package/dist/graph/merge.js.map +1 -0
  75. package/dist/graph/query.d.ts +18 -0
  76. package/dist/graph/query.d.ts.map +1 -0
  77. package/dist/graph/query.js +132 -0
  78. package/dist/graph/query.js.map +1 -0
  79. package/dist/registry/build.d.ts +3 -0
  80. package/dist/registry/build.d.ts.map +1 -0
  81. package/dist/registry/build.js +53 -0
  82. package/dist/registry/build.js.map +1 -0
  83. package/dist/registry/slug.d.ts +4 -0
  84. package/dist/registry/slug.d.ts.map +1 -0
  85. package/dist/registry/slug.js +16 -0
  86. package/dist/registry/slug.js.map +1 -0
  87. package/dist/types.d.ts +45 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/util/fs.d.ts +6 -0
  92. package/dist/util/fs.d.ts.map +1 -0
  93. package/dist/util/fs.js +24 -0
  94. package/dist/util/fs.js.map +1 -0
  95. package/dist/util/paths.d.ts +16 -0
  96. package/dist/util/paths.d.ts.map +1 -0
  97. package/dist/util/paths.js +19 -0
  98. package/dist/util/paths.js.map +1 -0
  99. package/dist/visualize/html.d.ts +13 -0
  100. package/dist/visualize/html.d.ts.map +1 -0
  101. package/dist/visualize/html.js +374 -0
  102. package/dist/visualize/html.js.map +1 -0
  103. package/dist/visualize/stats.d.ts +21 -0
  104. package/dist/visualize/stats.d.ts.map +1 -0
  105. package/dist/visualize/stats.js +45 -0
  106. package/dist/visualize/stats.js.map +1 -0
  107. package/documents.json +64 -0
  108. package/package.json +65 -0
  109. package/scaffold/.ai-spector/.docflow/config/analyze.graphify.json +40 -0
  110. package/scaffold/.ai-spector/.docflow/config/completeness-rules.basic-design.json +18 -0
  111. package/scaffold/.ai-spector/.docflow/config/completeness-rules.detail-design.json +57 -0
  112. package/scaffold/.ai-spector/.docflow/config/completeness-rules.srs.json +72 -0
  113. package/scaffold/.ai-spector/.docflow/config/dag.basic-design.json +38 -0
  114. package/scaffold/.ai-spector/.docflow/config/dag.detail-design.json +64 -0
  115. package/scaffold/.ai-spector/.docflow/config/dag.srs.json +87 -0
  116. package/scaffold/.ai-spector/.docflow/config/data-source.json +5 -0
  117. package/scaffold/.ai-spector/.docflow/config/index.docs.json +22 -0
  118. package/scaffold/.ai-spector/.docflow/config/workflow.dependencies.json +271 -0
  119. package/scaffold/.ai-spector/.docflow/extract/patch.example.json +20 -0
  120. package/scaffold/.ai-spector/.docflow/state.json +11 -0
  121. package/scaffold/.ai-spector/docflow.config.json +7 -0
  122. package/scaffold/.ai-spector/index/README.md +18 -0
  123. package/scaffold/.ai-spector/index/basic-design.md +5 -0
  124. package/scaffold/.ai-spector/index/srs.md +5 -0
  125. package/scaffold/.cursor/commands/_cli-failures.md +110 -0
  126. package/scaffold/.cursor/commands/_graph.md +48 -0
  127. package/scaffold/.cursor/commands/_prerequisites.md +48 -0
  128. package/scaffold/.cursor/commands/_workflow.md +50 -0
  129. package/scaffold/.cursor/commands/analyze.md +92 -0
  130. package/scaffold/.cursor/commands/generate-basic-design.md +26 -0
  131. package/scaffold/.cursor/commands/generate-detail-design.md +19 -0
  132. package/scaffold/.cursor/commands/generate-srs.md +63 -0
  133. package/scaffold/.cursor/commands/graph-impact.md +45 -0
  134. package/scaffold/.cursor/commands/index-docs.md +36 -0
  135. package/scaffold/.cursor/commands/sync-graph.md +30 -0
  136. package/scaffold/.cursor/commands/validate-graph.md +28 -0
  137. package/scaffold/.cursor/commands/visualize-graph.md +24 -0
  138. package/scaffold/.cursor/skills/ai-spector/SKILL.md +39 -0
  139. package/scaffold/docs/data-source/README.md +7 -0
  140. package/schemas/rules.impact.json +17 -0
  141. package/schemas/rules.traceability.json +30 -0
  142. package/schemas/schema.extract-patch.json +19 -0
  143. package/schemas/schema.graph.json +83 -0
  144. package/schemas/schema.knowledge.json +107 -0
  145. package/templates/basic_design/db-design-template.md +177 -0
  146. package/templates/basic_design/detail-api-template.md +278 -0
  147. package/templates/basic_design/detail-screen-template.md +281 -0
  148. package/templates/basic_design/list-api-template.md +130 -0
  149. package/templates/basic_design/list-screen-template.md +242 -0
  150. package/templates/detail_design/common/architecture-overview-template.md +302 -0
  151. package/templates/detail_design/common/deployment-infrastructure-template.md +461 -0
  152. package/templates/detail_design/common/error-handling-patterns-template.md +460 -0
  153. package/templates/detail_design/common/integration-patterns-template.md +410 -0
  154. package/templates/detail_design/common/performance-standards-template.md +406 -0
  155. package/templates/detail_design/common/security-patterns-template.md +395 -0
  156. package/templates/detail_design/feature-detail-design-template.md +773 -0
  157. package/templates/detail_design/feature-list-template.md +39 -0
  158. package/templates/srs/1-introduction.md +58 -0
  159. package/templates/srs/2-overall-description.md +91 -0
  160. package/templates/srs/3-use-case-detail-template.md +142 -0
  161. package/templates/srs/3-use-cases.md +53 -0
  162. package/templates/srs/4-system-feature-detail-template.md +131 -0
  163. package/templates/srs/4-system-features-list-template.md +39 -0
  164. package/templates/srs/5-data-requirements.md +59 -0
  165. package/templates/srs/6-external-interfaces.md +56 -0
  166. package/templates/srs/7-quality-attributes.md +74 -0
  167. package/templates/srs/8-internationalization.md +36 -0
  168. package/templates/srs/9-other-requirements.md +46 -0
@@ -0,0 +1,88 @@
1
+ import { join } from "node:path";
2
+ import { loadInMemoryGraph } from "../graph/loadGraph.js";
3
+ import { isKnowledgePayload, knowledgeHasDomainEntries, knowledgeToPatch, } from "../graph/knowledge.js";
4
+ import { mergePatch, normalizePatch } from "../graph/merge.js";
5
+ import { resolveProjectPaths } from "../util/paths.js";
6
+ import { pathExists, readJson, writeJson } from "../util/fs.js";
7
+ import { validateGraph, formatIssues } from "./validate.js";
8
+ export async function runGraphMerge(opts) {
9
+ const paths = await resolveProjectPaths(opts.root);
10
+ const graphPath = opts.graphPath ?? paths.graph;
11
+ const knowledgePath = join(paths.root, ".ai-spector/.docflow/analysis/knowledge.json");
12
+ const defaultPatchPath = join(paths.root, ".ai-spector/.docflow/extract/patch.json");
13
+ let inputPath = opts.inputPath;
14
+ if (opts.fromKnowledge) {
15
+ inputPath = knowledgePath;
16
+ }
17
+ else if (!inputPath) {
18
+ if (await pathExists(defaultPatchPath)) {
19
+ inputPath = defaultPatchPath;
20
+ }
21
+ else {
22
+ inputPath = knowledgePath;
23
+ }
24
+ }
25
+ const raw = await readJson(inputPath);
26
+ const patch = await resolvePatch(raw, inputPath);
27
+ if (opts.writePatch) {
28
+ await writeJson(opts.writePatch, patch);
29
+ console.log(`Wrote patch → ${opts.writePatch}`);
30
+ }
31
+ const graph = await loadInMemoryGraph(graphPath);
32
+ const { stats } = mergePatch(graph, patch);
33
+ console.log(`Merge: +${stats.nodesCreated} nodes, ~${stats.nodesUpdated} updated, +${stats.edgesAdded} edges` +
34
+ (stats.nodesSkipped ? `, ${stats.nodesSkipped} structure nodes skipped` : ""));
35
+ if (opts.dryRun) {
36
+ console.log("(dry-run: graph not saved)");
37
+ return;
38
+ }
39
+ await writeJson(graphPath, graph.toTraceabilityGraph());
40
+ const statePath = join(paths.root, ".ai-spector/.docflow/state.json");
41
+ const state = await readJson(statePath).catch(() => ({
42
+ version: 1,
43
+ analysis: {},
44
+ }));
45
+ const analysis = state.analysis ?? {};
46
+ analysis.graphMergedAt = new Date().toISOString();
47
+ analysis.lastMergeSource = inputPath;
48
+ state.analysis = analysis;
49
+ await writeJson(statePath, state);
50
+ if (opts.validate !== false) {
51
+ const issues = await validateGraph({
52
+ graphPath,
53
+ schemaPath: paths.schema,
54
+ registryPath: paths.registry,
55
+ rulesPath: paths.rulesTraceability,
56
+ });
57
+ const errors = issues.filter((i) => i.severity === "error");
58
+ if (errors.length > 0) {
59
+ console.log(formatIssues(issues));
60
+ console.error("");
61
+ console.error("Merge rolled back nothing — graph was saved but validation failed.");
62
+ console.error("Fix the issues above, then re-run: ai-spector graph merge --from-knowledge");
63
+ console.error("Or run /analyze in Cursor (agent should show these errors and help fix).");
64
+ throw new Error("Graph validation failed after merge");
65
+ }
66
+ const warns = issues.filter((i) => i.severity === "warn");
67
+ if (warns.length > 0) {
68
+ console.log(formatIssues(warns));
69
+ }
70
+ console.log("Graph validate: OK");
71
+ }
72
+ console.log(`Wrote ${graphPath}`);
73
+ }
74
+ async function resolvePatch(raw, sourcePath) {
75
+ if (isKnowledgePayload(raw)) {
76
+ const knowledge = raw;
77
+ if (!knowledgeHasDomainEntries(knowledge)) {
78
+ throw new Error(`No domain entries in ${sourcePath} (useCases, features, actors, …). Run /analyze in Cursor first.`);
79
+ }
80
+ return knowledgeToPatch(knowledge);
81
+ }
82
+ const patch = normalizePatch(raw);
83
+ if (patch.nodes.length === 0 && patch.edges.length === 0) {
84
+ throw new Error(`Empty patch in ${sourcePath}`);
85
+ }
86
+ return patch;
87
+ }
88
+ //# sourceMappingURL=graph-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-merge.js","sourceRoot":"","sources":["../../src/commands/graph-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAY5D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CACxB,KAAK,CAAC,IAAI,EACV,8CAA8C,CAC/C,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;IAErF,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,SAAS,GAAG,aAAa,CAAC;IAC5B,CAAC;SAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,SAAS,GAAG,gBAAgB,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,aAAa,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAU,SAAS,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CACT,WAAW,KAAK,CAAC,YAAY,YAAY,KAAK,CAAC,YAAY,cAAc,KAAK,CAAC,UAAU,QAAQ;QAC/F,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,CAChF,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAA0B,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAI,KAAK,CAAC,QAAoC,IAAI,EAAE,CAAC;IACnE,QAAQ,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,QAAQ,CAAC,eAAe,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAElC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,SAAS;YACT,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,YAAY,EAAE,KAAK,CAAC,QAAQ;YAC5B,SAAS,EAAE,KAAK,CAAC,iBAAiB;SACnC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACpF,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAC5F,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC1F,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,UAAkB;IAC1D,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAwB,CAAC;QAC3C,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,wBAAwB,UAAU,iEAAiE,CACpG,CAAC;QACJ,CAAC;QACD,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAmB,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface GraphQueryCliOptions {
2
+ graphPath: string;
3
+ seedId: string;
4
+ direction?: "out" | "in" | "both";
5
+ depth?: number;
6
+ edges?: string;
7
+ json?: boolean;
8
+ }
9
+ export declare function runGraphQuery(opts: GraphQueryCliOptions): Promise<void>;
10
+ //# sourceMappingURL=graph-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-query.d.ts","sourceRoot":"","sources":["../../src/commands/graph-query.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B7E"}
@@ -0,0 +1,31 @@
1
+ import { loadInMemoryGraph } from "../graph/loadGraph.js";
2
+ import { querySubgraph } from "../graph/query.js";
3
+ export async function runGraphQuery(opts) {
4
+ const g = await loadInMemoryGraph(opts.graphPath);
5
+ const queryOpts = {
6
+ direction: opts.direction,
7
+ depth: opts.depth,
8
+ };
9
+ if (opts.edges) {
10
+ queryOpts.edgeTypes = opts.edges.split(",").map((s) => s.trim());
11
+ }
12
+ const result = querySubgraph(g, opts.seedId, queryOpts);
13
+ if (opts.json) {
14
+ console.log(JSON.stringify(result, null, 2));
15
+ return;
16
+ }
17
+ console.log(`Seed: ${result.seed}`);
18
+ console.log(`Nodes (${result.nodes.length}):`);
19
+ for (const n of result.nodes) {
20
+ console.log(` - ${n.id} (${n.type})`);
21
+ }
22
+ console.log(`Edges (${result.edges.length}):`);
23
+ for (const e of result.edges) {
24
+ console.log(` - ${e.from} --${e.type}--> ${e.to}`);
25
+ }
26
+ console.log(`Projection paths (${result.projectionPaths.length}):`);
27
+ for (const p of result.projectionPaths) {
28
+ console.log(` - ${p}`);
29
+ }
30
+ }
31
+ //# sourceMappingURL=graph-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../src/commands/graph-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAqB,MAAM,mBAAmB,CAAC;AAYrE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA0B;IAC5D,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,SAAS,GAAiB;QAC9B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAe,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface GraphVisualizeOptions {
2
+ root?: string;
3
+ graphPath?: string;
4
+ knowledgePath?: string;
5
+ output?: string;
6
+ open?: boolean;
7
+ skipKnowledge?: boolean;
8
+ }
9
+ export declare function runGraphVisualize(opts: GraphVisualizeOptions): Promise<string>;
10
+ //# sourceMappingURL=graph-visualize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-visualize.d.ts","sourceRoot":"","sources":["../../src/commands/graph-visualize.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDpF"}
@@ -0,0 +1,72 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { join } from "node:path";
4
+ import { writeFile, mkdir } from "node:fs/promises";
5
+ import { dirname } from "node:path";
6
+ import { pathExists, readJson } from "../util/fs.js";
7
+ import { resolveProjectPaths } from "../util/paths.js";
8
+ import { isKnowledgePayload, } from "../graph/knowledge.js";
9
+ import { buildVisualizationHtml } from "../visualize/html.js";
10
+ import { computeGraphStats, computeKnowledgeStats } from "../visualize/stats.js";
11
+ const execAsync = promisify(exec);
12
+ export async function runGraphVisualize(opts) {
13
+ const paths = await resolveProjectPaths(opts.root);
14
+ const graphPath = opts.graphPath ?? paths.graph;
15
+ const knowledgePath = opts.knowledgePath ??
16
+ join(paths.root, ".ai-spector/.docflow/analysis/knowledge.json");
17
+ const outputPath = opts.output ?? join(paths.root, ".ai-spector/views/graph-knowledge.html");
18
+ const graph = await readJson(graphPath);
19
+ let knowledge = null;
20
+ if (!opts.skipKnowledge && (await pathExists(knowledgePath))) {
21
+ const raw = await readJson(knowledgePath);
22
+ if (isKnowledgePayload(raw)) {
23
+ knowledge = raw;
24
+ }
25
+ }
26
+ const html = buildVisualizationHtml({
27
+ generatedAt: new Date().toISOString(),
28
+ projectRoot: paths.root,
29
+ graph,
30
+ knowledge,
31
+ graphStats: computeGraphStats(graph),
32
+ knowledgeStats: computeKnowledgeStats(knowledge),
33
+ });
34
+ await mkdir(dirname(outputPath), { recursive: true });
35
+ await writeFile(outputPath, html, "utf8");
36
+ console.log(`Wrote ${outputPath}`);
37
+ console.log(` ${graph.nodes.length} nodes, ${graph.edges.length} edges`);
38
+ if (knowledge) {
39
+ const k = computeKnowledgeStats(knowledge);
40
+ console.log(` knowledge: ${k.useCases} use cases, ${k.features} features, ${k.actors} actors`);
41
+ }
42
+ else {
43
+ console.log(" knowledge: (not loaded)");
44
+ }
45
+ console.log("");
46
+ console.log("Open in a browser:");
47
+ console.log(` file://${outputPath}`);
48
+ if (opts.open) {
49
+ await openInBrowser(outputPath);
50
+ }
51
+ return outputPath;
52
+ }
53
+ async function openInBrowser(filePath) {
54
+ const url = `file://${filePath}`;
55
+ const platform = process.platform;
56
+ try {
57
+ if (platform === "darwin") {
58
+ await execAsync(`open "${filePath}"`);
59
+ }
60
+ else if (platform === "win32") {
61
+ await execAsync(`start "" "${filePath}"`, { shell: "cmd.exe" });
62
+ }
63
+ else {
64
+ await execAsync(`xdg-open "${filePath}"`);
65
+ }
66
+ console.log(`Opened ${url}`);
67
+ }
68
+ catch (e) {
69
+ console.warn(`Could not open browser automatically: ${e instanceof Error ? e.message : e}`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=graph-visualize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-visualize.js","sourceRoot":"","sources":["../../src/commands/graph-visualize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface InitOptions {
2
+ targetDir: string;
3
+ force?: boolean;
4
+ }
5
+ export declare function runInit(opts: InitOptions): Promise<void>;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD9D"}
@@ -0,0 +1,47 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { scaffoldBundleRoot } from "../config/load.js";
4
+ import { copyTree, pathExists, writeJson } from "../util/fs.js";
5
+ export async function runInit(opts) {
6
+ const root = resolve(opts.targetDir);
7
+ const marker = join(root, ".ai-spector", "docflow.config.json");
8
+ if (await pathExists(marker) && !opts.force) {
9
+ throw new Error(`Project already initialized (${marker}). Use --force to overwrite scaffold files.`);
10
+ }
11
+ const scaffold = scaffoldBundleRoot();
12
+ await copyTree(scaffold, root);
13
+ const dirs = [
14
+ ".ai-spector/graph",
15
+ ".ai-spector/registry",
16
+ ".ai-spector/.docflow/analysis",
17
+ ".ai-spector/.docflow/extract",
18
+ ".ai-spector/views",
19
+ "docs/srs",
20
+ "docs/basic-design",
21
+ "docs/detail-design",
22
+ ];
23
+ for (const d of dirs) {
24
+ await mkdir(join(root, d), { recursive: true });
25
+ }
26
+ const statePath = join(root, ".ai-spector/.docflow/state.json");
27
+ await writeJson(statePath, {
28
+ version: 1,
29
+ initializedAt: new Date().toISOString(),
30
+ analysis: { lastRunAt: null, graphPreparedAt: null },
31
+ index: { lastRunAt: null },
32
+ });
33
+ const gitkeep = join(root, "docs/srs/.gitkeep");
34
+ if (!(await pathExists(gitkeep))) {
35
+ await writeFile(gitkeep, "");
36
+ }
37
+ console.log(`Initialized AI Spector project at ${root}`);
38
+ console.log("");
39
+ console.log("Next steps (Cursor):");
40
+ console.log(" 1. Open this folder in Cursor");
41
+ console.log(" 2. Enable the ai-spector skill (.cursor/skills/ai-spector/)");
42
+ console.log(" 3. Add files under docs/data-source/");
43
+ console.log(" 4. Run /analyze → /validate-graph → /generate-srs");
44
+ console.log("");
45
+ console.log("See .cursor/commands/_workflow.md — you do not need other CLI commands.");
46
+ }
47
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAOhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IAEhE,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,6CAA6C,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG;QACX,mBAAmB;QACnB,sBAAsB;QACtB,+BAA+B;QAC/B,8BAA8B;QAC9B,mBAAmB;QACnB,UAAU;QACV,mBAAmB;QACnB,oBAAoB;KACrB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,SAAS,EAAE;QACzB,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACvC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;QACpD,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;KAC3B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ValidationIssue } from "../types.js";
2
+ export interface ValidateOptions {
3
+ graphPath: string;
4
+ schemaPath: string;
5
+ registryPath?: string;
6
+ rulesPath?: string;
7
+ }
8
+ export declare function validateGraph(opts: ValidateOptions): Promise<ValidationIssue[]>;
9
+ export declare function formatIssues(issues: ValidationIssue[]): string;
10
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,aAAa,CAAC;AAStE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CA6E5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAiB9D"}
@@ -0,0 +1,89 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const Ajv = require("ajv/dist/2020.js");
4
+ const addFormats = require("ajv-formats");
5
+ import { InMemoryGraph } from "../graph/InMemoryGraph.js";
6
+ import { readJson } from "../util/fs.js";
7
+ export async function validateGraph(opts) {
8
+ const issues = [];
9
+ const graph = await readJson(opts.graphPath);
10
+ const schema = await readJson(opts.schemaPath);
11
+ const ajv = new Ajv({ allErrors: true, strict: false });
12
+ addFormats(ajv);
13
+ const validate = ajv.compile(schema);
14
+ if (!validate(graph)) {
15
+ for (const err of validate.errors ?? []) {
16
+ issues.push({
17
+ ruleId: "SCHEMA",
18
+ severity: "error",
19
+ message: `${err.instancePath || "/"} ${err.message}`,
20
+ });
21
+ }
22
+ }
23
+ let mem;
24
+ try {
25
+ mem = InMemoryGraph.from(graph);
26
+ }
27
+ catch (e) {
28
+ issues.push({
29
+ ruleId: "GRAPH-LOAD",
30
+ severity: "error",
31
+ message: e instanceof Error ? e.message : String(e),
32
+ });
33
+ return issues;
34
+ }
35
+ issues.push(...mem.validateStructure());
36
+ if (opts.registryPath) {
37
+ const registry = await readJson(opts.registryPath);
38
+ const graphSectionIds = new Set([...mem.nodesById.values()]
39
+ .filter((n) => n.type === "section")
40
+ .map((n) => n.id));
41
+ for (const doc of registry.documents) {
42
+ for (const sec of doc.sections) {
43
+ if (!graphSectionIds.has(sec.id)) {
44
+ issues.push({
45
+ ruleId: "REGISTRY-COMPLETE",
46
+ severity: "error",
47
+ message: `Registry section missing from graph: ${sec.id} (${doc.documentId})`,
48
+ nodeId: sec.id,
49
+ });
50
+ }
51
+ }
52
+ if (!mem.nodesById.has(doc.documentId)) {
53
+ issues.push({
54
+ ruleId: "REGISTRY-COMPLETE",
55
+ severity: "error",
56
+ message: `Registry document missing from graph: ${doc.documentId}`,
57
+ nodeId: doc.documentId,
58
+ });
59
+ }
60
+ }
61
+ }
62
+ if (opts.rulesPath) {
63
+ const rules = await readJson(opts.rulesPath);
64
+ for (const r of rules.rules ?? []) {
65
+ if (r.id === "REGISTRY-COMPLETE" && !opts.registryPath) {
66
+ issues.push({
67
+ ruleId: r.id,
68
+ severity: "warn",
69
+ message: `Rule ${r.id} skipped: no registry path provided`,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ return issues;
75
+ }
76
+ export function formatIssues(issues) {
77
+ if (issues.length === 0) {
78
+ return "OK — no validation issues";
79
+ }
80
+ const lines = issues.map((i) => `[${i.severity.toUpperCase()}] ${i.ruleId}: ${i.message}${i.nodeId ? ` (${i.nodeId})` : ""}`);
81
+ const errors = issues.filter((i) => i.severity === "error");
82
+ if (errors.length > 0) {
83
+ lines.push("");
84
+ lines.push("Fix each ERROR above, then re-run: ai-spector graph validate (or /validate-graph in Cursor).");
85
+ lines.push("Do not generate docs until validate passes. See .cursor/commands/_cli-failures.md");
86
+ }
87
+ return lines.join("\n");
88
+ }
89
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAA8C,CAAC;AACrF,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAyC,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAqB;IAErB,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAoB,IAAI,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAA0B,IAAI,CAAC,UAAU,CAAC,CAAC;IAExE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,GAAkB,CAAC;IACvB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAkB,IAAI,CAAC,YAAY,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACpB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,mBAAmB;wBAC3B,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,wCAAwC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,UAAU,GAAG;wBAC7E,MAAM,EAAE,GAAG,CAAC,EAAE;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,mBAAmB;oBAC3B,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,yCAAyC,GAAG,CAAC,UAAU,EAAE;oBAClE,MAAM,EAAE,GAAG,CAAC,UAAU;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAC1B,IAAI,CAAC,SAAS,CACf,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,EAAE,KAAK,mBAAmB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,CAAC,CAAC,EAAE;oBACZ,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,qCAAqC;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/F,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,8FAA8F,CAC/F,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { DocflowConfig, DocumentsManifest } from "./types.js";
2
+ /** Installed package root (schemas, templates, documents.json). */
3
+ export declare function packageBundleRoot(): string;
4
+ /** Bundled project scaffold for `ai-spector init`. */
5
+ export declare function scaffoldBundleRoot(): string;
6
+ export declare function findProjectRoot(start?: string): string;
7
+ export declare function loadDocflowConfig(root?: string): Promise<{
8
+ root: string;
9
+ config: DocflowConfig;
10
+ configFile: string;
11
+ }>;
12
+ export declare function resolveFromRoot(root: string, relativePath: string): string;
13
+ export declare function bundledSchemaPath(): string;
14
+ export declare function bundledRulesTraceabilityPath(): string;
15
+ export declare function bundledRulesImpactPath(): string;
16
+ export declare function bundledTemplatesDir(subdir: string): string;
17
+ export declare function loadDocumentsManifest(): Promise<{
18
+ bundleRoot: string;
19
+ manifest: DocumentsManifest;
20
+ }>;
21
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAgB,GAAG,MAAM,CAkB7D;AAeD,wBAAsB,iBAAiB,CACrC,IAAI,SAAoB,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAWtE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC,CASD"}
@@ -0,0 +1,77 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { readJson } from "../util/fs.js";
5
+ const CONFIG_NAME = "docflow.config.json";
6
+ /** Installed package root (schemas, templates, documents.json). */
7
+ export function packageBundleRoot() {
8
+ return resolve(dirname(fileURLToPath(import.meta.url)), "../..");
9
+ }
10
+ /** Bundled project scaffold for `ai-spector init`. */
11
+ export function scaffoldBundleRoot() {
12
+ return join(packageBundleRoot(), "scaffold");
13
+ }
14
+ export function findProjectRoot(start = process.cwd()) {
15
+ let dir = resolve(start);
16
+ for (;;) {
17
+ if (existsSync(join(dir, ".ai-spector", CONFIG_NAME))) {
18
+ return dir;
19
+ }
20
+ if (existsSync(join(dir, CONFIG_NAME))) {
21
+ return dir;
22
+ }
23
+ const parent = dirname(dir);
24
+ if (parent === dir) {
25
+ break;
26
+ }
27
+ dir = parent;
28
+ }
29
+ throw new Error(`Could not find project root (expected .ai-spector/${CONFIG_NAME} or ${CONFIG_NAME})`);
30
+ }
31
+ function configPath(root) {
32
+ const nested = join(root, ".ai-spector", CONFIG_NAME);
33
+ if (existsSync(nested)) {
34
+ return nested;
35
+ }
36
+ return join(root, CONFIG_NAME);
37
+ }
38
+ const DEFAULT_PATHS = {
39
+ graph: ".ai-spector/graph/traceability.graph.json",
40
+ registry: ".ai-spector/registry/section-registry.json",
41
+ };
42
+ export async function loadDocflowConfig(root = findProjectRoot()) {
43
+ const configFile = configPath(root);
44
+ const raw = await readJson(configFile);
45
+ const config = {
46
+ version: raw.version ?? 1,
47
+ paths: {
48
+ graph: raw.paths?.graph ?? DEFAULT_PATHS.graph,
49
+ registry: raw.paths?.registry ?? DEFAULT_PATHS.registry,
50
+ },
51
+ };
52
+ return { root, config, configFile };
53
+ }
54
+ export function resolveFromRoot(root, relativePath) {
55
+ return resolve(root, relativePath);
56
+ }
57
+ export function bundledSchemaPath() {
58
+ return join(packageBundleRoot(), "schemas/schema.graph.json");
59
+ }
60
+ export function bundledRulesTraceabilityPath() {
61
+ return join(packageBundleRoot(), "schemas/rules.traceability.json");
62
+ }
63
+ export function bundledRulesImpactPath() {
64
+ return join(packageBundleRoot(), "schemas/rules.impact.json");
65
+ }
66
+ export function bundledTemplatesDir(subdir) {
67
+ return join(packageBundleRoot(), "templates", subdir);
68
+ }
69
+ export async function loadDocumentsManifest() {
70
+ const bundleRoot = packageBundleRoot();
71
+ const manifest = await readJson(join(bundleRoot, "documents.json"));
72
+ if (!manifest.templatesDir || !Array.isArray(manifest.documents)) {
73
+ throw new Error(`Invalid documents.json in ${bundleRoot}`);
74
+ }
75
+ return { bundleRoot, manifest };
76
+ }
77
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,mEAAmE;AACnE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;IACnD,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM;QACR,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CACb,qDAAqD,WAAW,OAAO,WAAW,GAAG,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,2CAA2C;IAClD,QAAQ,EAAE,4CAA4C;CAC9C,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAI,GAAG,eAAe,EAAE;IAExB,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAyB,UAAU,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC;QACzB,KAAK,EAAE;YACL,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,aAAa,CAAC,KAAK;YAC9C,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,aAAa,CAAC,QAAQ;SACxD;KACF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,YAAoB;IAChE,OAAO,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,iCAAiC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IAIzC,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CACnC,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface DocflowProjectPaths {
2
+ graph: string;
3
+ registry: string;
4
+ }
5
+ export interface DocflowConfig {
6
+ version: number;
7
+ paths: DocflowProjectPaths;
8
+ }
9
+ export interface DocumentsManifest {
10
+ version: number;
11
+ name: string;
12
+ templatesDir: string;
13
+ documents: ManifestDocument[];
14
+ }
15
+ export interface ManifestDocument {
16
+ documentId: string;
17
+ template: string;
18
+ output?: string;
19
+ outputPattern?: string;
20
+ perDomain?: "useCase" | "feature";
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { GraphEdge, GraphNode, TraceabilityGraph, ValidationIssue } from "../types.js";
2
+ export declare class InMemoryGraph {
3
+ readonly nodesById: Map<string, GraphNode>;
4
+ readonly outEdges: Map<string, GraphEdge[]>;
5
+ readonly inEdges: Map<string, GraphEdge[]>;
6
+ static from(data: TraceabilityGraph): InMemoryGraph;
7
+ toJSON(): TraceabilityGraph;
8
+ /** Dedupe edges when exporting (each edge stored once in outEdges). */
9
+ toTraceabilityGraph(): TraceabilityGraph;
10
+ addNode(node: GraphNode): void;
11
+ /** Update an existing node or insert. Same `type` required when updating. */
12
+ upsertNode(node: GraphNode): "created" | "updated";
13
+ edgeKey(edge: GraphEdge): string;
14
+ hasEdge(edge: GraphEdge): boolean;
15
+ addEdge(edge: GraphEdge): void;
16
+ addEdgeIfAbsent(edge: GraphEdge): boolean;
17
+ neighbors(id: string, direction: "out" | "in" | "both", edgeTypes?: Set<string>, depth?: number): Set<string>;
18
+ validateStructure(): ValidationIssue[];
19
+ }
20
+ //# sourceMappingURL=InMemoryGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryGraph.d.ts","sourceRoot":"","sources":["../../src/graph/InMemoryGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5F,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,yBAAgC;IAClD,QAAQ,CAAC,QAAQ,2BAAkC;IACnD,QAAQ,CAAC,OAAO,2BAAkC;IAElD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa;IAcnD,MAAM,IAAI,iBAAiB;IAQ3B,uEAAuE;IACvE,mBAAmB,IAAI,iBAAiB;IAmBxC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAS9B,6EAA6E;IAC7E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS;IAelD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIhC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAYjC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK9B,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAWzC,SAAS,CACP,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,EAChC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,KAAK,SAAI,GACR,GAAG,CAAC,MAAM,CAAC;IAsCd,iBAAiB,IAAI,eAAe,EAAE;CA+DvC"}