studiograph 1.2.0-beta.2 → 1.2.0-beta.4

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.
@@ -21,6 +21,7 @@ import { loadCustomTools } from './tools/tool-loader.js';
21
21
  import { ConnectorManager } from '../mcp/connector-manager.js';
22
22
  import { buildConnectorRegistry, createConnectorTools } from './tools/connector-tools.js';
23
23
  import { createFsTools } from './tools/fs-tools.js';
24
+ import { createOpsTools } from './tools/ops-tools.js';
24
25
  import { loadUserConfig, getAnthropicCredential } from '../core/user-config.js';
25
26
  export class AgentOrchestrator {
26
27
  workspacePath;
@@ -68,6 +69,7 @@ export class AgentOrchestrator {
68
69
  const tools = [
69
70
  ...createGraphTools(this.workspaceManager, this.gitUser, this.workspacePath),
70
71
  ...createSyncTools(this.workspacePath, this.config),
72
+ ...createOpsTools(this.workspacePath, this.config),
71
73
  ...createFsTools(),
72
74
  createLoadSkillTool(skillIndex),
73
75
  ];
@@ -123,6 +125,7 @@ export class AgentOrchestrator {
123
125
  'Enrichment': [],
124
126
  'Workspace Git': [],
125
127
  'External Connectors': [],
128
+ 'Operations': [],
126
129
  'Skills': [],
127
130
  'Other': [],
128
131
  };
@@ -138,6 +141,8 @@ export class AgentOrchestrator {
138
141
  categories['Workspace Git'].push(t);
139
142
  else if (name.startsWith('connector_'))
140
143
  categories['External Connectors'].push(t);
144
+ else if (name.startsWith('app_') || name.startsWith('deploy_'))
145
+ categories['Operations'].push(t);
141
146
  else if (name === 'load_skill')
142
147
  categories['Skills'].push(t);
143
148
  else if (['create_entity', 'get_entity', 'update_entity', 'delete_entity', 'search_entities', 'list_entities', 'get_related', 'get_backlinks', 'validate_wikilinks', 'get_workspace_summary', 'list_repos', 'query_dataset', 'append_rows', 'get_entity_schema', 'lint_entities'].includes(name))
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Operations Tools for Studiograph Agent
3
+ *
4
+ * These tools allow the agent to manage deployment and app plugins:
5
+ * - Deploy to Railway
6
+ * - Install app plugins
7
+ */
8
+ import type { WorkspaceConfig } from '../../core/types.js';
9
+ /**
10
+ * Create operations tools for the agent
11
+ */
12
+ export declare function createOpsTools(workspacePath: string, workspaceConfig: WorkspaceConfig): {
13
+ name: string;
14
+ label: string;
15
+ description: string;
16
+ parameters: import("@sinclair/typebox").TObject<{}>;
17
+ execute: (_toolCallId: string, _params: any) => Promise<{
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ details: any;
23
+ }>;
24
+ }[];
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Operations Tools for Studiograph Agent
3
+ *
4
+ * These tools allow the agent to manage deployment and app plugins:
5
+ * - Deploy to Railway
6
+ * - Install app plugins
7
+ */
8
+ import { Type as T } from '@sinclair/typebox';
9
+ import { spawnSync, execSync } from 'child_process';
10
+ import { existsSync, readFileSync, mkdirSync, cpSync, readdirSync, writeFileSync, rmSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { tmpdir } from 'os';
13
+ import { wrapToolResult } from './graph-tools.js';
14
+ /**
15
+ * Create operations tools for the agent
16
+ */
17
+ export function createOpsTools(workspacePath, workspaceConfig) {
18
+ return [
19
+ // Install an app plugin
20
+ {
21
+ name: 'app_install',
22
+ label: 'Install App',
23
+ description: 'Install a Studiograph app plugin from a local directory or Git URL into the workspace. The source must contain an app.json manifest. Optionally builds before installing. Always confirm with the user before calling this.',
24
+ parameters: T.Object({
25
+ source: T.String({ description: 'Path to app source directory or Git URL (must contain app.json)' }),
26
+ commit: T.Optional(T.Boolean({ description: 'Commit to config repo after installing (default: true)' })),
27
+ push: T.Optional(T.Boolean({ description: 'Push config repo to remote after committing (default: false)' })),
28
+ }),
29
+ execute: async (_toolCallId, params) => {
30
+ let clonedTempDir = null;
31
+ try {
32
+ let sourceDir = params.source;
33
+ // Clone if source is a URL
34
+ const isUrl = sourceDir.startsWith('https://') || sourceDir.startsWith('http://') ||
35
+ sourceDir.startsWith('git@') || sourceDir.startsWith('git://') || sourceDir.startsWith('ssh://');
36
+ if (isUrl) {
37
+ const dir = join(tmpdir(), `studiograph-app-${Date.now()}`);
38
+ const result = spawnSync('git', ['clone', '--depth', '1', sourceDir, dir], { encoding: 'utf-8', stdio: 'pipe' });
39
+ if (result.status !== 0) {
40
+ return wrapToolResult({ error: `Failed to clone ${sourceDir}: ${result.stderr}` });
41
+ }
42
+ sourceDir = dir;
43
+ clonedTempDir = dir;
44
+ }
45
+ const manifestPath = join(sourceDir, 'app.json');
46
+ if (!existsSync(manifestPath)) {
47
+ return wrapToolResult({ error: `No app.json found in ${sourceDir}` });
48
+ }
49
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
50
+ if (!manifest.name || !manifest.plugin || !manifest.mountPath) {
51
+ return wrapToolResult({ error: 'app.json missing required fields: name, plugin, mountPath' });
52
+ }
53
+ // Build if declared, or auto-detect from package.json
54
+ let buildCmd = manifest.build;
55
+ if (!buildCmd) {
56
+ const pkgPath = join(sourceDir, 'package.json');
57
+ if (existsSync(pkgPath)) {
58
+ try {
59
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
60
+ if (pkg.scripts?.build) {
61
+ buildCmd = 'npm install --ignore-scripts && npm run build';
62
+ }
63
+ }
64
+ catch { /* ignore */ }
65
+ }
66
+ }
67
+ if (buildCmd) {
68
+ try {
69
+ execSync(buildCmd, { cwd: sourceDir, stdio: 'pipe' });
70
+ }
71
+ catch (err) {
72
+ return wrapToolResult({ error: `Build failed: ${err?.stderr?.toString() ?? err.message}` });
73
+ }
74
+ }
75
+ // Copy files to .studiograph/apps/<name>/
76
+ const studiographDir = join(workspacePath, '.studiograph');
77
+ const destDir = join(studiographDir, 'apps', manifest.name);
78
+ mkdirSync(destDir, { recursive: true });
79
+ const installed = [];
80
+ // app.json
81
+ cpSync(manifestPath, join(destDir, 'app.json'));
82
+ installed.push('app.json');
83
+ // plugin file (fall back to dist/ if not found at root)
84
+ const pluginRelPath = manifest.plugin.replace(/^\.\//, '');
85
+ let pluginSrc = join(sourceDir, pluginRelPath);
86
+ if (!existsSync(pluginSrc)) {
87
+ pluginSrc = join(sourceDir, 'dist', pluginRelPath);
88
+ }
89
+ if (!existsSync(pluginSrc)) {
90
+ return wrapToolResult({ error: `Plugin file not found: ${join(sourceDir, pluginRelPath)} (also checked dist/)` });
91
+ }
92
+ cpSync(pluginSrc, join(destDir, 'plugin.js'));
93
+ installed.push('plugin.js');
94
+ // entity-types.json
95
+ if (manifest.entityTypes) {
96
+ const etSrc = join(sourceDir, manifest.entityTypes.replace(/^\.\//, ''));
97
+ if (existsSync(etSrc)) {
98
+ cpSync(etSrc, join(destDir, 'entity-types.json'));
99
+ installed.push('entity-types.json');
100
+ }
101
+ }
102
+ // skills/
103
+ const skillsSrc = join(sourceDir, 'skills');
104
+ if (existsSync(skillsSrc)) {
105
+ cpSync(skillsSrc, join(destDir, 'skills'), { recursive: true });
106
+ installed.push(`skills/ (${readdirSync(skillsSrc).length} entries)`);
107
+ }
108
+ // tools/
109
+ const toolsSrc = join(sourceDir, 'tools');
110
+ if (existsSync(toolsSrc)) {
111
+ cpSync(toolsSrc, join(destDir, 'tools'), { recursive: true });
112
+ installed.push(`tools/ (${readdirSync(toolsSrc).length} entries)`);
113
+ }
114
+ // theme/ — probe theme/ → themes/ → dist/themes/
115
+ let themeSrcDir = null;
116
+ if (manifest.themeDir) {
117
+ themeSrcDir = join(sourceDir, manifest.themeDir.replace(/^\.\//, ''));
118
+ }
119
+ else {
120
+ for (const candidate of ['theme', 'themes', join('dist', 'themes')]) {
121
+ const p = join(sourceDir, candidate);
122
+ if (existsSync(p)) {
123
+ themeSrcDir = p;
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ if (themeSrcDir && existsSync(themeSrcDir)) {
129
+ // Flatten single subdirectory (e.g. themes/default/ → theme/)
130
+ const themeEntries = readdirSync(themeSrcDir);
131
+ if (!themeEntries.includes('tokens.json') && themeEntries.length === 1) {
132
+ const sub = join(themeSrcDir, themeEntries[0]);
133
+ if (existsSync(join(sub, 'tokens.json')))
134
+ themeSrcDir = sub;
135
+ }
136
+ const themeDest = join(destDir, 'theme');
137
+ const tokensPath = join(themeDest, 'tokens.json');
138
+ const existingTokens = existsSync(tokensPath) ? readFileSync(tokensPath, 'utf-8') : null;
139
+ cpSync(themeSrcDir, themeDest, { recursive: true });
140
+ if (existingTokens !== null)
141
+ writeFileSync(tokensPath, existingTokens);
142
+ installed.push('theme/');
143
+ }
144
+ // Git commit
145
+ const shouldCommit = params.commit !== false;
146
+ let committed = false;
147
+ if (shouldCommit) {
148
+ try {
149
+ execSync(`git -C "${studiographDir}" add "apps/${manifest.name}/"`, { stdio: 'pipe' });
150
+ const versionLabel = manifest.version ? ` v${manifest.version}` : '';
151
+ execSync(`git -C "${studiographDir}" commit -m "install ${manifest.name}${versionLabel}"`, { stdio: 'pipe' });
152
+ committed = true;
153
+ }
154
+ catch {
155
+ // Nothing to commit
156
+ }
157
+ }
158
+ // Push
159
+ if (params.push && committed) {
160
+ try {
161
+ execSync(`git -C "${studiographDir}" push`, { stdio: 'pipe' });
162
+ }
163
+ catch {
164
+ // Push failed — non-fatal
165
+ }
166
+ }
167
+ return wrapToolResult({
168
+ success: true,
169
+ app: manifest.name,
170
+ version: manifest.version,
171
+ mountPath: manifest.mountPath,
172
+ installed,
173
+ committed,
174
+ pushed: params.push && committed,
175
+ });
176
+ }
177
+ catch (err) {
178
+ return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
179
+ }
180
+ finally {
181
+ if (clonedTempDir)
182
+ rmSync(clonedTempDir, { recursive: true, force: true });
183
+ }
184
+ },
185
+ },
186
+ // List installed apps
187
+ {
188
+ name: 'app_list',
189
+ label: 'List Apps',
190
+ description: 'List all installed Studiograph app plugins in the workspace.',
191
+ parameters: T.Object({}),
192
+ execute: async (_toolCallId, _params) => {
193
+ try {
194
+ const appsDir = join(workspacePath, '.studiograph', 'apps');
195
+ if (!existsSync(appsDir)) {
196
+ return wrapToolResult({ apps: [], count: 0 });
197
+ }
198
+ const apps = [];
199
+ for (const entry of readdirSync(appsDir)) {
200
+ const manifestPath = join(appsDir, entry, 'app.json');
201
+ if (!existsSync(manifestPath))
202
+ continue;
203
+ try {
204
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
205
+ apps.push({
206
+ name: manifest.name,
207
+ version: manifest.version,
208
+ description: manifest.description,
209
+ mountPath: manifest.mountPath,
210
+ });
211
+ }
212
+ catch {
213
+ // Skip malformed manifests
214
+ }
215
+ }
216
+ return wrapToolResult({ apps, count: apps.length });
217
+ }
218
+ catch (err) {
219
+ return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
220
+ }
221
+ },
222
+ },
223
+ // Deploy to Railway
224
+ {
225
+ name: 'deploy_railway',
226
+ label: 'Deploy to Railway',
227
+ description: 'Deploy the Studiograph workspace to Railway. Creates a project, service, volume, sets env vars, and triggers a deploy. Requires a Railway API token and GitHub PAT. Always confirm with the user before calling this.',
228
+ parameters: T.Object({
229
+ railwayToken: T.String({ description: 'Railway API token' }),
230
+ githubToken: T.String({ description: 'GitHub fine-grained PAT with read access to repos' }),
231
+ projectName: T.Optional(T.String({ description: 'Railway project name (default: team name)' })),
232
+ }),
233
+ execute: async (_toolCallId, params) => {
234
+ try {
235
+ // Detect config repo URL
236
+ const configDir = join(workspacePath, '.studiograph');
237
+ const remote = spawnSync('git', ['remote', 'get-url', 'origin'], { cwd: configDir, encoding: 'utf-8' });
238
+ const configRepoUrl = remote.status === 0 ? remote.stdout.trim() : null;
239
+ if (!configRepoUrl) {
240
+ return wrapToolResult({ error: 'Could not detect config repo URL from .studiograph remote' });
241
+ }
242
+ const { randomBytes } = await import('crypto');
243
+ const apiKey = randomBytes(24).toString('base64url');
244
+ const webhookSecret = randomBytes(20).toString('hex');
245
+ const projectName = params.projectName
246
+ || (workspaceConfig.team_name ? `${workspaceConfig.team_name} — Studiograph` : 'Studiograph');
247
+ // Determine start command from package version
248
+ const pkgPath = new URL('../../package.json', import.meta.url);
249
+ const pkgVersion = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
250
+ const startCommand = pkgVersion.includes('-')
251
+ ? `npx studiograph@${pkgVersion} serve`
252
+ : 'npx studiograph serve';
253
+ const RAILWAY_API = 'https://backboard.railway.com/graphql/v2';
254
+ const query = async (q, variables = {}) => {
255
+ const res = await fetch(RAILWAY_API, {
256
+ method: 'POST',
257
+ headers: { 'Authorization': `Bearer ${params.railwayToken}`, 'Content-Type': 'application/json' },
258
+ body: JSON.stringify({ query: q, variables }),
259
+ });
260
+ const json = await res.json();
261
+ if (json.errors?.length)
262
+ throw new Error(json.errors.map((e) => e.message).join(', '));
263
+ return json.data;
264
+ };
265
+ // Create project
266
+ const projectData = await query(`
267
+ mutation($input: ProjectCreateInput!) { projectCreate(input: $input) { id name } }
268
+ `, { input: { name: projectName } });
269
+ const projectId = projectData.projectCreate.id;
270
+ // Get environment
271
+ const envData = await query(`
272
+ query($id: String!) { project(id: $id) { environments { edges { node { id name } } } } }
273
+ `, { id: projectId });
274
+ const envId = envData.project.environments.edges[0].node.id;
275
+ // Create empty service
276
+ const serviceData = await query(`
277
+ mutation($input: ServiceCreateInput!) { serviceCreate(input: $input) { id name } }
278
+ `, { input: { projectId, name: 'studiograph' } });
279
+ const serviceId = serviceData.serviceCreate.id;
280
+ // Set start command
281
+ await query(`
282
+ mutation($serviceId: String!, $environmentId: String!, $input: ServiceInstanceUpdateInput!) {
283
+ serviceInstanceUpdate(serviceId: $serviceId, environmentId: $environmentId, input: $input)
284
+ }
285
+ `, { serviceId, environmentId: envId, input: { startCommand } });
286
+ // Create volume
287
+ await query(`
288
+ mutation($input: VolumeCreateInput!) { volumeCreate(input: $input) { id } }
289
+ `, { input: { projectId, serviceId, mountPath: '/workspace' } });
290
+ // Set env vars
291
+ await query(`
292
+ mutation($input: VariableCollectionUpsertInput!) { variableCollectionUpsert(input: $input) }
293
+ `, { input: { projectId, environmentId: envId, serviceId, variables: {
294
+ STUDIOGRAPH_CONFIG_REPO: configRepoUrl,
295
+ GITHUB_TOKEN: params.githubToken,
296
+ PORT: '3001',
297
+ API_KEYS: apiKey,
298
+ WEBHOOK_SECRET: webhookSecret,
299
+ } } });
300
+ // Generate domain
301
+ let domain = '';
302
+ try {
303
+ const d = await query(`
304
+ mutation($input: ServiceDomainCreateInput!) { serviceDomainCreate(input: $input) { id domain } }
305
+ `, { input: { serviceId, environmentId: envId } });
306
+ domain = d.serviceDomainCreate?.domain || '';
307
+ }
308
+ catch { /* non-fatal */ }
309
+ // Connect image (triggers deploy)
310
+ await query(`
311
+ mutation($id: String!, $input: ServiceConnectInput!) { serviceConnect(id: $id, input: $input) { id } }
312
+ `, { id: serviceId, input: { image: 'node:20' } });
313
+ return wrapToolResult({
314
+ success: true,
315
+ projectId,
316
+ projectName: projectData.projectCreate.name,
317
+ serviceId,
318
+ domain: domain ? `https://${domain}` : null,
319
+ dashboardUrl: `https://railway.com/project/${projectId}`,
320
+ apiKey,
321
+ webhookSecret,
322
+ startCommand,
323
+ });
324
+ }
325
+ catch (err) {
326
+ return wrapToolResult({ error: err instanceof Error ? err.message : String(err) });
327
+ }
328
+ },
329
+ },
330
+ ];
331
+ }
332
+ //# sourceMappingURL=ops-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops-tools.js","sourceRoot":"","sources":["../../../src/agent/tools/ops-tools.ts"],"names":[],"mappings":"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"}
@@ -5,15 +5,36 @@
5
5
  */
6
6
  import { Command } from 'commander';
7
7
  import { intro, outro, spinner, confirm, log } from '@clack/prompts';
8
- import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, readdirSync } from 'fs';
8
+ import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, readdirSync, rmSync } from 'fs';
9
9
  import { join, resolve } from 'path';
10
- import { execSync } from 'child_process';
10
+ import { tmpdir } from 'os';
11
+ import { execSync, spawnSync } from 'child_process';
11
12
  import { Workspace } from '../../core/workspace.js';
13
+ /** Check if a source string looks like a Git URL */
14
+ function isGitUrl(source) {
15
+ return (source.startsWith('https://') ||
16
+ source.startsWith('http://') ||
17
+ source.startsWith('git@') ||
18
+ source.startsWith('git://') ||
19
+ source.startsWith('ssh://'));
20
+ }
21
+ /** Clone a Git URL to a temp directory. Returns the cloned path, or null on failure. */
22
+ function cloneToTemp(url, s) {
23
+ const dir = join(tmpdir(), `studiograph-app-${Date.now()}`);
24
+ s.start(`Cloning ${url}...`);
25
+ const result = spawnSync('git', ['clone', '--depth', '1', url, dir], { encoding: 'utf-8', stdio: 'pipe' });
26
+ if (result.status !== 0) {
27
+ s.stop('Clone failed');
28
+ return null;
29
+ }
30
+ s.stop('Cloned');
31
+ return dir;
32
+ }
12
33
  export const appCommand = new Command('app')
13
34
  .description('Manage Studiograph app plugins');
14
35
  appCommand
15
36
  .command('install <source>')
16
- .description('Install an app plugin from a local directory')
37
+ .description('Install an app plugin from a local directory or Git URL')
17
38
  .option('--no-commit', 'Skip git commit after installing')
18
39
  .option('--push', 'Push to remote after committing')
19
40
  .action(async (source, options) => {
@@ -26,7 +47,23 @@ appCommand
26
47
  process.exit(1);
27
48
  return;
28
49
  }
29
- const sourceDir = resolve(source);
50
+ // If source is a URL, clone to temp dir
51
+ let sourceDir;
52
+ let clonedTempDir = null;
53
+ if (isGitUrl(source)) {
54
+ const s = spinner();
55
+ const tempDir = cloneToTemp(source, s);
56
+ if (!tempDir) {
57
+ outro(`❌ Failed to clone ${source}`);
58
+ process.exit(1);
59
+ return;
60
+ }
61
+ sourceDir = tempDir;
62
+ clonedTempDir = tempDir;
63
+ }
64
+ else {
65
+ sourceDir = resolve(source);
66
+ }
30
67
  const manifestPath = join(sourceDir, 'app.json');
31
68
  if (!existsSync(manifestPath)) {
32
69
  outro(`❌ No app.json found in ${sourceDir}`);
@@ -47,18 +84,31 @@ appCommand
47
84
  process.exit(1);
48
85
  return;
49
86
  }
50
- // Step 1: Build (if declared)
51
- if (manifest.build) {
87
+ // Step 1: Build (if declared, or auto-detect from package.json)
88
+ let buildCmd = manifest.build;
89
+ if (!buildCmd) {
90
+ const pkgPath = join(sourceDir, 'package.json');
91
+ if (existsSync(pkgPath)) {
92
+ try {
93
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
94
+ if (pkg.scripts?.build) {
95
+ buildCmd = 'npm install --ignore-scripts && npm run build';
96
+ }
97
+ }
98
+ catch { /* ignore */ }
99
+ }
100
+ }
101
+ if (buildCmd) {
52
102
  const buildSpinner = spinner();
53
103
  buildSpinner.start(`Building ${manifest.name}...`);
54
104
  try {
55
- execSync(manifest.build, { cwd: sourceDir, stdio: 'pipe' });
105
+ execSync(buildCmd, { cwd: sourceDir, stdio: 'pipe' });
56
106
  buildSpinner.stop(`Built ${manifest.name}`);
57
107
  }
58
108
  catch (err) {
59
109
  buildSpinner.stop('Build failed');
60
110
  const stderr = err?.stderr?.toString() ?? '';
61
- outro(`❌ Build command failed: ${manifest.build}\n${stderr}`);
111
+ outro(`❌ Build command failed: ${buildCmd}\n${stderr}`);
62
112
  process.exit(1);
63
113
  return;
64
114
  }
@@ -73,16 +123,19 @@ appCommand
73
123
  // app.json
74
124
  cpSync(manifestPath, join(destDir, 'app.json'));
75
125
  installed.push('app.json');
76
- // plugin file (normalise ./prefix)
126
+ // plugin file (normalise ./prefix, fall back to dist/ if not found at root)
77
127
  const pluginRelPath = manifest.plugin.replace(/^\.\//, '');
78
- const pluginSrc = join(sourceDir, pluginRelPath);
128
+ let pluginSrc = join(sourceDir, pluginRelPath);
129
+ if (!existsSync(pluginSrc)) {
130
+ pluginSrc = join(sourceDir, 'dist', pluginRelPath);
131
+ }
79
132
  if (existsSync(pluginSrc)) {
80
133
  cpSync(pluginSrc, join(destDir, 'plugin.js'));
81
134
  installed.push('plugin.js');
82
135
  }
83
136
  else {
84
137
  installSpinner.stop('');
85
- outro(`❌ Plugin file not found: ${pluginSrc}`);
138
+ outro(`❌ Plugin file not found: ${join(sourceDir, pluginRelPath)} (also checked dist/)`);
86
139
  process.exit(1);
87
140
  return;
88
141
  }
@@ -108,11 +161,32 @@ appCommand
108
161
  const count = readdirSync(toolsSrc).length;
109
162
  installed.push(`tools/ (${count} entries)`);
110
163
  }
111
- // theme/ — resolve source dir from themeDir field or ./theme/
112
- const themeSrcDir = manifest.themeDir
113
- ? join(sourceDir, manifest.themeDir.replace(/^\.\//, ''))
114
- : join(sourceDir, 'theme');
115
- if (existsSync(themeSrcDir)) {
164
+ // theme/ — resolve from themeDir field, or probe theme/ → themes/ → dist/themes/
165
+ let themeSrcDir = null;
166
+ if (manifest.themeDir) {
167
+ themeSrcDir = join(sourceDir, manifest.themeDir.replace(/^\.\//, ''));
168
+ }
169
+ else {
170
+ for (const candidate of ['theme', 'themes', join('dist', 'themes')]) {
171
+ const p = join(sourceDir, candidate);
172
+ if (existsSync(p)) {
173
+ themeSrcDir = p;
174
+ break;
175
+ }
176
+ }
177
+ }
178
+ if (themeSrcDir && existsSync(themeSrcDir)) {
179
+ // If theme dir contains a single subdirectory (e.g. themes/default/),
180
+ // copy its contents directly so files end up at theme/tokens.json
181
+ // rather than theme/default/tokens.json.
182
+ const themeEntries = readdirSync(themeSrcDir);
183
+ const hasTokensJson = themeEntries.includes('tokens.json');
184
+ if (!hasTokensJson && themeEntries.length === 1) {
185
+ const subdir = join(themeSrcDir, themeEntries[0]);
186
+ if (existsSync(join(subdir, 'tokens.json'))) {
187
+ themeSrcDir = subdir;
188
+ }
189
+ }
116
190
  const themeDest = join(destDir, 'theme');
117
191
  const tokensDestPath = join(themeDest, 'tokens.json');
118
192
  const existingTokens = existsSync(tokensDestPath)
@@ -162,6 +236,10 @@ appCommand
162
236
  pushSpinner.stop('Push failed — run git push manually in .studiograph/');
163
237
  }
164
238
  }
239
+ // Clean up temp clone
240
+ if (clonedTempDir) {
241
+ rmSync(clonedTempDir, { recursive: true, force: true });
242
+ }
165
243
  outro(`✨ ${manifest.name} installed. Restart studiograph serve to apply.`);
166
244
  });
167
245
  //# sourceMappingURL=app.js.map