@principled/cairn 1.0.0-beta

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 (313) hide show
  1. package/README.md +182 -0
  2. package/dist/analysis/analyzer.d.ts +13 -0
  3. package/dist/analysis/analyzer.d.ts.map +1 -0
  4. package/dist/analysis/analyzer.js +47 -0
  5. package/dist/analysis/analyzer.js.map +1 -0
  6. package/dist/analysis/embedding-provider.d.ts +12 -0
  7. package/dist/analysis/embedding-provider.d.ts.map +1 -0
  8. package/dist/analysis/embedding-provider.js +21 -0
  9. package/dist/analysis/embedding-provider.js.map +1 -0
  10. package/dist/analysis/index.d.ts +4 -0
  11. package/dist/analysis/index.d.ts.map +1 -0
  12. package/dist/analysis/index.js +4 -0
  13. package/dist/analysis/index.js.map +1 -0
  14. package/dist/analysis/stub-provider.d.ts +12 -0
  15. package/dist/analysis/stub-provider.d.ts.map +1 -0
  16. package/dist/analysis/stub-provider.js +30 -0
  17. package/dist/analysis/stub-provider.js.map +1 -0
  18. package/dist/catalog/catalog.d.ts +40 -0
  19. package/dist/catalog/catalog.d.ts.map +1 -0
  20. package/dist/catalog/catalog.js +118 -0
  21. package/dist/catalog/catalog.js.map +1 -0
  22. package/dist/catalog/category-merger.d.ts +25 -0
  23. package/dist/catalog/category-merger.d.ts.map +1 -0
  24. package/dist/catalog/category-merger.js +75 -0
  25. package/dist/catalog/category-merger.js.map +1 -0
  26. package/dist/catalog/index.d.ts +4 -0
  27. package/dist/catalog/index.d.ts.map +1 -0
  28. package/dist/catalog/index.js +4 -0
  29. package/dist/catalog/index.js.map +1 -0
  30. package/dist/catalog/post-merge-validation.d.ts +7 -0
  31. package/dist/catalog/post-merge-validation.d.ts.map +1 -0
  32. package/dist/catalog/post-merge-validation.js +59 -0
  33. package/dist/catalog/post-merge-validation.js.map +1 -0
  34. package/dist/cli/commands/add.d.ts +3 -0
  35. package/dist/cli/commands/add.d.ts.map +1 -0
  36. package/dist/cli/commands/add.js +107 -0
  37. package/dist/cli/commands/add.js.map +1 -0
  38. package/dist/cli/commands/analyze.d.ts +3 -0
  39. package/dist/cli/commands/analyze.d.ts.map +1 -0
  40. package/dist/cli/commands/analyze.js +44 -0
  41. package/dist/cli/commands/analyze.js.map +1 -0
  42. package/dist/cli/commands/diff.d.ts +3 -0
  43. package/dist/cli/commands/diff.d.ts.map +1 -0
  44. package/dist/cli/commands/diff.js +69 -0
  45. package/dist/cli/commands/diff.js.map +1 -0
  46. package/dist/cli/commands/edit.d.ts +3 -0
  47. package/dist/cli/commands/edit.d.ts.map +1 -0
  48. package/dist/cli/commands/edit.js +93 -0
  49. package/dist/cli/commands/edit.js.map +1 -0
  50. package/dist/cli/commands/export.d.ts +3 -0
  51. package/dist/cli/commands/export.d.ts.map +1 -0
  52. package/dist/cli/commands/export.js +46 -0
  53. package/dist/cli/commands/export.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +3 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -0
  56. package/dist/cli/commands/init.js +21 -0
  57. package/dist/cli/commands/init.js.map +1 -0
  58. package/dist/cli/commands/inspect.d.ts +3 -0
  59. package/dist/cli/commands/inspect.d.ts.map +1 -0
  60. package/dist/cli/commands/inspect.js +153 -0
  61. package/dist/cli/commands/inspect.js.map +1 -0
  62. package/dist/cli/commands/query.d.ts +3 -0
  63. package/dist/cli/commands/query.d.ts.map +1 -0
  64. package/dist/cli/commands/query.js +77 -0
  65. package/dist/cli/commands/query.js.map +1 -0
  66. package/dist/cli/commands/review.d.ts +3 -0
  67. package/dist/cli/commands/review.d.ts.map +1 -0
  68. package/dist/cli/commands/review.js +118 -0
  69. package/dist/cli/commands/review.js.map +1 -0
  70. package/dist/cli/commands/validate.d.ts +3 -0
  71. package/dist/cli/commands/validate.d.ts.map +1 -0
  72. package/dist/cli/commands/validate.js +125 -0
  73. package/dist/cli/commands/validate.js.map +1 -0
  74. package/dist/cli/helpers.d.ts +24 -0
  75. package/dist/cli/helpers.d.ts.map +1 -0
  76. package/dist/cli/helpers.js +152 -0
  77. package/dist/cli/helpers.js.map +1 -0
  78. package/dist/cli/index.d.ts +3 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +34 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/config/index.d.ts +5 -0
  83. package/dist/config/index.d.ts.map +1 -0
  84. package/dist/config/index.js +3 -0
  85. package/dist/config/index.js.map +1 -0
  86. package/dist/config/loader.d.ts +45 -0
  87. package/dist/config/loader.d.ts.map +1 -0
  88. package/dist/config/loader.js +201 -0
  89. package/dist/config/loader.js.map +1 -0
  90. package/dist/config/schema.d.ts +37 -0
  91. package/dist/config/schema.d.ts.map +1 -0
  92. package/dist/config/schema.js +42 -0
  93. package/dist/config/schema.js.map +1 -0
  94. package/dist/data/data/defaults.yaml +101 -0
  95. package/dist/data/defaults.yaml +101 -0
  96. package/dist/errors.d.ts +45 -0
  97. package/dist/errors.d.ts.map +1 -0
  98. package/dist/errors.js +84 -0
  99. package/dist/errors.js.map +1 -0
  100. package/dist/exporters/base.d.ts +17 -0
  101. package/dist/exporters/base.d.ts.map +1 -0
  102. package/dist/exporters/base.js +7 -0
  103. package/dist/exporters/base.js.map +1 -0
  104. package/dist/exporters/csv-exporter.d.ts +13 -0
  105. package/dist/exporters/csv-exporter.d.ts.map +1 -0
  106. package/dist/exporters/csv-exporter.js +73 -0
  107. package/dist/exporters/csv-exporter.js.map +1 -0
  108. package/dist/exporters/dot-exporter.d.ts +12 -0
  109. package/dist/exporters/dot-exporter.d.ts.map +1 -0
  110. package/dist/exporters/dot-exporter.js +72 -0
  111. package/dist/exporters/dot-exporter.js.map +1 -0
  112. package/dist/exporters/index.d.ts +8 -0
  113. package/dist/exporters/index.d.ts.map +1 -0
  114. package/dist/exporters/index.js +8 -0
  115. package/dist/exporters/index.js.map +1 -0
  116. package/dist/exporters/json-exporter.d.ts +14 -0
  117. package/dist/exporters/json-exporter.d.ts.map +1 -0
  118. package/dist/exporters/json-exporter.js +41 -0
  119. package/dist/exporters/json-exporter.js.map +1 -0
  120. package/dist/exporters/markdown-exporter.d.ts +14 -0
  121. package/dist/exporters/markdown-exporter.d.ts.map +1 -0
  122. package/dist/exporters/markdown-exporter.js +65 -0
  123. package/dist/exporters/markdown-exporter.js.map +1 -0
  124. package/dist/exporters/registry.d.ts +4 -0
  125. package/dist/exporters/registry.d.ts.map +1 -0
  126. package/dist/exporters/registry.js +20 -0
  127. package/dist/exporters/registry.js.map +1 -0
  128. package/dist/exporters/sqlite-exporter.d.ts +10 -0
  129. package/dist/exporters/sqlite-exporter.d.ts.map +1 -0
  130. package/dist/exporters/sqlite-exporter.js +20 -0
  131. package/dist/exporters/sqlite-exporter.js.map +1 -0
  132. package/dist/index.d.ts +13 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +14 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/inheritance/alias-resolver.d.ts +21 -0
  137. package/dist/inheritance/alias-resolver.d.ts.map +1 -0
  138. package/dist/inheritance/alias-resolver.js +40 -0
  139. package/dist/inheritance/alias-resolver.js.map +1 -0
  140. package/dist/inheritance/index.d.ts +9 -0
  141. package/dist/inheritance/index.d.ts.map +1 -0
  142. package/dist/inheritance/index.js +5 -0
  143. package/dist/inheritance/index.js.map +1 -0
  144. package/dist/inheritance/inheritance-resolver.d.ts +37 -0
  145. package/dist/inheritance/inheritance-resolver.d.ts.map +1 -0
  146. package/dist/inheritance/inheritance-resolver.js +164 -0
  147. package/dist/inheritance/inheritance-resolver.js.map +1 -0
  148. package/dist/inheritance/reference-parser.d.ts +27 -0
  149. package/dist/inheritance/reference-parser.d.ts.map +1 -0
  150. package/dist/inheritance/reference-parser.js +74 -0
  151. package/dist/inheritance/reference-parser.js.map +1 -0
  152. package/dist/inheritance/source-resolver.d.ts +29 -0
  153. package/dist/inheritance/source-resolver.d.ts.map +1 -0
  154. package/dist/inheritance/source-resolver.js +87 -0
  155. package/dist/inheritance/source-resolver.js.map +1 -0
  156. package/dist/model/category-registry.d.ts +48 -0
  157. package/dist/model/category-registry.d.ts.map +1 -0
  158. package/dist/model/category-registry.js +83 -0
  159. package/dist/model/category-registry.js.map +1 -0
  160. package/dist/model/document-meta.d.ts +38 -0
  161. package/dist/model/document-meta.d.ts.map +1 -0
  162. package/dist/model/document-meta.js +62 -0
  163. package/dist/model/document-meta.js.map +1 -0
  164. package/dist/model/document-parser.d.ts +17 -0
  165. package/dist/model/document-parser.d.ts.map +1 -0
  166. package/dist/model/document-parser.js +66 -0
  167. package/dist/model/document-parser.js.map +1 -0
  168. package/dist/model/document.d.ts +27 -0
  169. package/dist/model/document.d.ts.map +1 -0
  170. package/dist/model/document.js +42 -0
  171. package/dist/model/document.js.map +1 -0
  172. package/dist/model/element.d.ts +51 -0
  173. package/dist/model/element.d.ts.map +1 -0
  174. package/dist/model/element.js +78 -0
  175. package/dist/model/element.js.map +1 -0
  176. package/dist/model/graph.d.ts +42 -0
  177. package/dist/model/graph.d.ts.map +1 -0
  178. package/dist/model/graph.js +177 -0
  179. package/dist/model/graph.js.map +1 -0
  180. package/dist/model/index.d.ts +8 -0
  181. package/dist/model/index.d.ts.map +1 -0
  182. package/dist/model/index.js +7 -0
  183. package/dist/model/index.js.map +1 -0
  184. package/dist/parsers/base.d.ts +28 -0
  185. package/dist/parsers/base.d.ts.map +1 -0
  186. package/dist/parsers/base.js +19 -0
  187. package/dist/parsers/base.js.map +1 -0
  188. package/dist/parsers/index.d.ts +6 -0
  189. package/dist/parsers/index.d.ts.map +1 -0
  190. package/dist/parsers/index.js +6 -0
  191. package/dist/parsers/index.js.map +1 -0
  192. package/dist/parsers/markdown-parser.d.ts +12 -0
  193. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  194. package/dist/parsers/markdown-parser.js +37 -0
  195. package/dist/parsers/markdown-parser.js.map +1 -0
  196. package/dist/parsers/registry.d.ts +11 -0
  197. package/dist/parsers/registry.d.ts.map +1 -0
  198. package/dist/parsers/registry.js +21 -0
  199. package/dist/parsers/registry.js.map +1 -0
  200. package/dist/parsers/typescript-parser.d.ts +12 -0
  201. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  202. package/dist/parsers/typescript-parser.js +74 -0
  203. package/dist/parsers/typescript-parser.js.map +1 -0
  204. package/dist/parsers/yaml-parser.d.ts +12 -0
  205. package/dist/parsers/yaml-parser.d.ts.map +1 -0
  206. package/dist/parsers/yaml-parser.js +30 -0
  207. package/dist/parsers/yaml-parser.js.map +1 -0
  208. package/dist/provenance/index.d.ts +5 -0
  209. package/dist/provenance/index.d.ts.map +1 -0
  210. package/dist/provenance/index.js +4 -0
  211. package/dist/provenance/index.js.map +1 -0
  212. package/dist/provenance/review-hash.d.ts +11 -0
  213. package/dist/provenance/review-hash.d.ts.map +1 -0
  214. package/dist/provenance/review-hash.js +18 -0
  215. package/dist/provenance/review-hash.js.map +1 -0
  216. package/dist/provenance/schemas.d.ts +36 -0
  217. package/dist/provenance/schemas.d.ts.map +1 -0
  218. package/dist/provenance/schemas.js +26 -0
  219. package/dist/provenance/schemas.js.map +1 -0
  220. package/dist/provenance/staleness.d.ts +12 -0
  221. package/dist/provenance/staleness.d.ts.map +1 -0
  222. package/dist/provenance/staleness.js +46 -0
  223. package/dist/provenance/staleness.js.map +1 -0
  224. package/dist/refs/git-diff-tracer.d.ts +35 -0
  225. package/dist/refs/git-diff-tracer.d.ts.map +1 -0
  226. package/dist/refs/git-diff-tracer.js +143 -0
  227. package/dist/refs/git-diff-tracer.js.map +1 -0
  228. package/dist/schema/build-schema.d.ts +15 -0
  229. package/dist/schema/build-schema.d.ts.map +1 -0
  230. package/dist/schema/build-schema.js +83 -0
  231. package/dist/schema/build-schema.js.map +1 -0
  232. package/dist/schema/category-definition.d.ts +41 -0
  233. package/dist/schema/category-definition.d.ts.map +1 -0
  234. package/dist/schema/category-definition.js +22 -0
  235. package/dist/schema/category-definition.js.map +1 -0
  236. package/dist/schema/combined-schema.d.ts +17 -0
  237. package/dist/schema/combined-schema.d.ts.map +1 -0
  238. package/dist/schema/combined-schema.js +23 -0
  239. package/dist/schema/combined-schema.js.map +1 -0
  240. package/dist/schema/datetime.d.ts +11 -0
  241. package/dist/schema/datetime.d.ts.map +1 -0
  242. package/dist/schema/datetime.js +81 -0
  243. package/dist/schema/datetime.js.map +1 -0
  244. package/dist/schema/defaults-loader.d.ts +21 -0
  245. package/dist/schema/defaults-loader.d.ts.map +1 -0
  246. package/dist/schema/defaults-loader.js +55 -0
  247. package/dist/schema/defaults-loader.js.map +1 -0
  248. package/dist/schema/field-schema.d.ts +23 -0
  249. package/dist/schema/field-schema.d.ts.map +1 -0
  250. package/dist/schema/field-schema.js +18 -0
  251. package/dist/schema/field-schema.js.map +1 -0
  252. package/dist/schema/index.d.ts +17 -0
  253. package/dist/schema/index.d.ts.map +1 -0
  254. package/dist/schema/index.js +17 -0
  255. package/dist/schema/index.js.map +1 -0
  256. package/dist/schema/reserved-fields.d.ts +32 -0
  257. package/dist/schema/reserved-fields.d.ts.map +1 -0
  258. package/dist/schema/reserved-fields.js +42 -0
  259. package/dist/schema/reserved-fields.js.map +1 -0
  260. package/dist/schema/types.d.ts +7 -0
  261. package/dist/schema/types.d.ts.map +1 -0
  262. package/dist/schema/types.js +9 -0
  263. package/dist/schema/types.js.map +1 -0
  264. package/dist/utils/logger.d.ts +7 -0
  265. package/dist/utils/logger.d.ts.map +1 -0
  266. package/dist/utils/logger.js +16 -0
  267. package/dist/utils/logger.js.map +1 -0
  268. package/dist/utils/project-root.d.ts +14 -0
  269. package/dist/utils/project-root.d.ts.map +1 -0
  270. package/dist/utils/project-root.js +48 -0
  271. package/dist/utils/project-root.js.map +1 -0
  272. package/dist/validation/diagnostic.d.ts +23 -0
  273. package/dist/validation/diagnostic.d.ts.map +1 -0
  274. package/dist/validation/diagnostic.js +5 -0
  275. package/dist/validation/diagnostic.js.map +1 -0
  276. package/dist/validation/index.d.ts +6 -0
  277. package/dist/validation/index.d.ts.map +1 -0
  278. package/dist/validation/index.js +4 -0
  279. package/dist/validation/index.js.map +1 -0
  280. package/dist/validation/passes/coverage-pass.d.ts +10 -0
  281. package/dist/validation/passes/coverage-pass.d.ts.map +1 -0
  282. package/dist/validation/passes/coverage-pass.js +99 -0
  283. package/dist/validation/passes/coverage-pass.js.map +1 -0
  284. package/dist/validation/passes/index.d.ts +6 -0
  285. package/dist/validation/passes/index.d.ts.map +1 -0
  286. package/dist/validation/passes/index.js +19 -0
  287. package/dist/validation/passes/index.js.map +1 -0
  288. package/dist/validation/passes/schema-pass.d.ts +12 -0
  289. package/dist/validation/passes/schema-pass.d.ts.map +1 -0
  290. package/dist/validation/passes/schema-pass.js +38 -0
  291. package/dist/validation/passes/schema-pass.js.map +1 -0
  292. package/dist/validation/passes/semantic-pass.d.ts +8 -0
  293. package/dist/validation/passes/semantic-pass.d.ts.map +1 -0
  294. package/dist/validation/passes/semantic-pass.js +126 -0
  295. package/dist/validation/passes/semantic-pass.js.map +1 -0
  296. package/dist/validation/passes/structural-pass.d.ts +8 -0
  297. package/dist/validation/passes/structural-pass.d.ts.map +1 -0
  298. package/dist/validation/passes/structural-pass.js +150 -0
  299. package/dist/validation/passes/structural-pass.js.map +1 -0
  300. package/dist/validation/passes/traceability-pass.d.ts +9 -0
  301. package/dist/validation/passes/traceability-pass.d.ts.map +1 -0
  302. package/dist/validation/passes/traceability-pass.js +87 -0
  303. package/dist/validation/passes/traceability-pass.js.map +1 -0
  304. package/dist/validation/passes/user-rules-pass.d.ts +9 -0
  305. package/dist/validation/passes/user-rules-pass.d.ts.map +1 -0
  306. package/dist/validation/passes/user-rules-pass.js +72 -0
  307. package/dist/validation/passes/user-rules-pass.js.map +1 -0
  308. package/dist/validation/runner.d.ts +17 -0
  309. package/dist/validation/runner.d.ts.map +1 -0
  310. package/dist/validation/runner.js +33 -0
  311. package/dist/validation/runner.js.map +1 -0
  312. package/package.json +43 -0
  313. package/src/data/defaults.yaml +101 -0
