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.
Files changed (275) hide show
  1. package/README.md +2 -8
  2. package/dist/agent/orchestrator.js +56 -11
  3. package/dist/agent/orchestrator.js.map +1 -1
  4. package/dist/agent/prompts/system.md +28 -10
  5. package/dist/agent/skill-loader.d.ts +48 -0
  6. package/dist/agent/skill-loader.js +166 -0
  7. package/dist/agent/skill-loader.js.map +1 -0
  8. package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
  9. package/dist/agent/skills/entity-schema.md +502 -0
  10. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  11. package/dist/agent/skills/sync-configuration.md +144 -0
  12. package/dist/agent/skills/sync-setup.md +68 -0
  13. package/dist/agent/tools/connector-tools.d.ts +37 -0
  14. package/dist/agent/tools/connector-tools.js +132 -0
  15. package/dist/agent/tools/connector-tools.js.map +1 -0
  16. package/dist/agent/tools/fs-tools.d.ts +39 -0
  17. package/dist/agent/tools/fs-tools.js +106 -0
  18. package/dist/agent/tools/fs-tools.js.map +1 -0
  19. package/dist/agent/tools/graph-tools.d.ts +11 -1
  20. package/dist/agent/tools/graph-tools.js +90 -29
  21. package/dist/agent/tools/graph-tools.js.map +1 -1
  22. package/dist/agent/tools/load-skill.d.ts +1 -1
  23. package/dist/agent/tools/load-skill.js +1 -1
  24. package/dist/agent/tools/load-skill.js.map +1 -1
  25. package/dist/agent/tools/sync-tools.d.ts +25 -0
  26. package/dist/agent/tools/sync-tools.js +691 -0
  27. package/dist/agent/tools/sync-tools.js.map +1 -0
  28. package/dist/auth/github.d.ts +11 -8
  29. package/dist/auth/github.js +56 -75
  30. package/dist/auth/github.js.map +1 -1
  31. package/dist/cli/colors.d.ts +54 -0
  32. package/dist/cli/colors.js +133 -0
  33. package/dist/cli/colors.js.map +1 -0
  34. package/dist/cli/commands/auth.d.ts +1 -1
  35. package/dist/cli/commands/auth.js +26 -10
  36. package/dist/cli/commands/auth.js.map +1 -1
  37. package/dist/cli/commands/clone.d.ts +9 -0
  38. package/dist/cli/commands/clone.js +167 -0
  39. package/dist/cli/commands/clone.js.map +1 -0
  40. package/dist/cli/commands/commit.d.ts +8 -0
  41. package/dist/cli/commands/commit.js +43 -0
  42. package/dist/cli/commands/commit.js.map +1 -0
  43. package/dist/cli/commands/connector.js +10 -2
  44. package/dist/cli/commands/connector.js.map +1 -1
  45. package/dist/cli/commands/deploy.d.ts +4 -6
  46. package/dist/cli/commands/deploy.js +262 -112
  47. package/dist/cli/commands/deploy.js.map +1 -1
  48. package/dist/cli/commands/enrich.d.ts +11 -0
  49. package/dist/cli/commands/enrich.js +135 -0
  50. package/dist/cli/commands/enrich.js.map +1 -0
  51. package/dist/cli/commands/graphrag.d.ts +12 -0
  52. package/dist/cli/commands/graphrag.js +122 -0
  53. package/dist/cli/commands/graphrag.js.map +1 -0
  54. package/dist/cli/commands/init.js +21 -203
  55. package/dist/cli/commands/init.js.map +1 -1
  56. package/dist/cli/commands/join.js +23 -3
  57. package/dist/cli/commands/join.js.map +1 -1
  58. package/dist/cli/commands/orphans.d.ts +8 -0
  59. package/dist/cli/commands/orphans.js +125 -0
  60. package/dist/cli/commands/orphans.js.map +1 -0
  61. package/dist/cli/commands/provision.js +11 -7
  62. package/dist/cli/commands/provision.js.map +1 -1
  63. package/dist/cli/commands/r2.js +8 -2
  64. package/dist/cli/commands/r2.js.map +1 -1
  65. package/dist/cli/commands/reset.d.ts +12 -0
  66. package/dist/cli/commands/reset.js +137 -0
  67. package/dist/cli/commands/reset.js.map +1 -0
  68. package/dist/cli/commands/review.d.ts +19 -0
  69. package/dist/cli/commands/review.js +128 -0
  70. package/dist/cli/commands/review.js.map +1 -0
  71. package/dist/cli/commands/source.d.ts +16 -0
  72. package/dist/cli/commands/source.js +159 -0
  73. package/dist/cli/commands/source.js.map +1 -0
  74. package/dist/cli/commands/start.js +285 -55
  75. package/dist/cli/commands/start.js.map +1 -1
  76. package/dist/cli/commands/sync-entities.d.ts +13 -0
  77. package/dist/cli/commands/sync-entities.js +242 -0
  78. package/dist/cli/commands/sync-entities.js.map +1 -0
  79. package/dist/cli/commands/sync.js +36 -5
  80. package/dist/cli/commands/sync.js.map +1 -1
  81. package/dist/cli/index.js +31 -0
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/cli/scaffolding.d.ts +2 -1
  84. package/dist/cli/scaffolding.js +36 -22
  85. package/dist/cli/scaffolding.js.map +1 -1
  86. package/dist/cli/setup-wizard.d.ts +30 -0
  87. package/dist/cli/setup-wizard.js +244 -0
  88. package/dist/cli/setup-wizard.js.map +1 -0
  89. package/dist/cli/sync-review-interactive.d.ts +31 -0
  90. package/dist/cli/sync-review-interactive.js +393 -0
  91. package/dist/cli/sync-review-interactive.js.map +1 -0
  92. package/dist/cli/theme.d.ts +31 -0
  93. package/dist/cli/theme.js +116 -0
  94. package/dist/cli/theme.js.map +1 -0
  95. package/dist/core/graph.d.ts +4 -8
  96. package/dist/core/graph.js +145 -96
  97. package/dist/core/graph.js.map +1 -1
  98. package/dist/core/migration-runner.d.ts +4 -1
  99. package/dist/core/migration-runner.js +14 -3
  100. package/dist/core/migration-runner.js.map +1 -1
  101. package/dist/core/types.d.ts +0 -3
  102. package/dist/core/types.js +0 -2
  103. package/dist/core/types.js.map +1 -1
  104. package/dist/core/user-config.d.ts +6 -0
  105. package/dist/core/user-config.js.map +1 -1
  106. package/dist/core/workspace.d.ts +13 -5
  107. package/dist/core/workspace.js +110 -33
  108. package/dist/core/workspace.js.map +1 -1
  109. package/dist/mcp/connector-manager.d.ts +7 -3
  110. package/dist/mcp/connector-manager.js +61 -16
  111. package/dist/mcp/connector-manager.js.map +1 -1
  112. package/dist/mcp/connectors/asana.d.ts +2 -0
  113. package/dist/mcp/connectors/asana.js +20 -0
  114. package/dist/mcp/connectors/asana.js.map +1 -0
  115. package/dist/mcp/connectors/definitions.d.ts +3 -1
  116. package/dist/mcp/connectors/definitions.js +19 -127
  117. package/dist/mcp/connectors/definitions.js.map +1 -1
  118. package/dist/mcp/connectors/figma.d.ts +5 -0
  119. package/dist/mcp/connectors/figma.js +21 -0
  120. package/dist/mcp/connectors/figma.js.map +1 -0
  121. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  122. package/dist/mcp/connectors/gdrive.js +20 -0
  123. package/dist/mcp/connectors/gdrive.js.map +1 -0
  124. package/dist/mcp/connectors/granola.d.ts +2 -0
  125. package/dist/mcp/connectors/granola.js +12 -0
  126. package/dist/mcp/connectors/granola.js.map +1 -0
  127. package/dist/mcp/connectors/linear.d.ts +2 -0
  128. package/dist/mcp/connectors/linear.js +19 -0
  129. package/dist/mcp/connectors/linear.js.map +1 -0
  130. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  131. package/dist/mcp/connectors/obsidian.js +19 -0
  132. package/dist/mcp/connectors/obsidian.js.map +1 -0
  133. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  134. package/dist/mcp/connectors/pipedrive.js +20 -0
  135. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  136. package/dist/mcp/connectors/slack.d.ts +2 -0
  137. package/dist/mcp/connectors/slack.js +21 -0
  138. package/dist/mcp/connectors/slack.js.map +1 -0
  139. package/dist/mcp/oauth-provider.d.ts +41 -0
  140. package/dist/mcp/oauth-provider.js +160 -0
  141. package/dist/mcp/oauth-provider.js.map +1 -0
  142. package/dist/server/index.js +14 -9
  143. package/dist/server/index.js.map +1 -1
  144. package/dist/server/plugin-loader.d.ts +7 -0
  145. package/dist/server/plugin-loader.js +54 -2
  146. package/dist/server/plugin-loader.js.map +1 -1
  147. package/dist/services/github-provisioner.d.ts +8 -3
  148. package/dist/services/github-provisioner.js +35 -8
  149. package/dist/services/github-provisioner.js.map +1 -1
  150. package/dist/services/lint-service.js +8 -1
  151. package/dist/services/lint-service.js.map +1 -1
  152. package/dist/services/markdown.js +3 -3
  153. package/dist/services/markdown.js.map +1 -1
  154. package/dist/services/memory-service.d.ts +1 -1
  155. package/dist/services/memory-service.js +2 -3
  156. package/dist/services/memory-service.js.map +1 -1
  157. package/dist/services/orphan-service.d.ts +31 -0
  158. package/dist/services/orphan-service.js +100 -0
  159. package/dist/services/orphan-service.js.map +1 -0
  160. package/dist/services/sync/commit.d.ts +58 -0
  161. package/dist/services/sync/commit.js +354 -0
  162. package/dist/services/sync/commit.js.map +1 -0
  163. package/dist/services/sync/context-index.d.ts +69 -0
  164. package/dist/services/sync/context-index.js +280 -0
  165. package/dist/services/sync/context-index.js.map +1 -0
  166. package/dist/services/sync/derive.d.ts +34 -0
  167. package/dist/services/sync/derive.js +164 -0
  168. package/dist/services/sync/derive.js.map +1 -0
  169. package/dist/services/sync/enrichment-state.d.ts +31 -0
  170. package/dist/services/sync/enrichment-state.js +63 -0
  171. package/dist/services/sync/enrichment-state.js.map +1 -0
  172. package/dist/services/sync/enrichment.d.ts +25 -0
  173. package/dist/services/sync/enrichment.js +121 -0
  174. package/dist/services/sync/enrichment.js.map +1 -0
  175. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  176. package/dist/services/sync/frontmatter-extractor.js +273 -0
  177. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  178. package/dist/services/sync/graph-match-state.d.ts +33 -0
  179. package/dist/services/sync/graph-match-state.js +61 -0
  180. package/dist/services/sync/graph-match-state.js.map +1 -0
  181. package/dist/services/sync/graph-match.d.ts +53 -0
  182. package/dist/services/sync/graph-match.js +316 -0
  183. package/dist/services/sync/graph-match.js.map +1 -0
  184. package/dist/services/sync/graphrag-client.d.ts +43 -0
  185. package/dist/services/sync/graphrag-client.js +94 -0
  186. package/dist/services/sync/graphrag-client.js.map +1 -0
  187. package/dist/services/sync/graphrag-config.d.ts +16 -0
  188. package/dist/services/sync/graphrag-config.js +39 -0
  189. package/dist/services/sync/graphrag-config.js.map +1 -0
  190. package/dist/services/sync/graphrag-context.d.ts +14 -0
  191. package/dist/services/sync/graphrag-context.js +109 -0
  192. package/dist/services/sync/graphrag-context.js.map +1 -0
  193. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  194. package/dist/services/sync/graphrag-indexer.js +358 -0
  195. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  196. package/dist/services/sync/llm.d.ts +32 -0
  197. package/dist/services/sync/llm.js +115 -0
  198. package/dist/services/sync/llm.js.map +1 -0
  199. package/dist/services/sync/mcp-client.d.ts +59 -0
  200. package/dist/services/sync/mcp-client.js +285 -0
  201. package/dist/services/sync/mcp-client.js.map +1 -0
  202. package/dist/services/sync/model-factory.d.ts +10 -0
  203. package/dist/services/sync/model-factory.js +24 -0
  204. package/dist/services/sync/model-factory.js.map +1 -0
  205. package/dist/services/sync/name-quality.d.ts +31 -0
  206. package/dist/services/sync/name-quality.js +60 -0
  207. package/dist/services/sync/name-quality.js.map +1 -0
  208. package/dist/services/sync/output-schemas.d.ts +92 -0
  209. package/dist/services/sync/output-schemas.js +43 -0
  210. package/dist/services/sync/output-schemas.js.map +1 -0
  211. package/dist/services/sync/prompts.d.ts +19 -0
  212. package/dist/services/sync/prompts.js +128 -0
  213. package/dist/services/sync/prompts.js.map +1 -0
  214. package/dist/services/sync/reconciler.d.ts +48 -0
  215. package/dist/services/sync/reconciler.js +295 -0
  216. package/dist/services/sync/reconciler.js.map +1 -0
  217. package/dist/services/sync/source-config.d.ts +45 -0
  218. package/dist/services/sync/source-config.js +208 -0
  219. package/dist/services/sync/source-config.js.map +1 -0
  220. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  221. package/dist/services/sync/source-definitions/asana.js +48 -0
  222. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  223. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  224. package/dist/services/sync/source-definitions/definitions.js +26 -0
  225. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  226. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  227. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  228. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  229. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  230. package/dist/services/sync/source-definitions/granola.js +28 -0
  231. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  232. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  233. package/dist/services/sync/source-definitions/linear.js +60 -0
  234. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  235. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  236. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  237. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  238. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  239. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  240. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  241. package/dist/services/sync/staging.d.ts +53 -0
  242. package/dist/services/sync/staging.js +131 -0
  243. package/dist/services/sync/staging.js.map +1 -0
  244. package/dist/services/sync/structured-extractor.d.ts +49 -0
  245. package/dist/services/sync/structured-extractor.js +344 -0
  246. package/dist/services/sync/structured-extractor.js.map +1 -0
  247. package/dist/services/sync/sync-runner.d.ts +32 -0
  248. package/dist/services/sync/sync-runner.js +195 -0
  249. package/dist/services/sync/sync-runner.js.map +1 -0
  250. package/dist/services/sync/sync-state.d.ts +43 -0
  251. package/dist/services/sync/sync-state.js +154 -0
  252. package/dist/services/sync/sync-state.js.map +1 -0
  253. package/dist/services/sync/types.d.ts +203 -0
  254. package/dist/services/sync/types.js +8 -0
  255. package/dist/services/sync/types.js.map +1 -0
  256. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  257. package/dist/services/sync/unstructured-extractor.js +197 -0
  258. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  259. package/dist/services/vector-service.d.ts +11 -0
  260. package/dist/services/vector-service.js +42 -0
  261. package/dist/services/vector-service.js.map +1 -1
  262. package/dist/utils/git.d.ts +26 -4
  263. package/dist/utils/git.js +55 -7
  264. package/dist/utils/git.js.map +1 -1
  265. package/dist/utils/merge-resolver.d.ts +34 -0
  266. package/dist/utils/merge-resolver.js +201 -0
  267. package/dist/utils/merge-resolver.js.map +1 -0
  268. package/dist/utils/preflight.d.ts +2 -1
  269. package/dist/utils/preflight.js +8 -1
  270. package/dist/utils/preflight.js.map +1 -1
  271. package/dist/utils/workspace-config.d.ts +8 -0
  272. package/dist/utils/workspace-config.js +22 -0
  273. package/dist/utils/workspace-config.js.map +1 -0
  274. package/package.json +16 -7
  275. /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
