studiograph 1.1.3 → 1.2.0-beta.10

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 (356) hide show
  1. package/README.md +2 -8
  2. package/dist/agent/orchestrator.d.ts +53 -0
  3. package/dist/agent/orchestrator.js +197 -12
  4. package/dist/agent/orchestrator.js.map +1 -1
  5. package/dist/agent/prompts/system.md +43 -11
  6. package/dist/agent/skill-loader.d.ts +48 -0
  7. package/dist/agent/skill-loader.js +166 -0
  8. package/dist/agent/skill-loader.js.map +1 -0
  9. package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
  10. package/dist/agent/skills/entity-schema.md +502 -0
  11. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  12. package/dist/agent/skills/sync-configuration.md +144 -0
  13. package/dist/agent/skills/sync-setup.md +84 -0
  14. package/dist/agent/tools/connector-tools.d.ts +37 -0
  15. package/dist/agent/tools/connector-tools.js +132 -0
  16. package/dist/agent/tools/connector-tools.js.map +1 -0
  17. package/dist/agent/tools/fs-tools.d.ts +39 -0
  18. package/dist/agent/tools/fs-tools.js +106 -0
  19. package/dist/agent/tools/fs-tools.js.map +1 -0
  20. package/dist/agent/tools/graph-tools.d.ts +33 -1
  21. package/dist/agent/tools/graph-tools.js +192 -44
  22. package/dist/agent/tools/graph-tools.js.map +1 -1
  23. package/dist/agent/tools/load-skill.d.ts +1 -1
  24. package/dist/agent/tools/load-skill.js +1 -1
  25. package/dist/agent/tools/load-skill.js.map +1 -1
  26. package/dist/agent/tools/ops-tools.d.ts +24 -0
  27. package/dist/agent/tools/ops-tools.js +542 -0
  28. package/dist/agent/tools/ops-tools.js.map +1 -0
  29. package/dist/agent/tools/sync-tools.d.ts +33 -0
  30. package/dist/agent/tools/sync-tools.js +947 -0
  31. package/dist/agent/tools/sync-tools.js.map +1 -0
  32. package/dist/auth/github.d.ts +11 -8
  33. package/dist/auth/github.js +56 -75
  34. package/dist/auth/github.js.map +1 -1
  35. package/dist/cli/colors.d.ts +54 -0
  36. package/dist/cli/colors.js +133 -0
  37. package/dist/cli/colors.js.map +1 -0
  38. package/dist/cli/commands/app.js +121 -18
  39. package/dist/cli/commands/app.js.map +1 -1
  40. package/dist/cli/commands/auth.d.ts +1 -1
  41. package/dist/cli/commands/auth.js +26 -10
  42. package/dist/cli/commands/auth.js.map +1 -1
  43. package/dist/cli/commands/clone.d.ts +9 -0
  44. package/dist/cli/commands/clone.js +167 -0
  45. package/dist/cli/commands/clone.js.map +1 -0
  46. package/dist/cli/commands/commit.d.ts +8 -0
  47. package/dist/cli/commands/commit.js +44 -0
  48. package/dist/cli/commands/commit.js.map +1 -0
  49. package/dist/cli/commands/connector.js +10 -2
  50. package/dist/cli/commands/connector.js.map +1 -1
  51. package/dist/cli/commands/deploy.d.ts +4 -6
  52. package/dist/cli/commands/deploy.js +292 -115
  53. package/dist/cli/commands/deploy.js.map +1 -1
  54. package/dist/cli/commands/enrich.d.ts +11 -0
  55. package/dist/cli/commands/enrich.js +135 -0
  56. package/dist/cli/commands/enrich.js.map +1 -0
  57. package/dist/cli/commands/graphrag.d.ts +12 -0
  58. package/dist/cli/commands/graphrag.js +122 -0
  59. package/dist/cli/commands/graphrag.js.map +1 -0
  60. package/dist/cli/commands/init.js +29 -196
  61. package/dist/cli/commands/init.js.map +1 -1
  62. package/dist/cli/commands/join.js +23 -3
  63. package/dist/cli/commands/join.js.map +1 -1
  64. package/dist/cli/commands/orphans.d.ts +8 -0
  65. package/dist/cli/commands/orphans.js +125 -0
  66. package/dist/cli/commands/orphans.js.map +1 -0
  67. package/dist/cli/commands/provision.js +11 -7
  68. package/dist/cli/commands/provision.js.map +1 -1
  69. package/dist/cli/commands/r2.js +8 -2
  70. package/dist/cli/commands/r2.js.map +1 -1
  71. package/dist/cli/commands/redeploy.d.ts +9 -0
  72. package/dist/cli/commands/redeploy.js +203 -0
  73. package/dist/cli/commands/redeploy.js.map +1 -0
  74. package/dist/cli/commands/reset.d.ts +12 -0
  75. package/dist/cli/commands/reset.js +137 -0
  76. package/dist/cli/commands/reset.js.map +1 -0
  77. package/dist/cli/commands/resolve.d.ts +8 -0
  78. package/dist/cli/commands/resolve.js +85 -0
  79. package/dist/cli/commands/resolve.js.map +1 -0
  80. package/dist/cli/commands/review.d.ts +19 -0
  81. package/dist/cli/commands/review.js +128 -0
  82. package/dist/cli/commands/review.js.map +1 -0
  83. package/dist/cli/commands/serve.js +55 -8
  84. package/dist/cli/commands/serve.js.map +1 -1
  85. package/dist/cli/commands/source.d.ts +16 -0
  86. package/dist/cli/commands/source.js +159 -0
  87. package/dist/cli/commands/source.js.map +1 -0
  88. package/dist/cli/commands/start.js +307 -55
  89. package/dist/cli/commands/start.js.map +1 -1
  90. package/dist/cli/commands/sync-entities.d.ts +13 -0
  91. package/dist/cli/commands/sync-entities.js +242 -0
  92. package/dist/cli/commands/sync-entities.js.map +1 -0
  93. package/dist/cli/commands/sync.js +81 -5
  94. package/dist/cli/commands/sync.js.map +1 -1
  95. package/dist/cli/index.js +45 -9
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/cli/scaffolding.d.ts +2 -1
  98. package/dist/cli/scaffolding.js +38 -23
  99. package/dist/cli/scaffolding.js.map +1 -1
  100. package/dist/cli/setup-wizard.d.ts +30 -0
  101. package/dist/cli/setup-wizard.js +244 -0
  102. package/dist/cli/setup-wizard.js.map +1 -0
  103. package/dist/cli/sync-review-interactive.d.ts +31 -0
  104. package/dist/cli/sync-review-interactive.js +393 -0
  105. package/dist/cli/sync-review-interactive.js.map +1 -0
  106. package/dist/cli/theme.d.ts +31 -0
  107. package/dist/cli/theme.js +116 -0
  108. package/dist/cli/theme.js.map +1 -0
  109. package/dist/core/graph.d.ts +40 -12
  110. package/dist/core/graph.js +344 -104
  111. package/dist/core/graph.js.map +1 -1
  112. package/dist/core/migration-runner.d.ts +4 -1
  113. package/dist/core/migration-runner.js +14 -3
  114. package/dist/core/migration-runner.js.map +1 -1
  115. package/dist/core/types.d.ts +2 -4
  116. package/dist/core/types.js +1 -2
  117. package/dist/core/types.js.map +1 -1
  118. package/dist/core/user-config.d.ts +12 -0
  119. package/dist/core/user-config.js.map +1 -1
  120. package/dist/core/workspace-manager.d.ts +6 -1
  121. package/dist/core/workspace-manager.js +29 -4
  122. package/dist/core/workspace-manager.js.map +1 -1
  123. package/dist/core/workspace.d.ts +13 -5
  124. package/dist/core/workspace.js +115 -33
  125. package/dist/core/workspace.js.map +1 -1
  126. package/dist/lib/lib/utils.d.ts +2 -0
  127. package/dist/lib/lib/utils.js +6 -0
  128. package/dist/lib/lib/utils.js.map +1 -0
  129. package/dist/mcp/connector-manager.d.ts +7 -3
  130. package/dist/mcp/connector-manager.js +61 -16
  131. package/dist/mcp/connector-manager.js.map +1 -1
  132. package/dist/mcp/connectors/asana.d.ts +2 -0
  133. package/dist/mcp/connectors/asana.js +20 -0
  134. package/dist/mcp/connectors/asana.js.map +1 -0
  135. package/dist/mcp/connectors/definitions.d.ts +3 -1
  136. package/dist/mcp/connectors/definitions.js +19 -127
  137. package/dist/mcp/connectors/definitions.js.map +1 -1
  138. package/dist/mcp/connectors/figma.d.ts +5 -0
  139. package/dist/mcp/connectors/figma.js +21 -0
  140. package/dist/mcp/connectors/figma.js.map +1 -0
  141. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  142. package/dist/mcp/connectors/gdrive.js +20 -0
  143. package/dist/mcp/connectors/gdrive.js.map +1 -0
  144. package/dist/mcp/connectors/granola.d.ts +2 -0
  145. package/dist/mcp/connectors/granola.js +12 -0
  146. package/dist/mcp/connectors/granola.js.map +1 -0
  147. package/dist/mcp/connectors/linear.d.ts +2 -0
  148. package/dist/mcp/connectors/linear.js +19 -0
  149. package/dist/mcp/connectors/linear.js.map +1 -0
  150. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  151. package/dist/mcp/connectors/obsidian.js +19 -0
  152. package/dist/mcp/connectors/obsidian.js.map +1 -0
  153. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  154. package/dist/mcp/connectors/pipedrive.js +20 -0
  155. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  156. package/dist/mcp/connectors/slack.d.ts +2 -0
  157. package/dist/mcp/connectors/slack.js +21 -0
  158. package/dist/mcp/connectors/slack.js.map +1 -0
  159. package/dist/mcp/oauth-provider.d.ts +41 -0
  160. package/dist/mcp/oauth-provider.js +160 -0
  161. package/dist/mcp/oauth-provider.js.map +1 -0
  162. package/dist/server/index.js +97 -11
  163. package/dist/server/index.js.map +1 -1
  164. package/dist/server/plugin-loader.d.ts +8 -0
  165. package/dist/server/plugin-loader.js +54 -2
  166. package/dist/server/plugin-loader.js.map +1 -1
  167. package/dist/server/routes/chat.d.ts +3 -2
  168. package/dist/server/routes/chat.js +67 -16
  169. package/dist/server/routes/chat.js.map +1 -1
  170. package/dist/server/routes/git-api.d.ts +9 -0
  171. package/dist/server/routes/git-api.js +82 -0
  172. package/dist/server/routes/git-api.js.map +1 -0
  173. package/dist/server/routes/graph-api.d.ts +2 -2
  174. package/dist/server/routes/graph-api.js +164 -3
  175. package/dist/server/routes/graph-api.js.map +1 -1
  176. package/dist/server/routes/workspace-api.d.ts +9 -0
  177. package/dist/server/routes/workspace-api.js +170 -0
  178. package/dist/server/routes/workspace-api.js.map +1 -0
  179. package/dist/services/assets/base.d.ts +2 -2
  180. package/dist/services/assets/base.js +4 -4
  181. package/dist/services/assets/base.js.map +1 -1
  182. package/dist/services/assets/index.d.ts +6 -6
  183. package/dist/services/assets/index.js +12 -12
  184. package/dist/services/assets/index.js.map +1 -1
  185. package/dist/services/git.d.ts +31 -0
  186. package/dist/services/git.js +92 -3
  187. package/dist/services/git.js.map +1 -1
  188. package/dist/services/github-provisioner.d.ts +8 -3
  189. package/dist/services/github-provisioner.js +35 -8
  190. package/dist/services/github-provisioner.js.map +1 -1
  191. package/dist/services/lint-service.js +8 -1
  192. package/dist/services/lint-service.js.map +1 -1
  193. package/dist/services/markdown.js +3 -3
  194. package/dist/services/markdown.js.map +1 -1
  195. package/dist/services/memory-service.d.ts +1 -1
  196. package/dist/services/memory-service.js +2 -3
  197. package/dist/services/memory-service.js.map +1 -1
  198. package/dist/services/orphan-service.d.ts +31 -0
  199. package/dist/services/orphan-service.js +100 -0
  200. package/dist/services/orphan-service.js.map +1 -0
  201. package/dist/services/sync/commit.d.ts +60 -0
  202. package/dist/services/sync/commit.js +370 -0
  203. package/dist/services/sync/commit.js.map +1 -0
  204. package/dist/services/sync/context-index.d.ts +69 -0
  205. package/dist/services/sync/context-index.js +280 -0
  206. package/dist/services/sync/context-index.js.map +1 -0
  207. package/dist/services/sync/derive.d.ts +34 -0
  208. package/dist/services/sync/derive.js +164 -0
  209. package/dist/services/sync/derive.js.map +1 -0
  210. package/dist/services/sync/enrichment-state.d.ts +31 -0
  211. package/dist/services/sync/enrichment-state.js +63 -0
  212. package/dist/services/sync/enrichment-state.js.map +1 -0
  213. package/dist/services/sync/enrichment.d.ts +25 -0
  214. package/dist/services/sync/enrichment.js +121 -0
  215. package/dist/services/sync/enrichment.js.map +1 -0
  216. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  217. package/dist/services/sync/frontmatter-extractor.js +273 -0
  218. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  219. package/dist/services/sync/graph-match-state.d.ts +33 -0
  220. package/dist/services/sync/graph-match-state.js +61 -0
  221. package/dist/services/sync/graph-match-state.js.map +1 -0
  222. package/dist/services/sync/graph-match.d.ts +53 -0
  223. package/dist/services/sync/graph-match.js +316 -0
  224. package/dist/services/sync/graph-match.js.map +1 -0
  225. package/dist/services/sync/graphrag-client.d.ts +43 -0
  226. package/dist/services/sync/graphrag-client.js +94 -0
  227. package/dist/services/sync/graphrag-client.js.map +1 -0
  228. package/dist/services/sync/graphrag-config.d.ts +16 -0
  229. package/dist/services/sync/graphrag-config.js +39 -0
  230. package/dist/services/sync/graphrag-config.js.map +1 -0
  231. package/dist/services/sync/graphrag-context.d.ts +14 -0
  232. package/dist/services/sync/graphrag-context.js +109 -0
  233. package/dist/services/sync/graphrag-context.js.map +1 -0
  234. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  235. package/dist/services/sync/graphrag-indexer.js +358 -0
  236. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  237. package/dist/services/sync/llm.d.ts +32 -0
  238. package/dist/services/sync/llm.js +115 -0
  239. package/dist/services/sync/llm.js.map +1 -0
  240. package/dist/services/sync/mcp-client.d.ts +59 -0
  241. package/dist/services/sync/mcp-client.js +285 -0
  242. package/dist/services/sync/mcp-client.js.map +1 -0
  243. package/dist/services/sync/model-factory.d.ts +10 -0
  244. package/dist/services/sync/model-factory.js +24 -0
  245. package/dist/services/sync/model-factory.js.map +1 -0
  246. package/dist/services/sync/name-quality.d.ts +31 -0
  247. package/dist/services/sync/name-quality.js +60 -0
  248. package/dist/services/sync/name-quality.js.map +1 -0
  249. package/dist/services/sync/output-schemas.d.ts +92 -0
  250. package/dist/services/sync/output-schemas.js +43 -0
  251. package/dist/services/sync/output-schemas.js.map +1 -0
  252. package/dist/services/sync/prompts.d.ts +19 -0
  253. package/dist/services/sync/prompts.js +128 -0
  254. package/dist/services/sync/prompts.js.map +1 -0
  255. package/dist/services/sync/reconciler.d.ts +48 -0
  256. package/dist/services/sync/reconciler.js +295 -0
  257. package/dist/services/sync/reconciler.js.map +1 -0
  258. package/dist/services/sync/source-config.d.ts +45 -0
  259. package/dist/services/sync/source-config.js +208 -0
  260. package/dist/services/sync/source-config.js.map +1 -0
  261. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  262. package/dist/services/sync/source-definitions/asana.js +48 -0
  263. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  264. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  265. package/dist/services/sync/source-definitions/definitions.js +26 -0
  266. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  267. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  268. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  269. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  270. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  271. package/dist/services/sync/source-definitions/granola.js +28 -0
  272. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  273. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  274. package/dist/services/sync/source-definitions/linear.js +60 -0
  275. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  276. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  277. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  278. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  279. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  280. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  281. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  282. package/dist/services/sync/staging.d.ts +53 -0
  283. package/dist/services/sync/staging.js +131 -0
  284. package/dist/services/sync/staging.js.map +1 -0
  285. package/dist/services/sync/structured-extractor.d.ts +49 -0
  286. package/dist/services/sync/structured-extractor.js +344 -0
  287. package/dist/services/sync/structured-extractor.js.map +1 -0
  288. package/dist/services/sync/sync-runner.d.ts +32 -0
  289. package/dist/services/sync/sync-runner.js +195 -0
  290. package/dist/services/sync/sync-runner.js.map +1 -0
  291. package/dist/services/sync/sync-state.d.ts +43 -0
  292. package/dist/services/sync/sync-state.js +154 -0
  293. package/dist/services/sync/sync-state.js.map +1 -0
  294. package/dist/services/sync/types.d.ts +203 -0
  295. package/dist/services/sync/types.js +8 -0
  296. package/dist/services/sync/types.js.map +1 -0
  297. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  298. package/dist/services/sync/unstructured-extractor.js +197 -0
  299. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  300. package/dist/services/vector-service.d.ts +11 -0
  301. package/dist/services/vector-service.js +42 -0
  302. package/dist/services/vector-service.js.map +1 -1
  303. package/dist/utils/git.d.ts +31 -4
  304. package/dist/utils/git.js +65 -7
  305. package/dist/utils/git.js.map +1 -1
  306. package/dist/utils/merge-resolver.d.ts +60 -0
  307. package/dist/utils/merge-resolver.js +304 -0
  308. package/dist/utils/merge-resolver.js.map +1 -0
  309. package/dist/utils/preflight.d.ts +2 -1
  310. package/dist/utils/preflight.js +8 -1
  311. package/dist/utils/preflight.js.map +1 -1
  312. package/dist/utils/workspace-config.d.ts +8 -0
  313. package/dist/utils/workspace-config.js +22 -0
  314. package/dist/utils/workspace-config.js.map +1 -0
  315. package/dist/web/_app/env.js +1 -0
  316. package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
  317. package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
  318. package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
  319. package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
  320. package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
  321. package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
  322. package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
  323. package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
  324. package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
  325. package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
  326. package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
  327. package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
  328. package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
  329. package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
  330. package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
  331. package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
  332. package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
  333. package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
  334. package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
  335. package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
  336. package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
  337. package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
  338. package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
  339. package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  340. package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
  341. package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
  342. package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
  343. package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
  344. package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
  345. package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
  346. package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
  347. package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
  348. package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
  349. package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
  350. package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
  351. package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
  352. package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
  353. package/dist/web/_app/version.json +1 -0
  354. package/dist/web/index.html +41 -0
  355. package/package.json +21 -7
  356. /package/dist/agent/skills/{bundled/gather-context.md → gather-context.md} +0 -0
