domain-knowledge-kit 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 (142) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +266 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +40 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/features/adr/commands/adr-related.d.ts +14 -0
  8. package/dist/features/adr/commands/adr-related.d.ts.map +1 -0
  9. package/dist/features/adr/commands/adr-related.js +146 -0
  10. package/dist/features/adr/commands/adr-related.js.map +1 -0
  11. package/dist/features/adr/commands/adr-show.d.ts +10 -0
  12. package/dist/features/adr/commands/adr-show.d.ts.map +1 -0
  13. package/dist/features/adr/commands/adr-show.js +30 -0
  14. package/dist/features/adr/commands/adr-show.js.map +1 -0
  15. package/dist/features/pipeline/commands/render.d.ts +10 -0
  16. package/dist/features/pipeline/commands/render.d.ts.map +1 -0
  17. package/dist/features/pipeline/commands/render.js +71 -0
  18. package/dist/features/pipeline/commands/render.js.map +1 -0
  19. package/dist/features/pipeline/commands/validate.d.ts +10 -0
  20. package/dist/features/pipeline/commands/validate.d.ts.map +1 -0
  21. package/dist/features/pipeline/commands/validate.js +48 -0
  22. package/dist/features/pipeline/commands/validate.js.map +1 -0
  23. package/dist/features/pipeline/indexer.d.ts +36 -0
  24. package/dist/features/pipeline/indexer.d.ts.map +1 -0
  25. package/dist/features/pipeline/indexer.js +279 -0
  26. package/dist/features/pipeline/indexer.js.map +1 -0
  27. package/dist/features/pipeline/renderer.d.ts +42 -0
  28. package/dist/features/pipeline/renderer.d.ts.map +1 -0
  29. package/dist/features/pipeline/renderer.js +239 -0
  30. package/dist/features/pipeline/renderer.js.map +1 -0
  31. package/dist/features/pipeline/tests/indexer.test.d.ts +2 -0
  32. package/dist/features/pipeline/tests/indexer.test.d.ts.map +1 -0
  33. package/dist/features/pipeline/tests/indexer.test.js +224 -0
  34. package/dist/features/pipeline/tests/indexer.test.js.map +1 -0
  35. package/dist/features/pipeline/tests/renderer.test.d.ts +2 -0
  36. package/dist/features/pipeline/tests/renderer.test.d.ts.map +1 -0
  37. package/dist/features/pipeline/tests/renderer.test.js +252 -0
  38. package/dist/features/pipeline/tests/renderer.test.js.map +1 -0
  39. package/dist/features/pipeline/tests/validate-schemas.test.d.ts +2 -0
  40. package/dist/features/pipeline/tests/validate-schemas.test.d.ts.map +1 -0
  41. package/dist/features/pipeline/tests/validate-schemas.test.js +183 -0
  42. package/dist/features/pipeline/tests/validate-schemas.test.js.map +1 -0
  43. package/dist/features/pipeline/tests/validator.test.d.ts +2 -0
  44. package/dist/features/pipeline/tests/validator.test.d.ts.map +1 -0
  45. package/dist/features/pipeline/tests/validator.test.js +371 -0
  46. package/dist/features/pipeline/tests/validator.test.js.map +1 -0
  47. package/dist/features/pipeline/validator.d.ts +44 -0
  48. package/dist/features/pipeline/validator.d.ts.map +1 -0
  49. package/dist/features/pipeline/validator.js +289 -0
  50. package/dist/features/pipeline/validator.js.map +1 -0
  51. package/dist/features/query/commands/list.d.ts +10 -0
  52. package/dist/features/query/commands/list.d.ts.map +1 -0
  53. package/dist/features/query/commands/list.js +123 -0
  54. package/dist/features/query/commands/list.js.map +1 -0
  55. package/dist/features/query/commands/related.d.ts +10 -0
  56. package/dist/features/query/commands/related.d.ts.map +1 -0
  57. package/dist/features/query/commands/related.js +61 -0
  58. package/dist/features/query/commands/related.js.map +1 -0
  59. package/dist/features/query/commands/search.d.ts +10 -0
  60. package/dist/features/query/commands/search.d.ts.map +1 -0
  61. package/dist/features/query/commands/search.js +55 -0
  62. package/dist/features/query/commands/search.js.map +1 -0
  63. package/dist/features/query/commands/show.d.ts +10 -0
  64. package/dist/features/query/commands/show.d.ts.map +1 -0
  65. package/dist/features/query/commands/show.js +96 -0
  66. package/dist/features/query/commands/show.js.map +1 -0
  67. package/dist/features/query/searcher.d.ts +58 -0
  68. package/dist/features/query/searcher.d.ts.map +1 -0
  69. package/dist/features/query/searcher.js +185 -0
  70. package/dist/features/query/searcher.js.map +1 -0
  71. package/dist/features/query/tests/searcher.test.d.ts +2 -0
  72. package/dist/features/query/tests/searcher.test.d.ts.map +1 -0
  73. package/dist/features/query/tests/searcher.test.js +320 -0
  74. package/dist/features/query/tests/searcher.test.js.map +1 -0
  75. package/dist/shared/adr-parser.d.ts +14 -0
  76. package/dist/shared/adr-parser.d.ts.map +1 -0
  77. package/dist/shared/adr-parser.js +72 -0
  78. package/dist/shared/adr-parser.js.map +1 -0
  79. package/dist/shared/errors.d.ts +43 -0
  80. package/dist/shared/errors.d.ts.map +1 -0
  81. package/dist/shared/errors.js +60 -0
  82. package/dist/shared/errors.js.map +1 -0
  83. package/dist/shared/graph.d.ts +71 -0
  84. package/dist/shared/graph.d.ts.map +1 -0
  85. package/dist/shared/graph.js +250 -0
  86. package/dist/shared/graph.js.map +1 -0
  87. package/dist/shared/index.d.ts +16 -0
  88. package/dist/shared/index.d.ts.map +1 -0
  89. package/dist/shared/index.js +24 -0
  90. package/dist/shared/index.js.map +1 -0
  91. package/dist/shared/item-visitor.d.ts +62 -0
  92. package/dist/shared/item-visitor.d.ts.map +1 -0
  93. package/dist/shared/item-visitor.js +95 -0
  94. package/dist/shared/item-visitor.js.map +1 -0
  95. package/dist/shared/loader.d.ts +19 -0
  96. package/dist/shared/loader.d.ts.map +1 -0
  97. package/dist/shared/loader.js +166 -0
  98. package/dist/shared/loader.js.map +1 -0
  99. package/dist/shared/paths.d.ts +32 -0
  100. package/dist/shared/paths.d.ts.map +1 -0
  101. package/dist/shared/paths.js +62 -0
  102. package/dist/shared/paths.js.map +1 -0
  103. package/dist/shared/tests/graph.test.d.ts +2 -0
  104. package/dist/shared/tests/graph.test.d.ts.map +1 -0
  105. package/dist/shared/tests/graph.test.js +291 -0
  106. package/dist/shared/tests/graph.test.js.map +1 -0
  107. package/dist/shared/tests/loader.test.d.ts +2 -0
  108. package/dist/shared/tests/loader.test.d.ts.map +1 -0
  109. package/dist/shared/tests/loader.test.js +239 -0
  110. package/dist/shared/tests/loader.test.js.map +1 -0
  111. package/dist/shared/tests/verify-collision-fix.test.d.ts +2 -0
  112. package/dist/shared/tests/verify-collision-fix.test.d.ts.map +1 -0
  113. package/dist/shared/tests/verify-collision-fix.test.js +114 -0
  114. package/dist/shared/tests/verify-collision-fix.test.js.map +1 -0
  115. package/dist/shared/types/domain.d.ts +244 -0
  116. package/dist/shared/types/domain.d.ts.map +1 -0
  117. package/dist/shared/types/domain.js +6 -0
  118. package/dist/shared/types/domain.js.map +1 -0
  119. package/dist/shared/types/index.d.ts +34 -0
  120. package/dist/shared/types/index.d.ts.map +1 -0
  121. package/dist/shared/types/index.js +9 -0
  122. package/dist/shared/types/index.js.map +1 -0
  123. package/dist/shared/yaml.d.ts +13 -0
  124. package/dist/shared/yaml.d.ts.map +1 -0
  125. package/dist/shared/yaml.js +29 -0
  126. package/dist/shared/yaml.js.map +1 -0
  127. package/package.json +48 -0
  128. package/tools/domain-pack/schema/.gitkeep +0 -0
  129. package/tools/domain-pack/schema/actors.schema.json +42 -0
  130. package/tools/domain-pack/schema/adr-frontmatter.schema.json +51 -0
  131. package/tools/domain-pack/schema/aggregate.schema.json +58 -0
  132. package/tools/domain-pack/schema/command.schema.json +76 -0
  133. package/tools/domain-pack/schema/context.schema.json +51 -0
  134. package/tools/domain-pack/schema/event.schema.json +66 -0
  135. package/tools/domain-pack/schema/glossary.schema.json +33 -0
  136. package/tools/domain-pack/schema/index.schema.json +76 -0
  137. package/tools/domain-pack/schema/policy.schema.json +53 -0
  138. package/tools/domain-pack/schema/read-model.schema.json +39 -0
  139. package/tools/domain-pack/templates/.gitkeep +0 -0
  140. package/tools/domain-pack/templates/context.md.hbs +89 -0
  141. package/tools/domain-pack/templates/index.md.hbs +60 -0
  142. package/tools/domain-pack/templates/item.md.hbs +85 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Domain graph — adjacency-list representation of domain model relationships.
