@rsaglobaltech/specgate 0.8.1

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 (494) hide show
  1. package/CHANGELOG.md +1016 -0
  2. package/README.md +148 -0
  3. package/bin/specgate.js +2 -0
  4. package/bin/specgate.ts +383 -0
  5. package/dist/bin/specgate.js +342 -0
  6. package/dist/bin/specgate.js.map +1 -0
  7. package/dist/packages/core/src/application/AddRequirementUseCase.js +24 -0
  8. package/dist/packages/core/src/application/AddRequirementUseCase.js.map +1 -0
  9. package/dist/packages/core/src/application/ArchiveChangeUseCase.js +185 -0
  10. package/dist/packages/core/src/application/ArchiveChangeUseCase.js.map +1 -0
  11. package/dist/packages/core/src/application/CheckAgainstLockUseCase.js +134 -0
  12. package/dist/packages/core/src/application/CheckAgainstLockUseCase.js.map +1 -0
  13. package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js +25 -0
  14. package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js.map +1 -0
  15. package/dist/packages/core/src/application/GeneratePlanUseCase.js +135 -0
  16. package/dist/packages/core/src/application/GeneratePlanUseCase.js.map +1 -0
  17. package/dist/packages/core/src/application/LinkRequirementUseCase.js +25 -0
  18. package/dist/packages/core/src/application/LinkRequirementUseCase.js.map +1 -0
  19. package/dist/packages/core/src/application/RemovePackUseCase.js +28 -0
  20. package/dist/packages/core/src/application/RemovePackUseCase.js.map +1 -0
  21. package/dist/packages/core/src/application/UpdateRequirementStatusUseCase.js +37 -0
  22. package/dist/packages/core/src/application/UpdateRequirementStatusUseCase.js.map +1 -0
  23. package/dist/packages/core/src/application/ValidateChangeUseCase.js +86 -0
  24. package/dist/packages/core/src/application/ValidateChangeUseCase.js.map +1 -0
  25. package/dist/packages/core/src/application/ValidateProjectUseCase.js +101 -0
  26. package/dist/packages/core/src/application/ValidateProjectUseCase.js.map +1 -0
  27. package/dist/packages/core/src/application/ports/IDomainPackRepository.js +3 -0
  28. package/dist/packages/core/src/application/ports/IDomainPackRepository.js.map +1 -0
  29. package/dist/packages/core/src/application/ports/IHarnessConfigRepository.js +3 -0
  30. package/dist/packages/core/src/application/ports/IHarnessConfigRepository.js.map +1 -0
  31. package/dist/packages/core/src/application/ports/ILockfileRepository.js +3 -0
  32. package/dist/packages/core/src/application/ports/ILockfileRepository.js.map +1 -0
  33. package/dist/packages/core/src/application/ports/IManifestRepository.js +3 -0
  34. package/dist/packages/core/src/application/ports/IManifestRepository.js.map +1 -0
  35. package/dist/packages/core/src/application/ports/IProjectRepository.js +3 -0
  36. package/dist/packages/core/src/application/ports/IProjectRepository.js.map +1 -0
  37. package/dist/packages/core/src/application/ports/IRequirementGraphRepository.js +3 -0
  38. package/dist/packages/core/src/application/ports/IRequirementGraphRepository.js.map +1 -0
  39. package/dist/packages/core/src/application/ports/ITraceabilityRepository.js +3 -0
  40. package/dist/packages/core/src/application/ports/ITraceabilityRepository.js.map +1 -0
  41. package/dist/packages/core/src/domain/AgentPrompt.js +79 -0
  42. package/dist/packages/core/src/domain/AgentPrompt.js.map +1 -0
  43. package/dist/packages/core/src/domain/ArchivePlan.js +26 -0
  44. package/dist/packages/core/src/domain/ArchivePlan.js.map +1 -0
  45. package/dist/packages/core/src/domain/AuthoringScope.js +48 -0
  46. package/dist/packages/core/src/domain/AuthoringScope.js.map +1 -0
  47. package/dist/packages/core/src/domain/ChangeTemplates.js +133 -0
  48. package/dist/packages/core/src/domain/ChangeTemplates.js.map +1 -0
  49. package/dist/packages/core/src/domain/CucumberMessages.js +256 -0
  50. package/dist/packages/core/src/domain/CucumberMessages.js.map +1 -0
  51. package/dist/packages/core/src/domain/DeclaredArtifacts.js +117 -0
  52. package/dist/packages/core/src/domain/DeclaredArtifacts.js.map +1 -0
  53. package/dist/packages/core/src/domain/DeltaSpec.js +219 -0
  54. package/dist/packages/core/src/domain/DeltaSpec.js.map +1 -0
  55. package/dist/packages/core/src/domain/Diagnostic.js +75 -0
  56. package/dist/packages/core/src/domain/Diagnostic.js.map +1 -0
  57. package/dist/packages/core/src/domain/DomainPack.js +62 -0
  58. package/dist/packages/core/src/domain/DomainPack.js.map +1 -0
  59. package/dist/packages/core/src/domain/EmptyAttempt.js +60 -0
  60. package/dist/packages/core/src/domain/EmptyAttempt.js.map +1 -0
  61. package/dist/packages/core/src/domain/FileChangeSet.js +37 -0
  62. package/dist/packages/core/src/domain/FileChangeSet.js.map +1 -0
  63. package/dist/packages/core/src/domain/Gherkin.js +272 -0
  64. package/dist/packages/core/src/domain/Gherkin.js.map +1 -0
  65. package/dist/packages/core/src/domain/GherkinDialects.js +97 -0
  66. package/dist/packages/core/src/domain/GherkinDialects.js.map +1 -0
  67. package/dist/packages/core/src/domain/GherkinQuality.js +160 -0
  68. package/dist/packages/core/src/domain/GherkinQuality.js.map +1 -0
  69. package/dist/packages/core/src/domain/GherkinTags.js +119 -0
  70. package/dist/packages/core/src/domain/GherkinTags.js.map +1 -0
  71. package/dist/packages/core/src/domain/GitSafety.js +77 -0
  72. package/dist/packages/core/src/domain/GitSafety.js.map +1 -0
  73. package/dist/packages/core/src/domain/HarnessConfig.js +58 -0
  74. package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -0
  75. package/dist/packages/core/src/domain/HarnessReport.js +162 -0
  76. package/dist/packages/core/src/domain/HarnessReport.js.map +1 -0
  77. package/dist/packages/core/src/domain/HarnessRun.js +154 -0
  78. package/dist/packages/core/src/domain/HarnessRun.js.map +1 -0
  79. package/dist/packages/core/src/domain/InboundChange.js +127 -0
  80. package/dist/packages/core/src/domain/InboundChange.js.map +1 -0
  81. package/dist/packages/core/src/domain/Language.js +112 -0
  82. package/dist/packages/core/src/domain/Language.js.map +1 -0
  83. package/dist/packages/core/src/domain/Lockfile.js +64 -0
  84. package/dist/packages/core/src/domain/Lockfile.js.map +1 -0
  85. package/dist/packages/core/src/domain/PackContribution.js +106 -0
  86. package/dist/packages/core/src/domain/PackContribution.js.map +1 -0
  87. package/dist/packages/core/src/domain/PackDelta.js +298 -0
  88. package/dist/packages/core/src/domain/PackDelta.js.map +1 -0
  89. package/dist/packages/core/src/domain/PackSpec.js +481 -0
  90. package/dist/packages/core/src/domain/PackSpec.js.map +1 -0
  91. package/dist/packages/core/src/domain/ProfileMatch.js +87 -0
  92. package/dist/packages/core/src/domain/ProfileMatch.js.map +1 -0
  93. package/dist/packages/core/src/domain/Reconciliation.js +72 -0
  94. package/dist/packages/core/src/domain/Reconciliation.js.map +1 -0
  95. package/dist/packages/core/src/domain/RequirementGraph.js +197 -0
  96. package/dist/packages/core/src/domain/RequirementGraph.js.map +1 -0
  97. package/dist/packages/core/src/domain/RequirementPlan.js +85 -0
  98. package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -0
  99. package/dist/packages/core/src/domain/RequirementReadiness.js +115 -0
  100. package/dist/packages/core/src/domain/RequirementReadiness.js.map +1 -0
  101. package/dist/packages/core/src/domain/RequirementSyntax.js +91 -0
  102. package/dist/packages/core/src/domain/RequirementSyntax.js.map +1 -0
  103. package/dist/packages/core/src/domain/ResumeState.js +115 -0
  104. package/dist/packages/core/src/domain/ResumeState.js.map +1 -0
  105. package/dist/packages/core/src/domain/RunBudget.js +103 -0
  106. package/dist/packages/core/src/domain/RunBudget.js.map +1 -0
  107. package/dist/packages/core/src/domain/SpecDiff.js +48 -0
  108. package/dist/packages/core/src/domain/SpecDiff.js.map +1 -0
  109. package/dist/packages/core/src/domain/SpecParser.js +406 -0
  110. package/dist/packages/core/src/domain/SpecParser.js.map +1 -0
  111. package/dist/packages/core/src/domain/SpecopsManifest.js +90 -0
  112. package/dist/packages/core/src/domain/SpecopsManifest.js.map +1 -0
  113. package/dist/packages/core/src/domain/TraceabilityFormat.js +317 -0
  114. package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -0
  115. package/dist/packages/core/src/domain/TraceabilityMatrix.js +200 -0
  116. package/dist/packages/core/src/domain/TraceabilityMatrix.js.map +1 -0
  117. package/dist/packages/core/src/domain/TraceabilityMerge.js +180 -0
  118. package/dist/packages/core/src/domain/TraceabilityMerge.js.map +1 -0
  119. package/dist/packages/core/src/domain/ValidationReport.js +53 -0
  120. package/dist/packages/core/src/domain/ValidationReport.js.map +1 -0
  121. package/dist/packages/core/src/domain/ValueAnnotations.js +138 -0
  122. package/dist/packages/core/src/domain/ValueAnnotations.js.map +1 -0
  123. package/dist/packages/core/src/domain/WriteScope.js +155 -0
  124. package/dist/packages/core/src/domain/WriteScope.js.map +1 -0
  125. package/dist/packages/core/src/domain/YamlLite.js +226 -0
  126. package/dist/packages/core/src/domain/YamlLite.js.map +1 -0
  127. package/dist/packages/core/src/index.js +120 -0
  128. package/dist/packages/core/src/index.js.map +1 -0
  129. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js +276 -0
  130. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js.map +1 -0
  131. package/dist/packages/core/src/infrastructure/ConsoleReporter.js +19 -0
  132. package/dist/packages/core/src/infrastructure/ConsoleReporter.js.map +1 -0
  133. package/dist/packages/core/src/infrastructure/DirectorySnapshot.js +106 -0
  134. package/dist/packages/core/src/infrastructure/DirectorySnapshot.js.map +1 -0
  135. package/dist/packages/core/src/infrastructure/DiskDomainPackRepository.js +57 -0
  136. package/dist/packages/core/src/infrastructure/DiskDomainPackRepository.js.map +1 -0
  137. package/dist/packages/core/src/infrastructure/DiskHarnessConfigRepository.js +58 -0
  138. package/dist/packages/core/src/infrastructure/DiskHarnessConfigRepository.js.map +1 -0
  139. package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js +69 -0
  140. package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js.map +1 -0
  141. package/dist/packages/core/src/infrastructure/DiskLockfileRepository.js +64 -0
  142. package/dist/packages/core/src/infrastructure/DiskLockfileRepository.js.map +1 -0
  143. package/dist/packages/core/src/infrastructure/DiskManifestRepository.js +88 -0
  144. package/dist/packages/core/src/infrastructure/DiskManifestRepository.js.map +1 -0
  145. package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js +138 -0
  146. package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js.map +1 -0
  147. package/dist/packages/core/src/infrastructure/DiskPackRepository.js +130 -0
  148. package/dist/packages/core/src/infrastructure/DiskPackRepository.js.map +1 -0
  149. package/dist/packages/core/src/infrastructure/DiskProjectRepository.js +127 -0
  150. package/dist/packages/core/src/infrastructure/DiskProjectRepository.js.map +1 -0
  151. package/dist/packages/core/src/infrastructure/DiskRequirementGraphRepository.js +124 -0
  152. package/dist/packages/core/src/infrastructure/DiskRequirementGraphRepository.js.map +1 -0
  153. package/dist/packages/core/src/infrastructure/DiskTraceabilityRepository.js +53 -0
  154. package/dist/packages/core/src/infrastructure/DiskTraceabilityRepository.js.map +1 -0
  155. package/dist/packages/core/src/infrastructure/GitContributionStager.js +99 -0
  156. package/dist/packages/core/src/infrastructure/GitContributionStager.js.map +1 -0
  157. package/dist/packages/core/src/infrastructure/GitMergeDriver.js +103 -0
  158. package/dist/packages/core/src/infrastructure/GitMergeDriver.js.map +1 -0
  159. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +348 -0
  160. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -0
  161. package/dist/packages/core/src/infrastructure/PackChangeDeposit.js +106 -0
  162. package/dist/packages/core/src/infrastructure/PackChangeDeposit.js.map +1 -0
  163. package/dist/packages/core/src/infrastructure/RemotePackResolver.js +181 -0
  164. package/dist/packages/core/src/infrastructure/RemotePackResolver.js.map +1 -0
  165. package/dist/packages/core/src/infrastructure/SpecopsConfigFile.js +94 -0
  166. package/dist/packages/core/src/infrastructure/SpecopsConfigFile.js.map +1 -0
  167. package/dist/packages/core/test/unit/authoring-scope.test.js +102 -0
  168. package/dist/packages/core/test/unit/authoring-scope.test.js.map +1 -0
  169. package/dist/packages/core/test/unit/change-templates.test.js +96 -0
  170. package/dist/packages/core/test/unit/change-templates.test.js.map +1 -0
  171. package/dist/packages/core/test/unit/cucumber-messages.test.js +232 -0
  172. package/dist/packages/core/test/unit/cucumber-messages.test.js.map +1 -0
  173. package/dist/packages/core/test/unit/declared-artifacts.test.js +124 -0
  174. package/dist/packages/core/test/unit/declared-artifacts.test.js.map +1 -0
  175. package/dist/packages/core/test/unit/empty-attempt.test.js +79 -0
  176. package/dist/packages/core/test/unit/empty-attempt.test.js.map +1 -0
  177. package/dist/packages/core/test/unit/gherkin-dialects.test.js +115 -0
  178. package/dist/packages/core/test/unit/gherkin-dialects.test.js.map +1 -0
  179. package/dist/packages/core/test/unit/gherkin-keyword-case.test.js +110 -0
  180. package/dist/packages/core/test/unit/gherkin-keyword-case.test.js.map +1 -0
  181. package/dist/packages/core/test/unit/gherkin-quality.test.js +151 -0
  182. package/dist/packages/core/test/unit/gherkin-quality.test.js.map +1 -0
  183. package/dist/packages/core/test/unit/gherkin-tags.test.js +127 -0
  184. package/dist/packages/core/test/unit/gherkin-tags.test.js.map +1 -0
  185. package/dist/packages/core/test/unit/git-safety.test.js +104 -0
  186. package/dist/packages/core/test/unit/git-safety.test.js.map +1 -0
  187. package/dist/packages/core/test/unit/harness-report.test.js +192 -0
  188. package/dist/packages/core/test/unit/harness-report.test.js.map +1 -0
  189. package/dist/packages/core/test/unit/harness-roles.test.js +86 -0
  190. package/dist/packages/core/test/unit/harness-roles.test.js.map +1 -0
  191. package/dist/packages/core/test/unit/inbound-change.test.js +145 -0
  192. package/dist/packages/core/test/unit/inbound-change.test.js.map +1 -0
  193. package/dist/packages/core/test/unit/matrix-dependencies.test.js +100 -0
  194. package/dist/packages/core/test/unit/matrix-dependencies.test.js.map +1 -0
  195. package/dist/packages/core/test/unit/profile-match.test.js +115 -0
  196. package/dist/packages/core/test/unit/profile-match.test.js.map +1 -0
  197. package/dist/packages/core/test/unit/reconciliation.test.js +112 -0
  198. package/dist/packages/core/test/unit/reconciliation.test.js.map +1 -0
  199. package/dist/packages/core/test/unit/requirement-readiness.test.js +161 -0
  200. package/dist/packages/core/test/unit/requirement-readiness.test.js.map +1 -0
  201. package/dist/packages/core/test/unit/resume-state.test.js +124 -0
  202. package/dist/packages/core/test/unit/resume-state.test.js.map +1 -0
  203. package/dist/packages/core/test/unit/run-budget.test.js +113 -0
  204. package/dist/packages/core/test/unit/run-budget.test.js.map +1 -0
  205. package/dist/packages/core/test/unit/traceability-merge.test.js +159 -0
  206. package/dist/packages/core/test/unit/traceability-merge.test.js.map +1 -0
  207. package/dist/packages/core/test/unit/validate-project.test.js +156 -0
  208. package/dist/packages/core/test/unit/validate-project.test.js.map +1 -0
  209. package/dist/packages/core/test/unit/value-annotations.test.js +149 -0
  210. package/dist/packages/core/test/unit/value-annotations.test.js.map +1 -0
  211. package/dist/packages/core/test/unit/write-scope.test.js +165 -0
  212. package/dist/packages/core/test/unit/write-scope.test.js.map +1 -0
  213. package/dist/packages/core/test/unit/yaml-lite.test.js +78 -0
  214. package/dist/packages/core/test/unit/yaml-lite.test.js.map +1 -0
  215. package/dist/scripts/adopt_project.js +11 -0
  216. package/dist/scripts/adopt_project.js.map +1 -0
  217. package/dist/scripts/agents/commands.js +100 -0
  218. package/dist/scripts/agents/commands.js.map +1 -0
  219. package/dist/scripts/agents/init.js +482 -0
  220. package/dist/scripts/agents/init.js.map +1 -0
  221. package/dist/scripts/alm/cli.js +154 -0
  222. package/dist/scripts/alm/cli.js.map +1 -0
  223. package/dist/scripts/alm/clients.js +30 -0
  224. package/dist/scripts/alm/clients.js.map +1 -0
  225. package/dist/scripts/alm/core.js +258 -0
  226. package/dist/scripts/alm/core.js.map +1 -0
  227. package/dist/scripts/alm/port.js +116 -0
  228. package/dist/scripts/alm/port.js.map +1 -0
  229. package/dist/scripts/alm/providers/azure.js +79 -0
  230. package/dist/scripts/alm/providers/azure.js.map +1 -0
  231. package/dist/scripts/alm/providers/github.js +124 -0
  232. package/dist/scripts/alm/providers/github.js.map +1 -0
  233. package/dist/scripts/alm/providers/http-client.js +47 -0
  234. package/dist/scripts/alm/providers/http-client.js.map +1 -0
  235. package/dist/scripts/alm/providers/index.js +107 -0
  236. package/dist/scripts/alm/providers/index.js.map +1 -0
  237. package/dist/scripts/alm/providers/jira.js +129 -0
  238. package/dist/scripts/alm/providers/jira.js.map +1 -0
  239. package/dist/scripts/bundle_pack.js +10 -0
  240. package/dist/scripts/bundle_pack.js.map +1 -0
  241. package/dist/scripts/change/archive.js +68 -0
  242. package/dist/scripts/change/archive.js.map +1 -0
  243. package/dist/scripts/change/artifacts.js +143 -0
  244. package/dist/scripts/change/artifacts.js.map +1 -0
  245. package/dist/scripts/change/cli.js +39 -0
  246. package/dist/scripts/change/cli.js.map +1 -0
  247. package/dist/scripts/change/delta.js +20 -0
  248. package/dist/scripts/change/delta.js.map +1 -0
  249. package/dist/scripts/change/instructions.js +339 -0
  250. package/dist/scripts/change/instructions.js.map +1 -0
  251. package/dist/scripts/ci_init.js +12 -0
  252. package/dist/scripts/ci_init.js.map +1 -0
  253. package/dist/scripts/cli/commands/alm/PullCommand.js +238 -0
  254. package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -0
  255. package/dist/scripts/cli/commands/change/ChangeCommand.js +867 -0
  256. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -0
  257. package/dist/scripts/cli/commands/config/CiInitCommand.js +144 -0
  258. package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -0
  259. package/dist/scripts/cli/commands/config/CompletionCommand.js +160 -0
  260. package/dist/scripts/cli/commands/config/CompletionCommand.js.map +1 -0
  261. package/dist/scripts/cli/commands/config/ConfigInitCommand.js +108 -0
  262. package/dist/scripts/cli/commands/config/ConfigInitCommand.js.map +1 -0
  263. package/dist/scripts/cli/commands/config/ConfigSetCommand.js +166 -0
  264. package/dist/scripts/cli/commands/config/ConfigSetCommand.js.map +1 -0
  265. package/dist/scripts/cli/commands/config/GenAgentContractCommand.js +212 -0
  266. package/dist/scripts/cli/commands/config/GenAgentContractCommand.js.map +1 -0
  267. package/dist/scripts/cli/commands/harness/RunCommand.js +1922 -0
  268. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -0
  269. package/dist/scripts/cli/commands/mcp/McpInstallCommand.js +114 -0
  270. package/dist/scripts/cli/commands/mcp/McpInstallCommand.js.map +1 -0
  271. package/dist/scripts/cli/commands/mcp/index.js +29 -0
  272. package/dist/scripts/cli/commands/mcp/index.js.map +1 -0
  273. package/dist/scripts/cli/commands/pack/BundlePackCommand.js +59 -0
  274. package/dist/scripts/cli/commands/pack/BundlePackCommand.js.map +1 -0
  275. package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +559 -0
  276. package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -0
  277. package/dist/scripts/cli/commands/pack/InferPackCommand.js +304 -0
  278. package/dist/scripts/cli/commands/pack/InferPackCommand.js.map +1 -0
  279. package/dist/scripts/cli/commands/pack/InitPackCommand.js +368 -0
  280. package/dist/scripts/cli/commands/pack/InitPackCommand.js.map +1 -0
  281. package/dist/scripts/cli/commands/pack/LintPackCommand.js +631 -0
  282. package/dist/scripts/cli/commands/pack/LintPackCommand.js.map +1 -0
  283. package/dist/scripts/cli/commands/pack/pack-args.js +83 -0
  284. package/dist/scripts/cli/commands/pack/pack-args.js.map +1 -0
  285. package/dist/scripts/cli/commands/project/AdoptCommand.js +414 -0
  286. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -0
  287. package/dist/scripts/cli/commands/project/InitFromPackCommand.js +188 -0
  288. package/dist/scripts/cli/commands/project/InitFromPackCommand.js.map +1 -0
  289. package/dist/scripts/cli/commands/project/InitProjectCommand.js +791 -0
  290. package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -0
  291. package/dist/scripts/cli/commands/project/OnboardCommand.js +655 -0
  292. package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -0
  293. package/dist/scripts/cli/commands/project/UpdateCommand.js +206 -0
  294. package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -0
  295. package/dist/scripts/cli/commands/project/WizardCommand.js +166 -0
  296. package/dist/scripts/cli/commands/project/WizardCommand.js.map +1 -0
  297. package/dist/scripts/cli/commands/quality/DoctorCommand.js +553 -0
  298. package/dist/scripts/cli/commands/quality/DoctorCommand.js.map +1 -0
  299. package/dist/scripts/cli/commands/quality/FixCommand.js +201 -0
  300. package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -0
  301. package/dist/scripts/cli/commands/quality/LicenseCheckCommand.js +187 -0
  302. package/dist/scripts/cli/commands/quality/LicenseCheckCommand.js.map +1 -0
  303. package/dist/scripts/cli/commands/quality/ReportCommand.js +557 -0
  304. package/dist/scripts/cli/commands/quality/ReportCommand.js.map +1 -0
  305. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +764 -0
  306. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -0
  307. package/dist/scripts/cli/commands/spec/DoneCommand.js +116 -0
  308. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -0
  309. package/dist/scripts/cli/commands/spec/PlanCommand.js +397 -0
  310. package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -0
  311. package/dist/scripts/cli/commands/spec/ReqCommand.js +303 -0
  312. package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -0
  313. package/dist/scripts/cli/commands/spec/StatusCommand.js +206 -0
  314. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -0
  315. package/dist/scripts/cli/commands/spec/StudioCommand.js +241 -0
  316. package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -0
  317. package/dist/scripts/cli/commands/specops/ContributeCommand.js +313 -0
  318. package/dist/scripts/cli/commands/specops/ContributeCommand.js.map +1 -0
  319. package/dist/scripts/cli/commands/specops/DiffCommand.js +394 -0
  320. package/dist/scripts/cli/commands/specops/DiffCommand.js.map +1 -0
  321. package/dist/scripts/cli/commands/specops/SyncCommand.js +380 -0
  322. package/dist/scripts/cli/commands/specops/SyncCommand.js.map +1 -0
  323. package/dist/scripts/completion.js +24 -0
  324. package/dist/scripts/completion.js.map +1 -0
  325. package/dist/scripts/config_init.js +12 -0
  326. package/dist/scripts/config_init.js.map +1 -0
  327. package/dist/scripts/config_set.js +20 -0
  328. package/dist/scripts/config_set.js.map +1 -0
  329. package/dist/scripts/docs/blocks.js +137 -0
  330. package/dist/scripts/docs/blocks.js.map +1 -0
  331. package/dist/scripts/docs/build-site.js +425 -0
  332. package/dist/scripts/docs/build-site.js.map +1 -0
  333. package/dist/scripts/docs/nav.js +198 -0
  334. package/dist/scripts/docs/nav.js.map +1 -0
  335. package/dist/scripts/docs/record-terminal.js +477 -0
  336. package/dist/scripts/docs/record-terminal.js.map +1 -0
  337. package/dist/scripts/docs/terminal-storyboard.js +121 -0
  338. package/dist/scripts/docs/terminal-storyboard.js.map +1 -0
  339. package/dist/scripts/doctor.js +14 -0
  340. package/dist/scripts/doctor.js.map +1 -0
  341. package/dist/scripts/done.js +17 -0
  342. package/dist/scripts/done.js.map +1 -0
  343. package/dist/scripts/expand_domain_pack.js +18 -0
  344. package/dist/scripts/expand_domain_pack.js.map +1 -0
  345. package/dist/scripts/fix.js +12 -0
  346. package/dist/scripts/fix.js.map +1 -0
  347. package/dist/scripts/gen_agent_contract.js +14 -0
  348. package/dist/scripts/gen_agent_contract.js.map +1 -0
  349. package/dist/scripts/gen_mcp_tools.js +264 -0
  350. package/dist/scripts/gen_mcp_tools.js.map +1 -0
  351. package/dist/scripts/harness/init.js +358 -0
  352. package/dist/scripts/harness/init.js.map +1 -0
  353. package/dist/scripts/harness/prompt.js +18 -0
  354. package/dist/scripts/harness/prompt.js.map +1 -0
  355. package/dist/scripts/harness/report.js +323 -0
  356. package/dist/scripts/harness/report.js.map +1 -0
  357. package/dist/scripts/harness/run.js +33 -0
  358. package/dist/scripts/harness/run.js.map +1 -0
  359. package/dist/scripts/infer_pack.js +17 -0
  360. package/dist/scripts/infer_pack.js.map +1 -0
  361. package/dist/scripts/init_from_pack.js +16 -0
  362. package/dist/scripts/init_from_pack.js.map +1 -0
  363. package/dist/scripts/init_pack.js +16 -0
  364. package/dist/scripts/init_pack.js.map +1 -0
  365. package/dist/scripts/init_project.js +17 -0
  366. package/dist/scripts/init_project.js.map +1 -0
  367. package/dist/scripts/lib/agent.js +99 -0
  368. package/dist/scripts/lib/agent.js.map +1 -0
  369. package/dist/scripts/lib/capability-specs.js +80 -0
  370. package/dist/scripts/lib/capability-specs.js.map +1 -0
  371. package/dist/scripts/lib/command.js +17 -0
  372. package/dist/scripts/lib/command.js.map +1 -0
  373. package/dist/scripts/lib/diagnostics.js +62 -0
  374. package/dist/scripts/lib/diagnostics.js.map +1 -0
  375. package/dist/scripts/lib/monorepo-fanout.js +118 -0
  376. package/dist/scripts/lib/monorepo-fanout.js.map +1 -0
  377. package/dist/scripts/lib/placeholders.js +190 -0
  378. package/dist/scripts/lib/placeholders.js.map +1 -0
  379. package/dist/scripts/lib/project-root.js +124 -0
  380. package/dist/scripts/lib/project-root.js.map +1 -0
  381. package/dist/scripts/lib/requirement-graph.js +31 -0
  382. package/dist/scripts/lib/requirement-graph.js.map +1 -0
  383. package/dist/scripts/lib/surface.js +609 -0
  384. package/dist/scripts/lib/surface.js.map +1 -0
  385. package/dist/scripts/license_check.js +15 -0
  386. package/dist/scripts/license_check.js.map +1 -0
  387. package/dist/scripts/lint_pack.js +18 -0
  388. package/dist/scripts/lint_pack.js.map +1 -0
  389. package/dist/scripts/merge-traceability.js +106 -0
  390. package/dist/scripts/merge-traceability.js.map +1 -0
  391. package/dist/scripts/onboard.js +22 -0
  392. package/dist/scripts/onboard.js.map +1 -0
  393. package/dist/scripts/plan.js +17 -0
  394. package/dist/scripts/plan.js.map +1 -0
  395. package/dist/scripts/plugin/gate-hook.js +171 -0
  396. package/dist/scripts/plugin/gate-hook.js.map +1 -0
  397. package/dist/scripts/report.js +17 -0
  398. package/dist/scripts/report.js.map +1 -0
  399. package/dist/scripts/req.js +22 -0
  400. package/dist/scripts/req.js.map +1 -0
  401. package/dist/scripts/schema/cli.js +215 -0
  402. package/dist/scripts/schema/cli.js.map +1 -0
  403. package/dist/scripts/schema/registry.js +264 -0
  404. package/dist/scripts/schema/registry.js.map +1 -0
  405. package/dist/scripts/specops/add.js +180 -0
  406. package/dist/scripts/specops/add.js.map +1 -0
  407. package/dist/scripts/specops/against_lock.js +100 -0
  408. package/dist/scripts/specops/against_lock.js.map +1 -0
  409. package/dist/scripts/specops/as_change.js +49 -0
  410. package/dist/scripts/specops/as_change.js.map +1 -0
  411. package/dist/scripts/specops/contribute.js +24 -0
  412. package/dist/scripts/specops/contribute.js.map +1 -0
  413. package/dist/scripts/specops/diff.js +32 -0
  414. package/dist/scripts/specops/diff.js.map +1 -0
  415. package/dist/scripts/specops/lock.js +39 -0
  416. package/dist/scripts/specops/lock.js.map +1 -0
  417. package/dist/scripts/specops/manifest.js +90 -0
  418. package/dist/scripts/specops/manifest.js.map +1 -0
  419. package/dist/scripts/specops/remove.js +102 -0
  420. package/dist/scripts/specops/remove.js.map +1 -0
  421. package/dist/scripts/specops/sync.js +27 -0
  422. package/dist/scripts/specops/sync.js.map +1 -0
  423. package/dist/scripts/specops/verify.js +149 -0
  424. package/dist/scripts/specops/verify.js.map +1 -0
  425. package/dist/scripts/status.js +17 -0
  426. package/dist/scripts/status.js.map +1 -0
  427. package/dist/scripts/studio.js +14 -0
  428. package/dist/scripts/studio.js.map +1 -0
  429. package/dist/scripts/update.js +17 -0
  430. package/dist/scripts/update.js.map +1 -0
  431. package/dist/scripts/validate_specs.js +10 -0
  432. package/dist/scripts/validate_specs.js.map +1 -0
  433. package/examples/project.config.example +19 -0
  434. package/examples/project.yaml.example +17 -0
  435. package/package.json +105 -0
  436. package/templates/adopt/AI_RULES.md.tpl +27 -0
  437. package/templates/adopt/adr-readme.md.tpl +5 -0
  438. package/templates/adopt/baseline.feature.tpl +9 -0
  439. package/templates/adopt/spec.md.tpl +25 -0
  440. package/templates/adopt/traceability.md.tpl +11 -0
  441. package/templates/backend/AI_RULES.md.tpl +35 -0
  442. package/templates/backend/features/core/health.feature.tpl +7 -0
  443. package/templates/base/.devcontainer/devcontainer.json.tpl +18 -0
  444. package/templates/base/.dockerignore.tpl +11 -0
  445. package/templates/base/.env.dev.app.tpl +13 -0
  446. package/templates/base/.env.dev.infra.tpl +6 -0
  447. package/templates/base/.env.dev.tpl +16 -0
  448. package/templates/base/.env.example.tpl +17 -0
  449. package/templates/base/.env.feature.app.tpl +11 -0
  450. package/templates/base/.env.feature.infra.tpl +4 -0
  451. package/templates/base/.env.feature.tpl +16 -0
  452. package/templates/base/.env.prod.app.tpl +13 -0
  453. package/templates/base/.env.prod.infra.tpl +6 -0
  454. package/templates/base/.env.prod.tpl +16 -0
  455. package/templates/base/.github/workflows/specs.yml.tpl +26 -0
  456. package/templates/base/.gitignore.tpl +9 -0
  457. package/templates/base/.pre-commit-config.yaml.tpl +10 -0
  458. package/templates/base/AGENTS.md.tpl +32 -0
  459. package/templates/base/README.md.tpl +32 -0
  460. package/templates/base/docker-compose.yml.tpl +13 -0
  461. package/templates/base/docs/specs/adr/README.md.tpl +10 -0
  462. package/templates/base/docs/specs/aggregates.md.tpl +5 -0
  463. package/templates/base/docs/specs/commands.md.tpl +13 -0
  464. package/templates/base/docs/specs/domain-model.md.tpl +30 -0
  465. package/templates/base/docs/specs/events.md.tpl +5 -0
  466. package/templates/base/docs/specs/review-checklist.md.tpl +18 -0
  467. package/templates/base/docs/specs/runtime-environments.md.tpl +26 -0
  468. package/templates/base/docs/specs/status-model.md.tpl +16 -0
  469. package/templates/base/docs/specs/traceability.md.tpl +7 -0
  470. package/templates/base/docs/specs/use-cases.md.tpl +5 -0
  471. package/templates/base/spec.md.tpl +63 -0
  472. package/templates/ci/azure.yml.tpl +40 -0
  473. package/templates/ci/github.yml.tpl +40 -0
  474. package/templates/ci/gitlab.yml.tpl +21 -0
  475. package/templates/ci/jenkins.tpl +35 -0
  476. package/templates/contracts/AI_RULES.md.tpl +55 -0
  477. package/templates/contracts/asyncapi-stub.yaml.tpl +24 -0
  478. package/templates/contracts/contract-traceability.md.tpl +10 -0
  479. package/templates/contracts/openapi-stub.yaml.tpl +29 -0
  480. package/templates/contracts/pacts-gitkeep.tpl +0 -0
  481. package/templates/contracts/test-strategy.md.tpl +94 -0
  482. package/templates/frontend/AI_RULES.md.tpl +34 -0
  483. package/templates/frontend/features/core/health.feature.tpl +6 -0
  484. package/templates/harness/harness.config.yaml.tpl +74 -0
  485. package/templates/harness/prompt-prefix.md.tpl +60 -0
  486. package/templates/mobile/AI_RULES.md.tpl +56 -0
  487. package/templates/mobile/features/core/health.feature.tpl +7 -0
  488. package/templates/modules/auth/backend/registration_and_login.feature.tpl +10 -0
  489. package/templates/modules/auth/frontend/login.feature.tpl +5 -0
  490. package/templates/modules/billing/backend/billing_settlement.feature.tpl +5 -0
  491. package/templates/modules/billing/frontend/billing_summary.feature.tpl +5 -0
  492. package/templates/modules/dashboard/backend/dashboard_kpi.feature.tpl +5 -0
  493. package/templates/modules/dashboard/frontend/dashboard.feature.tpl +5 -0
  494. package/vendor/mermaid.min.js +3636 -0
