studiograph 1.2.0-beta.9 → 1.2.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.
Files changed (226) hide show
  1. package/README.md +13 -18
  2. package/dist/agent/orchestrator.d.ts +56 -0
  3. package/dist/agent/orchestrator.js +167 -22
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/agent/prompts/system.md +51 -63
  6. package/dist/agent/skill-loader.js +8 -0
  7. package/dist/agent/skill-loader.js.map +1 -1
  8. package/dist/agent/skills/entity-schema.md +4 -19
  9. package/dist/agent/skills/gather-context.md +1 -1
  10. package/dist/agent/tools/graph-tools.d.ts +41 -1
  11. package/dist/agent/tools/graph-tools.js +133 -57
  12. package/dist/agent/tools/graph-tools.js.map +1 -1
  13. package/dist/agent/tools/ops-tools.js +82 -0
  14. package/dist/agent/tools/ops-tools.js.map +1 -1
  15. package/dist/agent/tools/permission-tools.d.ts +90 -0
  16. package/dist/agent/tools/permission-tools.js +207 -0
  17. package/dist/agent/tools/permission-tools.js.map +1 -0
  18. package/dist/agent/tools/sync-tools.js +2 -2
  19. package/dist/agent/tools/sync-tools.js.map +1 -1
  20. package/dist/auth/github.d.ts +1 -1
  21. package/dist/auth/github.js +21 -13
  22. package/dist/auth/github.js.map +1 -1
  23. package/dist/cli/commands/access.d.ts +11 -0
  24. package/dist/cli/commands/access.js +156 -0
  25. package/dist/cli/commands/access.js.map +1 -0
  26. package/dist/cli/commands/app.js +25 -2
  27. package/dist/cli/commands/app.js.map +1 -1
  28. package/dist/cli/commands/clear.d.ts +5 -0
  29. package/dist/cli/commands/clear.js +36 -0
  30. package/dist/cli/commands/clear.js.map +1 -0
  31. package/dist/cli/commands/clone.js +3 -3
  32. package/dist/cli/commands/clone.js.map +1 -1
  33. package/dist/cli/commands/collection.d.ts +10 -0
  34. package/dist/cli/commands/collection.js +187 -0
  35. package/dist/cli/commands/collection.js.map +1 -0
  36. package/dist/cli/commands/commit.js +2 -1
  37. package/dist/cli/commands/commit.js.map +1 -1
  38. package/dist/cli/commands/config.d.ts +100 -0
  39. package/dist/cli/commands/config.js +1 -1
  40. package/dist/cli/commands/config.js.map +1 -1
  41. package/dist/cli/commands/deploy.js +10 -1
  42. package/dist/cli/commands/deploy.js.map +1 -1
  43. package/dist/cli/commands/index.js +1 -1
  44. package/dist/cli/commands/index.js.map +1 -1
  45. package/dist/cli/commands/init.js +32 -40
  46. package/dist/cli/commands/init.js.map +1 -1
  47. package/dist/cli/commands/join.d.ts +0 -6
  48. package/dist/cli/commands/join.js +26 -111
  49. package/dist/cli/commands/join.js.map +1 -1
  50. package/dist/cli/commands/lint.js +1 -2
  51. package/dist/cli/commands/lint.js.map +1 -1
  52. package/dist/cli/commands/mcp.js +6 -5
  53. package/dist/cli/commands/mcp.js.map +1 -1
  54. package/dist/cli/commands/org.d.ts +10 -0
  55. package/dist/cli/commands/org.js +132 -0
  56. package/dist/cli/commands/org.js.map +1 -0
  57. package/dist/cli/commands/orphans.js +1 -2
  58. package/dist/cli/commands/orphans.js.map +1 -1
  59. package/dist/cli/commands/provision.js +3 -3
  60. package/dist/cli/commands/provision.js.map +1 -1
  61. package/dist/cli/commands/resolve.d.ts +8 -0
  62. package/dist/cli/commands/resolve.js +85 -0
  63. package/dist/cli/commands/resolve.js.map +1 -0
  64. package/dist/cli/commands/serve.js +55 -25
  65. package/dist/cli/commands/serve.js.map +1 -1
  66. package/dist/cli/commands/start.js +22 -205
  67. package/dist/cli/commands/start.js.map +1 -1
  68. package/dist/cli/commands/sync.js +53 -8
  69. package/dist/cli/commands/sync.js.map +1 -1
  70. package/dist/cli/commands/team.d.ts +12 -0
  71. package/dist/cli/commands/team.js +185 -0
  72. package/dist/cli/commands/team.js.map +1 -0
  73. package/dist/cli/index.js +41 -34
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/scaffolding.d.ts +5 -3
  76. package/dist/cli/scaffolding.js +191 -97
  77. package/dist/cli/scaffolding.js.map +1 -1
  78. package/dist/cli/setup-wizard.js +20 -10
  79. package/dist/cli/setup-wizard.js.map +1 -1
  80. package/dist/cli/sync-review-interactive.js +1 -1
  81. package/dist/cli/sync-review-interactive.js.map +1 -1
  82. package/dist/core/graph.d.ts +5 -10
  83. package/dist/core/graph.js +84 -85
  84. package/dist/core/graph.js.map +1 -1
  85. package/dist/core/migration-runner.d.ts +42 -0
  86. package/dist/core/migration-runner.js +232 -0
  87. package/dist/core/migration-runner.js.map +1 -0
  88. package/dist/core/migration-types.d.ts +101 -0
  89. package/dist/core/migration-types.js +21 -0
  90. package/dist/core/migration-types.js.map +1 -0
  91. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  92. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  93. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  94. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  95. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  96. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  97. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  98. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  99. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  100. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  101. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  102. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  103. package/dist/core/migrations/index.d.ts +11 -0
  104. package/dist/core/migrations/index.js +23 -0
  105. package/dist/core/migrations/index.js.map +1 -0
  106. package/dist/core/types.d.ts +19 -34
  107. package/dist/core/types.js +3 -21
  108. package/dist/core/types.js.map +1 -1
  109. package/dist/core/user-config.d.ts +27 -0
  110. package/dist/core/user-config.js +51 -0
  111. package/dist/core/user-config.js.map +1 -1
  112. package/dist/core/validation.d.ts +978 -2182
  113. package/dist/core/validation.js +242 -397
  114. package/dist/core/validation.js.map +1 -1
  115. package/dist/core/workspace-manager.d.ts +32 -31
  116. package/dist/core/workspace-manager.js +171 -186
  117. package/dist/core/workspace-manager.js.map +1 -1
  118. package/dist/core/workspace.d.ts +0 -5
  119. package/dist/core/workspace.js +33 -101
  120. package/dist/core/workspace.js.map +1 -1
  121. package/dist/lib/lib/utils.d.ts +2 -0
  122. package/dist/lib/lib/utils.js +6 -0
  123. package/dist/lib/lib/utils.js.map +1 -0
  124. package/dist/mcp/tools.js +13 -13
  125. package/dist/mcp/tools.js.map +1 -1
  126. package/dist/server/chrome/chrome.css +562 -0
  127. package/dist/server/chrome/chrome.js +540 -0
  128. package/dist/server/index.js +163 -10
  129. package/dist/server/index.js.map +1 -1
  130. package/dist/server/plugin-loader.d.ts +7 -0
  131. package/dist/server/plugin-loader.js +9 -1
  132. package/dist/server/plugin-loader.js.map +1 -1
  133. package/dist/server/routes/chat.d.ts +3 -2
  134. package/dist/server/routes/chat.js +67 -16
  135. package/dist/server/routes/chat.js.map +1 -1
  136. package/dist/server/routes/git-api.d.ts +9 -0
  137. package/dist/server/routes/git-api.js +82 -0
  138. package/dist/server/routes/git-api.js.map +1 -0
  139. package/dist/server/routes/graph-api.d.ts +2 -2
  140. package/dist/server/routes/graph-api.js +267 -3
  141. package/dist/server/routes/graph-api.js.map +1 -1
  142. package/dist/server/routes/permissions-api.d.ts +9 -0
  143. package/dist/server/routes/permissions-api.js +176 -0
  144. package/dist/server/routes/permissions-api.js.map +1 -0
  145. package/dist/server/routes/workspace-api.d.ts +9 -0
  146. package/dist/server/routes/workspace-api.js +283 -0
  147. package/dist/server/routes/workspace-api.js.map +1 -0
  148. package/dist/services/assets/base.d.ts +2 -2
  149. package/dist/services/assets/base.js +4 -4
  150. package/dist/services/assets/base.js.map +1 -1
  151. package/dist/services/assets/index.d.ts +6 -6
  152. package/dist/services/assets/index.js +12 -12
  153. package/dist/services/assets/index.js.map +1 -1
  154. package/dist/services/git.d.ts +35 -0
  155. package/dist/services/git.js +93 -0
  156. package/dist/services/git.js.map +1 -1
  157. package/dist/services/github-provisioner.js +1 -2
  158. package/dist/services/github-provisioner.js.map +1 -1
  159. package/dist/services/github-service.d.ts +99 -0
  160. package/dist/services/github-service.js +310 -0
  161. package/dist/services/github-service.js.map +1 -0
  162. package/dist/services/markdown.js +4 -9
  163. package/dist/services/markdown.js.map +1 -1
  164. package/dist/services/memory-service.d.ts +4 -0
  165. package/dist/services/memory-service.js +13 -1
  166. package/dist/services/memory-service.js.map +1 -1
  167. package/dist/services/sync/commit.d.ts +2 -0
  168. package/dist/services/sync/commit.js +21 -6
  169. package/dist/services/sync/commit.js.map +1 -1
  170. package/dist/services/sync/graphrag-indexer.js +2 -2
  171. package/dist/services/sync/graphrag-indexer.js.map +1 -1
  172. package/dist/utils/git.d.ts +5 -0
  173. package/dist/utils/git.js +10 -0
  174. package/dist/utils/git.js.map +1 -1
  175. package/dist/utils/merge-resolver.d.ts +33 -8
  176. package/dist/utils/merge-resolver.js +157 -55
  177. package/dist/utils/merge-resolver.js.map +1 -1
  178. package/dist/utils/preflight.d.ts +1 -1
  179. package/dist/utils/preflight.js +1 -1
  180. package/dist/web/_app/env.js +1 -0
  181. package/dist/web/_app/immutable/assets/0.CDbX4Cwz.css +1 -0
  182. package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
  183. package/dist/web/_app/immutable/assets/3.BJy7pVXi.css +1 -0
  184. package/dist/web/_app/immutable/assets/4.Ad16uh9o.css +1 -0
  185. package/dist/web/_app/immutable/assets/5.BhKgiXd2.css +1 -0
  186. package/dist/web/_app/immutable/assets/6.CeHKR5ZY.css +1 -0
  187. package/dist/web/_app/immutable/assets/AppShell.CJtUfb0N.css +1 -0
  188. package/dist/web/_app/immutable/assets/ChatPanel.RFD5GGYI.css +1 -0
  189. package/dist/web/_app/immutable/assets/editor.CPAf2SRV.css +1 -0
  190. package/dist/web/_app/immutable/chunks/3_5VIr68.js +1 -0
  191. package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
  192. package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
  193. package/dist/web/_app/immutable/chunks/BButMJ6M.js +1 -0
  194. package/dist/web/_app/immutable/chunks/BiubvAUI.js +2 -0
  195. package/dist/web/_app/immutable/chunks/CAXuTUkp.js +1 -0
  196. package/dist/web/_app/immutable/chunks/CQENNNNl.js +6 -0
  197. package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
  198. package/dist/web/_app/immutable/chunks/CV8ganSj.js +23 -0
  199. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
  200. package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
  201. package/dist/web/_app/immutable/chunks/DKyztuK9.js +1 -0
  202. package/dist/web/_app/immutable/chunks/DdNsM6oV.js +64 -0
  203. package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
  204. package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
  205. package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
  206. package/dist/web/_app/immutable/chunks/F20aIBpJ.js +1 -0
  207. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  208. package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
  209. package/dist/web/_app/immutable/chunks/YFT1281h.js +2 -0
  210. package/dist/web/_app/immutable/chunks/aosHekRC.js +1 -0
  211. package/dist/web/_app/immutable/chunks/fwnBoL5x.js +1 -0
  212. package/dist/web/_app/immutable/chunks/hHxe9oXh.js +1 -0
  213. package/dist/web/_app/immutable/entry/app.BFVUP2fV.js +2 -0
  214. package/dist/web/_app/immutable/entry/start.BqsXHYP6.js +1 -0
  215. package/dist/web/_app/immutable/nodes/0.DQ5KdeNU.js +1 -0
  216. package/dist/web/_app/immutable/nodes/1.DwnzyOvm.js +1 -0
  217. package/dist/web/_app/immutable/nodes/2.FZxrWJeh.js +1 -0
  218. package/dist/web/_app/immutable/nodes/3.CQVWlbKr.js +1 -0
  219. package/dist/web/_app/immutable/nodes/4.CEh40Z_h.js +16 -0
  220. package/dist/web/_app/immutable/nodes/5.D_QsCLEf.js +4 -0
  221. package/dist/web/_app/immutable/nodes/6.CndEQ0o5.js +2 -0
  222. package/dist/web/_app/version.json +1 -0
  223. package/dist/web/index.html +43 -0
  224. package/package.json +21 -3
  225. package/dist/agent/skills/bundled/enrich-entities.md +0 -124
  226. package/dist/agent/skills/bundled/gather-context.md +0 -46
