rcf-lite 0.12.0 → 0.14.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.
Files changed (686) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +2 -0
  3. package/bin/rcf.js +3 -1
  4. package/bin/view-supervisor-child.mjs +0 -0
  5. package/blueprints/application-api-rest/README.md +40 -0
  6. package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
  7. package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
  8. package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
  9. package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
  10. package/blueprints/application-api-rest/blueprint.json +265 -0
  11. package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
  12. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
  13. package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
  14. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
  15. package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
  16. package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
  17. package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
  18. package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
  19. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
  20. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
  21. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
  22. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
  23. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
  24. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
  25. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
  26. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
  27. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
  28. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
  29. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
  30. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
  31. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
  32. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
  33. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
  34. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
  35. package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
  36. package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
  37. package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
  38. package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
  39. package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
  40. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
  41. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
  42. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
  43. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
  44. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
  45. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
  46. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
  47. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
  48. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
  49. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
  50. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
  51. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
  52. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
  53. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
  54. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
  55. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
  56. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
  57. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
  58. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
  59. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
  60. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
  61. package/blueprints/application-api-rest/docs/topics.md +46 -0
  62. package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
  63. package/blueprints/application-spa/README.md +90 -0
  64. package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
  65. package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
  66. package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
  67. package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
  68. package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
  69. package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
  70. package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
  71. package/blueprints/application-spa/assets/tokens/theme.css +169 -0
  72. package/blueprints/application-spa/assets/viewports.md +18 -0
  73. package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
  74. package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
  75. package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
  76. package/blueprints/application-spa/assets/wireframes/error.md +46 -0
  77. package/blueprints/application-spa/assets/wireframes/form.md +50 -0
  78. package/blueprints/application-spa/assets/wireframes/list.md +45 -0
  79. package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
  80. package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
  81. package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
  82. package/blueprints/application-spa/blueprint.json +387 -0
  83. package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
  84. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
  85. package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
  86. package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
  87. package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
  88. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
  89. package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
  90. package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
  91. package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
  92. package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
  93. package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
  94. package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
  95. package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
  96. package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
  97. package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
  98. package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
  99. package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
  100. package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
  101. package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
  102. package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
  103. package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
  104. package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
  105. package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
  106. package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
  107. package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
  108. package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
  109. package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
  110. package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
  111. package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
  112. package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
  113. package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
  114. package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
  115. package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
  116. package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
  117. package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
  118. package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
  119. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
  120. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
  121. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
  122. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
  123. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
  124. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
  125. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
  126. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
  127. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
  128. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
  129. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
  130. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
  131. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
  132. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
  133. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
  134. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
  135. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
  136. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
  137. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
  138. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
  139. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
  140. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
  141. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
  142. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
  143. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
  144. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
  145. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
  146. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
  147. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
  148. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
  149. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
  150. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
  151. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
  152. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
  153. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
  154. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
  155. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
  156. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
  157. package/blueprints/application-spa/docs/topics.md +57 -0
  158. package/blueprints/application-spa/guide/application-spa.md +40 -0
  159. package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
  160. package/blueprints/delivery-ci-workflows/README.md +57 -0
  161. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +55 -0
  162. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +65 -0
  163. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +71 -0
  164. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +61 -0
  165. package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
  166. package/blueprints/delivery-ci-workflows/assets/report-samples/per-gate.json +13 -0
  167. package/blueprints/delivery-ci-workflows/assets/report-samples/pipeline.json +28 -0
  168. package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
  169. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
  170. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +25 -0
  171. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-703-delivery-ci-workflows-node-only-runner.json +25 -0
  172. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-704-delivery-ci-workflows-report-shape.json +25 -0
  173. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
  174. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
  175. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
  176. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
  177. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
  178. package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
  179. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
  180. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +18 -0
  181. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +18 -0
  182. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +18 -0
  183. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +18 -0
  184. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +18 -0
  185. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +18 -0
  186. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +18 -0
  187. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
  188. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +18 -0
  189. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
  190. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
  191. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
  192. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
  193. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
  194. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
  195. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
  196. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
  197. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
  198. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
  199. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
  200. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
  201. package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
  202. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json +59 -0
  203. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json +32 -0
  204. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json +41 -0
  205. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +64 -0
  206. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
  207. package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
  208. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
  209. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +36 -0
  210. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +37 -0
  211. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +37 -0
  212. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json +36 -0
  213. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +36 -0
  214. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +37 -0
  215. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json +37 -0
  216. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
  217. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +36 -0
  218. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
  219. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
  220. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
  221. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
  222. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
  223. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
  224. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
  225. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
  226. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
  227. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
  228. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
  229. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
  230. package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
  231. package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
  232. package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +136 -0
  233. package/blueprints/deploy-cloudflare-workers/README.md +63 -0
  234. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
  235. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
  236. package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
  237. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
  238. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
  239. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
  240. package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
  241. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
  242. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
  243. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
  244. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
  245. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
  246. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
  247. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
  248. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
  249. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
  250. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
  251. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
  252. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
  253. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
  254. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
  255. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
  256. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
  257. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
  258. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
  259. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
  260. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
  261. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
  262. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
  263. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
  264. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
  265. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
  266. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
  267. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
  268. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
  269. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
  270. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
  271. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
  272. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
  273. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
  274. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
  275. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
  276. package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
  277. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
  278. package/blueprints/email-smtp-resend/README.md +45 -0
  279. package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
  280. package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
  281. package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
  282. package/blueprints/email-smtp-resend/blueprint.json +23 -0
  283. package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
  284. package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
  285. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
  286. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
  287. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
  288. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
  289. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
  290. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
  291. package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
  292. package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
  293. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
  294. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
  295. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
  296. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
  297. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
  298. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
  299. package/blueprints/email-smtp-resend/docs/topics.md +44 -0
  300. package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
  301. package/blueprints/observability-essentials/README.md +53 -0
  302. package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
  303. package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
  304. package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
  305. package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
  306. package/blueprints/observability-essentials/blueprint.json +54 -0
  307. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
  308. package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
  309. package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
  310. package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
  311. package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
  312. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
  313. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
  314. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
  315. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
  316. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
  317. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
  318. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
  319. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
  320. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
  321. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
  322. package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
  323. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
  324. package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
  325. package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
  326. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
  327. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
  328. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
  329. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
  330. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
  331. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
  332. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
  333. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
  334. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
  335. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
  336. package/blueprints/observability-essentials/docs/topics.md +57 -0
  337. package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
  338. package/blueprints/observability-probe-endpoints/README.md +53 -0
  339. package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
  340. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
  341. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
  342. package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
  343. package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
  344. package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
  345. package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
  346. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
  347. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
  348. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
  349. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
  350. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
  351. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
  352. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
  353. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
  354. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
  355. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
  356. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
  357. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
  358. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
  359. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
  360. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
  361. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
  362. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
  363. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
  364. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
  365. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
  366. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
  367. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
  368. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
  369. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
  370. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
  371. package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
  372. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
  373. package/blueprints/persistence-data-d1/README.md +50 -0
  374. package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
  375. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
  376. package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
  377. package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
  378. package/blueprints/persistence-data-d1/blueprint.json +42 -0
  379. package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
  380. package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
  381. package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
  382. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
  383. package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
  384. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
  385. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
  386. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
  387. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
  388. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
  389. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
  390. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
  391. package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
  392. package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
  393. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
  394. package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
  395. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
  396. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
  397. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
  398. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
  399. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
  400. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
  401. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
  402. package/blueprints/persistence-data-d1/docs/topics.md +59 -0
  403. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
  404. package/blueprints/persistence-data-sqlite/README.md +50 -0
  405. package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
  406. package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
  407. package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
  408. package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
  409. package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
  410. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
  411. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
  412. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
  413. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
  414. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
  415. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
  416. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
  417. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
  418. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
  419. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
  420. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
  421. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
  422. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
  423. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
  424. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
  425. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
  426. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
  427. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
  428. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
  429. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
  430. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
  431. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
  432. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
  433. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
  434. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
  435. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
  436. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
  437. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
  438. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
  439. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
  440. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
  441. package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
  442. package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
  443. package/blueprints/security-auth-clerk/README.md +52 -0
  444. package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
  445. package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
  446. package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
  447. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
  448. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
  449. package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
  450. package/blueprints/security-auth-clerk/blueprint.json +42 -0
  451. package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
  452. package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
  453. package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
  454. package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
  455. package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
  456. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
  457. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
  458. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
  459. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
  460. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
  461. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
  462. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
  463. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
  464. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
  465. package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
  466. package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
  467. package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
  468. package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
  469. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
  470. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
  471. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
  472. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
  473. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
  474. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
  475. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
  476. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
  477. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
  478. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
  479. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
  480. package/blueprints/security-auth-clerk/docs/topics.md +56 -0
  481. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +80 -0
  482. package/blueprints/security-auth-keycloak/README.md +56 -0
  483. package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
  484. package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
  485. package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
  486. package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
  487. package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
  488. package/blueprints/security-auth-keycloak/blueprint.json +49 -0
  489. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
  490. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
  491. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
  492. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
  493. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
  494. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
  495. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
  496. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
  497. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
  498. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
  499. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
  500. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
  501. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
  502. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
  503. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
  504. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
  505. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
  506. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
  507. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
  508. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
  509. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
  510. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
  511. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
  512. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
  513. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
  514. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
  515. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
  516. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
  517. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
  518. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
  519. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
  520. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
  521. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
  522. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
  523. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
  524. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
  525. package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
  526. package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
  527. package/blueprints/security-auth-magic-link/README.md +46 -0
  528. package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
  529. package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
  530. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
  531. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
  532. package/blueprints/security-auth-magic-link/blueprint.json +45 -0
  533. package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
  534. package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
  535. package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
  536. package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
  537. package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
  538. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
  539. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
  540. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
  541. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
  542. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
  543. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
  544. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
  545. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
  546. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
  547. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
  548. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
  549. package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
  550. package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
  551. package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
  552. package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
  553. package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
  554. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
  555. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
  556. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
  557. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
  558. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
  559. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
  560. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
  561. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
  562. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
  563. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
  564. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
  565. package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
  566. package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
  567. package/blueprints/security-auth-oauth2/README.md +50 -0
  568. package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
  569. package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
  570. package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
  571. package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
  572. package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
  573. package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
  574. package/blueprints/security-auth-oauth2/blueprint.json +44 -0
  575. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
  576. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
  577. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
  578. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
  579. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
  580. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
  581. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
  582. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
  583. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
  584. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
  585. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
  586. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
  587. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
  588. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
  589. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
  590. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
  591. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
  592. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
  593. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
  594. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
  595. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
  596. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
  597. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
  598. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
  599. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
  600. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
  601. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
  602. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
  603. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
  604. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
  605. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
  606. package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
  607. package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
  608. package/blueprints/security-secrets-management/README.md +48 -0
  609. package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
  610. package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
  611. package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
  612. package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
  613. package/blueprints/security-secrets-management/blueprint.json +43 -0
  614. package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
  615. package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
  616. package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
  617. package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
  618. package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
  619. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
  620. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
  621. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
  622. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
  623. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
  624. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
  625. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
  626. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
  627. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
  628. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
  629. package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
  630. package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
  631. package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
  632. package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
  633. package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
  634. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
  635. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
  636. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
  637. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
  638. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
  639. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
  640. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
  641. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
  642. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
  643. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
  644. package/blueprints/security-secrets-management/docs/topics.md +46 -0
  645. package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
  646. package/fixtures/canary-manifest.json +1 -101
  647. package/guidance/build-cycle-playbook.md +2 -2
  648. package/guidance/document-model.md +1 -1
  649. package/guidance/harness-template.md +13 -0
  650. package/guidance/managed/agent-instructions-block.hash +1 -1
  651. package/guidance/managed/agent-instructions-block.md +13 -0
  652. package/package.json +18 -9
  653. package/rcf/adrs/adr-001.json +1 -1
  654. package/rcf/adrs/adr-009.json +1 -1
  655. package/rcf/build-sequence.json +1 -1
  656. package/rcf/manifest.json +2 -2
  657. package/rcf/prd.json +2 -2
  658. package/releases/releases.yaml +116 -0
  659. package/scripts/preinstall-node-check.mjs +61 -0
  660. package/src/blueprint/apply.js +62 -18
  661. package/src/blueprint/conflicts.js +8 -8
  662. package/src/blueprint/index.js +14 -1
  663. package/src/blueprint/library-loader.js +271 -0
  664. package/src/blueprint/library-registry.js +341 -0
  665. package/src/blueprint/list.js +94 -0
  666. package/src/blueprint/loader.js +26 -1
  667. package/src/blueprint/namespace.js +20 -16
  668. package/src/blueprint/shelf-resolver.js +286 -0
  669. package/src/blueprint/supersede.js +3 -2
  670. package/src/browser-verify/invariants.js +40 -0
  671. package/src/browser-verify/runner.js +2 -0
  672. package/src/cli/blueprint-library.js +419 -0
  673. package/src/cli/blueprint.js +91 -10
  674. package/src/cli/guidance.js +1 -1
  675. package/src/cli/help.js +27 -1
  676. package/src/cli/init.js +2 -0
  677. package/src/cli/version.js +673 -0
  678. package/src/cli/view.js +282 -1
  679. package/src/core/store/writer.js +64 -2
  680. package/src/server/index.js +3 -0
  681. package/src/server/routes.js +15 -1
  682. package/src/server/scope-endpoint.js +105 -0
  683. package/src/setup/agent-setup.js +28 -10
  684. package/src/view/live-client.js +253 -6
  685. package/src/view/scope.js +231 -0
  686. package/src/view/style.css +42 -0
