@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.
- package/CHANGELOG.md +1016 -0
- package/README.md +148 -0
- package/bin/specgate.js +2 -0
- package/bin/specgate.ts +383 -0
- package/dist/bin/specgate.js +342 -0
- package/dist/bin/specgate.js.map +1 -0
- package/dist/packages/core/src/application/AddRequirementUseCase.js +24 -0
- package/dist/packages/core/src/application/AddRequirementUseCase.js.map +1 -0
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js +185 -0
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js.map +1 -0
- package/dist/packages/core/src/application/CheckAgainstLockUseCase.js +134 -0
- package/dist/packages/core/src/application/CheckAgainstLockUseCase.js.map +1 -0
- package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js +25 -0
- package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js.map +1 -0
- package/dist/packages/core/src/application/GeneratePlanUseCase.js +135 -0
- package/dist/packages/core/src/application/GeneratePlanUseCase.js.map +1 -0
- package/dist/packages/core/src/application/LinkRequirementUseCase.js +25 -0
- package/dist/packages/core/src/application/LinkRequirementUseCase.js.map +1 -0
- package/dist/packages/core/src/application/RemovePackUseCase.js +28 -0
- package/dist/packages/core/src/application/RemovePackUseCase.js.map +1 -0
- package/dist/packages/core/src/application/UpdateRequirementStatusUseCase.js +37 -0
- package/dist/packages/core/src/application/UpdateRequirementStatusUseCase.js.map +1 -0
- package/dist/packages/core/src/application/ValidateChangeUseCase.js +86 -0
- package/dist/packages/core/src/application/ValidateChangeUseCase.js.map +1 -0
- package/dist/packages/core/src/application/ValidateProjectUseCase.js +101 -0
- package/dist/packages/core/src/application/ValidateProjectUseCase.js.map +1 -0
- package/dist/packages/core/src/application/ports/IDomainPackRepository.js +3 -0
- package/dist/packages/core/src/application/ports/IDomainPackRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/IHarnessConfigRepository.js +3 -0
- package/dist/packages/core/src/application/ports/IHarnessConfigRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/ILockfileRepository.js +3 -0
- package/dist/packages/core/src/application/ports/ILockfileRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/IManifestRepository.js +3 -0
- package/dist/packages/core/src/application/ports/IManifestRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/IProjectRepository.js +3 -0
- package/dist/packages/core/src/application/ports/IProjectRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/IRequirementGraphRepository.js +3 -0
- package/dist/packages/core/src/application/ports/IRequirementGraphRepository.js.map +1 -0
- package/dist/packages/core/src/application/ports/ITraceabilityRepository.js +3 -0
- package/dist/packages/core/src/application/ports/ITraceabilityRepository.js.map +1 -0
- package/dist/packages/core/src/domain/AgentPrompt.js +79 -0
- package/dist/packages/core/src/domain/AgentPrompt.js.map +1 -0
- package/dist/packages/core/src/domain/ArchivePlan.js +26 -0
- package/dist/packages/core/src/domain/ArchivePlan.js.map +1 -0
- package/dist/packages/core/src/domain/AuthoringScope.js +48 -0
- package/dist/packages/core/src/domain/AuthoringScope.js.map +1 -0
- package/dist/packages/core/src/domain/ChangeTemplates.js +133 -0
- package/dist/packages/core/src/domain/ChangeTemplates.js.map +1 -0
- package/dist/packages/core/src/domain/CucumberMessages.js +256 -0
- package/dist/packages/core/src/domain/CucumberMessages.js.map +1 -0
- package/dist/packages/core/src/domain/DeclaredArtifacts.js +117 -0
- package/dist/packages/core/src/domain/DeclaredArtifacts.js.map +1 -0
- package/dist/packages/core/src/domain/DeltaSpec.js +219 -0
- package/dist/packages/core/src/domain/DeltaSpec.js.map +1 -0
- package/dist/packages/core/src/domain/Diagnostic.js +75 -0
- package/dist/packages/core/src/domain/Diagnostic.js.map +1 -0
- package/dist/packages/core/src/domain/DomainPack.js +62 -0
- package/dist/packages/core/src/domain/DomainPack.js.map +1 -0
- package/dist/packages/core/src/domain/EmptyAttempt.js +60 -0
- package/dist/packages/core/src/domain/EmptyAttempt.js.map +1 -0
- package/dist/packages/core/src/domain/FileChangeSet.js +37 -0
- package/dist/packages/core/src/domain/FileChangeSet.js.map +1 -0
- package/dist/packages/core/src/domain/Gherkin.js +272 -0
- package/dist/packages/core/src/domain/Gherkin.js.map +1 -0
- package/dist/packages/core/src/domain/GherkinDialects.js +97 -0
- package/dist/packages/core/src/domain/GherkinDialects.js.map +1 -0
- package/dist/packages/core/src/domain/GherkinQuality.js +160 -0
- package/dist/packages/core/src/domain/GherkinQuality.js.map +1 -0
- package/dist/packages/core/src/domain/GherkinTags.js +119 -0
- package/dist/packages/core/src/domain/GherkinTags.js.map +1 -0
- package/dist/packages/core/src/domain/GitSafety.js +77 -0
- package/dist/packages/core/src/domain/GitSafety.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessConfig.js +58 -0
- package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessReport.js +162 -0
- package/dist/packages/core/src/domain/HarnessReport.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessRun.js +154 -0
- package/dist/packages/core/src/domain/HarnessRun.js.map +1 -0
- package/dist/packages/core/src/domain/InboundChange.js +127 -0
- package/dist/packages/core/src/domain/InboundChange.js.map +1 -0
- package/dist/packages/core/src/domain/Language.js +112 -0
- package/dist/packages/core/src/domain/Language.js.map +1 -0
- package/dist/packages/core/src/domain/Lockfile.js +64 -0
- package/dist/packages/core/src/domain/Lockfile.js.map +1 -0
- package/dist/packages/core/src/domain/PackContribution.js +106 -0
- package/dist/packages/core/src/domain/PackContribution.js.map +1 -0
- package/dist/packages/core/src/domain/PackDelta.js +298 -0
- package/dist/packages/core/src/domain/PackDelta.js.map +1 -0
- package/dist/packages/core/src/domain/PackSpec.js +481 -0
- package/dist/packages/core/src/domain/PackSpec.js.map +1 -0
- package/dist/packages/core/src/domain/ProfileMatch.js +87 -0
- package/dist/packages/core/src/domain/ProfileMatch.js.map +1 -0
- package/dist/packages/core/src/domain/Reconciliation.js +72 -0
- package/dist/packages/core/src/domain/Reconciliation.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementGraph.js +197 -0
- package/dist/packages/core/src/domain/RequirementGraph.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementPlan.js +85 -0
- package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementReadiness.js +115 -0
- package/dist/packages/core/src/domain/RequirementReadiness.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementSyntax.js +91 -0
- package/dist/packages/core/src/domain/RequirementSyntax.js.map +1 -0
- package/dist/packages/core/src/domain/ResumeState.js +115 -0
- package/dist/packages/core/src/domain/ResumeState.js.map +1 -0
- package/dist/packages/core/src/domain/RunBudget.js +103 -0
- package/dist/packages/core/src/domain/RunBudget.js.map +1 -0
- package/dist/packages/core/src/domain/SpecDiff.js +48 -0
- package/dist/packages/core/src/domain/SpecDiff.js.map +1 -0
- package/dist/packages/core/src/domain/SpecParser.js +406 -0
- package/dist/packages/core/src/domain/SpecParser.js.map +1 -0
- package/dist/packages/core/src/domain/SpecopsManifest.js +90 -0
- package/dist/packages/core/src/domain/SpecopsManifest.js.map +1 -0
- package/dist/packages/core/src/domain/TraceabilityFormat.js +317 -0
- package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -0
- package/dist/packages/core/src/domain/TraceabilityMatrix.js +200 -0
- package/dist/packages/core/src/domain/TraceabilityMatrix.js.map +1 -0
- package/dist/packages/core/src/domain/TraceabilityMerge.js +180 -0
- package/dist/packages/core/src/domain/TraceabilityMerge.js.map +1 -0
- package/dist/packages/core/src/domain/ValidationReport.js +53 -0
- package/dist/packages/core/src/domain/ValidationReport.js.map +1 -0
- package/dist/packages/core/src/domain/ValueAnnotations.js +138 -0
- package/dist/packages/core/src/domain/ValueAnnotations.js.map +1 -0
- package/dist/packages/core/src/domain/WriteScope.js +155 -0
- package/dist/packages/core/src/domain/WriteScope.js.map +1 -0
- package/dist/packages/core/src/domain/YamlLite.js +226 -0
- package/dist/packages/core/src/domain/YamlLite.js.map +1 -0
- package/dist/packages/core/src/index.js +120 -0
- package/dist/packages/core/src/index.js.map +1 -0
- package/dist/packages/core/src/infrastructure/ChangeWorkspace.js +276 -0
- package/dist/packages/core/src/infrastructure/ChangeWorkspace.js.map +1 -0
- package/dist/packages/core/src/infrastructure/ConsoleReporter.js +19 -0
- package/dist/packages/core/src/infrastructure/ConsoleReporter.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DirectorySnapshot.js +106 -0
- package/dist/packages/core/src/infrastructure/DirectorySnapshot.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskDomainPackRepository.js +57 -0
- package/dist/packages/core/src/infrastructure/DiskDomainPackRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskHarnessConfigRepository.js +58 -0
- package/dist/packages/core/src/infrastructure/DiskHarnessConfigRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js +69 -0
- package/dist/packages/core/src/infrastructure/DiskLanguageRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskLockfileRepository.js +64 -0
- package/dist/packages/core/src/infrastructure/DiskLockfileRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskManifestRepository.js +88 -0
- package/dist/packages/core/src/infrastructure/DiskManifestRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js +138 -0
- package/dist/packages/core/src/infrastructure/DiskPackDeltaRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskPackRepository.js +130 -0
- package/dist/packages/core/src/infrastructure/DiskPackRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskProjectRepository.js +127 -0
- package/dist/packages/core/src/infrastructure/DiskProjectRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskRequirementGraphRepository.js +124 -0
- package/dist/packages/core/src/infrastructure/DiskRequirementGraphRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/DiskTraceabilityRepository.js +53 -0
- package/dist/packages/core/src/infrastructure/DiskTraceabilityRepository.js.map +1 -0
- package/dist/packages/core/src/infrastructure/GitContributionStager.js +99 -0
- package/dist/packages/core/src/infrastructure/GitContributionStager.js.map +1 -0
- package/dist/packages/core/src/infrastructure/GitMergeDriver.js +103 -0
- package/dist/packages/core/src/infrastructure/GitMergeDriver.js.map +1 -0
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +348 -0
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -0
- package/dist/packages/core/src/infrastructure/PackChangeDeposit.js +106 -0
- package/dist/packages/core/src/infrastructure/PackChangeDeposit.js.map +1 -0
- package/dist/packages/core/src/infrastructure/RemotePackResolver.js +181 -0
- package/dist/packages/core/src/infrastructure/RemotePackResolver.js.map +1 -0
- package/dist/packages/core/src/infrastructure/SpecopsConfigFile.js +94 -0
- package/dist/packages/core/src/infrastructure/SpecopsConfigFile.js.map +1 -0
- package/dist/packages/core/test/unit/authoring-scope.test.js +102 -0
- package/dist/packages/core/test/unit/authoring-scope.test.js.map +1 -0
- package/dist/packages/core/test/unit/change-templates.test.js +96 -0
- package/dist/packages/core/test/unit/change-templates.test.js.map +1 -0
- package/dist/packages/core/test/unit/cucumber-messages.test.js +232 -0
- package/dist/packages/core/test/unit/cucumber-messages.test.js.map +1 -0
- package/dist/packages/core/test/unit/declared-artifacts.test.js +124 -0
- package/dist/packages/core/test/unit/declared-artifacts.test.js.map +1 -0
- package/dist/packages/core/test/unit/empty-attempt.test.js +79 -0
- package/dist/packages/core/test/unit/empty-attempt.test.js.map +1 -0
- package/dist/packages/core/test/unit/gherkin-dialects.test.js +115 -0
- package/dist/packages/core/test/unit/gherkin-dialects.test.js.map +1 -0
- package/dist/packages/core/test/unit/gherkin-keyword-case.test.js +110 -0
- package/dist/packages/core/test/unit/gherkin-keyword-case.test.js.map +1 -0
- package/dist/packages/core/test/unit/gherkin-quality.test.js +151 -0
- package/dist/packages/core/test/unit/gherkin-quality.test.js.map +1 -0
- package/dist/packages/core/test/unit/gherkin-tags.test.js +127 -0
- package/dist/packages/core/test/unit/gherkin-tags.test.js.map +1 -0
- package/dist/packages/core/test/unit/git-safety.test.js +104 -0
- package/dist/packages/core/test/unit/git-safety.test.js.map +1 -0
- package/dist/packages/core/test/unit/harness-report.test.js +192 -0
- package/dist/packages/core/test/unit/harness-report.test.js.map +1 -0
- package/dist/packages/core/test/unit/harness-roles.test.js +86 -0
- package/dist/packages/core/test/unit/harness-roles.test.js.map +1 -0
- package/dist/packages/core/test/unit/inbound-change.test.js +145 -0
- package/dist/packages/core/test/unit/inbound-change.test.js.map +1 -0
- package/dist/packages/core/test/unit/matrix-dependencies.test.js +100 -0
- package/dist/packages/core/test/unit/matrix-dependencies.test.js.map +1 -0
- package/dist/packages/core/test/unit/profile-match.test.js +115 -0
- package/dist/packages/core/test/unit/profile-match.test.js.map +1 -0
- package/dist/packages/core/test/unit/reconciliation.test.js +112 -0
- package/dist/packages/core/test/unit/reconciliation.test.js.map +1 -0
- package/dist/packages/core/test/unit/requirement-readiness.test.js +161 -0
- package/dist/packages/core/test/unit/requirement-readiness.test.js.map +1 -0
- package/dist/packages/core/test/unit/resume-state.test.js +124 -0
- package/dist/packages/core/test/unit/resume-state.test.js.map +1 -0
- package/dist/packages/core/test/unit/run-budget.test.js +113 -0
- package/dist/packages/core/test/unit/run-budget.test.js.map +1 -0
- package/dist/packages/core/test/unit/traceability-merge.test.js +159 -0
- package/dist/packages/core/test/unit/traceability-merge.test.js.map +1 -0
- package/dist/packages/core/test/unit/validate-project.test.js +156 -0
- package/dist/packages/core/test/unit/validate-project.test.js.map +1 -0
- package/dist/packages/core/test/unit/value-annotations.test.js +149 -0
- package/dist/packages/core/test/unit/value-annotations.test.js.map +1 -0
- package/dist/packages/core/test/unit/write-scope.test.js +165 -0
- package/dist/packages/core/test/unit/write-scope.test.js.map +1 -0
- package/dist/packages/core/test/unit/yaml-lite.test.js +78 -0
- package/dist/packages/core/test/unit/yaml-lite.test.js.map +1 -0
- package/dist/scripts/adopt_project.js +11 -0
- package/dist/scripts/adopt_project.js.map +1 -0
- package/dist/scripts/agents/commands.js +100 -0
- package/dist/scripts/agents/commands.js.map +1 -0
- package/dist/scripts/agents/init.js +482 -0
- package/dist/scripts/agents/init.js.map +1 -0
- package/dist/scripts/alm/cli.js +154 -0
- package/dist/scripts/alm/cli.js.map +1 -0
- package/dist/scripts/alm/clients.js +30 -0
- package/dist/scripts/alm/clients.js.map +1 -0
- package/dist/scripts/alm/core.js +258 -0
- package/dist/scripts/alm/core.js.map +1 -0
- package/dist/scripts/alm/port.js +116 -0
- package/dist/scripts/alm/port.js.map +1 -0
- package/dist/scripts/alm/providers/azure.js +79 -0
- package/dist/scripts/alm/providers/azure.js.map +1 -0
- package/dist/scripts/alm/providers/github.js +124 -0
- package/dist/scripts/alm/providers/github.js.map +1 -0
- package/dist/scripts/alm/providers/http-client.js +47 -0
- package/dist/scripts/alm/providers/http-client.js.map +1 -0
- package/dist/scripts/alm/providers/index.js +107 -0
- package/dist/scripts/alm/providers/index.js.map +1 -0
- package/dist/scripts/alm/providers/jira.js +129 -0
- package/dist/scripts/alm/providers/jira.js.map +1 -0
- package/dist/scripts/bundle_pack.js +10 -0
- package/dist/scripts/bundle_pack.js.map +1 -0
- package/dist/scripts/change/archive.js +68 -0
- package/dist/scripts/change/archive.js.map +1 -0
- package/dist/scripts/change/artifacts.js +143 -0
- package/dist/scripts/change/artifacts.js.map +1 -0
- package/dist/scripts/change/cli.js +39 -0
- package/dist/scripts/change/cli.js.map +1 -0
- package/dist/scripts/change/delta.js +20 -0
- package/dist/scripts/change/delta.js.map +1 -0
- package/dist/scripts/change/instructions.js +339 -0
- package/dist/scripts/change/instructions.js.map +1 -0
- package/dist/scripts/ci_init.js +12 -0
- package/dist/scripts/ci_init.js.map +1 -0
- package/dist/scripts/cli/commands/alm/PullCommand.js +238 -0
- package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -0
- package/dist/scripts/cli/commands/change/ChangeCommand.js +867 -0
- package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -0
- package/dist/scripts/cli/commands/config/CiInitCommand.js +144 -0
- package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -0
- package/dist/scripts/cli/commands/config/CompletionCommand.js +160 -0
- package/dist/scripts/cli/commands/config/CompletionCommand.js.map +1 -0
- package/dist/scripts/cli/commands/config/ConfigInitCommand.js +108 -0
- package/dist/scripts/cli/commands/config/ConfigInitCommand.js.map +1 -0
- package/dist/scripts/cli/commands/config/ConfigSetCommand.js +166 -0
- package/dist/scripts/cli/commands/config/ConfigSetCommand.js.map +1 -0
- package/dist/scripts/cli/commands/config/GenAgentContractCommand.js +212 -0
- package/dist/scripts/cli/commands/config/GenAgentContractCommand.js.map +1 -0
- package/dist/scripts/cli/commands/harness/RunCommand.js +1922 -0
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -0
- package/dist/scripts/cli/commands/mcp/McpInstallCommand.js +114 -0
- package/dist/scripts/cli/commands/mcp/McpInstallCommand.js.map +1 -0
- package/dist/scripts/cli/commands/mcp/index.js +29 -0
- package/dist/scripts/cli/commands/mcp/index.js.map +1 -0
- package/dist/scripts/cli/commands/pack/BundlePackCommand.js +59 -0
- package/dist/scripts/cli/commands/pack/BundlePackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +559 -0
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/pack/InferPackCommand.js +304 -0
- package/dist/scripts/cli/commands/pack/InferPackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/pack/InitPackCommand.js +368 -0
- package/dist/scripts/cli/commands/pack/InitPackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/pack/LintPackCommand.js +631 -0
- package/dist/scripts/cli/commands/pack/LintPackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/pack/pack-args.js +83 -0
- package/dist/scripts/cli/commands/pack/pack-args.js.map +1 -0
- package/dist/scripts/cli/commands/project/AdoptCommand.js +414 -0
- package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/InitFromPackCommand.js +188 -0
- package/dist/scripts/cli/commands/project/InitFromPackCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/InitProjectCommand.js +791 -0
- package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/OnboardCommand.js +655 -0
- package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/UpdateCommand.js +206 -0
- package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/WizardCommand.js +166 -0
- package/dist/scripts/cli/commands/project/WizardCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/DoctorCommand.js +553 -0
- package/dist/scripts/cli/commands/quality/DoctorCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/FixCommand.js +201 -0
- package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/LicenseCheckCommand.js +187 -0
- package/dist/scripts/cli/commands/quality/LicenseCheckCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/ReportCommand.js +557 -0
- package/dist/scripts/cli/commands/quality/ReportCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +764 -0
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/DoneCommand.js +116 -0
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/PlanCommand.js +397 -0
- package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/ReqCommand.js +303 -0
- package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/StatusCommand.js +206 -0
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/StudioCommand.js +241 -0
- package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -0
- package/dist/scripts/cli/commands/specops/ContributeCommand.js +313 -0
- package/dist/scripts/cli/commands/specops/ContributeCommand.js.map +1 -0
- package/dist/scripts/cli/commands/specops/DiffCommand.js +394 -0
- package/dist/scripts/cli/commands/specops/DiffCommand.js.map +1 -0
- package/dist/scripts/cli/commands/specops/SyncCommand.js +380 -0
- package/dist/scripts/cli/commands/specops/SyncCommand.js.map +1 -0
- package/dist/scripts/completion.js +24 -0
- package/dist/scripts/completion.js.map +1 -0
- package/dist/scripts/config_init.js +12 -0
- package/dist/scripts/config_init.js.map +1 -0
- package/dist/scripts/config_set.js +20 -0
- package/dist/scripts/config_set.js.map +1 -0
- package/dist/scripts/docs/blocks.js +137 -0
- package/dist/scripts/docs/blocks.js.map +1 -0
- package/dist/scripts/docs/build-site.js +425 -0
- package/dist/scripts/docs/build-site.js.map +1 -0
- package/dist/scripts/docs/nav.js +198 -0
- package/dist/scripts/docs/nav.js.map +1 -0
- package/dist/scripts/docs/record-terminal.js +477 -0
- package/dist/scripts/docs/record-terminal.js.map +1 -0
- package/dist/scripts/docs/terminal-storyboard.js +121 -0
- package/dist/scripts/docs/terminal-storyboard.js.map +1 -0
- package/dist/scripts/doctor.js +14 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/done.js +17 -0
- package/dist/scripts/done.js.map +1 -0
- package/dist/scripts/expand_domain_pack.js +18 -0
- package/dist/scripts/expand_domain_pack.js.map +1 -0
- package/dist/scripts/fix.js +12 -0
- package/dist/scripts/fix.js.map +1 -0
- package/dist/scripts/gen_agent_contract.js +14 -0
- package/dist/scripts/gen_agent_contract.js.map +1 -0
- package/dist/scripts/gen_mcp_tools.js +264 -0
- package/dist/scripts/gen_mcp_tools.js.map +1 -0
- package/dist/scripts/harness/init.js +358 -0
- package/dist/scripts/harness/init.js.map +1 -0
- package/dist/scripts/harness/prompt.js +18 -0
- package/dist/scripts/harness/prompt.js.map +1 -0
- package/dist/scripts/harness/report.js +323 -0
- package/dist/scripts/harness/report.js.map +1 -0
- package/dist/scripts/harness/run.js +33 -0
- package/dist/scripts/harness/run.js.map +1 -0
- package/dist/scripts/infer_pack.js +17 -0
- package/dist/scripts/infer_pack.js.map +1 -0
- package/dist/scripts/init_from_pack.js +16 -0
- package/dist/scripts/init_from_pack.js.map +1 -0
- package/dist/scripts/init_pack.js +16 -0
- package/dist/scripts/init_pack.js.map +1 -0
- package/dist/scripts/init_project.js +17 -0
- package/dist/scripts/init_project.js.map +1 -0
- package/dist/scripts/lib/agent.js +99 -0
- package/dist/scripts/lib/agent.js.map +1 -0
- package/dist/scripts/lib/capability-specs.js +80 -0
- package/dist/scripts/lib/capability-specs.js.map +1 -0
- package/dist/scripts/lib/command.js +17 -0
- package/dist/scripts/lib/command.js.map +1 -0
- package/dist/scripts/lib/diagnostics.js +62 -0
- package/dist/scripts/lib/diagnostics.js.map +1 -0
- package/dist/scripts/lib/monorepo-fanout.js +118 -0
- package/dist/scripts/lib/monorepo-fanout.js.map +1 -0
- package/dist/scripts/lib/placeholders.js +190 -0
- package/dist/scripts/lib/placeholders.js.map +1 -0
- package/dist/scripts/lib/project-root.js +124 -0
- package/dist/scripts/lib/project-root.js.map +1 -0
- package/dist/scripts/lib/requirement-graph.js +31 -0
- package/dist/scripts/lib/requirement-graph.js.map +1 -0
- package/dist/scripts/lib/surface.js +609 -0
- package/dist/scripts/lib/surface.js.map +1 -0
- package/dist/scripts/license_check.js +15 -0
- package/dist/scripts/license_check.js.map +1 -0
- package/dist/scripts/lint_pack.js +18 -0
- package/dist/scripts/lint_pack.js.map +1 -0
- package/dist/scripts/merge-traceability.js +106 -0
- package/dist/scripts/merge-traceability.js.map +1 -0
- package/dist/scripts/onboard.js +22 -0
- package/dist/scripts/onboard.js.map +1 -0
- package/dist/scripts/plan.js +17 -0
- package/dist/scripts/plan.js.map +1 -0
- package/dist/scripts/plugin/gate-hook.js +171 -0
- package/dist/scripts/plugin/gate-hook.js.map +1 -0
- package/dist/scripts/report.js +17 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/req.js +22 -0
- package/dist/scripts/req.js.map +1 -0
- package/dist/scripts/schema/cli.js +215 -0
- package/dist/scripts/schema/cli.js.map +1 -0
- package/dist/scripts/schema/registry.js +264 -0
- package/dist/scripts/schema/registry.js.map +1 -0
- package/dist/scripts/specops/add.js +180 -0
- package/dist/scripts/specops/add.js.map +1 -0
- package/dist/scripts/specops/against_lock.js +100 -0
- package/dist/scripts/specops/against_lock.js.map +1 -0
- package/dist/scripts/specops/as_change.js +49 -0
- package/dist/scripts/specops/as_change.js.map +1 -0
- package/dist/scripts/specops/contribute.js +24 -0
- package/dist/scripts/specops/contribute.js.map +1 -0
- package/dist/scripts/specops/diff.js +32 -0
- package/dist/scripts/specops/diff.js.map +1 -0
- package/dist/scripts/specops/lock.js +39 -0
- package/dist/scripts/specops/lock.js.map +1 -0
- package/dist/scripts/specops/manifest.js +90 -0
- package/dist/scripts/specops/manifest.js.map +1 -0
- package/dist/scripts/specops/remove.js +102 -0
- package/dist/scripts/specops/remove.js.map +1 -0
- package/dist/scripts/specops/sync.js +27 -0
- package/dist/scripts/specops/sync.js.map +1 -0
- package/dist/scripts/specops/verify.js +149 -0
- package/dist/scripts/specops/verify.js.map +1 -0
- package/dist/scripts/status.js +17 -0
- package/dist/scripts/status.js.map +1 -0
- package/dist/scripts/studio.js +14 -0
- package/dist/scripts/studio.js.map +1 -0
- package/dist/scripts/update.js +17 -0
- package/dist/scripts/update.js.map +1 -0
- package/dist/scripts/validate_specs.js +10 -0
- package/dist/scripts/validate_specs.js.map +1 -0
- package/examples/project.config.example +19 -0
- package/examples/project.yaml.example +17 -0
- package/package.json +105 -0
- package/templates/adopt/AI_RULES.md.tpl +27 -0
- package/templates/adopt/adr-readme.md.tpl +5 -0
- package/templates/adopt/baseline.feature.tpl +9 -0
- package/templates/adopt/spec.md.tpl +25 -0
- package/templates/adopt/traceability.md.tpl +11 -0
- package/templates/backend/AI_RULES.md.tpl +35 -0
- package/templates/backend/features/core/health.feature.tpl +7 -0
- package/templates/base/.devcontainer/devcontainer.json.tpl +18 -0
- package/templates/base/.dockerignore.tpl +11 -0
- package/templates/base/.env.dev.app.tpl +13 -0
- package/templates/base/.env.dev.infra.tpl +6 -0
- package/templates/base/.env.dev.tpl +16 -0
- package/templates/base/.env.example.tpl +17 -0
- package/templates/base/.env.feature.app.tpl +11 -0
- package/templates/base/.env.feature.infra.tpl +4 -0
- package/templates/base/.env.feature.tpl +16 -0
- package/templates/base/.env.prod.app.tpl +13 -0
- package/templates/base/.env.prod.infra.tpl +6 -0
- package/templates/base/.env.prod.tpl +16 -0
- package/templates/base/.github/workflows/specs.yml.tpl +26 -0
- package/templates/base/.gitignore.tpl +9 -0
- package/templates/base/.pre-commit-config.yaml.tpl +10 -0
- package/templates/base/AGENTS.md.tpl +32 -0
- package/templates/base/README.md.tpl +32 -0
- package/templates/base/docker-compose.yml.tpl +13 -0
- package/templates/base/docs/specs/adr/README.md.tpl +10 -0
- package/templates/base/docs/specs/aggregates.md.tpl +5 -0
- package/templates/base/docs/specs/commands.md.tpl +13 -0
- package/templates/base/docs/specs/domain-model.md.tpl +30 -0
- package/templates/base/docs/specs/events.md.tpl +5 -0
- package/templates/base/docs/specs/review-checklist.md.tpl +18 -0
- package/templates/base/docs/specs/runtime-environments.md.tpl +26 -0
- package/templates/base/docs/specs/status-model.md.tpl +16 -0
- package/templates/base/docs/specs/traceability.md.tpl +7 -0
- package/templates/base/docs/specs/use-cases.md.tpl +5 -0
- package/templates/base/spec.md.tpl +63 -0
- package/templates/ci/azure.yml.tpl +40 -0
- package/templates/ci/github.yml.tpl +40 -0
- package/templates/ci/gitlab.yml.tpl +21 -0
- package/templates/ci/jenkins.tpl +35 -0
- package/templates/contracts/AI_RULES.md.tpl +55 -0
- package/templates/contracts/asyncapi-stub.yaml.tpl +24 -0
- package/templates/contracts/contract-traceability.md.tpl +10 -0
- package/templates/contracts/openapi-stub.yaml.tpl +29 -0
- package/templates/contracts/pacts-gitkeep.tpl +0 -0
- package/templates/contracts/test-strategy.md.tpl +94 -0
- package/templates/frontend/AI_RULES.md.tpl +34 -0
- package/templates/frontend/features/core/health.feature.tpl +6 -0
- package/templates/harness/harness.config.yaml.tpl +74 -0
- package/templates/harness/prompt-prefix.md.tpl +60 -0
- package/templates/mobile/AI_RULES.md.tpl +56 -0
- package/templates/mobile/features/core/health.feature.tpl +7 -0
- package/templates/modules/auth/backend/registration_and_login.feature.tpl +10 -0
- package/templates/modules/auth/frontend/login.feature.tpl +5 -0
- package/templates/modules/billing/backend/billing_settlement.feature.tpl +5 -0
- package/templates/modules/billing/frontend/billing_summary.feature.tpl +5 -0
- package/templates/modules/dashboard/backend/dashboard_kpi.feature.tpl +5 -0
- package/templates/modules/dashboard/frontend/dashboard.feature.tpl +5 -0
- package/vendor/mermaid.min.js +3636 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.summarise = exports.isAllowed = exports.alternatives = exports.licenseOf = exports.ALLOWED = exports.LicenseCheckCommand = void 0;
|
|
5
|
+
const LicenseCheckCommand_1 = require("./cli/commands/quality/LicenseCheckCommand");
|
|
6
|
+
Object.defineProperty(exports, "LicenseCheckCommand", { enumerable: true, get: function () { return LicenseCheckCommand_1.LicenseCheckCommand; } });
|
|
7
|
+
Object.defineProperty(exports, "ALLOWED", { enumerable: true, get: function () { return LicenseCheckCommand_1.ALLOWED; } });
|
|
8
|
+
Object.defineProperty(exports, "licenseOf", { enumerable: true, get: function () { return LicenseCheckCommand_1.licenseOf; } });
|
|
9
|
+
Object.defineProperty(exports, "alternatives", { enumerable: true, get: function () { return LicenseCheckCommand_1.alternatives; } });
|
|
10
|
+
Object.defineProperty(exports, "isAllowed", { enumerable: true, get: function () { return LicenseCheckCommand_1.isAllowed; } });
|
|
11
|
+
Object.defineProperty(exports, "summarise", { enumerable: true, get: function () { return LicenseCheckCommand_1.summarise; } });
|
|
12
|
+
if (require.main === module) {
|
|
13
|
+
new LicenseCheckCommand_1.LicenseCheckCommand(process.argv.slice(2)).execute();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=license_check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license_check.js","sourceRoot":"","sources":["../../scripts/license_check.ts"],"names":[],"mappings":";;;;AACA,oFAOoD;AAE3C,oGARP,yCAAmB,OAQO;AAAE,wFAP5B,6BAAO,OAO4B;AAAE,0FANrC,+BAAS,OAMqC;AAAE,6FALhD,kCAAY,OAKgD;AAAE,0FAJ9D,+BAAS,OAI8D;AAAE,0FAHzE,+BAAS,OAGyE;AAEpF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,yCAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.renderDot = exports.renderMermaid = exports.buildPackGraph = exports.runLint = exports.lintScenarioQuality = exports.isGenericTitle = exports.parseFeature = exports.parseArgs = exports.LintPackCommand = void 0;
|
|
5
|
+
const LintPackCommand_1 = require("./cli/commands/pack/LintPackCommand");
|
|
6
|
+
Object.defineProperty(exports, "LintPackCommand", { enumerable: true, get: function () { return LintPackCommand_1.LintPackCommand; } });
|
|
7
|
+
Object.defineProperty(exports, "parseArgs", { enumerable: true, get: function () { return LintPackCommand_1.parseArgs; } });
|
|
8
|
+
Object.defineProperty(exports, "parseFeature", { enumerable: true, get: function () { return LintPackCommand_1.parseFeature; } });
|
|
9
|
+
Object.defineProperty(exports, "isGenericTitle", { enumerable: true, get: function () { return LintPackCommand_1.isGenericTitle; } });
|
|
10
|
+
Object.defineProperty(exports, "lintScenarioQuality", { enumerable: true, get: function () { return LintPackCommand_1.lintScenarioQuality; } });
|
|
11
|
+
Object.defineProperty(exports, "runLint", { enumerable: true, get: function () { return LintPackCommand_1.runLint; } });
|
|
12
|
+
Object.defineProperty(exports, "buildPackGraph", { enumerable: true, get: function () { return LintPackCommand_1.buildPackGraph; } });
|
|
13
|
+
Object.defineProperty(exports, "renderMermaid", { enumerable: true, get: function () { return LintPackCommand_1.renderMermaid; } });
|
|
14
|
+
Object.defineProperty(exports, "renderDot", { enumerable: true, get: function () { return LintPackCommand_1.renderDot; } });
|
|
15
|
+
if (require.main === module) {
|
|
16
|
+
new LintPackCommand_1.LintPackCommand(process.argv.slice(2)).execute();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=lint_pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint_pack.js","sourceRoot":"","sources":["../../scripts/lint_pack.ts"],"names":[],"mappings":";;;;AACA,yEAY6C;AAG3C,gGAdA,iCAAe,OAcA;AACf,0FAdA,2BAAS,OAcA;AACT,6FAdA,8BAAY,OAcA;AACZ,+FAdA,gCAAc,OAcA;AACd,oGAdA,qCAAmB,OAcA;AACnB,wFAdA,yBAAO,OAcA;AACP,+FAdA,gCAAc,OAcA;AACd,8FAdA,+BAAa,OAcA;AACb,0FAdA,2BAAS,OAcA;AAKX,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,iCAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* The git merge driver for `docs/specs/traceability.md`.
|
|
5
|
+
*
|
|
6
|
+
* ## What git does with this file
|
|
7
|
+
*
|
|
8
|
+
* Git calls a merge driver as a plain process, with three temporary files:
|
|
9
|
+
*
|
|
10
|
+
* merge-traceability.js %O %A %B
|
|
11
|
+
* │ │ └── theirs: the branch being merged in
|
|
12
|
+
* │ └───── ours: the current version, AND the file
|
|
13
|
+
* │ the driver must overwrite with the
|
|
14
|
+
* │ result. Git reads the answer back
|
|
15
|
+
* │ out of this path.
|
|
16
|
+
* └──────── base: the common ancestor. Git passes an
|
|
17
|
+
* empty file when there is none.
|
|
18
|
+
*
|
|
19
|
+
* Exit 0 means "merged, use %A". A non-zero exit means "conflict" — git keeps
|
|
20
|
+
* whatever %A now contains, which is why the markers are written into it before
|
|
21
|
+
* exiting 1, and marks the path unmerged so `git status` lists it.
|
|
22
|
+
*
|
|
23
|
+
* ## Wiring it up
|
|
24
|
+
*
|
|
25
|
+
* Two halves, and only one of them is committed:
|
|
26
|
+
*
|
|
27
|
+
* 1. `.gitattributes`, in the repository:
|
|
28
|
+
* docs/specs/traceability.md merge=csda-matrix
|
|
29
|
+
*
|
|
30
|
+
* 2. git config, which is **local to each clone**:
|
|
31
|
+
* git config merge.csda-matrix.name "csda traceability matrix merge"
|
|
32
|
+
* git config merge.csda-matrix.driver "node <path>/merge-traceability.js %O %A %B"
|
|
33
|
+
*
|
|
34
|
+
* `specgate harness init` writes both. A fresh clone has only the first, and git
|
|
35
|
+
* then falls back to its built-in line merge — the conflict you would have had
|
|
36
|
+
* anyway. That fallback is why this can be rolled out gradually: an unconfigured
|
|
37
|
+
* checkout is no worse off, never silently wrong. `specgate doctor` reports the
|
|
38
|
+
* gap rather than leaving it to be discovered mid-merge.
|
|
39
|
+
*
|
|
40
|
+
* The decision itself is not here. `mergeTraceability` is domain, pure, and
|
|
41
|
+
* tested without git; this file is the process boundary and nothing else.
|
|
42
|
+
*/
|
|
43
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
44
|
+
if (k2 === undefined) k2 = k;
|
|
45
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
46
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
47
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
48
|
+
}
|
|
49
|
+
Object.defineProperty(o, k2, desc);
|
|
50
|
+
}) : (function(o, m, k, k2) {
|
|
51
|
+
if (k2 === undefined) k2 = k;
|
|
52
|
+
o[k2] = m[k];
|
|
53
|
+
}));
|
|
54
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
55
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
56
|
+
}) : function(o, v) {
|
|
57
|
+
o["default"] = v;
|
|
58
|
+
});
|
|
59
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
60
|
+
var ownKeys = function(o) {
|
|
61
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
62
|
+
var ar = [];
|
|
63
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
64
|
+
return ar;
|
|
65
|
+
};
|
|
66
|
+
return ownKeys(o);
|
|
67
|
+
};
|
|
68
|
+
return function (mod) {
|
|
69
|
+
if (mod && mod.__esModule) return mod;
|
|
70
|
+
var result = {};
|
|
71
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
72
|
+
__setModuleDefault(result, mod);
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
})();
|
|
76
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
77
|
+
exports.main = main;
|
|
78
|
+
const fs = __importStar(require("node:fs"));
|
|
79
|
+
const TraceabilityMerge_1 = require("../packages/core/src/domain/TraceabilityMerge");
|
|
80
|
+
function main(argv) {
|
|
81
|
+
const [basePath, oursPath, theirsPath] = argv;
|
|
82
|
+
if (!basePath || !oursPath || !theirsPath) {
|
|
83
|
+
process.stderr.write("merge-traceability: expected the three paths git passes as %O %A %B.\n" +
|
|
84
|
+
"Fix: this is a git merge driver, not a command to run by hand. See\n" +
|
|
85
|
+
" `specgate harness init`, which registers it.\n");
|
|
86
|
+
return 2;
|
|
87
|
+
}
|
|
88
|
+
// A missing base is normal — git passes an empty file for an unrelated
|
|
89
|
+
// history — so it reads as "no common ancestor" rather than as an error.
|
|
90
|
+
const read = (p) => (fs.existsSync(p) ? fs.readFileSync(p, "utf8") : "");
|
|
91
|
+
const result = (0, TraceabilityMerge_1.mergeTraceability)(read(basePath), read(oursPath), read(theirsPath));
|
|
92
|
+
fs.writeFileSync(oursPath, result.content, "utf8");
|
|
93
|
+
if (result.conflicts.length === 0)
|
|
94
|
+
return 0;
|
|
95
|
+
process.stderr.write(`traceability.md: ${result.conflicts.length} row(s) need a decision: ` +
|
|
96
|
+
`${result.conflicts.join(", ")}\n` +
|
|
97
|
+
"Fix: open the file, and for each conflict keep exactly one of the two rows,\n" +
|
|
98
|
+
" deleting the <<<<<<< ======= >>>>>>> lines. Never keep both — a\n" +
|
|
99
|
+
" duplicated requirement is the corruption this file must not have.\n" +
|
|
100
|
+
" Then `specgate validate <project>` confirms the result is well formed.\n");
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
if (require.main === module) {
|
|
104
|
+
process.exit(main(process.argv.slice(2)));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=merge-traceability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-traceability.js","sourceRoot":"","sources":["../../scripts/merge-traceability.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMH,oBA6BC;AAjCD,4CAA8B;AAE9B,qFAAkF;AAElF,SAAgB,IAAI,CAAC,IAAc;IACjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wEAAwE;YACtE,sEAAsE;YACtE,qDAAqD,CACxD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,IAAA,qCAAiB,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,MAAM,CAAC,SAAS,CAAC,MAAM,2BAA2B;QACpE,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAClC,+EAA+E;QAC/E,wEAAwE;QACxE,0EAA0E;QAC1E,+EAA+E,CAClF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.looksLayered = exports.findDeclaredModules = exports.findAdoptedAncestor = exports.proposeCapabilities = exports.titleCase = exports.descendThroughWrappers = exports.BUILD_OUTPUT = exports.NOT_DOMAIN = exports.OnboardCommand = void 0;
|
|
5
|
+
exports.main = main;
|
|
6
|
+
const OnboardCommand_1 = require("./cli/commands/project/OnboardCommand");
|
|
7
|
+
Object.defineProperty(exports, "OnboardCommand", { enumerable: true, get: function () { return OnboardCommand_1.OnboardCommand; } });
|
|
8
|
+
Object.defineProperty(exports, "NOT_DOMAIN", { enumerable: true, get: function () { return OnboardCommand_1.NOT_DOMAIN; } });
|
|
9
|
+
Object.defineProperty(exports, "BUILD_OUTPUT", { enumerable: true, get: function () { return OnboardCommand_1.BUILD_OUTPUT; } });
|
|
10
|
+
Object.defineProperty(exports, "descendThroughWrappers", { enumerable: true, get: function () { return OnboardCommand_1.descendThroughWrappers; } });
|
|
11
|
+
Object.defineProperty(exports, "titleCase", { enumerable: true, get: function () { return OnboardCommand_1.titleCase; } });
|
|
12
|
+
Object.defineProperty(exports, "proposeCapabilities", { enumerable: true, get: function () { return OnboardCommand_1.proposeCapabilities; } });
|
|
13
|
+
Object.defineProperty(exports, "findAdoptedAncestor", { enumerable: true, get: function () { return OnboardCommand_1.findAdoptedAncestor; } });
|
|
14
|
+
Object.defineProperty(exports, "findDeclaredModules", { enumerable: true, get: function () { return OnboardCommand_1.findDeclaredModules; } });
|
|
15
|
+
Object.defineProperty(exports, "looksLayered", { enumerable: true, get: function () { return OnboardCommand_1.looksLayered; } });
|
|
16
|
+
function main(argv) {
|
|
17
|
+
new OnboardCommand_1.OnboardCommand(argv).execute();
|
|
18
|
+
}
|
|
19
|
+
if (require.main === module) {
|
|
20
|
+
new OnboardCommand_1.OnboardCommand(process.argv.slice(2)).execute();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../scripts/onboard.ts"],"names":[],"mappings":";;;;AAyBA,oBAEC;AA1BD,0EAU+C;AAG7C,+FAZA,+BAAc,OAYA;AACd,2FAZA,2BAAU,OAYA;AACV,6FAZA,6BAAY,OAYA;AACZ,uGAZA,uCAAsB,OAYA;AACtB,0FAZA,0BAAS,OAYA;AACT,oGAZA,oCAAmB,OAYA;AACnB,oGAZA,oCAAmB,OAYA;AACnB,oGAZA,oCAAmB,OAYA;AACnB,6FAZA,6BAAY,OAYA;AAGd,SAAgB,IAAI,CAAC,IAAc;IACjC,IAAI,+BAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,+BAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.applyDependencies = exports.detectOrphans = exports.buildPlan = exports.hintFor = exports.classify = exports.parseTraceability = exports.parseArgs = exports.PlanCommand = void 0;
|
|
5
|
+
const PlanCommand_1 = require("./cli/commands/spec/PlanCommand");
|
|
6
|
+
Object.defineProperty(exports, "PlanCommand", { enumerable: true, get: function () { return PlanCommand_1.PlanCommand; } });
|
|
7
|
+
Object.defineProperty(exports, "parseArgs", { enumerable: true, get: function () { return PlanCommand_1.parseArgs; } });
|
|
8
|
+
Object.defineProperty(exports, "parseTraceability", { enumerable: true, get: function () { return PlanCommand_1.parseTraceability; } });
|
|
9
|
+
Object.defineProperty(exports, "classify", { enumerable: true, get: function () { return PlanCommand_1.classify; } });
|
|
10
|
+
Object.defineProperty(exports, "hintFor", { enumerable: true, get: function () { return PlanCommand_1.hintFor; } });
|
|
11
|
+
Object.defineProperty(exports, "buildPlan", { enumerable: true, get: function () { return PlanCommand_1.buildPlan; } });
|
|
12
|
+
Object.defineProperty(exports, "detectOrphans", { enumerable: true, get: function () { return PlanCommand_1.detectOrphans; } });
|
|
13
|
+
Object.defineProperty(exports, "applyDependencies", { enumerable: true, get: function () { return PlanCommand_1.applyDependencies; } });
|
|
14
|
+
if (require.main === module) {
|
|
15
|
+
new PlanCommand_1.PlanCommand(process.argv.slice(2)).execute();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../scripts/plan.ts"],"names":[],"mappings":";;;;AACA,iEAUyC;AAGvC,4FAZA,yBAAW,OAYA;AACX,0FAZA,uBAAS,OAYA;AAET,kGAZA,+BAAiB,OAYA;AACjB,yFAZA,sBAAQ,OAYA;AACR,wFAZA,qBAAO,OAYA;AACP,0FAZA,uBAAS,OAYA;AACT,8FAZA,2BAAa,OAYA;AACb,kGAZA,+BAAiB,OAYA;AAGnB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,yBAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* The `Stop` hook: the spec gate, inside the agent's loop.
|
|
5
|
+
*
|
|
6
|
+
* `specgate validate --strict-tdd` has always run in CI — that is, *after* the
|
|
7
|
+
* agent finished and left. This runs it when the agent is about to stop, while
|
|
8
|
+
* it still has the context to fix what it broke, and refuses the stop while the
|
|
9
|
+
* gate is red. It is the difference between a gate that reviews an agent's work
|
|
10
|
+
* and one the agent cannot walk past.
|
|
11
|
+
*
|
|
12
|
+
* **The loop hazard is the whole design problem.** A `Stop` hook that blocks
|
|
13
|
+
* whenever the gate fails can trap a session forever: the agent tries, fails,
|
|
14
|
+
* is blocked, tries again. So this blocks **at most once per user prompt**,
|
|
15
|
+
* keyed on the `prompt_id` the hook receives. The second time the same prompt
|
|
16
|
+
* comes back it reports the findings and lets the session end, because at that
|
|
17
|
+
* point the agent has already been told and a human needs to see the answer.
|
|
18
|
+
*
|
|
19
|
+
* Contract (verified against the hooks reference):
|
|
20
|
+
* - stdin: JSON with `cwd`, `prompt_id`, `hook_event_name`
|
|
21
|
+
* - exit 2: blocks the stop, and stderr is what Claude is told
|
|
22
|
+
* - exit 0: allows it
|
|
23
|
+
* Anything unexpected exits 0. A hook that breaks a session because the CLI
|
|
24
|
+
* was missing would be worse than no hook at all.
|
|
25
|
+
*/
|
|
26
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
29
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
30
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(o, k2, desc);
|
|
33
|
+
}) : (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
o[k2] = m[k];
|
|
36
|
+
}));
|
|
37
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
38
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
39
|
+
}) : function(o, v) {
|
|
40
|
+
o["default"] = v;
|
|
41
|
+
});
|
|
42
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
43
|
+
var ownKeys = function(o) {
|
|
44
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
45
|
+
var ar = [];
|
|
46
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
47
|
+
return ar;
|
|
48
|
+
};
|
|
49
|
+
return ownKeys(o);
|
|
50
|
+
};
|
|
51
|
+
return function (mod) {
|
|
52
|
+
if (mod && mod.__esModule) return mod;
|
|
53
|
+
var result = {};
|
|
54
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
55
|
+
__setModuleDefault(result, mod);
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
})();
|
|
59
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
+
exports.alreadyBlocked = alreadyBlocked;
|
|
61
|
+
exports.renderFindings = renderFindings;
|
|
62
|
+
exports.decide = decide;
|
|
63
|
+
exports.main = main;
|
|
64
|
+
const fs = __importStar(require("node:fs"));
|
|
65
|
+
const os = __importStar(require("node:os"));
|
|
66
|
+
const path = __importStar(require("node:path"));
|
|
67
|
+
const node_child_process_1 = require("node:child_process");
|
|
68
|
+
const MARKER_DIR = path.join(os.tmpdir(), "csda-gate-hook");
|
|
69
|
+
/**
|
|
70
|
+
* Has this prompt already been blocked once?
|
|
71
|
+
*
|
|
72
|
+
* The marker is per prompt and lives in the temp directory: it must not touch
|
|
73
|
+
* the project, because the harness refuses to start on a dirty tree and this
|
|
74
|
+
* hook has no business dirtying anyone's repository.
|
|
75
|
+
*/
|
|
76
|
+
function alreadyBlocked(promptId) {
|
|
77
|
+
if (!promptId)
|
|
78
|
+
return false;
|
|
79
|
+
const marker = path.join(MARKER_DIR, `${promptId.replace(/[^\w-]/g, "")}.blocked`);
|
|
80
|
+
if (fs.existsSync(marker))
|
|
81
|
+
return true;
|
|
82
|
+
try {
|
|
83
|
+
fs.mkdirSync(MARKER_DIR, { recursive: true });
|
|
84
|
+
fs.writeFileSync(marker, "", "utf8");
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// If the marker cannot be written, err towards not blocking: a session that
|
|
88
|
+
// cannot be ended is a worse failure than a gate finding that goes unsaid.
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
/** Turn the validator's diagnostics into something an agent can act on. */
|
|
94
|
+
function renderFindings(diagnostics) {
|
|
95
|
+
const lines = ["The spec gate is failing, so this work is not finished:", ""];
|
|
96
|
+
for (const d of diagnostics.slice(0, 10)) {
|
|
97
|
+
lines.push(` • [${d.code ?? "error"}] ${d.message ?? ""}`);
|
|
98
|
+
if (d.fix)
|
|
99
|
+
lines.push(` fix: ${d.fix}`);
|
|
100
|
+
}
|
|
101
|
+
if (diagnostics.length > 10)
|
|
102
|
+
lines.push(` … and ${diagnostics.length - 10} more.`);
|
|
103
|
+
lines.push("", "Run `specgate validate . --strict-tdd` to see all of it.");
|
|
104
|
+
return lines.join("\n");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run the gate and decide.
|
|
108
|
+
*
|
|
109
|
+
* @param runValidate injected so the decision is testable without a CLI
|
|
110
|
+
*/
|
|
111
|
+
function decide(input, runValidate, blockedAlready) {
|
|
112
|
+
const cwd = input.cwd ?? process.cwd();
|
|
113
|
+
let gate;
|
|
114
|
+
try {
|
|
115
|
+
gate = runValidate(cwd);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Not a spec-driven project, or no CLI on PATH. Say nothing.
|
|
119
|
+
return { block: false, message: "" };
|
|
120
|
+
}
|
|
121
|
+
if (gate.ok)
|
|
122
|
+
return { block: false, message: "" };
|
|
123
|
+
const findings = renderFindings(gate.diagnostics);
|
|
124
|
+
if (blockedAlready(input.prompt_id ?? "")) {
|
|
125
|
+
// Told once already. Let the human see the answer rather than looping.
|
|
126
|
+
return { block: false, message: findings };
|
|
127
|
+
}
|
|
128
|
+
return { block: true, message: findings };
|
|
129
|
+
}
|
|
130
|
+
function runValidate(cwd) {
|
|
131
|
+
if (!fs.existsSync(path.join(cwd, "spec.md")))
|
|
132
|
+
throw new Error("not a spec-driven project");
|
|
133
|
+
const r = (0, node_child_process_1.spawnSync)("npx", ["--no-install", "specgate", "validate", cwd, "--strict-tdd", "--json"], {
|
|
134
|
+
encoding: "utf8",
|
|
135
|
+
timeout: 120_000,
|
|
136
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
137
|
+
});
|
|
138
|
+
if (r.error || typeof r.status !== "number")
|
|
139
|
+
throw new Error("could not run specgate");
|
|
140
|
+
let parsed;
|
|
141
|
+
try {
|
|
142
|
+
parsed = JSON.parse(r.stdout);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new Error("specgate validate did not emit one JSON document");
|
|
146
|
+
}
|
|
147
|
+
const diagnostics = (parsed.status ?? []).filter((d) => d.severity === "error");
|
|
148
|
+
return { ok: r.status === 0, diagnostics };
|
|
149
|
+
}
|
|
150
|
+
function main(raw) {
|
|
151
|
+
let input;
|
|
152
|
+
try {
|
|
153
|
+
input = JSON.parse(raw);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
const decision = decide(input, runValidate, alreadyBlocked);
|
|
159
|
+
if (decision.message)
|
|
160
|
+
process.stderr.write(`${decision.message}\n`);
|
|
161
|
+
return decision.block ? 2 : 0;
|
|
162
|
+
}
|
|
163
|
+
if (require.main === module) {
|
|
164
|
+
let raw = "";
|
|
165
|
+
process.stdin.setEncoding("utf8");
|
|
166
|
+
process.stdin.on("data", (c) => {
|
|
167
|
+
raw += c;
|
|
168
|
+
});
|
|
169
|
+
process.stdin.on("end", () => process.exit(main(raw)));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=gate-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-hook.js","sourceRoot":"","sources":["../../../scripts/plugin/gate-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.sparkline = exports.parseArgs = exports.renderJson = exports.renderHtml = exports.readSpecops = exports.buildDeclaredValues = exports.buildReport = exports.ReportCommand = void 0;
|
|
5
|
+
const ReportCommand_1 = require("./cli/commands/quality/ReportCommand");
|
|
6
|
+
Object.defineProperty(exports, "ReportCommand", { enumerable: true, get: function () { return ReportCommand_1.ReportCommand; } });
|
|
7
|
+
Object.defineProperty(exports, "buildReport", { enumerable: true, get: function () { return ReportCommand_1.buildReport; } });
|
|
8
|
+
Object.defineProperty(exports, "buildDeclaredValues", { enumerable: true, get: function () { return ReportCommand_1.buildDeclaredValues; } });
|
|
9
|
+
Object.defineProperty(exports, "readSpecops", { enumerable: true, get: function () { return ReportCommand_1.readSpecops; } });
|
|
10
|
+
Object.defineProperty(exports, "renderHtml", { enumerable: true, get: function () { return ReportCommand_1.renderHtml; } });
|
|
11
|
+
Object.defineProperty(exports, "renderJson", { enumerable: true, get: function () { return ReportCommand_1.renderJson; } });
|
|
12
|
+
Object.defineProperty(exports, "parseArgs", { enumerable: true, get: function () { return ReportCommand_1.parseArgs; } });
|
|
13
|
+
Object.defineProperty(exports, "sparkline", { enumerable: true, get: function () { return ReportCommand_1.sparkline; } });
|
|
14
|
+
if (require.main === module) {
|
|
15
|
+
new ReportCommand_1.ReportCommand(process.argv.slice(2)).execute();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../scripts/report.ts"],"names":[],"mappings":";;;;AACA,wEAU8C;AAG5C,8FAZA,6BAAa,OAYA;AACb,4FAZA,2BAAW,OAYA;AACX,oGAZA,mCAAmB,OAYA;AACnB,4FAZA,2BAAW,OAYA;AACX,2FAZA,0BAAU,OAYA;AACV,2FAZA,0BAAU,OAYA;AACV,0FAZA,yBAAS,OAYA;AACT,0FAZA,yBAAS,OAYA;AAIX,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,6BAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.updateRequirementFields = exports.appendRequirement = exports.isMatrixDataLine = exports.buildRow = exports.nextScenarioId = exports.nextReqId = exports.pad3 = exports.LINK_FIELDS = exports.COL = exports.ReqCommand = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Supported subcommands: "add", "link", "done", "list"
|
|
7
|
+
*/
|
|
8
|
+
const ReqCommand_1 = require("./cli/commands/spec/ReqCommand");
|
|
9
|
+
Object.defineProperty(exports, "ReqCommand", { enumerable: true, get: function () { return ReqCommand_1.ReqCommand; } });
|
|
10
|
+
Object.defineProperty(exports, "COL", { enumerable: true, get: function () { return ReqCommand_1.COL; } });
|
|
11
|
+
Object.defineProperty(exports, "LINK_FIELDS", { enumerable: true, get: function () { return ReqCommand_1.LINK_FIELDS; } });
|
|
12
|
+
Object.defineProperty(exports, "pad3", { enumerable: true, get: function () { return ReqCommand_1.pad3; } });
|
|
13
|
+
Object.defineProperty(exports, "nextReqId", { enumerable: true, get: function () { return ReqCommand_1.nextReqId; } });
|
|
14
|
+
Object.defineProperty(exports, "nextScenarioId", { enumerable: true, get: function () { return ReqCommand_1.nextScenarioId; } });
|
|
15
|
+
Object.defineProperty(exports, "buildRow", { enumerable: true, get: function () { return ReqCommand_1.buildRow; } });
|
|
16
|
+
Object.defineProperty(exports, "isMatrixDataLine", { enumerable: true, get: function () { return ReqCommand_1.isMatrixDataLine; } });
|
|
17
|
+
Object.defineProperty(exports, "appendRequirement", { enumerable: true, get: function () { return ReqCommand_1.appendRequirement; } });
|
|
18
|
+
Object.defineProperty(exports, "updateRequirementFields", { enumerable: true, get: function () { return ReqCommand_1.updateRequirementFields; } });
|
|
19
|
+
if (require.main === module) {
|
|
20
|
+
new ReqCommand_1.ReqCommand(process.argv.slice(2)).execute();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=req.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"req.js","sourceRoot":"","sources":["../../scripts/req.ts"],"names":[],"mappings":";;;;AACA;;GAEG;AACH,+DAWwC;AAGtC,2FAbA,uBAAU,OAaA;AACV,oFAbA,gBAAG,OAaA;AACH,4FAbA,wBAAW,OAaA;AACX,qFAbA,iBAAI,OAaA;AACJ,0FAbA,sBAAS,OAaA;AACT,+FAbA,2BAAc,OAaA;AACd,yFAbA,qBAAQ,OAaA;AACR,iGAbA,6BAAgB,OAaA;AAChB,kGAbA,8BAAiB,OAaA;AACjB,wGAbA,oCAAuB,OAaA;AAGzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,uBAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* `specgate schema init | fork | validate | which` — inspect and override the
|
|
5
|
+
* artefact graph a change follows.
|
|
6
|
+
*
|
|
7
|
+
* Most teams never touch this. It exists because "which artefacts does a
|
|
8
|
+
* change produce?" is a house style, not a law, and hardcoding one answer is
|
|
9
|
+
* how a tool acquires a reputation for ceremony.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.FIXES = void 0;
|
|
46
|
+
exports.schemaPath = schemaPath;
|
|
47
|
+
exports.writeSchema = writeSchema;
|
|
48
|
+
exports.main = main;
|
|
49
|
+
const fs = __importStar(require("node:fs"));
|
|
50
|
+
const path = __importStar(require("node:path"));
|
|
51
|
+
const project_root_1 = require("../lib/project-root");
|
|
52
|
+
const diagnostics_1 = require("../lib/diagnostics");
|
|
53
|
+
const agent_1 = require("../lib/agent");
|
|
54
|
+
const registry_1 = require("./registry");
|
|
55
|
+
function usage() {
|
|
56
|
+
process.stdout.write("Usage:\n" +
|
|
57
|
+
" specgate schema which [<name>] where a schema comes from, and its graph\n" +
|
|
58
|
+
" specgate schema init <name> write a new schema from the default\n" +
|
|
59
|
+
" specgate schema fork <from> <to> copy a built-in into the project to edit\n" +
|
|
60
|
+
" specgate schema validate [<name>] check a schema's graph is sound\n\n" +
|
|
61
|
+
`Built-in: ${Object.keys(registry_1.BUILT_IN).join(", ")}\n` +
|
|
62
|
+
`Project schemas live in ${registry_1.SCHEMA_DIR}/<name>/${registry_1.SCHEMA_FILE}.\n`);
|
|
63
|
+
}
|
|
64
|
+
function schemaPath(projectDir, name) {
|
|
65
|
+
return path.join(projectDir, registry_1.SCHEMA_DIR, name, registry_1.SCHEMA_FILE);
|
|
66
|
+
}
|
|
67
|
+
function writeSchema(projectDir, name, schema) {
|
|
68
|
+
const file = schemaPath(projectDir, name);
|
|
69
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
70
|
+
fs.writeFileSync(file, (0, registry_1.toYaml)({ ...schema, name }), "utf8");
|
|
71
|
+
return path.join(registry_1.SCHEMA_DIR, name, registry_1.SCHEMA_FILE);
|
|
72
|
+
}
|
|
73
|
+
function main(argv) {
|
|
74
|
+
const io = (0, agent_1.agentIo)((0, agent_1.wantsJson)(argv));
|
|
75
|
+
const NULL_SHAPE = { schema: null };
|
|
76
|
+
const args = argv.filter((a) => a !== "--json");
|
|
77
|
+
if (args.includes("--help") || args.includes("-h") || args.length === 0) {
|
|
78
|
+
usage();
|
|
79
|
+
process.exit(args.length === 0 ? agent_1.EXIT.USAGE : agent_1.EXIT.OK);
|
|
80
|
+
}
|
|
81
|
+
let projectDirArg = ".";
|
|
82
|
+
const positional = [];
|
|
83
|
+
for (let i = 0; i < args.length; i++) {
|
|
84
|
+
if (args[i] === "--project-dir" && args[i + 1])
|
|
85
|
+
projectDirArg = args[++i];
|
|
86
|
+
else if (!args[i].startsWith("-"))
|
|
87
|
+
positional.push(args[i]);
|
|
88
|
+
}
|
|
89
|
+
let projectDir;
|
|
90
|
+
try {
|
|
91
|
+
projectDir = (0, project_root_1.resolveProjectDir)(projectDirArg);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
io.usage(NULL_SHAPE, [
|
|
95
|
+
(0, diagnostics_1.error)("project_not_found", (0, diagnostics_1.errorMessage)(err), {
|
|
96
|
+
fix: "Run from inside a spec-driven project, or pass --project-dir.",
|
|
97
|
+
}),
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
const [action, ...rest] = positional;
|
|
101
|
+
if (action === "which") {
|
|
102
|
+
const name = rest[0] || "spec-driven";
|
|
103
|
+
const found = (0, registry_1.resolveSchema)(projectDir, name);
|
|
104
|
+
if (!found) {
|
|
105
|
+
io.fail(NULL_SHAPE, [
|
|
106
|
+
(0, diagnostics_1.error)("schema_not_found", `No schema named "${name}".`, {
|
|
107
|
+
target: name,
|
|
108
|
+
fix: `Available: ${(0, registry_1.listSchemas)(projectDir).join(", ")}.`,
|
|
109
|
+
}),
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
return io.emit({
|
|
113
|
+
schema: { ...found.schema, source: found.source, path: found.path },
|
|
114
|
+
available: (0, registry_1.listSchemas)(projectDir),
|
|
115
|
+
}, () => {
|
|
116
|
+
process.stdout.write(`\n ${found.schema.name} (${found.source})\n`);
|
|
117
|
+
if (found.path)
|
|
118
|
+
process.stdout.write(` ${found.path}\n`);
|
|
119
|
+
process.stdout.write(`\n ${found.schema.description || ""}\n\n`);
|
|
120
|
+
for (const a of found.schema.artifacts) {
|
|
121
|
+
const deps = a.requires.length ? ` ← ${a.requires.join(", ")}` : "";
|
|
122
|
+
process.stdout.write(` ${a.id.padEnd(10)} ${a.generates}${deps}\n`);
|
|
123
|
+
}
|
|
124
|
+
process.stdout.write(`\n Available: ${(0, registry_1.listSchemas)(projectDir).join(", ")}\n\n`);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (action === "init" || action === "fork") {
|
|
128
|
+
// `init` starts from the default; `fork` names the schema to copy.
|
|
129
|
+
const from = action === "fork" ? rest[0] : "spec-driven";
|
|
130
|
+
const to = action === "fork" ? rest[1] : rest[0];
|
|
131
|
+
if (!to) {
|
|
132
|
+
io.usage(NULL_SHAPE, [
|
|
133
|
+
(0, diagnostics_1.error)("schema_name_required", "Name the schema to create.", {
|
|
134
|
+
fix: action === "fork"
|
|
135
|
+
? "specgate schema fork spec-driven my-flow"
|
|
136
|
+
: "specgate schema init my-flow",
|
|
137
|
+
}),
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
const source = (0, registry_1.resolveSchema)(projectDir, from);
|
|
141
|
+
if (!source) {
|
|
142
|
+
io.fail(NULL_SHAPE, [
|
|
143
|
+
(0, diagnostics_1.error)("schema_not_found", `No schema named "${from}" to copy.`, {
|
|
144
|
+
target: from,
|
|
145
|
+
fix: `Available: ${(0, registry_1.listSchemas)(projectDir).join(", ")}.`,
|
|
146
|
+
}),
|
|
147
|
+
]);
|
|
148
|
+
}
|
|
149
|
+
const dest = schemaPath(projectDir, to);
|
|
150
|
+
if (fs.existsSync(dest)) {
|
|
151
|
+
io.fail(NULL_SHAPE, [
|
|
152
|
+
(0, diagnostics_1.error)("schema_exists", `${path.join(registry_1.SCHEMA_DIR, to, registry_1.SCHEMA_FILE)} already exists.`, {
|
|
153
|
+
target: to,
|
|
154
|
+
fix: "Edit it, or choose another name.",
|
|
155
|
+
}),
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
const written = writeSchema(projectDir, to, source.schema);
|
|
159
|
+
return io.emit({ schema: { name: to, path: written, from } }, () => process.stdout.write(`\n ✔ ${to} written to ${written}\n copied from ${from} (${source.source})\n\n` +
|
|
160
|
+
` Use it: specgate change new <id> --schema ${to}\n\n`));
|
|
161
|
+
}
|
|
162
|
+
if (action === "validate") {
|
|
163
|
+
const name = rest[0] || "spec-driven";
|
|
164
|
+
const found = (0, registry_1.resolveSchema)(projectDir, name);
|
|
165
|
+
if (!found) {
|
|
166
|
+
io.fail(NULL_SHAPE, [
|
|
167
|
+
(0, diagnostics_1.error)("schema_not_found", `No schema named "${name}".`, {
|
|
168
|
+
target: name,
|
|
169
|
+
fix: `Available: ${(0, registry_1.listSchemas)(projectDir).join(", ")}.`,
|
|
170
|
+
}),
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
const problems = (0, registry_1.validateSchema)(found.schema);
|
|
174
|
+
const diagnostics = problems.map((p) => (0, diagnostics_1.diagnostic)("error", p.code, p.message, {
|
|
175
|
+
...(p.target ? { target: p.target } : {}),
|
|
176
|
+
fix: exports.FIXES[p.code] || "Correct the schema file and re-run.",
|
|
177
|
+
}));
|
|
178
|
+
if (found.source === "built-in") {
|
|
179
|
+
diagnostics.push((0, diagnostics_1.warning)("schema_is_built_in", `"${name}" is built in — there is nothing to edit yet.`, {
|
|
180
|
+
fix: `specgate schema fork ${name} my-${name}`,
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
return io.emitAndGate({
|
|
184
|
+
schema: { name: found.schema.name, source: found.source, path: found.path },
|
|
185
|
+
status: diagnostics,
|
|
186
|
+
}, () => {
|
|
187
|
+
if (problems.length === 0) {
|
|
188
|
+
process.stdout.write(`\n ✔ ${name} is a sound graph (${found.source})\n\n`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
process.stdout.write(`\n ✖ ${name} has ${problems.length} problem(s)\n\n`);
|
|
192
|
+
for (const p of problems)
|
|
193
|
+
process.stdout.write(` ${p.message}\n`);
|
|
194
|
+
process.stdout.write("\n");
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
io.usage(NULL_SHAPE, [
|
|
198
|
+
(0, diagnostics_1.error)("schema_action_unknown", `Unknown action: ${action}.`, {
|
|
199
|
+
target: action,
|
|
200
|
+
fix: "Use one of: which, init, fork, validate.",
|
|
201
|
+
}),
|
|
202
|
+
]);
|
|
203
|
+
}
|
|
204
|
+
exports.FIXES = {
|
|
205
|
+
schema_no_name: "Add a top-level `name:` line.",
|
|
206
|
+
schema_no_artifacts: "Declare at least one entry under `artifacts:`.",
|
|
207
|
+
artifact_no_id: "Every artifact needs an `id`.",
|
|
208
|
+
artifact_duplicate_id: "Rename one of the two — ids identify an artifact.",
|
|
209
|
+
artifact_no_output: "Add a `generates:` path or glob.",
|
|
210
|
+
artifact_unknown_dependency: "Declare the artifact it requires, or drop the dependency. A dependency on something that does not exist marks every dependent artifact blocked forever.",
|
|
211
|
+
artifact_cycle: "Break the cycle — the graph has to be acyclic to be orderable.",
|
|
212
|
+
};
|
|
213
|
+
if (require.main === module)
|
|
214
|
+
main(process.argv.slice(2));
|
|
215
|
+
//# sourceMappingURL=cli.js.map
|