@archpilotlabs/archpilot 0.2.2 → 0.2.4

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 (298) hide show
  1. package/CHANGELOG.md +538 -0
  2. package/README.md +1 -0
  3. package/dist/archpilot-cli.js +850 -159
  4. package/dist/cli/src/archpilot-cli.js +5523 -0
  5. package/dist/cli/src/archpilot-cli.js.map +1 -0
  6. package/dist/core/src/adr/adrLoader.js +97 -0
  7. package/dist/core/src/adr/adrLoader.js.map +1 -0
  8. package/dist/core/src/adr/adrParser.js +77 -0
  9. package/dist/core/src/adr/adrParser.js.map +1 -0
  10. package/dist/core/src/adr/adrTemplate.js +45 -0
  11. package/dist/core/src/adr/adrTemplate.js.map +1 -0
  12. package/dist/core/src/adr/adrTypes.js +3 -0
  13. package/dist/core/src/adr/adrTypes.js.map +1 -0
  14. package/dist/core/src/adr/adrValidation.js +160 -0
  15. package/dist/core/src/adr/adrValidation.js.map +1 -0
  16. package/dist/core/src/adr/index.js +9 -0
  17. package/dist/core/src/adr/index.js.map +1 -0
  18. package/dist/core/src/adrManagement.js +174 -0
  19. package/dist/core/src/adrManagement.js.map +1 -0
  20. package/dist/core/src/adrRequirementStatus.js +62 -0
  21. package/dist/core/src/adrRequirementStatus.js.map +1 -0
  22. package/dist/core/src/adrScaffoldGeneration.js +325 -0
  23. package/dist/core/src/adrScaffoldGeneration.js.map +1 -0
  24. package/dist/core/src/apiDesignAnalysis.js +869 -0
  25. package/dist/core/src/apiDesignAnalysis.js.map +1 -0
  26. package/dist/core/src/applicationLayeringAnalysis.js +920 -0
  27. package/dist/core/src/applicationLayeringAnalysis.js.map +1 -0
  28. package/dist/core/src/applyRulePack.js +117 -0
  29. package/dist/core/src/applyRulePack.js.map +1 -0
  30. package/dist/core/src/architectureBaseline.js +271 -0
  31. package/dist/core/src/architectureBaseline.js.map +1 -0
  32. package/dist/core/src/architectureComponentDiscoveryDefaults.js +139 -0
  33. package/dist/core/src/architectureComponentDiscoveryDefaults.js.map +1 -0
  34. package/dist/core/src/architectureDependencyContext.js +316 -0
  35. package/dist/core/src/architectureDependencyContext.js.map +1 -0
  36. package/dist/core/src/architectureDriftDetection.js +96 -0
  37. package/dist/core/src/architectureDriftDetection.js.map +1 -0
  38. package/dist/core/src/architectureDriftTimeline.js +221 -0
  39. package/dist/core/src/architectureDriftTimeline.js.map +1 -0
  40. package/dist/core/src/architectureGovernanceBaseline.js +469 -0
  41. package/dist/core/src/architectureGovernanceBaseline.js.map +1 -0
  42. package/dist/core/src/architectureHealthHistory.js +208 -0
  43. package/dist/core/src/architectureHealthHistory.js.map +1 -0
  44. package/dist/core/src/architectureHealthScore.js +657 -0
  45. package/dist/core/src/architectureHealthScore.js.map +1 -0
  46. package/dist/core/src/architectureInit.js +826 -0
  47. package/dist/core/src/architectureInit.js.map +1 -0
  48. package/dist/core/src/architectureMap.js +727 -0
  49. package/dist/core/src/architectureMap.js.map +1 -0
  50. package/dist/core/src/architectureMigrationPreview.js +467 -0
  51. package/dist/core/src/architectureMigrationPreview.js.map +1 -0
  52. package/dist/core/src/architectureModelRefresh.js +209 -0
  53. package/dist/core/src/architectureModelRefresh.js.map +1 -0
  54. package/dist/core/src/architectureReportWorkflow.js +139 -0
  55. package/dist/core/src/architectureReportWorkflow.js.map +1 -0
  56. package/dist/core/src/architectureValidation.js +3879 -0
  57. package/dist/core/src/architectureValidation.js.map +1 -0
  58. package/dist/core/src/architectureWorkspaceModel.js +166 -0
  59. package/dist/core/src/architectureWorkspaceModel.js.map +1 -0
  60. package/dist/core/src/authorizationTenantAnalysis.js +652 -0
  61. package/dist/core/src/authorizationTenantAnalysis.js.map +1 -0
  62. package/dist/core/src/bootstrapArchitectureConfig.js +150 -0
  63. package/dist/core/src/bootstrapArchitectureConfig.js.map +1 -0
  64. package/dist/core/src/changeRisk/changeRiskAssessment.js +251 -0
  65. package/dist/core/src/changeRisk/changeRiskAssessment.js.map +1 -0
  66. package/dist/core/src/changeRisk/changeRiskTypes.js +3 -0
  67. package/dist/core/src/changeRisk/changeRiskTypes.js.map +1 -0
  68. package/dist/core/src/changeRisk/index.js +6 -0
  69. package/dist/core/src/changeRisk/index.js.map +1 -0
  70. package/dist/core/src/ci/githubInlineAnnotations.js +245 -0
  71. package/dist/core/src/ci/githubInlineAnnotations.js.map +1 -0
  72. package/dist/core/src/ci/githubPrCommentAdapter.js +232 -0
  73. package/dist/core/src/ci/githubPrCommentAdapter.js.map +1 -0
  74. package/dist/core/src/ciWorkflowTemplates.js +1042 -0
  75. package/dist/core/src/ciWorkflowTemplates.js.map +1 -0
  76. package/dist/core/src/compliance/complianceExportBuilder.js +122 -0
  77. package/dist/core/src/compliance/complianceExportBuilder.js.map +1 -0
  78. package/dist/core/src/compliance/complianceExportTypes.js +3 -0
  79. package/dist/core/src/compliance/complianceExportTypes.js.map +1 -0
  80. package/dist/core/src/compliance/complianceExportWriter.js +48 -0
  81. package/dist/core/src/compliance/complianceExportWriter.js.map +1 -0
  82. package/dist/core/src/compliance/complianceRulePackResolver.js +62 -0
  83. package/dist/core/src/compliance/complianceRulePackResolver.js.map +1 -0
  84. package/dist/core/src/config/index.js +17 -0
  85. package/dist/core/src/config/index.js.map +1 -0
  86. package/dist/core/src/config/projectConfig.js +224 -0
  87. package/dist/core/src/config/projectConfig.js.map +1 -0
  88. package/dist/core/src/config/projectIdentity.js +160 -0
  89. package/dist/core/src/config/projectIdentity.js.map +1 -0
  90. package/dist/core/src/dataQueryRiskDetection.js +1203 -0
  91. package/dist/core/src/dataQueryRiskDetection.js.map +1 -0
  92. package/dist/core/src/dependencyValidation.js +2557 -0
  93. package/dist/core/src/dependencyValidation.js.map +1 -0
  94. package/dist/core/src/discoverAdrs.js +15 -0
  95. package/dist/core/src/discoverAdrs.js.map +1 -0
  96. package/dist/core/src/drift/driftComparator.js +49 -0
  97. package/dist/core/src/drift/driftComparator.js.map +1 -0
  98. package/dist/core/src/drift/driftSnapshotLoader.js +136 -0
  99. package/dist/core/src/drift/driftSnapshotLoader.js.map +1 -0
  100. package/dist/core/src/drift/driftSnapshotTypes.js +3 -0
  101. package/dist/core/src/drift/driftSnapshotTypes.js.map +1 -0
  102. package/dist/core/src/drift/driftSnapshotWriter.js +48 -0
  103. package/dist/core/src/drift/driftSnapshotWriter.js.map +1 -0
  104. package/dist/core/src/drift/index.js +6 -0
  105. package/dist/core/src/drift/index.js.map +1 -0
  106. package/dist/core/src/eventArchitectureAnalysis.js +925 -0
  107. package/dist/core/src/eventArchitectureAnalysis.js.map +1 -0
  108. package/dist/core/src/findingTargetResolution.js +117 -0
  109. package/dist/core/src/findingTargetResolution.js.map +1 -0
  110. package/dist/core/src/generateArchitectureDiagrams.js +57 -0
  111. package/dist/core/src/generateArchitectureDiagrams.js.map +1 -0
  112. package/dist/core/src/generateImpactAnalysis.js +366 -0
  113. package/dist/core/src/generateImpactAnalysis.js.map +1 -0
  114. package/dist/core/src/generateOnboardingDocs.js +262 -0
  115. package/dist/core/src/generateOnboardingDocs.js.map +1 -0
  116. package/dist/core/src/governance/cloudConnection.js +203 -0
  117. package/dist/core/src/governance/cloudConnection.js.map +1 -0
  118. package/dist/core/src/governance/governanceContracts.js +129 -0
  119. package/dist/core/src/governance/governanceContracts.js.map +1 -0
  120. package/dist/core/src/governance/governanceGitMetadata.js +78 -0
  121. package/dist/core/src/governance/governanceGitMetadata.js.map +1 -0
  122. package/dist/core/src/governance/governanceUploadClient.js +119 -0
  123. package/dist/core/src/governance/governanceUploadClient.js.map +1 -0
  124. package/dist/core/src/governance/governanceUploadLimitErrorFormatting.js +155 -0
  125. package/dist/core/src/governance/governanceUploadLimitErrorFormatting.js.map +1 -0
  126. package/dist/core/src/governance/governanceUploadPayload.js +439 -0
  127. package/dist/core/src/governance/governanceUploadPayload.js.map +1 -0
  128. package/dist/core/src/governance/runGovernanceUpload.js +103 -0
  129. package/dist/core/src/governance/runGovernanceUpload.js.map +1 -0
  130. package/dist/core/src/impactAnalysisEngine.js +376 -0
  131. package/dist/core/src/impactAnalysisEngine.js.map +1 -0
  132. package/dist/core/src/initializationState.js +99 -0
  133. package/dist/core/src/initializationState.js.map +1 -0
  134. package/dist/core/src/managedArtifacts.js +151 -0
  135. package/dist/core/src/managedArtifacts.js.map +1 -0
  136. package/dist/core/src/moduleContractValidation.js +266 -0
  137. package/dist/core/src/moduleContractValidation.js.map +1 -0
  138. package/dist/core/src/moduleContractsGenerator.js +337 -0
  139. package/dist/core/src/moduleContractsGenerator.js.map +1 -0
  140. package/dist/core/src/moduleDiscovery.js +416 -0
  141. package/dist/core/src/moduleDiscovery.js.map +1 -0
  142. package/dist/core/src/moduleScope.js +426 -0
  143. package/dist/core/src/moduleScope.js.map +1 -0
  144. package/dist/core/src/onboardingGuidance.js +74 -0
  145. package/dist/core/src/onboardingGuidance.js.map +1 -0
  146. package/dist/core/src/operationalLogging.js +7 -0
  147. package/dist/core/src/operationalLogging.js.map +1 -0
  148. package/dist/core/src/packageVersion.js +52 -0
  149. package/dist/core/src/packageVersion.js.map +1 -0
  150. package/dist/core/src/policy/effectivePolicyResolver.js +91 -0
  151. package/dist/core/src/policy/effectivePolicyResolver.js.map +1 -0
  152. package/dist/core/src/policy/exceptionLoader.js +285 -0
  153. package/dist/core/src/policy/exceptionLoader.js.map +1 -0
  154. package/dist/core/src/policy/remotePolicyLoader.js +227 -0
  155. package/dist/core/src/policy/remotePolicyLoader.js.map +1 -0
  156. package/dist/core/src/policy/remotePolicyTypes.js +3 -0
  157. package/dist/core/src/policy/remotePolicyTypes.js.map +1 -0
  158. package/dist/core/src/policy/riskPolicyConfig.js +206 -0
  159. package/dist/core/src/policy/riskPolicyConfig.js.map +1 -0
  160. package/dist/core/src/policy/riskPolicyEnforcement.js +203 -0
  161. package/dist/core/src/policy/riskPolicyEnforcement.js.map +1 -0
  162. package/dist/core/src/policy/riskPolicyExitCode.js +16 -0
  163. package/dist/core/src/policy/riskPolicyExitCode.js.map +1 -0
  164. package/dist/core/src/policy/riskPolicyInitializer.js +90 -0
  165. package/dist/core/src/policy/riskPolicyInitializer.js.map +1 -0
  166. package/dist/core/src/quickFix/quickFixEngine.js +132 -0
  167. package/dist/core/src/quickFix/quickFixEngine.js.map +1 -0
  168. package/dist/core/src/quickFix/quickFixMessaging.js +15 -0
  169. package/dist/core/src/quickFix/quickFixMessaging.js.map +1 -0
  170. package/dist/core/src/quickFix/quickFixProviders.js +87 -0
  171. package/dist/core/src/quickFix/quickFixProviders.js.map +1 -0
  172. package/dist/core/src/quickFix/quickFixTypes.js +3 -0
  173. package/dist/core/src/quickFix/quickFixTypes.js.map +1 -0
  174. package/dist/core/src/remediation/fileHelpers.js +86 -0
  175. package/dist/core/src/remediation/fileHelpers.js.map +1 -0
  176. package/dist/core/src/remediation/fixRegistry.js +645 -0
  177. package/dist/core/src/remediation/fixRegistry.js.map +1 -0
  178. package/dist/core/src/remediation/index.js +8 -0
  179. package/dist/core/src/remediation/index.js.map +1 -0
  180. package/dist/core/src/remediation/remediationEngine.js +207 -0
  181. package/dist/core/src/remediation/remediationEngine.js.map +1 -0
  182. package/dist/core/src/reporting/adrReporter.js +59 -0
  183. package/dist/core/src/reporting/adrReporter.js.map +1 -0
  184. package/dist/core/src/reporting/architectureBaselineReporter.js +64 -0
  185. package/dist/core/src/reporting/architectureBaselineReporter.js.map +1 -0
  186. package/dist/core/src/reporting/architectureDiagramReporter.js +148 -0
  187. package/dist/core/src/reporting/architectureDiagramReporter.js.map +1 -0
  188. package/dist/core/src/reporting/architectureDriftTimelineReporter.js +44 -0
  189. package/dist/core/src/reporting/architectureDriftTimelineReporter.js.map +1 -0
  190. package/dist/core/src/reporting/architectureHealthHistoryReporter.js +51 -0
  191. package/dist/core/src/reporting/architectureHealthHistoryReporter.js.map +1 -0
  192. package/dist/core/src/reporting/architectureMapReporter.js +228 -0
  193. package/dist/core/src/reporting/architectureMapReporter.js.map +1 -0
  194. package/dist/core/src/reporting/architecturePrCommentReporter.js +324 -0
  195. package/dist/core/src/reporting/architecturePrCommentReporter.js.map +1 -0
  196. package/dist/core/src/reporting/architecturePrReviewReporter.js +389 -0
  197. package/dist/core/src/reporting/architecturePrReviewReporter.js.map +1 -0
  198. package/dist/core/src/reporting/architectureReportArtifacts.js +166 -0
  199. package/dist/core/src/reporting/architectureReportArtifacts.js.map +1 -0
  200. package/dist/core/src/reporting/architectureReviewReportGenerator.js +382 -0
  201. package/dist/core/src/reporting/architectureReviewReportGenerator.js.map +1 -0
  202. package/dist/core/src/reporting/architectureReviewReporter.js +1633 -0
  203. package/dist/core/src/reporting/architectureReviewReporter.js.map +1 -0
  204. package/dist/core/src/reporting/architectureRiskAssessment.js +101 -0
  205. package/dist/core/src/reporting/architectureRiskAssessment.js.map +1 -0
  206. package/dist/core/src/reporting/architectureScoreBadge.js +177 -0
  207. package/dist/core/src/reporting/architectureScoreBadge.js.map +1 -0
  208. package/dist/core/src/reporting/architectureSupplementalReporters.js +124 -0
  209. package/dist/core/src/reporting/architectureSupplementalReporters.js.map +1 -0
  210. package/dist/core/src/reporting/changeRiskAssessment.js +6 -0
  211. package/dist/core/src/reporting/changeRiskAssessment.js.map +1 -0
  212. package/dist/core/src/reporting/changeRiskTypes.js +3 -0
  213. package/dist/core/src/reporting/changeRiskTypes.js.map +1 -0
  214. package/dist/core/src/reporting/impactAnalysisReporter.js +111 -0
  215. package/dist/core/src/reporting/impactAnalysisReporter.js.map +1 -0
  216. package/dist/core/src/reporting/onboardingDocsReporter.js +113 -0
  217. package/dist/core/src/reporting/onboardingDocsReporter.js.map +1 -0
  218. package/dist/core/src/reporting/rulePackReporter.js +61 -0
  219. package/dist/core/src/reporting/rulePackReporter.js.map +1 -0
  220. package/dist/core/src/reporting/safetyControlsDetection.js +343 -0
  221. package/dist/core/src/reporting/safetyControlsDetection.js.map +1 -0
  222. package/dist/core/src/resolveRuleAdrs.js +31 -0
  223. package/dist/core/src/resolveRuleAdrs.js.map +1 -0
  224. package/dist/core/src/reviewGenerationWorkflow.js +220 -0
  225. package/dist/core/src/reviewGenerationWorkflow.js.map +1 -0
  226. package/dist/core/src/rulePacks/index.js +17 -0
  227. package/dist/core/src/rulePacks/index.js.map +1 -0
  228. package/dist/core/src/rulePacks/layeredMonolithRulePack.js +45 -0
  229. package/dist/core/src/rulePacks/layeredMonolithRulePack.js.map +1 -0
  230. package/dist/core/src/rulePacks/modularMonolithRulePack.js +41 -0
  231. package/dist/core/src/rulePacks/modularMonolithRulePack.js.map +1 -0
  232. package/dist/core/src/rulePacks/types.js +3 -0
  233. package/dist/core/src/rulePacks/types.js.map +1 -0
  234. package/dist/core/src/setupNextSteps.js +939 -0
  235. package/dist/core/src/setupNextSteps.js.map +1 -0
  236. package/dist/core/src/setupRefresh.js +152 -0
  237. package/dist/core/src/setupRefresh.js.map +1 -0
  238. package/dist/core/src/smartInit/apiDbHintDetection.js +836 -0
  239. package/dist/core/src/smartInit/apiDbHintDetection.js.map +1 -0
  240. package/dist/core/src/smartInit/architectureProposalBuilder.js +1215 -0
  241. package/dist/core/src/smartInit/architectureProposalBuilder.js.map +1 -0
  242. package/dist/core/src/smartInit/architectureStyleDetection.js +472 -0
  243. package/dist/core/src/smartInit/architectureStyleDetection.js.map +1 -0
  244. package/dist/core/src/smartInit/archpilotIgnore.js +139 -0
  245. package/dist/core/src/smartInit/archpilotIgnore.js.map +1 -0
  246. package/dist/core/src/smartInit/componentDetection.js +1084 -0
  247. package/dist/core/src/smartInit/componentDetection.js.map +1 -0
  248. package/dist/core/src/smartInit/implementationProfileResolution.js +53 -0
  249. package/dist/core/src/smartInit/implementationProfileResolution.js.map +1 -0
  250. package/dist/core/src/smartInit/index.js +31 -0
  251. package/dist/core/src/smartInit/index.js.map +1 -0
  252. package/dist/core/src/smartInit/moduleDetection.js +982 -0
  253. package/dist/core/src/smartInit/moduleDetection.js.map +1 -0
  254. package/dist/core/src/smartInit/projectKindDetection.js +437 -0
  255. package/dist/core/src/smartInit/projectKindDetection.js.map +1 -0
  256. package/dist/core/src/smartInit/repoTopologyDetection.js +470 -0
  257. package/dist/core/src/smartInit/repoTopologyDetection.js.map +1 -0
  258. package/dist/core/src/smartInit/runContext.js +112 -0
  259. package/dist/core/src/smartInit/runContext.js.map +1 -0
  260. package/dist/core/src/smartInit/smartInitEngine.js +94 -0
  261. package/dist/core/src/smartInit/smartInitEngine.js.map +1 -0
  262. package/dist/core/src/smartInit/stackDetection.js +503 -0
  263. package/dist/core/src/smartInit/stackDetection.js.map +1 -0
  264. package/dist/core/src/smartInit/toolingHintDetection.js +345 -0
  265. package/dist/core/src/smartInit/toolingHintDetection.js.map +1 -0
  266. package/dist/core/src/sourceScopeClassification.js +83 -0
  267. package/dist/core/src/sourceScopeClassification.js.map +1 -0
  268. package/dist/core/src/stackAdapters.js +2475 -0
  269. package/dist/core/src/stackAdapters.js.map +1 -0
  270. package/dist/core/src/stackMetadata.js +157 -0
  271. package/dist/core/src/stackMetadata.js.map +1 -0
  272. package/dist/core/src/suppressions/index.js +3 -0
  273. package/dist/core/src/suppressions/index.js.map +1 -0
  274. package/dist/core/src/suppressions/suppressionReporter.js +38 -0
  275. package/dist/core/src/suppressions/suppressionReporter.js.map +1 -0
  276. package/dist/core/src/suppressions/suppressionTypes.js +3 -0
  277. package/dist/core/src/suppressions/suppressionTypes.js.map +1 -0
  278. package/dist/core/src/suppressions/suppressionValidator.js +119 -0
  279. package/dist/core/src/suppressions/suppressionValidator.js.map +1 -0
  280. package/dist/core/src/transactionDomainAnalysis.js +1416 -0
  281. package/dist/core/src/transactionDomainAnalysis.js.map +1 -0
  282. package/dist/core/src/validation/changedFilesResolver.js +165 -0
  283. package/dist/core/src/validation/changedFilesResolver.js.map +1 -0
  284. package/dist/core/src/validationProfiling.js +33 -0
  285. package/dist/core/src/validationProfiling.js.map +1 -0
  286. package/dist/core/src/validationRuleExplanations.js +69 -0
  287. package/dist/core/src/validationRuleExplanations.js.map +1 -0
  288. package/dist/core/src/validationSourceInventory.js +200 -0
  289. package/dist/core/src/validationSourceInventory.js.map +1 -0
  290. package/dist/core/src/validationSuppressions.js +231 -0
  291. package/dist/core/src/validationSuppressions.js.map +1 -0
  292. package/dist/core/src/validationTypeScriptAstCache.js +82 -0
  293. package/dist/core/src/validationTypeScriptAstCache.js.map +1 -0
  294. package/dist/core/src/validationWorkflow.js +222 -0
  295. package/dist/core/src/validationWorkflow.js.map +1 -0
  296. package/dist/core/src/workspaceRoot.js +68 -0
  297. package/dist/core/src/workspaceRoot.js.map +1 -0
  298. package/package.json +3 -2
