rcf-lite 0.27.0 → 0.28.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 +23 -0
- package/README.md +10 -0
- package/bin/rcf.js +2 -0
- package/blueprints/application-account-settings/CHANGELOG.md +35 -6
- package/blueprints/application-account-settings/README.md +1 -1
- package/blueprints/application-account-settings/blueprint.json +4 -2
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
- package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
- package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
- package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
- package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
- package/blueprints/application-admin-console/CHANGELOG.md +32 -6
- package/blueprints/application-admin-console/README.md +1 -1
- package/blueprints/application-admin-console/blueprint.json +4 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +1 -1
- package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
- package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
- package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
- package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
- package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
- package/blueprints/application-api-rest/CHANGELOG.md +16 -8
- package/blueprints/application-api-rest/README.md +3 -3
- package/blueprints/application-api-rest/blueprint.json +3 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +1 -1
- package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
- package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
- package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
- package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
- package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-charts/CHANGELOG.md +35 -9
- package/blueprints/application-charts/README.md +6 -6
- package/blueprints/application-charts/blueprint.json +5 -3
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +1 -1
- package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
- package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
- package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +1 -1
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +1 -1
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +5 -5
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +1 -1
- package/blueprints/application-charts/guide/application-charts.md +1 -1
- package/blueprints/application-dashboard/CHANGELOG.md +20 -10
- package/blueprints/application-dashboard/README.md +6 -6
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
- package/blueprints/application-dashboard/blueprint.json +3 -2
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +1 -1
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +1 -1
- package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
- package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +1 -1
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +1 -1
- 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-19101.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +5 -5
- package/blueprints/application-dashboard/docs/topics.md +2 -2
- package/blueprints/application-dashboard/guide/application-dashboard.md +2 -2
- package/blueprints/application-datatable/CHANGELOG.md +19 -9
- package/blueprints/application-datatable/README.md +2 -2
- package/blueprints/application-datatable/blueprint.json +3 -2
- package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
- package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
- package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
- package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +1 -1
- package/blueprints/application-datatable/docs/topics.md +1 -1
- package/blueprints/application-empty-error-states/CHANGELOG.md +33 -3
- package/blueprints/application-empty-error-states/blueprint.json +4 -2
- package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
- package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
- package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
- package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
- package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
- package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
- package/blueprints/application-error-handling/CHANGELOG.md +45 -6
- package/blueprints/application-error-handling/blueprint.json +3 -2
- package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
- package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
- package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
- package/blueprints/application-file-upload/CHANGELOG.md +28 -6
- package/blueprints/application-file-upload/README.md +1 -1
- package/blueprints/application-file-upload/blueprint.json +3 -2
- package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
- package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
- package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
- package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
- 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/probe-packs/application-file-upload.pack.mjs +1 -1
- package/blueprints/application-forms-wizard/CHANGELOG.md +20 -6
- package/blueprints/application-forms-wizard/README.md +2 -2
- package/blueprints/application-forms-wizard/blueprint.json +3 -2
- package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
- package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
- package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
- 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/probe-packs/application-forms-wizard.pack.mjs +1 -1
- package/blueprints/application-notifications-in-app/CHANGELOG.md +38 -5
- package/blueprints/application-notifications-in-app/README.md +4 -4
- package/blueprints/application-notifications-in-app/blueprint.json +4 -2
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
- package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
- package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +1 -1
- 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 +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +1 -1
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +3 -3
- package/blueprints/application-onboarding-tour/CHANGELOG.md +31 -5
- package/blueprints/application-onboarding-tour/README.md +1 -1
- package/blueprints/application-onboarding-tour/blueprint.json +5 -3
- package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
- package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
- package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
- package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
- package/blueprints/application-spa/CHANGELOG.md +20 -11
- package/blueprints/application-spa/README.md +9 -10
- package/blueprints/application-spa/blueprint.json +3 -2
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
- package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
- package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +31 -11
- package/blueprints/delivery-ci-workflows/README.md +3 -3
- package/blueprints/delivery-ci-workflows/blueprint.json +3 -2
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
- package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +4 -4
- package/blueprints/deploy-cloudflare-workers/README.md +3 -3
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +2 -2
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +98 -7
- package/blueprints/deploy-hetzner-server/blueprint.json +7 -6
- package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
- package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
- package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
- package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +6 -5
- package/blueprints/edge-cloudflare-access/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
- package/blueprints/edge-cloudflare-access/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +4 -7
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +4 -6
- package/blueprints/edge-cloudflare-tunnel/README.md +1 -2
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +2 -3
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
- package/blueprints/email-smtp-resend/CHANGELOG.md +24 -8
- package/blueprints/email-smtp-resend/README.md +2 -2
- package/blueprints/email-smtp-resend/blueprint.json +3 -2
- package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
- package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
- package/blueprints/email-smtp-resend/docs/topics.md +2 -3
- package/blueprints/jobs-background/CHANGELOG.md +66 -5
- package/blueprints/jobs-background/README.md +2 -2
- package/blueprints/jobs-background/blueprint.json +3 -2
- package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
- package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
- package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
- package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
- package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +10 -2
- package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
- package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
- package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
- package/blueprints/jobs-background/docs/topics.md +1 -1
- package/blueprints/jobs-background/guide/jobs-background.md +1 -1
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +25 -19
- package/blueprints/messaging-queue-cloudflare/README.md +12 -12
- package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +180 -12
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +2 -2
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +2 -2
- package/blueprints/object-storage-s3/CHANGELOG.md +75 -4
- package/blueprints/object-storage-s3/blueprint.json +3 -2
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
- package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +102 -18
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
- package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
- package/blueprints/object-storage-s3/docs/topics.md +1 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +1 -1
- package/blueprints/observability-essentials/CHANGELOG.md +23 -7
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +1 -1
- package/blueprints/observability-essentials/blueprint.json +3 -2
- package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
- package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
- package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
- package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
- package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
- package/blueprints/observability-essentials/docs/topics.md +2 -3
- package/blueprints/observability-logging/CHANGELOG.md +29 -4
- package/blueprints/observability-logging/README.md +2 -2
- package/blueprints/observability-logging/blueprint.json +3 -2
- package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
- package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
- package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
- package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
- package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
- package/blueprints/observability-probe-endpoints/CHANGELOG.md +23 -8
- package/blueprints/observability-probe-endpoints/README.md +3 -3
- package/blueprints/observability-probe-endpoints/blueprint.json +3 -2
- package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/CHANGELOG.md +16 -3
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/blueprint.json +3 -2
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +1 -1
- package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
- package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
- package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
- package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/docs/topics.md +2 -3
- package/blueprints/persistence-data-postgres/CHANGELOG.md +84 -4
- package/blueprints/persistence-data-postgres/README.md +2 -2
- package/blueprints/persistence-data-postgres/blueprint.json +3 -2
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
- package/blueprints/persistence-data-sqlite/CHANGELOG.md +16 -2
- package/blueprints/persistence-data-sqlite/README.md +2 -2
- package/blueprints/persistence-data-sqlite/blueprint.json +3 -2
- package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +5 -5
- package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +6 -10
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +16 -12
- package/blueprints/platform-cloudflare-kv/README.md +2 -4
- package/blueprints/platform-cloudflare-kv/blueprint.json +2 -2
- package/blueprints/platform-cloudflare-kv/docs/topics.md +1 -1
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +92 -5
- package/blueprints/platform-docker-compose-host/blueprint.json +2 -2
- package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
- package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
- package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -24
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
- package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
- package/blueprints/platform-docker-compose-host/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +18 -6
- package/blueprints/security-auth-clerk/README.md +3 -3
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
- package/blueprints/security-auth-clerk/blueprint.json +3 -2
- package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
- package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
- package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
- package/blueprints/security-auth-clerk/docs/topics.md +2 -3
- package/blueprints/security-auth-keycloak/CHANGELOG.md +18 -7
- package/blueprints/security-auth-keycloak/README.md +2 -2
- package/blueprints/security-auth-keycloak/blueprint.json +3 -2
- package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
- package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
- package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
- package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
- package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
- package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
- package/blueprints/security-auth-magic-link/CHANGELOG.md +15 -4
- package/blueprints/security-auth-magic-link/README.md +2 -2
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
- package/blueprints/security-auth-magic-link/blueprint.json +3 -2
- package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
- package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +16 -5
- package/blueprints/security-auth-oauth2/README.md +2 -2
- package/blueprints/security-auth-oauth2/blueprint.json +3 -2
- package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
- package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
- package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
- package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
- package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
- package/blueprints/security-secrets-management/CHANGELOG.md +15 -4
- package/blueprints/security-secrets-management/README.md +2 -2
- package/blueprints/security-secrets-management/blueprint.json +3 -2
- package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
- package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
- package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
- package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
- package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
- package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
- package/blueprints/security-secrets-management/docs/topics.md +2 -3
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +25 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +25 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
- package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
- package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
- package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
- package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
- package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
- package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
- package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
- package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
- package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
- package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
- package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
- package/rcf/code-nodes/cn-600.json +45 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +15 -0
- package/rcf/code-nodes/cn-603.json +12 -0
- package/rcf/code-nodes/cn-604.json +14 -0
- package/rcf/code-nodes/cn-605.json +17 -0
- package/rcf/code-nodes/cn-606.json +12 -0
- package/rcf/code-nodes/cn-607.json +12 -0
- package/rcf/code-nodes/cn-608.json +14 -0
- package/rcf/code-nodes/cn-609.json +17 -0
- package/rcf/code-nodes/cn-620.json +18 -0
- package/rcf/code-nodes/cn-621.json +14 -0
- package/rcf/code-nodes/cn-622.json +15 -0
- package/rcf/code-nodes/cn-623.json +16 -0
- package/rcf/code-nodes/cn-624.json +14 -0
- package/rcf/code-nodes/cn-625.json +15 -0
- package/rcf/code-nodes/cn-626.json +13 -0
- package/rcf/code-nodes/cn-627.json +13 -0
- package/rcf/code-nodes/cn-628.json +14 -0
- package/rcf/code-nodes/cn-629.json +12 -0
- package/rcf/code-nodes/cn-630.json +12 -0
- package/rcf/code-nodes/cn-631.json +13 -0
- package/rcf/code-nodes/cn-632.json +13 -0
- package/rcf/fbs/fbs-180.json +45 -0
- package/rcf/fbs/fbs-181.json +45 -0
- package/rcf/fbs/fbs-182.json +42 -0
- package/rcf/fbs/fbs-183.json +50 -0
- package/rcf/fbs/fbs-184.json +49 -0
- package/rcf/fbs/fbs-185.json +34 -0
- package/rcf/fbs/fbs-186.json +16 -0
- package/rcf/fbs/fbs-187.json +17 -0
- package/rcf/fbs/fbs-188.json +17 -0
- package/rcf/fbs/fbs-189.json +17 -0
- package/rcf/requirements/req-155.json +13 -0
- package/rcf/requirements/req-156.json +13 -0
- package/rcf/requirements/req-157.json +13 -0
- package/rcf/requirements/req-158.json +13 -0
- package/rcf/requirements/req-159.json +13 -0
- package/rcf/requirements/req-160.json +13 -0
- package/rcf/requirements/req-161.json +13 -0
- package/rcf/requirements/req-162.json +13 -0
- package/rcf/requirements/req-163.json +13 -0
- package/rcf/requirements/req-164.json +13 -0
- package/rcf/requirements/req-165.json +13 -0
- package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
- package/rcf/tacs/tac-4102-feedback-store.json +50 -0
- package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
- package/rcf/tacs/tac-4105-feedback-render.json +45 -0
- package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
- package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
- package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
- package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
- package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
- package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
- package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
- package/rcf/test-suites/ts-140.json +9 -9
- package/rcf/test-suites/ts-150.json +9 -9
- package/rcf/test-suites/ts-185.json +54 -0
- package/rcf/test-suites/ts-186.json +58 -0
- package/rcf/test-suites/ts-187.json +44 -0
- package/rcf/test-suites/ts-188.json +166 -0
- package/rcf/test-suites/ts-189.json +38 -0
- package/rcf/test-suites/ts-190.json +30 -0
- package/rcf/test-suites/ts-191.json +51 -0
- package/rcf/test-suites/ts-192.json +37 -0
- package/rcf/test-suites/ts-193.json +60 -0
- package/rcf/test-suites/ts-194.json +67 -0
- package/rcf/test-suites/ts-195.json +52 -0
- package/rcf/test-suites/ts-196.json +58 -0
- package/rcf/test-suites/ts-197.json +66 -0
- package/rcf/test-suites/ts-198.json +87 -0
- package/rcf/test-suites/ts-199.json +51 -0
- package/rcf/test-suites/ts-200.json +30 -0
- package/rcf/test-suites/ts-201.json +38 -0
- package/rcf/test-suites/ts-202.json +38 -0
- package/rcf/test-suites/ts-203.json +38 -0
- package/rcf/user-stories/us-15501.json +60 -0
- package/rcf/user-stories/us-15502.json +33 -0
- package/rcf/user-stories/us-15503.json +33 -0
- package/rcf/user-stories/us-15601.json +51 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +42 -0
- package/rcf/user-stories/us-15802.json +33 -0
- package/rcf/user-stories/us-15901.json +33 -0
- package/rcf/user-stories/us-15902.json +51 -0
- package/rcf/user-stories/us-16001.json +51 -0
- package/rcf/user-stories/us-16101.json +42 -0
- package/rcf/user-stories/us-16102.json +33 -0
- package/rcf/user-stories/us-16103.json +42 -0
- package/rcf/user-stories/us-16104.json +42 -0
- package/rcf/user-stories/us-16201.json +33 -0
- package/rcf/user-stories/us-16301.json +36 -0
- package/rcf/user-stories/us-16401.json +45 -0
- package/rcf/user-stories/us-16501.json +45 -0
- package/rcf/user-stories/us-16502.json +45 -0
- package/releases/releases.yaml +11 -1
- package/src/blueprint/library-loader.js +48 -0
- package/src/blueprint/library-registry.js +13 -0
- package/src/browser-verify/pack-runner.js +7 -12
- package/src/build/mark.js +1 -1
- package/src/cli/blueprint-library.js +149 -0
- package/src/cli/coverage.js +49 -24
- package/src/cli/doctor.js +195 -7
- package/src/cli/feedback.js +2204 -0
- package/src/cli/finalise.js +158 -1
- package/src/cli/help.js +6 -0
- package/src/cli/init.js +63 -0
- package/src/cli/update.js +21 -1
- package/src/core/store/walker.js +33 -0
- package/src/core/store/writer.js +23 -0
- package/src/feedback/destination.js +361 -0
- package/src/feedback/fingerprint.js +132 -0
- package/src/feedback/gh.js +376 -0
- package/src/feedback/hook.js +183 -0
- package/src/feedback/labels.js +87 -0
- package/src/feedback/redact-allowlist.json +14 -0
- package/src/feedback/redact.js +1108 -0
- package/src/feedback/render.js +267 -0
- package/src/feedback/store.js +604 -0
- package/src/finalise/index.js +4 -0
- package/src/finalise/ingest.js +61 -0
- package/src/finalise/ship-without-eval.js +19 -7
- package/src/mcp/tools.js +8 -2
- package/src/setup/feedback-hooks.js +397 -0
- package/src/setup/managed-gitignore.js +3 -0
- package/src/view/html-page.js +5 -5
- package/src/view/style.css +2 -2
|
@@ -7,14 +7,20 @@
|
|
|
7
7
|
// Landing shape mirrors ship-without-verified: an optional
|
|
8
8
|
// `shipWithoutEval[]` array on the manifest, with monotonic ids
|
|
9
9
|
// `swe-<fbsId>-<n>`, the operator's reason string, the declared AC
|
|
10
|
-
// verdicts, the report path, and an ISO timestamp.
|
|
11
|
-
//
|
|
12
|
-
//
|
|
10
|
+
// verdicts, the report path, and an ISO timestamp.
|
|
11
|
+
//
|
|
12
|
+
// Referee-guarantee train (REQ-165, docs claim C-33): rcf-schemas 0.6.3
|
|
13
|
+
// declares the field on the manifest schema, so the write path validates
|
|
14
|
+
// the composed manifest before writing it (mirrors the sister
|
|
15
|
+
// ship-without-verified writer's discipline). The docs sentence
|
|
16
|
+
// "--ship-without-eval records its acknowledgement as a valid manifest
|
|
17
|
+
// field" holds against the shipped pin.
|
|
13
18
|
|
|
14
19
|
import { mkdir, rename, unlink, writeFile } from 'node:fs/promises';
|
|
15
20
|
import { dirname, join } from 'node:path';
|
|
16
21
|
|
|
17
22
|
import { rcfError } from '#core/errors';
|
|
23
|
+
import { validateDocument } from '#core/store';
|
|
18
24
|
|
|
19
25
|
/**
|
|
20
26
|
* @typedef {object} ShipWithoutEvalDeclaredAc
|
|
@@ -84,9 +90,11 @@ export function composeShipWithoutEvalRecord({
|
|
|
84
90
|
|
|
85
91
|
/**
|
|
86
92
|
* Persist a ship-without-eval acknowledgement onto the manifest.
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
93
|
+
* Reads `tree.manifest` for the current state, appends the composed
|
|
94
|
+
* record to `manifest.shipWithoutEval[]`, validates the composed
|
|
95
|
+
* manifest against the rcf-schemas 0.6.3 schema, and writes it
|
|
96
|
+
* atomically. On validation failure the on-disk manifest is untouched
|
|
97
|
+
* (mirrors the sister ship-without-verified writer's discipline).
|
|
90
98
|
*
|
|
91
99
|
* @param {object} args
|
|
92
100
|
* @param {string} args.projectRoot
|
|
@@ -100,6 +108,10 @@ export async function writeShipWithoutEvalRecord({ projectRoot, tree, record })
|
|
|
100
108
|
const existing = Array.isArray(nextManifest.shipWithoutEval) ? nextManifest.shipWithoutEval : [];
|
|
101
109
|
nextManifest.shipWithoutEval = [...existing, record];
|
|
102
110
|
|
|
111
|
+
const relPath = 'rcf/manifest.json';
|
|
112
|
+
const validation = validateDocument({ doc: nextManifest, kind: 'manifest', filePath: relPath });
|
|
113
|
+
if (validation) return validation;
|
|
114
|
+
|
|
103
115
|
const absPath = join(projectRoot, 'rcf', 'manifest.json');
|
|
104
116
|
try {
|
|
105
117
|
await mkdir(dirname(absPath), { recursive: true });
|
|
@@ -115,7 +127,7 @@ export async function writeShipWithoutEvalRecord({ projectRoot, tree, record })
|
|
|
115
127
|
return rcfError({
|
|
116
128
|
kind: 'ioFailure',
|
|
117
129
|
message: `finalise: ship-without-eval manifest write failed: ${err.message}`,
|
|
118
|
-
filePath:
|
|
130
|
+
filePath: relPath,
|
|
119
131
|
stack: err.stack,
|
|
120
132
|
});
|
|
121
133
|
}
|
package/src/mcp/tools.js
CHANGED
|
@@ -477,7 +477,8 @@ const DEFINITIONS = [
|
|
|
477
477
|
type: 'object',
|
|
478
478
|
properties: {
|
|
479
479
|
scopeId: { type: 'string', description: 'Optional PRD / REQ / US id to scope coverage; below-AC ids are refused' },
|
|
480
|
-
|
|
480
|
+
mode: { type: 'string', enum: ['strict', 'shallow-any'], description: 'Coverage mode (referee-guarantee train REQ-164): strict (per-AC, default) or shallow-any (any AC covered by any resolving TC = REQ covered).' },
|
|
481
|
+
strict: { type: 'boolean', description: 'Legacy alias for mode; true = strict, false = shallow-any. Kept for backward compatibility. Prefer mode.' },
|
|
481
482
|
withCode: { type: 'boolean', description: 'Phase 10: layer the code axis onto every AC (implemented-and-covered / implemented-uncovered / unimplemented) plus a codeNodeOrphans list. Informational only - never affects ok or the exit-code twin.' },
|
|
482
483
|
},
|
|
483
484
|
additionalProperties: false,
|
|
@@ -892,8 +893,13 @@ export function createToolRegistry({ projectRoot, log }) {
|
|
|
892
893
|
// Phase 10 (D11): withCode layers the informational code axis on.
|
|
893
894
|
// w-2026-07-28-005: pointer resolution gates "covered" - same rule
|
|
894
895
|
// as the CLI, one resolution pass against the working tree.
|
|
896
|
+
// Referee-guarantee train (REQ-164 / US-16401): strict is the
|
|
897
|
+
// shipped default; pass `mode: 'shallow-any'` (or the legacy
|
|
898
|
+
// `strict: false`) to opt out. `strict: true` is honoured as-is
|
|
899
|
+
// for backward-compatible callers that still spell it out.
|
|
895
900
|
const testPointers = await resolveTestPointers({ projectRoot, tree });
|
|
896
|
-
|
|
901
|
+
const strict = args.mode === 'shallow-any' ? false : (args.strict === false ? false : true);
|
|
902
|
+
return okResult(computeCoverage(tree, { strict, scopeId, withCode: Boolean(args.withCode), testPointers }));
|
|
897
903
|
},
|
|
898
904
|
|
|
899
905
|
rcf_trace: async (args) => {
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
// Feedback hook installer (ADR-4108). Slice 5 (FBS-184): rcf init
|
|
2
|
+
// merges three feedback hook entries into the two committed harness
|
|
3
|
+
// config files (`.claude/settings.json`, `.codex/hooks.json`); rcf
|
|
4
|
+
// doctor detects and repairs missing entries, and refuses foreign
|
|
5
|
+
// entries whose command names our binary with the wrong flags.
|
|
6
|
+
//
|
|
7
|
+
// Merge discipline mirrors `writeMcpConfig`:
|
|
8
|
+
// - parse; refuse on invalid JSON with the same message shape;
|
|
9
|
+
// - preserve every other server/hook verbatim;
|
|
10
|
+
// - add our entries only when an entry naming `rcf feedback hook`
|
|
11
|
+
// is absent for that event; otherwise leave the file alone.
|
|
12
|
+
// A caller passing `binPath` gets the pinned-bin shape
|
|
13
|
+
// (`{ command: 'node', args: [binPath, 'feedback', 'hook', ...] }`),
|
|
14
|
+
// mirroring the `.mcp.json` entry pattern; the default is the
|
|
15
|
+
// portable `npx rcf-lite feedback hook <event>` shape.
|
|
16
|
+
|
|
17
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
|
|
20
|
+
import { rcfError } from '#core/errors';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Command-substring marker used across the estate to identify our
|
|
24
|
+
* hook commands. Matches both shapes we ship:
|
|
25
|
+
* - `npx rcf-lite feedback hook <event> --harness ...`
|
|
26
|
+
* - `node <binPath> feedback hook <event> --harness ...`
|
|
27
|
+
* so a foreign-shape entry that names our verbs is still detected as
|
|
28
|
+
* ours (and reported as foreign-hook) rather than treated as an
|
|
29
|
+
* unrelated command.
|
|
30
|
+
*/
|
|
31
|
+
export const FEEDBACK_HOOK_COMMAND_MARKER = 'feedback hook';
|
|
32
|
+
|
|
33
|
+
/** Events the installer owns (per design 3.5). */
|
|
34
|
+
export const FEEDBACK_HOOK_EVENTS = /** @type {const} */ ([
|
|
35
|
+
{ event: 'Stop', subVerb: 'stop', timeout: 10, matcher: null, codexEvent: 'Stop' },
|
|
36
|
+
{ event: 'SessionEnd', subVerb: 'session-end', timeout: 5, matcher: null, codexEvent: 'SessionEnd' },
|
|
37
|
+
{ event: 'SessionStart', subVerb: 'session-start', timeout: 5, matcher: 'startup|resume', codexEvent: 'SessionStart' },
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Build the Claude Code hook command string for one event.
|
|
42
|
+
*
|
|
43
|
+
* @param {string} subVerb
|
|
44
|
+
* @param {'claude-code' | 'codex'} harness
|
|
45
|
+
* @param {string | undefined} binPath
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
function buildCommand(subVerb, harness, binPath) {
|
|
49
|
+
const args = ['feedback', 'hook', subVerb, '--harness', harness];
|
|
50
|
+
if (typeof binPath === 'string' && binPath.length > 0) {
|
|
51
|
+
return `node ${binPath} ${args.join(' ')}`;
|
|
52
|
+
}
|
|
53
|
+
return `npx rcf-lite ${args.join(' ')}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Build the Claude Code hook entry a `.claude/settings.json` file
|
|
58
|
+
* carries for one event. Matches the shape Claude Code writes to a
|
|
59
|
+
* user-scope file via `/hooks add`: hooks arrays keyed by event,
|
|
60
|
+
* each element `{ matcher?, hooks: [{ type: 'command', command,
|
|
61
|
+
* timeout }] }`.
|
|
62
|
+
*
|
|
63
|
+
* @param {typeof FEEDBACK_HOOK_EVENTS[number]} spec
|
|
64
|
+
* @param {string | undefined} binPath
|
|
65
|
+
*/
|
|
66
|
+
export function claudeHookEntry(spec, binPath) {
|
|
67
|
+
const command = buildCommand(spec.subVerb, 'claude-code', binPath);
|
|
68
|
+
const inner = {
|
|
69
|
+
hooks: [
|
|
70
|
+
{ type: 'command', command, timeout: spec.timeout },
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
if (spec.matcher) inner.matcher = spec.matcher;
|
|
74
|
+
return inner;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Build the Codex hook entry a `.codex/hooks.json` file carries for
|
|
79
|
+
* one event. Codex's schema (0.153.4+) keys hooks by event name and
|
|
80
|
+
* takes an array of `{ command, timeout? }` shell entries; we mirror
|
|
81
|
+
* that shape so a Codex `hooks list` shows one entry per event.
|
|
82
|
+
*
|
|
83
|
+
* @param {typeof FEEDBACK_HOOK_EVENTS[number]} spec
|
|
84
|
+
* @param {string | undefined} binPath
|
|
85
|
+
*/
|
|
86
|
+
export function codexHookEntry(spec, binPath) {
|
|
87
|
+
const command = buildCommand(spec.subVerb, 'codex', binPath);
|
|
88
|
+
return { command, timeout: spec.timeout };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Merge the three feedback hook entries into a parsed Claude Code
|
|
93
|
+
* settings object; returns `{ next, added, foreign, kept }`. Pure
|
|
94
|
+
* over the input; the caller writes if `added.length > 0` or a
|
|
95
|
+
* `foreign` list on a settings file with no gating drift.
|
|
96
|
+
*
|
|
97
|
+
* @param {object | null} current
|
|
98
|
+
* @param {string | undefined} binPath
|
|
99
|
+
*/
|
|
100
|
+
export function mergeClaudeSettings(current, binPath) {
|
|
101
|
+
const base = current && typeof current === 'object' && !Array.isArray(current)
|
|
102
|
+
? { ...current }
|
|
103
|
+
: {};
|
|
104
|
+
const hooks = base.hooks && typeof base.hooks === 'object' && !Array.isArray(base.hooks)
|
|
105
|
+
? { ...base.hooks }
|
|
106
|
+
: {};
|
|
107
|
+
const added = [];
|
|
108
|
+
const foreign = [];
|
|
109
|
+
const kept = [];
|
|
110
|
+
for (const spec of FEEDBACK_HOOK_EVENTS) {
|
|
111
|
+
const bucketRaw = hooks[spec.event];
|
|
112
|
+
const bucket = Array.isArray(bucketRaw) ? bucketRaw.slice() : [];
|
|
113
|
+
const ours = bucket.filter((entry) => entryClaudeIsOurs(entry));
|
|
114
|
+
const expectedCommand = buildCommand(spec.subVerb, 'claude-code', binPath);
|
|
115
|
+
if (ours.length === 0) {
|
|
116
|
+
bucket.push(claudeHookEntry(spec, binPath));
|
|
117
|
+
hooks[spec.event] = bucket;
|
|
118
|
+
added.push(spec.event);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// Foreign detection: an entry that names our marker but whose
|
|
122
|
+
// command string (or timeout, or matcher for SessionStart) differs
|
|
123
|
+
// from the current install shape.
|
|
124
|
+
const drift = ours.filter((entry) => !entryClaudeMatches(entry, spec, expectedCommand));
|
|
125
|
+
if (drift.length > 0) {
|
|
126
|
+
for (const d of drift) {
|
|
127
|
+
foreign.push({ event: spec.event, command: firstClaudeCommand(d) ?? '(unknown)' });
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
kept.push(spec.event);
|
|
131
|
+
}
|
|
132
|
+
hooks[spec.event] = bucket;
|
|
133
|
+
}
|
|
134
|
+
return { next: { ...base, hooks }, added, foreign, kept };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Merge the three feedback hook entries into a parsed Codex hooks
|
|
139
|
+
* object; returns `{ next, added, foreign, kept }`. Pure over the
|
|
140
|
+
* input, same discipline as `mergeClaudeSettings`.
|
|
141
|
+
*
|
|
142
|
+
* @param {object | null} current
|
|
143
|
+
* @param {string | undefined} binPath
|
|
144
|
+
*/
|
|
145
|
+
export function mergeCodexHooks(current, binPath) {
|
|
146
|
+
const base = current && typeof current === 'object' && !Array.isArray(current)
|
|
147
|
+
? { ...current }
|
|
148
|
+
: {};
|
|
149
|
+
const hooks = base.hooks && typeof base.hooks === 'object' && !Array.isArray(base.hooks)
|
|
150
|
+
? { ...base.hooks }
|
|
151
|
+
: {};
|
|
152
|
+
const added = [];
|
|
153
|
+
const foreign = [];
|
|
154
|
+
const kept = [];
|
|
155
|
+
for (const spec of FEEDBACK_HOOK_EVENTS) {
|
|
156
|
+
const bucketRaw = hooks[spec.codexEvent];
|
|
157
|
+
const bucket = Array.isArray(bucketRaw) ? bucketRaw.slice() : [];
|
|
158
|
+
const ours = bucket.filter((entry) => entryCodexIsOurs(entry));
|
|
159
|
+
const expectedCommand = buildCommand(spec.subVerb, 'codex', binPath);
|
|
160
|
+
if (ours.length === 0) {
|
|
161
|
+
bucket.push(codexHookEntry(spec, binPath));
|
|
162
|
+
hooks[spec.codexEvent] = bucket;
|
|
163
|
+
added.push(spec.codexEvent);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const drift = ours.filter((entry) => !entryCodexMatches(entry, spec, expectedCommand));
|
|
167
|
+
if (drift.length > 0) {
|
|
168
|
+
for (const d of drift) {
|
|
169
|
+
foreign.push({ event: spec.codexEvent, command: d?.command ?? '(unknown)' });
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
kept.push(spec.codexEvent);
|
|
173
|
+
}
|
|
174
|
+
hooks[spec.codexEvent] = bucket;
|
|
175
|
+
}
|
|
176
|
+
return { next: { ...base, hooks }, added, foreign, kept };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function entryClaudeIsOurs(entry) {
|
|
180
|
+
const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
|
|
181
|
+
return hooks.some((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function firstClaudeCommand(entry) {
|
|
185
|
+
const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
|
|
186
|
+
const hit = hooks.find((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
|
|
187
|
+
return hit?.command;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function entryClaudeMatches(entry, spec, expectedCommand) {
|
|
191
|
+
const hooks = Array.isArray(entry?.hooks) ? entry.hooks : [];
|
|
192
|
+
// Compare matcher through a null-normalising cast: both spec and
|
|
193
|
+
// entry may express the absence of a matcher as either null or
|
|
194
|
+
// undefined (the former is deliberate on our specs; the latter is
|
|
195
|
+
// what JSON round-trip drops).
|
|
196
|
+
const specMatcher = spec.matcher ?? null;
|
|
197
|
+
const entryMatcher = entry?.matcher ?? null;
|
|
198
|
+
if (specMatcher !== entryMatcher) return false;
|
|
199
|
+
const ourHooks = hooks.filter((h) => typeof h?.command === 'string' && h.command.includes(FEEDBACK_HOOK_COMMAND_MARKER));
|
|
200
|
+
if (ourHooks.length !== 1) return false;
|
|
201
|
+
const h = ourHooks[0];
|
|
202
|
+
if (h.type !== 'command') return false;
|
|
203
|
+
if (h.command !== expectedCommand) return false;
|
|
204
|
+
if (h.timeout !== spec.timeout) return false;
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function entryCodexIsOurs(entry) {
|
|
209
|
+
return typeof entry?.command === 'string' && entry.command.includes(FEEDBACK_HOOK_COMMAND_MARKER);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function entryCodexMatches(entry, spec, expectedCommand) {
|
|
213
|
+
if (entry?.command !== expectedCommand) return false;
|
|
214
|
+
if (entry?.timeout !== spec.timeout) return false;
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Write / merge `.claude/settings.json` with the three feedback hook
|
|
220
|
+
* entries. Returns an action summary the caller renders (or an
|
|
221
|
+
* rcfError on invalid JSON, mirroring `writeMcpConfig`).
|
|
222
|
+
*
|
|
223
|
+
* @param {object} args
|
|
224
|
+
* @param {string} args.projectRoot
|
|
225
|
+
* @param {string} [args.binPath]
|
|
226
|
+
*/
|
|
227
|
+
export async function writeClaudeFeedbackHooks({ projectRoot, binPath } = {}) {
|
|
228
|
+
const file = join(projectRoot, '.claude', 'settings.json');
|
|
229
|
+
const raw = await readIfExists(file);
|
|
230
|
+
let current = null;
|
|
231
|
+
let existed = raw !== null;
|
|
232
|
+
if (existed) {
|
|
233
|
+
try {
|
|
234
|
+
current = JSON.parse(raw);
|
|
235
|
+
} catch (err) {
|
|
236
|
+
return rcfError({
|
|
237
|
+
kind: 'parseFailure',
|
|
238
|
+
message: `.claude/settings.json exists but is not valid JSON (${err.message}); refusing to modify it. Fix it by hand, or add the feedback hook entries manually - see docs/feedback.md, section 'Slice 5 hooks'.`,
|
|
239
|
+
filePath: '.claude/settings.json',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
if (current === null || typeof current !== 'object' || Array.isArray(current)) {
|
|
243
|
+
return rcfError({
|
|
244
|
+
kind: 'parseFailure',
|
|
245
|
+
message: '.claude/settings.json exists but is not a JSON object; refusing to modify it.',
|
|
246
|
+
filePath: '.claude/settings.json',
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const merge = mergeClaudeSettings(current, binPath);
|
|
251
|
+
if (merge.foreign.length > 0) {
|
|
252
|
+
return {
|
|
253
|
+
file: '.claude/settings.json',
|
|
254
|
+
action: 'foreign',
|
|
255
|
+
foreign: merge.foreign,
|
|
256
|
+
added: [],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (merge.added.length === 0) {
|
|
260
|
+
return {
|
|
261
|
+
file: '.claude/settings.json',
|
|
262
|
+
action: 'kept',
|
|
263
|
+
added: [],
|
|
264
|
+
foreign: [],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
await mkdir(dirname(file), { recursive: true });
|
|
268
|
+
await writeFile(file, `${JSON.stringify(merge.next, null, 2)}\n`, 'utf8');
|
|
269
|
+
return {
|
|
270
|
+
file: '.claude/settings.json',
|
|
271
|
+
action: existed ? 'merged' : 'created',
|
|
272
|
+
added: merge.added,
|
|
273
|
+
foreign: [],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Write / merge `.codex/hooks.json` with the three feedback hook
|
|
279
|
+
* entries. Same discipline as `writeClaudeFeedbackHooks`.
|
|
280
|
+
*
|
|
281
|
+
* @param {object} args
|
|
282
|
+
* @param {string} args.projectRoot
|
|
283
|
+
* @param {string} [args.binPath]
|
|
284
|
+
*/
|
|
285
|
+
export async function writeCodexFeedbackHooks({ projectRoot, binPath } = {}) {
|
|
286
|
+
const file = join(projectRoot, '.codex', 'hooks.json');
|
|
287
|
+
const raw = await readIfExists(file);
|
|
288
|
+
let current = null;
|
|
289
|
+
let existed = raw !== null;
|
|
290
|
+
if (existed) {
|
|
291
|
+
try {
|
|
292
|
+
current = JSON.parse(raw);
|
|
293
|
+
} catch (err) {
|
|
294
|
+
return rcfError({
|
|
295
|
+
kind: 'parseFailure',
|
|
296
|
+
message: `.codex/hooks.json exists but is not valid JSON (${err.message}); refusing to modify it. Fix it by hand, or add the feedback hook entries manually - see docs/feedback.md, section 'Slice 5 hooks'.`,
|
|
297
|
+
filePath: '.codex/hooks.json',
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
if (current === null || typeof current !== 'object' || Array.isArray(current)) {
|
|
301
|
+
return rcfError({
|
|
302
|
+
kind: 'parseFailure',
|
|
303
|
+
message: '.codex/hooks.json exists but is not a JSON object; refusing to modify it.',
|
|
304
|
+
filePath: '.codex/hooks.json',
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const merge = mergeCodexHooks(current, binPath);
|
|
309
|
+
if (merge.foreign.length > 0) {
|
|
310
|
+
return {
|
|
311
|
+
file: '.codex/hooks.json',
|
|
312
|
+
action: 'foreign',
|
|
313
|
+
foreign: merge.foreign,
|
|
314
|
+
added: [],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
if (merge.added.length === 0) {
|
|
318
|
+
return {
|
|
319
|
+
file: '.codex/hooks.json',
|
|
320
|
+
action: 'kept',
|
|
321
|
+
added: [],
|
|
322
|
+
foreign: [],
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
await mkdir(dirname(file), { recursive: true });
|
|
326
|
+
await writeFile(file, `${JSON.stringify(merge.next, null, 2)}\n`, 'utf8');
|
|
327
|
+
return {
|
|
328
|
+
file: '.codex/hooks.json',
|
|
329
|
+
action: existed ? 'merged' : 'created',
|
|
330
|
+
added: merge.added,
|
|
331
|
+
foreign: [],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Diagnose one Claude Code settings file WITHOUT writing. Returns
|
|
337
|
+
* `{ missing: string[], foreign: Array<{event,command}> }` per event.
|
|
338
|
+
* Doctor consumes this to decide missing-hook (fixable) vs
|
|
339
|
+
* foreign-hook (refused) rows.
|
|
340
|
+
*
|
|
341
|
+
* @param {object} args
|
|
342
|
+
* @param {string} args.projectRoot
|
|
343
|
+
* @param {string} [args.binPath]
|
|
344
|
+
*/
|
|
345
|
+
export async function diagnoseClaudeFeedbackHooks({ projectRoot, binPath } = {}) {
|
|
346
|
+
const file = join(projectRoot, '.claude', 'settings.json');
|
|
347
|
+
const raw = await readIfExists(file);
|
|
348
|
+
if (raw === null) {
|
|
349
|
+
return { present: false, missing: FEEDBACK_HOOK_EVENTS.map((s) => s.event), foreign: [] };
|
|
350
|
+
}
|
|
351
|
+
let current;
|
|
352
|
+
try {
|
|
353
|
+
current = JSON.parse(raw);
|
|
354
|
+
} catch (err) {
|
|
355
|
+
return { present: true, parseError: err.message, missing: [], foreign: [] };
|
|
356
|
+
}
|
|
357
|
+
if (current === null || typeof current !== 'object' || Array.isArray(current)) {
|
|
358
|
+
return { present: true, parseError: 'not a JSON object', missing: [], foreign: [] };
|
|
359
|
+
}
|
|
360
|
+
const merge = mergeClaudeSettings(current, binPath);
|
|
361
|
+
return { present: true, missing: merge.added, foreign: merge.foreign };
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Diagnose one Codex hooks file WITHOUT writing.
|
|
366
|
+
*
|
|
367
|
+
* @param {object} args
|
|
368
|
+
* @param {string} args.projectRoot
|
|
369
|
+
* @param {string} [args.binPath]
|
|
370
|
+
*/
|
|
371
|
+
export async function diagnoseCodexFeedbackHooks({ projectRoot, binPath } = {}) {
|
|
372
|
+
const file = join(projectRoot, '.codex', 'hooks.json');
|
|
373
|
+
const raw = await readIfExists(file);
|
|
374
|
+
if (raw === null) {
|
|
375
|
+
return { present: false, missing: FEEDBACK_HOOK_EVENTS.map((s) => s.codexEvent), foreign: [] };
|
|
376
|
+
}
|
|
377
|
+
let current;
|
|
378
|
+
try {
|
|
379
|
+
current = JSON.parse(raw);
|
|
380
|
+
} catch (err) {
|
|
381
|
+
return { present: true, parseError: err.message, missing: [], foreign: [] };
|
|
382
|
+
}
|
|
383
|
+
if (current === null || typeof current !== 'object' || Array.isArray(current)) {
|
|
384
|
+
return { present: true, parseError: 'not a JSON object', missing: [], foreign: [] };
|
|
385
|
+
}
|
|
386
|
+
const merge = mergeCodexHooks(current, binPath);
|
|
387
|
+
return { present: true, missing: merge.added, foreign: merge.foreign };
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
async function readIfExists(path) {
|
|
391
|
+
try {
|
|
392
|
+
return await readFile(path, 'utf8');
|
|
393
|
+
} catch (err) {
|
|
394
|
+
if (/** @type {NodeJS.ErrnoException} */ (err).code === 'ENOENT') return null;
|
|
395
|
+
throw err;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
@@ -27,6 +27,8 @@ import { identityEntry } from './identity-seed.js';
|
|
|
27
27
|
import { preflightEntry } from '../preflight/secrets.js';
|
|
28
28
|
// Track C+D §9.3: gitignore the view-server pid file and supervisor log.
|
|
29
29
|
import { viewServerGitignoreEntry, viewServerLogGitignoreEntry } from '../view-supervisor/manifest-writer.js';
|
|
30
|
+
// FBS-180 slice 1: gitignore the local feedback log and outbox.
|
|
31
|
+
import { feedbackGitignoreEntry } from '../feedback/store.js';
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
34
|
* @typedef {object} GitignoreEntry
|
|
@@ -53,6 +55,7 @@ export function managedGitignoreEntries() {
|
|
|
53
55
|
preflightEntry,
|
|
54
56
|
viewServerGitignoreEntry,
|
|
55
57
|
viewServerLogGitignoreEntry,
|
|
58
|
+
feedbackGitignoreEntry,
|
|
56
59
|
];
|
|
57
60
|
}
|
|
58
61
|
|
package/src/view/html-page.js
CHANGED
|
@@ -28,12 +28,12 @@ import {
|
|
|
28
28
|
import { detailsWrap, escapeHtml } from './doc-renderers/helpers.js';
|
|
29
29
|
import { allRequirementSubdiagrams } from './mermaid-diagram.js';
|
|
30
30
|
|
|
31
|
-
// Inline SVG favicon: the Stravica
|
|
32
|
-
//
|
|
33
|
-
// so the review surface shares
|
|
34
|
-
// Delivered as a data URL so no separate file has to ship.
|
|
31
|
+
// Inline SVG favicon: the Stravica kit mark (deep-navy tile with the
|
|
32
|
+
// ribbon symbol in Stravica blue), taken from the estate brand kit at
|
|
33
|
+
// public/brand/assets/icons/favicon.svg so the review surface shares
|
|
34
|
+
// identity with stravica.ai. Delivered as a data URL so no separate file has to ship.
|
|
35
35
|
const FAVICON_HREF =
|
|
36
|
-
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0
|
|
36
|
+
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64' width='64' height='64' role='img'%3E%3Ctitle%3EStravica favicon%3C/title%3E%3Cdesc%3E%3C/desc%3E%3Crect x='0' y='0' width='64' height='64' rx='14' fill='%23080F19'/%3E%3Cg fill='%237295FF'%3E%3Cpath d='M38 9L17 21V32L38 20Z'/%3E%3Cpath d='M30 27L46 36V46L30 37L23 33Z'/%3E%3Cpath d='M46 46L25 58V47L37 40Z'/%3E%3C/g%3E%3C/svg%3E";
|
|
37
37
|
|
|
38
38
|
const LIVE_WRAPPER_OPEN = '<div id="rcf-live-content">';
|
|
39
39
|
const LIVE_WRAPPER_CLOSE = '</div>';
|
package/src/view/style.css
CHANGED
|
@@ -99,7 +99,7 @@ header h1 {
|
|
|
99
99
|
gap: 0.75rem;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
/* Stravica
|
|
102
|
+
/* Stravica kit mark alongside the project name, shared identity with
|
|
103
103
|
* the marketing site (stravica.ai). SVG is inlined as a data URL so no
|
|
104
104
|
* separate asset has to ship. */
|
|
105
105
|
header h1::before {
|
|
@@ -108,7 +108,7 @@ header h1::before {
|
|
|
108
108
|
width: 2rem;
|
|
109
109
|
height: 2rem;
|
|
110
110
|
flex-shrink: 0;
|
|
111
|
-
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0
|
|
111
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 136 180' width='136' height='180' role='img'%3E%3Ctitle%3EStravica ribbon symbol%3C/title%3E%3Cdesc%3E%3C/desc%3E%3Cdefs%3E%3ClinearGradient id='ma' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%23174CFF'/%3E%3Cstop offset='1' stop-color='%23263BFF'/%3E%3C/linearGradient%3E%3ClinearGradient id='mb' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%231674FF'/%3E%3Cstop offset='1' stop-color='%232854FF'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg transform='translate(0 0) scale(1.0)'%3E%3Cpath fill='url(%23ma)' d='M86 4 L10 48 Q4 51 4 58 L4 81 Q4 87 10 84 L80 45 Q86 42 86 35 Z'/%3E%3Cpath fill='url(%23ma)' d='M88 108 L129 125 L47 172 Q41 176 41 170 L41 142 Q41 136 47 133 Z'/%3E%3Cpath fill='url(%23mb)' d='M41 84 L74 65 Q78 63 83 66 L124 88 Q130 91 130 98 L130 121 Q130 126 124 123 Z'/%3E%3C/g%3E%3C/svg%3E");
|
|
112
112
|
background-repeat: no-repeat;
|
|
113
113
|
background-position: center;
|
|
114
114
|
background-size: contain;
|