@elevasis/sdk 1.20.2 → 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.
- package/dist/cli.cjs +4220 -1583
- package/dist/index.d.ts +1035 -481
- package/dist/index.js +7381 -4187
- package/dist/node/index.d.ts +1 -3
- package/dist/node/index.js +40 -49
- package/dist/test-utils/index.d.ts +699 -123
- package/dist/test-utils/index.js +3826 -630
- package/dist/worker/index.js +3616 -442
- package/package.json +3 -3
- package/reference/_navigation.md +9 -7
- package/reference/_reference-manifest.json +1 -1
- package/reference/claude-config/hooks/post-edit-validate.mjs +98 -98
- package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +188 -188
- package/reference/claude-config/hooks/tool-failure-recovery.mjs +73 -73
- package/reference/claude-config/registries/graph-skills.json +4 -4
- package/reference/claude-config/registries/knowledge-flags.json +0 -2
- package/reference/claude-config/rules/active-change-index.md +80 -80
- package/reference/claude-config/rules/agent-start-here.md +277 -273
- package/reference/claude-config/rules/deployment.md +57 -57
- package/reference/claude-config/rules/error-handling.md +56 -56
- package/reference/claude-config/rules/execution.md +40 -40
- package/reference/claude-config/rules/frontend.md +4 -4
- package/reference/claude-config/rules/observability.md +31 -31
- package/reference/claude-config/rules/operations.md +29 -17
- package/reference/claude-config/rules/organization-model.md +108 -40
- package/reference/claude-config/rules/organization-os.md +115 -113
- package/reference/claude-config/rules/package-taxonomy.md +33 -33
- package/reference/claude-config/rules/platform.md +42 -42
- package/reference/claude-config/rules/shared-types.md +49 -46
- package/reference/claude-config/rules/task-tracking.md +47 -47
- package/reference/claude-config/rules/ui.md +200 -200
- package/reference/claude-config/rules/vibe.md +235 -231
- package/reference/claude-config/scripts/statusline-command.js +18 -18
- package/reference/claude-config/settings.json +34 -34
- package/reference/claude-config/skills/deploy/{SKILL.md → skill.md} +156 -156
- package/reference/claude-config/skills/dsp/SKILL.md +66 -66
- package/reference/claude-config/skills/elevasis/SKILL.md +235 -235
- package/reference/claude-config/skills/explore/SKILL.md +6 -6
- package/reference/claude-config/skills/git-sync/SKILL.md +126 -126
- package/reference/claude-config/skills/knowledge/SKILL.md +330 -271
- package/reference/claude-config/skills/knowledge/operations/codify-level-a.md +100 -100
- package/reference/claude-config/skills/knowledge/operations/codify-level-b.md +159 -158
- package/reference/claude-config/skills/knowledge/operations/customers.md +109 -109
- package/reference/claude-config/skills/knowledge/operations/features.md +76 -113
- package/reference/claude-config/skills/knowledge/operations/goals.md +118 -118
- package/reference/claude-config/skills/knowledge/operations/identity.md +93 -93
- package/reference/claude-config/skills/knowledge/operations/labels.md +94 -89
- package/reference/claude-config/skills/knowledge/operations/offerings.md +109 -109
- package/reference/claude-config/skills/knowledge/operations/roles.md +99 -99
- package/reference/claude-config/skills/knowledge/operations/techStack.md +30 -30
- package/reference/claude-config/skills/project/SKILL.md +1088 -1088
- package/reference/claude-config/skills/run-ui/SKILL.md +73 -73
- package/reference/claude-config/skills/save/SKILL.md +3 -3
- package/reference/claude-config/skills/setup/SKILL.md +275 -275
- package/reference/claude-config/skills/status/SKILL.md +59 -59
- package/reference/claude-config/skills/submit-request/SKILL.md +180 -180
- package/reference/claude-config/skills/sync/SKILL.md +47 -47
- package/reference/claude-config/skills/tutorial/SKILL.md +259 -259
- package/reference/claude-config/skills/tutorial/progress-template.md +74 -74
- package/reference/claude-config/skills/tutorial/technical.md +1303 -1306
- package/reference/claude-config/skills/tutorial/vibe-coder.md +890 -890
- package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +27 -27
- package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +30 -30
- package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +73 -73
- package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +86 -86
- package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +55 -55
- package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +97 -97
- package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +112 -112
- package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +93 -93
- package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +58 -58
- package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +56 -56
- package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +71 -71
- package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +83 -83
- package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +59 -59
- package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +42 -42
- package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +60 -60
- package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +37 -37
- package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +34 -34
- package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +38 -38
- package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +32 -32
- package/reference/claude-config/sync-notes/2026-05-09-command-system.md +33 -33
- package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +69 -69
- package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +30 -0
- package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +42 -0
- package/reference/claude-config/sync-notes/README.md +43 -43
- package/reference/cli.mdx +808 -668
- package/reference/concepts.mdx +146 -146
- package/reference/deployment/api.mdx +297 -297
- package/reference/deployment/command-center.mdx +209 -209
- package/reference/deployment/index.mdx +195 -195
- package/reference/deployment/provided-features.mdx +107 -93
- package/reference/deployment/ui-execution.mdx +250 -250
- package/reference/examples/organization-model.ts +147 -84
- package/reference/framework/agent.mdx +156 -156
- package/reference/framework/index.mdx +195 -195
- package/reference/framework/interaction-guidance.mdx +182 -182
- package/reference/framework/memory.mdx +326 -326
- package/reference/framework/project-structure.mdx +282 -282
- package/reference/framework/tutorial-system.mdx +135 -135
- package/reference/getting-started.mdx +142 -142
- package/reference/index.mdx +106 -106
- package/reference/packages/core/src/README.md +14 -14
- package/reference/packages/core/src/business/README.md +2 -2
- package/reference/packages/core/src/knowledge/README.md +33 -32
- package/reference/packages/core/src/organization-model/README.md +149 -109
- package/reference/packages/core/src/test-utils/README.md +37 -37
- package/reference/packages/ui/src/api/README.md +18 -18
- package/reference/packages/ui/src/app/README.md +24 -24
- package/reference/packages/ui/src/auth/README.md +18 -18
- package/reference/packages/ui/src/components/README.md +24 -24
- package/reference/packages/ui/src/execution/README.md +16 -16
- package/reference/packages/ui/src/features/README.md +28 -28
- package/reference/packages/ui/src/graph/README.md +16 -16
- package/reference/packages/ui/src/hooks/README.md +23 -23
- package/reference/packages/ui/src/initialization/README.md +19 -19
- package/reference/packages/ui/src/knowledge/README.md +31 -31
- package/reference/packages/ui/src/organization/README.md +18 -18
- package/reference/packages/ui/src/profile/README.md +19 -19
- package/reference/packages/ui/src/provider/README.md +32 -32
- package/reference/packages/ui/src/router/README.md +18 -18
- package/reference/packages/ui/src/sse/README.md +13 -13
- package/reference/packages/ui/src/test-utils/README.md +7 -7
- package/reference/packages/ui/src/theme/README.md +23 -23
- package/reference/packages/ui/src/theme/presets/README.md +19 -19
- package/reference/packages/ui/src/types/README.md +16 -16
- package/reference/packages/ui/src/utils/README.md +18 -18
- package/reference/packages/ui/src/zustand/README.md +18 -18
- package/reference/platform-tools/adapters-integration.mdx +301 -301
- package/reference/platform-tools/adapters-platform.mdx +553 -553
- package/reference/platform-tools/index.mdx +217 -217
- package/reference/platform-tools/type-safety.mdx +82 -82
- package/reference/resources/index.mdx +349 -349
- package/reference/resources/patterns.mdx +449 -449
- package/reference/resources/types.mdx +116 -116
- package/reference/roadmap.mdx +165 -165
- package/reference/runtime.mdx +173 -173
- package/reference/scaffold/core/organization-graph.mdx +110 -89
- package/reference/scaffold/core/organization-model.mdx +226 -171
- package/reference/scaffold/index.mdx +67 -67
- package/reference/scaffold/operations/propagation-pipeline.md +77 -77
- package/reference/scaffold/operations/scaffold-maintenance.md +10 -10
- package/reference/scaffold/operations/workflow-recipes.md +138 -138
- package/reference/scaffold/recipes/add-a-feature.md +310 -88
- package/reference/scaffold/recipes/add-a-resource.md +137 -117
- package/reference/scaffold/recipes/customize-crm-actions.md +439 -439
- package/reference/scaffold/recipes/customize-knowledge-browser.md +384 -0
- package/reference/scaffold/recipes/customize-organization-model.md +281 -118
- package/reference/scaffold/recipes/extend-a-base-entity.md +8 -8
- package/reference/scaffold/recipes/extend-crm.md +40 -39
- package/reference/scaffold/recipes/extend-lead-gen.md +400 -401
- package/reference/scaffold/recipes/gate-by-feature-or-admin.md +118 -114
- package/reference/scaffold/recipes/index.md +47 -46
- package/reference/scaffold/recipes/query-the-knowledge-graph.md +227 -0
- package/reference/scaffold/reference/contracts.md +2389 -2121
- package/reference/scaffold/reference/feature-registry.md +9 -20
- package/reference/scaffold/reference/glossary.md +76 -76
- package/reference/scaffold/ui/composition-extensibility.mdx +233 -233
- package/reference/scaffold/ui/customization.md +243 -243
- package/reference/scaffold/ui/feature-flags-and-gating.md +46 -46
- package/reference/scaffold/ui/feature-shell.mdx +72 -72
- package/reference/scaffold/ui/recipes.md +221 -213
- package/reference/spine/spine-primer.md +96 -96
- package/reference/templates/index.mdx +47 -47
- package/reference/troubleshooting.mdx +223 -223
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
<!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
|
|
2
|
+
<!-- Regenerate: pnpm scaffold:sync -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
title: Customize Knowledge Browser
|
|
6
|
+
description: Author knowledge nodes and customize the Knowledge Browser in a template-derived project -- from zero-config authoring through sidebar composition, custom dispatchers, and direct query access.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Customize Knowledge Browser
|
|
10
|
+
|
|
11
|
+
The Knowledge Browser is a built-in feature surface that renders MDX documents called knowledge nodes. In template-derived projects it is pre-wired and ready to use without any configuration changes.
|
|
12
|
+
|
|
13
|
+
## How It Works
|
|
14
|
+
|
|
15
|
+
In template-derived projects, `ui/vite.config.ts` imports `elevasisVite` from `@elevasis/ui/vite` and spreads it into the plugins array:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
// ui/vite.config.ts
|
|
19
|
+
import { tanstackRouter } from '@tanstack/router-plugin/vite'
|
|
20
|
+
import { elevasisVite } from '@elevasis/ui/vite'
|
|
21
|
+
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
plugins: [tanstackRouter({ autoCodeSplitting: true }), react(), ...elevasisVite()],
|
|
24
|
+
})
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`elevasisVite()` includes `knowledgePlugin()` as one of the plugins it returns. The plugin runs MDX codegen at `buildStart` and handles hot-module updates during `vite dev`. You do not need to touch `vite.config.ts` for the Knowledge Browser to work.
|
|
28
|
+
|
|
29
|
+
Knowledge node icons are authored as semantic data tokens in MDX frontmatter, not as UI library component names. Use `playbook`, `strategy`, or `reference` by node kind, or a project-owned `custom.*` token when the platform catalog does not cover the concept.
|
|
30
|
+
|
|
31
|
+
## Author a Knowledge Node
|
|
32
|
+
|
|
33
|
+
Drop an `.mdx` file anywhere under `core/config/knowledge/nodes/`. Subdirectories are fine -- codegen walks the tree recursively.
|
|
34
|
+
|
|
35
|
+
Required frontmatter fields:
|
|
36
|
+
|
|
37
|
+
- `id` -- unique string; convention is `knowledge.{slug}`
|
|
38
|
+
- `kind` -- one of `playbook`, `strategy`, or `reference`
|
|
39
|
+
- `title` -- display title shown in the Browser tree
|
|
40
|
+
- `description` -- one-sentence summary shown in search results
|
|
41
|
+
- `updatedAt` -- ISO date string (e.g. `2026-05-04`)
|
|
42
|
+
|
|
43
|
+
Optional frontmatter fields:
|
|
44
|
+
|
|
45
|
+
- `icon` -- semantic token such as `playbook` (defaults by kind if omitted)
|
|
46
|
+
- `links` -- array of node IDs or System references this node relates to
|
|
47
|
+
- `ownerIds` -- array of role IDs that own or maintain this node
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
|
|
51
|
+
```mdx
|
|
52
|
+
---
|
|
53
|
+
id: knowledge.internal-runbook
|
|
54
|
+
kind: playbook
|
|
55
|
+
title: Internal Runbook
|
|
56
|
+
description: Operating notes for project-specific support and escalation.
|
|
57
|
+
icon: playbook
|
|
58
|
+
ownerIds:
|
|
59
|
+
- role.operator
|
|
60
|
+
links:
|
|
61
|
+
- system:operations
|
|
62
|
+
updatedAt: 2026-05-04
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Body content here
|
|
66
|
+
|
|
67
|
+
Write plain markdown. A small JSX component allowlist is available in the body:
|
|
68
|
+
`Card`, `Cards`, `Step`, `Steps`, `Callout`, `Tab`, `Tabs`.
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
On the next dev hot-reload or production build the node appears in the Browser. No manual command is required.
|
|
72
|
+
|
|
73
|
+
The template ships a starter node at `core/config/knowledge/nodes/welcome.mdx` so the first `pnpm -C ui dev` produces a non-empty Browser. Delete or rewrite it once you have authored your own nodes.
|
|
74
|
+
|
|
75
|
+
## `elevasis-sdk knowledge:generate` -- Manual One-Shot
|
|
76
|
+
|
|
77
|
+
The CLI command `elevasis-sdk knowledge:generate` refreshes `core/config/knowledge/_generated/nodes.ts` outside a dev or build cycle. It is useful for two situations:
|
|
78
|
+
|
|
79
|
+
- Force-refreshing generated output without starting `vite dev` or running `vite build`
|
|
80
|
+
- Pre-build pipelines that must compile MDX before TypeScript starts
|
|
81
|
+
|
|
82
|
+
The template's `pnpm -C ui build` script calls `pnpm -C .. knowledge:generate` explicitly before `tsc` and `vite build`, so production builds regenerate nodes as a first step without requiring a running dev server.
|
|
83
|
+
|
|
84
|
+
During development the Vite plugin handles codegen automatically on every save. You do not need to run the CLI command manually unless you are operating outside a dev or build cycle.
|
|
85
|
+
|
|
86
|
+
## CSS
|
|
87
|
+
|
|
88
|
+
Import the knowledge subpath CSS in your app entry point:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
// ui/src/main.tsx
|
|
92
|
+
import '@elevasis/ui/knowledge/index.css'
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This is required for Mantine-based knowledge components to render correctly. The CSS is not auto-loaded -- per the `@elevasis/ui` publish rules, consumers import CSS subpaths explicitly.
|
|
96
|
+
|
|
97
|
+
## Customization
|
|
98
|
+
|
|
99
|
+
The sections below cover optional customization for projects that need to diverge from the platform default. The authoring steps above are sufficient for the common case.
|
|
100
|
+
|
|
101
|
+
### Default Mount (What the Template Ships)
|
|
102
|
+
|
|
103
|
+
The template's `ui/src/routes/__root.tsx` registers `knowledgeManifest` from `@elevasis/ui/features/knowledge` in the `ElevasisSystemsProvider` manifest array. That is all that is required for the default Knowledge Browser to appear. The template already does this -- you do not need to add it yourself unless you scaffolded the project manually without using the template.
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
// ui/src/routes/__root.tsx
|
|
107
|
+
import { knowledgeManifest } from '@elevasis/ui/features/knowledge'
|
|
108
|
+
import { ElevasisSystemsProvider } from '@elevasis/ui'
|
|
109
|
+
|
|
110
|
+
<ElevasisSystemsProvider
|
|
111
|
+
organizationModel={canonicalOrganizationModel}
|
|
112
|
+
systems={[crmManifest, leadGenManifest, knowledgeManifest]}
|
|
113
|
+
>
|
|
114
|
+
{/* ... */}
|
|
115
|
+
</ElevasisSystemsProvider>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
A "Knowledge" sidebar entry appears, routes resolve under `/knowledge`, and the Browser renders with the default tree and node viewer. No additional code required.
|
|
119
|
+
|
|
120
|
+
### Extend (Custom Nav Items, Default Chrome)
|
|
121
|
+
|
|
122
|
+
Spread the manifest and override `sidebar` to a custom component. The custom component composes `KnowledgeSidebarMiddle` with a modified items array. This is the shortest path to adding project-specific nav entries while keeping the platform chrome.
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
// ui/src/features/knowledge/sidebar.tsx
|
|
126
|
+
import {
|
|
127
|
+
KnowledgeSidebarMiddle,
|
|
128
|
+
KNOWLEDGE_ITEMS,
|
|
129
|
+
} from '@elevasis/ui/knowledge'
|
|
130
|
+
import { knowledgeManifest, KnowledgeSidebar } from '@elevasis/ui/features/knowledge'
|
|
131
|
+
import { IconBook } from '@tabler/icons-react'
|
|
132
|
+
|
|
133
|
+
const customItems = [
|
|
134
|
+
...KNOWLEDGE_ITEMS,
|
|
135
|
+
{
|
|
136
|
+
label: 'Internal Runbooks',
|
|
137
|
+
to: '/knowledge/by-owner/internal',
|
|
138
|
+
icon: IconBook,
|
|
139
|
+
exact: false,
|
|
140
|
+
},
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
const CustomKnowledgeSidebar = () => (
|
|
144
|
+
<KnowledgeSidebar>
|
|
145
|
+
<KnowledgeSidebarMiddle items={customItems} />
|
|
146
|
+
</KnowledgeSidebar>
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
export const customKnowledgeManifest = {
|
|
150
|
+
...knowledgeManifest,
|
|
151
|
+
sidebar: CustomKnowledgeSidebar,
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Register the custom manifest in place of the default:
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// ui/src/routes/__root.tsx
|
|
159
|
+
import { customKnowledgeManifest } from '../features/knowledge/sidebar'
|
|
160
|
+
|
|
161
|
+
<ElevasisSystemsProvider
|
|
162
|
+
systems={[crmManifest, leadGenManifest, customKnowledgeManifest]}
|
|
163
|
+
>
|
|
164
|
+
{/* ... */}
|
|
165
|
+
</ElevasisSystemsProvider>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`KNOWLEDGE_ITEMS` is the exported default items array (matches the `CRM_ITEMS` shape from `@elevasis/ui/features/crm`). Spread it and append project-specific entries.
|
|
169
|
+
|
|
170
|
+
### Replace (Project-Owned UI)
|
|
171
|
+
|
|
172
|
+
Skip `knowledgeManifest` entirely and build a project-owned route that calls `@elevasis/core/knowledge` directly. Use this when the project's knowledge UI has a different layout, navigation structure, or data sources than the platform default.
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
// ui/src/routes/knowledge/index.tsx
|
|
176
|
+
import { bySystem } from '@elevasis/core/knowledge'
|
|
177
|
+
import { useElevasisSystems } from '@elevasis/ui'
|
|
178
|
+
|
|
179
|
+
function MyCustomKnowledgeView() {
|
|
180
|
+
const { graph } = useElevasisSystems()
|
|
181
|
+
const nodes = bySystem(graph, 'sales.crm')
|
|
182
|
+
return <MyOwnLayout nodes={nodes} />
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The project owns the renderer, layout, search, and navigation. The data layer is shared -- the org model remains the source of truth, and query results are consistent with what `elevasis-sdk knowledge:*` returns at the CLI.
|
|
187
|
+
|
|
188
|
+
The `knowledgePlugin()` Vite plugin is still needed in this path because it generates the `KNOWLEDGE_BODIES` component map that any project-local renderer will need to display MDX bodies. The plugin is included automatically via `elevasisVite()` in the template's `vite.config.ts`.
|
|
189
|
+
|
|
190
|
+
## Exports Reference
|
|
191
|
+
|
|
192
|
+
| Export | Package | Purpose |
|
|
193
|
+
| -------------------------------------------------------- | ------------------------------------ | --------------------------------------------------------- |
|
|
194
|
+
| `elevasisVite` | `@elevasis/ui/vite` | Umbrella plugin factory; includes `knowledgePlugin` |
|
|
195
|
+
| `knowledgeManifest` | `@elevasis/ui/features/knowledge` | Default `SystemModule` manifest; spread or pass directly |
|
|
196
|
+
| `KnowledgeSidebar` | `@elevasis/ui/features/knowledge` | Default sidebar wrapper |
|
|
197
|
+
| `KnowledgeSidebarMiddle` | `@elevasis/ui/features/knowledge` | Sidebar middle section; accepts `items?: NavItem[]` |
|
|
198
|
+
| `KNOWLEDGE_ITEMS` | `@elevasis/ui/knowledge` | Default sidebar nav items array |
|
|
199
|
+
| `KnowledgeBrowser` | `@elevasis/ui/knowledge` | Composed browser: search bar + detail view |
|
|
200
|
+
| `KnowledgeTree` | `@elevasis/ui/knowledge` | Tree for one mount axis |
|
|
201
|
+
| `KnowledgeNodeList` | `@elevasis/ui/knowledge` | Flat list of node cards |
|
|
202
|
+
| `KnowledgeNodeView` | `@elevasis/ui/knowledge` | Single node: title, kind badge, body, edge sidecar |
|
|
203
|
+
| `KnowledgeSearchBar` | `@elevasis/ui/knowledge` | FlexSearch over title, summary, and body |
|
|
204
|
+
| `KnowledgeMDXProvider` | `@elevasis/ui/knowledge` | React context supplying the component allowlist |
|
|
205
|
+
| `knowledgePlugin` | `@elevasis/ui/vite-plugin-knowledge` | Vite plugin for build-time MDX codegen + HMR (direct use) |
|
|
206
|
+
| `bySystem`, `byOntology`, `byKind`, `byOwner`, `governs`, `governedBy` | `@elevasis/core/knowledge` | Pure query functions for project-owned custom UI |
|
|
207
|
+
|
|
208
|
+
For template-derived projects, import `elevasisVite` from `@elevasis/ui/vite` rather than `knowledgePlugin` directly. The direct `knowledgePlugin` import from `@elevasis/ui/vite-plugin-knowledge` remains available for advanced or non-template wiring.
|
|
209
|
+
|
|
210
|
+
## Decision Tree
|
|
211
|
+
|
|
212
|
+
- **Just want knowledge nodes to show up?** Author `.mdx` files under `core/config/knowledge/nodes/`. That is it.
|
|
213
|
+
- **Need extra sidebar nav entries or a different items order?** Spread the manifest, override `sidebar` with a composed `KnowledgeSidebarMiddle` using custom `items`.
|
|
214
|
+
- **Need a completely different layout, data sources, or knowledge UX?** Skip the manifest, own the route, call `@elevasis/core/knowledge` directly.
|
|
215
|
+
- **Need to extend the MDX component allowlist for custom body components?** Pass `extraComponents` to `KnowledgeMDXProvider` in your custom renderer.
|
|
216
|
+
- **Need to add a 6th segment to the sidebar strip?** See the SegmentedControl extension section below.
|
|
217
|
+
- **Need a custom main-pane dispatcher?** See the DescribeNodeView section below.
|
|
218
|
+
|
|
219
|
+
## Phase 1.5 Extensions
|
|
220
|
+
|
|
221
|
+
Phase 1.5 adds two extension surfaces on top of the customization tiers above: a mount-axis `SegmentedControl` strip in the sidebar and a `DescribeNodeView` dispatcher in the main pane. Both are composable -- you can extend the defaults or replace them entirely.
|
|
222
|
+
|
|
223
|
+
### Extending the SegmentedControl (add a 6th segment)
|
|
224
|
+
|
|
225
|
+
Phase 1.5 ships `KnowledgeSidebarMiddle` with a five-segment strip above the search bar:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
[ By System ] [ By Kind ] [ By Owner ] [ Governs ] [ Governed By ]
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Each segment maps to a mount axis exposed by `@elevasis/core/knowledge`. The strip is a `SegmentedControl` from `@mantine/core`; selected axis is local sidebar state and does NOT affect the URL.
|
|
232
|
+
|
|
233
|
+
To add a 6th segment, supply a `segments` prop to `KnowledgeSidebarMiddle`:
|
|
234
|
+
|
|
235
|
+
```tsx
|
|
236
|
+
import {
|
|
237
|
+
KnowledgeSidebar,
|
|
238
|
+
KnowledgeSidebarMiddle,
|
|
239
|
+
KNOWLEDGE_SEGMENTS,
|
|
240
|
+
} from '@elevasis/ui/knowledge'
|
|
241
|
+
import { knowledgeManifest } from '@elevasis/ui/features/knowledge'
|
|
242
|
+
import { byOwner } from '@elevasis/core/knowledge'
|
|
243
|
+
|
|
244
|
+
// KNOWLEDGE_SEGMENTS is the default five-item array; spread and append.
|
|
245
|
+
const customSegments = [
|
|
246
|
+
...KNOWLEDGE_SEGMENTS,
|
|
247
|
+
{
|
|
248
|
+
value: 'by-team',
|
|
249
|
+
label: 'By Team',
|
|
250
|
+
// renderBody receives (graph, knowledgeNodes, selectedNodeId, onSelectNode).
|
|
251
|
+
// Return any ReactNode -- the strip swaps the tree area for your component.
|
|
252
|
+
renderBody: ({ graph, knowledgeNodes, onSelectNode, selectedNodeId }) => {
|
|
253
|
+
const teamNodes = byOwner(graph, 'team:product', knowledgeNodes)
|
|
254
|
+
return (
|
|
255
|
+
<MyTeamList
|
|
256
|
+
nodes={teamNodes}
|
|
257
|
+
onSelect={onSelectNode}
|
|
258
|
+
activeId={selectedNodeId}
|
|
259
|
+
/>
|
|
260
|
+
)
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
]
|
|
264
|
+
|
|
265
|
+
const CustomKnowledgeSidebar = () => (
|
|
266
|
+
<KnowledgeSidebar>
|
|
267
|
+
<KnowledgeSidebarMiddle segments={customSegments} />
|
|
268
|
+
</KnowledgeSidebar>
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
export const customKnowledgeManifest = {
|
|
272
|
+
...knowledgeManifest,
|
|
273
|
+
sidebar: CustomKnowledgeSidebar,
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Rules and constraints:
|
|
278
|
+
|
|
279
|
+
- `value` must be unique across all segments in the array.
|
|
280
|
+
- `label` is the display string inside the `SegmentedControl`; keep it short (under 10 characters) to fit the 320 px sidebar width.
|
|
281
|
+
- `renderBody` receives the same props as the built-in axis renderers. The tree area is replaced by whatever the function returns while that segment is active.
|
|
282
|
+
- The first segment in the array is the default selection on mount.
|
|
283
|
+
- Segment selection is reset to the first item whenever the user navigates to `/knowledge/command-view*` (the command-view sub-route bypasses the strip entirely and renders `CommandViewSidebarContent` instead).
|
|
284
|
+
|
|
285
|
+
### Replacing `DescribeNodeView` Entirely
|
|
286
|
+
|
|
287
|
+
Phase 1.5 introduces `DescribeNodeView` as the main-pane dispatcher. It receives any graph node (not just knowledge nodes) and routes to a per-kind view component:
|
|
288
|
+
|
|
289
|
+
```tsx
|
|
290
|
+
function DescribeNodeView({ node, graph, onNavigateToNode }) {
|
|
291
|
+
switch (node.kind) {
|
|
292
|
+
case 'knowledge': return <KnowledgeNodeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
293
|
+
case 'system': return <SystemDescribeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
294
|
+
case 'resource': return <ResourceDescribeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
295
|
+
case 'organization': return <OrganizationDescribeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
296
|
+
default: return <GenericDescribeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Keep sidebar chrome, replace main pane:** Override the route component in your project's route tree. The default route for `/knowledge/:nodeId` renders `DescribeNodeView`. Replace it with a project-owned component that receives the same `node` and `graph` props:
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
// ui/src/routes/knowledge/$nodeId.tsx
|
|
305
|
+
import { useParams } from '@tanstack/react-router'
|
|
306
|
+
import { useElevasisSystems } from '@elevasis/ui'
|
|
307
|
+
|
|
308
|
+
export default function KnowledgeNodeRoute() {
|
|
309
|
+
const { nodeId } = useParams({ from: '/knowledge/$nodeId' })
|
|
310
|
+
const { graph } = useElevasisSystems()
|
|
311
|
+
const node = graph.nodes.find((n) => n.id === nodeId)
|
|
312
|
+
|
|
313
|
+
if (!node) return <MyNotFoundView />
|
|
314
|
+
|
|
315
|
+
// Completely custom dispatcher -- no platform chrome in the main pane.
|
|
316
|
+
return <MyDescribeNodeView node={node} graph={graph} />
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
The sidebar (managed by the manifest) continues to operate normally. Tree clicks still navigate to `/knowledge/:nodeId`. Only the main pane changes.
|
|
321
|
+
|
|
322
|
+
**Own everything:** Skip `knowledgeManifest` and build your own route tree as described in the Replace section above. Call `@elevasis/core/knowledge` directly for data and supply your own dispatcher.
|
|
323
|
+
|
|
324
|
+
### Overriding Per-Kind Views (extend the dispatcher's switch)
|
|
325
|
+
|
|
326
|
+
If you want the default dispatcher behavior for most kinds but need a custom layout for one kind, extend the exported `DescribeNodeView` rather than replacing it entirely. Phase 1.5 exports `createDescribeNodeDispatcher` for this purpose:
|
|
327
|
+
|
|
328
|
+
```tsx
|
|
329
|
+
import {
|
|
330
|
+
createDescribeNodeDispatcher,
|
|
331
|
+
SystemDescribeView,
|
|
332
|
+
} from '@elevasis/ui/knowledge'
|
|
333
|
+
|
|
334
|
+
// Supply overrides for specific kinds; all others fall through to platform defaults.
|
|
335
|
+
const MyDescribeNodeView = createDescribeNodeDispatcher({
|
|
336
|
+
system: ({ node, graph, onNavigateToNode }) => (
|
|
337
|
+
// Project-specific System view with extra metadata section.
|
|
338
|
+
<MyFeatureDetailView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
339
|
+
),
|
|
340
|
+
// 'knowledge', 'resource', 'organization', and the default fallback
|
|
341
|
+
// are handled by the platform unless you override them here.
|
|
342
|
+
})
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
`createDescribeNodeDispatcher` returns a component with the same props interface as `DescribeNodeView` (`node`, `graph`, `onNavigateToNode`). You can drop it anywhere the default dispatcher is used.
|
|
346
|
+
|
|
347
|
+
Override keys match `OrgGraphNodeKind` values: `'knowledge'`, `'feature'`, `'resource'`, `'organization'`, `'surface'`, `'entity'`, `'action'`. The `default` key overrides the generic fallback for unknown kinds.
|
|
348
|
+
|
|
349
|
+
Each override function receives `{ node, graph, onNavigateToNode }` and must return a `ReactNode`. The platform kind-specific components (`KnowledgeNodeView`, `SystemDescribeView`, etc.) are all exported from `@elevasis/ui/knowledge` so you can compose them inside your override rather than replacing them from scratch:
|
|
350
|
+
|
|
351
|
+
```tsx
|
|
352
|
+
const MyDescribeNodeView = createDescribeNodeDispatcher({
|
|
353
|
+
system: ({ node, graph, onNavigateToNode }) => (
|
|
354
|
+
<>
|
|
355
|
+
{/* Platform view for the standard fields */}
|
|
356
|
+
<SystemDescribeView node={node} graph={graph} onNavigateToNode={onNavigateToNode} />
|
|
357
|
+
{/* Project-specific extension panel below */}
|
|
358
|
+
<MySystemAuditPanel systemId={node.id} />
|
|
359
|
+
</>
|
|
360
|
+
),
|
|
361
|
+
})
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Phase 1.5 Exports Reference
|
|
365
|
+
|
|
366
|
+
The following exports are added in Phase 1.5 on top of the exports table above:
|
|
367
|
+
|
|
368
|
+
| Export | Package | Purpose |
|
|
369
|
+
| ------------------------------ | ------------------------ | ---------------------------------------------------------------------------- |
|
|
370
|
+
| `DescribeNodeView` | `@elevasis/ui/knowledge` | Default graph-node dispatcher; routes by `node.kind` |
|
|
371
|
+
| `createDescribeNodeDispatcher` | `@elevasis/ui/knowledge` | Factory for per-kind overrides; returns a `DescribeNodeView`-shape component |
|
|
372
|
+
| `SystemDescribeView` | `@elevasis/ui/knowledge` | Minimal System node view: path, icon, lifecycle, hierarchy, edges |
|
|
373
|
+
| `ResourceDescribeView` | `@elevasis/ui/knowledge` | Minimal resource node view: resourceType, description, edges |
|
|
374
|
+
| `OrganizationDescribeView` | `@elevasis/ui/knowledge` | Minimal organization node view: label, edges |
|
|
375
|
+
| `GenericDescribeView` | `@elevasis/ui/knowledge` | Key/value fallback for unknown kinds |
|
|
376
|
+
| `KNOWLEDGE_SEGMENTS` | `@elevasis/ui/knowledge` | Default five-segment array for `KnowledgeSidebarMiddle` |
|
|
377
|
+
|
|
378
|
+
`KnowledgeSidebarMiddle` gains an optional `segments?: KnowledgeSegment[]` prop (defaults to `KNOWLEDGE_SEGMENTS`). The `KnowledgeSegment` type is exported from `@elevasis/ui/knowledge`.
|
|
379
|
+
|
|
380
|
+
## See Also
|
|
381
|
+
|
|
382
|
+
- [Composition and Extensibility](../composition-extensibility.mdx) -- the general sidebar override pattern this recipe follows (CRM + delivery examples)
|
|
383
|
+
- [Query the Knowledge Graph](query-the-knowledge-graph.md) -- CLI walkthrough of the same six query axes
|
|
384
|
+
- [Contracts Reference](../reference/contracts.md) -- `SystemModule`, `NavItem`, `OrgKnowledgeNode` TypeScript shapes
|