@documentation-robotics/cli 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 (169) hide show
  1. package/PYTHON_CLI_PARITY.md +265 -0
  2. package/PYTHON_CLI_STRUCTURE_UPDATE.md +246 -0
  3. package/README.md +926 -0
  4. package/biome.json +42 -0
  5. package/bunfig.toml +3 -0
  6. package/dist/ai/claude-client.js +71 -0
  7. package/dist/ai/claude-client.js.map +7 -0
  8. package/dist/ai/context-provider.js +129 -0
  9. package/dist/ai/context-provider.js.map +7 -0
  10. package/dist/ai/tools.js +231 -0
  11. package/dist/ai/tools.js.map +7 -0
  12. package/dist/cli.js +224 -0
  13. package/dist/cli.js.map +7 -0
  14. package/dist/commands/add.js +51 -0
  15. package/dist/commands/add.js.map +7 -0
  16. package/dist/commands/changeset.js +174 -0
  17. package/dist/commands/changeset.js.map +7 -0
  18. package/dist/commands/chat.js +111 -0
  19. package/dist/commands/chat.js.map +7 -0
  20. package/dist/commands/conformance.js +132 -0
  21. package/dist/commands/conformance.js.map +7 -0
  22. package/dist/commands/delete.js +31 -0
  23. package/dist/commands/delete.js.map +7 -0
  24. package/dist/commands/element.js +28 -0
  25. package/dist/commands/element.js.map +7 -0
  26. package/dist/commands/export.js +65 -0
  27. package/dist/commands/export.js.map +7 -0
  28. package/dist/commands/info.js +40 -0
  29. package/dist/commands/info.js.map +7 -0
  30. package/dist/commands/init.js +45 -0
  31. package/dist/commands/init.js.map +7 -0
  32. package/dist/commands/list.js +32 -0
  33. package/dist/commands/list.js.map +7 -0
  34. package/dist/commands/migrate.js +36 -0
  35. package/dist/commands/migrate.js.map +7 -0
  36. package/dist/commands/project.js +74 -0
  37. package/dist/commands/project.js.map +7 -0
  38. package/dist/commands/relationship.js +118 -0
  39. package/dist/commands/relationship.js.map +7 -0
  40. package/dist/commands/search.js +48 -0
  41. package/dist/commands/search.js.map +7 -0
  42. package/dist/commands/show.js +38 -0
  43. package/dist/commands/show.js.map +7 -0
  44. package/dist/commands/trace.js +60 -0
  45. package/dist/commands/trace.js.map +7 -0
  46. package/dist/commands/update.js +37 -0
  47. package/dist/commands/update.js.map +7 -0
  48. package/dist/commands/upgrade.js +152 -0
  49. package/dist/commands/upgrade.js.map +7 -0
  50. package/dist/commands/validate.js +71 -0
  51. package/dist/commands/validate.js.map +7 -0
  52. package/dist/commands/version.js +20 -0
  53. package/dist/commands/version.js.map +7 -0
  54. package/dist/commands/visualize.js +51 -0
  55. package/dist/commands/visualize.js.map +7 -0
  56. package/dist/core/active-changeset.js +52 -0
  57. package/dist/core/active-changeset.js.map +7 -0
  58. package/dist/core/changeset.js +244 -0
  59. package/dist/core/changeset.js.map +7 -0
  60. package/dist/core/dependency-tracker.js +322 -0
  61. package/dist/core/dependency-tracker.js.map +7 -0
  62. package/dist/core/element.js +65 -0
  63. package/dist/core/element.js.map +7 -0
  64. package/dist/core/layer.js +75 -0
  65. package/dist/core/layer.js.map +7 -0
  66. package/dist/core/manifest.js +57 -0
  67. package/dist/core/manifest.js.map +7 -0
  68. package/dist/core/migration-registry.js +131 -0
  69. package/dist/core/migration-registry.js.map +7 -0
  70. package/dist/core/model.js +455 -0
  71. package/dist/core/model.js.map +7 -0
  72. package/dist/core/projection-engine.js +288 -0
  73. package/dist/core/projection-engine.js.map +7 -0
  74. package/dist/core/reference-registry.js +188 -0
  75. package/dist/core/reference-registry.js.map +7 -0
  76. package/dist/core/relationship-registry.js +114 -0
  77. package/dist/core/relationship-registry.js.map +7 -0
  78. package/dist/core/relationships.js +78 -0
  79. package/dist/core/relationships.js.map +7 -0
  80. package/dist/export/archimate-exporter.js +111 -0
  81. package/dist/export/archimate-exporter.js.map +7 -0
  82. package/dist/export/export-manager.js +63 -0
  83. package/dist/export/export-manager.js.map +7 -0
  84. package/dist/export/graphml-exporter.js +39 -0
  85. package/dist/export/graphml-exporter.js.map +7 -0
  86. package/dist/export/index.js +17 -0
  87. package/dist/export/index.js.map +7 -0
  88. package/dist/export/json-schema-exporter.js +60 -0
  89. package/dist/export/json-schema-exporter.js.map +7 -0
  90. package/dist/export/markdown-exporter.js +99 -0
  91. package/dist/export/markdown-exporter.js.map +7 -0
  92. package/dist/export/openapi-exporter.js +85 -0
  93. package/dist/export/openapi-exporter.js.map +7 -0
  94. package/dist/export/plantuml-exporter.js +60 -0
  95. package/dist/export/plantuml-exporter.js.map +7 -0
  96. package/dist/export/types.js +36 -0
  97. package/dist/export/types.js.map +7 -0
  98. package/dist/schemas/bundled/01-motivation-layer.schema.json +942 -0
  99. package/dist/schemas/bundled/02-business-layer.schema.json +1293 -0
  100. package/dist/schemas/bundled/03-security-layer.schema.json +2177 -0
  101. package/dist/schemas/bundled/04-application-layer.schema.json +1328 -0
  102. package/dist/schemas/bundled/05-technology-layer.schema.json +1465 -0
  103. package/dist/schemas/bundled/06-api-layer.schema.json +1743 -0
  104. package/dist/schemas/bundled/07-data-model-layer.schema.json +1253 -0
  105. package/dist/schemas/bundled/08-datastore-layer.schema.json +892 -0
  106. package/dist/schemas/bundled/09-ux-layer.schema.json +1506 -0
  107. package/dist/schemas/bundled/10-navigation-layer.schema.json +843 -0
  108. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +1430 -0
  109. package/dist/schemas/bundled/12-testing-layer.schema.json +1091 -0
  110. package/dist/schemas/bundled/common/layer-extensions.schema.json +266 -0
  111. package/dist/schemas/bundled/common/predicates.schema.json +493 -0
  112. package/dist/schemas/bundled/common/relationships.schema.json +791 -0
  113. package/dist/schemas/bundled/common/source-references.schema.json +71 -0
  114. package/dist/schemas/bundled/link-registry.json +1839 -0
  115. package/dist/schemas/bundled/link-registry.schema.json +339 -0
  116. package/dist/schemas/bundled/relationship-catalog.json +1302 -0
  117. package/dist/schemas/bundled/relationship-type.schema.json +221 -0
  118. package/dist/server/server.js +1207 -0
  119. package/dist/server/server.js.map +7 -0
  120. package/dist/server/telemetry-middleware.js +24 -0
  121. package/dist/server/telemetry-middleware.js.map +7 -0
  122. package/dist/telemetry/console-interceptor.js +34 -0
  123. package/dist/telemetry/console-interceptor.js.map +7 -0
  124. package/dist/telemetry/index.js +54 -0
  125. package/dist/telemetry/index.js.map +7 -0
  126. package/dist/telemetry/resilient-exporter.js +41 -0
  127. package/dist/telemetry/resilient-exporter.js.map +7 -0
  128. package/dist/telemetry/resilient-log-exporter.js +41 -0
  129. package/dist/telemetry/resilient-log-exporter.js.map +7 -0
  130. package/dist/telemetry/test-instrumentation.js +32 -0
  131. package/dist/telemetry/test-instrumentation.js.map +7 -0
  132. package/dist/types/index.js +1 -0
  133. package/dist/types/index.js.map +7 -0
  134. package/dist/utils/element-utils.js +11 -0
  135. package/dist/utils/element-utils.js.map +7 -0
  136. package/dist/utils/errors.js +105 -0
  137. package/dist/utils/errors.js.map +7 -0
  138. package/dist/utils/file-io.js +69 -0
  139. package/dist/utils/file-io.js.map +7 -0
  140. package/dist/utils/globals.js +28 -0
  141. package/dist/utils/globals.js.map +7 -0
  142. package/dist/utils/model-path.js +22 -0
  143. package/dist/utils/model-path.js.map +7 -0
  144. package/dist/utils/project-paths.js +45 -0
  145. package/dist/utils/project-paths.js.map +7 -0
  146. package/dist/utils/spec-installer.js +85 -0
  147. package/dist/utils/spec-installer.js.map +7 -0
  148. package/dist/utils/spec-version.js +33 -0
  149. package/dist/utils/spec-version.js.map +7 -0
  150. package/dist/validators/index.js +15 -0
  151. package/dist/validators/index.js.map +7 -0
  152. package/dist/validators/naming-validator.js +82 -0
  153. package/dist/validators/naming-validator.js.map +7 -0
  154. package/dist/validators/reference-validator.js +106 -0
  155. package/dist/validators/reference-validator.js.map +7 -0
  156. package/dist/validators/schema-validator.js +148 -0
  157. package/dist/validators/schema-validator.js.map +7 -0
  158. package/dist/validators/semantic-validator.js +80 -0
  159. package/dist/validators/semantic-validator.js.map +7 -0
  160. package/dist/validators/types.js +48 -0
  161. package/dist/validators/types.js.map +7 -0
  162. package/dist/validators/validator.js +67 -0
  163. package/dist/validators/validator.js.map +7 -0
  164. package/docs/TEST-INSTRUMENTATION.md +405 -0
  165. package/docs/telemetry.md +427 -0
  166. package/package.json +70 -0
  167. package/test-debug.js +33 -0
  168. package/test-special.mjs +46 -0
  169. package/test_runner.ts +7 -0
