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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Security secrets management blueprint guide
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
A default secrets-management floor for small greenfield rcf-lite projects. The blueprint contributes the WHAT of a secrets pattern: how the project declares what secrets exist, how one client is the sole reader of every value, how each deployable is restricted to its own slice, how every access is audited, how coding agents work with values without leaking them into transcripts and logs, how `.env` sits at the surface as an ephemeral projection rather than the source of truth, how environment shape is elicited from the operator, how rotation is gated at CI, and how an operator-facing Secrets page is offered as a three-way elicited choice.
|
|
6
|
+
|
|
7
|
+
Concretely, the blueprint ships ten requirements, ten user stories (thirty acceptance criteria), five architecture components, and five architecture decision records. One ADR is `scope: global` on the `secretsSource` topic; the other four are scope-local operational ADRs (default vendor, agent access discipline, `.env` reflection posture, rotation-and-audit posture) that a composing blueprint does not conflict with by default.
|
|
8
|
+
|
|
9
|
+
## What it is not
|
|
10
|
+
|
|
11
|
+
Not a vendor SDK. The default vendor named in ADR-902 is SOPS with age keys, chosen for the zero-infrastructure floor the rcf-lite tier expects. Larger deployments supersede ADR-902 with a project-level ADR and swap the vendor adapter for Vault, a cloud secrets manager, or a hosted third-party service; the ADR-901 contract stays intact.
|
|
12
|
+
|
|
13
|
+
Not an authorisation model. The blueprint governs READ of secret material and the audit trail of that read; who is allowed to trigger a rotation, who sees the admin-UI Secrets page, and who owns which secret at the operational level are project-side authorisation concerns that layer above the audit sink.
|
|
14
|
+
|
|
15
|
+
Not a rotation orchestrator. The blueprint gates on rotation age at CI, it does not itself run the rotation. Running a rotation is a project-authored procedure the vendor's own tooling supports (SOPS re-encrypt, Vault's rotate endpoint, a cloud provider's rotation trigger); the blueprint's rotation gate then registers the fresh `lastRotatedAt` next time it runs.
|
|
16
|
+
|
|
17
|
+
Not a UI framework. When `uiIntegration.mode` is `integrate`, the field contract for the Secrets page is fixed (TAC-905's structured output surface) but the page implementation lives in the host project's admin UI. A future admin-spa blueprint (unshipped at v1.0.0, promotion signal: the third project asks for a self-contained admin surface that hosts this page alongside others) will cover the standalone case.
|
|
18
|
+
|
|
19
|
+
Not a config manager. Non-secret configuration (feature flags, tunable thresholds, endpoint URLs that are not sensitive) sits outside this blueprint; the manifest is for secret material only. A project that wants a unified config surface authors that on top; it does not belong here.
|
|
20
|
+
|
|
21
|
+
## When to reach for it
|
|
22
|
+
|
|
23
|
+
Reach for the security-secrets-management blueprint when:
|
|
24
|
+
|
|
25
|
+
- The project depends on secret material of any kind (third-party API keys, database credentials, signing keys, session salts, TLS keys) and there is no single source of truth for what secrets exist.
|
|
26
|
+
- Multiple deployables share a secret pool and least-privilege slicing is the intended posture rather than a wishful comment in a README.
|
|
27
|
+
- Coding agents (Claude, Cursor, Copilot workflows, in-house LLM-driven scripts) are part of the operator's day and secret material must not land in the surfaces those workflows create.
|
|
28
|
+
- Rotation is a real policy rather than a document nobody reads; CI is the intended enforcement layer.
|
|
29
|
+
- The project is a small greenfield rcf-lite deployment (single deployable or a small deployable fleet, one small team or one solo operator, no ops team standing by) where a zero-infrastructure secrets story is a feature.
|
|
30
|
+
|
|
31
|
+
## When it does not fit
|
|
32
|
+
|
|
33
|
+
Do not reach for the security-secrets-management blueprint when:
|
|
34
|
+
|
|
35
|
+
- The project's secret pool is genuinely trivial (one API key, one deployable, one operator) and running a manifest plus a CI gate is more machinery than the actual risk warrants. A lightweight `.env` and a rotation reminder on a calendar is honestly the right shape at that scale; this blueprint's audit-and-slice discipline is overkill.
|
|
36
|
+
- The project has a hard corporate mandate for a specific hosted secrets vendor and there is no useful default for day one because everything already lives in that vendor. Apply the blueprint anyway if you want the ADR-901 contract, but expect to supersede ADR-902 with a project-level ADR at apply time.
|
|
37
|
+
- Compliance requires an audit stream shape different from the one ADR-905 fixes (a specific SIEM schema, a regulator-mandated field set). The blueprint fixes the SHAPE of the audit events; a project with a stricter schema supersedes ADR-905 with a project-level ADR that names the target schema and the mapping.
|
|
38
|
+
- The deploy target has no persistent filesystem for the SOPS-with-age default to live on and no working alternative vendor. The default vendor assumes a stable path the encrypted files survive at; a project without that assumption picks a different vendor (a hosted service is the natural fit) and supersedes ADR-902 accordingly.
|
|
39
|
+
|
|
40
|
+
An earlier design pass scoped a Vault-first blueprint (candidate name `secrets-vault`). The blueprint at v1.0.0 does not lead with Vault because the container-plus-server cost is disproportionate for the rcf-lite tier this blueprint targets. Vault remains the reference open-source promotion path for projects with dedicated ops capacity, and the blueprint's contract composes cleanly with a Vault vendor adapter; the promotion is a project-level ADR supersede on ADR-902 and an adapter swap.
|
|
41
|
+
|
|
42
|
+
## What a good outcome looks like
|
|
43
|
+
|
|
44
|
+
A project applies the blueprint on a fresh tree, elicits its environment set (say `dev`, `ci`, `live`), declares its deployables and their per-deployable secret slices in `secrets.yaml`, chooses one of the three UI outcomes (`integrate`, `admin-spa`, `none`), realises the five TACs in project-authored FBSes with the default SOPS-with-age vendor adapter, and lands on a deployed application where:
|
|
45
|
+
|
|
46
|
+
- Every runtime path that reads a secret imports the Secrets Manager client; nothing else touches the vendor SDK. A source-tree scan confirms the boundary.
|
|
47
|
+
- The `secrets.yaml` at the repo root is the file the operator reads to see what secrets the project depends on; adding a new secret is a two-step change (add the manifest entry, then commit an encrypted value file or configure the vendor path).
|
|
48
|
+
- A required secret missing in `live` fails boot with a stable-coded error naming the logical name and the environment; the operator diagnoses in one step.
|
|
49
|
+
- A coding agent that needs to wire a secret into a starting process runs `secrets read N | consumer-tool` and the value never lands in the agent's transcript, its tool log, or a scratch file on the working tree.
|
|
50
|
+
- A developer laptop `.env` exists because the developer ran `secrets reflect --deployable local-api --env dev`; deleting the file and re-running the reflector produces an identical file; the file is gitignored and its stale-and-regenerable status is visible in the workflow.
|
|
51
|
+
- The rotation gate runs on every CI change; a secret past its `rotationDays` budget fails the run with a naming error the author can act on immediately; a legitimate mid-rotation override is authored with an expiry timestamp and every application of it is audited.
|
|
52
|
+
- The audit stream contains every fetch attempt with `name`, `path`, `environment`, `principal`, `outcome`, and `at`; a byte-equality scan against every resolved secret value finds no match anywhere on the stream.
|
|
53
|
+
- When the operator picked `integrate`, the admin UI's Secrets page renders name, environment, owner, `lastRotatedAt`, and `rotationDays` per row; no cell renders a secret value. When the operator picked `none`, no Secrets page exists anywhere on the deployed application; the CLI plus the audit stream are the whole story.
|
|
54
|
+
|
|
55
|
+
## Operator decisions that remain open after apply
|
|
56
|
+
|
|
57
|
+
- Vendor choice (SOPS+age default, or a superseding project-level ADR selecting Vault, AWS Secrets Manager, GCP Secret Manager, Azure Key Vault, Doppler, Infisical, or a project-authored adapter). Blueprint owns the contract on both sides of the boundary; project owns the vendor.
|
|
58
|
+
- Environment set (`dev`/`ci`/`live` common default; project-specific names supported). Blueprint owns the enforcement that the manifest and the boot input agree; project owns the names.
|
|
59
|
+
- Deployable-to-slice map (which deployable reads which secrets). Blueprint owns the least-privilege enforcement; project owns the split.
|
|
60
|
+
- UI integration outcome (`integrate`, `admin-spa`, `none`). Blueprint owns the field contract for the `integrate` outcome; project owns the page implementation and the admin UI it lives in.
|
|
61
|
+
- Rotation-days budgets per entry (a small budget for high-turnover keys, a larger budget for session salts). Blueprint owns the CI gate that enforces the budget; project owns the numbers.
|
|
62
|
+
- Rotation override policy (who is allowed to author an override, how long an override may last, what the audit review cadence is). Blueprint owns that overrides carry an `expiresAt` and are audited every time; project owns the human process around them.
|
|
63
|
+
- Audit sink implementation (where the audit events land: a local file, a SIEM, a data warehouse, a project's own event bus). Blueprint owns the event shape; project owns the shipper.
|
|
64
|
+
- Secret owners (who is on the hook when an entry expires or an incident touches its blast radius). Blueprint owns that the manifest carries an `owner` field per entry; project owns the roster.
|
|
65
|
+
|
|
66
|
+
## Cost-honesty paragraph
|
|
67
|
+
|
|
68
|
+
Shipping this doc set costs the project the following. Every new secret is now a manifest change and a vendor-side configuration change instead of a stray environment variable; the discipline is intentional and adds a small friction to prototype-shaped work. The default SOPS-with-age vendor requires every developer laptop and every CI runner and every deploy host to hold an age key; losing every copy is a recover-by-rewrite problem for a pre-launch project and a recover-by-re-issue problem thereafter. The rotation gate fails CI on real drift; a project that wants faster merges buys them by rotating on cadence or by keeping the override discipline honest, neither is free. The audit sink is a stream the project now maintains; wiring it to a real sink (a SIEM, a data warehouse) is a project cost the blueprint does not carry. The three-way UI choice keeps a project without a UI honest, but a project that later wants one is a real build task rather than a config flip. The blueprint says nothing about authorisation, about the vendor's own rotation orchestration, about SIEM schemas, or about compliance reporting; a project that needs any of those spends its own build cycles on them and this blueprint does not save it any work there.
|
|
@@ -1,103 +1,3 @@
|
|
|
1
1
|
{
|
|
2
|
-
"registerCanary": [
|
|
3
|
-
{
|
|
4
|
-
"id": "rc-2026-08-28-001",
|
|
5
|
-
"createdAt": "2026-08-28T15:27:07.804Z",
|
|
6
|
-
"buildVersion": "0.12.0-mockdriver",
|
|
7
|
-
"fixturePromptId": "canary-prompt-01",
|
|
8
|
-
"responseWordCount": 55,
|
|
9
|
-
"grades": {
|
|
10
|
-
"internalRuleCitation": {
|
|
11
|
-
"verdict": "pass",
|
|
12
|
-
"matches": []
|
|
13
|
-
},
|
|
14
|
-
"unglossedJargon": {
|
|
15
|
-
"verdict": "pass",
|
|
16
|
-
"matches": []
|
|
17
|
-
},
|
|
18
|
-
"redundantPermissionAsk": {
|
|
19
|
-
"verdict": "pass",
|
|
20
|
-
"matches": []
|
|
21
|
-
},
|
|
22
|
-
"bypassOffer": {
|
|
23
|
-
"verdict": "pass",
|
|
24
|
-
"matches": []
|
|
25
|
-
},
|
|
26
|
-
"wordCountBudget": {
|
|
27
|
-
"verdict": "pass",
|
|
28
|
-
"target": 200,
|
|
29
|
-
"actual": 55,
|
|
30
|
-
"matches": []
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"verdict": "fail",
|
|
34
|
-
"shipDespiteFailReason": "mock canary driver used; no real subagent was dispatched. This record verifies canary infrastructure only, not the register itself."
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"id": "rc-2026-08-28-002",
|
|
38
|
-
"createdAt": "2026-08-28T15:27:07.805Z",
|
|
39
|
-
"buildVersion": "0.12.0-mockdriver",
|
|
40
|
-
"fixturePromptId": "canary-prompt-02",
|
|
41
|
-
"responseWordCount": 55,
|
|
42
|
-
"grades": {
|
|
43
|
-
"internalRuleCitation": {
|
|
44
|
-
"verdict": "pass",
|
|
45
|
-
"matches": []
|
|
46
|
-
},
|
|
47
|
-
"unglossedJargon": {
|
|
48
|
-
"verdict": "pass",
|
|
49
|
-
"matches": []
|
|
50
|
-
},
|
|
51
|
-
"redundantPermissionAsk": {
|
|
52
|
-
"verdict": "pass",
|
|
53
|
-
"matches": []
|
|
54
|
-
},
|
|
55
|
-
"bypassOffer": {
|
|
56
|
-
"verdict": "pass",
|
|
57
|
-
"matches": []
|
|
58
|
-
},
|
|
59
|
-
"wordCountBudget": {
|
|
60
|
-
"verdict": "pass",
|
|
61
|
-
"target": 200,
|
|
62
|
-
"actual": 55,
|
|
63
|
-
"matches": []
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
"verdict": "fail",
|
|
67
|
-
"shipDespiteFailReason": "mock canary driver used; no real subagent was dispatched. This record verifies canary infrastructure only, not the register itself."
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"id": "rc-2026-08-28-003",
|
|
71
|
-
"createdAt": "2026-08-28T15:27:07.805Z",
|
|
72
|
-
"buildVersion": "0.12.0-mockdriver",
|
|
73
|
-
"fixturePromptId": "canary-prompt-03",
|
|
74
|
-
"responseWordCount": 55,
|
|
75
|
-
"grades": {
|
|
76
|
-
"internalRuleCitation": {
|
|
77
|
-
"verdict": "pass",
|
|
78
|
-
"matches": []
|
|
79
|
-
},
|
|
80
|
-
"unglossedJargon": {
|
|
81
|
-
"verdict": "pass",
|
|
82
|
-
"matches": []
|
|
83
|
-
},
|
|
84
|
-
"redundantPermissionAsk": {
|
|
85
|
-
"verdict": "pass",
|
|
86
|
-
"matches": []
|
|
87
|
-
},
|
|
88
|
-
"bypassOffer": {
|
|
89
|
-
"verdict": "pass",
|
|
90
|
-
"matches": []
|
|
91
|
-
},
|
|
92
|
-
"wordCountBudget": {
|
|
93
|
-
"verdict": "pass",
|
|
94
|
-
"target": 200,
|
|
95
|
-
"actual": 55,
|
|
96
|
-
"matches": []
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
"verdict": "fail",
|
|
100
|
-
"shipDespiteFailReason": "mock canary driver used; no real subagent was dispatched. This record verifies canary infrastructure only, not the register itself."
|
|
101
|
-
}
|
|
102
|
-
]
|
|
2
|
+
"registerCanary": []
|
|
103
3
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rcf-lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI grouped into the five RCF tool groups (discover, define, build, verify, audit) plus a small core set (init, doctor, guidance, mcp), an MCP server, the live tree viewer and the fresh-context adversarial ship-gate verifier. Consumes @stravica-ai/rcf-schemas.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"guidance",
|
|
29
29
|
"rcf",
|
|
30
30
|
"fixtures",
|
|
31
|
+
"blueprints",
|
|
32
|
+
"scripts/preinstall-node-check.mjs",
|
|
31
33
|
"README.md",
|
|
32
34
|
"LICENSE",
|
|
33
35
|
"CHANGELOG.md"
|
|
@@ -36,6 +38,17 @@
|
|
|
36
38
|
"registry": "https://registry.npmjs.org/",
|
|
37
39
|
"access": "public"
|
|
38
40
|
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"test": "node --test --test-concurrency=1 'test/**/*.test.js'",
|
|
43
|
+
"vendor": "node scripts/vendor-mermaid.mjs",
|
|
44
|
+
"build:managed": "node scripts/gen-managed-artefacts.mjs",
|
|
45
|
+
"canary:register": "node scripts/canary-register.mjs",
|
|
46
|
+
"stage:blueprints": "node scripts/stage-blueprint-shelf.mjs",
|
|
47
|
+
"preinstall": "node scripts/preinstall-node-check.mjs",
|
|
48
|
+
"prepack": "node scripts/stage-blueprint-shelf.mjs",
|
|
49
|
+
"prepublishOnly": "node scripts/gen-managed-artefacts.mjs && node scripts/stage-blueprint-shelf.mjs",
|
|
50
|
+
"rcf": "node bin/rcf.js"
|
|
51
|
+
},
|
|
39
52
|
"repository": {
|
|
40
53
|
"type": "git",
|
|
41
54
|
"url": "git+https://github.com/Stravica/rcf-lite.git",
|
|
@@ -64,12 +77,5 @@
|
|
|
64
77
|
"devDependencies": {
|
|
65
78
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
66
79
|
"mermaid": "11.6.0"
|
|
67
|
-
},
|
|
68
|
-
"scripts": {
|
|
69
|
-
"test": "node --test --test-concurrency=1 'test/**/*.test.js'",
|
|
70
|
-
"vendor": "node scripts/vendor-mermaid.mjs",
|
|
71
|
-
"build:managed": "node scripts/gen-managed-artefacts.mjs",
|
|
72
|
-
"canary:register": "node scripts/canary-register.mjs",
|
|
73
|
-
"rcf": "node bin/rcf.js"
|
|
74
80
|
}
|
|
75
|
-
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Operator profile
|
|
2
|
+
|
|
3
|
+
This file describes you (the operator) to any agent working on this
|
|
4
|
+
repo. It lives in `rcf/.identity/` and is gitignored by default, so
|
|
5
|
+
it is per-clone: another developer's clone of the same repo has their
|
|
6
|
+
own profile, not yours.
|
|
7
|
+
|
|
8
|
+
Fill in what is useful. Leave the rest. Freeform prose is fine; a
|
|
9
|
+
bulleted list is fine. Nothing here is enforced by tooling.
|
|
10
|
+
|
|
11
|
+
## Name
|
|
12
|
+
|
|
13
|
+
_(who you are; how you want the agent to address you)_
|
|
14
|
+
|
|
15
|
+
## Role
|
|
16
|
+
|
|
17
|
+
_(what you do; what perspective you bring to this project)_
|
|
18
|
+
|
|
19
|
+
## Working preferences
|
|
20
|
+
|
|
21
|
+
_(how you like to work: casual or formal register, verbose or terse
|
|
22
|
+
responses, willingness to be pushed back on, anything the agent should
|
|
23
|
+
know before choosing its default posture)_
|
|
24
|
+
|
|
25
|
+
## Project-scoped notes
|
|
26
|
+
|
|
27
|
+
_(anything specific to this project that would be useful for the agent
|
|
28
|
+
to know but does not belong in the shared requirements tree: a local
|
|
29
|
+
dev workflow quirk, an in-flight side-experiment, a "do not touch this
|
|
30
|
+
directory yet" flag)_
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
If you want to share your profile with the team, remove the
|
|
35
|
+
`rcf/.identity/` line from the managed block in `.gitignore` (or `git
|
|
36
|
+
add -f rcf/.identity/profile.md` for one-off sharing). The default is
|
|
37
|
+
per-clone. Sharing is deliberate.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Knowledge
|
|
2
|
+
|
|
3
|
+
This directory is the project's memory. Everything an agent working on
|
|
4
|
+
this repo should not have to relearn from scratch belongs here.
|
|
5
|
+
|
|
6
|
+
## The convention
|
|
7
|
+
|
|
8
|
+
- **`notes/`**: internal facts. Decisions, gotchas, runtime facts,
|
|
9
|
+
the small things that always cost time to rediscover ("the CI matrix
|
|
10
|
+
uses Node 22 not 24", "the pnpm store path on this machine is
|
|
11
|
+
non-default", "the local Postgres is on port 5433 not 5432"). Written
|
|
12
|
+
for future agents and future you, not for public readers.
|
|
13
|
+
- **`docs/`**: user-facing prose the project might surface elsewhere.
|
|
14
|
+
Design notes the operator wants tidy, sections that might land in a
|
|
15
|
+
README or a spec, prose intended for a wider audience.
|
|
16
|
+
|
|
17
|
+
## The rules
|
|
18
|
+
|
|
19
|
+
1. **One topic per file.** The filename is the topic
|
|
20
|
+
(`notes/ci-node-version.md`, not `notes/general.md`). One paragraph
|
|
21
|
+
is enough. An empty file that only carries a pointer to somewhere
|
|
22
|
+
else is fine. A file called `misc.md` or `general.md` is not.
|
|
23
|
+
2. **Write on learn.** If this session established a fact the next
|
|
24
|
+
session should not have to rediscover, write it here before the
|
|
25
|
+
session ends.
|
|
26
|
+
3. **Grep before asking.** Before asking the stakeholder a question,
|
|
27
|
+
`rg -n '<topic>' rcf/knowledge/` to see whether the answer is
|
|
28
|
+
already here.
|
|
29
|
+
|
|
30
|
+
## `INDEX.md`
|
|
31
|
+
|
|
32
|
+
`INDEX.md` is a human table of contents. Add a bullet when you add a
|
|
33
|
+
file. Keep it grouped by area if it grows. Nobody scans it
|
|
34
|
+
programmatically in v1; it is for the person landing on the repo cold.
|
|
35
|
+
|
|
36
|
+
## What this is not
|
|
37
|
+
|
|
38
|
+
This is not a knowledge graph. There is no CLI verb, no indexer, no
|
|
39
|
+
vector search. If a project needs one, that is a v2 decision, not a v1
|
|
40
|
+
default. The convention above is deliberately cheap. The value is in
|
|
41
|
+
the discipline of using it.
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Preinstall hard-fail on Node < 24.
|
|
3
|
+
//
|
|
4
|
+
// The `engines` block in package.json only asks npm to complain; recent
|
|
5
|
+
// npm defaults print a warning and install anyway, so a session on
|
|
6
|
+
// Node 22 has historically resolved the last publish that ADVERTISED
|
|
7
|
+
// support for it (`rcf-lite@0.0.1`, a placeholder stub) without ever
|
|
8
|
+
// touching the current release train. That silent downgrade is the
|
|
9
|
+
// worst-possible first touch for a new operator, so we fail loudly
|
|
10
|
+
// here BEFORE any files land on disk.
|
|
11
|
+
//
|
|
12
|
+
// Bypass for maintainers who genuinely need to override: set
|
|
13
|
+
// `RCF_LITE_SKIP_NODE_CHECK=1`. Do not set it in ordinary use.
|
|
14
|
+
//
|
|
15
|
+
// Source-monorepo exemption: the same script also runs when someone
|
|
16
|
+
// installs this repo itself as a pnpm workspace (workspace members get
|
|
17
|
+
// their preinstall invoked on `pnpm install`). Blocking the source dev
|
|
18
|
+
// flow is not the point of this gate; the point is to stop
|
|
19
|
+
// `npm install rcf-lite` on the wrong Node from silently landing a
|
|
20
|
+
// broken tree. If we can detect we're being run from the pnpm workspace
|
|
21
|
+
// root (an ancestor `pnpm-workspace.yaml` exists), we skip - the
|
|
22
|
+
// engines WARN still fires, so contributors are not unaware.
|
|
23
|
+
|
|
24
|
+
import { existsSync } from 'node:fs';
|
|
25
|
+
import { dirname, resolve } from 'node:path';
|
|
26
|
+
import { fileURLToPath } from 'node:url';
|
|
27
|
+
|
|
28
|
+
const REQUIRED_MAJOR = 24;
|
|
29
|
+
|
|
30
|
+
if (process.env.RCF_LITE_SKIP_NODE_CHECK === '1') {
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
// packages/rcf-lite/scripts -> packages/rcf-lite -> packages -> repo-root
|
|
36
|
+
const candidateRepoRoot = resolve(here, '..', '..', '..');
|
|
37
|
+
if (existsSync(resolve(candidateRepoRoot, 'pnpm-workspace.yaml'))) {
|
|
38
|
+
// Running inside the source monorepo. The engines pin still complains,
|
|
39
|
+
// but we do not want to break `pnpm install` for a dev on the wrong
|
|
40
|
+
// Node while they are trying to bump their own environment. The gate
|
|
41
|
+
// is aimed at consumers of the published tarball, not at us.
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const raw = process.versions.node;
|
|
46
|
+
const match = /^(\d+)\./.exec(raw ?? '');
|
|
47
|
+
const major = match ? Number(match[1]) : Number.NaN;
|
|
48
|
+
|
|
49
|
+
if (!Number.isFinite(major) || major < REQUIRED_MAJOR) {
|
|
50
|
+
const lines = [
|
|
51
|
+
'',
|
|
52
|
+
' rcf-lite requires Node.js >= 24.',
|
|
53
|
+
` Detected Node.js ${raw}.`,
|
|
54
|
+
'',
|
|
55
|
+
' Install a supported Node (see https://nodejs.org) and re-run.',
|
|
56
|
+
' Bypass (not recommended): RCF_LITE_SKIP_NODE_CHECK=1 npm install rcf-lite',
|
|
57
|
+
'',
|
|
58
|
+
];
|
|
59
|
+
process.stderr.write(lines.join('\n'));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
package/src/blueprint/apply.js
CHANGED
|
@@ -34,7 +34,11 @@ import { nextResolutionId } from './resolutions.js';
|
|
|
34
34
|
* @param {object} args
|
|
35
35
|
* @param {string} args.projectRoot
|
|
36
36
|
* @param {import('#core/store/walker.js').TreeModel} args.tree
|
|
37
|
-
* @param {string} args.source - path to blueprint directory
|
|
37
|
+
* @param {string} args.source - path to blueprint directory (absolute after the CLI resolver)
|
|
38
|
+
* @param {string} [args.displaySource] - the source string as the operator typed it;
|
|
39
|
+
* used only for the conflict renderer's supersede hint so it can print the exact
|
|
40
|
+
* string the operator can copy back. Defaults to `source` when omitted (so
|
|
41
|
+
* existing callers keep today's byte-for-byte behaviour).
|
|
38
42
|
* @param {string} [args.namespaceOverride] - non-default namespace slug
|
|
39
43
|
* @param {Array<{ topic: string, resolvedByAdrId: string }>} [args.resolveDeclarations]
|
|
40
44
|
* Operator-supplied conflict resolutions declared on the add
|
|
@@ -54,7 +58,8 @@ import { nextResolutionId } from './resolutions.js';
|
|
|
54
58
|
* prove the rollback runs. Never used in production.
|
|
55
59
|
* @returns {Promise<ApplyResult | import('../core/errors/index.js').RcfError>}
|
|
56
60
|
*/
|
|
57
|
-
export async function applyBlueprint({ projectRoot, tree, source, namespaceOverride, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
|
|
61
|
+
export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
|
|
62
|
+
const hintSource = typeof displaySource === 'string' && displaySource.length > 0 ? displaySource : source;
|
|
58
63
|
const blueprint = await loadBlueprint(source);
|
|
59
64
|
if (blueprint.kind) return blueprint; // RcfError
|
|
60
65
|
const namespace = namespaceOverride ?? blueprint.slug;
|
|
@@ -100,7 +105,7 @@ export async function applyBlueprint({ projectRoot, tree, source, namespaceOverr
|
|
|
100
105
|
// exactly as printed - `rcf blueprint supersede <topic> --incoming
|
|
101
106
|
// <source>` - with a real source path the operator can copy back
|
|
102
107
|
// into a fresh shell.
|
|
103
|
-
...await enrichAdrConflicts(rawGlobalConflicts, tree, blueprint,
|
|
108
|
+
...await enrichAdrConflicts(rawGlobalConflicts, tree, blueprint, hintSource),
|
|
104
109
|
...detectCrossBlueprintClaims(applied, incomingForConflicts),
|
|
105
110
|
];
|
|
106
111
|
if (conflicts.length > 0) {
|
|
@@ -172,8 +177,9 @@ export async function applyBlueprint({ projectRoot, tree, source, namespaceOverr
|
|
|
172
177
|
// first-apply into a tree that already has the file, or a new
|
|
173
178
|
// contribution appearing in a re-applied version -- is treated
|
|
174
179
|
// as foreign and refused. Grammar is deliberately not consulted
|
|
175
|
-
// here: `ADR-201-spa-theme` may be a legitimate
|
|
176
|
-
// whose author put a semantic tail
|
|
180
|
+
// here: `ADR-201-application-spa-theme` may be a legitimate
|
|
181
|
+
// `application-spa`-owned id whose author put a semantic tail
|
|
182
|
+
// after the slug.
|
|
177
183
|
if (!ownedIds.has(c.id)) {
|
|
178
184
|
for (const w of stagedWrites) await unlink(w.tmpAbs).catch(() => {});
|
|
179
185
|
return rcfError({
|
|
@@ -395,7 +401,7 @@ function composeDeclaredResolutions({ manifest, applied, incoming, declarations,
|
|
|
395
401
|
* absent and the renderer falls back to id-at-path for that side.
|
|
396
402
|
*
|
|
397
403
|
* Round-2 review nit: the earlier version only enriched the existing
|
|
398
|
-
* side, so a conflict report against shipped
|
|
404
|
+
* side, so a conflict report against shipped application-spa + REST rendered
|
|
399
405
|
* asymmetrically (spa gets 'SPA auth: cookie sessions — HttpOnly
|
|
400
406
|
* cookies.' while rest gets 'ADR-003-rest at rcf/adrs/...'). Both
|
|
401
407
|
* sides are readable — the existing side from tree, the incoming
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
// manifest record. The manifest's appliedBlueprintRecord.contributions[]
|
|
16
16
|
// list is the authoritative ownership record; two blueprints cannot
|
|
17
17
|
// both claim the same id. This is the ambiguity-class check that
|
|
18
|
-
// used to live inside `isNamespacedFor` grammar (blueprint
|
|
19
|
-
// silently claiming `ADR-005-spa-theme`
|
|
20
|
-
// startsWith `spa-`). Grammar is no
|
|
21
|
-
// the manifest is.
|
|
18
|
+
// used to live inside `isNamespacedFor` grammar (blueprint
|
|
19
|
+
// `application-spa` silently claiming `ADR-005-application-spa-theme`
|
|
20
|
+
// because the string startsWith `application-spa-`). Grammar is no
|
|
21
|
+
// longer a trust surface here -- the manifest is.
|
|
22
22
|
//
|
|
23
23
|
// Every other class the design brief names (non-global TACs/ADRs/REQs/USs
|
|
24
24
|
// /FBSes, standards-value conflicts, manifest overlap) is either
|
|
@@ -111,10 +111,10 @@ export function detectGlobalAdrConflicts(appliedBlueprints, incoming, manifest =
|
|
|
111
111
|
/**
|
|
112
112
|
* Cross-blueprint ownership conflicts: an incoming contribution id is
|
|
113
113
|
* already recorded as owned by a DIFFERENT applied blueprint. This
|
|
114
|
-
* detector is what makes `spa` vs `spa-theme`
|
|
115
|
-
* once one of the two has applied -- the
|
|
116
|
-
* hits the first-mover's manifest record
|
|
117
|
-
* of how the id string parses.
|
|
114
|
+
* detector is what makes `application-spa` vs `application-spa-theme`
|
|
115
|
+
* cross-claim impossible once one of the two has applied -- the
|
|
116
|
+
* second-mover's incoming id hits the first-mover's manifest record
|
|
117
|
+
* and is refused, regardless of how the id string parses.
|
|
118
118
|
*
|
|
119
119
|
* Re-apply of the same slug (`applied.slug === incoming.slug`) is
|
|
120
120
|
* skipped: same blueprint owning its own ids across re-apply is the
|
package/src/blueprint/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Public surface for the blueprint mechanism.
|
|
2
2
|
|
|
3
3
|
export { applyBlueprint } from './apply.js';
|
|
4
|
-
export { listBlueprints } from './list.js';
|
|
4
|
+
export { listBlueprints, enrichRowsWithCategories, groupRowsByCategory } from './list.js';
|
|
5
5
|
export { removeBlueprint } from './remove.js';
|
|
6
6
|
export { loadBlueprint } from './loader.js';
|
|
7
7
|
export { detectGlobalAdrConflicts, detectCrossBlueprintClaims, renderConflictReport, conflictReportJson } from './conflicts.js';
|
|
@@ -10,3 +10,4 @@ export { registerStandardsPack, listStandards } from './standards.js';
|
|
|
10
10
|
export { nextResolutionId, matchingResolution } from './resolutions.js';
|
|
11
11
|
export { supersedeBlueprintTopic } from './supersede.js';
|
|
12
12
|
export { diffBlueprintTopic, renderDiff } from './diff.js';
|
|
13
|
+
export { resolveBlueprintSource, knownShelfSlugs, packagedShelfPath } from './shelf-resolver.js';
|
package/src/blueprint/list.js
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
// Blueprint list. Reads manifest.blueprints[] and returns rows in
|
|
2
2
|
// appliedAt order. Rows are already validated by the schema; this
|
|
3
3
|
// module is a projection.
|
|
4
|
+
//
|
|
5
|
+
// Category enrichment lives in `enrichRowsWithCategories`. The applied
|
|
6
|
+
// manifest record's shape is pinned by `@stravica-ai/rcf-schemas`
|
|
7
|
+
// (additionalProperties: false on appliedBlueprintRecord), so category
|
|
8
|
+
// is not persisted on apply. Instead each row's `source` path is
|
|
9
|
+
// re-loaded at list time to read the shipping blueprint's own
|
|
10
|
+
// `blueprint.json:category`. A source that no longer resolves surfaces
|
|
11
|
+
// as `category: null` so grouped rendering can place it under an
|
|
12
|
+
// uncategorised heading rather than swallow the row.
|
|
13
|
+
|
|
14
|
+
import { loadBlueprint } from './loader.js';
|
|
4
15
|
|
|
5
16
|
/**
|
|
6
17
|
* @param {import('#core/store/walker.js').TreeModel} tree
|
|
@@ -19,3 +30,52 @@ export function listBlueprints(tree) {
|
|
|
19
30
|
contributionCount: Array.isArray(b.contributions) ? b.contributions.length : 0,
|
|
20
31
|
}));
|
|
21
32
|
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Enrich list rows with a `category` field, read from each row's
|
|
36
|
+
* shipping blueprint source. Best-effort: any load failure yields
|
|
37
|
+
* `category: null` so the caller can render the row under an
|
|
38
|
+
* uncategorised group rather than skip it.
|
|
39
|
+
*
|
|
40
|
+
* @param {ReturnType<typeof listBlueprints>} rows
|
|
41
|
+
* @returns {Promise<Array<{ slug: string, version: string, appliedAt: string, source: string, namespace: string | null, contributionCount: number, category: string | null }>>}
|
|
42
|
+
*/
|
|
43
|
+
export async function enrichRowsWithCategories(rows) {
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
let category = null;
|
|
47
|
+
if (typeof row.source === 'string' && row.source.length > 0) {
|
|
48
|
+
const loaded = await loadBlueprint(row.source);
|
|
49
|
+
if (!loaded.kind && typeof loaded.category === 'string') {
|
|
50
|
+
category = loaded.category;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
out.push({ ...row, category });
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Group category-enriched rows by category. Preserves appliedAt order
|
|
60
|
+
* within each group. Categories are returned sorted alphabetically;
|
|
61
|
+
* rows with no category collect under a final `null` group so the
|
|
62
|
+
* renderer can label them (`uncategorised`) without a magic string
|
|
63
|
+
* leaking into the group key.
|
|
64
|
+
*
|
|
65
|
+
* @param {Awaited<ReturnType<typeof enrichRowsWithCategories>>} rows
|
|
66
|
+
* @returns {Array<{ category: string | null, rows: typeof rows }>}
|
|
67
|
+
*/
|
|
68
|
+
export function groupRowsByCategory(rows) {
|
|
69
|
+
const buckets = new Map();
|
|
70
|
+
for (const row of rows) {
|
|
71
|
+
const key = typeof row.category === 'string' ? row.category : null;
|
|
72
|
+
if (!buckets.has(key)) buckets.set(key, []);
|
|
73
|
+
buckets.get(key).push(row);
|
|
74
|
+
}
|
|
75
|
+
const named = [...buckets.keys()]
|
|
76
|
+
.filter((k) => k !== null)
|
|
77
|
+
.sort((a, b) => a.localeCompare(b));
|
|
78
|
+
const groups = named.map((category) => ({ category, rows: buckets.get(category) }));
|
|
79
|
+
if (buckets.has(null)) groups.push({ category: null, rows: buckets.get(null) });
|
|
80
|
+
return groups;
|
|
81
|
+
}
|
package/src/blueprint/loader.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// `scope: 'global'` tag plus a `topic` string; these are the only
|
|
7
7
|
// contributions the conflict detector reasons about.
|
|
8
8
|
//
|
|
9
|
-
// The registry / git-ref resolver is a Phase 2 concern (
|
|
9
|
+
// The registry / git-ref resolver is a Phase 2 concern (application-spa and application-api-rest
|
|
10
10
|
// blueprints ship as npm packages); this loader intentionally has no
|
|
11
11
|
// network path so tests are hermetic.
|
|
12
12
|
|
|
@@ -40,6 +40,17 @@ const EXCLUDED_KINDS = new Set(['fbs']);
|
|
|
40
40
|
* @property {string} slug
|
|
41
41
|
* @property {string} version
|
|
42
42
|
* @property {string} source source directory (absolute)
|
|
43
|
+
* @property {string} [category] optional shelf-grouping tag; kebab slug.
|
|
44
|
+
* Read by `rcf define blueprint list` and by
|
|
45
|
+
* the docs blueprint shelf to group entries.
|
|
46
|
+
* The starter vocabulary (`application`,
|
|
47
|
+
* `security`, `email`, `deploy`, `delivery`,
|
|
48
|
+
* `persistence`, `observability`) lives in
|
|
49
|
+
* the authoring standard; the loader
|
|
50
|
+
* validates the shape (kebab slug), not the
|
|
51
|
+
* vocabulary, so a new category can be
|
|
52
|
+
* minted by adding it to the standard
|
|
53
|
+
* without a code change.
|
|
43
54
|
* @property {BlueprintContribution[]} contributions
|
|
44
55
|
*/
|
|
45
56
|
|
|
@@ -82,6 +93,7 @@ export async function loadBlueprint(source) {
|
|
|
82
93
|
slug: doc.slug,
|
|
83
94
|
version: doc.version,
|
|
84
95
|
source: root,
|
|
96
|
+
...(typeof doc.category === 'string' ? { category: doc.category } : {}),
|
|
85
97
|
contributions: Array.isArray(doc.contributions) ? doc.contributions : [],
|
|
86
98
|
};
|
|
87
99
|
}
|
|
@@ -96,6 +108,19 @@ function validateMetadata(doc, metaPath) {
|
|
|
96
108
|
if (typeof doc.version !== 'string' || !/^\d+\.\d+\.\d+$/.test(doc.version)) {
|
|
97
109
|
return rcfError({ kind: 'validation', message: `blueprint.json: version '${doc.version}' is not semver`, filePath: metaPath });
|
|
98
110
|
}
|
|
111
|
+
if (doc.category !== undefined) {
|
|
112
|
+
// Category is optional; when present it must be a kebab slug (same
|
|
113
|
+
// shape as blueprint slug). The loader validates SHAPE only: the
|
|
114
|
+
// vocabulary (application, security, email, deploy, delivery,
|
|
115
|
+
// persistence, observability, and future additions) is documented
|
|
116
|
+
// in the authoring standard rather than pinned in code, so a new
|
|
117
|
+
// category minted at standard-review time does not need a loader
|
|
118
|
+
// change. The docs shelf and `rcf define blueprint list` render
|
|
119
|
+
// whatever category strings appear on the applied blueprints.
|
|
120
|
+
if (typeof doc.category !== 'string' || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(doc.category)) {
|
|
121
|
+
return rcfError({ kind: 'validation', message: `blueprint.json: category '${doc.category}' is not a valid kebab slug`, filePath: metaPath });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
99
124
|
if (doc.contributions !== undefined && !Array.isArray(doc.contributions)) {
|
|
100
125
|
return rcfError({ kind: 'validation', message: 'blueprint.json: contributions must be an array', filePath: metaPath });
|
|
101
126
|
}
|