3
+ *
4
+ * Nodes represent every domain item (event, command, policy, aggregate,
5
+ * read-model, actor, ADR, flow). Edges capture the structural
6
+ * relationships declared in the YAML model (handles, emits, triggers,
7
+ * subscribes_to, actor, used_by, adr_refs, domain_refs, flow steps).
8
+ *
9
+ * The primary query surface is {@link DomainGraph.getRelated} which
10
+ * performs a breadth-first traversal up to a specified depth.
11
+ */
12
+ import { forEachItem, itemAdrRefs } from "./item-visitor.js";
13
+ // ── Helpers ───────────────────────────────────────────────────────────
14
+ /** Build scoped id for a context-local item. */
15
+ function scopedId(context, name) {
16
+ return `${context}.${name}`;
17
+ }
18
+ /** Build id for an actor. */
19
+ function actorId(name) {
20
+ return `actor.${name}`;
21
+ }
22
+ /** Build id for a flow. */
23
+ function flowId(name) {
24
+ return `flow.${name}`;
25
+ }
26
+ // ── DomainGraph ───────────────────────────────────────────────────────
27
+ /**
28
+ * Adjacency-list graph over every item in a {@link DomainModel}.
29
+ *
30
+ * Construct via the static factory {@link DomainGraph.from}.
31
+ */
32
+ export class DomainGraph {
33
+ /** All nodes keyed by id. */
34
+ nodes;
35
+ /** All edges. */
36
+ edges;
37
+ /** Adjacency list: node id → set of neighbour ids. */
38
+ adj;
39
+ constructor(nodes, edges, adj) {
40
+ this.nodes = nodes;
41
+ this.edges = edges;
42
+ this.adj = adj;
43
+ }
44
+ // ── Factory ───────────────────────────────────────────────────────
45
+ /**
46
+ * Build a domain graph from a loaded {@link DomainModel}.
47
+ */
48
+ static from(model) {
49
+ const nodes = new Map();
50
+ const edges = [];
51
+ const adj = new Map();
52
+ /** Ensure a node exists and return its id. */
53
+ function ensureNode(id, kind, name, context) {
54
+ const existing = nodes.get(id);
55
+ if (!existing) {
56
+ nodes.set(id, { id, kind, name, context });
57
+ adj.set(id, new Set());
58
+ }
59
+ else if (existing.kind === "glossary" && kind !== "glossary") {
60
+ // Structural kinds (aggregate, event, command, etc.) take precedence
61
+ // over glossary when both share the same scoped ID within a context.
62
+ existing.kind = kind;
63
+ }
64
+ return id;
65
+ }
66
+ /** Add an undirected edge (both directions in the adjacency list). */
67
+ function addEdge(from, to, label) {
68
+ edges.push({ from, to, label });
69
+ adj.get(from)?.add(to);
70
+ adj.get(to)?.add(from);
71
+ }
72
+ /** Wire adr_refs for any item. */
73
+ function wireAdrRefs(itemId, adrRefs) {
74
+ if (!adrRefs)
75
+ return;
76
+ for (const ref of adrRefs) {
77
+ // ADR node might not exist yet if the ADR file wasn't present;
78
+ // we still create a placeholder node so the edge is recorded.
79
+ ensureNode(ref, "adr", ref);
80
+ addEdge(itemId, ref, "adr_ref");
81
+ }
82
+ }
83
+ // ── Actors ────────────────────────────────────────────────────
84
+ for (const actor of model.actors) {
85
+ const id = ensureNode(actorId(actor.name), "actor", actor.name);
86
+ wireAdrRefs(id, actor.adr_refs);
87
+ }
88
+ // ── Bounded contexts & their items ────────────────────────────
89
+ for (const [ctxName, ctx] of model.contexts) {
90
+ const ctxId = ensureNode(`context.${ctxName}`, "context", ctxName);
91
+ wireAdrRefs(ctxId, undefined); // contexts don't have adr_refs currently
92
+ // Visit all item types: create node, add contains edge, wire ADR refs,
93
+ // then apply type-specific relationship wiring.
94
+ forEachItem(ctx, (type, name, item) => {
95
+ const nodeKind = type;
96
+ const id = ensureNode(scopedId(ctxName, name), nodeKind, name, ctxName);
97
+ addEdge(ctxId, id, "contains");
98
+ wireAdrRefs(id, itemAdrRefs(item));
99
+ // Type-specific relationship wiring
100
+ switch (type) {
101
+ case "event": {
102
+ const evt = item;
103
+ if (evt.raised_by) {
104
+ const aggId = ensureNode(scopedId(ctxName, evt.raised_by), "aggregate", evt.raised_by, ctxName);
105
+ addEdge(aggId, id, "emits");
106
+ }
107
+ break;
108
+ }
109
+ case "command": {
110
+ const cmd = item;
111
+ if (cmd.handled_by) {
112
+ const aggId = ensureNode(scopedId(ctxName, cmd.handled_by), "aggregate", cmd.handled_by, ctxName);
113
+ addEdge(aggId, id, "handles");
114
+ }
115
+ if (cmd.actor) {
116
+ const aId = ensureNode(actorId(cmd.actor), "actor", cmd.actor);
117
+ addEdge(aId, id, "initiates");
118
+ }
119
+ break;
120
+ }
121
+ case "policy": {
122
+ const pol = item;
123
+ for (const trigger of pol.when?.events ?? []) {
124
+ const evtId = ensureNode(scopedId(ctxName, trigger), "event", trigger, ctxName);
125
+ addEdge(evtId, id, "triggers");
126
+ }
127
+ for (const emitted of pol.then?.commands ?? []) {
128
+ const cmdId = ensureNode(scopedId(ctxName, emitted), "command", emitted, ctxName);
129
+ addEdge(id, cmdId, "emits");
130
+ }
131
+ break;
132
+ }
133
+ case "aggregate": {
134
+ const agg = item;
135
+ for (const h of agg.handles?.commands ?? []) {
136
+ const cmdId = ensureNode(scopedId(ctxName, h), "command", h, ctxName);
137
+ addEdge(id, cmdId, "handles");
138
+ }
139
+ for (const e of agg.emits?.events ?? []) {
140
+ const evtId = ensureNode(scopedId(ctxName, e), "event", e, ctxName);
141
+ addEdge(id, evtId, "emits");
142
+ }
143
+ break;
144
+ }
145
+ case "read_model": {
146
+ const rm = item;
147
+ for (const sub of rm.subscribes_to ?? []) {
148
+ const evtId = ensureNode(scopedId(ctxName, sub), "event", sub, ctxName);
149
+ addEdge(id, evtId, "subscribes_to");
150
+ }
151
+ for (const user of rm.used_by ?? []) {
152
+ const aId = ensureNode(actorId(user), "actor", user);
153
+ addEdge(id, aId, "used_by");
154
+ }
155
+ break;
156
+ }
157
+ case "glossary":
158
+ // Glossary items have no type-specific relationship wiring.
159
+ break;
160
+ }
161
+ });
162
+ }
163
+ // ── ADRs ──────────────────────────────────────────────────────
164
+ for (const [adrId, adr] of model.adrs) {
165
+ ensureNode(adrId, "adr", adr.title);
166
+ // domain_refs → domain items
167
+ for (const ref of adr.domain_refs ?? []) {
168
+ // ref is in "context.Name" format — ensure node exists
169
+ const dotIdx = ref.indexOf(".");
170
+ if (dotIdx > 0) {
171
+ const ctx = ref.slice(0, dotIdx);
172
+ const name = ref.slice(dotIdx + 1);
173
+ // We don't know the item kind from the ref alone; default to
174
+ // a generic node that will be reconciled if it was already created.
175
+ ensureNode(ref, "aggregate", name, ctx);
176
+ }
177
+ addEdge(adrId, ref, "domain_ref");
178
+ }
179
+ // superseded_by → another ADR
180
+ if (adr.superseded_by) {
181
+ ensureNode(adr.superseded_by, "adr", adr.superseded_by);
182
+ addEdge(adrId, adr.superseded_by, "superseded_by");
183
+ }
184
+ }
185
+ // ── Flows ─────────────────────────────────────────────────────
186
+ for (const flow of model.index.flows ?? []) {
187
+ const fId = ensureNode(flowId(flow.name), "flow", flow.name);
188
+ let prevStepId;
189
+ for (const step of flow.steps) {
190
+ const ref = step.ref;
191
+ const dotIdx = ref.indexOf(".");
192
+ const ctx = dotIdx > 0 ? ref.slice(0, dotIdx) : undefined;
193
+ const name = dotIdx > 0 ? ref.slice(dotIdx + 1) : ref;
194
+ const kind = step.type === "read_model" ? "read_model" : step.type;
195
+ ensureNode(ref, kind, name, ctx);
196
+ addEdge(fId, ref, "flow_step");
197
+ // Link consecutive flow steps
198
+ if (prevStepId) {
199
+ addEdge(prevStepId, ref, "flow_next");
200
+ }
201
+ prevStepId = ref;
202
+ }
203
+ }
204
+ return new DomainGraph(nodes, edges, adj);
205
+ }
206
+ // ── Queries ───────────────────────────────────────────────────────
207
+ /**
208
+ * Return the set of node ids reachable from `startId` within `depth`
209
+ * hops (BFS). The start node itself is **not** included unless it is
210
+ * reachable via a cycle within the depth limit.
211
+ *
212
+ * @param startId The id of the node to start from.
213
+ * @param depth Maximum traversal depth (default: 1).
214
+ * @returns A set of related node ids.
215
+ */
216
+ getRelated(startId, depth = 1) {
217
+ const result = new Set();
218
+ if (!this.adj.has(startId))
219
+ return result;
220
+ const visited = new Set([startId]);
221
+ let frontier = [startId];
222
+ for (let d = 0; d < depth && frontier.length > 0; d++) {
223
+ const next = [];
224
+ for (const nodeId of frontier) {
225
+ for (const neighbour of this.adj.get(nodeId) ?? []) {
226
+ if (!visited.has(neighbour)) {
227
+ visited.add(neighbour);
228
+ result.add(neighbour);
229
+ next.push(neighbour);
230
+ }
231
+ }
232
+ }
233
+ frontier = next;
234
+ }
235
+ return result;
236
+ }
237
+ /**
238
+ * Return direct neighbours of a node (shorthand for depth-1 traversal).
239
+ */
240
+ getNeighbours(nodeId) {
241
+ return new Set(this.adj.get(nodeId) ?? []);
242
+ }
243
+ /**
244
+ * Check whether a node id exists in the graph.
245
+ */
246
+ hasNode(id) {
247
+ return this.nodes.has(id);
248
+ }
249
+ }
250
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/shared/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Barrel export for all shared / cross-cutting modules.
3
+ *
4
+ * Consumers can import from `../shared/index.js` (or just `../shared/`)
5
+ * instead of reaching into individual files.
6
+ */
7
+ export * from "./types/domain.js";
8
+ export * from "./types/index.js";
9
+ export { type ItemType, type AnyDomainItem, ITEM_TYPES, itemName, itemDescription, itemAdrRefs, forEachItem, mapItems, } from "./item-visitor.js";
10
+ export { loadDomainModel, type LoaderOptions } from "./loader.js";
11
+ export { DomainGraph, type NodeKind, type GraphNode, type GraphEdge } from "./graph.js";
12
+ export { repoRoot, domainDir, contextsDir, actorsFile, indexFile, adrDir, docsDir, templatesDir, schemaDir, repoRelative, } from "./paths.js";
13
+ export { parseYaml, stringifyYaml } from "./yaml.js";
14
+ export { parseAdrFrontmatter, parseAdrFile } from "./adr-parser.js";
15
+ export { formatCliError, isYAMLException, isNodeSystemError } from "./errors.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,UAAU,EACV,QAAQ,EACR,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGxF,OAAO,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,YAAY,EACZ,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Barrel export for all shared / cross-cutting modules.
3
+ *
4
+ * Consumers can import from `../shared/index.js` (or just `../shared/`)
5
+ * instead of reaching into individual files.
6
+ */
7
+ // ── Types ─────────────────────────────────────────────────────────────
8
+ export * from "./types/domain.js";
9
+ export * from "./types/index.js";
10
+ // ── Item visitor ──────────────────────────────────────────────────────
11
+ export { ITEM_TYPES, itemName, itemDescription, itemAdrRefs, forEachItem, mapItems, } from "./item-visitor.js";
12
+ // ── Loader ────────────────────────────────────────────────────────────
13
+ export { loadDomainModel } from "./loader.js";
14
+ // ── Graph ─────────────────────────────────────────────────────────────
15
+ export { DomainGraph } from "./graph.js";
16
+ // ── Path helpers ──────────────────────────────────────────────────────
17
+ export { repoRoot, domainDir, contextsDir, actorsFile, indexFile, adrDir, docsDir, templatesDir, schemaDir, repoRelative, } from "./paths.js";
18
+ // ── YAML helpers ──────────────────────────────────────────────────────
19
+ export { parseYaml, stringifyYaml } from "./yaml.js";
20
+ // ── ADR parser ────────────────────────────────────────────────────────
21
+ export { parseAdrFrontmatter, parseAdrFile } from "./adr-parser.js";
22
+ // ── Error formatting ──────────────────────────────────────────────────
23
+ export { formatCliError, isYAMLException, isNodeSystemError } from "./errors.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yEAAyE;AACzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAEjC,yEAAyE;AACzE,OAAO,EAGL,UAAU,EACV,QAAQ,EACR,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAE3B,yEAAyE;AACzE,OAAO,EAAE,eAAe,EAAsB,MAAM,aAAa,CAAC;AAElE,yEAAyE;AACzE,OAAO,EAAE,WAAW,EAAiD,MAAM,YAAY,CAAC;AAExF,yEAAyE;AACzE,OAAO,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,YAAY,EACZ,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,yEAAyE;AACzE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAErD,yEAAyE;AACzE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpE,yEAAyE;AACzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Item visitor utility — encapsulates the 'iterate over all item types
3
+ * in a bounded context' pattern.
4
+ *
5
+ * Before this utility, the sequence
6
+ * `ctx.events ?? [] → ctx.commands ?? [] → ctx.policies ?? [] →
7
+ * ctx.aggregates ?? [] → ctx.read_models ?? [] → ctx.glossary ?? []`
8
+ * was copy-pasted in 5+ locations. Adding a new domain item type
9
+ * required modifying every one of those sites.
10
+ *
11
+ * Two entry points are provided:
12
+ *
13
+ * - {@link forEachItem} — iterate with a callback (side-effects).
14
+ * - {@link mapItems} — collect mapped results into an array.
15
+ */
16
+ import type { DomainContext, DomainEvent, Command, Policy, Aggregate, ReadModel, GlossaryEntry, AdrRef } from "./types/domain.js";
17
+ /** The six domain item categories that live inside a bounded context. */
18
+ export type ItemType = "event" | "command" | "policy" | "aggregate" | "read_model" | "glossary";
19
+ /** Union of every domain item interface. */
20
+ export type AnyDomainItem = DomainEvent | Command | Policy | Aggregate | ReadModel | GlossaryEntry;
21
+ /**
22
+ * Canonical item types in their standard iteration order.
23
+ * Matches the order used historically across the codebase.
24
+ */
25
+ export declare const ITEM_TYPES: readonly ItemType[];
26
+ /**
27
+ * Get the canonical display name of any domain item.
28
+ *
29
+ * Most items use `.name`; glossary entries use `.term`.
30
+ */
31
+ export declare function itemName(item: AnyDomainItem): string;
32
+ /**
33
+ * Get the description text of any domain item.
34
+ *
35
+ * Most items use `.description`; glossary entries use `.definition`.
36
+ */
37
+ export declare function itemDescription(item: AnyDomainItem): string;
38
+ /**
39
+ * Get `adr_refs` from any domain item (all types carry this optional field).
40
+ */
41
+ export declare function itemAdrRefs(item: AnyDomainItem): AdrRef[] | undefined;
42
+ /**
43
+ * Iterate every domain item in a bounded context, calling `fn` once
44
+ * per item. Items are visited in canonical type order (events, commands,
45
+ * policies, aggregates, read models, glossary).
46
+ *
47
+ * @param ctx - The bounded context to visit.
48
+ * @param fn - Callback receiving the item type, its canonical name,
49
+ * and the item object itself.
50
+ */
51
+ export declare function forEachItem(ctx: DomainContext, fn: (type: ItemType, name: string, item: AnyDomainItem) => void): void;
52
+ /**
53
+ * Map every domain item in a bounded context to a value, collecting
54
+ * all results into an array. Items are visited in canonical type order.
55
+ *
56
+ * @param ctx - The bounded context to visit.
57
+ * @param fn - Mapping function receiving the item type, its canonical
58
+ * name, and the item object itself.
59
+ * @returns An array of mapped values, one per item.
60
+ */
61
+ export declare function mapItems<R>(ctx: DomainContext, fn: (type: ItemType, name: string, item: AnyDomainItem) => R): R[];
62
+ //# sourceMappingURL=item-visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-visitor.d.ts","sourceRoot":"","sources":["../../src/shared/item-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EACb,MAAM,EACP,MAAM,mBAAmB,CAAC;AAI3B,yEAAyE;AACzE,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,UAAU,CAAC;AAEf,4CAA4C;AAC5C,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,aAAa,CAAC;AAElB;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAOhC,CAAC;AAIX;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAIpD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAI3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,GAAG,SAAS,CAErE;AAID;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,GAC9D,IAAI,CAON;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,CAAC,GAC3D,CAAC,EAAE,CAML"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Item visitor utility — encapsulates the 'iterate over all item types
3
+ * in a bounded context' pattern.
4
+ *
5
+ * Before this utility, the sequence
6
+ * `ctx.events ?? [] → ctx.commands ?? [] → ctx.policies ?? [] →
7
+ * ctx.aggregates ?? [] → ctx.read_models ?? [] → ctx.glossary ?? []`
8
+ * was copy-pasted in 5+ locations. Adding a new domain item type
9
+ * required modifying every one of those sites.
10
+ *
11
+ * Two entry points are provided:
12
+ *
13
+ * - {@link forEachItem} — iterate with a callback (side-effects).
14
+ * - {@link mapItems} — collect mapped results into an array.
15
+ */
16
+ /**
17
+ * Canonical item types in their standard iteration order.
18
+ * Matches the order used historically across the codebase.
19
+ */
20
+ export const ITEM_TYPES = [
21
+ "event",
22
+ "command",
23
+ "policy",
24
+ "aggregate",
25
+ "read_model",
26
+ "glossary",
27
+ ];
28
+ // ── Helpers ───────────────────────────────────────────────────────────
29
+ /**
30
+ * Get the canonical display name of any domain item.
31
+ *
32
+ * Most items use `.name`; glossary entries use `.term`.
33
+ */
34
+ export function itemName(item) {
35
+ return "term" in item && typeof item.term === "string"
36
+ ? item.term
37
+ : item.name;
38
+ }
39
+ /**
40
+ * Get the description text of any domain item.
41
+ *
42
+ * Most items use `.description`; glossary entries use `.definition`.
43
+ */
44
+ export function itemDescription(item) {
45
+ return "definition" in item && typeof item.definition === "string"
46
+ ? item.definition
47
+ : item.description;
48
+ }
49
+ /**
50
+ * Get `adr_refs` from any domain item (all types carry this optional field).
51
+ */
52
+ export function itemAdrRefs(item) {
53
+ return item.adr_refs;
54
+ }
55
+ // ── Entry points ──────────────────────────────────────────────────────
56
+ /**
57
+ * Iterate every domain item in a bounded context, calling `fn` once
58
+ * per item. Items are visited in canonical type order (events, commands,
59
+ * policies, aggregates, read models, glossary).
60
+ *
61
+ * @param ctx - The bounded context to visit.
62
+ * @param fn - Callback receiving the item type, its canonical name,
63
+ * and the item object itself.
64
+ */
65
+ export function forEachItem(ctx, fn) {
66
+ for (const e of ctx.events ?? [])
67
+ fn("event", e.name, e);
68
+ for (const c of ctx.commands ?? [])
69
+ fn("command", c.name, c);
70
+ for (const p of ctx.policies ?? [])
71
+ fn("policy", p.name, p);
72
+ for (const a of ctx.aggregates ?? [])
73
+ fn("aggregate", a.name, a);
74
+ for (const r of ctx.read_models ?? [])
75
+ fn("read_model", r.name, r);
76
+ for (const g of ctx.glossary ?? [])
77
+ fn("glossary", g.term, g);
78
+ }
79
+ /**
80
+ * Map every domain item in a bounded context to a value, collecting
81
+ * all results into an array. Items are visited in canonical type order.
82
+ *
83
+ * @param ctx - The bounded context to visit.
84
+ * @param fn - Mapping function receiving the item type, its canonical
85
+ * name, and the item object itself.
86
+ * @returns An array of mapped values, one per item.
87
+ */
88
+ export function mapItems(ctx, fn) {
89
+ const results = [];
90
+ forEachItem(ctx, (type, name, item) => {
91
+ results.push(fn(type, name, item));
92
+ });
93
+ return results;
94
+ }
95
+ //# sourceMappingURL=item-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-visitor.js","sourceRoot":"","sources":["../../src/shared/item-visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAwB;IAC7C,OAAO;IACP,SAAS;IACT,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,UAAU;CACF,CAAC;AAEX,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAmB;IAC1C,OAAO,MAAM,IAAI,IAAI,IAAI,OAAQ,IAAsB,CAAC,IAAI,KAAK,QAAQ;QACvE,CAAC,CAAE,IAAsB,CAAC,IAAI;QAC9B,CAAC,CAAE,IAA8C,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAmB;IACjD,OAAO,YAAY,IAAI,IAAI,IAAI,OAAQ,IAAsB,CAAC,UAAU,KAAK,QAAQ;QACnF,CAAC,CAAE,IAAsB,CAAC,UAAU;QACpC,CAAC,CAAE,IAA8C,CAAC,WAAW,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,OAAQ,IAAgC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,yEAAyE;AAEzE;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,GAAkB,EAClB,EAA+D;IAE/D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE;QAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE;QAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE;QAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE;QAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE;QAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAkB,EAClB,EAA4D;IAE5D,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACpC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { DomainModel } from "./types/domain.js";
2
+ /** Options for the loader. */
3
+ export interface LoaderOptions {
4
+ /** Override repository root (default: auto-detected). */
5
+ root?: string;
6
+ }
7
+ /**
8
+ * Load the complete domain model from disk.
9
+ *
10
+ * 1. Parses `domain/index.yml`
11
+ * 2. Parses `domain/actors.yml`
12
+ * 3. Discovers and parses every bounded-context YAML file
13
+ * under `domain/contexts/`
14
+ * 4. Discovers and parses ADR frontmatter from `docs/adr/*.md`
15
+ *
16
+ * @returns A fully-populated {@link DomainModel}.
17
+ */
18
+ export declare function loadDomainModel(options?: LoaderOptions): DomainModel;
19
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/shared/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAKV,WAAW,EAOZ,MAAM,mBAAmB,CAAC;AAiH3B,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,WAAW,CAkCxE"}