@@ -1,19 +1,17 @@
1
1
  /**
2
- * studiograph deploy — guided deployment wizard
2
+ * studiograph deploy — automated deployment via provider APIs
3
3
  *
4
- * Currently supports Railway. Additional targets (Render, Fly) can be added
5
- * as subcommands following the same pattern.
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 { existsSync, readFileSync } from 'fs';
15
- import { join } from 'path';
16
- import { gitClone } from '../../utils/git.js';
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
- /** Inject a GitHub token into an https:// URL for authenticated clone. */
26
- function authedUrl(url, token) {
27
- return url.startsWith('https://')
28
- ? url.replace('https://', `https://${token}@`)
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
- function readWorkspaceRepos(configRepoUrl, githubToken) {
32
- // Clone to a temp path so we can read workspace.json
33
- const tmpDir = `/tmp/studiograph-deploy-${Date.now()}`;
34
- try {
35
- gitClone(authedUrl(configRepoUrl, githubToken), tmpDir);
36
- const jsonPath = join(tmpDir, 'workspace.json');
37
- if (!existsSync(jsonPath))
38
- return [];
39
- const config = JSON.parse(readFileSync(jsonPath, 'utf-8'));
40
- return (config.repos ?? []);
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
- catch {
43
- return [];
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('Guided setup wizard for deploying Studiograph to Railway')
53
- .action(async () => {
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
- log.message('This wizard walks you through deploying Studiograph to Railway in four steps.\n' +
56
- 'You\'ll need a Railway account (railway.app) and your GitHub repos set up.\n');
57
- // ── Step 1: GitHub token ──────────────────────────────────────────────
58
- log.step('Step 1 of 4 GitHub token');
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 githubToken === 'symbol') {
119
+ if (typeof railwayToken === 'symbol') {
71
120
  outro('Cancelled');
72
121
  process.exit(0);
73
122
  }
74
- // ── Step 2: Configuration ─────────────────────────────────────────────
75
- log.step('Step 2 of 4 — Workspace configuration');
76
- const configRepoUrl = await text({
77
- message: 'Config repo URL (your .studiograph GitHub repo)',
78
- placeholder: 'https://github.com/your-org/.studiograph.git',
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 configRepoUrl === 'symbol') {
142
+ if (typeof githubToken === 'symbol') {
82
143
  outro('Cancelled');
83
144
  process.exit(0);
84
145
  }
85
- const apiKeysInput = await text({
86
- message: 'API keys for client access (comma-separated, leave blank to skip)',
87
- placeholder: 'key1,key2',
88
- });
89
- if (typeof apiKeysInput === 'symbol') {
90
- outro('Cancelled');
91
- process.exit(0);
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 apiKeys = (apiKeysInput || '')
94
- .split(',')
95
- .map(k => k.trim())
96
- .filter(k => k.length > 0)
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 setup ─────────────────────────────────────────────
100
- log.step('Step 3 of 4 Railway project setup');
101
- log.message('Opening Railway — create a new project from this GitHub repo.\n');
102
- openBrowser('https://railway.app/new');
103
- log.message('In your Railway project:\n\n' +
104
- ' 1. Add a persistent volume and mount it at /workspace\n\n' +
105
- ' 2. Set the start command:\n' +
106
- ' studiograph serve\n\n' +
107
- ' 3. Set these environment variables:\n\n' +
108
- ` STUDIOGRAPH_CONFIG_REPO = ${configRepoUrl}\n` +
109
- ` GITHUB_TOKEN = ${githubToken}\n` +
110
- (apiKeys ? ` API_KEYS = ${apiKeys}\n` : '') +
111
- ` WEBHOOK_SECRET = ${webhookSecret}\n` +
112
- ' PORT = 3001\n');
113
- await confirm({ message: 'Done setting up Railway? Press Enter to continue.' });
114
- // ── Step 4: GitHub webhooks ───────────────────────────────────────────
115
- log.step('Step 4 of 4 — GitHub webhooks');
116
- log.message('Reading your workspace repos to generate webhook URLs...');
117
- const s = spinner();
118
- s.start('Cloning config repo to read workspace.json...');
119
- const repos = readWorkspaceRepos(configRepoUrl, githubToken.trim());
120
- s.stop(repos.length > 0 ? `Found ${repos.length} repos` : 'Could not read repos enter your Railway URL manually');
121
- const railwayUrl = await text({
122
- message: 'Your Railway app URL',
123
- placeholder: 'https://your-app.up.railway.app',
124
- validate: (v) => v.trim() ? undefined : 'Required',
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 yetavoids 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
- if (typeof railwayUrl === 'symbol') {
127
- outro('Cancelled');
128
- process.exit(0);
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
- const webhookUrl = `${railwayUrl.replace(/\/$/, '')}/webhooks/github`;
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":"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"}
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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"}