studiograph 1.1.3 → 1.2.0-beta.2
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/README.md +2 -8
- package/dist/agent/orchestrator.js +56 -11
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +28 -10
- 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/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -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 +11 -1
- package/dist/agent/tools/graph-tools.js +90 -29
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +1 -1
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- 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/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/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/connector.js +10 -2
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +4 -6
- package/dist/cli/commands/deploy.js +262 -112
- package/dist/cli/commands/deploy.js.map +1 -1
- 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/init.js +21 -203
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +23 -3
- package/dist/cli/commands/join.js.map +1 -1
- 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.js +11 -7
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/r2.js +8 -2
- 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/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 +285 -55
- 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 +36 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +36 -22
- package/dist/cli/scaffolding.js.map +1 -1
- 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 +4 -8
- package/dist/core/graph.js +145 -96
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +4 -1
- package/dist/core/migration-runner.js +14 -3
- package/dist/core/migration-runner.js.map +1 -1
- package/dist/core/types.d.ts +0 -3
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +6 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +110 -33
- package/dist/core/workspace.js.map +1 -1
- package/dist/mcp/connector-manager.d.ts +7 -3
- package/dist/mcp/connector-manager.js +61 -16
- package/dist/mcp/connector-manager.js.map +1 -1
- 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 +3 -1
- package/dist/mcp/connectors/definitions.js +19 -127
- package/dist/mcp/connectors/definitions.js.map +1 -1
- 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/server/index.js +14 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +7 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +8 -3
- package/dist/services/github-provisioner.js +35 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.js +8 -1
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +3 -3
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -1
- package/dist/services/memory-service.js +2 -3
- 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 +354 -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 +11 -0
- package/dist/services/vector-service.js +42 -0
- package/dist/services/vector-service.js.map +1 -1
- 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/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 +16 -7
- /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
package/dist/core/workspace.js
CHANGED
|
@@ -4,30 +4,28 @@
|
|
|
4
4
|
* A workspace is a directory with .studiograph/ folder
|
|
5
5
|
* Similar to how Git works with .git/
|
|
6
6
|
*/
|
|
7
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';
|
|
8
|
+
import { execSync, spawnSync } from 'child_process';
|
|
8
9
|
import { join } from 'path';
|
|
9
|
-
import * as yaml from 'js-yaml';
|
|
10
10
|
import { RepoType } from './types.js';
|
|
11
11
|
import { setUserModelConfig } from './user-config.js';
|
|
12
|
-
import { MigrationRunner } from './migration-runner.js';
|
|
13
12
|
export class Workspace {
|
|
14
13
|
workspacePath;
|
|
15
|
-
configPath;
|
|
16
14
|
jsonConfigPath;
|
|
17
15
|
membersPath;
|
|
18
16
|
config = null;
|
|
17
|
+
/** Suppress migration output (used during init where the caller owns the spinner) */
|
|
18
|
+
quietMigrations = false;
|
|
19
19
|
constructor(workspacePath = process.cwd()) {
|
|
20
20
|
this.workspacePath = workspacePath;
|
|
21
|
-
this.
|
|
22
|
-
this.jsonConfigPath = join(workspacePath, '.studiograph', 'workspace.json'); // New JSON format
|
|
21
|
+
this.jsonConfigPath = join(workspacePath, '.studiograph', 'workspace.json');
|
|
23
22
|
this.membersPath = join(workspacePath, '.studiograph', 'team', 'members.json');
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
26
25
|
* Check if current directory is a Studiograph workspace
|
|
27
|
-
* Supports both workspace.json (new) and config.yml (legacy)
|
|
28
26
|
*/
|
|
29
27
|
isWorkspace() {
|
|
30
|
-
return existsSync(this.jsonConfigPath)
|
|
28
|
+
return existsSync(this.jsonConfigPath);
|
|
31
29
|
}
|
|
32
30
|
/**
|
|
33
31
|
* Initialize new workspace in current directory
|
|
@@ -52,41 +50,22 @@ export class Workspace {
|
|
|
52
50
|
// Create initial empty team members file
|
|
53
51
|
const initialMembers = { members: [] };
|
|
54
52
|
writeFileSync(this.membersPath, JSON.stringify(initialMembers, null, 2), 'utf-8');
|
|
55
|
-
// Create initial migrations.json
|
|
56
|
-
const initialMigrations = {
|
|
57
|
-
schema_version: '1.0.0',
|
|
58
|
-
workspace_version: '1.0.0',
|
|
59
|
-
applied: [],
|
|
60
|
-
};
|
|
61
|
-
writeFileSync(join(studiographDir, 'migrations.json'), JSON.stringify(initialMigrations, null, 2), 'utf-8');
|
|
62
53
|
// Create .gitignore for .studiograph
|
|
63
54
|
const gitignorePath = join(studiographDir, '.gitignore');
|
|
64
55
|
writeFileSync(gitignorePath, '# Ignore sensitive local config\n*.local\n');
|
|
65
56
|
}
|
|
66
57
|
/**
|
|
67
|
-
* Load workspace config
|
|
68
|
-
* Reads workspace.json (new format) or falls back to config.yml (legacy)
|
|
69
|
-
* Runs pending migrations before loading
|
|
58
|
+
* Load workspace config from workspace.json
|
|
70
59
|
*/
|
|
71
60
|
async loadConfig() {
|
|
72
61
|
if (!this.isWorkspace()) {
|
|
73
62
|
throw new Error('Not a Studiograph workspace. Run `studiograph init` first.');
|
|
74
63
|
}
|
|
75
|
-
// Run migrations before loading config
|
|
76
|
-
const runner = new MigrationRunner(this.workspacePath);
|
|
77
|
-
await runner.runPendingMigrations();
|
|
78
64
|
if (this.config) {
|
|
79
65
|
return this.config;
|
|
80
66
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.config = JSON.parse(configJson);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
// Legacy YAML fallback
|
|
87
|
-
const configYaml = readFileSync(this.configPath, 'utf-8');
|
|
88
|
-
this.config = yaml.load(configYaml);
|
|
89
|
-
}
|
|
67
|
+
const configJson = readFileSync(this.jsonConfigPath, 'utf-8');
|
|
68
|
+
this.config = JSON.parse(configJson);
|
|
90
69
|
return this.config;
|
|
91
70
|
}
|
|
92
71
|
/**
|
|
@@ -257,11 +236,24 @@ Store shared entities like:
|
|
|
257
236
|
mkdirSync(repoPath, { recursive: true });
|
|
258
237
|
// Create .studiograph marker in repo
|
|
259
238
|
const repoMarkerPath = join(repoPath, '.studiograph');
|
|
260
|
-
writeFileSync(repoMarkerPath,
|
|
239
|
+
writeFileSync(repoMarkerPath, JSON.stringify({ repo_type: repo.type, repo_name: repo.name }, null, 2), 'utf-8');
|
|
261
240
|
// Create README.md with repo description
|
|
262
241
|
const readmePath = join(repoPath, 'README.md');
|
|
263
242
|
const readmeContent = this.generateRepoReadme(repoConfig);
|
|
264
243
|
writeFileSync(readmePath, readmeContent, 'utf-8');
|
|
244
|
+
// Initialize git repo with .gitignore and initial commit
|
|
245
|
+
const gitDir = join(repoPath, '.git');
|
|
246
|
+
if (!existsSync(gitDir)) {
|
|
247
|
+
const run = (cmd) => execSync(cmd, { cwd: repoPath, stdio: 'pipe' });
|
|
248
|
+
run('git init');
|
|
249
|
+
run('git branch -M main');
|
|
250
|
+
const gitignorePath = join(repoPath, '.gitignore');
|
|
251
|
+
if (!existsSync(gitignorePath)) {
|
|
252
|
+
writeFileSync(gitignorePath, '.DS_Store\n*.tmp\n*.log\n', 'utf-8');
|
|
253
|
+
}
|
|
254
|
+
run('git add -A');
|
|
255
|
+
run('git commit -m "Initialize repo"');
|
|
256
|
+
}
|
|
265
257
|
return repoConfig;
|
|
266
258
|
}
|
|
267
259
|
/**
|
|
@@ -288,6 +280,92 @@ Store shared entities like:
|
|
|
288
280
|
}
|
|
289
281
|
return join(this.workspacePath, repo.path);
|
|
290
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Reconcile workspace.json with the filesystem.
|
|
285
|
+
* Adds repos that exist on disk but aren't registered, removes entries
|
|
286
|
+
* for repos whose directories are gone. Writes workspace.json only if
|
|
287
|
+
* something changed.
|
|
288
|
+
*/
|
|
289
|
+
async reconcileRepos() {
|
|
290
|
+
const config = await this.loadConfig();
|
|
291
|
+
const added = [];
|
|
292
|
+
const removed = [];
|
|
293
|
+
// ── Discover repos on disk ──────────────────────────────────────────
|
|
294
|
+
const entries = readdirSync(this.workspacePath, { withFileTypes: true });
|
|
295
|
+
for (const entry of entries) {
|
|
296
|
+
if (!entry.isDirectory())
|
|
297
|
+
continue;
|
|
298
|
+
// Skip hidden dirs, .studiograph config dir, and private/
|
|
299
|
+
if (entry.name.startsWith('.') || entry.name === 'private')
|
|
300
|
+
continue;
|
|
301
|
+
const dirPath = join(this.workspacePath, entry.name);
|
|
302
|
+
const markerPath = join(dirPath, '.studiograph');
|
|
303
|
+
// Must have a .studiograph marker *file* (not directory)
|
|
304
|
+
if (!existsSync(markerPath))
|
|
305
|
+
continue;
|
|
306
|
+
try {
|
|
307
|
+
const st = statSync(markerPath);
|
|
308
|
+
if (!st.isFile())
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
// Already registered?
|
|
315
|
+
if (config.repos.find(r => r.name === entry.name))
|
|
316
|
+
continue;
|
|
317
|
+
// Read marker for type/name
|
|
318
|
+
let repoType = RepoType.PROJECT;
|
|
319
|
+
let repoName = entry.name;
|
|
320
|
+
try {
|
|
321
|
+
const marker = JSON.parse(readFileSync(markerPath, 'utf-8'));
|
|
322
|
+
if (marker.repo_type && Object.values(RepoType).includes(marker.repo_type)) {
|
|
323
|
+
repoType = marker.repo_type;
|
|
324
|
+
}
|
|
325
|
+
if (marker.repo_name)
|
|
326
|
+
repoName = marker.repo_name;
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// Marker unreadable — use defaults
|
|
330
|
+
}
|
|
331
|
+
// Try to read github_url from git remote
|
|
332
|
+
let githubUrl;
|
|
333
|
+
try {
|
|
334
|
+
const result = spawnSync('git', ['remote', 'get-url', 'origin'], {
|
|
335
|
+
cwd: dirPath, encoding: 'utf-8',
|
|
336
|
+
});
|
|
337
|
+
if (result.status === 0 && result.stdout.trim()) {
|
|
338
|
+
githubUrl = result.stdout.trim();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
// no remote — fine
|
|
343
|
+
}
|
|
344
|
+
const repoConfig = {
|
|
345
|
+
name: repoName,
|
|
346
|
+
type: repoType,
|
|
347
|
+
path: entry.name,
|
|
348
|
+
access: 'team',
|
|
349
|
+
...(githubUrl ? { github_url: githubUrl } : {}),
|
|
350
|
+
};
|
|
351
|
+
config.repos.push(repoConfig);
|
|
352
|
+
added.push(repoName);
|
|
353
|
+
}
|
|
354
|
+
// ── Remove stale entries ────────────────────────────────────────────
|
|
355
|
+
config.repos = config.repos.filter(r => {
|
|
356
|
+
const repoDir = join(this.workspacePath, r.path);
|
|
357
|
+
if (existsSync(repoDir))
|
|
358
|
+
return true;
|
|
359
|
+
removed.push(r.name);
|
|
360
|
+
return false;
|
|
361
|
+
});
|
|
362
|
+
// ── Persist if anything changed ─────────────────────────────────────
|
|
363
|
+
if (added.length > 0 || removed.length > 0) {
|
|
364
|
+
this.writeConfig(config);
|
|
365
|
+
this.config = config;
|
|
366
|
+
}
|
|
367
|
+
return { added, removed };
|
|
368
|
+
}
|
|
291
369
|
/**
|
|
292
370
|
* Get workspace root path
|
|
293
371
|
*/
|
|
@@ -302,8 +380,7 @@ Store shared entities like:
|
|
|
302
380
|
let currentPath = startPath;
|
|
303
381
|
while (currentPath !== '/') {
|
|
304
382
|
const jsonConfigPath = join(currentPath, '.studiograph', 'workspace.json');
|
|
305
|
-
|
|
306
|
-
if (existsSync(jsonConfigPath) || existsSync(yamlConfigPath)) {
|
|
383
|
+
if (existsSync(jsonConfigPath)) {
|
|
307
384
|
return currentPath;
|
|
308
385
|
}
|
|
309
386
|
// Go up one directory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAgD,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAetD,MAAM,OAAO,SAAS;IACZ,aAAa,CAAS;IACtB,cAAc,CAAS;IACvB,WAAW,CAAS;IACpB,MAAM,GAA2B,IAAI,CAAC;IAC9C,qFAAqF;IACrF,eAAe,GAAG,KAAK,CAAC;IAExB,YAAY,gBAAwB,OAAO,CAAC,GAAG,EAAE;QAC/C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,QAAgB;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,sDAAsD;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAChE,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,wBAAwB;QACxB,MAAM,MAAM,GAAoB;YAC9B,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,yCAAyC;QACzC,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACvC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAElF,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACzD,aAAa,CAAC,aAAa,EAAE,4CAA4C,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAoB,CAAC;QAExD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAuB;QACjC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA8B,CAAC;QAClE,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAqB;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QACpE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAe;QAC/D,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAgB;QACzC,MAAM,oBAAoB,GAAG;YAC3B,OAAO,EAAE,oBAAoB;YAC7B,QAAQ,EAAE,qBAAqB;YAC/B,iBAAiB,EAAE,4BAA4B;SAChD,CAAC;QAEF,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;QAErE,OAAO,KAAK,IAAI,CAAC,IAAI;;YAEb,YAAY;cACV,IAAI,CAAC,MAAM;;EAEvB,IAAI,CAAC,WAAW,IAAI,0BAA0B;;;;EAI9C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpC,CAAC;IACA,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAc;QACxC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,OAAO;gBACnB,OAAO;;;;;;;;6BAQc,CAAC;YAExB,KAAK,QAAQ,CAAC,QAAQ;gBACpB,OAAO;;;;;;;8BAOe,CAAC;YAEzB,KAAK,QAAQ,CAAC,eAAe;gBAC3B,OAAO;;;;;;;;oCAQqB,CAAC;YAE/B;gBACE,OAAO,qEAAqE,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAqB;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,+BAA+B;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAC5D,CAAC;QAED,kDAAkD;QAClD,MAAM,UAAU,GAAe;YAC7B,GAAG,IAAI;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,kCAAkC;YACnD,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,qCAAqC;SACrE,CAAC;QAEF,gBAAgB;QAChB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,qCAAqC;QACrC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACtD,aAAa,CACX,cAAc,EACd,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACvE,OAAO,CACR,CAAC;QAEF,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC1D,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAElD,yDAAyD;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7E,GAAG,CAAC,UAAU,CAAC,CAAC;YAChB,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/B,aAAa,CAAC,aAAa,EAAE,2BAA2B,EAAE,OAAO,CAAC,CAAC;YACrE,CAAC;YACD,GAAG,CAAC,YAAY,CAAC,CAAC;YAClB,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,aAAa,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,uEAAuE;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,0DAA0D;YAC1D,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YAErE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YAEjD,yDAAyD;YACzD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;oBAAE,SAAS;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,sBAAsB;YACtB,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE5D,4BAA4B;YAC5B,IAAI,QAAQ,GAAa,QAAQ,CAAC,OAAO,CAAC;YAC1C,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3E,QAAQ,GAAG,MAAM,CAAC,SAAqB,CAAC;gBAC1C,CAAC;gBACD,IAAI,MAAM,CAAC,SAAS;oBAAE,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,mCAAmC;YACrC,CAAC;YAED,yCAAyC;YACzC,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC/D,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO;iBAChC,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACnC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;YAED,MAAM,UAAU,GAAe;gBAC7B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,MAAM;gBACd,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAED,uEAAuE;QACvE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,uEAAuE;QACvE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,YAAoB,OAAO,CAAC,GAAG,EAAE;QACxD,IAAI,WAAW,GAAG,SAAS,CAAC;QAE5B,OAAO,WAAW,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAC3E,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/B,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,sBAAsB;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC3C,IAAI,UAAU,KAAK,WAAW;gBAAE,MAAM,CAAC,eAAe;YACtD,WAAW,GAAG,UAAU,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -4,12 +4,16 @@
|
|
|
4
4
|
* Connects the Studiograph agent to third-party MCP servers so the agent can
|
|
5
5
|
* query external data sources on demand.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Three transport types are supported:
|
|
8
8
|
*
|
|
9
9
|
* http — Remote streamable-HTTP server (e.g. Linear at https://mcp.linear.app/mcp).
|
|
10
10
|
* Requires `url` and `token` fields. Token can be a literal string or a
|
|
11
11
|
* $ENV_VAR reference resolved at runtime.
|
|
12
12
|
*
|
|
13
|
+
* oauth — Remote streamable-HTTP server with OAuth (e.g. Figma at mcp.figma.com/mcp).
|
|
14
|
+
* Requires `url` only. Uses dynamic client registration + PKCE — no client
|
|
15
|
+
* secrets needed. Browser opens for user authorization on first connect.
|
|
16
|
+
*
|
|
13
17
|
* stdio — Local stdio MCP server (e.g. granola-mcp spawned as a child process).
|
|
14
18
|
* Requires `command` and optionally `args` / `env`. No token needed —
|
|
15
19
|
* the server reads its own credentials from wherever it stores them.
|
|
@@ -23,7 +27,7 @@
|
|
|
23
27
|
* Connection failures are non-fatal — the failing connector is skipped with a warning.
|
|
24
28
|
*/
|
|
25
29
|
export declare const CONNECTORS_DIR: string;
|
|
26
|
-
export type ConnectorType = 'http' | 'stdio';
|
|
30
|
+
export type ConnectorType = 'http' | 'oauth' | 'stdio';
|
|
27
31
|
export interface ConnectorConfig {
|
|
28
32
|
/** Unique name used as the tool prefix (e.g. "linear" → "linear__search_issues") */
|
|
29
33
|
name: string;
|
|
@@ -54,7 +58,7 @@ export declare class ConnectorManager {
|
|
|
54
58
|
*
|
|
55
59
|
* Failures are non-fatal — the connector is skipped with a console.warn.
|
|
56
60
|
*/
|
|
57
|
-
static buildTools(configs: ConnectorConfig[]): Promise<any[]>;
|
|
61
|
+
static buildTools(configs: ConnectorConfig[], timeoutMs?: number): Promise<any[]>;
|
|
58
62
|
private static _resolveType;
|
|
59
63
|
private static _validate;
|
|
60
64
|
private static _buildConnectorTools;
|
|
@@ -4,12 +4,16 @@
|
|
|
4
4
|
* Connects the Studiograph agent to third-party MCP servers so the agent can
|
|
5
5
|
* query external data sources on demand.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Three transport types are supported:
|
|
8
8
|
*
|
|
9
9
|
* http — Remote streamable-HTTP server (e.g. Linear at https://mcp.linear.app/mcp).
|
|
10
10
|
* Requires `url` and `token` fields. Token can be a literal string or a
|
|
11
11
|
* $ENV_VAR reference resolved at runtime.
|
|
12
12
|
*
|
|
13
|
+
* oauth — Remote streamable-HTTP server with OAuth (e.g. Figma at mcp.figma.com/mcp).
|
|
14
|
+
* Requires `url` only. Uses dynamic client registration + PKCE — no client
|
|
15
|
+
* secrets needed. Browser opens for user authorization on first connect.
|
|
16
|
+
*
|
|
13
17
|
* stdio — Local stdio MCP server (e.g. granola-mcp spawned as a child process).
|
|
14
18
|
* Requires `command` and optionally `args` / `env`. No token needed —
|
|
15
19
|
* the server reads its own credentials from wherever it stores them.
|
|
@@ -28,6 +32,8 @@ import { homedir } from 'os';
|
|
|
28
32
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
29
33
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
30
34
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
35
|
+
import { auth } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
36
|
+
import { ConnectorOAuthProvider, waitForOAuthCallback } from './oauth-provider.js';
|
|
31
37
|
export const CONNECTORS_DIR = join(homedir(), '.studiograph', 'connectors');
|
|
32
38
|
// ── ConnectorManager ──────────────────────────────────────────────────────────
|
|
33
39
|
export class ConnectorManager {
|
|
@@ -90,18 +96,26 @@ export class ConnectorManager {
|
|
|
90
96
|
*
|
|
91
97
|
* Failures are non-fatal — the connector is skipped with a console.warn.
|
|
92
98
|
*/
|
|
93
|
-
static async buildTools(configs) {
|
|
99
|
+
static async buildTools(configs, timeoutMs = 10_000) {
|
|
94
100
|
const tools = [];
|
|
95
101
|
for (const config of configs) {
|
|
96
102
|
try {
|
|
97
|
-
const connectorTools = await
|
|
103
|
+
const connectorTools = await Promise.race([
|
|
104
|
+
ConnectorManager._buildConnectorTools(config),
|
|
105
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Connection timed out')), timeoutMs)),
|
|
106
|
+
]);
|
|
98
107
|
tools.push(...connectorTools);
|
|
99
|
-
console.error(`[connectors] ${config.name}: loaded ${connectorTools.length} tool(s)`);
|
|
100
108
|
}
|
|
101
109
|
catch (err) {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
const isLocal = /^https?:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/.test(config.url ?? '');
|
|
112
|
+
const isUnavailable = /timed out|ECONNREFUSED|fetch failed/i.test(msg);
|
|
113
|
+
if (isLocal && isUnavailable) {
|
|
114
|
+
console.warn(`[connectors] ${config.name} skipped — local server not running (${config.url})`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.warn(`[connectors] Failed to connect to "${config.name}" (${config.type === 'stdio' ? config.command : config.url}): ${msg}`);
|
|
118
|
+
}
|
|
105
119
|
}
|
|
106
120
|
}
|
|
107
121
|
return tools;
|
|
@@ -122,27 +136,58 @@ export class ConnectorManager {
|
|
|
122
136
|
return false;
|
|
123
137
|
}
|
|
124
138
|
}
|
|
139
|
+
else if (config.type === 'oauth') {
|
|
140
|
+
if (!config.url) {
|
|
141
|
+
console.warn(`[connectors] oauth connector "${config.name}" missing "url" — skipping`);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
125
145
|
else {
|
|
126
|
-
if (!config.url
|
|
127
|
-
console.warn(`[connectors] http connector "${config.name}" missing "url"
|
|
146
|
+
if (!config.url) {
|
|
147
|
+
console.warn(`[connectors] http connector "${config.name}" missing "url" — skipping`);
|
|
128
148
|
return false;
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
151
|
return true;
|
|
132
152
|
}
|
|
133
153
|
static async _buildConnectorTools(config) {
|
|
134
|
-
|
|
135
|
-
|
|
154
|
+
let transport;
|
|
155
|
+
if (config.type === 'stdio') {
|
|
156
|
+
transport = new StdioClientTransport({
|
|
136
157
|
command: config.command,
|
|
137
158
|
args: config.args,
|
|
138
159
|
env: config.env,
|
|
139
160
|
stderr: 'ignore',
|
|
140
|
-
})
|
|
141
|
-
: new StreamableHTTPClientTransport(new URL(config.url), {
|
|
142
|
-
requestInit: {
|
|
143
|
-
headers: { Authorization: `Bearer ${ConnectorManager.resolveToken(config.token)}` },
|
|
144
|
-
},
|
|
145
161
|
});
|
|
162
|
+
}
|
|
163
|
+
else if (config.type === 'oauth') {
|
|
164
|
+
// Pre-authorize before connecting.
|
|
165
|
+
// The SDK only auto-triggers OAuth on 401, but some servers (Figma) return 403
|
|
166
|
+
// for unauthenticated requests. We drive the flow manually to handle both.
|
|
167
|
+
const authProvider = new ConnectorOAuthProvider(config.name);
|
|
168
|
+
const result = await auth(authProvider, {
|
|
169
|
+
serverUrl: config.url,
|
|
170
|
+
});
|
|
171
|
+
if (result === 'REDIRECT') {
|
|
172
|
+
// Browser was opened — wait for the user to authorize
|
|
173
|
+
console.log(`[connectors] ${config.name} requires authorization — waiting for browser...`);
|
|
174
|
+
const code = await waitForOAuthCallback();
|
|
175
|
+
// Exchange the authorization code for tokens
|
|
176
|
+
await auth(authProvider, {
|
|
177
|
+
serverUrl: config.url,
|
|
178
|
+
authorizationCode: code,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
182
|
+
authProvider,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const requestInit = config.token
|
|
187
|
+
? { headers: { Authorization: `Bearer ${ConnectorManager.resolveToken(config.token)}` } }
|
|
188
|
+
: {};
|
|
189
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
|
|
190
|
+
}
|
|
146
191
|
const client = new Client({ name: 'studiograph', version: '1.0.0' });
|
|
147
192
|
await client.connect(transport);
|
|
148
193
|
const { tools: remoteTools } = await client.listTools();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector-manager.js","sourceRoot":"","sources":["../../src/mcp/connector-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connector-manager.js","sourceRoot":"","sources":["../../src/mcp/connector-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AA6B5E,iFAAiF;AAEjF,MAAM,OAAO,gBAAgB;IAE3B,6EAA6E;IAE7E,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAoB,CAAC;gBAC9F,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,0DAA0D,KAAK,EAAE,CAAC,CAAC;oBAChF,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACpD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;oBAAE,SAAS;gBAC3D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,aAAa,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAuB;QACvC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QACzD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAE7E,yEAAyE;IACzE,MAAM,CAAC,YAAY,CAAC,KAAa;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAE7E;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAA0B,EAAE,SAAS,GAAG,MAAM;QACpE,MAAM,KAAK,GAAU,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBACxC,gBAAgB,CAAC,oBAAoB,CAAC,MAAM,CAAC;oBAC7C,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,SAAS,CAAC,CACvE;iBACF,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,8CAA8C,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBACtF,MAAM,aAAa,GAAG,sCAAsC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvE,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,wCAAwC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBACjG,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,sCAAsC,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,CACxH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAErE,MAAM,CAAC,YAAY,CAAC,MAAuB;QACjD,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QAC/B,iCAAiC;QACjC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,MAAuB,EAAE,QAAgB;QAChE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,gCAAgC,CAAC,CAAC;gBAC3F,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;gBACvF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;gBACtF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAuB;QAC/D,IAAI,SAAS,CAAC;QAEd,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,SAAS,GAAG,IAAI,oBAAoB,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAQ;gBACxB,IAAI,EAAK,MAAM,CAAC,IAAI;gBACpB,GAAG,EAAM,MAAM,CAAC,GAAG;gBACnB,MAAM,EAAG,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACnC,mCAAmC;YACnC,+EAA+E;YAC/E,2EAA2E;YAC3E,MAAM,YAAY,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;gBACtC,SAAS,EAAE,MAAM,CAAC,GAAI;aACvB,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,sDAAsD;gBACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,kDAAkD,CAAC,CAAC;gBAC3F,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;gBAE1C,6CAA6C;gBAC7C,MAAM,IAAI,CAAC,YAAY,EAAE;oBACvB,SAAS,EAAE,MAAM,CAAC,GAAI;oBACtB,iBAAiB,EAAE,IAAI;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE;gBAClE,YAAY;aACb,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAgB,MAAM,CAAC,KAAK;gBAC3C,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE;gBACzF,CAAC,CAAC,EAAE,CAAC;YACP,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAErE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC;QAEhD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAS,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YACnD,WAAW,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE;YAChE,UAAU,EAAG,IAAI,CAAC,WAAW;YAE7B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAAW,EAAE,EAAE;gBAClD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC7E,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiB;yBACnC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;yBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBACvB,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;wBACnF,OAAO,EAAE,MAAM;qBAChB,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;wBAChG,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const asana = {
|
|
2
|
+
name: 'asana',
|
|
3
|
+
label: 'Asana',
|
|
4
|
+
description: 'Asana — tasks, projects, workspaces, team assignments',
|
|
5
|
+
type: 'stdio',
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', '@roychri/mcp-server-asana'],
|
|
8
|
+
credentialFields: [
|
|
9
|
+
{
|
|
10
|
+
key: 'env.ASANA_ACCESS_TOKEN',
|
|
11
|
+
label: 'Asana personal access token',
|
|
12
|
+
description: 'My Profile Settings → Apps → Manage Developer Apps → New access token',
|
|
13
|
+
secret: true,
|
|
14
|
+
required: true,
|
|
15
|
+
placeholder: 'your-personal-access-token',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
docsUrl: 'https://developers.asana.com/docs/personal-access-token',
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=asana.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asana.js","sourceRoot":"","sources":["../../../src/mcp/connectors/asana.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAwB;IACxC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC;IACzC,gBAAgB,EAAE;QAChB;YACE,GAAG,EAAE,wBAAwB;YAC7B,KAAK,EAAE,6BAA6B;YACpC,WAAW,EAAE,uEAAuE;YACpF,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,4BAA4B;SAC1C;KACF;IACD,OAAO,EAAE,yDAAyD;CACnE,CAAC"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Credentials are stored per-user at ~/.studiograph/connectors/<name>.json
|
|
8
8
|
* (mode 0600 — never committed to git).
|
|
9
|
+
*
|
|
10
|
+
* Individual connector definitions live in separate files for modularity.
|
|
9
11
|
*/
|
|
10
12
|
/** A single credential field to prompt for during interactive setup. */
|
|
11
13
|
export interface CredentialField {
|
|
@@ -29,7 +31,7 @@ export interface ConnectorDefinition {
|
|
|
29
31
|
name: string;
|
|
30
32
|
label: string;
|
|
31
33
|
description: string;
|
|
32
|
-
type: 'http' | 'stdio';
|
|
34
|
+
type: 'http' | 'oauth' | 'stdio';
|
|
33
35
|
/** Pre-filled URL for http connectors */
|
|
34
36
|
url?: string;
|
|
35
37
|
/** Pre-filled command for stdio connectors */
|
|
@@ -6,135 +6,27 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Credentials are stored per-user at ~/.studiograph/connectors/<name>.json
|
|
8
8
|
* (mode 0600 — never committed to git).
|
|
9
|
+
*
|
|
10
|
+
* Individual connector definitions live in separate files for modularity.
|
|
9
11
|
*/
|
|
12
|
+
import { linear } from './linear.js';
|
|
13
|
+
import { granola } from './granola.js';
|
|
14
|
+
import { slack } from './slack.js';
|
|
15
|
+
import { pipedrive } from './pipedrive.js';
|
|
16
|
+
import { gdrive } from './gdrive.js';
|
|
17
|
+
import { asana } from './asana.js';
|
|
18
|
+
import { figma, figmaRemote } from './figma.js';
|
|
19
|
+
import { obsidian } from './obsidian.js';
|
|
10
20
|
// ── Core connector set ────────────────────────────────────────────────────────
|
|
11
21
|
export const CONNECTOR_DEFINITIONS = {
|
|
12
|
-
linear
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
label: 'Linear API key',
|
|
22
|
-
description: 'Settings → API → Personal API keys → Create key',
|
|
23
|
-
secret: true,
|
|
24
|
-
required: true,
|
|
25
|
-
placeholder: 'lin_api_...',
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
docsUrl: 'https://linear.app/docs/api',
|
|
29
|
-
},
|
|
30
|
-
granola: {
|
|
31
|
-
name: 'granola',
|
|
32
|
-
label: 'Granola',
|
|
33
|
-
description: 'Granola — search and read AI-summarized meeting notes',
|
|
34
|
-
type: 'stdio',
|
|
35
|
-
command: 'npx',
|
|
36
|
-
args: ['-y', 'granola-mcp'],
|
|
37
|
-
// No credential fields — Granola reads auth from the installed Granola app
|
|
38
|
-
credentialFields: [],
|
|
39
|
-
docsUrl: 'https://granola.ai',
|
|
40
|
-
},
|
|
41
|
-
slack: {
|
|
42
|
-
name: 'slack',
|
|
43
|
-
label: 'Slack',
|
|
44
|
-
description: 'Slack — search messages, list channels, post updates',
|
|
45
|
-
type: 'stdio',
|
|
46
|
-
command: 'npx',
|
|
47
|
-
args: ['-y', '@modelcontextprotocol/server-slack'],
|
|
48
|
-
credentialFields: [
|
|
49
|
-
{
|
|
50
|
-
key: 'env.SLACK_BOT_TOKEN',
|
|
51
|
-
label: 'Slack token',
|
|
52
|
-
description: 'Bot token (xoxb-...) or User OAuth token (xoxp-...). ' +
|
|
53
|
-
'Create at: api.slack.com/apps → OAuth & Permissions',
|
|
54
|
-
secret: true,
|
|
55
|
-
required: true,
|
|
56
|
-
placeholder: 'xoxb-...',
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
docsUrl: 'https://api.slack.com/authentication/token-types',
|
|
60
|
-
},
|
|
61
|
-
pipedrive: {
|
|
62
|
-
name: 'pipedrive',
|
|
63
|
-
label: 'Pipedrive',
|
|
64
|
-
description: 'Pipedrive CRM — contacts, deals, activities, pipeline',
|
|
65
|
-
type: 'stdio',
|
|
66
|
-
command: 'npx',
|
|
67
|
-
args: ['-y', '@modelcontextprotocol/server-pipedrive'],
|
|
68
|
-
credentialFields: [
|
|
69
|
-
{
|
|
70
|
-
key: 'env.PIPEDRIVE_API_TOKEN',
|
|
71
|
-
label: 'Pipedrive API token',
|
|
72
|
-
description: 'Settings → Personal preferences → API → Your personal API token',
|
|
73
|
-
secret: true,
|
|
74
|
-
required: true,
|
|
75
|
-
placeholder: 'your-api-token',
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
docsUrl: 'https://developers.pipedrive.com/docs/api/v1',
|
|
79
|
-
},
|
|
80
|
-
gdrive: {
|
|
81
|
-
name: 'gdrive',
|
|
82
|
-
label: 'Google Drive',
|
|
83
|
-
description: 'Google Drive — search and read files, docs, sheets, slides',
|
|
84
|
-
type: 'stdio',
|
|
85
|
-
command: 'npx',
|
|
86
|
-
args: ['-y', '@modelcontextprotocol/server-gdrive'],
|
|
87
|
-
// OAuth flow required — credentials come from GDRIVE_CREDENTIALS_FILE env var
|
|
88
|
-
// pointing to an OAuth2 client_secret.json downloaded from Google Cloud Console.
|
|
89
|
-
// See docsUrl for setup steps.
|
|
90
|
-
credentialFields: [
|
|
91
|
-
{
|
|
92
|
-
key: 'env.GDRIVE_CREDENTIALS_FILE',
|
|
93
|
-
label: 'Path to Google OAuth credentials JSON',
|
|
94
|
-
description: 'Download from: Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client',
|
|
95
|
-
secret: false,
|
|
96
|
-
required: true,
|
|
97
|
-
placeholder: '~/.config/google/credentials.json',
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
docsUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/gdrive',
|
|
101
|
-
},
|
|
102
|
-
asana: {
|
|
103
|
-
name: 'asana',
|
|
104
|
-
label: 'Asana',
|
|
105
|
-
description: 'Asana — tasks, projects, workspaces, team assignments',
|
|
106
|
-
type: 'stdio',
|
|
107
|
-
command: 'npx',
|
|
108
|
-
args: ['-y', 'asana-mcp'],
|
|
109
|
-
credentialFields: [
|
|
110
|
-
{
|
|
111
|
-
key: 'env.ASANA_ACCESS_TOKEN',
|
|
112
|
-
label: 'Asana personal access token',
|
|
113
|
-
description: 'My Profile Settings → Apps → Manage Developer Apps → New access token',
|
|
114
|
-
secret: true,
|
|
115
|
-
required: true,
|
|
116
|
-
placeholder: 'your-personal-access-token',
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
docsUrl: 'https://developers.asana.com/docs/personal-access-token',
|
|
120
|
-
},
|
|
121
|
-
figma: {
|
|
122
|
-
name: 'figma',
|
|
123
|
-
label: 'Figma',
|
|
124
|
-
description: 'Figma — read files, components, variables, design tokens',
|
|
125
|
-
type: 'http',
|
|
126
|
-
url: 'https://mcp.figma.com/mcp',
|
|
127
|
-
credentialFields: [
|
|
128
|
-
{
|
|
129
|
-
key: 'token',
|
|
130
|
-
label: 'Figma personal access token',
|
|
131
|
-
description: 'Settings → Account → Personal access tokens → Generate new token',
|
|
132
|
-
secret: true,
|
|
133
|
-
required: true,
|
|
134
|
-
placeholder: 'figd_...',
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
docsUrl: 'https://www.figma.com/developers/api#access-tokens',
|
|
138
|
-
},
|
|
22
|
+
linear,
|
|
23
|
+
granola,
|
|
24
|
+
slack,
|
|
25
|
+
pipedrive,
|
|
26
|
+
gdrive,
|
|
27
|
+
asana,
|
|
28
|
+
figma,
|
|
29
|
+
'figma-remote': figmaRemote,
|
|
30
|
+
obsidian,
|
|
139
31
|
};
|
|
140
32
|
//# sourceMappingURL=definitions.js.map
|