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.
- package/README.md +2 -8
- package/dist/agent/orchestrator.d.ts +53 -0
- package/dist/agent/orchestrator.js +197 -12
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +43 -11
- package/dist/agent/skill-loader.d.ts +48 -0
- package/dist/agent/skill-loader.js +166 -0
- package/dist/agent/skill-loader.js.map +1 -0
- package/dist/agent/skills/{bundled/enrich-entities.md → enrich-entities.md} +12 -0
- package/dist/agent/skills/entity-schema.md +502 -0
- package/dist/agent/skills/obsidian-source-setup.md +246 -0
- package/dist/agent/skills/sync-configuration.md +144 -0
- package/dist/agent/skills/sync-setup.md +84 -0
- package/dist/agent/tools/connector-tools.d.ts +37 -0
- package/dist/agent/tools/connector-tools.js +132 -0
- package/dist/agent/tools/connector-tools.js.map +1 -0
- package/dist/agent/tools/fs-tools.d.ts +39 -0
- package/dist/agent/tools/fs-tools.js +106 -0
- package/dist/agent/tools/fs-tools.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +33 -1
- package/dist/agent/tools/graph-tools.js +192 -44
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/load-skill.d.ts +1 -1
- package/dist/agent/tools/load-skill.js +1 -1
- package/dist/agent/tools/load-skill.js.map +1 -1
- package/dist/agent/tools/ops-tools.d.ts +24 -0
- package/dist/agent/tools/ops-tools.js +542 -0
- package/dist/agent/tools/ops-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.d.ts +33 -0
- package/dist/agent/tools/sync-tools.js +947 -0
- package/dist/agent/tools/sync-tools.js.map +1 -0
- package/dist/auth/github.d.ts +11 -8
- package/dist/auth/github.js +56 -75
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/colors.d.ts +54 -0
- package/dist/cli/colors.js +133 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/app.js +121 -18
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +26 -10
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clone.d.ts +9 -0
- package/dist/cli/commands/clone.js +167 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +8 -0
- package/dist/cli/commands/commit.js +44 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/connector.js +10 -2
- package/dist/cli/commands/connector.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +4 -6
- package/dist/cli/commands/deploy.js +292 -115
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/enrich.d.ts +11 -0
- package/dist/cli/commands/enrich.js +135 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/graphrag.d.ts +12 -0
- package/dist/cli/commands/graphrag.js +122 -0
- package/dist/cli/commands/graphrag.js.map +1 -0
- package/dist/cli/commands/init.js +29 -196
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.js +23 -3
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/orphans.d.ts +8 -0
- package/dist/cli/commands/orphans.js +125 -0
- package/dist/cli/commands/orphans.js.map +1 -0
- package/dist/cli/commands/provision.js +11 -7
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/r2.js +8 -2
- package/dist/cli/commands/r2.js.map +1 -1
- package/dist/cli/commands/redeploy.d.ts +9 -0
- package/dist/cli/commands/redeploy.js +203 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.js +137 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/review.d.ts +19 -0
- package/dist/cli/commands/review.js +128 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -8
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/source.d.ts +16 -0
- package/dist/cli/commands/source.js +159 -0
- package/dist/cli/commands/source.js.map +1 -0
- package/dist/cli/commands/start.js +307 -55
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync-entities.d.ts +13 -0
- package/dist/cli/commands/sync-entities.js +242 -0
- package/dist/cli/commands/sync-entities.js.map +1 -0
- package/dist/cli/commands/sync.js +81 -5
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +45 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +2 -1
- package/dist/cli/scaffolding.js +38 -23
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +30 -0
- package/dist/cli/setup-wizard.js +244 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/sync-review-interactive.d.ts +31 -0
- package/dist/cli/sync-review-interactive.js +393 -0
- package/dist/cli/sync-review-interactive.js.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.js +116 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/core/graph.d.ts +40 -12
- package/dist/core/graph.js +344 -104
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +4 -1
- package/dist/core/migration-runner.js +14 -3
- package/dist/core/migration-runner.js.map +1 -1
- package/dist/core/types.d.ts +2 -4
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +12 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +6 -1
- package/dist/core/workspace-manager.js +29 -4
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +13 -5
- package/dist/core/workspace.js +115 -33
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/connector-manager.d.ts +7 -3
- package/dist/mcp/connector-manager.js +61 -16
- package/dist/mcp/connector-manager.js.map +1 -1
- package/dist/mcp/connectors/asana.d.ts +2 -0
- package/dist/mcp/connectors/asana.js +20 -0
- package/dist/mcp/connectors/asana.js.map +1 -0
- package/dist/mcp/connectors/definitions.d.ts +3 -1
- package/dist/mcp/connectors/definitions.js +19 -127
- package/dist/mcp/connectors/definitions.js.map +1 -1
- package/dist/mcp/connectors/figma.d.ts +5 -0
- package/dist/mcp/connectors/figma.js +21 -0
- package/dist/mcp/connectors/figma.js.map +1 -0
- package/dist/mcp/connectors/gdrive.d.ts +2 -0
- package/dist/mcp/connectors/gdrive.js +20 -0
- package/dist/mcp/connectors/gdrive.js.map +1 -0
- package/dist/mcp/connectors/granola.d.ts +2 -0
- package/dist/mcp/connectors/granola.js +12 -0
- package/dist/mcp/connectors/granola.js.map +1 -0
- package/dist/mcp/connectors/linear.d.ts +2 -0
- package/dist/mcp/connectors/linear.js +19 -0
- package/dist/mcp/connectors/linear.js.map +1 -0
- package/dist/mcp/connectors/obsidian.d.ts +2 -0
- package/dist/mcp/connectors/obsidian.js +19 -0
- package/dist/mcp/connectors/obsidian.js.map +1 -0
- package/dist/mcp/connectors/pipedrive.d.ts +2 -0
- package/dist/mcp/connectors/pipedrive.js +20 -0
- package/dist/mcp/connectors/pipedrive.js.map +1 -0
- package/dist/mcp/connectors/slack.d.ts +2 -0
- package/dist/mcp/connectors/slack.js +21 -0
- package/dist/mcp/connectors/slack.js.map +1 -0
- package/dist/mcp/oauth-provider.d.ts +41 -0
- package/dist/mcp/oauth-provider.js +160 -0
- package/dist/mcp/oauth-provider.js.map +1 -0
- package/dist/server/index.js +97 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +8 -0
- package/dist/server/plugin-loader.js +54 -2
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +164 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +170 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +31 -0
- package/dist/services/git.js +92 -3
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.d.ts +8 -3
- package/dist/services/github-provisioner.js +35 -8
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/lint-service.js +8 -1
- package/dist/services/lint-service.js.map +1 -1
- package/dist/services/markdown.js +3 -3
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -1
- package/dist/services/memory-service.js +2 -3
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/orphan-service.d.ts +31 -0
- package/dist/services/orphan-service.js +100 -0
- package/dist/services/orphan-service.js.map +1 -0
- package/dist/services/sync/commit.d.ts +60 -0
- package/dist/services/sync/commit.js +370 -0
- package/dist/services/sync/commit.js.map +1 -0
- package/dist/services/sync/context-index.d.ts +69 -0
- package/dist/services/sync/context-index.js +280 -0
- package/dist/services/sync/context-index.js.map +1 -0
- package/dist/services/sync/derive.d.ts +34 -0
- package/dist/services/sync/derive.js +164 -0
- package/dist/services/sync/derive.js.map +1 -0
- package/dist/services/sync/enrichment-state.d.ts +31 -0
- package/dist/services/sync/enrichment-state.js +63 -0
- package/dist/services/sync/enrichment-state.js.map +1 -0
- package/dist/services/sync/enrichment.d.ts +25 -0
- package/dist/services/sync/enrichment.js +121 -0
- package/dist/services/sync/enrichment.js.map +1 -0
- package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
- package/dist/services/sync/frontmatter-extractor.js +273 -0
- package/dist/services/sync/frontmatter-extractor.js.map +1 -0
- package/dist/services/sync/graph-match-state.d.ts +33 -0
- package/dist/services/sync/graph-match-state.js +61 -0
- package/dist/services/sync/graph-match-state.js.map +1 -0
- package/dist/services/sync/graph-match.d.ts +53 -0
- package/dist/services/sync/graph-match.js +316 -0
- package/dist/services/sync/graph-match.js.map +1 -0
- package/dist/services/sync/graphrag-client.d.ts +43 -0
- package/dist/services/sync/graphrag-client.js +94 -0
- package/dist/services/sync/graphrag-client.js.map +1 -0
- package/dist/services/sync/graphrag-config.d.ts +16 -0
- package/dist/services/sync/graphrag-config.js +39 -0
- package/dist/services/sync/graphrag-config.js.map +1 -0
- package/dist/services/sync/graphrag-context.d.ts +14 -0
- package/dist/services/sync/graphrag-context.js +109 -0
- package/dist/services/sync/graphrag-context.js.map +1 -0
- package/dist/services/sync/graphrag-indexer.d.ts +30 -0
- package/dist/services/sync/graphrag-indexer.js +358 -0
- package/dist/services/sync/graphrag-indexer.js.map +1 -0
- package/dist/services/sync/llm.d.ts +32 -0
- package/dist/services/sync/llm.js +115 -0
- package/dist/services/sync/llm.js.map +1 -0
- package/dist/services/sync/mcp-client.d.ts +59 -0
- package/dist/services/sync/mcp-client.js +285 -0
- package/dist/services/sync/mcp-client.js.map +1 -0
- package/dist/services/sync/model-factory.d.ts +10 -0
- package/dist/services/sync/model-factory.js +24 -0
- package/dist/services/sync/model-factory.js.map +1 -0
- package/dist/services/sync/name-quality.d.ts +31 -0
- package/dist/services/sync/name-quality.js +60 -0
- package/dist/services/sync/name-quality.js.map +1 -0
- package/dist/services/sync/output-schemas.d.ts +92 -0
- package/dist/services/sync/output-schemas.js +43 -0
- package/dist/services/sync/output-schemas.js.map +1 -0
- package/dist/services/sync/prompts.d.ts +19 -0
- package/dist/services/sync/prompts.js +128 -0
- package/dist/services/sync/prompts.js.map +1 -0
- package/dist/services/sync/reconciler.d.ts +48 -0
- package/dist/services/sync/reconciler.js +295 -0
- package/dist/services/sync/reconciler.js.map +1 -0
- package/dist/services/sync/source-config.d.ts +45 -0
- package/dist/services/sync/source-config.js +208 -0
- package/dist/services/sync/source-config.js.map +1 -0
- package/dist/services/sync/source-definitions/asana.d.ts +15 -0
- package/dist/services/sync/source-definitions/asana.js +48 -0
- package/dist/services/sync/source-definitions/asana.js.map +1 -0
- package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
- package/dist/services/sync/source-definitions/definitions.js +26 -0
- package/dist/services/sync/source-definitions/definitions.js.map +1 -0
- package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
- package/dist/services/sync/source-definitions/gdrive.js +68 -0
- package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
- package/dist/services/sync/source-definitions/granola.d.ts +2 -0
- package/dist/services/sync/source-definitions/granola.js +28 -0
- package/dist/services/sync/source-definitions/granola.js.map +1 -0
- package/dist/services/sync/source-definitions/linear.d.ts +2 -0
- package/dist/services/sync/source-definitions/linear.js +60 -0
- package/dist/services/sync/source-definitions/linear.js.map +1 -0
- package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
- package/dist/services/sync/source-definitions/obsidian.js +55 -0
- package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
- package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
- package/dist/services/sync/source-definitions/pipedrive.js +52 -0
- package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
- package/dist/services/sync/staging.d.ts +53 -0
- package/dist/services/sync/staging.js +131 -0
- package/dist/services/sync/staging.js.map +1 -0
- package/dist/services/sync/structured-extractor.d.ts +49 -0
- package/dist/services/sync/structured-extractor.js +344 -0
- package/dist/services/sync/structured-extractor.js.map +1 -0
- package/dist/services/sync/sync-runner.d.ts +32 -0
- package/dist/services/sync/sync-runner.js +195 -0
- package/dist/services/sync/sync-runner.js.map +1 -0
- package/dist/services/sync/sync-state.d.ts +43 -0
- package/dist/services/sync/sync-state.js +154 -0
- package/dist/services/sync/sync-state.js.map +1 -0
- package/dist/services/sync/types.d.ts +203 -0
- package/dist/services/sync/types.js +8 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/sync/unstructured-extractor.d.ts +29 -0
- package/dist/services/sync/unstructured-extractor.js +197 -0
- package/dist/services/sync/unstructured-extractor.js.map +1 -0
- package/dist/services/vector-service.d.ts +11 -0
- package/dist/services/vector-service.js +42 -0
- package/dist/services/vector-service.js.map +1 -1
- package/dist/utils/git.d.ts +31 -4
- package/dist/utils/git.js +65 -7
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +60 -0
- package/dist/utils/merge-resolver.js +304 -0
- package/dist/utils/merge-resolver.js.map +1 -0
- package/dist/utils/preflight.d.ts +2 -1
- package/dist/utils/preflight.js +8 -1
- package/dist/utils/preflight.js.map +1 -1
- package/dist/utils/workspace-config.d.ts +8 -0
- package/dist/utils/workspace-config.js +22 -0
- package/dist/utils/workspace-config.js.map +1 -0
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.BwJV4fvl.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.CnAQdPKU.css +1 -0
- package/dist/web/_app/immutable/assets/4.BG92MufE.css +1 -0
- package/dist/web/_app/immutable/assets/5.CfrQIPYs.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.BNzaCFTL.css +1 -0
- package/dist/web/_app/immutable/assets/editor.D6Rjo7RE.css +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B4G4uWkV.js +1 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CksE5s8n.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/D0JBkEPE.js +86 -0
- package/dist/web/_app/immutable/chunks/D2K5GzLj.js +1 -0
- package/dist/web/_app/immutable/chunks/DEkoussQ.js +2 -0
- package/dist/web/_app/immutable/chunks/DW-KmHRi.js +1 -0
- package/dist/web/_app/immutable/chunks/DcCr4z9k.js +1 -0
- package/dist/web/_app/immutable/chunks/Dg2wWwJu.js +2 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/SBEriEQR.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YTERt3Ul.js +6 -0
- package/dist/web/_app/immutable/chunks/m_R7HatS.js +1 -0
- package/dist/web/_app/immutable/chunks/vlmEnjfO.js +1 -0
- package/dist/web/_app/immutable/entry/app.B9pwpU_x.js +2 -0
- package/dist/web/_app/immutable/entry/start.CDuNCEco.js +1 -0
- package/dist/web/_app/immutable/nodes/0.YEQhw1us.js +1 -0
- package/dist/web/_app/immutable/nodes/1.CvmHhpRy.js +1 -0
- package/dist/web/_app/immutable/nodes/2.c5k1r7dq.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B24tcdLK.js +1 -0
- package/dist/web/_app/immutable/nodes/4.kX2m5Pp9.js +16 -0
- package/dist/web/_app/immutable/nodes/5.DELt6wTD.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +41 -0
- package/package.json +21 -7
- /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,
|
|
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,
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
const
|
|
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.
|
|
112
|
+
type: RepoType.PROJECT,
|
|
274
113
|
description: repo.description,
|
|
275
114
|
});
|
|
276
115
|
}
|
|
277
|
-
s.stop(`Created ${
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
333
|
-
workspace.writeConfig(
|
|
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(
|
|
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(
|
|
371
|
-
? `✨ ${label} workspace initialized!${nextStep}`
|
|
372
|
-
: `✨ Workspace initialized!${nextStep}`);
|
|
205
|
+
outro(`✨ Workspace initialized!${nextStep}`);
|
|
373
206
|
}
|
|
374
207
|
}
|
|
375
208
|
catch (error) {
|