@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,161 @@
1
+ "use strict";
2
+ /**
3
+ * Is this requirement fit to hand to an agent? (B2)
4
+ *
5
+ * `plan` has always known that a requirement's feature does not exist;
6
+ * `harness run` never used it as a filter, so the agent found out halfway
7
+ * through and the run spent `max_attempts` × the timeout discovering it. What
8
+ * this changes is that "ready for an agent?" stops being the intuition of
9
+ * whoever typed the command.
10
+ *
11
+ * The line worth holding is which checks *block*. A blocker means the agent
12
+ * cannot succeed — not that the row is untidy.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const node_test_1 = require("node:test");
49
+ const assert = __importStar(require("node:assert/strict"));
50
+ const Diagnostic_1 = require("../../src/domain/Diagnostic");
51
+ const RequirementReadiness_1 = require("../../src/domain/RequirementReadiness");
52
+ const READY = {
53
+ requirement: "REQ-001",
54
+ status: "Draft",
55
+ featureFile: "features/core/health.feature",
56
+ featureExists: true,
57
+ scenarioFindings: [],
58
+ blockedBy: [],
59
+ technicalDeclared: true,
60
+ testDeclared: true,
61
+ };
62
+ const codes = (r) => r.blockers.map((b) => b.code);
63
+ (0, node_test_1.test)("a requirement with everything in place is ready and says nothing", () => {
64
+ const r = (0, RequirementReadiness_1.requirementReadiness)(READY);
65
+ assert.equal(r.ready, true);
66
+ assert.deepEqual(r.blockers, []);
67
+ });
68
+ (0, node_test_1.test)("no feature file blocks — there is no acceptance criterion to satisfy", () => {
69
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, featureExists: false });
70
+ assert.equal(r.ready, false);
71
+ assert.ok(codes(r).includes(RequirementReadiness_1.READINESS_CODES.NO_FEATURE));
72
+ assert.match(r.blockers[0].message, /features\/core\/health\.feature/);
73
+ assert.match(r.blockers[0].fix, /specgate req link REQ-001 --feature/);
74
+ });
75
+ (0, node_test_1.test)("a scenario the gate cannot fail blocks, because a green run would prove nothing", () => {
76
+ // H14 seen from planning: an empty scenario passes, so pointing an agent at
77
+ // it buys a verdict that means nothing.
78
+ const r = (0, RequirementReadiness_1.requirementReadiness)({
79
+ ...READY,
80
+ scenarioFindings: [(0, Diagnostic_1.error)("scenario_has_no_steps", "Cucumber sees no steps here.")],
81
+ });
82
+ assert.equal(r.ready, false);
83
+ assert.ok(codes(r).includes(RequirementReadiness_1.READINESS_CODES.UNRUNNABLE_SCENARIO));
84
+ });
85
+ (0, node_test_1.test)("a merely weak scenario does not block", () => {
86
+ // Warnings weaken the signal; they do not counterfeit it. Blocking on them
87
+ // would make every adopted repository unrunnable.
88
+ const r = (0, RequirementReadiness_1.requirementReadiness)({
89
+ ...READY,
90
+ scenarioFindings: [
91
+ { severity: "warning", code: "scenario_too_few_steps", message: "only 2 step(s)." },
92
+ ],
93
+ });
94
+ assert.equal(r.ready, true);
95
+ assert.deepEqual(r.blockers, []);
96
+ });
97
+ (0, node_test_1.test)("unmet dependencies block, and the blocker names them", () => {
98
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, blockedBy: ["REQ-000", "REQ-002"] });
99
+ assert.equal(r.ready, false);
100
+ assert.match(r.blockers[0].message, /REQ-000, REQ-002/);
101
+ });
102
+ (0, node_test_1.test)("Deprecated blocks — nobody wants it built", () => {
103
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, status: "Deprecated" });
104
+ assert.equal(r.ready, false);
105
+ assert.ok(codes(r).includes(RequirementReadiness_1.READINESS_CODES.NOT_WANTED));
106
+ });
107
+ (0, node_test_1.test)("Needs Clarification blocks, and says why that is not pedantry", () => {
108
+ // An agent asked to settle a disagreement settles it by guessing, and the
109
+ // guess arrives wearing a green gate.
110
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, status: "Needs Clarification" });
111
+ assert.equal(r.ready, false);
112
+ assert.ok(codes(r).includes(RequirementReadiness_1.READINESS_CODES.NEEDS_CLARIFICATION));
113
+ assert.match(r.blockers[0].message, /disputed/);
114
+ });
115
+ (0, node_test_1.test)("an ordinary in-progress status does not block", () => {
116
+ for (const status of ["Draft", "Ready for Dev", "In Dev", "In Review", "Approved"]) {
117
+ assert.equal((0, RequirementReadiness_1.requirementReadiness)({ ...READY, status }).ready, true, status);
118
+ }
119
+ });
120
+ (0, node_test_1.test)("each undeclared artifact warns on its own, and neither blocks", () => {
121
+ // A vague row does not stop the work, so these never block. They are reported
122
+ // separately because "no test artifact" and "no production artifact" have
123
+ // different fixes, and a single vague warning would earn a single vague
124
+ // response.
125
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, technicalDeclared: false, testDeclared: false });
126
+ assert.equal(r.ready, true, "an untidy row is not an impossible one");
127
+ assert.deepEqual(codes(r), [
128
+ RequirementReadiness_1.READINESS_CODES.NO_TEST_ARTIFACT,
129
+ RequirementReadiness_1.READINESS_CODES.NO_TECHNICAL_ARTIFACT,
130
+ ]);
131
+ for (const b of r.blockers)
132
+ assert.equal(b.severity, "warning");
133
+ });
134
+ (0, node_test_1.test)("a TBD test artifact is reported, and that is not the noise A2 had to avoid", () => {
135
+ // `TBD` in the test column is not a false positive — it is an accurate
136
+ // statement about an incomplete row, and TDD says that column is the one to
137
+ // fill in first. The scaffolded project says TBD, so this fires on it by
138
+ // design.
139
+ const r = (0, RequirementReadiness_1.requirementReadiness)({ ...READY, testDeclared: false });
140
+ assert.deepEqual(codes(r), [RequirementReadiness_1.READINESS_CODES.NO_TEST_ARTIFACT]);
141
+ assert.match(r.blockers[0].fix, /--test/);
142
+ assert.equal(r.ready, true);
143
+ });
144
+ (0, node_test_1.test)("every blocker carries a fix, because a blocker without one just stops you", () => {
145
+ const r = (0, RequirementReadiness_1.requirementReadiness)({
146
+ requirement: "REQ-009",
147
+ status: "Deprecated",
148
+ featureExists: false,
149
+ scenarioFindings: [(0, Diagnostic_1.error)("scenario_has_no_steps", "x")],
150
+ blockedBy: ["REQ-001"],
151
+ technicalDeclared: false,
152
+ testDeclared: false,
153
+ });
154
+ assert.equal(r.ready, false);
155
+ assert.equal(r.blockers.length, 6, `got ${codes(r)}`);
156
+ for (const b of r.blockers) {
157
+ assert.ok(b.fix && b.fix.trim(), `${b.code} has no fix`);
158
+ assert.equal(b.target, "REQ-009");
159
+ }
160
+ });
161
+ //# sourceMappingURL=requirement-readiness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-readiness.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/requirement-readiness.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * Picking a run back up where it stopped (C3).
4
+ *
5
+ * The design was measured, not assumed: a run was killed with `kill -9` and the
6
+ * remains inspected. The run ledger was empty — it is written when a run
7
+ * finishes, and `--resume` exists for the runs that do not. What survived was
8
+ * the branch, the worktree with uncommitted partial work, and the prompt
9
+ * archive, whose filenames carry the attempt number.
10
+ *
11
+ * That makes the archive filename format load-bearing for resume, which is why
12
+ * it is pinned here rather than left as an implementation detail somebody
13
+ * tidies later.
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 ResumeState_1 = require("../../src/domain/ResumeState");
52
+ const NAME = "REQ-000-2026-08-22T12-11-14-133Z-attempt-1-agent.md";
53
+ (0, node_test_1.test)("an archived prompt filename is taken apart, attempt and all", () => {
54
+ const parsed = (0, ResumeState_1.parseArchivedPromptName)(NAME);
55
+ assert.equal(parsed.requirement, "REQ-000");
56
+ assert.equal(parsed.attempt, 1);
57
+ assert.equal(parsed.role, "agent");
58
+ assert.equal(parsed.stamp, "2026-08-22T12-11-14-133Z");
59
+ });
60
+ (0, node_test_1.test)("anything that is not one of ours is ignored, not guessed at", () => {
61
+ // A person may well leave a note in that directory.
62
+ for (const other of ["notes.md", "README.md", "REQ-000-attempt.md", "REQ-000-x-attempt-0-a.md"]) {
63
+ assert.equal((0, ResumeState_1.parseArchivedPromptName)(other), null, other);
64
+ }
65
+ });
66
+ (0, node_test_1.test)("no archive means there is nothing to resume — start at attempt 1", () => {
67
+ assert.deepEqual((0, ResumeState_1.resumePoint)([], "REQ-000"), { attempt: 1, latest: null });
68
+ assert.equal((0, ResumeState_1.resumePoint)(["notes.md"], "REQ-000").attempt, 1);
69
+ });
70
+ (0, node_test_1.test)("an interrupted attempt is re-run, not skipped", () => {
71
+ // It never reached a verdict: the gate never ran, so nothing was learned.
72
+ // Charging it against max_attempts would spend budget for no information.
73
+ const files = [
74
+ "REQ-000-2026-08-22T10-00-00-000Z-attempt-1-agent.md",
75
+ "REQ-000-2026-08-22T11-00-00-000Z-attempt-2-agent.md",
76
+ ];
77
+ assert.equal((0, ResumeState_1.resumePoint)(files, "REQ-000", false).attempt, 2);
78
+ });
79
+ (0, node_test_1.test)("a completed attempt hands over to its successor", () => {
80
+ const files = ["REQ-000-2026-08-22T10-00-00-000Z-attempt-2-agent.md"];
81
+ assert.equal((0, ResumeState_1.resumePoint)(files, "REQ-000", true).attempt, 3);
82
+ });
83
+ (0, node_test_1.test)("only this requirement's archive counts", () => {
84
+ const files = [
85
+ "REQ-000-2026-08-22T10-00-00-000Z-attempt-1-agent.md",
86
+ "REQ-007-2026-08-22T11-00-00-000Z-attempt-5-agent.md",
87
+ ];
88
+ assert.equal((0, ResumeState_1.resumePoint)(files, "REQ-000").attempt, 1);
89
+ assert.equal((0, ResumeState_1.resumePoint)(files, "REQ-007").attempt, 5);
90
+ });
91
+ (0, node_test_1.test)("within one attempt the newest file wins, so the reviewer does not shadow the agent", () => {
92
+ const files = [
93
+ "REQ-000-2026-08-22T10-00-00-000Z-attempt-2-reviewer.md",
94
+ "REQ-000-2026-08-22T10-30-00-000Z-attempt-2-agent.md",
95
+ ];
96
+ assert.equal((0, ResumeState_1.resumePoint)(files, "REQ-000").latest.role, "agent");
97
+ });
98
+ (0, node_test_1.test)("the last gate failure is recovered from the prompt that carried it", () => {
99
+ // A resumed run has no record of its own; the prompt it already wrote does.
100
+ const prompt = [
101
+ "# Implement REQ-000",
102
+ "",
103
+ "## Previous attempt failed (attempt 1 of 3)",
104
+ "",
105
+ "The gate rejected the last attempt. Fix the specific failure below.",
106
+ "",
107
+ "```",
108
+ "Gate failed at: validate --strict-tdd",
109
+ " [TDD-1] REQ-000 has no test artifact",
110
+ "```",
111
+ "",
112
+ "## Definition of done",
113
+ "",
114
+ ].join("\n");
115
+ const failure = (0, ResumeState_1.previousFailureFromPrompt)(prompt);
116
+ assert.match(failure, /Gate failed at: validate --strict-tdd/);
117
+ assert.match(failure, /TDD-1/);
118
+ assert.doesNotMatch(failure, /Definition of done/, "it must stop at the fence");
119
+ });
120
+ (0, node_test_1.test)("a first-attempt prompt carries no failure, and that is not an error", () => {
121
+ assert.equal((0, ResumeState_1.previousFailureFromPrompt)("# Implement REQ-000\n\n## Requirement facts\n"), "");
122
+ assert.equal((0, ResumeState_1.previousFailureFromPrompt)(""), "");
123
+ });
124
+ //# sourceMappingURL=resume-state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-state.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/resume-state.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * A ceiling on what one run may spend (C1).
4
+ *
5
+ * `max_attempts` was the only limit the harness had. Fourteen requirements ×
6
+ * 3 attempts × 1200 s is hours of wall-clock and an unbounded bill, and the
7
+ * third real run ended because the account hit its monthly limit — the
8
+ * expensive way to discover there was no ceiling of our own.
9
+ *
10
+ * The behaviour worth pinning is that exhausting a budget is not an error. A
11
+ * run that dies halfway never writes its ledger, so `harness report` cannot say
12
+ * what the money bought; a run that stops reports what it did.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const node_test_1 = require("node:test");
49
+ const assert = __importStar(require("node:assert/strict"));
50
+ const RunBudget_1 = require("../../src/domain/RunBudget");
51
+ const T0 = 1_000_000;
52
+ (0, node_test_1.test)("no limits means never stop", () => {
53
+ assert.equal((0, RunBudget_1.budgetVerdict)({}, { startedAt: T0, started: 99 }, T0 + 9_000_000).stop, false);
54
+ assert.equal((0, RunBudget_1.hasBudget)({}), false);
55
+ assert.equal((0, RunBudget_1.hasBudget)({ budgetSeconds: 0, maxRequirements: 0 }), false);
56
+ });
57
+ (0, node_test_1.test)("the count ceiling stops the run once it is reached", () => {
58
+ const limits = { maxRequirements: 3 };
59
+ assert.equal((0, RunBudget_1.budgetVerdict)(limits, { startedAt: T0, started: 2 }, T0).stop, false);
60
+ const v = (0, RunBudget_1.budgetVerdict)(limits, { startedAt: T0, started: 3 }, T0);
61
+ assert.equal(v.stop, true);
62
+ assert.equal(v.code, RunBudget_1.BUDGET_CODES.COUNT);
63
+ assert.match(v.reason, /--max-requirements 3 reached/);
64
+ });
65
+ (0, node_test_1.test)("the time ceiling stops the run once it is spent, and says how much went", () => {
66
+ const limits = { budgetSeconds: 600 };
67
+ assert.equal((0, RunBudget_1.budgetVerdict)(limits, { startedAt: T0, started: 1 }, T0 + 599_000).stop, false);
68
+ const v = (0, RunBudget_1.budgetVerdict)(limits, { startedAt: T0, started: 4 }, T0 + 601_000);
69
+ assert.equal(v.stop, true);
70
+ assert.equal(v.code, RunBudget_1.BUDGET_CODES.TIME);
71
+ assert.match(v.reason, /601s/);
72
+ assert.match(v.reason, /4 requirement\(s\) were attempted/);
73
+ });
74
+ (0, node_test_1.test)("the count ceiling is checked before the clock", () => {
75
+ // Both exhausted at once should name the one a person set most deliberately;
76
+ // either is defensible, so the order is pinned rather than left to chance.
77
+ const v = (0, RunBudget_1.budgetVerdict)({ maxRequirements: 1, budgetSeconds: 1 }, { startedAt: T0, started: 5 }, T0 + 10_000);
78
+ assert.equal(v.code, RunBudget_1.BUDGET_CODES.COUNT);
79
+ });
80
+ (0, node_test_1.test)("a clock that jumps backwards does not read as an exhausted budget", () => {
81
+ // `now` before `startedAt` would otherwise produce a negative spend, and a
82
+ // negative number compares as under budget — right answer, wrong reason. Pin
83
+ // it so a future refactor cannot turn it into a stop at the first check.
84
+ assert.equal((0, RunBudget_1.budgetVerdict)({ budgetSeconds: 600 }, { startedAt: T0, started: 1 }, T0 - 5_000).stop, false);
85
+ });
86
+ // ── Declared cost, which is an estimate and says so ──────────────────────────
87
+ (0, node_test_1.test)("no declared hints means no estimate, rather than a confident zero", () => {
88
+ // A number assembled from nothing invites belief it has not earned.
89
+ assert.equal((0, RunBudget_1.estimateRunCost)([["agent"], ["agent"]], {}), null);
90
+ });
91
+ (0, node_test_1.test)("hints multiply out over the attempts that used each profile", () => {
92
+ const cost = (0, RunBudget_1.estimateRunCost)([["agent", "reviewer"], ["agent"]], { agent: 0.5, reviewer: 0.1 });
93
+ assert.equal(cost.total, 1.1);
94
+ assert.equal(cost.covered, 3);
95
+ assert.equal(cost.uncovered, 0);
96
+ });
97
+ (0, node_test_1.test)("attempts by a profile with no hint are counted, not silently folded in", () => {
98
+ // Otherwise the total reads as complete when a third of the run is missing
99
+ // from it.
100
+ const cost = (0, RunBudget_1.estimateRunCost)([["agent"], ["mystery"], ["mystery"]], { agent: 0.5 });
101
+ assert.equal(cost.total, 0.5);
102
+ assert.equal(cost.covered, 1);
103
+ assert.equal(cost.uncovered, 2);
104
+ });
105
+ (0, node_test_1.test)("hints that are not usable numbers do not poison the total", () => {
106
+ const cost = (0, RunBudget_1.estimateRunCost)([["agent"], ["broken"]], {
107
+ agent: 0.5,
108
+ broken: Number.NaN,
109
+ });
110
+ assert.equal(cost.total, 0.5);
111
+ assert.equal(cost.uncovered, 1);
112
+ });
113
+ //# sourceMappingURL=run-budget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-budget.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/run-budget.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * The row-wise matrix merge.
4
+ *
5
+ * These are the cases that decide whether a parallel harness run is usable, and
6
+ * every one of them is a way an edit could be lost quietly — which is the only
7
+ * outcome worse than a conflict.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ const node_test_1 = require("node:test");
44
+ const assert = __importStar(require("node:assert/strict"));
45
+ const TraceabilityMerge_1 = require("../../src/domain/TraceabilityMerge");
46
+ const HEADER = "| Requirement | Scenario ID | Feature file | Use Case | Command/Query | Aggregate | Event | Technical artifact | Test artifact | Status |";
47
+ const SEP = "|---|---|---|---|---|---|---|---|---|---|";
48
+ const row = (n, status) => `| REQ-${n} | SCN-${n} | \`f${n}.feature\` | UC-${n} | C | A | E | \`s${n}.ts\` | \`t${n}.ts\` | ${status} |`;
49
+ const matrix = (rows) => ["# Traceability Matrix", "", HEADER, SEP, ...rows, ""].join("\n");
50
+ const statusOf = (content, n) => {
51
+ const line = content.split("\n").find((l) => l.includes(`| REQ-${n} |`));
52
+ return line ? line.split("|").map((c) => c.trim())[10] : null;
53
+ };
54
+ (0, node_test_1.test)("two branches flipping adjacent rows merge cleanly", () => {
55
+ // The case the driver exists for: plain git conflicts here because the rows
56
+ // are consecutive lines, not because the edits overlap.
57
+ const base = matrix([row("001", "Draft"), row("002", "Draft"), row("003", "Draft")]);
58
+ const ours = matrix([row("001", "Implemented"), row("002", "Draft"), row("003", "Draft")]);
59
+ const theirs = matrix([row("001", "Draft"), row("002", "Implemented"), row("003", "Draft")]);
60
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
61
+ assert.deepEqual(conflicts, []);
62
+ assert.equal(statusOf(content, "001"), "Implemented", "our edit survived");
63
+ assert.equal(statusOf(content, "002"), "Implemented", "their edit survived");
64
+ assert.equal(statusOf(content, "003"), "Draft");
65
+ });
66
+ (0, node_test_1.test)("the same row changed differently is still a conflict", () => {
67
+ // The safety property. A driver that resolved this by picking a side would
68
+ // silently discard a decision somebody made.
69
+ const base = matrix([row("001", "Draft")]);
70
+ const ours = matrix([row("001", "Implemented")]);
71
+ const theirs = matrix([row("001", "Verified")]);
72
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
73
+ assert.deepEqual(conflicts, ["REQ-001::SCN-001"]);
74
+ assert.match(content, /<<<<<<< ours/);
75
+ assert.match(content, /=======/);
76
+ assert.match(content, />>>>>>> theirs/);
77
+ assert.ok(content.includes("Implemented"), "both versions are shown");
78
+ assert.ok(content.includes("Verified"));
79
+ });
80
+ (0, node_test_1.test)("the same row changed the same way is not a conflict", () => {
81
+ const base = matrix([row("001", "Draft")]);
82
+ const same = matrix([row("001", "Implemented")]);
83
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)(base, same, same);
84
+ assert.deepEqual(conflicts, []);
85
+ assert.equal(statusOf(content, "001"), "Implemented");
86
+ });
87
+ (0, node_test_1.test)("a row only they changed is taken; a row only we changed is kept", () => {
88
+ const base = matrix([row("001", "Draft"), row("002", "Draft")]);
89
+ const ours = matrix([row("001", "Implemented"), row("002", "Draft")]);
90
+ const theirs = matrix([row("001", "Draft"), row("002", "Verified")]);
91
+ const { content } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
92
+ assert.equal(statusOf(content, "001"), "Implemented");
93
+ assert.equal(statusOf(content, "002"), "Verified");
94
+ });
95
+ (0, node_test_1.test)("a row only they have is added, inside the table", () => {
96
+ const base = matrix([row("001", "Draft")]);
97
+ const ours = matrix([row("001", "Implemented")]);
98
+ const theirs = matrix([row("001", "Draft"), row("002", "Draft")]);
99
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
100
+ assert.deepEqual(conflicts, []);
101
+ assert.equal(statusOf(content, "002"), "Draft", "their new row arrived");
102
+ const lines = content.split("\n");
103
+ const sep = lines.findIndex((l) => l.includes("---|"));
104
+ const added = lines.findIndex((l) => l.includes("| REQ-002 |"));
105
+ assert.ok(added > sep, "the added row must be inside the table, not after it");
106
+ });
107
+ (0, node_test_1.test)("a row we added and they never had is kept", () => {
108
+ const base = matrix([row("001", "Draft")]);
109
+ const ours = matrix([row("001", "Draft"), row("002", "Draft")]);
110
+ const theirs = matrix([row("001", "Implemented")]);
111
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
112
+ assert.deepEqual(conflicts, []);
113
+ assert.equal(statusOf(content, "002"), "Draft", "our new row survived their merge");
114
+ assert.equal(statusOf(content, "001"), "Implemented");
115
+ });
116
+ (0, node_test_1.test)("the status is never part of the row key", () => {
117
+ // The bug that nearly shipped: keying on a cell that changes makes an edited
118
+ // row look like a new row, so the merge reports success and loses an edit.
119
+ const base = matrix([row("001", "Draft")]);
120
+ const ours = matrix([row("001", "Draft")]);
121
+ const theirs = matrix([row("001", "Implemented")]);
122
+ const { content } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
123
+ const rows = content.split("\n").filter((l) => l.includes("| REQ-001 |"));
124
+ assert.equal(rows.length, 1, "a status change must not duplicate the row");
125
+ assert.equal(statusOf(content, "001"), "Implemented");
126
+ });
127
+ (0, node_test_1.test)("prose and headers outside the table are carried through untouched", () => {
128
+ const base = matrix([row("001", "Draft")]);
129
+ const ours = [
130
+ "# Traceability Matrix",
131
+ "",
132
+ "Some local note.",
133
+ "",
134
+ HEADER,
135
+ SEP,
136
+ row("001", "Implemented"),
137
+ "",
138
+ ].join("\n");
139
+ const theirs = matrix([row("001", "Draft")]);
140
+ const { content } = (0, TraceabilityMerge_1.mergeTraceability)(base, ours, theirs);
141
+ assert.match(content, /Some local note\./);
142
+ assert.match(content, /^# Traceability Matrix/);
143
+ });
144
+ (0, node_test_1.test)("a file with no recognisable header is handed back unresolved", () => {
145
+ // Guessing the shape of a matrix during a merge is how a file gets rewritten
146
+ // into something nobody asked for.
147
+ const { content, conflicts } = (0, TraceabilityMerge_1.mergeTraceability)("", "not a matrix\n", "nor this\n");
148
+ assert.equal(content, "not a matrix\n");
149
+ assert.equal(conflicts.length, 1);
150
+ });
151
+ (0, node_test_1.test)("with no common ancestor, differing rows conflict rather than pick a side", () => {
152
+ // git passes an empty base for unrelated histories. Two sides that both
153
+ // "added" the same requirement differently have no basis for a merge.
154
+ const ours = matrix([row("001", "Implemented")]);
155
+ const theirs = matrix([row("001", "Verified")]);
156
+ const { conflicts } = (0, TraceabilityMerge_1.mergeTraceability)("", ours, theirs);
157
+ assert.deepEqual(conflicts, ["REQ-001::SCN-001"]);
158
+ });
159
+ //# sourceMappingURL=traceability-merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceability-merge.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/traceability-merge.test.ts"],"names":[],"mappings":"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"}