@documentation-robotics/cli 0.1.8 → 0.1.9

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 (120) hide show
  1. package/README.md +18 -17
  2. package/dist/audit/nodes/ai/prompts.js +1 -0
  3. package/dist/audit/nodes/ai/prompts.js.map +2 -2
  4. package/dist/audit/relationships/ai/prompts.js +20 -29
  5. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  6. package/dist/audit/relationships/analysis/gap-analyzer.js.map +1 -1
  7. package/dist/audit/relationships/analysis/layer-templates.js +36 -0
  8. package/dist/audit/relationships/analysis/layer-templates.js.map +2 -2
  9. package/dist/cli.js +8 -8
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/reports.js +3 -3
  12. package/dist/commands/reports.js.map +1 -1
  13. package/dist/commands/show.js.map +1 -1
  14. package/dist/commands/upgrade.js +1 -1
  15. package/dist/commands/upgrade.js.map +1 -1
  16. package/dist/commands/validate.js.map +1 -1
  17. package/dist/commands/version.js +1 -1
  18. package/dist/core/layers.js +1 -0
  19. package/dist/core/layers.js.map +2 -2
  20. package/dist/core/migration-registry.js +59 -2
  21. package/dist/core/migration-registry.js.map +2 -2
  22. package/dist/core/model.js +3 -16
  23. package/dist/core/model.js.map +2 -2
  24. package/dist/core/spec-loader.js.map +1 -1
  25. package/dist/core/stats-collector.js +2 -0
  26. package/dist/core/stats-collector.js.map +2 -2
  27. package/dist/export/archimate-exporter.js.map +2 -2
  28. package/dist/export/json-schema-exporter.js.map +1 -1
  29. package/dist/export/markdown-exporter.js.map +1 -1
  30. package/dist/export/markdown-utils.js +1 -0
  31. package/dist/export/markdown-utils.js.map +2 -2
  32. package/dist/export/mermaid-markdown-exporter.js.map +1 -1
  33. package/dist/export/openapi-exporter.js.map +1 -1
  34. package/dist/export/plantuml-exporter.js.map +1 -1
  35. package/dist/export/report-formatters.js +2 -2
  36. package/dist/export/report-formatters.js.map +1 -1
  37. package/dist/export/types.js +1 -0
  38. package/dist/export/types.js.map +2 -2
  39. package/dist/generated/layer-registry.js +44 -31
  40. package/dist/generated/layer-registry.js.map +2 -2
  41. package/dist/generated/layer-types.js +1 -1
  42. package/dist/generated/layer-types.js.map +2 -2
  43. package/dist/generated/node-types.js +45 -0
  44. package/dist/generated/node-types.js.map +2 -2
  45. package/dist/generated/relationship-index.js +201 -19
  46. package/dist/generated/relationship-index.js.map +2 -2
  47. package/dist/import/archimate-importer.js.map +1 -1
  48. package/dist/import/openapi-importer.js.map +1 -1
  49. package/dist/integrations/claude_code/agents/dr-advisor.md +14 -13
  50. package/dist/integrations/claude_code/agents/dr-extractor.md +2 -2
  51. package/dist/integrations/claude_code/commands/dr-info.md +1 -1
  52. package/dist/integrations/claude_code/commands/dr-init.md +3 -3
  53. package/dist/integrations/claude_code/commands/dr-map.md +2 -2
  54. package/dist/integrations/claude_code/commands/dr-model.md +1 -1
  55. package/dist/integrations/claude_code/commands/dr-relate.md +14 -4
  56. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +3 -3
  57. package/dist/integrations/claude_code/docs/QUICK_START.md +1 -1
  58. package/dist/integrations/claude_code/docs/README.md +2 -2
  59. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +2 -2
  60. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +679 -0
  61. package/dist/integrations/claude_code/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +1 -1
  62. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +2 -2
  63. package/dist/integrations/github_copilot/agents/dr-advisor.md +14 -13
  64. package/dist/integrations/github_copilot/agents/dr-architect.md +15 -14
  65. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +2 -2
  66. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +253 -0
  67. package/dist/reports/model-report-orchestrator.js +3 -3
  68. package/dist/reports/model-report-orchestrator.js.map +1 -1
  69. package/dist/schemas/bundled/analyzers/cbm.json +2 -2
  70. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  71. package/dist/schemas/bundled/api.json +3 -3
  72. package/dist/schemas/bundled/apm.json +3 -3
  73. package/dist/schemas/bundled/application.json +3 -3
  74. package/dist/schemas/bundled/base.json +29 -1
  75. package/dist/schemas/bundled/business.json +1 -1
  76. package/dist/schemas/bundled/data-model.json +3 -3
  77. package/dist/schemas/bundled/data-store.json +3 -3
  78. package/dist/schemas/bundled/manifest.json +20 -13
  79. package/dist/schemas/bundled/motivation.json +1 -1
  80. package/dist/schemas/bundled/navigation.json +3 -3
  81. package/dist/schemas/bundled/product.json +469 -0
  82. package/dist/schemas/bundled/security.json +3 -3
  83. package/dist/schemas/bundled/technology.json +3 -3
  84. package/dist/schemas/bundled/testing.json +3 -3
  85. package/dist/schemas/bundled/ux.json +3 -3
  86. package/dist/server/server.js +4 -15
  87. package/dist/server/server.js.map +2 -2
  88. package/dist/telemetry/index.js +1 -1
  89. package/dist/utils/spec-installer.js +2 -2
  90. package/dist/utils/spec-installer.js.map +1 -1
  91. package/dist/utils/spec-version.js +1 -1
  92. package/dist/utils/spec-version.js.map +1 -1
  93. package/dist/viewer/README.md +6 -6
  94. package/dist/viewer/assets/main-D114QwJo.css +1 -0
  95. package/dist/viewer/assets/main-DyuokeQj.js +81 -0
  96. package/dist/viewer/index.html +2 -2
  97. package/dist/viewer/manifest.json +10 -10
  98. package/dist/viewer/version.json +1 -1
  99. package/package.json +1 -1
  100. package/dist/viewer/assets/main-CY0Xufuj.css +0 -1
  101. package/dist/viewer/assets/main-DtgErnwF.js +0 -81
  102. /package/dist/integrations/claude_code/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
  103. /package/dist/integrations/claude_code/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
  104. /package/dist/integrations/claude_code/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
  105. /package/dist/integrations/claude_code/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
  106. /package/dist/integrations/claude_code/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
  107. /package/dist/integrations/claude_code/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
  108. /package/dist/integrations/claude_code/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
  109. /package/dist/integrations/claude_code/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
  110. /package/dist/integrations/claude_code/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
  111. /package/dist/integrations/github_copilot/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
  112. /package/dist/integrations/github_copilot/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
  113. /package/dist/integrations/github_copilot/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
  114. /package/dist/integrations/github_copilot/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
  115. /package/dist/integrations/github_copilot/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
  116. /package/dist/integrations/github_copilot/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +0 -0
  117. /package/dist/integrations/github_copilot/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
  118. /package/dist/integrations/github_copilot/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
  119. /package/dist/integrations/github_copilot/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
  120. /package/dist/integrations/github_copilot/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/export/report-formatters.ts"],
