@elevasis/sdk 1.26.0 → 1.26.1
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 +70 -5
- package/dist/index.d.ts +55 -2
- package/dist/node/index.d.ts +10 -2
- package/dist/test-utils/index.d.ts +55 -2
- package/package.json +2 -2
- package/reference/claude-config/skills/setup/SKILL.md +2 -2
- package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +49 -0
- package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +42 -0
- package/reference/cli-management.mdx +7 -5
- package/reference/examples/organization-model.ts +14 -4
package/dist/cli.cjs
CHANGED
|
@@ -37181,15 +37181,55 @@ var ResourceMappingSchema = DisplayMetadataSchema.extend({
|
|
|
37181
37181
|
|
|
37182
37182
|
// ../core/src/organization-model/domains/branding.ts
|
|
37183
37183
|
var OrganizationModelBrandingSchema = external_exports.object({
|
|
37184
|
+
/**
|
|
37185
|
+
* @deprecated Prefer `identity.organizationName`; branding retains it for back-compat.
|
|
37186
|
+
* Legacy tenants that have not set `identity.organizationName` fall back to this field.
|
|
37187
|
+
*/
|
|
37184
37188
|
organizationName: LabelSchema,
|
|
37189
|
+
/**
|
|
37190
|
+
* @deprecated Prefer `identity.productName`; branding retains it for back-compat.
|
|
37191
|
+
* Legacy tenants that have not set `identity.productName` fall back to this field.
|
|
37192
|
+
*/
|
|
37185
37193
|
productName: LabelSchema,
|
|
37194
|
+
/**
|
|
37195
|
+
* @deprecated Prefer `identity.shortName`; branding retains it for back-compat.
|
|
37196
|
+
* Legacy tenants that have not set `identity.shortName` fall back to this field.
|
|
37197
|
+
*/
|
|
37186
37198
|
shortName: external_exports.string().trim().min(1).max(40),
|
|
37199
|
+
/**
|
|
37200
|
+
* @deprecated Prefer `identity.description`; branding retains it for back-compat.
|
|
37201
|
+
* Legacy tenants that have not set `identity.description` fall back to this field.
|
|
37202
|
+
*/
|
|
37187
37203
|
description: DescriptionSchema.optional(),
|
|
37188
37204
|
logos: external_exports.object({
|
|
37189
37205
|
light: external_exports.string().trim().min(1).max(2048).optional(),
|
|
37190
37206
|
dark: external_exports.string().trim().min(1).max(2048).optional()
|
|
37191
|
-
}).default({})
|
|
37192
|
-
|
|
37207
|
+
}).default({}),
|
|
37208
|
+
/**
|
|
37209
|
+
* Brand voice — how the organization communicates. Plain-language description
|
|
37210
|
+
* of tone, register, and personality (e.g. "Direct and human — no jargon").
|
|
37211
|
+
* Max 280 characters.
|
|
37212
|
+
*/
|
|
37213
|
+
voice: external_exports.string().trim().max(280).optional(),
|
|
37214
|
+
/**
|
|
37215
|
+
* Brand tagline or positioning statement — the memorable one-liner that
|
|
37216
|
+
* captures the brand's promise or differentiator. Max 200 characters.
|
|
37217
|
+
*/
|
|
37218
|
+
tagline: external_exports.string().trim().max(200).optional(),
|
|
37219
|
+
/**
|
|
37220
|
+
* Core brand values — an ordered list of principles the organization stands
|
|
37221
|
+
* for (e.g. ["Transparency", "Craftsmanship", "Velocity"]). Each entry must
|
|
37222
|
+
* be a non-empty trimmed string.
|
|
37223
|
+
*/
|
|
37224
|
+
values: external_exports.array(external_exports.string().trim().min(1)).optional(),
|
|
37225
|
+
/**
|
|
37226
|
+
* ID of the active UI theme preset from the UI theme-presets registry.
|
|
37227
|
+
* The UI layer resolves this to colors and typography via `usePresetsContext()`.
|
|
37228
|
+
* Free-form string — validation and fallback state are handled at the UI layer.
|
|
37229
|
+
* Min 1, max 64 characters.
|
|
37230
|
+
*/
|
|
37231
|
+
themePresetId: external_exports.string().trim().min(1).max(64).optional()
|
|
37232
|
+
}).passthrough();
|
|
37193
37233
|
var DEFAULT_ORGANIZATION_MODEL_BRANDING = {
|
|
37194
37234
|
organizationName: "Default Organization",
|
|
37195
37235
|
productName: "Organization OS",
|
|
@@ -37312,8 +37352,33 @@ var IdentityDomainSchema = external_exports.object({
|
|
|
37312
37352
|
* background. Populated by /setup; surfaced to agents as organizational context.
|
|
37313
37353
|
* Optional — many projects have no external client.
|
|
37314
37354
|
*/
|
|
37315
|
-
clientBrief: external_exports.string().trim().default("")
|
|
37316
|
-
|
|
37355
|
+
clientBrief: external_exports.string().trim().default(""),
|
|
37356
|
+
/**
|
|
37357
|
+
* Display name of the organization as shown to end users.
|
|
37358
|
+
* Recommended placement for display naming — prefer this over the deprecated
|
|
37359
|
+
* `branding.organizationName`. Falls back to `branding.organizationName` for
|
|
37360
|
+
* legacy tenants that have not yet migrated.
|
|
37361
|
+
*/
|
|
37362
|
+
organizationName: LabelSchema.optional(),
|
|
37363
|
+
/**
|
|
37364
|
+
* Display name of the primary product or platform.
|
|
37365
|
+
* Recommended placement for display naming — prefer this over the deprecated
|
|
37366
|
+
* `branding.productName`. Falls back to `branding.productName` for legacy tenants.
|
|
37367
|
+
*/
|
|
37368
|
+
productName: LabelSchema.optional(),
|
|
37369
|
+
/**
|
|
37370
|
+
* Short abbreviated name used in space-constrained UI surfaces (max 40 chars).
|
|
37371
|
+
* Recommended placement for display naming — prefer this over the deprecated
|
|
37372
|
+
* `branding.shortName`. Falls back to `branding.shortName` for legacy tenants.
|
|
37373
|
+
*/
|
|
37374
|
+
shortName: external_exports.string().trim().min(1).max(40).optional(),
|
|
37375
|
+
/**
|
|
37376
|
+
* Plain-language description of the organization for display and discovery.
|
|
37377
|
+
* Recommended placement for display naming — prefer this over the deprecated
|
|
37378
|
+
* `branding.description`. Falls back to `branding.description` for legacy tenants.
|
|
37379
|
+
*/
|
|
37380
|
+
description: DescriptionSchema.optional()
|
|
37381
|
+
}).passthrough();
|
|
37317
37382
|
var DEFAULT_ORGANIZATION_MODEL_IDENTITY = {
|
|
37318
37383
|
mission: "",
|
|
37319
37384
|
vision: "",
|
|
@@ -44059,7 +44124,7 @@ function wrapAction(commandName, fn) {
|
|
|
44059
44124
|
// package.json
|
|
44060
44125
|
var package_default = {
|
|
44061
44126
|
name: "@elevasis/sdk",
|
|
44062
|
-
version: "1.26.
|
|
44127
|
+
version: "1.26.1",
|
|
44063
44128
|
description: "SDK for building Elevasis organization resources",
|
|
44064
44129
|
type: "module",
|
|
44065
44130
|
bin: {
|
package/dist/index.d.ts
CHANGED
|
@@ -2884,6 +2884,51 @@ type Database = {
|
|
|
2884
2884
|
}
|
|
2885
2885
|
];
|
|
2886
2886
|
};
|
|
2887
|
+
deployment_organization_models: {
|
|
2888
|
+
Row: {
|
|
2889
|
+
created_at: string;
|
|
2890
|
+
deployment_id: string;
|
|
2891
|
+
model_hash: string | null;
|
|
2892
|
+
organization_id: string;
|
|
2893
|
+
organization_model: Json;
|
|
2894
|
+
schema_version: string;
|
|
2895
|
+
updated_at: string;
|
|
2896
|
+
};
|
|
2897
|
+
Insert: {
|
|
2898
|
+
created_at?: string;
|
|
2899
|
+
deployment_id: string;
|
|
2900
|
+
model_hash?: string | null;
|
|
2901
|
+
organization_id: string;
|
|
2902
|
+
organization_model: Json;
|
|
2903
|
+
schema_version?: string;
|
|
2904
|
+
updated_at?: string;
|
|
2905
|
+
};
|
|
2906
|
+
Update: {
|
|
2907
|
+
created_at?: string;
|
|
2908
|
+
deployment_id?: string;
|
|
2909
|
+
model_hash?: string | null;
|
|
2910
|
+
organization_id?: string;
|
|
2911
|
+
organization_model?: Json;
|
|
2912
|
+
schema_version?: string;
|
|
2913
|
+
updated_at?: string;
|
|
2914
|
+
};
|
|
2915
|
+
Relationships: [
|
|
2916
|
+
{
|
|
2917
|
+
foreignKeyName: "deployment_organization_models_deployment_id_fkey";
|
|
2918
|
+
columns: ["deployment_id"];
|
|
2919
|
+
isOneToOne: true;
|
|
2920
|
+
referencedRelation: "deployments";
|
|
2921
|
+
referencedColumns: ["id"];
|
|
2922
|
+
},
|
|
2923
|
+
{
|
|
2924
|
+
foreignKeyName: "deployment_organization_models_organization_id_fkey";
|
|
2925
|
+
columns: ["organization_id"];
|
|
2926
|
+
isOneToOne: false;
|
|
2927
|
+
referencedRelation: "organizations";
|
|
2928
|
+
referencedColumns: ["id"];
|
|
2929
|
+
}
|
|
2930
|
+
];
|
|
2931
|
+
};
|
|
2887
2932
|
deployments: {
|
|
2888
2933
|
Row: {
|
|
2889
2934
|
created_at: string;
|
|
@@ -6897,7 +6942,11 @@ declare const OrganizationModelSchema$1: z.ZodObject<{
|
|
|
6897
6942
|
light: z.ZodOptional<z.ZodString>;
|
|
6898
6943
|
dark: z.ZodOptional<z.ZodString>;
|
|
6899
6944
|
}, z.core.$strip>>;
|
|
6900
|
-
|
|
6945
|
+
voice: z.ZodOptional<z.ZodString>;
|
|
6946
|
+
tagline: z.ZodOptional<z.ZodString>;
|
|
6947
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6948
|
+
themePresetId: z.ZodOptional<z.ZodString>;
|
|
6949
|
+
}, z.core.$loose>>;
|
|
6901
6950
|
navigation: z.ZodDefault<z.ZodObject<{
|
|
6902
6951
|
sidebar: z.ZodDefault<z.ZodObject<{
|
|
6903
6952
|
primary: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodType<SidebarNode, unknown, z.core.$ZodTypeInternals<SidebarNode, unknown>>>>;
|
|
@@ -6944,7 +6993,11 @@ declare const OrganizationModelSchema$1: z.ZodObject<{
|
|
|
6944
6993
|
}, z.core.$strip>>;
|
|
6945
6994
|
}, z.core.$strip>>;
|
|
6946
6995
|
clientBrief: z.ZodDefault<z.ZodString>;
|
|
6947
|
-
|
|
6996
|
+
organizationName: z.ZodOptional<z.ZodString>;
|
|
6997
|
+
productName: z.ZodOptional<z.ZodString>;
|
|
6998
|
+
shortName: z.ZodOptional<z.ZodString>;
|
|
6999
|
+
description: z.ZodOptional<z.ZodString>;
|
|
7000
|
+
}, z.core.$loose>>;
|
|
6948
7001
|
customers: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6949
7002
|
id: z.ZodString;
|
|
6950
7003
|
order: z.ZodNumber;
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1674,7 +1674,11 @@ declare const OrganizationModelSchema$1: z.ZodObject<{
|
|
|
1674
1674
|
light: z.ZodOptional<z.ZodString>;
|
|
1675
1675
|
dark: z.ZodOptional<z.ZodString>;
|
|
1676
1676
|
}, z.core.$strip>>;
|
|
1677
|
-
|
|
1677
|
+
voice: z.ZodOptional<z.ZodString>;
|
|
1678
|
+
tagline: z.ZodOptional<z.ZodString>;
|
|
1679
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1680
|
+
themePresetId: z.ZodOptional<z.ZodString>;
|
|
1681
|
+
}, z.core.$loose>>;
|
|
1678
1682
|
navigation: z.ZodDefault<z.ZodObject<{
|
|
1679
1683
|
sidebar: z.ZodDefault<z.ZodObject<{
|
|
1680
1684
|
primary: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodType<SidebarNode, unknown, z.core.$ZodTypeInternals<SidebarNode, unknown>>>>;
|
|
@@ -1721,7 +1725,11 @@ declare const OrganizationModelSchema$1: z.ZodObject<{
|
|
|
1721
1725
|
}, z.core.$strip>>;
|
|
1722
1726
|
}, z.core.$strip>>;
|
|
1723
1727
|
clientBrief: z.ZodDefault<z.ZodString>;
|
|
1724
|
-
|
|
1728
|
+
organizationName: z.ZodOptional<z.ZodString>;
|
|
1729
|
+
productName: z.ZodOptional<z.ZodString>;
|
|
1730
|
+
shortName: z.ZodOptional<z.ZodString>;
|
|
1731
|
+
description: z.ZodOptional<z.ZodString>;
|
|
1732
|
+
}, z.core.$loose>>;
|
|
1725
1733
|
customers: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
1726
1734
|
id: z.ZodString;
|
|
1727
1735
|
order: z.ZodNumber;
|
|
@@ -2717,6 +2717,51 @@ type Database = {
|
|
|
2717
2717
|
}
|
|
2718
2718
|
];
|
|
2719
2719
|
};
|
|
2720
|
+
deployment_organization_models: {
|
|
2721
|
+
Row: {
|
|
2722
|
+
created_at: string;
|
|
2723
|
+
deployment_id: string;
|
|
2724
|
+
model_hash: string | null;
|
|
2725
|
+
organization_id: string;
|
|
2726
|
+
organization_model: Json;
|
|
2727
|
+
schema_version: string;
|
|
2728
|
+
updated_at: string;
|
|
2729
|
+
};
|
|
2730
|
+
Insert: {
|
|
2731
|
+
created_at?: string;
|
|
2732
|
+
deployment_id: string;
|
|
2733
|
+
model_hash?: string | null;
|
|
2734
|
+
organization_id: string;
|
|
2735
|
+
organization_model: Json;
|
|
2736
|
+
schema_version?: string;
|
|
2737
|
+
updated_at?: string;
|
|
2738
|
+
};
|
|
2739
|
+
Update: {
|
|
2740
|
+
created_at?: string;
|
|
2741
|
+
deployment_id?: string;
|
|
2742
|
+
model_hash?: string | null;
|
|
2743
|
+
organization_id?: string;
|
|
2744
|
+
organization_model?: Json;
|
|
2745
|
+
schema_version?: string;
|
|
2746
|
+
updated_at?: string;
|
|
2747
|
+
};
|
|
2748
|
+
Relationships: [
|
|
2749
|
+
{
|
|
2750
|
+
foreignKeyName: "deployment_organization_models_deployment_id_fkey";
|
|
2751
|
+
columns: ["deployment_id"];
|
|
2752
|
+
isOneToOne: true;
|
|
2753
|
+
referencedRelation: "deployments";
|
|
2754
|
+
referencedColumns: ["id"];
|
|
2755
|
+
},
|
|
2756
|
+
{
|
|
2757
|
+
foreignKeyName: "deployment_organization_models_organization_id_fkey";
|
|
2758
|
+
columns: ["organization_id"];
|
|
2759
|
+
isOneToOne: false;
|
|
2760
|
+
referencedRelation: "organizations";
|
|
2761
|
+
referencedColumns: ["id"];
|
|
2762
|
+
}
|
|
2763
|
+
];
|
|
2764
|
+
};
|
|
2720
2765
|
deployments: {
|
|
2721
2766
|
Row: {
|
|
2722
2767
|
created_at: string;
|
|
@@ -6095,7 +6140,11 @@ declare const OrganizationModelSchema: z.ZodObject<{
|
|
|
6095
6140
|
light: z.ZodOptional<z.ZodString>;
|
|
6096
6141
|
dark: z.ZodOptional<z.ZodString>;
|
|
6097
6142
|
}, z.core.$strip>>;
|
|
6098
|
-
|
|
6143
|
+
voice: z.ZodOptional<z.ZodString>;
|
|
6144
|
+
tagline: z.ZodOptional<z.ZodString>;
|
|
6145
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6146
|
+
themePresetId: z.ZodOptional<z.ZodString>;
|
|
6147
|
+
}, z.core.$loose>>;
|
|
6099
6148
|
navigation: z.ZodDefault<z.ZodObject<{
|
|
6100
6149
|
sidebar: z.ZodDefault<z.ZodObject<{
|
|
6101
6150
|
primary: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodType<SidebarNode, unknown, z.core.$ZodTypeInternals<SidebarNode, unknown>>>>;
|
|
@@ -6142,7 +6191,11 @@ declare const OrganizationModelSchema: z.ZodObject<{
|
|
|
6142
6191
|
}, z.core.$strip>>;
|
|
6143
6192
|
}, z.core.$strip>>;
|
|
6144
6193
|
clientBrief: z.ZodDefault<z.ZodString>;
|
|
6145
|
-
|
|
6194
|
+
organizationName: z.ZodOptional<z.ZodString>;
|
|
6195
|
+
productName: z.ZodOptional<z.ZodString>;
|
|
6196
|
+
shortName: z.ZodOptional<z.ZodString>;
|
|
6197
|
+
description: z.ZodOptional<z.ZodString>;
|
|
6198
|
+
}, z.core.$loose>>;
|
|
6146
6199
|
customers: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6147
6200
|
id: z.ZodString;
|
|
6148
6201
|
order: z.ZodNumber;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elevasis/sdk",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.1",
|
|
4
4
|
"description": "SDK for building Elevasis organization resources",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"tsup": "^8.0.0",
|
|
59
59
|
"typescript": "5.9.2",
|
|
60
60
|
"zod": "^4.1.0",
|
|
61
|
-
"@repo/core": "0.
|
|
61
|
+
"@repo/core": "0.32.0",
|
|
62
62
|
"@repo/eslint-config": "0.0.0",
|
|
63
63
|
"@repo/typescript-config": "0.0.0"
|
|
64
64
|
},
|
|
@@ -23,7 +23,7 @@ Before collecting any information or running any steps, determine which state th
|
|
|
23
23
|
|
|
24
24
|
**State A — Virgin (placeholders present):** One or more of the above placeholder strings is found. Run the full bootstrap flow (Steps 1–7 below), then hand off to `/om`.
|
|
25
25
|
|
|
26
|
-
**State B — Already bootstrapped, org-model at defaults:** No placeholders found, but `core/config/organization-model.ts` contains only the default
|
|
26
|
+
**State B — Already bootstrapped, org-model at defaults:** No placeholders found, but `core/config/organization-model.ts` contains only the default display naming override (just `identity.organizationName`, `identity.productName`, `identity.shortName`, with legacy `branding.*` fallback values — no customers, offerings, roles, goals, or techStack overrides). Print:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
29
|
This project is already set up. The organization model has not been configured yet.
|
|
@@ -32,7 +32,7 @@ Running /om to set up your organization profile...
|
|
|
32
32
|
|
|
33
33
|
Then execute `/om` (the full layered flow) and stop.
|
|
34
34
|
|
|
35
|
-
**State C — Fully configured:** No placeholders found AND `core/config/organization-model.ts` has at least one non-
|
|
35
|
+
**State C — Fully configured:** No placeholders found AND `core/config/organization-model.ts` has at least one non-default business domain populated (customers, offerings, roles, goals, techStack, or identity fields beyond display naming/client brief). Print:
|
|
36
36
|
|
|
37
37
|
```
|
|
38
38
|
This project is already configured. To update your organization profile, run /om.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Branding Names to Identity
|
|
2
|
+
|
|
3
|
+
## Why this note exists
|
|
4
|
+
|
|
5
|
+
The Organization Model now treats `identity.organizationName`, `identity.productName`,
|
|
6
|
+
and `identity.shortName` as the preferred source for display naming. The older
|
|
7
|
+
`branding.*` name fields remain valid for backward compatibility, but new template code
|
|
8
|
+
reads identity first and falls back to branding only for legacy projects.
|
|
9
|
+
|
|
10
|
+
Branding also now supports first-class expression fields such as `voice`, `tagline`,
|
|
11
|
+
`values`, and `themePresetId`, while still accepting tenant-specific passthrough fields.
|
|
12
|
+
|
|
13
|
+
## Applies to
|
|
14
|
+
|
|
15
|
+
Template-derived projects that customize Organization Model branding or read
|
|
16
|
+
`organizationModel.branding.organizationName`, `productName`, or `shortName` directly in
|
|
17
|
+
UI or setup code.
|
|
18
|
+
|
|
19
|
+
## Required actions
|
|
20
|
+
|
|
21
|
+
1. Keep existing `branding.organizationName`, `branding.productName`, and
|
|
22
|
+
`branding.shortName` values in place for compatibility.
|
|
23
|
+
2. Add matching values under `identity.organizationName`, `identity.productName`, and
|
|
24
|
+
`identity.shortName`.
|
|
25
|
+
3. Update project UI code to read `identity.* ?? branding.*` for display naming.
|
|
26
|
+
4. Move brand expression into the broadened `branding` fields: `voice`, `tagline`,
|
|
27
|
+
`values`, `themePresetId`, and project-owned passthrough fields as needed.
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
|
|
31
|
+
Run the normal template-derived project gates after syncing:
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
pnpm -C core test
|
|
35
|
+
pnpm -C ui check-types
|
|
36
|
+
pnpm -C ui build
|
|
37
|
+
pnpm -C operations check-types
|
|
38
|
+
pnpm -C operations check
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Also open the app shell and Knowledge Base identity/branding views. Confirm display names
|
|
42
|
+
render from identity and branding expression fields render under Branding.
|
|
43
|
+
|
|
44
|
+
## Not handled by /git-sync
|
|
45
|
+
|
|
46
|
+
`/git-sync` cannot choose real brand voice, tagline, values, logo assets, or custom
|
|
47
|
+
passthrough fields for an individual tenant. It also cannot remove legacy
|
|
48
|
+
`branding.*` name fields from project-specific code until maintainers confirm every
|
|
49
|
+
consumer has migrated to the identity-first fallback.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# OM Deployment Drift Detection
|
|
2
|
+
|
|
3
|
+
## Why this note exists
|
|
4
|
+
|
|
5
|
+
The platform API now persists deployed Organization Model snapshots and validates tenant
|
|
6
|
+
lead-gen and CRM catalogs against the requesting tenant's active deployed model. The
|
|
7
|
+
template does not need source changes for this server-side fix, but template-derived
|
|
8
|
+
projects should accept the `@elevasis/core` package baseline when this release train
|
|
9
|
+
publishes it so generated database and shared type surfaces stay aligned.
|
|
10
|
+
|
|
11
|
+
## Applies to
|
|
12
|
+
|
|
13
|
+
Template-derived projects that use SDK deployments, lead-gen list creation, CRM stages,
|
|
14
|
+
or CRM actions through the hosted Elevasis API.
|
|
15
|
+
|
|
16
|
+
## Required actions
|
|
17
|
+
|
|
18
|
+
1. Pull the package baseline update produced by this ship train.
|
|
19
|
+
2. Redeploy or verify tenant operations resources if the project has recently changed its
|
|
20
|
+
Organization Model catalogs.
|
|
21
|
+
3. After the API deployment stage completes, smoke lead-gen list creation with a
|
|
22
|
+
project-owned build template ID.
|
|
23
|
+
|
|
24
|
+
## Verification
|
|
25
|
+
|
|
26
|
+
Run the normal template-derived project gates after syncing:
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
pnpm -C core test
|
|
30
|
+
pnpm -C operations check-types
|
|
31
|
+
pnpm -C operations check
|
|
32
|
+
pnpm -C ui check-types
|
|
33
|
+
pnpm -C ui build
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
For projects using lead-gen, also verify list creation against the hosted API with a
|
|
37
|
+
tenant-owned build template ID.
|
|
38
|
+
|
|
39
|
+
## Not handled by /git-sync
|
|
40
|
+
|
|
41
|
+
`/git-sync` cannot apply the production database change or deploy the hosted API. It also
|
|
42
|
+
does not create project-specific Organization Model catalogs or workflow resources.
|
|
@@ -149,9 +149,9 @@ For exact required flags and accepted enum values, see the command source under
|
|
|
149
149
|
|
|
150
150
|
## elevasis-sdk note:\*
|
|
151
151
|
|
|
152
|
-
`elevasis-sdk note:*` is the agent-facing surface for pushing and reading
|
|
152
|
+
`elevasis-sdk note:*` is the agent-facing surface for pushing and reading user notes. Workflows and agents use it to surface information -- such as "deal X stalled" or "review run completed" -- directly into a user's Notes panel in the Command Center, without sending an email or notification.
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
Agent-written notes are private to the target user and scoped to the calling organization. The authenticated Notes panel can also create and edit org-shared notes (`visibility: 'org'`), which are visible to active members of the same organization and show creator attribution. The external SDK CLI surface exposes `GET + POST` only; `note:update` and `note:delete` are not yet available via SDK CLI. Users edit, delete, and change visibility through the right-panel view.
|
|
155
155
|
|
|
156
156
|
### note:create
|
|
157
157
|
|
|
@@ -187,6 +187,7 @@ elevasis-sdk note:create --content <text>
|
|
|
187
187
|
- Posts to `POST /api/external/user-notes`
|
|
188
188
|
- When `--user` is omitted the note is created for the identity bound to the API key (the caller)
|
|
189
189
|
- When `--user` is provided the platform resolves the email to a Supabase user UUID and verifies the resolved user is an active member of the calling organization before writing
|
|
190
|
+
- External agent-created notes are always private; org-shared visibility is a signed-in UI capability, not a broadcast CLI mode
|
|
190
191
|
- The `--source` flag is recorded as the `source` column in `user_notes`; agent runtimes should pass their resource ID here so users can see which workflow created the note
|
|
191
192
|
- Priority `normal` produces no badge in the UI; `high` renders orange, `urgent` renders red, `low` renders dimmed gray
|
|
192
193
|
|
|
@@ -279,9 +280,9 @@ elevasis-sdk note:list --user ops@acme.com --priority high --pinned --pretty
|
|
|
279
280
|
|
|
280
281
|
### Command Boundary
|
|
281
282
|
|
|
282
|
-
- `note:create` and `note:list` operate on the **
|
|
283
|
+
- `note:create` and `note:list` operate on the **user notes** surface -- not project notes. For project-scoped notes use `project:note:*`.
|
|
283
284
|
- `note:update` and `note:delete` are not yet available via SDK CLI. Edit and delete notes using the Notes panel in the Command Center.
|
|
284
|
-
- The Notes panel view (`NotesPanelView`) is registered in the right-panel registry alongside Overview, Recent Executions, and Notifications.
|
|
285
|
+
- The shared Notes panel view (`NotesPanelView`) is exported from `@elevasis/ui/features/notes` and registered in the right-panel registry alongside Overview, Recent Executions, and Notifications.
|
|
285
286
|
|
|
286
287
|
**Implementation:** `packages/sdk/src/cli/commands/notes.ts` -- delegates to `POST /api/external/user-notes` and `GET /api/external/user-notes`
|
|
287
288
|
|
|
@@ -289,7 +290,8 @@ elevasis-sdk note:list --user ops@acme.com --priority high --pinned --pretty
|
|
|
289
290
|
|
|
290
291
|
The following invariants govern the Notes feature and are relevant when building agents or workflows that write notes:
|
|
291
292
|
|
|
292
|
-
- **Scope:** Notes are user-scoped and organization-scoped by default. A user can
|
|
293
|
+
- **Scope:** Notes are user-scoped and organization-scoped by default. A signed-in user can mark a note as org-shared; agent-created notes stay private to the target user.
|
|
294
|
+
- **Org-shared visibility:** `visibility: 'org'` lets active org members see and edit the note. Only the creator can change the visibility value.
|
|
293
295
|
- **Sort order:** Pinned first, then by priority (`urgent` > `high` > `normal` > `low`), then by most recently updated.
|
|
294
296
|
- **Broadcast:** Out of scope. Agents create notes for one resolved user at a time. Broadcast is a notifications concern, not a notes concern.
|
|
295
297
|
- **Retention:** Notes persist until the user explicitly deletes them. There is no TTL and no dismissed state.
|
|
@@ -7,13 +7,23 @@
|
|
|
7
7
|
import { defineOrganizationModel, defineResources } from '@elevasis/core/organization-model'
|
|
8
8
|
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
|
-
//
|
|
10
|
+
// Identity and branding override
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
export const brandingOverrideExample = defineOrganizationModel({
|
|
13
|
+
identity: {
|
|
14
|
+
organizationName: 'Northstar Studio',
|
|
15
|
+
productName: 'Northstar Ops',
|
|
16
|
+
shortName: 'Northstar'
|
|
17
|
+
},
|
|
13
18
|
branding: {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
logos: {
|
|
20
|
+
light: '/brand/northstar-logo-light.svg',
|
|
21
|
+
dark: '/brand/northstar-logo-dark.svg'
|
|
22
|
+
},
|
|
23
|
+
voice: 'Clear, practical, and calm.',
|
|
24
|
+
tagline: 'Operational clarity for growing teams.',
|
|
25
|
+
values: ['Clarity', 'Reliability', 'Momentum'],
|
|
26
|
+
themePresetId: 'northstar'
|
|
17
27
|
}
|
|
18
28
|
})
|
|
19
29
|
|