@@ -0,0 +1,826 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildDefaultModuleContractPath = buildDefaultModuleContractPath;
37
+ exports.buildDefaultModulePublicEntrypoints = buildDefaultModulePublicEntrypoints;
38
+ exports.loadArchitectureContract = loadArchitectureContract;
39
+ exports.saveArchitectureContract = saveArchitectureContract;
40
+ exports.writeArchitectureConfig = writeArchitectureConfig;
41
+ exports.generateDocs = generateDocs;
42
+ exports.generateContracts = generateContracts;
43
+ exports.generateDatabaseFiles = generateDatabaseFiles;
44
+ exports.generateArchpilotConfigFiles = generateArchpilotConfigFiles;
45
+ exports.ensureArchpilotIgnoreFile = ensureArchpilotIgnoreFile;
46
+ exports.applyArchitectureInitialization = applyArchitectureInitialization;
47
+ const path = __importStar(require("node:path"));
48
+ const node_fs_1 = require("node:fs");
49
+ const adrTemplate_1 = require("./adr/adrTemplate");
50
+ const setupNextSteps_1 = require("./setupNextSteps");
51
+ const architectureMap_1 = require("./architectureMap");
52
+ const architectureMapReporter_1 = require("./reporting/architectureMapReporter");
53
+ const managedArtifacts_1 = require("./managedArtifacts");
54
+ const riskPolicyInitializer_1 = require("./policy/riskPolicyInitializer");
55
+ const archpilotIgnore_1 = require("./smartInit/archpilotIgnore");
56
+ const moduleDiscovery_1 = require("./moduleDiscovery");
57
+ const stackMetadata_1 = require("./stackMetadata");
58
+ const stackAdapters_1 = require("./stackAdapters");
59
+ function hasConfiguredApi(config) {
60
+ return config.apiStyle !== 'none';
61
+ }
62
+ function hasConfiguredDatabase(config) {
63
+ return config.database !== 'none';
64
+ }
65
+ function nowUtcIso() {
66
+ return new Date().toISOString();
67
+ }
68
+ async function ensureDir(dirPath) {
69
+ await node_fs_1.promises.mkdir(dirPath, { recursive: true });
70
+ }
71
+ async function fileExists(filePath) {
72
+ try {
73
+ await node_fs_1.promises.access(filePath);
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ async function writeFileIfMissing(filePath, contents) {
81
+ if (await fileExists(filePath)) {
82
+ return false;
83
+ }
84
+ await ensureDir(path.dirname(filePath));
85
+ await node_fs_1.promises.writeFile(filePath, contents, { encoding: 'utf8' });
86
+ return true;
87
+ }
88
+ function labelTenantModel(model) {
89
+ switch (model) {
90
+ case 'single_tenant':
91
+ return 'Single tenant (one tenant per deployment)';
92
+ case 'same_db_same_schema':
93
+ return 'Multi-tenant: same DB, same schema (tenant_id discriminator)';
94
+ case 'same_db_different_schema':
95
+ return 'Multi-tenant: same DB, different schema per tenant';
96
+ }
97
+ }
98
+ function defaultArchitectureContractSections(config) {
99
+ const apiEnabled = config?.apiStyle !== 'none';
100
+ const databaseEnabled = config?.database !== 'none';
101
+ const adapter = (0, stackAdapters_1.resolvePrimaryAdapterFromContract)(config);
102
+ const modulesRoot = adapter.scaffoldingDefaults?.modulesRoot ?? 'src/modules';
103
+ return {
104
+ structure: {
105
+ modulesRoot,
106
+ docsRoot: 'docs',
107
+ ...(apiEnabled ? { apiRoot: 'contracts' } : {}),
108
+ ...(databaseEnabled ? { databaseRoot: 'db/sql' } : {}),
109
+ contractsRoot: '.archpilot/contracts',
110
+ },
111
+ artifacts: {
112
+ architectureOverview: 'docs/architecture/overview.md',
113
+ adrDirectory: 'docs/adrs',
114
+ ...(apiEnabled ? { openApiSpec: 'contracts/openapi.yaml' } : {}),
115
+ ...(databaseEnabled ? { sqlBaseline: 'db/sql/001_init.sql' } : {}),
116
+ },
117
+ modules: {},
118
+ layers: {},
119
+ governance: {
120
+ validation: {
121
+ enforceModuleBoundaries: false,
122
+ enforceLayerRules: false,
123
+ highInboundDependencyWarningThreshold: 3,
124
+ },
125
+ },
126
+ };
127
+ }
128
+ function normalizeArchitectureModuleContractReference(value) {
129
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
130
+ return undefined;
131
+ }
132
+ const typedValue = value;
133
+ const pathValue = typeof typedValue.path === 'string' ? typedValue.path : undefined;
134
+ const contractValue = typeof typedValue.contract === 'string' ? typedValue.contract : undefined;
135
+ const publicEntrypointsValue = Array.isArray(typedValue.publicEntrypoints)
136
+ ? typedValue.publicEntrypoints.filter((entry) => typeof entry === 'string')
137
+ : undefined;
138
+ return {
139
+ ...(pathValue ? { path: pathValue } : {}),
140
+ ...(contractValue ? { contract: contractValue } : {}),
141
+ ...(publicEntrypointsValue ? { publicEntrypoints: publicEntrypointsValue } : {}),
142
+ };
143
+ }
144
+ function normalizeArchitectureModuleRegistry(value) {
145
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
146
+ return {};
147
+ }
148
+ return Object.entries(value)
149
+ .sort(([left], [right]) => left.localeCompare(right))
150
+ .reduce((accumulator, [moduleName, moduleValue]) => {
151
+ const normalizedReference = normalizeArchitectureModuleContractReference(moduleValue);
152
+ if (normalizedReference) {
153
+ accumulator[moduleName] = normalizedReference;
154
+ }
155
+ return accumulator;
156
+ }, {});
157
+ }
158
+ function normalizeOptionalStringRecord(value) {
159
+ return value && typeof value === 'object' && !Array.isArray(value)
160
+ ? { ...value }
161
+ : undefined;
162
+ }
163
+ function normalizeOptionalStringArray(value) {
164
+ if (!Array.isArray(value)) {
165
+ return undefined;
166
+ }
167
+ const normalized = value.filter((entry) => typeof entry === 'string');
168
+ return normalized.length > 0 ? normalized : undefined;
169
+ }
170
+ function normalizeOptionalString(value) {
171
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
172
+ }
173
+ function normalizeArchitectureStructure(value) {
174
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
175
+ return undefined;
176
+ }
177
+ const typedValue = value;
178
+ const modulesRoot = typeof typedValue.modulesRoot === 'string' ? typedValue.modulesRoot : undefined;
179
+ const docsRoot = typeof typedValue.docsRoot === 'string' ? typedValue.docsRoot : undefined;
180
+ const apiRoot = typeof typedValue.apiRoot === 'string' ? typedValue.apiRoot : undefined;
181
+ const databaseRoot = typeof typedValue.databaseRoot === 'string' ? typedValue.databaseRoot : undefined;
182
+ const contractsRoot = typeof typedValue.contractsRoot === 'string'
183
+ ? typedValue.contractsRoot
184
+ : undefined;
185
+ return {
186
+ ...(modulesRoot ? { modulesRoot } : {}),
187
+ ...(docsRoot ? { docsRoot } : {}),
188
+ ...(apiRoot ? { apiRoot } : {}),
189
+ ...(databaseRoot ? { databaseRoot } : {}),
190
+ ...(contractsRoot ? { contractsRoot } : {}),
191
+ };
192
+ }
193
+ function normalizeArchitectureArtifacts(value) {
194
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
195
+ return undefined;
196
+ }
197
+ const typedValue = value;
198
+ const architectureOverview = typeof typedValue.architectureOverview === 'string'
199
+ ? typedValue.architectureOverview
200
+ : undefined;
201
+ const adrDirectory = typeof typedValue.adrDirectory === 'string' ? typedValue.adrDirectory : undefined;
202
+ const openApiSpec = typeof typedValue.openApiSpec === 'string' ? typedValue.openApiSpec : undefined;
203
+ const sqlBaseline = typeof typedValue.sqlBaseline === 'string' ? typedValue.sqlBaseline : undefined;
204
+ return {
205
+ ...(architectureOverview ? { architectureOverview } : {}),
206
+ ...(adrDirectory ? { adrDirectory } : {}),
207
+ ...(openApiSpec ? { openApiSpec } : {}),
208
+ ...(sqlBaseline ? { sqlBaseline } : {}),
209
+ };
210
+ }
211
+ function normalizeArchitectureGovernance(value) {
212
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
213
+ return undefined;
214
+ }
215
+ const typedValue = value;
216
+ const validation = typedValue.validation &&
217
+ typeof typedValue.validation === 'object' &&
218
+ !Array.isArray(typedValue.validation)
219
+ ? typedValue.validation
220
+ : undefined;
221
+ return {
222
+ ...(validation
223
+ ? {
224
+ validation: {
225
+ ...(typeof validation.enforceModuleBoundaries === 'boolean'
226
+ ? {
227
+ enforceModuleBoundaries: validation.enforceModuleBoundaries,
228
+ }
229
+ : {}),
230
+ ...(typeof validation.enforceLayerRules === 'boolean'
231
+ ? { enforceLayerRules: validation.enforceLayerRules }
232
+ : {}),
233
+ ...(typeof validation.highInboundDependencyWarningThreshold ===
234
+ 'number'
235
+ ? {
236
+ highInboundDependencyWarningThreshold: validation.highInboundDependencyWarningThreshold,
237
+ }
238
+ : {}),
239
+ },
240
+ }
241
+ : {}),
242
+ };
243
+ }
244
+ function normalizeArchitectureStyle(value) {
245
+ return value === 'modular_monolith' || value === 'multi_component_monorepo' || value === 'microservices'
246
+ ? value
247
+ : undefined;
248
+ }
249
+ function normalizeDatabaseChoice(value) {
250
+ return value === 'none' || value === 'postgresql' || value === 'mysql'
251
+ ? value
252
+ : undefined;
253
+ }
254
+ function normalizeTenantModel(value) {
255
+ return value === 'single_tenant' ||
256
+ value === 'same_db_same_schema' ||
257
+ value === 'same_db_different_schema'
258
+ ? value
259
+ : undefined;
260
+ }
261
+ function normalizeApiStyle(value) {
262
+ return value === 'none' || value === 'rest' || value === 'graphql'
263
+ ? value
264
+ : undefined;
265
+ }
266
+ function normalizeAuthStyle(value) {
267
+ return value === 'jwt' || value === 'session' ? value : undefined;
268
+ }
269
+ function normalizeArchitectureComponentConfig(value) {
270
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
271
+ return undefined;
272
+ }
273
+ const typedValue = value;
274
+ const stackMetadata = (0, stackMetadata_1.normalizeStackMetadata)(typedValue);
275
+ const projectKinds = Array.isArray(typedValue.projectKinds)
276
+ ? stackMetadata.projectKinds
277
+ : undefined;
278
+ const stacks = typedValue.stacks && Object.keys(stackMetadata.stacks).length > 0
279
+ ? stackMetadata.stacks
280
+ : undefined;
281
+ const modules = typedValue.modules !== undefined
282
+ ? normalizeArchitectureModuleRegistry(typedValue.modules)
283
+ : undefined;
284
+ const layers = normalizeOptionalStringRecord(typedValue.layers);
285
+ const structure = normalizeArchitectureStructure(typedValue.structure);
286
+ const artifacts = normalizeArchitectureArtifacts(typedValue.artifacts);
287
+ const governance = normalizeArchitectureGovernance(typedValue.governance);
288
+ const id = normalizeOptionalString(typedValue.id);
289
+ const componentPath = normalizeOptionalString(typedValue.path);
290
+ const componentType = normalizeOptionalString(typedValue.type);
291
+ const stack = normalizeOptionalString(typedValue.stack);
292
+ const kind = normalizeOptionalString(typedValue.kind);
293
+ const allowedDependencies = Array.isArray(typedValue.allowedDependencies)
294
+ ? [...new Set(typedValue.allowedDependencies.filter((entry) => typeof entry === 'string' && entry.trim().length > 0).map((entry) => entry.trim()))].sort((left, right) => left.localeCompare(right))
295
+ : undefined;
296
+ return {
297
+ ...(id ? { id } : {}),
298
+ ...(typeof typedValue.name === 'string' ? { name: typedValue.name } : {}),
299
+ ...(componentPath ? { path: componentPath } : {}),
300
+ ...(componentType ? { type: componentType } : {}),
301
+ ...(stack ? { stack: stack } : {}),
302
+ ...(kind ? { kind: kind } : {}),
303
+ ...(typedValue.repoTopology ? { repoTopology: stackMetadata.repoTopology } : {}),
304
+ ...(projectKinds ? { projectKinds } : {}),
305
+ ...(stacks ? { stacks } : {}),
306
+ ...(normalizeArchitectureStyle(typedValue.architectureStyle)
307
+ ? { architectureStyle: normalizeArchitectureStyle(typedValue.architectureStyle) }
308
+ : {}),
309
+ ...(normalizeDatabaseChoice(typedValue.database)
310
+ ? { database: normalizeDatabaseChoice(typedValue.database) }
311
+ : {}),
312
+ ...(normalizeTenantModel(typedValue.tenantModel)
313
+ ? { tenantModel: normalizeTenantModel(typedValue.tenantModel) }
314
+ : {}),
315
+ ...(typeof typedValue.rbac === 'boolean' ? { rbac: typedValue.rbac } : {}),
316
+ ...(normalizeApiStyle(typedValue.apiStyle)
317
+ ? { apiStyle: normalizeApiStyle(typedValue.apiStyle) }
318
+ : {}),
319
+ ...(normalizeAuthStyle(typedValue.authStyle)
320
+ ? { authStyle: normalizeAuthStyle(typedValue.authStyle) }
321
+ : {}),
322
+ ...(typeof typedValue.implementationProfile === 'string'
323
+ ? {
324
+ implementationProfile: typedValue.implementationProfile,
325
+ }
326
+ : {}),
327
+ ...(structure ? { structure } : {}),
328
+ ...(artifacts ? { artifacts } : {}),
329
+ ...(modules ? { modules } : {}),
330
+ ...(Array.isArray(typedValue.allowedDependencies)
331
+ ? { allowedDependencies: allowedDependencies ?? [] }
332
+ : {}),
333
+ ...(layers ? { layers } : {}),
334
+ ...(governance ? { governance } : {}),
335
+ };
336
+ }
337
+ function normalizeArchitectureComponents(value) {
338
+ if (!value || typeof value !== 'object') {
339
+ return undefined;
340
+ }
341
+ const entries = Array.isArray(value)
342
+ ? value.map((componentValue, index) => [`component-${index + 1}`, componentValue])
343
+ : Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
344
+ const components = entries.reduce((accumulator, [fallbackComponentId, componentValue]) => {
345
+ const normalizedComponent = normalizeArchitectureComponentConfig(componentValue);
346
+ if (normalizedComponent) {
347
+ const componentId = normalizedComponent.id ?? fallbackComponentId;
348
+ accumulator[componentId] = normalizedComponent;
349
+ }
350
+ return accumulator;
351
+ }, {});
352
+ return Object.keys(components).length > 0 ? components : undefined;
353
+ }
354
+ function normalizeArchitectureResourceConfig(value) {
355
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
356
+ return undefined;
357
+ }
358
+ const typedValue = value;
359
+ const components = normalizeOptionalStringArray(typedValue.components);
360
+ const dependsOn = normalizeOptionalStringArray(typedValue.dependsOn);
361
+ const metadata = normalizeOptionalStringRecord(typedValue.metadata);
362
+ const id = normalizeOptionalString(typedValue.id);
363
+ return {
364
+ ...(id ? { id } : {}),
365
+ ...(typeof typedValue.name === 'string' ? { name: typedValue.name } : {}),
366
+ ...(typeof typedValue.type === 'string' ? { type: typedValue.type } : {}),
367
+ ...(typeof typedValue.provider === 'string'
368
+ ? { provider: typedValue.provider }
369
+ : {}),
370
+ ...(typeof typedValue.path === 'string' ? { path: typedValue.path } : {}),
371
+ ...(typeof typedValue.ownerComponent === 'string'
372
+ ? { ownerComponent: typedValue.ownerComponent }
373
+ : {}),
374
+ ...(typeof typedValue.component === 'string'
375
+ ? { component: typedValue.component }
376
+ : {}),
377
+ ...(components ? { components } : {}),
378
+ ...(dependsOn ? { dependsOn } : {}),
379
+ ...(metadata ? { metadata } : {}),
380
+ };
381
+ }
382
+ function normalizeArchitectureResources(value) {
383
+ if (!value || typeof value !== 'object') {
384
+ return undefined;
385
+ }
386
+ const entries = Array.isArray(value)
387
+ ? value.map((resourceValue, index) => [`resource-${index + 1}`, resourceValue])
388
+ : Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
389
+ const resources = entries.reduce((accumulator, [fallbackResourceId, resourceValue]) => {
390
+ const normalizedResource = normalizeArchitectureResourceConfig(resourceValue);
391
+ if (normalizedResource) {
392
+ const resourceId = normalizedResource.id ?? fallbackResourceId;
393
+ accumulator[resourceId] = normalizedResource;
394
+ }
395
+ return accumulator;
396
+ }, {});
397
+ return Object.keys(resources).length > 0 ? resources : undefined;
398
+ }
399
+ function buildArchitectureContract(base, overrides) {
400
+ const defaults = defaultArchitectureContractSections(base);
401
+ const contract = {
402
+ version: base.version,
403
+ projectName: base.projectName,
404
+ repoTopology: base.repoTopology,
405
+ projectKinds: [...base.projectKinds],
406
+ stacks: { ...base.stacks },
407
+ architectureStyle: base.architectureStyle,
408
+ database: base.database,
409
+ tenantModel: base.tenantModel,
410
+ rbac: typeof overrides?.rbac === 'boolean' ? overrides.rbac : base.rbac,
411
+ apiStyle: base.apiStyle,
412
+ authStyle: base.authStyle,
413
+ implementationProfile: (typeof overrides?.implementationProfile === 'string' &&
414
+ overrides.implementationProfile) ||
415
+ base.implementationProfile,
416
+ createdAtUtc: typeof overrides?.createdAtUtc === 'string'
417
+ ? overrides.createdAtUtc
418
+ : base.createdAtUtc,
419
+ structure: {
420
+ ...defaults.structure,
421
+ ...(overrides?.structure ?? {}),
422
+ },
423
+ artifacts: {
424
+ ...defaults.artifacts,
425
+ ...(overrides?.artifacts ?? {}),
426
+ },
427
+ modules: overrides?.modules !== undefined
428
+ ? normalizeArchitectureModuleRegistry(overrides.modules)
429
+ : defaults.modules,
430
+ layers: overrides?.layers &&
431
+ typeof overrides.layers === 'object' &&
432
+ !Array.isArray(overrides.layers)
433
+ ? { ...overrides.layers }
434
+ : defaults.layers,
435
+ governance: {
436
+ ...defaults.governance,
437
+ ...(overrides?.governance ?? {}),
438
+ validation: {
439
+ ...defaults.governance.validation,
440
+ ...(overrides?.governance?.validation ?? {}),
441
+ },
442
+ },
443
+ };
444
+ if (!hasConfiguredApi(base)) {
445
+ delete contract.structure.apiRoot;
446
+ delete contract.artifacts.openApiSpec;
447
+ }
448
+ if (!hasConfiguredDatabase(base)) {
449
+ delete contract.structure.databaseRoot;
450
+ delete contract.artifacts.sqlBaseline;
451
+ }
452
+ return contract;
453
+ }
454
+ function buildDefaultModuleContractPath(moduleName, contract) {
455
+ const contractsRoot = (0, moduleDiscovery_1.resolveContractsRootFromContract)(contract);
456
+ const safeModuleName = moduleName
457
+ .replace(/\\/g, '/')
458
+ .split('/')
459
+ .map((segment) => segment.trim())
460
+ .filter((segment) => segment.length > 0)
461
+ .join('.');
462
+ return `${contractsRoot}/${safeModuleName}.contract.json`;
463
+ }
464
+ function buildDefaultModulePublicEntrypoints(moduleName, contract) {
465
+ const modulesRoot = (0, moduleDiscovery_1.resolveModulesRootFromContract)(contract);
466
+ const adapter = (0, stackAdapters_1.resolvePrimaryAdapterFromContract)(contract);
467
+ const moduleIndexFileName = adapter.scaffoldingDefaults?.moduleIndexFileName ?? 'index.ts';
468
+ const entrypoints = [`${modulesRoot}/${moduleName}/${moduleIndexFileName}`];
469
+ const publicDirectoryName = adapter.publicEntrypointDirectoryNames[0];
470
+ if (publicDirectoryName && publicDirectoryName.trim().length > 0) {
471
+ entrypoints.push(`${modulesRoot}/${moduleName}/${publicDirectoryName}`);
472
+ }
473
+ return entrypoints;
474
+ }
475
+ function overviewTemplate(config) {
476
+ const stackSummary = [
477
+ config.stacks.backendStack ? `backend=${config.stacks.backendStack}` : undefined,
478
+ config.stacks.frontendStack ? `frontend=${config.stacks.frontendStack}` : undefined,
479
+ config.stacks.libraryStack ? `library=${config.stacks.libraryStack}` : undefined,
480
+ ]
481
+ .filter((entry) => typeof entry === 'string')
482
+ .join(', ');
483
+ return `# Architecture Overview
484
+
485
+ ## Summary
486
+ - **Project**: ${config.projectName}
487
+ - **Repository topology**: ${config.repoTopology}
488
+ - **Project kinds**: ${config.projectKinds.join(', ')}
489
+ - **Stacks**: ${stackSummary.length > 0 ? stackSummary : 'not specified'}
490
+ - **Architecture style**: ${config.architectureStyle}
491
+ - **API style**: ${config.apiStyle}
492
+ - **Auth style**: ${config.authStyle}
493
+ - **Database**: ${config.database}
494
+ - **Tenant model**: ${config.tenantModel} - ${labelTenantModel(config.tenantModel)}
495
+
496
+ ## Implementation notes
497
+ - This repository was initialized by **ArchPilot** in offline mode.
498
+ - Edit \`.archpilot/architecture.json\` to reflect future decisions.
499
+
500
+ ## Next steps
501
+ - Add service/module boundaries (packages or folders) consistent with **${config.architectureStyle}**.
502
+ - Expand the API contract in \`contracts/openapi.yaml\`.
503
+ - Add additional ADRs as decisions are made.
504
+ `;
505
+ }
506
+ function adrTenantModelTemplate(config) {
507
+ const decision = labelTenantModel(config.tenantModel);
508
+ const schemaNotes = config.tenantModel === 'same_db_different_schema'
509
+ ? '- Each tenant maps to a dedicated schema.\n- Cross-tenant access is prevented via schema isolation.'
510
+ : config.tenantModel === 'same_db_same_schema'
511
+ ? '- Shared schema with a required `tenant_id` discriminator on tenant-scoped tables.\n- Access control must filter by `tenant_id` at all data access boundaries.'
512
+ : '- Tenant isolation is achieved by separate deployments/environments.\n- Data separation is handled operationally rather than in-schema.';
513
+ return `# ADR-001: Tenant model
514
+
515
+ Status: Accepted
516
+
517
+ ## Context
518
+ ${config.projectName} needs a tenant strategy that matches the product and operational model.
519
+
520
+ Chosen inputs:
521
+ - **Tenant model**: ${config.tenantModel}
522
+ - **Database**: ${config.database}
523
+ - **Architecture style**: ${config.architectureStyle}
524
+
525
+ ## Decision
526
+ We will use: **${decision}**.
527
+
528
+ ## Consequences
529
+ ${schemaNotes}
530
+
531
+ - We will document tenant boundaries in endpoints, data model, and operational runbooks.
532
+ - We will revisit this decision if scaling, compliance, or customer isolation requirements change.
533
+
534
+ ## Alternatives Considered
535
+ Optional.
536
+
537
+ ## Migration Plan
538
+ Optional.
539
+
540
+ ## References
541
+ Optional.
542
+ `;
543
+ }
544
+ function openApiTemplate(config) {
545
+ const paths = config.apiStyle === 'graphql'
546
+ ? ` /graphql:
547
+ post:
548
+ summary: GraphQL endpoint
549
+ requestBody:
550
+ required: true
551
+ content:
552
+ application/json:
553
+ schema:
554
+ type: object
555
+ properties:
556
+ query:
557
+ type: string
558
+ responses:
559
+ '200':
560
+ description: OK
561
+ `
562
+ : ` /health:
563
+ get:
564
+ summary: Health check
565
+ responses:
566
+ '200':
567
+ description: OK
568
+ `;
569
+ const securitySchemes = config.authStyle === 'jwt'
570
+ ? ` bearerAuth:
571
+ type: http
572
+ scheme: bearer
573
+ bearerFormat: JWT
574
+ `
575
+ : ` cookieAuth:
576
+ type: apiKey
577
+ in: cookie
578
+ name: session
579
+ `;
580
+ return `openapi: 3.0.3
581
+ info:
582
+ title: ${config.projectName} API
583
+ version: 0.1.0
584
+ servers:
585
+ - url: http://localhost:3000
586
+ paths:
587
+ ${paths}components:
588
+ securitySchemes:
589
+ ${securitySchemes}`;
590
+ }
591
+ function sqlTemplate(config) {
592
+ const tenantColumnsSameSchema = config.tenantModel === 'same_db_same_schema'
593
+ ? config.database === 'postgresql'
594
+ ? ` tenant_id UUID NOT NULL,\n`
595
+ : ` tenant_id CHAR(36) NOT NULL,\n`
596
+ : '';
597
+ const idColumn = config.database === 'postgresql'
598
+ ? `id UUID PRIMARY KEY`
599
+ : `id CHAR(36) PRIMARY KEY`;
600
+ const createdAtColumn = config.database === 'postgresql'
601
+ ? `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()`
602
+ : `created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP`;
603
+ if (config.database === 'postgresql') {
604
+ return `-- ArchPilot initialization SQL (PostgreSQL)
605
+
606
+ CREATE TABLE IF NOT EXISTS app_user (
607
+ ${idColumn},
608
+ ${tenantColumnsSameSchema} email TEXT NOT NULL UNIQUE,
609
+ ${createdAtColumn}
610
+ );
611
+ `;
612
+ }
613
+ return `-- ArchPilot initialization SQL (MySQL)
614
+
615
+ CREATE TABLE IF NOT EXISTS app_user (
616
+ ${idColumn},
617
+ ${tenantColumnsSameSchema} email VARCHAR(320) NOT NULL UNIQUE,
618
+ ${createdAtColumn}
619
+ );
620
+ `;
621
+ }
622
+ const defaultLayerRulesTemplate = `{
623
+ "layers": ["api", "service", "domain", "infrastructure"],
624
+ "moduleLayers": {}
625
+ }
626
+ `;
627
+ const defaultDependencyRulesTemplate = `{
628
+ "modules": {}
629
+ }
630
+ `;
631
+ async function loadArchitectureContract(workspaceRoot) {
632
+ const configPath = path.join(workspaceRoot, '.archpilot', 'architecture.json');
633
+ const contents = await node_fs_1.promises.readFile(configPath, { encoding: 'utf8' }).catch(() => undefined);
634
+ if (!contents) {
635
+ return undefined;
636
+ }
637
+ let parsed;
638
+ try {
639
+ parsed = JSON.parse(contents);
640
+ }
641
+ catch {
642
+ throw new Error('ArchPilot configuration is invalid JSON. Please fix .archpilot/architecture.json.');
643
+ }
644
+ const baseConfig = {
645
+ version: 1,
646
+ projectName: typeof parsed.projectName === 'string' ? parsed.projectName : '',
647
+ ...(0, stackMetadata_1.normalizeStackMetadata)(parsed),
648
+ architectureStyle: parsed.architectureStyle === 'modular_monolith' ||
649
+ parsed.architectureStyle === 'multi_component_monorepo' ||
650
+ parsed.architectureStyle === 'microservices'
651
+ ? parsed.architectureStyle
652
+ : 'modular_monolith',
653
+ database: parsed.database === 'none' ||
654
+ parsed.database === 'postgresql' ||
655
+ parsed.database === 'mysql'
656
+ ? parsed.database
657
+ : 'postgresql',
658
+ tenantModel: parsed.tenantModel === 'single_tenant' ||
659
+ parsed.tenantModel === 'same_db_same_schema' ||
660
+ parsed.tenantModel === 'same_db_different_schema'
661
+ ? parsed.tenantModel
662
+ : 'single_tenant',
663
+ rbac: typeof parsed.rbac === 'boolean' ? parsed.rbac : false,
664
+ apiStyle: parsed.apiStyle === 'none' ||
665
+ parsed.apiStyle === 'rest' ||
666
+ parsed.apiStyle === 'graphql'
667
+ ? parsed.apiStyle
668
+ : 'rest',
669
+ authStyle: parsed.authStyle === 'jwt' || parsed.authStyle === 'session'
670
+ ? parsed.authStyle
671
+ : 'jwt',
672
+ implementationProfile: (typeof parsed.implementationProfile === 'string' &&
673
+ parsed.implementationProfile) ||
674
+ 'typescript-backend',
675
+ createdAtUtc: typeof parsed.createdAtUtc === 'string' ? parsed.createdAtUtc : nowUtcIso(),
676
+ };
677
+ const contract = buildArchitectureContract(baseConfig, parsed);
678
+ contract.structure.modulesRoot = (0, moduleDiscovery_1.resolveModulesRootFromContract)(parsed, contract.structure.modulesRoot);
679
+ const components = normalizeArchitectureComponents(parsed.components);
680
+ if (components) {
681
+ contract.components = components;
682
+ }
683
+ const resources = normalizeArchitectureResources(parsed.resources);
684
+ if (resources) {
685
+ contract.resources = resources;
686
+ }
687
+ return contract;
688
+ }
689
+ async function saveArchitectureContract(workspaceRoot, contract) {
690
+ const configDir = path.join(workspaceRoot, '.archpilot');
691
+ const configPath = path.join(configDir, 'architecture.json');
692
+ await ensureDir(configDir);
693
+ await node_fs_1.promises.writeFile(configPath, `${JSON.stringify(contract, null, 2)}\n`, {
694
+ encoding: 'utf8',
695
+ });
696
+ }
697
+ async function writeArchitectureConfig(workspaceRoot, inputs) {
698
+ const baseConfig = {
699
+ version: 1,
700
+ ...inputs,
701
+ rbac: false,
702
+ createdAtUtc: nowUtcIso(),
703
+ };
704
+ const configDir = path.join(workspaceRoot, '.archpilot');
705
+ const configPath = path.join(configDir, 'architecture.json');
706
+ await ensureDir(configDir);
707
+ let config = buildArchitectureContract(baseConfig);
708
+ const existingContract = await loadArchitectureContract(workspaceRoot);
709
+ if (existingContract) {
710
+ config = buildArchitectureContract(baseConfig, existingContract);
711
+ }
712
+ const normalizedModulesRoot = typeof inputs.modulesRoot === 'string' ? inputs.modulesRoot.trim() : '';
713
+ if (normalizedModulesRoot.length > 0) {
714
+ config.structure.modulesRoot = normalizedModulesRoot;
715
+ }
716
+ const normalizedModules = Array.isArray(inputs.modules)
717
+ ? inputs.modules
718
+ .map((entry) => (typeof entry === 'string' ? entry.trim() : ''))
719
+ .filter((entry) => entry.length > 0)
720
+ .filter((entry, index, array) => array.indexOf(entry) === index)
721
+ : [];
722
+ if (Array.isArray(inputs.modules)) {
723
+ const moduleRegistry = {};
724
+ for (const moduleName of normalizedModules) {
725
+ moduleRegistry[moduleName] = {
726
+ path: `${(0, moduleDiscovery_1.resolveModulesRootFromContract)(config)}/${moduleName}`,
727
+ contract: buildDefaultModuleContractPath(moduleName, config),
728
+ publicEntrypoints: buildDefaultModulePublicEntrypoints(moduleName, config),
729
+ };
730
+ }
731
+ config.modules = moduleRegistry;
732
+ }
733
+ else if (Object.keys(config.modules).length === 0) {
734
+ delete config.modules;
735
+ }
736
+ const components = normalizeArchitectureComponents(inputs.components);
737
+ if (components) {
738
+ config.components = components;
739
+ }
740
+ const resources = normalizeArchitectureResources(inputs.resources);
741
+ if (resources) {
742
+ config.resources = resources;
743
+ }
744
+ await saveArchitectureContract(workspaceRoot, config);
745
+ return config;
746
+ }
747
+ async function generateDocs(workspaceRoot, config) {
748
+ await writeFileIfMissing(path.join(workspaceRoot, 'docs', 'architecture', 'overview.md'), overviewTemplate(config));
749
+ await writeFileIfMissing(path.join(workspaceRoot, 'docs', 'adrs', adrTemplate_1.ADR_TEMPLATE_FILE_NAME), adrTemplate_1.canonicalAdrTemplate);
750
+ await writeFileIfMissing(path.join(workspaceRoot, 'docs', 'adrs', 'adr-001-tenant-model.md'), adrTenantModelTemplate(config));
751
+ }
752
+ async function generateContracts(workspaceRoot, config) {
753
+ if (!hasConfiguredApi(config)) {
754
+ return;
755
+ }
756
+ await writeFileIfMissing(path.join(workspaceRoot, 'contracts', 'openapi.yaml'), openApiTemplate(config));
757
+ }
758
+ async function generateDatabaseFiles(workspaceRoot, config) {
759
+ if (!hasConfiguredDatabase(config)) {
760
+ return;
761
+ }
762
+ await writeFileIfMissing(path.join(workspaceRoot, 'db', 'sql', '001_init.sql'), sqlTemplate(config));
763
+ }
764
+ async function generateArchpilotConfigFiles(workspaceRoot) {
765
+ await writeFileIfMissing(path.join(workspaceRoot, '.archpilot', 'layer-rules.json'), defaultLayerRulesTemplate);
766
+ await writeFileIfMissing(path.join(workspaceRoot, '.archpilot', 'dependency-rules.json'), defaultDependencyRulesTemplate);
767
+ await writeFileIfMissing(path.join(workspaceRoot, '.archpilot', 'suppressions.json'), '{\n "suppressions": []\n}\n');
768
+ }
769
+ async function generateArchpilotSuppressionFile(workspaceRoot) {
770
+ await writeFileIfMissing(path.join(workspaceRoot, '.archpilot', 'suppressions.json'), '{\n "suppressions": []\n}\n');
771
+ }
772
+ function hasArchitectureComponents(contract) {
773
+ const components = contract.components;
774
+ if (!components) {
775
+ return false;
776
+ }
777
+ return Array.isArray(components)
778
+ ? components.length > 0
779
+ : Object.keys(components).length > 0;
780
+ }
781
+ function hasContractBearingInitializationUnits(contract) {
782
+ return Object.keys(contract.modules ?? {}).length > 0 || hasArchitectureComponents(contract);
783
+ }
784
+ async function ensureArchpilotIgnoreFile(workspaceRoot) {
785
+ return writeFileIfMissing(path.join(workspaceRoot, archpilotIgnore_1.archpilotIgnoreFileName), archpilotIgnore_1.defaultArchpilotIgnoreContent);
786
+ }
787
+ async function applyArchitectureInitialization(workspaceRoot, inputs) {
788
+ const config = await writeArchitectureConfig(workspaceRoot, inputs);
789
+ await generateDocs(workspaceRoot, config);
790
+ await generateContracts(workspaceRoot, config);
791
+ await generateDatabaseFiles(workspaceRoot, config);
792
+ if (hasContractBearingInitializationUnits(config)) {
793
+ const { bootstrapArchitectureConfig } = await import('./bootstrapArchitectureConfig.js');
794
+ await bootstrapArchitectureConfig(workspaceRoot, { includeContracts: true });
795
+ await generateArchpilotSuppressionFile(workspaceRoot);
796
+ }
797
+ else {
798
+ await generateArchpilotConfigFiles(workspaceRoot);
799
+ }
800
+ const archpilotIgnoreFileCreated = await ensureArchpilotIgnoreFile(workspaceRoot);
801
+ const policyInitResult = await (0, riskPolicyInitializer_1.ensureRiskPolicyFile)(workspaceRoot);
802
+ await generateInitialArchitectureReports(workspaceRoot);
803
+ await (0, setupNextSteps_1.refreshSetupNextStepsForWorkspace)({ workspaceRoot });
804
+ return {
805
+ config,
806
+ policyFileCreated: policyInitResult.created,
807
+ archpilotIgnoreFileCreated,
808
+ };
809
+ }
810
+ async function generateInitialArchitectureReports(workspaceRoot) {
811
+ const generatedAtUtc = nowUtcIso();
812
+ const metadata = await (0, managedArtifacts_1.buildManagedMetadata)('smart-init', generatedAtUtc);
813
+ const map = await (0, architectureMap_1.generateArchitectureMap)(workspaceRoot, {
814
+ generatedAtUtc,
815
+ metadata,
816
+ });
817
+ const reportsDir = path.join(workspaceRoot, '.archpilot', 'reports');
818
+ await ensureDir(reportsDir);
819
+ await Promise.all([
820
+ writeFileIfMissing(path.join(reportsDir, 'architecture-map.json'), (0, architectureMapReporter_1.renderArchitectureMapJson)(map)),
821
+ writeFileIfMissing(path.join(reportsDir, 'dependency-graph.json'), (0, architectureMapReporter_1.renderDependencyGraphJson)(map)),
822
+ writeFileIfMissing(path.join(reportsDir, 'architecture-map.md'), (0, architectureMapReporter_1.renderArchitectureMapMarkdown)(map)),
823
+ writeFileIfMissing(path.join(reportsDir, 'module-boundaries.md'), (0, architectureMapReporter_1.renderModuleBoundariesMarkdown)(map)),
824
+ ]);
825
+ }
826
+ //# sourceMappingURL=architectureInit.js.map