@@ -0,0 +1,232 @@
1
+ import { join, dirname } from 'path';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, unlinkSync, readdirSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { spinner } from '@clack/prompts';
5
+ import { MigrationsStateSchema } from './migration-types.js';
6
+ import { ALL_MIGRATIONS } from './migrations/index.js';
7
+ import { Workspace } from './workspace.js';
8
+ /**
9
+ * MigrationRunner handles workspace schema migrations.
10
+ * Called automatically on workspace load to ensure data is up-to-date.
11
+ */
12
+ export class MigrationRunner {
13
+ workspacePath;
14
+ migrationsStatePath;
15
+ quiet;
16
+ constructor(workspacePath, options) {
17
+ this.workspacePath = workspacePath;
18
+ this.migrationsStatePath = join(workspacePath, '.studiograph', 'migrations.json');
19
+ this.quiet = options?.quiet ?? false;
20
+ }
21
+ /**
22
+ * Main entry point - called from Workspace.loadConfig()
23
+ * Runs all pending migrations with progress spinner
24
+ */
25
+ async runPendingMigrations() {
26
+ const pending = await this.getPendingMigrations();
27
+ if (pending.length === 0)
28
+ return; // Silent when no migrations needed
29
+ if (this.quiet) {
30
+ // Apply silently (e.g. during init where the caller owns the spinner)
31
+ for (const migration of pending) {
32
+ await this.applyMigration(migration);
33
+ }
34
+ return;
35
+ }
36
+ // Use @clack/prompts spinner for consistency
37
+ const s = spinner();
38
+ s.start(`Running migrations (${pending.length} pending)`);
39
+ try {
40
+ for (const migration of pending) {
41
+ s.message(`Applying: ${migration.description}`);
42
+ await this.applyMigration(migration);
43
+ }
44
+ const newVersion = this.loadMigrationsState().workspace_version;
45
+ s.stop(`✓ Workspace migrated to v${newVersion}`);
46
+ }
47
+ catch (error) {
48
+ s.stop(`✗ Migration failed`);
49
+ throw error;
50
+ }
51
+ }
52
+ /**
53
+ * Get migrations that haven't been applied yet
54
+ */
55
+ async getPendingMigrations() {
56
+ const state = this.loadMigrationsState();
57
+ const appliedIds = new Set(state.applied.map(a => a.id));
58
+ return ALL_MIGRATIONS.filter(m => !appliedIds.has(m.id));
59
+ }
60
+ /**
61
+ * Apply a single migration with rollback on failure
62
+ */
63
+ async applyMigration(migration) {
64
+ const state = this.loadMigrationsState();
65
+ // Check shouldRun() if defined
66
+ if (migration.shouldRun) {
67
+ const context = await this.createContext();
68
+ const should = await migration.shouldRun(context);
69
+ if (!should) {
70
+ // Mark as applied even though skipped (migration no longer needed)
71
+ state.applied.push({
72
+ id: migration.id,
73
+ appliedAt: new Date().toISOString(),
74
+ targetVersion: migration.targetVersion,
75
+ cliVersion: this.getCliVersion(),
76
+ });
77
+ state.workspace_version = migration.targetVersion;
78
+ this.saveMigrationsState(state);
79
+ return;
80
+ }
81
+ }
82
+ try {
83
+ // Run migration
84
+ const context = await this.createContext();
85
+ await migration.up(context);
86
+ // Mark as applied
87
+ state.applied.push({
88
+ id: migration.id,
89
+ appliedAt: new Date().toISOString(),
90
+ targetVersion: migration.targetVersion,
91
+ cliVersion: this.getCliVersion(),
92
+ });
93
+ state.workspace_version = migration.targetVersion;
94
+ this.saveMigrationsState(state);
95
+ }
96
+ catch (error) {
97
+ // Attempt rollback
98
+ try {
99
+ const context = await this.createContext();
100
+ await migration.down(context);
101
+ }
102
+ catch (rollbackError) {
103
+ // Critical: both migration and rollback failed
104
+ state.failed = state.failed || [];
105
+ state.failed.push({
106
+ id: migration.id,
107
+ failedAt: new Date().toISOString(),
108
+ error: `Migration failed: ${error}. Rollback also failed: ${rollbackError}`,
109
+ cliVersion: this.getCliVersion(),
110
+ });
111
+ this.saveMigrationsState(state);
112
+ throw new Error(`Migration ${migration.id} failed and could not be rolled back. ` +
113
+ `Workspace may be in inconsistent state.`);
114
+ }
115
+ // Rollback succeeded
116
+ state.failed = state.failed || [];
117
+ state.failed.push({
118
+ id: migration.id,
119
+ failedAt: new Date().toISOString(),
120
+ error: String(error),
121
+ cliVersion: this.getCliVersion(),
122
+ });
123
+ this.saveMigrationsState(state);
124
+ throw new Error(`Migration ${migration.id} failed (rolled back): ${error}`);
125
+ }
126
+ }
127
+ /**
128
+ * Load migration state, auto-initializing for legacy workspaces
129
+ */
130
+ loadMigrationsState() {
131
+ if (!existsSync(this.migrationsStatePath)) {
132
+ // Legacy workspace - auto-initialize
133
+ const initialState = {
134
+ schema_version: '1.0.0',
135
+ workspace_version: '1.0.0',
136
+ applied: [],
137
+ };
138
+ this.saveMigrationsState(initialState);
139
+ return initialState;
140
+ }
141
+ const json = readFileSync(this.migrationsStatePath, 'utf-8');
142
+ return MigrationsStateSchema.parse(JSON.parse(json));
143
+ }
144
+ /**
145
+ * Save migration state to disk
146
+ */
147
+ saveMigrationsState(state) {
148
+ const dir = join(this.workspacePath, '.studiograph');
149
+ if (!existsSync(dir)) {
150
+ mkdirSync(dir, { recursive: true, mode: 0o755 });
151
+ }
152
+ writeFileSync(this.migrationsStatePath, JSON.stringify(state, null, 2), 'utf-8');
153
+ }
154
+ /**
155
+ * Get current CLI version from package.json
156
+ */
157
+ getCliVersion() {
158
+ // ESM-compatible way to get __dirname
159
+ const __filename = fileURLToPath(import.meta.url);
160
+ const __dirname = dirname(__filename);
161
+ const pkgPath = join(__dirname, '../../package.json');
162
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
163
+ return pkg.version;
164
+ }
165
+ /**
166
+ * Create migration context with helpers
167
+ */
168
+ async createContext() {
169
+ const workspace = new Workspace(this.workspacePath);
170
+ // Load config without triggering migrations (avoid infinite loop)
171
+ // Try JSON first, then YAML (for legacy workspaces during YAML→JSON migration)
172
+ const jsonPath = join(this.workspacePath, '.studiograph', 'workspace.json');
173
+ const yamlPath = join(this.workspacePath, '.studiograph', 'config.yml');
174
+ let config;
175
+ let configPath = jsonPath;
176
+ if (existsSync(jsonPath)) {
177
+ const configJson = readFileSync(jsonPath, 'utf-8');
178
+ config = JSON.parse(configJson);
179
+ }
180
+ else if (existsSync(yamlPath)) {
181
+ // Legacy YAML config (during migration)
182
+ const yaml = await import('js-yaml');
183
+ const configYaml = readFileSync(yamlPath, 'utf-8');
184
+ config = yaml.load(configYaml);
185
+ configPath = yamlPath;
186
+ }
187
+ else {
188
+ throw new Error('No workspace config found (workspace.json or config.yml)');
189
+ }
190
+ return {
191
+ workspacePath: this.workspacePath,
192
+ config,
193
+ updateConfig: (updates) => {
194
+ Object.assign(config, updates);
195
+ // Always write to JSON path (even if we loaded from YAML)
196
+ writeFileSync(jsonPath, JSON.stringify(config, null, 2), 'utf-8');
197
+ },
198
+ ensureDirectory: (path) => {
199
+ mkdirSync(path, { recursive: true, mode: 0o755 });
200
+ },
201
+ fileExists: (path) => existsSync(path),
202
+ readFile: (path) => readFileSync(path, 'utf-8'),
203
+ writeFile: (path, content) => writeFileSync(path, content, 'utf-8'),
204
+ moveFile: (oldPath, newPath) => {
205
+ const newDir = dirname(newPath);
206
+ if (!existsSync(newDir)) {
207
+ mkdirSync(newDir, { recursive: true, mode: 0o755 });
208
+ }
209
+ renameSync(oldPath, newPath);
210
+ },
211
+ deleteFile: (path) => {
212
+ if (existsSync(path)) {
213
+ unlinkSync(path);
214
+ }
215
+ },
216
+ listFiles: (dir, pattern) => {
217
+ if (!existsSync(dir))
218
+ return [];
219
+ const files = readdirSync(dir);
220
+ if (pattern) {
221
+ return files.filter(f => pattern.test(f)).map(f => join(dir, f));
222
+ }
223
+ return files.map(f => join(dir, f));
224
+ },
225
+ log: (message) => { if (!this.quiet)
226
+ console.log(message); },
227
+ warn: (message) => { if (!this.quiet)
228
+ console.warn(message); },
229
+ };
230
+ }
231
+ }
232
+ //# sourceMappingURL=migration-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../../src/core/migration-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ import type { WorkspaceConfig } from './types.js';
3
+ /**
4
+ * Migration context provides helpers and state for migration execution
5
+ */
6
+ export interface MigrationContext {
7
+ workspacePath: string;
8
+ config: WorkspaceConfig;
9
+ updateConfig: (updates: Partial<WorkspaceConfig>) => void;
10
+ ensureDirectory: (path: string) => void;
11
+ fileExists: (path: string) => boolean;
12
+ readFile: (path: string) => string;
13
+ writeFile: (path: string, content: string) => void;
14
+ moveFile: (oldPath: string, newPath: string) => void;
15
+ deleteFile: (path: string) => void;
16
+ listFiles: (dir: string, pattern?: RegExp) => string[];
17
+ log: (message: string) => void;
18
+ warn: (message: string) => void;
19
+ }
20
+ /**
21
+ * Migration definition
22
+ */
23
+ export interface Migration {
24
+ id: string;
25
+ description: string;
26
+ targetVersion: string;
27
+ dependsOn?: string[];
28
+ up: (context: MigrationContext) => Promise<void>;
29
+ down: (context: MigrationContext) => Promise<void>;
30
+ shouldRun?: (context: MigrationContext) => Promise<boolean>;
31
+ }
32
+ /**
33
+ * Migration state schema (stored in .studiograph/migrations.json)
34
+ */
35
+ export declare const MigrationsStateSchema: z.ZodObject<{
36
+ schema_version: z.ZodDefault<z.ZodString>;
37
+ workspace_version: z.ZodString;
38
+ applied: z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ appliedAt: z.ZodString;
41
+ targetVersion: z.ZodString;
42
+ cliVersion: z.ZodString;
43
+ }, "strip", z.ZodTypeAny, {
44
+ id: string;
45
+ appliedAt: string;
46
+ targetVersion: string;
47
+ cliVersion: string;
48
+ }, {
49
+ id: string;
50
+ appliedAt: string;
51
+ targetVersion: string;
52
+ cliVersion: string;
53
+ }>, "many">;
54
+ failed: z.ZodOptional<z.ZodArray<z.ZodObject<{
55
+ id: z.ZodString;
56
+ failedAt: z.ZodString;
57
+ error: z.ZodString;
58
+ cliVersion: z.ZodString;
59
+ }, "strip", z.ZodTypeAny, {
60
+ id: string;
61
+ error: string;
62
+ cliVersion: string;
63
+ failedAt: string;
64
+ }, {
65
+ id: string;
66
+ error: string;
67
+ cliVersion: string;
68
+ failedAt: string;
69
+ }>, "many">>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ schema_version: string;
72
+ workspace_version: string;
73
+ applied: {
74
+ id: string;
75
+ appliedAt: string;
76
+ targetVersion: string;
77
+ cliVersion: string;
78
+ }[];
79
+ failed?: {
80
+ id: string;
81
+ error: string;
82
+ cliVersion: string;
83
+ failedAt: string;
84
+ }[] | undefined;
85
+ }, {
86
+ workspace_version: string;
87
+ applied: {
88
+ id: string;
89
+ appliedAt: string;
90
+ targetVersion: string;
91
+ cliVersion: string;
92
+ }[];
93
+ failed?: {
94
+ id: string;
95
+ error: string;
96
+ cliVersion: string;
97
+ failedAt: string;
98
+ }[] | undefined;
99
+ schema_version?: string | undefined;
100
+ }>;
101
+ export type MigrationsState = z.infer<typeof MigrationsStateSchema>;
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Migration state schema (stored in .studiograph/migrations.json)
4
+ */
5
+ export const MigrationsStateSchema = z.object({
6
+ schema_version: z.string().default('1.0.0'),
7
+ workspace_version: z.string(),
8
+ applied: z.array(z.object({
9
+ id: z.string(),
10
+ appliedAt: z.string().datetime(),
11
+ targetVersion: z.string(),
12
+ cliVersion: z.string(),
13
+ })),
14
+ failed: z.array(z.object({
15
+ id: z.string(),
16
+ failedAt: z.string().datetime(),
17
+ error: z.string(),
18
+ cliVersion: z.string(),
19
+ })).optional(),
20
+ });
21
+ //# sourceMappingURL=migration-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-types.js","sourceRoot":"","sources":["../../src/core/migration-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACvB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC,CAAC,QAAQ,EAAE;CACf,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Migration } from '../migration-types.js';
2
+ export declare const migration: Migration;
@@ -0,0 +1,35 @@
1
+ import { join } from 'path';
2
+ import { homedir } from 'os';
3
+ import { existsSync, mkdirSync } from 'fs';
4
+ export const migration = {
5
+ id: '20260219-formalize-memory-location',
6
+ description: 'Formalize memory storage location at ~/.studiograph/memory/',
7
+ targetVersion: '1.1.0',
8
+ async up(context) {
9
+ const globalMemoryPath = join(homedir(), '.studiograph', 'memory');
10
+ // Ensure global memory directory exists
11
+ if (!existsSync(globalMemoryPath)) {
12
+ context.log('Creating global memory directory at ~/.studiograph/memory/');
13
+ mkdirSync(globalMemoryPath, { recursive: true, mode: 0o755 });
14
+ }
15
+ // Check for workspace-local memory (anti-pattern)
16
+ const localMemoryPath = join(context.workspacePath, '.studiograph', 'memory');
17
+ if (existsSync(localMemoryPath)) {
18
+ context.warn(`Found workspace-local memory directory at ${localMemoryPath}. ` +
19
+ 'Memory should be stored globally at ~/.studiograph/memory/. ' +
20
+ 'No automatic migration performed.');
21
+ }
22
+ context.log('✓ Memory location validated at ~/.studiograph/memory/');
23
+ },
24
+ async down(context) {
25
+ // Non-destructive migration, no rollback needed
26
+ context.log('Rollback: Memory location migration is non-destructive');
27
+ },
28
+ async shouldRun(context) {
29
+ const globalMemoryPath = join(homedir(), '.studiograph', 'memory');
30
+ const localMemoryPath = join(context.workspacePath, '.studiograph', 'memory');
31
+ // Run if global doesn't exist OR local exists (need to warn)
32
+ return !existsSync(globalMemoryPath) || existsSync(localMemoryPath);
33
+ },
34
+ };
35
+ //# sourceMappingURL=20260219-formalize-memory-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20260219-formalize-memory-location.js","sourceRoot":"","sources":["../../../src/core/migrations/20260219-formalize-memory-location.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE3C,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,EAAE,EAAE,oCAAoC;IACxC,WAAW,EAAE,6DAA6D;IAC1E,aAAa,EAAE,OAAO;IAEtB,KAAK,CAAC,EAAE,CAAC,OAAO;QACd,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEnE,wCAAwC;QACxC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;YAC1E,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,kDAAkD;QAClD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CACV,6CAA6C,eAAe,IAAI;gBAChE,8DAA8D;gBAC9D,mCAAmC,CACpC,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO;QAChB,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAO;QACrB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAE9E,6DAA6D;QAC7D,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Migration } from '../migration-types.js';
2
+ /**
3
+ * Migration: Add workspace metadata fields
4
+ *
5
+ * Adds tracking metadata to workspace.json:
6
+ * - last_updated_at: timestamp of last workspace modification
7
+ * - updated_by: CLI version that last modified the workspace
8
+ * - workspace_id: unique identifier for the workspace (if not exists)
9
+ *
10
+ * This demonstrates schema evolution - adding new fields to existing config.
11
+ */
12
+ export declare const migration: Migration;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Migration: Add workspace metadata fields
3
+ *
4
+ * Adds tracking metadata to workspace.json:
5
+ * - last_updated_at: timestamp of last workspace modification
6
+ * - updated_by: CLI version that last modified the workspace
7
+ * - workspace_id: unique identifier for the workspace (if not exists)
8
+ *
9
+ * This demonstrates schema evolution - adding new fields to existing config.
10
+ */
11
+ export const migration = {
12
+ id: '20260220-add-workspace-metadata',
13
+ description: 'Add workspace metadata tracking fields',
14
+ targetVersion: '1.2.0',
15
+ async up(context) {
16
+ const updates = {};
17
+ const config = context.config;
18
+ let hasUpdates = false;
19
+ // Add last_updated_at if missing
20
+ if (!config.last_updated_at) {
21
+ updates.last_updated_at = new Date().toISOString();
22
+ hasUpdates = true;
23
+ context.log('✓ Added last_updated_at field');
24
+ }
25
+ // Add updated_by if missing
26
+ if (!config.updated_by) {
27
+ updates.updated_by = 'migration-system';
28
+ hasUpdates = true;
29
+ context.log('✓ Added updated_by field');
30
+ }
31
+ // Add workspace_id if missing (generate from team name + timestamp)
32
+ if (!config.workspace_id) {
33
+ const timestamp = context.config.created_at || new Date().toISOString();
34
+ const teamSlug = context.config.team_name
35
+ .toLowerCase()
36
+ .replace(/[^a-z0-9]+/g, '-')
37
+ .replace(/^-|-$/g, '');
38
+ updates.workspace_id = `${teamSlug}-${new Date(timestamp).getTime()}`;
39
+ hasUpdates = true;
40
+ context.log(`✓ Generated workspace_id: ${updates.workspace_id}`);
41
+ }
42
+ if (hasUpdates) {
43
+ context.updateConfig(updates);
44
+ context.log('✓ Workspace metadata updated');
45
+ }
46
+ else {
47
+ context.log('All metadata fields already exist');
48
+ }
49
+ },
50
+ async down(context) {
51
+ // Rollback: remove the metadata fields we added
52
+ const config = context.config;
53
+ delete config.last_updated_at;
54
+ delete config.updated_by;
55
+ delete config.workspace_id;
56
+ context.updateConfig(config);
57
+ context.log('Rollback: Removed workspace metadata fields');
58
+ },
59
+ async shouldRun(context) {
60
+ // Run if any of the metadata fields are missing
61
+ const config = context.config;
62
+ return !config.last_updated_at || !config.updated_by || !config.workspace_id;
63
+ },
64
+ };
65
+ //# sourceMappingURL=20260220-add-workspace-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20260220-add-workspace-metadata.js","sourceRoot":"","sources":["../../../src/core/migrations/20260220-add-workspace-metadata.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,EAAE,EAAE,iCAAiC;IACrC,WAAW,EAAE,wCAAwC;IACrD,aAAa,EAAE,OAAO;IAEtB,KAAK,CAAC,EAAE,CAAC,OAAO;QACd,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAa,CAAC;QACrC,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,OAAO,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnD,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC;YACxC,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS;iBACtC,WAAW,EAAE;iBACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;iBAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,YAAY,GAAG,GAAG,QAAQ,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO;QAChB,gDAAgD;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAa,CAAC;QAErC,OAAO,MAAM,CAAC,eAAe,CAAC;QAC9B,OAAO,MAAM,CAAC,UAAU,CAAC;QACzB,OAAO,MAAM,CAAC,YAAY,CAAC;QAE3B,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAO;QACrB,gDAAgD;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAa,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAC/E,CAAC;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Migration } from '../migration-types.js';
2
+ /**
3
+ * Migration: Add workspace README.md
4
+ *
5
+ * Adds a README.md file to the .studiograph directory with workspace
6
+ * information and getting started guide. This demonstrates:
7
+ * - File creation in migrations
8
+ * - Using workspace config data
9
+ * - Conditional file operations
10
+ */
11
+ export declare const migration: Migration;
@@ -0,0 +1,82 @@
1
+ import { join } from 'path';
2
+ /**
3
+ * Migration: Add workspace README.md
4
+ *
5
+ * Adds a README.md file to the .studiograph directory with workspace
6
+ * information and getting started guide. This demonstrates:
7
+ * - File creation in migrations
8
+ * - Using workspace config data
9
+ * - Conditional file operations
10
+ */
11
+ export const migration = {
12
+ id: '20260220-add-workspace-readme',
13
+ description: 'Add README.md to .studiograph directory',
14
+ targetVersion: '1.2.0',
15
+ async up(context) {
16
+ const readmePath = join(context.workspacePath, '.studiograph', 'README.md');
17
+ // Skip if README already exists
18
+ if (context.fileExists(readmePath)) {
19
+ context.log('README.md already exists - skipping');
20
+ return;
21
+ }
22
+ const repoCount = context.config.repos?.length || 0;
23
+ const createdDate = context.config.created_at
24
+ ? new Date(context.config.created_at).toLocaleDateString()
25
+ : 'unknown';
26
+ const readme = `# ${context.config.team_name} — Studiograph Workspace
27
+
28
+ This is the configuration directory for your Studiograph workspace.
29
+
30
+ ## Workspace Information
31
+
32
+ - **Team:** ${context.config.team_name}
33
+ - **Created:** ${createdDate}
34
+ - **Repositories:** ${repoCount}
35
+ - **Version:** ${context.config.version}
36
+
37
+ ## Directory Structure
38
+
39
+ \`\`\`
40
+ .studiograph/
41
+ ├── workspace.json # Workspace configuration
42
+ ├── migrations.json # Migration state tracking
43
+ ├── team/
44
+ │ └── members.json # Team member roster
45
+ └── README.md # This file
46
+ \`\`\`
47
+
48
+ ## Important Files
49
+
50
+ **Do not manually edit** the following files:
51
+ - \`migrations.json\` - Managed by the migration system
52
+ - \`workspace.json\` - Use CLI commands to modify
53
+
54
+ **Safe to edit:**
55
+ - \`team/members.json\` - Team member information
56
+
57
+ ## Getting Started
58
+
59
+ Run \`studiograph --help\` to see available commands.
60
+
61
+ For more information, visit: https://studiograph.ai/docs
62
+
63
+ ---
64
+
65
+ *This directory is version controlled. Commit changes to share workspace
66
+ configuration with your team.*
67
+ `;
68
+ context.writeFile(readmePath, readme);
69
+ context.log('✓ Created .studiograph/README.md');
70
+ },
71
+ async down(context) {
72
+ const readmePath = join(context.workspacePath, '.studiograph', 'README.md');
73
+ context.deleteFile(readmePath);
74
+ context.log('Rollback: Removed .studiograph/README.md');
75
+ },
76
+ async shouldRun(context) {
77
+ const readmePath = join(context.workspacePath, '.studiograph', 'README.md');
78
+ // Only run if README doesn't exist
79
+ return !context.fileExists(readmePath);
80
+ },
81
+ };
82
+ //# sourceMappingURL=20260220-add-workspace-readme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20260220-add-workspace-readme.js","sourceRoot":"","sources":["../../../src/core/migrations/20260220-add-workspace-readme.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,EAAE,EAAE,+BAA+B;IACnC,WAAW,EAAE,yCAAyC;IACtD,aAAa,EAAE,OAAO;IAEtB,KAAK,CAAC,EAAE,CAAC,OAAO;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAE5E,gCAAgC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU;YAC3C,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;YAC1D,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,MAAM,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,SAAS;;;;;;cAMlC,OAAO,CAAC,MAAM,CAAC,SAAS;iBACrB,WAAW;sBACN,SAAS;iBACd,OAAO,CAAC,MAAM,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCtC,CAAC;QAEE,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAC5E,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAO;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAC5E,mCAAmC;QACnC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Migration } from '../migration-types.js';
2
+ /**
3
+ * Migration: Convert legacy YAML workspace config to JSON
4
+ *
5
+ * Early versions of Studiograph used config.yml for workspace configuration.
6
+ * This migration converts any remaining YAML configs to the new workspace.json
7
+ * format and removes the legacy file.
8
+ */
9
+ export declare const migration: Migration;