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.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/analyze.d.ts +9 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +62 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +4 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +58 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/graph-impact.d.ts +10 -0
- package/dist/commands/graph-impact.d.ts.map +1 -0
- package/dist/commands/graph-impact.js +31 -0
- package/dist/commands/graph-impact.js.map +1 -0
- package/dist/commands/graph-merge.d.ts +11 -0
- package/dist/commands/graph-merge.d.ts.map +1 -0
- package/dist/commands/graph-merge.js +88 -0
- package/dist/commands/graph-merge.js.map +1 -0
- package/dist/commands/graph-query.d.ts +10 -0
- package/dist/commands/graph-query.d.ts.map +1 -0
- package/dist/commands/graph-query.js +31 -0
- package/dist/commands/graph-query.js.map +1 -0
- package/dist/commands/graph-visualize.d.ts +10 -0
- package/dist/commands/graph-visualize.d.ts.map +1 -0
- package/dist/commands/graph-visualize.js +72 -0
- package/dist/commands/graph-visualize.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +47 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +89 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config/load.d.ts +21 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +77 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/graph/InMemoryGraph.d.ts +20 -0
- package/dist/graph/InMemoryGraph.d.ts.map +1 -0
- package/dist/graph/InMemoryGraph.js +181 -0
- package/dist/graph/InMemoryGraph.js.map +1 -0
- package/dist/graph/defaults.d.ts +10 -0
- package/dist/graph/defaults.d.ts.map +1 -0
- package/dist/graph/defaults.js +10 -0
- package/dist/graph/defaults.js.map +1 -0
- package/dist/graph/impact.d.ts +32 -0
- package/dist/graph/impact.d.ts.map +1 -0
- package/dist/graph/impact.js +88 -0
- package/dist/graph/impact.js.map +1 -0
- package/dist/graph/knowledge.d.ts +53 -0
- package/dist/graph/knowledge.d.ts.map +1 -0
- package/dist/graph/knowledge.js +79 -0
- package/dist/graph/knowledge.js.map +1 -0
- package/dist/graph/load.d.ts +4 -0
- package/dist/graph/load.d.ts.map +1 -0
- package/dist/graph/load.js +12 -0
- package/dist/graph/load.js.map +1 -0
- package/dist/graph/loadGraph.d.ts +3 -0
- package/dist/graph/loadGraph.d.ts.map +1 -0
- package/dist/graph/loadGraph.js +7 -0
- package/dist/graph/loadGraph.js.map +1 -0
- package/dist/graph/merge.d.ts +15 -0
- package/dist/graph/merge.d.ts.map +1 -0
- package/dist/graph/merge.js +63 -0
- package/dist/graph/merge.js.map +1 -0
- package/dist/graph/query.d.ts +18 -0
- package/dist/graph/query.d.ts.map +1 -0
- package/dist/graph/query.js +132 -0
- package/dist/graph/query.js.map +1 -0
- package/dist/registry/build.d.ts +3 -0
- package/dist/registry/build.d.ts.map +1 -0
- package/dist/registry/build.js +53 -0
- package/dist/registry/build.js.map +1 -0
- package/dist/registry/slug.d.ts +4 -0
- package/dist/registry/slug.d.ts.map +1 -0
- package/dist/registry/slug.js +16 -0
- package/dist/registry/slug.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util/fs.d.ts +6 -0
- package/dist/util/fs.d.ts.map +1 -0
- package/dist/util/fs.js +24 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/paths.d.ts +16 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +19 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/visualize/html.d.ts +13 -0
- package/dist/visualize/html.d.ts.map +1 -0
- package/dist/visualize/html.js +374 -0
- package/dist/visualize/html.js.map +1 -0
- package/dist/visualize/stats.d.ts +21 -0
- package/dist/visualize/stats.d.ts.map +1 -0
- package/dist/visualize/stats.js +45 -0
- package/dist/visualize/stats.js.map +1 -0
- package/documents.json +64 -0
- package/package.json +65 -0
- package/scaffold/.ai-spector/.docflow/config/analyze.graphify.json +40 -0
- package/scaffold/.ai-spector/.docflow/config/completeness-rules.basic-design.json +18 -0
- package/scaffold/.ai-spector/.docflow/config/completeness-rules.detail-design.json +57 -0
- package/scaffold/.ai-spector/.docflow/config/completeness-rules.srs.json +72 -0
- package/scaffold/.ai-spector/.docflow/config/dag.basic-design.json +38 -0
- package/scaffold/.ai-spector/.docflow/config/dag.detail-design.json +64 -0
- package/scaffold/.ai-spector/.docflow/config/dag.srs.json +87 -0
- package/scaffold/.ai-spector/.docflow/config/data-source.json +5 -0
- package/scaffold/.ai-spector/.docflow/config/index.docs.json +22 -0
- package/scaffold/.ai-spector/.docflow/config/workflow.dependencies.json +271 -0
- package/scaffold/.ai-spector/.docflow/extract/patch.example.json +20 -0
- package/scaffold/.ai-spector/.docflow/state.json +11 -0
- package/scaffold/.ai-spector/docflow.config.json +7 -0
- package/scaffold/.ai-spector/index/README.md +18 -0
- package/scaffold/.ai-spector/index/basic-design.md +5 -0
- package/scaffold/.ai-spector/index/srs.md +5 -0
- package/scaffold/.cursor/commands/_cli-failures.md +110 -0
- package/scaffold/.cursor/commands/_graph.md +48 -0
- package/scaffold/.cursor/commands/_prerequisites.md +48 -0
- package/scaffold/.cursor/commands/_workflow.md +50 -0
- package/scaffold/.cursor/commands/analyze.md +92 -0
- package/scaffold/.cursor/commands/generate-basic-design.md +26 -0
- package/scaffold/.cursor/commands/generate-detail-design.md +19 -0
- package/scaffold/.cursor/commands/generate-srs.md +63 -0
- package/scaffold/.cursor/commands/graph-impact.md +45 -0
- package/scaffold/.cursor/commands/index-docs.md +36 -0
- package/scaffold/.cursor/commands/sync-graph.md +30 -0
- package/scaffold/.cursor/commands/validate-graph.md +28 -0
- package/scaffold/.cursor/commands/visualize-graph.md +24 -0
- package/scaffold/.cursor/skills/ai-spector/SKILL.md +39 -0
- package/scaffold/docs/data-source/README.md +7 -0
- package/schemas/rules.impact.json +17 -0
- package/schemas/rules.traceability.json +30 -0
- package/schemas/schema.extract-patch.json +19 -0
- package/schemas/schema.graph.json +83 -0
- package/schemas/schema.knowledge.json +107 -0
- package/templates/basic_design/db-design-template.md +177 -0
- package/templates/basic_design/detail-api-template.md +278 -0
- package/templates/basic_design/detail-screen-template.md +281 -0
- package/templates/basic_design/list-api-template.md +130 -0
- package/templates/basic_design/list-screen-template.md +242 -0
- package/templates/detail_design/common/architecture-overview-template.md +302 -0
- package/templates/detail_design/common/deployment-infrastructure-template.md +461 -0
- package/templates/detail_design/common/error-handling-patterns-template.md +460 -0
- package/templates/detail_design/common/integration-patterns-template.md +410 -0
- package/templates/detail_design/common/performance-standards-template.md +406 -0
- package/templates/detail_design/common/security-patterns-template.md +395 -0
- package/templates/detail_design/feature-detail-design-template.md +773 -0
- package/templates/detail_design/feature-list-template.md +39 -0
- package/templates/srs/1-introduction.md +58 -0
- package/templates/srs/2-overall-description.md +91 -0
- package/templates/srs/3-use-case-detail-template.md +142 -0
- package/templates/srs/3-use-cases.md +53 -0
- package/templates/srs/4-system-feature-detail-template.md +131 -0
- package/templates/srs/4-system-features-list-template.md +39 -0
- package/templates/srs/5-data-requirements.md +59 -0
- package/templates/srs/6-external-interfaces.md +56 -0
- package/templates/srs/7-quality-attributes.md +74 -0
- package/templates/srs/8-internationalization.md +36 -0
- package/templates/srs/9-other-requirements.md +46 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { EdgeType, GraphEdge, GraphNode, NodeType } from "../types.js";
|
|
2
|
+
import type { InMemoryGraph } from "./InMemoryGraph.js";
|
|
3
|
+
export interface QueryOptions {
|
|
4
|
+
direction?: "out" | "in" | "both";
|
|
5
|
+
depth?: number;
|
|
6
|
+
edgeTypes?: EdgeType[];
|
|
7
|
+
nodeTypes?: NodeType[];
|
|
8
|
+
}
|
|
9
|
+
export interface GraphQueryResult {
|
|
10
|
+
seed: string;
|
|
11
|
+
nodes: GraphNode[];
|
|
12
|
+
edges: GraphEdge[];
|
|
13
|
+
projectionPaths: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function resolveDocumentForNode(g: InMemoryGraph, nodeId: string): GraphNode | undefined;
|
|
16
|
+
export declare function projectionPathForNode(g: InMemoryGraph, nodeId: string): string | undefined;
|
|
17
|
+
export declare function querySubgraph(g: InMemoryGraph, seedId: string, opts?: QueryOptions): GraphQueryResult;
|
|
18
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/graph/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAeD,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,aAAa,EAChB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,SAAS,CAgCvB;AAED,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,aAAa,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAiCpB;AAED,wBAAgB,aAAa,CAC3B,CAAC,EAAE,aAAa,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,YAAiB,GACtB,gBAAgB,CA+DlB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
const DEFAULT_GENERATE_EDGES = [
|
|
2
|
+
"partOf",
|
|
3
|
+
"contains",
|
|
4
|
+
"follows",
|
|
5
|
+
"listedIn",
|
|
6
|
+
"definedIn",
|
|
7
|
+
"describedIn",
|
|
8
|
+
"satisfies",
|
|
9
|
+
"dependsOn",
|
|
10
|
+
"references",
|
|
11
|
+
"rendersTo",
|
|
12
|
+
];
|
|
13
|
+
export function resolveDocumentForNode(g, nodeId) {
|
|
14
|
+
const node = g.nodesById.get(nodeId);
|
|
15
|
+
if (!node) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
if (node.type === "document") {
|
|
19
|
+
return node;
|
|
20
|
+
}
|
|
21
|
+
if (node.type === "section") {
|
|
22
|
+
const partOf = (g.outEdges.get(nodeId) ?? []).find((e) => e.type === "partOf");
|
|
23
|
+
if (!partOf) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return resolveDocumentForNode(g, partOf.to);
|
|
27
|
+
}
|
|
28
|
+
for (const e of g.outEdges.get(nodeId) ?? []) {
|
|
29
|
+
if (["listedIn", "definedIn", "describedIn"].includes(e.type)) {
|
|
30
|
+
const doc = resolveDocumentForNode(g, e.to);
|
|
31
|
+
if (doc) {
|
|
32
|
+
return doc;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const e of g.inEdges.get(nodeId) ?? []) {
|
|
37
|
+
if (e.type === "definedIn" && e.from === nodeId) {
|
|
38
|
+
const doc = resolveDocumentForNode(g, e.to);
|
|
39
|
+
if (doc) {
|
|
40
|
+
return doc;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
export function projectionPathForNode(g, nodeId) {
|
|
47
|
+
const node = g.nodesById.get(nodeId);
|
|
48
|
+
if (!node) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (node.type === "document") {
|
|
52
|
+
const out = node.output;
|
|
53
|
+
return out || undefined;
|
|
54
|
+
}
|
|
55
|
+
if (node.type === "section") {
|
|
56
|
+
const doc = resolveDocumentForNode(g, nodeId);
|
|
57
|
+
if (!doc) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const pattern = doc.outputPattern;
|
|
61
|
+
if (pattern) {
|
|
62
|
+
return pattern;
|
|
63
|
+
}
|
|
64
|
+
return doc.output;
|
|
65
|
+
}
|
|
66
|
+
const doc = resolveDocumentForNode(g, nodeId);
|
|
67
|
+
if (doc?.output) {
|
|
68
|
+
return doc.output;
|
|
69
|
+
}
|
|
70
|
+
if (doc?.outputPattern) {
|
|
71
|
+
return doc.outputPattern;
|
|
72
|
+
}
|
|
73
|
+
for (const e of g.outEdges.get(nodeId) ?? []) {
|
|
74
|
+
if (e.type === "rendersTo") {
|
|
75
|
+
return e.to;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
export function querySubgraph(g, seedId, opts = {}) {
|
|
81
|
+
if (!g.nodesById.has(seedId)) {
|
|
82
|
+
throw new Error(`Unknown node id: ${seedId}`);
|
|
83
|
+
}
|
|
84
|
+
const direction = opts.direction ?? "both";
|
|
85
|
+
const depth = opts.depth ?? 2;
|
|
86
|
+
const edgeTypeSet = new Set(opts.edgeTypes ?? DEFAULT_GENERATE_EDGES);
|
|
87
|
+
const nodeTypeFilter = opts.nodeTypes ? new Set(opts.nodeTypes) : null;
|
|
88
|
+
const visitedNodes = new Set();
|
|
89
|
+
const visitedEdges = new Map();
|
|
90
|
+
const queue = [{ id: seedId, d: 0 }];
|
|
91
|
+
while (queue.length > 0) {
|
|
92
|
+
const { id: current, d } = queue.shift();
|
|
93
|
+
if (d > 0) {
|
|
94
|
+
visitedNodes.add(current);
|
|
95
|
+
}
|
|
96
|
+
if (d >= depth) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const visitEdge = (e, next) => {
|
|
100
|
+
if (!edgeTypeSet.has(e.type)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const key = `${e.type}\0${e.from}\0${e.to}`;
|
|
104
|
+
visitedEdges.set(key, e);
|
|
105
|
+
if (!visitedNodes.has(next) && next !== seedId) {
|
|
106
|
+
queue.push({ id: next, d: d + 1 });
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
if (direction === "out" || direction === "both") {
|
|
110
|
+
for (const e of g.outEdges.get(current) ?? []) {
|
|
111
|
+
visitEdge(e, e.to);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (direction === "in" || direction === "both") {
|
|
115
|
+
for (const e of g.inEdges.get(current) ?? []) {
|
|
116
|
+
visitEdge(e, e.from);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
visitedNodes.add(seedId);
|
|
121
|
+
const nodes = [...visitedNodes]
|
|
122
|
+
.map((id) => g.nodesById.get(id))
|
|
123
|
+
.filter((n) => !nodeTypeFilter || nodeTypeFilter.has(n.type));
|
|
124
|
+
const edges = [...visitedEdges.values()];
|
|
125
|
+
const projectionPaths = [
|
|
126
|
+
...new Set([...visitedNodes]
|
|
127
|
+
.map((id) => projectionPathForNode(g, id))
|
|
128
|
+
.filter((p) => Boolean(p && !p.includes("{")))),
|
|
129
|
+
];
|
|
130
|
+
return { seed: seedId, nodes, edges, projectionPaths };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/graph/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/registry/build.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqC,eAAe,EAAE,MAAM,aAAa,CAAC;AA4CtF,wBAAsB,oBAAoB,CACxC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAe1B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadDocflowConfig, loadDocumentsManifest } from "../config/load.js";
|
|
4
|
+
import { sectionIdFromHeading } from "./slug.js";
|
|
5
|
+
const HEADING_RE = /^(#{2,4})\s+(.+)$/;
|
|
6
|
+
function parseSections(content) {
|
|
7
|
+
const sections = [];
|
|
8
|
+
let order = 0;
|
|
9
|
+
for (const line of content.split("\n")) {
|
|
10
|
+
if (line.startsWith(">")) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const m = HEADING_RE.exec(line.trim());
|
|
14
|
+
if (!m) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const level = m[1].length;
|
|
18
|
+
const heading = m[2].trim();
|
|
19
|
+
order += 1;
|
|
20
|
+
sections.push({
|
|
21
|
+
id: "",
|
|
22
|
+
heading,
|
|
23
|
+
level,
|
|
24
|
+
order,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return sections;
|
|
28
|
+
}
|
|
29
|
+
async function scanTemplate(templatesDir, doc) {
|
|
30
|
+
const path = join(templatesDir, doc.template);
|
|
31
|
+
const content = await readFile(path, "utf8");
|
|
32
|
+
const raw = parseSections(content);
|
|
33
|
+
const sections = raw.map((s) => ({
|
|
34
|
+
...s,
|
|
35
|
+
id: sectionIdFromHeading(doc.documentId, s.heading, s.level, s.order ?? 0),
|
|
36
|
+
}));
|
|
37
|
+
return { ...doc, sections };
|
|
38
|
+
}
|
|
39
|
+
export async function buildSectionRegistry(root) {
|
|
40
|
+
const { root: projectRoot } = await loadDocflowConfig(root);
|
|
41
|
+
const { bundleRoot, manifest } = await loadDocumentsManifest();
|
|
42
|
+
const templatesDir = join(bundleRoot, manifest.templatesDir);
|
|
43
|
+
const documents = [];
|
|
44
|
+
for (const doc of manifest.documents) {
|
|
45
|
+
documents.push(await scanTemplate(templatesDir, doc));
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
version: 1,
|
|
49
|
+
root: projectRoot,
|
|
50
|
+
documents,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/registry/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,EAAE;YACN,OAAO;YACP,KAAK;YACL,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,YAAoB,EACpB,GAAuC;IAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,GAAG,CAAC;QACJ,EAAE,EAAE,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;KAC3E,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAa;IAEb,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,WAAW;QACjB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Stable slug from heading text for section id suffix. */
|
|
2
|
+
export declare function headingSlug(heading: string): string;
|
|
3
|
+
export declare function sectionIdFromHeading(documentId: string, heading: string, level: number, order: number): string;
|
|
4
|
+
//# sourceMappingURL=slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/registry/slug.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAIR"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Stable slug from heading text for section id suffix. */
|
|
2
|
+
export function headingSlug(heading) {
|
|
3
|
+
return heading
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[^\p{L}\p{N}\s-]/gu, "")
|
|
6
|
+
.trim()
|
|
7
|
+
.replace(/\s+/g, "-")
|
|
8
|
+
.replace(/-+/g, "-")
|
|
9
|
+
.slice(0, 80);
|
|
10
|
+
}
|
|
11
|
+
export function sectionIdFromHeading(documentId, heading, level, order) {
|
|
12
|
+
const slug = headingSlug(heading);
|
|
13
|
+
const docKey = documentId.replace(/^doc\./, "");
|
|
14
|
+
return `sec.${docKey}.l${level}.${order}.${slug}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/registry/slug.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO;SACX,WAAW,EAAE;SACb,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,OAAe,EACf,KAAa,EACb,KAAa;IAEb,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,OAAO,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACpD,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type NodeType = "document" | "section" | "table" | "diagram" | "actor" | "useCase" | "feature" | "requirement" | "dataEntity";
|
|
2
|
+
export type EdgeType = "partOf" | "contains" | "follows" | "references" | "listedIn" | "definedIn" | "describedIn" | "satisfies" | "dependsOn" | "requires" | "tracesTo" | "derivedFrom" | "rendersTo";
|
|
3
|
+
export interface GraphNode {
|
|
4
|
+
id: string;
|
|
5
|
+
type: NodeType;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface GraphEdge {
|
|
9
|
+
type: EdgeType;
|
|
10
|
+
from: string;
|
|
11
|
+
to: string;
|
|
12
|
+
role?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TraceabilityGraph {
|
|
15
|
+
version: number;
|
|
16
|
+
nodes: GraphNode[];
|
|
17
|
+
edges: GraphEdge[];
|
|
18
|
+
}
|
|
19
|
+
export interface RegistrySection {
|
|
20
|
+
id: string;
|
|
21
|
+
heading: string;
|
|
22
|
+
level: number;
|
|
23
|
+
order?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface RegistryDocument {
|
|
26
|
+
documentId: string;
|
|
27
|
+
template: string;
|
|
28
|
+
output?: string;
|
|
29
|
+
outputPattern?: string;
|
|
30
|
+
perDomain?: "useCase" | "feature";
|
|
31
|
+
sections: RegistrySection[];
|
|
32
|
+
}
|
|
33
|
+
export interface SectionRegistry {
|
|
34
|
+
version: number;
|
|
35
|
+
root: string;
|
|
36
|
+
documents: RegistryDocument[];
|
|
37
|
+
}
|
|
38
|
+
export interface ValidationIssue {
|
|
39
|
+
ruleId: string;
|
|
40
|
+
severity: "error" | "warn";
|
|
41
|
+
message: string;
|
|
42
|
+
nodeId?: string;
|
|
43
|
+
edge?: GraphEdge;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,SAAS,GACT,OAAO,GACP,SAAS,GACT,OAAO,GACP,SAAS,GACT,SAAS,GACT,aAAa,GACb,YAAY,CAAC;AAEjB,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,UAAU,GACV,SAAS,GACT,YAAY,GACZ,UAAU,GACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,WAAW,GACX,UAAU,GACV,UAAU,GACV,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;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;IAClC,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function readJson<T>(path: string): Promise<T>;
|
|
2
|
+
export declare function writeJson(path: string, data: unknown): Promise<void>;
|
|
3
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
4
|
+
/** Recursive copy (Node 16+). */
|
|
5
|
+
export declare function copyTree(src: string, dest: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG1D;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED,iCAAiC;AACjC,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE"}
|
package/dist/util/fs.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { cp, readFile, writeFile, mkdir, access } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
export async function readJson(path) {
|
|
4
|
+
const raw = await readFile(path, "utf8");
|
|
5
|
+
return JSON.parse(raw);
|
|
6
|
+
}
|
|
7
|
+
export async function writeJson(path, data) {
|
|
8
|
+
await mkdir(dirname(path), { recursive: true });
|
|
9
|
+
await writeFile(path, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
10
|
+
}
|
|
11
|
+
export async function pathExists(path) {
|
|
12
|
+
try {
|
|
13
|
+
await access(path);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Recursive copy (Node 16+). */
|
|
21
|
+
export async function copyTree(src, dest) {
|
|
22
|
+
await cp(src, dest, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY;IAC5C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAa;IACzD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IACtD,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DocflowConfig } from "../config/types.js";
|
|
2
|
+
import { findProjectRoot, packageBundleRoot } from "../config/load.js";
|
|
3
|
+
export { findProjectRoot, packageBundleRoot };
|
|
4
|
+
export declare const findRepoRoot: typeof findProjectRoot;
|
|
5
|
+
export interface ResolvedPaths {
|
|
6
|
+
root: string;
|
|
7
|
+
config: DocflowConfig;
|
|
8
|
+
graph: string;
|
|
9
|
+
registry: string;
|
|
10
|
+
schema: string;
|
|
11
|
+
rulesTraceability: string;
|
|
12
|
+
rulesImpact: string;
|
|
13
|
+
bundleRoot: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function resolveProjectPaths(root?: string): Promise<ResolvedPaths>;
|
|
16
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAIL,eAAe,EAGf,iBAAiB,EAElB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;AAE9C,eAAO,MAAM,YAAY,wBAAkB,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,CAAC,CAcxB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { bundledRulesImpactPath, bundledRulesTraceabilityPath, bundledSchemaPath, findProjectRoot, loadDocflowConfig, loadDocumentsManifest, packageBundleRoot, resolveFromRoot, } from "../config/load.js";
|
|
2
|
+
export { findProjectRoot, packageBundleRoot };
|
|
3
|
+
export const findRepoRoot = findProjectRoot;
|
|
4
|
+
export async function resolveProjectPaths(root) {
|
|
5
|
+
const loaded = await loadDocflowConfig(root);
|
|
6
|
+
const { bundleRoot } = await loadDocumentsManifest();
|
|
7
|
+
const p = loaded.config.paths;
|
|
8
|
+
return {
|
|
9
|
+
root: loaded.root,
|
|
10
|
+
config: loaded.config,
|
|
11
|
+
graph: resolveFromRoot(loaded.root, p.graph),
|
|
12
|
+
registry: resolveFromRoot(loaded.root, p.registry),
|
|
13
|
+
schema: bundledSchemaPath(),
|
|
14
|
+
rulesTraceability: bundledRulesTraceabilityPath(),
|
|
15
|
+
rulesImpact: bundledRulesImpactPath(),
|
|
16
|
+
bundleRoot,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAa5C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IAC9B,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5C,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC;QAClD,MAAM,EAAE,iBAAiB,EAAE;QAC3B,iBAAiB,EAAE,4BAA4B,EAAE;QACjD,WAAW,EAAE,sBAAsB,EAAE;QACrC,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TraceabilityGraph } from "../types.js";
|
|
2
|
+
import type { AnalysisKnowledge } from "../graph/knowledge.js";
|
|
3
|
+
import type { GraphStats, KnowledgeStats } from "./stats.js";
|
|
4
|
+
export interface VisualizePayload {
|
|
5
|
+
generatedAt: string;
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
graph: TraceabilityGraph;
|
|
8
|
+
knowledge: AnalysisKnowledge | null;
|
|
9
|
+
graphStats: GraphStats;
|
|
10
|
+
knowledgeStats: KnowledgeStats;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildVisualizationHtml(payload: VisualizePayload): string;
|
|
13
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/visualize/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;CAChC;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAkXxE"}
|