@elevasis/sdk 1.36.5 → 1.38.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 (57) hide show
  1. package/dist/cli.cjs +64 -22
  2. package/dist/index.d.ts +105 -7
  3. package/dist/index.js +81 -33
  4. package/dist/node/index.d.ts +6 -5
  5. package/dist/test-utils/index.d.ts +6 -5
  6. package/dist/test-utils/index.js +70 -32
  7. package/dist/worker/index.js +7 -11
  8. package/package.json +4 -4
  9. package/reference/claude-config/Overview.md +140 -32
  10. package/reference/claude-config/rules/active-change-index.md +13 -2
  11. package/reference/claude-config/rules/agent-start-here.md +13 -2
  12. package/reference/claude-config/rules/deployment.md +13 -2
  13. package/reference/claude-config/rules/error-handling.md +13 -2
  14. package/reference/claude-config/rules/execution.md +13 -2
  15. package/reference/claude-config/rules/frontend.md +13 -2
  16. package/reference/claude-config/rules/observability.md +13 -2
  17. package/reference/claude-config/rules/operations.md +13 -2
  18. package/reference/claude-config/rules/organization-model.md +1 -1
  19. package/reference/claude-config/rules/organization-os.md +1 -1
  20. package/reference/claude-config/rules/package-taxonomy.md +13 -2
  21. package/reference/claude-config/rules/platform.md +13 -2
  22. package/reference/claude-config/rules/shared-types.md +13 -2
  23. package/reference/claude-config/rules/task-tracking.md +13 -2
  24. package/reference/claude-config/rules/topbar-actions.md +2 -2
  25. package/reference/claude-config/rules/ui.md +13 -2
  26. package/reference/claude-config/rules/vibe.md +13 -2
  27. package/reference/claude-config/settings.json +30 -34
  28. package/reference/claude-config/skills/deploy/SKILL.md +159 -156
  29. package/reference/claude-config/skills/elevasis/SKILL.md +11 -4
  30. package/reference/claude-config/skills/explore/SKILL.md +78 -78
  31. package/reference/claude-config/skills/git-sync/SKILL.md +166 -126
  32. package/reference/claude-config/skills/om/SKILL.md +15 -15
  33. package/reference/claude-config/skills/om/operations/build.md +2 -2
  34. package/reference/claude-config/skills/project/SKILL.md +1 -1
  35. package/reference/claude-config/skills/save/SKILL.md +183 -183
  36. package/reference/claude-config/skills/setup/SKILL.md +9 -3
  37. package/reference/claude-config/skills/status/SKILL.md +59 -59
  38. package/reference/claude-config/skills/sync/SKILL.md +47 -47
  39. package/reference/claude-config/skills/tutorial/SKILL.md +1 -1
  40. package/reference/claude-config/skills/tutorial/technical.md +11 -11
  41. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +46 -0
  42. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +34 -0
  43. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +52 -0
  44. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +47 -0
  45. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +75 -0
  46. package/reference/rules/active-change-index.md +5 -5
  47. package/reference/rules/agent-start-here.md +34 -30
  48. package/reference/rules/deployment.md +21 -8
  49. package/reference/rules/frontend.md +4 -4
  50. package/reference/rules/observability.md +1 -1
  51. package/reference/rules/organization-model.md +1 -1
  52. package/reference/rules/organization-os.md +29 -29
  53. package/reference/rules/ui.md +205 -202
  54. package/reference/rules/vibe.md +5 -4
  55. package/reference/scaffold/operations/propagation-pipeline.md +1 -1
  56. package/reference/scaffold/recipes/extend-lead-gen.md +505 -332
  57. package/reference/scaffold/reference/contracts.md +14 -21
@@ -7561,17 +7561,13 @@ var AcqListMetadataSchema = z.object({
7561
7561
  }).catchall(z.unknown());
7562
7562
  var ProspectingBuildTemplateIdSchema = z.string().trim().min(1).max(100);
