@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -357,15 +357,15 @@ export function Login() {
357
357
  }
358
358
 
359
359
  return (
360
- <div className="min-h-screen flex items-center justify-center bg-sec-50">
361
- <div className="max-w-md w-full space-y-8">
362
- <div>
360
+ <main className="min-h-screen flex items-center justify-center bg-sec-50">
361
+ <section className="max-w-md w-full space-y-8">
362
+ <section>
363
363
  <h2 className="mt-6 text-center text-3xl font-extrabold text-sec-900">
364
364
  Sign in to your account
365
365
  </h2>
366
- </div>
366
+ </section>
367
367
  <form className="mt-8 space-y-6" onSubmit={handleLogin}>
368
- <div>
368
+ <section>
369
369
  <label htmlFor="email" className="sr-only">
370
370
  Email address
371
371
  </label>
@@ -379,8 +379,8 @@ export function Login() {
379
379
  value={email}
380
380
  onChange={(e) => setEmail(e.target.value)}
381
381
  />
382
- </div>
383
- <div>
382
+ </section>
383
+ <section>
384
384
  <label htmlFor="password" className="sr-only">
385
385
  Password
386
386
  </label>
@@ -394,8 +394,8 @@ export function Login() {
394
394
  value={password}
395
395
  onChange={(e) => setPassword(e.target.value)}
396
396
  />
397
- </div>
398
- <div>
397
+ </section>
398
+ <section>
399
399
  <button
400
400
  type="submit"
401
401
  disabled={loading}
@@ -403,10 +403,10 @@ export function Login() {
403
403
  >
404
404
  {loading ? 'Signing in...' : 'Sign in'}
405
405
  </button>
406
- </div>
406
+ </section>
407
407
  </form>
408
- </div>
409
- </div>
408
+ </section>
409
+ </main>
410
410
  )
411
411
  }
412
412
  ```
@@ -427,18 +427,18 @@ export function Dashboard() {
427
427
  const { user, selectedOrganisationId } = useUnifiedAuth()
428
428
 
429
429
  if (!user) {
430
- return <div>Please log in</div>
430
+ return <p>Please log in</p>
431
431
  }
432
432
 
433
433
  return (
434
- <div className="min-h-screen bg-sec-50">
434
+ <main className="min-h-screen bg-sec-50">
435
435
  <nav className="bg-background shadow">
436
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
437
- <div className="flex justify-between h-16">
438
- <div className="flex items-center">
436
+ <section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
437
+ <section className="flex justify-between h-16">
438
+ <section className="flex items-center">
439
439
  <h1 className="text-xl font-semibold">Dashboard</h1>
440
- </div>
441
- <div className="flex items-center space-x-4">
440
+ </section>
441
+ <section className="flex items-center space-x-4">
442
442
  <span className="text-sm text-sec-700">
443
443
  {user.email} | Org: {selectedOrganisationId}
444
444
  </span>
@@ -448,39 +448,39 @@ export function Dashboard() {
448
448
  >
449
449
  Sign out
450
450
  </button>
451
- </div>
452
- </div>
453
- </div>
451
+ </section>
452
+ </section>
453
+ </section>
454
454
  </nav>
455
455
 
456
456
  <main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
457
- <div className="px-4 py-6 sm:px-0">
458
- <div className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
457
+ <section className="px-4 py-6 sm:px-0">
458
+ <section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
459
459
  <h2 className="text-2xl font-bold mb-4">Welcome to your Dashboard</h2>
460
460
 
461
461
  {/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
462
462
  <PagePermissionGuard
463
463
  pageName="dashboard"
464
464
  operation="read"
465
- fallback={<div>You don't have permission to view the dashboard</div>}
465
+ fallback={<p>You don't have permission to view the dashboard</p>}
466
466
  >
467
- <div className="space-y-4">
467
+ <section className="space-y-4">
468
468
  <p>You have access to the dashboard!</p>
469
469
 
470
- <div className="space-x-4">
470
+ <section className="space-x-4">
471
471
  <Link
472
472
  to="/users"
473
473
  className="bg-main-500 text-main-50 px-4 py-2 rounded hover:bg-main-600"
474
474
  >
475
475
  View Users
476
476
  </Link>
477
- </div>
478
- </div>
477
+ </section>
478
+ </section>
479
479
  </PagePermissionGuard>
480
- </div>
481
- </div>
480
+ </section>
481
+ </section>
482
482
  </main>
483
- </div>
483
+ </main>
484
484
  )
485
485
  }
486
486
  ```
@@ -501,21 +501,21 @@ export function Users() {
501
501
  const { user, selectedOrganisationId } = useUnifiedAuth()
502
502
 
503
503
  if (!user) {
504
- return <div>Please log in</div>
504
+ return <p>Please log in</p>
505
505
  }
506
506
 
507
507
  return (
508
- <div className="min-h-screen bg-sec-50">
508
+ <main className="min-h-screen bg-sec-50">
509
509
  <nav className="bg-background shadow">
510
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
511
- <div className="flex justify-between h-16">
512
- <div className="flex items-center">
510
+ <section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
511
+ <section className="flex justify-between h-16">
512
+ <section className="flex items-center">
513
513
  <Link to="/" className="text-main-600 hover:text-main-800 mr-4">
514
514
  ← Back to Dashboard
515
515
  </Link>
516
516
  <h1 className="text-xl font-semibold">Users</h1>
517
- </div>
518
- <div className="flex items-center space-x-4">
517
+ </section>
518
+ <section className="flex items-center space-x-4">
519
519
  <span className="text-sm text-sec-700">
520
520
  {user.email} | Org: {selectedOrganisationId}
521
521
  </span>
@@ -525,35 +525,35 @@ export function Users() {
525
525
  >
526
526
  Sign out
527
527
  </button>
528
- </div>
529
- </div>
530
- </div>
528
+ </section>
529
+ </section>
530
+ </section>
531
531
  </nav>
532
532
 
533
533
  <main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
534
- <div className="px-4 py-6 sm:px-0">
535
- <div className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
534
+ <section className="px-4 py-6 sm:px-0">
535
+ <section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
536
536
  <h2 className="text-2xl font-bold mb-4">User Management</h2>
537
537
 
538
538
  {/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
539
539
  <PagePermissionGuard
540
540
  pageName="users"
541
541
  operation="read"
542
- fallback={<div>You don't have permission to view users</div>}
542
+ fallback={<p>You don't have permission to view users</p>}
543
543
  >
544
- <div className="space-y-4">
544
+ <section className="space-y-4">
545
545
  <p>You have access to the users page!</p>
546
546
  <p>This means your RBAC system is working correctly.</p>
547
547
 
548
- <div className="bg-main-100 border border-main-400 text-main-700 px-4 py-3 rounded">
548
+ <section className="bg-main-100 border border-main-400 text-main-700 px-4 py-3 rounded">
549
549
  <strong>Success!</strong> Your RBAC setup is working correctly.
550
- </div>
551
- </div>
550
+ </section>
551
+ </section>
552
552
  </PagePermissionGuard>
553
- </div>
554
- </div>
553
+ </section>
554
+ </section>
555
555
  </main>
556
- </div>
556
+ </main>
557
557
  )
558
558
  }
559
559
  ```
@@ -134,7 +134,7 @@ function MyComponent() {
134
134
  const supabase = useSecureSupabase();
135
135
 
136
136
  if (!supabase) {
137
- return <div>Loading...</div>;
137
+ return <p>Loading...</p>;
138
138
  }
139
139
 
140
140
  // Organisation context is automatically enforced
@@ -229,38 +229,6 @@ function MyComponent() {
229
229
  }
230
230
  ```
231
231
 
232
- ## Audit Script Detection
233
-
234
- The pace-core audit script comprehensively detects insecure client usage:
235
-
236
- ```bash
237
- npm run audit
238
- ```
239
-
240
- The audit will report violations including:
241
- - ✅ Direct `createClient` imports from `@supabase/supabase-js`
242
- - ✅ Direct `createClient()` function calls
243
- - ✅ Usage of non-secure clients for database queries (`.from()` calls)
244
- - ✅ Files that import `createClient` but don't use `useSecureSupabase()`
245
- - ✅ Variables created with `createClient()` that are used for queries
246
-
247
- **Example audit output**:
248
- ```
249
- ❌ Direct Supabase client usage detected
250
- File: src/components/UserList.tsx
251
- Line: 15
252
- Variable: supabase
253
- Table: users
254
- Reason: Direct Supabase client usage detected. Variable 'supabase' is created with createClient() and used for database queries. You MUST use useSecureSupabase() instead to ensure RLS policies and organisation context are enforced.
255
- Recommendation: Replace with: import { useSecureSupabase } from '@jmruthers/pace-core/rbac'; const supabase = useSecureSupabase();
256
- ```
257
-
258
- The audit tool provides the same level of detection as the ESLint rule, making it useful for:
259
- - Pre-commit checks
260
- - CI/CD pipelines
261
- - Code reviews
262
- - Migration validation
263
-
264
232
  ## Best Practices
265
233
 
266
234
  1. **Always use `useSecureSupabase()`** in React components
@@ -268,7 +236,6 @@ The audit tool provides the same level of detection as the ESLint rule, making i
268
236
  3. **Never import `createClient`** from `@supabase/supabase-js` in component files
269
237
  4. **Verify client security** in critical code paths (optional but recommended)
270
238
  5. **Run ESLint** regularly to catch violations early
271
- 6. **Run audit script** before deploying to catch any missed violations
272
239
 
273
240
  ## Troubleshooting
274
241
 
@@ -324,7 +291,6 @@ The protection system provides:
324
291
  - ✅ **Runtime warnings** to alert developers in development mode
325
292
  - ✅ **Type safety** to verify client security
326
293
  - ✅ **Automatic marking** of secure clients
327
- - ✅ **Audit scripts** to catch violations before deployment
328
294
 
329
295
  By following these guidelines, you ensure that all database operations respect organisation context and RLS policies, preventing security vulnerabilities and data leakage.
330
296
 
@@ -192,7 +192,7 @@ function App() {
192
192
  <PagePermissionGuard
193
193
  pageName="dashboard"
194
194
  operation="read"
195
- fallback={<div>Access Denied</div>}
195
+ fallback={<p>Access Denied</p>}
196
196
  >
197
197
  <Dashboard />
198
198
  </PagePermissionGuard>
@@ -126,14 +126,14 @@ function ProtectedComponent() {
126
126
  const { user, session, isLoading } = useUnifiedAuth();
127
127
 
128
128
  if (isLoading) {
129
- return <div>Loading...</div>;
129
+ return <p>Loading...</p>;
130
130
  }
131
131
 
132
132
  if (!user || !session) {
133
- return <div>Please log in</div>;
133
+ return <p>Please log in</p>;
134
134
  }
135
135
 
136
- return <div>Welcome, {user.email}!</div>;
136
+ return <p>Welcome, {user.email}!</p>;
137
137
  }
138
138
  ```
139
139
 
@@ -672,9 +672,9 @@ test('hides content when user lacks permission', () => {
672
672
  <PermissionEnforcer
673
673
  operation="read"
674
674
  resource="users"
675
- fallback={<div>Access denied</div>}
675
+ fallback={<p>Access denied</p>}
676
676
  >
677
- <div>User data</div>
677
+ <section>User data</section>
678
678
  </PermissionEnforcer>
679
679
  );
680
680
 
@@ -0,0 +1,220 @@
1
+ # Standards Overview
2
+
3
+ **🤖 Cursor Rule**: See [00-standards-overview.mdc](../../cursor-rules/00-standards-overview.mdc) for AI-optimized directives that automatically enforce these standards.
4
+
5
+ ## Purpose
6
+
7
+ This document provides an overview of the pace-core standards system, how it works, and how to use it. These standards are the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
8
+
9
+ These standards are **human-readable first**, but are deliberately structured so they can be **enforced by automation**, including Cursor rules, ESLint, and custom audit tooling.
10
+
11
+ They are the **single source of truth**.
12
+ All other quality tools must align *to these standards*, not reinterpret them.
13
+
14
+ ---
15
+
16
+ ## How to Use These Standards
17
+
18
+ ### pace-core
19
+
20
+ - Treat these standards as **hard constraints**
21
+ - pace-core sets the bar and defines the contracts
22
+ - Any deviation must be explicitly documented here
23
+
24
+ ### Consuming Applications
25
+
26
+ - Inherit these standards by default
27
+ - Only diverge where a documented exception exists
28
+ - Consuming apps should never weaken standards silently
29
+
30
+ ### AI Agents (Cursor, Codex, etc.)
31
+
32
+ - Follow these standards **strictly**
33
+ - Do **not** silence rules to "make things pass"
34
+ - If compliance is unclear, stop and report rather than guessing
35
+
36
+ ---
37
+
38
+ ## The Four Layers of Quality Enforcement
39
+
40
+ The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
41
+ They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
42
+
43
+ Think of this as *defence in depth*, not redundancy.
44
+
45
+ ### 1. Standards Documents (Source of Truth)
46
+
47
+ **What they are**
48
+ - Human-readable `.md` documents
49
+ - Describe *intent*, *principles*, and *expectations*
50
+ - Technology-agnostic where possible
51
+
52
+ **What they are used for**
53
+ - Defining *what "good" looks like*
54
+ - Onboarding humans and AI agents
55
+ - Resolving ambiguity when tools disagree
56
+ - Designing new rules, lint checks, and audits
57
+
58
+ **What they are NOT**
59
+ - They are not executable
60
+ - They do not enforce anything by themselves
61
+ - They should not contain implementation hacks
62
+
63
+ ➡️ **If there is a conflict, the standards win.**
64
+
65
+ ### 2. Cursor Rules (Real-time Guidance)
66
+
67
+ **What they are**
68
+ - AI-optimised interpretations of the standards
69
+ - Applied while code is being written or modified
70
+ - Prevent mistakes *before* they land
71
+
72
+ **What they are used for**
73
+ - Steering AI agents toward correct patterns
74
+ - Enforcing architectural intent during development
75
+ - Reducing rework later in linting or audits
76
+
77
+ **What they are NOT**
78
+ - They are not a replacement for lint or audits
79
+ - They should not invent new standards
80
+ - They should not silence problems "to move on"
81
+
82
+ ➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
83
+
84
+ ### 3. ESLint (Fast, Local Static Analysis)
85
+
86
+ **What it is**
87
+ - Deterministic, file-level static analysis
88
+ - Runs locally and in CI
89
+ - Focused on correctness, safety, and consistency
90
+
91
+ **What it is used for**
92
+ - Catching obvious issues early (types, hooks, imports, patterns)
93
+ - Enforcing mechanically checkable rules
94
+ - Preventing regressions during refactors
95
+
96
+ **What it is NOT**
97
+ - ESLint should not encode complex business rules
98
+ - It should not contain subjective or architectural debates
99
+ - It should not be silenced to "get green builds"
100
+
101
+ ➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
102
+
103
+ ### 4. Audit Tool (Deep, System-Level Analysis)
104
+
105
+ **What it is**
106
+ - A custom static analysis tool
107
+ - Operates across files, folders, and systems
108
+ - Understands pace-core contracts and invariants
109
+ - Organized by the 10-file standards structure
110
+
111
+ **What it is used for**
112
+ - Validating architectural compliance (RBAC, data access, boundaries)
113
+ - Catching issues ESLint cannot see (cross-file analysis, configuration validation)
114
+ - Providing actionable remediation plans
115
+ - System-level checks (provider nesting, RLS policies in SQL, project structure)
116
+
117
+ **What it is NOT**
118
+ - It is not a linter replacement
119
+ - It should not report stylistic issues (handled by ESLint)
120
+ - It should not duplicate ESLint checks (file-level AST analysis)
121
+ - It should not contradict the standards
122
+
123
+ ➡️ The audit tool answers: *"Is this system actually compliant?"*
124
+
125
+ **Usage**: Run `npm run audit:pace-core` in your consuming app to generate a comprehensive audit report organized by standard.
126
+
127
+ ---
128
+
129
+ ## How the Layers Work Together
130
+
131
+ | Layer | Strength | Timing |
132
+ |--------------|----------------------------------|-----------------|
133
+ | Standards | Intent & clarity | Design time |
134
+ | Cursor rules | Preventive guidance | Write time |
135
+ | ESLint | Fast mechanical enforcement | Dev / CI |
136
+ | Audit tool | Deep architectural verification | Review / CI |
137
+
138
+ No single layer is sufficient on its own.
139
+ Together, they create a **repeatable, scalable quality system** for both humans and AI.
140
+
141
+ ---
142
+
143
+ ## Precedence Order
144
+
145
+ When standards conflict, apply this precedence order:
146
+
147
+ 1. **Security** - Security and RBAC standards take highest priority
148
+ 2. **API/RPC** - API contracts and RPC standards
149
+ 3. **Components & Markup** - Component usage and markup quality
150
+ 4. **Code Quality/Style** - TypeScript, naming, code style
151
+ 5. **Testing & Documentation** - Testing and documentation requirements
152
+ 6. **Consuming App Structure** - Project structure and organization
153
+
154
+ **Example:** If a component pattern conflicts with a security requirement, security wins.
155
+
156
+ ---
157
+
158
+ ## Standards File Mapping
159
+
160
+ The standards are organized into 10 files, each covering a specific domain:
161
+
162
+ | File | Standard | Cursor Rule | Purpose |
163
+ |------|----------|------------|---------|
164
+ | `0-standards-overview.md` | Overview | `00-standards-overview.mdc` | This file - entry point and system overview |
165
+ | `1-pace-core-compliance-standards.md` | pace-core Compliance | `01-pace-core-compliance.mdc` | Enforce pace-core usage patterns |
166
+ | `2-project-structure-standards.md` | Project Structure | `02-project-structure.mdc` | Define standard folder structure |
167
+ | `3-architecture-standards.md` | Architecture | `03-architecture.mdc` | Enforce SOLID architecture principles |
168
+ | `4-code-quality-standards.md` | Code Quality | `04-code-quality.mdc` | Enforce code quality standards |
169
+ | `5-styling-standards.md` | Styling | `05-styling.mdc` | Enforce clean markup and styling standards |
170
+ | `6-security-rbac-standards.md` | Security & RBAC | `06-security-rbac.mdc` | Enforce RBAC contract and security |
171
+ | `7-api-tech-stack-standards.md` | API & Tech Stack | `07-api-tech-stack.mdc` | Enforce tech stack versions and API standards |
172
+ | `8-testing-documentation-standards.md` | Testing & Documentation | `08-testing-documentation.mdc` | Enforce testing and documentation standards |
173
+ | `9-operations-standards.md` | Operations | `09-operations.mdc` | Enforce error handling, performance, and CI/CD |
174
+
175
+ ---
176
+
177
+ ## Quick Reference Guide
178
+
179
+ **New to pace-core?** Start here:
180
+ 1. Read [Standards Overview](./0-standards-overview.md) (this file) - Understand the system
181
+ 2. Read [Styling Standards](./5-styling-standards.md) - **CRITICAL:** Required CSS setup
182
+ 3. Read [pace-core Compliance](./1-pace-core-compliance-standards.md) - How to use pace-core
183
+ 4. Read [Project Structure](./2-project-structure-standards.md) - Organize your code
184
+
185
+ **Common Tasks:**
186
+ - **Setting up a new app?** → [Project Structure](./2-project-structure-standards.md) + [Styling Standards](./5-styling-standards.md)
187
+ - **Writing components?** → [Architecture](./3-architecture-standards.md) + [Code Quality](./4-code-quality-standards.md)
188
+ - **Working with RBAC?** → [Security & RBAC](./6-security-rbac-standards.md)
189
+ - **Creating APIs/RPCs?** → [API & Tech Stack](./7-api-tech-stack-standards.md)
190
+ - **Handling errors?** → [Operations](./9-operations-standards.md)
191
+ - **Writing tests?** → [Testing & Documentation](./8-testing-documentation-standards.md)
192
+
193
+ ---
194
+
195
+ ## Key Principles
196
+
197
+ - **Do not silence tools** — fix the underlying issue
198
+ - **Do not duplicate rules** — each layer has a purpose
199
+ - **Do not diverge silently** — document exceptions explicitly
200
+ - **Standards always win** — tools must align to them
201
+
202
+ ---
203
+
204
+ ## Related Documentation
205
+
206
+ - [pace-core Compliance](./1-pace-core-compliance-standards.md) - pace-core usage patterns
207
+ - [Project Structure](./2-project-structure-standards.md) - Project structure and organization
208
+ - [Architecture](./3-architecture-standards.md) - SOLID architecture principles
209
+ - [Code Quality](./4-code-quality-standards.md) - Code quality and TypeScript standards
210
+ - [Styling](./5-styling-standards.md) - Markup and styling standards
211
+ - [Security & RBAC](./6-security-rbac-standards.md) - RBAC and RLS standards
212
+ - [API & Tech Stack](./7-api-tech-stack-standards.md) - Tech stack and API/RPC standards
213
+ - [Testing & Documentation](./8-testing-documentation-standards.md) - Testing and documentation standards
214
+ - [Operations](./9-operations-standards.md) - Error handling, performance, and CI/CD
215
+
216
+ ---
217
+
218
+ **Last Updated:** 2025-01-28
219
+ **Version:** 2.0.0
220
+ **Applies to:** All pace-core and consuming apps