@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,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.azureProvider = void 0;
4
+ const http_client_1 = require("./http-client");
5
+ /** States the shipped Azure templates use for a finished work item. */
6
+ const DONE_STATES = ["Done", "Closed", "Completed", "Resolved"];
7
+ const API_VERSION = "api-version=7.1";
8
+ /**
9
+ * Azure Boards work items.
10
+ *
11
+ * The inverse of Jira: `System.State` is a plain field, so closing is a write
12
+ * rather than a transition search, and the target state is configurable —
13
+ * which is why this provider, and only this one, declares `done_state`.
14
+ */
15
+ class AzureClient extends http_client_1.HttpAlmClient {
16
+ capabilities = {
17
+ create: true,
18
+ readStatus: true,
19
+ close: true,
20
+ // Azure searches with WIQL — a POST carrying a query language, then a
21
+ // second request to hydrate each id. That is a different shape from the
22
+ // other two, and declaring `false` degrades `alm pull` with a message
23
+ // rather than pretending and failing at the first request.
24
+ listIssues: false,
25
+ };
26
+ authorization;
27
+ projectKey;
28
+ issueType;
29
+ doneState;
30
+ constructor(cfg, fetchImpl) {
31
+ super(cfg, fetchImpl);
32
+ const token = http_client_1.HttpAlmClient.requireEnv(cfg.token_env);
33
+ this.authorization = `Basic ${Buffer.from(`:${token}`).toString("base64")}`;
34
+ this.projectKey = String(cfg.project_key ?? "");
35
+ this.issueType = cfg.issue_type ?? "Task";
36
+ this.doneState = cfg.done_state ?? "Done";
37
+ }
38
+ /** Work-item writes are JSON Patch; reads are not. */
39
+ patchHeaders() {
40
+ return { Authorization: this.authorization, "Content-Type": "application/json-patch+json" };
41
+ }
42
+ async createIssue(reqId, title) {
43
+ const path = `/${this.projectKey}/_apis/wit/workitems/` +
44
+ `$${encodeURIComponent(this.issueType)}?${API_VERSION}`;
45
+ const created = await this.requestJson(path, `Azure create work item for ${reqId}`, {
46
+ method: "POST",
47
+ headers: this.patchHeaders(),
48
+ body: JSON.stringify([
49
+ { op: "add", path: "/fields/System.Title", value: `${reqId} — ${title}` },
50
+ { op: "add", path: "/fields/System.Tags", value: `spec-driven; ${reqId}` },
51
+ ]),
52
+ });
53
+ return { key: String(created.id), url: created._links?.html?.href ?? null };
54
+ }
55
+ async getIssueStatus(issueKey) {
56
+ const item = await this.requestJson(`/_apis/wit/workitems/${issueKey}?fields=System.State&${API_VERSION}`, `Azure read work item ${issueKey}`, { headers: { Authorization: this.authorization } });
57
+ const state = item.fields?.["System.State"];
58
+ return state !== undefined && DONE_STATES.includes(state) ? "done" : "open";
59
+ }
60
+ async closeIssue(issueKey) {
61
+ await this.request(`/_apis/wit/workitems/${issueKey}?${API_VERSION}`, `Azure close work item ${issueKey}`, {
62
+ method: "PATCH",
63
+ headers: this.patchHeaders(),
64
+ body: JSON.stringify([{ op: "add", path: "/fields/System.State", value: this.doneState }]),
65
+ });
66
+ }
67
+ }
68
+ exports.azureProvider = {
69
+ id: "azure",
70
+ label: "Azure Boards",
71
+ config: {
72
+ required: ["base_url", "project_key", "token_env"],
73
+ optional: ["issue_type", "done_state"],
74
+ },
75
+ capabilities: { create: true, readStatus: true, close: true, listIssues: false },
76
+ create: (cfg, fetchImpl) => new AzureClient(cfg, fetchImpl),
77
+ };
78
+ exports.default = exports.azureProvider;
79
+ //# sourceMappingURL=azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/azure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.githubProvider = void 0;
4
+ const http_client_1 = require("./http-client");
5
+ /** github.com. A GitHub Enterprise Server install sets `base_url` instead. */
6
+ const PUBLIC_API = "https://api.github.com";
7
+ /** Pinned so a future default does not change what this connector sends. */
8
+ const API_VERSION = "2022-11-28";
9
+ /**
10
+ * GitHub Issues.
11
+ *
12
+ * The unit is a **repository**, not a project, which is why this provider
13
+ * declares `repo` rather than reusing `project_key`. Writing
14
+ * `project_key: acme/widgets` would read as a lie, and the config contract
15
+ * exists precisely so a provider can say what it actually needs.
16
+ *
17
+ * There is no `issue_type`: GitHub has labels, and the connector applies the
18
+ * same two every other provider does. There is no `done_state` either — an
19
+ * issue is open or closed — and declaring one would be read by nobody, which
20
+ * is the defect `done_state` on Jira already was.
21
+ *
22
+ * **Closed is not always done.** GitHub distinguishes closing an issue as
23
+ * `completed` from closing it as `not_planned`, and only the first means the
24
+ * work happened. Collapsing both to "done" would tell the traceability matrix
25
+ * a requirement was delivered when the team had in fact abandoned it — so
26
+ * `not_planned` reads as open, and the mismatch surfaces as drift for a human,
27
+ * which is what ADR-0021 asks for.
28
+ */
29
+ class GitHubClient extends http_client_1.HttpAlmClient {
30
+ capabilities = {
31
+ create: true,
32
+ readStatus: true,
33
+ close: true,
34
+ listIssues: true,
35
+ };
36
+ headers;
37
+ repo;
38
+ constructor(cfg, fetchImpl) {
39
+ // github.com has one API host, so `base_url` is only for Enterprise Server.
40
+ // Defaulting here keeps it out of every config that does not need it.
41
+ super({ ...cfg, base_url: cfg.base_url ?? PUBLIC_API }, fetchImpl);
42
+ const token = http_client_1.HttpAlmClient.requireEnv(cfg.token_env);
43
+ this.headers = {
44
+ Authorization: `Bearer ${token}`,
45
+ Accept: "application/vnd.github+json",
46
+ "X-GitHub-Api-Version": API_VERSION,
47
+ "Content-Type": "application/json",
48
+ };
49
+ this.repo = GitHubClient.requireRepo(cfg.repo);
50
+ }
51
+ /**
52
+ * `owner/name`, checked here rather than discovered as a 404.
53
+ *
54
+ * A bare repository name builds `/repos/widgets/issues`, which GitHub answers
55
+ * with a 404 that says nothing about the real mistake.
56
+ */
57
+ static requireRepo(value) {
58
+ const repo = String(value ?? "").replace(/^\/+|\/+$/g, "");
59
+ if (!/^[^/\s]+\/[^/\s]+$/.test(repo)) {
60
+ throw new Error(`alm.config.yaml: repo '${String(value ?? "")}' is not in owner/name form.\n` +
61
+ "Fix: write it as `repo: acme/widgets`.");
62
+ }
63
+ return repo;
64
+ }
65
+ async createIssue(reqId, title) {
66
+ const created = await this.requestJson(`/repos/${this.repo}/issues`, `GitHub create issue for ${reqId}`, {
67
+ method: "POST",
68
+ headers: this.headers,
69
+ body: JSON.stringify({
70
+ title: `${reqId} — ${title}`,
71
+ labels: ["spec-driven", reqId],
72
+ }),
73
+ });
74
+ // The number is enough to address the issue because the repository comes
75
+ // from the config — the same shape Azure uses for its work-item ids.
76
+ return { key: String(created.number), url: created.html_url ?? null };
77
+ }
78
+ async getIssueStatus(issueKey) {
79
+ const issue = await this.requestJson(`/repos/${this.repo}/issues/${issueKey}`, `GitHub read issue ${issueKey}`, { headers: this.headers });
80
+ if (issue.state !== "closed")
81
+ return "open";
82
+ return issue.state_reason === "not_planned" ? "open" : "done";
83
+ }
84
+ /**
85
+ * Open issues carrying a label.
86
+ *
87
+ * `pulls` are filtered out: GitHub's issues endpoint returns pull requests
88
+ * too — every PR is an issue — and a pull request is not a requirement
89
+ * somebody proposed.
90
+ */
91
+ async listIssues(label) {
92
+ const issues = await this.requestJson(`/repos/${this.repo}/issues?state=open&labels=${encodeURIComponent(label)}&per_page=100`, `GitHub list issues labelled ${label}`, { headers: this.headers });
93
+ return (issues || [])
94
+ .filter((issue) => !issue.pull_request)
95
+ .map((issue) => ({
96
+ key: String(issue.number),
97
+ title: String(issue.title ?? ""),
98
+ body: String(issue.body ?? ""),
99
+ url: issue.html_url ?? null,
100
+ }));
101
+ }
102
+ async closeIssue(issueKey) {
103
+ await this.request(`/repos/${this.repo}/issues/${issueKey}`, `GitHub close issue ${issueKey}`, {
104
+ method: "PATCH",
105
+ headers: this.headers,
106
+ // `completed` rather than the default, so `getIssueStatus` reads back
107
+ // as done and the two halves of this connector agree.
108
+ body: JSON.stringify({ state: "closed", state_reason: "completed" }),
109
+ });
110
+ }
111
+ }
112
+ exports.githubProvider = {
113
+ id: "github",
114
+ label: "GitHub Issues",
115
+ config: {
116
+ required: ["repo", "token_env"],
117
+ // Only GitHub Enterprise Server needs a base URL; github.com is the default.
118
+ optional: ["base_url"],
119
+ },
120
+ capabilities: { create: true, readStatus: true, close: true, listIssues: true },
121
+ create: (cfg, fetchImpl) => new GitHubClient(cfg, fetchImpl),
122
+ };
123
+ exports.default = exports.githubProvider;
124
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpAlmClient = void 0;
4
+ /**
5
+ * What every HTTP-backed ALM connector shares: a credential read from the
6
+ * environment, a base URL that does not grow a doubled slash, and a refusal to
7
+ * carry on past a failed response.
8
+ *
9
+ * Credentials come from environment variables named in `alm.config.yaml` —
10
+ * never from the file itself, which is committed.
11
+ */
12
+ class HttpAlmClient {
13
+ baseUrl;
14
+ fetchImpl;
15
+ constructor(cfg, fetchImpl) {
16
+ // A trailing slash in the config is invisible until it produces
17
+ // `https://host//rest/api` against a real server, so it is stripped once,
18
+ // here, rather than in each provider's URL building.
19
+ this.baseUrl = String(cfg.base_url ?? "").replace(/\/$/, "");
20
+ this.fetchImpl = fetchImpl ?? globalThis.fetch;
21
+ }
22
+ /** Read a credential, naming the variable and how to set it when it is absent. */
23
+ static requireEnv(name) {
24
+ const value = name ? process.env[name] : undefined;
25
+ if (!value) {
26
+ throw new Error(`Environment variable ${name ?? "(unnamed)"} is not set.\n` +
27
+ "Fix: export the ALM API token in that variable (CI: a masked secret).");
28
+ }
29
+ return value;
30
+ }
31
+ /** Perform a request and fail loudly, with the server's own words, when it is refused. */
32
+ async request(path, what, init) {
33
+ const res = await this.fetchImpl(`${this.baseUrl}${path}`, init);
34
+ if (!res.ok) {
35
+ const body = await res.text().catch(() => "");
36
+ throw new Error(`${what} failed: HTTP ${res.status} ${body.slice(0, 300)}`);
37
+ }
38
+ return res;
39
+ }
40
+ /** The same, returning the parsed body, which is what every caller wants. */
41
+ async requestJson(path, what, init) {
42
+ const res = await this.request(path, what, init);
43
+ return (await res.json());
44
+ }
45
+ }
46
+ exports.HttpAlmClient = HttpAlmClient;
47
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/http-client.ts"],"names":[],"mappings":";;;AAUA;;;;;;;GAOG;AACH,MAAsB,aAAa;IAGd,OAAO,CAAS;IAClB,SAAS,CAAY;IAEtC,YAAsB,GAAc,EAAE,SAAqB;QACzD,gEAAgE;QAChE,0EAA0E;QAC1E,qDAAqD;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,IAAM,UAAmC,CAAC,KAAmB,CAAC;IAC1F,CAAC;IAMD,kFAAkF;IACxE,MAAM,CAAC,UAAU,CAAC,IAAwB;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,IAAI,WAAW,gBAAgB;gBACzD,uEAAuE,CAC1E,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0FAA0F;IAChF,KAAK,CAAC,OAAO,CACrB,IAAY,EACZ,IAAY,EACZ,IAA8B;QAE9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6EAA6E;IACnE,KAAK,CAAC,WAAW,CACzB,IAAY,EACZ,IAAY,EACZ,IAA8B;QAE9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;CACF;AArDD,sCAqDC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCommunityProvider = exports.providerIds = exports.PROVIDERS = void 0;
4
+ exports.getProvider = getProvider;
5
+ const jira_1 = require("./jira");
6
+ const azure_1 = require("./azure");
7
+ const github_1 = require("./github");
8
+ const port_1 = require("../port");
9
+ /**
10
+ * The provider registry. Adding an ALM is a row here plus a module beside it;
11
+ * nothing else in the CLI learns its name.
12
+ *
13
+ * The conformance kit iterates this list, so a provider that is registered is
14
+ * a provider that is tested — there is no way to add one quietly.
15
+ */
16
+ exports.PROVIDERS = [jira_1.jiraProvider, azure_1.azureProvider, github_1.githubProvider];
17
+ const BY_ID = new Map(exports.PROVIDERS.map((p) => [p.id, p]));
18
+ /** Every registered provider id, in registration order. */
19
+ const providerIds = () => exports.PROVIDERS.map((p) => p.id);
20
+ exports.providerIds = providerIds;
21
+ // ── community providers ──────────────────────────────────────────────────────
22
+ //
23
+ // Two tiers, because the alternative is worse in both directions. Every
24
+ // connector is somebody else's API, changing on their schedule; carrying six of
25
+ // them here would make this repository's release cadence hostage to six
26
+ // vendors. Refusing them all would make the tool useless to a team on YouTrack.
27
+ //
28
+ // So: `jira`, `azure` and `github` are core — maintained here, exercised by the
29
+ // conformance kit in CI. Anything else is resolved by package name:
30
+ //
31
+ // provider: npm:csda-alm-youtrack
32
+ //
33
+ // **This runs third-party code, and that code is handed your ALM credential**,
34
+ // because a connector cannot talk to a board without one. The trust model is
35
+ // therefore exactly that of a devDependency, and the guards below are the ones
36
+ // that make it no worse than that:
37
+ //
38
+ // - nothing is ever installed automatically. The package must already be in
39
+ // the project's `node_modules`, which means somebody added it deliberately
40
+ // and it went through whatever review dependencies get;
41
+ // - the name must be a package name — no paths, no URLs, no `..`. A config
42
+ // file cannot be made to load an arbitrary file off the disk;
43
+ // - the module is checked against the port before a single method is called,
44
+ // so a package that is not a provider fails with a diagnostic rather than a
45
+ // stack trace from inside `sync`.
46
+ const PACKAGE_PREFIX = "npm:";
47
+ /** npm's own naming rules, minus the length limit: scoped or bare, lowercase. */
48
+ const PACKAGE_NAME = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
49
+ const isCommunityProvider = (id) => String(id).startsWith(PACKAGE_PREFIX);
50
+ exports.isCommunityProvider = isCommunityProvider;
51
+ /** Cache by resolved path: a provider is a module, and re-requiring it is pointless. */
52
+ const communityCache = new Map();
53
+ function loadCommunityProvider(id, projectDir) {
54
+ const packageName = id.slice(PACKAGE_PREFIX.length);
55
+ if (!PACKAGE_NAME.test(packageName)) {
56
+ throw new Error(`Invalid community provider '${id}'.\n` +
57
+ "Fix: `provider: npm:<package-name>` — a package name, not a path or a URL. " +
58
+ "Loading a provider from a path would let a config file run any file on the disk.");
59
+ }
60
+ let entry;
61
+ try {
62
+ entry = require.resolve(packageName, { paths: [projectDir] });
63
+ }
64
+ catch {
65
+ throw new Error(`ALM provider package '${packageName}' is not installed in this project.\n` +
66
+ `Fix: install it first — npm install --save-dev ${packageName}\n` +
67
+ "It is never installed automatically: a provider runs in your process and " +
68
+ "is given your ALM token, so adding one is a dependency decision, not a " +
69
+ "configuration one.");
70
+ }
71
+ const cached = communityCache.get(entry);
72
+ if (cached)
73
+ return cached;
74
+ const loaded = require(entry);
75
+ const provider = (loaded && loaded.default ? loaded.default : loaded);
76
+ const problems = (0, port_1.checkProviderDeclaration)(provider);
77
+ if (problems.length > 0) {
78
+ throw new Error(`'${packageName}' does not implement the ALM provider contract:\n` +
79
+ problems.map((p) => ` - ${p}`).join("\n") +
80
+ "\nFix: report it to the package author. The contract is documented in docs/alm.md.");
81
+ }
82
+ communityCache.set(entry, provider);
83
+ return provider;
84
+ }
85
+ /**
86
+ * Look one up, or explain which ones exist.
87
+ *
88
+ * @param projectDir where a community package is resolved from. Required for
89
+ * `npm:` ids; core providers never need it.
90
+ */
91
+ function getProvider(id, projectDir) {
92
+ if ((0, exports.isCommunityProvider)(id)) {
93
+ if (!projectDir) {
94
+ throw new Error(`Community provider '${id}' needs a project directory to resolve from.\n` +
95
+ "Fix: this is a bug in the caller — report it.");
96
+ }
97
+ return loadCommunityProvider(id, projectDir);
98
+ }
99
+ const provider = BY_ID.get(id);
100
+ if (!provider) {
101
+ throw new Error(`Unknown ALM provider '${id}'. Available: ${(0, exports.providerIds)().join(", ")}.\n` +
102
+ "Fix: set `provider:` in alm.config.yaml to one of those, or to " +
103
+ "`npm:<package>` for a community connector you have installed.");
104
+ }
105
+ return provider;
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jiraProvider = void 0;
4
+ const http_client_1 = require("./http-client");
5
+ /**
6
+ * Jira Cloud.
7
+ *
8
+ * "Done" is not a state here, it is a *category*: Jira's workflows are
9
+ * per-project, so the only portable question is whether the current status
10
+ * belongs to the `done` category, and the only portable way to close is to
11
+ * find a transition that leads to one. That is why this provider declares no
12
+ * `done_state` — configuring one would be read by nobody.
13
+ */
14
+ class JiraClient extends http_client_1.HttpAlmClient {
15
+ capabilities = {
16
+ create: true,
17
+ readStatus: true,
18
+ close: true,
19
+ listIssues: true,
20
+ };
21
+ headers;
22
+ projectKey;
23
+ issueType;
24
+ constructor(cfg, fetchImpl) {
25
+ super(cfg, fetchImpl);
26
+ const token = http_client_1.HttpAlmClient.requireEnv(cfg.token_env);
27
+ // Jira Cloud's Basic auth pairs the token with an account email, and
28
+ // $JIRA_USER is the conventional home for it.
29
+ const user = http_client_1.HttpAlmClient.requireEnv(cfg.user_env ?? "JIRA_USER");
30
+ this.headers = {
31
+ Authorization: `Basic ${Buffer.from(`${user}:${token}`).toString("base64")}`,
32
+ "Content-Type": "application/json",
33
+ };
34
+ this.projectKey = String(cfg.project_key ?? "");
35
+ this.issueType = cfg.issue_type ?? "Task";
36
+ }
37
+ async createIssue(reqId, title) {
38
+ const created = await this.requestJson("/rest/api/3/issue", `Jira create issue for ${reqId}`, {
39
+ method: "POST",
40
+ headers: this.headers,
41
+ body: JSON.stringify({
42
+ fields: {
43
+ project: { key: this.projectKey },
44
+ issuetype: { name: this.issueType },
45
+ summary: `${reqId} — ${title}`,
46
+ labels: ["spec-driven", reqId],
47
+ },
48
+ }),
49
+ });
50
+ return { key: created.key, url: `${this.baseUrl}/browse/${created.key}` };
51
+ }
52
+ async getIssueStatus(issueKey) {
53
+ const issue = await this.requestJson(`/rest/api/3/issue/${issueKey}?fields=status`, `Jira read ${issueKey}`, { headers: this.headers });
54
+ return issue.fields?.status?.statusCategory?.key === "done" ? "done" : "open";
55
+ }
56
+ /**
57
+ * Open issues carrying a label, via JQL.
58
+ *
59
+ * The project is pinned as well as the label: a label is global in Jira, so
60
+ * searching on it alone reaches across every project the credential can see.
61
+ *
62
+ * Jira Cloud returns `description` as Atlassian Document Format — a document
63
+ * tree, not a string — so the text is flattened out of it. A body that does
64
+ * not flatten comes back empty rather than as `[object Object]`.
65
+ */
66
+ async listIssues(label) {
67
+ const jql = `project = "${this.projectKey}" AND labels = "${label}" AND statusCategory != Done`;
68
+ const result = await this.requestJson(`/rest/api/3/search?jql=${encodeURIComponent(jql)}&fields=summary,description&maxResults=100`, `Jira search for issues labelled ${label}`, { headers: this.headers });
69
+ return (result.issues ?? []).map((issue) => ({
70
+ key: issue.key,
71
+ title: String(issue.fields?.summary ?? ""),
72
+ body: flattenAdf(issue.fields?.description),
73
+ url: `${this.baseUrl}/browse/${issue.key}`,
74
+ }));
75
+ }
76
+ async closeIssue(issueKey) {
77
+ const transition = await this.findDoneTransition(issueKey);
78
+ await this.request(`/rest/api/3/issue/${issueKey}/transitions`, `Jira transition ${issueKey}`, {
79
+ method: "POST",
80
+ headers: this.headers,
81
+ body: JSON.stringify({ transition: { id: transition.id } }),
82
+ });
83
+ }
84
+ /** The workflow decides which transition means done; there may be none. */
85
+ async findDoneTransition(issueKey) {
86
+ const { transitions } = await this.requestJson(`/rest/api/3/issue/${issueKey}/transitions`, `Jira list transitions for ${issueKey}`, { headers: this.headers });
87
+ const done = (transitions ?? []).find((t) => t.to?.statusCategory?.key === "done");
88
+ if (!done) {
89
+ throw new Error(`Jira: no transition to a done state available for ${issueKey}.`);
90
+ }
91
+ return done;
92
+ }
93
+ }
94
+ /**
95
+ * The plain text inside an Atlassian Document Format value.
96
+ *
97
+ * ADF nests content nodes arbitrarily; only the `text` leaves matter here, and
98
+ * a shape this does not recognise yields "" rather than a stringified object.
99
+ */
100
+ function flattenAdf(value) {
101
+ if (typeof value === "string")
102
+ return value;
103
+ if (!value || typeof value !== "object")
104
+ return "";
105
+ const node = value;
106
+ if (typeof node.text === "string")
107
+ return node.text;
108
+ if (!Array.isArray(node.content))
109
+ return "";
110
+ return node.content
111
+ .map((child) => flattenAdf(child))
112
+ .filter(Boolean)
113
+ .join("\n")
114
+ .trim();
115
+ }
116
+ exports.jiraProvider = {
117
+ id: "jira",
118
+ label: "Jira Cloud",
119
+ config: {
120
+ required: ["base_url", "project_key", "token_env"],
121
+ // Optional because $JIRA_USER is the conventional default. Naming the
122
+ // variable in the config is better, not compulsory.
123
+ optional: ["user_env", "issue_type"],
124
+ },
125
+ capabilities: { create: true, readStatus: true, close: true, listIssues: true },
126
+ create: (cfg, fetchImpl) => new JiraClient(cfg, fetchImpl),
127
+ };
128
+ exports.default = exports.jiraProvider;
129
+ //# sourceMappingURL=jira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/jira.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BundlePackCommand = void 0;
5
+ const BundlePackCommand_1 = require("./cli/commands/pack/BundlePackCommand");
6
+ Object.defineProperty(exports, "BundlePackCommand", { enumerable: true, get: function () { return BundlePackCommand_1.BundlePackCommand; } });
7
+ if (require.main === module) {
8
+ new BundlePackCommand_1.BundlePackCommand(process.argv.slice(2)).execute();
9
+ }
10
+ //# sourceMappingURL=bundle_pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle_pack.js","sourceRoot":"","sources":["../../scripts/bundle_pack.ts"],"names":[],"mappings":";;;;AACA,6EAA0E;AAEjE,kGAFA,qCAAiB,OAEA;AAE1B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,qCAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.planArchive = planArchive;
37
+ exports.executeArchive = executeArchive;
38
+ exports.syncTraceability = syncTraceability;
39
+ exports.traceRow = traceRow;
40
+ const path = __importStar(require("node:path"));
41
+ const DiskProjectRepository_1 = require("../../packages/core/src/infrastructure/DiskProjectRepository");
42
+ const ArchiveChangeUseCase_1 = require("../../packages/core/src/application/ArchiveChangeUseCase");
43
+ const TraceabilityMatrix_1 = require("../../packages/core/src/domain/TraceabilityMatrix");
44
+ function planArchive(projectDir, changeId, opts) {
45
+ const repo = new DiskProjectRepository_1.DiskProjectRepository(projectDir);
46
+ const useCase = new ArchiveChangeUseCase_1.ArchiveChangeUseCase(repo);
47
+ const plan = useCase.execute(changeId, opts);
48
+ plan.projectDir = projectDir;
49
+ return plan;
50
+ }
51
+ function executeArchive(plan) {
52
+ const repo = new DiskProjectRepository_1.DiskProjectRepository(plan.projectDir || ".");
53
+ repo.executePlan(plan);
54
+ const archivedAs = plan.move ? path.basename(plan.move.to) : undefined;
55
+ return {
56
+ archivedAs,
57
+ specsUpdated: plan.totals.specsWritten > 0 || plan.totals.specsRetired > 0,
58
+ totals: plan.totals,
59
+ warnings: plan.warnings,
60
+ };
61
+ }
62
+ function syncTraceability(existing, applied) {
63
+ return TraceabilityMatrix_1.TraceabilityMatrix.syncTraceability(existing, applied);
64
+ }
65
+ function traceRow(req) {
66
+ return TraceabilityMatrix_1.TraceabilityMatrix.traceRow(req);
67
+ }
68
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../scripts/change/archive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,kCAMC;AAED,wCAUC;AAED,4CAKC;AAED,4BAEC;AAlCD,gDAAkC;AAClC,wGAAqG;AACrG,mGAAgG;AAChG,0FAAuF;AAEvF,SAAgB,WAAW,CAAC,UAAkB,EAAE,QAAgB,EAAE,IAAU;IAC1E,MAAM,IAAI,GAAG,IAAI,6CAAqB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,2CAAoB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,cAAc,CAAC,IAAS;IACtC,MAAM,IAAI,GAAG,IAAI,6CAAqB,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IAC/D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,OAAO;QACL,UAAU;QACV,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC;QAC1E,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAC9B,QAAuB,EACvB,OAA+C;IAE/C,OAAO,uCAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,OAAO,uCAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC"}