@elevasis/sdk 1.7.0 → 1.8.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 (39) hide show
  1. package/dist/cli.cjs +523 -4560
  2. package/dist/index.d.ts +72 -16
  3. package/package.json +2 -2
  4. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -11
  5. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +188 -0
  6. package/reference/claude-config/logs/pre-edit-vibe-gate.log +17 -0
  7. package/reference/claude-config/logs/scaffold-registry-reminder.log +17 -0
  8. package/reference/claude-config/rules/active-change-index.md +80 -0
  9. package/reference/claude-config/rules/agent-start-here.md +254 -0
  10. package/reference/claude-config/rules/deployment.md +0 -1
  11. package/reference/claude-config/rules/observability.md +2 -2
  12. package/reference/claude-config/rules/operations.md +64 -0
  13. package/reference/claude-config/rules/organization-model.md +44 -0
  14. package/reference/claude-config/rules/organization-os.md +2 -4
  15. package/reference/claude-config/rules/task-tracking.md +4 -4
  16. package/reference/claude-config/rules/ui.md +202 -0
  17. package/reference/claude-config/rules/vibe.md +0 -8
  18. package/reference/claude-config/settings.json +4 -11
  19. package/reference/claude-config/skills/configure/SKILL.md +0 -2
  20. package/reference/claude-config/skills/configure/operations/features.md +1 -3
  21. package/reference/claude-config/skills/deploy/SKILL.md +3 -13
  22. package/reference/claude-config/skills/dsp/SKILL.md +2 -2
  23. package/reference/claude-config/skills/elevasis/SKILL.md +0 -4
  24. package/reference/claude-config/skills/explore/SKILL.md +5 -5
  25. package/reference/claude-config/skills/project/SKILL.md +1 -1
  26. package/reference/claude-config/skills/save/SKILL.md +5 -19
  27. package/reference/claude-config/skills/setup/SKILL.md +32 -16
  28. package/reference/claude-config/skills/status/SKILL.md +2 -3
  29. package/reference/claude-config/skills/submit-request/SKILL.md +1 -1
  30. package/reference/deployment/command-center.mdx +0 -17
  31. package/reference/framework/project-structure.mdx +1 -5
  32. package/reference/packages/ui/src/hooks/README.md +1 -2
  33. package/reference/scaffold/operations/propagation-pipeline.md +10 -11
  34. package/reference/scaffold/operations/scaffold-maintenance.md +1 -4
  35. package/reference/scaffold/recipes/add-a-resource.md +3 -12
  36. package/reference/scaffold/reference/contracts.md +1 -1
  37. package/reference/claude-config/hooks/__tests__/pre-edit-vibe-gate.test.mjs +0 -169
  38. package/reference/claude-config/hooks/pre-edit-vibe-gate.mjs +0 -128
  39. package/reference/claude-config/rules/docs.md +0 -26
package/dist/index.d.ts CHANGED
@@ -2425,10 +2425,8 @@ type Database = {
2425
2425
  };