@@ -0,0 +1,65 @@
1
+ class Element {
2
+ id;
3
+ type;
4
+ name;
5
+ description;
6
+ properties;
7
+ references;
8
+ relationships;
9
+ layer;
10
+ // Track which layer this element belongs to (Python CLI compatibility)
11
+ filePath;
12
+ // Track source file path for saving back (Python CLI compatibility)
13
+ rawData;
14
+ // Preserve raw YAML data to avoid losing unknown fields (Python CLI compatibility)
15
+ constructor(data) {
16
+ this.id = data.id, this.type = data.type, this.name = data.name, this.description = data.description, this.properties = data.properties ?? {}, this.references = data.references ?? [], this.relationships = data.relationships ?? [], this.layer = data.layer, this.filePath = data.filePath, this.rawData = data.rawData;
17
+ }
18
+ /**
19
+ * Get a property by key with type inference
20
+ */
21
+ getProperty(key) {
22
+ return this.properties[key];
23
+ }
24
+ /**
25
+ * Set a property by key
26
+ */
27
+ setProperty(key, value) {
28
+ this.properties[key] = value;
29
+ }
30
+ /**
31
+ * Get array property with type safety
32
+ */
33
+ getArrayProperty(key) {
34
+ const value = this.properties[key];
35
+ return Array.isArray(value) ? value : [];
36
+ }
37
+ /**
38
+ * Add item to array property
39
+ */
40
+ addToArrayProperty(key, item) {
41
+ const current = this.getArrayProperty(key);
42
+ current.push(item), this.properties[key] = current;
43
+ }
44
+ /**
45
+ * Serialize to JSON representation
46
+ */
47
+ toJSON() {
48
+ const result = {
49
+ id: this.id,
50
+ type: this.type,
51
+ name: this.name
52
+ };
53
+ return this.description && (result.description = this.description), Object.keys(this.properties).length > 0 && (result.properties = this.properties), this.references.length > 0 && (result.references = this.references), this.relationships.length > 0 && (result.relationships = this.relationships), result;
54
+ }
55
+ /**
56
+ * String representation
57
+ */
58
+ toString() {
59
+ return `Element(${this.id})`;
60
+ }
61
+ }
62
+ export {
63
+ Element
64
+ };
65
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/element.ts"],
4
+ "sourcesContent": ["import type { Element as IElement, Reference, Relationship } from \"../types/index.js\";\n\n/**\n * Element class representing an individual architecture item\n */\nexport class Element implements IElement {\n id: string;\n type: string;\n name: string;\n description?: string;\n properties: Record<string, unknown>;\n references: Reference[];\n relationships: Relationship[];\n layer?: string; // Track which layer this element belongs to (Python CLI compatibility)\n filePath?: string; // Track source file path for saving back (Python CLI compatibility)\n rawData?: any; // Preserve raw YAML data to avoid losing unknown fields (Python CLI compatibility)\n\n constructor(data: {\n id: string;\n type: string;\n name: string;\n description?: string;\n properties?: Record<string, unknown>;\n references?: Reference[];\n relationships?: Relationship[];\n layer?: string;\n filePath?: string;\n rawData?: any;\n }) {\n this.id = data.id;\n this.type = data.type;\n this.name = data.name;\n this.description = data.description;\n this.properties = data.properties ?? {};\n this.references = data.references ?? [];\n this.relationships = data.relationships ?? [];\n this.layer = data.layer;\n this.filePath = data.filePath;\n this.rawData = data.rawData;\n }\n\n /**\n * Get a property by key with type inference\n */\n getProperty<T>(key: string): T | undefined {\n return this.properties[key] as T | undefined;\n }\n\n /**\n * Set a property by key\n */\n setProperty(key: string, value: unknown): void {\n this.properties[key] = value;\n }\n\n /**\n * Get array property with type safety\n */\n getArrayProperty<T>(key: string): T[] {\n const value = this.properties[key];\n if (Array.isArray(value)) {\n return value as T[];\n }\n return [];\n }\n\n /**\n * Add item to array property\n */\n addToArrayProperty<T>(key: string, item: T): void {\n const current = this.getArrayProperty<T>(key);\n current.push(item);\n this.properties[key] = current;\n }\n\n /**\n * Serialize to JSON representation\n */\n toJSON(): IElement {\n const result: IElement = {\n id: this.id,\n type: this.type,\n name: this.name,\n };\n\n if (this.description) {\n result.description = this.description;\n }\n\n if (Object.keys(this.properties).length > 0) {\n result.properties = this.properties;\n }\n\n if (this.references.length > 0) {\n result.references = this.references;\n }\n\n if (this.relationships.length > 0) {\n result.relationships = this.relationships;\n }\n\n return result;\n }\n\n /**\n * String representation\n */\n toString(): string {\n return `Element(${this.id})`;\n }\n}\n"],
5
+ "mappings": "AAKM,MAAO,QAAO;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EACA;;EACA;;EAEA,YAAY,MAWX;AACC,SAAK,KAAK,KAAK,IACf,KAAK,OAAO,KAAK,MACjB,KAAK,OAAO,KAAK,MACjB,KAAK,cAAc,KAAK,aACxB,KAAK,aAAa,KAAK,cAAc,CAAA,GACrC,KAAK,aAAa,KAAK,cAAc,CAAA,GACrC,KAAK,gBAAgB,KAAK,iBAAiB,CAAA,GAC3C,KAAK,QAAQ,KAAK,OAClB,KAAK,WAAW,KAAK,UACrB,KAAK,UAAU,KAAK;EACtB;;;;EAKA,YAAe,KAAW;AACxB,WAAO,KAAK,WAAW,GAAG;EAC5B;;;;EAKA,YAAY,KAAa,OAAc;AACrC,SAAK,WAAW,GAAG,IAAI;EACzB;;;;EAKA,iBAAoB,KAAW;AAC7B,UAAM,QAAQ,KAAK,WAAW,GAAG;AACjC,WAAI,MAAM,QAAQ,KAAK,IACd,QAEF,CAAA;EACT;;;;EAKA,mBAAsB,KAAa,MAAO;AACxC,UAAM,UAAU,KAAK,iBAAoB,GAAG;AAC5C,YAAQ,KAAK,IAAI,GACjB,KAAK,WAAW,GAAG,IAAI;EACzB;;;;EAKA,SAAM;AACJ,UAAM,SAAmB;MACvB,IAAI,KAAK;MACT,MAAM,KAAK;MACX,MAAM,KAAK;;AAGb,WAAI,KAAK,gBACP,OAAO,cAAc,KAAK,cAGxB,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,MACxC,OAAO,aAAa,KAAK,aAGvB,KAAK,WAAW,SAAS,MAC3B,OAAO,aAAa,KAAK,aAGvB,KAAK,cAAc,SAAS,MAC9B,OAAO,gBAAgB,KAAK,gBAGvB;EACT;;;;EAKA,WAAQ;AACN,WAAO,WAAW,KAAK,EAAE;EAC3B;;",
6
+ "names": []
7
+ }
@@ -0,0 +1,75 @@
1
+ import { Element } from "./element.js";
2
+ class Layer {
3
+ name;
4
+ elements;
5
+ metadata;
6
+ dirty = !1;
7
+ constructor(name, elements = []) {
8
+ this.name = name, this.elements = new Map(elements.map((e) => [e.id, e]));
9
+ }
10
+ /**
11
+ * Add an element to the layer
12
+ */
13
+ addElement(element) {
14
+ this.elements.set(element.id, element), this.dirty = !0;
15
+ }
16
+ /**
17
+ * Get an element by ID
18
+ */
19
+ getElement(id) {
20
+ return this.elements.get(id);
21
+ }
22
+ /**
23
+ * Delete an element by ID
24
+ */
25
+ deleteElement(id) {
26
+ const result = this.elements.delete(id);
27
+ return result && (this.dirty = !0), result;
28
+ }
29
+ /**
30
+ * List all elements in the layer
31
+ */
32
+ listElements() {
33
+ return Array.from(this.elements.values());
34
+ }
35
+ /**
36
+ * Check if layer has unsaved changes
37
+ */
38
+ isDirty() {
39
+ return this.dirty;
40
+ }
41
+ /**
42
+ * Mark layer as clean (no unsaved changes)
43
+ */
44
+ markClean() {
45
+ this.dirty = !1;
46
+ }
47
+ /**
48
+ * Serialize to JSON representation
49
+ */
50
+ toJSON() {
51
+ const result = {
52
+ elements: Array.from(this.elements.values()).map((e) => e.toJSON())
53
+ };
54
+ return this.metadata && (result.metadata = this.metadata), result;
55
+ }
56
+ /**
57
+ * Create Layer from JSON data
58
+ */
59
+ static fromJSON(name, data) {
60
+ const elements = data.elements.map((e) => new Element({
61
+ id: e.id,
62
+ type: e.type,
63
+ name: e.name,
64
+ description: e.description,
65
+ properties: e.properties,
66
+ references: e.references,
67
+ relationships: e.relationships
68
+ })), layer = new Layer(name, elements);
69
+ return layer.metadata = data.metadata, layer;
70
+ }
71
+ }
72
+ export {
73
+ Layer
74
+ };
75
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/layer.ts"],
4
+ "sourcesContent": ["import { Element } from \"./element.js\";\nimport type { LayerData } from \"../types/index.js\";\n\n/**\n * Layer class representing a container for elements within a layer\n */\nexport class Layer {\n name: string;\n elements: Map<string, Element>;\n metadata?: { layer: string; version: string };\n private dirty: boolean = false;\n\n constructor(name: string, elements: Element[] = []) {\n this.name = name;\n this.elements = new Map(elements.map((e) => [e.id, e]));\n }\n\n /**\n * Add an element to the layer\n */\n addElement(element: Element): void {\n this.elements.set(element.id, element);\n this.dirty = true;\n }\n\n /**\n * Get an element by ID\n */\n getElement(id: string): Element | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Delete an element by ID\n */\n deleteElement(id: string): boolean {\n const result = this.elements.delete(id);\n if (result) {\n this.dirty = true;\n }\n return result;\n }\n\n /**\n * List all elements in the layer\n */\n listElements(): Element[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Check if layer has unsaved changes\n */\n isDirty(): boolean {\n return this.dirty;\n }\n\n /**\n * Mark layer as clean (no unsaved changes)\n */\n markClean(): void {\n this.dirty = false;\n }\n\n /**\n * Serialize to JSON representation\n */\n toJSON(): LayerData {\n const result: LayerData = {\n elements: Array.from(this.elements.values()).map((e) => e.toJSON()),\n };\n\n if (this.metadata) {\n result.metadata = this.metadata;\n }\n\n return result;\n }\n\n /**\n * Create Layer from JSON data\n */\n static fromJSON(name: string, data: LayerData): Layer {\n const elements = data.elements.map(\n (e) =>\n new Element({\n id: e.id,\n type: e.type,\n name: e.name,\n description: e.description,\n properties: e.properties,\n references: e.references,\n relationships: e.relationships,\n })\n );\n const layer = new Layer(name, elements);\n layer.metadata = data.metadata;\n return layer;\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;AAMlB,MAAO,MAAK;EAChB;EACA;EACA;EACQ,QAAiB;EAEzB,YAAY,MAAc,WAAsB,CAAA,GAAE;AAChD,SAAK,OAAO,MACZ,KAAK,WAAW,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;EACxD;;;;EAKA,WAAW,SAAgB;AACzB,SAAK,SAAS,IAAI,QAAQ,IAAI,OAAO,GACrC,KAAK,QAAQ;EACf;;;;EAKA,WAAW,IAAU;AACnB,WAAO,KAAK,SAAS,IAAI,EAAE;EAC7B;;;;EAKA,cAAc,IAAU;AACtB,UAAM,SAAS,KAAK,SAAS,OAAO,EAAE;AACtC,WAAI,WACF,KAAK,QAAQ,KAER;EACT;;;;EAKA,eAAY;AACV,WAAO,MAAM,KAAK,KAAK,SAAS,OAAM,CAAE;EAC1C;;;;EAKA,UAAO;AACL,WAAO,KAAK;EACd;;;;EAKA,YAAS;AACP,SAAK,QAAQ;EACf;;;;EAKA,SAAM;AACJ,UAAM,SAAoB;MACxB,UAAU,MAAM,KAAK,KAAK,SAAS,OAAM,CAAE,EAAE,IAAI,CAAC,MAAM,EAAE,OAAM,CAAE;;AAGpE,WAAI,KAAK,aACP,OAAO,WAAW,KAAK,WAGlB;EACT;;;;EAKA,OAAO,SAAS,MAAc,MAAe;AAC3C,UAAM,WAAW,KAAK,SAAS,IAC7B,CAAC,MACC,IAAI,QAAQ;MACV,IAAI,EAAE;MACN,MAAM,EAAE;MACR,MAAM,EAAE;MACR,aAAa,EAAE;MACf,YAAY,EAAE;MACd,YAAY,EAAE;MACd,eAAe,EAAE;KAClB,CAAC,GAEA,QAAQ,IAAI,MAAM,MAAM,QAAQ;AACtC,iBAAM,WAAW,KAAK,UACf;EACT;;",
6
+ "names": []
7
+ }
@@ -0,0 +1,57 @@
1
+ class Manifest {
2
+ name;
3
+ version;
4
+ description;
5
+ author;
6
+ created;
7
+ modified;
8
+ specVersion;
9
+ layers;
10
+ // Python CLI layer configuration
11
+ statistics;
12
+ cross_references;
13
+ conventions;
14
+ // Python CLI conventions
15
+ upgrade_history;
16
+ // Python CLI upgrade tracking
17
+ changeset_history;
18
+ // Changeset application tracking
19
+ constructor(data) {
20
+ this.name = data.name, this.version = data.version, this.description = data.description, this.author = data.author, this.created = data.created ?? (/* @__PURE__ */ new Date()).toISOString(), this.modified = data.modified ?? (/* @__PURE__ */ new Date()).toISOString(), this.specVersion = data.specVersion, this.layers = data.layers, this.statistics = data.statistics, this.cross_references = data.cross_references, this.conventions = data.conventions, this.upgrade_history = data.upgrade_history, this.changeset_history = data.changeset_history || [];
21
+ }
22
+ /**
23
+ * Update the modified timestamp to current time
24
+ */
25
+ updateModified() {
26
+ this.modified = (/* @__PURE__ */ new Date()).toISOString();
27
+ }
28
+ /**
29
+ * Serialize to JSON representation
30
+ */
31
+ toJSON() {
32
+ const result = {
33
+ name: this.name,
34
+ version: this.version,
35
+ created: this.created,
36
+ modified: this.modified
37
+ };
38
+ return this.description && (result.description = this.description), this.author && (result.author = this.author), this.specVersion && (result.specVersion = this.specVersion), this.layers && (result.layers = this.layers), this.statistics && (result.statistics = this.statistics), this.cross_references && (result.cross_references = this.cross_references), this.conventions && (result.conventions = this.conventions), this.upgrade_history && (result.upgrade_history = this.upgrade_history), this.changeset_history && this.changeset_history.length > 0 && (result.changeset_history = this.changeset_history), result;
39
+ }
40
+ /**
41
+ * Create Manifest from JSON string
42
+ */
43
+ static fromJSON(json) {
44
+ const data = JSON.parse(json);
45
+ return new Manifest(data);
46
+ }
47
+ /**
48
+ * String representation
49
+ */
50
+ toString() {
51
+ return `Manifest(${this.name} v${this.version})`;
52
+ }
53
+ }
54
+ export {
55
+ Manifest
56
+ };
57
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/manifest.ts"],
4
+ "sourcesContent": ["import type { ManifestData } from \"../types/index.js\";\n\n/**\n * Manifest class representing model metadata\n */\nexport class Manifest {\n name: string;\n version: string;\n description?: string;\n author?: string;\n created: string;\n modified: string;\n specVersion?: string;\n layers?: Record<string, any>; // Python CLI layer configuration\n statistics?: {\n total_elements: number;\n total_relationships: number;\n completeness?: number;\n last_validation?: string;\n validation_status?: string;\n };\n cross_references?: {\n total: number;\n by_type: Record<string, number>;\n };\n conventions?: any; // Python CLI conventions\n upgrade_history?: any[]; // Python CLI upgrade tracking\n changeset_history?: Array<{\n name: string;\n applied_at: string;\n action: 'applied' | 'reverted';\n }>; // Changeset application tracking\n\n constructor(data: ManifestData) {\n this.name = data.name;\n this.version = data.version;\n this.description = data.description;\n this.author = data.author;\n this.created = data.created ?? new Date().toISOString();\n this.modified = data.modified ?? new Date().toISOString();\n this.specVersion = data.specVersion;\n // Python CLI compatibility fields\n this.layers = (data as any).layers;\n this.statistics = (data as any).statistics;\n this.cross_references = (data as any).cross_references;\n this.conventions = (data as any).conventions;\n this.upgrade_history = (data as any).upgrade_history;\n this.changeset_history = (data as any).changeset_history || [];\n }\n\n /**\n * Update the modified timestamp to current time\n */\n updateModified(): void {\n this.modified = new Date().toISOString();\n }\n\n /**\n * Serialize to JSON representation\n */\n toJSON(): ManifestData {\n const result: any = {\n name: this.name,\n version: this.version,\n created: this.created,\n modified: this.modified,\n };\n\n if (this.description) {\n result.description = this.description;\n }\n\n if (this.author) {\n result.author = this.author;\n }\n\n if (this.specVersion) {\n result.specVersion = this.specVersion;\n }\n\n // Include Python CLI compatibility fields\n if (this.layers) {\n result.layers = this.layers;\n }\n\n if (this.statistics) {\n result.statistics = this.statistics;\n }\n\n if (this.cross_references) {\n result.cross_references = this.cross_references;\n }\n\n if (this.conventions) {\n result.conventions = this.conventions;\n }\n\n if (this.upgrade_history) {\n result.upgrade_history = this.upgrade_history;\n }\n\n if (this.changeset_history && this.changeset_history.length > 0) {\n result.changeset_history = this.changeset_history;\n }\n\n return result;\n }\n\n /**\n * Create Manifest from JSON string\n */\n static fromJSON(json: string): Manifest {\n const data = JSON.parse(json) as ManifestData;\n return new Manifest(data);\n }\n\n /**\n * String representation\n */\n toString(): string {\n return `Manifest(${this.name} v${this.version})`;\n }\n}\n"],
5
+ "mappings": "AAKM,MAAO,SAAQ;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EACA;EAOA;EAIA;;EACA;;EACA;;EAMA,YAAY,MAAkB;AAC5B,SAAK,OAAO,KAAK,MACjB,KAAK,UAAU,KAAK,SACpB,KAAK,cAAc,KAAK,aACxB,KAAK,SAAS,KAAK,QACnB,KAAK,UAAU,KAAK,YAAW,oBAAI,KAAI,GAAG,YAAW,GACrD,KAAK,WAAW,KAAK,aAAY,oBAAI,KAAI,GAAG,YAAW,GACvD,KAAK,cAAc,KAAK,aAExB,KAAK,SAAU,KAAa,QAC5B,KAAK,aAAc,KAAa,YAChC,KAAK,mBAAoB,KAAa,kBACtC,KAAK,cAAe,KAAa,aACjC,KAAK,kBAAmB,KAAa,iBACrC,KAAK,oBAAqB,KAAa,qBAAqB,CAAA;EAC9D;;;;EAKA,iBAAc;AACZ,SAAK,YAAW,oBAAI,KAAI,GAAG,YAAW;EACxC;;;;EAKA,SAAM;AACJ,UAAM,SAAc;MAClB,MAAM,KAAK;MACX,SAAS,KAAK;MACd,SAAS,KAAK;MACd,UAAU,KAAK;;AAGjB,WAAI,KAAK,gBACP,OAAO,cAAc,KAAK,cAGxB,KAAK,WACP,OAAO,SAAS,KAAK,SAGnB,KAAK,gBACP,OAAO,cAAc,KAAK,cAIxB,KAAK,WACP,OAAO,SAAS,KAAK,SAGnB,KAAK,eACP,OAAO,aAAa,KAAK,aAGvB,KAAK,qBACP,OAAO,mBAAmB,KAAK,mBAG7B,KAAK,gBACP,OAAO,cAAc,KAAK,cAGxB,KAAK,oBACP,OAAO,kBAAkB,KAAK,kBAG5B,KAAK,qBAAqB,KAAK,kBAAkB,SAAS,MAC5D,OAAO,oBAAoB,KAAK,oBAG3B;EACT;;;;EAKA,OAAO,SAAS,MAAY;AAC1B,UAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,WAAO,IAAI,SAAS,IAAI;EAC1B;;;;EAKA,WAAQ;AACN,WAAO,YAAY,KAAK,IAAI,KAAK,KAAK,OAAO;EAC/C;;",
6
+ "names": []
7
+ }
@@ -0,0 +1,131 @@
1
+ class MigrationRegistry {
2
+ migrations = [];
3
+ constructor() {
4
+ this.registerMigrations();
5
+ }
6
+ /**
7
+ * Register all available migrations
8
+ */
9
+ registerMigrations() {
10
+ this.migrations.push({
11
+ fromVersion: "0.5.0",
12
+ toVersion: "0.6.0",
13
+ description: "Relationship Taxonomy (Spec v0.6.0)",
14
+ apply: async () => ({
15
+ migrationsApplied: 1,
16
+ filesModified: 0,
17
+ description: "Spec version updated to 0.6.0 (Relationship Taxonomy now available)"
18
+ })
19
+ }), this.migrations.push({
20
+ fromVersion: "0.6.0",
21
+ toVersion: "0.7.0",
22
+ description: "Layer Schema Relationship Metadata (Spec v0.7.0)",
23
+ apply: async () => ({
24
+ migrationsApplied: 1,
25
+ filesModified: 0,
26
+ description: "Spec version updated to 0.7.0 (Layer schemas now include relationship metadata sections)"
27
+ })
28
+ });
29
+ }
30
+ /**
31
+ * Get the latest available specification version
32
+ */
33
+ getLatestVersion() {
34
+ return this.migrations.length === 0 ? "0.7.0" : this.migrations.map((m) => m.toVersion).sort().reverse()[0];
35
+ }
36
+ /**
37
+ * Get the sequence of migrations needed from one version to another
38
+ */
39
+ getMigrationPath(fromVersion, toVersion) {
40
+ const targetVersion = toVersion || this.getLatestVersion();
41
+ if (this.compareVersions(fromVersion, targetVersion) >= 0)
42
+ return [];
43
+ const path = [];
44
+ let current = fromVersion;
45
+ const sortedMigrations = [...this.migrations].sort((a, b) => this.compareVersions(a.fromVersion, b.fromVersion));
46
+ for (const migration of sortedMigrations)
47
+ this.compareVersions(current, migration.fromVersion) >= 0 && this.compareVersions(current, migration.toVersion) < 0 && this.compareVersions(migration.toVersion, targetVersion) <= 0 && (path.push(migration), current = migration.toVersion);
48
+ return path;
49
+ }
50
+ /**
51
+ * Check if a model requires migration
52
+ */
53
+ requiresMigration(currentVersion) {
54
+ return this.getMigrationPath(currentVersion).length > 0;
55
+ }
56
+ /**
57
+ * Apply all migrations in sequence
58
+ */
59
+ async applyMigrations(model, options) {
60
+ const path = this.getMigrationPath(options.fromVersion, options.toVersion), targetVersion = options.toVersion || this.getLatestVersion();
61
+ if (path.length === 0)
62
+ return {
63
+ applied: [],
64
+ currentVersion: options.fromVersion,
65
+ targetVersion,
66
+ totalChanges: 0
67
+ };
68
+ const results = {
69
+ applied: [],
70
+ currentVersion: options.fromVersion,
71
+ targetVersion,
72
+ totalChanges: 0
73
+ };
74
+ for (const migration of path)
75
+ if (options.dryRun)
76
+ results.applied.push({
77
+ from: migration.fromVersion,
78
+ to: migration.toVersion,
79
+ description: migration.description,
80
+ dryRun: !0
81
+ });
82
+ else
83
+ try {
84
+ const result = await migration.apply(model);
85
+ results.applied.push({
86
+ from: migration.fromVersion,
87
+ to: migration.toVersion,
88
+ description: migration.description,
89
+ changes: result
90
+ }), results.totalChanges += result.migrationsApplied, model.manifest.specVersion = migration.toVersion;
91
+ } catch (error) {
92
+ throw new Error(`Migration ${migration.fromVersion} \u2192 ${migration.toVersion} failed: ${error instanceof Error ? error.message : String(error)}`);
93
+ }
94
+ return results;
95
+ }
96
+ /**
97
+ * Get a summary of migrations that would be applied
98
+ */
99
+ getMigrationSummary(fromVersion, toVersion) {
100
+ const path = this.getMigrationPath(fromVersion, toVersion), targetVersion = toVersion || this.getLatestVersion();
101
+ return {
102
+ currentVersion: fromVersion,
103
+ targetVersion,
104
+ migrationsNeeded: path.length,
105
+ migrations: path.map((m) => ({
106
+ from: m.fromVersion,
107
+ to: m.toVersion,
108
+ description: m.description
109
+ }))
110
+ };
111
+ }
112
+ /**
113
+ * Compare two version strings
114
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
115
+ */
116
+ compareVersions(a, b) {
117
+ const aParts = a.split(".").map(Number), bParts = b.split(".").map(Number), maxLength = Math.max(aParts.length, bParts.length);
118
+ for (let i = 0; i < maxLength; i++) {
119
+ const aPart = aParts[i] || 0, bPart = bParts[i] || 0;
120
+ if (aPart < bPart)
121
+ return -1;
122
+ if (aPart > bPart)
123
+ return 1;
124
+ }
125
+ return 0;
126
+ }
127
+ }
128
+ export {
129
+ MigrationRegistry
130
+ };
131
+ //# sourceMappingURL=migration-registry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/migration-registry.ts"],
4
+ "sourcesContent": ["/**\n * Migration Registry - Manages version-based model migrations\n *\n * Handles sequential migrations from one spec version to another,\n * supporting the evolution of the architecture model specification.\n */\n\nimport type { Model } from './model.js';\n\n/**\n * Represents a single version migration\n */\nexport interface Migration {\n fromVersion: string;\n toVersion: string;\n description: string;\n apply: (model: Model) => Promise<MigrationResult>;\n}\n\n/**\n * Result of applying a migration\n */\nexport interface MigrationResult {\n migrationsApplied: number;\n filesModified: number;\n description: string;\n error?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Migration Registry managing all available migrations\n */\nexport class MigrationRegistry {\n private migrations: Migration[] = [];\n\n constructor() {\n this.registerMigrations();\n }\n\n /**\n * Register all available migrations\n */\n private registerMigrations(): void {\n // Migration from v0.5.0 to v0.6.0: Relationship Taxonomy\n this.migrations.push({\n fromVersion: '0.5.0',\n toVersion: '0.6.0',\n description: 'Relationship Taxonomy (Spec v0.6.0)',\n apply: async () => {\n // This migration is opt-in - the new relationship taxonomy\n // is fully backward compatible with existing models\n return {\n migrationsApplied: 1,\n filesModified: 0,\n description: 'Spec version updated to 0.6.0 (Relationship Taxonomy now available)',\n };\n },\n });\n\n // Migration from v0.6.0 to v0.7.0: Layer Schema Relationship Metadata\n this.migrations.push({\n fromVersion: '0.6.0',\n toVersion: '0.7.0',\n description: 'Layer Schema Relationship Metadata (Spec v0.7.0)',\n apply: async () => {\n // This migration updates layer schemas with relationship metadata sections\n // - All 12 layer schemas now include layerMetadata, intraLayerRelationships, crossLayerRelationships\n // - Deprecates link-registry.json (will be removed in v0.8.0)\n // - Terminology change: \"cross-layer links\" \u2192 \"cross-layer relationships\"\n // Fully backward compatible - existing models continue to work\n return {\n migrationsApplied: 1,\n filesModified: 0,\n description: 'Spec version updated to 0.7.0 (Layer schemas now include relationship metadata sections)',\n };\n },\n });\n }\n\n /**\n * Get the latest available specification version\n */\n getLatestVersion(): string {\n if (this.migrations.length === 0) {\n return '0.7.0';\n }\n\n // Return the highest toVersion from all migrations\n const versions = this.migrations.map((m) => m.toVersion);\n return versions.sort().reverse()[0];\n }\n\n /**\n * Get the sequence of migrations needed from one version to another\n */\n getMigrationPath(fromVersion: string, toVersion?: string): Migration[] {\n const targetVersion = toVersion || this.getLatestVersion();\n\n if (this.compareVersions(fromVersion, targetVersion) >= 0) {\n return [];\n }\n\n const path: Migration[] = [];\n let current = fromVersion;\n\n // Sort migrations by fromVersion\n const sortedMigrations = [...this.migrations].sort((a, b) =>\n this.compareVersions(a.fromVersion, b.fromVersion)\n );\n\n for (const migration of sortedMigrations) {\n // Check if this migration is in our path\n if (\n this.compareVersions(current, migration.fromVersion) >= 0 &&\n this.compareVersions(current, migration.toVersion) < 0 &&\n this.compareVersions(migration.toVersion, targetVersion) <= 0\n ) {\n path.push(migration);\n current = migration.toVersion;\n }\n }\n\n return path;\n }\n\n /**\n * Check if a model requires migration\n */\n requiresMigration(currentVersion: string): boolean {\n const path = this.getMigrationPath(currentVersion);\n return path.length > 0;\n }\n\n /**\n * Apply all migrations in sequence\n */\n async applyMigrations(\n model: Model,\n options: {\n fromVersion: string;\n toVersion?: string;\n dryRun?: boolean;\n validate?: boolean;\n }\n ): Promise<ApplyMigrationsResult> {\n const path = this.getMigrationPath(options.fromVersion, options.toVersion);\n const targetVersion = options.toVersion || this.getLatestVersion();\n\n if (path.length === 0) {\n return {\n applied: [],\n currentVersion: options.fromVersion,\n targetVersion,\n totalChanges: 0,\n };\n }\n\n const results: ApplyMigrationsResult = {\n applied: [],\n currentVersion: options.fromVersion,\n targetVersion,\n totalChanges: 0,\n };\n\n for (const migration of path) {\n if (!options.dryRun) {\n try {\n const result = await migration.apply(model);\n\n results.applied.push({\n from: migration.fromVersion,\n to: migration.toVersion,\n description: migration.description,\n changes: result,\n });\n\n results.totalChanges += result.migrationsApplied;\n\n // Update model's spec version\n model.manifest.specVersion = migration.toVersion;\n } catch (error) {\n throw new Error(\n `Migration ${migration.fromVersion} \u2192 ${migration.toVersion} failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n } else {\n // Dry run - just record what would happen\n results.applied.push({\n from: migration.fromVersion,\n to: migration.toVersion,\n description: migration.description,\n dryRun: true,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get a summary of migrations that would be applied\n */\n getMigrationSummary(\n fromVersion: string,\n toVersion?: string\n ): {\n currentVersion: string;\n targetVersion: string;\n migrationsNeeded: number;\n migrations: Array<{\n from: string;\n to: string;\n description: string;\n }>;\n } {\n const path = this.getMigrationPath(fromVersion, toVersion);\n const targetVersion = toVersion || this.getLatestVersion();\n\n return {\n currentVersion: fromVersion,\n targetVersion,\n migrationsNeeded: path.length,\n migrations: path.map((m) => ({\n from: m.fromVersion,\n to: m.toVersion,\n description: m.description,\n })),\n };\n }\n\n /**\n * Compare two version strings\n * Returns: -1 if a < b, 0 if a == b, 1 if a > b\n */\n private compareVersions(a: string, b: string): number {\n const aParts = a.split('.').map(Number);\n const bParts = b.split('.').map(Number);\n\n const maxLength = Math.max(aParts.length, bParts.length);\n\n for (let i = 0; i < maxLength; i++) {\n const aPart = aParts[i] || 0;\n const bPart = bParts[i] || 0;\n\n if (aPart < bPart) return -1;\n if (aPart > bPart) return 1;\n }\n\n return 0;\n }\n}\n\n/**\n * Result of applying multiple migrations\n */\nexport interface ApplyMigrationsResult {\n applied: Array<{\n from: string;\n to: string;\n description: string;\n changes?: MigrationResult;\n dryRun?: boolean;\n }>;\n currentVersion: string;\n targetVersion: string;\n totalChanges: number;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }