rcf-lite 0.28.4 → 0.30.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 +194 -1
- package/bin/rcf.js +4 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-001.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-007.json +1 -1
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-009.json +1 -1
- package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +4 -4
- package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +2 -2
- package/blueprints/application-account-settings/contributions/tacs/tac-2603-application-account-settings-hosted-ui-bridge.json +2 -2
- package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +7 -7
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +3 -15
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +2 -10
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25111.json +3 -6
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25112.json +4 -4
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-007.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-008.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-009.json +1 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +1 -1
- package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +4 -4
- package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +7 -7
- package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +2 -2
- package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +2 -2
- package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +3 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +2 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21111.json +3 -11
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21112.json +4 -4
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +2 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +2 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +1 -1
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +1 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +1 -1
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +1 -1
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +1 -1
- package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +4 -4
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +4 -4
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +4 -4
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +2 -2
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +2 -2
- package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +4 -4
- package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +4 -4
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +4 -4
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +4 -4
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +1 -1
- package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +4 -4
- package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +4 -4
- package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +2 -2
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +1 -1
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +1 -1
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +1 -1
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +2 -2
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-006.json +1 -1
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-007.json +2 -2
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +5 -5
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2302-application-empty-error-states-recovery-router.json +2 -2
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +5 -5
- package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +6 -6
- package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +4 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +1 -1
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +4 -4
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-006.json +2 -2
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-007.json +2 -2
- package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +7 -7
- package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +8 -8
- package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +11 -11
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +1 -1
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-006.json +2 -2
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +7 -7
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +4 -4
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2503-application-forms-wizard-draft-store.json +4 -4
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +2 -2
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-006.json +2 -2
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +6 -6
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +9 -9
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +4 -4
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +2 -2
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +4 -4
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-005.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-006.json +1 -1
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2701-application-onboarding-tour-step-runner.json +4 -4
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +2 -2
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +2 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26108.json +2 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +1 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +1 -1
- package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +1 -1
- package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +1 -1
- package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +1 -1
- package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +4 -4
- package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +4 -4
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +6 -6
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +6 -6
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +6 -6
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +8 -8
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +8 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +1 -1
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +1 -1
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +1 -1
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +4 -4
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +4 -4
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +6 -6
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +5 -5
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +2 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json +6 -6
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json +4 -4
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json +4 -4
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +6 -6
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +6 -6
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +4 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +1 -1
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +6 -6
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +8 -8
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +6 -6
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +8 -8
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +8 -8
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +8 -8
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +2 -2
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +2 -2
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-001.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-002.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-003.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-004.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-005.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-006.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3801-deploy-hetzner-server-provisioner.json +3 -2
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3802-deploy-hetzner-server-manifest-schema.json +3 -2
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3803-deploy-hetzner-server-cloud-init-template.json +3 -2
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3804-deploy-hetzner-server-firewall-shape.json +3 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37101.json +4 -4
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37102.json +3 -3
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37103.json +4 -4
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37104.json +2 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37105.json +2 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37106.json +3 -3
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37107.json +2 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37108.json +2 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37109.json +2 -2
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-007.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3501-edge-cloudflare-access-jwt-validator.json +6 -4
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3502-edge-cloudflare-access-application-declaration.json +3 -2
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3503-edge-cloudflare-access-policy-shape.json +3 -2
- package/blueprints/edge-cloudflare-access/contributions/tacs/tac-3504-edge-cloudflare-access-audit-sink.json +3 -2
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +5 -5
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +3 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +5 -5
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34110.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +6 -4
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3702-edge-cloudflare-rate-limiting-management-surface-doc.json +3 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +3 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +2 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +6 -6
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-001.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-002.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-003.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-004.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-005.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-006.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-007.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +3 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4002-edge-cloudflare-tunnel-manifest-schema.json +3 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4003-edge-cloudflare-tunnel-access-binding.json +3 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4004-edge-cloudflare-tunnel-zone-and-hostname-apply.json +3 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39101.json +3 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39102.json +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39103.json +4 -4
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39104.json +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39105.json +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39106.json +5 -5
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39107.json +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39108.json +3 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39109.json +4 -4
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39110.json +3 -3
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +3 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +9 -6
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3603-edge-cloudflare-turnstile-magic-link-hook.json +3 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +3 -3
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +4 -4
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +6 -6
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +2 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +1 -1
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +1 -1
- package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +8 -8
- package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +10 -10
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +1 -1
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +1 -1
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +1 -1
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +1 -1
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +2 -2
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +1 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +1 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +1 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +1 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +1 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +1 -1
- package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +4 -4
- package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +6 -6
- package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +6 -6
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +3 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +4 -4
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +1 -1
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +6 -6
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-001.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-101.json +1 -1
- package/blueprints/object-storage-s3/contributions/tacs/tac-2901-object-storage-s3-facade.json +6 -6
- package/blueprints/object-storage-s3/contributions/tacs/tac-2902-object-storage-s3-multipart-uploader.json +2 -2
- package/blueprints/object-storage-s3/contributions/tacs/tac-2903-object-storage-s3-event-sink.json +2 -2
- package/blueprints/object-storage-s3/contributions/tacs/tac-2904-object-storage-s3-hetzner-endpoint-helper.json +2 -2
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +1 -1
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +1 -1
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +2 -2
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +1 -1
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +2 -2
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +1 -1
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28110.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +1 -1
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +1 -1
- package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +4 -4
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +12 -12
- package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +6 -6
- package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +8 -8
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +1 -1
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +3 -3
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +2 -2
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-001.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +1 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-006.json +8 -2
- package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +6 -6
- package/blueprints/observability-logging/contributions/tacs/tac-1602-observability-logging-redaction-boundary.json +2 -2
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +4 -4
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +2 -2
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +2 -2
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +1 -1
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +1 -1
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +2 -2
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +1 -1
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15109.json +3 -3
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +6 -6
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +4 -4
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +6 -6
- package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +4 -4
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +2 -2
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +1 -1
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +3 -3
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +1 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +1 -1
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +6 -6
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +4 -4
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +4 -4
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +4 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +2 -2
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +1 -1
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +2 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-001.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2801-persistence-data-postgres-facade.json +6 -6
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +4 -4
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +2 -2
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2804-persistence-data-postgres-recovery-runner.json +4 -4
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +4 -4
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +2 -2
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +6 -6
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +2 -2
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +4 -4
- package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +2 -2
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +2 -2
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +1 -1
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +2 -2
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +6 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3302-platform-cloudflare-cron-triggers-expression-router.json +9 -2
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3303-platform-cloudflare-cron-triggers-event-sink.json +6 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +6 -6
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +5 -5
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +3 -3
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +4 -4
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +4 -4
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +4 -4
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3401-platform-cloudflare-durable-objects-namespace-facade.json +6 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3402-platform-cloudflare-durable-objects-single-cell-shape.json +6 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3403-platform-cloudflare-durable-objects-alarm-handler.json +6 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3404-platform-cloudflare-durable-objects-websocket-hub.json +6 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/tacs/tac-3405-platform-cloudflare-durable-objects-event-sink.json +3 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +5 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +4 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +5 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +5 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +5 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +4 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +5 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +4 -4
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +5 -5
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-006.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-007.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3201-platform-cloudflare-kv-facade.json +3 -2
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3202-platform-cloudflare-kv-cache-aside.json +3 -2
- package/blueprints/platform-cloudflare-kv/contributions/tacs/tac-3203-platform-cloudflare-kv-event-sink.json +3 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +4 -4
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +3 -3
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +4 -4
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +4 -4
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +4 -4
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +3 -3
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +3 -3
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +3 -3
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31109.json +4 -4
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31110.json +5 -5
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31111.json +5 -5
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-001.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-002.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-003.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-004.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-005.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-006.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-007.json +1 -1
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3901-platform-docker-compose-host-compose-layout.json +3 -2
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3902-platform-docker-compose-host-secrets-mount.json +3 -2
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3903-platform-docker-compose-host-healthcheck-lint.json +3 -2
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3904-platform-docker-compose-host-reverse-proxy-artefact.json +3 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38101.json +5 -5
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38102.json +4 -4
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38103.json +4 -4
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38104.json +4 -4
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38105.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38106.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38107.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38108.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38109.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38110.json +3 -3
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-010.json +1 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-011.json +1 -1
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +6 -6
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +8 -3
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +8 -8
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +1 -1
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +1 -1
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9112.json +6 -6
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9113.json +6 -6
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-013.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-014.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-015.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-016.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-017.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-018.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-019.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +10 -10
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +8 -8
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +8 -8
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +6 -6
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +4 -4
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +2 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +3 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +2 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11114.json +1 -1
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11115.json +5 -5
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11116.json +7 -7
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11117.json +7 -7
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11118.json +7 -7
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11119.json +7 -7
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11120.json +6 -6
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +1 -1
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +6 -6
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +6 -6
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +10 -10
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +2 -2
- package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +2 -2
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +2 -2
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-011.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-012.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-013.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +24 -14
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +4 -4
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +10 -10
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +8 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10112.json +1 -1
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10114.json +5 -5
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +1 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +1 -1
- package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +8 -8
- package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +4 -4
- package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +4 -4
- package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +8 -8
- package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +4 -4
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/define-draft-shapes.md +89 -0
- package/guidance/define-intake.md +97 -0
- package/guidance/define-intent.md +107 -0
- package/guidance/define-litmus.md +102 -0
- package/guidance/discover-prototype.md +67 -0
- package/guidance/discovery-prototypes.md +69 -0
- package/guidance/harness-template.md +34 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +34 -0
- package/guidance/manifest.json +10 -2
- package/package.json +1 -1
- package/rcf/adrs/adr-4124-define-freeze-verb.json +30 -0
- package/rcf/adrs/adr-4126-persona-tagged-blockers-two-levels.json +40 -0
- package/rcf/adrs/adr-4127-readiness-tab-order-and-register.json +40 -0
- package/rcf/adrs/adr-4129-questions-harness-driven-loop.json +25 -0
- package/rcf/adrs/adr-4130-intake-harness-split-tool-scanned.json +20 -0
- package/rcf/adrs/adr-4131-gates-bite-ack-recorded-override.json +30 -0
- package/rcf/adrs/adr-4132-prototypes-in-discovery-as-evidence.json +20 -0
- package/rcf/adrs/adr-4133-dag-dependency-depth-layout.json +40 -0
- package/rcf/adrs/adr-4134-index-json-route.json +35 -0
- package/rcf/adrs/adr-4135-readiness-po-register-and-adapter.json +35 -0
- package/rcf/adrs/adr-4136-embedding-host-fixture.json +35 -0
- package/rcf/code-nodes/cn-725.json +18 -2
- package/rcf/code-nodes/cn-726.json +10 -2
- package/rcf/code-nodes/cn-727.json +13 -4
- package/rcf/code-nodes/cn-728.json +18 -2
- package/rcf/code-nodes/cn-729.json +10 -2
- package/rcf/code-nodes/cn-730.json +13 -3
- package/rcf/code-nodes/cn-731.json +20 -0
- package/rcf/code-nodes/cn-732.json +14 -0
- package/rcf/code-nodes/cn-733.json +14 -0
- package/rcf/code-nodes/cn-734.json +14 -0
- package/rcf/code-nodes/cn-735.json +20 -0
- package/rcf/code-nodes/cn-736.json +14 -0
- package/rcf/code-nodes/cn-737.json +14 -0
- package/rcf/code-nodes/cn-738.json +14 -0
- package/rcf/code-nodes/cn-739.json +18 -0
- package/rcf/code-nodes/cn-740.json +19 -0
- package/rcf/code-nodes/cn-741.json +16 -0
- package/rcf/code-nodes/cn-742.json +16 -0
- package/rcf/code-nodes/cn-743.json +15 -0
- package/rcf/code-nodes/cn-744.json +22 -0
- package/rcf/code-nodes/cn-745.json +16 -0
- package/rcf/code-nodes/cn-746.json +14 -0
- package/rcf/code-nodes/cn-747.json +18 -0
- package/rcf/code-nodes/cn-748.json +16 -0
- package/rcf/code-nodes/cn-749.json +16 -0
- package/rcf/code-nodes/cn-750.json +15 -0
- package/rcf/code-nodes/cn-751.json +18 -0
- package/rcf/code-nodes/cn-752.json +14 -0
- package/rcf/code-nodes/cn-753.json +19 -0
- package/rcf/code-nodes/cn-754.json +17 -0
- package/rcf/code-nodes/cn-755.json +14 -0
- package/rcf/code-nodes/cn-756.json +15 -0
- package/rcf/code-nodes/cn-757.json +21 -0
- package/rcf/code-nodes/cn-758.json +16 -0
- package/rcf/code-nodes/cn-759.json +21 -0
- package/rcf/code-nodes/cn-760.json +19 -0
- package/rcf/code-nodes/cn-761.json +16 -0
- package/rcf/code-nodes/cn-762.json +18 -0
- package/rcf/code-nodes/cn-763.json +18 -0
- package/rcf/code-nodes/cn-764.json +15 -0
- package/rcf/code-nodes/cn-765.json +23 -0
- package/rcf/code-nodes/cn-766.json +17 -0
- package/rcf/code-nodes/cn-767.json +17 -0
- package/rcf/code-nodes/cn-768.json +19 -0
- package/rcf/code-nodes/cn-769.json +17 -0
- package/rcf/code-nodes/cn-770.json +18 -0
- package/rcf/fbs/fbs-196.json +13 -5
- package/rcf/fbs/fbs-198.json +42 -0
- package/rcf/fbs/fbs-199.json +59 -0
- package/rcf/fbs/fbs-200.json +46 -0
- package/rcf/fbs/fbs-201.json +49 -0
- package/rcf/fbs/fbs-202.json +170 -0
- package/rcf/fbs/fbs-203.json +100 -0
- package/rcf/requirements/req-002.json +2 -2
- package/rcf/requirements/req-173.json +2 -2
- package/rcf/requirements/req-174.json +10 -4
- package/rcf/requirements/req-175.json +10 -4
- package/rcf/requirements/req-176.json +25 -0
- package/rcf/requirements/req-177.json +31 -0
- package/rcf/requirements/req-178.json +31 -0
- package/rcf/requirements/req-179.json +31 -0
- package/rcf/requirements/req-180.json +31 -0
- package/rcf/requirements/req-181.json +31 -0
- package/rcf/requirements/req-182.json +25 -0
- package/rcf/requirements/req-186.json +25 -0
- package/rcf/requirements/req-187.json +31 -0
- package/rcf/requirements/req-188.json +25 -0
- package/rcf/tacs/tac-001.json +7 -7
- package/rcf/tacs/tac-002.json +23 -23
- package/rcf/tacs/tac-003.json +5 -5
- package/rcf/tacs/tac-004.json +9 -9
- package/rcf/tacs/tac-005.json +7 -7
- package/rcf/tacs/tac-006.json +21 -21
- package/rcf/tacs/tac-007.json +7 -7
- package/rcf/tacs/tac-008.json +7 -7
- package/rcf/tacs/tac-4101-feedback-cli.json +5 -5
- package/rcf/tacs/tac-4102-feedback-store.json +9 -9
- package/rcf/tacs/tac-4103-feedback-redact.json +5 -5
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +3 -3
- package/rcf/tacs/tac-4105-feedback-render.json +7 -7
- package/rcf/tacs/tac-4106-feedback-destination.json +5 -5
- package/rcf/tacs/tac-4107-feedback-gh.json +7 -7
- package/rcf/tacs/tac-4108-feedback-hook.json +7 -7
- package/rcf/tacs/tac-4121-define-ledgers.json +16 -3
- package/rcf/tacs/tac-4122-define-gates.json +69 -5
- package/rcf/tacs/tac-4123-define-readiness.json +66 -4
- package/rcf/tacs/tac-4124-define-freeze.json +28 -0
- package/rcf/tacs/tac-4125-build-bundle-refuse-override-skip.json +43 -0
- package/rcf/tacs/tac-4126-define-validate-findings.json +32 -0
- package/rcf/tacs/tac-4127-readiness-view.json +49 -0
- package/rcf/tacs/tac-4128-define-guidance.json +59 -0
- package/rcf/tacs/tac-4129-define-questions.json +45 -0
- package/rcf/tacs/tac-4130-define-intake-brief.json +35 -0
- package/rcf/tacs/tac-4131-build-dag-view.json +39 -0
- package/rcf/tacs/tac-4132-id-lookup.json +42 -0
- package/rcf/tacs/tac-4133-readiness-po-layer.json +37 -0
- package/rcf/tacs/tac-4134-wespa-host-fixture.json +54 -0
- package/rcf/test-suites/ts-016.json +3 -3
- package/rcf/test-suites/ts-215.json +148 -4
- package/rcf/test-suites/ts-216.json +19 -3
- package/rcf/test-suites/ts-218.json +78 -0
- package/rcf/test-suites/ts-219.json +70 -0
- package/rcf/test-suites/ts-220.json +78 -0
- package/rcf/test-suites/ts-221.json +78 -0
- package/rcf/test-suites/ts-222.json +100 -0
- package/rcf/test-suites/ts-223.json +94 -0
- package/rcf/test-suites/ts-224.json +70 -0
- package/rcf/test-suites/ts-225.json +78 -0
- package/rcf/test-suites/ts-226.json +158 -0
- package/rcf/test-suites/ts-227.json +38 -0
- package/rcf/test-suites/ts-228.json +86 -0
- package/rcf/test-suites/ts-229.json +83 -0
- package/rcf/test-suites/ts-230.json +76 -0
- package/rcf/test-suites/ts-231.json +104 -0
- package/rcf/test-suites/ts-232.json +109 -0
- package/rcf/test-suites/ts-233.json +61 -0
- package/rcf/test-suites/ts-234.json +53 -0
- package/rcf/test-suites/ts-235.json +53 -0
- package/rcf/user-stories/us-17302.json +50 -0
- package/rcf/user-stories/us-17401.json +14 -2
- package/rcf/user-stories/us-17402.json +55 -0
- package/rcf/user-stories/us-17403.json +60 -0
- package/rcf/user-stories/us-17404.json +51 -0
- package/rcf/user-stories/us-17405.json +61 -0
- package/rcf/user-stories/us-17406.json +51 -0
- package/rcf/user-stories/us-17502.json +60 -0
- package/rcf/user-stories/us-17503.json +65 -0
- package/rcf/user-stories/us-17504.json +46 -0
- package/rcf/user-stories/us-17601.json +58 -0
- package/rcf/user-stories/us-17702.json +51 -0
- package/rcf/user-stories/us-17802.json +40 -0
- package/rcf/user-stories/us-17902.json +46 -0
- package/rcf/user-stories/us-18001.json +55 -0
- package/rcf/user-stories/us-18002.json +35 -0
- package/rcf/user-stories/us-18101.json +35 -0
- package/rcf/user-stories/us-18202.json +40 -0
- package/rcf/user-stories/us-18601.json +55 -0
- package/rcf/user-stories/us-18602.json +50 -0
- package/rcf/user-stories/us-18603.json +45 -0
- package/rcf/user-stories/us-18701.json +50 -0
- package/rcf/user-stories/us-18702.json +50 -0
- package/rcf/user-stories/us-18801.json +45 -0
- package/rcf/user-stories/us-204.json +59 -0
- package/rcf/user-stories/us-205.json +64 -0
- package/rcf/user-stories/us-206.json +54 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/consistency-lint.js +72 -3
- package/src/cli/build.js +206 -3
- package/src/cli/freeze.js +780 -0
- package/src/cli/help.js +12 -0
- package/src/cli/ledger.js +228 -12
- package/src/cli/questions.js +288 -0
- package/src/cli/readiness.js +393 -74
- package/src/cli/validate.js +8 -0
- package/src/cli/view.js +29 -0
- package/src/define/concern-catalogue.js +130 -0
- package/src/define/freeze-record.js +104 -15
- package/src/define/ledgers.js +210 -11
- package/src/define/probe-runner.js +55 -0
- package/src/define/validate-findings.js +256 -0
- package/src/intake/index.js +1 -1
- package/src/intake/orchestrator.js +117 -0
- package/src/mcp/tools.js +354 -0
- package/src/query/delta.js +6 -0
- package/src/query/gates.js +1258 -48
- package/src/query/index.js +22 -3
- package/src/query/questions.js +438 -0
- package/src/query/readiness.js +427 -9
- package/src/query/refuse-on-admissibility.js +137 -4
- package/src/ruleset/ruleset.json +35 -0
- package/src/server/index.js +24 -2
- package/src/server/routes.js +68 -1
- package/src/setup/identity-seed.js +17 -0
- package/src/view/build-dag.js +563 -0
- package/src/view/components/badge.js +41 -0
- package/src/view/components/diff.js +72 -0
- package/src/view/components/doc-row.js +62 -0
- package/src/view/components/empty-state.js +35 -0
- package/src/view/components/entity-selector.js +137 -0
- package/src/view/components/filter-bar.js +97 -0
- package/src/view/components/findings-list.js +49 -0
- package/src/view/components/index.js +12 -0
- package/src/view/components/pill.js +46 -0
- package/src/view/components/sub-tab-strip.js +43 -0
- package/src/view/components/toast.js +25 -0
- package/src/view/components-fixture.js +265 -0
- package/src/view/doc-renderers/architecture.js +304 -0
- package/src/view/doc-renderers/build.js +160 -0
- package/src/view/doc-renderers/index.js +2 -0
- package/src/view/doc-renderers/prd.js +35 -6
- package/src/view/html-page.js +700 -602
- package/src/view/index.js +96 -3
- package/src/view/live-client.js +39 -6
- package/src/view/needs-work.js +79 -0
- package/src/view/page-init.js +2193 -0
- package/src/view/readiness/phrasebook.js +115 -0
- package/src/view/readiness/po-layer.js +288 -0
- package/src/view/readiness/question-adapter.js +329 -0
- package/src/view/readiness/stage-legend.js +71 -0
- package/src/view/readiness.js +505 -0
- package/src/view/style.css +2017 -382
- package/src/view/test-host/embed-client.js +121 -0
- package/src/view/test-host/fixture.js +183 -0
- package/src/view/test-host/lints.js +220 -0
- package/src/view/view-index.js +323 -0
package/src/view/html-page.js
CHANGED
|
@@ -4,30 +4,68 @@
|
|
|
4
4
|
// drill-down under Requirements. Phase 3.6 dropped the top-of-overview
|
|
5
5
|
// diagram - it was redundant with the PRD body's requirementIds list
|
|
6
6
|
// and unwieldy past ~15 REQs. Overview tab now renders the PRD body
|
|
7
|
-
// only.
|
|
8
|
-
// at the end of `<body>`; if JS is unavailable, every tabpanel is
|
|
9
|
-
// visible in DOM order (D12).
|
|
7
|
+
// only. If JS is unavailable, every tabpanel is visible in DOM order (D12).
|
|
10
8
|
//
|
|
11
9
|
// Phase 3.8 wraps the swappable tree content in a stable
|
|
12
10
|
// `<div id="rcf-live-content">` (D13a) and always injects the live
|
|
13
|
-
// client script
|
|
14
|
-
//
|
|
15
|
-
//
|
|
11
|
+
// client script before `</body>`. The tab init routine is exposed as
|
|
12
|
+
// `window.rcfPage.init()` so the live client can re-invoke it after
|
|
13
|
+
// every SSE innerHTML swap.
|
|
14
|
+
//
|
|
15
|
+
// Viewer UI refresh PR 1 (w-2026-10-02-dave-010, Dex / wespa relay
|
|
16
|
+
// f0384046 on 2026-10-02):
|
|
17
|
+
// - compact Stravica-brand shell: data-theme light|dark|auto on
|
|
18
|
+
// <html>, data-embed=1 suppresses the brand block and the footer
|
|
19
|
+
// and keeps the tab nav sticky, viewport-height scroll box owned
|
|
20
|
+
// by <main>, never scrolls horizontally.
|
|
21
|
+
// - asset and SSE references are RELATIVE (./live-client.js,
|
|
22
|
+
// ./page-init.js, ./style.css, ./mermaid.min.js, ./product-map/,
|
|
23
|
+
// ./events, ./scope.json) so the wespa reverse-proxy mount under
|
|
24
|
+
// /rcf-viewer/ keeps working without rewrites (issue #263).
|
|
25
|
+
// - the single former inline script lives at ./page-init.js;
|
|
26
|
+
// wespa's CSP pins inline scripts by hash and we no longer have
|
|
27
|
+
// any. page-init.js carries the theme/embed boot, origin-checked
|
|
28
|
+
// postMessage listener for { type:"rcf-view-theme", theme } and
|
|
29
|
+
// the Router (#tab=&sub=&entity=, bare #REQ-002, host query
|
|
30
|
+
// preserved on every write).
|
|
31
|
+
|
|
32
|
+
import { readFileSync } from 'node:fs';
|
|
33
|
+
import { dirname, resolve } from 'node:path';
|
|
34
|
+
import { fileURLToPath } from 'node:url';
|
|
16
35
|
|
|
17
36
|
import {
|
|
18
37
|
renderAdr,
|
|
19
|
-
|
|
20
|
-
|
|
38
|
+
renderBuildPageHead,
|
|
39
|
+
renderBuildStats,
|
|
21
40
|
renderPrd,
|
|
22
|
-
|
|
41
|
+
renderSpecBody,
|
|
23
42
|
renderTac,
|
|
24
|
-
|
|
25
|
-
renderTestSuite,
|
|
43
|
+
renderTadSections,
|
|
26
44
|
renderUserStory,
|
|
45
|
+
shortenDocId,
|
|
27
46
|
} from './doc-renderers/index.js';
|
|
28
47
|
import { detailsWrap, escapeHtml } from './doc-renderers/helpers.js';
|
|
48
|
+
import { computeQueue } from '../build/queue.js';
|
|
29
49
|
import { allRequirementSubdiagrams } from './mermaid-diagram.js';
|
|
30
50
|
import { renderProductMapPanel } from './product-map.js';
|
|
51
|
+
import { renderReadinessPanel } from './readiness.js';
|
|
52
|
+
import { renderToastContainer } from './components/toast.js';
|
|
53
|
+
import { renderDocRow } from './components/doc-row.js';
|
|
54
|
+
import { renderFilterBar } from './components/filter-bar.js';
|
|
55
|
+
import { renderBadge } from './components/badge.js';
|
|
56
|
+
import { pill } from './components/pill.js';
|
|
57
|
+
import { renderEmptyState } from './components/empty-state.js';
|
|
58
|
+
import { renderEntitySelector } from './components/entity-selector.js';
|
|
59
|
+
import { renderSubTabStrip } from './components/sub-tab-strip.js';
|
|
60
|
+
import { buildDagLayout, buildDagInspectorPayload, renderBuildDag } from './build-dag.js';
|
|
61
|
+
import { computeReqNeedsWorkIds, needsWorkReasonFor } from './needs-work.js';
|
|
62
|
+
import { renderLookupModal, renderSearchButton } from './view-index.js';
|
|
63
|
+
|
|
64
|
+
// Umbrella version stamped at module load (same pattern as src/ruleset/index.js).
|
|
65
|
+
// Used by the shell footer so the muted "RCF Lite X.Y.Z" line tracks the
|
|
66
|
+
// installed package without a build step.
|
|
67
|
+
const pkgJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json');
|
|
68
|
+
const RCF_LITE_VERSION = JSON.parse(readFileSync(pkgJsonPath, 'utf8')).version;
|
|
31
69
|
|
|
32
70
|
// Inline SVG favicon: the Stravica kit mark (deep-navy tile with the
|
|
33
71
|
// ribbon symbol in Stravica blue), taken from the estate brand kit at
|
|
@@ -47,9 +85,9 @@ const LIVE_WRAPPER_CLOSE = '</div>';
|
|
|
47
85
|
* @returns {string}
|
|
48
86
|
*/
|
|
49
87
|
export function renderPage(model) {
|
|
50
|
-
const
|
|
88
|
+
const header = resolveProductHeader(model);
|
|
89
|
+
const projectName = header.projectName ?? 'RCF project';
|
|
51
90
|
const contentHtml = renderContent(model);
|
|
52
|
-
const script = inlineScript();
|
|
53
91
|
|
|
54
92
|
return `<!DOCTYPE html>
|
|
55
93
|
<html lang="en-GB">
|
|
@@ -58,7 +96,7 @@ export function renderPage(model) {
|
|
|
58
96
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
59
97
|
<title>${escapeHtml(projectName)} - RCF review surface</title>
|
|
60
98
|
<link rel="icon" type="image/svg+xml" href="${FAVICON_HREF}">
|
|
61
|
-
<link rel="stylesheet" href="style.css">
|
|
99
|
+
<link rel="stylesheet" href="./style.css">
|
|
62
100
|
<noscript>
|
|
63
101
|
<style>
|
|
64
102
|
/* Progressive enhancement per D12: no JS -> every tabpanel is
|
|
@@ -70,29 +108,48 @@ export function renderPage(model) {
|
|
|
70
108
|
</noscript>
|
|
71
109
|
</head>
|
|
72
110
|
<body>
|
|
73
|
-
<header>
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
111
|
+
<header class="app-header">
|
|
112
|
+
<div class="bar">
|
|
113
|
+
<div class="brand" title="Review surface">
|
|
114
|
+
<svg class="mark" aria-hidden="true" viewBox="0 0 64 64" width="18" height="18"><rect x="0" y="0" width="64" height="64" rx="14" fill="#080F19"/><g fill="#7295FF"><path d="M38 9L17 21V32L38 20Z"/><path d="M30 27L46 36V46L30 37L23 33Z"/><path d="M46 46L25 58V47L37 40Z"/></g></svg>
|
|
115
|
+
</div>
|
|
116
|
+
${renderProductBlock(header)}
|
|
117
|
+
<nav class="tabs" role="tablist" aria-label="Document sections">
|
|
118
|
+
<button type="button" role="tab" data-tab="readiness" aria-selected="true" aria-controls="tab-readiness">Readiness</button>
|
|
119
|
+
<button type="button" role="tab" data-tab="overview" aria-selected="false" aria-controls="tab-overview">PRD</button>
|
|
120
|
+
<button type="button" role="tab" data-tab="product-map" aria-selected="false" aria-controls="tab-product-map">Product Map</button>
|
|
121
|
+
<button type="button" role="tab" data-tab="requirements" aria-selected="false" aria-controls="tab-requirements">Requirements</button>
|
|
122
|
+
<button type="button" role="tab" data-tab="architecture" aria-selected="false" aria-controls="tab-architecture">Architecture</button>
|
|
123
|
+
<button type="button" role="tab" data-tab="build" aria-selected="false" aria-controls="tab-build">Build</button>
|
|
124
|
+
</nav>
|
|
125
|
+
<div class="tools" aria-label="Viewer tools">
|
|
126
|
+
${renderSearchButton()}
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
83
129
|
</header>
|
|
84
130
|
<main>
|
|
85
131
|
${LIVE_WRAPPER_OPEN}
|
|
86
132
|
${contentHtml}
|
|
87
133
|
${LIVE_WRAPPER_CLOSE}
|
|
88
134
|
</main>
|
|
89
|
-
<footer>
|
|
90
|
-
<
|
|
91
|
-
<
|
|
135
|
+
<footer class="app-footer">
|
|
136
|
+
<span class="ver">RCF Lite ${escapeHtml(RCF_LITE_VERSION)}</span>
|
|
137
|
+
<span class="sep" aria-hidden="true">·</span>
|
|
138
|
+
<a href="https://github.com/Stravica/rcf-lite" target="_blank" rel="noopener">rcf-lite on GitHub</a>
|
|
139
|
+
<span class="sep" aria-hidden="true">·</span>
|
|
140
|
+
<a href="https://stravica.ai/docs/rcf/" target="_blank" rel="noopener">RCF Lite docs</a>
|
|
141
|
+
<span class="sep" aria-hidden="true">·</span>
|
|
142
|
+
<a href="https://stravica.ai/rcf-methodology/" target="_blank" rel="noopener">RCF method docs</a>
|
|
143
|
+
<span id="rcf-conn-pill" class="live reconnecting" role="status" aria-live="polite" title="Connecting to view server...">
|
|
144
|
+
<span class="dot" aria-hidden="true"></span>
|
|
145
|
+
<span class="label">Connecting…</span>
|
|
146
|
+
</span>
|
|
92
147
|
</footer>
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<script src="
|
|
148
|
+
${renderToastContainer()}
|
|
149
|
+
${renderLookupModal()}
|
|
150
|
+
<script src="./mermaid.min.js"></script>
|
|
151
|
+
<script src="./page-init.js" defer></script>
|
|
152
|
+
<script src="./live-client.js" defer></script>
|
|
96
153
|
</body>
|
|
97
154
|
</html>
|
|
98
155
|
`;
|
|
@@ -109,27 +166,40 @@ export function renderPage(model) {
|
|
|
109
166
|
*/
|
|
110
167
|
export function renderContent(model) {
|
|
111
168
|
const subdiagrams = allRequirementSubdiagrams(model);
|
|
169
|
+
const needsWorkIds = computeReqNeedsWorkIds(model.readiness);
|
|
112
170
|
|
|
113
171
|
const prdSection = model.prd
|
|
114
172
|
? renderPrd(model.prd, {
|
|
115
173
|
raw: model.rawById.get(model.prd.prdId),
|
|
116
174
|
errors: model.errorsById.get(model.prd.prdId),
|
|
117
175
|
requirementIds: model.childrenByParent.get(model.prd.prdId) ?? [],
|
|
176
|
+
suppressRequirementList: true,
|
|
177
|
+
collapsibleLists: true,
|
|
118
178
|
})
|
|
119
179
|
: '<p><em>No PRD on disk.</em></p>';
|
|
120
180
|
|
|
121
|
-
const
|
|
181
|
+
const prdSelector = renderPrdRequirementSelector(model);
|
|
182
|
+
const requirementsPanel = renderRequirementsPanel(model, subdiagrams, needsWorkIds);
|
|
122
183
|
const architecturePanel = renderArchitecturePanel(model);
|
|
123
184
|
const buildPanel = renderBuildPanel(model);
|
|
124
185
|
const productMapPanel = renderProductMapPanel(model);
|
|
186
|
+
const readinessPanel = renderReadinessPanel(model.readiness ?? null, {
|
|
187
|
+
profile: model.profileText ?? null,
|
|
188
|
+
freezeRecord: model.freezeRecord ?? null,
|
|
189
|
+
});
|
|
125
190
|
|
|
126
191
|
const errorBanner = renderErrorBanner(model.errors ?? []);
|
|
127
192
|
|
|
128
193
|
return `${errorBanner}
|
|
129
|
-
<section id="tab-
|
|
130
|
-
<h2 class="tab-heading">
|
|
194
|
+
<section id="tab-readiness" role="tabpanel" aria-labelledby="tab-readiness-button">
|
|
195
|
+
<h2 class="tab-heading">Readiness</h2>
|
|
196
|
+
${readinessPanel}
|
|
197
|
+
</section>
|
|
198
|
+
<section id="tab-overview" role="tabpanel" aria-labelledby="tab-overview-button" hidden>
|
|
199
|
+
<h2 class="tab-heading">PRD</h2>
|
|
131
200
|
<div class="prd-body">
|
|
132
201
|
${prdSection}
|
|
202
|
+
${prdSelector}
|
|
133
203
|
</div>
|
|
134
204
|
</section>
|
|
135
205
|
<section id="tab-product-map" role="tabpanel" hidden>
|
|
@@ -145,48 +215,73 @@ export function renderContent(model) {
|
|
|
145
215
|
${architecturePanel}
|
|
146
216
|
</section>
|
|
147
217
|
<section id="tab-build" role="tabpanel" hidden>
|
|
148
|
-
<h2 class="tab-heading">Build
|
|
218
|
+
<h2 class="tab-heading">Build</h2>
|
|
149
219
|
${buildPanel}
|
|
150
220
|
</section>`;
|
|
151
221
|
}
|
|
152
222
|
|
|
153
|
-
|
|
223
|
+
/**
|
|
224
|
+
* Viewer UI refresh PR 3 (decision 2, decision 3, decision 14): the
|
|
225
|
+
* Requirements tab renders every REQ as a shared DocRow carrying
|
|
226
|
+
* area / US count / AC count badges and a status pill. The FilterBar
|
|
227
|
+
* above drives text / area / priority / status / Needs-work filtering;
|
|
228
|
+
* state is wired to the URL hash in page-init.js so a filtered view
|
|
229
|
+
* is a link. Each row stays closed by default; when opened it shows
|
|
230
|
+
* the renderReq body (description, rationale, tags), a nested row of
|
|
231
|
+
* user stories (with AC counts), and the slice diagram + raw JSON as
|
|
232
|
+
* their own collapsed inner details so the first-paint stays cheap.
|
|
233
|
+
*
|
|
234
|
+
* `#entity=US-304` resolves to REQ-003 and US-304: the hash router
|
|
235
|
+
* opens every ancestor <details> and the US row's data-doc-id anchor
|
|
236
|
+
* is the one the current router already walks (decision 11, PR 1).
|
|
237
|
+
*
|
|
238
|
+
* @param {import('./tree-model.js').BuiltTreeModel} model
|
|
239
|
+
* @param {Map<string, string>} subdiagrams - REQ id -> Mermaid source
|
|
240
|
+
* @param {Set<string>} needsWorkIds - REQ ids still needing PO work
|
|
241
|
+
*/
|
|
242
|
+
function renderRequirementsPanel(model, subdiagrams, needsWorkIds) {
|
|
154
243
|
if (model.requirements.length === 0 && model.userStories.length === 0) {
|
|
155
|
-
return
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const reqBody = renderReq(r, {
|
|
159
|
-
raw: model.rawById.get(r.reqId),
|
|
160
|
-
errors: model.errorsById.get(r.reqId),
|
|
161
|
-
subdiagram: subdiagrams.get(r.reqId),
|
|
162
|
-
});
|
|
163
|
-
const stories = model.storiesByReqId.get(r.reqId) ?? [];
|
|
164
|
-
const usBlocks = stories.map((u) => detailsWrap({
|
|
165
|
-
id: u.usId,
|
|
166
|
-
summary: `${u.usId} - ${u.title ?? ''}`,
|
|
167
|
-
className: 'doc-us-wrap',
|
|
168
|
-
status: u.status,
|
|
169
|
-
body: renderUserStory(u, {
|
|
170
|
-
raw: model.rawById.get(u.usId),
|
|
171
|
-
errors: model.errorsById.get(u.usId),
|
|
172
|
-
fbsByAcId: model.fbsByAcId,
|
|
173
|
-
}),
|
|
174
|
-
})).join('\n');
|
|
175
|
-
const storiesSection = usBlocks
|
|
176
|
-
? `<section class="nested-details"><h4>User stories</h4>${usBlocks}</section>`
|
|
177
|
-
: '<p><em>No user stories under this requirement.</em></p>';
|
|
178
|
-
return detailsWrap({
|
|
179
|
-
id: r.reqId,
|
|
180
|
-
summary: `${r.reqId} - ${r.title ?? ''}`,
|
|
181
|
-
className: 'doc-req-wrap',
|
|
182
|
-
status: r.status,
|
|
183
|
-
body: `${reqBody}\n${storiesSection}`,
|
|
244
|
+
return renderEmptyState({
|
|
245
|
+
title: 'No requirements on disk',
|
|
246
|
+
hint: 'Add requirements under rcf/requirements/ and the viewer picks them up on the next walk.',
|
|
184
247
|
});
|
|
185
|
-
}
|
|
248
|
+
}
|
|
249
|
+
const areaCounts = countBy(model.requirements, (r) => normaliseFacet(r.domain));
|
|
250
|
+
const priorityCounts = countBy(model.requirements, (r) => normaliseFacet(r.priority));
|
|
251
|
+
const statusCounts = countBy(model.requirements, (r) => normaliseFacet(r.status));
|
|
252
|
+
|
|
253
|
+
const filterBar = renderFilterBar({
|
|
254
|
+
hashKey: 'requirements',
|
|
255
|
+
placeholder: 'Filter by id, title or text',
|
|
256
|
+
selects: [
|
|
257
|
+
{
|
|
258
|
+
key: 'domain',
|
|
259
|
+
label: 'Area',
|
|
260
|
+
options: [{ value: '', label: 'All areas' }, ...facetOptions(areaCounts)],
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
key: 'priority',
|
|
264
|
+
label: 'Priority',
|
|
265
|
+
options: [{ value: '', label: 'Any priority' }, ...facetOptions(priorityCounts)],
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
key: 'status',
|
|
269
|
+
label: 'Status',
|
|
270
|
+
options: [{ value: '', label: 'Any status' }, ...facetOptions(statusCounts)],
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
toggles: [
|
|
274
|
+
{ key: 'needswork', label: `Needs work (${needsWorkIds.size})` },
|
|
275
|
+
],
|
|
276
|
+
count: { visible: model.requirements.length, total: model.requirements.length },
|
|
277
|
+
showExpandAll: true,
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
const reqRows = model.requirements.map((r) => renderRequirementRow(r, model, subdiagrams, needsWorkIds)).join('\n');
|
|
186
281
|
|
|
187
282
|
const orphanUs = model.userStories.filter((u) => !u.reqId || !model.requirements.some((r) => r.reqId === u.reqId));
|
|
188
283
|
const orphanBlock = orphanUs.length > 0
|
|
189
|
-
? `<section class="orphan-us"><h3>Orphan user stories</h3>${orphanUs.map((u) => detailsWrap({
|
|
284
|
+
? `<section class="orphan-us"><h3 class="group-heading">Orphan user stories</h3>${orphanUs.map((u) => detailsWrap({
|
|
190
285
|
id: u.usId,
|
|
191
286
|
summary: `${u.usId} - ${u.title ?? ''}`,
|
|
192
287
|
className: 'doc-us-wrap',
|
|
@@ -199,583 +294,586 @@ function renderRequirementsPanel(model, subdiagrams) {
|
|
|
199
294
|
})).join('\n')}</section>`
|
|
200
295
|
: '';
|
|
201
296
|
|
|
202
|
-
return `${
|
|
297
|
+
return `${filterBar}
|
|
298
|
+
<div class="rcf-requirements-list" data-rcf-list="requirements">
|
|
299
|
+
${reqRows}
|
|
300
|
+
</div>
|
|
301
|
+
${orphanBlock}`;
|
|
203
302
|
}
|
|
204
303
|
|
|
205
|
-
function
|
|
206
|
-
const
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
return `
|
|
241
|
-
${tadSection}
|
|
242
|
-
<h3 class="group-heading">Components</h3>
|
|
243
|
-
${tacBlocks || '<p><em>No TAC components on disk.</em></p>'}
|
|
244
|
-
<h3 class="group-heading">Architectural decisions</h3>
|
|
245
|
-
${adrBlocks || '<p><em>No ADRs on disk.</em></p>'}
|
|
246
|
-
`;
|
|
247
|
-
}
|
|
304
|
+
function renderRequirementRow(req, model, subdiagrams, needsWorkIds) {
|
|
305
|
+
const stories = model.storiesByReqId.get(req.reqId) ?? [];
|
|
306
|
+
const acCount = stories.reduce((n, u) => n + (u.acceptanceCriteria?.length ?? 0), 0);
|
|
307
|
+
const area = normaliseFacet(req.domain);
|
|
308
|
+
const priority = normaliseFacet(req.priority);
|
|
309
|
+
const status = normaliseFacet(req.status);
|
|
310
|
+
const needsWork = needsWorkIds.has(req.reqId);
|
|
311
|
+
const needsWorkReason = needsWork ? (needsWorkReasonFor(model.readiness, req.reqId) ?? 'needs engineer-ready detail') : '';
|
|
312
|
+
|
|
313
|
+
const metaParts = [];
|
|
314
|
+
if (area) metaParts.push(renderBadge({ value: area, variant: 'facet', title: 'Area' }));
|
|
315
|
+
metaParts.push(renderBadge({ value: stories.length, label: 'US', variant: 'count', title: 'User stories' }));
|
|
316
|
+
metaParts.push(renderBadge({ value: acCount, label: 'AC', variant: 'count', title: 'Acceptance criteria' }));
|
|
317
|
+
if (status) metaParts.push(pill({ value: status, variant: 'doc-status' }));
|
|
318
|
+
if (needsWork) metaParts.push(renderBadge({ value: 'needs work', variant: 'accent', title: needsWorkReason }));
|
|
319
|
+
const meta = metaParts.join(' ');
|
|
320
|
+
|
|
321
|
+
const usRows = stories.map((u) => renderUserStoryInnerRow(u, model)).join('\n');
|
|
322
|
+
const storiesBlock = stories.length > 0
|
|
323
|
+
? `<section class="rcf-req-stories"><h4>User stories (${stories.length})</h4>${usRows}</section>`
|
|
324
|
+
: '<p class="muted"><em>No user stories under this requirement yet.</em></p>';
|
|
325
|
+
|
|
326
|
+
const description = typeof req.description === 'string' && req.description.length > 0
|
|
327
|
+
? `<p class="rcf-req-description">${escapeHtml(req.description)}</p>`
|
|
328
|
+
: '';
|
|
329
|
+
const rationale = typeof req.rationale === 'string' && req.rationale.length > 0
|
|
330
|
+
? `<p class="rcf-req-rationale muted"><strong>Why:</strong> ${escapeHtml(req.rationale)}</p>`
|
|
331
|
+
: '';
|
|
332
|
+
const tags = Array.isArray(req.tags) && req.tags.length > 0
|
|
333
|
+
? `<div class="rcf-req-tags">${req.tags.map((t) => renderBadge({ value: t, variant: 'facet' })).join(' ')}</div>`
|
|
334
|
+
: '';
|
|
335
|
+
const needsWorkLine = needsWork
|
|
336
|
+
? `<p class="rcf-req-needswork"><strong>Needs work:</strong> ${escapeHtml(needsWorkReason)}</p>`
|
|
337
|
+
: '';
|
|
248
338
|
|
|
249
|
-
|
|
250
|
-
const
|
|
251
|
-
?
|
|
252
|
-
.filter((f) => f.bsId === model.bs.bsId)
|
|
253
|
-
.sort((a, b) => (a.buildOrder ?? 0) - (b.buildOrder ?? 0))
|
|
254
|
-
.map((f) => ({
|
|
255
|
-
fbsId: f.fbsId,
|
|
256
|
-
buildOrder: f.buildOrder,
|
|
257
|
-
executionStatus: f.executionStatus,
|
|
258
|
-
title: f.title,
|
|
259
|
-
}))
|
|
260
|
-
: [];
|
|
261
|
-
const bsSection = model.bs
|
|
262
|
-
? renderBuildSequence(model.bs, {
|
|
263
|
-
raw: model.rawById.get(model.bs.bsId),
|
|
264
|
-
errors: model.errorsById.get(model.bs.bsId),
|
|
265
|
-
slots: bsSlots,
|
|
266
|
-
})
|
|
267
|
-
: '<p><em>No build sequence on disk.</em></p>';
|
|
268
|
-
|
|
269
|
-
const fbsBlocks = model.fbsItems.map((f) => detailsWrap({
|
|
270
|
-
id: f.fbsId,
|
|
271
|
-
summary: `${f.fbsId} - ${f.title ?? ''}`,
|
|
272
|
-
className: 'doc-fbs-wrap',
|
|
273
|
-
status: f.executionStatus,
|
|
274
|
-
body: renderFbs(f, {
|
|
275
|
-
raw: model.rawById.get(f.fbsId),
|
|
276
|
-
errors: model.errorsById.get(f.fbsId),
|
|
277
|
-
usByAcId: model.usByAcId,
|
|
278
|
-
}),
|
|
279
|
-
})).join('\n');
|
|
280
|
-
|
|
281
|
-
const tsBlocks = model.testSuites.map((ts) => detailsWrap({
|
|
282
|
-
id: ts.id,
|
|
283
|
-
summary: `${ts.id} - ${ts.title ?? 'test suite'}`,
|
|
284
|
-
className: 'doc-ts-wrap',
|
|
285
|
-
status: ts.status,
|
|
286
|
-
body: renderTestSuite(ts, {
|
|
287
|
-
raw: model.rawById.get(ts.id),
|
|
288
|
-
errors: model.errorsById.get(ts.id),
|
|
289
|
-
}),
|
|
290
|
-
})).join('\n');
|
|
291
|
-
|
|
292
|
-
const tsSection = tsBlocks
|
|
293
|
-
? `<h3 class="group-heading">Test suites</h3>${tsBlocks}`
|
|
339
|
+
const subdiagram = subdiagrams.get(req.reqId);
|
|
340
|
+
const sliceDetails = subdiagram
|
|
341
|
+
? `<details class="rcf-req-slice"><summary>Slice diagram <span class="muted small">(REQ, stories, criteria and the FBS that deliver them)</span></summary><div class="rcf-req-slice-body"><pre class="mermaid">${escapeHtml(subdiagram)}</pre></div></details>`
|
|
294
342
|
: '';
|
|
295
343
|
|
|
296
|
-
|
|
297
|
-
${
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
344
|
+
const rawJson = model.rawById.get(req.reqId) ?? JSON.stringify(req, null, 2);
|
|
345
|
+
const rawDetails = `<details class="rcf-req-raw raw-json" data-doc-id="${escapeHtml(req.reqId)}::raw"><summary class="muted small">Raw JSON</summary><pre>${escapeHtml(rawJson)}</pre></details>`;
|
|
346
|
+
|
|
347
|
+
const body = `${needsWorkLine}${description}${rationale}${tags}${storiesBlock}${sliceDetails}${rawDetails}`;
|
|
348
|
+
|
|
349
|
+
const extraClasses = ['doc-req-wrap'];
|
|
350
|
+
if (needsWork) extraClasses.push('needs-work');
|
|
351
|
+
const row = renderDocRow({
|
|
352
|
+
id: req.reqId,
|
|
353
|
+
title: req.title ?? '',
|
|
354
|
+
body,
|
|
355
|
+
meta,
|
|
356
|
+
className: extraClasses.join(' '),
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
// Attach the filter-facet data attributes to the <details> opening
|
|
360
|
+
// tag so page-init.js can hide / show rows without touching the body.
|
|
361
|
+
const dataAttrs = ` data-domain="${escapeHtml(area)}" data-priority="${escapeHtml(priority)}" data-status="${escapeHtml(status)}" data-needswork="${needsWork ? '1' : '0'}" data-text="${escapeHtml(buildFilterText(req, stories))}"`;
|
|
362
|
+
return row.replace(/^<details /, `<details${dataAttrs} `);
|
|
302
363
|
}
|
|
303
364
|
|
|
304
|
-
function
|
|
305
|
-
|
|
306
|
-
const
|
|
307
|
-
const
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
365
|
+
function renderUserStoryInnerRow(us, model) {
|
|
366
|
+
const acCount = us.acceptanceCriteria?.length ?? 0;
|
|
367
|
+
const status = normaliseFacet(us.status);
|
|
368
|
+
const metaParts = [renderBadge({ value: acCount, label: 'AC', variant: 'count', title: 'Acceptance criteria' })];
|
|
369
|
+
if (status) metaParts.push(pill({ value: status, variant: 'doc-status' }));
|
|
370
|
+
const body = renderUserStory(us, {
|
|
371
|
+
raw: model.rawById.get(us.usId),
|
|
372
|
+
errors: model.errorsById.get(us.usId),
|
|
373
|
+
fbsByAcId: model.fbsByAcId,
|
|
374
|
+
});
|
|
375
|
+
return renderDocRow({
|
|
376
|
+
id: us.usId,
|
|
377
|
+
title: us.title ?? '',
|
|
378
|
+
body,
|
|
379
|
+
meta: metaParts.join(' '),
|
|
380
|
+
className: 'doc-us-wrap rcf-row--inner',
|
|
381
|
+
});
|
|
318
382
|
}
|
|
319
383
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
// entirely in `src/view/live-client.js`, which reads state from the DOM
|
|
326
|
-
// after each SSE innerHTML swap - it does not call into this IIFE.
|
|
327
|
-
function inlineScript() {
|
|
328
|
-
return `
|
|
329
|
-
(function () {
|
|
330
|
-
var TABS = ['overview', 'requirements', 'architecture', 'build', 'product-map'];
|
|
331
|
-
var PM_GROUPS = ['shape', 'component', 'trace', 'capability', 'blueprint'];
|
|
332
|
-
var PM_STATUSES = ['all', 'draft', 'review', 'needsRevision', 'approved', 'superseded'];
|
|
333
|
-
// Partial-render cache: grouping -> HTML string. First fetch fills it,
|
|
334
|
-
// subsequent switches use the cache.
|
|
335
|
-
var pmPartialCache = {};
|
|
336
|
-
// Track whether an SSE swap has invalidated the cache since the last
|
|
337
|
-
// successful hydration - the live-client sets window.__rcfPmDirty
|
|
338
|
-
// after each swap, and we clear the cache on the next activation.
|
|
339
|
-
function pmCacheKey(group) { return group; }
|
|
340
|
-
|
|
341
|
-
function initMermaid() {
|
|
342
|
-
if (typeof window.mermaid !== 'undefined') {
|
|
343
|
-
window.mermaid.initialize({ startOnLoad: false, securityLevel: 'loose' });
|
|
344
|
-
}
|
|
384
|
+
function buildFilterText(req, stories) {
|
|
385
|
+
const parts = [req.reqId, req.title, req.description, req.rationale, req.domain, req.priority, req.status];
|
|
386
|
+
if (Array.isArray(req.tags)) parts.push(req.tags.join(' '));
|
|
387
|
+
for (const u of stories) {
|
|
388
|
+
parts.push(u.usId, u.title, u.asA, u.iWant, u.soThat);
|
|
345
389
|
}
|
|
390
|
+
return parts.filter((v) => typeof v === 'string' && v.length > 0).join(' ').toLowerCase();
|
|
391
|
+
}
|
|
346
392
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
try {
|
|
352
|
-
window.mermaid.run({ nodes: Array.prototype.slice.call(pending) });
|
|
353
|
-
} catch (e) { /* swallow */ }
|
|
354
|
-
}
|
|
393
|
+
function normaliseFacet(v) {
|
|
394
|
+
if (typeof v !== 'string') return '';
|
|
395
|
+
return v.trim();
|
|
396
|
+
}
|
|
355
397
|
|
|
356
|
-
|
|
357
|
-
|
|
398
|
+
function countBy(items, keyFn) {
|
|
399
|
+
const out = new Map();
|
|
400
|
+
for (const it of items) {
|
|
401
|
+
const k = keyFn(it);
|
|
402
|
+
if (!k) continue;
|
|
403
|
+
out.set(k, (out.get(k) ?? 0) + 1);
|
|
358
404
|
}
|
|
405
|
+
return out;
|
|
406
|
+
}
|
|
359
407
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
408
|
+
function facetOptions(counts) {
|
|
409
|
+
const entries = [...counts.entries()];
|
|
410
|
+
entries.sort((a, b) => (b[1] - a[1]) || a[0].localeCompare(b[0]));
|
|
411
|
+
return entries.map(([value, count]) => ({ value, label: `${value} (${count})` }));
|
|
412
|
+
}
|
|
363
413
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
414
|
+
/**
|
|
415
|
+
* Viewer UI refresh PR 3 (decision 4): the PRD tab replaces the 109
|
|
416
|
+
* inline requirement links with an EntitySelector. Area chips deep-link
|
|
417
|
+
* into the Requirements tab filtered by domain. The jump input picks
|
|
418
|
+
* one REQ by id or title and writes `#tab=requirements&entity=<id>`.
|
|
419
|
+
*
|
|
420
|
+
* @param {import('./tree-model.js').BuiltTreeModel} model
|
|
421
|
+
*/
|
|
422
|
+
function renderPrdRequirementSelector(model) {
|
|
423
|
+
const reqs = model.requirements ?? [];
|
|
424
|
+
if (reqs.length === 0) return '';
|
|
425
|
+
const items = reqs.map((r) => ({
|
|
426
|
+
id: r.reqId,
|
|
427
|
+
title: r.title ?? '',
|
|
428
|
+
facet: normaliseFacet(r.domain),
|
|
429
|
+
}));
|
|
430
|
+
const areaCounts = countBy(reqs, (r) => normaliseFacet(r.domain));
|
|
431
|
+
const facets = [...areaCounts.entries()]
|
|
432
|
+
.sort((a, b) => (b[1] - a[1]) || a[0].localeCompare(b[0]))
|
|
433
|
+
.map(([value, count]) => ({ value, count }));
|
|
434
|
+
const acTotal = (model.userStories ?? []).reduce((n, u) => n + (u.acceptanceCriteria?.length ?? 0), 0);
|
|
435
|
+
const totalLabel = `${reqs.length} requirements in ${facets.length} area${facets.length === 1 ? '' : 's'}, ${model.userStories.length} stories, ${acTotal} acceptance criteria`;
|
|
436
|
+
const selector = renderEntitySelector({
|
|
437
|
+
hashKey: 'requirements',
|
|
438
|
+
targetTab: 'requirements',
|
|
439
|
+
facetKey: 'domain',
|
|
440
|
+
items,
|
|
441
|
+
facets,
|
|
442
|
+
totalLabel,
|
|
443
|
+
placeholder: `Jump to a requirement by id or title (e.g. REQ-040 or 'readiness')`,
|
|
444
|
+
chipsLabel: 'By area (click to open the Requirements tab filtered):',
|
|
445
|
+
});
|
|
446
|
+
return `<section class="rcf-prd-requirements" id="prd-requirements">
|
|
447
|
+
<div class="rcf-prd-requirements-head">
|
|
448
|
+
<h3>Requirements</h3>
|
|
449
|
+
<a class="rcf-prd-requirements-open" href="#tab=requirements">Open the Requirements tab</a>
|
|
450
|
+
</div>
|
|
451
|
+
${selector}
|
|
452
|
+
</section>`;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Viewer UI refresh PR 4 (w-2026-10-02-dave-010 decisions 5 and 14,
|
|
457
|
+
* design doc section 5.5). The Architecture tab renders:
|
|
458
|
+
* 1. A compact page-head carrying the TAD id, its status pill and
|
|
459
|
+
* the TAC / ADR tallies.
|
|
460
|
+
* 2. The TAD as six collapsed sections with one-line previews; an
|
|
461
|
+
* absent section reads "Nothing written yet" and names the
|
|
462
|
+
* `rcf define update TAD-001 --set <section>.<field>="..."` call
|
|
463
|
+
* that authors it (decision 5).
|
|
464
|
+
* 3. Components (TAC) as a FilterBar + a shared DocRow list; rows
|
|
465
|
+
* carry interface and dependency counts and a status pill. Long
|
|
466
|
+
* ids are shortened on the summary; the full id stays on
|
|
467
|
+
* data-doc-id and the title.
|
|
468
|
+
* 4. Architectural decisions (ADR) as a FilterBar + a shared DocRow
|
|
469
|
+
* list; rows carry a status pill. Long ids shortened the same way.
|
|
470
|
+
*
|
|
471
|
+
* The tab never points at Readiness (amendment 12.4) - absence of
|
|
472
|
+
* content is handled inside this tab's own register.
|
|
473
|
+
*/
|
|
474
|
+
function renderArchitecturePanel(model) {
|
|
475
|
+
const pageHead = renderArchitecturePageHead(model);
|
|
476
|
+
const tadSection = model.tad
|
|
477
|
+
? renderTadSections(model.tad)
|
|
478
|
+
: renderEmptyState({
|
|
479
|
+
title: 'No TAD on disk',
|
|
480
|
+
hint: 'Add rcf/tad.json and the viewer picks it up on the next walk.',
|
|
379
481
|
});
|
|
380
|
-
return true;
|
|
381
|
-
}
|
|
382
482
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
while (cur && cur !== document.body) {
|
|
386
|
-
if (cur.getAttribute && cur.getAttribute('role') === 'tabpanel') {
|
|
387
|
-
var id = cur.id || '';
|
|
388
|
-
if (id.indexOf('tab-') === 0) return id.slice(4);
|
|
389
|
-
}
|
|
390
|
-
cur = cur.parentNode;
|
|
391
|
-
}
|
|
392
|
-
return null;
|
|
393
|
-
}
|
|
483
|
+
const tacPanel = renderComponentsPanel(model);
|
|
484
|
+
const adrPanel = renderDecisionsPanel(model);
|
|
394
485
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
}
|
|
401
|
-
cur = cur.parentNode;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
486
|
+
// Raw JSON for the whole TAD stays reachable but out of the first
|
|
487
|
+
// paint - the design doc deliberately drops "the long prose dump".
|
|
488
|
+
const rawTadDisclosure = model.tad
|
|
489
|
+
? `<details class="rcf-tad-raw" data-doc-id="${escapeHtml(model.tad.tadId)}::raw"><summary class="muted small">Raw TAD JSON</summary><pre>${escapeHtml(model.rawById.get(model.tad.tadId) ?? JSON.stringify(model.tad, null, 2))}</pre></details>`
|
|
490
|
+
: '';
|
|
404
491
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
return document.querySelector('[data-doc-id="' + id.replace(/"/g, '\\\\"') + '"]');
|
|
410
|
-
}
|
|
492
|
+
// Hidden anchors so #TAD-001 / #entity=TAD-001 still land on this tab.
|
|
493
|
+
const tadAnchor = model.tad
|
|
494
|
+
? `<span class="rcf-tad-anchor" data-doc-id="${escapeHtml(model.tad.tadId)}" aria-hidden="true"></span>`
|
|
495
|
+
: '';
|
|
411
496
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
497
|
+
return `
|
|
498
|
+
${tadAnchor}
|
|
499
|
+
${pageHead}
|
|
500
|
+
<section class="rcf-architecture-tad" aria-labelledby="arch-tad-heading">
|
|
501
|
+
<h3 id="arch-tad-heading" class="group-heading rcf-tad-group-heading">Technical architecture (TAD)</h3>
|
|
502
|
+
${tadSection}
|
|
503
|
+
${rawTadDisclosure}
|
|
504
|
+
</section>
|
|
505
|
+
${tacPanel}
|
|
506
|
+
${adrPanel}
|
|
507
|
+
`;
|
|
508
|
+
}
|
|
425
509
|
|
|
426
|
-
|
|
427
|
-
|
|
510
|
+
function renderArchitecturePageHead(model) {
|
|
511
|
+
if (!model.tad) {
|
|
512
|
+
return `<div class="rcf-architecture-head"><h3 class="rcf-architecture-head-title">Architecture</h3></div>`;
|
|
428
513
|
}
|
|
514
|
+
const status = normaliseFacet(model.tad.status);
|
|
515
|
+
const statusPill = status ? pill({ value: status, variant: 'doc-status' }) : '';
|
|
516
|
+
const tacCount = (model.tacs ?? []).length;
|
|
517
|
+
const adrCount = (model.adrs ?? []).length;
|
|
518
|
+
return `<div class="rcf-architecture-head">
|
|
519
|
+
<span class="rcf-architecture-head-id mono">${escapeHtml(model.tad.tadId)}</span>
|
|
520
|
+
${statusPill}
|
|
521
|
+
<span class="muted small">${tacCount} component${tacCount === 1 ? '' : 's'} - ${adrCount} decision${adrCount === 1 ? '' : 's'}</span>
|
|
522
|
+
</div>`;
|
|
523
|
+
}
|
|
429
524
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
// Show a lightweight loading state.
|
|
452
|
-
panel.setAttribute('data-pm-loading', 'true');
|
|
453
|
-
var xhr = new XMLHttpRequest();
|
|
454
|
-
xhr.open('GET', '/product-map/' + name, true);
|
|
455
|
-
xhr.onreadystatechange = function () {
|
|
456
|
-
if (xhr.readyState !== 4) return;
|
|
457
|
-
panel.removeAttribute('data-pm-loading');
|
|
458
|
-
if (xhr.status >= 200 && xhr.status < 300) {
|
|
459
|
-
pmPartialCache[pmCacheKey(name)] = xhr.responseText;
|
|
460
|
-
panel.innerHTML = headingHtml + xhr.responseText;
|
|
461
|
-
panel.removeAttribute('data-pm-lazy');
|
|
462
|
-
wireProductMapWithin(panel);
|
|
463
|
-
if (cb) cb(true);
|
|
464
|
-
} else {
|
|
465
|
-
panel.setAttribute('data-pm-lazy', 'true');
|
|
466
|
-
if (cb) cb(false);
|
|
467
|
-
}
|
|
468
|
-
};
|
|
469
|
-
xhr.send();
|
|
470
|
-
}
|
|
525
|
+
function renderComponentsPanel(model) {
|
|
526
|
+
const tacs = model.tacs ?? [];
|
|
527
|
+
const statusCounts = countBy(tacs, (t) => normaliseFacet(t.status));
|
|
528
|
+
const filterBar = renderFilterBar({
|
|
529
|
+
hashKey: 'architecture-components',
|
|
530
|
+
placeholder: 'Filter components by id or text',
|
|
531
|
+
selects: [
|
|
532
|
+
{
|
|
533
|
+
key: 'status',
|
|
534
|
+
label: 'Status',
|
|
535
|
+
options: [{ value: '', label: 'Any status' }, ...facetOptions(statusCounts)],
|
|
536
|
+
},
|
|
537
|
+
],
|
|
538
|
+
count: { visible: tacs.length, total: tacs.length },
|
|
539
|
+
showExpandAll: true,
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
const rows = tacs.map((t) => renderTacRow(t, model)).join('\n');
|
|
543
|
+
const emptyMessage = tacs.length === 0
|
|
544
|
+
? renderEmptyState({ title: 'No TAC components on disk', hint: 'Add rcf/tacs/<file>.json files and the viewer picks them up.' })
|
|
545
|
+
: '';
|
|
471
546
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
for (var j = 0; j < panels.length; j += 1) {
|
|
482
|
-
var p = panels[j];
|
|
483
|
-
if (p.getAttribute('data-pm-group') === name) {
|
|
484
|
-
p.removeAttribute('hidden');
|
|
485
|
-
} else {
|
|
486
|
-
p.setAttribute('hidden', '');
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
var target = pmGroupPanel(name);
|
|
490
|
-
if (target && target.getAttribute('data-pm-lazy') === 'true') {
|
|
491
|
-
hydrateLazyGroup(name, function () {
|
|
492
|
-
if (opts && opts.after) opts.after();
|
|
493
|
-
applyPmStatusFilter(currentStatus());
|
|
494
|
-
});
|
|
495
|
-
} else {
|
|
496
|
-
if (opts && opts.after) opts.after();
|
|
497
|
-
applyPmStatusFilter(currentStatus());
|
|
498
|
-
}
|
|
499
|
-
return true;
|
|
500
|
-
}
|
|
547
|
+
return `<section class="rcf-architecture-components" aria-labelledby="arch-tac-heading">
|
|
548
|
+
<h3 id="arch-tac-heading" class="group-heading">Components</h3>
|
|
549
|
+
${filterBar}
|
|
550
|
+
<div class="rcf-tac-list" data-rcf-list="architecture-components">
|
|
551
|
+
${rows}
|
|
552
|
+
</div>
|
|
553
|
+
${emptyMessage}
|
|
554
|
+
</section>`;
|
|
555
|
+
}
|
|
501
556
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
557
|
+
function renderDecisionsPanel(model) {
|
|
558
|
+
const adrs = model.adrs ?? [];
|
|
559
|
+
const statusCounts = countBy(adrs, (a) => normaliseFacet(a.status));
|
|
560
|
+
const filterBar = renderFilterBar({
|
|
561
|
+
hashKey: 'architecture-decisions',
|
|
562
|
+
placeholder: 'Filter decisions by id or text',
|
|
563
|
+
selects: [
|
|
564
|
+
{
|
|
565
|
+
key: 'status',
|
|
566
|
+
label: 'Status',
|
|
567
|
+
options: [{ value: '', label: 'Any status' }, ...facetOptions(statusCounts)],
|
|
568
|
+
},
|
|
569
|
+
],
|
|
570
|
+
count: { visible: adrs.length, total: adrs.length },
|
|
571
|
+
showExpandAll: true,
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
const rows = adrs.map((a) => renderAdrRow(a, model)).join('\n');
|
|
575
|
+
const emptyMessage = adrs.length === 0
|
|
576
|
+
? renderEmptyState({ title: 'No architectural decisions on disk', hint: 'Add rcf/adrs/<file>.json files and the viewer picks them up.' })
|
|
577
|
+
: '';
|
|
506
578
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
579
|
+
return `<section class="rcf-architecture-decisions" aria-labelledby="arch-adr-heading">
|
|
580
|
+
<h3 id="arch-adr-heading" class="group-heading">Architectural decisions</h3>
|
|
581
|
+
${filterBar}
|
|
582
|
+
<div class="rcf-adr-list" data-rcf-list="architecture-decisions">
|
|
583
|
+
${rows}
|
|
584
|
+
</div>
|
|
585
|
+
${emptyMessage}
|
|
586
|
+
</section>`;
|
|
587
|
+
}
|
|
511
588
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
}
|
|
589
|
+
function renderTacRow(tac, model) {
|
|
590
|
+
const id = tac.tacId ?? 'TAC';
|
|
591
|
+
const displayId = shortenDocId(id);
|
|
592
|
+
const title = tac.name ?? '';
|
|
593
|
+
const interfaceCount = Array.isArray(tac.interfaces) ? tac.interfaces.length : 0;
|
|
594
|
+
const depCount = Array.isArray(tac.dependencies) ? tac.dependencies.length : 0;
|
|
595
|
+
const status = normaliseFacet(tac.status);
|
|
596
|
+
const metaParts = [
|
|
597
|
+
renderBadge({ value: interfaceCount, label: 'interfaces', variant: 'count', title: 'Interface count' }),
|
|
598
|
+
renderBadge({ value: depCount, label: 'deps', variant: 'count', title: 'Dependency count' }),
|
|
599
|
+
];
|
|
600
|
+
if (status) metaParts.push(pill({ value: status, variant: 'doc-status' }));
|
|
601
|
+
const meta = metaParts.join(' ');
|
|
602
|
+
|
|
603
|
+
const body = renderTac(tac, {
|
|
604
|
+
raw: model.rawById.get(id),
|
|
605
|
+
errors: model.errorsById.get(id),
|
|
606
|
+
});
|
|
607
|
+
const row = renderDocRow({
|
|
608
|
+
id: displayId,
|
|
609
|
+
title,
|
|
610
|
+
body,
|
|
611
|
+
meta,
|
|
612
|
+
className: 'doc-tac-wrap rcf-arch-row',
|
|
613
|
+
dataDocId: id,
|
|
614
|
+
});
|
|
615
|
+
const dataAttrs = ` data-status="${escapeHtml(status)}" data-text="${escapeHtml(buildTacFilterText(tac))}" title="${escapeHtml(id)}"`;
|
|
616
|
+
return row.replace(/^<details /, `<details${dataAttrs} `);
|
|
617
|
+
}
|
|
524
618
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
var body = bk.querySelector('.pm-bucket-body');
|
|
550
|
-
var emptyNote = body ? body.querySelector('.pm-bucket-empty-filter') : null;
|
|
551
|
-
if (isEmpty && status !== 'all') {
|
|
552
|
-
if (body && !emptyNote) {
|
|
553
|
-
emptyNote = document.createElement('p');
|
|
554
|
-
emptyNote.className = 'pm-bucket-empty pm-bucket-empty-filter';
|
|
555
|
-
emptyNote.innerHTML = '<em>0 requirements match this filter.</em>';
|
|
556
|
-
body.appendChild(emptyNote);
|
|
557
|
-
}
|
|
558
|
-
bk.setAttribute('data-pm-empty-under-filter', 'true');
|
|
559
|
-
emptyCount += 1;
|
|
560
|
-
} else {
|
|
561
|
-
if (emptyNote) emptyNote.parentNode.removeChild(emptyNote);
|
|
562
|
-
bk.removeAttribute('data-pm-empty-under-filter');
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
// Update the rollup summary.
|
|
566
|
-
var activePanel = document.querySelector('#tab-product-map .pm-group:not([hidden])');
|
|
567
|
-
if (activePanel) {
|
|
568
|
-
var roll = activePanel.querySelector('.pm-empty-roll');
|
|
569
|
-
if (roll) {
|
|
570
|
-
var showBtn = roll.querySelector('.pm-empty-count');
|
|
571
|
-
if (emptyCount > 0 && status !== 'all') {
|
|
572
|
-
if (showBtn) showBtn.textContent = String(emptyCount);
|
|
573
|
-
roll.removeAttribute('hidden');
|
|
574
|
-
activePanel.classList.add('pm-hide-empty');
|
|
575
|
-
} else {
|
|
576
|
-
roll.setAttribute('hidden', '');
|
|
577
|
-
activePanel.classList.remove('pm-hide-empty');
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
return true;
|
|
582
|
-
}
|
|
619
|
+
function renderAdrRow(adr, model) {
|
|
620
|
+
const id = adr.adrId ?? 'ADR';
|
|
621
|
+
const displayId = shortenDocId(id);
|
|
622
|
+
const title = adr.title ?? '';
|
|
623
|
+
const status = normaliseFacet(adr.status);
|
|
624
|
+
const metaParts = [];
|
|
625
|
+
if (status) metaParts.push(pill({ value: status, variant: 'doc-status' }));
|
|
626
|
+
const meta = metaParts.join(' ');
|
|
627
|
+
|
|
628
|
+
const body = renderAdr(adr, {
|
|
629
|
+
raw: model.rawById.get(id),
|
|
630
|
+
errors: model.errorsById.get(id),
|
|
631
|
+
});
|
|
632
|
+
const row = renderDocRow({
|
|
633
|
+
id: displayId,
|
|
634
|
+
title,
|
|
635
|
+
body,
|
|
636
|
+
meta,
|
|
637
|
+
className: 'doc-adr-wrap rcf-arch-row',
|
|
638
|
+
dataDocId: id,
|
|
639
|
+
});
|
|
640
|
+
const dataAttrs = ` data-status="${escapeHtml(status)}" data-text="${escapeHtml(buildAdrFilterText(adr))}" title="${escapeHtml(id)}"`;
|
|
641
|
+
return row.replace(/^<details /, `<details${dataAttrs} `);
|
|
642
|
+
}
|
|
583
643
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
var next = '#tab=product-map&group=' + group + '&status=' + status;
|
|
590
|
-
if (open.length > 0) next += '&open=' + encodeURIComponent(open.join(','));
|
|
591
|
-
if (window.location.hash === next) return;
|
|
592
|
-
window.history.pushState(null, '', next);
|
|
644
|
+
function buildTacFilterText(tac) {
|
|
645
|
+
const parts = [tac.tacId, tac.name, tac.purpose, tac.internalStructure, tac.notes, tac.tradeoffs];
|
|
646
|
+
if (Array.isArray(tac.responsibilities)) parts.push(tac.responsibilities.join(' '));
|
|
647
|
+
if (Array.isArray(tac.interfaces)) {
|
|
648
|
+
for (const i of tac.interfaces) parts.push(i?.name, i?.description);
|
|
593
649
|
}
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
if (!ids || ids.length === 0) return;
|
|
597
|
-
var group = currentGroup();
|
|
598
|
-
var panel = pmGroupPanel(group);
|
|
599
|
-
if (!panel) return;
|
|
600
|
-
for (var i = 0; i < ids.length; i += 1) {
|
|
601
|
-
var raw = ids[i];
|
|
602
|
-
if (!raw) continue;
|
|
603
|
-
var node = panel.querySelector('details.pm-bucket[data-pm-bucket-id="' + raw.replace(/"/g, '\\"') + '"]');
|
|
604
|
-
if (node) node.open = true;
|
|
605
|
-
}
|
|
650
|
+
if (Array.isArray(tac.dependencies)) {
|
|
651
|
+
for (const d of tac.dependencies) parts.push(d?.name, d?.description);
|
|
606
652
|
}
|
|
653
|
+
return parts.filter((v) => typeof v === 'string' && v.length > 0).join(' ').toLowerCase();
|
|
654
|
+
}
|
|
607
655
|
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
// scripting; guard against feedback via a dirty flag.
|
|
613
|
-
var buckets = root.querySelectorAll('details.pm-bucket');
|
|
614
|
-
for (var i = 0; i < buckets.length; i += 1) {
|
|
615
|
-
var bk = buckets[i];
|
|
616
|
-
if (bk.__rcfPmBucketWired) continue;
|
|
617
|
-
bk.__rcfPmBucketWired = true;
|
|
618
|
-
bk.addEventListener('toggle', function () {
|
|
619
|
-
if (window.__rcfPmSuppress) return;
|
|
620
|
-
updatePmHash();
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
// Jump chip -> open bucket + scroll.
|
|
624
|
-
var chips = root.querySelectorAll('.pm-jump-chip');
|
|
625
|
-
for (var j = 0; j < chips.length; j += 1) {
|
|
626
|
-
var chip = chips[j];
|
|
627
|
-
if (chip.__rcfPmChipWired) continue;
|
|
628
|
-
chip.__rcfPmChipWired = true;
|
|
629
|
-
chip.addEventListener('click', function (ev) {
|
|
630
|
-
var target = ev.currentTarget.getAttribute('data-pm-jump');
|
|
631
|
-
var groupAttr = ev.currentTarget.closest('.pm-jump-nav').getAttribute('data-pm-jump-group');
|
|
632
|
-
var panel = pmGroupPanel(groupAttr);
|
|
633
|
-
if (!panel) return;
|
|
634
|
-
var node = panel.querySelector('details.pm-bucket[data-pm-bucket-id="' + target.replace(/"/g, '\\"') + '"]');
|
|
635
|
-
if (!node) return;
|
|
636
|
-
node.open = true;
|
|
637
|
-
try { node.scrollIntoView({ block: 'start' }); } catch (e) { node.scrollIntoView(); }
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
// Bulk expand/collapse.
|
|
641
|
-
var bulk = root.querySelectorAll('.pm-bulk-btn');
|
|
642
|
-
for (var b = 0; b < bulk.length; b += 1) {
|
|
643
|
-
var btn = bulk[b];
|
|
644
|
-
if (btn.__rcfPmBulkWired) continue;
|
|
645
|
-
btn.__rcfPmBulkWired = true;
|
|
646
|
-
btn.addEventListener('click', function (ev) {
|
|
647
|
-
var action = ev.currentTarget.getAttribute('data-pm-bulk');
|
|
648
|
-
var panel = document.querySelector('#tab-product-map .pm-group:not([hidden])');
|
|
649
|
-
if (!panel) return;
|
|
650
|
-
var all = panel.querySelectorAll('details.pm-bucket');
|
|
651
|
-
window.__rcfPmSuppress = true;
|
|
652
|
-
for (var i = 0; i < all.length; i += 1) all[i].open = (action === 'expand');
|
|
653
|
-
window.__rcfPmSuppress = false;
|
|
654
|
-
updatePmHash();
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
// Empty-roll toggle: reveals hidden empty buckets under the filter.
|
|
658
|
-
var rolls = root.querySelectorAll('.pm-empty-toggle');
|
|
659
|
-
for (var r = 0; r < rolls.length; r += 1) {
|
|
660
|
-
var rt = rolls[r];
|
|
661
|
-
if (rt.__rcfPmEmptyWired) continue;
|
|
662
|
-
rt.__rcfPmEmptyWired = true;
|
|
663
|
-
rt.addEventListener('click', function (ev) {
|
|
664
|
-
var panel = ev.currentTarget.closest('.pm-group');
|
|
665
|
-
if (!panel) return;
|
|
666
|
-
if (panel.classList.contains('pm-hide-empty')) {
|
|
667
|
-
panel.classList.remove('pm-hide-empty');
|
|
668
|
-
ev.currentTarget.textContent = 'Hide empty buckets';
|
|
669
|
-
} else {
|
|
670
|
-
panel.classList.add('pm-hide-empty');
|
|
671
|
-
var span = document.createElement('span');
|
|
672
|
-
span.className = 'pm-empty-count';
|
|
673
|
-
span.textContent = String(panel.querySelectorAll('details.pm-bucket[data-pm-empty-under-filter="true"]').length);
|
|
674
|
-
ev.currentTarget.textContent = '';
|
|
675
|
-
ev.currentTarget.appendChild(document.createTextNode('Show '));
|
|
676
|
-
ev.currentTarget.appendChild(span);
|
|
677
|
-
ev.currentTarget.appendChild(document.createTextNode(' empty buckets'));
|
|
678
|
-
}
|
|
679
|
-
});
|
|
680
|
-
}
|
|
656
|
+
function buildAdrFilterText(adr) {
|
|
657
|
+
const parts = [adr.adrId, adr.title, adr.status, adr.context, adr.decision, adr.consequences];
|
|
658
|
+
if (Array.isArray(adr.alternativesConsidered)) {
|
|
659
|
+
for (const a of adr.alternativesConsidered) parts.push(a?.name, a?.summary, a?.reasonNotChosen);
|
|
681
660
|
}
|
|
661
|
+
return parts.filter((v) => typeof v === 'string' && v.length > 0).join(' ').toLowerCase();
|
|
662
|
+
}
|
|
682
663
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
664
|
+
/**
|
|
665
|
+
* Viewer UI refresh PR 5 (w-2026-10-02-dave-010 decisions 2, 3, 6, 12,
|
|
666
|
+
* 14; design doc section 5.6). The Build tab renders:
|
|
667
|
+
*
|
|
668
|
+
* 1. BuildStats card: totals from `computeQueue` (items, verified,
|
|
669
|
+
* complete, inProgress, notStarted, buildable now). "Buildable now"
|
|
670
|
+
* equals `queue.totals.actionable` - the authoritative state the
|
|
671
|
+
* queue computes from `dependsOnFbsIds` and `executionStatus`.
|
|
672
|
+
* 2. SubTabStrip Specs | DAG (decision 6 + decision 12). The DAG
|
|
673
|
+
* sub-panel (PR 6) lays FBS by `dependsOnFbsIds` depth with
|
|
674
|
+
* click-to-highlight closure, an inspector and the unconnected
|
|
675
|
+
* lane; `renderBuildDag` emits the full panel HTML string from
|
|
676
|
+
* `buildDagLayout(fbsItems, buildableIds)`.
|
|
677
|
+
* 3. Specs sub-tab: FilterBar (text, status, area, size, Buildable-now
|
|
678
|
+
* toggle) over a shared DocRow list; row meta carries order, AC
|
|
679
|
+
* count, deps count, size, buildable pill, status.
|
|
680
|
+
* 4. Expanded Spec row body: summary, approach, AC and dep links,
|
|
681
|
+
* deliverables, context links, Show in the DAG.
|
|
682
|
+
*
|
|
683
|
+
* Dropped from the old Build sequence tab: the FBS slots block (the
|
|
684
|
+
* 87-row list was repetition of the specs below) and the Test suites
|
|
685
|
+
* section (suites stay reachable through AC links and PR 7's ID
|
|
686
|
+
* lookup).
|
|
687
|
+
*
|
|
688
|
+
* @param {import('./tree-model.js').BuiltTreeModel} model
|
|
689
|
+
*/
|
|
690
|
+
function renderBuildPanel(model) {
|
|
691
|
+
const fbsItems = Array.isArray(model.fbsItems) ? model.fbsItems : [];
|
|
692
|
+
if (fbsItems.length === 0 && !model.bs) {
|
|
693
|
+
return renderEmptyState({
|
|
694
|
+
title: 'No build specifications on disk',
|
|
695
|
+
hint: 'Add rcf/fbs/<file>.json entries and the viewer picks them up on the next walk.',
|
|
696
|
+
});
|
|
702
697
|
}
|
|
698
|
+
const queue = computeQueue({ fbsItems });
|
|
699
|
+
const buildableIds = new Set(
|
|
700
|
+
queue.items.filter((i) => i.state === 'actionable').map((i) => i.fbsId),
|
|
701
|
+
);
|
|
702
|
+
const stats = {
|
|
703
|
+
items: queue.totals.items,
|
|
704
|
+
verified: queue.totals.verified,
|
|
705
|
+
complete: queue.totals.complete,
|
|
706
|
+
inProgress: queue.totals.inProgress,
|
|
707
|
+
notStarted: queue.totals.notStarted,
|
|
708
|
+
buildableNow: queue.totals.actionable,
|
|
709
|
+
};
|
|
710
|
+
const buildStats = renderBuildStats(stats);
|
|
711
|
+
const pageHead = renderBuildPageHead(model.bs);
|
|
712
|
+
|
|
713
|
+
const subTabs = renderSubTabStrip({
|
|
714
|
+
hashKey: 'build',
|
|
715
|
+
items: [
|
|
716
|
+
{ key: 'specs', label: 'Specs', controls: 'build-sub-specs' },
|
|
717
|
+
{ key: 'dag', label: 'DAG', controls: 'build-sub-dag' },
|
|
718
|
+
],
|
|
719
|
+
});
|
|
720
|
+
|
|
721
|
+
const specsPanel = renderBuildSpecsPanel(model, fbsItems, buildableIds);
|
|
722
|
+
const dagLayout = buildDagLayout(fbsItems, buildableIds);
|
|
723
|
+
const dagPanel = renderBuildDag({ layout: dagLayout, inspectorPayload: buildDagInspectorPayload(dagLayout) });
|
|
724
|
+
// Hidden anchor so #BS-001 / #entity=BS-001 still resolve to this tab.
|
|
725
|
+
const bsAnchor = model.bs
|
|
726
|
+
? `<span class="rcf-build-anchor" data-doc-id="${escapeHtml(model.bs.bsId)}" aria-hidden="true"></span>`
|
|
727
|
+
: '';
|
|
703
728
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
var openIds = params.open ? decodeURIComponent(params.open).split(',').filter(Boolean) : [];
|
|
716
|
-
activatePmGroup(params.group || 'shape', {
|
|
717
|
-
after: function () {
|
|
718
|
-
if (params.status) applyPmStatusFilter(params.status);
|
|
719
|
-
openPmBuckets(openIds);
|
|
720
|
-
},
|
|
721
|
-
});
|
|
722
|
-
}
|
|
723
|
-
return;
|
|
724
|
-
}
|
|
725
|
-
var target = findByDocId(raw);
|
|
726
|
-
if (!target) { activateTab('overview'); return; }
|
|
727
|
-
var tab = tabForNode(target);
|
|
728
|
-
if (tab) activateTab(tab);
|
|
729
|
-
openAncestorDetails(target);
|
|
730
|
-
if (target.tagName && target.tagName.toLowerCase() === 'details') target.open = true;
|
|
731
|
-
try { target.scrollIntoView({ block: 'start' }); } catch (e) { target.scrollIntoView(); }
|
|
732
|
-
}
|
|
729
|
+
return `${bsAnchor}
|
|
730
|
+
${pageHead}
|
|
731
|
+
${buildStats}
|
|
732
|
+
${subTabs}
|
|
733
|
+
<section id="build-sub-specs" class="rcf-build-subpanel" data-rcf-subpanel="specs">
|
|
734
|
+
${specsPanel}
|
|
735
|
+
</section>
|
|
736
|
+
<section id="build-sub-dag" class="rcf-build-subpanel" data-rcf-subpanel="dag" hidden>
|
|
737
|
+
${dagPanel}
|
|
738
|
+
</section>`;
|
|
739
|
+
}
|
|
733
740
|
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
741
|
+
function renderBuildSpecsPanel(model, fbsItems, buildableIds) {
|
|
742
|
+
const sorted = [...fbsItems].sort((a, b) => (a.buildOrder ?? 0) - (b.buildOrder ?? 0));
|
|
743
|
+
const statusCounts = countBy(sorted, (f) => normaliseFacet(f.executionStatus));
|
|
744
|
+
const areaCounts = countBy(sorted, (f) => normaliseFacet(f.domain));
|
|
745
|
+
const sizeCounts = countBy(sorted, (f) => normaliseFacet(f.estimatedSize));
|
|
746
|
+
|
|
747
|
+
const filterBar = renderFilterBar({
|
|
748
|
+
hashKey: 'build-specs',
|
|
749
|
+
placeholder: 'Filter specs by id or title',
|
|
750
|
+
selects: [
|
|
751
|
+
{
|
|
752
|
+
key: 'status',
|
|
753
|
+
label: 'Status',
|
|
754
|
+
options: [{ value: '', label: 'Any status' }, ...facetOptions(statusCounts)],
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
key: 'domain',
|
|
758
|
+
label: 'Area',
|
|
759
|
+
options: [{ value: '', label: 'All areas' }, ...facetOptions(areaCounts)],
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
key: 'size',
|
|
763
|
+
label: 'Size',
|
|
764
|
+
options: [{ value: '', label: 'Any size' }, ...facetOptions(sizeCounts)],
|
|
765
|
+
},
|
|
766
|
+
],
|
|
767
|
+
toggles: [
|
|
768
|
+
{ key: 'buildable', label: `Buildable now (${buildableIds.size})` },
|
|
769
|
+
],
|
|
770
|
+
count: { visible: sorted.length, total: sorted.length },
|
|
771
|
+
showExpandAll: true,
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
const rows = sorted.map((f) => renderSpecRow(f, model, buildableIds)).join('\n');
|
|
775
|
+
return `${filterBar}
|
|
776
|
+
<div class="rcf-build-specs-list" data-rcf-list="build-specs">
|
|
777
|
+
${rows}
|
|
778
|
+
</div>`;
|
|
779
|
+
}
|
|
748
780
|
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
781
|
+
function renderSpecRow(fbs, model, buildableIds) {
|
|
782
|
+
const id = fbs.fbsId ?? 'FBS';
|
|
783
|
+
const title = fbs.title ?? '';
|
|
784
|
+
const order = typeof fbs.buildOrder === 'number' ? fbs.buildOrder : '';
|
|
785
|
+
const acCount = Array.isArray(fbs.acIds) ? fbs.acIds.length : 0;
|
|
786
|
+
const depCount = Array.isArray(fbs.dependsOnFbsIds) ? fbs.dependsOnFbsIds.length : 0;
|
|
787
|
+
const depTitle = Array.isArray(fbs.dependsOnFbsIds) ? fbs.dependsOnFbsIds.join(', ') : '';
|
|
788
|
+
const area = normaliseFacet(fbs.domain);
|
|
789
|
+
const size = normaliseFacet(fbs.estimatedSize);
|
|
790
|
+
const status = normaliseFacet(fbs.executionStatus);
|
|
791
|
+
const buildable = buildableIds.has(id);
|
|
792
|
+
|
|
793
|
+
const metaParts = [];
|
|
794
|
+
if (area) metaParts.push(renderBadge({ value: area, variant: 'facet', title: 'Area' }));
|
|
795
|
+
metaParts.push(renderBadge({ value: acCount, label: 'AC', variant: 'count', title: 'Acceptance criteria' }));
|
|
796
|
+
if (depCount > 0) {
|
|
797
|
+
metaParts.push(renderBadge({ value: depCount, label: 'deps', variant: 'count', title: depTitle || 'Dependency count' }));
|
|
755
798
|
}
|
|
799
|
+
if (size) metaParts.push(renderBadge({ value: size, variant: 'facet', title: 'Estimated size' }));
|
|
800
|
+
if (buildable) metaParts.push(pill({ value: 'buildable', variant: 'build-queue', title: 'No unmet dependencies' }));
|
|
801
|
+
if (status) metaParts.push(pill({ value: status, variant: 'doc-status' }));
|
|
802
|
+
const meta = metaParts.join(' ');
|
|
803
|
+
|
|
804
|
+
const idPrefix = order !== '' ? `<span class="rcf-spec-order mono muted small" title="Build order">${escapeHtml(String(order))}</span>` : '';
|
|
805
|
+
const displayIdHtml = `${idPrefix}<span class="rcf-spec-id mono">${escapeHtml(id)}</span>`;
|
|
806
|
+
|
|
807
|
+
const body = renderSpecBody(fbs, model, model.rawById?.get(id));
|
|
808
|
+
// DocRow HTML-escapes the id arg; a sentinel string lets us swap in
|
|
809
|
+
// live markup (order chip beside the mono id) after the row renders.
|
|
810
|
+
const sentinel = '__RCF_SPEC_ID__';
|
|
811
|
+
const row = renderDocRow({
|
|
812
|
+
id: sentinel,
|
|
813
|
+
title,
|
|
814
|
+
body,
|
|
815
|
+
meta,
|
|
816
|
+
className: 'doc-fbs-wrap rcf-build-row',
|
|
817
|
+
dataDocId: id,
|
|
818
|
+
});
|
|
819
|
+
const dataAttrs = ` data-status="${escapeHtml(status)}" data-domain="${escapeHtml(area)}" data-size="${escapeHtml(size)}" data-buildable="${buildable ? '1' : '0'}" data-text="${escapeHtml(buildSpecFilterText(fbs))}" title="${escapeHtml(id)}"`;
|
|
820
|
+
return row
|
|
821
|
+
.replace(/^<details /, `<details${dataAttrs} `)
|
|
822
|
+
.replace(sentinel, displayIdHtml);
|
|
823
|
+
}
|
|
756
824
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
hashchangeWired = true;
|
|
765
|
-
window.addEventListener('hashchange', function () {
|
|
766
|
-
resolveHash(window.location.hash);
|
|
767
|
-
});
|
|
768
|
-
}
|
|
769
|
-
}
|
|
825
|
+
function buildSpecFilterText(fbs) {
|
|
826
|
+
const parts = [fbs.fbsId, fbs.title, fbs.summary, fbs.approach, fbs.domain, fbs.estimatedSize, fbs.executionStatus];
|
|
827
|
+
if (Array.isArray(fbs.deliverables)) parts.push(fbs.deliverables.join(' '));
|
|
828
|
+
if (Array.isArray(fbs.acIds)) parts.push(fbs.acIds.join(' '));
|
|
829
|
+
if (Array.isArray(fbs.dependsOnFbsIds)) parts.push(fbs.dependsOnFbsIds.join(' '));
|
|
830
|
+
return parts.filter((v) => typeof v === 'string' && v.length > 0).join(' ').toLowerCase();
|
|
831
|
+
}
|
|
770
832
|
|
|
771
|
-
|
|
772
|
-
|
|
833
|
+
/**
|
|
834
|
+
* Viewer UI refresh PR 2 (shell polish, Baz 2026-10-02; decision 17):
|
|
835
|
+
* the one-bar header carries the project name only. The project name
|
|
836
|
+
* is sourced from `manifest.projectName`, then `prd.productName`,
|
|
837
|
+
* then `prd.productTitle` (the PRD title the brief names). Decision 17
|
|
838
|
+
* is explicit: project name prominent after the icon mark, tool name
|
|
839
|
+
* out of the bar, no technology chip. When the tree exposes no
|
|
840
|
+
* project name, the whole product block collapses and the brand icon
|
|
841
|
+
* stands on its own (silent empty state; CSS `.product:empty { display:none; }`).
|
|
842
|
+
*
|
|
843
|
+
* @param {import('./tree-model.js').BuiltTreeModel} model
|
|
844
|
+
* @returns {{ projectName: string | null }}
|
|
845
|
+
*/
|
|
846
|
+
export function resolveProductHeader(model) {
|
|
847
|
+
const projectName = model.manifest?.projectName
|
|
848
|
+
?? model.prd?.productName
|
|
849
|
+
?? model.prd?.productTitle
|
|
850
|
+
?? null;
|
|
851
|
+
return { projectName };
|
|
852
|
+
}
|
|
773
853
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
854
|
+
function renderProductBlock(header) {
|
|
855
|
+
if (!header.projectName) {
|
|
856
|
+
// No project name: collapse. The empty .product block is hidden
|
|
857
|
+
// by CSS so the brand icon stands on its own and PR 2's silent
|
|
858
|
+
// empty state (brief) survives screen-reader output too.
|
|
859
|
+
return '<div class="product"></div>';
|
|
778
860
|
}
|
|
779
|
-
|
|
780
|
-
|
|
861
|
+
return `<div class="product"><span class="name">${escapeHtml(header.projectName)}</span>
|
|
862
|
+
<span class="sub">review surface</span></div>`;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
function renderErrorBanner(errors) {
|
|
866
|
+
if (!errors || errors.length === 0) return '';
|
|
867
|
+
const count = errors.length;
|
|
868
|
+
const noun = count === 1 ? 'error' : 'errors';
|
|
869
|
+
const items = errors.slice(0, 20).map((e) => {
|
|
870
|
+
const label = e.documentId ? `${e.documentId}` : e.filePath ?? '';
|
|
871
|
+
return `<li><strong>${escapeHtml(e.kind)}</strong> ${escapeHtml(label)} - ${escapeHtml(e.message)}</li>`;
|
|
872
|
+
}).join('');
|
|
873
|
+
const more = count > 20 ? `<p><em>... and ${count - 20} more</em></p>` : '';
|
|
874
|
+
return `<aside class="tree-errors" role="alert">
|
|
875
|
+
<h2>Tree has ${count} ${noun}</h2>
|
|
876
|
+
<ul>${items}</ul>
|
|
877
|
+
${more}
|
|
878
|
+
</aside>`;
|
|
781
879
|
}
|