2426
2426
  deployments: {
2427
2427
  Row: {
2428
- compiled_docs: Json | null;
2429
2428
  created_at: string;
2430
2429
  deployment_version: string | null;
2431
- documentation: Json | null;
2432
2430
  error_message: string | null;
2433
2431
  id: string;
2434
2432
  organization_id: string;
@@ -2440,10 +2438,8 @@ type Database = {
2440
2438
  updated_at: string;
2441
2439
  };
2442
2440
  Insert: {
2443
- compiled_docs?: Json | null;
2444
2441
  created_at?: string;
2445
2442
  deployment_version?: string | null;
2446
- documentation?: Json | null;
2447
2443
  error_message?: string | null;
2448
2444
  id?: string;
2449
2445
  organization_id: string;
@@ -2455,10 +2451,8 @@ type Database = {
2455
2451
  updated_at?: string;
2456
2452
  };
2457
2453
  Update: {
2458
- compiled_docs?: Json | null;
2459
2454
  created_at?: string;
2460
2455
  deployment_version?: string | null;
2461
- documentation?: Json | null;
2462
2456
  error_message?: string | null;
2463
2457
  id?: string;
2464
2458
  organization_id?: string;
@@ -2970,6 +2964,13 @@ type Database = {
2970
2964
  updated_at?: string;
2971
2965
  };
2972
2966
  Relationships: [
2967
+ {
2968
+ foreignKeyName: "fk_milestones_project";
2969
+ columns: ["project_id"];
2970
+ isOneToOne: false;
2971
+ referencedRelation: "prj_projects";
2972
+ referencedColumns: ["id"];
2973
+ },
2973
2974
  {
2974
2975
  foreignKeyName: "prj_milestones_organization_id_fkey";
2975
2976
  columns: ["organization_id"];
@@ -3030,6 +3031,34 @@ type Database = {
3030
3031
  type?: string;
3031
3032
  };
3032
3033
  Relationships: [
3034
+ {
3035
+ foreignKeyName: "fk_notes_created_by";
3036
+ columns: ["created_by"];
3037
+ isOneToOne: false;
3038
+ referencedRelation: "users";
3039
+ referencedColumns: ["id"];
3040
+ },
3041
+ {
3042
+ foreignKeyName: "fk_notes_milestone";
3043
+ columns: ["milestone_id"];
3044
+ isOneToOne: false;
3045
+ referencedRelation: "prj_milestones";
3046
+ referencedColumns: ["id"];
3047
+ },
3048
+ {
3049
+ foreignKeyName: "fk_notes_project";
3050
+ columns: ["project_id"];
3051
+ isOneToOne: false;
3052
+ referencedRelation: "prj_projects";
3053
+ referencedColumns: ["id"];
3054
+ },
3055
+ {
3056
+ foreignKeyName: "fk_notes_task";
3057
+ columns: ["task_id"];
3058
+ isOneToOne: false;
3059
+ referencedRelation: "prj_tasks";
3060
+ referencedColumns: ["id"];
3061
+ },
3033
3062
  {
3034
3063
  foreignKeyName: "prj_notes_created_by_fkey";
3035
3064
  columns: ["created_by"];
@@ -3120,6 +3149,20 @@ type Database = {
3120
3149
  updated_at?: string;
3121
3150
  };
3122
3151
  Relationships: [
3152
+ {
3153
+ foreignKeyName: "fk_projects_company";
3154
+ columns: ["client_company_id"];
3155
+ isOneToOne: false;
3156
+ referencedRelation: "acq_companies";
3157
+ referencedColumns: ["id"];
3158
+ },
3159
+ {
3160
+ foreignKeyName: "fk_projects_deal";
3161
+ columns: ["deal_id"];
3162
+ isOneToOne: false;
3163
+ referencedRelation: "acq_deals";
3164
+ referencedColumns: ["id"];
3165
+ },
3123
3166
  {
3124
3167
  foreignKeyName: "prj_projects_client_company_id_fkey";
3125
3168
  columns: ["client_company_id"];
@@ -3202,6 +3245,27 @@ type Database = {
3202
3245
  updated_at?: string;
3203
3246
  };
3204
3247
  Relationships: [
3248
+ {
3249
+ foreignKeyName: "fk_tasks_milestone";
3250
+ columns: ["milestone_id"];
3251
+ isOneToOne: false;
3252
+ referencedRelation: "prj_milestones";
3253
+ referencedColumns: ["id"];
3254
+ },
3255
+ {
3256
+ foreignKeyName: "fk_tasks_parent";
3257
+ columns: ["parent_task_id"];
3258
+ isOneToOne: false;
3259
+ referencedRelation: "prj_tasks";
3260
+ referencedColumns: ["id"];
3261
+ },
3262
+ {
3263
+ foreignKeyName: "fk_tasks_project";
3264
+ columns: ["project_id"];
3265
+ isOneToOne: false;
3266
+ referencedRelation: "prj_projects";
3267
+ referencedColumns: ["id"];
3268
+ },
3205
3269
  {
3206
3270
  foreignKeyName: "prj_tasks_milestone_id_fkey";
3207
3271
  columns: ["milestone_id"];
@@ -6569,8 +6633,8 @@ declare const ProjectSchemas: {
6569
6633
  type: z.ZodOptional<z.ZodEnum<{
6570
6634
  code: "code";
6571
6635
  other: "other";
6572
- documentation: "documentation";
6573
6636
  research: "research";
6637
+ documentation: "documentation";
6574
6638
  report: "report";
6575
6639
  design: "design";
6576
6640
  refactor: "refactor";
@@ -6605,8 +6669,8 @@ declare const ProjectSchemas: {
6605
6669
  type: z.ZodOptional<z.ZodEnum<{
6606
6670
  code: "code";
6607
6671
  other: "other";
6608
- documentation: "documentation";
6609
6672
  research: "research";
6673
+ documentation: "documentation";
6610
6674
  report: "report";
6611
6675
  design: "design";
6612
6676
  refactor: "refactor";
@@ -8677,14 +8741,6 @@ interface ElevasConfig {
8677
8741
  dev?: {
8678
8742
  port?: number;
8679
8743
  };
8680
- /**
8681
- * Directory (relative to CWD) to scan for deployable documentation.
8682
- * Defaults to 'docs'. Use '../docs' when running the SDK from a subdirectory
8683
- * and wanting to consolidate docs at the project root.
8684
- *
8685
- * Set to `false` to disable documentation scanning entirely.
8686
- */
8687
- docsDir?: string | false;
8688
8744
  }
8689
8745
 
8690
8746
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -44,7 +44,7 @@
44
44
  "tsup": "^8.0.0",
45
45
  "typescript": "5.9.2",
46
46
  "zod": "^4.1.0",
47
- "@repo/core": "0.6.0",
47
+ "@repo/core": "0.7.0",
48
48
  "@repo/typescript-config": "0.0.0"
49
49
  },
50
50
  "scripts": {
@@ -42,17 +42,6 @@ try {
42
42
 
43
43
  const results = []
44
44
 
45
- // 0. Frontmatter check for docs/*.md (except docs/index.md which is auto-generated)
46
- const docsDir = normalize(join(ROOT, 'docs'))
47
- const indexPath = normalize(join(docsDir, 'index.md'))
48
- if (ext === '.md' && absPath.startsWith(docsDir) && absPath !== indexPath) {
49
- const content = readFileSync(absPath, 'utf-8')
50
- if (!content.startsWith('---\n') && !content.startsWith('---\r\n')) {
51
- const rel = relative(ROOT, absPath).replace(/\\/g, '/')
52
- results.push(`Missing frontmatter in ${rel}. All docs require:\n---\ntitle: ...\ndescription: ...\n---`)
53
- }
54
- }
55
-
56
45
  // 1. Prettier (skip silently if not installed yet, e.g. before first pnpm install)
57
46
  if (PRETTIER_EXTENSIONS.has(ext)) {
58
47
  try {
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ // scaffold-registry-reminder.mjs
3
+ // PostToolUse hook — reads the compiled scaffold registry and emits advisory
4
+ // reminders when an edited file matches a registry source pattern.
5
+ //
6
+ // Template twin of the monorepo hook. Gracefully no-ops when the compiled
7
+ // registry is absent (e.g. before SDK delivers scaffold-registry.compiled.json
8
+ // to external projects — Step 7/SDK milestone).
9
+ //
10
+ // Exit 0 always (advisory hook — never blocks).
11
+
12
+ import { readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs'
13
+ import { join, normalize, relative } from 'node:path'
14
+
15
+ const ROOT = process.env.CLAUDE_PROJECT_DIR ?? process.cwd()
16
+ const LOG_DIR = join(ROOT, '.claude', 'logs')
17
+ const LOG_FILE = join(LOG_DIR, 'scaffold-registry-reminder.log')
18
+ const STATE_FILE = join(LOG_DIR, 'scaffold-registry-reminder.state.json')
19
+ const REGISTRY_FILE = join(ROOT, '.claude', 'scaffold-registry.compiled.json')
20
+
21
+ const DEFAULT_COOLDOWN_MS = 300_000 // 5 minutes
22
+
23
+ const GENERATED_DIR_SEGMENTS = ['_generated', '_gen']
24
+ const GENERATED_CONTENT_MARKER = '@generated'
25
+
26
+ function log(msg) {
27
+ try {
28
+ mkdirSync(LOG_DIR, { recursive: true })
29
+ appendFileSync(LOG_FILE, `[${new Date().toISOString()}] ${msg}\n`)
30
+ } catch {}
31
+ }
32
+
33
+ function pathMatchesPattern(filePath, pattern) {
34
+ const normalizedFile = filePath.replace(/\\/g, '/')
35
+ const normalizedPattern = pattern.replace(/\\/g, '/')
36
+
37
+ if (normalizedFile === normalizedPattern) return true
38
+
39
+ if (normalizedPattern.endsWith('/**') || normalizedPattern.endsWith('/*')) {
40
+ const prefix = normalizedPattern.slice(0, normalizedPattern.lastIndexOf('/*'))
41
+ return normalizedFile.startsWith(prefix + '/')
42
+ }
43
+
44
+ if (normalizedPattern.includes('*')) {
45
+ const escaped = normalizedPattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '[^/]*')
46
+ return new RegExp(`^${escaped}$`).test(normalizedFile)
47
+ }
48
+
49
+ return normalizedFile.startsWith(normalizedPattern + '/')
50
+ }
51
+
52
+ function loadState() {
53
+ try {
54
+ return JSON.parse(readFileSync(STATE_FILE, 'utf-8'))
55
+ } catch {
56
+ return {}
57
+ }
58
+ }
59
+
60
+ function saveState(state) {
61
+ try {
62
+ mkdirSync(LOG_DIR, { recursive: true })
63
+ writeFileSync(STATE_FILE, JSON.stringify(state, null, 2) + '\n', 'utf-8')
64
+ } catch {}
65
+ }
66
+
67
+ function throttleKey(entryId, filePath) {
68
+ return `${entryId}:${filePath}`
69
+ }
70
+
71
+ function isCoolingDown(state, key, cooldownMs) {
72
+ const last = state[key]
73
+ if (!last) return false
74
+ return Date.now() - last < cooldownMs
75
+ }
76
+
77
+ function formatDependentLine(dep) {
78
+ const regen = dep.regen === 'manual' ? 'manual check' : dep.regen
79
+ const hint = dep.hint ? ` [${dep.hint}]` : ''
80
+ return ` - ${dep.path} -> ${regen}${hint}`
81
+ }
82
+
83
+ function emitReminder(entry, relFilePath) {
84
+ const lines = [
85
+ `\uD83D\uDD14 Scaffold reminder -- ${entry.id} (${relFilePath})`,
86
+ ` Downstream scaffolds that may need updating:`
87
+ ]
88
+ for (const dep of entry.dependents) {
89
+ lines.push(formatDependentLine(dep))
90
+ }
91
+ lines.push(
92
+ ` If this is a scaffold-sensitive pattern not in the registry, also add an entry to .claude/scaffold-registry.yml.`
93
+ )
94
+ return lines.join('\n')
95
+ }
96
+
97
+ function emitMissingEntryHint(relFilePath) {
98
+ return [
99
+ `\uD83D\uDD14 Scaffold reminder -- unregistered generated path (${relFilePath})`,
100
+ ` This path looks scaffold-generated but has no registry entry.`,
101
+ ` If it is scaffold-sensitive, add a new entry to .claude/scaffold-registry.yml`,
102
+ ` so the reminder hook and /work handoff can track it.`
103
+ ].join('\n')
104
+ }
105
+
106
+ function looksLikeGeneratedPath(filePath) {
107
+ const normalizedFile = filePath.replace(/\\/g, '/')
108
+ const segments = normalizedFile.split('/')
109
+ return segments.some((seg) => GENERATED_DIR_SEGMENTS.includes(seg))
110
+ }
111
+
112
+ function looksLikeGeneratedContent(absFilePath) {
113
+ try {
114
+ const content = readFileSync(absFilePath, 'utf-8').slice(0, 500)
115
+ return content.includes(GENERATED_CONTENT_MARKER)
116
+ } catch {
117
+ return false
118
+ }
119
+ }
120
+
121
+ try {
122
+ const chunks = []
123
+ for await (const chunk of process.stdin) chunks.push(chunk)
124
+ const input = JSON.parse(Buffer.concat(chunks).toString())
125
+
126
+ const rawFilePath = input.tool_input?.file_path
127
+ if (!rawFilePath) process.exit(0)
128
+
129
+ const absFilePath = normalize(rawFilePath)
130
+ const relFilePath = relative(ROOT, absFilePath).replace(/\\/g, '/')
131
+
132
+ // Graceful no-op when registry is absent (pre-SDK-delivery state)
133
+ let registry
134
+ try {
135
+ const raw = readFileSync(REGISTRY_FILE, 'utf-8')
136
+ registry = JSON.parse(raw)
137
+ } catch {
138
+ log(`SKIP — registry not found (pre-SDK-delivery)`)
139
+ process.exit(0)
140
+ }
141
+
142
+ const entries = registry?.entries ?? []
143
+
144
+ const matched = entries.filter((entry) =>
145
+ (entry.sources ?? []).some((pattern) => pathMatchesPattern(relFilePath, pattern))
146
+ )
147
+
148
+ const state = loadState()
149
+ const now = Date.now()
150
+ const messages = []
151
+
152
+ if (matched.length > 0) {
153
+ for (const entry of matched) {
154
+ const key = throttleKey(entry.id, relFilePath)
155
+ const cooldown = entry.cooldown_ms ?? DEFAULT_COOLDOWN_MS
156
+ if (isCoolingDown(state, key, cooldown)) {
157
+ log(`THROTTLED — ${entry.id} for ${relFilePath}`)
158
+ continue
159
+ }
160
+ messages.push(emitReminder(entry, relFilePath))
161
+ state[key] = now
162
+ log(`EMITTED — ${entry.id} for ${relFilePath}`)
163
+ }
164
+ } else {
165
+ const isGenerated = looksLikeGeneratedPath(relFilePath) || looksLikeGeneratedContent(absFilePath)
166
+
167
+ if (isGenerated) {
168
+ const key = throttleKey('__missing__', relFilePath)
169
+ if (!isCoolingDown(state, key, DEFAULT_COOLDOWN_MS)) {
170
+ messages.push(emitMissingEntryHint(relFilePath))
171
+ state[key] = now
172
+ log(`EMITTED missing-entry hint for ${relFilePath}`)
173
+ } else {
174
+ log(`THROTTLED missing-entry hint for ${relFilePath}`)
175
+ }
176
+ }
177
+ }
178
+
179
+ if (messages.length > 0) {
180
+ saveState(state)
181
+ process.stderr.write(messages.join('\n\n') + '\n')
182
+ process.exit(2)
183
+ }
184
+ } catch (err) {
185
+ log(`ERROR: ${err.message}`)
186
+ }
187
+
188
+ process.exit(0)
@@ -21,3 +21,20 @@
21
21
  [2026-04-20T09:40:20.762Z] tool=Edit path=foundations/config/extensions/deal-ecom.ts protected=true VIBE_APPROVED=true decision=ALLOW
22
22
  [2026-04-20T09:40:20.807Z] tool=Write path=ui/src/routes/__root.tsx protected=false VIBE_APPROVED=false decision=ALLOW
23
23
  [2026-04-20T09:40:20.905Z] tool=Edit path=operations/src/index.ts protected=false VIBE_APPROVED=false decision=ALLOW
24
+ [2026-04-21T02:33:54.792Z] tool=Write path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
25
+ [2026-04-21T02:34:53.555Z] tool=Edit path=CLAUDE.md protected=false VIBE_APPROVED=false decision=ALLOW
26
+ [2026-04-21T02:34:54.867Z] tool=Edit path=.claude/skills/deploy/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
27
+ [2026-04-21T02:35:01.437Z] tool=Edit path=.claude/skills/project/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
28
+ [2026-04-21T02:35:12.254Z] tool=Edit path=.claude/skills/deploy/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
29
+ [2026-04-21T02:35:14.878Z] tool=Edit path=.claude/skills/status/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
30
+ [2026-04-21T02:35:16.589Z] tool=Edit path=.claude/rules/observability.md protected=false VIBE_APPROVED=false decision=ALLOW
31
+ [2026-04-21T02:35:22.331Z] tool=Edit path=.claude/skills/save/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
32
+ [2026-04-21T02:35:23.493Z] tool=Edit path=.claude/skills/save/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
33
+ [2026-04-21T02:35:24.652Z] tool=Edit path=.claude/skills/save/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
34
+ [2026-04-21T02:35:40.826Z] tool=Edit path=.claude/skills/submit-request/SKILL.md protected=false VIBE_APPROVED=false decision=ALLOW
35
+ [2026-04-21T02:35:46.042Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
36
+ [2026-04-21T02:35:52.609Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
37
+ [2026-04-21T02:38:11.027Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
38
+ [2026-04-21T02:40:59.364Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
39
+ [2026-04-21T02:46:47.829Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
40
+ [2026-04-21T02:46:54.250Z] tool=Edit path=../../apps/docs/content/docs/in-progress/active-development/elevasis-sdk-cli-audit/index.mdx protected=false VIBE_APPROVED=false decision=ALLOW
@@ -0,0 +1,17 @@
1
+ [2026-04-21T02:33:54.962Z] SKIP — registry not found (pre-SDK-delivery)
2
+ [2026-04-21T02:34:53.682Z] SKIP — registry not found (pre-SDK-delivery)
3
+ [2026-04-21T02:35:00.720Z] SKIP — registry not found (pre-SDK-delivery)
4
+ [2026-04-21T02:35:01.648Z] SKIP — registry not found (pre-SDK-delivery)
5
+ [2026-04-21T02:35:12.366Z] SKIP — registry not found (pre-SDK-delivery)
6
+ [2026-04-21T02:35:15.057Z] SKIP — registry not found (pre-SDK-delivery)
7
+ [2026-04-21T02:35:16.874Z] SKIP — registry not found (pre-SDK-delivery)
8
+ [2026-04-21T02:35:22.469Z] SKIP — registry not found (pre-SDK-delivery)
9
+ [2026-04-21T02:35:23.677Z] SKIP — registry not found (pre-SDK-delivery)
10
+ [2026-04-21T02:35:24.831Z] SKIP — registry not found (pre-SDK-delivery)
11
+ [2026-04-21T02:35:41.027Z] SKIP — registry not found (pre-SDK-delivery)
12
+ [2026-04-21T02:35:46.206Z] SKIP — registry not found (pre-SDK-delivery)
13
+ [2026-04-21T02:35:52.776Z] SKIP — registry not found (pre-SDK-delivery)
14
+ [2026-04-21T02:38:11.201Z] SKIP — registry not found (pre-SDK-delivery)
15
+ [2026-04-21T02:40:59.696Z] SKIP — registry not found (pre-SDK-delivery)
16
+ [2026-04-21T02:46:47.986Z] SKIP — registry not found (pre-SDK-delivery)
17
+ [2026-04-21T02:46:54.532Z] SKIP — registry not found (pre-SDK-delivery)
@@ -0,0 +1,80 @@
1
+ ---
2
+ description: Bridge between stable scaffold docs and higher-volatility in-progress architecture work that may override assumptions for agents working in the template
3
+ ---
4
+
5
+ # Active Change Index
6
+
7
+ Use this rule to decide whether stable scaffold docs are enough, or whether you also need to load in-progress platform architecture docs from the monorepo.
8
+
9
+ > **Note:** Paths prefixed with `apps/` or `packages/` are monorepo-internal and unavailable in standalone projects. For those areas, use the stable scaffold docs under `node_modules/@elevasis/sdk/reference/scaffold/` as the primary reference. The monorepo paths are retained for contributors working within the monorepo.
10
+
11
+ ## Current Watch Areas
12
+
13
+ ### Organization OS
14
+
15
+ Use when the task touches:
16
+
17
+ - organization model semantics
18
+ - feature/provider runtime
19
+ - feature manifests or shell composition
20
+ - graph or command-view concepts
21
+ - downstream propagation of scaffold contract changes
22
+
23
+ Load:
24
+
25
+ - `apps/docs/content/docs/technical/architecture/core/organization-model/index.mdx`
26
+ - `apps/docs/content/docs/technical/architecture/core/organization-model/graph.mdx`
27
+ - `apps/docs/content/docs/technical/architecture/ui/feature-shell.mdx`
28
+ - `apps/docs/content/docs/technical/architecture/ui/composition-extensibility.mdx`
29
+
30
+ Stable scaffold docs affected:
31
+
32
+ - `node_modules/@elevasis/sdk/reference/scaffold/reference/contracts.md`
33
+ - `.claude/rules/ui.md`
34
+ - `node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md`
35
+ - `node_modules/@elevasis/sdk/reference/scaffold/ui/feature-flags-and-gating.md`
36
+
37
+ ### Package Surface / Reference System
38
+
39
+ Use when the task touches:
40
+
41
+ - published `@elevasis/core`, `@elevasis/ui`, or `@elevasis/sdk` surfaces
42
+ - generated package maps
43
+ - contract drift between source and scaffold docs
44
+
45
+ Load:
46
+
47
+ - `packages/core/src/organization-model/README.md`
48
+ - `packages/ui/src/provider/README.md`
49
+ - `packages/ui/src/features/README.md`
50
+ - `packages/sdk/reference/_navigation.md`
51
+
52
+ Stable scaffold docs affected:
53
+
54
+ - `node_modules/@elevasis/sdk/reference/scaffold/reference/contracts.md`
55
+
56
+ ### Resource / Topology Mapping
57
+
58
+ Use when the task touches:
59
+
60
+ - resource registration
61
+ - triggers, integrations, relationships, human checkpoints
62
+ - topology-aware navigation or impact analysis
63
+
64
+ Load:
65
+
66
+ - `operations/src/README.md`
67
+ - `operations/src/index.ts`
68
+
69
+ Stable scaffold docs affected:
70
+
71
+ - `.claude/rules/operations.md`
72
+
73
+ ## Working Rule
74
+
75
+ When a task touches one of the watch areas above:
76
+
77
+ 1. Read the stable scaffold doc.
78
+ 2. Read the listed in-progress or package-local source-of-truth docs.
79
+ 3. Prefer source and in-progress architecture docs if they disagree with scaffold prose.
80
+ 4. Flag drift instead of silently trusting the scaffold doc.