@elevasis/sdk 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/cli.cjs +951 -171
  2. package/dist/index.d.ts +632 -341
  3. package/dist/index.js +3102 -142
  4. package/dist/node/index.d.ts +1 -0
  5. package/dist/node/index.js +19 -1
  6. package/dist/test-utils/index.d.ts +313 -4
  7. package/dist/test-utils/index.js +3246 -281
  8. package/dist/worker/index.js +3041 -80
  9. package/package.json +3 -3
  10. package/reference/claude-config/hooks/post-edit-validate.mjs +98 -98
  11. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +188 -188
  12. package/reference/claude-config/hooks/tool-failure-recovery.mjs +73 -73
  13. package/reference/claude-config/registries/graph-skills.json +4 -4
  14. package/reference/claude-config/registries/knowledge-flags.json +0 -2
  15. package/reference/claude-config/rules/active-change-index.md +80 -80
  16. package/reference/claude-config/rules/agent-start-here.md +277 -277
  17. package/reference/claude-config/rules/deployment.md +57 -57
  18. package/reference/claude-config/rules/error-handling.md +56 -56
  19. package/reference/claude-config/rules/execution.md +40 -40
  20. package/reference/claude-config/rules/frontend.md +4 -4
  21. package/reference/claude-config/rules/observability.md +31 -31
  22. package/reference/claude-config/rules/operations.md +29 -17
  23. package/reference/claude-config/rules/organization-model.md +110 -84
  24. package/reference/claude-config/rules/organization-os.md +115 -113
  25. package/reference/claude-config/rules/package-taxonomy.md +33 -33
  26. package/reference/claude-config/rules/platform.md +42 -42
  27. package/reference/claude-config/rules/shared-types.md +49 -46
  28. package/reference/claude-config/rules/task-tracking.md +47 -47
  29. package/reference/claude-config/rules/ui.md +200 -200
  30. package/reference/claude-config/rules/vibe.md +235 -235
  31. package/reference/claude-config/scripts/statusline-command.js +18 -18
  32. package/reference/claude-config/settings.json +34 -34
  33. package/reference/claude-config/skills/deploy/{SKILL.md → skill.md} +156 -156
  34. package/reference/claude-config/skills/dsp/SKILL.md +66 -66
  35. package/reference/claude-config/skills/elevasis/SKILL.md +235 -235
  36. package/reference/claude-config/skills/explore/SKILL.md +6 -6
  37. package/reference/claude-config/skills/git-sync/SKILL.md +126 -126
  38. package/reference/claude-config/skills/knowledge/SKILL.md +314 -299
  39. package/reference/claude-config/skills/knowledge/operations/codify-level-a.md +100 -100
  40. package/reference/claude-config/skills/knowledge/operations/codify-level-b.md +159 -159
  41. package/reference/claude-config/skills/knowledge/operations/customers.md +109 -109
  42. package/reference/claude-config/skills/knowledge/operations/features.md +76 -76
  43. package/reference/claude-config/skills/knowledge/operations/goals.md +118 -118
  44. package/reference/claude-config/skills/knowledge/operations/identity.md +93 -93
  45. package/reference/claude-config/skills/knowledge/operations/labels.md +94 -94
  46. package/reference/claude-config/skills/knowledge/operations/offerings.md +109 -109
  47. package/reference/claude-config/skills/knowledge/operations/roles.md +99 -99
  48. package/reference/claude-config/skills/knowledge/operations/techStack.md +30 -30
  49. package/reference/claude-config/skills/project/SKILL.md +1088 -1088
  50. package/reference/claude-config/skills/run-ui/SKILL.md +73 -73
  51. package/reference/claude-config/skills/save/SKILL.md +3 -3
  52. package/reference/claude-config/skills/setup/SKILL.md +275 -275
  53. package/reference/claude-config/skills/status/SKILL.md +59 -59
  54. package/reference/claude-config/skills/submit-request/SKILL.md +180 -180
  55. package/reference/claude-config/skills/sync/SKILL.md +47 -47
  56. package/reference/claude-config/skills/tutorial/SKILL.md +259 -259
  57. package/reference/claude-config/skills/tutorial/progress-template.md +74 -74
  58. package/reference/claude-config/skills/tutorial/technical.md +1303 -1303
  59. package/reference/claude-config/skills/tutorial/vibe-coder.md +890 -890
  60. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +27 -27
  61. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +30 -30
  62. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +73 -73
  63. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +86 -86
  64. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +55 -55
  65. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +97 -97
  66. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +112 -112
  67. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +93 -93
  68. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +58 -58
  69. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +56 -56
  70. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +71 -71
  71. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +83 -83
  72. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +59 -59
  73. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +42 -42
  74. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +60 -60
  75. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +37 -37
  76. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +34 -34
  77. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +38 -38
  78. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +32 -32
  79. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +33 -33
  80. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +69 -69
  81. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +30 -30
  82. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +42 -0
  83. package/reference/claude-config/sync-notes/README.md +43 -43
  84. package/reference/cli.mdx +808 -808
  85. package/reference/concepts.mdx +146 -146
  86. package/reference/deployment/api.mdx +297 -297
  87. package/reference/deployment/command-center.mdx +209 -209
  88. package/reference/deployment/index.mdx +195 -195
  89. package/reference/deployment/provided-features.mdx +107 -107
  90. package/reference/deployment/ui-execution.mdx +250 -250
  91. package/reference/examples/organization-model.ts +146 -83
  92. package/reference/framework/agent.mdx +156 -156
  93. package/reference/framework/index.mdx +195 -195
  94. package/reference/framework/interaction-guidance.mdx +182 -182
  95. package/reference/framework/memory.mdx +326 -326
  96. package/reference/framework/project-structure.mdx +282 -282
  97. package/reference/framework/tutorial-system.mdx +135 -135
  98. package/reference/getting-started.mdx +142 -142
  99. package/reference/index.mdx +106 -106
  100. package/reference/packages/core/src/README.md +14 -14
  101. package/reference/packages/core/src/business/README.md +2 -2
  102. package/reference/packages/core/src/knowledge/README.md +32 -32
  103. package/reference/packages/core/src/organization-model/README.md +149 -149
  104. package/reference/packages/core/src/test-utils/README.md +37 -37
  105. package/reference/packages/ui/src/api/README.md +18 -18
  106. package/reference/packages/ui/src/app/README.md +24 -24
  107. package/reference/packages/ui/src/auth/README.md +18 -18
  108. package/reference/packages/ui/src/components/README.md +24 -24
  109. package/reference/packages/ui/src/execution/README.md +16 -16
  110. package/reference/packages/ui/src/features/README.md +28 -28
  111. package/reference/packages/ui/src/graph/README.md +16 -16
  112. package/reference/packages/ui/src/hooks/README.md +23 -23
  113. package/reference/packages/ui/src/initialization/README.md +19 -19
  114. package/reference/packages/ui/src/knowledge/README.md +31 -31
  115. package/reference/packages/ui/src/organization/README.md +18 -18
  116. package/reference/packages/ui/src/profile/README.md +19 -19
  117. package/reference/packages/ui/src/provider/README.md +32 -32
  118. package/reference/packages/ui/src/router/README.md +18 -18
  119. package/reference/packages/ui/src/sse/README.md +13 -13
  120. package/reference/packages/ui/src/test-utils/README.md +7 -7
  121. package/reference/packages/ui/src/theme/README.md +23 -23
  122. package/reference/packages/ui/src/theme/presets/README.md +19 -19
  123. package/reference/packages/ui/src/types/README.md +16 -16
  124. package/reference/packages/ui/src/utils/README.md +18 -18
  125. package/reference/packages/ui/src/zustand/README.md +18 -18
  126. package/reference/platform-tools/adapters-integration.mdx +301 -301
  127. package/reference/platform-tools/adapters-platform.mdx +553 -553
  128. package/reference/platform-tools/index.mdx +217 -217
  129. package/reference/platform-tools/type-safety.mdx +82 -82
  130. package/reference/resources/index.mdx +349 -349
  131. package/reference/resources/patterns.mdx +449 -449
  132. package/reference/resources/types.mdx +116 -116
  133. package/reference/roadmap.mdx +165 -165
  134. package/reference/runtime.mdx +173 -173
  135. package/reference/scaffold/core/organization-graph.mdx +110 -90
  136. package/reference/scaffold/core/organization-model.mdx +226 -219
  137. package/reference/scaffold/index.mdx +67 -67
  138. package/reference/scaffold/operations/propagation-pipeline.md +77 -77
  139. package/reference/scaffold/operations/scaffold-maintenance.md +12 -12
  140. package/reference/scaffold/operations/workflow-recipes.md +138 -138
  141. package/reference/scaffold/recipes/add-a-feature.md +308 -88
  142. package/reference/scaffold/recipes/add-a-resource.md +134 -110
  143. package/reference/scaffold/recipes/customize-knowledge-browser.md +5 -5
  144. package/reference/scaffold/recipes/customize-organization-model.md +273 -138
  145. package/reference/scaffold/recipes/extend-a-base-entity.md +8 -8
  146. package/reference/scaffold/recipes/extend-crm.md +3 -3
  147. package/reference/scaffold/recipes/extend-lead-gen.md +400 -400
  148. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +118 -118
  149. package/reference/scaffold/recipes/index.md +46 -46
  150. package/reference/scaffold/recipes/query-the-knowledge-graph.md +197 -170
  151. package/reference/scaffold/reference/contracts.md +2101 -2096
  152. package/reference/scaffold/reference/glossary.md +76 -76
  153. package/reference/scaffold/ui/composition-extensibility.mdx +233 -233
  154. package/reference/scaffold/ui/customization.md +243 -243
  155. package/reference/scaffold/ui/feature-flags-and-gating.md +46 -46
  156. package/reference/scaffold/ui/feature-shell.mdx +72 -72
  157. package/reference/scaffold/ui/recipes.md +221 -214
  158. package/reference/spine/spine-primer.md +96 -96
  159. package/reference/templates/index.mdx +47 -47
  160. package/reference/troubleshooting.mdx +223 -223
