@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,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ValidateProjectUseCase` is the only place that judges a traceability matrix.
|
|
4
|
+
* `specgate validate` renders what it returns, so these tests are where that
|
|
5
|
+
* judgement is pinned — the command tests exercise the rendering on top.
|
|
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 ValidateProjectUseCase_1 = require("../../src/application/ValidateProjectUseCase");
|
|
44
|
+
const TraceabilityFormat_1 = require("../../src/domain/TraceabilityFormat");
|
|
45
|
+
const SEP_10 = "|---|---|---|---|---|---|---|---|---|---|";
|
|
46
|
+
/** A rich matrix built from `[requirement, scenarioId, testArtifact, status]`. */
|
|
47
|
+
function richMatrix(rows) {
|
|
48
|
+
const body = rows.map(([req, scn, test, status]) => `| ${req} | ${scn} | f.feature | UC-1 | C | A | E | src/x.ts | ${test} | ${status} |`);
|
|
49
|
+
return [TraceabilityFormat_1.RICH_HEADER, SEP_10, ...body].join("\n") + "\n";
|
|
50
|
+
}
|
|
51
|
+
function repoReturning(content) {
|
|
52
|
+
return {
|
|
53
|
+
readTraceability: () => content,
|
|
54
|
+
writeTraceability: () => {
|
|
55
|
+
throw new Error("validation must not write");
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const useCase = (content = null) => new ValidateProjectUseCase_1.ValidateProjectUseCase(repoReturning(content));
|
|
60
|
+
// ── the matrix shape ─────────────────────────────────────────────────────────
|
|
61
|
+
(0, node_test_1.test)("a missing traceability.md is an error naming the project", () => {
|
|
62
|
+
const { report, mode } = useCase(null).execute("/tmp/proj");
|
|
63
|
+
assert.equal(mode, null);
|
|
64
|
+
assert.equal(report.valid, false);
|
|
65
|
+
assert.deepEqual(report.errors.map((e) => e.code), ["traceability_missing"]);
|
|
66
|
+
assert.match(report.errors[0].message, /\/tmp\/proj/);
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.test)("neither header present is reported as a missing header, not as bad rows", () => {
|
|
69
|
+
const { report, mode } = useCase().checkMatrix("# Traceability Matrix\n\nnothing here\n");
|
|
70
|
+
assert.equal(mode, null);
|
|
71
|
+
assert.deepEqual(report.errors.map((e) => e.code), ["traceability_header_missing"]);
|
|
72
|
+
assert.ok(report.errors[0].fixLines?.some((l) => l.includes(TraceabilityFormat_1.RICH_HEADER)));
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.test)("both matrix shapes are recognised", () => {
|
|
75
|
+
assert.equal(useCase().checkMatrix(richMatrix([])).mode, "rich");
|
|
76
|
+
const legacy = [
|
|
77
|
+
TraceabilityFormat_1.LEGACY_HEADER,
|
|
78
|
+
"|---|---|---|---|",
|
|
79
|
+
"| f.feature | SCN-001 | src/x.ts | Draft |",
|
|
80
|
+
].join("\n");
|
|
81
|
+
assert.equal(useCase().checkMatrix(legacy).mode, "legacy");
|
|
82
|
+
});
|
|
83
|
+
// ── row-level checks ─────────────────────────────────────────────────────────
|
|
84
|
+
(0, node_test_1.test)("a well-formed matrix produces no findings", () => {
|
|
85
|
+
const { report, requirements } = useCase().checkMatrix(richMatrix([
|
|
86
|
+
["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"],
|
|
87
|
+
["REQ-002", "SCN-002", "tests/b.test.ts", "Draft"],
|
|
88
|
+
]));
|
|
89
|
+
assert.deepEqual(report.findings, []);
|
|
90
|
+
assert.deepEqual([...requirements].sort(), ["REQ-001", "REQ-002"]);
|
|
91
|
+
});
|
|
92
|
+
(0, node_test_1.test)("an unknown status is an error that lists what is allowed", () => {
|
|
93
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Shipped"]]));
|
|
94
|
+
const finding = report.errors.find((e) => e.code === "invalid_status");
|
|
95
|
+
assert.ok(finding, "expected invalid_status");
|
|
96
|
+
assert.match(finding.message, /Shipped/);
|
|
97
|
+
assert.ok(finding.fixLines?.[0].includes("Ready for Dev"));
|
|
98
|
+
});
|
|
99
|
+
(0, node_test_1.test)("a repeated Scenario ID is an error, but `-` is not an id", () => {
|
|
100
|
+
const { report } = useCase().checkMatrix(richMatrix([
|
|
101
|
+
["REQ-001", "SCN-001", "tests/a.test.ts", "Draft"],
|
|
102
|
+
["REQ-002", "SCN-001", "tests/b.test.ts", "Draft"],
|
|
103
|
+
]));
|
|
104
|
+
assert.deepEqual(report.errors.map((e) => e.code), ["duplicate_scenario_id"]);
|
|
105
|
+
const placeholders = useCase().checkMatrix(richMatrix([
|
|
106
|
+
["REQ-001", "-", "tests/a.test.ts", "Draft"],
|
|
107
|
+
["REQ-002", "-", "tests/b.test.ts", "Draft"],
|
|
108
|
+
]));
|
|
109
|
+
assert.deepEqual(placeholders.report.findings, []);
|
|
110
|
+
});
|
|
111
|
+
// ── the strict-TDD gate ──────────────────────────────────────────────────────
|
|
112
|
+
(0, node_test_1.test)("strict TDD is off by default", () => {
|
|
113
|
+
const matrix = richMatrix([["REQ-001", "SCN-001", "TBD", "In Dev"]]);
|
|
114
|
+
assert.deepEqual(useCase().checkMatrix(matrix).report.findings, []);
|
|
115
|
+
});
|
|
116
|
+
(0, node_test_1.test)("TDD-1: a TBD test artifact past Draft is a violation", () => {
|
|
117
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "TBD", "In Dev"]]), {
|
|
118
|
+
strictTdd: true,
|
|
119
|
+
});
|
|
120
|
+
assert.equal(report.errors.length, 1);
|
|
121
|
+
assert.match(report.errors[0].message, /^\[TDD-1\]/);
|
|
122
|
+
});
|
|
123
|
+
(0, node_test_1.test)("TDD-1 does not fire while the row is still Draft", () => {
|
|
124
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "TBD", "Draft"]]), {
|
|
125
|
+
strictTdd: true,
|
|
126
|
+
});
|
|
127
|
+
assert.deepEqual(report.findings, []);
|
|
128
|
+
});
|
|
129
|
+
(0, node_test_1.test)("TDD-2: a row past Draft with no Scenario ID is a violation", () => {
|
|
130
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "", "tests/a.test.ts", "Ready for Dev"]]), { strictTdd: true });
|
|
131
|
+
assert.equal(report.errors.length, 1);
|
|
132
|
+
assert.match(report.errors[0].message, /^\[TDD-2\]/);
|
|
133
|
+
});
|
|
134
|
+
(0, node_test_1.test)("TDD-3: a REQ in spec.md with no matrix row is a violation", () => {
|
|
135
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"]]), { strictTdd: true, specContent: "REQ-001 is here and so is REQ-002.\n" });
|
|
136
|
+
assert.equal(report.errors.length, 1);
|
|
137
|
+
assert.match(report.errors[0].message, /^\[TDD-3\] Requirement REQ-002/);
|
|
138
|
+
});
|
|
139
|
+
(0, node_test_1.test)("TDD-3 is skipped when spec.md was not supplied", () => {
|
|
140
|
+
const { report } = useCase().checkMatrix(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Implemented"]]), { strictTdd: true, specContent: null });
|
|
141
|
+
assert.deepEqual(report.findings, []);
|
|
142
|
+
});
|
|
143
|
+
(0, node_test_1.test)("findings keep the order the checks ran in, so the first error is stable", () => {
|
|
144
|
+
const { report } = useCase().checkMatrix(richMatrix([
|
|
145
|
+
["REQ-001", "SCN-001", "tests/a.test.ts", "Bogus"],
|
|
146
|
+
["REQ-002", "SCN-001", "TBD", "In Dev"],
|
|
147
|
+
]), { strictTdd: true });
|
|
148
|
+
// Per row: duplicate id, then status, then the TDD gate. Note TDD-1 needs a
|
|
149
|
+
// *valid* post-Draft status, so an unknown status suppresses it on that row.
|
|
150
|
+
assert.deepEqual(report.findings.map((f) => f.code), ["invalid_status", "duplicate_scenario_id", "strict_tdd_violation"]);
|
|
151
|
+
});
|
|
152
|
+
(0, node_test_1.test)("validation never writes the matrix back", () => {
|
|
153
|
+
// The repository throws on write; reaching the end means nothing tried.
|
|
154
|
+
assert.doesNotThrow(() => useCase(richMatrix([["REQ-001", "SCN-001", "tests/a.test.ts", "Draft"]])).execute("/tmp/proj"));
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=validate-project.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-project.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/validate-project.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Does the value a spec declares match the value the code declares? (§8.6.)
|
|
4
|
+
*
|
|
5
|
+
* Pure domain logic only — no filesystem, no correlation with a matrix row.
|
|
6
|
+
* That wiring lives in `ReportCommand.ts`; these tests pin the three
|
|
7
|
+
* functions it composes: extract from a trace comment, extract from a
|
|
8
|
+
* source file's text, compare.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const node_test_1 = require("node:test");
|
|
45
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
46
|
+
const ValueAnnotations_1 = require("../../src/domain/ValueAnnotations");
|
|
47
|
+
(0, node_test_1.test)("value_ keys are extracted and their prefix stripped; other keys are ignored", () => {
|
|
48
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ uc: "Login", value_session_timeout: "15m", depends: "REQ-001" }), [{ id: "session_timeout", value: "15m" }]);
|
|
49
|
+
});
|
|
50
|
+
(0, node_test_1.test)("declaredSpecValues tolerates a trace with no value_ keys, or no trace at all", () => {
|
|
51
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ uc: "Login" }), []);
|
|
52
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)(null), []);
|
|
53
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)(undefined), []);
|
|
54
|
+
});
|
|
55
|
+
(0, node_test_1.test)("a bare 'value_' with nothing after the prefix is not a valid id", () => {
|
|
56
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredSpecValues)({ value_: "15m" }), []);
|
|
57
|
+
});
|
|
58
|
+
(0, node_test_1.test)("csda:value is found regardless of comment syntax, because it is not parsed as one", () => {
|
|
59
|
+
const source = [
|
|
60
|
+
"// csda:value session_timeout=15m",
|
|
61
|
+
"const SESSION_TIMEOUT = '15m';",
|
|
62
|
+
"# csda:value max_attempts=5",
|
|
63
|
+
"-- csda:value lockout_minutes=60",
|
|
64
|
+
"not a marker at all",
|
|
65
|
+
].join("\n");
|
|
66
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredCodeValues)(source), [
|
|
67
|
+
{ id: "session_timeout", value: "15m", line: 1 },
|
|
68
|
+
{ id: "max_attempts", value: "5", line: 3 },
|
|
69
|
+
{ id: "lockout_minutes", value: "60", line: 4 },
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.test)("declaredCodeValues finds nothing in a file with no marker", () => {
|
|
73
|
+
assert.deepEqual((0, ValueAnnotations_1.declaredCodeValues)("const x = 1;\nfunction f() {}\n"), []);
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.test)("matched: same id, same literal value on both sides", () => {
|
|
76
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [{ id: "session_timeout", value: "15m", line: 12, file: "src/auth.ts" }]);
|
|
77
|
+
assert.deepEqual(result, [
|
|
78
|
+
{
|
|
79
|
+
id: "session_timeout",
|
|
80
|
+
specValue: "15m",
|
|
81
|
+
codeValue: "15m",
|
|
82
|
+
codeFile: "src/auth.ts",
|
|
83
|
+
codeLine: 12,
|
|
84
|
+
status: "matched",
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
(0, node_test_1.test)("diverging: same id, different literal — no unit interpretation", () => {
|
|
89
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [{ id: "session_timeout", value: "900000", line: 12, file: "src/auth.ts" }]);
|
|
90
|
+
assert.equal(result[0].status, "diverging");
|
|
91
|
+
// 15m and 900000 mean the same duration; this module does not know that,
|
|
92
|
+
// and is not supposed to (PLAN_PREDICTABLE_CODE_EVOLUTION.md §5, the H13 trap).
|
|
93
|
+
assert.equal(result[0].specValue, "15m");
|
|
94
|
+
assert.equal(result[0].codeValue, "900000");
|
|
95
|
+
});
|
|
96
|
+
(0, node_test_1.test)("spec_only: the spec declares a value with no matching code marker", () => {
|
|
97
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], []);
|
|
98
|
+
assert.deepEqual(result, [
|
|
99
|
+
{
|
|
100
|
+
id: "session_timeout",
|
|
101
|
+
specValue: "15m",
|
|
102
|
+
codeValue: null,
|
|
103
|
+
codeFile: null,
|
|
104
|
+
codeLine: null,
|
|
105
|
+
status: "spec_only",
|
|
106
|
+
},
|
|
107
|
+
]);
|
|
108
|
+
});
|
|
109
|
+
(0, node_test_1.test)("code_only: a csda:value marker with no matching spec declaration", () => {
|
|
110
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([], [{ id: "retry_backoff", value: "2s", line: 5, file: "src/retry.ts" }]);
|
|
111
|
+
assert.deepEqual(result, [
|
|
112
|
+
{
|
|
113
|
+
id: "retry_backoff",
|
|
114
|
+
specValue: null,
|
|
115
|
+
codeValue: "2s",
|
|
116
|
+
codeFile: "src/retry.ts",
|
|
117
|
+
codeLine: 5,
|
|
118
|
+
status: "code_only",
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
});
|
|
122
|
+
(0, node_test_1.test)("a repeated code marker for the same id keeps its first occurrence, deterministically", () => {
|
|
123
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "session_timeout", value: "15m" }], [
|
|
124
|
+
{ id: "session_timeout", value: "15m", line: 3, file: "src/a.ts" },
|
|
125
|
+
{ id: "session_timeout", value: "30m", line: 9, file: "src/b.ts" },
|
|
126
|
+
]);
|
|
127
|
+
assert.equal(result.length, 1);
|
|
128
|
+
assert.equal(result[0].codeFile, "src/a.ts");
|
|
129
|
+
assert.equal(result[0].status, "matched");
|
|
130
|
+
});
|
|
131
|
+
(0, node_test_1.test)("ids are scoped to whatever entries the caller passes — no global comparison", () => {
|
|
132
|
+
// Two unrelated requirements can reuse the same id name without being
|
|
133
|
+
// compared against each other; that scoping is the caller's job (one call
|
|
134
|
+
// per requirement), and this test pins that the function itself does not
|
|
135
|
+
// need to know about requirements at all to behave correctly.
|
|
136
|
+
const reqA = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "limit", value: "5" }], [{ id: "limit", value: "5", line: 1, file: "src/a.ts" }]);
|
|
137
|
+
const reqB = (0, ValueAnnotations_1.compareDeclaredValues)([{ id: "limit", value: "10" }], [{ id: "limit", value: "999", line: 1, file: "src/b.ts" }]);
|
|
138
|
+
assert.equal(reqA[0].status, "matched");
|
|
139
|
+
assert.equal(reqB[0].status, "diverging");
|
|
140
|
+
});
|
|
141
|
+
(0, node_test_1.test)("multiple ids in one requirement are each classified independently", () => {
|
|
142
|
+
const result = (0, ValueAnnotations_1.compareDeclaredValues)([
|
|
143
|
+
{ id: "session_timeout", value: "15m" },
|
|
144
|
+
{ id: "max_attempts", value: "5" },
|
|
145
|
+
], [{ id: "session_timeout", value: "30m", line: 1, file: "src/a.ts" }]);
|
|
146
|
+
const byId = Object.fromEntries(result.map((r) => [r.id, r.status]));
|
|
147
|
+
assert.deepEqual(byId, { session_timeout: "diverging", max_attempts: "spec_only" });
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=value-annotations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-annotations.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/value-annotations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The write-scope guard (A1, closes H16).
|
|
4
|
+
*
|
|
5
|
+
* The prompt asks the agent not to touch the spec; until now nothing checked.
|
|
6
|
+
* An agent that cannot make a scenario pass can relax the scenario instead, and
|
|
7
|
+
* `validate --strict-tdd` approves — it verifies the feature exists and is in
|
|
8
|
+
* the matrix, never that it still says what it said. "Specs as executable
|
|
9
|
+
* contracts" stops being true when the executor may edit the contract.
|
|
10
|
+
*
|
|
11
|
+
* The glob matcher gets the most attention here because it is hand-written (no
|
|
12
|
+
* runtime dependencies) and because a guard that silently matches nothing is
|
|
13
|
+
* worse than no guard: it reports "clean" over an edited spec.
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
const node_test_1 = require("node:test");
|
|
50
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
51
|
+
const WriteScope_1 = require("../../src/domain/WriteScope");
|
|
52
|
+
// ── the matcher ──────────────────────────────────────────────────────────────
|
|
53
|
+
(0, node_test_1.test)("`*` stops at a directory separator and `**` crosses it", () => {
|
|
54
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features/health.feature", "features/*.feature"), true);
|
|
55
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features/core/health.feature", "features/*.feature"), false);
|
|
56
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features/core/health.feature", "features/**/*.feature"), true);
|
|
57
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features/a/b/c/health.feature", "features/**/*.feature"), true);
|
|
58
|
+
// `**/` must also match zero directories, or the top level escapes the guard.
|
|
59
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features/health.feature", "features/**/*.feature"), true);
|
|
60
|
+
});
|
|
61
|
+
(0, node_test_1.test)("a subtree pattern covers the directory and everything under it", () => {
|
|
62
|
+
assert.equal((0, WriteScope_1.matchesGlob)("docs/specs", "docs/specs/**"), true);
|
|
63
|
+
assert.equal((0, WriteScope_1.matchesGlob)("docs/specs/adr/0021-x.md", "docs/specs/**"), true);
|
|
64
|
+
assert.equal((0, WriteScope_1.matchesGlob)("docs/specs-other/x.md", "docs/specs/**"), false);
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.test)("an exact name matches itself and nothing that merely contains it", () => {
|
|
67
|
+
assert.equal((0, WriteScope_1.matchesGlob)("spec.md", "spec.md"), true);
|
|
68
|
+
assert.equal((0, WriteScope_1.matchesGlob)("docs/spec.md", "spec.md"), false);
|
|
69
|
+
assert.equal((0, WriteScope_1.matchesGlob)("myspec.md", "spec.md"), false);
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.test)("dots are literal, not any-character", () => {
|
|
72
|
+
// `.specops.lock` as a regex would otherwise match `xspecopsxlock`.
|
|
73
|
+
assert.equal((0, WriteScope_1.matchesGlob)(".specops.lock", ".specops.lock"), true);
|
|
74
|
+
assert.equal((0, WriteScope_1.matchesGlob)("xspecopsxlock", ".specops.lock"), false);
|
|
75
|
+
});
|
|
76
|
+
(0, node_test_1.test)("windows separators are matched as the posix paths git reports", () => {
|
|
77
|
+
assert.equal((0, WriteScope_1.matchesGlob)("features\\core\\health.feature", "features/**/*.feature"), true);
|
|
78
|
+
});
|
|
79
|
+
// ── the rules ────────────────────────────────────────────────────────────────
|
|
80
|
+
(0, node_test_1.test)("the defaults protect every term of the contract", () => {
|
|
81
|
+
for (const p of [
|
|
82
|
+
"spec.md",
|
|
83
|
+
"AI_RULES.md",
|
|
84
|
+
"features/core/health.feature",
|
|
85
|
+
"docs/specs/adr/0021-x.md",
|
|
86
|
+
".specops.lock",
|
|
87
|
+
"harness.config.yaml",
|
|
88
|
+
]) {
|
|
89
|
+
assert.ok((0, WriteScope_1.protectingPattern)(p), `${p} should be protected by default`);
|
|
90
|
+
}
|
|
91
|
+
assert.equal((0, WriteScope_1.protectingPattern)("src/main/java/App.java"), null);
|
|
92
|
+
assert.equal((0, WriteScope_1.protectingPattern)("README.md"), null);
|
|
93
|
+
});
|
|
94
|
+
(0, node_test_1.test)("allow_paths is an escape hatch, and it wins", () => {
|
|
95
|
+
const rules = { allowPaths: ["features/legacy/**"] };
|
|
96
|
+
assert.equal((0, WriteScope_1.protectingPattern)("features/legacy/old.feature", rules), null);
|
|
97
|
+
assert.ok((0, WriteScope_1.protectingPattern)("features/core/health.feature", rules));
|
|
98
|
+
});
|
|
99
|
+
(0, node_test_1.test)("a project can name its own protected paths instead of the defaults", () => {
|
|
100
|
+
const rules = { protectedPaths: ["contracts/**"] };
|
|
101
|
+
assert.ok((0, WriteScope_1.protectingPattern)("contracts/api.yaml", rules));
|
|
102
|
+
// Naming your own list replaces the defaults; that is the point of naming it.
|
|
103
|
+
assert.equal((0, WriteScope_1.protectingPattern)("spec.md", rules), null);
|
|
104
|
+
});
|
|
105
|
+
(0, node_test_1.test)("editing a protected file is a violation, and the report says which rule", () => {
|
|
106
|
+
const found = (0, WriteScope_1.checkWriteScope)({
|
|
107
|
+
modified: ["features/core/health.feature", "src/App.java"],
|
|
108
|
+
added: [],
|
|
109
|
+
});
|
|
110
|
+
assert.equal(found.length, 1);
|
|
111
|
+
assert.equal(found[0].path, "features/core/health.feature");
|
|
112
|
+
assert.equal(found[0].pattern, "features/**/*.feature");
|
|
113
|
+
});
|
|
114
|
+
(0, node_test_1.test)("creating a feature that did not exist is allowed — NEEDS_FEATURE needs it", () => {
|
|
115
|
+
// The distinction A1 asks for, and the one git already draws: new is not an
|
|
116
|
+
// edit. A matrix row aims the gate at one specific file, so a new file cannot
|
|
117
|
+
// loosen the contract being run.
|
|
118
|
+
assert.deepEqual((0, WriteScope_1.checkWriteScope)({ modified: [], added: ["features/core/new-thing.feature", "spec.md"] }), []);
|
|
119
|
+
});
|
|
120
|
+
(0, node_test_1.test)("deleting the declared feature is refused, not treated as a rewrite", () => {
|
|
121
|
+
const found = (0, WriteScope_1.checkWriteScope)({
|
|
122
|
+
modified: ["features/core/health.feature"],
|
|
123
|
+
added: ["features/core/health-v2.feature"],
|
|
124
|
+
});
|
|
125
|
+
assert.equal(found.length, 1, "the deletion must still be caught");
|
|
126
|
+
});
|
|
127
|
+
(0, node_test_1.test)("violations come back sorted, so two runs read the same", () => {
|
|
128
|
+
const found = (0, WriteScope_1.checkWriteScope)({ modified: ["spec.md", "AI_RULES.md"], added: [] });
|
|
129
|
+
assert.deepEqual(found.map((v) => v.path), ["AI_RULES.md", "spec.md"]);
|
|
130
|
+
});
|
|
131
|
+
// ── reading git ──────────────────────────────────────────────────────────────
|
|
132
|
+
(0, node_test_1.test)("porcelain status separates new files from edits by their code", () => {
|
|
133
|
+
const changes = (0, WriteScope_1.parseGitStatus)([
|
|
134
|
+
" M spec.md",
|
|
135
|
+
"?? src/New.java",
|
|
136
|
+
" D features/core/health.feature",
|
|
137
|
+
"A docs/specs/adr/0030-x.md",
|
|
138
|
+
"",
|
|
139
|
+
].join("\n"));
|
|
140
|
+
assert.deepEqual(changes.added, ["src/New.java"]);
|
|
141
|
+
assert.deepEqual([...changes.modified].sort(), [
|
|
142
|
+
"docs/specs/adr/0030-x.md",
|
|
143
|
+
"features/core/health.feature",
|
|
144
|
+
"spec.md",
|
|
145
|
+
]);
|
|
146
|
+
});
|
|
147
|
+
(0, node_test_1.test)("a rename counts both sides as edits", () => {
|
|
148
|
+
const changes = (0, WriteScope_1.parseGitStatus)("R spec.md -> spec-old.md\n");
|
|
149
|
+
assert.deepEqual([...changes.modified].sort(), ["spec-old.md", "spec.md"]);
|
|
150
|
+
assert.deepEqual(changes.added, []);
|
|
151
|
+
});
|
|
152
|
+
(0, node_test_1.test)("an empty status is not a violation", () => {
|
|
153
|
+
assert.deepEqual((0, WriteScope_1.parseGitStatus)(""), { modified: [], added: [] });
|
|
154
|
+
assert.deepEqual((0, WriteScope_1.checkWriteScope)((0, WriteScope_1.parseGitStatus)("")), []);
|
|
155
|
+
});
|
|
156
|
+
(0, node_test_1.test)("the guard the defaults describe actually fires end to end", () => {
|
|
157
|
+
// The failure this whole module exists to catch: an agent that could not pass
|
|
158
|
+
// the scenario edited the scenario.
|
|
159
|
+
const status = " M features/core/health.feature\n M src/App.java\n?? src/New.java\n";
|
|
160
|
+
const found = (0, WriteScope_1.checkWriteScope)((0, WriteScope_1.parseGitStatus)(status));
|
|
161
|
+
assert.equal(found.length, 1);
|
|
162
|
+
assert.equal(found[0].path, "features/core/health.feature");
|
|
163
|
+
assert.ok(WriteScope_1.DEFAULT_PROTECTED_PATHS.includes(found[0].pattern));
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=write-scope.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-scope.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/write-scope.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `parseYamlLite`, and the quoting it did not do (E1).
|
|
4
|
+
*
|
|
5
|
+
* The parser is a deliberate YAML subset: this package has no runtime
|
|
6
|
+
* dependencies, because the CLI runs through `npx` on other people's machines.
|
|
7
|
+
* `schemas/pack.schema.json` is the authority on the format; this only has to
|
|
8
|
+
* read it faithfully.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const node_test_1 = require("node:test");
|
|
45
|
+
const assert = __importStar(require("node:assert/strict"));
|
|
46
|
+
const YamlLite_1 = require("../../src/domain/YamlLite");
|
|
47
|
+
// ── Commas inside quotes are not separators (E1) ─────────────────────────────
|
|
48
|
+
//
|
|
49
|
+
// ADR-0020 taught this parser to read inline flow sequences, because the packs
|
|
50
|
+
// use them 54 times and they had been parsing as the literal string
|
|
51
|
+
// `"[Invoice]"`. What it did not teach it was quoting: the split ran on every
|
|
52
|
+
// comma, so one quoted phrase became several items, each carrying a stray quote
|
|
53
|
+
// character.
|
|
54
|
+
//
|
|
55
|
+
// `splitKeyValue` in this same file already tracks quotes properly. The flow
|
|
56
|
+
// branch simply did not use it — which is how a shipped pack ended up declaring
|
|
57
|
+
// four responsibilities where it wrote one.
|
|
58
|
+
(0, node_test_1.test)("a quoted item survives the commas inside it", () => {
|
|
59
|
+
// Measured on `packs/billing/backend`, which writes exactly this:
|
|
60
|
+
// responsibilities: ["Invoice line items, totals, status, aging"]
|
|
61
|
+
// and got back four items, the first `"Invoice line items` and the last
|
|
62
|
+
// `aging"`.
|
|
63
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: ["Invoice line items, totals, status, aging"]').a, [
|
|
64
|
+
"Invoice line items, totals, status, aging",
|
|
65
|
+
]);
|
|
66
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: ['x, y']").a, ["x, y"]);
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.test)("quoted and bare items mix in one sequence", () => {
|
|
69
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: ["one, two", three]').a, ["one, two", "three"]);
|
|
70
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)('a: [three, "one, two"]').a, ["three", "one, two"]);
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.test)("the ordinary case keeps working", () => {
|
|
73
|
+
// The reason the flow branch exists at all.
|
|
74
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: [Invoice, Payment]").a, ["Invoice", "Payment"]);
|
|
75
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: []").a, []);
|
|
76
|
+
assert.deepEqual((0, YamlLite_1.parseYamlLite)("a: [one]").a, ["one"]);
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=yaml-lite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-lite.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/yaml-lite.test.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAiC;AACjC,2DAA6C;AAE7C,wDAA0D;AAE1D,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,oEAAoE;AACpE,8EAA8E;AAC9E,gFAAgF;AAChF,aAAa;AACb,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,4CAA4C;AAE5C,IAAA,gBAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,kEAAkE;IAClE,oEAAoE;IACpE,wEAAwE;IACxE,YAAY;IACZ,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;QACpF,2CAA2C;KAC5C,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,4CAA4C;IAC5C,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,SAAS,CAAC,IAAA,wBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.detectStack = exports.AdoptProjectCommand = void 0;
|
|
5
|
+
const AdoptCommand_1 = require("./cli/commands/project/AdoptCommand");
|
|
6
|
+
Object.defineProperty(exports, "AdoptProjectCommand", { enumerable: true, get: function () { return AdoptCommand_1.AdoptProjectCommand; } });
|
|
7
|
+
Object.defineProperty(exports, "detectStack", { enumerable: true, get: function () { return AdoptCommand_1.detectStack; } });
|
|
8
|
+
if (require.main === module) {
|
|
9
|
+
new AdoptCommand_1.AdoptProjectCommand(process.argv.slice(2)).execute();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=adopt_project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt_project.js","sourceRoot":"","sources":["../../scripts/adopt_project.ts"],"names":[],"mappings":";;;;AACA,sEAAuF;AAE9E,oGAFA,kCAAmB,OAEA;AAAE,4FAFA,0BAAW,OAEA;AAEzC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,kCAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3D,CAAC"}
|