@@ -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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"}
@@ -4,144 +4,26 @@
4
4
  * Initializes a new Studiograph workspace in the current directory
5
5
  */
6
6
  import { Command } from 'commander';
7
- import { intro, text, select, confirm, outro, spinner, log } from '@clack/prompts';
7
+ import { intro, text, confirm, outro, spinner, log } from '@clack/prompts';
8
8
  import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'fs';
9
9
  import { execSync } from 'child_process';
10
10
  import { join, resolve } from 'path';
11
11
  import { Workspace } from '../../core/workspace.js';
12
12
  import { RepoType } from '../../core/types.js';
13
- import { loadToken, runDeviceFlow, storeToken, getGitHubUser, getAuthenticatedOctokit } from '../../auth/github.js';
13
+ import { loadToken, promptForPAT, storeToken, getGitHubUser, getAuthenticatedOctokit } from '../../auth/github.js';
14
14
  import { provisionWorkspace } from '../../services/github-provisioner.js';
15
15
  import { runPreflight } from '../../utils/preflight.js';
16
- // Industry templates configuration
17
- const INDUSTRY_TEMPLATES = {
18
- 'design-studio': {
19
- name: 'Design & production studio',
20
- description: 'Product design teams, UX/UI agencies, design consultancies',
21
- pattern: 'client-centric',
22
- functionRepos: [
23
- { name: 'new-business', description: 'Proposals, pitches, and business development' },
24
- { name: 'accounting', description: 'Financials, billing, and budgets (restricted)' },
25
- { name: 'operations', description: 'Team capacity, processes, and policies' },
26
- ],
27
- sharedRepos: [
28
- { name: 'templates', description: 'Proposal templates, processes, and standards' },
29
- { name: 'design-systems', description: 'Reusable components, patterns, and tokens' },
30
- { name: 'research', description: 'Design references, techniques, and inspiration' },
31
- ],
32
- },
33
- 'marketing-agency': {
34
- name: 'Marketing & communications agency',
35
- description: 'Advertising, digital marketing, social, content, PR',
36
- pattern: 'project-centric',
37
- functionRepos: [
38
- { name: 'pitches', description: 'New business pitches and campaign proposals' },
39
- { name: 'media-planning', description: 'Media budgets, buys, and performance tracking' },
40
- { name: 'finance', description: 'Project budgets and billing (restricted)' },
41
- ],
42
- sharedRepos: [
43
- { name: 'brand-guidelines', description: 'Client brand standards and messaging' },
44
- { name: 'creative-library', description: 'Stock assets, campaign references, and tools' },
45
- { name: 'production-resources', description: 'Vendor database and production resources' },
46
- ],
47
- },
48
- 'content-shop': {
49
- name: 'Content & storytelling shop',
50
- description: 'Film/video production, editorial, podcast studios',
51
- pattern: 'project-centric',
52
- functionRepos: [
53
- { name: 'pitches', description: 'Content proposals and treatments' },
54
- { name: 'production-ops', description: 'Crew database, equipment, and schedules' },
55
- { name: 'finance', description: 'Production budgets and freelance rates (restricted)' },
56
- ],
57
- sharedRepos: [
58
- { name: 'editorial-guidelines', description: 'Voice, tone, and editorial standards' },
59
- { name: 'content-library', description: 'Stock footage, music, and graphics templates' },
60
- { name: 'reference-library', description: 'Film references and storytelling techniques' },
61
- ],
62
- },
63
- 'experiential-firm': {
64
- name: 'Experiential & environmental firm',
65
- description: 'Event/experiential agencies, exhibition design, installations',
66
- pattern: 'client-centric',
67
- functionRepos: [
68
- { name: 'business-development', description: 'Event proposals and exhibition pitches' },
69
- { name: 'production-management', description: 'Vendor coordination and installation planning' },
70
- { name: 'finance', description: 'Project budgets and vendor payments (restricted)' },
71
- ],
72
- sharedRepos: [
73
- { name: 'installation-library', description: 'Past installations and technical specs' },
74
- { name: 'vendor-database', description: 'Fabricators, AV vendors, and specialists' },
75
- { name: 'reference-library', description: 'Experiential examples and spatial design' },
76
- ],
77
- },
78
- 'digital-studio': {
79
- name: 'Digital product & technology studio',
80
- description: 'Web/app studios, product design + engineering firms',
81
- pattern: 'project-centric',
82
- functionRepos: [
83
- { name: 'proposals', description: 'SOWs, estimates, and technical proposals' },
84
- { name: 'operations', description: 'Capacity planning and sprint tracking' },
85
- { name: 'finance', description: 'Project budgets and contractor rates (restricted)' },
86
- ],
87
- sharedRepos: [
88
- { name: 'architecture', description: 'System design patterns and tech standards' },
89
- { name: 'codebase', description: 'Reusable components and integrations' },
90
- { name: 'product-references', description: 'Competitor analysis and UX patterns' },
91
- ],
92
- },
93
- 'consulting-firm': {
94
- name: 'Strategy, consulting & innovation firm',
95
- description: 'Brand/innovation consultancies, service design firms',
96
- pattern: 'client-centric',
97
- functionRepos: [
98
- { name: 'proposals', description: 'Strategic proposals and workshop proposals' },
99
- { name: 'research-ops', description: 'Research methodologies and participant recruiting' },
100
- { name: 'finance', description: 'Engagement budgets and billing (restricted)' },
101
- ],
102
- sharedRepos: [
103
- { name: 'frameworks', description: 'Strategy frameworks and innovation toolkits' },
104
- { name: 'research-library', description: 'Market research and competitive intelligence' },
105
- { name: 'case-studies', description: 'Past engagements and outcomes' },
106
- ],
107
- },
108
- 'architecture-studio': {
109
- name: 'Architecture studio',
110
- description: 'Architectural design practices',
111
- pattern: 'client-centric',
112
- functionRepos: [
113
- { name: 'proposals', description: 'RFPs, competition entries, and fee proposals' },
114
- { name: 'project-management', description: 'Construction admin and permitting' },
115
- { name: 'finance', description: 'Project budgets and consultant fees (restricted)' },
116
- ],
117
- sharedRepos: [
118
- { name: 'standards', description: 'Building codes and accessibility standards' },
119
- { name: 'details-library', description: 'Construction details and material specs' },
120
- { name: 'precedent-studies', description: 'Architectural references and site analyses' },
121
- ],
122
- },
123
- 'creative-tech': {
124
- name: 'Creative technology firm',
125
- description: 'Interactive/immersive studios, creative R&D labs',
126
- pattern: 'project-centric',
127
- functionRepos: [
128
- { name: 'proposals', description: 'R&D proposals and prototyping scopes' },
129
- { name: 'lab-operations', description: 'Equipment inventory and prototyping resources' },
130
- { name: 'finance', description: 'Project budgets and hardware costs (restricted)' },
131
- ],
132
- sharedRepos: [
133
- { name: 'technical-library', description: 'Code patterns and hardware specs' },
134
- { name: 'prototype-archive', description: 'Past experiments and learnings' },
135
- { name: 'tech-references', description: 'Emerging tech and academic papers' },
136
- ],
137
- },
138
- };
16
+ const TIER1_REPOS = [
17
+ { name: 'clients', description: 'Client organizations' },
18
+ { name: 'projects', description: 'Projects and engagements' },
19
+ { name: 'people', description: 'Contacts, team members, and stakeholders' },
20
+ { name: 'meetings', description: 'Meeting notes, agendas, and action items' },
21
+ ];
139
22
  export const initCommand = new Command('init')
