domain-knowledge-kit 0.2.15 → 0.2.16

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 (177) hide show
  1. package/README.md +4 -0
  2. package/dist/cli.js +20 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/features/agent/commands/init.d.ts.map +1 -1
  5. package/dist/features/agent/commands/init.js +141 -3
  6. package/dist/features/agent/commands/init.js.map +1 -1
  7. package/dist/features/agent/commands/prime.d.ts +11 -0
  8. package/dist/features/agent/commands/prime.d.ts.map +1 -1
  9. package/dist/features/agent/commands/prime.js +104 -8
  10. package/dist/features/agent/commands/prime.js.map +1 -1
  11. package/dist/features/federation/commands/consumers.d.ts +40 -0
  12. package/dist/features/federation/commands/consumers.d.ts.map +1 -0
  13. package/dist/features/federation/commands/consumers.js +126 -0
  14. package/dist/features/federation/commands/consumers.js.map +1 -0
  15. package/dist/features/federation/commands/peers-add.d.ts +14 -0
  16. package/dist/features/federation/commands/peers-add.d.ts.map +1 -0
  17. package/dist/features/federation/commands/peers-add.js +79 -0
  18. package/dist/features/federation/commands/peers-add.js.map +1 -0
  19. package/dist/features/federation/commands/peers-list.d.ts +8 -0
  20. package/dist/features/federation/commands/peers-list.d.ts.map +1 -0
  21. package/dist/features/federation/commands/peers-list.js +51 -0
  22. package/dist/features/federation/commands/peers-list.js.map +1 -0
  23. package/dist/features/federation/commands/peers-status.d.ts +8 -0
  24. package/dist/features/federation/commands/peers-status.d.ts.map +1 -0
  25. package/dist/features/federation/commands/peers-status.js +78 -0
  26. package/dist/features/federation/commands/peers-status.js.map +1 -0
  27. package/dist/features/federation/commands/pull.d.ts +18 -0
  28. package/dist/features/federation/commands/pull.d.ts.map +1 -0
  29. package/dist/features/federation/commands/pull.js +153 -0
  30. package/dist/features/federation/commands/pull.js.map +1 -0
  31. package/dist/features/federation/git-fetcher.d.ts +45 -0
  32. package/dist/features/federation/git-fetcher.d.ts.map +1 -0
  33. package/dist/features/federation/git-fetcher.js +70 -0
  34. package/dist/features/federation/git-fetcher.js.map +1 -0
  35. package/dist/features/federation/loader.d.ts +60 -0
  36. package/dist/features/federation/loader.d.ts.map +1 -0
  37. package/dist/features/federation/loader.js +193 -0
  38. package/dist/features/federation/loader.js.map +1 -0
  39. package/dist/features/federation/lock.d.ts +12 -0
  40. package/dist/features/federation/lock.d.ts.map +1 -0
  41. package/dist/features/federation/lock.js +48 -0
  42. package/dist/features/federation/lock.js.map +1 -0
  43. package/dist/features/federation/tests/git-fetcher.test.d.ts +2 -0
  44. package/dist/features/federation/tests/git-fetcher.test.d.ts.map +1 -0
  45. package/dist/features/federation/tests/git-fetcher.test.js +167 -0
  46. package/dist/features/federation/tests/git-fetcher.test.js.map +1 -0
  47. package/dist/features/federation/tests/loader.test.d.ts +2 -0
  48. package/dist/features/federation/tests/loader.test.d.ts.map +1 -0
  49. package/dist/features/federation/tests/loader.test.js +144 -0
  50. package/dist/features/federation/tests/loader.test.js.map +1 -0
  51. package/dist/features/federation/tests/phase5.test.d.ts +2 -0
  52. package/dist/features/federation/tests/phase5.test.d.ts.map +1 -0
  53. package/dist/features/federation/tests/phase5.test.js +137 -0
  54. package/dist/features/federation/tests/phase5.test.js.map +1 -0
  55. package/dist/features/federation/tests/schema-load.test.d.ts +2 -0
  56. package/dist/features/federation/tests/schema-load.test.d.ts.map +1 -0
  57. package/dist/features/federation/tests/schema-load.test.js +97 -0
  58. package/dist/features/federation/tests/schema-load.test.js.map +1 -0
  59. package/dist/features/federation/tests/validator.test.d.ts +2 -0
  60. package/dist/features/federation/tests/validator.test.d.ts.map +1 -0
  61. package/dist/features/federation/tests/validator.test.js +319 -0
  62. package/dist/features/federation/tests/validator.test.js.map +1 -0
  63. package/dist/features/mcp/commands/serve.d.ts +10 -0
  64. package/dist/features/mcp/commands/serve.d.ts.map +1 -0
  65. package/dist/features/mcp/commands/serve.js +12 -0
  66. package/dist/features/mcp/commands/serve.js.map +1 -0
  67. package/dist/features/mcp/server.d.ts +15 -0
  68. package/dist/features/mcp/server.d.ts.map +1 -0
  69. package/dist/features/mcp/server.js +438 -0
  70. package/dist/features/mcp/server.js.map +1 -0
  71. package/dist/features/pipeline/commands/validate.d.ts.map +1 -1
  72. package/dist/features/pipeline/commands/validate.js +7 -0
  73. package/dist/features/pipeline/commands/validate.js.map +1 -1
  74. package/dist/features/pipeline/indexer.d.ts +28 -2
  75. package/dist/features/pipeline/indexer.d.ts.map +1 -1
  76. package/dist/features/pipeline/indexer.js +82 -27
  77. package/dist/features/pipeline/indexer.js.map +1 -1
  78. package/dist/features/pipeline/validator.d.ts +10 -0
  79. package/dist/features/pipeline/validator.d.ts.map +1 -1
  80. package/dist/features/pipeline/validator.js +274 -27
  81. package/dist/features/pipeline/validator.js.map +1 -1
  82. package/dist/features/query/commands/list.d.ts +10 -0
  83. package/dist/features/query/commands/list.d.ts.map +1 -1
  84. package/dist/features/query/commands/list.js +1 -1
  85. package/dist/features/query/commands/list.js.map +1 -1
  86. package/dist/features/query/commands/locate.d.ts +1 -0
  87. package/dist/features/query/commands/locate.d.ts.map +1 -1
  88. package/dist/features/query/commands/locate.js +1 -1
  89. package/dist/features/query/commands/locate.js.map +1 -1
  90. package/dist/features/query/commands/search.d.ts.map +1 -1
  91. package/dist/features/query/commands/search.js +2 -0
  92. package/dist/features/query/commands/search.js.map +1 -1
  93. package/dist/features/query/commands/show.d.ts +15 -0
  94. package/dist/features/query/commands/show.d.ts.map +1 -1
  95. package/dist/features/query/commands/show.js +116 -58
  96. package/dist/features/query/commands/show.js.map +1 -1
  97. package/dist/features/query/commands/story.d.ts +70 -0
  98. package/dist/features/query/commands/story.d.ts.map +1 -1
  99. package/dist/features/query/commands/story.js +2 -2
  100. package/dist/features/query/commands/story.js.map +1 -1
  101. package/dist/features/query/commands/summary.d.ts +3 -0
  102. package/dist/features/query/commands/summary.d.ts.map +1 -1
  103. package/dist/features/query/commands/summary.js +1 -1
  104. package/dist/features/query/commands/summary.js.map +1 -1
  105. package/dist/features/query/searcher.d.ts +18 -1
  106. package/dist/features/query/searcher.d.ts.map +1 -1
  107. package/dist/features/query/searcher.js +11 -2
  108. package/dist/features/query/searcher.js.map +1 -1
  109. package/dist/features/scaffold/commands/service-init.d.ts +12 -0
  110. package/dist/features/scaffold/commands/service-init.d.ts.map +1 -0
  111. package/dist/features/scaffold/commands/service-init.js +69 -0
  112. package/dist/features/scaffold/commands/service-init.js.map +1 -0
  113. package/dist/shared/graph.d.ts +8 -0
  114. package/dist/shared/graph.d.ts.map +1 -1
  115. package/dist/shared/graph.js +180 -112
  116. package/dist/shared/graph.js.map +1 -1
  117. package/dist/shared/index.d.ts +4 -1
  118. package/dist/shared/index.d.ts.map +1 -1
  119. package/dist/shared/index.js +6 -1
  120. package/dist/shared/index.js.map +1 -1
  121. package/dist/shared/loader.d.ts +22 -0
  122. package/dist/shared/loader.d.ts.map +1 -1
  123. package/dist/shared/loader.js +31 -1
  124. package/dist/shared/loader.js.map +1 -1
  125. package/dist/shared/paths.d.ts +59 -7
  126. package/dist/shared/paths.d.ts.map +1 -1
  127. package/dist/shared/paths.js +93 -11
  128. package/dist/shared/paths.js.map +1 -1
  129. package/dist/shared/refs.d.ts +96 -0
  130. package/dist/shared/refs.d.ts.map +1 -0
  131. package/dist/shared/refs.js +182 -0
  132. package/dist/shared/refs.js.map +1 -0
  133. package/dist/shared/service-id.d.ts +11 -0
  134. package/dist/shared/service-id.d.ts.map +1 -0
  135. package/dist/shared/service-id.js +64 -0
  136. package/dist/shared/service-id.js.map +1 -0
  137. package/dist/shared/tests/paths.test.d.ts +2 -0
  138. package/dist/shared/tests/paths.test.d.ts.map +1 -0
  139. package/dist/shared/tests/paths.test.js +111 -0
  140. package/dist/shared/tests/paths.test.js.map +1 -0
  141. package/dist/shared/tests/refs.test.d.ts +2 -0
  142. package/dist/shared/tests/refs.test.d.ts.map +1 -0
  143. package/dist/shared/tests/refs.test.js +104 -0
  144. package/dist/shared/tests/refs.test.js.map +1 -0
  145. package/dist/shared/types/domain.d.ts +14 -0
  146. package/dist/shared/types/domain.d.ts.map +1 -1
  147. package/dist/shared/types/federation.d.ts +60 -0
  148. package/dist/shared/types/federation.d.ts.map +1 -0
  149. package/dist/shared/types/federation.js +12 -0
  150. package/dist/shared/types/federation.js.map +1 -0
  151. package/package.json +6 -3
  152. package/tools/dkk/claude/agents/dkk-domain-reviewer.md +69 -0
  153. package/tools/dkk/claude/commands/dkk-adr.md +11 -0
  154. package/tools/dkk/claude/commands/dkk-impact.md +34 -0
  155. package/tools/dkk/claude/commands/dkk-implement.md +12 -0
  156. package/tools/dkk/claude/commands/dkk-prime.md +6 -0
  157. package/tools/dkk/claude/commands/dkk-review.md +12 -0
  158. package/tools/dkk/claude/commands/dkk-story.md +12 -0
  159. package/tools/dkk/claude/hooks/post-edit-validate.mjs +51 -0
  160. package/tools/dkk/claude/hooks/pre-edit-block-generated.mjs +39 -0
  161. package/tools/dkk/claude/hooks/session-start-prime.mjs +33 -0
  162. package/tools/dkk/claude/hooks/stop-validate.mjs +48 -0
  163. package/tools/dkk/claude/settings.json +62 -0
  164. package/tools/dkk/claude/skills/dkk-adr-author/SKILL.md +54 -0
  165. package/tools/dkk/claude/skills/dkk-flow-implementer/SKILL.md +51 -0
  166. package/tools/dkk/claude/skills/dkk-story-analyst/SKILL.md +108 -0
  167. package/tools/dkk/schema/actors.schema.json +1 -1
  168. package/tools/dkk/schema/adr-frontmatter.schema.json +4 -4
  169. package/tools/dkk/schema/aggregate.schema.json +1 -1
  170. package/tools/dkk/schema/command.schema.json +1 -1
  171. package/tools/dkk/schema/event.schema.json +1 -1
  172. package/tools/dkk/schema/federation.schema.json +71 -0
  173. package/tools/dkk/schema/glossary.schema.json +1 -1
  174. package/tools/dkk/schema/index.schema.json +2 -2
  175. package/tools/dkk/schema/policy.schema.json +1 -1
  176. package/tools/dkk/schema/read-model.schema.json +1 -1
  177. package/tools/dkk/schema/service.schema.json +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-fetcher.test.js","sourceRoot":"","sources":["../../../../src/features/federation/tests/git-fetcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../../src/features/federation/tests/loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Tests for the federation loader.