7563
7563
  var ListStageCountsSchema = z.object({
7564
- // Attempted counts by canonical lead-gen stage. The detailed status
7565
- // distribution lives on ListProgress; telemetry keeps the overview payload small.
7566
- stageCounts: z.object({
7567
- populated: z.number().int(),
7568
- extracted: z.number().int(),
7569
- qualified: z.number().int(),
7570
- discovered: z.number().int(),
7571
- verified: z.number().int(),
7572
- personalized: z.number().int(),
7573
- uploaded: z.number().int()
7574
- }),
7564
+ // Attempted counts keyed by the tenant's declared lead-gen stage catalog IDs.
7565
+ // The catalog is tenant-owned and OM-derived at compute time; the schema
7566
+ // validates the transport shape (string keys → integer values) rather than
7567
+ // a fixed key set, so tenants with custom stages receive complete telemetry.
7568
+ // Canonical Elevasis stages (populated, extracted, qualified, discovered,
7569
+ // verified, personalized, uploaded) are included when declared in the catalog.
7570
+ stageCounts: z.record(z.string().min(1), z.number().int()),
7575
7571
  deliverability: z.object({
7576
7572
  valid: z.number().int(),
7577
7573
  risky: z.number().int(),
@@ -8775,17 +8771,48 @@ var SYSTEM_INTERFACE_PROFILES = [
8775
8771
  var SYSTEM_INTERFACE_READINESS_PROFILES = SYSTEM_INTERFACE_PROFILES.map(
8776
8772
  (profile) => profile.readinessProfile
8777
8773
  );
8778
- var SystemInterfaceReadinessProfileSchema = z.enum(SYSTEM_INTERFACE_READINESS_PROFILES);
8774
+ var SystemInterfaceReadinessProfileSchema = z.string().trim().min(1);
8779
8775
  var SystemInterfaceResourceScopeSchema = z.array(ModelIdSchema).default([]);
8776
+ var SystemApiInterfaceReadinessContractSchema = z.object({
8777
+ /** Ontology IDs of object types the interface depends on. */
8778
+ requiredObjects: z.array(z.string().trim().min(1)).default([]),
8779
+ /** Ontology IDs of catalog types the interface requires (must be non-empty). */
8780
+ requiredCatalogs: z.array(z.string().trim().min(1)).default([]),
8781
+ /** Optional ontology kind filters (reserved for future profile extensions). */
8782
+ requiredKinds: z.array(z.string().trim().min(1)).optional()
8783
+ }).strict();
8780
8784
  var SystemApiInterfaceSchema = z.object({
8781
8785
  lifecycle: SystemInterfaceLifecycleSchema.default("active"),
8786
+ /**
8787
+ * Open-string profile id. Built-in platform presets are looked up through
8788
+ * the profile registry; custom ids are validated structurally via
8789
+ * `readinessContract`. Optional — `profileForInterface` provides a default.
8790
+ */
8782
8791
  readinessProfile: SystemInterfaceReadinessProfileSchema.optional(),
8783
8792
  /**
8784
8793
  * Resource ids that participate in this API interface. This scopes readiness
8785
8794
  * derivation without duplicating authored required/provided contract refs.
8786
8795
  */
8787
- resourceIds: SystemInterfaceResourceScopeSchema.optional()
8796
+ resourceIds: SystemInterfaceResourceScopeSchema.optional(),
8797
+ /**
8798
+ * Tenant-authorable readiness declaration. Required for custom
8799
+ * (non-built-in) profile ids so structural validation can proceed. Built-in
8800
+ * profiles ignore this field (requirements are derived from platform code).
8801
+ */
8802
+ readinessContract: SystemApiInterfaceReadinessContractSchema.optional()
8788
8803
  }).strict();
8804
+ var _profileRegistry = new Map(
8805
+ SYSTEM_INTERFACE_READINESS_PROFILES.map((profileId) => [
8806
+ profileId,
8807
+ { profileId, kind: "built-in" }
8808
+ ])
8809
+ );
8810
+ function profileForInterface(systemPath, interfaceKey, readinessProfile) {
8811
+ return readinessProfile ?? `${systemPath}.${interfaceKey}`;
8812
+ }
8813
+ function isBuiltInReadinessProfile(profileId) {
8814
+ return _profileRegistry.get(profileId)?.kind === "built-in";
8815
+ }
8789
8816
  z.object({
8790
8817
  systemPath: SystemPathSchema,
8791
8818
  interfaceKey: SystemInterfaceKeySchema
@@ -8926,6 +8953,7 @@ function getLeadGenStageCatalog(model) {
8926
8953
  );
8927
8954
  const recordEntity = entry.recordEntity === "company" || entry.recordEntity === "contact" ? entry.recordEntity : void 0;
8928
8955
  const recordStageKey = stringValue(entry.recordStageKey);
8956
+ const readinessTarget = entry.readinessTarget === true ? true : void 0;
8929
8957
  results[entryId] = {
8930
8958
  key: entryId,
8931
8959
  label: stringValue(entry.label) ?? entryId,
@@ -8934,7 +8962,8 @@ function getLeadGenStageCatalog(model) {
8934
8962
  entity,
8935
8963
  ...additionalEntities.length > 0 ? { additionalEntities } : {},
8936
8964
  ...recordEntity ? { recordEntity } : {},
8937
- ...recordStageKey ? { recordStageKey } : {}
8965
+ ...recordStageKey ? { recordStageKey } : {},
8966
+ ...readinessTarget ? { readinessTarget } : {}
8938
8967
  };
8939
8968
  }
8940
8969
  }
@@ -9032,14 +9061,11 @@ function addReadinessIssue(issues, family, code, message, details = {}) {
9032
9061
  function formatInterfaceIdentity(systemPath, interfaceKey) {
9033
9062
  return `${systemPath}/${interfaceKey}`;
9034
9063
  }
9035
- function profileForInterface(systemPath, interfaceKey, readinessProfile) {
9036
- return readinessProfile ?? `${systemPath}.${interfaceKey}`;
9037
- }
9038
9064
  function readinessMarkerPath(context) {
9039
9065
  return context.interfaceKey === "api" ? `systems.${context.systemPath}.apiInterface` : `systems.${context.systemPath}.derivedCrmHandoffReadiness`;
9040
9066
  }
9041
9067
  function formatSupportedReadinessProfiles() {
9042
- return SYSTEM_INTERFACE_READINESS_PROFILES.map((profile) => `"${profile}"`).join(", ");
9068
+ return SYSTEM_INTERFACE_PROFILES.map((p3) => `"${p3.readinessProfile}"`).join(", ");
9043
9069
  }
9044
9070
  function getActiveScopedResources(model, resourceIds, issues, context) {
9045
9071
  const resources = [];
@@ -9231,9 +9257,6 @@ function getLeadGenCrmHandoffResourceIds(model) {
9231
9257
  function getSystemInterfaceReadinessMarker(model, request) {
9232
9258
  const system = getSystem(model, request.systemPath);
9233
9259
  if (system === void 0) return void 0;
9234
- if (request.interfaceKey === LEAD_GEN_API_INTERFACE.interfaceKey) {
9235
- return system.apiInterface;
9236
- }
9237
9260
  if (request.systemPath === LEAD_GEN_CRM_HANDOFF_INTERFACE.systemPath && request.interfaceKey === LEAD_GEN_CRM_HANDOFF_INTERFACE.interfaceKey) {
9238
9261
  return {
9239
9262
  lifecycle: "active",
@@ -9241,6 +9264,9 @@ function getSystemInterfaceReadinessMarker(model, request) {
9241
9264
  resourceIds: getLeadGenCrmHandoffResourceIds(model)
9242
9265
  };
9243
9266
  }
9267
+ if (request.interfaceKey === "api" && system.apiInterface !== void 0) {
9268
+ return system.apiInterface;
9269
+ }
9244
9270
  return void 0;
9245
9271
  }
9246
9272
  function mergeLeadGenDerivedCatalogs(model) {
@@ -9285,6 +9311,18 @@ function tryCompileBusinessOntology(model, readinessProfile, issues) {
9285
9311
  return void 0;
9286
9312
  }
9287
9313
  }
9314
+ function requireContractReadiness(issues, index2, resources, contract, context) {
9315
+ const reads = resourceBindingIds(resources, "reads");
9316
+ const catalogs = resourceBindingIds(resources, "usesCatalogs");
9317
+ for (const objectId of contract.requiredObjects) {
9318
+ requireObjectReadiness(issues, index2, objectId, context);
9319
+ requireScopedBinding(issues, reads, "reads", objectId, context);
9320
+ }
9321
+ for (const catalogId of contract.requiredCatalogs) {
9322
+ requireCatalogReadiness(issues, index2, catalogId, context);
9323
+ requireScopedBinding(issues, catalogs, "usesCatalogs", catalogId, context);
9324
+ }
9325
+ }
9288
9326
  function computeInterfaceReadiness(model, request) {
9289
9327
  const issues = [];
9290
9328
  const system = getSystem(model, request.systemPath);
@@ -9332,20 +9370,22 @@ function computeInterfaceReadiness(model, request) {
9332
9370
  { path: `${readinessMarkerPath(request)}.lifecycle` }
9333
9371
  );
9334
9372
  }
9335
- const supportedProfile = readinessProfile !== void 0 && SYSTEM_INTERFACE_PROFILES.some((profile) => profile.readinessProfile === readinessProfile);
9336
- if (!supportedProfile) {
9373
+ const checkedReadinessProfile = readinessProfile ?? profileForInterface(request.systemPath, request.interfaceKey);
9374
+ const isBuiltIn = isBuiltInReadinessProfile(checkedReadinessProfile);
9375
+ const readinessContract = systemInterface.readinessContract;
9376
+ if (!isBuiltIn && readinessContract === void 0) {
9337
9377
  addReadinessIssue(
9338
9378
  issues,
9339
9379
  "SYSTEM_INTERFACE_INVALID",
9340
- "unknown-readiness-profile",
9341
- `System Interface "${formatInterfaceIdentity(request.systemPath, request.interfaceKey)}" references unknown readiness profile "${readinessProfile}". Supported profiles: ${formatSupportedReadinessProfiles()}. Custom Systems should not declare apiInterface; route custom behavior through workflows/operations plus ontology, resources, and topology.`,
9342
- { path: `${readinessMarkerPath(request)}.readinessProfile`, ref: readinessProfile }
9380
+ "missing-readiness-contract",
9381
+ `System Interface "${formatInterfaceIdentity(request.systemPath, request.interfaceKey)}" uses custom readiness profile "${checkedReadinessProfile}" but declares no readinessContract. Built-in profiles: ${formatSupportedReadinessProfiles()}.`,
9382
+ { path: `${readinessMarkerPath(request)}.readinessContract`, ref: checkedReadinessProfile }
9343
9383
  );
9344
9384
  return {
9345
9385
  ready: false,
9346
9386
  systemPath: request.systemPath,
9347
9387
  interfaceKey: request.interfaceKey,
9348
- readinessProfile,
9388
+ readinessProfile: checkedReadinessProfile,
9349
9389
  scopedResourceIds,
9350
9390
  issues
9351
9391
  };
@@ -9359,10 +9399,6 @@ function computeInterfaceReadiness(model, request) {
9359
9399
  { path: `${readinessMarkerPath(request)}.resourceIds` }
9360
9400
  );
9361
9401
  }
9362
- const checkedReadinessProfile = readinessProfile;
9363
- if (checkedReadinessProfile === void 0) {
9364
- throw new Error("Supported readiness profile unexpectedly resolved to undefined");
9365
- }
9366
9402
  const resources = getActiveScopedResources(model, scopedResourceIds, issues, request);
9367
9403
  const index2 = tryCompileBusinessOntology(model, checkedReadinessProfile, issues);
9368
9404
  if (index2 !== void 0) {
@@ -9374,13 +9410,15 @@ function computeInterfaceReadiness(model, request) {
9374
9410
  requireLeadGenInterfaceReadiness(issues, index2, resources, request);
9375
9411
  requireCrmInterfaceReadiness(issues, index2, resources, { ...request, allowForeignOwner: true });
9376
9412
  requireHandoffBridgeReadiness(issues, model, request);
9413
+ } else if (readinessContract !== void 0) {
9414
+ requireContractReadiness(issues, index2, resources, readinessContract, request);
9377
9415
  }
9378
9416
  }
9379
9417
  return {
9380
9418
  ready: issues.length === 0,
9381
9419
  systemPath: request.systemPath,
9382
9420
  interfaceKey: request.interfaceKey,
9383
- readinessProfile,
9421
+ readinessProfile: checkedReadinessProfile,
9384
9422
  scopedResourceIds,
9385
9423
  issues
9386
9424
  };
@@ -5537,17 +5537,13 @@ var AcqListMetadataSchema = z.object({
5537
5537
  }).catchall(z.unknown());
5538
5538
  var ProspectingBuildTemplateIdSchema = z.string().trim().min(1).max(100);
5539
5539
  var ListStageCountsSchema = z.object({
5540
- // Attempted counts by canonical lead-gen stage. The detailed status
5541
- // distribution lives on ListProgress; telemetry keeps the overview payload small.
5542
- stageCounts: z.object({
5543
- populated: z.number().int(),
5544
- extracted: z.number().int(),
5545
- qualified: z.number().int(),
5546
- discovered: z.number().int(),
5547
- verified: z.number().int(),
5548
- personalized: z.number().int(),
5549
- uploaded: z.number().int()
5550
- }),
5540
+ // Attempted counts keyed by the tenant's declared lead-gen stage catalog IDs.
5541
+ // The catalog is tenant-owned and OM-derived at compute time; the schema
5542
+ // validates the transport shape (string keys → integer values) rather than
5543
+ // a fixed key set, so tenants with custom stages receive complete telemetry.
5544
+ // Canonical Elevasis stages (populated, extracted, qualified, discovered,
5545
+ // verified, personalized, uploaded) are included when declared in the catalog.
5546
+ stageCounts: z.record(z.string().min(1), z.number().int()),
5551
5547
  deliverability: z.object({
5552
5548
  valid: z.number().int(),
5553
5549
  risky: z.number().int(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.36.5",
3
+ "version": "1.38.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -58,9 +58,9 @@
58
58
  "tsup": "^8.0.0",
59
59
  "typescript": "5.9.2",
60
60
  "zod": "^4.1.0",
61
- "@repo/core": "0.51.0",
62
- "@repo/typescript-config": "0.0.0",
63
- "@repo/eslint-config": "0.0.0"
61
+ "@repo/eslint-config": "0.0.0",
62
+ "@repo/core": "0.54.0",
63
+ "@repo/typescript-config": "0.0.0"
64
64
  },
65
65
  "scripts": {
66
66
  "lint": "eslint src --max-warnings 0",
@@ -7,15 +7,21 @@ This file is a routing map for the skill and rule inventories. For live CLI capa
7
7
 
8
8
  ## What Lives Here
9
9
 
10
- | Surface | Purpose | Source of truth |
11
- | ------- | ----------------------------- | ---------------------------------------------- |
12
- | Skills | Slash-command entry points | `.claude/skills/*/SKILL.md` |
13
- | Rules | Path-scoped operating context | `node_modules/@elevasis/sdk/reference/rules/` |
14
- | Hooks | Claude lifecycle automation | `.claude/hooks/*.mjs`, `.claude/settings.json` |
15
- | CLI | Live command + domain surface | `elevasis-sdk cli` (authoritative, run it) |
10
+ | Surface | Purpose | Source of truth |
11
+ | ------- | ----------------------------- | -------------------------------------------------------- |
12
+ | Skills | Slash-command entry points | `.claude/skills/*/SKILL.md` |
13
+ | Rules | Path-scoped operating context | `operations/node_modules/@elevasis/sdk/reference/rules/` |
14
+ | Hooks | Claude lifecycle automation | `.claude/hooks/*.mjs`, `.claude/settings.json` |
15
+ | CLI | Live command + domain surface | `elevasis-sdk cli` (authoritative, run it) |
16
16
 
17
17
  For CLI capability, run `elevasis-sdk cli` — it is the authoritative surface for what commands
18
- and domains are available. For architecture context, read `CLAUDE.md` first.
18
+ and domains are available.
19
+
20
+ **This file is template-owned and replaced by sync.** It holds guidance that is true for every
21
+ project built from this template: structure, stack, commands, and the skill surface. Project-specific
22
+ facts (identity, client context, user preferences) live in `CLAUDE.md`, which sync never overwrites.
23
+ Tenant-specific operational quirks live in `OPERATIONS.md`. Do not copy content between them — each
24
+ fact should exist in exactly one of the three, owned by whoever can correct it.
19
25
 
20
26
  ---
21
27
 
@@ -23,16 +29,109 @@ and domains are available. For architecture context, read `CLAUDE.md` first.
23
29
 
24
30
  This project is skill-first with an always-on ambient vibe layer:
25
31
 
26
- 1. Load `CLAUDE.md` for project rules, stack, and the Ambient Vibe Layer contract.
32
+ 1. Read `operations/node_modules/@elevasis/sdk/reference/rules/agent-start-here.md` it owns session
33
+ bootstrap and task-class routing. Then read `CLAUDE.md` for this project's identity and preferences,
34
+ and `OPERATIONS.md` for tenant-specific quirks that override generic guidance.
27
35
  2. Every natural-language message is silently classified into an intent (Capture, Query, Describe,
28
36
  Transition, Navigate, Codify, Toggle, Operate) before the agent responds — no slash command needed.
37
+ The classifier and intent definitions live in the bundled `vibe.md` rule.
29
38
  3. For explicit work, match intent to a skill in `.claude/skills/{name}/SKILL.md`.
30
- 4. Load the relevant bundled rule from `node_modules/@elevasis/sdk/reference/rules/` for the area
39
+ 4. Load the relevant bundled rule from `operations/node_modules/@elevasis/sdk/reference/rules/` for the area
31
40
  being changed (the local `.claude/rules/*.md` files are thin pointers to these).
32
41
  5. Use `elevasis-sdk cli` for the live command/domain surface — do not answer "what can I do" from memory.
33
42
 
34
43
  ---
35
44
 
45
+ ## Project Structure
46
+
47
+ ```
48
+ ├── ui/ # React frontend app
49
+ ├── operations/ # Platform workflows + agents
50
+ ├── core/ # Cross-runtime organization model, types, Zod schemas, constants
51
+ ├── .claude/ # Claude Code config (this file, skills, hooks)
52
+ ├── pnpm-workspace.yaml # Workspace definition
53
+ └── .env # Environment variables
54
+ ```
55
+
56
+ | Resource | Path |
57
+ | -------------------- | ------------------------------- |
58
+ | Source — Routes | `ui/src/routes/` |
59
+ | Source — Features | `ui/src/features/` |
60
+ | Source — Lib | `ui/src/lib/` |
61
+ | Source — Assets | `ui/src/assets/` |
62
+ | Platform — Workflows | `operations/src/` |
63
+ | Platform — Config | `operations/elevasis.config.ts` |
64
+ | Core Types | `core/` |
65
+
66
+ **Standalone repo** — this project is NOT part of the Elevasis monorepo pnpm workspace. Git, gh, and
67
+ CLI commands work directly here (the monorepo boundary hook does not apply).
68
+
69
+ - Use `pnpm` exclusively — never `npm`
70
+ - Path aliases: `@/*` maps to `ui/src/*`, `@core/*` maps to `core/*`
71
+ - Frontend and platform code are separate runtimes — share only types via `core/`
72
+ - Release-train migration guidance lands in `.claude/sync-notes/`; run `/git-sync` to pull and surface
73
+ new notes before doing any manual reconciliation
74
+
75
+ ---
76
+
77
+ ## Stack
78
+
79
+ > **Package surface:** this project consumes `@elevasis/{sdk,ui,core}` from npm. The monorepo's
80
+ > workspace-internal `@repo/elevasis-{core,operations}` packages are NOT installable here. See the
81
+ > bundled `package-taxonomy.md` rule.
82
+
83
+ ### Frontend (`ui/`)
84
+
85
+ | Layer | Tech |
86
+ | ------------ | ----------------------------------- |
87
+ | UI | React 19 + Mantine 8.2.7 |
88
+ | Build | Vite 8 |
89
+ | Language | TypeScript 5.9 (strict) |
90
+ | Routing | TanStack Router (file-based) |
91
+ | Server State | TanStack React Query |
92
+ | Client State | Zustand + Immer |
93
+ | Charts | Recharts via @mantine/charts |
94
+ | Graph Viz | @xyflow/react (ReactFlow) |
95
+ | Icons | @tabler/icons-react |
96
+ | Testing | Vitest |
97
+ | Auth | @elevasis/ui + AuthKit (WorkOS) |
98
+ | API Access | `@elevasis/ui/api` (`useApiClient`) |
99
+
100
+ ### Platform (`operations/`)
101
+
102
+ | Layer | Tech |
103
+ | -------- | ------------------------------------------------- |
104
+ | SDK | @elevasis/sdk (workflows, agents, typed adapters) |
105
+ | Language | TypeScript (strict, Node target) |
106
+ | Schemas | Zod |
107
+ | Deploy | Elevasis Platform — see bundled `deployment.md` |
108
+
109
+ ### Core (`core/`)
110
+
111
+ Types and constants shared between frontend and platform workflows. Runtime-agnostic only — no
112
+ React, no Node APIs, no SDK worker imports.
113
+
114
+ ---
115
+
116
+ ## Commands
117
+
118
+ | Command | Purpose |
119
+ | -------------------------------- | ------------------------------------------------------------- |
120
+ | `pnpm -C ui dev` | Dev server (port 4300, `strictPort` — fails fast if occupied) |
121
+ | `pnpm -C ui build` | Type-check + production build |
122
+ | `pnpm -C ui test` | Run frontend tests |
123
+ | `pnpm -C ui lint` | Type-check only (no emit) |
124
+ | `pnpm -C operations check` | Validate SDK resource definitions |
125
+ | `pnpm -C operations deploy` | Deploy resources — **targets production by default** |
126
+ | `pnpm -C operations deploy:prod` | Deploy resources to production (explicit `--prod`) |
127
+
128
+ > **Deploy targets are safety-critical and the resolution order has exceptions.** The authoritative
129
+ > rule is the bundled `deployment.md`, which ships with the CLI version this project actually runs.
130
+ > Read it before deploying — and check `OPERATIONS.md`, which records whether this specific tenant
131
+ > has a working dev target at all.
132
+
133
+ ---
134
+
36
135
  ## Skills
37
136
 
38
137
  **Location:** `.claude/skills/`
@@ -41,6 +140,7 @@ Skills are the slash-command surface. Each skill is `.claude/skills/{name}/SKILL
41
140
 
42
141
  <!-- @generated:start:sync-overview-skills -->
43
142
  - **client** -- Client portfolio management -- list, resolve, inspect, and maintain client records and their lineage to companies, contacts, and source deals -- via the elevasis-sdk client:* CLI.
143
+ - **deploy** -- Test, build, fix issues, then commit and push
44
144
  - **dsp** -- Dispatch subagents in parallel for implementation tasks
45
145
  - **elevasis** -- Elevasis platform operations -- check, deploy, execute, inspect, and debug SDK resources
46
146
  - **explore** -- Codebase exploration anchored to project documentation
@@ -60,29 +160,29 @@ Skills are the slash-command surface. Each skill is `.claude/skills/{name}/SKILL
60
160
 
61
161
  ## Rules
62
162
 
63
- **Location:** `node_modules/@elevasis/sdk/reference/rules/` (bundled with `@elevasis/sdk`)
163
+ **Location:** `operations/node_modules/@elevasis/sdk/reference/rules/` (bundled with `@elevasis/sdk`)
64
164
 
65
165
  Path-scoped operating context loaded for substantial work in their areas. The project's local
66
166
  `.claude/rules/*.md` files are thin compatibility pointers; the authoritative content ships with
67
167
  the SDK and is listed here:
68
168
 
69
169
  <!-- @generated:start:sync-overview-rules -->
70
- - `node_modules/@elevasis/sdk/reference/rules/active-change-index.md` -- Bridge between stable scaffold docs and higher-volatility in-progress architecture work that may override assumptions for agents working in the template
71
- - `node_modules/@elevasis/sdk/reference/rules/agent-start-here.md` -- Canonical first-read for agents entering the template scaffold -- project continuity, task-class routing, and boundary resolution
72
- - `node_modules/@elevasis/sdk/reference/rules/deployment.md` -- Deployment workflow -- check-first, dev vs prod, version bumping, common errors
73
- - `node_modules/@elevasis/sdk/reference/rules/error-handling.md` -- Error handling -- ExecutionError vs PlatformToolError, retry logic, no auto-retry
74
- - `node_modules/@elevasis/sdk/reference/rules/execution.md` -- Execution model -- timeouts, memory, concurrency, org isolation, runtime constraints
75
- - `node_modules/@elevasis/sdk/reference/rules/frontend.md` -- Frontend conventions -- React, routing, state, styling, testing, pages
76
- - `node_modules/@elevasis/sdk/reference/rules/observability.md` -- Observability -- context.logger API, execution inspection, step-level context
77
- - `node_modules/@elevasis/sdk/reference/rules/operations.md` -- Platform workflows, agents, resource definitions, and deployment for the operations/ surface
78
- - `node_modules/@elevasis/sdk/reference/rules/organization-model.md` -- Edits to the canonical organization model go through /om
79
- - `node_modules/@elevasis/sdk/reference/rules/organization-os.md` -- Organization OS orientation -- the semantic contract layer relating Systems, Actions, ontology, resources, policies, roles, goals, and knowledge; consumed via published @elevasis/core / @elevasis/sdk
80
- - `node_modules/@elevasis/sdk/reference/rules/package-taxonomy.md` -- Package taxonomy (consumer view) -- external projects consume the published @elevasis/* surface only; workspace-internal @repo/elevasis-* packages are not installable here
81
- - `node_modules/@elevasis/sdk/reference/rules/platform.md` -- Platform conventions -- SDK workflows, agents, deployment, resource registry
82
- - `node_modules/@elevasis/sdk/reference/rules/shared-types.md` -- Core type boundary -- what belongs in core/types, import rules, schema conventions
83
- - `node_modules/@elevasis/sdk/reference/rules/task-tracking.md` -- In-progress task conventions -- doc format, status values, auto-save behavior
84
- - `node_modules/@elevasis/sdk/reference/rules/ui.md` -- UI shell, route structure, auth flow, API access, and template customization points for the ui/ surface
85
- - `node_modules/@elevasis/sdk/reference/rules/vibe.md` -- Ambient intent classifier -- routes natural-language input to intent buckets without a slash command; Codify and Toggle delegate to /om, Operate delegates to /elevasis
170
+ - `operations/node_modules/@elevasis/sdk/reference/rules/active-change-index.md` -- Bridge between stable scaffold docs and higher-volatility in-progress architecture work that may override assumptions for agents working in the template
171
+ - `operations/node_modules/@elevasis/sdk/reference/rules/agent-start-here.md` -- Canonical first-read for agents entering the template scaffold -- project continuity, task-class routing, and boundary resolution
172
+ - `operations/node_modules/@elevasis/sdk/reference/rules/deployment.md` -- Deployment workflow -- check-first, dev vs prod, version bumping, common errors
173
+ - `operations/node_modules/@elevasis/sdk/reference/rules/error-handling.md` -- Error handling -- ExecutionError vs PlatformToolError, retry logic, no auto-retry
174
+ - `operations/node_modules/@elevasis/sdk/reference/rules/execution.md` -- Execution model -- timeouts, memory, concurrency, org isolation, runtime constraints
175
+ - `operations/node_modules/@elevasis/sdk/reference/rules/frontend.md` -- Frontend conventions -- React, routing, state, styling, testing, pages
176
+ - `operations/node_modules/@elevasis/sdk/reference/rules/observability.md` -- Observability -- context.logger API, execution inspection, step-level context
177
+ - `operations/node_modules/@elevasis/sdk/reference/rules/operations.md` -- Platform workflows, agents, resource definitions, and deployment for the operations/ surface
178
+ - `operations/node_modules/@elevasis/sdk/reference/rules/organization-model.md` -- Edits to the canonical organization model go through /om
179
+ - `operations/node_modules/@elevasis/sdk/reference/rules/organization-os.md` -- Organization OS orientation -- the semantic contract layer relating Systems, Actions, ontology, resources, policies, roles, goals, and knowledge; consumed via published @elevasis/core / @elevasis/sdk
180
+ - `operations/node_modules/@elevasis/sdk/reference/rules/package-taxonomy.md` -- Package taxonomy (consumer view) -- external projects consume the published @elevasis/* surface only; workspace-internal @repo/elevasis-* packages are not installable here
181
+ - `operations/node_modules/@elevasis/sdk/reference/rules/platform.md` -- Platform conventions -- SDK workflows, agents, deployment, resource registry
182
+ - `operations/node_modules/@elevasis/sdk/reference/rules/shared-types.md` -- Core type boundary -- what belongs in core/types, import rules, schema conventions
183
+ - `operations/node_modules/@elevasis/sdk/reference/rules/task-tracking.md` -- In-progress task conventions -- doc format, status values, auto-save behavior
184
+ - `operations/node_modules/@elevasis/sdk/reference/rules/ui.md` -- UI shell, route structure, auth flow, API access, and template customization points for the ui/ surface
185
+ - `operations/node_modules/@elevasis/sdk/reference/rules/vibe.md` -- Ambient intent classifier -- routes natural-language input to intent buckets without a slash command; Codify and Toggle delegate to /om, Operate delegates to /elevasis
86
186
  <!-- @generated:end:sync-overview-rules -->
87
187
 
88
188
  ---
@@ -113,10 +213,18 @@ Use the owning skill instead of guessing from the name alone:
113
213
 
114
214
  ## Scaffold Maintenance
115
215
 
116
- | Action | Command or file |
117
- | -------------------------------------- | ------------------------------------------- |
118
- | Refresh the Skills + Rules lists above | `pnpm gen:overview` (run from the monorepo) |
216
+ This file is maintained upstream in the Elevasis monorepo template
217
+ (`external/_template/.claude/Overview.md`) and delivered to this project via template
218
+ sync (`/git-sync`). **The whole file is replace-managed** -- not just the generated blocks.
219
+ Any local edit here is overwritten on the next sync, so corrections belong upstream, where
220
+ every project receives them.
221
+
222
+ The blocks marked `<!-- @generated:start:... -->` / `<!-- @generated:end -->` are additionally
223
+ machine-written by `pnpm gen:overview` in the monorepo; do not hand-edit them even upstream.
224
+
225
+ There is no monorepo command to run from inside this project; refreshes happen upstream and
226
+ arrive through the normal sync flow.
119
227
 
120
- The Skills section is generated from `external/_template/.claude/skills/*/SKILL.md` frontmatter, and
121
- the Rules section from the bundled rule source `packages/sdk/docs/agent-rules/*.md`, both by the
122
- monorepo `pnpm gen:overview` generator. Do not hand-edit the generated blocks.
228
+ **If you were about to add project-specific detail to this file, stop** -- it will be lost.
229
+ Project identity and preferences go in `CLAUDE.md`; tenant operational quirks go in
230
+ `OPERATIONS.md`. Both are project-owned and never overwritten.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Active Change Index rule bu
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/active-change-index.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/active-change-index.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/active-change-index.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/active-change-index.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Agent Start Here rule bundl
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/agent-start-here.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/agent-start-here.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/agent-start-here.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/agent-start-here.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Deployment rule bundled wit
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/deployment.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/deployment.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/deployment.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/deployment.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Error Handling rule bundled
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/error-handling.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/error-handling.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/error-handling.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/error-handling.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Execution rule bundled with
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/execution.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/execution.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/execution.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/execution.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Frontend rule bundled with
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/frontend.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/frontend.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/frontend.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/frontend.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.
@@ -6,6 +6,17 @@ description: Compatibility pointer for the canonical Observability rule bundled
6
6
 
7
7
  Canonical rule source:
8
8
 
9
- `node_modules/@elevasis/sdk/reference/rules/observability.md`
9
+ `operations/node_modules/@elevasis/sdk/reference/rules/observability.md`
10
10
 
11
- Read that bundled rule before applying this rule. This local file is intentionally kept as a thin compatibility pointer for existing local rule references in skills, sync notes, and older prompts.
11
+ When working in the monorepo template snapshot before dependencies are installed,
12
+ use the repo-local generated fallback:
13
+
14
+ `packages/sdk/reference/rules/observability.md`
15
+
16
+ If the generated fallback is stale or missing, use the source:
17
+
18
+ `packages/sdk/docs/agent-rules/observability.md`
19
+
20
+ Read the bundled rule first when available. This local file is intentionally kept
21
+ as a thin compatibility pointer for existing local rule references in skills,
22
+ sync notes, and older prompts.