@odla-ai/cli 0.25.0 → 0.25.2

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/index.js CHANGED
@@ -49,7 +49,7 @@ import {
49
49
  startHostedSecurityJob,
50
50
  surfacePaths,
51
51
  validateInvocation
52
- } from "./chunk-HG63GLGU.js";
52
+ } from "./chunk-MX6FSJUN.js";
53
53
  export {
54
54
  AGENT_HARNESSES,
55
55
  CAPABILITIES,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odla-ai/cli",
3
- "version": "0.25.0",
3
+ "version": "0.25.2",
4
4
  "description": "Agent-operable CLI for odla provisioning, calendar consent and sync lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/cli",
@@ -39,19 +39,69 @@ hand-author only the namespaces it does not.
39
39
  hands each the same context (`ctx.verifyUser`, `ctx.makeDb`, `ctx.roleFor`,
40
40
  `ctx.isAdmin`), so you never verify a JWT twice. Do NOT hand routes over to
41
41
  chapter in the same change as the framework swap.
42
- 5. **Adopt the host-independent console shell.** Import
43
- `@odla-ai/ui/themes/salt/app.css` once, then render
44
- `<ChapterAdmin chapter={chapter}/>` at the existing `/admin/` mount. The
45
- config supplies brand tokens and the standard sections. Navigation uses
46
- `?tab=` by default, so do not add `/admin/*` SPA rewrites to an ordinary
47
- static site. Legacy path links remain readable.
42
+ 5. **Adopt the host-independent console shell without replacing product
43
+ behavior.** Import the scoped theme, `@odla-ai/ui/index.css`, and
44
+ `@odla-ai/crm/ui.css`, then render `ChapterAdmin` at the existing `/admin/`
45
+ mount. A greenfield site may accept the default workspaces after reviewing
46
+ them against its product requirements. An operating site must preserve each
47
+ validated workspace through the `workspaces` transform until the
48
+ feature-level UI gate below proves the packaged composition equivalent.
49
+ Chapter's default navigation uses fragments such as
50
+ `/admin/#people/person/record-id/profile`; keep legacy query/path links only
51
+ as inbound compatibility URLs.
48
52
  6. **Override rather than inherit wherever local behavior was a decision.**
49
53
  7. `npx @odla-ai/cli doctor` → `provision --dry-run` (show the human) → provision.
50
54
 
51
- The same parity-before-deletion pattern works for UI: render the packaged
52
- component beside yours, assert byte-identical markup, then delete yours and keep
53
- the test as an integration guard the CSS class contract is the site's, not the
54
- package's.
55
+ ### Existing admin workspace gate
56
+
57
+ Labels and route ids are inventory keys, not parity evidence. A legacy
58
+ workspace named "People" and Chapter's default `people` workspace can use the
59
+ same CRM rows while exposing different summaries, search and filtering,
60
+ selection behavior, role signals, mutations, and error states.
61
+
62
+ For every existing workspace, inventory and test:
63
+
64
+ - summaries and operational counts;
65
+ - search, filters, sort, pagination, saved views, and responsive list/detail
66
+ geometry;
67
+ - role, permission, lifecycle, billing, and identity signals;
68
+ - record tabs, deep links, and every mutation or provider side effect;
69
+ - loading, empty, error, unauthorized, keyboard, and narrow-screen states.
70
+
71
+ Classify each item as packaged-equivalent, composed through a documented
72
+ Chapter/CRM seam, an explicit PM-approved product change, or blocked. A matching
73
+ top-level label, a populated table, or a green schema/API test proves none of
74
+ those classifications.
75
+
76
+ The safe first cutover is to preserve the existing workspace first and let
77
+ Chapter own the surrounding auth, routing, chrome, and other reviewed defaults:
78
+
79
+ ```tsx
80
+ const workspaces = (defaults) => {
81
+ if (!defaults.some((workspace) => workspace.id === "people")) {
82
+ throw new Error("expected ChapterAdmin people workspace");
83
+ }
84
+ return defaults.map((workspace) =>
85
+ workspace.id === "people"
86
+ ? { ...workspace, render: (ctx) => <ExistingPeople context={ctx} /> }
87
+ : workspace
88
+ );
89
+ };
90
+
91
+ <ChapterAdmin chapter={chapter} workspaces={workspaces} />;
92
+ ```
93
+
94
+ Match the exact id and fail closed if Chapter changes its catalog. Spread the
95
+ default workspace so its reviewed routing metadata survives. Keep an
96
+ integration test that asserts the host component renders and that representative
97
+ summary, exploration, role, and operation affordances are present.
98
+
99
+ Only then migrate pieces into `collectionSection`/`peopleSection` using
100
+ `renderSummary`, `renderMaster`, `renderDetailHeader`, `renderEmptyDetail`,
101
+ `hrefForRecord`, `extendRecordTabs`, and an application-authoritative
102
+ `lifecycleAdapter`. Delete the old workspace only after the complete behavioral
103
+ matrix and deployed viewport journey pass. For a greenfield site, build the same
104
+ matrix from requirements; there is no legacy component to preserve.
55
105
 
56
106
  ## Behavior deltas to audit
57
107