3
+ *
4
+ * Verifies two-repo local-path federation:
5
+ * - Local peer is reachable, its items are loaded into model.peers
6
+ * - Unreachable peer becomes a warning, not an error
7
+ * - DKK_PEER_<NAME> env override redirects a peer to a different path
8
+ * - Peer loading is one level deep (a peer's own federation.yml is ignored)
9
+ */
10
+ import { mkdirSync, writeFileSync, rmSync, realpathSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { loadDomainModel } from "../../../shared/loader.js";
14
+ import { loadFederation, resolvePeerRoot, peerEnvKey } from "../loader.js";
15
+ let passed = 0;
16
+ let failed = 0;
17
+ function assert(label, condition, detail) {
18
+ if (condition) {
19
+ console.log(` OK: ${label}`);
20
+ passed++;
21
+ }
22
+ else {
23
+ console.error(`FAIL: ${label}${detail ? ` — ${detail}` : ""}`);
24
+ failed++;
25
+ }
26
+ }
27
+ const RAW_TMP = join(tmpdir(), `dkk-fed-${Date.now()}`);
28
+ mkdirSync(RAW_TMP, { recursive: true });
29
+ const TMP = realpathSync(RAW_TMP);
30
+ // Two-repo fixture layout:
31
+ // <TMP>/order-svc/.dkk/ — peer service "ordering" with one event
32
+ // <TMP>/billing-svc/.dkk/ — local service "billing" with federation.yml pointing at order-svc
33
+ const ORDER = join(TMP, "order-svc");
34
+ const BILLING = join(TMP, "billing-svc");
35
+ const ALT_ORDER = join(TMP, "alt-order-svc"); // for env override test
36
+ function writeServiceRepo(root, opts) {
37
+ const dkk = join(root, ".dkk");
38
+ const domain = join(dkk, "domain");
39
+ const ctx = join(domain, "contexts", opts.contextName);
40
+ mkdirSync(join(ctx, "events"), { recursive: true });
41
+ mkdirSync(join(dkk, "adr"), { recursive: true });
42
+ // service.yml
43
+ writeFileSync(join(dkk, "service.yml"), [`name: ${opts.serviceName}`, `exports:`, ` - ${opts.exportName}`].join("\n"));
44
+ // domain/index.yml
45
+ writeFileSync(join(domain, "index.yml"), [`contexts:`, ` - name: ${opts.contextName}`, ` description: ${opts.contextName} context`].join("\n"));
46
+ // domain/actors.yml
47
+ writeFileSync(join(domain, "actors.yml"), "actors: []\n");
48
+ // contexts/<name>/context.yml
49
+ writeFileSync(join(ctx, "context.yml"), [`name: ${opts.contextName}`, `description: ${opts.contextName} bounded context`].join("\n"));
50
+ if (opts.eventName) {
51
+ writeFileSync(join(ctx, "events", `${opts.eventName}.yml`), [`name: ${opts.eventName}`, `description: Raised when ${opts.eventName.toLowerCase()}.`].join("\n"));
52
+ }
53
+ if (opts.federationYml) {
54
+ writeFileSync(join(dkk, "federation.yml"), opts.federationYml);
55
+ }
56
+ }
57
+ writeServiceRepo(ORDER, {
58
+ serviceName: "ordering",
59
+ exportName: "ordering",
60
+ contextName: "ordering",
61
+ eventName: "OrderPlaced",
62
+ });
63
+ writeServiceRepo(BILLING, {
64
+ serviceName: "billing",
65
+ exportName: "billing",
66
+ contextName: "billing",
67
+ federationYml: [
68
+ "peers:",
69
+ " - name: ordering",
70
+ " source:",
71
+ " type: local",
72
+ " path: ../order-svc",
73
+ ].join("\n"),
74
+ });
75
+ // Alt peer for env override
76
+ writeServiceRepo(ALT_ORDER, {
77
+ serviceName: "ordering",
78
+ exportName: "ordering",
79
+ contextName: "ordering",
80
+ eventName: "OrderShipped",
81
+ });
82
+ try {
83
+ // ── loadFederation reads the manifest ─────────────────────────────────
84
+ console.log("\n=== loadFederation ===");
85
+ const manifest = loadFederation(BILLING);
86
+ assert("federation manifest loaded", manifest !== null);
87
+ assert("manifest has one peer", manifest?.peers.length === 1);
88
+ assert("peer name is ordering", manifest?.peers[0].name === "ordering");
89
+ assert("peer source type is local", manifest?.peers[0].source.type === "local");
90
+ // unfederated repo returns null
91
+ const noFed = loadFederation(ORDER);
92
+ assert("unfederated repo returns null", noFed === null);
93
+ // ── resolvePeerRoot for local source ──────────────────────────────────
94
+ console.log("\n=== resolvePeerRoot (local) ===");
95
+ const resolved = resolvePeerRoot(manifest.peers[0], BILLING);
96
+ assert("local peer is reachable", resolved.reachable);
97
+ assert("peerRoot resolves to order-svc", resolved.peerRoot === ORDER);
98
+ // ── resolvePeerRoot for unreachable local source ─────────────────────
99
+ console.log("\n=== resolvePeerRoot (unreachable local) ===");
100
+ const unreachable = resolvePeerRoot({
101
+ name: "missing",
102
+ source: { type: "local", path: "../does-not-exist" },
103
+ }, BILLING);
104
+ assert("unreachable peer not reachable", !unreachable.reachable);
105
+ assert("unreachable peer has reason", typeof unreachable.reason === "string");
106
+ // ── End-to-end: loadDomainModel from billing hydrates ordering peer ──
107
+ console.log("\n=== loadDomainModel with federation ===");
108
+ const model = loadDomainModel({ root: BILLING });
109
+ assert("model.service is billing", model.service?.name === "billing");
110
+ assert("model.peers exists", model.peers !== undefined);
111
+ assert("model.peers has ordering", model.peers?.has("ordering") === true);
112
+ const peer = model.peers?.get("ordering");
113
+ assert("peer has service identity", peer?.service?.name === "ordering");
114
+ assert("peer has ordering context", peer?.contexts.has("ordering") === true);
115
+ assert("peer has OrderPlaced event", (peer?.contexts.get("ordering")?.events ?? []).some((e) => e.name === "OrderPlaced"));
116
+ // ── One level deep: peer.peers stays undefined ────────────────────────
117
+ console.log("\n=== peer-of-peer not followed ===");
118
+ assert("peer.peers is undefined (no transitive)", peer?.peers === undefined);
119
+ // ── Env override redirects peer to a different path ──────────────────
120
+ console.log("\n=== env override ===");
121
+ const envKey = peerEnvKey("ordering");
122
+ assert("env key formatted correctly", envKey === "DKK_PEER_ORDERING");
123
+ const originalEnv = process.env[envKey];
124
+ process.env[envKey] = ALT_ORDER;
125
+ try {
126
+ const altModel = loadDomainModel({ root: BILLING });
127
+ const altPeer = altModel.peers?.get("ordering");
128
+ assert("env override points peer at alt-order-svc", (altPeer?.contexts.get("ordering")?.events ?? []).some((e) => e.name === "OrderShipped"));
129
+ assert("env override drops OrderPlaced (different repo)", !(altPeer?.contexts.get("ordering")?.events ?? []).some((e) => e.name === "OrderPlaced"));
130
+ }
131
+ finally {
132
+ if (originalEnv === undefined)
133
+ delete process.env[envKey];
134
+ else
135
+ process.env[envKey] = originalEnv;
136
+ }
137
+ }
138
+ finally {
139
+ rmSync(RAW_TMP, { recursive: true, force: true });
140
+ }
141
+ console.log(`\n${passed} passed, ${failed} failed`);
142
+ if (failed > 0)
143
+ process.exit(1);
144
+ //# sourceMappingURL=loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../../src/features/federation/tests/loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase5.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase5.test.d.ts","sourceRoot":"","sources":["../../../../src/features/federation/tests/phase5.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Phase 5 integration tests — federated indexer, searcher, graph, and
3
+ * `dkk consumers`.
4
+ *
5
+ * Builds a two-repo fixture, then verifies:
6
+ * - Indexer namespaces peer rows with `<service>:` prefix.
7
+ * - Search returns peer hits with the `service` field populated.
8
+ * - Search `service` filter narrows correctly.
9
+ * - Graph contains both local and peer nodes, with peer node ids
10
+ * prefixed.
11
+ * - Local policy with `when.events: ['ordering:ordering.OrderPlaced']`
12
+ * produces a cross-service edge that BFS can traverse.
13
+ * - `findConsumers` walks peers correctly.
14
+ */
15
+ import { mkdirSync, writeFileSync, rmSync, realpathSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { tmpdir } from "node:os";
18
+ import { loadDomainModel } from "../../../shared/loader.js";
19
+ import { DomainGraph } from "../../../shared/graph.js";
20
+ import { buildIndex } from "../../pipeline/indexer.js";
21
+ import { search } from "../../query/searcher.js";
22
+ // Importing from consumers.js transitively registers the federation
23
+ // peer-hydration hook (via its side-effect import of ../loader.js).
24
+ import { findConsumers } from "../commands/consumers.js";
25
+ let passed = 0;
26
+ let failed = 0;
27
+ function assert(label, condition, detail) {
28
+ if (condition) {
29
+ console.log(` OK: ${label}`);
30
+ passed++;
31
+ }
32
+ else {
33
+ console.error(`FAIL: ${label}${detail ? ` — ${detail}` : ""}`);
34
+ failed++;
35
+ }
36
+ }
37
+ const RAW_TMP = join(tmpdir(), `dkk-p5-${Date.now()}`);
38
+ mkdirSync(RAW_TMP, { recursive: true });
39
+ const TMP = realpathSync(RAW_TMP);
40
+ const ORDER = join(TMP, "order-svc");
41
+ const BILLING = join(TMP, "billing-svc");
42
+ // ── Fixture: order-svc (peer) ───────────────────────────────────────────
43
+ mkdirSync(join(ORDER, ".dkk", "domain", "contexts", "ordering", "events"), { recursive: true });
44
+ mkdirSync(join(ORDER, ".dkk", "domain", "contexts", "ordering", "aggregates"), { recursive: true });
45
+ mkdirSync(join(ORDER, ".dkk", "adr"), { recursive: true });
46
+ writeFileSync(join(ORDER, ".dkk", "service.yml"), "name: ordering\nexports:\n - ordering\n");
47
+ writeFileSync(join(ORDER, ".dkk", "domain", "index.yml"), "contexts:\n - name: ordering\n description: Orders\nflows: []\n");
48
+ writeFileSync(join(ORDER, ".dkk", "domain", "actors.yml"), "actors: []\n");
49
+ writeFileSync(join(ORDER, ".dkk", "domain", "contexts", "ordering", "context.yml"), "name: ordering\ndescription: Ordering context\n");
50
+ writeFileSync(join(ORDER, ".dkk", "domain", "contexts", "ordering", "events", "OrderPlaced.yml"), "name: OrderPlaced\ndescription: Order is placed for processing.\nraised_by: Order\n");
51
+ writeFileSync(join(ORDER, ".dkk", "domain", "contexts", "ordering", "aggregates", "Order.yml"), "name: Order\ndescription: Order aggregate.\nemits:\n events:\n - OrderPlaced\n");
52
+ // ── Fixture: billing-svc (local) with a policy that subscribes to peer event ───
53
+ mkdirSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "policies"), { recursive: true });
54
+ mkdirSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "commands"), { recursive: true });
55
+ mkdirSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "aggregates"), { recursive: true });
56
+ mkdirSync(join(BILLING, ".dkk", "adr"), { recursive: true });
57
+ writeFileSync(join(BILLING, ".dkk", "service.yml"), "name: billing\nexports:\n - billing\n");
58
+ writeFileSync(join(BILLING, ".dkk", "domain", "index.yml"), "contexts:\n - name: billing\n description: Billing\nflows: []\n");
59
+ writeFileSync(join(BILLING, ".dkk", "domain", "actors.yml"), "actors: []\n");
60
+ writeFileSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "context.yml"), "name: billing\ndescription: Billing context\n");
61
+ writeFileSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "commands", "IssueInvoice.yml"), "name: IssueInvoice\ndescription: Issue an invoice.\nhandled_by: Invoice\n");
62
+ writeFileSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "aggregates", "Invoice.yml"), "name: Invoice\ndescription: Invoice aggregate.\nhandles:\n commands:\n - IssueInvoice\n");
63
+ writeFileSync(join(BILLING, ".dkk", "domain", "contexts", "billing", "policies", "InitiateInvoice.yml"), [
64
+ "name: InitiateInvoice",
65
+ "description: Issue an invoice when an order is placed.",
66
+ "when:",
67
+ " events:",
68
+ " - ordering:ordering.OrderPlaced",
69
+ "then:",
70
+ " commands:",
71
+ " - IssueInvoice",
72
+ ].join("\n"));
73
+ writeFileSync(join(BILLING, ".dkk", "federation.yml"), [
74
+ "peers:",
75
+ " - name: ordering",
76
+ " source:",
77
+ " type: local",
78
+ " path: ../order-svc",
79
+ ].join("\n") + "\n");
80
+ try {
81
+ const model = loadDomainModel({ root: BILLING });
82
+ // ── Indexer namespaces peer rows ─────────────────────────────────────
83
+ console.log("\n=== indexer namespaces peer rows ===");
84
+ const dbPath = buildIndex(model, { root: BILLING });
85
+ assert("index.db built", typeof dbPath === "string" && dbPath.length > 0);
86
+ const local = search("OrderPlaced", {}, { root: BILLING });
87
+ assert("search finds OrderPlaced", local.length > 0);
88
+ const peerHit = local.find((r) => r.id === "ordering:ordering.OrderPlaced");
89
+ assert("peer row has service-prefixed id", peerHit !== undefined);
90
+ assert("peer row carries service field", peerHit?.service === "ordering");
91
+ assert("peer row has ordering context", peerHit?.context === "ordering");
92
+ const localHit = local.find((r) => r.id === "billing.InitiateInvoice");
93
+ // (May or may not match depending on FTS tokenization of "OrderPlaced".)
94
+ // What matters is that the peer-prefixed and local rows don't collide.
95
+ assert("local + peer ids are disjoint", !local.some((r, i) => local.findIndex((other) => other.id === r.id && local.indexOf(r) !== i) >= 0));
96
+ void localHit;
97
+ // ── service filter narrows correctly ─────────────────────────────────
98
+ console.log("\n=== search service filter ===");
99
+ const onlyOrdering = search("OrderPlaced", { service: "ordering" }, { root: BILLING });
100
+ assert("service: ordering filter narrows to ordering rows", onlyOrdering.every((r) => r.service === "ordering"));
101
+ assert("service filter returns at least one row", onlyOrdering.length > 0);
102
+ const onlyBilling = search("Invoice", { service: "billing" }, { root: BILLING });
103
+ assert("service: billing filter narrows to billing rows", onlyBilling.every((r) => r.service === "billing"));
104
+ // ── graph contains both namespaces with cross-service edge ───────────
105
+ console.log("\n=== graph cross-service edge ===");
106
+ const graph = DomainGraph.from(model);
107
+ const localPolicyId = "billing.InitiateInvoice";
108
+ const peerEventId = "ordering:ordering.OrderPlaced";
109
+ assert("local policy node exists", graph.nodes.has(localPolicyId));
110
+ assert("peer event node exists with prefix", graph.nodes.has(peerEventId));
111
+ const fromPolicy = graph.getRelated(localPolicyId, 1);
112
+ assert("BFS from local policy reaches peer event in one hop", fromPolicy.has(peerEventId));
113
+ // ── findConsumers — reverse lookup from order-svc's perspective ──────
114
+ console.log("\n=== consumers reverse lookup ===");
115
+ // Build a federation manifest in order-svc that points back at
116
+ // billing-svc, so order-svc can ask "who consumes my OrderPlaced?".
117
+ writeFileSync(join(ORDER, ".dkk", "federation.yml"), [
118
+ "peers:",
119
+ " - name: billing",
120
+ " source:",
121
+ " type: local",
122
+ " path: ../billing-svc",
123
+ ].join("\n") + "\n");
124
+ const orderModel = loadDomainModel({ root: ORDER });
125
+ const consumers = findConsumers(orderModel, "ordering.OrderPlaced", orderModel.service?.name);
126
+ assert("at least one consumer found", consumers.length > 0);
127
+ assert("consumer is billing.InitiateInvoice via when.events", consumers.some((c) => c.service === "billing" &&
128
+ c.relation === "when.events" &&
129
+ c.source === "billing:billing.InitiateInvoice"));
130
+ }
131
+ finally {
132
+ rmSync(RAW_TMP, { recursive: true, force: true });
133
+ }
134
+ console.log(`\n${passed} passed, ${failed} failed`);
135
+ if (failed > 0)
136
+ process.exit(1);
137
+ //# sourceMappingURL=phase5.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase5.test.js","sourceRoot":"","sources":["../../../../src/features/federation/tests/phase5.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema-load.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-load.test.d.ts","sourceRoot":"","sources":["../../../../src/features/federation/tests/schema-load.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Schema-at-load tests — `.dkk/service.yml` and `.dkk/federation.yml`
3
+ * are now validated against their JSON schemas when read, so malformed
4
+ * manifests produce a clean error up front rather than crashing later
5
+ * in the pipeline.
6
+ */
7
+ import { mkdirSync, writeFileSync, rmSync, realpathSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { tmpdir } from "node:os";
10
+ import { loadServiceId } from "../../../shared/service-id.js";
11
+ import { loadFederation } from "../loader.js";
12
+ let passed = 0;
13
+ let failed = 0;
14
+ function assert(label, condition, detail) {
15
+ if (condition) {
16
+ console.log(` OK: ${label}`);
17
+ passed++;
18
+ }
19
+ else {
20
+ console.error(`FAIL: ${label}${detail ? ` — ${detail}` : ""}`);
21
+ failed++;
22
+ }
23
+ }
24
+ function assertThrows(label, fn, match) {
25
+ try {
26
+ fn();
27
+ console.error(`FAIL: ${label} — expected throw, got success`);
28
+ failed++;
29
+ }
30
+ catch (err) {
31
+ const msg = err instanceof Error ? err.message : String(err);
32
+ if (match.test(msg)) {
33
+ console.log(` OK: ${label}`);
34
+ passed++;
35
+ }
36
+ else {
37
+ console.error(`FAIL: ${label} — error did not match: ${msg}`);
38
+ failed++;
39
+ }
40
+ }
41
+ }
42
+ const RAW_TMP = join(tmpdir(), `dkk-schema-load-${Date.now()}`);
43
+ mkdirSync(RAW_TMP, { recursive: true });
44
+ const TMP = realpathSync(RAW_TMP);
45
+ const ROOT = join(TMP, "repo");
46
+ mkdirSync(join(ROOT, ".dkk"), { recursive: true });
47
+ try {
48
+ // ── service.yml: valid manifests load ────────────────────────────────
49
+ console.log("\n=== service.yml: valid ===");
50
+ writeFileSync(join(ROOT, ".dkk", "service.yml"), "name: billing\nexports:\n - billing\n");
51
+ const ok = loadServiceId(ROOT);
52
+ assert("valid manifest loads", ok?.name === "billing");
53
+ // ── service.yml: PascalCase name rejected ────────────────────────────
54
+ console.log("\n=== service.yml: invalid name ===");
55
+ writeFileSync(join(ROOT, ".dkk", "service.yml"), "name: Billing\nexports:\n - billing\n");
56
+ assertThrows("PascalCase service name rejected", () => loadServiceId(ROOT), /Invalid.*service\.yml/);
57
+ // ── service.yml: missing required field ──────────────────────────────
58
+ console.log("\n=== service.yml: missing exports ===");
59
+ writeFileSync(join(ROOT, ".dkk", "service.yml"), "name: billing\n");
60
+ assertThrows("missing exports rejected", () => loadServiceId(ROOT), /exports/);
61
+ // ── service.yml: unknown property rejected ───────────────────────────
62
+ console.log("\n=== service.yml: unknown property ===");
63
+ writeFileSync(join(ROOT, ".dkk", "service.yml"), "name: billing\nexports:\n - billing\nrogue: true\n");
64
+ assertThrows("unknown property rejected", () => loadServiceId(ROOT), /additional/i);
65
+ // Restore a valid service.yml for federation tests.
66
+ writeFileSync(join(ROOT, ".dkk", "service.yml"), "name: billing\nexports:\n - billing\n");
67
+ // ── federation.yml: valid local peer ─────────────────────────────────
68
+ console.log("\n=== federation.yml: valid local ===");
69
+ writeFileSync(join(ROOT, ".dkk", "federation.yml"), "peers:\n - name: ordering\n source:\n type: local\n path: ../order-svc\n");
70
+ const fed = loadFederation(ROOT);
71
+ assert("valid local peer loads", fed?.peers[0].name === "ordering");
72
+ // ── federation.yml: missing source ───────────────────────────────────
73
+ console.log("\n=== federation.yml: missing source ===");
74
+ writeFileSync(join(ROOT, ".dkk", "federation.yml"), "peers:\n - name: ordering\n");
75
+ assertThrows("missing source rejected", () => loadFederation(ROOT), /Invalid.*federation\.yml/);
76
+ // ── federation.yml: invalid source type ──────────────────────────────
77
+ console.log("\n=== federation.yml: bogus source type ===");
78
+ writeFileSync(join(ROOT, ".dkk", "federation.yml"), "peers:\n - name: ordering\n source:\n type: ftp\n path: x\n");
79
+ assertThrows("invalid source type rejected", () => loadFederation(ROOT), /Invalid.*federation\.yml/);
80
+ // ── federation.yml: git source missing branch ────────────────────────
81
+ console.log("\n=== federation.yml: git missing branch ===");
82
+ writeFileSync(join(ROOT, ".dkk", "federation.yml"), "peers:\n - name: ordering\n source:\n type: git\n url: https://example.com/repo.git\n");
83
+ assertThrows("git without branch rejected", () => loadFederation(ROOT), /branch/);
84
+ // ── No manifest = null (no error) ────────────────────────────────────
85
+ console.log("\n=== absent manifest returns null ===");
86
+ rmSync(join(ROOT, ".dkk", "service.yml"));
87
+ rmSync(join(ROOT, ".dkk", "federation.yml"));
88
+ assert("loadServiceId returns null when absent", loadServiceId(ROOT) === null);
89
+ assert("loadFederation returns null when absent", loadFederation(ROOT) === null);
90
+ }
91
+ finally {
92
+ rmSync(RAW_TMP, { recursive: true, force: true });
93
+ }
94
+ console.log(`\n${passed} passed, ${failed} failed`);
95
+ if (failed > 0)
96
+ process.exit(1);
97
+ //# sourceMappingURL=schema-load.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-load.test.js","sourceRoot":"","sources":["../../../../src/features/federation/tests/schema-load.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import "../loader.js";
2
+ //# sourceMappingURL=validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.test.d.ts","sourceRoot":"","sources":["../../../../src/features/federation/tests/validator.test.ts"],"names":[],"mappings":"AAsBA,OAAO,cAAc,CAAC"}