@use-the-fork/spindle 0.0.0-stage → 0.0.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 (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -2
  3. package/build/Assets/Blueprints/Catalog.js +110 -0
  4. package/build/Assets/Blueprints/agents/general.agent.md +67 -0
  5. package/build/Assets/Blueprints/agents/sdd-code-reviewer.agent.md +62 -0
  6. package/build/Assets/Blueprints/agents/sdd-code-slop-reviewer.agent.md +59 -0
  7. package/build/Assets/Blueprints/agents/sdd-implementer.agent.md +77 -0
  8. package/build/Assets/Blueprints/agents/sdd-orchestrator.agent.md +42 -0
  9. package/build/Assets/Blueprints/agents/sdd-re-review.agent.md +57 -0
  10. package/build/Assets/Blueprints/agents/sdd-reviewer.agent.md +89 -0
  11. package/build/Assets/Blueprints/agents/sdd-task-reviewer.agent.md +54 -0
  12. package/build/Assets/Blueprints/agents/shared-codebase-analyzer.agent.md +151 -0
  13. package/build/Assets/Blueprints/agents/shared-codebase-locator.agent.md +130 -0
  14. package/build/Assets/Blueprints/agents/shared-codebase-pattern-finder.agent.md +247 -0
  15. package/build/Assets/Blueprints/agents/shared-explore.agent.md +53 -0
  16. package/build/Assets/Blueprints/agents/shared-r.agent.md +17 -0
  17. package/build/Assets/Blueprints/agents/shared-rw.agent.md +17 -0
  18. package/build/Assets/Blueprints/agents/shared-rwx.agent.md +17 -0
  19. package/build/Assets/Blueprints/agents/shared-web-search-researcher.agent.md +122 -0
  20. package/build/Assets/Blueprints/instructions/code-commenting.instructions.md +39 -0
  21. package/build/Assets/Blueprints/instructions/source-architecture.instructions.md +15 -0
  22. package/build/Assets/Blueprints/skills/asd-ste100/CREDITS.MD +1 -0
  23. package/build/Assets/Blueprints/skills/asd-ste100/SKILL.md +83 -0
  24. package/build/Assets/Blueprints/skills/asd-ste100/examples/before-after.md +107 -0
  25. package/build/Assets/Blueprints/skills/asd-ste100/references/writing-rules.md +65 -0
  26. package/build/Assets/Blueprints/skills/author-agent/SKILL.md +26 -0
  27. package/build/Assets/Blueprints/skills/author-design/SKILL.md +38 -0
  28. package/build/Assets/Blueprints/skills/author-instruction/SKILL.md +28 -0
  29. package/build/Assets/Blueprints/skills/author-skill/SKILL.md +26 -0
  30. package/build/Assets/Blueprints/skills/grill/SKILL.md +33 -0
  31. package/build/Assets/Blueprints/skills/grill-design/SKILL.md +41 -0
  32. package/build/Assets/Blueprints/skills/grill-with-docs/SKILL.md +14 -0
  33. package/build/Assets/Blueprints/skills/implement/SKILL.md +79 -0
  34. package/build/Assets/Blueprints/skills/implement-spec/SKILL.md +34 -0
  35. package/build/Assets/Blueprints/skills/improve-codebase-architecture/HTML-REPORT.md +129 -0
  36. package/build/Assets/Blueprints/skills/improve-codebase-architecture/SKILL.md +74 -0
  37. package/build/Assets/Blueprints/skills/int-code-review/SKILL.md +76 -0
  38. package/build/Assets/Blueprints/skills/int-code-slop-review/SKILL.md +238 -0
  39. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/_sections.md +36 -0
  40. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/_template.md +42 -0
  41. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/comments-closing-brace-labels.md +112 -0
  42. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/comments-empty-docblocks.md +132 -0
  43. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/comments-narration.md +118 -0
  44. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/comments-placeholder.md +130 -0
  45. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/defensive-generic-catch.md +153 -0
  46. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/defensive-impossible-null.md +157 -0
  47. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/defensive-missing-real.md +157 -0
  48. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/naming-generic-placeholders.md +120 -0
  49. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/naming-over-descriptive.md +108 -0
  50. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/naming-suffix-abuse.md +167 -0
  51. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/naming-type-in-name.md +100 -0
  52. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/over-eng-dependency-creep.md +114 -0
  53. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/over-eng-premature-interface.md +136 -0
  54. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/over-eng-single-method-class.md +161 -0
  55. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/over-eng-useless-wrapper.md +140 -0
  56. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/style-as-any-escape.md +127 -0
  57. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/style-debug-artifacts.md +144 -0
  58. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/style-hyper-consistent.md +84 -0
  59. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/style-no-hack-scars.md +113 -0
  60. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/style-trivial-boilerplate.md +191 -0
  61. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/test-doesnt-throw.md +132 -0
  62. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/test-mirror-implementation.md +125 -0
  63. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/test-mock-everything.md +148 -0
  64. package/build/Assets/Blueprints/skills/int-code-slop-review/rules/test-snapshot-abuse.md +131 -0
  65. package/build/Assets/Blueprints/skills/int-codebase-design/SKILL.md +116 -0
  66. package/build/Assets/Blueprints/skills/int-codebase-design/references/DEEPENING.md +37 -0
  67. package/build/Assets/Blueprints/skills/int-codebase-design/references/DESIGN-IT-TWICE.md +44 -0
  68. package/build/Assets/Blueprints/skills/int-domain-modeling/SKILL.md +78 -0
  69. package/build/Assets/Blueprints/skills/int-domain-modeling/references/ADR-FORMAT.md +47 -0
  70. package/build/Assets/Blueprints/skills/int-domain-modeling/references/GLOSSARY-FORMAT.md +60 -0
  71. package/build/Assets/Blueprints/skills/int-prototype/LOGIC.md +67 -0
  72. package/build/Assets/Blueprints/skills/int-prototype/SKILL.md +30 -0
  73. package/build/Assets/Blueprints/skills/int-prototype/UI.md +112 -0
  74. package/build/Assets/Blueprints/skills/int-retrospective/SKILL.md +88 -0
  75. package/build/Assets/Blueprints/skills/int-retrospective/assets/retrospective-prompt.md +38 -0
  76. package/build/Assets/Blueprints/skills/int-retrospective/references/assessment.md +56 -0
  77. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/SKILL.md +64 -0
  78. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/assets/implementer-prompt.md +40 -0
  79. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/assets/reviewer-prompt.md +43 -0
  80. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/aggregate-review.md +7 -0
  81. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/corrective-rounds.md +72 -0
  82. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/example-workflow.md +25 -0
  83. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/full-spec.md +72 -0
  84. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/implementer-corrections.md +9 -0
  85. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/review-inputs.md +26 -0
  86. package/build/Assets/Blueprints/skills/int-subagent-driven-dev/references/verification-evidence.md +7 -0
  87. package/build/Assets/Blueprints/skills/int-test-driven-development/SKILL.md +51 -0
  88. package/build/Assets/Blueprints/skills/int-test-driven-development/references/mocking.md +31 -0
  89. package/build/Assets/Blueprints/skills/int-test-driven-development/references/tests.md +68 -0
  90. package/build/Assets/Blueprints/skills/int-testing-agent-guidance/SKILL.md +53 -0
  91. package/build/Assets/Blueprints/skills/int-verification-before-completion/SKILL.md +25 -0
  92. package/build/Assets/Blueprints/skills/int-writing-agents/SKILL.md +66 -0
  93. package/build/Assets/Blueprints/skills/int-writing-for-agents/SKILL.md +86 -0
  94. package/build/Assets/Blueprints/skills/int-writing-instruction/SKILL.md +57 -0
  95. package/build/Assets/Blueprints/skills/int-writing-skills/SKILL.md +129 -0
  96. package/build/Assets/Blueprints/skills/int-writing-skills/assets/interactive.md +83 -0
  97. package/build/Assets/Blueprints/skills/int-writing-skills/assets/reference.md +32 -0
  98. package/build/Assets/Blueprints/skills/int-writing-skills/references/arguments.md +50 -0
  99. package/build/Assets/Blueprints/skills/int-writing-skills/references/interactive-skills.md +53 -0
  100. package/build/Assets/Blueprints/skills/int-writing-skills/references/persuasion-principles.md +220 -0
  101. package/build/Assets/Blueprints/skills/int-writing-skills/references/reference-skills.md +20 -0
  102. package/build/Assets/Blueprints/skills/int-writing-skills/references/testing-skills.md +48 -0
  103. package/build/Assets/Blueprints/skills/retrospective/SKILL.md +16 -0
  104. package/build/Assets/Blueprints/skills/setup-project/SKILL.md +66 -0
  105. package/build/Assets/Blueprints/skills/to-spec/SKILL.md +53 -0
  106. package/build/Assets/Blueprints/skills/to-tickets/SKILL.md +49 -0
  107. package/build/Assets/Blueprints/skills/update-tooling/SKILL.md +86 -0
  108. package/build/Assets/Templates/Catalog.js +12 -0
  109. package/build/Assets/Templates/Catalog.ts +17 -0
  110. package/build/Assets/Templates/project/copilot-instructions.md +17 -0
  111. package/build/Assets/Templates/project/domain.md +51 -0
  112. package/build/Assets/Templates/project/ticket-tracker.md +33 -0
  113. package/build/Assets/Templates/sdd/design.md +25 -0
  114. package/build/Assets/Templates/sdd/spec.md +29 -0
  115. package/build/Assets/Templates/sdd/ticket.md +15 -0
  116. package/build/BlueprintManagement/BlueprintManagementServiceProvider.js +15 -0
  117. package/build/BlueprintManagement/Catalog/BlueprintCatalog.js +238 -0
  118. package/build/BlueprintManagement/Commands/BlueprintCommandOptions.js +9 -0
  119. package/build/BlueprintManagement/Commands/ConflictPolicy.js +6 -0
  120. package/build/BlueprintManagement/Commands/InitCommand.js +117 -0
  121. package/build/BlueprintManagement/Commands/Prompts.js +66 -0
  122. package/build/BlueprintManagement/Commands/UpdateCommand.js +86 -0
  123. package/build/BlueprintManagement/Handlers/Agents/AgentHandler.js +21 -0
  124. package/build/BlueprintManagement/Handlers/BlueprintHandlers.js +4 -0
  125. package/build/BlueprintManagement/Handlers/Instructions/InstructionHandler.js +21 -0
  126. package/build/BlueprintManagement/Handlers/Skills/SkillHandler.js +10 -0
  127. package/build/BlueprintManagement/Reconciliation/BlueprintCatalogPlanner.js +87 -0
  128. package/build/BlueprintManagement/Reconciliation/BlueprintRemovalCoordinator.js +78 -0
  129. package/build/BlueprintManagement/Services/BlueprintReconciliationService.js +391 -0
  130. package/build/BlueprintManagement/Services/InstallationService.js +54 -0
  131. package/build/BlueprintManagement/Support/BlueprintFiles.js +113 -0
  132. package/build/BlueprintManagement/Types/Blueprint.js +1 -0
  133. package/build/BlueprintManagement/Types/Installation.js +1 -0
  134. package/build/BlueprintManagement/Types/Reconciliation.js +1 -0
  135. package/build/BlueprintManagement/Versioning/BlueprintVersion.js +70 -0
  136. package/build/BlueprintManagement/Versioning/BlueprintVersioning.js +55 -0
  137. package/build/Commands/Command.js +3 -0
  138. package/build/Commands/CommandOptions.js +12 -0
  139. package/build/Config/Config.js +3 -0
  140. package/build/Foundation/Application.js +112 -0
  141. package/build/Foundation/ApplicationBuilder.js +23 -0
  142. package/build/Foundation/Bootstrap/Bootstrapper.js +2 -0
  143. package/build/Foundation/Bootstrap/DiscoverGitRoot.js +8 -0
  144. package/build/Foundation/Bootstrap/LoadConsoleArgs.js +47 -0
  145. package/build/Foundation/Bootstrap/LoadProjectConfiguration.js +144 -0
  146. package/build/Foundation/Bootstrap/RegisterProviders.js +12 -0
  147. package/build/Foundation/Bootstrap/RequireProjectConfiguration.js +14 -0
  148. package/build/Foundation/ConsoleInvocation.js +1 -0
  149. package/build/Foundation/Container.js +185 -0
  150. package/build/Foundation/FoundationServiceProvider.js +5 -0
  151. package/build/Foundation/Kernel.js +30 -0
  152. package/build/Foundation/Service.js +23 -0
  153. package/build/Foundation/ServiceProvider.js +12 -0
  154. package/build/Git/GitServiceProvider.js +8 -0
  155. package/build/Git/Services/GitService.js +26 -0
  156. package/build/Project/ProjectServiceProvider.js +8 -0
  157. package/build/Project/Services/ProjectService.js +124 -0
  158. package/build/SubagentDrivenDevelopment/Commands/ChecksRecordCommand.js +35 -0
  159. package/build/SubagentDrivenDevelopment/Commands/ChecksRequireCommand.js +33 -0
  160. package/build/SubagentDrivenDevelopment/Commands/ClaimCommand.js +23 -0
  161. package/build/SubagentDrivenDevelopment/Commands/CorrectCommand.js +37 -0
  162. package/build/SubagentDrivenDevelopment/Commands/CreateCommand.js +26 -0
  163. package/build/SubagentDrivenDevelopment/Commands/FindingCreateCommand.js +39 -0
  164. package/build/SubagentDrivenDevelopment/Commands/FindingUpdateCommand.js +36 -0
  165. package/build/SubagentDrivenDevelopment/Commands/FinishCommand.js +23 -0
  166. package/build/SubagentDrivenDevelopment/Commands/ImplementCommand.js +23 -0
  167. package/build/SubagentDrivenDevelopment/Commands/NextCommand.js +21 -0
  168. package/build/SubagentDrivenDevelopment/Commands/ReadyCommand.js +21 -0
  169. package/build/SubagentDrivenDevelopment/Commands/RequirementsDecideCommand.js +33 -0
  170. package/build/SubagentDrivenDevelopment/Commands/ResumeCommand.js +31 -0
  171. package/build/SubagentDrivenDevelopment/Commands/ReviewCommand.js +55 -0
  172. package/build/SubagentDrivenDevelopment/Commands/ReviewRequireCommand.js +12 -0
  173. package/build/SubagentDrivenDevelopment/Commands/StatusCommand.js +21 -0
  174. package/build/SubagentDrivenDevelopment/Commands/SubmitCommand.js +59 -0
  175. package/build/SubagentDrivenDevelopment/Commands/TicketCommentCommand.js +24 -0
  176. package/build/SubagentDrivenDevelopment/Commands/TicketCreateCommand.js +25 -0
  177. package/build/SubagentDrivenDevelopment/Commands/TicketUpdateCommand.js +31 -0
  178. package/build/SubagentDrivenDevelopment/Commands/groups.js +36 -0
  179. package/build/SubagentDrivenDevelopment/Evidence/GitEvidence.js +449 -0
  180. package/build/SubagentDrivenDevelopment/Evidence/ReportEvidence.js +80 -0
  181. package/build/SubagentDrivenDevelopment/Models/Assignments.js +1 -0
  182. package/build/SubagentDrivenDevelopment/Models/Evidence.js +1 -0
  183. package/build/SubagentDrivenDevelopment/Models/Findings.js +1 -0
  184. package/build/SubagentDrivenDevelopment/Models/Options.js +1 -0
  185. package/build/SubagentDrivenDevelopment/Models/Workflow.js +16 -0
  186. package/build/SubagentDrivenDevelopment/Persistence/AssignmentSchema.js +155 -0
  187. package/build/SubagentDrivenDevelopment/Persistence/CheckSchema.js +71 -0
  188. package/build/SubagentDrivenDevelopment/Persistence/FeatureWorkspace.js +76 -0
  189. package/build/SubagentDrivenDevelopment/Persistence/FileSystem.js +28 -0
  190. package/build/SubagentDrivenDevelopment/Persistence/FindingSchema.js +81 -0
  191. package/build/SubagentDrivenDevelopment/Persistence/LedgerRepository.js +322 -0
  192. package/build/SubagentDrivenDevelopment/Persistence/PathSafety.js +62 -0
  193. package/build/SubagentDrivenDevelopment/Persistence/ProgressSchema.js +95 -0
  194. package/build/SubagentDrivenDevelopment/Persistence/ReadinessReader.js +40 -0
  195. package/build/SubagentDrivenDevelopment/Persistence/ReviewSchema.js +68 -0
  196. package/build/SubagentDrivenDevelopment/Persistence/TicketRepository.js +147 -0
  197. package/build/SubagentDrivenDevelopment/Persistence/WorkspaceTransaction.js +282 -0
  198. package/build/SubagentDrivenDevelopment/Policies/AcceptancePolicy.js +100 -0
  199. package/build/SubagentDrivenDevelopment/Policies/AssignmentPolicy.js +36 -0
  200. package/build/SubagentDrivenDevelopment/Policies/CheckPolicy.js +93 -0
  201. package/build/SubagentDrivenDevelopment/Policies/FindingPolicy.js +53 -0
  202. package/build/SubagentDrivenDevelopment/Policies/InputValidation.js +36 -0
  203. package/build/SubagentDrivenDevelopment/Policies/ReadinessPolicy.js +26 -0
  204. package/build/SubagentDrivenDevelopment/Policies/RequiredReviewers.js +12 -0
  205. package/build/SubagentDrivenDevelopment/Policies/ReviewPolicy.js +87 -0
  206. package/build/SubagentDrivenDevelopment/Policies/WorkflowPolicy.js +85 -0
  207. package/build/SubagentDrivenDevelopment/Services/AssignmentService.js +269 -0
  208. package/build/SubagentDrivenDevelopment/Services/ChecksService.js +319 -0
  209. package/build/SubagentDrivenDevelopment/Services/CorrectionService.js +273 -0
  210. package/build/SubagentDrivenDevelopment/Services/DeliveryCorrectionService.js +253 -0
  211. package/build/SubagentDrivenDevelopment/Services/DeliveryFindingService.js +302 -0
  212. package/build/SubagentDrivenDevelopment/Services/DeliveryService.js +160 -0
  213. package/build/SubagentDrivenDevelopment/Services/DeliverySubmissionService.js +273 -0
  214. package/build/SubagentDrivenDevelopment/Services/FeatureCreationService.js +138 -0
  215. package/build/SubagentDrivenDevelopment/Services/FeatureInspectionService.js +399 -0
  216. package/build/SubagentDrivenDevelopment/Services/FindingService.js +392 -0
  217. package/build/SubagentDrivenDevelopment/Services/IntegrationService.js +258 -0
  218. package/build/SubagentDrivenDevelopment/Services/ReadinessService.js +21 -0
  219. package/build/SubagentDrivenDevelopment/Services/RequirementsService.js +216 -0
  220. package/build/SubagentDrivenDevelopment/Services/ReviewService.js +471 -0
  221. package/build/SubagentDrivenDevelopment/Services/SubmissionService.js +299 -0
  222. package/build/SubagentDrivenDevelopment/Services/TicketService.js +186 -0
  223. package/build/SubagentDrivenDevelopment/SubagentDrivenDevelopmentServiceProvider.js +113 -0
  224. package/build/Support/Records.js +5 -0
  225. package/build/Support/Repository.js +139 -0
  226. package/build/Support/Stacks.js +10 -0
  227. package/build/TemplateRendering/Computed/ComputedContextService.js +13 -0
  228. package/build/TemplateRendering/Computed/ComputedVariableProvider.js +6 -0
  229. package/build/TemplateRendering/Computed/ComputedVariableProviders.js +6 -0
  230. package/build/TemplateRendering/Computed/Providers/InternalSkillDescriptionProvider.js +6 -0
  231. package/build/TemplateRendering/Computed/Providers/SpindlePackageManagerProvider.js +11 -0
  232. package/build/TemplateRendering/Computed/ResolveRenderContext.js +18 -0
  233. package/build/TemplateRendering/Rendering/RenderText.js +43 -0
  234. package/build/TemplateRendering/TemplateRenderingServiceProvider.js +8 -0
  235. package/build/Tooling/Commands/ToolingAddCommand.js +29 -0
  236. package/build/Tooling/Commands/ToolingListCommand.js +19 -0
  237. package/build/Tooling/Commands/ToolingRemoveCommand.js +19 -0
  238. package/build/Tooling/Commands/ToolingUpdateCommand.js +30 -0
  239. package/build/Tooling/Commands/groups.js +4 -0
  240. package/build/Tooling/Models/ToolingEntry.js +1 -0
  241. package/build/Tooling/Services/ToolingService.js +278 -0
  242. package/build/Tooling/ToolingServiceProvider.js +15 -0
  243. package/build/cli.js +36 -0
  244. package/build/index.js +31 -0
  245. package/package.json +54 -3
@@ -0,0 +1,21 @@
1
+ import { Service } from "../../Foundation/Service.js";
2
+ export class ReadinessService extends Service {
3
+ featureInspectionService;
4
+ reader;
5
+ policy;
6
+ pathSafety;
7
+ constructor(app, featureInspectionService, reader, policy, pathSafety) {
8
+ super(app);
9
+ this.featureInspectionService = featureInspectionService;
10
+ this.reader = reader;
11
+ this.policy = policy;
12
+ this.pathSafety = pathSafety;
13
+ }
14
+ ready(options) {
15
+ const feature = this.featureInspectionService.resolveFeature(options.spec);
16
+ const { tickets } = this.reader.read(feature);
17
+ const result = this.policy.evaluate(tickets);
18
+ this.pathSafety.assertReadyReadable(feature.workspace);
19
+ return result;
20
+ }
21
+ }
@@ -0,0 +1,216 @@
1
+ import matter from "gray-matter";
2
+ import { Service } from "../../Foundation/Service.js";
3
+ import { validateAuthor, validateTicketId, } from "../Policies/InputValidation.js";
4
+ export class RequirementsService extends Service {
5
+ gitEvidence;
6
+ ticketRepository;
7
+ ledgerRepository;
8
+ workspaceTransaction;
9
+ workflowPolicy;
10
+ featureInspectionService;
11
+ constructor(app, gitEvidence, ticketRepository, ledgerRepository, workspaceTransaction, workflowPolicy, featureInspectionService) {
12
+ super(app);
13
+ this.gitEvidence = gitEvidence;
14
+ this.ticketRepository = ticketRepository;
15
+ this.ledgerRepository = ledgerRepository;
16
+ this.workspaceTransaction = workspaceTransaction;
17
+ this.workflowPolicy = workflowPolicy;
18
+ this.featureInspectionService = featureInspectionService;
19
+ }
20
+ requirementsDecide(options) {
21
+ validateAuthor(options.author);
22
+ if (options.scope === "delivery") {
23
+ if (options.ticket)
24
+ throw new Error("--ticket and --scope delivery are mutually exclusive.");
25
+ return this.deliveryRequirementsDecide(options);
26
+ }
27
+ if (options.scope !== undefined)
28
+ throw new Error("--scope must be 'delivery'.");
29
+ if (!options.ticket)
30
+ throw new Error("requirements decide needs --ticket or --scope delivery.");
31
+ validateTicketId(options.ticket);
32
+ const ticketId = options.ticket;
33
+ if (!/^F-\d{4,}$/.test(options.finding)) {
34
+ throw new Error(`Invalid finding ID: ${options.finding}.`);
35
+ }
36
+ if (!["approved", "rejected"].includes(options.decision)) {
37
+ throw new Error(`Invalid requirements decision: ${options.decision}.`);
38
+ }
39
+ if (!options.details.trim())
40
+ throw new Error("Requirements decision details must not be empty.");
41
+ const feature = this.featureInspectionService.resolveFeature(options.spec);
42
+ return this.workspaceTransaction.run(feature.workspace, () => {
43
+ const ledger = this.ledgerRepository.readLedger(feature);
44
+ const ticket = this.ticketRepository.requireTicket(this.ticketRepository.readTickets(feature.workspace), ticketId);
45
+ const progress = this.workflowPolicy.requireProgress(ledger, ticketId);
46
+ if (progress.owner !== options.author.trim()) {
47
+ throw new Error("Only the current ticket controller may record a requirements decision.");
48
+ }
49
+ const finding = progress.findings?.find((candidate) => candidate.id === options.finding);
50
+ if (!finding)
51
+ throw new Error(`Finding not found: ${options.finding}.`);
52
+ if (!progress.baseSha) {
53
+ throw new Error("Requirements decisions require a recorded Git baseline.");
54
+ }
55
+ const identity = this.gitEvidence.contentIdentity(feature, ticket, progress.baseSha, progress.checks);
56
+ const decisions = (progress.requirementsDecisions ??= []);
57
+ const existing = decisions.find((decision) => decision.finding === finding.id &&
58
+ decision.status === options.decision &&
59
+ decision.details === options.details.trim() &&
60
+ decision.author === options.author.trim() &&
61
+ decision.requirementsSnapshot === identity.requirementsSnapshot);
62
+ if (existing) {
63
+ return {
64
+ ticket: ticketId,
65
+ execution: progress.execution,
66
+ decision: existing,
67
+ idempotent: true,
68
+ snapshot: identity.snapshot,
69
+ requirementsSnapshot: identity.requirementsSnapshot,
70
+ };
71
+ }
72
+ const priorAssignments = [
73
+ ...(progress.reviewHistory ?? []),
74
+ ...(progress.reviewAssignments ?? []),
75
+ ];
76
+ if (priorAssignments.every((assignment) => assignment.requirementsSnapshot === identity.requirementsSnapshot)) {
77
+ throw new Error("A requirements decision requires an explicit requirements change after review.");
78
+ }
79
+ if ((progress.reviewAssignments ?? []).some((assignment) => assignment.status === "pending")) {
80
+ throw new Error("Resolve pending review assignments before recording a requirements decision.");
81
+ }
82
+ let highest = 0n;
83
+ for (const decision of decisions) {
84
+ const match = /^R-(\d{4,})$/.exec(decision.id);
85
+ if (match && BigInt(match[1]) > highest)
86
+ highest = BigInt(match[1]);
87
+ }
88
+ const decision = {
89
+ id: `R-${String(highest + 1n).padStart(4, "0")}`,
90
+ finding: finding.id,
91
+ status: options.decision,
92
+ details: options.details.trim(),
93
+ author: options.author.trim(),
94
+ requirementsSnapshot: identity.requirementsSnapshot,
95
+ recordedAt: new Date().toISOString(),
96
+ };
97
+ decisions.push(decision);
98
+ if (decision.status === "approved") {
99
+ progress.reviewHistory = [
100
+ ...(progress.reviewHistory ?? []),
101
+ ...(progress.reviewAssignments ?? []),
102
+ ];
103
+ delete progress.reviewAssignments;
104
+ progress.execution = "reviewing";
105
+ }
106
+ const currentIdentity = this.gitEvidence.contentIdentity(feature, this.ticketRepository.requireTicket(this.ticketRepository.readTickets(feature.workspace), ticketId), progress.baseSha, progress.checks);
107
+ if (currentIdentity.snapshot !== identity.snapshot ||
108
+ currentIdentity.requirementsSnapshot !== identity.requirementsSnapshot) {
109
+ throw new Error("Ticket requirements changed while recording the requirements decision.");
110
+ }
111
+ const afterTicket = matter.stringify(this.ticketRepository.appendAudit(ticket.body, options.author, `[SDD-SCOPE-RULING id=${decision.id} status=${decision.status}] ${decision.details}.`), this.ticketRepository.metadata(ticket));
112
+ this.workspaceTransaction.writeWorkflowState(feature, ticket, afterTicket, ledger);
113
+ return {
114
+ ticket: ticketId,
115
+ execution: progress.execution,
116
+ decision,
117
+ snapshot: identity.snapshot,
118
+ requirementsSnapshot: identity.requirementsSnapshot,
119
+ };
120
+ });
121
+ }
122
+ deliveryRequirementsDecide(options) {
123
+ if (!/^F-\d{4,}$/.test(options.finding)) {
124
+ throw new Error(`Invalid finding ID: ${options.finding}.`);
125
+ }
126
+ if (!["approved", "rejected"].includes(options.decision)) {
127
+ throw new Error(`Invalid requirements decision: ${options.decision}.`);
128
+ }
129
+ const details = options.details.trim();
130
+ if (!details)
131
+ throw new Error("Requirements decision details must not be empty.");
132
+ const feature = this.featureInspectionService.resolveFeature(options.spec);
133
+ return this.workspaceTransaction.run(feature.workspace, () => {
134
+ const ledger = this.ledgerRepository.readLedger(feature);
135
+ const delivery = ledger.delivery;
136
+ if (delivery.owner !== options.author.trim()) {
137
+ throw new Error("Only the current delivery controller may record a requirements decision.");
138
+ }
139
+ const finding = delivery.findings?.find((candidate) => candidate.id === options.finding);
140
+ if (!finding)
141
+ throw new Error(`Delivery finding not found: ${options.finding}.`);
142
+ if (!delivery.baseSha) {
143
+ throw new Error("Delivery requirements decisions require a recorded Git baseline.");
144
+ }
145
+ const identity = this.gitEvidence.deliveryIdentity(feature, ledger, this.ticketRepository.readTickets(feature.workspace));
146
+ const decisions = (delivery.requirementsDecisions ??= []);
147
+ const existing = decisions.find((decision) => decision.finding === finding.id &&
148
+ decision.status === options.decision &&
149
+ decision.details === details &&
150
+ decision.author === options.author.trim() &&
151
+ decision.requirementsSnapshot === identity.requirementsSnapshot);
152
+ if (existing) {
153
+ return {
154
+ scope: "delivery",
155
+ execution: delivery.execution,
156
+ decision: existing,
157
+ idempotent: true,
158
+ snapshot: identity.snapshot,
159
+ requirementsSnapshot: identity.requirementsSnapshot,
160
+ };
161
+ }
162
+ const priorAssignments = [
163
+ ...(delivery.reviewHistory ?? []),
164
+ ...(delivery.reviewAssignments ?? []),
165
+ ];
166
+ if (priorAssignments.every((assignment) => assignment.requirementsSnapshot === identity.requirementsSnapshot)) {
167
+ throw new Error("A delivery requirements decision requires an explicit requirements change after review.");
168
+ }
169
+ if ((delivery.reviewAssignments ?? []).some((assignment) => assignment.status === "pending")) {
170
+ throw new Error("Resolve pending delivery review assignments before recording a requirements decision.");
171
+ }
172
+ let highest = 0n;
173
+ for (const decision of decisions) {
174
+ const match = /^R-(\d{4,})$/.exec(decision.id);
175
+ if (match && BigInt(match[1]) > highest)
176
+ highest = BigInt(match[1]);
177
+ }
178
+ const decision = {
179
+ id: `R-${String(highest + 1n).padStart(4, "0")}`,
180
+ finding: finding.id,
181
+ status: options.decision,
182
+ details,
183
+ author: options.author.trim(),
184
+ requirementsSnapshot: identity.requirementsSnapshot,
185
+ recordedAt: new Date().toISOString(),
186
+ };
187
+ decisions.push(decision);
188
+ if (decision.status === "approved") {
189
+ delivery.reviewHistory = [
190
+ ...(delivery.reviewHistory ?? []),
191
+ ...(delivery.reviewAssignments ?? []),
192
+ ];
193
+ delete delivery.reviewAssignments;
194
+ delivery.execution = "reviewing";
195
+ }
196
+ const confirmed = this.gitEvidence.deliveryIdentity(feature, ledger, this.ticketRepository.readTickets(feature.workspace));
197
+ if (confirmed.snapshot !== identity.snapshot ||
198
+ confirmed.requirementsSnapshot !== identity.requirementsSnapshot) {
199
+ throw new Error("Delivery requirements changed while recording the requirements decision.");
200
+ }
201
+ delivery.history.push({
202
+ at: new Date().toISOString(),
203
+ author: options.author.trim(),
204
+ action: `requirements-${decision.status}:${decision.id}`,
205
+ });
206
+ this.workspaceTransaction.writeLedger(feature, ledger);
207
+ return {
208
+ scope: "delivery",
209
+ execution: delivery.execution,
210
+ decision,
211
+ snapshot: identity.snapshot,
212
+ requirementsSnapshot: identity.requirementsSnapshot,
213
+ };
214
+ });
215
+ }
216
+ }