4
- "sourcesContent": ["/**\n * Report formatters for comprehensive architecture reports\n * Supports text, JSON, and markdown output formats\n */\n\nimport ansis from \"ansis\";\nimport { ReportData, QualityMetrics } from \"../core/report-data-model.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\n\nexport type ReportFormat = \"text\" | \"json\" | \"markdown\" | \"compact\";\n\nexport interface ReportFormatterOptions {\n format: ReportFormat;\n compact?: boolean;\n verbose?: boolean;\n includeDataModel?: boolean;\n includeQuality?: boolean;\n}\n\n/**\n * Format report for output\n */\nexport function formatReport(report: ReportData, options: ReportFormatterOptions): string {\n switch (options.format) {\n case \"json\":\n return formatJSON(report);\n case \"markdown\":\n return formatMarkdown(report, options);\n case \"compact\":\n return formatCompact(report);\n case \"text\":\n default:\n return formatText(report, options);\n }\n}\n\n/**\n * Format as plain text (default)\n */\nfunction formatText(report: ReportData, options: ReportFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"\");\n lines.push(ansis.bold(`\uD83D\uDCCA Architecture Report: ${ansis.cyan(report.statistics.project.name)}`));\n lines.push(ansis.dim(\"=\".repeat(80)));\n lines.push(\"\");\n lines.push(`Generated: ${formatDate(report.timestamp)}`);\n lines.push(`Version: ${report.statistics.project.version}`);\n lines.push(\"\");\n\n // Quality Overview\n if (options.includeQuality) {\n formatQualitySection(lines, report.quality);\n lines.push(\"\");\n }\n\n // Statistics\n formatStatisticsSection(lines, report);\n lines.push(\"\");\n\n // Relationships\n formatRelationshipsSection(lines, report);\n lines.push(\"\");\n\n // Data Model\n if (options.includeDataModel) {\n formatDataModelSection(lines, report);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as JSON\n */\nfunction formatJSON(report: ReportData): string {\n return JSON.stringify(report, null, 2) + \"\\n\";\n}\n\n/**\n * Format as Markdown\n */\nfunction formatMarkdown(report: ReportData, options: ReportFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Architecture Report: ${report.statistics.project.name}`);\n lines.push(\"\");\n lines.push(`**Generated:** ${formatDate(report.timestamp)}`);\n lines.push(`**Version:** ${report.statistics.project.version}`);\n lines.push(\"\");\n\n // Table of Contents\n lines.push(\"## Contents\");\n lines.push(\"- [Quality Metrics](#quality-metrics)\");\n lines.push(\"- [Statistics](#statistics)\");\n lines.push(\"- [Relationships](#relationships)\");\n if (options.includeDataModel) {\n lines.push(\"- [Data Model](#data-model)\");\n }\n lines.push(\"\");\n\n // Quality Metrics\n if (options.includeQuality) {\n formatQualityMarkdown(lines, report.quality);\n lines.push(\"\");\n }\n\n // Statistics\n formatStatisticsMarkdown(lines, report);\n lines.push(\"\");\n\n // Relationships\n formatRelationshipsMarkdown(lines, report);\n lines.push(\"\");\n\n // Data Model\n if (options.includeDataModel) {\n formatDataModelMarkdown(lines, report);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as compact single line\n */\nfunction formatCompact(report: ReportData): string {\n const stats = report.statistics.statistics;\n const quality = report.quality;\n\n return (\n `${report.statistics.project.name} v${report.statistics.project.version}: ` +\n `${stats.totalElements} elements, ` +\n `${stats.totalRelationships} relationships, ` +\n `${report.relationships.circularDependencies.length} circular deps, ` +\n `${Math.round(quality.elementCoverage)}% coverage`\n );\n}\n\n/**\n * Format quality section for text output\n */\nfunction formatQualitySection(lines: string[], quality: QualityMetrics): void {\n lines.push(ansis.bold(\"Quality Metrics:\"));\n lines.push(\n ` ${ansis.gray(\"Element Coverage:\")} ${qualityBar(quality.elementCoverage)} ${quality.elementCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Relationship Coverage:\")} ${qualityBar(quality.relationshipCoverage)} ${quality.relationshipCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Documentation Coverage:\")} ${qualityBar(quality.documentationCoverage)} ${quality.documentationCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Layer Coverage:\")} ${qualityBar(quality.layerCoverage)} ${quality.layerCoverage.toFixed(0)}%`\n );\n lines.push(\"\");\n lines.push(\n ` ${ansis.gray(\"ArchiMate Compliance:\")} ${quality.archimateCompliance.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Spec Compliance:\")} ${quality.specCompliance.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Semantic Consistency:\")} ${quality.semanticConsistency.toFixed(0)}%`\n );\n lines.push(\"\");\n lines.push(\n ` ${ansis.gray(\"Orphaned Elements:\")} ${quality.orphanedElements > 0 ? ansis.yellow(quality.orphanedElements) : ansis.green(\"0\")}`\n );\n lines.push(\n ` ${ansis.gray(\"Circular Dependencies:\")} ${quality.circularDependencies > 0 ? ansis.red(quality.circularDependencies) : ansis.green(\"0\")}`\n );\n}\n\n/**\n * Format statistics section for text output\n */\nfunction formatStatisticsSection(lines: string[], report: ReportData): void {\n const stats = report.statistics;\n\n lines.push(ansis.bold(\"Statistics:\"));\n lines.push(\n ` ${ansis.gray(\"Total Elements:\")} ${stats.statistics.totalElements}`\n );\n lines.push(\n ` ${ansis.gray(\"Total Relationships:\")} ${stats.statistics.totalRelationships}`\n );\n lines.push(\n ` ${ansis.gray(\"Populated Layers:\")} ${stats.statistics.populatedLayers}/${stats.statistics.totalLayers}`\n );\n lines.push(\"\");\n\n lines.push(ansis.bold(\"Top Element Types:\"));\n for (const layer of stats.layers.slice(0, 5)) {\n if (layer.totalElements > 0) {\n const types = Object.entries(layer.elementsByType)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 3)\n .map(([type, count]) => `${count} ${type}`)\n .join(\", \");\n lines.push(` ${layer.name}: ${types}`);\n }\n }\n}\n\n/**\n * Format relationships section for text output\n */\nfunction formatRelationshipsSection(lines: string[], report: ReportData): void {\n const relationships = report.relationships;\n\n lines.push(ansis.bold(\"Relationships:\"));\n lines.push(\n ` ${ansis.gray(\"Cross-Layer:\")} ${relationships.crossLayerCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Intra-Layer:\")} ${relationships.intraLayerCount}`\n );\n lines.push(\"\");\n\n lines.push(ansis.bold(\"By Category:\"));\n const categoryEntries = Object.entries(relationships.byCategory)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5);\n\n for (const [category, count] of categoryEntries) {\n const percentage = relationships.totalRelationships > 0 ? (count / relationships.totalRelationships) * 100 : 0;\n lines.push(` ${category.padEnd(20)} ${String(count).padEnd(3)} (${percentage.toFixed(0)}%)`);\n }\n\n if (relationships.circularDependencies.length > 0) {\n lines.push(\"\");\n lines.push(ansis.bold(ansis.red(\"\u26A0\uFE0F Circular Dependencies:\")));\n for (const circular of relationships.circularDependencies.slice(0, 5)) {\n lines.push(` ${circular.elements.join(\" \u2192 \")} \u2192 ${circular.elements[0]}`);\n }\n }\n}\n\n/**\n * Format data model section for text output\n */\nfunction formatDataModelSection(lines: string[], report: ReportData): void {\n const dataModel = report.dataModel;\n\n lines.push(ansis.bold(\"Data Model (Layer 7):\"));\n lines.push(\n ` ${ansis.gray(\"Total Entities:\")} ${dataModel.entityCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Total Attributes:\")} ${dataModel.attributeCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Entity Relationships:\")} ${dataModel.relationshipCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Referenced Entities:\")} ${dataModel.referencedEntities}`\n );\n lines.push(\"\");\n\n if (dataModel.orphanedEntities.length > 0) {\n lines.push(ansis.bold(ansis.yellow(\"\u26A0\uFE0F Orphaned Entities:\")));\n for (const entity of dataModel.orphanedEntities.slice(0, 5)) {\n lines.push(` - ${entity}`);\n }\n }\n}\n\n/**\n * Format quality section for markdown\n */\nfunction formatQualityMarkdown(lines: string[], quality: QualityMetrics): void {\n lines.push(\"## Quality Metrics\");\n lines.push(\"\");\n lines.push(\"### Coverage\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Element Coverage | ${quality.elementCoverage.toFixed(0)}% |`);\n lines.push(`| Relationship Coverage | ${quality.relationshipCoverage.toFixed(0)}% |`);\n lines.push(`| Documentation Coverage | ${quality.documentationCoverage.toFixed(0)}% |`);\n lines.push(`| Layer Coverage | ${quality.layerCoverage.toFixed(0)}% |`);\n lines.push(\"\");\n\n lines.push(\"### Compliance\");\n lines.push(\"| Metric | Score |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| ArchiMate Compliance | ${quality.archimateCompliance.toFixed(0)}% |`);\n lines.push(`| Spec Compliance | ${quality.specCompliance.toFixed(0)}% |`);\n lines.push(`| Semantic Consistency | ${quality.semanticConsistency.toFixed(0)}% |`);\n lines.push(\"\");\n\n lines.push(\"### Issues\");\n lines.push(`- Orphaned Elements: ${quality.orphanedElements}`);\n lines.push(`- Circular Dependencies: ${quality.circularDependencies}`);\n lines.push(\"\");\n}\n\n/**\n * Format statistics section for markdown\n */\nfunction formatStatisticsMarkdown(lines: string[], report: ReportData): void {\n const stats = report.statistics;\n\n lines.push(\"## Statistics\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Elements | ${stats.statistics.totalElements} |`);\n lines.push(`| Total Relationships | ${stats.statistics.totalRelationships} |`);\n lines.push(`| Populated Layers | ${stats.statistics.populatedLayers}/${stats.statistics.totalLayers} |`);\n lines.push(\"\");\n\n lines.push(\"### Elements by Layer\");\n lines.push(\"| Layer | Count | Types |\");\n lines.push(\"|-------|-------|-------|\");\n for (const layer of stats.layers) {\n if (layer.totalElements > 0) {\n const types = Object.keys(layer.elementsByType).join(\", \");\n lines.push(`| ${layer.name} | ${layer.totalElements} | ${types} |`);\n }\n }\n lines.push(\"\");\n}\n\n/**\n * Format relationships section for markdown\n */\nfunction formatRelationshipsMarkdown(lines: string[], report: ReportData): void {\n const relationships = report.relationships;\n\n lines.push(\"## Relationships\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Type | Count |\");\n lines.push(\"|------|-------|\");\n lines.push(`| Total | ${relationships.totalRelationships} |`);\n lines.push(`| Cross-Layer | ${relationships.crossLayerCount} |`);\n lines.push(`| Intra-Layer | ${relationships.intraLayerCount} |`);\n lines.push(\"\");\n\n lines.push(\"### By Category\");\n lines.push(\"| Category | Count | Percentage |\");\n lines.push(\"|----------|-------|-----------|\");\n for (const [category, count] of Object.entries(relationships.byCategory)\n .sort(([, a], [, b]) => b - a)) {\n const percentage = ((count / relationships.totalRelationships) * 100).toFixed(1);\n lines.push(`| ${category} | ${count} | ${percentage}% |`);\n }\n lines.push(\"\");\n\n if (relationships.circularDependencies.length > 0) {\n lines.push(\"### Circular Dependencies\");\n for (const circular of relationships.circularDependencies) {\n lines.push(`- ${circular.elements.join(\" \u2192 \")} \u2192 ${circular.elements[0]}`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format data model section for markdown\n */\nfunction formatDataModelMarkdown(lines: string[], report: ReportData): void {\n const dataModel = report.dataModel;\n\n lines.push(\"## Data Model (Layer 7)\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Entities | ${dataModel.entityCount} |`);\n lines.push(`| Total Attributes | ${dataModel.attributeCount} |`);\n lines.push(`| Entity Relationships | ${dataModel.relationshipCount} |`);\n lines.push(`| Referenced Entities | ${dataModel.referencedEntities} |`);\n lines.push(\"\");\n\n if (dataModel.orphanedEntities.length > 0) {\n lines.push(\"### Orphaned Entities\");\n for (const entity of dataModel.orphanedEntities) {\n lines.push(`- ${entity}`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Create quality progress bar\n */\nfunction qualityBar(percentage: number): string {\n const width = 20;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = \"\u2588\".repeat(filled) + \"\u2591\".repeat(empty);\n\n if (percentage >= 80) return ansis.green(bar);\n if (percentage >= 60) return ansis.yellow(bar);\n return ansis.red(bar);\n}\n"],
4
+ "sourcesContent": ["/**\n * Report formatters for comprehensive architecture reports\n * Supports text, JSON, and markdown output formats\n */\n\nimport ansis from \"ansis\";\nimport { ReportData, QualityMetrics } from \"../core/report-data-model.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\n\nexport type ReportFormat = \"text\" | \"json\" | \"markdown\" | \"compact\";\n\nexport interface ReportFormatterOptions {\n format: ReportFormat;\n compact?: boolean;\n verbose?: boolean;\n includeDataModel?: boolean;\n includeQuality?: boolean;\n}\n\n/**\n * Format report for output\n */\nexport function formatReport(report: ReportData, options: ReportFormatterOptions): string {\n switch (options.format) {\n case \"json\":\n return formatJSON(report);\n case \"markdown\":\n return formatMarkdown(report, options);\n case \"compact\":\n return formatCompact(report);\n case \"text\":\n default:\n return formatText(report, options);\n }\n}\n\n/**\n * Format as plain text (default)\n */\nfunction formatText(report: ReportData, options: ReportFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"\");\n lines.push(ansis.bold(`\uD83D\uDCCA Architecture Report: ${ansis.cyan(report.statistics.project.name)}`));\n lines.push(ansis.dim(\"=\".repeat(80)));\n lines.push(\"\");\n lines.push(`Generated: ${formatDate(report.timestamp)}`);\n lines.push(`Version: ${report.statistics.project.version}`);\n lines.push(\"\");\n\n // Quality Overview\n if (options.includeQuality) {\n formatQualitySection(lines, report.quality);\n lines.push(\"\");\n }\n\n // Statistics\n formatStatisticsSection(lines, report);\n lines.push(\"\");\n\n // Relationships\n formatRelationshipsSection(lines, report);\n lines.push(\"\");\n\n // Data Model\n if (options.includeDataModel) {\n formatDataModelSection(lines, report);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as JSON\n */\nfunction formatJSON(report: ReportData): string {\n return JSON.stringify(report, null, 2) + \"\\n\";\n}\n\n/**\n * Format as Markdown\n */\nfunction formatMarkdown(report: ReportData, options: ReportFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Architecture Report: ${report.statistics.project.name}`);\n lines.push(\"\");\n lines.push(`**Generated:** ${formatDate(report.timestamp)}`);\n lines.push(`**Version:** ${report.statistics.project.version}`);\n lines.push(\"\");\n\n // Table of Contents\n lines.push(\"## Contents\");\n lines.push(\"- [Quality Metrics](#quality-metrics)\");\n lines.push(\"- [Statistics](#statistics)\");\n lines.push(\"- [Relationships](#relationships)\");\n if (options.includeDataModel) {\n lines.push(\"- [Data Model](#data-model)\");\n }\n lines.push(\"\");\n\n // Quality Metrics\n if (options.includeQuality) {\n formatQualityMarkdown(lines, report.quality);\n lines.push(\"\");\n }\n\n // Statistics\n formatStatisticsMarkdown(lines, report);\n lines.push(\"\");\n\n // Relationships\n formatRelationshipsMarkdown(lines, report);\n lines.push(\"\");\n\n // Data Model\n if (options.includeDataModel) {\n formatDataModelMarkdown(lines, report);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as compact single line\n */\nfunction formatCompact(report: ReportData): string {\n const stats = report.statistics.statistics;\n const quality = report.quality;\n\n return (\n `${report.statistics.project.name} v${report.statistics.project.version}: ` +\n `${stats.totalElements} elements, ` +\n `${stats.totalRelationships} relationships, ` +\n `${report.relationships.circularDependencies.length} circular deps, ` +\n `${Math.round(quality.elementCoverage)}% coverage`\n );\n}\n\n/**\n * Format quality section for text output\n */\nfunction formatQualitySection(lines: string[], quality: QualityMetrics): void {\n lines.push(ansis.bold(\"Quality Metrics:\"));\n lines.push(\n ` ${ansis.gray(\"Element Coverage:\")} ${qualityBar(quality.elementCoverage)} ${quality.elementCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Relationship Coverage:\")} ${qualityBar(quality.relationshipCoverage)} ${quality.relationshipCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Documentation Coverage:\")} ${qualityBar(quality.documentationCoverage)} ${quality.documentationCoverage.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Layer Coverage:\")} ${qualityBar(quality.layerCoverage)} ${quality.layerCoverage.toFixed(0)}%`\n );\n lines.push(\"\");\n lines.push(\n ` ${ansis.gray(\"ArchiMate Compliance:\")} ${quality.archimateCompliance.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Spec Compliance:\")} ${quality.specCompliance.toFixed(0)}%`\n );\n lines.push(\n ` ${ansis.gray(\"Semantic Consistency:\")} ${quality.semanticConsistency.toFixed(0)}%`\n );\n lines.push(\"\");\n lines.push(\n ` ${ansis.gray(\"Orphaned Elements:\")} ${quality.orphanedElements > 0 ? ansis.yellow(quality.orphanedElements) : ansis.green(\"0\")}`\n );\n lines.push(\n ` ${ansis.gray(\"Circular Dependencies:\")} ${quality.circularDependencies > 0 ? ansis.red(quality.circularDependencies) : ansis.green(\"0\")}`\n );\n}\n\n/**\n * Format statistics section for text output\n */\nfunction formatStatisticsSection(lines: string[], report: ReportData): void {\n const stats = report.statistics;\n\n lines.push(ansis.bold(\"Statistics:\"));\n lines.push(\n ` ${ansis.gray(\"Total Elements:\")} ${stats.statistics.totalElements}`\n );\n lines.push(\n ` ${ansis.gray(\"Total Relationships:\")} ${stats.statistics.totalRelationships}`\n );\n lines.push(\n ` ${ansis.gray(\"Populated Layers:\")} ${stats.statistics.populatedLayers}/${stats.statistics.totalLayers}`\n );\n lines.push(\"\");\n\n lines.push(ansis.bold(\"Top Element Types:\"));\n for (const layer of stats.layers.slice(0, 5)) {\n if (layer.totalElements > 0) {\n const types = Object.entries(layer.elementsByType)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 3)\n .map(([type, count]) => `${count} ${type}`)\n .join(\", \");\n lines.push(` ${layer.name}: ${types}`);\n }\n }\n}\n\n/**\n * Format relationships section for text output\n */\nfunction formatRelationshipsSection(lines: string[], report: ReportData): void {\n const relationships = report.relationships;\n\n lines.push(ansis.bold(\"Relationships:\"));\n lines.push(\n ` ${ansis.gray(\"Cross-Layer:\")} ${relationships.crossLayerCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Intra-Layer:\")} ${relationships.intraLayerCount}`\n );\n lines.push(\"\");\n\n lines.push(ansis.bold(\"By Category:\"));\n const categoryEntries = Object.entries(relationships.byCategory)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5);\n\n for (const [category, count] of categoryEntries) {\n const percentage = relationships.totalRelationships > 0 ? (count / relationships.totalRelationships) * 100 : 0;\n lines.push(` ${category.padEnd(20)} ${String(count).padEnd(3)} (${percentage.toFixed(0)}%)`);\n }\n\n if (relationships.circularDependencies.length > 0) {\n lines.push(\"\");\n lines.push(ansis.bold(ansis.red(\"\u26A0\uFE0F Circular Dependencies:\")));\n for (const circular of relationships.circularDependencies.slice(0, 5)) {\n lines.push(` ${circular.elements.join(\" \u2192 \")} \u2192 ${circular.elements[0]}`);\n }\n }\n}\n\n/**\n * Format data model section for text output\n */\nfunction formatDataModelSection(lines: string[], report: ReportData): void {\n const dataModel = report.dataModel;\n\n lines.push(ansis.bold(\"Data Model (Layer 8):\"));\n lines.push(\n ` ${ansis.gray(\"Total Entities:\")} ${dataModel.entityCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Total Attributes:\")} ${dataModel.attributeCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Entity Relationships:\")} ${dataModel.relationshipCount}`\n );\n lines.push(\n ` ${ansis.gray(\"Referenced Entities:\")} ${dataModel.referencedEntities}`\n );\n lines.push(\"\");\n\n if (dataModel.orphanedEntities.length > 0) {\n lines.push(ansis.bold(ansis.yellow(\"\u26A0\uFE0F Orphaned Entities:\")));\n for (const entity of dataModel.orphanedEntities.slice(0, 5)) {\n lines.push(` - ${entity}`);\n }\n }\n}\n\n/**\n * Format quality section for markdown\n */\nfunction formatQualityMarkdown(lines: string[], quality: QualityMetrics): void {\n lines.push(\"## Quality Metrics\");\n lines.push(\"\");\n lines.push(\"### Coverage\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Element Coverage | ${quality.elementCoverage.toFixed(0)}% |`);\n lines.push(`| Relationship Coverage | ${quality.relationshipCoverage.toFixed(0)}% |`);\n lines.push(`| Documentation Coverage | ${quality.documentationCoverage.toFixed(0)}% |`);\n lines.push(`| Layer Coverage | ${quality.layerCoverage.toFixed(0)}% |`);\n lines.push(\"\");\n\n lines.push(\"### Compliance\");\n lines.push(\"| Metric | Score |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| ArchiMate Compliance | ${quality.archimateCompliance.toFixed(0)}% |`);\n lines.push(`| Spec Compliance | ${quality.specCompliance.toFixed(0)}% |`);\n lines.push(`| Semantic Consistency | ${quality.semanticConsistency.toFixed(0)}% |`);\n lines.push(\"\");\n\n lines.push(\"### Issues\");\n lines.push(`- Orphaned Elements: ${quality.orphanedElements}`);\n lines.push(`- Circular Dependencies: ${quality.circularDependencies}`);\n lines.push(\"\");\n}\n\n/**\n * Format statistics section for markdown\n */\nfunction formatStatisticsMarkdown(lines: string[], report: ReportData): void {\n const stats = report.statistics;\n\n lines.push(\"## Statistics\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Elements | ${stats.statistics.totalElements} |`);\n lines.push(`| Total Relationships | ${stats.statistics.totalRelationships} |`);\n lines.push(`| Populated Layers | ${stats.statistics.populatedLayers}/${stats.statistics.totalLayers} |`);\n lines.push(\"\");\n\n lines.push(\"### Elements by Layer\");\n lines.push(\"| Layer | Count | Types |\");\n lines.push(\"|-------|-------|-------|\");\n for (const layer of stats.layers) {\n if (layer.totalElements > 0) {\n const types = Object.keys(layer.elementsByType).join(\", \");\n lines.push(`| ${layer.name} | ${layer.totalElements} | ${types} |`);\n }\n }\n lines.push(\"\");\n}\n\n/**\n * Format relationships section for markdown\n */\nfunction formatRelationshipsMarkdown(lines: string[], report: ReportData): void {\n const relationships = report.relationships;\n\n lines.push(\"## Relationships\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Type | Count |\");\n lines.push(\"|------|-------|\");\n lines.push(`| Total | ${relationships.totalRelationships} |`);\n lines.push(`| Cross-Layer | ${relationships.crossLayerCount} |`);\n lines.push(`| Intra-Layer | ${relationships.intraLayerCount} |`);\n lines.push(\"\");\n\n lines.push(\"### By Category\");\n lines.push(\"| Category | Count | Percentage |\");\n lines.push(\"|----------|-------|-----------|\");\n for (const [category, count] of Object.entries(relationships.byCategory)\n .sort(([, a], [, b]) => b - a)) {\n const percentage = ((count / relationships.totalRelationships) * 100).toFixed(1);\n lines.push(`| ${category} | ${count} | ${percentage}% |`);\n }\n lines.push(\"\");\n\n if (relationships.circularDependencies.length > 0) {\n lines.push(\"### Circular Dependencies\");\n for (const circular of relationships.circularDependencies) {\n lines.push(`- ${circular.elements.join(\" \u2192 \")} \u2192 ${circular.elements[0]}`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format data model section for markdown\n */\nfunction formatDataModelMarkdown(lines: string[], report: ReportData): void {\n const dataModel = report.dataModel;\n\n lines.push(\"## Data Model (Layer 8)\");\n lines.push(\"\");\n lines.push(\"### Overview\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Entities | ${dataModel.entityCount} |`);\n lines.push(`| Total Attributes | ${dataModel.attributeCount} |`);\n lines.push(`| Entity Relationships | ${dataModel.relationshipCount} |`);\n lines.push(`| Referenced Entities | ${dataModel.referencedEntities} |`);\n lines.push(\"\");\n\n if (dataModel.orphanedEntities.length > 0) {\n lines.push(\"### Orphaned Entities\");\n for (const entity of dataModel.orphanedEntities) {\n lines.push(`- ${entity}`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Create quality progress bar\n */\nfunction qualityBar(percentage: number): string {\n const width = 20;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = \"\u2588\".repeat(filled) + \"\u2591\".repeat(empty);\n\n if (percentage >= 80) return ansis.green(bar);\n if (percentage >= 60) return ansis.yellow(bar);\n return ansis.red(bar);\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,7 @@ import { getAllLayerIds } from "../generated/layer-registry.js";
2
2
  const LAYER_COLORS = {
3
3
  motivation: "FFE4E1",
4
4
  business: "E6F3FF",
5
+ product: "E6FFD9",
5
6
  security: "FFE6E6",
6
7
  application: "E6FFE6",
7
8
  technology: "FFFFE6",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/export/types.ts"],
4
- "sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport { getAllLayerIds } from \"../generated/layer-registry.js\";\n\n/**\n * Options for export operations\n */\nexport interface ExportOptions {\n layers?: string[];\n outputPath?: string;\n format?: string;\n includeSources?: boolean; // For PlantUML: include source file paths as notes\n}\n\n/**\n * Interface for format-specific exporters\n */\nexport interface Exporter {\n /** Display name of the exporter */\n name: string;\n\n /** Layers this exporter supports */\n supportedLayers: string[];\n\n /**\n * Export model or subset to the format\n */\n export(model: Model, options: ExportOptions): Promise<string>;\n}\n\n/**\n * Metadata about a registered export format\n */\nexport interface ExportFormatInfo {\n format: string;\n name: string;\n description: string;\n supportedLayers: string[];\n mimeType: string;\n}\n\n/**\n * Shared layer colors for consistent visualization across exporters\n * Note: Color values do NOT include '#' prefix - exporters add it as needed\n */\nexport const LAYER_COLORS: Record<string, string> = {\n motivation: \"FFE4E1\",\n business: \"E6F3FF\",\n security: \"FFE6E6\",\n application: \"E6FFE6\",\n technology: \"FFFFE6\",\n api: \"F0E6FF\",\n \"data-model\": \"E6F0FF\",\n \"data-store\": \"FFE6F0\",\n ux: \"FFCCCC\",\n navigation: \"CCFFCC\",\n apm: \"CCFFFF\",\n testing: \"FFCCFF\",\n};\n\n/**\n * All 12 supported layers (from generated registry)\n */\nexport const ALL_LAYERS: string[] = getAllLayerIds();\n\n/**\n * Escape XML special characters\n */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n"],
5
- "mappings": "AACA,SAAS,sBAAsB;AA2CxB,MAAM,eAAuC;EAClD,YAAY;EACZ,UAAU;EACV,UAAU;EACV,aAAa;EACb,YAAY;EACZ,KAAK;EACL,cAAc;EACd,cAAc;EACd,IAAI;EACJ,YAAY;EACZ,KAAK;EACL,SAAS;GAME,aAAuB,eAAc;AAK5C,SAAU,UAAU,KAAW;AACnC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;",
4
+ "sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport { getAllLayerIds } from \"../generated/layer-registry.js\";\n\n/**\n * Options for export operations\n */\nexport interface ExportOptions {\n layers?: string[];\n outputPath?: string;\n format?: string;\n includeSources?: boolean; // For PlantUML: include source file paths as notes\n}\n\n/**\n * Interface for format-specific exporters\n */\nexport interface Exporter {\n /** Display name of the exporter */\n name: string;\n\n /** Layers this exporter supports */\n supportedLayers: string[];\n\n /**\n * Export model or subset to the format\n */\n export(model: Model, options: ExportOptions): Promise<string>;\n}\n\n/**\n * Metadata about a registered export format\n */\nexport interface ExportFormatInfo {\n format: string;\n name: string;\n description: string;\n supportedLayers: string[];\n mimeType: string;\n}\n\n/**\n * Shared layer colors for consistent visualization across exporters\n * Note: Color values do NOT include '#' prefix - exporters add it as needed\n */\nexport const LAYER_COLORS: Record<string, string> = {\n motivation: \"FFE4E1\",\n business: \"E6F3FF\",\n product: \"E6FFD9\",\n security: \"FFE6E6\",\n application: \"E6FFE6\",\n technology: \"FFFFE6\",\n api: \"F0E6FF\",\n \"data-model\": \"E6F0FF\",\n \"data-store\": \"FFE6F0\",\n ux: \"FFCCCC\",\n navigation: \"CCFFCC\",\n apm: \"CCFFFF\",\n testing: \"FFCCFF\",\n};\n\n/**\n * All 13 supported layers (from generated registry)\n */\nexport const ALL_LAYERS: string[] = getAllLayerIds();\n\n/**\n * Escape XML special characters\n */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n"],
5
+ "mappings": "AACA,SAAS,sBAAsB;AA2CxB,MAAM,eAAuC;EAClD,YAAY;EACZ,UAAU;EACV,SAAS;EACT,UAAU;EACV,aAAa;EACb,YAAY;EACZ,KAAK;EACL,cAAc;EACd,cAAc;EACd,IAAI;EACJ,YAAY;EACZ,KAAK;EACL,SAAS;GAME,aAAuB,eAAc;AAK5C,SAAU,UAAU,KAAW;AACnC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;",
6
6
  "names": []
