@jmruthers/pace-core 0.6.6 → 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.
- package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
- package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
- package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
- package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
- package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
- package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
- package/dist/components.d.ts +5 -4
- package/dist/components.js +27 -32
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +18 -17
- package/dist/rbac/index.js +6 -6
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +47 -31
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +1 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -1
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +203 -104
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/eslint-config-pace-core.cjs +21 -10
- package/package.json +6 -5
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +137 -153
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +1 -4
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/storage/README.md +1 -1
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
package/docs/standards/README.md
CHANGED
|
@@ -1,104 +1,203 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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 <
|
|
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 <
|
|
529
|
-
return <
|
|
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
|
|
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 <
|
|
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 <
|
|
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 <
|
|
50
|
-
return <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
324
|
-
if (auth.error) return <
|
|
325
|
-
if (!auth.user) return <
|
|
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 <
|
|
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 <
|
|
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
|
-
<
|
|
34
|
+
<section>
|
|
35
35
|
{user && <p>Welcome, {user.email}</p>}
|
|
36
36
|
{hasPermission('read:users') && <UserList />}
|
|
37
|
-
</
|
|
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
|
-
<
|
|
50
|
+
<section>
|
|
51
51
|
{user && <p>Welcome, {user.email}</p>}
|
|
52
52
|
{hasPermission('read:users') && <UserList />}
|
|
53
|
-
</
|
|
53
|
+
</section>
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
```
|
|
@@ -31,11 +31,11 @@ try {
|
|
|
31
31
|
console.warn('Warning: Could not load core-usage-manifest.json for ESLint config');
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
// Load pace-core
|
|
34
|
+
// Load pace-core ESLint rules
|
|
35
35
|
let paceCoreRules = {};
|
|
36
36
|
try {
|
|
37
|
-
// Try source path first (for development)
|
|
38
|
-
const sourceRulesPath = path.resolve(__dirname, '
|
|
37
|
+
// Try source path first (for development) - new location at package root
|
|
38
|
+
const sourceRulesPath = path.resolve(__dirname, 'eslint-rules/index.cjs');
|
|
39
39
|
if (fs.existsSync(sourceRulesPath)) {
|
|
40
40
|
paceCoreRules = require(sourceRulesPath).rules;
|
|
41
41
|
} else {
|
|
@@ -77,20 +77,23 @@ module.exports = [
|
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
rules: {
|
|
80
|
-
//
|
|
80
|
+
// Standard 1: pace-core Compliance
|
|
81
81
|
'pace-core-compliance/no-restricted-imports': 'error',
|
|
82
|
-
|
|
83
|
-
// Compliance rules
|
|
84
82
|
'pace-core-compliance/prefer-pace-core-components': 'warn',
|
|
85
83
|
'pace-core-compliance/prefer-pace-core-hooks': 'warn',
|
|
86
84
|
'pace-core-compliance/prefer-pace-core-utils': 'warn',
|
|
87
85
|
'pace-core-compliance/no-local-component-duplication': 'error',
|
|
88
|
-
'pace-core-compliance/no-inline-styles': 'error',
|
|
89
|
-
|
|
90
|
-
// Component rules
|
|
91
86
|
'pace-core-compliance/prefer-pace-core-form': 'error',
|
|
92
87
|
|
|
93
|
-
//
|
|
88
|
+
// Standard 4: Code Quality
|
|
89
|
+
'pace-core-compliance/naming-convention': 'warn',
|
|
90
|
+
'pace-core-compliance/component-naming': 'warn',
|
|
91
|
+
'pace-core-compliance/type-naming': 'warn',
|
|
92
|
+
|
|
93
|
+
// Standard 5: Styling
|
|
94
|
+
'pace-core-compliance/no-inline-styles': 'error',
|
|
95
|
+
|
|
96
|
+
// Standard 6: Security & RBAC
|
|
94
97
|
'pace-core-compliance/no-direct-supabase-client': 'error',
|
|
95
98
|
'pace-core-compliance/rbac-permission-loading': 'error',
|
|
96
99
|
'pace-core-compliance/no-direct-rbac-rpc': 'error',
|
|
@@ -100,6 +103,14 @@ module.exports = [
|
|
|
100
103
|
'pace-core-compliance/no-rbac-wrapper-components': 'error',
|
|
101
104
|
'pace-core-compliance/no-rbac-wrapper-functions': 'error',
|
|
102
105
|
|
|
106
|
+
// Standard 7: API & Tech Stack
|
|
107
|
+
'pace-core-compliance/rpc-naming-pattern': 'warn',
|
|
108
|
+
'pace-core-compliance/no-class-components': 'error',
|
|
109
|
+
'pace-core-compliance/prefer-import-meta-env': 'error',
|
|
110
|
+
|
|
111
|
+
// Standard 8: Testing
|
|
112
|
+
'pace-core-compliance/test-file-naming': 'warn',
|
|
113
|
+
|
|
103
114
|
// Also use standard no-restricted-imports (ESLint 9 flat config format)
|
|
104
115
|
// Note: ESLint 9 uses a simpler array format
|
|
105
116
|
'no-restricted-imports': ['error', ...restrictedImportRules]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7",
|
|
4
4
|
"description": "React component library with Tailwind v4",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -79,8 +79,6 @@
|
|
|
79
79
|
"./core-usage-manifest.json": "./core-usage-manifest.json",
|
|
80
80
|
"./cursor-rules": "./cursor-rules",
|
|
81
81
|
"./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
|
|
82
|
-
"./scripts/audit-dependencies": "./scripts/audit/audit-dependencies.cjs",
|
|
83
|
-
"./scripts/audit": "./scripts/audit/index.cjs",
|
|
84
82
|
"./source": {
|
|
85
83
|
"import": "./src/index.ts",
|
|
86
84
|
"default": "./src/index.ts"
|
|
@@ -153,7 +151,8 @@
|
|
|
153
151
|
"core-usage-manifest.json",
|
|
154
152
|
"eslint-config-pace-core.cjs",
|
|
155
153
|
"scripts",
|
|
156
|
-
"cursor-rules"
|
|
154
|
+
"cursor-rules",
|
|
155
|
+
"audit-tool"
|
|
157
156
|
],
|
|
158
157
|
"scripts": {
|
|
159
158
|
"_comment_build": "Build package and documentation",
|
|
@@ -198,7 +197,9 @@
|
|
|
198
197
|
"docs:generate": "node scripts/generate-docs.js generate",
|
|
199
198
|
"docs:update-index": "node scripts/generate-docs.js update-index",
|
|
200
199
|
"docs:generate-api": "node scripts/generate-docs.js generate-api",
|
|
201
|
-
"docs:all": "node scripts/generate-docs.js all"
|
|
200
|
+
"docs:all": "node scripts/generate-docs.js all",
|
|
201
|
+
"_comment_audit": "Audit tool for consuming apps",
|
|
202
|
+
"audit:pace-core": "node packages/core/audit-tool/index.cjs"
|
|
202
203
|
},
|
|
203
204
|
"keywords": [
|
|
204
205
|
"react",
|