ai-spector 0.7.0 → 0.7.2

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 (98) hide show
  1. package/dist/core/graph/InMemoryGraph.d.ts +20 -1
  2. package/dist/core/graph/InMemoryGraph.d.ts.map +1 -1
  3. package/dist/core/graph/InMemoryGraph.js +238 -1
  4. package/dist/core/graph/InMemoryGraph.js.map +1 -1
  5. package/dist/core/graph/config.d.ts +18 -0
  6. package/dist/core/graph/config.d.ts.map +1 -0
  7. package/dist/core/graph/config.js +30 -0
  8. package/dist/core/graph/config.js.map +1 -0
  9. package/dist/core/graph/expand-path-nodes.d.ts +28 -0
  10. package/dist/core/graph/expand-path-nodes.d.ts.map +1 -0
  11. package/dist/core/graph/expand-path-nodes.js +84 -0
  12. package/dist/core/graph/expand-path-nodes.js.map +1 -0
  13. package/dist/core/graph/health.d.ts +18 -0
  14. package/dist/core/graph/health.d.ts.map +1 -0
  15. package/dist/core/graph/health.js +45 -0
  16. package/dist/core/graph/health.js.map +1 -0
  17. package/dist/core/graph/impact.d.ts +52 -3
  18. package/dist/core/graph/impact.d.ts.map +1 -1
  19. package/dist/core/graph/impact.js +199 -2
  20. package/dist/core/graph/impact.js.map +1 -1
  21. package/dist/core/graph/index.d.ts +34 -0
  22. package/dist/core/graph/index.d.ts.map +1 -0
  23. package/dist/core/graph/index.js +18 -0
  24. package/dist/core/graph/index.js.map +1 -0
  25. package/dist/core/graph/knowledge.d.ts +80 -3
  26. package/dist/core/graph/knowledge.d.ts.map +1 -1
  27. package/dist/core/graph/knowledge.js +84 -1
  28. package/dist/core/graph/knowledge.js.map +1 -1
  29. package/dist/core/graph/layer-audit.d.ts +62 -3
  30. package/dist/core/graph/layer-audit.d.ts.map +1 -1
  31. package/dist/core/graph/layer-audit.js +239 -21
  32. package/dist/core/graph/layer-audit.js.map +1 -1
  33. package/dist/core/graph/patch.d.ts +22 -0
  34. package/dist/core/graph/patch.d.ts.map +1 -0
  35. package/dist/core/graph/patch.js +62 -0
  36. package/dist/core/graph/patch.js.map +1 -0
  37. package/dist/core/graph/path-target-edges.d.ts +4 -1
  38. package/dist/core/graph/path-target-edges.d.ts.map +1 -1
  39. package/dist/core/graph/path-target-edges.js +8 -1
  40. package/dist/core/graph/path-target-edges.js.map +1 -1
  41. package/dist/core/graph/project.d.ts +77 -0
  42. package/dist/core/graph/project.d.ts.map +1 -0
  43. package/dist/core/graph/project.js +147 -0
  44. package/dist/core/graph/project.js.map +1 -0
  45. package/dist/core/graph/query.d.ts +18 -2
  46. package/dist/core/graph/query.d.ts.map +1 -1
  47. package/dist/core/graph/query.js +147 -1
  48. package/dist/core/graph/query.js.map +1 -1
  49. package/dist/core/graph/registry.d.ts +37 -0
  50. package/dist/core/graph/registry.d.ts.map +1 -0
  51. package/dist/core/graph/registry.js +51 -0
  52. package/dist/core/graph/registry.js.map +1 -0
  53. package/dist/core/graph/resolve.d.ts +30 -3
  54. package/dist/core/graph/resolve.d.ts.map +1 -1
  55. package/dist/core/graph/resolve.js +238 -4
  56. package/dist/core/graph/resolve.js.map +1 -1
  57. package/dist/core/graph/rules/default-impact.json +24 -0
  58. package/dist/core/graph/session.d.ts +34 -0
  59. package/dist/core/graph/session.d.ts.map +1 -0
  60. package/dist/core/graph/session.js +64 -0
  61. package/dist/core/graph/session.js.map +1 -0
  62. package/dist/core/graph/state.d.ts +21 -0
  63. package/dist/core/graph/state.d.ts.map +1 -0
  64. package/dist/core/graph/state.js +20 -0
  65. package/dist/core/graph/state.js.map +1 -0
  66. package/dist/core/graph/stats.d.ts +10 -0
  67. package/dist/core/graph/stats.d.ts.map +1 -0
  68. package/dist/core/graph/stats.js +23 -0
  69. package/dist/core/graph/stats.js.map +1 -0
  70. package/dist/core/graph/translation-queue.d.ts +111 -0
  71. package/dist/core/graph/translation-queue.d.ts.map +1 -0
  72. package/dist/core/graph/translation-queue.js +109 -0
  73. package/dist/core/graph/translation-queue.js.map +1 -0
  74. package/dist/core/operations/cocoindex.d.ts +1 -1
  75. package/dist/core/operations/cocoindex.d.ts.map +1 -1
  76. package/dist/core/operations/graph-impact.d.ts +1 -1
  77. package/dist/core/operations/graph-impact.d.ts.map +1 -1
  78. package/dist/core/operations/graph-query.d.ts +1 -1
  79. package/dist/core/operations/graph-query.d.ts.map +1 -1
  80. package/dist/core/operations/graph-report.d.ts +2 -3
  81. package/dist/core/operations/graph-report.d.ts.map +1 -1
  82. package/dist/core/operations/graph-report.js +22 -1
  83. package/dist/core/operations/graph-report.js.map +1 -1
  84. package/dist/core/visualize/stats.d.ts +3 -3
  85. package/dist/core/visualize/stats.d.ts.map +1 -1
  86. package/dist/core/visualize/stats.js +2 -2
  87. package/dist/core/visualize/stats.js.map +1 -1
  88. package/dist/interfaces/cli/format/graph.d.ts +1 -1
  89. package/dist/interfaces/cli/format/graph.d.ts.map +1 -1
  90. package/dist/interfaces/mcp/schemas.d.ts +2 -2
  91. package/dist/interfaces/sdk/index.d.ts +2 -2
  92. package/dist/interfaces/sdk/index.d.ts.map +1 -1
  93. package/dist/interfaces/sdk/index.js +2 -2
  94. package/dist/interfaces/sdk/index.js.map +1 -1
  95. package/package.json +3 -7
  96. package/scaffold/cursor/skills/ai-spector-setup/SKILL.md +16 -9
  97. package/scaffold/cursor/skills/ai-spector-setup/references/cli-setup.md +66 -0
  98. package/scaffold/cursor/skills/ai-spector-setup/references/runbook.md +74 -20
