@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,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A board issue becoming a reviewable proposal (ADR-0021, E2-03).
|
|
4
|
+
*
|
|
5
|
+
* The load-bearing test in this file is the one asserting the scenario stays
|
|
6
|
+
* unwritten. Everything else is presentation; that one is the design.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
const node_test_1 = require("node:test");
|
|
43
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
44
|
+
const InboundChange_1 = require("../../src/domain/InboundChange");
|
|
45
|
+
const issue = {
|
|
46
|
+
key: "ACME-42",
|
|
47
|
+
title: "Charge more at peak hours",
|
|
48
|
+
body: "Customers on the flat tariff are subsidising peak load.\nFinance wants a peak rate.",
|
|
49
|
+
url: "https://acme.atlassian.net/browse/ACME-42",
|
|
50
|
+
};
|
|
51
|
+
(0, node_test_1.test)("the change id derives from the issue, so a second pull is idempotent", () => {
|
|
52
|
+
assert.equal((0, InboundChange_1.inboundChangeId)("ACME-42"), "alm-acme-42");
|
|
53
|
+
assert.equal((0, InboundChange_1.inboundChangeId)("ACME-42"), (0, InboundChange_1.inboundChangeId)("ACME-42"));
|
|
54
|
+
assert.equal((0, InboundChange_1.inboundChangeId)("42"), "alm-42", "a bare GitHub number is a key too");
|
|
55
|
+
assert.equal((0, InboundChange_1.inboundChangeId)("weird//key!!"), "alm-weird-key");
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.test)("the scenario is left unwritten, and says why", () => {
|
|
58
|
+
// The whole point of ADR-0021 §4. A ticket has no executable acceptance
|
|
59
|
+
// criterion; generating Gherkin from prose would invent the one thing the
|
|
60
|
+
// spec exists to pin down, and `validate` would then be checking fiction.
|
|
61
|
+
const plan = (0, InboundChange_1.planInboundChange)(issue, "REQ-014", "SCN-014");
|
|
62
|
+
assert.match(plan.delta, /#### Scenario: SCN-014 — TODO/);
|
|
63
|
+
assert.match(plan.delta, /- GIVEN <!--/);
|
|
64
|
+
assert.match(plan.delta, /- WHEN <!--/);
|
|
65
|
+
assert.match(plan.delta, /- THEN <!--/);
|
|
66
|
+
assert.match(plan.delta, /deliberately unwritten/);
|
|
67
|
+
// No step may arrive already written — that is the failure mode this guards.
|
|
68
|
+
const steps = plan.delta.split("\n").filter((l) => /^- (GIVEN|WHEN|THEN) /.test(l));
|
|
69
|
+
assert.equal(steps.length, 3);
|
|
70
|
+
for (const step of steps) {
|
|
71
|
+
assert.match(step, /<!--/, `a step arrived pre-written: ${step}`);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.test)("the issue's own words are carried verbatim and marked as quoted", () => {
|
|
75
|
+
// Summarising would put this tool's paraphrase where the reporter's intent
|
|
76
|
+
// belongs, and a reviewer could not tell which was which.
|
|
77
|
+
const plan = (0, InboundChange_1.planInboundChange)(issue, "REQ-014", "SCN-014");
|
|
78
|
+
assert.match(plan.proposal, /> Customers on the flat tariff are subsidising peak load\./);
|
|
79
|
+
assert.match(plan.proposal, /> Finance wants a peak rate\./);
|
|
80
|
+
assert.match(plan.proposal, /Imported verbatim from the board/);
|
|
81
|
+
assert.match(plan.proposal, /ACME-42/);
|
|
82
|
+
assert.match(plan.proposal, /browse\/ACME-42/);
|
|
83
|
+
});
|
|
84
|
+
(0, node_test_1.test)("an issue with no description still yields a usable proposal", () => {
|
|
85
|
+
const plan = (0, InboundChange_1.planInboundChange)({ ...issue, body: "" }, "REQ-001", "SCN-001");
|
|
86
|
+
assert.match(plan.proposal, /the issue has no description/);
|
|
87
|
+
assert.doesNotMatch(plan.proposal, /undefined|null/);
|
|
88
|
+
});
|
|
89
|
+
(0, node_test_1.test)("an issue with no title falls back to its key rather than an empty heading", () => {
|
|
90
|
+
const plan = (0, InboundChange_1.planInboundChange)({ ...issue, title: " " }, "REQ-001", "SCN-001");
|
|
91
|
+
assert.match(plan.proposal, /^# Proposal: ACME-42$/m);
|
|
92
|
+
assert.match(plan.delta, /### Requirement: REQ-001 — ACME-42/);
|
|
93
|
+
});
|
|
94
|
+
(0, node_test_1.test)("the delta records where the requirement came from", () => {
|
|
95
|
+
// Provenance in the trace comment, which is the extension point this repo
|
|
96
|
+
// already uses — and which `change archive` carries through.
|
|
97
|
+
const plan = (0, InboundChange_1.planInboundChange)(issue, "REQ-014", "SCN-014");
|
|
98
|
+
assert.match(plan.delta, /<!-- csda:trace origin=alm:ACME-42 -->/);
|
|
99
|
+
});
|
|
100
|
+
(0, node_test_1.test)("the delta is an ADDED section the delta parser understands", () => {
|
|
101
|
+
const plan = (0, InboundChange_1.planInboundChange)(issue, "REQ-014", "SCN-014");
|
|
102
|
+
assert.match(plan.delta, /^## ADDED Requirements$/m);
|
|
103
|
+
assert.match(plan.delta, /^### Requirement: REQ-014 — /m);
|
|
104
|
+
});
|
|
105
|
+
// ── the gate must refuse what `alm pull` writes ──────────────────────────────
|
|
106
|
+
const DeltaSpec_1 = require("../../src/domain/DeltaSpec");
|
|
107
|
+
(0, node_test_1.test)("a step that names a keyword and says nothing is a placeholder", () => {
|
|
108
|
+
// The hole this closes: these are Gherkin by shape, so they passed every
|
|
109
|
+
// check the delta validator made. A scenario built from them satisfies the
|
|
110
|
+
// gate without asserting anything, which is the failure ADR-0021 called out
|
|
111
|
+
// when it refused to import tickets with placeholder scenarios.
|
|
112
|
+
for (const step of [
|
|
113
|
+
"GIVEN <!-- the precondition -->",
|
|
114
|
+
"- WHEN <!-- the action -->",
|
|
115
|
+
"THEN",
|
|
116
|
+
"WHEN TODO",
|
|
117
|
+
"GIVEN TBD",
|
|
118
|
+
"THEN ...",
|
|
119
|
+
"GIVEN <something>",
|
|
120
|
+
]) {
|
|
121
|
+
assert.ok((0, DeltaSpec_1.isPlaceholderStep)(step), `${step} should read as unwritten`);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.test)("a step that says something real is not a placeholder", () => {
|
|
125
|
+
for (const step of [
|
|
126
|
+
"GIVEN a customer on the flat tariff",
|
|
127
|
+
"- WHEN consumption happens during peak hours",
|
|
128
|
+
"THEN the peak rate is applied",
|
|
129
|
+
"GIVEN a customer <!-- as created in SCN-001 -->",
|
|
130
|
+
]) {
|
|
131
|
+
assert.equal((0, DeltaSpec_1.isPlaceholderStep)(step), false, `${step} should read as written`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
(0, node_test_1.test)("every step a pulled delta ships with reads as unwritten", () => {
|
|
135
|
+
// The two halves have to agree: what `alm pull` writes must be exactly what
|
|
136
|
+
// the gate refuses, or the empty scenario stops being a marker and becomes a
|
|
137
|
+
// way through.
|
|
138
|
+
const plan = (0, InboundChange_1.planInboundChange)(issue, "REQ-014", "SCN-014");
|
|
139
|
+
const steps = plan.delta.split("\n").filter((l) => /^- (GIVEN|WHEN|THEN)/.test(l));
|
|
140
|
+
assert.equal(steps.length, 3);
|
|
141
|
+
for (const step of steps) {
|
|
142
|
+
assert.ok((0, DeltaSpec_1.isPlaceholderStep)(step), `pull wrote a step the gate would accept: ${step}`);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=inbound-change.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-change.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/inbound-change.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `depends_on`, carried from a pack to the project (B1).
|
|
4
|
+
*
|
|
5
|
+
* A pack's requirements do not arrive as capability specs — the capability
|
|
6
|
+
* document each pack ships is its own template — so they land in the
|
|
7
|
+
* traceability matrix, and that is where a pack's `depends_on` has to arrive
|
|
8
|
+
* too.
|
|
9
|
+
*
|
|
10
|
+
* It cannot ride in a cell. The row parser splits on `|` and requires exactly
|
|
11
|
+
* ten cells, so anything appended to a row makes an eleventh and the row stops
|
|
12
|
+
* parsing: the annotation would survive one write and vanish on the next
|
|
13
|
+
* `expand`. On its own line beneath the table it is ignored by the row parser
|
|
14
|
+
* by construction, which is the difference between round-trip safety and
|
|
15
|
+
* round-trip carefulness.
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
const node_test_1 = require("node:test");
|
|
52
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
53
|
+
const TraceabilityFormat_1 = require("../../src/domain/TraceabilityFormat");
|
|
54
|
+
const row = (requirement, extra = {}) => ({
|
|
55
|
+
requirement,
|
|
56
|
+
scenarioId: `SCN-${requirement.slice(4)}`,
|
|
57
|
+
featureFile: `features/${requirement}.feature`,
|
|
58
|
+
status: "Draft",
|
|
59
|
+
...extra,
|
|
60
|
+
});
|
|
61
|
+
(0, node_test_1.test)("a matrix with no dependencies gains no annotation", () => {
|
|
62
|
+
const md = (0, TraceabilityFormat_1.buildTraceabilityMarkdown)([row("REQ-001")], "rich");
|
|
63
|
+
assert.doesNotMatch(md, /csda:trace/);
|
|
64
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)(md), {});
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.test)("a declared dependency is written beneath the table and read back", () => {
|
|
67
|
+
const md = (0, TraceabilityFormat_1.buildTraceabilityMarkdown)([row("REQ-001"), row("REQ-002", { dependsOn: ["REQ-001"] })], "rich");
|
|
68
|
+
assert.match(md, /<!-- csda:trace REQ-002 depends=REQ-001 -->/);
|
|
69
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)(md), { "REQ-002": ["REQ-001"] });
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.test)("the annotation survives a rebuild, which is the whole reason for its placement", () => {
|
|
72
|
+
// `expand` reads the matrix, rebuilds it and writes it back. An annotation
|
|
73
|
+
// that does not round-trip is one that disappears the second time a pack is
|
|
74
|
+
// installed — the worst kind, because it worked when it was tested.
|
|
75
|
+
const first = (0, TraceabilityFormat_1.buildTraceabilityMarkdown)([row("REQ-001"), row("REQ-002", { dependsOn: ["REQ-001"] })], "rich");
|
|
76
|
+
const parsed = (0, TraceabilityFormat_1.parseTraceabilityRows)(first);
|
|
77
|
+
assert.equal(parsed.rows.length, 2, "the rows must still parse alongside the annotation");
|
|
78
|
+
assert.deepEqual(parsed.rows[1].dependsOn, ["REQ-001"]);
|
|
79
|
+
const second = (0, TraceabilityFormat_1.buildTraceabilityMarkdown)(parsed.rows, "rich");
|
|
80
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)(second), { "REQ-002": ["REQ-001"] });
|
|
81
|
+
});
|
|
82
|
+
(0, node_test_1.test)("the rows still parse — the annotation is not mistaken for one", () => {
|
|
83
|
+
const md = (0, TraceabilityFormat_1.buildTraceabilityMarkdown)([row("REQ-001"), row("REQ-002", { dependsOn: ["REQ-001"] })], "rich");
|
|
84
|
+
const { rows, mode } = (0, TraceabilityFormat_1.parseTraceabilityRows)(md);
|
|
85
|
+
assert.equal(mode, "rich");
|
|
86
|
+
assert.deepEqual(rows.map((r) => r.requirement), ["REQ-001", "REQ-002"]);
|
|
87
|
+
});
|
|
88
|
+
(0, node_test_1.test)("several dependencies read back in order, and blank ones are dropped", () => {
|
|
89
|
+
assert.deepEqual((0, TraceabilityFormat_1.renderMatrixTraceLines)({ "REQ-003": { dependsOn: ["REQ-001", "REQ-002"] } }), [
|
|
90
|
+
"",
|
|
91
|
+
"<!-- csda:trace REQ-003 depends=REQ-001,REQ-002 -->",
|
|
92
|
+
]);
|
|
93
|
+
assert.deepEqual((0, TraceabilityFormat_1.renderMatrixTraceLines)({ "REQ-003": { dependsOn: [] } }), []);
|
|
94
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)("<!-- csda:trace REQ-003 depends=REQ-001, REQ-002 -->"), { "REQ-003": ["REQ-001", "REQ-002"] });
|
|
95
|
+
});
|
|
96
|
+
(0, node_test_1.test)("a comment that is not one of ours is left alone", () => {
|
|
97
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)("<!-- a note from a person -->"), {});
|
|
98
|
+
assert.deepEqual((0, TraceabilityFormat_1.parseMatrixDependencies)("<!-- csda:trace uc=UC-001 -->"), {});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=matrix-dependencies.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-dependencies.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/matrix-dependencies.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which agent profile a requirement gets (D1).
|
|
4
|
+
*
|
|
5
|
+
* `agent_profile` resolved one profile for the whole run, so the allowed tools
|
|
6
|
+
* had to be the greatest common denominator of everything in the plan — a
|
|
7
|
+
* domain requirement carrying `Bash(terraform:*)` because some other
|
|
8
|
+
* requirement needed it.
|
|
9
|
+
*
|
|
10
|
+
* The criterion took measuring. The proposal named the bounded context, "which
|
|
11
|
+
* is already in the model": it is in the *pack* model and was not reachable
|
|
12
|
+
* from a requirement — zero of the twenty-seven scenarios across the curated
|
|
13
|
+
* packs link to an aggregate. Matching on it would have matched nothing, every
|
|
14
|
+
* time, and quietly used the default. So `expand` derives it now and these
|
|
15
|
+
* rules match what is written.
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
const node_test_1 = require("node:test");
|
|
52
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
53
|
+
const ProfileMatch_1 = require("../../src/domain/ProfileMatch");
|
|
54
|
+
const infra = { name: "infra", match: { bounded_context: "Platform" } };
|
|
55
|
+
const domain = { name: "domain", match: { bounded_context: "*" } };
|
|
56
|
+
(0, node_test_1.test)("a rule matches the context it names", () => {
|
|
57
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(infra, { boundedContext: "Platform" }), true);
|
|
58
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(infra, { boundedContext: "Billing" }), false);
|
|
59
|
+
});
|
|
60
|
+
(0, node_test_1.test)("first match wins, so order in the file is the priority", () => {
|
|
61
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([infra, domain], { boundedContext: "Platform" }), "infra");
|
|
62
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([infra, domain], { boundedContext: "Billing" }), "domain");
|
|
63
|
+
// Reversed, the catch-all swallows everything — which is what "first match
|
|
64
|
+
// wins" means, and why it is stated rather than left to be discovered.
|
|
65
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([domain, infra], { boundedContext: "Platform" }), "domain");
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.test)("no match is not an error — the run's default applies", () => {
|
|
68
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([infra], { boundedContext: "Billing" }), null);
|
|
69
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([], { boundedContext: "Platform" }), null);
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.test)("a requirement with no context matches only nothing, never the catch-all", () => {
|
|
72
|
+
// `*` means "any context", not "no context". A requirement the tool could not
|
|
73
|
+
// place must fall through to the default rather than be handed the tools of
|
|
74
|
+
// whichever profile happened to be last.
|
|
75
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(domain, {}), false);
|
|
76
|
+
assert.equal((0, ProfileMatch_1.selectProfile)([domain], {}), null);
|
|
77
|
+
});
|
|
78
|
+
(0, node_test_1.test)("a profile with no match: never matches", () => {
|
|
79
|
+
// An ordinary profile, named by `agent_profile`, is not a rule. Treating an
|
|
80
|
+
// absent `match:` as "matches everything" would make the first profile in the
|
|
81
|
+
// file swallow every requirement the moment somebody adds a rule to another.
|
|
82
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)({ name: "plain" }, { boundedContext: "Platform" }), false);
|
|
83
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)({ name: "plain", match: {} }, { boundedContext: "Platform" }), false);
|
|
84
|
+
});
|
|
85
|
+
(0, node_test_1.test)("every criterion has to hold, not just one", () => {
|
|
86
|
+
const rule = {
|
|
87
|
+
name: "narrow",
|
|
88
|
+
match: { bounded_context: "Billing", category: "NEEDS_TEST" },
|
|
89
|
+
};
|
|
90
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { boundedContext: "Billing", category: "NEEDS_TEST" }), true);
|
|
91
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { boundedContext: "Billing", category: "DONE" }), false);
|
|
92
|
+
});
|
|
93
|
+
(0, node_test_1.test)("an unknown key matches nothing rather than being ignored", () => {
|
|
94
|
+
// Ignoring it would make `match: { bounded_contex: "Platform" }` — one letter
|
|
95
|
+
// short — a rule that matches everything.
|
|
96
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)({ name: "typo", match: { bounded_contex: "Platform" } }, { boundedContext: "Platform" }), false);
|
|
97
|
+
assert.deepEqual([...ProfileMatch_1.MATCHABLE_KEYS].sort(), [
|
|
98
|
+
"bounded_context",
|
|
99
|
+
"category",
|
|
100
|
+
"feature",
|
|
101
|
+
"requirement",
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
(0, node_test_1.test)("`*` works inside a pattern, and matching is case-insensitive", () => {
|
|
105
|
+
const rule = { name: "billing", match: { feature: "features/billing/*" } };
|
|
106
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { featureFile: "features/billing/invoice.feature" }), true);
|
|
107
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { featureFile: "features/auth/login.feature" }), false);
|
|
108
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)({ name: "x", match: { bounded_context: "platform" } }, { boundedContext: "Platform" }), true);
|
|
109
|
+
});
|
|
110
|
+
(0, node_test_1.test)("a dot in a pattern is a dot, not any character", () => {
|
|
111
|
+
const rule = { name: "x", match: { feature: "a.feature" } };
|
|
112
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { featureFile: "a.feature" }), true);
|
|
113
|
+
assert.equal((0, ProfileMatch_1.ruleMatches)(rule, { featureFile: "axfeature" }), false);
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=profile-match.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-match.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/profile-match.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `reconcile` decides what `specops sync` does to each file. Every branch is
|
|
4
|
+
* a way a project's local edit can survive or be lost, so each gets a test —
|
|
5
|
+
* which is the point of the decision having been lifted away from the disk.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
const node_test_1 = require("node:test");
|
|
42
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
43
|
+
const Reconciliation_1 = require("../../src/domain/Reconciliation");
|
|
44
|
+
/** A merge that must not be reached. */
|
|
45
|
+
const noMerge = () => {
|
|
46
|
+
throw new Error("reconcile should not have needed a merge here");
|
|
47
|
+
};
|
|
48
|
+
const cleanMerge = () => ({ merged: "MERGED", conflict: false });
|
|
49
|
+
const conflictMerge = () => ({ merged: "<<<<<<< markers", conflict: true });
|
|
50
|
+
(0, node_test_1.test)("a file the project does not have is written", () => {
|
|
51
|
+
assert.deepEqual((0, Reconciliation_1.reconcile)(null, null, "pack", {}, noMerge), {
|
|
52
|
+
outcome: "added",
|
|
53
|
+
write: "pack",
|
|
54
|
+
baselineContent: "pack",
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.test)("a file already matching the pack is left alone", () => {
|
|
58
|
+
const d = (0, Reconciliation_1.reconcile)("old", "pack", "pack", {}, noMerge);
|
|
59
|
+
assert.equal(d.outcome, "unchanged");
|
|
60
|
+
assert.equal(d.write, null, "nothing to write");
|
|
61
|
+
assert.equal(d.baselineContent, "pack", "the baseline still moves forward");
|
|
62
|
+
});
|
|
63
|
+
(0, node_test_1.test)("--force takes the pack's version without consulting the baseline", () => {
|
|
64
|
+
const d = (0, Reconciliation_1.reconcile)("base", "local edit", "pack", { force: true }, noMerge);
|
|
65
|
+
assert.equal(d.outcome, "overwritten");
|
|
66
|
+
assert.equal(d.write, "pack");
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.test)("without a baseline the local file is never touched", () => {
|
|
69
|
+
// The critical branch: guessing here is how an edit disappears silently.
|
|
70
|
+
const d = (0, Reconciliation_1.reconcile)(null, "local edit", "pack", {}, noMerge);
|
|
71
|
+
assert.equal(d.outcome, "conflict-no-base");
|
|
72
|
+
assert.equal(d.write, null);
|
|
73
|
+
assert.equal(d.baselineContent, null, "the baseline must not be invented either");
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.test)("an unedited local file follows the pack", () => {
|
|
76
|
+
const d = (0, Reconciliation_1.reconcile)("base", "base", "pack", {}, noMerge);
|
|
77
|
+
assert.equal(d.outcome, "updated");
|
|
78
|
+
assert.equal(d.write, "pack");
|
|
79
|
+
});
|
|
80
|
+
(0, node_test_1.test)("a pack that did not move leaves local edits standing", () => {
|
|
81
|
+
const d = (0, Reconciliation_1.reconcile)("base", "local edit", "base", {}, noMerge);
|
|
82
|
+
assert.equal(d.outcome, "kept");
|
|
83
|
+
assert.equal(d.write, null);
|
|
84
|
+
assert.equal(d.baselineContent, "base");
|
|
85
|
+
});
|
|
86
|
+
(0, node_test_1.test)("both sides moved and the merge is clean: the merge is written", () => {
|
|
87
|
+
const d = (0, Reconciliation_1.reconcile)("base", "local edit", "pack edit", {}, cleanMerge);
|
|
88
|
+
assert.equal(d.outcome, "merged");
|
|
89
|
+
assert.equal(d.write, "MERGED");
|
|
90
|
+
assert.equal(d.baselineContent, "pack edit");
|
|
91
|
+
});
|
|
92
|
+
(0, node_test_1.test)("both sides moved and the merge conflicts: markers are written", () => {
|
|
93
|
+
const d = (0, Reconciliation_1.reconcile)("base", "local edit", "pack edit", {}, conflictMerge);
|
|
94
|
+
assert.equal(d.outcome, "conflict");
|
|
95
|
+
assert.equal(d.write, "<<<<<<< markers");
|
|
96
|
+
assert.equal(d.baselineContent, "base", "the baseline stays put until resolved");
|
|
97
|
+
});
|
|
98
|
+
(0, node_test_1.test)("--abort-on-conflict leaves the file untouched instead", () => {
|
|
99
|
+
const d = (0, Reconciliation_1.reconcile)("base", "local edit", "pack edit", { abortOnConflict: true }, conflictMerge);
|
|
100
|
+
assert.equal(d.outcome, "conflict-skipped");
|
|
101
|
+
assert.equal(d.write, null);
|
|
102
|
+
assert.equal(d.baselineContent, "base");
|
|
103
|
+
});
|
|
104
|
+
(0, node_test_1.test)("every conflict outcome is labelled, and labelled as a conflict", () => {
|
|
105
|
+
for (const outcome of Reconciliation_1.CONFLICT_OUTCOMES) {
|
|
106
|
+
assert.match(Reconciliation_1.OUTCOME_LABEL[outcome], /CONFLICT/, `${outcome} should read as a conflict`);
|
|
107
|
+
}
|
|
108
|
+
for (const outcome of Object.keys(Reconciliation_1.OUTCOME_LABEL)) {
|
|
109
|
+
assert.ok(Reconciliation_1.OUTCOME_LABEL[outcome], `${outcome} has no label`);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=reconciliation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconciliation.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/reconciliation.test.ts"],"names":[],"mappings":"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"}
|