@@ -1,75 +1,75 @@
1
- ---
2
- title: System Shell & Provider Runtime
3
- description: Current system shell contract for Organization Model systems, manifests, route matching, sidebars, and breadcrumbs.
4
- ---
1
+ ---
2
+ title: System Shell & Provider Runtime
3
+ description: Current system shell contract for Organization Model systems, manifests, route matching, sidebars, and breadcrumbs.
4
+ ---
5
5
  <!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
6
6
  <!-- Regenerate: pnpm scaffold:sync -->
7
7
 
8
-
9
- ## Overview
10
-
11
- The system shell derives app navigation from `OrganizationModel.systems`. System manifests provide implementation hooks such as icons and sidebars; they do not own structural navigation.
12
-
13
- ## Source Of Truth
14
-
15
- - `packages/core/src/organization-model/defaults.ts` -- default system list
16
- - `packages/core/src/organization-model/helpers.ts` -- `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`
17
- - `packages/ui/src/features/registry/types.ts` -- `SystemModule`
18
- - `packages/ui/src/provider/ElevasisSystemsProvider.tsx` -- runtime resolver
19
- - `packages/ui/src/components/navigation/useBreadcrumbs.ts` -- breadcrumb derivation
20
-
21
- ## SystemModule
22
-
23
- ```ts
24
- export interface SystemModule {
25
- key: string
26
- systemId: string
27
- capabilityIds?: string[]
28
- icon?: SystemIconComponent
29
- sidebar?: SystemSidebarComponent
30
- organizationGraph?: { systemId: string }
31
- }
32
- ```
33
-
34
- `systemId` must match an Organization Model system ID. Structural fields such as route lists, nav labels, and nested links belong on `OrganizationModel.systems`.
35
-
36
- ## Shell Model
37
-
38
- `useElevasisSystems()` exposes `shellModel`:
39
-
40
- ```ts
41
- {
42
- systems,
43
- findByPath,
44
- findById,
45
- childrenOf,
46
- ancestorsOf,
47
- parentOf,
48
- topLevel,
49
- uiPositionFor,
50
- requiresAdminFor,
51
- devOnlyFor
52
- }
53
- ```
54
-
55
- Sidebar rendering walks `topLevel()` and `childrenOf(id)`. Breadcrumbs resolve `findByPath(location.pathname)` and then map `ancestorsOf(id)`.
56
-
57
- ## Access
58
-
59
- System access is keyed by Organization Model system ID. `requiresAdmin` and `devOnly` inherit from ancestor system nodes and are applied when deriving visible sidebar entries.
60
-
61
- Routes still need guards:
62
-
63
- ```tsx
64
- <ProtectedRoute>
65
- <SystemGuard systemKey="sales.crm">
66
- <Outlet />
67
- </SystemGuard>
68
- </ProtectedRoute>
69
- ```
70
-
71
- Use `AdminGuard` for pages that require platform-admin privileges.
72
-
73
- ## External Shells
74
-
75
- Host apps pass `SYSTEM_MANIFESTS` or their own `SystemModule[]` into `ElevasisSystemsProvider` and derive sidebar links locally from `shellModel`. There is no separate nav config file to keep in sync.
8
+
9
+ ## Overview
10
+
11
+ The system shell derives app navigation from `OrganizationModel.systems`. System manifests provide implementation hooks such as icons and sidebars; they do not own structural navigation.
12
+
13
+ ## Source Of Truth
14
+
15
+ - `packages/core/src/organization-model/defaults.ts` -- default system list
16
+ - `packages/core/src/organization-model/helpers.ts` -- `childrenOf`, `ancestorsOf`, `parentOf`, `topLevel`, `findByPath`
17
+ - `packages/ui/src/features/registry/types.ts` -- `SystemModule`
18
+ - `packages/ui/src/provider/ElevasisSystemsProvider.tsx` -- runtime resolver
19
+ - `packages/ui/src/components/navigation/useBreadcrumbs.ts` -- breadcrumb derivation
20
+
21
+ ## SystemModule
22
+
23
+ ```ts
24
+ export interface SystemModule {
25
+ key: string
26
+ systemId: string
27
+ capabilityIds?: string[]
28
+ icon?: SystemIconComponent
29
+ sidebar?: SystemSidebarComponent
30
+ organizationGraph?: { systemId: string }
31
+ }
32
+ ```
33
+
34
+ `systemId` must match an Organization Model system ID. Structural fields such as route lists, nav labels, and nested links belong on `OrganizationModel.systems`.
35
+
36
+ ## Shell Model
37
+
38
+ `useElevasisSystems()` exposes `shellModel`:
39
+
40
+ ```ts
41
+ {
42
+ systems,
43
+ findByPath,
44
+ findById,
45
+ childrenOf,
46
+ ancestorsOf,
47
+ parentOf,
48
+ topLevel,
49
+ uiPositionFor,
50
+ requiresAdminFor,
51
+ devOnlyFor
52
+ }
53
+ ```
54
+
55
+ Sidebar rendering walks `topLevel()` and `childrenOf(id)`. Breadcrumbs resolve `findByPath(location.pathname)` and then map `ancestorsOf(id)`.
56
+
57
+ ## Access
58
+
59
+ System access is keyed by Organization Model system ID. `requiresAdmin` and `devOnly` inherit from ancestor system nodes and are applied when deriving visible sidebar entries.
60
+
61
+ Routes still need guards:
62
+
63
+ ```tsx
64
+ <ProtectedRoute>
65
+ <SystemGuard systemKey="sales.crm">
66
+ <Outlet />
67
+ </SystemGuard>
68
+ </ProtectedRoute>
69
+ ```
70
+
71
+ Use `AdminGuard` for pages that require platform-admin privileges.
72
+
73
+ ## External Shells
74
+
75
+ Host apps pass `SYSTEM_MANIFESTS` or their own `SystemModule[]` into `ElevasisSystemsProvider` and derive sidebar links locally from `shellModel`. There is no separate nav config file to keep in sync.
@@ -1,217 +1,224 @@
1
- ---
2
- title: UI Recipes
3
- description: Current recipes for adding pages, system-gated routes, system components, theme tokens, Organization Model sidebar entries, and executable resources.
4
- ---
1
+ ---
2
+ title: UI Recipes
3
+ description: Current recipes for adding pages, system-gated routes, system components, theme tokens, Organization Model sidebar entries, and executable resources.
4
+ ---
5
5
  <!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