@@ -1,29 +1,247 @@
1
- import { readdir } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { auditGraphLayers as auditGraphLayersCore, } from "ai-spector-graph";
4
- async function listUseCaseDetailPathsOnDisk(projectRoot) {
5
- const base = join(projectRoot, "docs/srs/03-use-cases");
6
- const paths = [];
7
- try {
8
- const entries = await readdir(base, { withFileTypes: true });
9
- for (const ent of entries) {
10
- if (ent.isFile() && /^uc-\d+.*\.md$/i.test(ent.name)) {
11
- paths.push(`docs/srs/03-use-cases/${ent.name}`);
12
- }
1
+ export const BUNDLE_SOURCE_ID = "bundle.source";
2
+ export const BUNDLE_BUSINESS_ID = "bundle.business";
3
+ const DOMAIN_TYPES = new Set([
4
+ "actor",
5
+ "useCase",
6
+ "feature",
7
+ "requirement",
8
+ "nfr",
9
+ "dataEntity",
10
+ ]);
11
+ const UC_DETAIL_PATH_RE_DEFAULT = /docs\/srs\/.*\/uc-\d+.*\.md$/i;
12
+ function isPerDomainInstanceDocument(node) {
13
+ if (node.type !== "document" || node.outputPattern) {
14
+ return false;
15
+ }
16
+ const output = typeof node.output === "string" ? node.output : "";
17
+ if (!output) {
18
+ return false;
19
+ }
20
+ if (node.perDomain === "useCase" || node.perDomain === "feature") {
21
+ return true;
22
+ }
23
+ if (node.perDomain === "apiDetail" ||
24
+ node.perDomain === "screenDetail" ||
25
+ /docs\/basic-design\/(?:api\/|screens\/)/i.test(output.replace(/\\/g, "/"))) {
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ function countType(graph, type) {
31
+ let n = 0;
32
+ for (const node of graph.nodesById.values()) {
33
+ if (node.type === type) {
34
+ n++;
13
35
  }
14
36
  }
15
- catch {
37
+ return n;
38
+ }
39
+ function perDomainSpecDocs(graph) {
40
+ let useCaseDocs = 0;
41
+ let featureDocs = 0;
42
+ for (const node of graph.nodesById.values()) {
43
+ if (node.type !== "document" || !isPerDomainInstanceDocument(node)) {
44
+ continue;
45
+ }
46
+ if (node.perDomain === "useCase") {
47
+ useCaseDocs++;
48
+ }
49
+ else if (node.perDomain === "feature") {
50
+ featureDocs++;
51
+ }
52
+ }
53
+ return { useCaseDocs, featureDocs };
54
+ }
55
+ function detailSectionCount(graph) {
56
+ let n = 0;
57
+ for (const node of graph.nodesById.values()) {
58
+ if (node.type !== "section") {
59
+ continue;
60
+ }
61
+ const docId = String(node.documentId ?? "");
62
+ if (!docId.startsWith("doc.srs.uc-") && !docId.startsWith("doc.srs.f-")) {
63
+ continue;
64
+ }
65
+ n++;
66
+ }
67
+ return n;
68
+ }
69
+ function edgeCount(graph, type) {
70
+ return graph.toTraceabilityGraph().edges.filter((e) => e.type === type).length;
71
+ }
72
+ function domainsWithDerivedFrom(graph) {
73
+ const out = new Set();
74
+ for (const e of graph.toTraceabilityGraph().edges) {
75
+ if (e.type !== "derivedFrom") {
76
+ continue;
77
+ }
78
+ const from = graph.nodesById.get(e.from);
79
+ if (from && DOMAIN_TYPES.has(from.type)) {
80
+ out.add(e.from);
81
+ }
82
+ }
83
+ return out;
84
+ }
85
+ function domainsWithRelatesTo(graph) {
86
+ const out = new Set();
87
+ for (const e of graph.toTraceabilityGraph().edges) {
88
+ if (e.type !== "relatesTo") {
89
+ continue;
90
+ }
91
+ const from = graph.nodesById.get(e.from);
92
+ const to = graph.nodesById.get(e.to);
93
+ if (from && DOMAIN_TYPES.has(from.type)) {
94
+ out.add(e.from);
95
+ }
96
+ if (to && DOMAIN_TYPES.has(to.type)) {
97
+ out.add(e.to);
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ function listDomainsMissingProvenance(graph) {
103
+ const withDerived = domainsWithDerivedFrom(graph);
104
+ const missing = [];
105
+ for (const node of graph.nodesById.values()) {
106
+ if (DOMAIN_TYPES.has(node.type) && !withDerived.has(node.id)) {
107
+ missing.push(node.id);
108
+ }
109
+ }
110
+ return missing.sort();
111
+ }
112
+ function listDomainsNeedingSemanticLinks(graph) {
113
+ const withDerived = domainsWithDerivedFrom(graph);
114
+ const withRelates = domainsWithRelatesTo(graph);
115
+ const out = [];
116
+ for (const id of withDerived) {
117
+ if (!withRelates.has(id)) {
118
+ out.push(id);
119
+ }
120
+ }
121
+ return out.sort();
122
+ }
123
+ function graphOutputPathsForUseCaseDocs(graph) {
124
+ const out = new Set();
125
+ for (const node of graph.nodesById.values()) {
126
+ if (node.type === "document" &&
127
+ node.perDomain === "useCase" &&
128
+ typeof node.output === "string") {
129
+ out.add(node.output.replace(/\\/g, "/"));
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+ function missingUseCasePathsOnDisk(graph, existingPaths, ucDetailPathPattern) {
135
+ if (!existingPaths) {
16
136
  return [];
17
137
  }
18
- return paths.sort();
138
+ const re = ucDetailPathPattern ?? UC_DETAIL_PATH_RE_DEFAULT;
139
+ const graphPaths = graphOutputPathsForUseCaseDocs(graph);
140
+ const missing = [];
141
+ for (const raw of existingPaths) {
142
+ const p = raw.replace(/\\/g, "/");
143
+ if (!re.test(p)) {
144
+ continue;
145
+ }
146
+ if (!graphPaths.has(p)) {
147
+ missing.push(p);
148
+ }
149
+ }
150
+ return missing.sort();
19
151
  }
20
- export async function auditGraphLayers(graph, projectRoot) {
21
- let existingPaths;
22
- if (projectRoot) {
23
- existingPaths = await listUseCaseDetailPathsOnDisk(projectRoot);
152
+ function suggestCommands(layers) {
153
+ let suggestedCommand;
154
+ let suggestedAgentCommand;
155
+ if (layers.semanticLinks.domainsWithoutSemanticLinks.length > 0) {
156
+ const seed = layers.semanticLinks.domainsWithoutSemanticLinks[0];
157
+ suggestedAgentCommand = seed ? `/link-graph ${seed}` : "/link-graph";
158
+ }
159
+ if (!layers.specInstances.ok && layers.domain.useCases > 0) {
160
+ suggestedCommand = "npx ai-spector index";
161
+ }
162
+ else if (!layers.sourceHub.ok && layers.domain.ok) {
163
+ suggestedCommand = "npx ai-spector index";
164
+ }
165
+ else if (layers.provenance.domainsWithoutSource.length > 0) {
166
+ suggestedAgentCommand = suggestedAgentCommand ?? "/analyze";
167
+ suggestedCommand = "npx ai-spector index";
168
+ }
169
+ return { suggestedCommand, suggestedAgentCommand };
170
+ }
171
+ /** Tri-layer health report (parity with `ai-spector graph report`). Sync, browser-safe. */
172
+ export function auditGraphLayers(graph, options = {}) {
173
+ const documents = countType(graph, "document");
174
+ const sections = countType(graph, "section");
175
+ const { useCaseDocs, featureDocs } = perDomainSpecDocs(graph);
176
+ const detailSections = detailSectionCount(graph);
177
+ const useCases = countType(graph, "useCase");
178
+ const features = countType(graph, "feature");
179
+ const actors = countType(graph, "actor");
180
+ const requirements = countType(graph, "requirement");
181
+ const nfrs = countType(graph, "nfr");
182
+ const dataEntities = countType(graph, "dataEntity");
183
+ const bundleSource = graph.nodesById.has(BUNDLE_SOURCE_ID);
184
+ const sourceFiles = countType(graph, "sourceFile");
185
+ const bundleBusiness = graph.nodesById.has(BUNDLE_BUSINESS_ID);
186
+ let domainMembers = 0;
187
+ if (bundleBusiness) {
188
+ for (const e of graph.toTraceabilityGraph().edges) {
189
+ if (e.type === "contains" && e.from === BUNDLE_BUSINESS_ID) {
190
+ domainMembers++;
191
+ }
192
+ }
24
193
  }
25
- return auditGraphLayersCore(graph, {
26
- existingPaths: existingPaths ? new Set(existingPaths) : undefined,
27
- });
194
+ const derivedFrom = edgeCount(graph, "derivedFrom");
195
+ const domainsWithoutSource = listDomainsMissingProvenance(graph);
196
+ const relatesTo = edgeCount(graph, "relatesTo");
197
+ const domainsWithoutSemanticLinks = listDomainsNeedingSemanticLinks(graph);
198
+ const missingOnDisk = missingUseCasePathsOnDisk(graph, options.existingPaths, options.ucDetailPathPattern);
199
+ const diskCheck = options.existingPaths !== undefined;
200
+ const specInstancesOk = useCaseDocs > 0 &&
201
+ detailSections > 0 &&
202
+ (!diskCheck || missingOnDisk.length === 0);
203
+ const layers = {
204
+ structure: {
205
+ documents,
206
+ sections,
207
+ ok: documents > 0 && sections > 0,
208
+ },
209
+ specInstances: {
210
+ useCaseDocs,
211
+ featureDocs,
212
+ sections: detailSections,
213
+ ok: specInstancesOk,
214
+ missingOnDisk,
215
+ },
216
+ domain: {
217
+ useCases,
218
+ features,
219
+ actors,
220
+ ok: useCases > 0 || features > 0,
221
+ },
222
+ sourceHub: {
223
+ bundlePresent: bundleSource,
224
+ sourceFiles,
225
+ ok: bundleSource,
226
+ },
227
+ businessHub: {
228
+ bundlePresent: bundleBusiness,
229
+ domainMembers,
230
+ ok: bundleBusiness &&
231
+ domainMembers >= useCases + features + actors + requirements + nfrs + dataEntities,
232
+ },
233
+ provenance: {
234
+ derivedFrom,
235
+ domainsWithoutSource,
236
+ ok: domainsWithoutSource.length === 0,
237
+ },
238
+ semanticLinks: {
239
+ relatesTo,
240
+ domainsWithoutSemanticLinks,
241
+ ok: domainsWithoutSemanticLinks.length === 0 || derivedFrom === 0,
242
+ },
243
+ };
244
+ const suggestions = suggestCommands(layers);
245
+ return { layers, ...suggestions };
28
246
  }
29
247
  //# sourceMappingURL=layer-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layer-audit.js","sourceRoot":"","sources":["../../../src/core/graph/layer-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,gBAAgB,IAAI,oBAAoB,GAGzC,MAAM,kBAAkB,CAAC;AAK1B,KAAK,UAAU,4BAA4B,CAAC,WAAmB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAoB,EACpB,WAAoB;IAEpB,IAAI,aAAmC,CAAC;IACxC,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,GAAG,MAAM,4BAA4B,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,EAAE;QACjC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"layer-audit.js","sourceRoot":"","sources":["../../../src/core/graph/layer-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { InMemoryGraph } from "./InMemoryGraph.js";
2
+ import type { GraphEdge, GraphNode } from "../../types.js";
3
+ export interface ExtractPatch {
4
+ version: 1;
5
+ nodes: GraphNode[];
6
+ edges: GraphEdge[];
7
+ }
8
+ export declare function normalizePatch(input: ExtractPatch | Partial<ExtractPatch>): ExtractPatch;
9
+ export declare function parseExtractPatch(json: unknown): ExtractPatch;
10
+ export interface PatchSimulationResult {
11
+ nodesToCreate: GraphNode[];
12
+ nodesToUpdate: GraphNode[];
13
+ edgesToAdd: GraphEdge[];
14
+ edgesSkipped: GraphEdge[];
15
+ nodesSkipped: GraphNode[];
16
+ }
17
+ /**
18
+ * Read-only preview of what merge would add (does not mutate the graph).
19
+ * Simplified vs CLI merge — no semanticOnly / structure guards.
20
+ */
21
+ export declare function simulatePatch(graph: InMemoryGraph, patchInput: ExtractPatch | Partial<ExtractPatch>): PatchSimulationResult;
22
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../../src/core/graph/patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAMxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAK7D;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,GAC/C,qBAAqB,CA+CvB"}
@@ -0,0 +1,62 @@
1
+ import { isPathTargetEdge } from "./path-target-edges.js";
2
+ export function normalizePatch(input) {
3
+ return {
4
+ version: 1,
5
+ nodes: input.nodes ?? [],
6
+ edges: input.edges ?? [],
7
+ };
8
+ }
9
+ export function parseExtractPatch(json) {
10
+ if (!json || typeof json !== "object") {
11
+ throw new Error("patch.json must be an object");
12
+ }
13
+ return normalizePatch(json);
14
+ }
15
+ /**
16
+ * Read-only preview of what merge would add (does not mutate the graph).
17
+ * Simplified vs CLI merge — no semanticOnly / structure guards.
18
+ */
19
+ export function simulatePatch(graph, patchInput) {
20
+ const patch = normalizePatch(patchInput);
21
+ const nodesToCreate = [];
22
+ const nodesToUpdate = [];
23
+ const nodesSkipped = [];
24
+ const edgesToAdd = [];
25
+ const edgesSkipped = [];
26
+ for (const node of patch.nodes) {
27
+ const existing = graph.nodesById.get(node.id);
28
+ if (!existing) {
29
+ nodesToCreate.push(node);
30
+ continue;
31
+ }
32
+ if (existing.type !== node.type) {
33
+ nodesSkipped.push(node);
34
+ continue;
35
+ }
36
+ nodesToUpdate.push(node);
37
+ }
38
+ const patchNodeIds = new Set(patch.nodes.map((n) => n.id));
39
+ const hasEndpoint = (id) => graph.nodesById.has(id) || patchNodeIds.has(id);
40
+ for (const edge of patch.edges) {
41
+ if (graph.hasEdge(edge)) {
42
+ continue;
43
+ }
44
+ if (!hasEndpoint(edge.from)) {
45
+ edgesSkipped.push(edge);
46
+ continue;
47
+ }
48
+ if (!isPathTargetEdge(edge.type) && !hasEndpoint(edge.to)) {
49
+ edgesSkipped.push(edge);
50
+ continue;
51
+ }
52
+ edgesToAdd.push(edge);
53
+ }
54
+ return {
55
+ nodesToCreate,
56
+ nodesToUpdate,
57
+ edgesToAdd,
58
+ edgesSkipped,
59
+ nodesSkipped,
60
+ };
61
+ }
62
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/core/graph/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,UAAU,cAAc,CAAC,KAA2C;IACxE,OAAO;QACL,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,CAAC,IAA6B,CAAC,CAAC;AACvD,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAoB,EACpB,UAAgD;IAEhD,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,aAAa,GAAgB,EAAE,CAAC;IACtC,MAAM,aAAa,GAAgB,EAAE,CAAC;IACtC,MAAM,YAAY,GAAgB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,YAAY,GAAgB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,CAAC,EAAU,EAAW,EAAE,CAC1C,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,aAAa;QACb,aAAa;QACb,UAAU;QACV,YAAY;QACZ,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -1,2 +1,5 @@
1
- export { PATH_TARGET_EDGE_TYPES, isPathTargetEdge, } from "ai-spector-graph";
1
+ import type { EdgeType } from "../../types.js";
2
+ /** Edges whose `to` is a repo-relative path or external id, not a graph node id. */
3
+ export declare const PATH_TARGET_EDGE_TYPES: ReadonlySet<EdgeType>;
4
+ export declare function isPathTargetEdge(type: EdgeType): boolean;
2
5
  //# sourceMappingURL=path-target-edges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-target-edges.d.ts","sourceRoot":"","sources":["../../../src/core/graph/path-target-edges.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"path-target-edges.d.ts","sourceRoot":"","sources":["../../../src/core/graph/path-target-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,QAAQ,CAGvD,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAExD"}
@@ -1,2 +1,9 @@
1
- export { PATH_TARGET_EDGE_TYPES, isPathTargetEdge, } from "ai-spector-graph";
1
+ /** Edges whose `to` is a repo-relative path or external id, not a graph node id. */
2
+ export const PATH_TARGET_EDGE_TYPES = new Set([
3
+ "rendersTo",
4
+ "derivedFrom",
5
+ ]);
6
+ export function isPathTargetEdge(type) {
7
+ return PATH_TARGET_EDGE_TYPES.has(type);
8
+ }
2
9
  //# sourceMappingURL=path-target-edges.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-target-edges.js","sourceRoot":"","sources":["../../../src/core/graph/path-target-edges.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"path-target-edges.js","sourceRoot":"","sources":["../../../src/core/graph/path-target-edges.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,CAAC,MAAM,sBAAsB,GAA0B,IAAI,GAAG,CAAC;IACnE,WAAW;IACX,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { type DocflowConfig, type LanguageConfig } from "./config.js";
2
+ import { type GraphHealthSummary } from "./health.js";
3
+ import type { ImpactResult, ImpactRulesFile } from "./impact.js";
4
+ import { type LayerAuditOptions, type LayerAuditReport } from "./layer-audit.js";
5
+ import { type AnalysisKnowledge, type KnowledgeCoverageReport, type KnowledgeStats } from "./knowledge.js";
6
+ import { type ExtractPatch, type PatchSimulationResult } from "./patch.js";
7
+ import { type RegistryDocument, type SectionRegistry } from "./registry.js";
8
+ import { GraphSession, type GraphSessionOptions } from "./session.js";
9
+ import { type ProjectState } from "./state.js";
10
+ import { type StaleTranslationLink, type TranslationJob, type TranslationQueueBundleInput, type TranslationQueueData, type TranslationQueueStats } from "./translation-queue.js";
11
+ import type { TraceabilityGraph, ValidationIssue } from "../../types.js";
12
+ export interface ProjectBundle {
13
+ graph: TraceabilityGraph;
14
+ impactRules?: ImpactRulesFile;
15
+ /** Parsed or raw knowledge.json */
16
+ knowledge?: unknown;
17
+ /** Parsed or raw section-registry.json */
18
+ registry?: unknown;
19
+ /** Parsed or raw docflow.config.json */
20
+ config?: unknown;
21
+ /** Parsed or raw .ai-spector/.docflow/state.json */
22
+ state?: unknown;
23
+ /** Translation queue JSON from `.ai-spector/.docflow/translation-queue/` */
24
+ translationQueue?: TranslationQueueBundleInput;
25
+ }
26
+ export interface ProjectSessionOptions extends GraphSessionOptions {
27
+ knowledge?: AnalysisKnowledge | null;
28
+ registry?: SectionRegistry | null;
29
+ config?: DocflowConfig | null;
30
+ state?: ProjectState | null;
31
+ translationQueue?: TranslationQueueData | null;
32
+ }
33
+ /**
34
+ * Multi-file project facade: graph + optional knowledge + section registry.
35
+ * Pass JSON your API fetched; no HTTP inside this class.
36
+ */
37
+ export declare class ProjectSession {
38
+ readonly graph: GraphSession;
39
+ private readonly knowledge;
40
+ private readonly registry;
41
+ private readonly config;
42
+ private readonly state;
43
+ private readonly translationQueue;
44
+ private constructor();
45
+ static fromBundle(bundle: ProjectBundle): ProjectSession;
46
+ static create(graph: TraceabilityGraph, options?: ProjectSessionOptions): ProjectSession;
47
+ hasKnowledge(): boolean;
48
+ hasRegistry(): boolean;
49
+ hasConfig(): boolean;
50
+ hasState(): boolean;
51
+ hasTranslationQueue(): boolean;
52
+ getKnowledge(): AnalysisKnowledge | null;
53
+ getRegistry(): SectionRegistry | null;
54
+ getConfig(): DocflowConfig | null;
55
+ getState(): ProjectState | null;
56
+ getTranslationQueue(): TranslationQueueData | null;
57
+ knowledgeStats(): KnowledgeStats;
58
+ knowledgeCoverage(): KnowledgeCoverageReport;
59
+ sectionLabel(sectionId: string): string | undefined;
60
+ registryDocuments(): RegistryDocument[];
61
+ languages(): LanguageConfig[];
62
+ primaryLanguage(): LanguageConfig | undefined;
63
+ languageCodes(): string[];
64
+ graphFilePath(): string | undefined;
65
+ lastIndexRunAt(): string | undefined;
66
+ lastGraphMergedAt(): string | undefined;
67
+ layerAudit(options?: LayerAuditOptions): LayerAuditReport;
68
+ simulatePatch(patch: ExtractPatch | Partial<ExtractPatch>): PatchSimulationResult;
69
+ validationIssues(): ValidationIssue[];
70
+ healthSummary(options?: LayerAuditOptions): GraphHealthSummary;
71
+ translationQueueStats(): TranslationQueueStats;
72
+ pendingTranslationJobs(): TranslationJob[];
73
+ failedTranslationJobs(): import("./translation-queue.js").FailedTranslationJob[];
74
+ jobsForProjectionPath(projectionPath: string): TranslationJob[];
75
+ linkStaleTranslations(impact: ImpactResult): StaleTranslationLink[];
76
+ }
77
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/core/graph/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import { languageCodes, parseDocflowConfig, primaryLanguage, } from "./config.js";
2
+ import { graphHealthSummary } from "./health.js";
3
+ import { auditGraphLayers, } from "./layer-audit.js";
4
+ import { computeKnowledgeStats, knowledgeGraphCoverage, parseKnowledge, } from "./knowledge.js";
5
+ import { simulatePatch } from "./patch.js";
6
+ import { parseSectionRegistry, registryDocuments, sectionLabel, } from "./registry.js";
7
+ import { GraphSession } from "./session.js";
8
+ import { lastGraphMergedAt, lastIndexRunAt, parseProjectState, } from "./state.js";
9
+ import { computeTranslationQueueStats, linkStaleTranslationsToQueue, jobsForProjectionPath, parseTranslationQueueBundle, } from "./translation-queue.js";
10
+ /**
11
+ * Multi-file project facade: graph + optional knowledge + section registry.
12
+ * Pass JSON your API fetched; no HTTP inside this class.
13
+ */
14
+ export class ProjectSession {
15
+ graph;
16
+ knowledge;
17
+ registry;
18
+ config;
19
+ state;
20
+ translationQueue;
21
+ constructor(graph, knowledge, registry, config, state, translationQueue) {
22
+ this.graph = graph;
23
+ this.knowledge = knowledge;
24
+ this.registry = registry;
25
+ this.config = config;
26
+ this.state = state;
27
+ this.translationQueue = translationQueue;
28
+ }
29
+ static fromBundle(bundle) {
30
+ const knowledge = bundle.knowledge === undefined ? null : parseKnowledge(bundle.knowledge);
31
+ const registry = bundle.registry === undefined ? null : parseSectionRegistry(bundle.registry);
32
+ const config = bundle.config === undefined ? null : parseDocflowConfig(bundle.config);
33
+ const state = bundle.state === undefined ? null : parseProjectState(bundle.state);
34
+ const translationQueue = bundle.translationQueue === undefined
35
+ ? null
36
+ : parseTranslationQueueBundle(bundle.translationQueue);
37
+ const graph = GraphSession.fromJson(bundle.graph, {
38
+ impactRules: bundle.impactRules,
39
+ });
40
+ return new ProjectSession(graph, knowledge, registry, config, state, translationQueue);
41
+ }
42
+ static create(graph, options) {
43
+ const graphSession = GraphSession.fromJson(graph, {
44
+ impactRules: options?.impactRules,
45
+ });
46
+ return new ProjectSession(graphSession, options?.knowledge ?? null, options?.registry ?? null, options?.config ?? null, options?.state ?? null, options?.translationQueue ?? null);
47
+ }
48
+ hasKnowledge() {
49
+ return this.knowledge !== null;
50
+ }
51
+ hasRegistry() {
52
+ return this.registry !== null;
53
+ }
54
+ hasConfig() {
55
+ return this.config !== null;
56
+ }
57
+ hasState() {
58
+ return this.state !== null;
59
+ }
60
+ hasTranslationQueue() {
61
+ return this.translationQueue !== null;
62
+ }
63
+ getKnowledge() {
64
+ return this.knowledge;
65
+ }
66
+ getRegistry() {
67
+ return this.registry;
68
+ }
69
+ getConfig() {
70
+ return this.config;
71
+ }
72
+ getState() {
73
+ return this.state;
74
+ }
75
+ getTranslationQueue() {
76
+ return this.translationQueue;
77
+ }
78
+ knowledgeStats() {
79
+ return computeKnowledgeStats(this.knowledge);
80
+ }
81
+ knowledgeCoverage() {
82
+ return knowledgeGraphCoverage(this.knowledge, this.graph.graph);
83
+ }
84
+ sectionLabel(sectionId) {
85
+ if (!this.registry) {
86
+ return undefined;
87
+ }
88
+ return sectionLabel(this.registry, sectionId);
89
+ }
90
+ registryDocuments() {
91
+ if (!this.registry) {
92
+ return [];
93
+ }
94
+ return registryDocuments(this.registry);
95
+ }
96
+ languages() {
97
+ return this.config?.languages ?? [];
98
+ }
99
+ primaryLanguage() {
100
+ return this.config ? primaryLanguage(this.config) : undefined;
101
+ }
102
+ languageCodes() {
103
+ return this.config ? languageCodes(this.config) : [];
104
+ }
105
+ graphFilePath() {
106
+ return this.config?.paths.graph;
107
+ }
108
+ lastIndexRunAt() {
109
+ return this.state ? lastIndexRunAt(this.state) : undefined;
110
+ }
111
+ lastGraphMergedAt() {
112
+ return this.state ? lastGraphMergedAt(this.state) : undefined;
113
+ }
114
+ layerAudit(options) {
115
+ return auditGraphLayers(this.graph.graph, options);
116
+ }
117
+ simulatePatch(patch) {
118
+ return simulatePatch(this.graph.graph, patch);
119
+ }
120
+ validationIssues() {
121
+ return this.graph.graph.validateStructure();
122
+ }
123
+ healthSummary(options) {
124
+ return graphHealthSummary(this.graph.graph, auditGraphLayers(this.graph.graph, options));
125
+ }
126
+ translationQueueStats() {
127
+ return computeTranslationQueueStats(this.translationQueue ?? {
128
+ pending: [],
129
+ failed: [],
130
+ resolved: [],
131
+ fingerprints: null,
132
+ });
133
+ }
134
+ pendingTranslationJobs() {
135
+ return this.translationQueue?.pending ?? [];
136
+ }
137
+ failedTranslationJobs() {
138
+ return this.translationQueue?.failed ?? [];
139
+ }
140
+ jobsForProjectionPath(projectionPath) {
141
+ return jobsForProjectionPath(this.pendingTranslationJobs(), projectionPath);
142
+ }
143
+ linkStaleTranslations(impact) {
144
+ return linkStaleTranslationsToQueue(impact, this.pendingTranslationJobs());
145
+ }
146
+ }
147
+ //# sourceMappingURL=project.js.map