studiograph 1.1.2 → 1.2.0-beta.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/LICENSE +191 -0
- package/README.md +301 -10
- package/dist/agent/orchestrator.d.ts +17 -9
- package/dist/agent/orchestrator.js +142 -97
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +186 -0
- package/dist/agent/skill-loader.d.ts +48 -0
- package/dist/agent/skill-loader.js +166 -0
- package/dist/agent/skill-loader.js.map +1 -0
- package/dist/agent/skills/enrich-entities.md +136 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/gather-context.md +46 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -0
- package/dist/agent/skills/skill-loader.d.ts +48 -0
- package/dist/agent/skills/skill-loader.js +166 -0
- package/dist/agent/skills/skill-loader.js.map +1 -0
- package/dist/agent/skills/sync-configuration.md +144 -0
- package/dist/agent/skills/sync-setup.md +68 -0
- package/dist/agent/tools/connector-tools.d.ts +37 -0
- package/dist/agent/tools/connector-tools.js +132 -0
- package/dist/agent/tools/connector-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +39 -0
- package/dist/agent/tools/fs-tools.js +106 -0
- package/dist/agent/tools/fs-tools.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +30 -2
- package/dist/agent/tools/graph-tools.js +154 -37
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +42 -0
- package/dist/agent/tools/load-skill.js +45 -0
- package/dist/agent/tools/load-skill.js.map +1 -0
- package/dist/agent/tools/sync-tools.d.ts +25 -0
- package/dist/agent/tools/sync-tools.js +691 -0
- package/dist/agent/tools/sync-tools.js.map +1 -0
- package/dist/agent/tools/tool-loader.d.ts +25 -0
- package/dist/agent/tools/tool-loader.js +73 -0
- package/dist/agent/tools/tool-loader.js.map +1 -0
- package/dist/auth/github.d.ts +11 -8
- package/dist/auth/github.js +56 -75
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/colors.d.ts +54 -0
- package/dist/cli/colors.js +133 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/app.d.ts +7 -0
- package/dist/cli/commands/app.js +167 -0
- package/dist/cli/commands/app.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +26 -10
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +9 -0
- package/dist/cli/commands/clone.js +167 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +8 -0
- package/dist/cli/commands/commit.js +43 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/config.d.ts +13 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connector.d.ts +33 -0
- package/dist/cli/commands/connector.js +178 -0
- package/dist/cli/commands/connector.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +11 -0
- package/dist/cli/commands/deploy.js +153 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/enrich.d.ts +11 -0
- package/dist/cli/commands/enrich.js +135 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/graphrag.d.ts +12 -0
- package/dist/cli/commands/graphrag.js +122 -0
- package/dist/cli/commands/graphrag.js.map +1 -0
- package/dist/cli/commands/index.d.ts +15 -0
- package/dist/cli/commands/index.js +117 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.js +110 -210
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +89 -24
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/lint.d.ts +8 -0
- package/dist/cli/commands/lint.js +70 -0
- package/dist/cli/commands/lint.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +27 -0
- package/dist/cli/commands/mcp.js +56 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/orphans.d.ts +8 -0
- package/dist/cli/commands/orphans.js +125 -0
- package/dist/cli/commands/orphans.js.map +1 -0
- package/dist/cli/commands/provision.d.ts +8 -0
- package/dist/cli/commands/provision.js +116 -0
- package/dist/cli/commands/provision.js.map +1 -0
- package/dist/cli/commands/r2.d.ts +2 -0
- package/dist/cli/commands/r2.js +87 -6
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.js +137 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/review.d.ts +19 -0
- package/dist/cli/commands/review.js +128 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.js +47 -2
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/source.d.ts +16 -0
- package/dist/cli/commands/source.js +159 -0
- package/dist/cli/commands/source.js.map +1 -0
- package/dist/cli/commands/start.js +472 -103
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync-entities.d.ts +13 -0
- package/dist/cli/commands/sync-entities.js +242 -0
- package/dist/cli/commands/sync-entities.js.map +1 -0
- package/dist/cli/commands/sync.js +40 -9
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/update.d.ts +8 -0
- package/dist/cli/commands/update.js +155 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +114 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +10 -0
- package/dist/cli/scaffolding.js +302 -0
- package/dist/cli/scaffolding.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.js +244 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/sync-review-interactive.d.ts +31 -0
- package/dist/cli/sync-review-interactive.js +393 -0
- package/dist/cli/sync-review-interactive.js.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.js +116 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/core/graph.d.ts +16 -9
- package/dist/core/graph.js +263 -145
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +42 -0
- package/dist/core/migration-runner.js +232 -0
- package/dist/core/migration-runner.js.map +1 -0
- package/dist/core/migration-types.d.ts +101 -0
- package/dist/core/migration-types.js +21 -0
- package/dist/core/migration-types.js.map +1 -0
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
- package/dist/core/migrations/index.d.ts +11 -0
- package/dist/core/migrations/index.js +23 -0
- package/dist/core/migrations/index.js.map +1 -0
- package/dist/core/schema-registry.d.ts +36 -0
- package/dist/core/schema-registry.js +161 -0
- package/dist/core/schema-registry.js.map +1 -0
- package/dist/core/types.d.ts +242 -3
- package/dist/core/types.js +21 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +16 -0
- package/dist/core/user-config.js +8 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +973 -32
- package/dist/core/validation.js +163 -4
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +26 -2
- package/dist/core/workspace-manager.js +113 -15
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +20 -11
- package/dist/core/workspace.js +123 -34
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/connector-manager.d.ts +65 -0
- package/dist/mcp/connector-manager.js +223 -0
- package/dist/mcp/connector-manager.js.map +1 -0
- package/dist/mcp/connectors/asana.d.ts +2 -0
- package/dist/mcp/connectors/asana.js +20 -0
- package/dist/mcp/connectors/asana.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +45 -0
- package/dist/mcp/connectors/definitions.js +32 -0
- package/dist/mcp/connectors/definitions.js.map +1 -0
- package/dist/mcp/connectors/figma.d.ts +5 -0
- package/dist/mcp/connectors/figma.js +21 -0
- package/dist/mcp/connectors/figma.js.map +1 -0
- package/dist/mcp/connectors/gdrive.d.ts +2 -0
- package/dist/mcp/connectors/gdrive.js +20 -0
- package/dist/mcp/connectors/gdrive.js.map +1 -0
- package/dist/mcp/connectors/granola.d.ts +2 -0
- package/dist/mcp/connectors/granola.js +12 -0
- package/dist/mcp/connectors/granola.js.map +1 -0
- package/dist/mcp/connectors/linear.d.ts +2 -0
- package/dist/mcp/connectors/linear.js +19 -0
- package/dist/mcp/connectors/linear.js.map +1 -0
- package/dist/mcp/connectors/obsidian.d.ts +2 -0
- package/dist/mcp/connectors/obsidian.js +19 -0
- package/dist/mcp/connectors/obsidian.js.map +1 -0
- package/dist/mcp/connectors/pipedrive.d.ts +2 -0
- package/dist/mcp/connectors/pipedrive.js +20 -0
- package/dist/mcp/connectors/pipedrive.js.map +1 -0
- package/dist/mcp/connectors/slack.d.ts +2 -0
- package/dist/mcp/connectors/slack.js +21 -0
- package/dist/mcp/connectors/slack.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +41 -0
- package/dist/mcp/oauth-provider.js +160 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +28 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.js +172 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/server/index.js +17 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +15 -0
- package/dist/server/plugin-loader.js +68 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/graph-api.js +1 -1
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/webhook.js +33 -0
- package/dist/server/routes/webhook.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +9 -3
- package/dist/services/github-provisioner.js +46 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.d.ts +27 -0
- package/dist/services/lint-service.js +83 -0
- package/dist/services/lint-service.js.map +1 -0
- package/dist/services/markdown.d.ts +9 -0
- package/dist/services/markdown.js +26 -5
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -2
- package/dist/services/memory-service.js +5 -4
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/orphan-service.d.ts +31 -0
- package/dist/services/orphan-service.js +100 -0
- package/dist/services/orphan-service.js.map +1 -0
- package/dist/services/sync/commit.d.ts +58 -0
- package/dist/services/sync/commit.js +350 -0
- package/dist/services/sync/commit.js.map +1 -0
- package/dist/services/sync/context-index.d.ts +69 -0
- package/dist/services/sync/context-index.js +280 -0
- package/dist/services/sync/context-index.js.map +1 -0
- package/dist/services/sync/derive.d.ts +34 -0
- package/dist/services/sync/derive.js +164 -0
- package/dist/services/sync/derive.js.map +1 -0
- package/dist/services/sync/enrichment-state.d.ts +31 -0
- package/dist/services/sync/enrichment-state.js +63 -0
- package/dist/services/sync/enrichment-state.js.map +1 -0
- package/dist/services/sync/enrichment.d.ts +25 -0
- package/dist/services/sync/enrichment.js +121 -0
- package/dist/services/sync/enrichment.js.map +1 -0
- package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
- package/dist/services/sync/frontmatter-extractor.js +273 -0
- package/dist/services/sync/frontmatter-extractor.js.map +1 -0
- package/dist/services/sync/graph-match-state.d.ts +33 -0
- package/dist/services/sync/graph-match-state.js +61 -0
- package/dist/services/sync/graph-match-state.js.map +1 -0
- package/dist/services/sync/graph-match.d.ts +53 -0
- package/dist/services/sync/graph-match.js +316 -0
- package/dist/services/sync/graph-match.js.map +1 -0
- package/dist/services/sync/graphrag-client.d.ts +43 -0
- package/dist/services/sync/graphrag-client.js +94 -0
- package/dist/services/sync/graphrag-client.js.map +1 -0
- package/dist/services/sync/graphrag-config.d.ts +16 -0
- package/dist/services/sync/graphrag-config.js +39 -0
- package/dist/services/sync/graphrag-config.js.map +1 -0
- package/dist/services/sync/graphrag-context.d.ts +14 -0
- package/dist/services/sync/graphrag-context.js +109 -0
- package/dist/services/sync/graphrag-context.js.map +1 -0
- package/dist/services/sync/graphrag-indexer.d.ts +30 -0
- package/dist/services/sync/graphrag-indexer.js +358 -0
- package/dist/services/sync/graphrag-indexer.js.map +1 -0
- package/dist/services/sync/llm.d.ts +32 -0
- package/dist/services/sync/llm.js +115 -0
- package/dist/services/sync/llm.js.map +1 -0
- package/dist/services/sync/mcp-client.d.ts +59 -0
- package/dist/services/sync/mcp-client.js +285 -0
- package/dist/services/sync/mcp-client.js.map +1 -0
- package/dist/services/sync/model-factory.d.ts +10 -0
- package/dist/services/sync/model-factory.js +24 -0
- package/dist/services/sync/model-factory.js.map +1 -0
- package/dist/services/sync/name-quality.d.ts +31 -0
- package/dist/services/sync/name-quality.js +60 -0
- package/dist/services/sync/name-quality.js.map +1 -0
- package/dist/services/sync/output-schemas.d.ts +92 -0
- package/dist/services/sync/output-schemas.js +43 -0
- package/dist/services/sync/output-schemas.js.map +1 -0
- package/dist/services/sync/prompts.d.ts +19 -0
- package/dist/services/sync/prompts.js +128 -0
- package/dist/services/sync/prompts.js.map +1 -0
- package/dist/services/sync/reconciler.d.ts +48 -0
- package/dist/services/sync/reconciler.js +295 -0
- package/dist/services/sync/reconciler.js.map +1 -0
- package/dist/services/sync/source-config.d.ts +45 -0
- package/dist/services/sync/source-config.js +208 -0
- package/dist/services/sync/source-config.js.map +1 -0
- package/dist/services/sync/source-definitions/asana.d.ts +15 -0
- package/dist/services/sync/source-definitions/asana.js +48 -0
- package/dist/services/sync/source-definitions/asana.js.map +1 -0
- package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
- package/dist/services/sync/source-definitions/definitions.js +26 -0
- package/dist/services/sync/source-definitions/definitions.js.map +1 -0
- package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
- package/dist/services/sync/source-definitions/gdrive.js +68 -0
- package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
- package/dist/services/sync/source-definitions/granola.d.ts +2 -0
- package/dist/services/sync/source-definitions/granola.js +28 -0
- package/dist/services/sync/source-definitions/granola.js.map +1 -0
- package/dist/services/sync/source-definitions/linear.d.ts +2 -0
- package/dist/services/sync/source-definitions/linear.js +60 -0
- package/dist/services/sync/source-definitions/linear.js.map +1 -0
- package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
- package/dist/services/sync/source-definitions/obsidian.js +55 -0
- package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
- package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
- package/dist/services/sync/source-definitions/pipedrive.js +52 -0
- package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
- package/dist/services/sync/staging.d.ts +53 -0
- package/dist/services/sync/staging.js +131 -0
- package/dist/services/sync/staging.js.map +1 -0
- package/dist/services/sync/structured-extractor.d.ts +49 -0
- package/dist/services/sync/structured-extractor.js +344 -0
- package/dist/services/sync/structured-extractor.js.map +1 -0
- package/dist/services/sync/sync-runner.d.ts +32 -0
- package/dist/services/sync/sync-runner.js +195 -0
- package/dist/services/sync/sync-runner.js.map +1 -0
- package/dist/services/sync/sync-state.d.ts +43 -0
- package/dist/services/sync/sync-state.js +154 -0
- package/dist/services/sync/sync-state.js.map +1 -0
- package/dist/services/sync/types.d.ts +203 -0
- package/dist/services/sync/types.js +8 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/sync/unstructured-extractor.d.ts +29 -0
- package/dist/services/sync/unstructured-extractor.js +197 -0
- package/dist/services/sync/unstructured-extractor.js.map +1 -0
- package/dist/services/vector-service.d.ts +88 -0
- package/dist/services/vector-service.js +322 -0
- package/dist/services/vector-service.js.map +1 -0
- package/dist/utils/git.d.ts +26 -4
- package/dist/utils/git.js +55 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +34 -0
- package/dist/utils/merge-resolver.js +201 -0
- package/dist/utils/merge-resolver.js.map +1 -0
- package/dist/utils/preflight.d.ts +2 -1
- package/dist/utils/preflight.js +8 -1
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/version-checker.d.ts +23 -0
- package/dist/utils/version-checker.js +116 -0
- package/dist/utils/version-checker.js.map +1 -0
- package/dist/utils/workspace-config.d.ts +8 -0
- package/dist/utils/workspace-config.js +22 -0
- package/dist/utils/workspace-config.js.map +1 -0
- package/package.json +24 -11
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Migration } from './migration-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* MigrationRunner handles workspace schema migrations.
|
|
4
|
+
* Called automatically on workspace load to ensure data is up-to-date.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MigrationRunner {
|
|
7
|
+
private workspacePath;
|
|
8
|
+
private migrationsStatePath;
|
|
9
|
+
private quiet;
|
|
10
|
+
constructor(workspacePath: string, options?: {
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Main entry point - called from Workspace.loadConfig()
|
|
15
|
+
* Runs all pending migrations with progress spinner
|
|
16
|
+
*/
|
|
17
|
+
runPendingMigrations(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get migrations that haven't been applied yet
|
|
20
|
+
*/
|
|
21
|
+
getPendingMigrations(): Promise<Migration[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Apply a single migration with rollback on failure
|
|
24
|
+
*/
|
|
25
|
+
private applyMigration;
|
|
26
|
+
/**
|
|
27
|
+
* Load migration state, auto-initializing for legacy workspaces
|
|
28
|
+
*/
|
|
29
|
+
private loadMigrationsState;
|
|
30
|
+
/**
|
|
31
|
+
* Save migration state to disk
|
|
32
|
+
*/
|
|
33
|
+
private saveMigrationsState;
|
|
34
|
+
/**
|
|
35
|
+
* Get current CLI version from package.json
|
|
36
|
+
*/
|
|
37
|
+
private getCliVersion;
|
|
38
|
+
/**
|
|
39
|
+
* Create migration context with helpers
|
|
40
|
+
*/
|
|
41
|
+
private createContext;
|
|
42
|
+
}
|
|
@@ -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,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;
|