6
6
  <!-- Regenerate: pnpm scaffold:sync -->
7
7
 
8
-
9
- # UI Recipes
10
-
11
- ## 1. Add a Top-Level Page
12
-
13
- Create `ui/src/routes/my-system.index.tsx`:
14
-
15
- ```tsx
16
- import { createFileRoute } from '@tanstack/react-router'
17
- import { ProtectedRoute } from '@/features/auth'
18
- import { AppShellContentContainer, AppTopbarAdjusterWrapper, PageContainer } from '@elevasis/ui/layout'
19
- import { MySystemPage } from '@/features/my-system/components/MySystemPage'
20
-
21
- export const Route = createFileRoute('/my-system/')({
22
- component: MySystemRouteComponent
23
- })
24
-
25
- function MySystemRouteComponent() {
26
- return (
27
- <ProtectedRoute>
28
- <AppTopbarAdjusterWrapper>
29
- <AppShellContentContainer>
30
- <PageContainer>
31
- <MySystemPage />
32
- </PageContainer>
33
- </AppShellContentContainer>
34
- </AppTopbarAdjusterWrapper>
35
- </ProtectedRoute>
36
- )
37
- }
38
- ```
39
-
40
- Add the sidebar entry as a system node in `core/config/organization-model.ts`:
41
-
42
- ```ts
43
- systems: {
44
- systems: [
45
- {
46
- id: 'my-system',
47
- label: 'My System',
48
- enabled: true,
49
- path: '/my-system',
50
- icon: 'star',
51
- uiPosition: 'sidebar-primary'
52
- }
53
- ]
54
- }
55
- ```
56
-
57
- TanStack Router derives the path from the filename. The sidebar is derived from `OrganizationModel.systems`.
58
-
59
- ## 2. Add a System-Gated Page
60
-
61
- Wrap the route with `SystemGuard` and use the same system ID as the org model node.
62
-
63
- ```tsx
64
- import { SystemGuard } from '@elevasis/ui/features/auth'
65
-
66
- function MySystemRouteComponent() {
67
- return (
68
- <ProtectedRoute>
69
- <SystemGuard systemKey="my-system">
70
- <AppTopbarAdjusterWrapper>
71
- <AppShellContentContainer>
72
- <PageContainer>
73
- <MySystemPage />
74
- </PageContainer>
75
- </AppShellContentContainer>
76
- </AppTopbarAdjusterWrapper>
77
- </SystemGuard>
78
- </ProtectedRoute>
79
- )
80
- }
81
- ```
82
-
83
- Set `enabled: false` in the system node to hide it by default. Use `requiresAdmin: true` on the system node plus `AdminGuard` in the route for admin-only pages.
84
-
85
- ## 3. Add a Nested Page
86
-
87
- Create a layout file for the section and child route files under the same directory.
88
-
89
- ```tsx
90
- import { createFileRoute, Outlet } from '@tanstack/react-router'
91
- import { ProtectedRoute } from '@/features/auth'
92
-
93
- export const Route = createFileRoute('/reporting')({
94
- component: ReportingLayoutComponent
95
- })
96
-
97
- function ReportingLayoutComponent() {
98
- return (
99
- <ProtectedRoute>
100
- <Outlet />
101
- </ProtectedRoute>
102
- )
103
- }
104
- ```
105
-
106
- Add dotted system nodes for the sidebar hierarchy:
107
-
108
- ```ts
109
- { id: 'reporting', label: 'Reporting', enabled: true, uiPosition: 'sidebar-primary' },
110
- { id: 'reporting.overview', label: 'Overview', enabled: true, path: '/reporting/overview' },
111
- { id: 'reporting.reports', label: 'Reports', enabled: true, path: '/reporting/reports' }
112
- ```
113
-
114
- Containers omit `path`; leaves provide `path`.
115
-
116
- ## 4. Add a System-Scoped Component
117
-
118
- Use `ui/src/features/<name>/` when logic is shared across routes or owns local state.
119
-
120
- ```text
121
- ui/src/features/reporting/
122
- components/
123
- ReportingOverviewPage.tsx
124
- ReportCard.tsx
125
- hooks/
126
- useReports.ts
127
- utils/
128
- formatReportDate.ts
129
- types.ts
130
- ```
131
-
132
- Use `@/*` imports for app-local cross-system imports and keep route layout concerns in route files.
133
-
134
- ## 5. Change Theme Tokens
135
-
136
- Edit `ui/src/config/theme.ts`.
137
-
138
- ```ts
139
- default: {
140
- label: 'Default',
141
- description: 'Project brand theme',
142
- colors: ['#2563eb', '#080808', '#f2f2f5'],
143
- dark: {
144
- primary: '#2563eb',
145
- primaryContrast: '#ffffff',
146
- background: '#050507',
147
- surface: '#0f0f14',
148
- surfaceHover: '#1a1a22',
149
- text: '#ffffff',
150
- textDimmed: '#b0b0c0',
151
- textSubtle: '#888898',
152
- border: 'rgba(255, 255, 255, 0.07)'
153
- }
154
- }
155
- ```
156
-
157
- All tokens flow into CSS variables. Change `defaultPreset` to alter the initial preset for new users.
158
-
159
- ## 6. Execute a Resource from a Surface
160
-
161
- Declare the resource descriptor in the Organization Model, then derive runtime metadata from that descriptor:
162
-
163
- ```ts
164
- // core/config/organization-model.ts
165
- import { defineResources } from '@elevasis/core/organization-model'
166
-
167
- export const resourceDescriptors = defineResources({
168
- writeNote: {
169
- id: 'write-note',
170
- kind: 'workflow',
171
- systemId: 'sys.sales',
172
- ownerRoleId: 'role-sales-ops',
173
- status: 'active'
174
- }
175
- })
176
-
177
- // operations/src/write-note/index.ts
178
- config: {
179
- resource: resourceDescriptors.writeNote,
180
- resourceId: resourceDescriptors.writeNote.id,
181
- name: 'Write Note',
182
- type: resourceDescriptors.writeNote.kind,
183
- version: '1.0.0',
184
- status: 'prod',
185
- category: 'production'
186
- }
187
- ```
188
-
189
- Render the deployed workflow with `RunResourceButton`:
190
-
191
- ```tsx
192
- import { RunResourceButton } from '@elevasis/ui/components'
193
- import { writeNoteInputSchema } from '@core/types'
194
-
195
- export function DealPanel({ dealId }: { dealId: string }) {
196
- return (
197
- <RunResourceButton
198
- resourceId="write-note"
199
- resourceType="workflow"
200
- label="Write Note"
201
- getInput={() => ({
202
- schema: writeNoteInputSchema,
203
- defaults: { dealId }
204
- })}
205
- />
206
- )
207
- }
208
- ```
209
-
210
- `resourceDescriptors.writeNote.id` is the single authored ID. `RunResourceButton` still receives the deployed runtime ID. `links[].nodeId` binds the resource into the Organization Model graph. `category` drives operational filtering for production, diagnostic, internal, and testing resources.
211
-
212
- ## Cross-References
213
-
214
- - `./feature-flags-and-gating.md` -- system and admin access model
215
- - `./feature-shell.mdx` -- provider and sidebar derivation
216
- - `./customization.md` -- system sidebar customization
217
- - `ui/src/config/README.md` -- theme, background, and loader config
8
+
9
+ # UI Recipes
10
+
11
+ ## 1. Add a Top-Level Page
12
+
13
+ Create `ui/src/routes/my-system.index.tsx`:
14
+
15
+ ```tsx
16
+ import { createFileRoute } from '@tanstack/react-router'
17
+ import { ProtectedRoute } from '@/features/auth'
18
+ import { AppShellContentContainer, AppTopbarAdjusterWrapper, PageContainer } from '@elevasis/ui/layout'
19
+ import { MySystemPage } from '@/features/my-system/components/MySystemPage'
20
+
21
+ export const Route = createFileRoute('/my-system/')({
22
+ component: MySystemRouteComponent
23
+ })
24
+
25
+ function MySystemRouteComponent() {
26
+ return (
27
+ <ProtectedRoute>
28
+ <AppTopbarAdjusterWrapper>
29
+ <AppShellContentContainer>
30
+ <PageContainer>
31
+ <MySystemPage />
32
+ </PageContainer>
33
+ </AppShellContentContainer>
34
+ </AppTopbarAdjusterWrapper>
35
+ </ProtectedRoute>
36
+ )
37
+ }
38
+ ```
39
+
40
+ Add the sidebar entry as a system node in `core/config/organization-model.ts`:
41
+
42
+ ```ts
43
+ systems: {
44
+ systems: [
45
+ {
46
+ id: 'my-system',
47
+ label: 'My System',
48
+ enabled: true,
49
+ path: '/my-system',
50
+ icon: 'star',
51
+ uiPosition: 'sidebar-primary'
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+
57
+ TanStack Router derives the path from the filename. The sidebar is derived from `OrganizationModel.systems`.
58
+
59
+ ## 2. Add a System-Gated Page
60
+
61
+ Wrap the route with `SystemGuard` and use the same system ID as the org model node.
62
+
63
+ ```tsx
64
+ import { SystemGuard } from '@elevasis/ui/features/auth'
65
+
66
+ function MySystemRouteComponent() {
67
+ return (
68
+ <ProtectedRoute>
69
+ <SystemGuard systemKey="my-system">
70
+ <AppTopbarAdjusterWrapper>
71
+ <AppShellContentContainer>
72
+ <PageContainer>
73
+ <MySystemPage />
74
+ </PageContainer>
75
+ </AppShellContentContainer>
76
+ </AppTopbarAdjusterWrapper>
77
+ </SystemGuard>
78
+ </ProtectedRoute>
79
+ )
80
+ }
81
+ ```
82
+
83
+ Set `enabled: false` in the system node to hide it by default. Use `requiresAdmin: true` on the system node plus `AdminGuard` in the route for admin-only pages.
84
+
85
+ ## 3. Add a Nested Page
86
+
87
+ Create a layout file for the section and child route files under the same directory.
88
+
89
+ ```tsx
90
+ import { createFileRoute, Outlet } from '@tanstack/react-router'
91
+ import { ProtectedRoute } from '@/features/auth'
92
+
93
+ export const Route = createFileRoute('/reporting')({
94
+ component: ReportingLayoutComponent
95
+ })
96
+
97
+ function ReportingLayoutComponent() {
98
+ return (
99
+ <ProtectedRoute>
100
+ <Outlet />
101
+ </ProtectedRoute>
102
+ )
103
+ }
104
+ ```
105
+
106
+ Add dotted system nodes for the sidebar hierarchy:
107
+
108
+ ```ts
109
+ { id: 'reporting', label: 'Reporting', enabled: true, uiPosition: 'sidebar-primary' },
110
+ { id: 'reporting.overview', label: 'Overview', enabled: true, path: '/reporting/overview' },
111
+ { id: 'reporting.reports', label: 'Reports', enabled: true, path: '/reporting/reports' }
112
+ ```
113
+
114
+ Containers omit `path`; leaves provide `path`.
115
+
116
+ ## 4. Add a System-Scoped Component
117
+
118
+ Use `ui/src/features/<name>/` when logic is shared across routes or owns local state.
119
+
120
+ ```text
121
+ ui/src/features/reporting/
122
+ components/
123
+ ReportingOverviewPage.tsx
124
+ ReportCard.tsx
125
+ hooks/
126
+ useReports.ts
127
+ utils/
128
+ formatReportDate.ts
129
+ types.ts
130
+ ```
131
+
132
+ Use `@/*` imports for app-local cross-system imports and keep route layout concerns in route files.
133
+
134
+ ## 5. Change Theme Tokens
135
+
136
+ Edit `ui/src/config/theme.ts`.
137
+
138
+ ```ts
139
+ default: {
140
+ label: 'Default',
141
+ description: 'Project brand theme',
142
+ colors: ['#2563eb', '#080808', '#f2f2f5'],
143
+ dark: {
144
+ primary: '#2563eb',
145
+ primaryContrast: '#ffffff',
146
+ background: '#050507',
147
+ surface: '#0f0f14',
148
+ surfaceHover: '#1a1a22',
149
+ text: '#ffffff',
150
+ textDimmed: '#b0b0c0',
151
+ textSubtle: '#888898',
152
+ border: 'rgba(255, 255, 255, 0.07)'
153
+ }
154
+ }
155
+ ```
156
+
157
+ All tokens flow into CSS variables. Change `defaultPreset` to alter the initial preset for new users.
158
+
159
+ ## 6. Execute a Resource from a Surface
160
+
161
+ Declare the resource descriptor in the Organization Model, then derive runtime metadata from that descriptor:
162
+
163
+ ```ts
164
+ // core/config/organization-model.ts
165
+ import { defineResources } from '@elevasis/core/organization-model'
166
+
167
+ export const resourceDescriptors = defineResources({
168
+ writeNote: {
169
+ id: 'write-note',
170
+ kind: 'workflow',
171
+ systemPath: 'sys.sales',
172
+ ownerRoleId: 'role-sales-ops',
173
+ status: 'active',
174
+ codeRefs: [
175
+ {
176
+ path: 'operations/src/write-note/index.ts',
177
+ role: 'entrypoint',
178
+ symbol: 'writeNoteWorkflow'
179
+ }
180
+ ]
181
+ }
182
+ })
183
+
184
+ // operations/src/write-note/index.ts
185
+ config: {
186
+ resource: resourceDescriptors.writeNote,
187
+ resourceId: resourceDescriptors.writeNote.id,
188
+ name: 'Write Note',
189
+ type: resourceDescriptors.writeNote.kind,
190
+ version: '1.0.0',
191
+ status: 'prod',
192
+ category: 'production'
193
+ }
194
+ ```
195
+
196
+ Render the deployed workflow with `RunResourceButton`:
197
+
198
+ ```tsx
199
+ import { RunResourceButton } from '@elevasis/ui/components'
200
+ import { writeNoteInputSchema } from '@core/types'
201
+
202
+ export function DealPanel({ dealId }: { dealId: string }) {
203
+ return (
204
+ <RunResourceButton
205
+ resourceId="write-note"
206
+ resourceType="workflow"
207
+ label="Write Note"
208
+ getInput={() => ({
209
+ schema: writeNoteInputSchema,
210
+ defaults: { dealId }
211
+ })}
212
+ />
213
+ )
214
+ }
215
+ ```
216
+
217
+ `resourceDescriptors.writeNote.id` is the single authored ID. `RunResourceButton` still receives the deployed runtime ID. `codeRefs` point agents and operators at implementation files, while `links[].nodeId` binds the resource into the Organization Model graph. `category` drives operational filtering for production, diagnostic, internal, and testing resources.
218
+
219
+ ## Cross-References
220
+
221
+ - `./feature-flags-and-gating.md` -- system and admin access model
222
+ - `./feature-shell.mdx` -- provider and sidebar derivation
223
+ - `./customization.md` -- system sidebar customization
224
+ - `ui/src/config/README.md` -- theme, background, and loader config