@planu/cli 0.63.7 → 0.64.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/dist/config/license-plans.json +16 -1
- package/dist/engine/a2a/capability-card.d.ts +16 -0
- package/dist/engine/a2a/capability-card.d.ts.map +1 -0
- package/dist/engine/a2a/capability-card.js +69 -0
- package/dist/engine/a2a/capability-card.js.map +1 -0
- package/dist/engine/a2a/delegate.d.ts +15 -0
- package/dist/engine/a2a/delegate.d.ts.map +1 -0
- package/dist/engine/a2a/delegate.js +47 -0
- package/dist/engine/a2a/delegate.js.map +1 -0
- package/dist/engine/a2a/fallback.d.ts +12 -0
- package/dist/engine/a2a/fallback.d.ts.map +1 -0
- package/dist/engine/a2a/fallback.js +52 -0
- package/dist/engine/a2a/fallback.js.map +1 -0
- package/dist/engine/a2a/index.d.ts +5 -0
- package/dist/engine/a2a/index.d.ts.map +1 -0
- package/dist/engine/a2a/index.js +6 -0
- package/dist/engine/a2a/index.js.map +1 -0
- package/dist/engine/a2a/task-manager.d.ts +39 -0
- package/dist/engine/a2a/task-manager.d.ts.map +1 -0
- package/dist/engine/a2a/task-manager.js +84 -0
- package/dist/engine/a2a/task-manager.js.map +1 -0
- package/dist/engine/ac-gap-detector/analyze-gaps.d.ts +13 -0
- package/dist/engine/ac-gap-detector/analyze-gaps.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector/analyze-gaps.js +43 -0
- package/dist/engine/ac-gap-detector/analyze-gaps.js.map +1 -0
- package/dist/engine/ac-gap-detector/constants.d.ts +22 -0
- package/dist/engine/ac-gap-detector/constants.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector/constants.js +143 -0
- package/dist/engine/ac-gap-detector/constants.js.map +1 -0
- package/dist/engine/ac-gap-detector/gap-rules.d.ts +16 -0
- package/dist/engine/ac-gap-detector/gap-rules.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector/gap-rules.js +180 -0
- package/dist/engine/ac-gap-detector/gap-rules.js.map +1 -0
- package/dist/engine/ac-gap-detector/pattern-matcher.d.ts +16 -0
- package/dist/engine/ac-gap-detector/pattern-matcher.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector/pattern-matcher.js +62 -0
- package/dist/engine/ac-gap-detector/pattern-matcher.js.map +1 -0
- package/dist/engine/ac-gap-detector.d.ts +3 -0
- package/dist/engine/ac-gap-detector.d.ts.map +1 -0
- package/dist/engine/ac-gap-detector.js +5 -0
- package/dist/engine/ac-gap-detector.js.map +1 -0
- package/dist/engine/architecture-pattern-detector/actor-temporal-detector.d.ts.map +1 -1
- package/dist/engine/architecture-pattern-detector/actor-temporal-detector.js +2 -0
- package/dist/engine/architecture-pattern-detector/actor-temporal-detector.js.map +1 -1
- package/dist/engine/audit-trail/attestation.d.ts +11 -0
- package/dist/engine/audit-trail/attestation.d.ts.map +1 -0
- package/dist/engine/audit-trail/attestation.js +47 -0
- package/dist/engine/audit-trail/attestation.js.map +1 -0
- package/dist/engine/audit-trail/index.d.ts +6 -0
- package/dist/engine/audit-trail/index.d.ts.map +1 -0
- package/dist/engine/audit-trail/index.js +6 -0
- package/dist/engine/audit-trail/index.js.map +1 -0
- package/dist/engine/audit-trail/logger.d.ts +17 -0
- package/dist/engine/audit-trail/logger.d.ts.map +1 -0
- package/dist/engine/audit-trail/logger.js +78 -0
- package/dist/engine/audit-trail/logger.js.map +1 -0
- package/dist/engine/audit-trail/query.d.ts +7 -0
- package/dist/engine/audit-trail/query.d.ts.map +1 -0
- package/dist/engine/audit-trail/query.js +61 -0
- package/dist/engine/audit-trail/query.js.map +1 -0
- package/dist/engine/audit-trail/utils.d.ts +18 -0
- package/dist/engine/audit-trail/utils.d.ts.map +1 -0
- package/dist/engine/audit-trail/utils.js +44 -0
- package/dist/engine/audit-trail/utils.js.map +1 -0
- package/dist/engine/audit-trail/verifier.d.ts +10 -0
- package/dist/engine/audit-trail/verifier.d.ts.map +1 -0
- package/dist/engine/audit-trail/verifier.js +78 -0
- package/dist/engine/audit-trail/verifier.js.map +1 -0
- package/dist/engine/auditor-architecture.d.ts.map +1 -1
- package/dist/engine/auditor-architecture.js +16 -13
- package/dist/engine/auditor-architecture.js.map +1 -1
- package/dist/engine/auth/config.d.ts +20 -0
- package/dist/engine/auth/config.d.ts.map +1 -0
- package/dist/engine/auth/config.js +49 -0
- package/dist/engine/auth/config.js.map +1 -0
- package/dist/engine/auth/index.d.ts +6 -0
- package/dist/engine/auth/index.d.ts.map +1 -0
- package/dist/engine/auth/index.js +7 -0
- package/dist/engine/auth/index.js.map +1 -0
- package/dist/engine/auth/middleware.d.ts +19 -0
- package/dist/engine/auth/middleware.d.ts.map +1 -0
- package/dist/engine/auth/middleware.js +64 -0
- package/dist/engine/auth/middleware.js.map +1 -0
- package/dist/engine/auth/pkce.d.ts +17 -0
- package/dist/engine/auth/pkce.d.ts.map +1 -0
- package/dist/engine/auth/pkce.js +33 -0
- package/dist/engine/auth/pkce.js.map +1 -0
- package/dist/engine/auth/scope-mapper.d.ts +21 -0
- package/dist/engine/auth/scope-mapper.d.ts.map +1 -0
- package/dist/engine/auth/scope-mapper.js +124 -0
- package/dist/engine/auth/scope-mapper.js.map +1 -0
- package/dist/engine/auth/token-validator.d.ts +15 -0
- package/dist/engine/auth/token-validator.d.ts.map +1 -0
- package/dist/engine/auth/token-validator.js +121 -0
- package/dist/engine/auth/token-validator.js.map +1 -0
- package/dist/engine/ci-generator/index.d.ts.map +1 -1
- package/dist/engine/ci-generator/index.js +8 -2
- package/dist/engine/ci-generator/index.js.map +1 -1
- package/dist/engine/ci-generator/yaml-builder.d.ts +7 -2
- package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -1
- package/dist/engine/ci-generator/yaml-builder.js +49 -1
- package/dist/engine/ci-generator/yaml-builder.js.map +1 -1
- package/dist/engine/clarify/contradictions.d.ts.map +1 -1
- package/dist/engine/clarify/contradictions.js +4 -1
- package/dist/engine/clarify/contradictions.js.map +1 -1
- package/dist/engine/design-to-spec/ac-generator.d.ts +21 -0
- package/dist/engine/design-to-spec/ac-generator.d.ts.map +1 -0
- package/dist/engine/design-to-spec/ac-generator.js +185 -0
- package/dist/engine/design-to-spec/ac-generator.js.map +1 -0
- package/dist/engine/design-to-spec/index.d.ts +11 -0
- package/dist/engine/design-to-spec/index.d.ts.map +1 -0
- package/dist/engine/design-to-spec/index.js +19 -0
- package/dist/engine/design-to-spec/index.js.map +1 -0
- package/dist/engine/design-to-spec/parser.d.ts +7 -0
- package/dist/engine/design-to-spec/parser.d.ts.map +1 -0
- package/dist/engine/design-to-spec/parser.js +290 -0
- package/dist/engine/design-to-spec/parser.js.map +1 -0
- package/dist/engine/design-to-spec/spec-builder.d.ts +12 -0
- package/dist/engine/design-to-spec/spec-builder.d.ts.map +1 -0
- package/dist/engine/design-to-spec/spec-builder.js +148 -0
- package/dist/engine/design-to-spec/spec-builder.js.map +1 -0
- package/dist/engine/design-to-spec/ui-contract-builder.d.ts +17 -0
- package/dist/engine/design-to-spec/ui-contract-builder.d.ts.map +1 -0
- package/dist/engine/design-to-spec/ui-contract-builder.js +175 -0
- package/dist/engine/design-to-spec/ui-contract-builder.js.map +1 -0
- package/dist/engine/detection-utils.d.ts.map +1 -1
- package/dist/engine/detection-utils.js +3 -0
- package/dist/engine/detection-utils.js.map +1 -1
- package/dist/engine/doc-generator/portal/decision-timeline-builder.d.ts.map +1 -1
- package/dist/engine/doc-generator/portal/decision-timeline-builder.js +1 -0
- package/dist/engine/doc-generator/portal/decision-timeline-builder.js.map +1 -1
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.d.ts.map +1 -1
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.js +1 -0
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.js.map +1 -1
- package/dist/engine/elicitation/builder.d.ts +37 -0
- package/dist/engine/elicitation/builder.d.ts.map +1 -0
- package/dist/engine/elicitation/builder.js +115 -0
- package/dist/engine/elicitation/builder.js.map +1 -0
- package/dist/engine/elicitation/fallback.d.ts +20 -0
- package/dist/engine/elicitation/fallback.d.ts.map +1 -0
- package/dist/engine/elicitation/fallback.js +72 -0
- package/dist/engine/elicitation/fallback.js.map +1 -0
- package/dist/engine/elicitation/index.d.ts +4 -0
- package/dist/engine/elicitation/index.d.ts.map +1 -0
- package/dist/engine/elicitation/index.js +5 -0
- package/dist/engine/elicitation/index.js.map +1 -0
- package/dist/engine/elicitation/response-parser.d.ts +9 -0
- package/dist/engine/elicitation/response-parser.d.ts.map +1 -0
- package/dist/engine/elicitation/response-parser.js +163 -0
- package/dist/engine/elicitation/response-parser.js.map +1 -0
- package/dist/engine/event-schema-validator/version-utils.d.ts.map +1 -1
- package/dist/engine/event-schema-validator/version-utils.js +1 -0
- package/dist/engine/event-schema-validator/version-utils.js.map +1 -1
- package/dist/engine/federation/cross-repo-resolver.d.ts +21 -0
- package/dist/engine/federation/cross-repo-resolver.d.ts.map +1 -0
- package/dist/engine/federation/cross-repo-resolver.js +75 -0
- package/dist/engine/federation/cross-repo-resolver.js.map +1 -0
- package/dist/engine/federation/drift-checker.d.ts +19 -0
- package/dist/engine/federation/drift-checker.d.ts.map +1 -0
- package/dist/engine/federation/drift-checker.js +114 -0
- package/dist/engine/federation/drift-checker.js.map +1 -0
- package/dist/engine/federation/federation-store.d.ts +25 -0
- package/dist/engine/federation/federation-store.d.ts.map +1 -0
- package/dist/engine/federation/federation-store.js +58 -0
- package/dist/engine/federation/federation-store.js.map +1 -0
- package/dist/engine/federation/index.d.ts +4 -0
- package/dist/engine/federation/index.d.ts.map +1 -0
- package/dist/engine/federation/index.js +5 -0
- package/dist/engine/federation/index.js.map +1 -0
- package/dist/engine/framework-detector.js +1 -1
- package/dist/engine/framework-detector.js.map +1 -1
- package/dist/engine/github/spec-ac-analyzer.d.ts +40 -0
- package/dist/engine/github/spec-ac-analyzer.d.ts.map +1 -0
- package/dist/engine/github/spec-ac-analyzer.js +181 -0
- package/dist/engine/github/spec-ac-analyzer.js.map +1 -0
- package/dist/engine/hooks/handlers/on-impl-change.d.ts +3 -1
- package/dist/engine/hooks/handlers/on-impl-change.d.ts.map +1 -1
- package/dist/engine/hooks/handlers/on-impl-change.js +25 -1
- package/dist/engine/hooks/handlers/on-impl-change.js.map +1 -1
- package/dist/engine/infrastructure/component-mapper.d.ts +9 -0
- package/dist/engine/infrastructure/component-mapper.d.ts.map +1 -0
- package/dist/engine/infrastructure/component-mapper.js +162 -0
- package/dist/engine/infrastructure/component-mapper.js.map +1 -0
- package/dist/engine/infrastructure/cost-estimator.d.ts +6 -0
- package/dist/engine/infrastructure/cost-estimator.d.ts.map +1 -0
- package/dist/engine/infrastructure/cost-estimator.js +48 -0
- package/dist/engine/infrastructure/cost-estimator.js.map +1 -0
- package/dist/engine/infrastructure/docker-compose-generator.d.ts +6 -0
- package/dist/engine/infrastructure/docker-compose-generator.d.ts.map +1 -0
- package/dist/engine/infrastructure/docker-compose-generator.js +201 -0
- package/dist/engine/infrastructure/docker-compose-generator.js.map +1 -0
- package/dist/engine/infrastructure/index.d.ts +15 -0
- package/dist/engine/infrastructure/index.d.ts.map +1 -0
- package/dist/engine/infrastructure/index.js +67 -0
- package/dist/engine/infrastructure/index.js.map +1 -0
- package/dist/engine/infrastructure/kubernetes-generator.d.ts +6 -0
- package/dist/engine/infrastructure/kubernetes-generator.d.ts.map +1 -0
- package/dist/engine/infrastructure/kubernetes-generator.js +141 -0
- package/dist/engine/infrastructure/kubernetes-generator.js.map +1 -0
- package/dist/engine/infrastructure/railway-generator.d.ts +6 -0
- package/dist/engine/infrastructure/railway-generator.d.ts.map +1 -0
- package/dist/engine/infrastructure/railway-generator.js +87 -0
- package/dist/engine/infrastructure/railway-generator.js.map +1 -0
- package/dist/engine/infrastructure/signal-detector.d.ts +7 -0
- package/dist/engine/infrastructure/signal-detector.d.ts.map +1 -0
- package/dist/engine/infrastructure/signal-detector.js +174 -0
- package/dist/engine/infrastructure/signal-detector.js.map +1 -0
- package/dist/engine/infrastructure/terraform-generator.d.ts +6 -0
- package/dist/engine/infrastructure/terraform-generator.d.ts.map +1 -0
- package/dist/engine/infrastructure/terraform-generator.js +241 -0
- package/dist/engine/infrastructure/terraform-generator.js.map +1 -0
- package/dist/engine/learning-router.d.ts.map +1 -1
- package/dist/engine/learning-router.js +2 -0
- package/dist/engine/learning-router.js.map +1 -1
- package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -1
- package/dist/engine/living-spec/annotation-parser.js.map +1 -1
- package/dist/engine/living-spec/auto-updater.d.ts +58 -0
- package/dist/engine/living-spec/auto-updater.d.ts.map +1 -0
- package/dist/engine/living-spec/auto-updater.js +311 -0
- package/dist/engine/living-spec/auto-updater.js.map +1 -0
- package/dist/engine/living-spec/conflict-resolver.d.ts +46 -0
- package/dist/engine/living-spec/conflict-resolver.d.ts.map +1 -0
- package/dist/engine/living-spec/conflict-resolver.js +301 -0
- package/dist/engine/living-spec/conflict-resolver.js.map +1 -0
- package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -1
- package/dist/engine/living-spec/hash-tracker.js.map +1 -1
- package/dist/engine/living-spec/index.d.ts +1 -0
- package/dist/engine/living-spec/index.d.ts.map +1 -1
- package/dist/engine/living-spec/index.js +1 -0
- package/dist/engine/living-spec/index.js.map +1 -1
- package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -1
- package/dist/engine/living-spec/signature-tracker.js.map +1 -1
- package/dist/engine/mobile-detector-android.d.ts.map +1 -1
- package/dist/engine/mobile-detector-android.js +6 -0
- package/dist/engine/mobile-detector-android.js.map +1 -1
- package/dist/engine/observability/config.d.ts +16 -0
- package/dist/engine/observability/config.d.ts.map +1 -0
- package/dist/engine/observability/config.js +44 -0
- package/dist/engine/observability/config.js.map +1 -0
- package/dist/engine/observability/index.d.ts +7 -0
- package/dist/engine/observability/index.d.ts.map +1 -0
- package/dist/engine/observability/index.js +8 -0
- package/dist/engine/observability/index.js.map +1 -0
- package/dist/engine/observability/metrics.d.ts +12 -0
- package/dist/engine/observability/metrics.d.ts.map +1 -0
- package/dist/engine/observability/metrics.js +61 -0
- package/dist/engine/observability/metrics.js.map +1 -0
- package/dist/engine/observability/noop-tracer.d.ts +13 -0
- package/dist/engine/observability/noop-tracer.d.ts.map +1 -0
- package/dist/engine/observability/noop-tracer.js +41 -0
- package/dist/engine/observability/noop-tracer.js.map +1 -0
- package/dist/engine/observability/otel-tracer.d.ts +19 -0
- package/dist/engine/observability/otel-tracer.d.ts.map +1 -0
- package/dist/engine/observability/otel-tracer.js +134 -0
- package/dist/engine/observability/otel-tracer.js.map +1 -0
- package/dist/engine/observability/span-helpers.d.ts +28 -0
- package/dist/engine/observability/span-helpers.d.ts.map +1 -0
- package/dist/engine/observability/span-helpers.js +68 -0
- package/dist/engine/observability/span-helpers.js.map +1 -0
- package/dist/engine/observability/tracer.d.ts +26 -0
- package/dist/engine/observability/tracer.d.ts.map +1 -0
- package/dist/engine/observability/tracer.js +45 -0
- package/dist/engine/observability/tracer.js.map +1 -0
- package/dist/engine/rbac/index.d.ts +3 -0
- package/dist/engine/rbac/index.d.ts.map +1 -0
- package/dist/engine/rbac/index.js +4 -0
- package/dist/engine/rbac/index.js.map +1 -0
- package/dist/engine/rbac/permission-checker.d.ts +21 -0
- package/dist/engine/rbac/permission-checker.d.ts.map +1 -0
- package/dist/engine/rbac/permission-checker.js +74 -0
- package/dist/engine/rbac/permission-checker.js.map +1 -0
- package/dist/engine/rbac/roles.d.ts +12 -0
- package/dist/engine/rbac/roles.d.ts.map +1 -0
- package/dist/engine/rbac/roles.js +37 -0
- package/dist/engine/rbac/roles.js.map +1 -0
- package/dist/engine/reverse-engineer/orchestrator.d.ts.map +1 -1
- package/dist/engine/reverse-engineer/orchestrator.js +2 -0
- package/dist/engine/reverse-engineer/orchestrator.js.map +1 -1
- package/dist/engine/self-improver.d.ts.map +1 -1
- package/dist/engine/self-improver.js +2 -0
- package/dist/engine/self-improver.js.map +1 -1
- package/dist/engine/shared/ac-extractor.d.ts +9 -0
- package/dist/engine/shared/ac-extractor.d.ts.map +1 -0
- package/dist/engine/shared/ac-extractor.js +36 -0
- package/dist/engine/shared/ac-extractor.js.map +1 -0
- package/dist/engine/shared/line-diff.d.ts +11 -0
- package/dist/engine/shared/line-diff.d.ts.map +1 -0
- package/dist/engine/shared/line-diff.js +32 -0
- package/dist/engine/shared/line-diff.js.map +1 -0
- package/dist/engine/spec-decomposer/analyzer.d.ts +18 -0
- package/dist/engine/spec-decomposer/analyzer.d.ts.map +1 -0
- package/dist/engine/spec-decomposer/analyzer.js +263 -0
- package/dist/engine/spec-decomposer/analyzer.js.map +1 -0
- package/dist/engine/spec-decomposer/file-mapper.d.ts +17 -0
- package/dist/engine/spec-decomposer/file-mapper.d.ts.map +1 -0
- package/dist/engine/spec-decomposer/file-mapper.js +96 -0
- package/dist/engine/spec-decomposer/file-mapper.js.map +1 -0
- package/dist/engine/spec-decomposer/index.d.ts +14 -0
- package/dist/engine/spec-decomposer/index.d.ts.map +1 -0
- package/dist/engine/spec-decomposer/index.js +50 -0
- package/dist/engine/spec-decomposer/index.js.map +1 -0
- package/dist/engine/spec-decomposer/ownership-resolver.d.ts +7 -0
- package/dist/engine/spec-decomposer/ownership-resolver.d.ts.map +1 -0
- package/dist/engine/spec-decomposer/ownership-resolver.js +169 -0
- package/dist/engine/spec-decomposer/ownership-resolver.js.map +1 -0
- package/dist/engine/spec-observability/index.d.ts +4 -0
- package/dist/engine/spec-observability/index.d.ts.map +1 -0
- package/dist/engine/spec-observability/index.js +4 -0
- package/dist/engine/spec-observability/index.js.map +1 -0
- package/dist/engine/spec-observability/metrics.d.ts +8 -0
- package/dist/engine/spec-observability/metrics.d.ts.map +1 -0
- package/dist/engine/spec-observability/metrics.js +116 -0
- package/dist/engine/spec-observability/metrics.js.map +1 -0
- package/dist/engine/spec-observability/tracker.d.ts +22 -0
- package/dist/engine/spec-observability/tracker.d.ts.map +1 -0
- package/dist/engine/spec-observability/tracker.js +77 -0
- package/dist/engine/spec-observability/tracker.js.map +1 -0
- package/dist/engine/spec-reader.d.ts +7 -0
- package/dist/engine/spec-reader.d.ts.map +1 -0
- package/dist/engine/spec-reader.js +23 -0
- package/dist/engine/spec-reader.js.map +1 -0
- package/dist/engine/spec-repair.d.ts +10 -0
- package/dist/engine/spec-repair.d.ts.map +1 -0
- package/dist/engine/spec-repair.js +388 -0
- package/dist/engine/spec-repair.js.map +1 -0
- package/dist/engine/spec-versioning/brancher.d.ts +17 -0
- package/dist/engine/spec-versioning/brancher.d.ts.map +1 -0
- package/dist/engine/spec-versioning/brancher.js +113 -0
- package/dist/engine/spec-versioning/brancher.js.map +1 -0
- package/dist/engine/spec-versioning/differ.d.ts +19 -0
- package/dist/engine/spec-versioning/differ.d.ts.map +1 -0
- package/dist/engine/spec-versioning/differ.js +151 -0
- package/dist/engine/spec-versioning/differ.js.map +1 -0
- package/dist/engine/spec-versioning/index.d.ts +5 -0
- package/dist/engine/spec-versioning/index.d.ts.map +1 -0
- package/dist/engine/spec-versioning/index.js +6 -0
- package/dist/engine/spec-versioning/index.js.map +1 -0
- package/dist/engine/spec-versioning/merger.d.ts +18 -0
- package/dist/engine/spec-versioning/merger.d.ts.map +1 -0
- package/dist/engine/spec-versioning/merger.js +113 -0
- package/dist/engine/spec-versioning/merger.js.map +1 -0
- package/dist/engine/spec-versioning/version-store.d.ts +18 -0
- package/dist/engine/spec-versioning/version-store.d.ts.map +1 -0
- package/dist/engine/spec-versioning/version-store.js +96 -0
- package/dist/engine/spec-versioning/version-store.js.map +1 -0
- package/dist/engine/well-known/discovery.d.ts +7 -0
- package/dist/engine/well-known/discovery.d.ts.map +1 -0
- package/dist/engine/well-known/discovery.js +109 -0
- package/dist/engine/well-known/discovery.js.map +1 -0
- package/dist/engine/well-known/index.d.ts +6 -0
- package/dist/engine/well-known/index.d.ts.map +1 -0
- package/dist/engine/well-known/index.js +5 -0
- package/dist/engine/well-known/index.js.map +1 -0
- package/dist/engine/well-known/manifest-generator.d.ts +7 -0
- package/dist/engine/well-known/manifest-generator.d.ts.map +1 -0
- package/dist/engine/well-known/manifest-generator.js +60 -0
- package/dist/engine/well-known/manifest-generator.js.map +1 -0
- package/dist/engine/well-known/manifest-schema.d.ts +92 -0
- package/dist/engine/well-known/manifest-schema.d.ts.map +1 -0
- package/dist/engine/well-known/manifest-schema.js +70 -0
- package/dist/engine/well-known/manifest-schema.js.map +1 -0
- package/dist/resources/spec-granular.d.ts +33 -0
- package/dist/resources/spec-granular.d.ts.map +1 -0
- package/dist/resources/spec-granular.js +299 -0
- package/dist/resources/spec-granular.js.map +1 -0
- package/dist/storage/federation-store.d.ts +29 -0
- package/dist/storage/federation-store.d.ts.map +1 -0
- package/dist/storage/federation-store.js +111 -0
- package/dist/storage/federation-store.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/rbac-store.d.ts +8 -0
- package/dist/storage/rbac-store.d.ts.map +1 -0
- package/dist/storage/rbac-store.js +75 -0
- package/dist/storage/rbac-store.js.map +1 -0
- package/dist/storage/spec-observability-store.d.ts +16 -0
- package/dist/storage/spec-observability-store.d.ts.map +1 -0
- package/dist/storage/spec-observability-store.js +55 -0
- package/dist/storage/spec-observability-store.js.map +1 -0
- package/dist/tools/a2a-handler.d.ts +14 -0
- package/dist/tools/a2a-handler.d.ts.map +1 -0
- package/dist/tools/a2a-handler.js +100 -0
- package/dist/tools/a2a-handler.js.map +1 -0
- package/dist/tools/analyze-spec-dependencies.d.ts.map +1 -1
- package/dist/tools/analyze-spec-dependencies.js +1 -0
- package/dist/tools/analyze-spec-dependencies.js.map +1 -1
- package/dist/tools/assign-role-handler.d.ts +3 -0
- package/dist/tools/assign-role-handler.d.ts.map +1 -0
- package/dist/tools/assign-role-handler.js +25 -0
- package/dist/tools/assign-role-handler.js.map +1 -0
- package/dist/tools/audit-trail-handler.d.ts +4 -0
- package/dist/tools/audit-trail-handler.d.ts.map +1 -0
- package/dist/tools/audit-trail-handler.js +91 -0
- package/dist/tools/audit-trail-handler.js.map +1 -0
- package/dist/tools/auto-update-spec.d.ts +3 -0
- package/dist/tools/auto-update-spec.d.ts.map +1 -0
- package/dist/tools/auto-update-spec.js +43 -0
- package/dist/tools/auto-update-spec.js.map +1 -0
- package/dist/tools/branch-spec.d.ts +3 -0
- package/dist/tools/branch-spec.d.ts.map +1 -0
- package/dist/tools/branch-spec.js +68 -0
- package/dist/tools/branch-spec.js.map +1 -0
- package/dist/tools/configure-auth-handler.d.ts +15 -0
- package/dist/tools/configure-auth-handler.d.ts.map +1 -0
- package/dist/tools/configure-auth-handler.js +113 -0
- package/dist/tools/configure-auth-handler.js.map +1 -0
- package/dist/tools/configure-observability.d.ts +14 -0
- package/dist/tools/configure-observability.d.ts.map +1 -0
- package/dist/tools/configure-observability.js +96 -0
- package/dist/tools/configure-observability.js.map +1 -0
- package/dist/tools/configure-roles-handler.d.ts +4 -0
- package/dist/tools/configure-roles-handler.d.ts.map +1 -0
- package/dist/tools/configure-roles-handler.js +36 -0
- package/dist/tools/configure-roles-handler.js.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts +7 -0
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js +114 -0
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts +7 -0
- package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js +48 -0
- package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/index.d.ts +14 -0
- package/dist/tools/create-spec-hu/ac-adapters/index.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/index.js +28 -0
- package/dist/tools/create-spec-hu/ac-adapters/index.js.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts +7 -0
- package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js +99 -0
- package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts +7 -0
- package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js +62 -0
- package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
- package/dist/tools/create-spec-hu/hu-body-generators.js +41 -19
- package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
- package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
- package/dist/tools/create-spec-tech/ficha-content.js +235 -5
- package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
- package/dist/tools/decompose-spec.d.ts +7 -0
- package/dist/tools/decompose-spec.d.ts.map +1 -0
- package/dist/tools/decompose-spec.js +49 -0
- package/dist/tools/decompose-spec.js.map +1 -0
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js +2 -1
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js.map +1 -1
- package/dist/tools/design-to-spec.d.ts +12 -0
- package/dist/tools/design-to-spec.d.ts.map +1 -0
- package/dist/tools/design-to-spec.js +73 -0
- package/dist/tools/design-to-spec.js.map +1 -0
- package/dist/tools/detect-ac-gaps.d.ts +7 -0
- package/dist/tools/detect-ac-gaps.d.ts.map +1 -0
- package/dist/tools/detect-ac-gaps.js +63 -0
- package/dist/tools/detect-ac-gaps.js.map +1 -0
- package/dist/tools/discover-registry.d.ts +8 -0
- package/dist/tools/discover-registry.d.ts.map +1 -0
- package/dist/tools/discover-registry.js +79 -0
- package/dist/tools/discover-registry.js.map +1 -0
- package/dist/tools/federate-specs.d.ts +6 -0
- package/dist/tools/federate-specs.d.ts.map +1 -0
- package/dist/tools/federate-specs.js +41 -0
- package/dist/tools/federate-specs.js.map +1 -0
- package/dist/tools/federation-status.d.ts +6 -0
- package/dist/tools/federation-status.d.ts.map +1 -0
- package/dist/tools/federation-status.js +56 -0
- package/dist/tools/federation-status.js.map +1 -0
- package/dist/tools/generate-annotations.d.ts.map +1 -1
- package/dist/tools/generate-annotations.js +3 -1
- package/dist/tools/generate-annotations.js.map +1 -1
- package/dist/tools/generate-infrastructure.d.ts +3 -0
- package/dist/tools/generate-infrastructure.d.ts.map +1 -0
- package/dist/tools/generate-infrastructure.js +60 -0
- package/dist/tools/generate-infrastructure.js.map +1 -0
- package/dist/tools/manage-hooks.d.ts.map +1 -1
- package/dist/tools/manage-hooks.js +1 -0
- package/dist/tools/manage-hooks.js.map +1 -1
- package/dist/tools/merge-spec-branch.d.ts +3 -0
- package/dist/tools/merge-spec-branch.d.ts.map +1 -0
- package/dist/tools/merge-spec-branch.js +103 -0
- package/dist/tools/merge-spec-branch.js.map +1 -0
- package/dist/tools/publish-registry.d.ts +8 -0
- package/dist/tools/publish-registry.d.ts.map +1 -0
- package/dist/tools/publish-registry.js +76 -0
- package/dist/tools/publish-registry.js.map +1 -0
- package/dist/tools/register-a2a-tools.d.ts +3 -0
- package/dist/tools/register-a2a-tools.d.ts.map +1 -0
- package/dist/tools/register-a2a-tools.js +66 -0
- package/dist/tools/register-a2a-tools.js.map +1 -0
- package/dist/tools/register-audit-trail-tools.d.ts +3 -0
- package/dist/tools/register-audit-trail-tools.d.ts.map +1 -0
- package/dist/tools/register-audit-trail-tools.js +62 -0
- package/dist/tools/register-audit-trail-tools.js.map +1 -0
- package/dist/tools/register-decompose-tools.d.ts +3 -0
- package/dist/tools/register-decompose-tools.d.ts.map +1 -0
- package/dist/tools/register-decompose-tools.js +31 -0
- package/dist/tools/register-decompose-tools.js.map +1 -0
- package/dist/tools/register-federation-tools.d.ts +6 -0
- package/dist/tools/register-federation-tools.d.ts.map +1 -0
- package/dist/tools/register-federation-tools.js +48 -0
- package/dist/tools/register-federation-tools.js.map +1 -0
- package/dist/tools/register-infrastructure-tools.d.ts +3 -0
- package/dist/tools/register-infrastructure-tools.d.ts.map +1 -0
- package/dist/tools/register-infrastructure-tools.js +34 -0
- package/dist/tools/register-infrastructure-tools.js.map +1 -0
- package/dist/tools/register-living-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-living-spec-tools.js +2 -8
- package/dist/tools/register-living-spec-tools.js.map +1 -1
- package/dist/tools/register-observability-tools.d.ts +3 -0
- package/dist/tools/register-observability-tools.d.ts.map +1 -0
- package/dist/tools/register-observability-tools.js +48 -0
- package/dist/tools/register-observability-tools.js.map +1 -0
- package/dist/tools/register-rbac-tools.d.ts +3 -0
- package/dist/tools/register-rbac-tools.d.ts.map +1 -0
- package/dist/tools/register-rbac-tools.js +36 -0
- package/dist/tools/register-rbac-tools.js.map +1 -0
- package/dist/tools/register-spec-observability-tools.d.ts +3 -0
- package/dist/tools/register-spec-observability-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-observability-tools.js +24 -0
- package/dist/tools/register-spec-observability-tools.js.map +1 -0
- package/dist/tools/register-versioning-tools.d.ts +3 -0
- package/dist/tools/register-versioning-tools.d.ts.map +1 -0
- package/dist/tools/register-versioning-tools.js +93 -0
- package/dist/tools/register-versioning-tools.js.map +1 -0
- package/dist/tools/register-well-known-tools.d.ts +3 -0
- package/dist/tools/register-well-known-tools.d.ts.map +1 -0
- package/dist/tools/register-well-known-tools.js +36 -0
- package/dist/tools/register-well-known-tools.js.map +1 -0
- package/dist/tools/repair-spec.d.ts +9 -0
- package/dist/tools/repair-spec.d.ts.map +1 -0
- package/dist/tools/repair-spec.js +93 -0
- package/dist/tools/repair-spec.js.map +1 -0
- package/dist/tools/resolve-spec-conflict.d.ts +7 -0
- package/dist/tools/resolve-spec-conflict.d.ts.map +1 -0
- package/dist/tools/resolve-spec-conflict.js +63 -0
- package/dist/tools/resolve-spec-conflict.js.map +1 -0
- package/dist/tools/response-helpers.d.ts +42 -0
- package/dist/tools/response-helpers.d.ts.map +1 -1
- package/dist/tools/response-helpers.js +29 -0
- package/dist/tools/response-helpers.js.map +1 -1
- package/dist/tools/schemas/auth-schema.d.ts +12 -0
- package/dist/tools/schemas/auth-schema.d.ts.map +1 -0
- package/dist/tools/schemas/auth-schema.js +38 -0
- package/dist/tools/schemas/auth-schema.js.map +1 -0
- package/dist/tools/schemas/rbac.d.ts +26 -0
- package/dist/tools/schemas/rbac.d.ts.map +1 -0
- package/dist/tools/schemas/rbac.js +25 -0
- package/dist/tools/schemas/rbac.js.map +1 -0
- package/dist/tools/schemas/well-known.d.ts +12 -0
- package/dist/tools/schemas/well-known.d.ts.map +1 -0
- package/dist/tools/schemas/well-known.js +31 -0
- package/dist/tools/schemas/well-known.js.map +1 -0
- package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -1
- package/dist/tools/snapshot-spec-hashes.js.map +1 -1
- package/dist/tools/spec-usage-report.d.ts +3 -0
- package/dist/tools/spec-usage-report.d.ts.map +1 -0
- package/dist/tools/spec-usage-report.js +95 -0
- package/dist/tools/spec-usage-report.js.map +1 -0
- package/dist/tools/start-hooks.d.ts.map +1 -1
- package/dist/tools/start-hooks.js +93 -16
- package/dist/tools/start-hooks.js.map +1 -1
- package/dist/tools/suggest-tooling/catalog-loader.d.ts.map +1 -1
- package/dist/tools/suggest-tooling/catalog-loader.js +1 -0
- package/dist/tools/suggest-tooling/catalog-loader.js.map +1 -1
- package/dist/tools/version-spec.d.ts +3 -0
- package/dist/tools/version-spec.d.ts.map +1 -0
- package/dist/tools/version-spec.js +54 -0
- package/dist/tools/version-spec.js.map +1 -0
- package/dist/types/a2a.d.ts +125 -0
- package/dist/types/a2a.d.ts.map +1 -0
- package/dist/types/a2a.js +3 -0
- package/dist/types/a2a.js.map +1 -0
- package/dist/types/ac-gap.d.ts +57 -0
- package/dist/types/ac-gap.d.ts.map +1 -0
- package/dist/types/ac-gap.js +3 -0
- package/dist/types/ac-gap.js.map +1 -0
- package/dist/types/audit-trail.d.ts +77 -0
- package/dist/types/audit-trail.d.ts.map +1 -0
- package/dist/types/audit-trail.js +3 -0
- package/dist/types/audit-trail.js.map +1 -0
- package/dist/types/auth.d.ts +82 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/ci.d.ts +10 -25
- package/dist/types/ci.d.ts.map +1 -1
- package/dist/types/design-to-spec.d.ts +89 -0
- package/dist/types/design-to-spec.d.ts.map +1 -0
- package/dist/types/design-to-spec.js +3 -0
- package/dist/types/design-to-spec.js.map +1 -0
- package/dist/types/elicitation.d.ts +109 -0
- package/dist/types/elicitation.d.ts.map +1 -0
- package/dist/types/elicitation.js +3 -0
- package/dist/types/elicitation.js.map +1 -0
- package/dist/types/federation.d.ts +95 -0
- package/dist/types/federation.d.ts.map +1 -0
- package/dist/types/federation.js +3 -0
- package/dist/types/federation.js.map +1 -0
- package/dist/types/file-hooks.d.ts +8 -6
- package/dist/types/file-hooks.d.ts.map +1 -1
- package/dist/types/github.d.ts +17 -0
- package/dist/types/github.d.ts.map +1 -1
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/infrastructure.d.ts +71 -0
- package/dist/types/infrastructure.d.ts.map +1 -0
- package/dist/types/infrastructure.js +3 -0
- package/dist/types/infrastructure.js.map +1 -0
- package/dist/types/living-spec.d.ts +100 -0
- package/dist/types/living-spec.d.ts.map +1 -1
- package/dist/types/observability.d.ts +105 -0
- package/dist/types/observability.d.ts.map +1 -0
- package/dist/types/observability.js +3 -0
- package/dist/types/observability.js.map +1 -0
- package/dist/types/rbac.d.ts +51 -0
- package/dist/types/rbac.d.ts.map +1 -0
- package/dist/types/rbac.js +4 -0
- package/dist/types/rbac.js.map +1 -0
- package/dist/types/resources.d.ts +20 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +3 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/spec/repair.d.ts +33 -0
- package/dist/types/spec/repair.d.ts.map +1 -0
- package/dist/types/spec/repair.js +3 -0
- package/dist/types/spec/repair.js.map +1 -0
- package/dist/types/spec-decomposer.d.ts +108 -0
- package/dist/types/spec-decomposer.d.ts.map +1 -0
- package/dist/types/spec-decomposer.js +4 -0
- package/dist/types/spec-decomposer.js.map +1 -0
- package/dist/types/spec-observability.d.ts +71 -0
- package/dist/types/spec-observability.d.ts.map +1 -0
- package/dist/types/spec-observability.js +4 -0
- package/dist/types/spec-observability.js.map +1 -0
- package/dist/types/spec-versioning.d.ts +117 -0
- package/dist/types/spec-versioning.d.ts.map +1 -0
- package/dist/types/spec-versioning.js +3 -0
- package/dist/types/spec-versioning.js.map +1 -0
- package/dist/types/well-known.d.ts +70 -0
- package/dist/types/well-known.d.ts.map +1 -0
- package/dist/types/well-known.js +3 -0
- package/dist/types/well-known.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +16 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// engine/spec-versioning/differ.ts — Diff two spec versions at AC-level granularity
|
|
2
|
+
import { getVersion } from './version-store.js';
|
|
3
|
+
import { extractAcceptanceCriteria } from '../shared/ac-extractor.js';
|
|
4
|
+
import { computeLineDiff } from '../shared/line-diff.js';
|
|
5
|
+
export { extractAcceptanceCriteria, computeLineDiff };
|
|
6
|
+
/** Extract section headers from spec content. */
|
|
7
|
+
function extractSectionHeaders(content) {
|
|
8
|
+
return content
|
|
9
|
+
.split('\n')
|
|
10
|
+
.filter((line) => /^#+\s/.test(line.trim()))
|
|
11
|
+
.map((line) => line.trim());
|
|
12
|
+
}
|
|
13
|
+
/** Compute AC-level diff between two sets of criteria. */
|
|
14
|
+
export function computeAcDiff(fromCriteria, toCriteria) {
|
|
15
|
+
const fromSet = new Set(fromCriteria);
|
|
16
|
+
const toSet = new Set(toCriteria);
|
|
17
|
+
const added = [];
|
|
18
|
+
const removed = [];
|
|
19
|
+
const modified = [];
|
|
20
|
+
// Find removed and potentially modified
|
|
21
|
+
for (const criterion of fromCriteria) {
|
|
22
|
+
if (!toSet.has(criterion)) {
|
|
23
|
+
// Check if it was modified (high similarity match)
|
|
24
|
+
const similar = findSimilar(criterion, toCriteria, fromCriteria);
|
|
25
|
+
if (similar !== null && !fromSet.has(similar)) {
|
|
26
|
+
modified.push({ before: criterion, after: similar });
|
|
27
|
+
toSet.delete(similar); // Mark as consumed
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
removed.push(criterion);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Find added (those in toCriteria not matched yet)
|
|
35
|
+
for (const criterion of toCriteria) {
|
|
36
|
+
if (!fromSet.has(criterion) && !modified.some((m) => m.after === criterion)) {
|
|
37
|
+
added.push(criterion);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { added, removed, modified };
|
|
41
|
+
}
|
|
42
|
+
/** Find the most similar string in a list (similarity > 0.5). Returns null if none. */
|
|
43
|
+
function findSimilar(target, candidates, excludeFrom) {
|
|
44
|
+
const excludeSet = new Set(excludeFrom);
|
|
45
|
+
let bestScore = 0.5; // threshold
|
|
46
|
+
let bestMatch = null;
|
|
47
|
+
for (const candidate of candidates) {
|
|
48
|
+
if (excludeSet.has(candidate)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const score = bigramSimilarity(target, candidate);
|
|
52
|
+
if (score > bestScore) {
|
|
53
|
+
bestScore = score;
|
|
54
|
+
bestMatch = candidate;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return bestMatch;
|
|
58
|
+
}
|
|
59
|
+
/** Compute bigram similarity between two strings (0–1). */
|
|
60
|
+
function bigramSimilarity(a, b) {
|
|
61
|
+
if (a === b) {
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
if (a.length < 2 || b.length < 2) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
const buildBigrams = (str) => {
|
|
68
|
+
const bigrams = new Set();
|
|
69
|
+
for (let i = 0; i < str.length - 1; i++) {
|
|
70
|
+
bigrams.add(str.slice(i, i + 2));
|
|
71
|
+
}
|
|
72
|
+
return bigrams;
|
|
73
|
+
};
|
|
74
|
+
const bigramsA = buildBigrams(a.toLowerCase());
|
|
75
|
+
const bigramsB = buildBigrams(b.toLowerCase());
|
|
76
|
+
let intersection = 0;
|
|
77
|
+
for (const bigram of bigramsA) {
|
|
78
|
+
if (bigramsB.has(bigram)) {
|
|
79
|
+
intersection++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return (2 * intersection) / (bigramsA.size + bigramsB.size);
|
|
83
|
+
}
|
|
84
|
+
/** Detect which sections changed between two spec contents. */
|
|
85
|
+
export function detectSectionChanges(fromContent, toContent) {
|
|
86
|
+
const fromHeaders = new Set(extractSectionHeaders(fromContent));
|
|
87
|
+
const toHeaders = new Set(extractSectionHeaders(toContent));
|
|
88
|
+
const changes = [];
|
|
89
|
+
for (const header of toHeaders) {
|
|
90
|
+
if (!fromHeaders.has(header)) {
|
|
91
|
+
changes.push(`Added section: ${header}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
for (const header of fromHeaders) {
|
|
95
|
+
if (!toHeaders.has(header)) {
|
|
96
|
+
changes.push(`Removed section: ${header}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return changes;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Diff two spec versions stored on disk.
|
|
103
|
+
* Throws if either version tag is not found.
|
|
104
|
+
*/
|
|
105
|
+
export async function diffVersions(dataDir, specId, fromTag, toTag) {
|
|
106
|
+
const [fromVersion, toVersion] = await Promise.all([
|
|
107
|
+
getVersion(dataDir, specId, fromTag),
|
|
108
|
+
getVersion(dataDir, specId, toTag),
|
|
109
|
+
]);
|
|
110
|
+
if (fromVersion === null) {
|
|
111
|
+
throw new Error(`Version "${fromTag}" not found for spec ${specId}.`);
|
|
112
|
+
}
|
|
113
|
+
if (toVersion === null) {
|
|
114
|
+
throw new Error(`Version "${toTag}" not found for spec ${specId}.`);
|
|
115
|
+
}
|
|
116
|
+
const { added, removed } = computeLineDiff(fromVersion.content, toVersion.content);
|
|
117
|
+
const fromCriteria = extractAcceptanceCriteria(fromVersion.content);
|
|
118
|
+
const toCriteria = extractAcceptanceCriteria(toVersion.content);
|
|
119
|
+
const criteriaChanges = computeAcDiff(fromCriteria, toCriteria);
|
|
120
|
+
const sectionChanges = detectSectionChanges(fromVersion.content, toVersion.content);
|
|
121
|
+
return {
|
|
122
|
+
fromTag,
|
|
123
|
+
toTag,
|
|
124
|
+
specId,
|
|
125
|
+
added,
|
|
126
|
+
removed,
|
|
127
|
+
criteriaChanges,
|
|
128
|
+
sectionChanges,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Diff two spec content strings directly (no disk lookup).
|
|
133
|
+
* Used before merging to show what will change.
|
|
134
|
+
*/
|
|
135
|
+
export function diffContents(specId, fromTag, toTag, fromContent, toContent) {
|
|
136
|
+
const { added, removed } = computeLineDiff(fromContent, toContent);
|
|
137
|
+
const fromCriteria = extractAcceptanceCriteria(fromContent);
|
|
138
|
+
const toCriteria = extractAcceptanceCriteria(toContent);
|
|
139
|
+
const criteriaChanges = computeAcDiff(fromCriteria, toCriteria);
|
|
140
|
+
const sectionChanges = detectSectionChanges(fromContent, toContent);
|
|
141
|
+
return {
|
|
142
|
+
fromTag,
|
|
143
|
+
toTag,
|
|
144
|
+
specId,
|
|
145
|
+
added,
|
|
146
|
+
removed,
|
|
147
|
+
criteriaChanges,
|
|
148
|
+
sectionChanges,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=differ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/differ.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SpecMergeResult, SpecMergeConflict, MergeSpecBranchInput } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect merge conflicts between branch content and latest main content.
|
|
4
|
+
* Simple strategy: if the branch diverged from the latest version, flag it.
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectConflicts(baseContent: string, branchContent: string, mainContent: string): SpecMergeConflict[];
|
|
7
|
+
/**
|
|
8
|
+
* Attempt a simple auto-merge: apply branch additions to main content.
|
|
9
|
+
* Returns merged content or null if auto-merge is not safe.
|
|
10
|
+
*/
|
|
11
|
+
export declare function autoMerge(branchContent: string, mainContent: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Merge a spec branch back into main.
|
|
14
|
+
* Creates a new version snapshot with the merged content.
|
|
15
|
+
* Deletes the branch on success.
|
|
16
|
+
*/
|
|
17
|
+
export declare function mergeBranch(dataDir: string, input: MergeSpecBranchInput): Promise<SpecMergeResult>;
|
|
18
|
+
//# sourceMappingURL=merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/merger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAU9B;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,iBAAiB,EAAE,CA2BrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASnF;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA+E1B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// engine/spec-versioning/merger.ts — Merge a spec branch back into main with conflict detection
|
|
2
|
+
import { loadBranch, deleteBranch } from './brancher.js';
|
|
3
|
+
import { createVersion, getLatestVersionTag, loadVersionStore, suggestNextTag, } from './version-store.js';
|
|
4
|
+
import { diffContents } from './differ.js';
|
|
5
|
+
/**
|
|
6
|
+
* Detect merge conflicts between branch content and latest main content.
|
|
7
|
+
* Simple strategy: if the branch diverged from the latest version, flag it.
|
|
8
|
+
*/
|
|
9
|
+
export function detectConflicts(baseContent, branchContent, mainContent) {
|
|
10
|
+
const conflicts = [];
|
|
11
|
+
// If main content changed from the base (concurrent edit), flag it
|
|
12
|
+
if (mainContent !== baseContent) {
|
|
13
|
+
const mainLines = new Set(mainContent.split('\n'));
|
|
14
|
+
const branchLines = branchContent.split('\n');
|
|
15
|
+
const conflictingLines = [];
|
|
16
|
+
for (const line of branchLines) {
|
|
17
|
+
if (line.trim().length > 0 && !mainLines.has(line)) {
|
|
18
|
+
conflictingLines.push(line.trim());
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (conflictingLines.length > 0) {
|
|
22
|
+
conflicts.push({
|
|
23
|
+
type: 'concurrent_edit',
|
|
24
|
+
description: 'The main spec was modified after the branch was created. ' +
|
|
25
|
+
'Some branch changes conflict with current main content.',
|
|
26
|
+
details: conflictingLines.slice(0, 10), // Show up to 10 conflicting lines
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return conflicts;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Attempt a simple auto-merge: apply branch additions to main content.
|
|
34
|
+
* Returns merged content or null if auto-merge is not safe.
|
|
35
|
+
*/
|
|
36
|
+
export function autoMerge(branchContent, mainContent) {
|
|
37
|
+
// Simple strategy: if main has no divergence (same as base), use branch content directly
|
|
38
|
+
if (branchContent === mainContent) {
|
|
39
|
+
return mainContent;
|
|
40
|
+
}
|
|
41
|
+
// For now, trust branch content as the resolved merge when no conflicts are critical
|
|
42
|
+
// A more sophisticated approach would do 3-way merge, but that requires the base content
|
|
43
|
+
return branchContent;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Merge a spec branch back into main.
|
|
47
|
+
* Creates a new version snapshot with the merged content.
|
|
48
|
+
* Deletes the branch on success.
|
|
49
|
+
*/
|
|
50
|
+
export async function mergeBranch(dataDir, input) {
|
|
51
|
+
const { specId, branchName, message } = input;
|
|
52
|
+
// Load the branch
|
|
53
|
+
const branch = await loadBranch(dataDir, specId, branchName);
|
|
54
|
+
if (branch === null) {
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
specId,
|
|
58
|
+
branchName,
|
|
59
|
+
conflicts: [],
|
|
60
|
+
message: `Branch "${branchName}" not found for spec ${specId}.`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Load the current main spec content (latest version snapshot)
|
|
64
|
+
const versionStore = await loadVersionStore(dataDir, specId);
|
|
65
|
+
const latestSnapshot = versionStore.versions[versionStore.versions.length - 1];
|
|
66
|
+
const mainContent = latestSnapshot?.content ?? '';
|
|
67
|
+
// Determine the content to use for the merge
|
|
68
|
+
const resolvedContent = input.resolvedContent ?? autoMerge(branch.content, mainContent);
|
|
69
|
+
if (resolvedContent === null) {
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
specId,
|
|
73
|
+
branchName,
|
|
74
|
+
conflicts: [
|
|
75
|
+
{
|
|
76
|
+
type: 'content_diverged',
|
|
77
|
+
description: 'Auto-merge failed. Provide resolvedContent to complete the merge.',
|
|
78
|
+
details: [],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
message: 'Merge failed: could not auto-merge. Please provide resolvedContent.',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Determine the new version tag
|
|
85
|
+
const latestTag = await getLatestVersionTag(dataDir, specId);
|
|
86
|
+
const newVersionTag = input.newVersionTag ?? suggestNextTag(latestTag);
|
|
87
|
+
// Create the new version snapshot
|
|
88
|
+
const newVersion = await createVersion(dataDir, {
|
|
89
|
+
projectId: input.projectId,
|
|
90
|
+
specId,
|
|
91
|
+
tag: newVersionTag,
|
|
92
|
+
content: resolvedContent,
|
|
93
|
+
message: message ?? `Merged branch "${branchName}" into main`,
|
|
94
|
+
author: `merge:${branchName}`,
|
|
95
|
+
});
|
|
96
|
+
// Compute diff for reporting
|
|
97
|
+
const diff = diffContents(specId, branch.fromVersion, newVersionTag, branch.content, resolvedContent);
|
|
98
|
+
// Delete the branch after successful merge
|
|
99
|
+
await deleteBranch(dataDir, specId, branchName);
|
|
100
|
+
const totalChanges = diff.criteriaChanges.added.length +
|
|
101
|
+
diff.criteriaChanges.removed.length +
|
|
102
|
+
diff.criteriaChanges.modified.length;
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
specId,
|
|
106
|
+
branchName,
|
|
107
|
+
newVersionTag: newVersion.tag,
|
|
108
|
+
conflicts: [],
|
|
109
|
+
message: `Merged branch "${branchName}" into spec ${specId} as version ${newVersion.tag}. ` +
|
|
110
|
+
`${totalChanges} AC-level change(s) detected.`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/merger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SpecVersionSnapshot, SpecVersionSnapshotStore, CreateVersionSnapshotInput } from '../../types/index.js';
|
|
2
|
+
/** Build the storage directory for a spec's versions. */
|
|
3
|
+
export declare function getVersionsDir(dataDir: string, specId: string): string;
|
|
4
|
+
/** Load the version store for a spec. Returns empty store if not found. */
|
|
5
|
+
export declare function loadVersionStore(dataDir: string, specId: string): Promise<SpecVersionSnapshotStore>;
|
|
6
|
+
/** Validate that a tag matches semantic versioning (vMAJOR.MINOR.PATCH). */
|
|
7
|
+
export declare function isValidVersionTag(tag: string): boolean;
|
|
8
|
+
/** Create and persist a new version snapshot. Returns the created snapshot. */
|
|
9
|
+
export declare function createVersion(dataDir: string, input: CreateVersionSnapshotInput): Promise<SpecVersionSnapshot>;
|
|
10
|
+
/** Retrieve a specific snapshot by tag. Returns null if not found. */
|
|
11
|
+
export declare function getVersion(dataDir: string, specId: string, tag: string): Promise<SpecVersionSnapshot | null>;
|
|
12
|
+
/** List all snapshots for a spec, ordered from oldest to newest. */
|
|
13
|
+
export declare function listVersions(dataDir: string, specId: string): Promise<SpecVersionSnapshot[]>;
|
|
14
|
+
/** Get the latest version tag for a spec. Returns null if no versions exist. */
|
|
15
|
+
export declare function getLatestVersionTag(dataDir: string, specId: string): Promise<string | null>;
|
|
16
|
+
/** Suggest the next patch version given the current latest tag. */
|
|
17
|
+
export declare function suggestNextTag(latestTag: string | null): string;
|
|
18
|
+
//# sourceMappingURL=version-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-store.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-versioning/version-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAI9B,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAOD,2EAA2E;AAC3E,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAQnC;AAgBD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAOD,+EAA+E;AAC/E,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA0B9B;AAED,sEAAsE;AACtE,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAGrC;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAKhC;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOjG;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAY/D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// engine/spec-versioning/version-store.ts — Store and retrieve spec version snapshots
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
const VERSIONS_FILENAME = 'versions.json';
|
|
6
|
+
/** Build the storage directory for a spec's versions. */
|
|
7
|
+
export function getVersionsDir(dataDir, specId) {
|
|
8
|
+
return join(dataDir, 'spec-versions', specId);
|
|
9
|
+
}
|
|
10
|
+
/** Build the path to the versions.json file for a spec. */
|
|
11
|
+
function getVersionsFilePath(dataDir, specId) {
|
|
12
|
+
return join(getVersionsDir(dataDir, specId), VERSIONS_FILENAME);
|
|
13
|
+
}
|
|
14
|
+
/** Load the version store for a spec. Returns empty store if not found. */
|
|
15
|
+
export async function loadVersionStore(dataDir, specId) {
|
|
16
|
+
const filePath = getVersionsFilePath(dataDir, specId);
|
|
17
|
+
try {
|
|
18
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { specId, versions: [] };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Persist the version store to disk. Creates directories as needed. */
|
|
26
|
+
async function saveVersionStore(dataDir, specId, store) {
|
|
27
|
+
const dir = getVersionsDir(dataDir, specId);
|
|
28
|
+
if (!existsSync(dir)) {
|
|
29
|
+
await mkdir(dir, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
const filePath = join(dir, VERSIONS_FILENAME);
|
|
32
|
+
await writeFile(filePath, JSON.stringify(store, null, 2), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
/** Validate that a tag matches semantic versioning (vMAJOR.MINOR.PATCH). */
|
|
35
|
+
export function isValidVersionTag(tag) {
|
|
36
|
+
return /^v\d+\.\d+\.\d+$/.test(tag);
|
|
37
|
+
}
|
|
38
|
+
/** Check if a tag already exists in the store. */
|
|
39
|
+
function tagExists(store, tag) {
|
|
40
|
+
return store.versions.some((v) => v.tag === tag);
|
|
41
|
+
}
|
|
42
|
+
/** Create and persist a new version snapshot. Returns the created snapshot. */
|
|
43
|
+
export async function createVersion(dataDir, input) {
|
|
44
|
+
const { specId, tag, content, message, author } = input;
|
|
45
|
+
if (!isValidVersionTag(tag)) {
|
|
46
|
+
throw new Error(`Invalid version tag "${tag}". Use semantic versioning format: v1.0.0, v1.1.0, v2.0.0`);
|
|
47
|
+
}
|
|
48
|
+
const store = await loadVersionStore(dataDir, specId);
|
|
49
|
+
if (tagExists(store, tag)) {
|
|
50
|
+
throw new Error(`Version "${tag}" already exists for spec ${specId}. Use a different tag.`);
|
|
51
|
+
}
|
|
52
|
+
const version = {
|
|
53
|
+
tag,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
content,
|
|
56
|
+
...(message !== undefined ? { message } : {}),
|
|
57
|
+
...(author !== undefined ? { author } : {}),
|
|
58
|
+
};
|
|
59
|
+
store.versions.push(version);
|
|
60
|
+
await saveVersionStore(dataDir, specId, store);
|
|
61
|
+
return version;
|
|
62
|
+
}
|
|
63
|
+
/** Retrieve a specific snapshot by tag. Returns null if not found. */
|
|
64
|
+
export async function getVersion(dataDir, specId, tag) {
|
|
65
|
+
const store = await loadVersionStore(dataDir, specId);
|
|
66
|
+
return store.versions.find((v) => v.tag === tag) ?? null;
|
|
67
|
+
}
|
|
68
|
+
/** List all snapshots for a spec, ordered from oldest to newest. */
|
|
69
|
+
export async function listVersions(dataDir, specId) {
|
|
70
|
+
const store = await loadVersionStore(dataDir, specId);
|
|
71
|
+
return [...store.versions].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
72
|
+
}
|
|
73
|
+
/** Get the latest version tag for a spec. Returns null if no versions exist. */
|
|
74
|
+
export async function getLatestVersionTag(dataDir, specId) {
|
|
75
|
+
const versions = await listVersions(dataDir, specId);
|
|
76
|
+
if (versions.length === 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const latest = versions[versions.length - 1];
|
|
80
|
+
return latest?.tag ?? null;
|
|
81
|
+
}
|
|
82
|
+
/** Suggest the next patch version given the current latest tag. */
|
|
83
|
+
export function suggestNextTag(latestTag) {
|
|
84
|
+
if (latestTag === null) {
|
|
85
|
+
return 'v1.0.0';
|
|
86
|
+
}
|
|
87
|
+
const match = /^v(\d+)\.(\d+)\.(\d+)$/.exec(latestTag);
|
|
88
|
+
if (!match) {
|
|
89
|
+
return 'v1.0.0';
|
|
90
|
+
}
|
|
91
|
+
const major = Number(match[1]);
|
|
92
|
+
const minor = Number(match[2]);
|
|
93
|
+
const patch = Number(match[3]);
|
|
94
|
+
return `v${major}.${minor}.${patch + 1}`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=version-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-store.js","sourceRoot":"","sources":["../../../src/engine/spec-versioning/version-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DiscoveryResult } from '../../types/well-known.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse and validate a .well-known/planu.json manifest from a raw JSON string.
|
|
4
|
+
* Returns a DiscoveryResult with the parsed manifest or validation errors.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseManifest(source: string, rawJson: string): DiscoveryResult;
|
|
7
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmC,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA+FlG;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAiC9E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// engine/well-known/discovery.ts — SPEC-162: Parse and validate a .well-known/planu.json manifest
|
|
2
|
+
/** Validate that a value is a non-empty string. */
|
|
3
|
+
function isNonEmptyString(value) {
|
|
4
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
5
|
+
}
|
|
6
|
+
/** Validate a single ManifestSpec entry. Returns error strings or empty array. */
|
|
7
|
+
function validateManifestSpec(spec, index) {
|
|
8
|
+
const errors = [];
|
|
9
|
+
const prefix = `specs[${String(index)}]`;
|
|
10
|
+
if (spec === null || typeof spec !== 'object') {
|
|
11
|
+
return [`${prefix}: must be an object`];
|
|
12
|
+
}
|
|
13
|
+
const s = spec;
|
|
14
|
+
if (!isNonEmptyString(s.id)) {
|
|
15
|
+
errors.push(`${prefix}.id: must be a non-empty string`);
|
|
16
|
+
}
|
|
17
|
+
else if (!/^SPEC-\d+$/.test(s.id)) {
|
|
18
|
+
errors.push(`${prefix}.id: must match pattern SPEC-NNN (e.g. SPEC-001)`);
|
|
19
|
+
}
|
|
20
|
+
if (!isNonEmptyString(s.title)) {
|
|
21
|
+
errors.push(`${prefix}.title: must be a non-empty string`);
|
|
22
|
+
}
|
|
23
|
+
if (!isNonEmptyString(s.status)) {
|
|
24
|
+
errors.push(`${prefix}.status: must be a non-empty string`);
|
|
25
|
+
}
|
|
26
|
+
if (!isNonEmptyString(s.type)) {
|
|
27
|
+
errors.push(`${prefix}.type: must be a non-empty string`);
|
|
28
|
+
}
|
|
29
|
+
if (typeof s.description !== 'string') {
|
|
30
|
+
errors.push(`${prefix}.description: must be a string`);
|
|
31
|
+
}
|
|
32
|
+
if (!Array.isArray(s.tags)) {
|
|
33
|
+
errors.push(`${prefix}.tags: must be an array`);
|
|
34
|
+
}
|
|
35
|
+
if (!isNonEmptyString(s.created)) {
|
|
36
|
+
errors.push(`${prefix}.created: must be a non-empty string`);
|
|
37
|
+
}
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
/** Validate the top-level structure of a parsed manifest object. */
|
|
41
|
+
function validateManifestShape(raw) {
|
|
42
|
+
const errors = [];
|
|
43
|
+
if (raw === null || typeof raw !== 'object') {
|
|
44
|
+
return ['manifest: must be a JSON object'];
|
|
45
|
+
}
|
|
46
|
+
const m = raw;
|
|
47
|
+
if (m.version !== 1) {
|
|
48
|
+
errors.push(`version: must be 1, got ${String(m.version)}`);
|
|
49
|
+
}
|
|
50
|
+
if (!isNonEmptyString(m.name)) {
|
|
51
|
+
errors.push('name: must be a non-empty string');
|
|
52
|
+
}
|
|
53
|
+
if (typeof m.specCount !== 'number' || !Number.isInteger(m.specCount) || m.specCount < 0) {
|
|
54
|
+
errors.push('specCount: must be a non-negative integer');
|
|
55
|
+
}
|
|
56
|
+
if (!Array.isArray(m.specs)) {
|
|
57
|
+
errors.push('specs: must be an array');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (let i = 0; i < m.specs.length; i++) {
|
|
61
|
+
const specErrors = validateManifestSpec(m.specs[i], i);
|
|
62
|
+
errors.push(...specErrors);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!Array.isArray(m.capabilities)) {
|
|
66
|
+
errors.push('capabilities: must be an array');
|
|
67
|
+
}
|
|
68
|
+
else if (!m.capabilities.every((c) => typeof c === 'string')) {
|
|
69
|
+
errors.push('capabilities: all items must be strings');
|
|
70
|
+
}
|
|
71
|
+
if (!isNonEmptyString(m.generatedAt)) {
|
|
72
|
+
errors.push('generatedAt: must be a non-empty string');
|
|
73
|
+
}
|
|
74
|
+
return errors;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse and validate a .well-known/planu.json manifest from a raw JSON string.
|
|
78
|
+
* Returns a DiscoveryResult with the parsed manifest or validation errors.
|
|
79
|
+
*/
|
|
80
|
+
export function parseManifest(source, rawJson) {
|
|
81
|
+
let parsed;
|
|
82
|
+
try {
|
|
83
|
+
parsed = JSON.parse(rawJson);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
+
return {
|
|
88
|
+
valid: false,
|
|
89
|
+
errors: [`Failed to parse JSON: ${message}`],
|
|
90
|
+
source,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const errors = validateManifestShape(parsed);
|
|
94
|
+
if (errors.length > 0) {
|
|
95
|
+
return { valid: false, errors, source };
|
|
96
|
+
}
|
|
97
|
+
// Safe cast: validateManifestShape confirmed structure is correct
|
|
98
|
+
const m = parsed;
|
|
99
|
+
const manifest = {
|
|
100
|
+
version: 1,
|
|
101
|
+
name: m.name,
|
|
102
|
+
specCount: m.specCount,
|
|
103
|
+
specs: m.specs.map((s) => s),
|
|
104
|
+
capabilities: m.capabilities,
|
|
105
|
+
generatedAt: m.generatedAt,
|
|
106
|
+
};
|
|
107
|
+
return { valid: true, manifest, source };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/engine/well-known/discovery.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAIlG,mDAAmD;AACnD,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB,CAAC,IAAa,EAAE,KAAa;IACxD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAEzC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,GAAG,IAA+B,CAAC;IAE1C,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,iCAAiC,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,kDAAkD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,oCAAoC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,qCAAqC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,mCAAmC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,gCAAgC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,yBAAyB,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oEAAoE;AACpE,SAAS,qBAAqB,CAAC,GAAY;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAG,GAA8B,CAAC;IAEzC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IAC3D,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,yBAAyB,OAAO,EAAE,CAAC;YAC5C,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,MAAM,QAAQ,GAAsB;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,SAAS,EAAE,CAAC,CAAC,SAAmB;QAChC,KAAK,EAAG,CAAC,CAAC,KAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAiB,CAAC;QAC3D,YAAY,EAAE,CAAC,CAAC,YAAwB;QACxC,WAAW,EAAE,CAAC,CAAC,WAAqB;KACrC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { generateManifest } from './manifest-generator.js';
|
|
2
|
+
export type { ManifestGeneratorOptions } from '../../types/well-known.js';
|
|
3
|
+
export { parseManifest } from './discovery.js';
|
|
4
|
+
export { MANIFEST_SCHEMA_V1, KNOWN_CAPABILITIES } from './manifest-schema.js';
|
|
5
|
+
export type { KnownCapability } from './manifest-schema.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// engine/well-known/index.ts — SPEC-162: Barrel export for well-known engine module
|
|
2
|
+
export { generateManifest } from './manifest-generator.js';
|
|
3
|
+
export { parseManifest } from './discovery.js';
|
|
4
|
+
export { MANIFEST_SCHEMA_V1, KNOWN_CAPABILITIES } from './manifest-schema.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/well-known/index.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WellKnownManifest, ManifestGeneratorOptions } from '../../types/well-known.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a WellKnownManifest from a list of project specs.
|
|
4
|
+
* Filters out private/draft specs unless includePrivate is true.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateManifest(options: ManifestGeneratorOptions): WellKnownManifest;
|
|
7
|
+
//# sourceMappingURL=manifest-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/well-known/manifest-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAEjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAiDnC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAkBrF"}
|