package/README.md ADDED
@@ -0,0 +1,182 @@
1
+ # Cairn — Goals, Values, and Principles
2
+
3
+ A decision traceability framework. Define your goals, values, and principles in YAML. Trace every decision back to what drives it. Link decisions to the code, documents, and artifacts they produce.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @principled/cairn
9
+ ```
10
+
11
+ > **Note:** `gvp` is available as an alias for `cairn`.
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # Initialize a GVP library
17
+ mkdir -p .gvp/library
18
+ cat > .gvp/library/project.yaml << 'EOF'
19
+ meta:
20
+ name: my-project
21
+ scope: project
22
+
23
+ goals:
24
+ - id: G1
25
+ name: Ship reliable software
26
+ statement: Deliver software that works correctly.
27
+ tags: []
28
+ maps_to: []
29
+
30
+ values:
31
+ - id: V1
32
+ name: Simplicity
33
+ statement: Complexity must earn its place.
34
+ tags: []
35
+ maps_to: [my-project:G1]
36
+
37
+ decisions:
38
+ - id: D1
39
+ name: Use TypeScript
40
+ rationale: Type safety and npm ecosystem.
41
+ tags: []
42
+ maps_to: [my-project:G1, my-project:V1]
43
+ refs:
44
+ - file: src/index.ts
45
+ identifier: main
46
+ role: implements
47
+ EOF
48
+
49
+ # Validate
50
+ cairn validate
51
+
52
+ # Export
53
+ cairn export --format json
54
+ cairn export --format markdown
55
+ ```
56
+
57
+ ## Commands
58
+
59
+ | Command | Description |
60
+ |---------|-------------|
61
+ | `cairn validate` | Validate the GVP library |
62
+ | `cairn validate --coverage` | Include coverage checks (orphan identifiers, decisions without refs) |
63
+ | `cairn validate --scope staged` | Scope validation to staged git changes |
64
+ | `cairn export --format <fmt>` | Export catalog to json, csv, markdown, or dot |
65
+ | `cairn add <category> <name>` | Add a new element with auto-assigned ID |
66
+ | `cairn edit <element> --field key=value` | Modify an existing element |
67
+ | `cairn review` | Find stale elements needing review |
68
+ | `cairn review <element>` | Review a specific element |
69
+ | `cairn inspect <element>` | View element details |
70
+ | `cairn inspect <element> --trace` | Trace element to its goals and values |
71
+ | `cairn inspect --ref file::identifier --trace` | "Why does this code exist?" |
72
+ | `cairn query --category decision` | Filter elements by category, tag, status |
73
+ | `cairn query --refs-file src/foo.ts` | Find elements referencing a file |
74
+ | `cairn diff <commitA> <commitB>` | Trace code changes back to decisions |
75
+ | `cairn analyze` | Detect unmapped relationships via similarity |
76
+
77
+ ## Global Options
78
+
79
+ | Flag | Description |
80
+ |------|-------------|
81
+ | `--config <path>` | Load specific config file |
82
+ | `--no-config` | Skip all config files |
83
+ | `-c key=value` | Inline config override |
84
+ | `--strict` | Promote warnings to errors |
85
+ | `-v` / `-vv` / `-vvv` | Verbose output |
86
+
87
+ ## Validation Codes
88
+
89
+ ### Errors
90
+
91
+ | Code | Name | Description |
92
+ |------|------|-------------|
93
+ | E001 | BROKEN_REFERENCE | `maps_to` target not found |
94
+ | E002 | DUPLICATE_ELEMENT_ID | Duplicate element ID within a document |
95
+ | E003 | BROKEN_INHERITANCE | Inherited document not found |
96
+ | E004 | SCHEMA_VALIDATION | Element fails schema validation |
97
+
98
+ ### Warnings
99
+
100
+ | Code | Name | Description |
101
+ |------|------|-------------|
102
+ | W001 | EMPTY_MAPS_TO | Non-root active element has no `maps_to` |
103
+ | W002 | EMPTY_DOCUMENT | Document has no active elements |
104
+ | W003 | MAPPING_RULES_VIOLATION | Element doesn't satisfy category mapping rules |
105
+ | W004 | ORPHAN_ELEMENT | Isolated element (no incoming or outgoing edges) |
106
+ | W005 | SELF_DOCUMENT_MAPPING | Element maps only within its own document |
107
+ | W006 | STALE_ELEMENT | Element has unreviewed updates |
108
+ | W007 | UNDEFINED_TAG | Element uses tag not in definitions |
109
+ | W008 | DUPLICATE_CATEGORY_DEF | Duplicate category definition within library siblings |
110
+ | W009 | ID_SEQUENCE_GAP | Gap in element ID sequence |
111
+ | W010 | REF_FILE_MISSING | Ref points to nonexistent file |
112
+ | W011 | REF_IDENTIFIER_MISSING | Ref identifier not found in file |
113
+ | W012 | ORPHAN_IDENTIFIER | Identifier not referenced by any element (coverage pass) |
114
+ | W013 | DECISION_NO_REFS | Decision has no refs (coverage pass) |
115
+ | W014 | NO_ROOT_TRACE | Element cannot trace to any root element transitively |
116
+
117
+ ## Config
118
+
119
+ Config files are discovered in this order (closer scope wins):
120
+
121
+ 1. `/etc/gvp/config.yaml` (system)
122
+ 2. `~/.config/gvp/config.yaml` (global)
123
+ 3. `.gvp/config.yaml` (project)
124
+ 4. `.gvp.yaml` (local, gitignored)
125
+
126
+ Environment variables: `GVP_CONFIG_SYSTEM`, `GVP_CONFIG_GLOBAL`, `GVP_CONFIG_PROJECT`, `GVP_CONFIG_LOCAL`
127
+
128
+ ```yaml
129
+ # .gvp/config.yaml
130
+ user:
131
+ name: "Your Name"
132
+ email: "you@example.com"
133
+
134
+ strict: false
135
+ suppress_diagnostics: []
136
+ default_timezone: "America/New_York"
137
+
138
+ priority:
139
+ elements: ancestor # ancestor-wins for elements
140
+ definitions: descendant # descendant-wins for definitions
141
+
142
+ # Coverage settings (patterns use glob syntax via minimatch: *, **, ?)
143
+ coverage:
144
+ exclude:
145
+ - "README.md"
146
+ - ".gvp/**"
147
+ - "**/*.test.ts"
148
+ - "docs/**"
149
+ ```
150
+
151
+ ## Built-in Categories
152
+
153
+ | Category | Prefix | Root | Primary Field |
154
+ |----------|--------|------|---------------|
155
+ | goal | G | yes | statement |
156
+ | value | V | yes | statement |
157
+ | constraint | C | yes | impact |
158
+ | principle | P | no | statement |
159
+ | rule | R | no | statement |
160
+ | heuristic | H | no | statement |
161
+ | decision | D | no | rationale |
162
+ | milestone | M | no | description |
163
+
164
+ ## Refs — Linking Decisions to Artifacts
165
+
166
+ Any element can have `refs` linking it to external files:
167
+
168
+ ```yaml
169
+ refs:
170
+ - file: src/catalog/catalog.ts
171
+ identifier: Catalog
172
+ role: implements # defines | implements | uses | extends
173
+ ```
174
+
175
+ The `refs` system is domain-agnostic — it works with any file type that has a registered parser (TypeScript, Markdown, YAML built-in).
176
+
177
+ ## Documentation
178
+
179
+ - [Getting Started](docs/guide/getting-started.md) — Set up GVP on a new project
180
+ - [Command Reference](docs/guide/workflow.md#quick-reference) — Command reference
181
+ - [Workflow Guide](docs/guide/workflow.md) — End-to-end design → implementation → review workflow
182
+ - [Lightweight Capture](docs/guide/lightweight-capture.md) — ~5 min decision capture after brainstorming sessions
@@ -0,0 +1,13 @@
1
+ import type { EmbeddingProvider } from './embedding-provider.js';
2
+ import type { Element } from '../model/element.js';
3
+ export interface SimilarityResult {
4
+ elementA: Element;
5
+ elementB: Element;
6
+ similarity: number;
7
+ }
8
+ /**
9
+ * Find potentially related but unmapped element pairs (DEC-10.9).
10
+ * Returns pairs above the similarity threshold that aren't connected via maps_to.
11
+ */
12
+ export declare function findUnmappedRelationships(elements: Element[], provider: EmbeddingProvider, threshold?: number): Promise<SimilarityResult[]>;
13
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,MAAY,GACtB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6C7B"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Find potentially related but unmapped element pairs (DEC-10.9).
3
+ * Returns pairs above the similarity threshold that aren't connected via maps_to.
4
+ */
5
+ export async function findUnmappedRelationships(elements, provider, threshold = 0.7) {
6
+ // Embed all elements
7
+ const embeddings = new Map();
8
+ for (const el of elements) {
9
+ const text = `${el.name} ${el.get(el.categoryName === 'decision' ? 'rationale' : 'statement') ?? ''}`;
10
+ embeddings.set(el.hashKey(), await provider.embed(text));
11
+ }
12
+ // Build maps_to lookup for connected pairs
13
+ const connected = new Set();
14
+ for (const el of elements) {
15
+ for (const ref of el.maps_to) {
16
+ connected.add(`${el.hashKey()}:${ref}`);
17
+ // Also check reverse (since maps_to is directional but we want any connection)
18
+ const target = elements.find(e => e.toLibraryId() === ref || e.hashKey() === ref);
19
+ if (target) {
20
+ connected.add(`${target.hashKey()}:${el.toLibraryId()}`);
21
+ }
22
+ }
23
+ }
24
+ // Compare all pairs
25
+ const results = [];
26
+ for (let i = 0; i < elements.length; i++) {
27
+ for (let j = i + 1; j < elements.length; j++) {
28
+ const elA = elements[i];
29
+ const elB = elements[j];
30
+ // Skip if already connected
31
+ const keyAB = `${elA.hashKey()}:${elB.toLibraryId()}`;
32
+ const keyBA = `${elB.hashKey()}:${elA.toLibraryId()}`;
33
+ if (connected.has(keyAB) || connected.has(keyBA))
34
+ continue;
35
+ const embA = embeddings.get(elA.hashKey());
36
+ const embB = embeddings.get(elB.hashKey());
37
+ if (!embA || !embB)
38
+ continue;
39
+ const sim = provider.similarity(embA, embB);
40
+ if (sim >= threshold) {
41
+ results.push({ elementA: elA, elementB: elB, similarity: sim });
42
+ }
43
+ }
44
+ }
45
+ return results.sort((a, b) => b.similarity - a.similarity);
46
+ }
47
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/analysis/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Abstract embedding provider interface (DEC-10.8).
3
+ * Plugin point for different embedding backends.
4
+ */
5
+ export declare abstract class EmbeddingProvider {
6
+ abstract readonly name: string;
7
+ /** Generate an embedding vector for text */
8
+ abstract embed(text: string): Promise<number[]>;
9
+ /** Compute similarity between two vectors (0-1, higher = more similar) */
10
+ similarity(a: number[], b: number[]): number;
11
+ }
12
+ //# sourceMappingURL=embedding-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../src/analysis/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,8BAAsB,iBAAiB;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAE/C,0EAA0E;IAC1E,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;CAY7C"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Abstract embedding provider interface (DEC-10.8).
3
+ * Plugin point for different embedding backends.
4
+ */
5
+ export class EmbeddingProvider {
6
+ /** Compute similarity between two vectors (0-1, higher = more similar) */
7
+ similarity(a, b) {
8
+ // Default: cosine similarity
9
+ if (a.length !== b.length || a.length === 0)
10
+ return 0;
11
+ let dot = 0, normA = 0, normB = 0;
12
+ for (let i = 0; i < a.length; i++) {
13
+ dot += a[i] * b[i];
14
+ normA += a[i] * a[i];
15
+ normB += b[i] * b[i];
16
+ }
17
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
18
+ return denom === 0 ? 0 : dot / denom;
19
+ }
20
+ }
21
+ //# sourceMappingURL=embedding-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../src/analysis/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAgB,iBAAiB;IAMrC,0EAA0E;IAC1E,UAAU,CAAC,CAAW,EAAE,CAAW;QACjC,6BAA6B;QAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACtD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACzB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { EmbeddingProvider } from './embedding-provider.js';
2
+ export { StubEmbeddingProvider } from './stub-provider.js';
3
+ export { findUnmappedRelationships, type SimilarityResult } from './analyzer.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { EmbeddingProvider } from './embedding-provider.js';
2
+ export { StubEmbeddingProvider } from './stub-provider.js';
3
+ export { findUnmappedRelationships } from './analyzer.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAyB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { EmbeddingProvider } from './embedding-provider.js';
2
+ /**
3
+ * Stub embedding provider for alpha.
4
+ * Uses simple bag-of-words hashing -- not production quality,
5
+ * but exercises the interface for testing.
6
+ */
7
+ export declare class StubEmbeddingProvider extends EmbeddingProvider {
8
+ readonly name = "stub";
9
+ private readonly dimensions;
10
+ embed(text: string): Promise<number[]>;
11
+ }
12
+ //# sourceMappingURL=stub-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub-provider.d.ts","sourceRoot":"","sources":["../../src/analysis/stub-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IAE3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmB7C"}
@@ -0,0 +1,30 @@
1
+ import { EmbeddingProvider } from './embedding-provider.js';
2
+ /**
3
+ * Stub embedding provider for alpha.
4
+ * Uses simple bag-of-words hashing -- not production quality,
5
+ * but exercises the interface for testing.
6
+ */
7
+ export class StubEmbeddingProvider extends EmbeddingProvider {
8
+ name = 'stub';
9
+ dimensions = 64;
10
+ async embed(text) {
11
+ // Simple deterministic hash-based embedding for testing
12
+ const words = text.toLowerCase().split(/\W+/).filter(w => w.length > 0);
13
+ const vector = new Array(this.dimensions).fill(0);
14
+ for (const word of words) {
15
+ for (let i = 0; i < word.length; i++) {
16
+ const idx = (word.charCodeAt(i) * (i + 1)) % this.dimensions;
17
+ vector[idx] = (vector[idx] ?? 0) + 1;
18
+ }
19
+ }
20
+ // Normalize
21
+ const norm = Math.sqrt(vector.reduce((s, v) => s + v * v, 0));
22
+ if (norm > 0) {
23
+ for (let i = 0; i < vector.length; i++) {
24
+ vector[i] = (vector[i] ?? 0) / norm;
25
+ }
26
+ }
27
+ return vector;
28
+ }
29
+ }
30
+ //# sourceMappingURL=stub-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub-provider.js","sourceRoot":"","sources":["../../src/analysis/stub-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IACjD,IAAI,GAAG,MAAM,CAAC;IACN,UAAU,GAAG,EAAE,CAAC;IAEjC,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,wDAAwD;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa,CAAC;QAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,YAAY;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import type { Document } from '../model/document.js';
2
+ import type { Element } from '../model/element.js';
3
+ import type { ResolvedInheritance } from '../inheritance/inheritance-resolver.js';
4
+ import type { GVPConfig } from '../config/schema.js';
5
+ import { CategoryRegistry } from '../model/category-registry.js';
6
+ import { type LibraryDefinitionSnapshot } from './category-merger.js';
7
+ import { Graph } from '../model/graph.js';
8
+ /**
9
+ * The assembled, validated, queryable GVP catalog (DEC-5.7: construction fails fast).
10
+ * Immutable after construction.
11
+ */
12
+ export declare class Catalog {
13
+ private readonly _config;
14
+ private readonly _registry;
15
+ private readonly _documents;
16
+ private readonly _elements;
17
+ private readonly _elementsByCategory;
18
+ private readonly _mergedDefinitions;
19
+ constructor(resolvedInheritance: ResolvedInheritance, config: GVPConfig);
20
+ get config(): GVPConfig;
21
+ get registry(): CategoryRegistry;
22
+ get documents(): Document[];
23
+ /** Get all elements across all documents */
24
+ getAllElements(): Element[];
25
+ /** Get elements by category name */
26
+ getElementsByCategory(categoryName: string): Element[];
27
+ /** Get element by hash key (source:documentPath:id) */
28
+ getElement(hashKey: string): Element | undefined;
29
+ /** Get merged tag definitions */
30
+ getTags(): Record<string, {
31
+ description: string;
32
+ }>;
33
+ /** Get per-library definition snapshot (DEC-2.12) */
34
+ getLibrarySnapshot(source: string): LibraryDefinitionSnapshot | undefined;
35
+ /** Build ancestors graph for an element (DEC-6.1, DEC-6.5) */
36
+ ancestors(element: Element): Graph;
37
+ /** Build descendants graph for an element (DEC-6.1, DEC-6.5) */
38
+ descendants(element: Element): Graph;
39
+ }
40
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/catalog/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,EAGN,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;gBAE3C,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS;IA+DvE,IAAI,MAAM,IAAI,SAAS,CAEtB;IACD,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;IACD,IAAI,SAAS,IAAI,QAAQ,EAAE,CAE1B;IAED,4CAA4C;IAC5C,cAAc,IAAI,OAAO,EAAE;IAI3B,oCAAoC;IACpC,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE;IAItD,uDAAuD;IACvD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIhD,iCAAiC;IACjC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIlD,qDAAqD;IACrD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAIzE,8DAA8D;IAC9D,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK;IAQlC,gEAAgE;IAChE,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK;CAGrC"}
@@ -0,0 +1,118 @@
1
+ import { CategoryRegistry } from '../model/category-registry.js';
2
+ import { loadDefaults } from '../schema/defaults-loader.js';
3
+ import { mergeDefinitions, } from './category-merger.js';
4
+ import { validateMergedCategories } from './post-merge-validation.js';
5
+ import { buildAncestorsGraph, buildDescendantsGraph, } from '../model/graph.js';
6
+ /**
7
+ * The assembled, validated, queryable GVP catalog (DEC-5.7: construction fails fast).
8
+ * Immutable after construction.
9
+ */
10
+ export class Catalog {
11
+ _config;
12
+ _registry;
13
+ _documents;
14
+ _elements; // hashKey -> Element
15
+ _elementsByCategory;
16
+ _mergedDefinitions;
17
+ constructor(resolvedInheritance, config) {
18
+ this._config = config;
19
+ this._documents = resolvedInheritance.orderedDocuments;
20
+ // Step 0: Apply config_overrides from documents (DEC-2.4, DEC-2.13)
21
+ // Iterate in DFS order (ancestors first = ancestor-wins)
22
+ const appliedOverrides = new Set();
23
+ for (const doc of this._documents) {
24
+ const overrides = doc.meta.config_overrides;
25
+ if (!overrides)
26
+ continue;
27
+ for (const [key, override] of Object.entries(overrides)) {
28
+ // DEC-4.8: user identity is personal, excluded from config_overrides
29
+ if (key === 'user')
30
+ continue;
31
+ if (override.mode === 'replace') {
32
+ // Ancestor-wins: only set if not already set by an earlier ancestor
33
+ if (!appliedOverrides.has(key)) {
34
+ this._config[key] = override.value;
35
+ appliedOverrides.add(key);
36
+ }
37
+ }
38
+ else if (override.mode === 'additive') {
39
+ // Accumulate: arrays concatenated, ancestor first
40
+ const existing = this._config[key];
41
+ if (Array.isArray(existing) && Array.isArray(override.value)) {
42
+ this._config[key] = [...existing, ...override.value];
43
+ }
44
+ else {
45
+ this._config[key] = override.value;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ // Step 1: Merge definitions across documents
51
+ const defDirection = config.priority?.definitions ?? 'descendant';
52
+ this._mergedDefinitions = mergeDefinitions(this._documents, defDirection);
53
+ // Step 2: Build registry from defaults + merged user definitions
54
+ const defaults = loadDefaults();
55
+ let registry = CategoryRegistry.fromDefaults(defaults);
56
+ if (Object.keys(this._mergedDefinitions.categories).length > 0 ||
57
+ Object.keys(this._mergedDefinitions.allFieldSchemas).length > 0) {
58
+ const userAll = Object.keys(this._mergedDefinitions.allFieldSchemas).length > 0
59
+ ? { field_schemas: this._mergedDefinitions.allFieldSchemas }
60
+ : undefined;
61
+ registry = registry.merge(this._mergedDefinitions.categories, userAll);
62
+ }
63
+ this._registry = registry;
64
+ // Step 3: Post-merge validation (DEC-3.6, DEC-5.7: throws on error)
65
+ validateMergedCategories(registry.categories);
66
+ // Step 4: Index all elements
67
+ this._elements = new Map();
68
+ this._elementsByCategory = new Map();
69
+ for (const doc of this._documents) {
70
+ for (const element of doc.getAllElements()) {
71
+ this._elements.set(element.hashKey(), element);
72
+ const catElements = this._elementsByCategory.get(element.categoryName) ?? [];
73
+ catElements.push(element);
74
+ this._elementsByCategory.set(element.categoryName, catElements);
75
+ }
76
+ }
77
+ }
78
+ get config() {
79
+ return this._config;
80
+ }
81
+ get registry() {
82
+ return this._registry;
83
+ }
84
+ get documents() {
85
+ return [...this._documents];
86
+ }
87
+ /** Get all elements across all documents */
88
+ getAllElements() {
89
+ return [...this._elements.values()];
90
+ }
91
+ /** Get elements by category name */
92
+ getElementsByCategory(categoryName) {
93
+ return [...(this._elementsByCategory.get(categoryName) ?? [])];
94
+ }
95
+ /** Get element by hash key (source:documentPath:id) */
96
+ getElement(hashKey) {
97
+ return this._elements.get(hashKey);
98
+ }
99
+ /** Get merged tag definitions */
100
+ getTags() {
101
+ return this._mergedDefinitions.tags;
102
+ }
103
+ /** Get per-library definition snapshot (DEC-2.12) */
104
+ getLibrarySnapshot(source) {
105
+ return this._mergedDefinitions.librarySnapshots.get(source);
106
+ }
107
+ /** Build ancestors graph for an element (DEC-6.1, DEC-6.5) */
108
+ ancestors(element) {
109
+ return buildAncestorsGraph(element, (ref) => {
110
+ return this.getAllElements().find((e) => e.toLibraryId() === ref || e.hashKey() === ref);
111
+ });
112
+ }
113
+ /** Build descendants graph for an element (DEC-6.1, DEC-6.5) */
114
+ descendants(element) {
115
+ return buildDescendantsGraph(element, this.getAllElements());
116
+ }
117
+ }
118
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/catalog/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Document } from '../model/document.js';
2
+ import type { CategoryDefinition } from '../schema/category-definition.js';
3
+ import type { FieldSchemaEntry } from '../schema/field-schema.js';
4
+ export interface LibraryDefinitionSnapshot {
5
+ categories: Record<string, CategoryDefinition>;
6
+ tags: Record<string, {
7
+ description: string;
8
+ }>;
9
+ }
10
+ export interface MergedDefinitions {
11
+ categories: Record<string, CategoryDefinition>;
12
+ tags: Record<string, {
13
+ description: string;
14
+ }>;
15
+ allFieldSchemas: Record<string, FieldSchemaEntry>;
16
+ librarySnapshots: Map<string, LibraryDefinitionSnapshot>;
17
+ }
18
+ /**
19
+ * Merge category definitions across documents (DEC-2.1, DEC-2.2, DEC-2.7, DEC-2.8).
20
+ *
21
+ * @param orderedDocuments - Documents in DFS order (ancestors first)
22
+ * @param definitionDirection - 'ancestor' or 'descendant' (from config priority.definitions)
23
+ */
24
+ export declare function mergeDefinitions(orderedDocuments: Document[], definitionDirection?: 'ancestor' | 'descendant'): MergedDefinitions;
25
+ //# sourceMappingURL=category-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-merger.d.ts","sourceRoot":"","sources":["../../src/catalog/category-merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClD,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CAC1D;AAYD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,QAAQ,EAAE,EAC5B,mBAAmB,GAAE,UAAU,GAAG,YAA2B,GAC5D,iBAAiB,CAsEnB"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Deep merge field_schemas: target is base, source overrides (DEC-2.2).
3
+ */
4
+ function deepMergeFieldSchemas(base, override) {
5
+ return { ...base, ...override };
6
+ }
7
+ /**
8
+ * Merge category definitions across documents (DEC-2.1, DEC-2.2, DEC-2.7, DEC-2.8).
9
+ *
10
+ * @param orderedDocuments - Documents in DFS order (ancestors first)
11
+ * @param definitionDirection - 'ancestor' or 'descendant' (from config priority.definitions)
12
+ */
13
+ export function mergeDefinitions(orderedDocuments, definitionDirection = 'descendant') {
14
+ const mergedCategories = {};
15
+ const mergedTags = {};
16
+ const mergedAll = {};
17
+ const librarySnapshots = new Map();
18
+ // Iterate in the direction where the winner comes LAST
19
+ // descendant-wins: iterate ancestors first, descendants overwrite
20
+ // ancestor-wins: iterate descendants first, ancestors overwrite
21
+ const docs = definitionDirection === 'descendant'
22
+ ? orderedDocuments // ancestors first, descendants overwrite
23
+ : [...orderedDocuments].reverse(); // descendants first, ancestors overwrite
24
+ for (const doc of docs) {
25
+ // Merge category definitions from this document
26
+ const docCategories = doc.getCategoryDefinitions();
27
+ for (const [name, def] of Object.entries(docCategories)) {
28
+ if (mergedCategories[name]) {
29
+ // Deep merge field_schemas
30
+ const existingSchemas = mergedCategories[name].field_schemas ?? {};
31
+ const newSchemas = def.field_schemas ?? {};
32
+ mergedCategories[name] = {
33
+ ...mergedCategories[name],
34
+ ...def,
35
+ field_schemas: Object.keys(existingSchemas).length || Object.keys(newSchemas).length
36
+ ? deepMergeFieldSchemas(existingSchemas, newSchemas)
37
+ : undefined,
38
+ };
39
+ }
40
+ else {
41
+ mergedCategories[name] = { ...def };
42
+ }
43
+ }
44
+ // Merge tag definitions
45
+ const docTags = doc.getTagDefinitions();
46
+ for (const [name, tag] of Object.entries(docTags)) {
47
+ mergedTags[name] = tag;
48
+ }
49
+ // Merge _all field_schemas from user documents (DEC-2.8)
50
+ const docAllSchemas = doc.meta.definitions?._all;
51
+ if (docAllSchemas &&
52
+ typeof docAllSchemas === 'object' &&
53
+ 'field_schemas' in docAllSchemas) {
54
+ const schemas = docAllSchemas
55
+ .field_schemas;
56
+ if (schemas) {
57
+ Object.assign(mergedAll, schemas);
58
+ }
59
+ }
60
+ // Capture per-library snapshot (DEC-2.12)
61
+ if (!librarySnapshots.has(doc.source)) {
62
+ librarySnapshots.set(doc.source, {
63
+ categories: { ...mergedCategories },
64
+ tags: { ...mergedTags },
65
+ });
66
+ }
67
+ }
68
+ return {
69
+ categories: mergedCategories,
70
+ tags: mergedTags,
71
+ allFieldSchemas: mergedAll,
72
+ librarySnapshots,
73
+ };
74
+ }
75
+ //# sourceMappingURL=category-merger.js.map