@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,104 +1,203 @@
1
- # 📚 PACE Standards — Master README
2
-
3
- ## Purpose
4
- This document is the single source of truth for all engineering standards for pace-core and consuming apps.
5
-
6
- ## pace-core Standards (aligned with Cursor rule filenames)
7
-
8
- Each standard document has a corresponding Cursor rule file (`.mdc`) that enforces the standard automatically. The numbering ensures traceability. Standards 00-09 are core standards, while 10-12 are enhanced standards covering additional best practices.
9
-
10
- | Standard | Cursor Rule | Purpose |
11
- |----------|------------|---------|
12
- | **00-pace-core-compliance.md** | `00-pace-core-compliance.mdc` | Enforce pace-core usage patterns and prevent custom solutions |
13
- | **01-standards-compliance.md** | `01-standards-compliance.mdc` | Enforce all pace-core standards across architecture, API, components, code style, security, testing, and RBAC/RLS |
14
- | **02-project-structure.md** | `02-project-structure.mdc` | Define standard folder structure and file organization |
15
- | **03-solid-principles.md** | `03-solid-principles.mdc` | Enforce SOLID architecture principles |
16
- | **04-testing-standards.md** | `04-testing-standards.mdc` | Enforce testing framework consistency and standards |
17
- | **05-bug-reports-and-features.md** | `05-bug-reports-and-features.mdc` | Standardized templates for bug reports and feature requests |
18
- | **06-code-quality.md** | `06-code-quality.mdc` | Enforce code quality standards including TypeScript, ESLint, formatting, performance, and accessibility |
19
- | **07-tech-stack-compliance.md** | `07-tech-stack-compliance.mdc` | Enforce tech stack compliance including Tailwind v4, React 19+, Supabase, and other required technologies |
20
- | **08-markup-quality.md** | `08-markup-quality.mdc` | Enforce clean markup standards, semantic HTML usage, and pace-core component patterns |
21
- | **09-rbac-compliance.md** | `09-rbac-compliance.mdc` | Enforce RBAC contract compliance - strict rules for permission checking, page protection, and RBAC usage patterns |
22
- | **10-error-handling-patterns.md** | `10-error-handling-patterns.mdc` | Enforce consistent error handling patterns including type-safe errors, user-friendly messages, and proper logging |
23
- | **11-performance-optimization.md** | `11-performance-optimization.mdc` | Enforce performance optimization patterns including React memoization, database query optimization, and caching strategies |
24
- | **12-ci-cd-integration.md** | `12-ci-cd-integration.mdc` | Enforce CI/CD integration patterns including automated quality checks, deployment processes, and security scanning |
25
-
26
- **Note**: Standards are human-readable documentation. Rules are AI-optimized directives for Cursor. Both should be kept in sync. Standards 00-09 are core standards, while 10-12 are enhanced standards covering additional best practices.
27
-
28
- ## Consuming App Standards
29
-
30
- All standards in this directory apply to consuming apps. The standards are organized by topic:
31
-
32
- ### Core Standards (00-09)
33
- These are fundamental standards that all consuming apps must follow:
34
- - **00-pace-core-compliance.md** - Use pace-core components, hooks, and utilities
35
- - **01-standards-compliance.md** - Meta-standard for precedence and traceability
36
- - **02-project-structure.md** - Standard folder structure and file organization
37
- - **03-solid-principles.md** - SOLID architecture principles
38
- - **04-testing-standards.md** - Testing framework consistency
39
- - **05-bug-reports-and-features.md** - Issue reporting templates
40
- - **06-code-quality.md** - TypeScript, ESLint, formatting, accessibility
41
- - **07-tech-stack-compliance.md** - Required technology versions
42
- - **08-markup-quality.md** - Clean markup, semantic HTML, CSS configuration
43
- - **09-rbac-compliance.md** - RBAC contract and RLS policy patterns
44
-
45
- ### Enhanced Standards (10-12)
46
- These are best practice standards for advanced patterns:
47
- - **10-error-handling-patterns.md** - Consistent error handling
48
- - **11-performance-optimization.md** - Performance best practices
49
- - **12-ci-cd-integration.md** - CI/CD pipeline patterns
50
-
51
- ## Precedence
52
- 1. Security
53
- 2. API/RPC
54
- 3. Components
55
- 4. Code Style
56
- 5. Testing
57
- 6. Documentation
58
- 7. Consuming App Standards
59
-
60
- ## AI Rules
61
- - Read relevant standards
62
- - Apply Cursor Checklists
63
- - Prefer pace-core for reusable logic
64
- - Update docs on API changes
65
-
66
- ## Cursor Rules
67
-
68
- pace-core provides comprehensive Cursor rules that automatically enforce these standards in consuming apps.
69
-
70
- ### Installation
71
-
72
- Install cursor rules in your consuming app:
73
-
74
- ```bash
75
- node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
76
- ```
77
-
78
- ### Rule Files
79
-
80
- The cursor rules automatically enforce the corresponding standards. Each rule file (`.mdc`) is optimized for AI agents with:
81
- - Clear MUST/SHOULD/MAY directives
82
- - Decision trees for common scenarios
83
- - ✅/❌ code examples
84
- - Actionable checklists
85
-
86
- **Rule Standard Mapping:**
87
- - **00-pace-core-compliance.mdc** `00-pace-core-compliance.md`
88
- - **01-standards-compliance.mdc** `01-standards-compliance.md`
89
- - **02-project-structure.mdc** → `02-project-structure.md`
90
- - **03-solid-principles.mdc** `03-solid-principles.md`
91
- - **04-testing-standards.mdc** `04-testing-standards.md`
92
- - **05-bug-reports-and-features.mdc** `05-bug-reports-and-features.md`
93
- - **06-code-quality.mdc** `06-code-quality.md`
94
- - **07-tech-stack-compliance.mdc** → `07-tech-stack-compliance.md`
95
- - **08-markup-quality.mdc** `08-markup-quality.md`
96
- - **09-rbac-compliance.mdc** `09-rbac-compliance.md`
97
- - **10-error-handling-patterns.mdc** `10-error-handling-patterns.md`
98
- - **11-performance-optimization.mdc** `11-performance-optimization.md`
99
- - **12-ci-cd-integration.mdc** → `12-ci-cd-integration.md`
100
-
101
- ### Documentation
102
-
103
- - [Cursor Rules Quick Start](../getting-started/cursor-rules.md)
104
- - [Cursor Rules README](../../cursor-rules/README.md)
1
+ # Pace Standards
2
+
3
+ This repository defines the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
4
+
5
+ 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.
6
+
7
+ They are the **single source of truth**.
8
+ All other quality tools must align *to these standards*, not reinterpret them.
9
+
10
+ ---
11
+
12
+ ## How to use these standards
13
+
14
+ ### pace-core
15
+ - Treat these standards as **hard constraints**
16
+ - pace-core sets the bar and defines the contracts
17
+ - Any deviation must be explicitly documented here
18
+
19
+ ### Consuming applications
20
+ - Inherit these standards by default
21
+ - Only diverge where a documented exception exists
22
+ - Consuming apps should never weaken standards silently
23
+
24
+ ### AI agents (Cursor, Codex, etc.)
25
+ - Follow these standards **strictly**
26
+ - Do **not** silence rules to "make things pass"
27
+ - If compliance is unclear, stop and report rather than guessing
28
+
29
+ ---
30
+
31
+ ## The Four Layers of Quality Enforcement
32
+
33
+ The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
34
+ They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
35
+
36
+ Think of this as *defence in depth*, not redundancy.
37
+
38
+ ---
39
+
40
+ ### 1. Standards Documents (Source of Truth)
41
+
42
+ **What they are**
43
+ - Human-readable `.md` documents
44
+ - Describe *intent*, *principles*, and *expectations*
45
+ - Technology-agnostic where possible
46
+
47
+ **What they are used for**
48
+ - Defining *what "good" looks like*
49
+ - Onboarding humans and AI agents
50
+ - Resolving ambiguity when tools disagree
51
+ - Designing new rules, lint checks, and audits
52
+
53
+ **What they are NOT**
54
+ - They are not executable
55
+ - They do not enforce anything by themselves
56
+ - They should not contain implementation hacks
57
+
58
+ ➡️ **If there is a conflict, the standards win.**
59
+
60
+ ---
61
+
62
+ ### 2. Cursor Rules (Real-time Guidance)
63
+
64
+ **What they are**
65
+ - AI-optimised interpretations of the standards
66
+ - Applied while code is being written or modified
67
+ - Prevent mistakes *before* they land
68
+
69
+ **What they are used for**
70
+ - Steering AI agents toward correct patterns
71
+ - Enforcing architectural intent during development
72
+ - Reducing rework later in linting or audits
73
+
74
+ **What they are NOT**
75
+ - They are not a replacement for lint or audits
76
+ - They should not invent new standards
77
+ - They should not silence problems "to move on"
78
+
79
+ ➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
80
+
81
+ ---
82
+
83
+ ### 3. ESLint (Fast, Local Static Analysis)
84
+
85
+ **What it is**
86
+ - Deterministic, file-level static analysis
87
+ - Runs locally and in CI
88
+ - Focused on correctness, safety, and consistency
89
+
90
+ **What it is used for**
91
+ - Catching obvious issues early (types, hooks, imports, patterns)
92
+ - Enforcing mechanically checkable rules
93
+ - Preventing regressions during refactors
94
+
95
+ **What it is NOT**
96
+ - ESLint should not encode complex business rules
97
+ - It should not contain subjective or architectural debates
98
+ - It should not be silenced to "get green builds"
99
+
100
+ ➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
101
+
102
+ ---
103
+
104
+ ### 4. Audit Tool (Deep, System-Level Analysis)
105
+
106
+ **What it is**
107
+ - A custom static analysis tool
108
+ - Operates across files, folders, and systems
109
+ - Understands pace-core contracts and invariants
110
+
111
+ **What it is used for**
112
+ - Validating architectural compliance (RBAC, data access, boundaries)
113
+ - Catching issues ESLint cannot see
114
+ - Providing actionable remediation plans
115
+
116
+ **What it is NOT**
117
+ - It is not a linter replacement
118
+ - It should not report stylistic issues
119
+ - It should not contradict the standards
120
+
121
+ ➡️ The audit tool answers: *"Is this system actually compliant?"*
122
+
123
+ ---
124
+
125
+ ## How the layers work together
126
+
127
+ | Layer | Strength | Timing |
128
+ |--------------|----------------------------------|-----------------|
129
+ | Standards | Intent & clarity | Design time |
130
+ | Cursor rules | Preventive guidance | Write time |
131
+ | ESLint | Fast mechanical enforcement | Dev / CI |
132
+ | Audit tool | Deep architectural verification | Review / CI |
133
+
134
+ No single layer is sufficient on its own.
135
+ Together, they create a **repeatable, scalable quality system** for both humans and AI.
136
+
137
+ ---
138
+
139
+ ## Standards Documents
140
+
141
+ The standards are organized into **10 files**, each covering a specific domain:
142
+
143
+ ### 0. [Standards Overview](./0-standards-overview.md)
144
+ Entry point, precedence, how standards work, and the four layers of quality enforcement.
145
+
146
+ ### 1. [pace-core Compliance](./1-pace-core-compliance-standards.md)
147
+ pace-core usage patterns, ESLint rules, secure Supabase client requirements, and compliance enforcement.
148
+
149
+ ### 2. [Project Structure](./2-project-structure-standards.md)
150
+ Standard directory structure, file organization patterns, naming conventions, and migration guides.
151
+
152
+ ### 3. [Architecture](./3-architecture-standards.md)
153
+ SOLID principles, component design, API design, and architectural patterns.
154
+
155
+ ### 4. [Code Quality](./4-code-quality-standards.md)
156
+ TypeScript rules, naming conventions, code style patterns, and React patterns.
157
+
158
+ ### 5. [Styling](./5-styling-standards.md)
159
+ **CRITICAL:** Required CSS configuration, Tailwind v4 setup, markup quality, and styling patterns.
160
+
161
+ ### 6. [Security & RBAC](./6-security-rbac-standards.md)
162
+ RLS policy patterns, RBAC integration, helper functions, and security requirements.
163
+
164
+ ### 7. [API & Tech Stack](./7-api-tech-stack-standards.md)
165
+ Required tech stack, API/RPC naming conventions, result shapes, and deprecation policy.
166
+
167
+ ### 8. [Testing & Documentation](./8-testing-documentation-standards.md)
168
+ Testing strategy, documentation requirements, bug report templates, and feature request templates.
169
+
170
+ ### 9. [Operations](./9-operations-standards.md)
171
+ Error handling patterns, performance optimization, caching strategies, and CI/CD integration.
172
+
173
+ ---
174
+
175
+ ## Key Principles
176
+
177
+ - **Do not silence tools** — fix the underlying issue
178
+ - **Do not duplicate rules** — each layer has a purpose
179
+ - **Do not diverge silently** — document exceptions explicitly
180
+ - **Standards always win** — tools must align to them
181
+
182
+ ---
183
+
184
+ ## Getting Started
185
+
186
+ 1. **Read the Overview** - Start with [0-standards-overview.md](./0-standards-overview.md) to understand the system
187
+ 2. **Review Critical Standards** - Pay special attention to:
188
+ - [5-styling-standards.md](./5-styling-standards.md) - **CRITICAL CSS configuration**
189
+ - [1-pace-core-compliance-standards.md](./1-pace-core-compliance-standards.md) - pace-core usage
190
+ - [6-security-rbac-standards.md](./6-security-rbac-standards.md) - Security and RBAC
191
+ 3. **Set Up Quality Enforcement** - Install Cursor rules and ESLint config:
192
+ - `npm run setup:cursor-rules` - Install Cursor rules for AI-assisted enforcement
193
+ - `npm run setup:eslint` - Install ESLint config for real-time linting
194
+ 4. **Run Audits** - Use the audit tool to validate compliance:
195
+ - `npm run audit:pace-core` - Run comprehensive audit organized by standards
196
+ 5. **Follow the Standards** - Use the standards as your guide for all development work
197
+ 6. **Reference When Needed** - Use the standards to resolve conflicts and answer questions
198
+
199
+ ---
200
+
201
+ **Last Updated:** 2025-01-28
202
+ **Version:** 2.0.0
203
+ **Applies to:** All pace-core and consuming apps
@@ -84,7 +84,7 @@ import '@jmruthers/pace-core/src/styles/core.css';
84
84
  ```tsx
85
85
  // ✅ Check if user has proper context
86
86
  const { hasPermission, isLoading } = useCan();
87
- if (isLoading) return <div>Loading permissions...</div>;
87
+ if (isLoading) return <p>Loading permissions...</p>;
88
88
 
89
89
  // ✅ Ensure proper scope
90
90
  <PermissionGuard
@@ -525,8 +525,8 @@ function useDebugRender(componentName: string, props?: any) {
525
525
  function MyComponent({ data, loading }) {
526
526
  useDebugRender('MyComponent', { data, loading });
527
527
 
528
- if (loading) return <div>Loading...</div>;
529
- return <div>{data}</div>;
528
+ if (loading) return <p>Loading...</p>;
529
+ return <p>{data}</p>;
530
530
  }
531
531
  ```
