studiograph 1.1.2 → 1.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +301 -10
  3. package/dist/agent/orchestrator.d.ts +17 -9
  4. package/dist/agent/orchestrator.js +142 -97
  5. package/dist/agent/orchestrator.js.map +1 -1
  6. package/dist/agent/prompts/system.md +186 -0
  7. package/dist/agent/skill-loader.d.ts +48 -0
  8. package/dist/agent/skill-loader.js +166 -0
  9. package/dist/agent/skill-loader.js.map +1 -0
  10. package/dist/agent/skills/enrich-entities.md +136 -0
  11. package/dist/agent/skills/entity-schema.md +502 -0
  12. package/dist/agent/skills/gather-context.md +46 -0
  13. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  14. package/dist/agent/skills/skill-loader.d.ts +48 -0
  15. package/dist/agent/skills/skill-loader.js +166 -0
  16. package/dist/agent/skills/skill-loader.js.map +1 -0
  17. package/dist/agent/skills/sync-configuration.md +144 -0
  18. package/dist/agent/skills/sync-setup.md +68 -0
  19. package/dist/agent/tools/connector-tools.d.ts +37 -0
  20. package/dist/agent/tools/connector-tools.js +132 -0
  21. package/dist/agent/tools/connector-tools.js.map +1 -0
  22. package/dist/agent/tools/fs-tools.d.ts +39 -0
  23. package/dist/agent/tools/fs-tools.js +106 -0
  24. package/dist/agent/tools/fs-tools.js.map +1 -0
  25. package/dist/agent/tools/graph-tools.d.ts +30 -2
  26. package/dist/agent/tools/graph-tools.js +154 -37
  27. package/dist/agent/tools/graph-tools.js.map +1 -1
  28. package/dist/agent/tools/load-skill.d.ts +42 -0
  29. package/dist/agent/tools/load-skill.js +45 -0
  30. package/dist/agent/tools/load-skill.js.map +1 -0
  31. package/dist/agent/tools/sync-tools.d.ts +25 -0
  32. package/dist/agent/tools/sync-tools.js +691 -0
  33. package/dist/agent/tools/sync-tools.js.map +1 -0
  34. package/dist/agent/tools/tool-loader.d.ts +25 -0
  35. package/dist/agent/tools/tool-loader.js +73 -0
  36. package/dist/agent/tools/tool-loader.js.map +1 -0
  37. package/dist/auth/github.d.ts +11 -8
  38. package/dist/auth/github.js +56 -75
  39. package/dist/auth/github.js.map +1 -1
  40. package/dist/cli/colors.d.ts +54 -0
  41. package/dist/cli/colors.js +133 -0
  42. package/dist/cli/colors.js.map +1 -0
  43. package/dist/cli/commands/app.d.ts +7 -0
  44. package/dist/cli/commands/app.js +167 -0
  45. package/dist/cli/commands/app.js.map +1 -0
  46. package/dist/cli/commands/auth.d.ts +1 -1
  47. package/dist/cli/commands/auth.js +26 -10
  48. package/dist/cli/commands/auth.js.map +1 -1
  49. package/dist/cli/commands/clone.d.ts +9 -0
  50. package/dist/cli/commands/clone.js +167 -0
  51. package/dist/cli/commands/clone.js.map +1 -0
  52. package/dist/cli/commands/commit.d.ts +8 -0
  53. package/dist/cli/commands/commit.js +43 -0
  54. package/dist/cli/commands/commit.js.map +1 -0
  55. package/dist/cli/commands/config.d.ts +13 -0
  56. package/dist/cli/commands/config.js +276 -0
  57. package/dist/cli/commands/config.js.map +1 -0
  58. package/dist/cli/commands/connector.d.ts +33 -0
  59. package/dist/cli/commands/connector.js +178 -0
  60. package/dist/cli/commands/connector.js.map +1 -0
  61. package/dist/cli/commands/deploy.d.ts +11 -0
  62. package/dist/cli/commands/deploy.js +153 -0
  63. package/dist/cli/commands/deploy.js.map +1 -0
  64. package/dist/cli/commands/enrich.d.ts +11 -0
  65. package/dist/cli/commands/enrich.js +135 -0
  66. package/dist/cli/commands/enrich.js.map +1 -0
  67. package/dist/cli/commands/graphrag.d.ts +12 -0
  68. package/dist/cli/commands/graphrag.js +122 -0
  69. package/dist/cli/commands/graphrag.js.map +1 -0
  70. package/dist/cli/commands/index.d.ts +15 -0
  71. package/dist/cli/commands/index.js +117 -0
  72. package/dist/cli/commands/index.js.map +1 -0
  73. package/dist/cli/commands/init.js +110 -210
  74. package/dist/cli/commands/init.js.map +1 -1
  75. package/dist/cli/commands/join.js +89 -24
  76. package/dist/cli/commands/join.js.map +1 -1
  77. package/dist/cli/commands/lint.d.ts +8 -0
  78. package/dist/cli/commands/lint.js +70 -0
  79. package/dist/cli/commands/lint.js.map +1 -0
  80. package/dist/cli/commands/mcp.d.ts +27 -0
  81. package/dist/cli/commands/mcp.js +56 -0
  82. package/dist/cli/commands/mcp.js.map +1 -0
  83. package/dist/cli/commands/orphans.d.ts +8 -0
  84. package/dist/cli/commands/orphans.js +125 -0
  85. package/dist/cli/commands/orphans.js.map +1 -0
  86. package/dist/cli/commands/provision.d.ts +8 -0
  87. package/dist/cli/commands/provision.js +116 -0
  88. package/dist/cli/commands/provision.js.map +1 -0
  89. package/dist/cli/commands/r2.d.ts +2 -0
  90. package/dist/cli/commands/r2.js +87 -6
  91. package/dist/cli/commands/r2.js.map +1 -1
  92. package/dist/cli/commands/reset.d.ts +12 -0
  93. package/dist/cli/commands/reset.js +137 -0
  94. package/dist/cli/commands/reset.js.map +1 -0
  95. package/dist/cli/commands/review.d.ts +19 -0
  96. package/dist/cli/commands/review.js +128 -0
  97. package/dist/cli/commands/review.js.map +1 -0
  98. package/dist/cli/commands/serve.js +47 -2
  99. package/dist/cli/commands/serve.js.map +1 -1
  100. package/dist/cli/commands/source.d.ts +16 -0
  101. package/dist/cli/commands/source.js +159 -0
  102. package/dist/cli/commands/source.js.map +1 -0
  103. package/dist/cli/commands/start.js +472 -103
  104. package/dist/cli/commands/start.js.map +1 -1
  105. package/dist/cli/commands/sync-entities.d.ts +13 -0
  106. package/dist/cli/commands/sync-entities.js +242 -0
  107. package/dist/cli/commands/sync-entities.js.map +1 -0
  108. package/dist/cli/commands/sync.js +40 -9
  109. package/dist/cli/commands/sync.js.map +1 -1
  110. package/dist/cli/commands/update.d.ts +8 -0
  111. package/dist/cli/commands/update.js +155 -0
  112. package/dist/cli/commands/update.js.map +1 -0
  113. package/dist/cli/index.js +114 -3
  114. package/dist/cli/index.js.map +1 -1
  115. package/dist/cli/scaffolding.d.ts +10 -0
  116. package/dist/cli/scaffolding.js +302 -0
  117. package/dist/cli/scaffolding.js.map +1 -0
  118. package/dist/cli/setup-wizard.d.ts +30 -0
  119. package/dist/cli/setup-wizard.js +244 -0
  120. package/dist/cli/setup-wizard.js.map +1 -0
  121. package/dist/cli/sync-review-interactive.d.ts +31 -0
  122. package/dist/cli/sync-review-interactive.js +393 -0
  123. package/dist/cli/sync-review-interactive.js.map +1 -0
  124. package/dist/cli/theme.d.ts +31 -0
  125. package/dist/cli/theme.js +116 -0
  126. package/dist/cli/theme.js.map +1 -0
  127. package/dist/core/graph.d.ts +16 -9
  128. package/dist/core/graph.js +263 -145
  129. package/dist/core/graph.js.map +1 -1
  130. package/dist/core/migration-runner.d.ts +42 -0
  131. package/dist/core/migration-runner.js +232 -0
  132. package/dist/core/migration-runner.js.map +1 -0
  133. package/dist/core/migration-types.d.ts +101 -0
  134. package/dist/core/migration-types.js +21 -0
  135. package/dist/core/migration-types.js.map +1 -0
  136. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  137. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  138. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  139. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  140. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  141. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  142. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  143. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  144. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  145. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  146. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  147. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  148. package/dist/core/migrations/index.d.ts +11 -0
  149. package/dist/core/migrations/index.js +23 -0
  150. package/dist/core/migrations/index.js.map +1 -0
  151. package/dist/core/schema-registry.d.ts +36 -0
  152. package/dist/core/schema-registry.js +161 -0
  153. package/dist/core/schema-registry.js.map +1 -0
  154. package/dist/core/types.d.ts +242 -3
  155. package/dist/core/types.js +21 -2
  156. package/dist/core/types.js.map +1 -1
  157. package/dist/core/user-config.d.ts +16 -0
  158. package/dist/core/user-config.js +8 -0
  159. package/dist/core/user-config.js.map +1 -1
  160. package/dist/core/validation.d.ts +973 -32
  161. package/dist/core/validation.js +163 -4
  162. package/dist/core/validation.js.map +1 -1
  163. package/dist/core/workspace-manager.d.ts +26 -2
  164. package/dist/core/workspace-manager.js +113 -15
  165. package/dist/core/workspace-manager.js.map +1 -1
  166. package/dist/core/workspace.d.ts +20 -11
  167. package/dist/core/workspace.js +123 -34
  168. package/dist/core/workspace.js.map +1 -1
  169. package/dist/mcp/connector-manager.d.ts +65 -0
  170. package/dist/mcp/connector-manager.js +223 -0
  171. package/dist/mcp/connector-manager.js.map +1 -0
  172. package/dist/mcp/connectors/asana.d.ts +2 -0
  173. package/dist/mcp/connectors/asana.js +20 -0
  174. package/dist/mcp/connectors/asana.js.map +1 -0
  175. package/dist/mcp/connectors/definitions.d.ts +45 -0
  176. package/dist/mcp/connectors/definitions.js +32 -0
  177. package/dist/mcp/connectors/definitions.js.map +1 -0
  178. package/dist/mcp/connectors/figma.d.ts +5 -0
  179. package/dist/mcp/connectors/figma.js +21 -0
  180. package/dist/mcp/connectors/figma.js.map +1 -0
  181. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  182. package/dist/mcp/connectors/gdrive.js +20 -0
  183. package/dist/mcp/connectors/gdrive.js.map +1 -0
  184. package/dist/mcp/connectors/granola.d.ts +2 -0
  185. package/dist/mcp/connectors/granola.js +12 -0
  186. package/dist/mcp/connectors/granola.js.map +1 -0
  187. package/dist/mcp/connectors/linear.d.ts +2 -0
  188. package/dist/mcp/connectors/linear.js +19 -0
  189. package/dist/mcp/connectors/linear.js.map +1 -0
  190. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  191. package/dist/mcp/connectors/obsidian.js +19 -0
  192. package/dist/mcp/connectors/obsidian.js.map +1 -0
  193. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  194. package/dist/mcp/connectors/pipedrive.js +20 -0
  195. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  196. package/dist/mcp/connectors/slack.d.ts +2 -0
  197. package/dist/mcp/connectors/slack.js +21 -0
  198. package/dist/mcp/connectors/slack.js.map +1 -0
  199. package/dist/mcp/oauth-provider.d.ts +41 -0
  200. package/dist/mcp/oauth-provider.js +160 -0
  201. package/dist/mcp/oauth-provider.js.map +1 -0
  202. package/dist/mcp/server.d.ts +11 -0
  203. package/dist/mcp/server.js +28 -0
  204. package/dist/mcp/server.js.map +1 -0
  205. package/dist/mcp/tools.d.ts +14 -0
  206. package/dist/mcp/tools.js +172 -0
  207. package/dist/mcp/tools.js.map +1 -0
  208. package/dist/server/index.js +17 -4
  209. package/dist/server/index.js.map +1 -1
  210. package/dist/server/plugin-loader.d.ts +15 -0
  211. package/dist/server/plugin-loader.js +68 -2
  212. package/dist/server/plugin-loader.js.map +1 -1
  213. package/dist/server/routes/graph-api.js +1 -1
  214. package/dist/server/routes/graph-api.js.map +1 -1
  215. package/dist/server/routes/webhook.js +33 -0
  216. package/dist/server/routes/webhook.js.map +1 -1
  217. package/dist/services/github-provisioner.d.ts +9 -3
  218. package/dist/services/github-provisioner.js +46 -8
  219. package/dist/services/github-provisioner.js.map +1 -1
  220. package/dist/services/lint-service.d.ts +27 -0
  221. package/dist/services/lint-service.js +83 -0
  222. package/dist/services/lint-service.js.map +1 -0
  223. package/dist/services/markdown.d.ts +9 -0
  224. package/dist/services/markdown.js +26 -5
  225. package/dist/services/markdown.js.map +1 -1
  226. package/dist/services/memory-service.d.ts +1 -2
  227. package/dist/services/memory-service.js +5 -4
  228. package/dist/services/memory-service.js.map +1 -1
  229. package/dist/services/orphan-service.d.ts +31 -0
  230. package/dist/services/orphan-service.js +100 -0
  231. package/dist/services/orphan-service.js.map +1 -0
  232. package/dist/services/sync/commit.d.ts +58 -0
  233. package/dist/services/sync/commit.js +350 -0
  234. package/dist/services/sync/commit.js.map +1 -0
  235. package/dist/services/sync/context-index.d.ts +69 -0
  236. package/dist/services/sync/context-index.js +280 -0
  237. package/dist/services/sync/context-index.js.map +1 -0
  238. package/dist/services/sync/derive.d.ts +34 -0
  239. package/dist/services/sync/derive.js +164 -0
  240. package/dist/services/sync/derive.js.map +1 -0
  241. package/dist/services/sync/enrichment-state.d.ts +31 -0
  242. package/dist/services/sync/enrichment-state.js +63 -0
  243. package/dist/services/sync/enrichment-state.js.map +1 -0
  244. package/dist/services/sync/enrichment.d.ts +25 -0
  245. package/dist/services/sync/enrichment.js +121 -0
  246. package/dist/services/sync/enrichment.js.map +1 -0
  247. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  248. package/dist/services/sync/frontmatter-extractor.js +273 -0
  249. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  250. package/dist/services/sync/graph-match-state.d.ts +33 -0
  251. package/dist/services/sync/graph-match-state.js +61 -0
  252. package/dist/services/sync/graph-match-state.js.map +1 -0
  253. package/dist/services/sync/graph-match.d.ts +53 -0
  254. package/dist/services/sync/graph-match.js +316 -0
  255. package/dist/services/sync/graph-match.js.map +1 -0
  256. package/dist/services/sync/graphrag-client.d.ts +43 -0
  257. package/dist/services/sync/graphrag-client.js +94 -0
  258. package/dist/services/sync/graphrag-client.js.map +1 -0
  259. package/dist/services/sync/graphrag-config.d.ts +16 -0
  260. package/dist/services/sync/graphrag-config.js +39 -0
  261. package/dist/services/sync/graphrag-config.js.map +1 -0
  262. package/dist/services/sync/graphrag-context.d.ts +14 -0
  263. package/dist/services/sync/graphrag-context.js +109 -0
  264. package/dist/services/sync/graphrag-context.js.map +1 -0
  265. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  266. package/dist/services/sync/graphrag-indexer.js +358 -0
  267. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  268. package/dist/services/sync/llm.d.ts +32 -0
  269. package/dist/services/sync/llm.js +115 -0
  270. package/dist/services/sync/llm.js.map +1 -0
  271. package/dist/services/sync/mcp-client.d.ts +59 -0
  272. package/dist/services/sync/mcp-client.js +285 -0
  273. package/dist/services/sync/mcp-client.js.map +1 -0
  274. package/dist/services/sync/model-factory.d.ts +10 -0
  275. package/dist/services/sync/model-factory.js +24 -0
  276. package/dist/services/sync/model-factory.js.map +1 -0
  277. package/dist/services/sync/name-quality.d.ts +31 -0
  278. package/dist/services/sync/name-quality.js +60 -0
  279. package/dist/services/sync/name-quality.js.map +1 -0
  280. package/dist/services/sync/output-schemas.d.ts +92 -0
  281. package/dist/services/sync/output-schemas.js +43 -0
  282. package/dist/services/sync/output-schemas.js.map +1 -0
  283. package/dist/services/sync/prompts.d.ts +19 -0
  284. package/dist/services/sync/prompts.js +128 -0
  285. package/dist/services/sync/prompts.js.map +1 -0
  286. package/dist/services/sync/reconciler.d.ts +48 -0
  287. package/dist/services/sync/reconciler.js +295 -0
  288. package/dist/services/sync/reconciler.js.map +1 -0
  289. package/dist/services/sync/source-config.d.ts +45 -0
  290. package/dist/services/sync/source-config.js +208 -0
  291. package/dist/services/sync/source-config.js.map +1 -0
  292. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  293. package/dist/services/sync/source-definitions/asana.js +48 -0
  294. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  295. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  296. package/dist/services/sync/source-definitions/definitions.js +26 -0
  297. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  298. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  299. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  300. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  301. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  302. package/dist/services/sync/source-definitions/granola.js +28 -0
  303. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  304. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  305. package/dist/services/sync/source-definitions/linear.js +60 -0
  306. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  307. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  308. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  309. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  310. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  311. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  312. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  313. package/dist/services/sync/staging.d.ts +53 -0
  314. package/dist/services/sync/staging.js +131 -0
  315. package/dist/services/sync/staging.js.map +1 -0
  316. package/dist/services/sync/structured-extractor.d.ts +49 -0
  317. package/dist/services/sync/structured-extractor.js +344 -0
  318. package/dist/services/sync/structured-extractor.js.map +1 -0
  319. package/dist/services/sync/sync-runner.d.ts +32 -0
  320. package/dist/services/sync/sync-runner.js +195 -0
  321. package/dist/services/sync/sync-runner.js.map +1 -0
  322. package/dist/services/sync/sync-state.d.ts +43 -0
  323. package/dist/services/sync/sync-state.js +154 -0
  324. package/dist/services/sync/sync-state.js.map +1 -0
  325. package/dist/services/sync/types.d.ts +203 -0
  326. package/dist/services/sync/types.js +8 -0
  327. package/dist/services/sync/types.js.map +1 -0
  328. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  329. package/dist/services/sync/unstructured-extractor.js +197 -0
  330. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  331. package/dist/services/vector-service.d.ts +88 -0
  332. package/dist/services/vector-service.js +322 -0
  333. package/dist/services/vector-service.js.map +1 -0
  334. package/dist/utils/git.d.ts +26 -4
  335. package/dist/utils/git.js +55 -7
  336. package/dist/utils/git.js.map +1 -1
  337. package/dist/utils/merge-resolver.d.ts +34 -0
  338. package/dist/utils/merge-resolver.js +201 -0
  339. package/dist/utils/merge-resolver.js.map +1 -0
  340. package/dist/utils/preflight.d.ts +2 -1
  341. package/dist/utils/preflight.js +8 -1
  342. package/dist/utils/preflight.js.map +1 -1
  343. package/dist/utils/version-checker.d.ts +23 -0
  344. package/dist/utils/version-checker.js +116 -0
  345. package/dist/utils/version-checker.js.map +1 -0
  346. package/dist/utils/workspace-config.d.ts +8 -0
  347. package/dist/utils/workspace-config.js +22 -0
  348. package/dist/utils/workspace-config.js.map +1 -0
  349. package/package.json +24 -11
