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
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* studiograph deploy —
|
|
2
|
+
* studiograph deploy — automated deployment via provider APIs
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* studiograph deploy railway
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* studiograph deploy railway — create a full Railway project via GraphQL API
|
|
6
|
+
* studiograph deploy env — generate a railway.env file for manual setup
|
|
9
7
|
*/
|
|
10
8
|
import { Command } from 'commander';
|
|
11
|
-
import { intro, outro, text, confirm, log, spinner } from '@clack/prompts';
|
|
9
|
+
import { intro, outro, text, password, confirm, log, spinner } from '@clack/prompts';
|
|
12
10
|
import { randomBytes } from 'crypto';
|
|
13
11
|
import { spawnSync } from 'child_process';
|
|
14
|
-
import {
|
|
15
|
-
import { join } from 'path';
|
|
16
|
-
import {
|
|
12
|
+
import { writeFileSync } from 'fs';
|
|
13
|
+
import { join, resolve } from 'path';
|
|
14
|
+
import { Workspace } from '../../core/workspace.js';
|
|
17
15
|
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
18
16
|
function openBrowser(url) {
|
|
19
17
|
const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
@@ -22,132 +20,284 @@ function openBrowser(url) {
|
|
|
22
20
|
function generateSecret() {
|
|
23
21
|
return randomBytes(20).toString('hex');
|
|
24
22
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
: url;
|
|
23
|
+
function detectConfigRepoUrl() {
|
|
24
|
+
const configDir = join(process.cwd(), '.studiograph');
|
|
25
|
+
const result = spawnSync('git', ['remote', 'get-url', 'origin'], { cwd: configDir, encoding: 'utf-8' });
|
|
26
|
+
return result.status === 0 ? result.stdout.trim() : null;
|
|
30
27
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
28
|
+
// ── Railway GraphQL client ──────────────────────────────────────────────────
|
|
29
|
+
const RAILWAY_API = 'https://backboard.railway.com/graphql/v2';
|
|
30
|
+
async function railwayQuery(token, query, variables = {}) {
|
|
31
|
+
const res = await fetch(RAILWAY_API, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'Authorization': `Bearer ${token}`,
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify({ query, variables }),
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
throw new Error(`Railway API error: ${res.status} ${res.statusText}`);
|
|
41
41
|
}
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const json = await res.json();
|
|
43
|
+
if (json.errors?.length) {
|
|
44
|
+
throw new Error(`Railway API: ${json.errors.map((e) => e.message).join(', ')}`);
|
|
44
45
|
}
|
|
46
|
+
return json.data;
|
|
45
47
|
}
|
|
46
48
|
// ── deploy command group ──────────────────────────────────────────────────────
|
|
47
49
|
export const deployCommand = new Command('deploy')
|
|
48
50
|
.description('Deploy Studiograph to a hosting platform');
|
|
51
|
+
// ── studiograph deploy env ────────────────────────────────────────────────
|
|
52
|
+
deployCommand
|
|
53
|
+
.command('env')
|
|
54
|
+
.description('Generate a railway.env file for manual Railway setup')
|
|
55
|
+
.option('-o, --output <path>', 'Output file path', '.studiograph/railway.env')
|
|
56
|
+
.action(async (opts) => {
|
|
57
|
+
const workspace = new Workspace();
|
|
58
|
+
if (!workspace.isWorkspace()) {
|
|
59
|
+
console.error('Not a Studiograph workspace. Run this from your workspace root.');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
intro('Generate Railway environment file');
|
|
64
|
+
let configRepoUrl = detectConfigRepoUrl();
|
|
65
|
+
if (!configRepoUrl) {
|
|
66
|
+
const input = await text({
|
|
67
|
+
message: 'Config repo URL (could not detect from .studiograph remote)',
|
|
68
|
+
placeholder: 'https://github.com/your-org/.studiograph.git',
|
|
69
|
+
validate: (v) => v.trim() ? undefined : 'Required',
|
|
70
|
+
});
|
|
71
|
+
if (typeof input === 'symbol') {
|
|
72
|
+
outro('Cancelled');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
configRepoUrl = input.trim();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
log.info(`Config repo: ${configRepoUrl}`);
|
|
79
|
+
}
|
|
80
|
+
const apiKey = randomBytes(24).toString('base64url');
|
|
81
|
+
const webhookSecret = generateSecret();
|
|
82
|
+
const envContent = [
|
|
83
|
+
`STUDIOGRAPH_CONFIG_REPO=${configRepoUrl}`,
|
|
84
|
+
`GITHUB_TOKEN=<paste your fine-grained PAT here>`,
|
|
85
|
+
`PORT=3001`,
|
|
86
|
+
`API_KEYS=${apiKey}`,
|
|
87
|
+
`WEBHOOK_SECRET=${webhookSecret}`,
|
|
88
|
+
'',
|
|
89
|
+
].join('\n');
|
|
90
|
+
const outputPath = resolve(opts.output);
|
|
91
|
+
writeFileSync(outputPath, envContent, 'utf-8');
|
|
92
|
+
log.success(`Written to ${outputPath}`);
|
|
93
|
+
log.message('Next steps:\n' +
|
|
94
|
+
' 1. Replace GITHUB_TOKEN with your fine-grained PAT\n' +
|
|
95
|
+
' 2. In Railway: Variables > RAW Editor > paste the file contents\n' +
|
|
96
|
+
' 3. Set start command: npx studiograph serve\n' +
|
|
97
|
+
' 4. Add a persistent volume mounted at /workspace');
|
|
98
|
+
outro('Done');
|
|
99
|
+
});
|
|
49
100
|
// ── studiograph deploy railway ────────────────────────────────────────────────
|
|
50
101
|
deployCommand
|
|
51
102
|
.command('railway')
|
|
52
|
-
.description('
|
|
53
|
-
.
|
|
103
|
+
.description('Deploy Studiograph to Railway (creates project, service, volume, and deploys)')
|
|
104
|
+
.option('-n, --name <name>', 'Railway project name')
|
|
105
|
+
.action(async (opts) => {
|
|
106
|
+
const workspace = new Workspace();
|
|
107
|
+
if (!workspace.isWorkspace()) {
|
|
108
|
+
console.error('Not a Studiograph workspace. Run this from your workspace root.');
|
|
109
|
+
process.exit(1);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
54
112
|
intro('Deploy Studiograph to Railway');
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
log.message('Studiograph needs a GitHub fine-grained PAT to clone your private repos at startup.\n' +
|
|
60
|
-
'Opening GitHub → Settings → Developer Settings → Fine-grained personal access tokens...\n\n' +
|
|
61
|
-
' Create a token with these permissions:\n' +
|
|
62
|
-
' Repository access: All repositories (or select specific ones)\n' +
|
|
63
|
-
' Permissions: Contents → Read-only\n');
|
|
64
|
-
openBrowser('https://github.com/settings/personal-access-tokens/new');
|
|
65
|
-
const githubToken = await text({
|
|
66
|
-
message: 'Paste your GitHub token',
|
|
67
|
-
placeholder: 'github_pat_...',
|
|
113
|
+
// ── Step 1: Collect credentials ────────────────────────────────────────
|
|
114
|
+
log.step('Step 1 — Credentials');
|
|
115
|
+
const railwayToken = await password({
|
|
116
|
+
message: 'Railway API token (create at https://railway.com/account/tokens)',
|
|
68
117
|
validate: (v) => v.trim() ? undefined : 'Required',
|
|
69
118
|
});
|
|
70
|
-
if (typeof
|
|
119
|
+
if (typeof railwayToken === 'symbol') {
|
|
71
120
|
outro('Cancelled');
|
|
72
121
|
process.exit(0);
|
|
73
122
|
}
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
123
|
+
// Verify the token by listing projects
|
|
124
|
+
const s = spinner();
|
|
125
|
+
s.start('Verifying Railway token...');
|
|
126
|
+
try {
|
|
127
|
+
const data = await railwayQuery(railwayToken.trim(), `query { projects { edges { node { id name } } } }`);
|
|
128
|
+
const count = data.projects.edges.length;
|
|
129
|
+
s.stop(`Authenticated (${count} existing project${count === 1 ? '' : 's'})`);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
s.stop('Railway authentication failed');
|
|
133
|
+
log.error(err instanceof Error ? err.message : 'Unknown error');
|
|
134
|
+
outro('Check your token and try again.');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const githubToken = await password({
|
|
139
|
+
message: 'GitHub PAT (fine-grained, read access to your repos)',
|
|
79
140
|
validate: (v) => v.trim() ? undefined : 'Required',
|
|
80
141
|
});
|
|
81
|
-
if (typeof
|
|
142
|
+
if (typeof githubToken === 'symbol') {
|
|
82
143
|
outro('Cancelled');
|
|
83
144
|
process.exit(0);
|
|
84
145
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
146
|
+
// ── Step 2: Detect workspace config ────────────────────────────────────
|
|
147
|
+
log.step('Step 2 — Workspace configuration');
|
|
148
|
+
let configRepoUrl = detectConfigRepoUrl();
|
|
149
|
+
if (configRepoUrl) {
|
|
150
|
+
log.info(`Config repo: ${configRepoUrl}`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const input = await text({
|
|
154
|
+
message: 'Config repo URL (could not auto-detect)',
|
|
155
|
+
placeholder: 'https://github.com/your-org/.studiograph.git',
|
|
156
|
+
validate: (v) => v.trim() ? undefined : 'Required',
|
|
157
|
+
});
|
|
158
|
+
if (typeof input === 'symbol') {
|
|
159
|
+
outro('Cancelled');
|
|
160
|
+
process.exit(0);
|
|
161
|
+
}
|
|
162
|
+
configRepoUrl = input.trim();
|
|
92
163
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
.join(';');
|
|
164
|
+
const config = await workspace.loadConfig();
|
|
165
|
+
const projectName = opts.name
|
|
166
|
+
|| (config.team_name ? `${config.team_name} — Studiograph` : 'Studiograph');
|
|
167
|
+
const apiKey = randomBytes(24).toString('base64url');
|
|
98
168
|
const webhookSecret = generateSecret();
|
|
99
|
-
// ── Step 3: Railway
|
|
100
|
-
log.step('Step 3
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
169
|
+
// ── Step 3: Create Railway infrastructure ──────────────────────────────
|
|
170
|
+
log.step('Step 3 — Creating Railway project');
|
|
171
|
+
s.start('Creating project...');
|
|
172
|
+
const projectData = await railwayQuery(railwayToken.trim(), `
|
|
173
|
+
mutation($input: ProjectCreateInput!) {
|
|
174
|
+
projectCreate(input: $input) { id name }
|
|
175
|
+
}
|
|
176
|
+
`, { input: { name: projectName } });
|
|
177
|
+
const projectId = projectData.projectCreate.id;
|
|
178
|
+
s.stop(`Project created: ${projectData.projectCreate.name}`);
|
|
179
|
+
// Get the default environment ID
|
|
180
|
+
s.start('Reading environment...');
|
|
181
|
+
const envData = await railwayQuery(railwayToken.trim(), `
|
|
182
|
+
query($id: String!) {
|
|
183
|
+
project(id: $id) {
|
|
184
|
+
environments { edges { node { id name } } }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
`, { id: projectId });
|
|
188
|
+
const envId = envData.project.environments.edges[0].node.id;
|
|
189
|
+
s.stop(`Environment: ${envData.project.environments.edges[0].node.name}`);
|
|
190
|
+
// Create an empty service (no image yet — avoids premature deploy)
|
|
191
|
+
s.start('Creating service...');
|
|
192
|
+
const serviceData = await railwayQuery(railwayToken.trim(), `
|
|
193
|
+
mutation($input: ServiceCreateInput!) {
|
|
194
|
+
serviceCreate(input: $input) { id name }
|
|
195
|
+
}
|
|
196
|
+
`, { input: { projectId, name: 'studiograph' } });
|
|
197
|
+
const serviceId = serviceData.serviceCreate.id;
|
|
198
|
+
s.stop('Service created');
|
|
199
|
+
// Configure start command (no deploy triggered — no source yet)
|
|
200
|
+
s.start('Configuring start command...');
|
|
201
|
+
await railwayQuery(railwayToken.trim(), `
|
|
202
|
+
mutation($serviceId: String!, $environmentId: String!, $input: ServiceInstanceUpdateInput!) {
|
|
203
|
+
serviceInstanceUpdate(serviceId: $serviceId, environmentId: $environmentId, input: $input)
|
|
204
|
+
}
|
|
205
|
+
`, {
|
|
206
|
+
serviceId,
|
|
207
|
+
environmentId: envId,
|
|
208
|
+
input: { startCommand: 'npx studiograph serve' },
|
|
125
209
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
210
|
+
s.stop('Start command set: npx studiograph serve');
|
|
211
|
+
// Create volume
|
|
212
|
+
s.start('Attaching volume at /workspace...');
|
|
213
|
+
await railwayQuery(railwayToken.trim(), `
|
|
214
|
+
mutation($input: VolumeCreateInput!) {
|
|
215
|
+
volumeCreate(input: $input) { id name }
|
|
216
|
+
}
|
|
217
|
+
`, { input: { projectId, serviceId, mountPath: '/workspace' } });
|
|
218
|
+
s.stop('Volume attached at /workspace');
|
|
219
|
+
// Set environment variables
|
|
220
|
+
s.start('Setting environment variables...');
|
|
221
|
+
await railwayQuery(railwayToken.trim(), `
|
|
222
|
+
mutation($input: VariableCollectionUpsertInput!) {
|
|
223
|
+
variableCollectionUpsert(input: $input)
|
|
224
|
+
}
|
|
225
|
+
`, {
|
|
226
|
+
input: {
|
|
227
|
+
projectId,
|
|
228
|
+
environmentId: envId,
|
|
229
|
+
serviceId,
|
|
230
|
+
variables: {
|
|
231
|
+
STUDIOGRAPH_CONFIG_REPO: configRepoUrl,
|
|
232
|
+
GITHUB_TOKEN: githubToken.trim(),
|
|
233
|
+
PORT: '3001',
|
|
234
|
+
API_KEYS: apiKey,
|
|
235
|
+
WEBHOOK_SECRET: webhookSecret,
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
s.stop('Environment variables set');
|
|
240
|
+
// Generate a Railway domain
|
|
241
|
+
s.start('Generating domain...');
|
|
242
|
+
let domain = '';
|
|
243
|
+
try {
|
|
244
|
+
const domainData = await railwayQuery(railwayToken.trim(), `
|
|
245
|
+
mutation($input: CustomDomainCreateInput!) {
|
|
246
|
+
customDomainCreate(input: $input) { id domain }
|
|
247
|
+
}
|
|
248
|
+
`, { input: { projectId, environmentId: envId, serviceId } });
|
|
249
|
+
domain = domainData.customDomainCreate?.domain || '';
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Domain creation may use a different mutation — try serviceDomainCreate
|
|
253
|
+
try {
|
|
254
|
+
const domainData = await railwayQuery(railwayToken.trim(), `
|
|
255
|
+
mutation($input: ServiceDomainCreateInput!) {
|
|
256
|
+
serviceDomainCreate(input: $input) { id domain }
|
|
257
|
+
}
|
|
258
|
+
`, { input: { serviceId, environmentId: envId } });
|
|
259
|
+
domain = domainData.serviceDomainCreate?.domain || '';
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Non-fatal — user can add a domain manually
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (domain) {
|
|
266
|
+
s.stop(`Domain: https://${domain}`);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
s.stop('Domain: generate one in Railway dashboard (Settings > Networking > Generate Domain)');
|
|
270
|
+
}
|
|
271
|
+
// Connect the Docker image last — this triggers the single deploy
|
|
272
|
+
s.start('Connecting node:20 image and deploying...');
|
|
273
|
+
await railwayQuery(railwayToken.trim(), `
|
|
274
|
+
mutation($id: String!, $input: ServiceConnectInput!) {
|
|
275
|
+
serviceConnect(id: $id, input: $input) { id }
|
|
276
|
+
}
|
|
277
|
+
`, { id: serviceId, input: { image: 'node:20' } });
|
|
278
|
+
s.stop('Deploy triggered (node:20)');
|
|
279
|
+
// ── Summary ─────────────────────────────────────────────────────────────
|
|
280
|
+
const baseUrl = domain ? `https://${domain}` : 'https://<your-railway-domain>';
|
|
281
|
+
log.message('\nDeployment summary:\n' +
|
|
282
|
+
` Project: ${projectData.projectCreate.name}\n` +
|
|
283
|
+
` Service: studiograph\n` +
|
|
284
|
+
` Volume: /workspace\n` +
|
|
285
|
+
` API key: ${apiKey}\n` +
|
|
286
|
+
` Webhook: ${webhookSecret}\n` +
|
|
287
|
+
(domain ? ` URL: https://${domain}\n` : '') +
|
|
288
|
+
'\nEndpoints:\n' +
|
|
289
|
+
` Graph API: ${baseUrl}/api/repos\n` +
|
|
290
|
+
` Slides: ${baseUrl}/slides/:repo/:entity-id\n` +
|
|
291
|
+
` Webhook: ${baseUrl}/webhooks/github\n`);
|
|
292
|
+
// Open the project dashboard
|
|
293
|
+
const dashboardUrl = `https://railway.com/project/${projectId}`;
|
|
294
|
+
const open = await confirm({ message: 'Open Railway dashboard in browser?' });
|
|
295
|
+
if (open) {
|
|
296
|
+
openBrowser(dashboardUrl);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
log.info(`Dashboard: ${dashboardUrl}`);
|
|
129
300
|
}
|
|
130
|
-
|
|
131
|
-
log.message('Add a webhook to each GitHub repo in your workspace:\n\n' +
|
|
132
|
-
` Payload URL: ${webhookUrl}\n` +
|
|
133
|
-
` Content type: application/json\n` +
|
|
134
|
-
` Secret: ${webhookSecret}\n` +
|
|
135
|
-
' Events: Just the push event\n\n' +
|
|
136
|
-
'Repos to configure:\n' +
|
|
137
|
-
(repos.length > 0
|
|
138
|
-
? repos
|
|
139
|
-
.filter(r => r.github_url)
|
|
140
|
-
.map(r => ` • ${r.github_url}`)
|
|
141
|
-
.join('\n')
|
|
142
|
-
: ' (add webhooks to all repos in your workspace)'));
|
|
143
|
-
log.message('\nFor each repo, go to:\n' +
|
|
144
|
-
' GitHub repo → Settings → Webhooks → Add webhook');
|
|
145
|
-
openBrowser('https://github.com');
|
|
146
|
-
await confirm({ message: 'Webhooks configured? Press Enter to finish.' });
|
|
147
|
-
outro(`✨ All done!\n\n` +
|
|
148
|
-
` Server: ${railwayUrl}\n` +
|
|
149
|
-
` Graph API: ${railwayUrl}/api/repos\n\n` +
|
|
150
|
-
'On Railway\'s next deploy, Studiograph will bootstrap automatically:\n' +
|
|
151
|
-
'clone your config repo, clone your workspace repos, and start serving.');
|
|
301
|
+
outro('Railway project created — check the dashboard for deploy progress.');
|
|
152
302
|
});
|
|
153
303
|
//# sourceMappingURL=deploy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph enrich
|
|
3
|
+
*
|
|
4
|
+
* Enrich existing entities with cross-source context via LLM.
|
|
5
|
+
*
|
|
6
|
+
* studiograph enrich — run enrichment, write in-place
|
|
7
|
+
* studiograph enrich commit — git commit across affected repos
|
|
8
|
+
* studiograph enrich abort — git checkout -- . across repos
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare const enrichCommand: Command;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph enrich
|
|
3
|
+
*
|
|
4
|
+
* Enrich existing entities with cross-source context via LLM.
|
|
5
|
+
*
|
|
6
|
+
* studiograph enrich — run enrichment, write in-place
|
|
7
|
+
* studiograph enrich commit — git commit across affected repos
|
|
8
|
+
* studiograph enrich abort — git checkout -- . across repos
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { Workspace } from '../../core/workspace.js';
|
|
15
|
+
import { runEnrichment } from '../../services/sync/enrichment.js';
|
|
16
|
+
import { runReview } from './review.js';
|
|
17
|
+
export const enrichCommand = new Command('enrich')
|
|
18
|
+
.description('Enrich entities with cross-source context');
|
|
19
|
+
// ── enrich (run) ─────────────────────────────────────────────────────────────
|
|
20
|
+
enrichCommand
|
|
21
|
+
.command('run', { isDefault: true })
|
|
22
|
+
.description('Run LLM enrichment on entities with low completeness')
|
|
23
|
+
.option('--entity-types <types...>', 'Only enrich specific entity types')
|
|
24
|
+
.option('--dry-run', 'Preview without writing changes')
|
|
25
|
+
.option('--min-refs <n>', 'Minimum context references required', '2')
|
|
26
|
+
.option('--max-completeness <n>', 'Maximum completeness to qualify', '0.6')
|
|
27
|
+
.action(async (opts) => {
|
|
28
|
+
const workspace = new Workspace(process.cwd());
|
|
29
|
+
if (!workspace.isWorkspace()) {
|
|
30
|
+
console.error('Not in a Studiograph workspace.');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const config = await workspace.loadConfig();
|
|
35
|
+
const result = await runEnrichment({
|
|
36
|
+
workspacePath: process.cwd(),
|
|
37
|
+
entityTypes: opts.entityTypes,
|
|
38
|
+
dryRun: opts.dryRun,
|
|
39
|
+
minRefs: parseInt(opts.minRefs ?? '2', 10),
|
|
40
|
+
maxCompleteness: parseFloat(opts.maxCompleteness ?? '0.6'),
|
|
41
|
+
schemaExtensions: config.schema_extensions,
|
|
42
|
+
}, (msg) => console.log(msg));
|
|
43
|
+
console.log(`\nDone: ${result.enriched} enriched, ${result.skipped} skipped, ${result.errors.length} errors`);
|
|
44
|
+
if (result.enriched > 0 && !opts.dryRun) {
|
|
45
|
+
console.log('\nNext: studiograph review (inspect changes)');
|
|
46
|
+
console.log('Then: studiograph commit (git commit)');
|
|
47
|
+
console.log('Or: studiograph enrich abort (discard changes)');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error('Enrichment failed:', err instanceof Error ? err.message : String(err));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// ── enrich commit (deprecated) ───────────────────────────────────────────────
|
|
56
|
+
enrichCommand
|
|
57
|
+
.command('commit')
|
|
58
|
+
.description('Git commit enrichment changes across repos (deprecated: use studiograph commit)')
|
|
59
|
+
.action(async () => {
|
|
60
|
+
console.log('Note: "enrich commit" is deprecated. Use "studiograph commit" instead.\n');
|
|
61
|
+
const workspace = new Workspace(process.cwd());
|
|
62
|
+
if (!workspace.isWorkspace()) {
|
|
63
|
+
console.error('Not in a Studiograph workspace.');
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const config = await workspace.loadConfig();
|
|
68
|
+
const repos = config.repos ?? [];
|
|
69
|
+
for (const repo of repos) {
|
|
70
|
+
const repoPath = join(process.cwd(), repo.path);
|
|
71
|
+
if (!existsSync(repoPath))
|
|
72
|
+
continue;
|
|
73
|
+
try {
|
|
74
|
+
// Check for changes
|
|
75
|
+
const status = execSync('git status --porcelain', { cwd: repoPath, encoding: 'utf-8' }).trim();
|
|
76
|
+
if (!status)
|
|
77
|
+
continue;
|
|
78
|
+
execSync('git add -A', { cwd: repoPath });
|
|
79
|
+
execSync('git commit -m "Enrich entities with cross-source context"', { cwd: repoPath });
|
|
80
|
+
console.log(`Committed changes in ${repo.name}`);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// skip repos without git or without changes
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
console.log('Enrichment changes committed.');
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
console.error('Commit failed:', err instanceof Error ? err.message : String(err));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// ── enrich abort ─────────────────────────────────────────────────────────────
|
|
94
|
+
enrichCommand
|
|
95
|
+
.command('abort')
|
|
96
|
+
.description('Discard enrichment changes')
|
|
97
|
+
.action(async () => {
|
|
98
|
+
const workspace = new Workspace(process.cwd());
|
|
99
|
+
if (!workspace.isWorkspace()) {
|
|
100
|
+
console.error('Not in a Studiograph workspace.');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const config = await workspace.loadConfig();
|
|
105
|
+
const repos = config.repos ?? [];
|
|
106
|
+
for (const repo of repos) {
|
|
107
|
+
const repoPath = join(process.cwd(), repo.path);
|
|
108
|
+
if (!existsSync(repoPath))
|
|
109
|
+
continue;
|
|
110
|
+
try {
|
|
111
|
+
execSync('git checkout -- .', { cwd: repoPath });
|
|
112
|
+
console.log(`Reverted changes in ${repo.name}`);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// skip repos without git
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
console.log('Enrichment changes discarded.');
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error('Abort failed:', err instanceof Error ? err.message : String(err));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
// ── enrich review (delegates to top-level review command) ───────────────────
|
|
126
|
+
enrichCommand
|
|
127
|
+
.command('review')
|
|
128
|
+
.description('Review entity changes (alias for studiograph review)')
|
|
129
|
+
.option('--type <entity_type>', 'Show colored diff for an entity type')
|
|
130
|
+
.option('--file <path>', 'Show colored diff for a specific file')
|
|
131
|
+
.option('--committed', 'Review last commit instead of uncommitted changes')
|
|
132
|
+
.action(async (opts) => {
|
|
133
|
+
await runReview(opts);
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"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"}
|