532
532
 
@@ -922,5 +922,5 @@ When issues occur intermittently:
922
922
  - [Common Issues](./common-issues.md) - Specific problem solutions
923
923
  - [Styling Issues](./styling-issues.md) - Component styling problems
924
924
  - [Authentication Guide](../implementation-guides/authentication.md) - Auth troubleshooting
925
- - [Performance Guide](../best-practices/performance.md) - Performance debugging
925
+ - [Performance Optimization](../standards/9-operations-standards.md#performance-optimization) - Performance debugging
926
926
  - [API Reference](../api-reference/) - Component documentation
@@ -142,7 +142,7 @@ import { useUnifiedAuth } from '@jmruthers/pace-core'
142
142
  function DebugComponent() {
143
143
  const auth = useUnifiedAuth()
144
144
  console.log('Auth context:', auth)
145
- return <div>Check console for auth context</div>
145
+ return <p>Check console for auth context</p>
146
146
  }
147
147
  ```
148
148
 
@@ -154,7 +154,7 @@ import { useRBAC } from '@jmruthers/pace-core'
154
154
  function DebugRBAC() {
155
155
  const rbac = useRBAC()
156
156
  console.log('RBAC context:', rbac)
157
- return <div>Check console for RBAC context</div>
157
+ return <p>Check console for RBAC context</p>
158
158
  }
159
159
  ```
160
160
 
@@ -46,8 +46,8 @@ function useDebugRender(componentName: string, props?: any) {
46
46
  function MyComponent({ data, loading }) {
47
47
  useDebugRender('MyComponent', { data, loading });
48
48
 
49
- if (loading) return <div>Loading...</div>;
50
- return <div>{data}</div>;
49
+ if (loading) return <p>Loading...</p>;
50
+ return <p>{data}</p>;
51
51
  }
52
52
  ```
53
53
 
@@ -205,7 +205,7 @@ function MyComponent() {
205
205
  prevState.current = state;
206
206
  }, [state]);
207
207
 
208
- return <div>{state.count}</div>;
208
+ return <p>{state.count}</p>;
209
209
  }
210
210
  ```
211
211
 
@@ -273,7 +273,7 @@ function ExpensiveComponent() {
273
273
  useRenderDebug('ExpensiveComponent');
274
274
 
275
275
  // Component logic here
276
- return <div>Expensive content</div>;
276
+ return <p>Expensive content</p>;
277
277
  }
278
278
  ```
279
279
 
@@ -320,11 +320,11 @@ export function useAuthDebug() {
320
320
  function AuthDebugger() {
321
321
  const auth = useAuthDebug();
322
322
 
323
- if (auth.loading) return <div>Loading auth...</div>;
324
- if (auth.error) return <div>Auth error: {auth.error}</div>;
325
- if (!auth.user) return <div>Not authenticated</div>;
323
+ if (auth.loading) return <p>Loading auth...</p>;
324
+ if (auth.error) return <p>Auth error: {auth.error}</p>;
325
+ if (!auth.user) return <p>Not authenticated</p>;
326
326
 
327
- return <div>Authenticated as: {auth.user.email}</div>;
327
+ return <p>Authenticated as: {auth.user.email}</p>;
328
328
  }
329
329
  ```
330
330
 
@@ -589,7 +589,7 @@ function MyComponent() {
589
589
  useMemoryLeakDetection('MyComponent');
590
590
 
591
591
  // Component logic
592
- return <div>Content</div>;
592
+ return <p>Content</p>;
593
593
  }
594
594
  ```
595
595
 
@@ -31,10 +31,10 @@ function MyComponent() {
31
31
  const { hasPermission } = usePermissions();
32
32
 
33
33
  return (
34
- <div>
34
+ <section>
35
35
  {user && <p>Welcome, {user.email}</p>}
36
36
  {hasPermission('read:users') && <UserList />}
37
- </div>
37
+ </section>
38
38
  );
39
39
  }
40
40
 
@@ -47,10 +47,10 @@ function MyComponent() {
47
47
  const { hasPermission } = useCan();
48
48
 
49
49
  return (
50
- <div>
50
+ <section>
51
51
  {user && <p>Welcome, {user.email}</p>}
52
52
  {hasPermission('read:users') && <UserList />}
53
- </div>
53
+ </section>
54
54
  );
55
55
  }
56
56
  ```
@@ -31,40 +31,45 @@ try {
31
31
  console.warn('Warning: Could not load core-usage-manifest.json for ESLint config');
32
32
  }
33
33
 
34
- // Load pace-core compliance rules
34
+ // Load pace-core ESLint rules
35
35
  let paceCoreRules = {};
36
+ const sourceRulesPath = path.resolve(__dirname, 'eslint-rules/index.cjs');
37
+ const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/index.cjs');
38
+ const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs');
39
+
36
40
  try {
37
- // Try source path first (for development)
38
- const sourceRulesPath = path.resolve(__dirname, 'src/eslint-rules/index.cjs');
41
+ // Try source path first (for development) - new location at package root
39
42
  if (fs.existsSync(sourceRulesPath)) {
40
43
  paceCoreRules = require(sourceRulesPath).rules;
41
44
  } else {
42
45
  // Try dist path (for published package)
43
- const distRulesPath = path.resolve(__dirname, 'dist/eslint-rules/index.cjs');
44
46
  if (fs.existsSync(distRulesPath)) {
45
47
  paceCoreRules = require(distRulesPath).rules;
46
48
  } else {
47
49
  // Try relative to current working directory (for consuming apps)
48
- const cwdRulesPath = path.resolve(process.cwd(), 'node_modules/@jmruthers/pace-core/dist/eslint-rules/index.cjs');
49
50
  if (fs.existsSync(cwdRulesPath)) {
50
51
  paceCoreRules = require(cwdRulesPath).rules;
51
52
  }
52
53
  }
53
54
  }
54
55
  } catch (error) {
55
- // Silently fail - rules will be empty, but config will still work
56
+ // Log warning in development but don't fail - rules will be empty, but config will still work
56
57
  // This allows the config to be used even if rules aren't available
58
+ if (process.env.NODE_ENV !== 'production') {
59
+ console.warn(`Warning: Could not load pace-core ESLint rules: ${error.message}`);
60
+ console.warn(` Tried paths: ${sourceRulesPath}, ${distRulesPath}, ${cwdRulesPath}`);
61
+ }
57
62
  }
58
63
 
59
64
  // Build restricted imports for no-restricted-imports rule (ESLint 9 flat config format)
60
- // ESLint 9 expects an array of objects with 'name' (string or regex) and 'message'
61
- const restrictedImportRules = restrictedImports.map(({ module, reason }) => ({
65
+ // ESLint 9 expects an object with 'paths' array - all restrictions use 'name' property
66
+ const restrictedPaths = restrictedImports.map(({ module, reason }) => ({
62
67
  name: module,
63
68
  message: reason || `Use pace-core alternative instead of direct import of '${module}'`
64
69
  }));
65
70
 
66
- // Also add pattern for @radix-ui/* (catch-all) - use string pattern format
67
- restrictedImportRules.push({
71
+ // Add @radix-ui/* pattern (also uses 'name' property, wildcards work with 'name')
72
+ restrictedPaths.push({
68
73
  name: '@radix-ui/*',
69
74
  message: 'Use pace-core components instead of direct Radix UI imports'
70
75
  });
@@ -77,20 +82,22 @@ module.exports = [
77
82
  }
78
83
  },
79
84
  rules: {
80
- // Import rules
81
- 'pace-core-compliance/no-restricted-imports': 'error',
82
-
83
- // Compliance rules
85
+ // Standard 1: pace-core Compliance
84
86
  'pace-core-compliance/prefer-pace-core-components': 'warn',
85
87
  'pace-core-compliance/prefer-pace-core-hooks': 'warn',
86
88
  'pace-core-compliance/prefer-pace-core-utils': 'warn',
87
89
  'pace-core-compliance/no-local-component-duplication': 'error',
88
- 'pace-core-compliance/no-inline-styles': 'error',
89
-
90
- // Component rules
91
90
  'pace-core-compliance/prefer-pace-core-form': 'error',
92
91
 
93
- // RBAC rules
92
+ // Standard 4: Code Quality
93
+ 'pace-core-compliance/naming-convention': 'warn',
94
+ 'pace-core-compliance/component-naming': 'warn',
95
+ 'pace-core-compliance/type-naming': 'warn',
96
+
97
+ // Standard 5: Styling
98
+ 'pace-core-compliance/no-inline-styles': 'error',
99
+
100
+ // Standard 6: Security & RBAC
94
101
  'pace-core-compliance/no-direct-supabase-client': 'error',
95
102
  'pace-core-compliance/rbac-permission-loading': 'error',
96
103
  'pace-core-compliance/no-direct-rbac-rpc': 'error',
@@ -100,9 +107,32 @@ module.exports = [
100
107
  'pace-core-compliance/no-rbac-wrapper-components': 'error',
101
108
  'pace-core-compliance/no-rbac-wrapper-functions': 'error',
102
109
 
110
+ // Standard 7: API & Tech Stack
111
+ 'pace-core-compliance/rpc-naming-pattern': 'warn',
112
+ 'pace-core-compliance/no-class-components': 'error',
113
+ 'pace-core-compliance/prefer-import-meta-env': 'error',
114
+
115
+ // Standard 8: Testing
116
+ 'pace-core-compliance/test-file-naming': 'warn',
117
+
103
118
  // Also use standard no-restricted-imports (ESLint 9 flat config format)
104
- // Note: ESLint 9 uses a simpler array format
105
- 'no-restricted-imports': ['error', ...restrictedImportRules]
119
+ // ESLint 9 expects an object with 'paths' array containing objects with 'name' property
120
+ 'no-restricted-imports': ['error', {
121
+ paths: restrictedPaths
122
+ }]
123
+ }
124
+ },
125
+ // Override for Edge Functions (Deno runtime)
126
+ // Edge Functions run in Deno, not React, so they cannot use React hooks
127
+ // They need direct Supabase client access and console.log for debugging
128
+ {
129
+ files: ['**/supabase/functions/**/*.{ts,js}'],
130
+ rules: {
131
+ // Allow console.log in Edge Functions for debugging and monitoring
132
+ 'no-console': 'off',
133
+ // Edge Functions cannot use React hooks, so they must use createClient directly
134
+ // The rule already excludes Edge Functions, but we explicitly allow it here for clarity
135
+ 'pace-core-compliance/no-direct-supabase-client': 'off',
106
136
  }
107
137
  }
108
138
  ];