@@ -0,0 +1,153 @@
1
+ /**
2
+ * studiograph deploy — guided deployment wizard
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
9
+ */
10
+ import { Command } from 'commander';
11
+ import { intro, outro, text, confirm, log, spinner } from '@clack/prompts';
12
+ import { randomBytes } from 'crypto';
13
+ import { spawnSync } from 'child_process';
14
+ import { existsSync, readFileSync } from 'fs';
15
+ import { join } from 'path';
16
+ import { gitClone } from '../../utils/git.js';
17
+ // ── helpers ──────────────────────────────────────────────────────────────────
18
+ function openBrowser(url) {
19
+ const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
20
+ spawnSync(cmd, [url], { stdio: 'ignore' });
21
+ }
22
+ function generateSecret() {
23
+ return randomBytes(20).toString('hex');
24
+ }
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;
30
+ }
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 ?? []);
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ // ── deploy command group ──────────────────────────────────────────────────────
47
+ export const deployCommand = new Command('deploy')
48
+ .description('Deploy Studiograph to a hosting platform');
49
+ // ── studiograph deploy railway ────────────────────────────────────────────────
50
+ deployCommand
51
+ .command('railway')
52
+ .description('Guided setup wizard for deploying Studiograph to Railway')
53
+ .action(async () => {
54
+ 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_...',
68
+ validate: (v) => v.trim() ? undefined : 'Required',
69
+ });
70
+ if (typeof githubToken === 'symbol') {
71
+ outro('Cancelled');
72
+ process.exit(0);
73
+ }
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',
79
+ validate: (v) => v.trim() ? undefined : 'Required',
80
+ });
81
+ if (typeof configRepoUrl === 'symbol') {
82
+ outro('Cancelled');
83
+ process.exit(0);
84
+ }
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);
92
+ }
93
+ const apiKeys = (apiKeysInput || '')
94
+ .split(',')
95
+ .map(k => k.trim())
96
+ .filter(k => k.length > 0)
97
+ .join(';');
98
+ 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',
125
+ });
126
+ if (typeof railwayUrl === 'symbol') {
127
+ outro('Cancelled');
128
+ process.exit(0);
129
+ }
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.');
152
+ });
153
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * studiograph graphrag
3
+ *
4
+ * Manage the in-process knowledge graph for cross-document entity context.
5
+ *
6
+ * studiograph graphrag setup — enable GraphRAG
7
+ * studiograph graphrag index <path> — index a directory of markdown files
8
+ * studiograph graphrag status — show graph stats
9
+ * studiograph graphrag query <name> — look up an entity and its neighbors
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare const graphragCommand: Command;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * studiograph graphrag
3
+ *
4
+ * Manage the in-process knowledge graph for cross-document entity context.
5
+ *
6
+ * studiograph graphrag setup — enable GraphRAG
7
+ * studiograph graphrag index <path> — index a directory of markdown files
8
+ * studiograph graphrag status — show graph stats
9
+ * studiograph graphrag query <name> — look up an entity and its neighbors
10
+ */
11
+ import { Command } from 'commander';
12
+ import { loadGraphRAGConfig, saveGraphRAGConfig, } from '../../services/sync/graphrag-config.js';
13
+ import { indexIntoGraphRAG } from '../../services/sync/graphrag-indexer.js';
14
+ import { GraphRAGClient } from '../../services/sync/graphrag-client.js';
15
+ export const graphragCommand = new Command('graphrag')
16
+ .description('Manage the knowledge graph for cross-document context');
17
+ // ── setup ───────────────────────────────────────────────────────────────────
18
+ graphragCommand
19
+ .command('setup')
20
+ .description('Enable GraphRAG and configure graph path')
21
+ .option('--graph-path <path>', 'Custom path for graph.json')
22
+ .action(async (opts) => {
23
+ const config = loadGraphRAGConfig();
24
+ config.enabled = true;
25
+ if (opts.graphPath) {
26
+ config.graph_path = opts.graphPath;
27
+ }
28
+ saveGraphRAGConfig(config);
29
+ console.log('GraphRAG enabled.');
30
+ console.log(`Graph path: ${config.graph_path}`);
31
+ console.log('\nNext: studiograph graphrag index <path>');
32
+ });
33
+ // ── index ───────────────────────────────────────────────────────────────────
34
+ graphragCommand
35
+ .command('index <path>')
36
+ .description('Index markdown files from a directory into the knowledge graph')
37
+ .option('--incremental', 'Merge into existing graph instead of replacing')
38
+ .action(async (sourcePath, opts) => {
39
+ const config = loadGraphRAGConfig();
40
+ if (!config.enabled) {
41
+ console.error('GraphRAG is not enabled. Run: studiograph graphrag setup');
42
+ process.exit(1);
43
+ }
44
+ try {
45
+ const result = await indexIntoGraphRAG({
46
+ sourcePath,
47
+ config,
48
+ incremental: opts.incremental,
49
+ onProgress: (msg) => console.log(msg),
50
+ });
51
+ console.log(`\nDone: ${result.files_processed} files → ${result.entities_extracted} entities, ${result.relationships_extracted} relationships`);
52
+ }
53
+ catch (err) {
54
+ console.error('Indexing failed:', err instanceof Error ? err.message : String(err));
55
+ process.exit(1);
56
+ }
57
+ });
58
+ // ── status ──────────────────────────────────────────────────────────────────
59
+ graphragCommand
60
+ .command('status')
61
+ .description('Show knowledge graph stats')
62
+ .action(async () => {
63
+ const config = loadGraphRAGConfig();
64
+ console.log(`Enabled: ${config.enabled}`);
65
+ console.log(`Graph path: ${config.graph_path}`);
66
+ if (!config.enabled)
67
+ return;
68
+ try {
69
+ const client = new GraphRAGClient(config);
70
+ const stats = client.getStats();
71
+ console.log(`\nNodes: ${stats.nodes}`);
72
+ console.log(`Edges: ${stats.edges}`);
73
+ if (stats.types.length > 0) {
74
+ console.log(`Entity types: ${stats.types.join(', ')}`);
75
+ }
76
+ if (config.last_indexed) {
77
+ console.log(`Last indexed: ${config.last_indexed}`);
78
+ }
79
+ if (config.files_indexed) {
80
+ console.log(`Files indexed: ${config.files_indexed}`);
81
+ }
82
+ }
83
+ catch (err) {
84
+ console.error('Could not load graph:', err instanceof Error ? err.message : String(err));
85
+ }
86
+ });
87
+ // ── query ───────────────────────────────────────────────────────────────────
88
+ graphragCommand
89
+ .command('query <name>')
90
+ .description('Look up an entity and show its neighbors')
91
+ .action(async (name) => {
92
+ const config = loadGraphRAGConfig();
93
+ if (!config.enabled) {
94
+ console.error('GraphRAG is not enabled. Run: studiograph graphrag setup');
95
+ process.exit(1);
96
+ }
97
+ const client = new GraphRAGClient(config);
98
+ const result = client.queryNode(name);
99
+ if (!result) {
100
+ console.log(`No entity found matching "${name}"`);
101
+ return;
102
+ }
103
+ console.log(`\n${result.node.name} (${result.node.type})`);
104
+ if (result.node.description) {
105
+ console.log(` ${result.node.description}`);
106
+ }
107
+ if (result.neighbors.length > 0) {
108
+ console.log(`\nNeighbors (${result.neighbors.length}):`);
109
+ for (const n of result.neighbors) {
110
+ const desc = n.description ? ` — ${n.description}` : '';
111
+ console.log(` ${n.name} (${n.type})${desc}`);
112
+ }
113
+ }
114
+ if (result.edges.length > 0) {
115
+ console.log(`\nRelationships (${result.edges.length}):`);
116
+ for (const e of result.edges) {
117
+ const desc = e.description ? `: ${e.description}` : '';
118
+ console.log(` ${e.source} → ${e.target}${desc}`);
119
+ }
120
+ }
121
+ });
122
+ //# sourceMappingURL=graphrag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphrag.js","sourceRoot":"","sources":["../../../src/cli/commands/graphrag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * studiograph index command
3
+ *
4
+ * Bulk-indexes all entities across the workspace into LanceDB.
5
+ * On first run, optionally prompts for a Voyage AI API key to enable
6
+ * semantic search (Tier 2). Without a key, FTS-only indexing still runs.
7
+ *
8
+ * Safe to re-run — uses upsert, not insert.
9
+ *
10
+ * Usage:
11
+ * studiograph index # index all repos
12
+ * studiograph index --repo raa # single repo only
13
+ */
14
+ import { Command } from 'commander';
15
+ export declare const indexCommand: Command;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * studiograph index command
3
+ *
4
+ * Bulk-indexes all entities across the workspace into LanceDB.
5
+ * On first run, optionally prompts for a Voyage AI API key to enable
6
+ * semantic search (Tier 2). Without a key, FTS-only indexing still runs.
7
+ *
8
+ * Safe to re-run — uses upsert, not insert.
9
+ *
10
+ * Usage:
11
+ * studiograph index # index all repos
12
+ * studiograph index --repo raa # single repo only
13
+ */
14
+ import { Command } from 'commander';
15
+ import { join } from 'path';
16
+ import { homedir } from 'os';
17
+ import { select, text, spinner, log, outro } from '@clack/prompts';
18
+ import { Workspace } from '../../core/workspace.js';
19
+ import { loadUserConfig, saveUserConfig } from '../../core/user-config.js';
20
+ import { VectorService } from '../../services/vector-service.js';
21
+ import { BaseGraphManager } from '../../core/graph.js';
22
+ export const indexCommand = new Command('index')
23
+ .description('Index workspace entities for search (FTS + optional semantic search)')
24
+ .option('--repo <name>', 'Index a single repo only')
25
+ .action(async (opts) => {
26
+ const workspace = new Workspace();
27
+ if (!workspace.isWorkspace()) {
28
+ console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
29
+ process.exit(1);
30
+ }
31
+ const config = await workspace.loadConfig();
32
+ const userConfig = loadUserConfig();
33
+ // First-run: prompt for Voyage AI key if not configured
34
+ if (!userConfig.voyage_api_key) {
35
+ const choice = await select({
36
+ message: 'Enable semantic search? (optional — requires a Voyage AI API key)',
37
+ options: [
38
+ {
39
+ value: 'skip',
40
+ label: 'Skip — use keyword/FTS search only',
41
+ hint: 'Free, no setup required',
42
+ },
43
+ {
44
+ value: 'voyage',
45
+ label: 'Enable semantic search',
46
+ hint: 'Voyage AI key required — get one at voyageai.com',
47
+ },
48
+ ],
49
+ });
50
+ if (typeof choice === 'symbol') {
51
+ outro('Cancelled');
52
+ process.exit(0);
53
+ }
54
+ if (choice === 'voyage') {
55
+ const keyInput = await text({
56
+ message: 'Enter your Voyage AI API key:',
57
+ placeholder: 'pa-...',
58
+ validate: (value) => {
59
+ if (!value || value.length < 10)
60
+ return 'Key seems too short';
61
+ },
62
+ });
63
+ if (typeof keyInput !== 'string') {
64
+ outro('Cancelled');
65
+ process.exit(0);
66
+ }
67
+ userConfig.voyage_api_key = keyInput;
68
+ saveUserConfig(userConfig);
69
+ log.success('Voyage AI key saved');
70
+ }
71
+ }
72
+ const dbPath = userConfig.vector_db_path || join(homedir(), '.studiograph', 'vector');
73
+ const vectorService = new VectorService(dbPath, userConfig.voyage_api_key);
74
+ await vectorService.init();
75
+ const repos = opts.repo
76
+ ? config.repos.filter(r => r.name === opts.repo)
77
+ : config.repos;
78
+ if (opts.repo && repos.length === 0) {
79
+ console.error(`❌ Repo "${opts.repo}" not found in workspace`);
80
+ process.exit(1);
81
+ }
82
+ const s = spinner();
83
+ let totalIndexed = 0;
84
+ let totalWithVectors = 0;
85
+ for (const repo of repos) {
86
+ const repoPath = join(workspace.getWorkspacePath(), repo.path);
87
+ s.start(`Indexing ${repo.name}...`);
88
+ try {
89
+ const graph = new BaseGraphManager({
90
+ repoPath,
91
+ repoName: repo.name,
92
+ gitUser: { id: 'index', name: 'index', email: 'index@studiograph.local' },
93
+ });
94
+ const entities = graph.list();
95
+ if (entities.length === 0) {
96
+ s.stop(`${repo.name}: no entities`);
97
+ vectorService.setLastIndexedTime(repo.name);
98
+ continue;
99
+ }
100
+ s.message(`Indexing ${repo.name}: ${entities.length} entities...`);
101
+ await vectorService.upsertMany(repo.name, entities);
102
+ vectorService.setLastIndexedTime(repo.name);
103
+ const withVectors = userConfig.voyage_api_key ? entities.length : 0;
104
+ totalIndexed += entities.length;
105
+ totalWithVectors += withVectors;
106
+ s.stop(`${repo.name}: indexed ${entities.length} entities`);
107
+ }
108
+ catch (err) {
109
+ s.stop(`${repo.name}: failed — ${err instanceof Error ? err.message : 'unknown error'}`);
110
+ }
111
+ }
112
+ const vectorNote = userConfig.voyage_api_key
113
+ ? ` (${totalWithVectors} with semantic vectors)`
114
+ : ' (FTS only — add voyage_api_key to enable semantic search)';
115
+ outro(`✓ Indexed ${totalIndexed} entities across ${repos.length} repo${repos.length === 1 ? '' : 's'}${vectorNote}`);
116
+ });
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"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"}