@@ -15,10 +15,10 @@
15
15
  // manifest record. The manifest's appliedBlueprintRecord.contributions[]
16
16
  // list is the authoritative ownership record; two blueprints cannot
17
17
  // both claim the same id. This is the ambiguity-class check that
18
- // used to live inside `isNamespacedFor` grammar (blueprint `spa`
19
- // silently claiming `ADR-005-spa-theme` because the string
20
- // startsWith `spa-`). Grammar is no longer a trust surface here --
21
- // the manifest is.
18
+ // used to live inside `isNamespacedFor` grammar (blueprint
19
+ // `application-spa` silently claiming `ADR-005-application-spa-theme`
20
+ // because the string startsWith `application-spa-`). Grammar is no
21
+ // longer a trust surface here -- the manifest is.
22
22
  //
23
23
  // Every other class the design brief names (non-global TACs/ADRs/REQs/USs
24
24
  // /FBSes, standards-value conflicts, manifest overlap) is either
@@ -111,10 +111,10 @@ export function detectGlobalAdrConflicts(appliedBlueprints, incoming, manifest =
111
111
  /**
112
112
  * Cross-blueprint ownership conflicts: an incoming contribution id is
113
113
  * already recorded as owned by a DIFFERENT applied blueprint. This
114
- * detector is what makes `spa` vs `spa-theme` cross-claim impossible
115
- * once one of the two has applied -- the second-mover's incoming id
116
- * hits the first-mover's manifest record and is refused, regardless
117
- * of how the id string parses.
114
+ * detector is what makes `application-spa` vs `application-spa-theme`
115
+ * cross-claim impossible once one of the two has applied -- the
116
+ * second-mover's incoming id hits the first-mover's manifest record
117
+ * and is refused, regardless of how the id string parses.
118
118
  *
119
119
  * Re-apply of the same slug (`applied.slug === incoming.slug`) is
120
120
  * skipped: same blueprint owning its own ids across re-apply is the
@@ -1,7 +1,7 @@
1
1
  // Public surface for the blueprint mechanism.
2
2
 
3
3
  export { applyBlueprint } from './apply.js';
4
- export { listBlueprints } from './list.js';
4
+ export { listBlueprints, enrichRowsWithCategories, groupRowsByCategory } from './list.js';
5
5
  export { removeBlueprint } from './remove.js';
6
6
  export { loadBlueprint } from './loader.js';
7
7
  export { detectGlobalAdrConflicts, detectCrossBlueprintClaims, renderConflictReport, conflictReportJson } from './conflicts.js';
@@ -10,3 +10,16 @@ export { registerStandardsPack, listStandards } from './standards.js';
10
10
  export { nextResolutionId, matchingResolution } from './resolutions.js';
11
11
  export { supersedeBlueprintTopic } from './supersede.js';
12
12
  export { diffBlueprintTopic, renderDiff } from './diff.js';
13
+ export { resolveBlueprintSource, knownShelfSlugs, packagedShelfPath } from './shelf-resolver.js';
14
+ export { loadLibrary } from './library-loader.js';
15
+ export {
16
+ REGISTRY_PATH,
17
+ REGISTRY_VERSION,
18
+ readLibraryRegistry,
19
+ writeLibraryRegistry,
20
+ findLibrary,
21
+ loadCoreBandReservations,
22
+ detectBandOverlap,
23
+ detectContributionsOutOfBand,
24
+ detectPrefixCollision,
25
+ } from './library-registry.js';
@@ -0,0 +1,271 @@
1
+ // External-library manifest loader. Reads and validates `library.json` at
2
+ // a library root, then walks the declared blueprints[] entries to confirm
3
+ // each names a directory whose own `blueprint.json` validates against the
4
+ // phase-1 blueprint loader.
5
+ //
6
+ // See external-blueprint-libraries-spec-2026-08-31.md sections 3 and 3.1
7
+ // for the manifest shape and field contract.
8
+ //
9
+ // Phase 2b covers local-path libraries (a directory the operator already
10
+ // has on disk). Network fetchers (git, tarball) are a Phase 2c concern
11
+ // and are NOT implemented here; the loader is happy to work against any
12
+ // directory that carries a valid `library.json`.
13
+
14
+ import { readFile, stat } from 'node:fs/promises';
15
+ import { isAbsolute, join, resolve } from 'node:path';
16
+
17
+ import { rcfError } from '../core/errors/index.js';
18
+ import { loadBlueprint } from './loader.js';
19
+
20
+ const KEBAB_SLUG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
21
+ const KNOWN_SUFFIX_BLOCK_KINDS = new Set(['adr', 'tac']);
22
+ const LIBRARY_VERSION_KNOWN = 1;
23
+
24
+ /**
25
+ * @typedef {object} LibraryBandAc
26
+ * @property {number} start
27
+ * @property {number} end
28
+ */
29
+
30
+ /**
31
+ * @typedef {object} LibrarySuffixBlock
32
+ * @property {'adr' | 'tac'} kind
33
+ * @property {number} start
34
+ * @property {number} end
35
+ */
36
+
37
+ /**
38
+ * @typedef {object} LibraryBands
39
+ * @property {LibraryBandAc} ac
40
+ * @property {LibrarySuffixBlock[]} [suffixBlocks]
41
+ */
42
+
43
+ /**
44
+ * @typedef {object} LibraryBlueprintEntry
45
+ * @property {string} slug
46
+ * @property {string} path
47
+ */
48
+
49
+ /**
50
+ * @typedef {object} LibraryPublisher
51
+ * @property {string} id
52
+ * @property {string} displayName
53
+ * @property {string} [contact]
54
+ */
55
+
56
+ /**
57
+ * @typedef {object} LoadedLibrary
58
+ * @property {number} libraryVersion
59
+ * @property {string} libraryPrefix
60
+ * @property {string} displayName
61
+ * @property {LibraryPublisher} publisher
62
+ * @property {string} libraryRef
63
+ * @property {LibraryBands} bands
64
+ * @property {LibraryBlueprintEntry[]} blueprints
65
+ * @property {string} [notes]
66
+ * @property {string} root absolute path to the library root
67
+ */
68
+
69
+ /**
70
+ * Load and validate a library from a directory that carries a
71
+ * `library.json` at its root plus a `blueprints/` subtree.
72
+ *
73
+ * @param {string} libraryRoot - absolute or relative path
74
+ * @param {object} [opts]
75
+ * @param {boolean} [opts.validateBlueprints=true] - when false, skips the
76
+ * per-blueprint validation walk. Add-time review-on-add sets this to
77
+ * true so the operator sees a real refusal on a broken shelf; a
78
+ * registry read at resolver-time can set false to keep the hot path
79
+ * cheap.
80
+ * @returns {Promise<LoadedLibrary | import('../core/errors/index.js').RcfError>}
81
+ */
82
+ export async function loadLibrary(libraryRoot, opts = {}) {
83
+ const root = resolve(libraryRoot);
84
+ const metaPath = join(root, 'library.json');
85
+ try {
86
+ await stat(metaPath);
87
+ } catch (err) {
88
+ if (err.code === 'ENOENT') {
89
+ return rcfError({
90
+ kind: 'usage',
91
+ message: `library: no library.json found at ${metaPath}`,
92
+ filePath: metaPath,
93
+ });
94
+ }
95
+ return rcfError({ kind: 'ioFailure', message: `library: ${err.message}`, filePath: metaPath });
96
+ }
97
+ let raw;
98
+ try {
99
+ raw = await readFile(metaPath, 'utf8');
100
+ } catch (err) {
101
+ return rcfError({ kind: 'ioFailure', message: `library: read failed: ${err.message}`, filePath: metaPath });
102
+ }
103
+ let doc;
104
+ try {
105
+ doc = JSON.parse(raw);
106
+ } catch (err) {
107
+ return rcfError({ kind: 'parseFailure', message: `library: JSON parse failed: ${err.message}`, filePath: metaPath });
108
+ }
109
+ const shapeError = validateManifestShape(doc, metaPath);
110
+ if (shapeError) return shapeError;
111
+
112
+ const loaded = {
113
+ libraryVersion: doc.libraryVersion,
114
+ libraryPrefix: doc.libraryPrefix,
115
+ displayName: doc.displayName,
116
+ publisher: {
117
+ id: doc.publisher.id,
118
+ displayName: doc.publisher.displayName,
119
+ ...(typeof doc.publisher.contact === 'string' ? { contact: doc.publisher.contact } : {}),
120
+ },
121
+ libraryRef: doc.libraryRef,
122
+ bands: normaliseBands(doc.bands),
123
+ blueprints: doc.blueprints.map((b) => ({ slug: b.slug, path: b.path })),
124
+ ...(typeof doc.notes === 'string' ? { notes: doc.notes } : {}),
125
+ root,
126
+ };
127
+
128
+ if (opts.validateBlueprints !== false) {
129
+ const walkErr = await validateDeclaredBlueprints(loaded);
130
+ if (walkErr) return walkErr;
131
+ }
132
+ return loaded;
133
+ }
134
+
135
+ function validateManifestShape(doc, metaPath) {
136
+ if (typeof doc !== 'object' || doc === null) {
137
+ return rcfError({ kind: 'validation', message: 'library.json must be a JSON object', filePath: metaPath });
138
+ }
139
+ if (!Number.isInteger(doc.libraryVersion) || doc.libraryVersion < 1) {
140
+ return rcfError({ kind: 'validation', message: `library.json: libraryVersion must be a positive integer, got ${JSON.stringify(doc.libraryVersion)}`, filePath: metaPath });
141
+ }
142
+ if (doc.libraryVersion > LIBRARY_VERSION_KNOWN) {
143
+ return rcfError({
144
+ kind: 'validation',
145
+ message: `library.json: libraryVersion ${doc.libraryVersion} is newer than this CLI understands (max ${LIBRARY_VERSION_KNOWN}); upgrade rcf-lite.`,
146
+ filePath: metaPath,
147
+ });
148
+ }
149
+ if (typeof doc.libraryPrefix !== 'string' || !KEBAB_SLUG.test(doc.libraryPrefix)) {
150
+ return rcfError({ kind: 'validation', message: `library.json: libraryPrefix '${doc.libraryPrefix}' is not a valid kebab slug`, filePath: metaPath });
151
+ }
152
+ if (typeof doc.displayName !== 'string' || doc.displayName.length === 0) {
153
+ return rcfError({ kind: 'validation', message: 'library.json: displayName is required (non-empty string)', filePath: metaPath });
154
+ }
155
+ if (typeof doc.publisher !== 'object' || doc.publisher === null) {
156
+ return rcfError({ kind: 'validation', message: 'library.json: publisher object is required', filePath: metaPath });
157
+ }
158
+ if (typeof doc.publisher.id !== 'string' || !KEBAB_SLUG.test(doc.publisher.id)) {
159
+ return rcfError({ kind: 'validation', message: `library.json: publisher.id '${doc.publisher.id}' is not a valid short slug`, filePath: metaPath });
160
+ }
161
+ if (typeof doc.publisher.displayName !== 'string' || doc.publisher.displayName.length === 0) {
162
+ return rcfError({ kind: 'validation', message: 'library.json: publisher.displayName is required', filePath: metaPath });
163
+ }
164
+ if (doc.publisher.contact !== undefined && typeof doc.publisher.contact !== 'string') {
165
+ return rcfError({ kind: 'validation', message: 'library.json: publisher.contact must be a string when present', filePath: metaPath });
166
+ }
167
+ if (typeof doc.libraryRef !== 'string' || doc.libraryRef.length === 0) {
168
+ return rcfError({ kind: 'validation', message: 'library.json: libraryRef is required (non-empty string)', filePath: metaPath });
169
+ }
170
+ const bandsError = validateBands(doc.bands, metaPath);
171
+ if (bandsError) return bandsError;
172
+ if (!Array.isArray(doc.blueprints) || doc.blueprints.length === 0) {
173
+ return rcfError({ kind: 'validation', message: 'library.json: blueprints[] is required and must not be empty', filePath: metaPath });
174
+ }
175
+ const seenSlugs = new Set();
176
+ for (const [i, entry] of doc.blueprints.entries()) {
177
+ if (typeof entry !== 'object' || entry === null) {
178
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}] must be an object`, filePath: metaPath });
179
+ }
180
+ if (typeof entry.slug !== 'string' || !KEBAB_SLUG.test(entry.slug)) {
181
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}].slug '${entry.slug}' is not a valid kebab slug`, filePath: metaPath });
182
+ }
183
+ if (seenSlugs.has(entry.slug)) {
184
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}].slug '${entry.slug}' is declared more than once`, filePath: metaPath });
185
+ }
186
+ seenSlugs.add(entry.slug);
187
+ if (typeof entry.path !== 'string' || entry.path.length === 0) {
188
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}].path is required (non-empty string)`, filePath: metaPath });
189
+ }
190
+ if (isAbsolute(entry.path)) {
191
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}].path '${entry.path}' must be relative to the library root`, filePath: metaPath });
192
+ }
193
+ if (entry.path.split(/[\\/]/).some((s) => s === '..')) {
194
+ return rcfError({ kind: 'validation', message: `library.json: blueprints[${i}].path '${entry.path}' contains a '..' segment (parent-directory traversal is refused)`, filePath: metaPath });
195
+ }
196
+ }
197
+ if (doc.notes !== undefined && typeof doc.notes !== 'string') {
198
+ return rcfError({ kind: 'validation', message: 'library.json: notes must be a string when present', filePath: metaPath });
199
+ }
200
+ return null;
201
+ }
202
+
203
+ function validateBands(bands, metaPath) {
204
+ if (typeof bands !== 'object' || bands === null) {
205
+ return rcfError({ kind: 'validation', message: 'library.json: bands object is required', filePath: metaPath });
206
+ }
207
+ if (typeof bands.ac !== 'object' || bands.ac === null) {
208
+ return rcfError({ kind: 'validation', message: 'library.json: bands.ac object is required with { start, end }', filePath: metaPath });
209
+ }
210
+ const err = validateBandRange('bands.ac', bands.ac, metaPath);
211
+ if (err) return err;
212
+ if (bands.suffixBlocks !== undefined) {
213
+ if (!Array.isArray(bands.suffixBlocks)) {
214
+ return rcfError({ kind: 'validation', message: 'library.json: bands.suffixBlocks must be an array when present', filePath: metaPath });
215
+ }
216
+ for (const [i, block] of bands.suffixBlocks.entries()) {
217
+ if (typeof block !== 'object' || block === null) {
218
+ return rcfError({ kind: 'validation', message: `library.json: bands.suffixBlocks[${i}] must be an object`, filePath: metaPath });
219
+ }
220
+ if (typeof block.kind !== 'string' || !KNOWN_SUFFIX_BLOCK_KINDS.has(block.kind)) {
221
+ return rcfError({ kind: 'validation', message: `library.json: bands.suffixBlocks[${i}].kind '${block.kind}' must be one of ${[...KNOWN_SUFFIX_BLOCK_KINDS].join(', ')}`, filePath: metaPath });
222
+ }
223
+ const subErr = validateBandRange(`bands.suffixBlocks[${i}]`, block, metaPath);
224
+ if (subErr) return subErr;
225
+ }
226
+ }
227
+ return null;
228
+ }
229
+
230
+ function validateBandRange(label, range, metaPath) {
231
+ if (!Number.isInteger(range.start) || !Number.isInteger(range.end)) {
232
+ return rcfError({ kind: 'validation', message: `library.json: ${label}.start and ${label}.end must be integers`, filePath: metaPath });
233
+ }
234
+ if (range.start < 1 || range.end > 99999) {
235
+ return rcfError({ kind: 'validation', message: `library.json: ${label} out of allowed 1..99999 range (got ${range.start}..${range.end})`, filePath: metaPath });
236
+ }
237
+ if (range.start > range.end) {
238
+ return rcfError({ kind: 'validation', message: `library.json: ${label}.start (${range.start}) must be <= ${label}.end (${range.end})`, filePath: metaPath });
239
+ }
240
+ return null;
241
+ }
242
+
243
+ function normaliseBands(bands) {
244
+ const out = { ac: { start: bands.ac.start, end: bands.ac.end } };
245
+ if (Array.isArray(bands.suffixBlocks)) {
246
+ out.suffixBlocks = bands.suffixBlocks.map((b) => ({ kind: b.kind, start: b.start, end: b.end }));
247
+ }
248
+ return out;
249
+ }
250
+
251
+ async function validateDeclaredBlueprints(library) {
252
+ for (const entry of library.blueprints) {
253
+ const bpRoot = join(library.root, entry.path);
254
+ const loaded = await loadBlueprint(bpRoot);
255
+ if (loaded.kind) {
256
+ return rcfError({
257
+ kind: 'validation',
258
+ message: `library.json: blueprint '${entry.slug}' at '${entry.path}' failed to load: ${loaded.message}`,
259
+ filePath: bpRoot,
260
+ });
261
+ }
262
+ if (loaded.slug !== entry.slug) {
263
+ return rcfError({
264
+ kind: 'validation',
265
+ message: `library.json: blueprint '${entry.slug}' at '${entry.path}' declares its own slug '${loaded.slug}' on disk (library manifest and blueprint.json must agree)`,
266
+ filePath: bpRoot,
267
+ });
268
+ }
269
+ }
270
+ return null;
271
+ }
@@ -0,0 +1,341 @@
1
+ // Project-config external-library registry, at
2
+ // `rcf/blueprint-libraries.json`. Written and read only by the
3
+ // `rcf define blueprint library` verb family; the manifest walker does
4
+ // not touch it (per spec 4.1 rationale: adding a required cross-cutting
5
+ // section into `manifest.json` ripples through every downstream
6
+ // validator, so the registry sits as a discrete file next to the
7
+ // manifest, exactly like `rcf/.identity/` sits next to it).
8
+ //
9
+ // Phase 2b (this file) covers registry CRUD + band-overlap gates.
10
+ // Phase 2c layers the network fetchers on top and populates the
11
+ // `resolvedSha` / `tarballSha256` provenance fields; a `local` source
12
+ // bypasses both and carries a `local` provenance tag.
13
+ //
14
+ // Spec: external-blueprint-libraries-spec-2026-08-31.md sections 4, 7, 8.3.
15
+
16
+ import { existsSync } from 'node:fs';
17
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
18
+ import { dirname, join } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+
21
+ import { rcfError } from '../core/errors/index.js';
22
+
23
+ export const REGISTRY_VERSION = 1;
24
+ export const REGISTRY_PATH = 'rcf/blueprint-libraries.json';
25
+
26
+ const here = dirname(fileURLToPath(import.meta.url));
27
+ // packages/rcf-lite/src/blueprint -> packages/rcf-lite -> data/
28
+ const CORE_BAND_RESERVATIONS_PATH = join(here, '..', '..', 'data', 'core-band-reservations.json');
29
+
30
+ /**
31
+ * @typedef {object} RegistryEntry
32
+ * @property {string} libraryPrefix
33
+ * @property {'local' | 'git' | 'tarball'} sourceKind
34
+ * @property {string} sourceRef
35
+ * @property {string} [resolvedSha]
36
+ * @property {string} displayName
37
+ * @property {{ id: string, displayName: string, contact?: string }} publisher
38
+ * @property {string} libraryRef
39
+ * @property {{ ac: { start: number, end: number }, suffixBlocks?: Array<{ kind: string, start: number, end: number }> }} bands
40
+ * @property {Array<{ slug: string, path: string }>} [blueprints]
41
+ * Snapshot of the library's `blueprints[]` at add-time. The resolver
42
+ * consults this to locate a blueprint by slug without re-reading
43
+ * `library.json` on every `blueprint add`. Absent snapshot falls back
44
+ * to the conventional `blueprints/<slug>/` layout (see shelf-resolver
45
+ * findBlueprintEntry).
46
+ * @property {string} addedAt RFC 3339
47
+ * @property {'operator'} reviewedBy
48
+ * @property {{ tier: 'local' | 'git' | 'tarball', shaVerifiedAt?: string, tarballSha256?: string }} provenance
49
+ * @property {string} cachePath
50
+ */
51
+
52
+ /**
53
+ * @typedef {object} LibraryRegistry
54
+ * @property {number} registryVersion
55
+ * @property {RegistryEntry[]} libraries
56
+ */
57
+
58
+ /**
59
+ * Read the registry from a project. Absent file is not an error: a
60
+ * project that has never added a library returns an empty registry.
61
+ *
62
+ * @param {string} projectRoot - absolute path
63
+ * @returns {Promise<LibraryRegistry | import('../core/errors/index.js').RcfError>}
64
+ */
65
+ export async function readLibraryRegistry(projectRoot) {
66
+ const path = join(projectRoot, REGISTRY_PATH);
67
+ if (!existsSync(path)) {
68
+ return { registryVersion: REGISTRY_VERSION, libraries: [] };
69
+ }
70
+ let raw;
71
+ try {
72
+ raw = await readFile(path, 'utf8');
73
+ } catch (err) {
74
+ return rcfError({ kind: 'ioFailure', message: `library registry: read failed: ${err.message}`, filePath: path });
75
+ }
76
+ let doc;
77
+ try {
78
+ doc = JSON.parse(raw);
79
+ } catch (err) {
80
+ return rcfError({ kind: 'parseFailure', message: `library registry: JSON parse failed: ${err.message}`, filePath: path });
81
+ }
82
+ const err = validateRegistryShape(doc, path);
83
+ if (err) return err;
84
+ return doc;
85
+ }
86
+
87
+ /**
88
+ * Persist a registry to disk. Overwrites the whole file (registry
89
+ * writes are always full-file for legibility; the file is small).
90
+ *
91
+ * @param {string} projectRoot
92
+ * @param {LibraryRegistry} registry
93
+ * @param {object} [opts]
94
+ * @param {boolean} [opts.dryRun]
95
+ * @returns {Promise<{ written: boolean, path: string } | import('../core/errors/index.js').RcfError>}
96
+ */
97
+ export async function writeLibraryRegistry(projectRoot, registry, opts = {}) {
98
+ const path = join(projectRoot, REGISTRY_PATH);
99
+ const err = validateRegistryShape(registry, path);
100
+ if (err) return err;
101
+ if (opts.dryRun === true) return { written: false, path };
102
+ try {
103
+ await mkdir(dirname(path), { recursive: true });
104
+ await writeFile(path, `${JSON.stringify(registry, null, 2)}\n`, 'utf8');
105
+ } catch (writeErr) {
106
+ return rcfError({ kind: 'ioFailure', message: `library registry: write failed: ${writeErr.message}`, filePath: path });
107
+ }
108
+ return { written: true, path };
109
+ }
110
+
111
+ /**
112
+ * @param {LibraryRegistry} registry
113
+ * @param {string} libraryPrefix
114
+ * @returns {RegistryEntry | undefined}
115
+ */
116
+ export function findLibrary(registry, libraryPrefix) {
117
+ if (!registry || !Array.isArray(registry.libraries)) return undefined;
118
+ return registry.libraries.find((l) => l.libraryPrefix === libraryPrefix);
119
+ }
120
+
121
+ /**
122
+ * Load the core-shelf band reservations shipped alongside rcf-lite.
123
+ * Read-through with cache would be fine, but the file is tiny so we
124
+ * re-read on demand; keeps tests hermetic against a stale singleton.
125
+ *
126
+ * @param {string} [dataFilePath] - override for tests
127
+ * @returns {Promise<{ ac: Array<{ blueprint: string, start: number, end: number }>, suffixBlocks: Array<{ blueprint: string, kind: string, start: number, end: number }> }>}
128
+ */
129
+ export async function loadCoreBandReservations(dataFilePath = CORE_BAND_RESERVATIONS_PATH) {
130
+ try {
131
+ const raw = await readFile(dataFilePath, 'utf8');
132
+ const doc = JSON.parse(raw);
133
+ return {
134
+ ac: Array.isArray(doc.ac) ? doc.ac : [],
135
+ suffixBlocks: Array.isArray(doc.suffixBlocks) ? doc.suffixBlocks : [],
136
+ };
137
+ } catch {
138
+ return { ac: [], suffixBlocks: [] };
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Add-time band-overlap gate. Refuses when the candidate library's
144
+ * declared bands (`ac`, `suffixBlocks[]`) overlap either an
145
+ * already-registered library or a core-shelf reservation.
146
+ *
147
+ * @param {object} args
148
+ * @param {{ libraryPrefix: string, bands: { ac: { start: number, end: number }, suffixBlocks?: Array<{ kind: string, start: number, end: number }> } }} args.candidate
149
+ * @param {LibraryRegistry} args.registry
150
+ * @param {{ ac: Array<{ blueprint: string, start: number, end: number }>, suffixBlocks: Array<{ blueprint: string, kind: string, start: number, end: number }> }} args.coreReservations
151
+ * @returns {null | import('../core/errors/index.js').RcfError}
152
+ */
153
+ export function detectBandOverlap({ candidate, registry, coreReservations }) {
154
+ // AC band: check against every registered library and every core row.
155
+ const cand = candidate.bands.ac;
156
+ for (const reg of registry.libraries) {
157
+ if (reg.libraryPrefix === candidate.libraryPrefix) continue;
158
+ if (rangesOverlap(cand, reg.bands.ac)) {
159
+ return rcfError({
160
+ kind: 'usage',
161
+ message: `AC band ${cand.start}-${cand.end} overlaps registered library '${reg.libraryPrefix}' (${reg.bands.ac.start}-${reg.bands.ac.end}).`,
162
+ });
163
+ }
164
+ }
165
+ for (const core of coreReservations.ac) {
166
+ if (rangesOverlap(cand, core)) {
167
+ return rcfError({
168
+ kind: 'usage',
169
+ message: `AC band ${cand.start}-${cand.end} overlaps core-shelf blueprint '${core.blueprint}' (${core.start}-${core.end}).`,
170
+ });
171
+ }
172
+ }
173
+ // Suffix blocks: per-kind overlap.
174
+ const suffixBlocks = candidate.bands.suffixBlocks ?? [];
175
+ for (const block of suffixBlocks) {
176
+ for (const reg of registry.libraries) {
177
+ if (reg.libraryPrefix === candidate.libraryPrefix) continue;
178
+ for (const other of reg.bands.suffixBlocks ?? []) {
179
+ if (other.kind === block.kind && rangesOverlap(block, other)) {
180
+ return rcfError({
181
+ kind: 'usage',
182
+ message: `suffix block ${block.kind} ${block.start}-${block.end} overlaps registered library '${reg.libraryPrefix}' (${other.start}-${other.end}).`,
183
+ });
184
+ }
185
+ }
186
+ }
187
+ for (const core of coreReservations.suffixBlocks) {
188
+ if (core.kind === block.kind && rangesOverlap(block, core)) {
189
+ return rcfError({
190
+ kind: 'usage',
191
+ message: `suffix block ${block.kind} ${block.start}-${block.end} overlaps core-shelf blueprint '${core.blueprint}' (${core.start}-${core.end}).`,
192
+ });
193
+ }
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+
199
+ /**
200
+ * Apply-time band gate (spec section 8.3 + open question 9.9 ratified
201
+ * as "add both"). Every contribution id whose numeric portion falls
202
+ * outside the library's declared band is refused, so a library that
203
+ * grew a blueprint outside its declared band (that its own CI should
204
+ * have caught but did not) refuses at the consuming project's `blueprint
205
+ * add`.
206
+ *
207
+ * @param {Array<{ id: string, kind: string }>} stampedContributions
208
+ * @param {{ ac: { start: number, end: number }, suffixBlocks?: Array<{ kind: string, start: number, end: number }> }} bands
209
+ * @returns {null | import('../core/errors/index.js').RcfError}
210
+ */
211
+ export function detectContributionsOutOfBand(stampedContributions, bands) {
212
+ for (const c of stampedContributions) {
213
+ const parts = extractNumericPart(c.id);
214
+ if (!parts) continue;
215
+ if (c.kind === 'req' || c.kind === 'us' || c.kind === 'ts') {
216
+ if (!inRange(parts.number, bands.ac)) {
217
+ return rcfError({
218
+ kind: 'usage',
219
+ message: `contribution ${c.id} (${c.kind}) numeric ${parts.number} falls outside library AC band ${bands.ac.start}-${bands.ac.end}.`,
220
+ });
221
+ }
222
+ } else if (c.kind === 'adr' || c.kind === 'tac') {
223
+ const blocks = (bands.suffixBlocks ?? []).filter((b) => b.kind === c.kind);
224
+ if (blocks.length === 0) continue; // no block declared for this kind
225
+ const hit = blocks.some((b) => inRange(parts.number, b));
226
+ if (!hit) {
227
+ const desc = blocks.map((b) => `${b.start}-${b.end}`).join(', ');
228
+ return rcfError({
229
+ kind: 'usage',
230
+ message: `contribution ${c.id} (${c.kind}) numeric ${parts.number} falls outside library ${c.kind} suffix block(s) ${desc}.`,
231
+ }); // library-facing prefix is added by the CLI edge
232
+ }
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+
238
+ /**
239
+ * Prefix-collision gate for `library add` (spec section 5.1). Refuses
240
+ * when the candidate `libraryPrefix` collides with a core-shelf
241
+ * blueprint slug or with any already-registered library's prefix.
242
+ *
243
+ * @param {object} args
244
+ * @param {string} args.libraryPrefix
245
+ * @param {LibraryRegistry} args.registry
246
+ * @param {string[]} args.coreSlugs
247
+ * @returns {null | import('../core/errors/index.js').RcfError}
248
+ */
249
+ export function detectPrefixCollision({ libraryPrefix, registry, coreSlugs }) {
250
+ if (libraryPrefix.includes(':') || libraryPrefix.includes('/')) {
251
+ return rcfError({ kind: 'usage', message: `library add: libraryPrefix '${libraryPrefix}' must not contain ':' or '/'.` });
252
+ }
253
+ for (const slug of coreSlugs) {
254
+ if (slug === libraryPrefix) {
255
+ return rcfError({ kind: 'usage', message: `library add: libraryPrefix '${libraryPrefix}' collides with core-shelf blueprint slug '${slug}'.` });
256
+ }
257
+ if (slug.startsWith(`${libraryPrefix}-`)) {
258
+ return rcfError({
259
+ kind: 'usage',
260
+ message: `libraryPrefix '${libraryPrefix}' is a boundary-swallowing substring prefix of core-shelf blueprint slug '${slug}'; choose a prefix that does not read as the leading segment of an existing slug.`,
261
+ });
262
+ }
263
+ }
264
+ for (const reg of registry.libraries) {
265
+ if (reg.libraryPrefix === libraryPrefix) {
266
+ return rcfError({ kind: 'usage', message: `library add: libraryPrefix '${libraryPrefix}' is already registered.` });
267
+ }
268
+ }
269
+ return null;
270
+ }
271
+
272
+ /**
273
+ * Extract the leading numeric block from an id like `wsd-auth-oauth2-REQ-1101`
274
+ * or `ADR-1300-deploy-cloudflare-workers`. Returns `{ number }` or null.
275
+ * We do NOT reimplement the id grammar here; the numeric portion of
276
+ * either family shape is unambiguous: the run of digits between two
277
+ * hyphens or between a hyphen and the string end.
278
+ */
279
+ function extractNumericPart(id) {
280
+ const m = /-(\d+)(?:-|$)/.exec(id);
281
+ if (!m) return null;
282
+ return { number: Number(m[1]) };
283
+ }
284
+
285
+ function inRange(n, range) {
286
+ return n >= range.start && n <= range.end;
287
+ }
288
+
289
+ function rangesOverlap(a, b) {
290
+ return !(a.end < b.start || b.end < a.start);
291
+ }
292
+
293
+ function validateRegistryShape(doc, path) {
294
+ if (typeof doc !== 'object' || doc === null) {
295
+ return rcfError({ kind: 'validation', message: 'library registry: must be a JSON object', filePath: path });
296
+ }
297
+ if (!Number.isInteger(doc.registryVersion) || doc.registryVersion < 1) {
298
+ return rcfError({ kind: 'validation', message: `library registry: registryVersion must be a positive integer, got ${JSON.stringify(doc.registryVersion)}`, filePath: path });
299
+ }
300
+ if (doc.registryVersion > REGISTRY_VERSION) {
301
+ return rcfError({ kind: 'validation', message: `library registry: registryVersion ${doc.registryVersion} is newer than this CLI understands (max ${REGISTRY_VERSION}); upgrade rcf-lite.`, filePath: path });
302
+ }
303
+ if (!Array.isArray(doc.libraries)) {
304
+ return rcfError({ kind: 'validation', message: 'library registry: libraries[] is required (may be empty)', filePath: path });
305
+ }
306
+ const seen = new Set();
307
+ for (const [i, entry] of doc.libraries.entries()) {
308
+ if (typeof entry !== 'object' || entry === null) {
309
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}] must be an object`, filePath: path });
310
+ }
311
+ if (typeof entry.libraryPrefix !== 'string') {
312
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].libraryPrefix is required`, filePath: path });
313
+ }
314
+ if (seen.has(entry.libraryPrefix)) {
315
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].libraryPrefix '${entry.libraryPrefix}' is declared more than once`, filePath: path });
316
+ }
317
+ seen.add(entry.libraryPrefix);
318
+ if (!['local', 'git', 'tarball'].includes(entry.sourceKind)) {
319
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].sourceKind '${entry.sourceKind}' must be one of local|git|tarball`, filePath: path });
320
+ }
321
+ if (typeof entry.sourceRef !== 'string' || entry.sourceRef.length === 0) {
322
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].sourceRef is required`, filePath: path });
323
+ }
324
+ if (typeof entry.cachePath !== 'string' || entry.cachePath.length === 0) {
325
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].cachePath is required`, filePath: path });
326
+ }
327
+ if (typeof entry.bands !== 'object' || entry.bands === null || typeof entry.bands.ac !== 'object' || entry.bands.ac === null) {
328
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].bands.ac is required`, filePath: path });
329
+ }
330
+ if (typeof entry.provenance !== 'object' || entry.provenance === null || !['local', 'git', 'tarball'].includes(entry.provenance.tier)) {
331
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].provenance.tier is required (local|git|tarball)`, filePath: path });
332
+ }
333
+ if (entry.provenance.tier !== 'local' && !entry.provenance.shaVerifiedAt) {
334
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}].provenance.shaVerifiedAt is required when tier is '${entry.provenance.tier}'`, filePath: path });
335
+ }
336
+ if (entry.sourceKind === 'local' && entry.resolvedSha !== undefined) {
337
+ return rcfError({ kind: 'validation', message: `library registry: libraries[${i}] sourceKind=local must not carry a resolvedSha`, filePath: path });
338
+ }
339
+ }
340
+ return null;
341
+ }