140
23
  .description('Initialize a new Studiograph workspace')
141
24
  .argument('<team-name>', 'Name of your team (e.g., "Acme Studios")')
142
25
  .argument('[directory]', 'Directory to create workspace in (default: derived from team name, use "." for current directory)')
143
26
  .option('--bare', 'Create minimal workspace without scaffolding')
144
- .option('--template <type>', 'Firm template: design-studio, marketing-agency, content-shop, experiential-firm, digital-studio, consulting-firm, architecture-studio, creative-tech')
145
27
  .option('--github', 'Automatically create GitHub repos after init')
146
28
  .option('--github-org <org>', 'GitHub org to create repos in (implies --github)')
147
29
  .action(async (teamName, directory, options) => {
@@ -151,39 +33,6 @@ export const initCommand = new Command('init')
151
33
  process.exit(1);
152
34
  return;
153
35
  }
154
- let selectedTemplate = null;
155
- // Use --template flag if provided
156
- if (options.template) {
157
- const validTemplates = ['design-studio', 'marketing-agency', 'content-shop', 'experiential-firm', 'digital-studio', 'consulting-firm', 'architecture-studio', 'creative-tech'];
158
- if (!validTemplates.includes(options.template)) {
159
- outro(`❌ Invalid template: ${options.template}. Valid options: ${validTemplates.join(', ')}`);
160
- process.exit(1);
161
- }
162
- selectedTemplate = options.template;
163
- }
164
- // Skip template selection if --bare flag is used
165
- else if (!options.bare) {
166
- // Ask which type of creative firm
167
- const firmType = await select({
168
- message: 'What type of creative firm are you?',
169
- options: [
170
- { value: 'design-studio', label: 'Design & production studio', hint: 'Product design, UX/UI, branding' },
171
- { value: 'marketing-agency', label: 'Marketing & communications agency', hint: 'Advertising, digital marketing, PR' },
172
- { value: 'content-shop', label: 'Content & storytelling shop', hint: 'Film/video production, editorial' },
173
- { value: 'experiential-firm', label: 'Experiential & environmental firm', hint: 'Events, exhibitions, installations' },
174
- { value: 'digital-studio', label: 'Digital product & technology studio', hint: 'Web/app studios, product teams' },
175
- { value: 'consulting-firm', label: 'Strategy, consulting & innovation firm', hint: 'Brand consultancies, service design' },
176
- { value: 'architecture-studio', label: 'Architecture studio', hint: 'Architectural design practices' },
177
- { value: 'creative-tech', label: 'Creative technology firm', hint: 'Interactive, immersive, R&D labs' },
178
- { value: 'bare', label: 'Bare (custom setup)', hint: 'No scaffolding, build your own' },
179
- ],
180
- });
181
- if (typeof firmType === 'symbol' || !firmType) {
182
- outro('Cancelled');
183
- process.exit(0);
184
- }
185
- selectedTemplate = firmType === 'bare' ? null : firmType;
186
- }
187
36
  // Determine target directory
188
37
  let targetDir;
189
38
  if (directory === '.') {
@@ -232,6 +81,7 @@ export const initCommand = new Command('init')
232
81
  }
233
82
  // Initialize workspace
234
83
  const workspace = new Workspace(targetDir);
84
+ workspace.quietMigrations = true;
235
85
  const s = spinner();
236
86
  s.start('Creating workspace...');
237
87
  try {
@@ -254,27 +104,16 @@ export const initCommand = new Command('init')
254
104
  else {
255
105
  writeFileSync(gitignorePath, `${entry}\n`);
256
106
  }
257
- // If template selected, create repos
258
- if (selectedTemplate && INDUSTRY_TEMPLATES[selectedTemplate]) {
259
- const template = INDUSTRY_TEMPLATES[selectedTemplate];
260
- s.start(`Setting up ${template.name} repos...`);
261
- // Create function repos
262
- for (const repo of template.functionRepos) {
263
- await workspace.registerRepo({
264
- name: repo.name,
265
- type: RepoType.FUNCTION,
266
- description: repo.description,
267
- });
268
- }
269
- // Create shared resource repos
270
- for (const repo of template.sharedRepos) {
107
+ if (!options.bare) {
108
+ s.start('Creating core repos...');
109
+ for (const repo of TIER1_REPOS) {
271
110
  await workspace.registerRepo({
272
111
  name: repo.name,
273
- type: RepoType.SHARED_RESOURCE,
112
+ type: RepoType.PROJECT,
274
113
  description: repo.description,
275
114
  });
276
115
  }
277
- s.stop(`Created ${template.functionRepos.length + template.sharedRepos.length} repos`);
116
+ s.stop(`Created ${TIER1_REPOS.length} repos`);
278
117
  s.start('Creating example entities...');
279
118
  const { scaffoldExampleEntities } = await import('../scaffolding.js');
280
119
  await scaffoldExampleEntities(workspace, teamName);
@@ -284,18 +123,22 @@ export const initCommand = new Command('init')
284
123
  const wantsGitHub = options.githubOrg || options.github;
285
124
  let shouldProvision = wantsGitHub;
286
125
  if (!wantsGitHub) {
287
- const answer = await confirm({
288
- message: 'Would you like to create these repos on GitHub?',
289
- initialValue: false,
290
- });
291
- shouldProvision = answer === true;
126
+ // Only ask about GitHub if auth is already configured
127
+ const hasToken = !!loadToken();
128
+ if (hasToken) {
129
+ const answer = await confirm({
130
+ message: 'Would you like to create these repos on GitHub?',
131
+ initialValue: false,
132
+ });
133
+ shouldProvision = answer === true;
134
+ }
292
135
  }
293
136
  if (shouldProvision) {
294
137
  // Ensure we have a token
295
138
  let stored = loadToken();
296
139
  if (!stored) {
297
140
  log.info('No GitHub token found. Starting authentication...');
298
- const token = await runDeviceFlow();
141
+ const token = await promptForPAT();
299
142
  const user = await getGitHubUser(token);
300
143
  storeToken(token, user);
301
144
  stored = { token, user };
@@ -321,7 +164,7 @@ export const initCommand = new Command('init')
321
164
  const provisionSpinner = spinner();
322
165
  provisionSpinner.start('Creating GitHub repos...');
323
166
  try {
324
- const updatedConfig = await provisionWorkspace({
167
+ const result = await provisionWorkspace({
325
168
  octokit,
326
169
  org: githubOrg,
327
170
  workspacePath: workspace.getWorkspacePath(),
@@ -329,8 +172,8 @@ export const initCommand = new Command('init')
329
172
  onProgress: (msg) => provisionSpinner.message(msg),
330
173
  });
331
174
  // Write back updated config with github_urls + org
332
- updatedConfig.github = { org: githubOrg };
333
- workspace.writeConfig(updatedConfig);
175
+ result.config.github = { org: githubOrg };
176
+ workspace.writeConfig(result.config);
334
177
  // Push updated workspace.json back to config repo
335
178
  provisionSpinner.message('Updating config repo with GitHub URLs...');
336
179
  const configPath = workspace.getWorkspacePath() + '/.studiograph';
@@ -343,18 +186,13 @@ export const initCommand = new Command('init')
343
186
  // If nothing to commit or push fails, continue anyway
344
187
  }
345
188
  provisionSpinner.stop('GitHub repos created');
346
- const label = selectedTemplate && INDUSTRY_TEMPLATES[selectedTemplate]
347
- ? INDUSTRY_TEMPLATES[selectedTemplate].name
348
- : null;
349
189
  const configRepoName = `${currentConfig.team_name.toLowerCase().replace(/[^a-z0-9]+/g, '-')}-config`;
350
190
  const configRepoUrl = `https://github.com/${githubOrg}/${configRepoName}.git`;
351
191
  const nextStep = directory === '.' ? '' : `\n\nNext: cd ${targetDir} && studiograph start`;
352
192
  log.success('All repos pushed to GitHub!');
353
193
  log.info(`\nTo join this workspace from another machine:`);
354
194
  log.info(` studiograph join ${configRepoUrl}`);
355
- outro(label
356
- ? `✨ ${label} workspace initialized with GitHub repos!${nextStep}`
357
- : `✨ Workspace initialized with GitHub repos!${nextStep}`);
195
+ outro(`✨ Workspace initialized with GitHub repos!${nextStep}`);
358
196
  }
359
197
  catch (provisionError) {
360
198
  provisionSpinner.stop('Failed to provision GitHub repos');
@@ -363,13 +201,8 @@ export const initCommand = new Command('init')
363
201
  }
364
202
  }
365
203
  else {
366
- const label = selectedTemplate && INDUSTRY_TEMPLATES[selectedTemplate]
367
- ? INDUSTRY_TEMPLATES[selectedTemplate].name
368
- : null;
369
204
  const nextStep = directory === '.' ? '' : `\n\nNext: cd ${targetDir} && studiograph start`;
370
- outro(label
371
- ? `✨ ${label} workspace initialized!${nextStep}`
372
- : `✨ Workspace initialized!${nextStep}`);
205
+ outro(`✨ Workspace initialized!${nextStep}`);
373
206
  }
374
207
  }
375
208
  catch (error) {