rcf-lite 0.12.0 → 0.13.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/CHANGELOG.md +11 -0
- package/README.md +2 -0
- package/bin/view-supervisor-child.mjs +0 -0
- package/blueprints/application-api-rest/README.md +40 -0
- package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
- package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
- package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
- package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
- package/blueprints/application-api-rest/blueprint.json +265 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
- package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
- package/blueprints/application-api-rest/docs/topics.md +46 -0
- package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
- package/blueprints/application-spa/README.md +90 -0
- package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
- package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
- package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
- package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
- package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
- package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
- package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
- package/blueprints/application-spa/assets/tokens/theme.css +169 -0
- package/blueprints/application-spa/assets/viewports.md +18 -0
- package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
- package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
- package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
- package/blueprints/application-spa/assets/wireframes/error.md +46 -0
- package/blueprints/application-spa/assets/wireframes/form.md +50 -0
- package/blueprints/application-spa/assets/wireframes/list.md +45 -0
- package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
- package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
- package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
- package/blueprints/application-spa/blueprint.json +387 -0
- package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
- package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
- package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
- package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
- package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
- package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
- package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
- package/blueprints/application-spa/docs/topics.md +57 -0
- package/blueprints/application-spa/guide/application-spa.md +40 -0
- package/blueprints/ci-pipeline/README.md +49 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +61 -0
- package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +50 -0
- package/blueprints/ci-pipeline/assets/report-samples/per-gate.json +12 -0
- package/blueprints/ci-pipeline/assets/report-samples/pipeline.json +28 -0
- package/blueprints/ci-pipeline/blueprint.json +46 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json +25 -0
- package/blueprints/ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json +25 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-002.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-003.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-004.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-005.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-006.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-007.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-008.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +18 -0
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-010.json +18 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json +59 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json +32 -0
- package/blueprints/ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json +41 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json +37 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +36 -0
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json +36 -0
- package/blueprints/ci-pipeline/docs/topics.md +49 -0
- package/blueprints/ci-pipeline/guide/ci-pipeline.md +79 -0
- package/blueprints/deploy-cloudflare-workers/README.md +63 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
- package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
- package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
- package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
- package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
- package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
- package/blueprints/email-smtp-resend/README.md +45 -0
- package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
- package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
- package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
- package/blueprints/email-smtp-resend/blueprint.json +23 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
- package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
- package/blueprints/email-smtp-resend/docs/topics.md +44 -0
- package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
- package/blueprints/observability-essentials/README.md +53 -0
- package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
- package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
- package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
- package/blueprints/observability-essentials/blueprint.json +54 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
- package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
- package/blueprints/observability-essentials/docs/topics.md +57 -0
- package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
- package/blueprints/observability-probe-endpoints/README.md +53 -0
- package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
- package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
- package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
- package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
- package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
- package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
- package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
- package/blueprints/persistence-data-d1/README.md +50 -0
- package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
- package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
- package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
- package/blueprints/persistence-data-d1/blueprint.json +42 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
- package/blueprints/persistence-data-d1/docs/topics.md +59 -0
- package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
- package/blueprints/persistence-data-sqlite/README.md +50 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
- package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
- package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
- package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
- package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
- package/blueprints/security-auth-clerk/README.md +50 -0
- package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
- package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
- package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
- package/blueprints/security-auth-clerk/blueprint.json +42 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
- package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
- package/blueprints/security-auth-clerk/docs/topics.md +56 -0
- package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +71 -0
- package/blueprints/security-auth-keycloak/README.md +56 -0
- package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
- package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
- package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
- package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
- package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
- package/blueprints/security-auth-keycloak/blueprint.json +49 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
- package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
- package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
- package/blueprints/security-auth-magic-link/README.md +46 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
- package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
- package/blueprints/security-auth-magic-link/blueprint.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
- package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
- package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
- package/blueprints/security-auth-oauth2/README.md +50 -0
- package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
- package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
- package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
- package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
- package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
- package/blueprints/security-auth-oauth2/blueprint.json +44 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
- package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
- package/blueprints/security-secrets-management/README.md +48 -0
- package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
- package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
- package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
- package/blueprints/security-secrets-management/blueprint.json +43 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
- package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
- package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
- package/blueprints/security-secrets-management/docs/topics.md +46 -0
- package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
- package/fixtures/canary-manifest.json +1 -101
- package/package.json +15 -9
- package/rcf/.identity/profile.md +37 -0
- package/rcf/knowledge/INDEX.md +12 -0
- package/rcf/knowledge/README.md +41 -0
- package/rcf/knowledge/docs/.gitkeep +0 -0
- package/rcf/knowledge/notes/.gitkeep +0 -0
- package/scripts/preinstall-node-check.mjs +61 -0
- package/src/blueprint/apply.js +12 -6
- package/src/blueprint/conflicts.js +8 -8
- package/src/blueprint/index.js +2 -1
- package/src/blueprint/list.js +60 -0
- package/src/blueprint/loader.js +26 -1
- package/src/blueprint/namespace.js +20 -16
- package/src/blueprint/shelf-resolver.js +173 -0
- package/src/blueprint/supersede.js +3 -2
- package/src/browser-verify/invariants.js +40 -0
- package/src/browser-verify/runner.js +2 -0
- package/src/cli/blueprint.js +53 -9
- package/src/cli/init.js +2 -0
- package/src/core/store/writer.js +64 -2
- package/src/setup/agent-setup.js +28 -10
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
//
|
|
13
13
|
// - Prefix families (REQ, US, PRD, BS, TAD, TS): the blueprint slug is
|
|
14
14
|
// attached as a lowercase kebab-slug PREFIX joined by `-` to the
|
|
15
|
-
// family prefix. `REQ-001` under blueprint `spa` becomes
|
|
15
|
+
// family prefix. `REQ-001` under blueprint `application-spa` becomes
|
|
16
|
+
// `application-spa-REQ-001`.
|
|
16
17
|
//
|
|
17
18
|
// - Suffix families (ADR, TAC, FBS, CN): the blueprint slug is attached
|
|
18
19
|
// as a lowercase kebab-slug SUFFIX joined by `-` to the numeric tail.
|
|
19
|
-
// `ADR-005` under blueprint `spa` becomes
|
|
20
|
-
//
|
|
20
|
+
// `ADR-005` under blueprint `application-spa` becomes
|
|
21
|
+
// `ADR-005-application-spa`; a longer slug (`application-spa-theme`)
|
|
22
|
+
// becomes `ADR-005-application-spa-theme`.
|
|
21
23
|
//
|
|
22
24
|
// - AC and TC: not namespaced. AC ids are anchored to their parent US
|
|
23
25
|
// (whose id is prefix-namespaced) and TC ids are anchored to their
|
|
@@ -70,21 +72,22 @@ export function namespaceStyleFor(id) {
|
|
|
70
72
|
* - Ids that already carry a slug segment are accepted VERBATIM: the
|
|
71
73
|
* blueprint author's declared contribution list is the truth for
|
|
72
74
|
* what that blueprint owns. String grammar does not veto (`stampId`
|
|
73
|
-
* used to refuse `ADR-201-spa-theme` under slug
|
|
74
|
-
* that `spa-theme` !=
|
|
75
|
-
*
|
|
75
|
+
* used to refuse `ADR-201-application-spa-theme` under slug
|
|
76
|
+
* `application-spa` on the basis that `application-spa-theme` !=
|
|
77
|
+
* `application-spa`, which broke every blueprint whose suffix-family
|
|
78
|
+
* ids carried a semantic tail after the slug).
|
|
76
79
|
* - AC and TC pass through unchanged (no namespacing family).
|
|
77
80
|
* - An id that matches no family pattern, or a slug that is not a
|
|
78
81
|
* valid kebab, is refused.
|
|
79
82
|
*
|
|
80
|
-
* Cross-blueprint claims (`spa-theme-REQ-001` declared
|
|
81
|
-
* `spa` where `spa-theme` is
|
|
82
|
-
*
|
|
83
|
-
* cross-claim detector). String
|
|
84
|
-
* trust surface.
|
|
83
|
+
* Cross-blueprint claims (`application-spa-theme-REQ-001` declared
|
|
84
|
+
* under blueprint `application-spa` where `application-spa-theme` is
|
|
85
|
+
* also applied) are caught by the manifest-record consulted at write
|
|
86
|
+
* time (`apply.js` overwrite guard + cross-claim detector). String
|
|
87
|
+
* parsing here is deliberately not a trust surface.
|
|
85
88
|
*
|
|
86
89
|
* @param {string} id - canonical id (either bare `REQ-001` or already
|
|
87
|
-
* namespaced `spa-REQ-001` / `ADR-201-spa-theme`)
|
|
90
|
+
* namespaced `application-spa-REQ-001` / `ADR-201-application-spa-theme`)
|
|
88
91
|
* @param {string} slug - blueprint slug (must be well-formed kebab)
|
|
89
92
|
* @returns {{ id: string } | { error: string }}
|
|
90
93
|
*/
|
|
@@ -119,10 +122,11 @@ export function stampId(id, slug) {
|
|
|
119
122
|
* scan). `isNamespacedFor` retains exact-slug grammar semantics for
|
|
120
123
|
* external consumers (docs generators, id-audit tooling) but must NOT
|
|
121
124
|
* be used to authorise a write or a delete -- for slug+tail ids like
|
|
122
|
-
* `ADR-201-spa-theme` the parsed suffix is
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
125
|
+
* `ADR-201-application-spa-theme` the parsed suffix is
|
|
126
|
+
* `application-spa-theme`, which returns false for a legitimate
|
|
127
|
+
* `application-spa`-owned contribution whose author put a semantic tail
|
|
128
|
+
* after the slug. That misread is the exact reason the ownership
|
|
129
|
+
* call-sites were routed off this predicate.
|
|
126
130
|
*
|
|
127
131
|
* @param {string} id
|
|
128
132
|
* @param {string} slug
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Resolve a `rcf define blueprint add <source>` argument to an absolute
|
|
2
|
+
// blueprint directory.
|
|
3
|
+
//
|
|
4
|
+
// Resolution order (Phase 1; the phase-2 external-library registry
|
|
5
|
+
// layers on top of this without reworking the CLI):
|
|
6
|
+
//
|
|
7
|
+
// 1. Any argument that names a filesystem location - starts with `./`,
|
|
8
|
+
// `../`, `/`, or `~`, or contains a path separator, or names an
|
|
9
|
+
// existing directory - is treated as a PATH and returned unchanged.
|
|
10
|
+
// This preserves the existing local / relative-path semantic every
|
|
11
|
+
// test and existing operator invocation relies on.
|
|
12
|
+
// 2. `@stock/<slug>` is reserved for the packaged shelf. The `@stock/`
|
|
13
|
+
// qualifier strips off and the bare slug resolves against the
|
|
14
|
+
// packaged shelf. This is the recommended long-form.
|
|
15
|
+
// 3. Any other bare kebab slug (`deploy-cloudflare-workers`,
|
|
16
|
+
// `application-spa`) resolves against the packaged shelf. This is
|
|
17
|
+
// the sugar the persona reviews asked for; it means the docs and
|
|
18
|
+
// the CLI say the same thing.
|
|
19
|
+
// 4. A slug qualifier that names a KNOWN external-library alias other
|
|
20
|
+
// than `@stock` is rejected with a clear message pointing the
|
|
21
|
+
// operator at the current phase-1 capabilities. This reservation
|
|
22
|
+
// keeps the phase-2 external-libraries mechanism free to land the
|
|
23
|
+
// registry surface later without a breaking rename.
|
|
24
|
+
//
|
|
25
|
+
// The packaged shelf lives at `<packageRoot>/blueprints/<slug>/` - the
|
|
26
|
+
// tarball is built with `files: [ "blueprints" ]` and a `prepack`
|
|
27
|
+
// script that copies the repo-root shelf into the package directory
|
|
28
|
+
// before pack runs.
|
|
29
|
+
|
|
30
|
+
import { existsSync } from 'node:fs';
|
|
31
|
+
import { stat } from 'node:fs/promises';
|
|
32
|
+
import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
|
|
33
|
+
import { fileURLToPath } from 'node:url';
|
|
34
|
+
|
|
35
|
+
import { rcfError } from '../core/errors/index.js';
|
|
36
|
+
|
|
37
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
38
|
+
// packages/rcf-lite/src/blueprint -> packages/rcf-lite
|
|
39
|
+
const PACKAGE_ROOT = resolve(here, '..', '..');
|
|
40
|
+
const PACKAGED_SHELF = join(PACKAGE_ROOT, 'blueprints');
|
|
41
|
+
|
|
42
|
+
const KEBAB_SLUG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
43
|
+
const QUALIFIED = /^@([a-z][a-z0-9-]*)\/([a-z][a-z0-9]*(?:-[a-z0-9]+)*)$/;
|
|
44
|
+
|
|
45
|
+
const PATH_HINT = /[\\/]|^~|^\./;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @typedef {object} ResolvedSource
|
|
49
|
+
* @property {'path' | 'shelf'} kind
|
|
50
|
+
* `path` if the argument was treated as a filesystem path (unchanged);
|
|
51
|
+
* `shelf` if a bare slug or `@stock/<slug>` was resolved against the
|
|
52
|
+
* packaged shelf. The apply.js layer treats both the same once resolved -
|
|
53
|
+
* both are absolute directory paths - but the kind is exposed for the
|
|
54
|
+
* CLI's future diagnostics (`--dry-run` labelling, etc.).
|
|
55
|
+
* @property {string} resolved Absolute path suitable for `applyBlueprint({ source })`.
|
|
56
|
+
* @property {string} original The argument the operator typed, preserved for
|
|
57
|
+
* diagnostics and the conflict-renderer's supersede hint.
|
|
58
|
+
* @property {string} [slug] The bare slug when resolution went through the shelf.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {string} source - argument as typed by the operator
|
|
63
|
+
* @param {object} [opts]
|
|
64
|
+
* @param {string} [opts.packagedShelf] - override for tests
|
|
65
|
+
* @returns {Promise<ResolvedSource | import('../core/errors/index.js').RcfError>}
|
|
66
|
+
*/
|
|
67
|
+
export async function resolveBlueprintSource(source, opts = {}) {
|
|
68
|
+
if (typeof source !== 'string' || source.length === 0) {
|
|
69
|
+
return rcfError({ kind: 'usage', message: 'blueprint source is required' });
|
|
70
|
+
}
|
|
71
|
+
const packagedShelf = opts.packagedShelf ?? PACKAGED_SHELF;
|
|
72
|
+
|
|
73
|
+
// Rule 2 / 4 FIRST: qualified `@lib/slug` forms carry a `/` that
|
|
74
|
+
// would otherwise trip the path-hint check below. `@stock/<slug>`
|
|
75
|
+
// resolves to the packaged shelf; any other library qualifier is
|
|
76
|
+
// reserved for the phase-2 external-libraries mechanism and refuses
|
|
77
|
+
// with a clear message.
|
|
78
|
+
const qualified = QUALIFIED.exec(source);
|
|
79
|
+
if (qualified) {
|
|
80
|
+
const [, library, slug] = qualified;
|
|
81
|
+
if (library === 'stock') {
|
|
82
|
+
return resolveShelfSlug(slug, source, packagedShelf);
|
|
83
|
+
}
|
|
84
|
+
return rcfError({
|
|
85
|
+
kind: 'usage',
|
|
86
|
+
message: (
|
|
87
|
+
`blueprint source '${source}' names external library '@${library}', which is reserved for the phase-2 external-libraries mechanism and not resolvable yet. `
|
|
88
|
+
+ 'Use `@stock/<slug>` for the packaged shelf, a local path (`./path/to/blueprint`), or wait for the external-library registry.'
|
|
89
|
+
),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Rule 1: path-looking arguments are passed through unchanged. We look
|
|
94
|
+
// at the SHAPE only (does it contain a separator, does it start with a
|
|
95
|
+
// relative-path marker, is it absolute), so an existing operator with a
|
|
96
|
+
// `./blueprints/foo` invocation keeps the current behaviour byte-for-byte.
|
|
97
|
+
if (isAbsolute(source) || PATH_HINT.test(source)) {
|
|
98
|
+
return { kind: 'path', resolved: resolve(source), original: source };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Rule 3: any other bare kebab token is a shelf slug.
|
|
102
|
+
if (KEBAB_SLUG.test(source)) {
|
|
103
|
+
return resolveShelfSlug(source, source, packagedShelf);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Anything that has slipped through here is neither a path, nor a
|
|
107
|
+
// qualified library slug, nor a bare kebab slug. Treat it as a path so
|
|
108
|
+
// the loader emits the familiar "no blueprint.json found" error against
|
|
109
|
+
// the exact string the operator typed; that keeps the failure locus
|
|
110
|
+
// close to what they wrote rather than adding a resolver-specific class.
|
|
111
|
+
return { kind: 'path', resolved: resolve(source), original: source };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function resolveShelfSlug(slug, original, packagedShelf) {
|
|
115
|
+
const candidate = join(packagedShelf, slug);
|
|
116
|
+
if (!existsSync(candidate)) {
|
|
117
|
+
const known = await knownShelfSlugs(packagedShelf);
|
|
118
|
+
const suggestion = known.length > 0
|
|
119
|
+
? ` Known shelf slugs: ${known.join(', ')}.`
|
|
120
|
+
: ' The packaged shelf appears empty; reinstall rcf-lite to restore it.';
|
|
121
|
+
return rcfError({
|
|
122
|
+
kind: 'usage',
|
|
123
|
+
message: `blueprint source '${original}' did not match a packaged shelf entry at ${candidate}.${suggestion}`,
|
|
124
|
+
filePath: candidate,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const s = await stat(candidate);
|
|
129
|
+
if (!s.isDirectory()) {
|
|
130
|
+
return rcfError({
|
|
131
|
+
kind: 'usage',
|
|
132
|
+
message: `blueprint source '${original}' resolved to ${candidate} but that path is not a directory.`,
|
|
133
|
+
filePath: candidate,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
return rcfError({
|
|
138
|
+
kind: 'ioFailure',
|
|
139
|
+
message: `blueprint source '${original}' resolution failed: ${err.message}`,
|
|
140
|
+
filePath: candidate,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return { kind: 'shelf', resolved: candidate, original, slug };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Enumerate the packaged shelf's slugs (top-level directories). Empty
|
|
148
|
+
* array on a missing shelf. Used to render a helpful "did you mean"
|
|
149
|
+
* hint on a resolver miss.
|
|
150
|
+
*
|
|
151
|
+
* @param {string} [packagedShelf]
|
|
152
|
+
* @returns {Promise<string[]>}
|
|
153
|
+
*/
|
|
154
|
+
export async function knownShelfSlugs(packagedShelf = PACKAGED_SHELF) {
|
|
155
|
+
try {
|
|
156
|
+
const { readdir } = await import('node:fs/promises');
|
|
157
|
+
const entries = await readdir(packagedShelf, { withFileTypes: true });
|
|
158
|
+
return entries
|
|
159
|
+
.filter((e) => e.isDirectory())
|
|
160
|
+
.map((e) => e.name)
|
|
161
|
+
.sort();
|
|
162
|
+
} catch {
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Absolute path of the packaged shelf. Test-visible. */
|
|
168
|
+
export function packagedShelfPath() {
|
|
169
|
+
return PACKAGED_SHELF;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Placeholder to keep unused-import linters happy in bundles that only pull the constant. */
|
|
173
|
+
export const PATH_SEPARATOR = sep;
|
|
@@ -85,12 +85,13 @@ export async function supersedeBlueprintTopic({ projectRoot, tree, topic, incomi
|
|
|
85
85
|
if (typeof topic !== 'string' || topic.trim().length === 0) {
|
|
86
86
|
// Schema minLength:1 accepts whitespace-only; the writer refuses
|
|
87
87
|
// it up-front so a whitespace-only topic never lands on disk.
|
|
88
|
-
return rcfError({ kind: 'usage', message: `topic is required (e.g. rcf define blueprint supersede errorEnvelope --incoming ./blueprints/rest)` });
|
|
88
|
+
return rcfError({ kind: 'usage', message: `topic is required (e.g. rcf define blueprint supersede errorEnvelope --incoming ./blueprints/application-api-rest)` });
|
|
89
89
|
}
|
|
90
90
|
// Topic is a LOOKUP KEY into applied ADR topics, not a slug (ADR-010).
|
|
91
91
|
// Schema is minLength:1 with no character constraint and the schema
|
|
92
92
|
// docs explicitly cite camelCase examples ('errorEnvelope'). The
|
|
93
|
-
// shipped
|
|
93
|
+
// shipped application-spa + application-api-rest blueprints declare
|
|
94
|
+
// camelCase topics; we accept
|
|
94
95
|
// any topic string that exact-matches an applied or incoming ADR
|
|
95
96
|
// topic below, and kebab-ify only when projecting into the
|
|
96
97
|
// scaffolded project-ADR id slug tail (adrId grammar requires
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* @property {object} [uiBaseline] the manifest uiBaseline record (defaults + opt-outs)
|
|
35
35
|
* @property {string} dom the response HTML for the route
|
|
36
36
|
* @property {boolean} [authenticated] whether the request carried the auth cookie
|
|
37
|
+
* @property {string} [landedPath] the pathname the browser's final URL resolved to after any redirect chain; when the driver reports it, `authenticatedLandsOnRequestedPath` compares it against `routePath` (AC-1131-3 landed-path refusal)
|
|
37
38
|
*/
|
|
38
39
|
|
|
39
40
|
const OPT_OUT_FIELDS = new Set([
|
|
@@ -91,6 +92,12 @@ const V1_INVARIANTS = [
|
|
|
91
92
|
perThemeOnly: false,
|
|
92
93
|
run: checkNoInlineStyleBlocks,
|
|
93
94
|
},
|
|
95
|
+
{
|
|
96
|
+
name: 'authenticatedLandsOnRequestedPath',
|
|
97
|
+
severity: 'block',
|
|
98
|
+
perThemeOnly: false,
|
|
99
|
+
run: checkAuthenticatedLandsOnRequestedPath,
|
|
100
|
+
},
|
|
94
101
|
];
|
|
95
102
|
|
|
96
103
|
/** Versioned constant, module-encoded per §12 O-6. */
|
|
@@ -326,6 +333,39 @@ function checkNoInlineStyleBlocks(ctx) {
|
|
|
326
333
|
};
|
|
327
334
|
}
|
|
328
335
|
|
|
336
|
+
/**
|
|
337
|
+
* AC-1131-3 landed-path refusal: when the driver reports the browser's
|
|
338
|
+
* final URL path after any redirect chain resolves, and the request was
|
|
339
|
+
* for an authenticated route, the landed path MUST equal the requested
|
|
340
|
+
* route path. Cures the class of harness where a broken session lane
|
|
341
|
+
* silently caused every authenticated-route assertion to run against a
|
|
342
|
+
* styled /login (Playwright's page.goto follows redirects by default,
|
|
343
|
+
* so the resolved response is 200 from the redirect target and the
|
|
344
|
+
* downstream styled/CSP assertions pass against the wrong surface).
|
|
345
|
+
* Watchpost partial-acceptance w-2026-08-24-003 / AC-1601-14; ported
|
|
346
|
+
* into the SPA blueprint TAC-209 v1.0.1.
|
|
347
|
+
*
|
|
348
|
+
* The invariant is opt-in: when the driver does NOT populate
|
|
349
|
+
* `ctx.landedPath` the invariant passes (older drivers keep working).
|
|
350
|
+
* Once the SPA-blueprint drivers report `landedPath` this becomes a
|
|
351
|
+
* hard block-severity refusal.
|
|
352
|
+
*/
|
|
353
|
+
function checkAuthenticatedLandsOnRequestedPath(ctx) {
|
|
354
|
+
if (typeof ctx.landedPath !== 'string' || ctx.landedPath.length === 0) return { verdict: 'pass' };
|
|
355
|
+
if (ctx.authenticated === false) return { verdict: 'pass' };
|
|
356
|
+
const routes = ctx.fbs?.designStage?.navModel?.routes ?? [];
|
|
357
|
+
const routeSpec = routes.find((r) => r.path === ctx.routePath);
|
|
358
|
+
// If the FBS enumerates the route and marks it authRequired=false, the
|
|
359
|
+
// landed-path refusal does not fire (a public route is allowed to
|
|
360
|
+
// redirect to any other public surface by design).
|
|
361
|
+
if (routeSpec && routeSpec.authRequired === false && ctx.authenticated !== true) return { verdict: 'pass' };
|
|
362
|
+
if (ctx.landedPath === ctx.routePath) return { verdict: 'pass' };
|
|
363
|
+
return {
|
|
364
|
+
verdict: 'fail',
|
|
365
|
+
detail: `authenticated navigation landed on '${ctx.landedPath}' (requested '${ctx.routePath}'); a silent redirect chain to another surface (e.g. a session-broken 302 to /login) validated the redirect target's styled state instead of the requested route (AC-1131-3 pathMismatch; watchpost AC-1601-14, w-2026-08-24-003).`,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
329
369
|
function topLevelChildTagSequence(dom) {
|
|
330
370
|
// Extract the tag-name sequence of direct children of <body>. Cheap
|
|
331
371
|
// regex-based; deliberately conservative (misses nested body-siblings
|
|
@@ -28,6 +28,7 @@ import { composeBrowserVerificationRecord } from './manifest-writer.js';
|
|
|
28
28
|
* @property {string} dom
|
|
29
29
|
* @property {string} screenshotPath
|
|
30
30
|
* @property {boolean} [authenticated]
|
|
31
|
+
* @property {string} [landedPath] the pathname of the browser's final URL after any redirect chain resolved (`new URL(page.url()).pathname`); when the driver reports it, the `authenticatedLandsOnRequestedPath` invariant fires (AC-1131-3 landed-path refusal, watchpost AC-1601-14 port)
|
|
31
32
|
*/
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -78,6 +79,7 @@ export async function runAgentScreenshotCritique({
|
|
|
78
79
|
uiBaseline: tree.manifest?.uiBaseline,
|
|
79
80
|
dom: cap.dom,
|
|
80
81
|
authenticated: cap.authenticated,
|
|
82
|
+
landedPath: cap.landedPath,
|
|
81
83
|
});
|
|
82
84
|
perCapture.push({ routePath: cap.routePath, themeApplied: cap.themeApplied, results });
|
|
83
85
|
routesChecked.push({ path: cap.routePath, screenshotPath: cap.screenshotPath, themeApplied: cap.themeApplied });
|
package/src/cli/blueprint.js
CHANGED
|
@@ -16,9 +16,12 @@ import { findProjectRoot } from '../view/index.js';
|
|
|
16
16
|
import {
|
|
17
17
|
applyBlueprint,
|
|
18
18
|
diffBlueprintTopic,
|
|
19
|
+
enrichRowsWithCategories,
|
|
20
|
+
groupRowsByCategory,
|
|
19
21
|
listBlueprints,
|
|
20
22
|
removeBlueprint,
|
|
21
23
|
renderDiff,
|
|
24
|
+
resolveBlueprintSource,
|
|
22
25
|
supersedeBlueprintTopic,
|
|
23
26
|
} from '../blueprint/index.js';
|
|
24
27
|
import { conflictReportJson, renderConflictReport } from '../blueprint/conflicts.js';
|
|
@@ -26,13 +29,23 @@ import { conflictReportJson, renderConflictReport } from '../blueprint/conflicts
|
|
|
26
29
|
export const HELP = `Usage: rcf define blueprint <verb> [options]
|
|
27
30
|
|
|
28
31
|
Verbs:
|
|
29
|
-
add <source> Apply a blueprint from a source directory
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
add <source> Apply a blueprint from a source directory.
|
|
33
|
+
<source> resolves in this order:
|
|
34
|
+
- a path (./foo, /abs, has a slash) is used as-is;
|
|
35
|
+
- @stock/<slug> resolves to the packaged shelf that
|
|
36
|
+
ships with rcf-lite (recommended long form);
|
|
37
|
+
- a bare kebab slug (deploy-cloudflare-workers,
|
|
38
|
+
application-spa) resolves to the same shelf;
|
|
39
|
+
- any other @<library>/<slug> is reserved for the
|
|
40
|
+
phase-2 external-libraries mechanism and refuses.
|
|
41
|
+
Writes an entry to manifest.blueprints[] and copies
|
|
42
|
+
namespaced contributions into the tree.
|
|
34
43
|
list List every applied blueprint (slug, version,
|
|
35
|
-
appliedAt, contributionCount)
|
|
44
|
+
appliedAt, contributionCount), grouped by the
|
|
45
|
+
\`category\` declared on each blueprint's own
|
|
46
|
+
\`blueprint.json\`. Blueprints whose source no
|
|
47
|
+
longer resolves, or whose source declares no
|
|
48
|
+
category, appear under \`uncategorised\`.
|
|
36
49
|
remove <slug> Remove an applied blueprint. Refuses when any
|
|
37
50
|
project-authored doc references a contribution
|
|
38
51
|
id; prints the referring docs and exits 3.
|
|
@@ -142,7 +155,22 @@ export async function main(argv, deps = {}) {
|
|
|
142
155
|
stderr.write('[error] blueprint add: missing <source>\n');
|
|
143
156
|
return 2;
|
|
144
157
|
}
|
|
145
|
-
const
|
|
158
|
+
const rawSource = rest[0];
|
|
159
|
+
const resolved = await resolveBlueprintSource(rawSource);
|
|
160
|
+
if (isRcfError(resolved)) {
|
|
161
|
+
if (parsed.values.json) {
|
|
162
|
+
stderr.write(`${JSON.stringify({ refused: true, error: { kind: resolved.kind, message: resolved.message } })}\n`);
|
|
163
|
+
} else {
|
|
164
|
+
stderr.write(`[error] blueprint add: ${resolved.message}\n`);
|
|
165
|
+
}
|
|
166
|
+
return 2;
|
|
167
|
+
}
|
|
168
|
+
// Feed the resolved absolute path to the applier; keep the original
|
|
169
|
+
// typed source on the CLI for the supersede hint the conflict
|
|
170
|
+
// renderer prints, so the operator sees exactly the string they can
|
|
171
|
+
// copy back into a fresh shell.
|
|
172
|
+
const source = resolved.resolved;
|
|
173
|
+
const displaySource = resolved.original;
|
|
146
174
|
const resolveDeclarations = parseResolveOptions(parsed.values.resolve, parsed.values.reason);
|
|
147
175
|
if (resolveDeclarations.error) {
|
|
148
176
|
stderr.write(`[error] blueprint add: ${resolveDeclarations.error}\n`);
|
|
@@ -150,6 +178,7 @@ export async function main(argv, deps = {}) {
|
|
|
150
178
|
}
|
|
151
179
|
const result = await applyBlueprint({
|
|
152
180
|
projectRoot, tree, source,
|
|
181
|
+
displaySource,
|
|
153
182
|
namespaceOverride: parsed.values.namespace,
|
|
154
183
|
resolveDeclarations: resolveDeclarations.value,
|
|
155
184
|
now,
|
|
@@ -211,8 +240,23 @@ export async function main(argv, deps = {}) {
|
|
|
211
240
|
if (!parsed.values.quiet) stdout.write('[blueprint] no blueprints applied on this project.\n');
|
|
212
241
|
return 0;
|
|
213
242
|
}
|
|
214
|
-
|
|
215
|
-
|
|
243
|
+
// Enrich with category from each applied blueprint's source. The
|
|
244
|
+
// manifest schema does not carry category (additionalProperties:
|
|
245
|
+
// false on appliedBlueprintRecord), so the enricher re-loads each
|
|
246
|
+
// source's blueprint.json at list time; a source that no longer
|
|
247
|
+
// resolves surfaces under the `uncategorised` group rather than
|
|
248
|
+
// being dropped.
|
|
249
|
+
const enriched = await enrichRowsWithCategories(rows);
|
|
250
|
+
const groups = groupRowsByCategory(enriched);
|
|
251
|
+
let first = true;
|
|
252
|
+
for (const group of groups) {
|
|
253
|
+
const label = group.category ?? 'uncategorised';
|
|
254
|
+
if (!first) stdout.write('\n');
|
|
255
|
+
first = false;
|
|
256
|
+
stdout.write(`# ${label}\n`);
|
|
257
|
+
for (const row of group.rows) {
|
|
258
|
+
stdout.write(`${row.slug}\t${row.version}\t${row.appliedAt}\t${row.contributionCount} contribution(s)\n`);
|
|
259
|
+
}
|
|
216
260
|
}
|
|
217
261
|
return 0;
|
|
218
262
|
}
|
package/src/cli/init.js
CHANGED
|
@@ -219,6 +219,8 @@ export async function main(argv, deps = {}) {
|
|
|
219
219
|
stdout.write(` Gitignore ${gitignoreVerbAndTarget(gitignoreResult)}.\n`);
|
|
220
220
|
stdout.write('\nNext: start your agent session in this directory and tell it what you want to build. '
|
|
221
221
|
+ 'It elicits the requirements and drives the build from there - you do not fill in the document chain by hand.\n');
|
|
222
|
+
stdout.write('\nRun `rcf doctor` to confirm the wiring stays clean over time '
|
|
223
|
+
+ '(it also checks whether managed blocks have drifted from the shipped canon).\n');
|
|
222
224
|
}
|
|
223
225
|
return 0;
|
|
224
226
|
}
|
package/src/core/store/writer.js
CHANGED
|
@@ -824,12 +824,30 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
|
|
|
824
824
|
field: 'parent',
|
|
825
825
|
});
|
|
826
826
|
}
|
|
827
|
+
// Phantom-AC replacement (G5). A freshly-created US carries a single
|
|
828
|
+
// seeded AC-N-1 whose description equals the exact seed sentinel below;
|
|
829
|
+
// the schema requires acceptanceCriteria minItems:1, so we cannot ship
|
|
830
|
+
// the US without one. On the operator's FIRST `create ac --parent US-N`
|
|
831
|
+
// (no explicit --id given, and the existing single AC is unmistakably
|
|
832
|
+
// the seed), we REPLACE that phantom instead of appending after it -
|
|
833
|
+
// so the operator's first real AC lands at -1 and audit coverage /
|
|
834
|
+
// trace no longer count the seed as an unmet criterion. Any operator
|
|
835
|
+
// edit to the seed (custom given/when/then/scope/provenance, different
|
|
836
|
+
// description, testable=false) disqualifies it from replacement and
|
|
837
|
+
// the append path runs as before.
|
|
838
|
+
const currentAcs = Array.isArray(us.acceptanceCriteria) ? us.acceptanceCriteria : [];
|
|
839
|
+
const seedIndex = detectSeededPhantomAcIndex(currentAcs, parentUsId);
|
|
840
|
+
const replacingPhantom = seedIndex !== -1 && !options.id;
|
|
841
|
+
|
|
827
842
|
let acId = options.id;
|
|
828
843
|
if (acId) {
|
|
829
|
-
const existing =
|
|
844
|
+
const existing = currentAcs.some((ac) => ac.id === acId);
|
|
830
845
|
if (existing) {
|
|
831
846
|
return rcfError({ kind: 'usage', message: `create ac: id ${acId} already exists on ${parentUsId}`, documentId: acId });
|
|
832
847
|
}
|
|
848
|
+
} else if (replacingPhantom) {
|
|
849
|
+
// Reuse the seed's id (AC-<us>-1) so the operator's first AC is -1.
|
|
850
|
+
acId = currentAcs[seedIndex].id;
|
|
833
851
|
} else {
|
|
834
852
|
try {
|
|
835
853
|
acId = nextIdForKind(tree, 'ac', { parentId: parentUsId });
|
|
@@ -845,9 +863,12 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
|
|
|
845
863
|
...(body?.when !== undefined ? { when: body.when } : {}),
|
|
846
864
|
...(body?.then !== undefined ? { then: body.then } : {}),
|
|
847
865
|
};
|
|
866
|
+
const nextAcs = replacingPhantom
|
|
867
|
+
? currentAcs.map((ac, i) => (i === seedIndex ? acEntry : ac))
|
|
868
|
+
: [...currentAcs, acEntry];
|
|
848
869
|
const nextUs = {
|
|
849
870
|
...us,
|
|
850
|
-
acceptanceCriteria:
|
|
871
|
+
acceptanceCriteria: nextAcs,
|
|
851
872
|
updatedAt: nowIso(),
|
|
852
873
|
};
|
|
853
874
|
const relPath = `rcf/user-stories/${parentUsId.toLowerCase()}.json`;
|
|
@@ -871,6 +892,47 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
|
|
|
871
892
|
return { id: acId, filePath: relPath, parentId: parentUsId, body: acEntry };
|
|
872
893
|
}
|
|
873
894
|
|
|
895
|
+
/**
|
|
896
|
+
* A newly-created user story ships one seeded acceptance criterion
|
|
897
|
+
* (schema demands acceptanceCriteria minItems:1). The seed's description
|
|
898
|
+
* is the exact sentinel below, and no user-authored fields are attached.
|
|
899
|
+
* This detector returns the index of that seed AC when it is the ONLY AC
|
|
900
|
+
* on the US and is byte-for-byte unmodified from what the writer / init
|
|
901
|
+
* placed there; otherwise -1. Used by createInlineAc to REPLACE the seed
|
|
902
|
+
* on the operator's first `create ac`, so their first real AC lands at
|
|
903
|
+
* AC-<us>-1 rather than AC-<us>-2.
|
|
904
|
+
*
|
|
905
|
+
* Kept in sync with the two seed emitters:
|
|
906
|
+
* - src/core/store/writer.js assembleBody 'userStory' -> 'TODO: first acceptance criterion'
|
|
907
|
+
* - src/core/store/init.js userStoryTemplate -> 'TODO: describe the first acceptance criterion'
|
|
908
|
+
*
|
|
909
|
+
* @param {Array<{id:string, description:string, testable?:boolean}>} acs
|
|
910
|
+
* @param {string} parentUsId
|
|
911
|
+
* @returns {number}
|
|
912
|
+
*/
|
|
913
|
+
function detectSeededPhantomAcIndex(acs, parentUsId) {
|
|
914
|
+
if (!Array.isArray(acs) || acs.length !== 1) return -1;
|
|
915
|
+
const [ac] = acs;
|
|
916
|
+
if (!ac || typeof ac !== 'object') return -1;
|
|
917
|
+
const mUs = /^US-(\d+)$/.exec(parentUsId);
|
|
918
|
+
if (!mUs) return -1;
|
|
919
|
+
const expectedId = `AC-${mUs[1]}-1`;
|
|
920
|
+
if (ac.id !== expectedId) return -1;
|
|
921
|
+
if (ac.testable !== true) return -1;
|
|
922
|
+
const seedDescriptions = new Set([
|
|
923
|
+
'TODO: first acceptance criterion',
|
|
924
|
+
'TODO: describe the first acceptance criterion',
|
|
925
|
+
]);
|
|
926
|
+
if (!seedDescriptions.has(ac.description)) return -1;
|
|
927
|
+
// Any operator-authored optional field disqualifies replacement.
|
|
928
|
+
if (ac.given !== undefined) return -1;
|
|
929
|
+
if (ac.when !== undefined) return -1;
|
|
930
|
+
if (ac.then !== undefined) return -1;
|
|
931
|
+
if (ac.scope !== undefined) return -1;
|
|
932
|
+
if (ac.provenance !== undefined) return -1;
|
|
933
|
+
return 0;
|
|
934
|
+
}
|
|
935
|
+
|
|
874
936
|
/**
|
|
875
937
|
* Create an inline TC under a parent TS.
|
|
876
938
|
*/
|
package/src/setup/agent-setup.js
CHANGED
|
@@ -184,17 +184,25 @@ export async function loadHarnessFragment({ templatePath } = {}) {
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
/**
|
|
187
|
-
* Write or merge the project-root .mcp.json with the rcf server entry
|
|
188
|
-
*
|
|
189
|
-
* discipline: other servers and unknown top-level keys are preserved
|
|
187
|
+
* Write or merge the project-root .mcp.json with the rcf server entry.
|
|
188
|
+
* MERGE discipline: other servers and unknown top-level keys are preserved
|
|
190
189
|
* verbatim; an existing `rcf` entry is left alone.
|
|
191
190
|
*
|
|
191
|
+
* The default entry invokes the CLI via `npx rcf-lite mcp` rather than an
|
|
192
|
+
* absolute `node <binPath>` path so the config stays portable across
|
|
193
|
+
* machines and CI checkouts (a project imported on a teammate's machine
|
|
194
|
+
* or moved to a different install location keeps working without a
|
|
195
|
+
* re-init). Callers wiring the config from tests can still pass an
|
|
196
|
+
* absolute `binPath` to force the legacy `node <binPath> mcp` shape.
|
|
197
|
+
*
|
|
192
198
|
* @param {object} args
|
|
193
199
|
* @param {string} args.projectRoot
|
|
194
|
-
* @param {string} [args.binPath] -
|
|
200
|
+
* @param {string} [args.binPath] - if provided, use `{ command: 'node',
|
|
201
|
+
* args: [binPath, 'mcp'] }` instead of `npx rcf-lite mcp`. Test
|
|
202
|
+
* override / opt-out for pinned deployments.
|
|
195
203
|
* @returns {Promise<{ file: string, action: 'created'|'merged'|'kept' } | import('#core/errors').RcfError>}
|
|
196
204
|
*/
|
|
197
|
-
export async function writeMcpConfig({ projectRoot, binPath =
|
|
205
|
+
export async function writeMcpConfig({ projectRoot, binPath } = {}) {
|
|
198
206
|
const file = join(projectRoot, '.mcp.json');
|
|
199
207
|
const raw = await readIfExists(file);
|
|
200
208
|
let config = {};
|
|
@@ -224,11 +232,14 @@ export async function writeMcpConfig({ projectRoot, binPath = rcfBinPath() }) {
|
|
|
224
232
|
if (servers.rcf) {
|
|
225
233
|
return { file: '.mcp.json', action: 'kept' };
|
|
226
234
|
}
|
|
235
|
+
const rcfEntry = typeof binPath === 'string' && binPath.length > 0
|
|
236
|
+
? { command: 'node', args: [binPath, 'mcp'] }
|
|
237
|
+
: { command: 'npx', args: ['rcf-lite', 'mcp'] };
|
|
227
238
|
const next = {
|
|
228
239
|
...config,
|
|
229
240
|
mcpServers: {
|
|
230
241
|
...servers,
|
|
231
|
-
rcf:
|
|
242
|
+
rcf: rcfEntry,
|
|
232
243
|
},
|
|
233
244
|
};
|
|
234
245
|
await writeFile(file, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
|
|
@@ -345,15 +356,22 @@ export const SETUP_FUNNEL_INSTRUCTION = 'Setup incomplete. Run `npx rcf init` to
|
|
|
345
356
|
/**
|
|
346
357
|
* Manual instructions printed by `rcf init --no-agent-setup`.
|
|
347
358
|
*
|
|
348
|
-
* @param {string} [binPath]
|
|
359
|
+
* @param {string} [binPath] - when omitted (the default), the manual
|
|
360
|
+
* registration snippet uses `npx rcf-lite mcp` for portability across
|
|
361
|
+
* machines and checkouts. Pass a specific absolute path only when the
|
|
362
|
+
* caller wants to pin to a particular install (test fixtures, or a
|
|
363
|
+
* deployment that has deliberately vendored the CLI).
|
|
349
364
|
* @returns {string}
|
|
350
365
|
*/
|
|
351
|
-
export function manualSetupInstructions(binPath
|
|
366
|
+
export function manualSetupInstructions(binPath) {
|
|
367
|
+
const useNpx = typeof binPath !== 'string' || binPath.length === 0;
|
|
368
|
+
const registration = useNpx
|
|
369
|
+
? ' { "mcpServers": { "rcf": { "command": "npx", "args": ["rcf-lite", "mcp"] } } }'
|
|
370
|
+
: ` { "mcpServers": { "rcf": { "command": "node", "args": ["${binPath}", "mcp"] } } }`;
|
|
352
371
|
return [
|
|
353
372
|
'Agent setup skipped (--no-agent-setup). To wire the harness manually:',
|
|
354
373
|
' 1. Register the MCP server in your project-root .mcp.json:',
|
|
355
|
-
|
|
356
|
-
` "args": ["${binPath}", "mcp"] } } }`,
|
|
374
|
+
registration,
|
|
357
375
|
' 2. Paste the fragment from `rcf guidance harness-template` (the',
|
|
358
376
|
' first ```markdown fence) into your project\'s CLAUDE.md or',
|
|
359
377
|
' AGENTS.md.',
|