@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,156 @@
1
+ "use strict";
2
+ /**
3
+ * `ValidateProjectUseCase` is the only place that judges a traceability matrix.
4
+ * `specgate validate` renders what it returns, so these tests are where that
5
+ * judgement is pinned — the command tests exercise the rendering on top.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const node_test_1 = require("node:test");
42
+ const assert = __importStar(require("node:assert/strict"));
43
+ const ValidateProjectUseCase_1 = require("../../src/application/ValidateProjectUseCase");
44
+ const TraceabilityFormat_1 = require("../../src/domain/TraceabilityFormat");
45
+ const SEP_10 = "|---|---|---|---|---|---|---|---|---|---|";
46
+ /** A rich matrix built from `[requirement, scenarioId, testArtifact, status]`. */
47
+ function richMatrix(rows) {
48
+ const body = rows.map(([req, scn, test, status]) => `| ${req} | ${scn} | f.feature | UC-1 | C | A | E | src/x.ts | ${test} | ${status} |`);
49
+ return [TraceabilityFormat_1.RICH_HEADER, SEP_10, ...body].join("\n") + "\n";
50
+ }
51
+ function repoReturning(content) {
52
+ return {
53
+ readTraceability: () => content,
54
+ writeTraceability: () => {
55
+ throw new Error("validation must not write");
56
+ },
57
+ };
58
+ }
59
+ const useCase = (content = null) => new ValidateProjectUseCase_1.ValidateProjectUseCase(repoReturning(content));
60
+ // ── the matrix shape ─────────────────────────────────────────────────────────
61
+ (0, node_test_1.test)("a missing traceability.md is an error naming the project", () => {
62
+ const { report, mode } = useCase(null).execute("/tmp/proj");
63
+ assert.equal(mode, null);
64
+ assert.equal(report.valid, false);
65
+ assert.deepEqual(report.errors.map((e) => e.code), ["traceability_missing"]);
66
+ assert.match(report.errors[0].message, /\/tmp\/proj/);
67
+ });
68
+ (0, node_test_1.test)("neither header present is reported as a missing header, not as bad rows", () => {
69
+ const { report, mode } = useCase().checkMatrix("# Traceability Matrix\n\nnothing here\n");
70
+ assert.equal(mode, null);
71
+ assert.deepEqual(report.errors.map((e) => e.code), ["traceability_header_missing"]);
72
+ assert.ok(report.errors[0].fixLines?.some((l) => l.includes(TraceabilityFormat_1.RICH_HEADER)));
73
+ });
74
+ (0, node_test_1.test)("both matrix shapes are recognised", () => {
75
+ assert.equal(useCase().checkMatrix(richMatrix([])).mode, "rich");
76
+ const legacy = [
77
+ TraceabilityFormat_1.LEGACY_HEADER,
78
+ "|---|---|---|---|",
79
+ "| f.feature | SCN-001 | src/x.ts | Draft |",
80
+ ].join("\n");
81
+ assert.equal(useCase().checkMatrix(legacy).mode, "legacy");
82
+ });
83
+ // ── row-level checks ─────────────────────────────────────────────────────────
84
+ (0, node_test_1.test)("a well-formed matrix produces no findings", () => {
85
+ const { report, requirements } = useCase().checkMatrix(richMatrix([
86
+ ["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"],
87
+ ["REQ-002", "SCN-002", "tests/b.test.ts", "Draft"],
88
+ ]));
89
+ assert.deepEqual(report.findings, []);
90
+ assert.deepEqual([...requirements].sort(), ["REQ-001", "REQ-002"]);
91
+ });
92
+ (0, node_test_1.test)("an unknown status is an error that lists what is allowed", () => {
93
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Shipped"]]));
94
+ const finding = report.errors.find((e) => e.code === "invalid_status");
95
+ assert.ok(finding, "expected invalid_status");
96
+ assert.match(finding.message, /Shipped/);
97
+ assert.ok(finding.fixLines?.[0].includes("Ready for Dev"));
98
+ });
99
+ (0, node_test_1.test)("a repeated Scenario ID is an error, but `-` is not an id", () => {
100
+ const { report } = useCase().checkMatrix(richMatrix([
101
+ ["REQ-001", "SCN-001", "tests/a.test.ts", "Draft"],
102
+ ["REQ-002", "SCN-001", "tests/b.test.ts", "Draft"],
103
+ ]));
104
+ assert.deepEqual(report.errors.map((e) => e.code), ["duplicate_scenario_id"]);
105
+ const placeholders = useCase().checkMatrix(richMatrix([
106
+ ["REQ-001", "-", "tests/a.test.ts", "Draft"],
107
+ ["REQ-002", "-", "tests/b.test.ts", "Draft"],
108
+ ]));
109
+ assert.deepEqual(placeholders.report.findings, []);
110
+ });
111
+ // ── the strict-TDD gate ──────────────────────────────────────────────────────
112
+ (0, node_test_1.test)("strict TDD is off by default", () => {
113
+ const matrix = richMatrix([["REQ-001", "SCN-001", "TBD", "In Dev"]]);
114
+ assert.deepEqual(useCase().checkMatrix(matrix).report.findings, []);
115
+ });
116
+ (0, node_test_1.test)("TDD-1: a TBD test artifact past Draft is a violation", () => {
117
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "TBD", "In Dev"]]), {
118
+ strictTdd: true,
119
+ });
120
+ assert.equal(report.errors.length, 1);
121
+ assert.match(report.errors[0].message, /^\[TDD-1\]/);
122
+ });
123
+ (0, node_test_1.test)("TDD-1 does not fire while the row is still Draft", () => {
124
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "TBD", "Draft"]]), {
125
+ strictTdd: true,
126
+ });
127
+ assert.deepEqual(report.findings, []);
128
+ });
129
+ (0, node_test_1.test)("TDD-2: a row past Draft with no Scenario ID is a violation", () => {
130
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "", "tests/a.test.ts", "Ready for Dev"]]), { strictTdd: true });
131
+ assert.equal(report.errors.length, 1);
132
+ assert.match(report.errors[0].message, /^\[TDD-2\]/);
133
+ });
134
+ (0, node_test_1.test)("TDD-3: a REQ in spec.md with no matrix row is a violation", () => {
135
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"]]), { strictTdd: true, specContent: "REQ-001 is here and so is REQ-002.\n" });
136
+ assert.equal(report.errors.length, 1);
137
+ assert.match(report.errors[0].message, /^\[TDD-3\] Requirement REQ-002/);
138
+ });
139
+ (0, node_test_1.test)("TDD-3 is skipped when spec.md was not supplied", () => {
140
+ const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"]]), { strictTdd: true, specContent: null });
141
+ assert.deepEqual(report.findings, []);
142
+ });
143
+ (0, node_test_1.test)("findings keep the order the checks ran in, so the first error is stable", () => {
144
+ const { report } = useCase().checkMatrix(richMatrix([
145
+ ["REQ-001", "SCN-001", "tests/a.test.ts", "Bogus"],
146
+ ["REQ-002", "SCN-001", "TBD", "In Dev"],
147
+ ]), { strictTdd: true });
148
+ // Per row: duplicate id, then status, then the TDD gate. Note TDD-1 needs a
149
+ // *valid* post-Draft status, so an unknown status suppresses it on that row.
150
+ assert.deepEqual(report.findings.map((f) => f.code), ["invalid_status", "duplicate_scenario_id", "strict_tdd_violation"]);
151
+ });
152
+ (0, node_test_1.test)("validation never writes the matrix back", () => {
153
+ // The repository throws on write; reaching the end means nothing tried.
154
+ assert.doesNotThrow(() => useCase(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Draft"]])).execute("/tmp/proj"));
155
+ });
156
+ //# sourceMappingURL=validate-project.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-project.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/validate-project.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Does the value a spec declares match the value the code declares? (§8.6.)
4
+ *
5
+ * Pure domain logic only — no filesystem, no correlation with a matrix row.
6
+ * That wiring lives in `ReportCommand.ts`; these tests pin the three
7
+ * functions it composes: extract from a trace comment, extract from a
8
+ * source file's text, compare.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ const node_test_1 = require("node:test");
45
+ const assert = __importStar(require("node:assert/strict"));
46
+ const ValueAnnotations_1 = require("../../src/domain/ValueAnnotations");
47
+ (0, node_test_1.test)("value_ keys are extracted and their prefix stripped; other keys are ignored", () => {
48
+ assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ uc: "Login", value_session_timeout: "15m", depends: "REQ-001" }), [{ id: "session_timeout", value: "15m" }]);
49
+ });
50
+ (0, node_test_1.test)("declaredSpecValues tolerates a trace with no value_ keys, or no trace at all", () => {
51
+ assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ uc: "Login" }), []);
52
+ assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)(null), []);
53
+ assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)(undefined), []);
54
+ });
55
+ (0, node_test_1.test)("a bare 'value_' with nothing after the prefix is not a valid id", () => {
56
+ assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ value_: "15m" }), []);
57
+ });
58
+ (0, node_test_1.test)("csda:value is found regardless of comment syntax, because it is not parsed as one", () => {
59
+ const source = [
60
+ "// csda:value session_timeout=15m",
61
+ "const SESSION_TIMEOUT = '15m';",
62
+ "# csda:value max_attempts=5",
63
+ "-- csda:value lockout_minutes=60",
64
+ "not a marker at all",
65
+ ].join("\n");
66
+ assert.deepEqual((0, ValueAnnotations_1.declaredCodeValues)(source), [
67
+ { id: "session_timeout", value: "15m", line: 1 },
68
+ { id: "max_attempts", value: "5", line: 3 },
69
+ { id: "lockout_minutes", value: "60", line: 4 },
70
+ ]);
71
+ });
72
+ (0, node_test_1.test)("declaredCodeValues finds nothing in a file with no marker", () => {
73
+ assert.deepEqual((0, ValueAnnotations_1.declaredCodeValues)("const x = 1;\nfunction f() {}\n"), []);
74
+ });
75
+ (0, node_test_1.test)("matched: same id, same literal value on both sides", () => {
76
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [{ id: "session_timeout", value: "15m", line: 12, file: "src/auth.ts" }]);
77
+ assert.deepEqual(result, [
78
+ {
79
+ id: "session_timeout",
80
+ specValue: "15m",
81
+ codeValue: "15m",
82
+ codeFile: "src/auth.ts",
83
+ codeLine: 12,
84
+ status: "matched",
85
+ },
86
+ ]);
87
+ });
88
+ (0, node_test_1.test)("diverging: same id, different literal — no unit interpretation", () => {
89
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [{ id: "session_timeout", value: "900000", line: 12, file: "src/auth.ts" }]);
90
+ assert.equal(result[0].status, "diverging");
91
+ // 15m and 900000 mean the same duration; this module does not know that,
92
+ // and is not supposed to (PLAN_PREDICTABLE_CODE_EVOLUTION.md §5, the H13 trap).
93
+ assert.equal(result[0].specValue, "15m");
94
+ assert.equal(result[0].codeValue, "900000");
95
+ });
96
+ (0, node_test_1.test)("spec_only: the spec declares a value with no matching code marker", () => {
97
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], []);
98
+ assert.deepEqual(result, [
99
+ {
100
+ id: "session_timeout",
101
+ specValue: "15m",
102
+ codeValue: null,
103
+ codeFile: null,
104
+ codeLine: null,
105
+ status: "spec_only",
106
+ },
107
+ ]);
108
+ });
109
+ (0, node_test_1.test)("code_only: a csda:value marker with no matching spec declaration", () => {
110
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([], [{ id: "retry_backoff", value: "2s", line: 5, file: "src/retry.ts" }]);
111
+ assert.deepEqual(result, [
112
+ {
113
+ id: "retry_backoff",
114
+ specValue: null,
115
+ codeValue: "2s",
116
+ codeFile: "src/retry.ts",
117
+ codeLine: 5,
118
+ status: "code_only",
119
+ },
120
+ ]);
121
+ });
122
+ (0, node_test_1.test)("a repeated code marker for the same id keeps its first occurrence, deterministically", () => {
123
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [
124
+ { id: "session_timeout", value: "15m", line: 3, file: "src/a.ts" },
125
+ { id: "session_timeout", value: "30m", line: 9, file: "src/b.ts" },
126
+ ]);
127
+ assert.equal(result.length, 1);
128
+ assert.equal(result[0].codeFile, "src/a.ts");
129
+ assert.equal(result[0].status, "matched");
130
+ });
131
+ (0, node_test_1.test)("ids are scoped to whatever entries the caller passes — no global comparison", () => {
132
+ // Two unrelated requirements can reuse the same id name without being
133
+ // compared against each other; that scoping is the caller's job (one call
134
+ // per requirement), and this test pins that the function itself does not
135
+ // need to know about requirements at all to behave correctly.
136
+ const reqA = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "limit", value: "5" }], [{ id: "limit", value: "5", line: 1, file: "src/a.ts" }]);
137
+ const reqB = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "limit", value: "10" }], [{ id: "limit", value: "999", line: 1, file: "src/b.ts" }]);
138
+ assert.equal(reqA[0].status, "matched");
139
+ assert.equal(reqB[0].status, "diverging");
140
+ });
141
+ (0, node_test_1.test)("multiple ids in one requirement are each classified independently", () => {
142
+ const result = (0, ValueAnnotations_1.compareDeclaredValues)([
143
+ { id: "session_timeout", value: "15m" },
144
+ { id: "max_attempts", value: "5" },
145
+ ], [{ id: "session_timeout", value: "30m", line: 1, file: "src/a.ts" }]);
146
+ const byId = Object.fromEntries(result.map((r) => [r.id, r.status]));
147
+ assert.deepEqual(byId, { session_timeout: "diverging", max_attempts: "spec_only" });
148
+ });
149
+ //# sourceMappingURL=value-annotations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-annotations.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/value-annotations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * The write-scope guard (A1, closes H16).
4
+ *
5
+ * The prompt asks the agent not to touch the spec; until now nothing checked.
6
+ * An agent that cannot make a scenario pass can relax the scenario instead, and
7
+ * `validate --strict-tdd` approves — it verifies the feature exists and is in
8
+ * the matrix, never that it still says what it said. "Specs as executable
9
+ * contracts" stops being true when the executor may edit the contract.
10
+ *
11
+ * The glob matcher gets the most attention here because it is hand-written (no
12
+ * runtime dependencies) and because a guard that silently matches nothing is
13
+ * worse than no guard: it reports "clean" over an edited spec.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ const node_test_1 = require("node:test");
50
+ const assert = __importStar(require("node:assert/strict"));
51
+ const WriteScope_1 = require("../../src/domain/WriteScope");
52
+ // ── the matcher ──────────────────────────────────────────────────────────────
53
+ (0, node_test_1.test)("`*` stops at a directory separator and `**` crosses it", () => {
54
+ assert.equal((0, WriteScope_1.matchesGlob)("features/health.feature", "features/*.feature"), true);
55
+ assert.equal((0, WriteScope_1.matchesGlob)("features/core/health.feature", "features/*.feature"), false);
56
+ assert.equal((0, WriteScope_1.matchesGlob)("features/core/health.feature", "features/**/*.feature"), true);
57
+ assert.equal((0, WriteScope_1.matchesGlob)("features/a/b/c/health.feature", "features/**/*.feature"), true);
58
+ // `**/` must also match zero directories, or the top level escapes the guard.
59
+ assert.equal((0, WriteScope_1.matchesGlob)("features/health.feature", "features/**/*.feature"), true);
60
+ });
61
+ (0, node_test_1.test)("a subtree pattern covers the directory and everything under it", () => {
62
+ assert.equal((0, WriteScope_1.matchesGlob)("docs/specs", "docs/specs/**"), true);
63
+ assert.equal((0, WriteScope_1.matchesGlob)("docs/specs/adr/0021-x.md", "docs/specs/**"), true);
64
+ assert.equal((0, WriteScope_1.matchesGlob)("docs/specs-other/x.md", "docs/specs/**"), false);
65
+ });
66
+ (0, node_test_1.test)("an exact name matches itself and nothing that merely contains it", () => {
67
+ assert.equal((0, WriteScope_1.matchesGlob)("spec.md", "spec.md"), true);
68
+ assert.equal((0, WriteScope_1.matchesGlob)("docs/spec.md", "spec.md"), false);
69
+ assert.equal((0, WriteScope_1.matchesGlob)("myspec.md", "spec.md"), false);
70
+ });
71
+ (0, node_test_1.test)("dots are literal, not any-character", () => {
72
+ // `.specops.lock` as a regex would otherwise match `xspecopsxlock`.
73
+ assert.equal((0, WriteScope_1.matchesGlob)(".specops.lock", ".specops.lock"), true);
74
+ assert.equal((0, WriteScope_1.matchesGlob)("xspecopsxlock", ".specops.lock"), false);
75
+ });
76
+ (0, node_test_1.test)("windows separators are matched as the posix paths git reports", () => {
77
+ assert.equal((0, WriteScope_1.matchesGlob)("features\\core\\health.feature", "features/**/*.feature"), true);
78
+ });
79
+ // ── the rules ────────────────────────────────────────────────────────────────
80
+ (0, node_test_1.test)("the defaults protect every term of the contract", () => {
81
+ for (const p of [
82
+ "spec.md",
83
+ "AI_RULES.md",
84
+ "features/core/health.feature",
85
+ "docs/specs/adr/0021-x.md",
86
+ ".specops.lock",
87
+ "harness.config.yaml",
88
+ ]) {
89
+ assert.ok((0, WriteScope_1.protectingPattern)(p), `${p} should be protected by default`);
90
+ }
91
+ assert.equal((0, WriteScope_1.protectingPattern)("src/main/java/App.java"), null);
92
+ assert.equal((0, WriteScope_1.protectingPattern)("README.md"), null);
93
+ });
94
+ (0, node_test_1.test)("allow_paths is an escape hatch, and it wins", () => {
95
+ const rules = { allowPaths: ["features/legacy/**"] };
96
+ assert.equal((0, WriteScope_1.protectingPattern)("features/legacy/old.feature", rules), null);
97
+ assert.ok((0, WriteScope_1.protectingPattern)("features/core/health.feature", rules));
98
+ });
99
+ (0, node_test_1.test)("a project can name its own protected paths instead of the defaults", () => {
100
+ const rules = { protectedPaths: ["contracts/**"] };
101
+ assert.ok((0, WriteScope_1.protectingPattern)("contracts/api.yaml", rules));
102
+ // Naming your own list replaces the defaults; that is the point of naming it.
103
+ assert.equal((0, WriteScope_1.protectingPattern)("spec.md", rules), null);
104
+ });
105
+ (0, node_test_1.test)("editing a protected file is a violation, and the report says which rule", () => {
106
+ const found = (0, WriteScope_1.checkWriteScope)({
107
+ modified: ["features/core/health.feature", "src/App.java"],
108
+ added: [],
109
+ });
110
+ assert.equal(found.length, 1);
111
+ assert.equal(found[0].path, "features/core/health.feature");
112
+ assert.equal(found[0].pattern, "features/**/*.feature");
113
+ });
114
+ (0, node_test_1.test)("creating a feature that did not exist is allowed — NEEDS_FEATURE needs it", () => {
115
+ // The distinction A1 asks for, and the one git already draws: new is not an
116
+ // edit. A matrix row aims the gate at one specific file, so a new file cannot
117
+ // loosen the contract being run.
118
+ assert.deepEqual((0, WriteScope_1.checkWriteScope)({ modified: [], added: ["features/core/new-thing.feature", "spec.md"] }), []);
119
+ });
120
+ (0, node_test_1.test)("deleting the declared feature is refused, not treated as a rewrite", () => {
121
+ const found = (0, WriteScope_1.checkWriteScope)({
122
+ modified: ["features/core/health.feature"],
123
+ added: ["features/core/health-v2.feature"],
124
+ });
125
+ assert.equal(found.length, 1, "the deletion must still be caught");
126
+ });
127
+ (0, node_test_1.test)("violations come back sorted, so two runs read the same", () => {
128
+ const found = (0, WriteScope_1.checkWriteScope)({ modified: ["spec.md", "AI_RULES.md"], added: [] });
129
+ assert.deepEqual(found.map((v) => v.path), ["AI_RULES.md", "spec.md"]);
130
+ });
131
+ // ── reading git ──────────────────────────────────────────────────────────────
132
+ (0, node_test_1.test)("porcelain status separates new files from edits by their code", () => {
133
+ const changes = (0, WriteScope_1.parseGitStatus)([
134
+ " M spec.md",
135
+ "?? src/New.java",
136
+ " D features/core/health.feature",
137
+ "A docs/specs/adr/0030-x.md",
138
+ "",
139
+ ].join("\n"));
140
+ assert.deepEqual(changes.added, ["src/New.java"]);
141
+ assert.deepEqual([...changes.modified].sort(), [
142
+ "docs/specs/adr/0030-x.md",
143
+ "features/core/health.feature",
144
+ "spec.md",
145
+ ]);
146
+ });
147
+ (0, node_test_1.test)("a rename counts both sides as edits", () => {
148
+ const changes = (0, WriteScope_1.parseGitStatus)("R spec.md -> spec-old.md\n");
149
+ assert.deepEqual([...changes.modified].sort(), ["spec-old.md", "spec.md"]);
150
+ assert.deepEqual(changes.added, []);
151
+ });
152
+ (0, node_test_1.test)("an empty status is not a violation", () => {
153
+ assert.deepEqual((0, WriteScope_1.parseGitStatus)(""), { modified: [], added: [] });
154
+ assert.deepEqual((0, WriteScope_1.checkWriteScope)((0, WriteScope_1.parseGitStatus)("")), []);
155
+ });
156
+ (0, node_test_1.test)("the guard the defaults describe actually fires end to end", () => {
157
+ // The failure this whole module exists to catch: an agent that could not pass
158
+ // the scenario edited the scenario.
159
+ const status = " M features/core/health.feature\n M src/App.java\n?? src/New.java\n";
160
+ const found = (0, WriteScope_1.checkWriteScope)((0, WriteScope_1.parseGitStatus)(status));
161
+ assert.equal(found.length, 1);
162
+ assert.equal(found[0].path, "features/core/health.feature");
163
+ assert.ok(WriteScope_1.DEFAULT_PROTECTED_PATHS.includes(found[0].pattern));
164
+ });
165
+ //# sourceMappingURL=write-scope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-scope.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/write-scope.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * `parseYamlLite`, and the quoting it did not do (E1).
4
+ *
5
+ * The parser is a deliberate YAML subset: this package has no runtime
6
+ * dependencies, because the CLI runs through `npx` on other people's machines.
7
+ * `schemas/pack.schema.json` is the authority on the format; this only has to
8
+ * read it faithfully.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ const node_test_1 = require("node:test");
45
+ const assert = __importStar(require("node:assert/strict"));
46
+ const YamlLite_1 = require("../../src/domain/YamlLite");
47
+ // ── Commas inside quotes are not separators (E1) ─────────────────────────────
48
+ //
49
+ // ADR-0020 taught this parser to read inline flow sequences, because the packs
50
+ // use them 54 times and they had been parsing as the literal string
51
+ // `"[Invoice]"`. What it did not teach it was quoting: the split ran on every
52
+ // comma, so one quoted phrase became several items, each carrying a stray quote
53
+ // character.
54
+ //
55
+ // `splitKeyValue` in this same file already tracks quotes properly. The flow
56
+ // branch simply did not use it — which is how a shipped pack ended up declaring
57
+ // four responsibilities where it wrote one.
58
+ (0, node_test_1.test)("a quoted item survives the commas inside it", () => {
59
+ // Measured on `packs/billing/backend`, which writes exactly this:
60
+ // responsibilities: ["Invoice line items, totals, status, aging"]
61
+ // and got back four items, the first `"Invoice line items` and the last
62
+ // `aging"`.
63
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: ["Invoice line items, totals, status, aging"]').a, [
64
+ "Invoice line items, totals, status, aging",
65
+ ]);
66
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: ['x, y']").a, ["x, y"]);
67
+ });
68
+ (0, node_test_1.test)("quoted and bare items mix in one sequence", () => {
69
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: ["one, two", three]').a, ["one, two", "three"]);
70
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: [three, "one, two"]').a, ["three", "one, two"]);
71
+ });
72
+ (0, node_test_1.test)("the ordinary case keeps working", () => {
73
+ // The reason the flow branch exists at all.
74
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: [Invoice, Payment]").a, ["Invoice", "Payment"]);
75
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: []").a, []);
76
+ assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: [one]").a, ["one"]);
77
+ });
78
+ //# sourceMappingURL=yaml-lite.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-lite.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/yaml-lite.test.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAiC;AACjC,2DAA6C;AAE7C,wDAA0D;AAE1D,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,oEAAoE;AACpE,8EAA8E;AAC9E,gFAAgF;AAChF,aAAa;AACb,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,4CAA4C;AAE5C,IAAA,gBAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,kEAAkE;IAClE,oEAAoE;IACpE,wEAAwE;IACxE,YAAY;IACZ,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;QACpF,2CAA2C;KAC5C,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,4CAA4C;IAC5C,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.detectStack = exports.AdoptProjectCommand = void 0;
5
+ const AdoptCommand_1 = require("./cli/commands/project/AdoptCommand");
6
+ Object.defineProperty(exports, "AdoptProjectCommand", { enumerable: true, get: function () { return AdoptCommand_1.AdoptProjectCommand; } });
7
+ Object.defineProperty(exports, "detectStack", { enumerable: true, get: function () { return AdoptCommand_1.detectStack; } });
8
+ if (require.main === module) {
9
+ new AdoptCommand_1.AdoptProjectCommand(process.argv.slice(2)).execute();
10
+ }
11
+ //# sourceMappingURL=adopt_project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt_project.js","sourceRoot":"","sources":["../../scripts/adopt_project.ts"],"names":[],"mappings":";;;;AACA,sEAAuF;AAE9E,oGAFA,kCAAmB,OAEA;AAAE,4FAFA,0BAAW,OAEA;AAEzC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,kCAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3D,CAAC"}