7
7
  }
@@ -20,11 +20,22 @@ const LAYER_METADATA_MOTIVATION = {
20
20
  version: "3.2",
21
21
  url: "https://pubs.opengroup.org/architecture/archimate32-doc/"
22
22
  }
23
+ }, LAYER_METADATA_PRODUCT = {
24
+ id: "product",
25
+ number: 3,
26
+ name: "Product Layer",
27
+ description: "Layer 3: Product Layer",
28
+ nodeTypes: ["product.capability", "product.feature", "product.milestone", "product.persona", "product.userworkflow"],
29
+ inspiredBy: {
30
+ standard: "ArchiMate 3.2 Strategy Extension + Product Management Practice",
31
+ version: "3.2",
32
+ url: "https://pubs.opengroup.org/architecture/archimate32-doc/"
33
+ }
23
34
  }, LAYER_METADATA_SECURITY = {
24
35
  id: "security",
25
- number: 3,
36
+ number: 4,
26
37
  name: "Security Layer",
27
- description: "Layer 3: Security Layer",
38
+ description: "Layer 4: Security Layer",
28
39
  nodeTypes: ["security.accesscondition", "security.accountabilityrequirement", "security.actor", "security.auditconfig", "security.authenticationconfig", "security.bindingofduty", "security.condition", "security.countermeasure", "security.dataclassification", "security.delegation", "security.evidence", "security.fieldaccesscontrol", "security.informationentity", "security.informationright", "security.needtoknow", "security.passwordpolicy", "security.permission", "security.policyaction", "security.policyrule", "security.resourceoperation", "security.retentionpolicy", "security.role", "security.secureresource", "security.securityconstraints", "security.securitymodel", "security.securitypolicy", "security.separationofduty", "security.threat", "security.validationrule"],
29
40
  inspiredBy: {
30
41
  standard: "NIST SP 800-53",
@@ -33,9 +44,9 @@ const LAYER_METADATA_MOTIVATION = {
33
44
  }
34
45
  }, LAYER_METADATA_APPLICATION = {
35
46
  id: "application",
36
- number: 4,
47
+ number: 5,
37
48
  name: "Application Layer",
38
- description: "Layer 4: Application Layer",
49
+ description: "Layer 5: Application Layer",
39
50
  nodeTypes: ["application.applicationcollaboration", "application.applicationcomponent", "application.applicationevent", "application.applicationfunction", "application.applicationinteraction", "application.applicationinterface", "application.applicationprocess", "application.applicationservice", "application.dataobject"],
40
51
  inspiredBy: {
41
52
  standard: "ArchiMate 3.2",
@@ -44,9 +55,9 @@ const LAYER_METADATA_MOTIVATION = {
44
55
  }
45
56
  }, LAYER_METADATA_TECHNOLOGY = {
46
57
  id: "technology",
47
- number: 5,
58
+ number: 6,
48
59
  name: "Technology Layer",
49
- description: "Layer 5: Technology Layer",
60
+ description: "Layer 6: Technology Layer",
50
61
  nodeTypes: ["technology.artifact", "technology.communicationnetwork", "technology.device", "technology.node", "technology.path", "technology.systemsoftware", "technology.technologycollaboration", "technology.technologyevent", "technology.technologyfunction", "technology.technologyinteraction", "technology.technologyinterface", "technology.technologyprocess", "technology.technologyservice"],
51
62
  inspiredBy: {
52
63
  standard: "ArchiMate 3.2",
@@ -55,9 +66,9 @@ const LAYER_METADATA_MOTIVATION = {
55
66
  }
56
67
  }, LAYER_METADATA_API = {
57
68
  id: "api",
58
- number: 6,
69
+ number: 7,
59
70
  name: "API Layer",
60
- description: "Layer 6: API Layer",
71
+ description: "Layer 7: API Layer",
61
72
  nodeTypes: ["api.callback", "api.components", "api.contact", "api.encoding", "api.example", "api.externaldocumentation", "api.header", "api.info", "api.license", "api.link", "api.mediatype", "api.oauthflow", "api.oauthflows", "api.openapidocument", "api.operation", "api.parameter", "api.pathitem", "api.ratelimit", "api.paths", "api.requestbody", "api.response", "api.responses", "api.schema", "api.securityscheme", "api.server", "api.servervariable", "api.tag"],
62
73
  inspiredBy: {
63
74
  standard: "OpenAPI 3.0",
@@ -66,9 +77,9 @@ const LAYER_METADATA_MOTIVATION = {
66
77
  }
67
78
  }, LAYER_METADATA_DATA_MODEL = {
68
79
  id: "data-model",
69
- number: 7,
80
+ number: 8,
70
81
  name: "Data Model Layer",
71
- description: "Layer 7: Data Model Layer",
82
+ description: "Layer 8: Data Model Layer",
72
83
  nodeTypes: [],
73
84
  inspiredBy: {
74
85
  standard: "JSON Schema Draft 7",
@@ -77,9 +88,9 @@ const LAYER_METADATA_MOTIVATION = {
77
88
  }
78
89
  }, LAYER_METADATA_DATA_STORE = {
79
90
  id: "data-store",
80
- number: 8,
91
+ number: 9,
81
92
  name: "Data Store Layer",
82
- description: "Layer 8: Data Store Layer",
93
+ description: "Layer 9: Data Store Layer",
83
94
  nodeTypes: ["data-store.accesspattern", "data-store.collection", "data-store.database", "data-store.eventhandler", "data-store.field", "data-store.index", "data-store.namespace", "data-store.retentionpolicy", "data-store.storedlogic", "data-store.validationrule", "data-store.view"],
84
95
  inspiredBy: {
85
96
  standard: "ISO/IEC 9075 (SQL) + Paradigm Extensions",
@@ -88,9 +99,9 @@ const LAYER_METADATA_MOTIVATION = {
88
99
  }
89
100
  }, LAYER_METADATA_UX = {
90
101
  id: "ux",
91
- number: 9,
102
+ number: 10,
92
103
  name: "UX Layer",
93
- description: "Layer 9: UX Layer",
104
+ description: "Layer 10: UX Layer",
94
105
  nodeTypes: ["ux.actioncomponent", "ux.actionpattern", "ux.chartseries", "ux.componentinstance", "ux.componentreference", "ux.dataconfig", "ux.errorconfig", "ux.experiencestate", "ux.layoutconfig", "ux.librarycomponent", "ux.librarysubview", "ux.stateaction", "ux.stateactiontemplate", "ux.statepattern", "ux.statetransition", "ux.subview", "ux.tablecolumn", "ux.transitiontemplate", "ux.uxapplication", "ux.uxlibrary", "ux.uxspec", "ux.view"],
95
106
  inspiredBy: {
96
107
  standard: "HTML 5.3",
@@ -99,9 +110,9 @@ const LAYER_METADATA_MOTIVATION = {
99
110
  }
100
111
  }, LAYER_METADATA_NAVIGATION = {
101
112
  id: "navigation",
102
- number: 10,
113
+ number: 11,
103
114
  name: "Navigation Layer",
104
- description: "Layer 10: Navigation Layer",
115
+ description: "Layer 11: Navigation Layer",
105
116
  nodeTypes: ["navigation.breadcrumbconfig", "navigation.contextvariable", "navigation.flowstep", "navigation.guardaction", "navigation.guardcondition", "navigation.navigationflow", "navigation.navigationgraph", "navigation.navigationguard", "navigation.navigationtransition", "navigation.route", "navigation.routemeta"],
106
117
  inspiredBy: {
107
118
  standard: "SPA Navigation Patterns",
@@ -110,9 +121,9 @@ const LAYER_METADATA_MOTIVATION = {
110
121
  }
111
122
  }, LAYER_METADATA_APM = {
112
123
  id: "apm",
113
- number: 11,
124
+ number: 12,
114
125
  name: "APM Observability Layer",
115
- description: "Layer 11: APM Observability Layer",
126
+ description: "Layer 12: APM Observability Layer",
116
127
  nodeTypes: ["apm.alert", "apm.dashboard", "apm.exporterconfig", "apm.instrumentationconfig", "apm.instrumentationscope", "apm.logconfiguration", "apm.logprocessor", "apm.logrecord", "apm.metricconfiguration", "apm.metricinstrument", "apm.resource", "apm.span", "apm.spanevent", "apm.spanlink", "apm.traceconfiguration"],
117
128
  inspiredBy: {
118
129
  standard: "OpenTelemetry",
@@ -121,9 +132,9 @@ const LAYER_METADATA_MOTIVATION = {
121
132
  }
122
133
  }, LAYER_METADATA_TESTING = {
123
134
  id: "testing",
124
- number: 12,
135
+ number: 13,
125
136
  name: "Testing Layer",
126
- description: "Layer 12: Testing Layer",
137
+ description: "Layer 13: Testing Layer",
127
138
  nodeTypes: ["testing.contextvariation", "testing.coverageexclusion", "testing.coveragegap", "testing.coveragerequirement", "testing.coveragesummary", "testing.environmentfactor", "testing.inputpartitionselection", "testing.inputselection", "testing.inputspacepartition", "testing.outcomecategory", "testing.partitiondependency", "testing.partitionvalue", "testing.targetcoveragesummary", "testing.targetinputfield", "testing.testcasesketch", "testing.testcoveragemodel", "testing.testcoveragetarget"],
128
139
  inspiredBy: {
129
140
  standard: "IEEE 829-2008",
@@ -133,6 +144,7 @@ const LAYER_METADATA_MOTIVATION = {
133
144
  }, LAYERS = /* @__PURE__ */ new Map([
134
145
  ["motivation", LAYER_METADATA_MOTIVATION],
135
146
  ["business", LAYER_METADATA_BUSINESS],
147
+ ["product", LAYER_METADATA_PRODUCT],
136
148
  ["security", LAYER_METADATA_SECURITY],
137
149
  ["application", LAYER_METADATA_APPLICATION],
138
150
  ["technology", LAYER_METADATA_TECHNOLOGY],
@@ -146,17 +158,18 @@ const LAYER_METADATA_MOTIVATION = {
146
158
  ]), LAYERS_BY_NUMBER = /* @__PURE__ */ new Map([
147
159
  [1, LAYER_METADATA_MOTIVATION],
148
160
  [2, LAYER_METADATA_BUSINESS],
149
- [3, LAYER_METADATA_SECURITY],
150
- [4, LAYER_METADATA_APPLICATION],
151
- [5, LAYER_METADATA_TECHNOLOGY],
152
- [6, LAYER_METADATA_API],
153
- [7, LAYER_METADATA_DATA_MODEL],
154
- [8, LAYER_METADATA_DATA_STORE],
155
- [9, LAYER_METADATA_UX],
156
- [10, LAYER_METADATA_NAVIGATION],
157
- [11, LAYER_METADATA_APM],
158
- [12, LAYER_METADATA_TESTING]
159
- ]), LAYER_HIERARCHY = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
161
+ [3, LAYER_METADATA_PRODUCT],
162
+ [4, LAYER_METADATA_SECURITY],
163
+ [5, LAYER_METADATA_APPLICATION],
164
+ [6, LAYER_METADATA_TECHNOLOGY],
165
+ [7, LAYER_METADATA_API],
166
+ [8, LAYER_METADATA_DATA_MODEL],
167
+ [9, LAYER_METADATA_DATA_STORE],
168
+ [10, LAYER_METADATA_UX],
169
+ [11, LAYER_METADATA_NAVIGATION],
170
+ [12, LAYER_METADATA_APM],
171
+ [13, LAYER_METADATA_TESTING]
172
+ ]), LAYER_HIERARCHY = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
160
173
  function getLayerByNumber(n) {
161
174
  return LAYERS_BY_NUMBER.get(n);
162
175
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/generated/layer-registry.ts"],
4
- "sourcesContent": ["/**\n * GENERATED FILE - DO NOT EDIT\n * This file is automatically generated by scripts/generate-registry.ts\n * during the build process. Changes will be overwritten.\n *\n * Source: spec/layers/*.layer.json\n */\n\n/**\n * Layer metadata derived from specification layer instances\n */\nexport interface LayerMetadata {\n id: string; // \"motivation\", \"data-store\", etc. (canonical hyphenated form)\n number: number; // 1-12\n name: string; // \"Motivation Layer\", \"Data Store Layer\"\n description: string; // Layer description\n nodeTypes: string[]; // [\"motivation.goal\", \"motivation.requirement\", ...]\n inspiredBy?: {\n standard: string;\n version: string;\n url?: string;\n };\n}\n\n\nconst LAYER_METADATA_MOTIVATION: LayerMetadata = /*#__PURE__*/ {\n id: \"motivation\",\n number: 1,\n name: \"Motivation Layer\",\n description: \"Layer 1: Motivation Layer\",\n nodeTypes: [\"motivation.assessment\", \"motivation.constraint\", \"motivation.driver\", \"motivation.goal\", \"motivation.meaning\", \"motivation.outcome\", \"motivation.principle\", \"motivation.requirement\", \"motivation.stakeholder\", \"motivation.value\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_BUSINESS: LayerMetadata = /*#__PURE__*/ {\n id: \"business\",\n number: 2,\n name: \"Business Layer\",\n description: \"Layer 2: Business Layer\",\n nodeTypes: [\"business.businessactor\", \"business.businesscollaboration\", \"business.businessevent\", \"business.businessfunction\", \"business.businessinteraction\", \"business.businessinterface\", \"business.businessobject\", \"business.businessprocess\", \"business.businessrole\", \"business.businessservice\", \"business.contract\", \"business.product\", \"business.representation\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_SECURITY: LayerMetadata = /*#__PURE__*/ {\n id: \"security\",\n number: 3,\n name: \"Security Layer\",\n description: \"Layer 3: Security Layer\",\n nodeTypes: [\"security.accesscondition\", \"security.accountabilityrequirement\", \"security.actor\", \"security.auditconfig\", \"security.authenticationconfig\", \"security.bindingofduty\", \"security.condition\", \"security.countermeasure\", \"security.dataclassification\", \"security.delegation\", \"security.evidence\", \"security.fieldaccesscontrol\", \"security.informationentity\", \"security.informationright\", \"security.needtoknow\", \"security.passwordpolicy\", \"security.permission\", \"security.policyaction\", \"security.policyrule\", \"security.resourceoperation\", \"security.retentionpolicy\", \"security.role\", \"security.secureresource\", \"security.securityconstraints\", \"security.securitymodel\", \"security.securitypolicy\", \"security.separationofduty\", \"security.threat\", \"security.validationrule\"],\n inspiredBy: {\n standard: \"NIST SP 800-53\",\n version: \"5.1\",\n url: \"https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-53r5.pdf\",\n },\n};\n\nconst LAYER_METADATA_APPLICATION: LayerMetadata = /*#__PURE__*/ {\n id: \"application\",\n number: 4,\n name: \"Application Layer\",\n description: \"Layer 4: Application Layer\",\n nodeTypes: [\"application.applicationcollaboration\", \"application.applicationcomponent\", \"application.applicationevent\", \"application.applicationfunction\", \"application.applicationinteraction\", \"application.applicationinterface\", \"application.applicationprocess\", \"application.applicationservice\", \"application.dataobject\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_TECHNOLOGY: LayerMetadata = /*#__PURE__*/ {\n id: \"technology\",\n number: 5,\n name: \"Technology Layer\",\n description: \"Layer 5: Technology Layer\",\n nodeTypes: [\"technology.artifact\", \"technology.communicationnetwork\", \"technology.device\", \"technology.node\", \"technology.path\", \"technology.systemsoftware\", \"technology.technologycollaboration\", \"technology.technologyevent\", \"technology.technologyfunction\", \"technology.technologyinteraction\", \"technology.technologyinterface\", \"technology.technologyprocess\", \"technology.technologyservice\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_API: LayerMetadata = /*#__PURE__*/ {\n id: \"api\",\n number: 6,\n name: \"API Layer\",\n description: \"Layer 6: API Layer\",\n nodeTypes: [\"api.callback\", \"api.components\", \"api.contact\", \"api.encoding\", \"api.example\", \"api.externaldocumentation\", \"api.header\", \"api.info\", \"api.license\", \"api.link\", \"api.mediatype\", \"api.oauthflow\", \"api.oauthflows\", \"api.openapidocument\", \"api.operation\", \"api.parameter\", \"api.pathitem\", \"api.ratelimit\", \"api.paths\", \"api.requestbody\", \"api.response\", \"api.responses\", \"api.schema\", \"api.securityscheme\", \"api.server\", \"api.servervariable\", \"api.tag\"],\n inspiredBy: {\n standard: \"OpenAPI 3.0\",\n version: \"3.0\",\n url: \"https://spec.openapis.org/oas/v3.0.0\",\n },\n};\n\nconst LAYER_METADATA_DATA_MODEL: LayerMetadata = /*#__PURE__*/ {\n id: \"data-model\",\n number: 7,\n name: \"Data Model Layer\",\n description: \"Layer 7: Data Model Layer\",\n nodeTypes: [],\n inspiredBy: {\n standard: \"JSON Schema Draft 7\",\n version: \"Draft 7\",\n url: \"https://json-schema.org/draft-07/\",\n },\n};\n\nconst LAYER_METADATA_DATA_STORE: LayerMetadata = /*#__PURE__*/ {\n id: \"data-store\",\n number: 8,\n name: \"Data Store Layer\",\n description: \"Layer 8: Data Store Layer\",\n nodeTypes: [\"data-store.accesspattern\", \"data-store.collection\", \"data-store.database\", \"data-store.eventhandler\", \"data-store.field\", \"data-store.index\", \"data-store.namespace\", \"data-store.retentionpolicy\", \"data-store.storedlogic\", \"data-store.validationrule\", \"data-store.view\"],\n inspiredBy: {\n standard: \"ISO/IEC 9075 (SQL) + Paradigm Extensions\",\n version: \"2024\",\n url: \"https://en.wikipedia.org/wiki/Database_model\",\n },\n};\n\nconst LAYER_METADATA_UX: LayerMetadata = /*#__PURE__*/ {\n id: \"ux\",\n number: 9,\n name: \"UX Layer\",\n description: \"Layer 9: UX Layer\",\n nodeTypes: [\"ux.actioncomponent\", \"ux.actionpattern\", \"ux.chartseries\", \"ux.componentinstance\", \"ux.componentreference\", \"ux.dataconfig\", \"ux.errorconfig\", \"ux.experiencestate\", \"ux.layoutconfig\", \"ux.librarycomponent\", \"ux.librarysubview\", \"ux.stateaction\", \"ux.stateactiontemplate\", \"ux.statepattern\", \"ux.statetransition\", \"ux.subview\", \"ux.tablecolumn\", \"ux.transitiontemplate\", \"ux.uxapplication\", \"ux.uxlibrary\", \"ux.uxspec\", \"ux.view\"],\n inspiredBy: {\n standard: \"HTML 5.3\",\n version: \"5.3\",\n url: \"https://html.spec.whatwg.org/\",\n },\n};\n\nconst LAYER_METADATA_NAVIGATION: LayerMetadata = /*#__PURE__*/ {\n id: \"navigation\",\n number: 10,\n name: \"Navigation Layer\",\n description: \"Layer 10: Navigation Layer\",\n nodeTypes: [\"navigation.breadcrumbconfig\", \"navigation.contextvariable\", \"navigation.flowstep\", \"navigation.guardaction\", \"navigation.guardcondition\", \"navigation.navigationflow\", \"navigation.navigationgraph\", \"navigation.navigationguard\", \"navigation.navigationtransition\", \"navigation.route\", \"navigation.routemeta\"],\n inspiredBy: {\n standard: \"SPA Navigation Patterns\",\n version: \"1.0\",\n url: \"https://www.w3.org/TR/navigation-timing-2/\",\n },\n};\n\nconst LAYER_METADATA_APM: LayerMetadata = /*#__PURE__*/ {\n id: \"apm\",\n number: 11,\n name: \"APM Observability Layer\",\n description: \"Layer 11: APM Observability Layer\",\n nodeTypes: [\"apm.alert\", \"apm.dashboard\", \"apm.exporterconfig\", \"apm.instrumentationconfig\", \"apm.instrumentationscope\", \"apm.logconfiguration\", \"apm.logprocessor\", \"apm.logrecord\", \"apm.metricconfiguration\", \"apm.metricinstrument\", \"apm.resource\", \"apm.span\", \"apm.spanevent\", \"apm.spanlink\", \"apm.traceconfiguration\"],\n inspiredBy: {\n standard: \"OpenTelemetry\",\n version: \"1.0\",\n url: \"https://opentelemetry.io/\",\n },\n};\n\nconst LAYER_METADATA_TESTING: LayerMetadata = /*#__PURE__*/ {\n id: \"testing\",\n number: 12,\n name: \"Testing Layer\",\n description: \"Layer 12: Testing Layer\",\n nodeTypes: [\"testing.contextvariation\", \"testing.coverageexclusion\", \"testing.coveragegap\", \"testing.coveragerequirement\", \"testing.coveragesummary\", \"testing.environmentfactor\", \"testing.inputpartitionselection\", \"testing.inputselection\", \"testing.inputspacepartition\", \"testing.outcomecategory\", \"testing.partitiondependency\", \"testing.partitionvalue\", \"testing.targetcoveragesummary\", \"testing.targetinputfield\", \"testing.testcasesketch\", \"testing.testcoveragemodel\", \"testing.testcoveragetarget\"],\n inspiredBy: {\n standard: \"IEEE 829-2008\",\n version: \"2008\",\n url: \"https://en.wikipedia.org/wiki/IEEE_829\",\n },\n};\n\n/**\n * All 12 layers with metadata, indexed by layer ID\n */\nexport const LAYERS: Map<string, LayerMetadata> = /*#__PURE__*/ new Map([\n [\"motivation\", LAYER_METADATA_MOTIVATION],\n [\"business\", LAYER_METADATA_BUSINESS],\n [\"security\", LAYER_METADATA_SECURITY],\n [\"application\", LAYER_METADATA_APPLICATION],\n [\"technology\", LAYER_METADATA_TECHNOLOGY],\n [\"api\", LAYER_METADATA_API],\n [\"data-model\", LAYER_METADATA_DATA_MODEL],\n [\"data-store\", LAYER_METADATA_DATA_STORE],\n [\"ux\", LAYER_METADATA_UX],\n [\"navigation\", LAYER_METADATA_NAVIGATION],\n [\"apm\", LAYER_METADATA_APM],\n [\"testing\", LAYER_METADATA_TESTING]\n]);\n\n/**\n * All 12 layers with metadata, indexed by layer number for O(1) lookup\n */\nexport const LAYERS_BY_NUMBER: Map<number, LayerMetadata> = /*#__PURE__*/ new Map([\n [1, LAYER_METADATA_MOTIVATION],\n [2, LAYER_METADATA_BUSINESS],\n [3, LAYER_METADATA_SECURITY],\n [4, LAYER_METADATA_APPLICATION],\n [5, LAYER_METADATA_TECHNOLOGY],\n [6, LAYER_METADATA_API],\n [7, LAYER_METADATA_DATA_MODEL],\n [8, LAYER_METADATA_DATA_STORE],\n [9, LAYER_METADATA_UX],\n [10, LAYER_METADATA_NAVIGATION],\n [11, LAYER_METADATA_APM],\n [12, LAYER_METADATA_TESTING]\n]);\n\n/**\n * Layer hierarchy - ordered array of layer numbers for reference validation\n */\nexport const LAYER_HIERARCHY: readonly number[] = /*#__PURE__*/ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;\n\n/**\n * Get layer metadata by layer number (1-12)\n */\nexport function getLayerByNumber(n: number): LayerMetadata | undefined {\n return LAYERS_BY_NUMBER.get(n);\n}\n\n/**\n * Get layer metadata by canonical layer ID\n */\nexport function getLayerById(id: string): LayerMetadata | undefined {\n return LAYERS.get(id);\n}\n\n/**\n * Check if a layer ID is valid\n */\nexport function isValidLayer(id: string): boolean {\n return LAYERS.has(id);\n}\n\n/**\n * Get all valid node types for a layer\n */\nexport function getNodeTypesForLayer(layerId: string): string[] {\n const layer = LAYERS.get(layerId);\n return layer ? layer.nodeTypes : [];\n}\n\n/**\n * Get all canonical layer IDs in numeric order\n */\nexport function getAllLayerIds(): string[] {\n return Array.from(LAYERS.values())\n .sort((a, b) => a.number - b.number)\n .map((l) => l.id);\n}\n\n/**\n * Get all layers in numeric order\n */\nexport function getAllLayers(): LayerMetadata[] {\n return Array.from(LAYERS.values()).sort((a, b) => a.number - b.number);\n}\n"],
5
- "mappings": "AAyBA,MAAM,4BAAyD;EAC7D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,yBAAyB,yBAAyB,qBAAqB,mBAAmB,sBAAsB,sBAAsB,wBAAwB,0BAA0B,0BAA0B,kBAAkB;EAChP,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,0BAAuD;EAC3D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,0BAA0B,kCAAkC,0BAA0B,6BAA6B,gCAAgC,8BAA8B,2BAA2B,4BAA4B,yBAAyB,4BAA4B,qBAAqB,oBAAoB,yBAAyB;EAC3W,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,0BAAuD;EAC3D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,4BAA4B,sCAAsC,kBAAkB,wBAAwB,iCAAiC,0BAA0B,sBAAsB,2BAA2B,+BAA+B,uBAAuB,qBAAqB,+BAA+B,8BAA8B,6BAA6B,uBAAuB,2BAA2B,uBAAuB,yBAAyB,uBAAuB,8BAA8B,4BAA4B,iBAAiB,2BAA2B,gCAAgC,0BAA0B,2BAA2B,6BAA6B,mBAAmB,yBAAyB;EACtwB,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,6BAA0D;EAC9D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,wCAAwC,oCAAoC,gCAAgC,mCAAmC,sCAAsC,oCAAoC,kCAAkC,kCAAkC,wBAAwB;EACjU,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,4BAAyD;EAC7D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,uBAAuB,mCAAmC,qBAAqB,mBAAmB,mBAAmB,6BAA6B,sCAAsC,8BAA8B,iCAAiC,oCAAoC,kCAAkC,gCAAgC,8BAA8B;EACvY,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,qBAAkD;EACtD,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,gBAAgB,kBAAkB,eAAe,gBAAgB,eAAe,6BAA6B,cAAc,YAAY,eAAe,YAAY,iBAAiB,iBAAiB,kBAAkB,uBAAuB,iBAAiB,iBAAiB,gBAAgB,iBAAiB,aAAa,mBAAmB,gBAAgB,iBAAiB,cAAc,sBAAsB,cAAc,sBAAsB,SAAS;EAC9c,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,4BAAyD;EAC7D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAA;EACX,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,4BAAyD;EAC7D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,4BAA4B,yBAAyB,uBAAuB,2BAA2B,oBAAoB,oBAAoB,wBAAwB,8BAA8B,0BAA0B,6BAA6B,iBAAiB;EACzR,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,oBAAiD;EACrD,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,sBAAsB,oBAAoB,kBAAkB,wBAAwB,yBAAyB,iBAAiB,kBAAkB,sBAAsB,mBAAmB,uBAAuB,qBAAqB,kBAAkB,0BAA0B,mBAAmB,sBAAsB,cAAc,kBAAkB,yBAAyB,oBAAoB,gBAAgB,aAAa,SAAS;EACzb,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,4BAAyD;EAC7D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,+BAA+B,8BAA8B,uBAAuB,0BAA0B,6BAA6B,6BAA6B,8BAA8B,8BAA8B,mCAAmC,oBAAoB,sBAAsB;EAC7T,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,qBAAkD;EACtD,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,aAAa,iBAAiB,sBAAsB,6BAA6B,4BAA4B,wBAAwB,oBAAoB,iBAAiB,2BAA2B,wBAAwB,gBAAgB,YAAY,iBAAiB,gBAAgB,wBAAwB;EAC9T,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAIH,yBAAsD;EAC1D,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,aAAa;EACb,WAAW,CAAC,4BAA4B,6BAA6B,uBAAuB,+BAA+B,2BAA2B,6BAA6B,mCAAmC,0BAA0B,+BAA+B,2BAA2B,+BAA+B,0BAA0B,iCAAiC,4BAA4B,0BAA0B,6BAA6B,4BAA4B;EACnf,YAAY;IACV,UAAU;IACV,SAAS;IACT,KAAK;;GAOI,SAAmD,oBAAI,IAAI;EACpE,CAAC,cAAc,yBAAyB;EACxC,CAAC,YAAY,uBAAuB;EACpC,CAAC,YAAY,uBAAuB;EACpC,CAAC,eAAe,0BAA0B;EAC1C,CAAC,cAAc,yBAAyB;EACxC,CAAC,OAAO,kBAAkB;EAC1B,CAAC,cAAc,yBAAyB;EACxC,CAAC,cAAc,yBAAyB;EACxC,CAAC,MAAM,iBAAiB;EACxB,CAAC,cAAc,yBAAyB;EACxC,CAAC,OAAO,kBAAkB;EAC1B,CAAC,WAAW,sBAAsB;CACrC,GAKY,mBAA6D,oBAAI,IAAI;EAC9E,CAAC,GAAG,yBAAyB;EAC7B,CAAC,GAAG,uBAAuB;EAC3B,CAAC,GAAG,uBAAuB;EAC3B,CAAC,GAAG,0BAA0B;EAC9B,CAAC,GAAG,yBAAyB;EAC7B,CAAC,GAAG,kBAAkB;EACtB,CAAC,GAAG,yBAAyB;EAC7B,CAAC,GAAG,yBAAyB;EAC7B,CAAC,GAAG,iBAAiB;EACrB,CAAC,IAAI,yBAAyB;EAC9B,CAAC,IAAI,kBAAkB;EACvB,CAAC,IAAI,sBAAsB;CAC9B,GAKY,kBAAmD,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE;AAKhG,SAAU,iBAAiB,GAAS;AACxC,SAAO,iBAAiB,IAAI,CAAC;AAC/B;AAKM,SAAU,aAAa,IAAU;AACrC,SAAO,OAAO,IAAI,EAAE;AACtB;AAKM,SAAU,aAAa,IAAU;AACrC,SAAO,OAAO,IAAI,EAAE;AACtB;AAKM,SAAU,qBAAqB,SAAe;AAClD,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,SAAO,QAAQ,MAAM,YAAY,CAAA;AACnC;AAKM,SAAU,iBAAc;AAC5B,SAAO,MAAM,KAAK,OAAO,OAAM,CAAE,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAClC,IAAI,CAAC,MAAM,EAAE,EAAE;AACpB;AAKM,SAAU,eAAY;AAC1B,SAAO,MAAM,KAAK,OAAO,OAAM,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACvE;",
4
+ "sourcesContent": ["/**\n * GENERATED FILE - DO NOT EDIT\n * This file is automatically generated by scripts/generate-registry.ts\n * during the build process. Changes will be overwritten.\n *\n * Source: spec/layers/*.layer.json\n */\n\n/**\n * Layer metadata derived from specification layer instances\n */\nexport interface LayerMetadata {\n id: string; // \"motivation\", \"data-store\", etc. (canonical hyphenated form)\n number: number; // 1-13\n name: string; // \"Motivation Layer\", \"Data Store Layer\"\n description: string; // Layer description\n nodeTypes: string[]; // [\"motivation.goal\", \"motivation.requirement\", ...]\n inspiredBy?: {\n standard: string;\n version: string;\n url?: string;\n };\n}\n\n\nconst LAYER_METADATA_MOTIVATION: LayerMetadata = /*#__PURE__*/ {\n id: \"motivation\",\n number: 1,\n name: \"Motivation Layer\",\n description: \"Layer 1: Motivation Layer\",\n nodeTypes: [\"motivation.assessment\", \"motivation.constraint\", \"motivation.driver\", \"motivation.goal\", \"motivation.meaning\", \"motivation.outcome\", \"motivation.principle\", \"motivation.requirement\", \"motivation.stakeholder\", \"motivation.value\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_BUSINESS: LayerMetadata = /*#__PURE__*/ {\n id: \"business\",\n number: 2,\n name: \"Business Layer\",\n description: \"Layer 2: Business Layer\",\n nodeTypes: [\"business.businessactor\", \"business.businesscollaboration\", \"business.businessevent\", \"business.businessfunction\", \"business.businessinteraction\", \"business.businessinterface\", \"business.businessobject\", \"business.businessprocess\", \"business.businessrole\", \"business.businessservice\", \"business.contract\", \"business.product\", \"business.representation\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_PRODUCT: LayerMetadata = /*#__PURE__*/ {\n id: \"product\",\n number: 3,\n name: \"Product Layer\",\n description: \"Layer 3: Product Layer\",\n nodeTypes: [\"product.capability\", \"product.feature\", \"product.milestone\", \"product.persona\", \"product.userworkflow\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2 Strategy Extension + Product Management Practice\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_SECURITY: LayerMetadata = /*#__PURE__*/ {\n id: \"security\",\n number: 4,\n name: \"Security Layer\",\n description: \"Layer 4: Security Layer\",\n nodeTypes: [\"security.accesscondition\", \"security.accountabilityrequirement\", \"security.actor\", \"security.auditconfig\", \"security.authenticationconfig\", \"security.bindingofduty\", \"security.condition\", \"security.countermeasure\", \"security.dataclassification\", \"security.delegation\", \"security.evidence\", \"security.fieldaccesscontrol\", \"security.informationentity\", \"security.informationright\", \"security.needtoknow\", \"security.passwordpolicy\", \"security.permission\", \"security.policyaction\", \"security.policyrule\", \"security.resourceoperation\", \"security.retentionpolicy\", \"security.role\", \"security.secureresource\", \"security.securityconstraints\", \"security.securitymodel\", \"security.securitypolicy\", \"security.separationofduty\", \"security.threat\", \"security.validationrule\"],\n inspiredBy: {\n standard: \"NIST SP 800-53\",\n version: \"5.1\",\n url: \"https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-53r5.pdf\",\n },\n};\n\nconst LAYER_METADATA_APPLICATION: LayerMetadata = /*#__PURE__*/ {\n id: \"application\",\n number: 5,\n name: \"Application Layer\",\n description: \"Layer 5: Application Layer\",\n nodeTypes: [\"application.applicationcollaboration\", \"application.applicationcomponent\", \"application.applicationevent\", \"application.applicationfunction\", \"application.applicationinteraction\", \"application.applicationinterface\", \"application.applicationprocess\", \"application.applicationservice\", \"application.dataobject\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_TECHNOLOGY: LayerMetadata = /*#__PURE__*/ {\n id: \"technology\",\n number: 6,\n name: \"Technology Layer\",\n description: \"Layer 6: Technology Layer\",\n nodeTypes: [\"technology.artifact\", \"technology.communicationnetwork\", \"technology.device\", \"technology.node\", \"technology.path\", \"technology.systemsoftware\", \"technology.technologycollaboration\", \"technology.technologyevent\", \"technology.technologyfunction\", \"technology.technologyinteraction\", \"technology.technologyinterface\", \"technology.technologyprocess\", \"technology.technologyservice\"],\n inspiredBy: {\n standard: \"ArchiMate 3.2\",\n version: \"3.2\",\n url: \"https://pubs.opengroup.org/architecture/archimate32-doc/\",\n },\n};\n\nconst LAYER_METADATA_API: LayerMetadata = /*#__PURE__*/ {\n id: \"api\",\n number: 7,\n name: \"API Layer\",\n description: \"Layer 7: API Layer\",\n nodeTypes: [\"api.callback\", \"api.components\", \"api.contact\", \"api.encoding\", \"api.example\", \"api.externaldocumentation\", \"api.header\", \"api.info\", \"api.license\", \"api.link\", \"api.mediatype\", \"api.oauthflow\", \"api.oauthflows\", \"api.openapidocument\", \"api.operation\", \"api.parameter\", \"api.pathitem\", \"api.ratelimit\", \"api.paths\", \"api.requestbody\", \"api.response\", \"api.responses\", \"api.schema\", \"api.securityscheme\", \"api.server\", \"api.servervariable\", \"api.tag\"],\n inspiredBy: {\n standard: \"OpenAPI 3.0\",\n version: \"3.0\",\n url: \"https://spec.openapis.org/oas/v3.0.0\",\n },\n};\n\nconst LAYER_METADATA_DATA_MODEL: LayerMetadata = /*#__PURE__*/ {\n id: \"data-model\",\n number: 8,\n name: \"Data Model Layer\",\n description: \"Layer 8: Data Model Layer\",\n nodeTypes: [],\n inspiredBy: {\n standard: \"JSON Schema Draft 7\",\n version: \"Draft 7\",\n url: \"https://json-schema.org/draft-07/\",\n },\n};\n\nconst LAYER_METADATA_DATA_STORE: LayerMetadata = /*#__PURE__*/ {\n id: \"data-store\",\n number: 9,\n name: \"Data Store Layer\",\n description: \"Layer 9: Data Store Layer\",\n nodeTypes: [\"data-store.accesspattern\", \"data-store.collection\", \"data-store.database\", \"data-store.eventhandler\", \"data-store.field\", \"data-store.index\", \"data-store.namespace\", \"data-store.retentionpolicy\", \"data-store.storedlogic\", \"data-store.validationrule\", \"data-store.view\"],\n inspiredBy: {\n standard: \"ISO/IEC 9075 (SQL) + Paradigm Extensions\",\n version: \"2024\",\n url: \"https://en.wikipedia.org/wiki/Database_model\",\n },\n};\n\nconst LAYER_METADATA_UX: LayerMetadata = /*#__PURE__*/ {\n id: \"ux\",\n number: 10,\n name: \"UX Layer\",\n description: \"Layer 10: UX Layer\",\n nodeTypes: [\"ux.actioncomponent\", \"ux.actionpattern\", \"ux.chartseries\", \"ux.componentinstance\", \"ux.componentreference\", \"ux.dataconfig\", \"ux.errorconfig\", \"ux.experiencestate\", \"ux.layoutconfig\", \"ux.librarycomponent\", \"ux.librarysubview\", \"ux.stateaction\", \"ux.stateactiontemplate\", \"ux.statepattern\", \"ux.statetransition\", \"ux.subview\", \"ux.tablecolumn\", \"ux.transitiontemplate\", \"ux.uxapplication\", \"ux.uxlibrary\", \"ux.uxspec\", \"ux.view\"],\n inspiredBy: {\n standard: \"HTML 5.3\",\n version: \"5.3\",\n url: \"https://html.spec.whatwg.org/\",\n },\n};\n\nconst LAYER_METADATA_NAVIGATION: LayerMetadata = /*#__PURE__*/ {\n id: \"navigation\",\n number: 11,\n name: \"Navigation Layer\",\n description: \"Layer 11: Navigation Layer\",\n nodeTypes: [\"navigation.breadcrumbconfig\", \"navigation.contextvariable\", \"navigation.flowstep\", \"navigation.guardaction\", \"navigation.guardcondition\", \"navigation.navigationflow\", \"navigation.navigationgraph\", \"navigation.navigationguard\", \"navigation.navigationtransition\", \"navigation.route\", \"navigation.routemeta\"],\n inspiredBy: {\n standard: \"SPA Navigation Patterns\",\n version: \"1.0\",\n url: \"https://www.w3.org/TR/navigation-timing-2/\",\n },\n};\n\nconst LAYER_METADATA_APM: LayerMetadata = /*#__PURE__*/ {\n id: \"apm\",\n number: 12,\n name: \"APM Observability Layer\",\n description: \"Layer 12: APM Observability Layer\",\n nodeTypes: [\"apm.alert\", \"apm.dashboard\", \"apm.exporterconfig\", \"apm.instrumentationconfig\", \"apm.instrumentationscope\", \"apm.logconfiguration\", \"apm.logprocessor\", \"apm.logrecord\", \"apm.metricconfiguration\", \"apm.metricinstrument\", \"apm.resource\", \"apm.span\", \"apm.spanevent\", \"apm.spanlink\", \"apm.traceconfiguration\"],\n inspiredBy: {\n standard: \"OpenTelemetry\",\n version: \"1.0\",\n url: \"https://opentelemetry.io/\",\n },\n};\n\nconst LAYER_METADATA_TESTING: LayerMetadata = /*#__PURE__*/ {\n id: \"testing\",\n number: 13,\n name: \"Testing Layer\",\n description: \"Layer 13: Testing Layer\",\n nodeTypes: [\"testing.contextvariation\", \"testing.coverageexclusion\", \"testing.coveragegap\", \"testing.coveragerequirement\", \"testing.coveragesummary\", \"testing.environmentfactor\", \"testing.inputpartitionselection\", \"testing.inputselection\", \"testing.inputspacepartition\", \"testing.outcomecategory\", \"testing.partitiondependency\", \"testing.partitionvalue\", \"testing.targetcoveragesummary\", \"testing.targetinputfield\", \"testing.testcasesketch\", \"testing.testcoveragemodel\", \"testing.testcoveragetarget\"],\n inspiredBy: {\n standard: \"IEEE 829-2008\",\n version: \"2008\",\n url: \"https://en.wikipedia.org/wiki/IEEE_829\",\n },\n};\n\n/**\n * All 13 layers with metadata, indexed by layer ID\n */\nexport const LAYERS: Map<string, LayerMetadata> = /*#__PURE__*/ new Map([\n [\"motivation\", LAYER_METADATA_MOTIVATION],\n [\"business\", LAYER_METADATA_BUSINESS],\n [\"product\", LAYER_METADATA_PRODUCT],\n [\"security\", LAYER_METADATA_SECURITY],\n [\"application\", LAYER_METADATA_APPLICATION],\n [\"technology\", LAYER_METADATA_TECHNOLOGY],\n [\"api\", LAYER_METADATA_API],\n [\"data-model\", LAYER_METADATA_DATA_MODEL],\n [\"data-store\", LAYER_METADATA_DATA_STORE],\n [\"ux\", LAYER_METADATA_UX],\n [\"navigation\", LAYER_METADATA_NAVIGATION],\n [\"apm\", LAYER_METADATA_APM],\n [\"testing\", LAYER_METADATA_TESTING]\n]);\n\n/**\n * All 13 layers with metadata, indexed by layer number for O(1) lookup\n */\nexport const LAYERS_BY_NUMBER: Map<number, LayerMetadata> = /*#__PURE__*/ new Map([\n [1, LAYER_METADATA_MOTIVATION],\n [2, LAYER_METADATA_BUSINESS],\n [3, LAYER_METADATA_PRODUCT],\n [4, LAYER_METADATA_SECURITY],\n [5, LAYER_METADATA_APPLICATION],\n [6, LAYER_METADATA_TECHNOLOGY],\n [7, LAYER_METADATA_API],\n [8, LAYER_METADATA_DATA_MODEL],\n [9, LAYER_METADATA_DATA_STORE],\n [10, LAYER_METADATA_UX],\n [11, LAYER_METADATA_NAVIGATION],\n [12, LAYER_METADATA_APM],\n [13, LAYER_METADATA_TESTING]\n]);\n\n/**\n * Layer hierarchy - ordered array of layer numbers for reference validation\n */\nexport const LAYER_HIERARCHY: readonly number[] = /*#__PURE__*/ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] as const;\n\n/**\n * Get layer metadata by layer number (1-13)\n */\nexport function getLayerByNumber(n: number): LayerMetadata | undefined {\n return LAYERS_BY_NUMBER.get(n);\n}\n\n/**\n * Get layer metadata by canonical layer ID\n */\nexport function getLayerById(id: string): LayerMetadata | undefined {\n return LAYERS.get(id);\n}\n\n/**\n * Check if a layer ID is valid\n */\nexport function isValidLayer(id: string): boolean {\n return LAYERS.has(id);\n}\n\n/**\n * Get all valid node types for a layer\n */\nexport function getNodeTypesForLayer(layerId: string): string[] {\n const layer = LAYERS.get(layerId);\n return layer ? layer.nodeTypes : [];\n}\n\n/**\n * Get all canonical layer IDs in numeric order\n */\nexport function getAllLayerIds(): string[] {\n return Array.from(LAYERS.values())\n .sort((a, b) => a.number - b.number)\n .map((l) => l.id);\n}\n\n/**\n * Get all layers in numeric order\n */\nexport function getAllLayers(): LayerMetadata[] {\n return Array.from(LAYERS.values()).sort((a, b) => a.number - b.number);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  function isLayerId(value) {
2
- return typeof value == "string" && ["motivation", "business", "security", "application", "technology", "api", "data-model", "data-store", "ux", "navigation", "apm", "testing"].includes(value);
2
+ return typeof value == "string" && ["motivation", "business", "product", "security", "application", "technology", "api", "data-model", "data-store", "ux", "navigation", "apm", "testing"].includes(value);
3
3
  }
4
4
  export {
5
5
  isLayerId
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/generated/layer-types.ts"],
4
- "sourcesContent": ["/**\n * GENERATED FILE - DO NOT EDIT\n * This file is automatically generated by scripts/generate-registry.ts\n * during the build process. Changes will be overwritten.\n *\n * Source: spec/layers/*.layer.json\n */\n\n/**\n * Union type of all valid layer IDs in the 12-layer architecture model\n */\nexport type LayerId = \"motivation\" | \"business\" | \"security\" | \"application\" | \"technology\" | \"api\" | \"data-model\" | \"data-store\" | \"ux\" | \"navigation\" | \"apm\" | \"testing\";\n\n/**\n * Check if a value is a valid LayerId\n */\nexport function isLayerId(value: unknown): value is LayerId {\n const validIds: LayerId[] = [\"motivation\", \"business\", \"security\", \"application\", \"technology\", \"api\", \"data-model\", \"data-store\", \"ux\", \"navigation\", \"apm\", \"testing\"];\n return typeof value === \"string\" && validIds.includes(value as LayerId);\n}\n"],
5
- "mappings": "AAgBM,SAAU,UAAU,OAAc;AAEtC,SAAO,OAAO,SAAU,YADI,CAAC,cAAc,YAAY,YAAY,eAAe,cAAc,OAAO,cAAc,cAAc,MAAM,cAAc,OAAO,SAAS,EAC1H,SAAS,KAAgB;AACxE;",
4
+ "sourcesContent": ["/**\n * GENERATED FILE - DO NOT EDIT\n * This file is automatically generated by scripts/generate-registry.ts\n * during the build process. Changes will be overwritten.\n *\n * Source: spec/layers/*.layer.json\n */\n\n/**\n * Union type of all valid layer IDs in the 13-layer architecture model\n */\nexport type LayerId = \"motivation\" | \"business\" | \"product\" | \"security\" | \"application\" | \"technology\" | \"api\" | \"data-model\" | \"data-store\" | \"ux\" | \"navigation\" | \"apm\" | \"testing\";\n\n/**\n * Check if a value is a valid LayerId\n */\nexport function isLayerId(value: unknown): value is LayerId {\n const validIds: LayerId[] = [\"motivation\", \"business\", \"product\", \"security\", \"application\", \"technology\", \"api\", \"data-model\", \"data-store\", \"ux\", \"navigation\", \"apm\", \"testing\"];\n return typeof value === \"string\" && validIds.includes(value as LayerId);\n}\n"],
5
+ "mappings": "AAgBM,SAAU,UAAU,OAAc;AAEtC,SAAO,OAAO,SAAU,YADI,CAAC,cAAc,YAAY,WAAW,YAAY,eAAe,cAAc,OAAO,cAAc,cAAc,MAAM,cAAc,OAAO,SAAS,EACrI,SAAS,KAAgB;AACxE;",
6
6
  "names": []
7
7
  }
@@ -182,6 +182,46 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
182
182
  requiredAttributes: ["format"],
183
183
  optionalAttributes: ["documentation"],
184
184
  attributeConstraints: { documentation: { type: "string" }, format: { type: "string", enum: ["pdf", "html", "xml", "json", "plain-text", "binary"], description: "The media format of this representation" } }
185
+ }, NODE_TYPE_PRODUCT_CAPABILITY = {
186
+ specNodeId: "product.capability",
187
+ layer: "product",
188
+ type: "capability",
189
+ title: "Capability",
190
+ requiredAttributes: ["status"],
191
+ optionalAttributes: ["documentation", "properties"],
192
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the capability" }, status: { type: "string", enum: ["proposed", "planned", "developing", "delivered", "deprecated"], description: "Lifecycle status of the capability" }, properties: { type: "object", description: "Cross-layer properties" } }
193
+ }, NODE_TYPE_PRODUCT_FEATURE = {
194
+ specNodeId: "product.feature",
195
+ layer: "product",
196
+ type: "feature",
197
+ title: "Feature",
198
+ requiredAttributes: ["priority", "status"],
199
+ optionalAttributes: ["documentation", "size", "properties"],
200
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the feature" }, priority: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: "Priority level" }, status: { type: "string", enum: ["proposed", "planned", "developing", "delivered", "deprecated"], description: "Lifecycle status of the feature" }, size: { type: "string", enum: ["xs", "s", "m", "l", "xl"], description: "Relative sizing estimate" }, properties: { type: "object", description: "Cross-layer properties" } }
201
+ }, NODE_TYPE_PRODUCT_MILESTONE = {
202
+ specNodeId: "product.milestone",
203
+ layer: "product",
204
+ type: "milestone",
205
+ title: "Milestone",
206
+ requiredAttributes: ["status"],
207
+ optionalAttributes: ["documentation"],
208
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the milestone" }, status: { type: "string", enum: ["proposed", "planned", "active", "completed", "cancelled"], description: "Milestone status" } }
209
+ }, NODE_TYPE_PRODUCT_PERSONA = {
210
+ specNodeId: "product.persona",
211
+ layer: "product",
212
+ type: "persona",
213
+ title: "Persona",
214
+ requiredAttributes: ["category", "proficiency"],
215
+ optionalAttributes: ["documentation"],
216
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the persona" }, category: { type: "string", enum: ["primary", "secondary", "served", "negative"], description: "Persona classification by importance" }, proficiency: { type: "string", enum: ["novice", "intermediate", "advanced", "expert"], description: "Technical proficiency level" } }
217
+ }, NODE_TYPE_PRODUCT_USERWORKFLOW = {
218
+ specNodeId: "product.userworkflow",
219
+ layer: "product",
220
+ type: "userworkflow",
221
+ title: "UserWorkflow",
222
+ requiredAttributes: ["complexity"],
223
+ optionalAttributes: ["documentation", "properties"],
224
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the user workflow" }, complexity: { type: "string", enum: ["simple", "moderate", "complex"], description: "Workflow complexity assessment" }, properties: { type: "object", description: "Cross-layer properties" } }
185
225
  }, NODE_TYPE_SECURITY_ACCESSCONDITION = {
186
226
  specNodeId: "security.accesscondition",
187
227
  layer: "security",
@@ -1510,6 +1550,11 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1510
1550
  ["business.contract", NODE_TYPE_BUSINESS_CONTRACT],
1511
1551
  ["business.product", NODE_TYPE_BUSINESS_PRODUCT],
1512
1552
  ["business.representation", NODE_TYPE_BUSINESS_REPRESENTATION],
1553
+ ["product.capability", NODE_TYPE_PRODUCT_CAPABILITY],
1554
+ ["product.feature", NODE_TYPE_PRODUCT_FEATURE],
1555
+ ["product.milestone", NODE_TYPE_PRODUCT_MILESTONE],
1556
+ ["product.persona", NODE_TYPE_PRODUCT_PERSONA],
1557
+ ["product.userworkflow", NODE_TYPE_PRODUCT_USERWORKFLOW],
1513
1558
  ["security.accesscondition", NODE_TYPE_SECURITY_ACCESSCONDITION],
1514
1559
  ["security.accountabilityrequirement", NODE_TYPE_SECURITY_ACCOUNTABILITYREQUIREMENT],
1515
1560
  ["security.actor", NODE_TYPE_SECURITY_ACTOR],