@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.
- package/dist/cli.cjs +64 -22
- package/dist/index.d.ts +105 -7
- package/dist/index.js +81 -33
- package/dist/node/index.d.ts +6 -5
- package/dist/test-utils/index.d.ts +6 -5
- package/dist/test-utils/index.js +70 -32
- package/dist/worker/index.js +7 -11
- package/package.json +4 -4
- package/reference/claude-config/Overview.md +140 -32
- package/reference/claude-config/rules/active-change-index.md +13 -2
- package/reference/claude-config/rules/agent-start-here.md +13 -2
- package/reference/claude-config/rules/deployment.md +13 -2
- package/reference/claude-config/rules/error-handling.md +13 -2
- package/reference/claude-config/rules/execution.md +13 -2
- package/reference/claude-config/rules/frontend.md +13 -2
- package/reference/claude-config/rules/observability.md +13 -2
- package/reference/claude-config/rules/operations.md +13 -2
- package/reference/claude-config/rules/organization-model.md +1 -1
- package/reference/claude-config/rules/organization-os.md +1 -1
- package/reference/claude-config/rules/package-taxonomy.md +13 -2
- package/reference/claude-config/rules/platform.md +13 -2
- package/reference/claude-config/rules/shared-types.md +13 -2
- package/reference/claude-config/rules/task-tracking.md +13 -2
- package/reference/claude-config/rules/topbar-actions.md +2 -2
- package/reference/claude-config/rules/ui.md +13 -2
- package/reference/claude-config/rules/vibe.md +13 -2
- package/reference/claude-config/settings.json +30 -34
- package/reference/claude-config/skills/deploy/SKILL.md +159 -156
- package/reference/claude-config/skills/elevasis/SKILL.md +11 -4
- package/reference/claude-config/skills/explore/SKILL.md +78 -78
- package/reference/claude-config/skills/git-sync/SKILL.md +166 -126
- package/reference/claude-config/skills/om/SKILL.md +15 -15
- package/reference/claude-config/skills/om/operations/build.md +2 -2
- package/reference/claude-config/skills/project/SKILL.md +1 -1
- package/reference/claude-config/skills/save/SKILL.md +183 -183
- package/reference/claude-config/skills/setup/SKILL.md +9 -3
- package/reference/claude-config/skills/status/SKILL.md +59 -59
- package/reference/claude-config/skills/sync/SKILL.md +47 -47
- package/reference/claude-config/skills/tutorial/SKILL.md +1 -1
- package/reference/claude-config/skills/tutorial/technical.md +11 -11
- package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +46 -0
- package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +34 -0
- package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +52 -0
- package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +47 -0
- package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +75 -0
- package/reference/rules/active-change-index.md +5 -5
- package/reference/rules/agent-start-here.md +34 -30
- package/reference/rules/deployment.md +21 -8
- package/reference/rules/frontend.md +4 -4
- package/reference/rules/observability.md +1 -1
- package/reference/rules/organization-model.md +1 -1
- package/reference/rules/organization-os.md +29 -29
- package/reference/rules/ui.md +205 -202
- package/reference/rules/vibe.md +5 -4
- package/reference/scaffold/operations/propagation-pipeline.md +1 -1
- package/reference/scaffold/recipes/extend-lead-gen.md +505 -332
- package/reference/scaffold/reference/contracts.md +14 -21
package/dist/test-utils/index.js
CHANGED
|
@@ -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
|
|
7565
|
-
//
|
|
7566
|
-
|
|
7567
|
-
|
|
7568
|
-
|
|
7569
|
-
|
|
7570
|
-
|
|
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.
|
|
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
|
|
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
|
|
9336
|
-
|
|
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
|
-
"
|
|
9341
|
-
`System Interface "${formatInterfaceIdentity(request.systemPath, request.interfaceKey)}"
|
|
9342
|
-
{ path: `${readinessMarkerPath(request)}.
|
|
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
|
};
|
package/dist/worker/index.js
CHANGED
|
@@ -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
|
|
5541
|
-
//
|
|
5542
|
-
|
|
5543
|
-
|
|
5544
|
-
|
|
5545
|
-
|
|
5546
|
-
|
|
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.
|
|
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/
|
|
62
|
-
"@repo/
|
|
63
|
-
"@repo/
|
|
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.
|
|
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.
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|