@@ -0,0 +1,481 @@
1
+ "use strict";
2
+ /**
3
+ * What a `pack.yaml` is allowed to say, and how to check it.
4
+ *
5
+ * `schemas/pack.schema.json` remains the authority on the file format; this is
6
+ * the CLI's own reading of it, kept here because validating a pack is a
7
+ * judgement about its contents rather than about a disk. The one thing that
8
+ * genuinely needs a filesystem — does this template file exist — arrives as
9
+ * the `templateExists` predicate, so `specgate pack lint` and `specgate expand` share
10
+ * one set of rules without the rules importing `fs`.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.ALLOWED_STATUSES = exports.PACK_PROJECT_TYPES = exports.PACK_SCHEMA_VERSION = void 0;
47
+ exports.isSafeRelativePath = isSafeRelativePath;
48
+ exports.isNewerThan = isNewerThan;
49
+ exports.asArray = asArray;
50
+ exports.formatList = formatList;
51
+ exports.entityLabel = entityLabel;
52
+ exports.hasStructuredDomainModel = hasStructuredDomainModel;
53
+ exports.validatePackModel = validatePackModel;
54
+ exports.renderTemplate = renderTemplate;
55
+ exports.normalizeVars = normalizeVars;
56
+ const path = __importStar(require("node:path"));
57
+ function toPosixPath(inputPath) {
58
+ return inputPath.replace(/\\/g, "/");
59
+ }
60
+ function isSafeRelativePath(candidate) {
61
+ if (!candidate || typeof candidate !== "string")
62
+ return false;
63
+ if (path.isAbsolute(candidate))
64
+ return false;
65
+ const normalized = toPosixPath(path.posix.normalize(candidate));
66
+ if (normalized.startsWith("../") || normalized === "..")
67
+ return false;
68
+ if (normalized.includes("/../"))
69
+ return false;
70
+ return true;
71
+ }
72
+ function fail(message) {
73
+ throw new Error(message);
74
+ }
75
+ /**
76
+ * Highest `pack.yaml` schema this CLI can read. Bump it in the same change
77
+ * that adds a field to `schemas/pack.schema.json`, or packs authored against
78
+ * the new field will be rejected by a CLI that in fact understands them.
79
+ */
80
+ exports.PACK_SCHEMA_VERSION = "1.4.0";
81
+ /** Project types a pack may target. Mirrors the enum in schemas/pack.schema.json. */
82
+ exports.PACK_PROJECT_TYPES = ["backend", "frontend", "mobile", "contracts"];
83
+ /**
84
+ * Numeric SemVer comparison for schema versions — `a > b`.
85
+ *
86
+ * Deliberately not a SemVer library: schema versions here are always three
87
+ * plain integers (the JSON schema enforces `^\d+\.\d+\.\d+$`), so there are no
88
+ * pre-release or build parts to handle, and this project ships no runtime
89
+ * dependencies.
90
+ */
91
+ function isNewerThan(a, b) {
92
+ const pa = String(a).split(".").map(Number);
93
+ const pb = String(b).split(".").map(Number);
94
+ for (let i = 0; i < 3; i++) {
95
+ const x = pa[i] || 0;
96
+ const y = pb[i] || 0;
97
+ if (x !== y)
98
+ return x > y;
99
+ }
100
+ return false;
101
+ }
102
+ exports.ALLOWED_STATUSES = new Set([
103
+ "Draft",
104
+ "Needs Clarification",
105
+ "Domain Reviewed",
106
+ "Architecture Reviewed",
107
+ "Ready for Dev",
108
+ "In Dev",
109
+ "In Review",
110
+ "Verified",
111
+ "Released",
112
+ "Deprecated",
113
+ ]);
114
+ const ALLOWED_PRIORITIES = new Set(["Must", "Should", "Could", "Won't"]);
115
+ function asArray(value) {
116
+ if (Array.isArray(value))
117
+ return value;
118
+ if (value === undefined || value === null || value === "")
119
+ return [];
120
+ return [value];
121
+ }
122
+ function formatList(value, fallback = "-") {
123
+ const items = asArray(value)
124
+ .map((item) => String(item).trim())
125
+ .filter(Boolean);
126
+ return items.length > 0 ? items.join(", ") : fallback;
127
+ }
128
+ function entityLabel(entity, fallback = "-") {
129
+ if (!entity)
130
+ return fallback;
131
+ if (typeof entity === "string")
132
+ return entity;
133
+ if (entity.id && entity.name)
134
+ return `${entity.id} ${entity.name}`;
135
+ if (entity.id)
136
+ return entity.id;
137
+ if (entity.name)
138
+ return entity.name;
139
+ return fallback;
140
+ }
141
+ function hasStructuredDomainModel(pack) {
142
+ return [
143
+ "requirements",
144
+ "bounded_contexts",
145
+ "use_cases",
146
+ "commands",
147
+ "queries",
148
+ "aggregates",
149
+ "events",
150
+ "value_objects",
151
+ ].some((key) => Array.isArray(pack[key]) && pack[key].length > 0);
152
+ }
153
+ /**
154
+ * Refuse a `depends_on` graph that never terminates.
155
+ *
156
+ * Depth-first, reporting the first cycle with the way round it goes — "REQ-001
157
+ * → REQ-002 → REQ-001" is a fix; "there is a cycle" is a puzzle. `runLevels`
158
+ * already declines to loop forever, but it discovers this at run time, with the
159
+ * pack installed and an agent about to be paid for.
160
+ */
161
+ function assertNoDependencyCycle(dependsOn, fail) {
162
+ const state = new Map();
163
+ const stack = [];
164
+ const walk = (id) => {
165
+ if (state.get(id) === "done")
166
+ return false;
167
+ if (state.get(id) === "visiting") {
168
+ const from = stack.indexOf(id);
169
+ fail(`Requirement dependency cycle: ${[...stack.slice(from), id].join(" → ")}.`);
170
+ return true;
171
+ }
172
+ state.set(id, "visiting");
173
+ stack.push(id);
174
+ for (const dep of dependsOn.get(id) || []) {
175
+ if (walk(dep))
176
+ return true;
177
+ }
178
+ stack.pop();
179
+ state.set(id, "done");
180
+ return false;
181
+ };
182
+ for (const id of dependsOn.keys()) {
183
+ if (walk(id))
184
+ return;
185
+ }
186
+ }
187
+ function validatePackModel(pack, packRoot, templateExists) {
188
+ if (!pack || typeof pack !== "object" || Array.isArray(pack)) {
189
+ fail("Invalid pack format. Root must be an object.");
190
+ }
191
+ const metadata = pack.metadata || {};
192
+ const requiredMetadata = ["name", "version", "language", "project_type"];
193
+ for (const key of requiredMetadata) {
194
+ if (!metadata[key] || typeof metadata[key] !== "string") {
195
+ fail(`metadata.${key} is required and must be a string.`);
196
+ }
197
+ }
198
+ // Kept in step with the enum in schemas/pack.schema.json — the schema is the
199
+ // authority, and the two disagreeing is what made `contracts` packs
200
+ // scaffoldable but impossible to install.
201
+ if (!exports.PACK_PROJECT_TYPES.includes(metadata.project_type)) {
202
+ fail(`metadata.project_type must be one of ${exports.PACK_PROJECT_TYPES.join(", ")}. ` +
203
+ `Found '${metadata.project_type}'.`);
204
+ }
205
+ const requiredVars = pack.variables && Array.isArray(pack.variables.required) ? pack.variables.required : [];
206
+ if (requiredVars.length === 0) {
207
+ fail("variables.required must contain at least one variable.");
208
+ }
209
+ for (const varName of requiredVars) {
210
+ if (!/^[A-Z][A-Z0-9_]*$/.test(varName)) {
211
+ fail(`Invalid variable name in variables.required: '${varName}'.`);
212
+ }
213
+ }
214
+ const outputs = pack.outputs || {};
215
+ if (!Array.isArray(outputs.files) || outputs.files.length === 0) {
216
+ fail("outputs.files must contain at least one file definition.");
217
+ }
218
+ const targets = new Set();
219
+ const refs = {
220
+ requirements: new Map(),
221
+ bounded_contexts: new Map(),
222
+ use_cases: new Map(),
223
+ commands: new Map(),
224
+ queries: new Map(),
225
+ aggregates: new Map(),
226
+ events: new Map(),
227
+ value_objects: new Map(),
228
+ business_rules: new Map(),
229
+ };
230
+ function remember(collectionName, item, label) {
231
+ if (!item || typeof item !== "object") {
232
+ fail(`${collectionName} entries must be objects.`);
233
+ }
234
+ if (!item.id || typeof item.id !== "string") {
235
+ fail(`${collectionName} entry is missing required string field 'id'.`);
236
+ }
237
+ const map = refs[collectionName];
238
+ if (map.has(item.id)) {
239
+ fail(`Duplicate ${label} id detected: '${item.id}'.`);
240
+ }
241
+ map.set(item.id, item);
242
+ if (item.name && typeof item.name === "string") {
243
+ if (map.has(item.name)) {
244
+ fail(`Duplicate ${label} name/reference detected: '${item.name}'.`);
245
+ }
246
+ map.set(item.name, item);
247
+ }
248
+ }
249
+ function hasRef(collectionName, ref) {
250
+ if (!ref)
251
+ return false;
252
+ return refs[collectionName].has(String(ref));
253
+ }
254
+ function assertRef(collectionName, ref, context) {
255
+ if (!ref)
256
+ return;
257
+ if (!hasRef(collectionName, ref)) {
258
+ fail(`${context} references unknown ${collectionName.slice(0, -1)} '${ref}'.`);
259
+ }
260
+ }
261
+ function assertRefs(collectionName, values, context) {
262
+ for (const ref of asArray(values)) {
263
+ assertRef(collectionName, ref, context);
264
+ }
265
+ }
266
+ function assertStatus(status, context) {
267
+ if (status !== undefined && !exports.ALLOWED_STATUSES.has(status)) {
268
+ fail(`${context} has invalid status '${status}'.`);
269
+ }
270
+ }
271
+ function assertTemplateExists(templatePath, context) {
272
+ if (!isSafeRelativePath(templatePath)) {
273
+ fail(`${context} template path '${templatePath}' is invalid.`);
274
+ }
275
+ const absolute = path.resolve(packRoot, templatePath);
276
+ if (!absolute.startsWith(packRoot)) {
277
+ fail(`${context} template escapes pack root: ${templatePath}`);
278
+ }
279
+ if (!templateExists(absolute)) {
280
+ fail(`${context} template not found: ${absolute}`);
281
+ }
282
+ }
283
+ function assertTarget(target, context) {
284
+ if (!isSafeRelativePath(target)) {
285
+ fail(`${context} target path '${target}' is invalid.`);
286
+ }
287
+ if (targets.has(target)) {
288
+ fail(`Duplicate target path detected: '${target}'.`);
289
+ }
290
+ targets.add(target);
291
+ }
292
+ for (const fileDef of outputs.files) {
293
+ if (!fileDef || typeof fileDef !== "object") {
294
+ fail("outputs.files entries must be objects.");
295
+ }
296
+ if (!fileDef.target || !fileDef.template) {
297
+ fail("Each outputs.files entry requires target and template.");
298
+ }
299
+ assertTarget(fileDef.target, "outputs.files");
300
+ assertTemplateExists(fileDef.template, `outputs.files target '${fileDef.target}'`);
301
+ }
302
+ if (!pack.rules || !pack.rules.traceability || !pack.rules.traceability.target) {
303
+ fail("rules.traceability.target is required.");
304
+ }
305
+ if (!isSafeRelativePath(pack.rules.traceability.target)) {
306
+ fail("rules.traceability.target must be a safe relative path.");
307
+ }
308
+ if (pack.schema_version !== undefined && typeof pack.schema_version !== "string") {
309
+ fail("schema_version must be a string when provided.");
310
+ }
311
+ // Forward-compatibility gate. Until now `schema_version` was written by
312
+ // `pack init` and read by nothing, so a pack authored against a newer schema
313
+ // failed later with "unknown property X" — accurate but useless. The schema
314
+ // sets additionalProperties:false, so a newer minor is genuinely unreadable
315
+ // here, not merely unfamiliar; say so at the top rather than field by field.
316
+ if (typeof pack.schema_version === "string" &&
317
+ isNewerThan(pack.schema_version, exports.PACK_SCHEMA_VERSION)) {
318
+ fail(`pack.yaml declares schema_version ${pack.schema_version}, but this CLI ` +
319
+ `understands up to ${exports.PACK_SCHEMA_VERSION}.\n` +
320
+ "Fix: upgrade with `npm install -g create-spec-driven-app@latest`, or " +
321
+ "pin the pack to a version that targets the older schema.");
322
+ }
323
+ for (const item of Array.isArray(pack.requirements) ? pack.requirements : []) {
324
+ remember("requirements", item, "requirement");
325
+ if (item.priority !== undefined && !ALLOWED_PRIORITIES.has(item.priority)) {
326
+ fail(`Requirement '${item.id}' has invalid priority '${item.priority}'.`);
327
+ }
328
+ assertStatus(item.status, `Requirement '${item.id}'`);
329
+ }
330
+ for (const item of Array.isArray(pack.bounded_contexts) ? pack.bounded_contexts : []) {
331
+ remember("bounded_contexts", item, "bounded context");
332
+ }
333
+ // Invariants the domain imposes, independent of any implementation. They
334
+ // live under `business_rules` because `rules` is render configuration —
335
+ // conflating the two is what left every curated pack unable to install.
336
+ for (const item of Array.isArray(pack.business_rules) ? pack.business_rules : []) {
337
+ remember("business_rules", item, "business rule");
338
+ if (!item.title || typeof item.title !== "string") {
339
+ fail(`Business rule '${item.id}' requires a title.`);
340
+ }
341
+ }
342
+ for (const item of Array.isArray(pack.commands) ? pack.commands : []) {
343
+ remember("commands", item, "command");
344
+ }
345
+ for (const item of Array.isArray(pack.queries) ? pack.queries : []) {
346
+ remember("queries", item, "query");
347
+ }
348
+ // `depends_on` (B1): which requirements must land before this one, so the
349
+ // harness can stack a dependent's branch on its predecessor's instead of on
350
+ // the run's base. Checked here rather than at run time — a dependency naming
351
+ // nothing is a defect in the pack, and `runLevels` finding out mid-run means
352
+ // the pack is already installed and an agent already paid for.
353
+ const requirementIds = new Set((Array.isArray(pack.requirements) ? pack.requirements : [])
354
+ .map((r) => r && r.id)
355
+ .filter(Boolean));
356
+ const dependsOn = new Map();
357
+ for (const item of Array.isArray(pack.requirements) ? pack.requirements : []) {
358
+ const declared = asArray(item.depends_on).map((d) => String(d));
359
+ if (declared.length === 0)
360
+ continue;
361
+ for (const dep of declared) {
362
+ if (dep === item.id) {
363
+ fail(`Requirement '${item.id}' depends on itself.`);
364
+ }
365
+ else if (!requirementIds.has(dep)) {
366
+ fail(`Requirement '${item.id}' depends on unknown requirement '${dep}'.`);
367
+ }
368
+ }
369
+ dependsOn.set(item.id, declared);
370
+ }
371
+ assertNoDependencyCycle(dependsOn, fail);
372
+ for (const item of Array.isArray(pack.aggregates) ? pack.aggregates : []) {
373
+ remember("aggregates", item, "aggregate");
374
+ }
375
+ for (const item of Array.isArray(pack.events) ? pack.events : []) {
376
+ remember("events", item, "event");
377
+ }
378
+ for (const item of Array.isArray(pack.value_objects) ? pack.value_objects : []) {
379
+ remember("value_objects", item, "value object");
380
+ }
381
+ for (const context of Array.isArray(pack.bounded_contexts) ? pack.bounded_contexts : []) {
382
+ assertRefs("aggregates", context.aggregates, `Bounded context '${context.id}'`);
383
+ }
384
+ for (const aggregate of Array.isArray(pack.aggregates) ? pack.aggregates : []) {
385
+ // `bounded_context` first: it is what every shipped pack writes, while the
386
+ // published schema said `context`. Reading only `context` made this check
387
+ // inert on all eleven of them — `assertRef` returns early on an empty
388
+ // reference, so an aggregate pointing at a context that does not exist
389
+ // passed the installer in silence. `pack lint` has its own check and caught
390
+ // it, which is why the dead one went unnoticed: two validators disagreeing,
391
+ // and the quiet one trusted.
392
+ //
393
+ // Both spellings are honoured. A pack authored against the published schema
394
+ // must not lose the check either.
395
+ assertRef("bounded_contexts", aggregate.bounded_context ?? aggregate.context, `Aggregate '${aggregate.id}'`);
396
+ }
397
+ for (const useCase of Array.isArray(pack.use_cases) ? pack.use_cases : []) {
398
+ remember("use_cases", useCase, "use case");
399
+ assertRef("requirements", useCase.requirement, `Use case '${useCase.id}'`);
400
+ assertRef("commands", useCase.command, `Use case '${useCase.id}'`);
401
+ assertRef("queries", useCase.query, `Use case '${useCase.id}'`);
402
+ assertRef("aggregates", useCase.aggregate, `Use case '${useCase.id}'`);
403
+ assertRefs("events", useCase.emits, `Use case '${useCase.id}'`);
404
+ assertStatus(useCase.status, `Use case '${useCase.id}'`);
405
+ }
406
+ const scenarios = Array.isArray(pack.scenarios) ? pack.scenarios : [];
407
+ const scenarioIds = new Set();
408
+ for (const scenario of scenarios) {
409
+ if (!scenario || typeof scenario !== "object") {
410
+ fail("scenarios entries must be objects.");
411
+ }
412
+ // The installer's minimum: enough to render the feature file and write the
413
+ // traceability row. Domain linkage (use_case, command, aggregate, events)
414
+ // is optional, so a pack for a domain without CQRS is not forced to invent
415
+ // one — but it is validated below when present.
416
+ const requiredScenarioFields = [
417
+ "id",
418
+ "requirement_id",
419
+ "target",
420
+ "template",
421
+ "feature",
422
+ "scenario",
423
+ ];
424
+ for (const field of requiredScenarioFields) {
425
+ if (!scenario[field] || typeof scenario[field] !== "string") {
426
+ fail(`Scenario is missing required field '${field}'.`);
427
+ }
428
+ }
429
+ if (scenarioIds.has(scenario.id)) {
430
+ fail(`Duplicate scenario id detected: '${scenario.id}'.`);
431
+ }
432
+ scenarioIds.add(scenario.id);
433
+ // Optional by design: a pack author describes the domain, not the caller's
434
+ // implementation. Absent, the matrix renders TBD in that column — which is
435
+ // exactly the gap `plan` reads as NEEDS_IMPLEMENTATION. Validated when it
436
+ // is there, so a typo does not become a silent empty cell.
437
+ if (scenario.technical_artifacts !== undefined) {
438
+ if (!Array.isArray(scenario.technical_artifacts) ||
439
+ scenario.technical_artifacts.length === 0) {
440
+ fail(`Scenario '${scenario.id}' has an empty or malformed technical_artifacts.`);
441
+ }
442
+ }
443
+ if (scenario.technical_artifact !== undefined &&
444
+ typeof scenario.technical_artifact !== "string") {
445
+ fail(`Scenario '${scenario.id}' has a malformed technical_artifact.`);
446
+ }
447
+ if (scenario.seed !== undefined && typeof scenario.seed !== "boolean") {
448
+ fail(`Scenario '${scenario.id}' has invalid 'seed' value. Expected boolean.`);
449
+ }
450
+ assertStatus(scenario.status, `Scenario '${scenario.id}'`);
451
+ assertRef("requirements", scenario.requirement_id, `Scenario '${scenario.id}'`);
452
+ assertRef("use_cases", scenario.use_case, `Scenario '${scenario.id}'`);
453
+ assertRef("commands", scenario.command, `Scenario '${scenario.id}'`);
454
+ assertRef("queries", scenario.query, `Scenario '${scenario.id}'`);
455
+ assertRef("aggregates", scenario.aggregate, `Scenario '${scenario.id}'`);
456
+ assertRefs("events", scenario.events, `Scenario '${scenario.id}'`);
457
+ assertTarget(scenario.target, `scenario '${scenario.id}'`);
458
+ assertTemplateExists(scenario.template, `scenario '${scenario.id}'`);
459
+ }
460
+ return {
461
+ requiredVars,
462
+ };
463
+ }
464
+ function renderTemplate(content, vars) {
465
+ return content.replace(/{{([A-Z][A-Z0-9_]*)}}/g, (_, token) => {
466
+ if (!(token in vars)) {
467
+ fail(`Missing variable '${token}' required by template.`);
468
+ }
469
+ return String(vars[token]);
470
+ });
471
+ }
472
+ function normalizeVars(requiredVars, providedVars) {
473
+ const normalized = { ...providedVars };
474
+ for (const name of requiredVars) {
475
+ if (!(name in normalized) || normalized[name] === "") {
476
+ fail(`Missing required variable '${name}'. Provide it using --var ${name}=...`);
477
+ }
478
+ }
479
+ return normalized;
480
+ }
481
+ //# sourceMappingURL=PackSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackSpec.js","sourceRoot":"","sources":["../../../../../packages/core/src/domain/PackSpec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * Which agent profile a requirement gets (D1).
4
+ *
5
+ * ## Why per requirement and not per run
6
+ *
7
+ * `agent_profile` resolves one profile for the whole run, so an infrastructure
8
+ * requirement and a domain one get the same prompt prefix and the same allowed
9
+ * tools. The tool allowances then have to be the greatest common denominator of
10
+ * everything in the plan — a domain requirement carrying `Bash(terraform:*)`
11
+ * because some other requirement needed it.
12
+ *
13
+ * ## The criterion, and what it cost to find
14
+ *
15
+ * The proposal named the bounded context, "which is already in the model". It
16
+ * is in the *pack* model; it was not reachable from a requirement. Measured
17
+ * across the eleven curated packs: **zero of twenty-seven scenarios** link to
18
+ * an aggregate, directly or through their use case, so matching on it would
19
+ * have matched nothing and fallen through to the default every time — a feature
20
+ * that looks like it works and does nothing.
21
+ *
22
+ * The link does exist, one step further round: use case → command → aggregate →
23
+ * bounded context resolves for **all twenty-seven**. So `expand` derives it and
24
+ * writes it beside the matrix, and this module matches on what is written.
25
+ *
26
+ * ## First match wins
27
+ *
28
+ * Order in the file is the priority, which is what makes a `"*"` catch-all at
29
+ * the end read the way people expect. No match is not an error: the run's
30
+ * default profile applies, exactly as before this existed.
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.MATCHABLE_KEYS = void 0;
34
+ exports.ruleMatches = ruleMatches;
35
+ exports.selectProfile = selectProfile;
36
+ /** What a `match:` key is asking about. Unknown keys never match, and say so. */
37
+ const FACT_BY_KEY = Object.freeze({
38
+ bounded_context: "boundedContext",
39
+ requirement: "requirement",
40
+ feature: "featureFile",
41
+ category: "category",
42
+ });
43
+ exports.MATCHABLE_KEYS = Object.freeze(Object.keys(FACT_BY_KEY));
44
+ /**
45
+ * Glob in the small dialect these rules use: `*` matches any run of characters.
46
+ *
47
+ * Deliberately not path-aware — a bounded context is a name, not a path, and
48
+ * `feature` is matched as a whole string so `features/billing/*` reads the way
49
+ * it looks.
50
+ */
51
+ function matchesPattern(value, pattern) {
52
+ if (pattern === "*")
53
+ return true;
54
+ const source = pattern
55
+ .split("*")
56
+ .map((part) => part.replace(/[.+^${}()|[\]\\?]/g, "\\$&"))
57
+ .join(".*");
58
+ return new RegExp(`^${source}$`, "i").test(value);
59
+ }
60
+ /** Does this rule match, and did it actually test anything? */
61
+ function ruleMatches(rule, facts) {
62
+ const criteria = Object.entries(rule.match || {});
63
+ if (criteria.length === 0)
64
+ return false;
65
+ for (const [key, pattern] of criteria) {
66
+ const factKey = FACT_BY_KEY[key];
67
+ if (!factKey)
68
+ return false;
69
+ const value = facts[factKey];
70
+ if (!value || !matchesPattern(String(value), String(pattern)))
71
+ return false;
72
+ }
73
+ return true;
74
+ }
75
+ /**
76
+ * The first profile whose `match:` accepts this requirement, or `null`.
77
+ *
78
+ * `null` means "use the run's default", not "something went wrong".
79
+ */
80
+ function selectProfile(rules, facts) {
81
+ for (const rule of rules) {
82
+ if (ruleMatches(rule, facts))
83
+ return rule.name;
84
+ }
85
+ return null;
86
+ }
87
+ //# sourceMappingURL=ProfileMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileMatch.js","sourceRoot":"","sources":["../../../../../packages/core/src/domain/ProfileMatch.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AA0CH,kCAWC;AAOD,sCAQC;AArDD,iFAAiF;AACjF,MAAM,WAAW,GAAqD,MAAM,CAAC,MAAM,CAAC;IAClF,eAAe,EAAE,gBAAgB;IACjC,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,UAAU;CACrB,CAAC,CAAC;AAEU,QAAA,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAEtE;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe;IACpD,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,+DAA+D;AAC/D,SAAgB,WAAW,CAAC,IAAiB,EAAE,KAAuB;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAC3B,KAA6B,EAC7B,KAAuB;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}