@zigrivers/scaffold 3.16.0 → 3.18.0
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/README.md +28 -0
- package/content/knowledge/backend/backend-fintech-broker-integration.md +244 -0
- package/content/knowledge/backend/backend-fintech-compliance.md +181 -0
- package/content/knowledge/backend/backend-fintech-data-modeling.md +210 -0
- package/content/knowledge/backend/backend-fintech-ledger.md +226 -0
- package/content/knowledge/backend/backend-fintech-observability.md +151 -0
- package/content/knowledge/backend/backend-fintech-order-lifecycle.md +213 -0
- package/content/knowledge/backend/backend-fintech-risk-management.md +150 -0
- package/content/knowledge/backend/backend-fintech-testing.md +197 -0
- package/content/knowledge/core/automated-review-tooling.md +10 -0
- package/content/knowledge/core/multi-service-api-contracts.md +634 -0
- package/content/knowledge/core/multi-service-architecture.md +492 -0
- package/content/knowledge/core/multi-service-auth.md +706 -0
- package/content/knowledge/core/multi-service-data-ownership.md +539 -0
- package/content/knowledge/core/multi-service-observability.md +545 -0
- package/content/knowledge/core/multi-service-resilience.md +710 -0
- package/content/knowledge/core/multi-service-task-decomposition.md +615 -0
- package/content/knowledge/core/multi-service-testing.md +728 -0
- package/content/methodology/backend-fintech.yml +46 -0
- package/content/methodology/custom-defaults.yml +6 -0
- package/content/methodology/deep.yml +6 -0
- package/content/methodology/multi-service-overlay.yml +103 -0
- package/content/methodology/mvp.yml +6 -0
- package/content/pipeline/architecture/service-ownership-map.md +83 -0
- package/content/pipeline/quality/cross-service-auth.md +96 -0
- package/content/pipeline/quality/cross-service-observability.md +104 -0
- package/content/pipeline/quality/integration-test-plan.md +106 -0
- package/content/pipeline/specification/inter-service-contracts.md +95 -0
- package/dist/cli/commands/adopt.cli-flags.test.js +20 -0
- package/dist/cli/commands/adopt.cli-flags.test.js.map +1 -1
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +11 -3
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/complete.d.ts +1 -0
- package/dist/cli/commands/complete.d.ts.map +1 -1
- package/dist/cli/commands/complete.js +26 -8
- package/dist/cli/commands/complete.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts +1 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +19 -6
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +1 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -1
- package/dist/cli/commands/decisions.js +18 -4
- package/dist/cli/commands/decisions.js.map +1 -1
- package/dist/cli/commands/info.d.ts +1 -0
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +25 -3
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init-from.test.d.ts +2 -0
- package/dist/cli/commands/init-from.test.d.ts.map +1 -0
- package/dist/cli/commands/init-from.test.js +315 -0
- package/dist/cli/commands/init-from.test.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +239 -129
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +20 -0
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/next.d.ts +1 -0
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +40 -4
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/next.test.js +153 -0
- package/dist/cli/commands/next.test.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +1 -0
- package/dist/cli/commands/reset.d.ts.map +1 -1
- package/dist/cli/commands/reset.js +77 -29
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/rework.d.ts +1 -0
- package/dist/cli/commands/rework.d.ts.map +1 -1
- package/dist/cli/commands/rework.js +16 -2
- package/dist/cli/commands/rework.js.map +1 -1
- package/dist/cli/commands/run.d.ts +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +65 -13
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +255 -3
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/commands/skip.d.ts +1 -0
- package/dist/cli/commands/skip.d.ts.map +1 -1
- package/dist/cli/commands/skip.js +24 -7
- package/dist/cli/commands/skip.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +51 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/status.test.js +130 -0
- package/dist/cli/commands/status.test.js.map +1 -1
- package/dist/cli/guards-coverage.test.d.ts +2 -0
- package/dist/cli/guards-coverage.test.d.ts.map +1 -0
- package/dist/cli/guards-coverage.test.js +26 -0
- package/dist/cli/guards-coverage.test.js.map +1 -0
- package/dist/cli/guards-integration.test.d.ts +2 -0
- package/dist/cli/guards-integration.test.d.ts.map +1 -0
- package/dist/cli/guards-integration.test.js +178 -0
- package/dist/cli/guards-integration.test.js.map +1 -0
- package/dist/cli/guards.d.ts +13 -0
- package/dist/cli/guards.d.ts.map +1 -0
- package/dist/cli/guards.js +70 -0
- package/dist/cli/guards.js.map +1 -0
- package/dist/cli/guards.test.d.ts +2 -0
- package/dist/cli/guards.test.d.ts.map +1 -0
- package/dist/cli/guards.test.js +136 -0
- package/dist/cli/guards.test.js.map +1 -0
- package/dist/cli/init-flag-families.d.ts +1 -1
- package/dist/cli/init-flag-families.d.ts.map +1 -1
- package/dist/cli/init-flag-families.js +4 -1
- package/dist/cli/init-flag-families.js.map +1 -1
- package/dist/cli/init-flag-families.test.js +10 -0
- package/dist/cli/init-flag-families.test.js.map +1 -1
- package/dist/cli/shutdown.d.ts +2 -3
- package/dist/cli/shutdown.d.ts.map +1 -1
- package/dist/cli/shutdown.js +14 -11
- package/dist/cli/shutdown.js.map +1 -1
- package/dist/cli/shutdown.test.js +2 -4
- package/dist/cli/shutdown.test.js.map +1 -1
- package/dist/config/schema.d.ts +12122 -288
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +74 -79
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +230 -1
- package/dist/config/schema.test.js.map +1 -1
- package/dist/config/validators/backend.d.ts +4 -0
- package/dist/config/validators/backend.d.ts.map +1 -0
- package/dist/config/validators/backend.js +14 -0
- package/dist/config/validators/backend.js.map +1 -0
- package/dist/config/validators/browser-extension.d.ts +4 -0
- package/dist/config/validators/browser-extension.d.ts.map +1 -0
- package/dist/config/validators/browser-extension.js +24 -0
- package/dist/config/validators/browser-extension.js.map +1 -0
- package/dist/config/validators/cli.d.ts +4 -0
- package/dist/config/validators/cli.d.ts.map +1 -0
- package/dist/config/validators/cli.js +14 -0
- package/dist/config/validators/cli.js.map +1 -0
- package/dist/config/validators/data-pipeline.d.ts +4 -0
- package/dist/config/validators/data-pipeline.d.ts.map +1 -0
- package/dist/config/validators/data-pipeline.js +14 -0
- package/dist/config/validators/data-pipeline.js.map +1 -0
- package/dist/config/validators/game.d.ts +4 -0
- package/dist/config/validators/game.d.ts.map +1 -0
- package/dist/config/validators/game.js +14 -0
- package/dist/config/validators/game.js.map +1 -0
- package/dist/config/validators/index.d.ts +7 -0
- package/dist/config/validators/index.d.ts.map +1 -0
- package/dist/config/validators/index.js +27 -0
- package/dist/config/validators/index.js.map +1 -0
- package/dist/config/validators/library.d.ts +4 -0
- package/dist/config/validators/library.d.ts.map +1 -0
- package/dist/config/validators/library.js +25 -0
- package/dist/config/validators/library.js.map +1 -0
- package/dist/config/validators/ml.d.ts +4 -0
- package/dist/config/validators/ml.d.ts.map +1 -0
- package/dist/config/validators/ml.js +31 -0
- package/dist/config/validators/ml.js.map +1 -0
- package/dist/config/validators/mobile-app.d.ts +4 -0
- package/dist/config/validators/mobile-app.d.ts.map +1 -0
- package/dist/config/validators/mobile-app.js +14 -0
- package/dist/config/validators/mobile-app.js.map +1 -0
- package/dist/config/validators/registry.test.d.ts +2 -0
- package/dist/config/validators/registry.test.d.ts.map +1 -0
- package/dist/config/validators/registry.test.js +26 -0
- package/dist/config/validators/registry.test.js.map +1 -0
- package/dist/config/validators/research.d.ts +4 -0
- package/dist/config/validators/research.d.ts.map +1 -0
- package/dist/config/validators/research.js +24 -0
- package/dist/config/validators/research.js.map +1 -0
- package/dist/config/validators/research.test.d.ts +2 -0
- package/dist/config/validators/research.test.d.ts.map +1 -0
- package/dist/config/validators/research.test.js +44 -0
- package/dist/config/validators/research.test.js.map +1 -0
- package/dist/config/validators/types.d.ts +19 -0
- package/dist/config/validators/types.d.ts.map +1 -0
- package/dist/config/validators/types.js +2 -0
- package/dist/config/validators/types.js.map +1 -0
- package/dist/config/validators/validators.test.d.ts +2 -0
- package/dist/config/validators/validators.test.d.ts.map +1 -0
- package/dist/config/validators/validators.test.js +25 -0
- package/dist/config/validators/validators.test.js.map +1 -0
- package/dist/config/validators/web-app.d.ts +4 -0
- package/dist/config/validators/web-app.d.ts.map +1 -0
- package/dist/config/validators/web-app.js +31 -0
- package/dist/config/validators/web-app.js.map +1 -0
- package/dist/core/assembly/context-gatherer.d.ts.map +1 -1
- package/dist/core/assembly/context-gatherer.js +4 -2
- package/dist/core/assembly/context-gatherer.js.map +1 -1
- package/dist/core/assembly/cross-reads.d.ts +61 -0
- package/dist/core/assembly/cross-reads.d.ts.map +1 -0
- package/dist/core/assembly/cross-reads.js +190 -0
- package/dist/core/assembly/cross-reads.js.map +1 -0
- package/dist/core/assembly/cross-reads.test.d.ts +2 -0
- package/dist/core/assembly/cross-reads.test.d.ts.map +1 -0
- package/dist/core/assembly/cross-reads.test.js +497 -0
- package/dist/core/assembly/cross-reads.test.js.map +1 -0
- package/dist/core/assembly/overlay-loader-structural.test.d.ts +2 -0
- package/dist/core/assembly/overlay-loader-structural.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-loader-structural.test.js +173 -0
- package/dist/core/assembly/overlay-loader-structural.test.js.map +1 -0
- package/dist/core/assembly/overlay-loader.d.ts +19 -3
- package/dist/core/assembly/overlay-loader.d.ts.map +1 -1
- package/dist/core/assembly/overlay-loader.js +135 -4
- package/dist/core/assembly/overlay-loader.js.map +1 -1
- package/dist/core/assembly/overlay-loader.test.js +204 -1
- package/dist/core/assembly/overlay-loader.test.js.map +1 -1
- package/dist/core/assembly/overlay-resolver.d.ts +9 -2
- package/dist/core/assembly/overlay-resolver.d.ts.map +1 -1
- package/dist/core/assembly/overlay-resolver.js +32 -1
- package/dist/core/assembly/overlay-resolver.js.map +1 -1
- package/dist/core/assembly/overlay-resolver.test.js +135 -17
- package/dist/core/assembly/overlay-resolver.test.js.map +1 -1
- package/dist/core/assembly/overlay-state-resolver.d.ts +9 -0
- package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -1
- package/dist/core/assembly/overlay-state-resolver.js +43 -2
- package/dist/core/assembly/overlay-state-resolver.js.map +1 -1
- package/dist/core/assembly/overlay-state-resolver.test.js +321 -0
- package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -1
- package/dist/core/assembly/update-mode.d.ts +1 -0
- package/dist/core/assembly/update-mode.d.ts.map +1 -1
- package/dist/core/assembly/update-mode.js +17 -9
- package/dist/core/assembly/update-mode.js.map +1 -1
- package/dist/core/dependency/eligibility.d.ts +10 -1
- package/dist/core/dependency/eligibility.d.ts.map +1 -1
- package/dist/core/dependency/eligibility.js +19 -1
- package/dist/core/dependency/eligibility.js.map +1 -1
- package/dist/core/dependency/eligibility.test.js +82 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -1
- package/dist/core/dependency/graph.d.ts +4 -1
- package/dist/core/dependency/graph.d.ts.map +1 -1
- package/dist/core/dependency/graph.js +7 -1
- package/dist/core/dependency/graph.js.map +1 -1
- package/dist/core/dependency/graph.test.js +48 -0
- package/dist/core/dependency/graph.test.js.map +1 -1
- package/dist/core/pipeline/global-steps.d.ts +7 -0
- package/dist/core/pipeline/global-steps.d.ts.map +1 -0
- package/dist/core/pipeline/global-steps.js +18 -0
- package/dist/core/pipeline/global-steps.js.map +1 -0
- package/dist/core/pipeline/resolver.d.ts +1 -0
- package/dist/core/pipeline/resolver.d.ts.map +1 -1
- package/dist/core/pipeline/resolver.js +54 -7
- package/dist/core/pipeline/resolver.js.map +1 -1
- package/dist/core/pipeline/resolver.test.js +51 -1
- package/dist/core/pipeline/resolver.test.js.map +1 -1
- package/dist/core/pipeline/types.d.ts +5 -1
- package/dist/core/pipeline/types.d.ts.map +1 -1
- package/dist/e2e/cross-service-references.test.d.ts +22 -0
- package/dist/e2e/cross-service-references.test.d.ts.map +1 -0
- package/dist/e2e/cross-service-references.test.js +230 -0
- package/dist/e2e/cross-service-references.test.js.map +1 -0
- package/dist/e2e/multi-service-pipeline.test.d.ts +10 -0
- package/dist/e2e/multi-service-pipeline.test.d.ts.map +1 -0
- package/dist/e2e/multi-service-pipeline.test.js +185 -0
- package/dist/e2e/multi-service-pipeline.test.js.map +1 -0
- package/dist/e2e/project-type-overlays.test.js +68 -0
- package/dist/e2e/project-type-overlays.test.js.map +1 -1
- package/dist/e2e/service-execution.test.d.ts +15 -0
- package/dist/e2e/service-execution.test.d.ts.map +1 -0
- package/dist/e2e/service-execution.test.js +219 -0
- package/dist/e2e/service-execution.test.js.map +1 -0
- package/dist/e2e/service-manifest.test.d.ts +19 -0
- package/dist/e2e/service-manifest.test.d.ts.map +1 -0
- package/dist/e2e/service-manifest.test.js +166 -0
- package/dist/e2e/service-manifest.test.js.map +1 -0
- package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts +224 -224
- package/dist/project/frontmatter.d.ts.map +1 -1
- package/dist/project/frontmatter.js +11 -0
- package/dist/project/frontmatter.js.map +1 -1
- package/dist/project/frontmatter.test.js +71 -0
- package/dist/project/frontmatter.test.js.map +1 -1
- package/dist/state/completion.d.ts +1 -1
- package/dist/state/completion.d.ts.map +1 -1
- package/dist/state/completion.js +10 -8
- package/dist/state/completion.js.map +1 -1
- package/dist/state/decision-logger.d.ts +3 -2
- package/dist/state/decision-logger.d.ts.map +1 -1
- package/dist/state/decision-logger.js +12 -11
- package/dist/state/decision-logger.js.map +1 -1
- package/dist/state/ensure-v3-migration.d.ts +9 -0
- package/dist/state/ensure-v3-migration.d.ts.map +1 -0
- package/dist/state/ensure-v3-migration.js +35 -0
- package/dist/state/ensure-v3-migration.js.map +1 -0
- package/dist/state/lock-manager.d.ts +5 -4
- package/dist/state/lock-manager.d.ts.map +1 -1
- package/dist/state/lock-manager.js +11 -11
- package/dist/state/lock-manager.js.map +1 -1
- package/dist/state/rework-manager.d.ts +1 -2
- package/dist/state/rework-manager.d.ts.map +1 -1
- package/dist/state/rework-manager.js +4 -5
- package/dist/state/rework-manager.js.map +1 -1
- package/dist/state/state-manager.d.ts +25 -1
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +86 -12
- package/dist/state/state-manager.js.map +1 -1
- package/dist/state/state-manager.test.js +278 -0
- package/dist/state/state-manager.test.js.map +1 -1
- package/dist/state/state-migration-v3.d.ts +22 -0
- package/dist/state/state-migration-v3.d.ts.map +1 -0
- package/dist/state/state-migration-v3.js +82 -0
- package/dist/state/state-migration-v3.js.map +1 -0
- package/dist/state/state-migration-v3.test.d.ts +2 -0
- package/dist/state/state-migration-v3.test.d.ts.map +1 -0
- package/dist/state/state-migration-v3.test.js +196 -0
- package/dist/state/state-migration-v3.test.js.map +1 -0
- package/dist/state/state-migration.d.ts.map +1 -1
- package/dist/state/state-migration.js +11 -6
- package/dist/state/state-migration.js.map +1 -1
- package/dist/state/state-migration.test.js +47 -2
- package/dist/state/state-migration.test.js.map +1 -1
- package/dist/state/state-path-resolver.d.ts +23 -0
- package/dist/state/state-path-resolver.d.ts.map +1 -0
- package/dist/state/state-path-resolver.js +36 -0
- package/dist/state/state-path-resolver.js.map +1 -0
- package/dist/state/state-path-resolver.test.d.ts +2 -0
- package/dist/state/state-path-resolver.test.d.ts.map +1 -0
- package/dist/state/state-path-resolver.test.js +78 -0
- package/dist/state/state-path-resolver.test.js.map +1 -0
- package/dist/state/state-version-dispatch.d.ts +17 -0
- package/dist/state/state-version-dispatch.d.ts.map +1 -0
- package/dist/state/state-version-dispatch.js +27 -0
- package/dist/state/state-version-dispatch.js.map +1 -0
- package/dist/state/state-version-dispatch.test.d.ts +2 -0
- package/dist/state/state-version-dispatch.test.d.ts.map +1 -0
- package/dist/state/state-version-dispatch.test.js +40 -0
- package/dist/state/state-version-dispatch.test.js.map +1 -0
- package/dist/types/config.d.ts +33 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.test.js +62 -1
- package/dist/types/config.test.js.map +1 -1
- package/dist/types/dependency.d.ts +9 -0
- package/dist/types/dependency.d.ts.map +1 -1
- package/dist/types/frontmatter.d.ts +5 -0
- package/dist/types/frontmatter.d.ts.map +1 -1
- package/dist/types/lock.d.ts +1 -1
- package/dist/types/lock.d.ts.map +1 -1
- package/dist/types/state.d.ts +1 -1
- package/dist/types/state.d.ts.map +1 -1
- package/dist/utils/artifact-path.d.ts +19 -0
- package/dist/utils/artifact-path.d.ts.map +1 -0
- package/dist/utils/artifact-path.js +95 -0
- package/dist/utils/artifact-path.js.map +1 -0
- package/dist/utils/artifact-path.test.d.ts +2 -0
- package/dist/utils/artifact-path.test.d.ts.map +1 -0
- package/dist/utils/artifact-path.test.js +138 -0
- package/dist/utils/artifact-path.test.js.map +1 -0
- package/dist/utils/errors.d.ts +3 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +21 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/errors.test.js +27 -1
- package/dist/utils/errors.test.js.map +1 -1
- package/dist/utils/user-errors.d.ts +46 -0
- package/dist/utils/user-errors.d.ts.map +1 -0
- package/dist/utils/user-errors.js +76 -0
- package/dist/utils/user-errors.js.map +1 -0
- package/dist/utils/user-errors.test.d.ts +2 -0
- package/dist/utils/user-errors.test.d.ts.map +1 -0
- package/dist/utils/user-errors.test.js +74 -0
- package/dist/utils/user-errors.test.js.map +1 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +16 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/index.test.js +48 -0
- package/dist/validation/index.test.js.map +1 -1
- package/dist/validation/state-validator.d.ts +5 -2
- package/dist/validation/state-validator.d.ts.map +1 -1
- package/dist/validation/state-validator.js +18 -20
- package/dist/validation/state-validator.js.map +1 -1
- package/dist/validation/state-validator.test.js +31 -2
- package/dist/validation/state-validator.test.js.map +1 -1
- package/dist/wizard/copy/backend.d.ts.map +1 -1
- package/dist/wizard/copy/backend.js +12 -0
- package/dist/wizard/copy/backend.js.map +1 -1
- package/dist/wizard/flags.d.ts +1 -0
- package/dist/wizard/flags.d.ts.map +1 -1
- package/dist/wizard/questions.d.ts.map +1 -1
- package/dist/wizard/questions.js +5 -1
- package/dist/wizard/questions.js.map +1 -1
- package/dist/wizard/questions.test.js +45 -2
- package/dist/wizard/questions.test.js.map +1 -1
- package/dist/wizard/wizard.d.ts +23 -0
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +85 -47
- package/dist/wizard/wizard.js.map +1 -1
- package/dist/wizard/wizard.test.js +186 -1
- package/dist/wizard/wizard.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E integration tests for cross-service references (Wave 3c).
|
|
3
|
+
*
|
|
4
|
+
* Scope note: these tests exercise the full cross-reads resolver against the
|
|
5
|
+
* real filesystem (StateManager.loadStateReadOnly, migrateState, state merging,
|
|
6
|
+
* per-service cache, transitive DFS). MetaPromptFile fixtures are typed objects
|
|
7
|
+
* rather than on-disk pipeline content because Wave 3c is the first feature to
|
|
8
|
+
* use the crossReads frontmatter field — no real pipeline step uses it yet.
|
|
9
|
+
* CLI-wiring coverage (loadPipelineContext + runCommand.handler) lives in
|
|
10
|
+
* src/cli/commands/run.test.ts's "cross-reads artifact gathering (Wave 3c)"
|
|
11
|
+
* suite, which mocks resolveTransitiveCrossReads at the module boundary.
|
|
12
|
+
*
|
|
13
|
+
* Verifies:
|
|
14
|
+
* - resolveTransitiveCrossReads returns foreign service artifacts
|
|
15
|
+
* - transitive chain A → B → C surfaces C's artifact via B's crossReads
|
|
16
|
+
* - the read-only loader NEVER writes to foreign state — regression test for
|
|
17
|
+
* the Round-4 P0 (migrateState → saveState clobbering next_eligible)
|
|
18
|
+
* - cross-reads work while a foreign service's lock is held (no deadlock,
|
|
19
|
+
* no foreign-state write under concurrency)
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=cross-service-references.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-service-references.test.d.ts","sourceRoot":"","sources":["../../src/e2e/cross-service-references.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E integration tests for cross-service references (Wave 3c).
|
|
3
|
+
*
|
|
4
|
+
* Scope note: these tests exercise the full cross-reads resolver against the
|
|
5
|
+
* real filesystem (StateManager.loadStateReadOnly, migrateState, state merging,
|
|
6
|
+
* per-service cache, transitive DFS). MetaPromptFile fixtures are typed objects
|
|
7
|
+
* rather than on-disk pipeline content because Wave 3c is the first feature to
|
|
8
|
+
* use the crossReads frontmatter field — no real pipeline step uses it yet.
|
|
9
|
+
* CLI-wiring coverage (loadPipelineContext + runCommand.handler) lives in
|
|
10
|
+
* src/cli/commands/run.test.ts's "cross-reads artifact gathering (Wave 3c)"
|
|
11
|
+
* suite, which mocks resolveTransitiveCrossReads at the module boundary.
|
|
12
|
+
*
|
|
13
|
+
* Verifies:
|
|
14
|
+
* - resolveTransitiveCrossReads returns foreign service artifacts
|
|
15
|
+
* - transitive chain A → B → C surfaces C's artifact via B's crossReads
|
|
16
|
+
* - the read-only loader NEVER writes to foreign state — regression test for
|
|
17
|
+
* the Round-4 P0 (migrateState → saveState clobbering next_eligible)
|
|
18
|
+
* - cross-reads work while a foreign service's lock is held (no deadlock,
|
|
19
|
+
* no foreign-state write under concurrency)
|
|
20
|
+
*/
|
|
21
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import os from 'node:os';
|
|
25
|
+
import { resolveTransitiveCrossReads } from '../core/assembly/cross-reads.js';
|
|
26
|
+
function mkOutput() {
|
|
27
|
+
return {
|
|
28
|
+
warn: vi.fn(), info: vi.fn(), success: vi.fn(), error: vi.fn(),
|
|
29
|
+
result: vi.fn(),
|
|
30
|
+
supportsInteractivePrompts: vi.fn().mockReturnValue(false),
|
|
31
|
+
prompt: vi.fn(), confirm: vi.fn(), select: vi.fn(),
|
|
32
|
+
multiSelect: vi.fn(), multiInput: vi.fn(),
|
|
33
|
+
startSpinner: vi.fn(), stopSpinner: vi.fn(),
|
|
34
|
+
startProgress: vi.fn(), updateProgress: vi.fn(), stopProgress: vi.fn(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function mkMetaFile(name, crossReads = []) {
|
|
38
|
+
return {
|
|
39
|
+
stepName: name,
|
|
40
|
+
filePath: `/fake/${name}.md`,
|
|
41
|
+
frontmatter: {
|
|
42
|
+
name, description: '', summary: null,
|
|
43
|
+
phase: 'architecture', order: 700,
|
|
44
|
+
dependencies: [], outputs: [], conditional: null,
|
|
45
|
+
knowledgeBase: [], reads: [], crossReads,
|
|
46
|
+
stateless: false, category: 'pipeline',
|
|
47
|
+
},
|
|
48
|
+
body: '', sections: {},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function writeState(filePath, steps) {
|
|
52
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
53
|
+
fs.writeFileSync(filePath, JSON.stringify({
|
|
54
|
+
'schema-version': 3,
|
|
55
|
+
steps,
|
|
56
|
+
next_eligible: [],
|
|
57
|
+
in_progress: null,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
describe('Cross-service references E2E (Wave 3c)', () => {
|
|
61
|
+
let projectRoot;
|
|
62
|
+
const producerStep = 'domain-modeling'; // service-local step (not in multi-service-overlay)
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
projectRoot = path.join(os.tmpdir(), `scaffold-e2e-cross-${Date.now()}-${Math.random()}`);
|
|
65
|
+
fs.mkdirSync(path.join(projectRoot, 'docs'), { recursive: true });
|
|
66
|
+
fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'producer'), { recursive: true });
|
|
67
|
+
fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'consumer'), { recursive: true });
|
|
68
|
+
writeState(path.join(projectRoot, '.scaffold', 'state.json'), {});
|
|
69
|
+
writeState(path.join(projectRoot, '.scaffold', 'services', 'producer', 'state.json'), { [producerStep]: { status: 'completed', produces: ['docs/contracts.md'] } });
|
|
70
|
+
writeState(path.join(projectRoot, '.scaffold', 'services', 'consumer', 'state.json'), {});
|
|
71
|
+
fs.writeFileSync(path.join(projectRoot, 'docs', 'contracts.md'), 'CONTRACTS');
|
|
72
|
+
});
|
|
73
|
+
afterEach(() => fs.rmSync(projectRoot, { recursive: true, force: true }));
|
|
74
|
+
const config = {
|
|
75
|
+
version: 2, methodology: 'deep', platforms: ['claude-code'],
|
|
76
|
+
project: {
|
|
77
|
+
services: [
|
|
78
|
+
{
|
|
79
|
+
name: 'producer', projectType: 'library',
|
|
80
|
+
libraryConfig: { visibility: 'internal' },
|
|
81
|
+
exports: [{ step: producerStep }],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'consumer', projectType: 'backend',
|
|
85
|
+
backendConfig: { apiStyle: 'rest' },
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
it('resolveTransitiveCrossReads returns foreign service artifact end-to-end', () => {
|
|
92
|
+
const metas = new Map([
|
|
93
|
+
[producerStep, mkMetaFile(producerStep)],
|
|
94
|
+
]);
|
|
95
|
+
const output = mkOutput();
|
|
96
|
+
const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
|
|
97
|
+
expect(artifacts).toEqual([
|
|
98
|
+
expect.objectContaining({
|
|
99
|
+
stepName: `producer:${producerStep}`,
|
|
100
|
+
filePath: 'docs/contracts.md',
|
|
101
|
+
content: 'CONTRACTS',
|
|
102
|
+
}),
|
|
103
|
+
]);
|
|
104
|
+
});
|
|
105
|
+
it('transitive chain: consumer → producer → shared-lib surfaces all artifacts', () => {
|
|
106
|
+
// A third service 'shared-lib' produces docs/shared.md; producer's
|
|
107
|
+
// domain-modeling step cross-reads shared-lib, so consumer cross-reading
|
|
108
|
+
// producer should transitively receive shared-lib's artifact too.
|
|
109
|
+
fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'shared-lib'), { recursive: true });
|
|
110
|
+
fs.writeFileSync(path.join(projectRoot, 'docs', 'shared.md'), 'SHARED');
|
|
111
|
+
writeState(path.join(projectRoot, '.scaffold', 'services', 'shared-lib', 'state.json'), { 'api-contracts': { status: 'completed', produces: ['docs/shared.md'] } });
|
|
112
|
+
const transitiveConfig = {
|
|
113
|
+
version: 2, methodology: 'deep', platforms: ['claude-code'],
|
|
114
|
+
project: {
|
|
115
|
+
services: [
|
|
116
|
+
{
|
|
117
|
+
name: 'producer', projectType: 'library',
|
|
118
|
+
libraryConfig: { visibility: 'internal' },
|
|
119
|
+
exports: [{ step: producerStep }],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'shared-lib', projectType: 'library',
|
|
123
|
+
libraryConfig: { visibility: 'internal' },
|
|
124
|
+
exports: [{ step: 'api-contracts' }],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: 'consumer', projectType: 'backend',
|
|
128
|
+
backendConfig: { apiStyle: 'rest' },
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
// Producer's step template declares a cross-read to shared-lib:api-contracts
|
|
135
|
+
const metas = new Map([
|
|
136
|
+
[producerStep, mkMetaFile(producerStep, [{ service: 'shared-lib', step: 'api-contracts' }])],
|
|
137
|
+
['api-contracts', mkMetaFile('api-contracts')],
|
|
138
|
+
]);
|
|
139
|
+
const output = mkOutput();
|
|
140
|
+
const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], // consumer → producer
|
|
141
|
+
transitiveConfig, projectRoot, metas, output, new Set(), new Map(), new Map());
|
|
142
|
+
const paths = artifacts.map(a => a.filePath).sort();
|
|
143
|
+
expect(paths).toEqual(['docs/contracts.md', 'docs/shared.md']);
|
|
144
|
+
});
|
|
145
|
+
it('NEVER writes to foreign state file even when migrateState would apply a rename', () => {
|
|
146
|
+
// Regression for Round-4 P0. Seed producer state with a deprecated step name
|
|
147
|
+
// that migrateState would rename (testing-strategy → tdd). If loadStateReadOnly
|
|
148
|
+
// or any downstream code calls saveState, this file's mtime changes.
|
|
149
|
+
const producerStatePath = path.join(projectRoot, '.scaffold', 'services', 'producer', 'state.json');
|
|
150
|
+
writeState(producerStatePath, {
|
|
151
|
+
[producerStep]: { status: 'completed', produces: ['docs/contracts.md'] },
|
|
152
|
+
'testing-strategy': { status: 'completed', produces: ['docs/tdd.md'] },
|
|
153
|
+
});
|
|
154
|
+
// Backdate so a same-millisecond write would still be detectable
|
|
155
|
+
const backdated = new Date(Date.now() - 2000);
|
|
156
|
+
fs.utimesSync(producerStatePath, backdated, backdated);
|
|
157
|
+
const mtimeBefore = fs.statSync(producerStatePath).mtimeMs;
|
|
158
|
+
const metas = new Map([
|
|
159
|
+
[producerStep, mkMetaFile(producerStep)],
|
|
160
|
+
]);
|
|
161
|
+
const output = mkOutput();
|
|
162
|
+
resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
|
|
163
|
+
const mtimeAfter = fs.statSync(producerStatePath).mtimeMs;
|
|
164
|
+
expect(mtimeAfter).toBe(mtimeBefore); // file NOT written
|
|
165
|
+
});
|
|
166
|
+
it('cross-read succeeds when producer service has an active lock (no deadlock, no write)', () => {
|
|
167
|
+
// Simulate a foreign service lock held by another concurrent run
|
|
168
|
+
const lockDir = path.join(projectRoot, '.scaffold', 'services', 'producer');
|
|
169
|
+
const lockPath = path.join(lockDir, 'lock.json');
|
|
170
|
+
fs.writeFileSync(lockPath, JSON.stringify({
|
|
171
|
+
pid: 999999, step: producerStep, acquired: new Date().toISOString(),
|
|
172
|
+
}));
|
|
173
|
+
const statePath = path.join(lockDir, 'state.json');
|
|
174
|
+
const backdated = new Date(Date.now() - 2000);
|
|
175
|
+
fs.utimesSync(statePath, backdated, backdated);
|
|
176
|
+
const mtimeBefore = fs.statSync(statePath).mtimeMs;
|
|
177
|
+
const metas = new Map([
|
|
178
|
+
[producerStep, mkMetaFile(producerStep)],
|
|
179
|
+
]);
|
|
180
|
+
const output = mkOutput();
|
|
181
|
+
// Must complete without hanging on the lock — read-only loader acquires no lock.
|
|
182
|
+
const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
|
|
183
|
+
expect(artifacts.length).toBeGreaterThan(0);
|
|
184
|
+
// Still no write to foreign state
|
|
185
|
+
expect(fs.statSync(statePath).mtimeMs).toBe(mtimeBefore);
|
|
186
|
+
});
|
|
187
|
+
it('overlay-only crossRead (no frontmatter entry) surfaces through resolveTransitiveCrossReads (Wave 3c+1)', () => {
|
|
188
|
+
// Step B's frontmatter has no crossReads; an overlay adds one pointing at C.
|
|
189
|
+
// Passing the overlay map to the resolver must surface C's artifact.
|
|
190
|
+
fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'consumer2'), { recursive: true });
|
|
191
|
+
fs.writeFileSync(path.join(projectRoot, 'docs', 'extra.md'), 'EXTRA');
|
|
192
|
+
writeState(path.join(projectRoot, '.scaffold', 'services', 'consumer2', 'state.json'), { 'extra-step': { status: 'completed', produces: ['docs/extra.md'] } });
|
|
193
|
+
const configWithExtraExport = {
|
|
194
|
+
version: 2, methodology: 'deep', platforms: ['claude-code'],
|
|
195
|
+
project: {
|
|
196
|
+
services: [
|
|
197
|
+
{
|
|
198
|
+
name: 'producer', projectType: 'library',
|
|
199
|
+
libraryConfig: { visibility: 'internal' },
|
|
200
|
+
exports: [{ step: producerStep }],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'consumer2', projectType: 'library',
|
|
204
|
+
libraryConfig: { visibility: 'internal' },
|
|
205
|
+
exports: [{ step: 'extra-step' }],
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'consumer', projectType: 'backend',
|
|
209
|
+
backendConfig: { apiStyle: 'rest' },
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
const metas = new Map([
|
|
216
|
+
[producerStep, mkMetaFile(producerStep)], // no frontmatter crossReads
|
|
217
|
+
]);
|
|
218
|
+
// Overlay adds a cross-read to producer's step
|
|
219
|
+
const overlayCrossReads = {
|
|
220
|
+
[producerStep]: [{ service: 'consumer2', step: 'extra-step' }],
|
|
221
|
+
};
|
|
222
|
+
const output = mkOutput();
|
|
223
|
+
const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], configWithExtraExport, projectRoot, metas, output, new Set(), new Map(), new Map(), undefined, // globalSteps
|
|
224
|
+
overlayCrossReads);
|
|
225
|
+
const paths = artifacts.map(a => a.filePath).sort();
|
|
226
|
+
// producer's own docs/contracts.md + consumer2's docs/extra.md (via overlay-added crossRead)
|
|
227
|
+
expect(paths).toEqual(['docs/contracts.md', 'docs/extra.md']);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=cross-service-references.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-service-references.test.js","sourceRoot":"","sources":["../../src/e2e/cross-service-references.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for multi-service pipeline — exercises resolveOverlayState with
|
|
3
|
+
* a services[] config, verifies cross-service steps are enabled, knowledge
|
|
4
|
+
* is injected, and reads/dependencies are wired correctly.
|
|
5
|
+
*
|
|
6
|
+
* Follows the same pattern as game-pipeline.test.ts: real meta-prompts via
|
|
7
|
+
* vi.importActual, mocked detectProjectMode and discoverMetaPrompts.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=multi-service-pipeline.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-service-pipeline.test.d.ts","sourceRoot":"","sources":["../../src/e2e/multi-service-pipeline.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for multi-service pipeline — exercises resolveOverlayState with
|
|
3
|
+
* a services[] config, verifies cross-service steps are enabled, knowledge
|
|
4
|
+
* is injected, and reads/dependencies are wired correctly.
|
|
5
|
+
*
|
|
6
|
+
* Follows the same pattern as game-pipeline.test.ts: real meta-prompts via
|
|
7
|
+
* vi.importActual, mocked detectProjectMode and discoverMetaPrompts.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Hoisted mocks — must appear before real imports
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
vi.mock('../../src/project/detector.js', () => ({
|
|
14
|
+
detectProjectMode: vi.fn(() => ({
|
|
15
|
+
mode: 'greenfield',
|
|
16
|
+
signals: [],
|
|
17
|
+
methodologySuggestion: 'deep',
|
|
18
|
+
sourceFileCount: 0,
|
|
19
|
+
})),
|
|
20
|
+
}));
|
|
21
|
+
vi.mock('../../src/core/assembly/meta-prompt-loader.js', () => ({
|
|
22
|
+
discoverMetaPrompts: vi.fn(() => new Map()),
|
|
23
|
+
discoverAllMetaPrompts: vi.fn(() => new Map()),
|
|
24
|
+
}));
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Real imports (after mock declarations)
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
import { loadAllPresets } from '../core/assembly/preset-loader.js';
|
|
29
|
+
import { resolveOverlayState } from '../core/assembly/overlay-state-resolver.js';
|
|
30
|
+
import { getPackagePipelineDir, getPackageMethodologyDir } from '../utils/fs.js';
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Helpers
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
function createMockOutput() {
|
|
35
|
+
return {
|
|
36
|
+
success: vi.fn(),
|
|
37
|
+
info: vi.fn(),
|
|
38
|
+
warn: vi.fn(),
|
|
39
|
+
error: vi.fn(),
|
|
40
|
+
result: vi.fn(),
|
|
41
|
+
supportsInteractivePrompts: vi.fn().mockReturnValue(false),
|
|
42
|
+
prompt: vi.fn().mockResolvedValue(''),
|
|
43
|
+
confirm: vi.fn().mockResolvedValue(false),
|
|
44
|
+
select: vi.fn().mockResolvedValue(''),
|
|
45
|
+
multiSelect: vi.fn().mockResolvedValue([]),
|
|
46
|
+
multiInput: vi.fn().mockResolvedValue([]),
|
|
47
|
+
startSpinner: vi.fn(),
|
|
48
|
+
stopSpinner: vi.fn(),
|
|
49
|
+
startProgress: vi.fn(),
|
|
50
|
+
updateProgress: vi.fn(),
|
|
51
|
+
stopProgress: vi.fn(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Discover real meta-prompts from the package pipeline directory
|
|
56
|
+
* and build a Map suitable for resolveOverlayState.
|
|
57
|
+
* Uses vi.importActual to bypass the vi.mock and get the real loader.
|
|
58
|
+
*/
|
|
59
|
+
async function discoverRealMetaPrompts() {
|
|
60
|
+
const pipelineDir = getPackagePipelineDir();
|
|
61
|
+
const actual = await vi.importActual('../core/assembly/meta-prompt-loader.js');
|
|
62
|
+
return actual.discoverMetaPrompts(pipelineDir);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve the multi-service overlay with a given methodology against the real pipeline.
|
|
66
|
+
* Config includes a services[] array to activate the structural overlay pass.
|
|
67
|
+
*/
|
|
68
|
+
async function resolveMultiServiceOverlay(methodology = 'deep') {
|
|
69
|
+
const methodologyDir = getPackageMethodologyDir();
|
|
70
|
+
const realMetaPrompts = await discoverRealMetaPrompts();
|
|
71
|
+
const knownSteps = [...realMetaPrompts.keys()];
|
|
72
|
+
const presets = loadAllPresets(methodologyDir, knownSteps);
|
|
73
|
+
const output = createMockOutput();
|
|
74
|
+
const preset = methodology === 'mvp' ? presets.mvp : presets.deep;
|
|
75
|
+
const overlayState = resolveOverlayState({
|
|
76
|
+
config: {
|
|
77
|
+
version: 2,
|
|
78
|
+
methodology,
|
|
79
|
+
platforms: ['claude-code'],
|
|
80
|
+
project: {
|
|
81
|
+
services: [
|
|
82
|
+
{
|
|
83
|
+
name: 'api', projectType: 'backend',
|
|
84
|
+
backendConfig: {
|
|
85
|
+
apiStyle: 'rest', dataStore: ['relational'], authMechanism: 'jwt',
|
|
86
|
+
asyncMessaging: 'none', deployTarget: 'container', domain: 'none',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'web', projectType: 'web-app',
|
|
91
|
+
webAppConfig: {
|
|
92
|
+
deployTarget: 'container', renderingStrategy: 'spa',
|
|
93
|
+
realtime: 'none', authFlow: 'none',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
methodologyDir,
|
|
100
|
+
metaPrompts: realMetaPrompts,
|
|
101
|
+
presetSteps: preset?.steps ?? {},
|
|
102
|
+
output,
|
|
103
|
+
});
|
|
104
|
+
return { overlayState, realMetaPrompts };
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Tests
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
describe('multi-service pipeline E2E', () => {
|
|
110
|
+
// Test 1: All 5 cross-service steps enabled when services[] present
|
|
111
|
+
it('enables cross-service steps when services[] present', async () => {
|
|
112
|
+
const { overlayState } = await resolveMultiServiceOverlay();
|
|
113
|
+
const crossServiceSteps = [
|
|
114
|
+
'service-ownership-map',
|
|
115
|
+
'inter-service-contracts',
|
|
116
|
+
'cross-service-auth',
|
|
117
|
+
'cross-service-observability',
|
|
118
|
+
'integration-test-plan',
|
|
119
|
+
];
|
|
120
|
+
for (const step of crossServiceSteps) {
|
|
121
|
+
expect(overlayState.steps[step], `${step} should be defined`).toBeDefined();
|
|
122
|
+
expect(overlayState.steps[step].enabled, `${step} should be enabled`).toBe(true);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
// Test 2: Cross-service steps stay disabled when no services[]
|
|
126
|
+
it('does NOT enable cross-service steps when no services[]', async () => {
|
|
127
|
+
const methodologyDir = getPackageMethodologyDir();
|
|
128
|
+
const realMetaPrompts = await discoverRealMetaPrompts();
|
|
129
|
+
const knownSteps = [...realMetaPrompts.keys()];
|
|
130
|
+
const presets = loadAllPresets(methodologyDir, knownSteps);
|
|
131
|
+
const output = createMockOutput();
|
|
132
|
+
const overlayState = resolveOverlayState({
|
|
133
|
+
config: {
|
|
134
|
+
version: 2,
|
|
135
|
+
methodology: 'deep',
|
|
136
|
+
platforms: ['claude-code'],
|
|
137
|
+
project: {
|
|
138
|
+
projectType: 'backend',
|
|
139
|
+
backendConfig: {
|
|
140
|
+
apiStyle: 'rest', dataStore: ['relational'], authMechanism: 'jwt',
|
|
141
|
+
asyncMessaging: 'none', deployTarget: 'container', domain: 'none',
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
methodologyDir,
|
|
146
|
+
metaPrompts: realMetaPrompts,
|
|
147
|
+
presetSteps: presets.deep?.steps ?? {},
|
|
148
|
+
output,
|
|
149
|
+
});
|
|
150
|
+
const crossServiceSteps = [
|
|
151
|
+
'service-ownership-map',
|
|
152
|
+
'inter-service-contracts',
|
|
153
|
+
'cross-service-auth',
|
|
154
|
+
'cross-service-observability',
|
|
155
|
+
'integration-test-plan',
|
|
156
|
+
];
|
|
157
|
+
for (const step of crossServiceSteps) {
|
|
158
|
+
const stepEntry = overlayState.steps[step];
|
|
159
|
+
if (stepEntry !== undefined) {
|
|
160
|
+
expect(stepEntry.enabled, `${step} should not be enabled without services[]`).toBe(false);
|
|
161
|
+
}
|
|
162
|
+
// If not present in steps at all, it defaults to disabled — also acceptable
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// Test 3: Multi-service knowledge injected into existing steps
|
|
166
|
+
it('injects multi-service knowledge into existing steps', async () => {
|
|
167
|
+
const { overlayState } = await resolveMultiServiceOverlay();
|
|
168
|
+
expect(overlayState.knowledge['system-architecture']).toBeDefined();
|
|
169
|
+
expect(overlayState.knowledge['system-architecture']).toContain('multi-service-architecture');
|
|
170
|
+
expect(overlayState.knowledge['system-architecture']).toContain('multi-service-resilience');
|
|
171
|
+
});
|
|
172
|
+
// Test 4: Reads injected into downstream steps
|
|
173
|
+
it('injects reads into downstream steps', async () => {
|
|
174
|
+
const { overlayState } = await resolveMultiServiceOverlay();
|
|
175
|
+
expect(overlayState.reads['implementation-plan']).toBeDefined();
|
|
176
|
+
expect(overlayState.reads['implementation-plan']).toContain('service-ownership-map');
|
|
177
|
+
});
|
|
178
|
+
// Test 5: Dependencies injected into downstream steps
|
|
179
|
+
it('injects dependencies into downstream steps', async () => {
|
|
180
|
+
const { overlayState } = await resolveMultiServiceOverlay();
|
|
181
|
+
expect(overlayState.dependencies['review-security']).toBeDefined();
|
|
182
|
+
expect(overlayState.dependencies['review-security']).toContain('cross-service-auth');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=multi-service-pipeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-service-pipeline.test.js","sourceRoot":"","sources":["../../src/e2e/multi-service-pipeline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -360,6 +360,74 @@ describe('backend overlay integration', () => {
|
|
|
360
360
|
expect(overlayState.knowledge['system-architecture']).toContain('backend-architecture');
|
|
361
361
|
expect(overlayState.knowledge['tech-stack']).toContain('backend-api-design');
|
|
362
362
|
});
|
|
363
|
+
// -------------------------------------------------------------------------
|
|
364
|
+
// Sub-overlay: backend-fintech
|
|
365
|
+
// -------------------------------------------------------------------------
|
|
366
|
+
/**
|
|
367
|
+
* Resolve a backend overlay with an explicit domain sub-overlay selection.
|
|
368
|
+
* Mirrors `resolveResearchOverlay` but for the backend project type.
|
|
369
|
+
* A FULL typed BackendConfig literal is required because BackendConfig is
|
|
370
|
+
* inferred from BackendConfigSchema's *output* shape (all defaults resolved).
|
|
371
|
+
*/
|
|
372
|
+
async function resolveBackendOverlayWithDomain(domain) {
|
|
373
|
+
const backendConfig = {
|
|
374
|
+
apiStyle: 'rest',
|
|
375
|
+
dataStore: ['relational'],
|
|
376
|
+
authMechanism: 'none',
|
|
377
|
+
asyncMessaging: 'none',
|
|
378
|
+
deployTarget: 'container',
|
|
379
|
+
domain,
|
|
380
|
+
};
|
|
381
|
+
const methodologyDir = getPackageMethodologyDir();
|
|
382
|
+
const realMetaPrompts = await discoverRealMetaPrompts();
|
|
383
|
+
const knownSteps = [...realMetaPrompts.keys()];
|
|
384
|
+
const presets = loadAllPresets(methodologyDir, knownSteps);
|
|
385
|
+
const output = createMockOutput();
|
|
386
|
+
const preset = presets.deep;
|
|
387
|
+
return resolveOverlayState({
|
|
388
|
+
config: {
|
|
389
|
+
version: 2,
|
|
390
|
+
methodology: 'deep',
|
|
391
|
+
platforms: ['claude-code'],
|
|
392
|
+
project: {
|
|
393
|
+
projectType: 'backend',
|
|
394
|
+
backendConfig,
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
methodologyDir,
|
|
398
|
+
metaPrompts: realMetaPrompts,
|
|
399
|
+
presetSteps: preset?.steps ?? {},
|
|
400
|
+
output,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
it('fintech domain knowledge appended after core backend knowledge', async () => {
|
|
404
|
+
const state = await resolveBackendOverlayWithDomain('fintech');
|
|
405
|
+
// Core backend overlay entry is present in create-prd
|
|
406
|
+
expect(state.knowledge['create-prd']).toContain('backend-requirements');
|
|
407
|
+
// Fintech sub-overlay entries present on create-prd (per backend-fintech.yml)
|
|
408
|
+
expect(state.knowledge['create-prd']).toContain('backend-fintech-compliance');
|
|
409
|
+
expect(state.knowledge['create-prd']).toContain('backend-fintech-broker-integration');
|
|
410
|
+
// Domain knowledge appears AFTER core knowledge (appended)
|
|
411
|
+
const prdKnowledge = state.knowledge['create-prd'];
|
|
412
|
+
const coreIdx = prdKnowledge.indexOf('backend-requirements');
|
|
413
|
+
const domainIdx = prdKnowledge.indexOf('backend-fintech-compliance');
|
|
414
|
+
expect(domainIdx).toBeGreaterThan(coreIdx);
|
|
415
|
+
// Spot-check another step: system-architecture gets broker-integration + risk-management
|
|
416
|
+
expect(state.knowledge['system-architecture']).toContain('backend-architecture');
|
|
417
|
+
expect(state.knowledge['system-architecture']).toContain('backend-fintech-broker-integration');
|
|
418
|
+
expect(state.knowledge['system-architecture']).toContain('backend-fintech-risk-management');
|
|
419
|
+
});
|
|
420
|
+
it('backend domain=none skips fintech sub-overlay', async () => {
|
|
421
|
+
const state = await resolveBackendOverlayWithDomain('none');
|
|
422
|
+
// Core backend knowledge is present
|
|
423
|
+
expect(state.knowledge['create-prd']).toContain('backend-requirements');
|
|
424
|
+
expect(state.knowledge['system-architecture']).toContain('backend-architecture');
|
|
425
|
+
// Fintech sub-overlay entries are NOT present
|
|
426
|
+
expect(state.knowledge['create-prd']).not.toContain('backend-fintech-compliance');
|
|
427
|
+
expect(state.knowledge['create-prd']).not.toContain('backend-fintech-broker-integration');
|
|
428
|
+
expect(state.knowledge['system-architecture']).not.toContain('backend-fintech-broker-integration');
|
|
429
|
+
expect(state.knowledge['system-architecture']).not.toContain('backend-fintech-risk-management');
|
|
430
|
+
});
|
|
363
431
|
});
|
|
364
432
|
// ---------------------------------------------------------------------------
|
|
365
433
|
// Tests — CLI
|