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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph redeploy — trigger a redeploy of an existing Railway service
|
|
3
|
+
*
|
|
4
|
+
* Uses saved project/service/environment IDs from `studiograph deploy railway`.
|
|
5
|
+
* Also accepts a Railway dashboard URL to set up the link:
|
|
6
|
+
* studiograph redeploy https://railway.com/project/<id>/service/<id>?environmentId=<id>
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { intro, outro, password, log, spinner } from '@clack/prompts';
|
|
10
|
+
import { loadUserConfig, saveUserConfig } from '../../core/user-config.js';
|
|
11
|
+
const RAILWAY_API = 'https://backboard.railway.com/graphql/v2';
|
|
12
|
+
async function railwayQuery(token, query, variables = {}) {
|
|
13
|
+
const res = await fetch(RAILWAY_API, {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
headers: {
|
|
16
|
+
'Authorization': `Bearer ${token}`,
|
|
17
|
+
'Content-Type': 'application/json',
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify({ query, variables }),
|
|
20
|
+
});
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
throw new Error(`Railway API error: ${res.status} ${res.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
const json = await res.json();
|
|
25
|
+
if (json.errors?.length) {
|
|
26
|
+
throw new Error(`Railway API: ${json.errors.map((e) => e.message).join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
return json.data;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract a Railway project ID from a URL or bare ID string.
|
|
32
|
+
* Accepts:
|
|
33
|
+
* - Full URL: https://railway.com/project/<id>/...
|
|
34
|
+
* - Bare UUID: 0f130498-af6a-46c4-b9a8-18f1cd3e1762
|
|
35
|
+
*/
|
|
36
|
+
function parseProjectId(input) {
|
|
37
|
+
// Strip query string so zsh glob issues with ? don't matter
|
|
38
|
+
const clean = input.split('?')[0];
|
|
39
|
+
const urlMatch = clean.match(/\/project\/([a-f0-9-]+)/);
|
|
40
|
+
if (urlMatch)
|
|
41
|
+
return urlMatch[1];
|
|
42
|
+
// Bare UUID
|
|
43
|
+
if (/^[a-f0-9-]{36}$/.test(clean))
|
|
44
|
+
return clean;
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
export const redeployCommand = new Command('redeploy')
|
|
48
|
+
.description('Trigger a redeploy of an existing Railway service')
|
|
49
|
+
.argument('[project]', 'Railway project ID or dashboard URL (saves for future use)')
|
|
50
|
+
.action(async (project) => {
|
|
51
|
+
intro('Redeploy to Railway');
|
|
52
|
+
const userConfig = loadUserConfig();
|
|
53
|
+
// Link project if provided
|
|
54
|
+
if (project) {
|
|
55
|
+
const projectId = parseProjectId(project);
|
|
56
|
+
if (!projectId) {
|
|
57
|
+
outro('Invalid project. Pass a Railway project ID or dashboard URL.');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
userConfig.railway_project_id = projectId;
|
|
62
|
+
// Clear stale service/env IDs — will be resolved from API
|
|
63
|
+
delete userConfig.railway_service_id;
|
|
64
|
+
delete userConfig.railway_environment_id;
|
|
65
|
+
saveUserConfig(userConfig);
|
|
66
|
+
log.info('Railway project linked');
|
|
67
|
+
}
|
|
68
|
+
// Resolve token
|
|
69
|
+
let token = process.env.RAILWAY_TOKEN || userConfig.railway_token;
|
|
70
|
+
if (!token) {
|
|
71
|
+
const input = await password({
|
|
72
|
+
message: 'Railway API token (create at https://railway.com/account/tokens)',
|
|
73
|
+
validate: (v) => v.trim() ? undefined : 'Required',
|
|
74
|
+
});
|
|
75
|
+
if (typeof input === 'symbol') {
|
|
76
|
+
outro('Cancelled');
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}
|
|
79
|
+
token = input.trim();
|
|
80
|
+
userConfig.railway_token = token;
|
|
81
|
+
saveUserConfig(userConfig);
|
|
82
|
+
log.info('Token saved');
|
|
83
|
+
}
|
|
84
|
+
const projectId = userConfig.railway_project_id;
|
|
85
|
+
let serviceId = userConfig.railway_service_id;
|
|
86
|
+
let environmentId = userConfig.railway_environment_id;
|
|
87
|
+
if (!projectId) {
|
|
88
|
+
outro('No Railway project linked. Run: studiograph redeploy <railway-dashboard-url>');
|
|
89
|
+
process.exit(1);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Resolve service and environment from API if not saved
|
|
93
|
+
if (!serviceId || !environmentId) {
|
|
94
|
+
const s2 = spinner();
|
|
95
|
+
s2.start('Resolving service...');
|
|
96
|
+
const data = await railwayQuery(token, `
|
|
97
|
+
query($id: String!) {
|
|
98
|
+
project(id: $id) {
|
|
99
|
+
services { edges { node { id name } } }
|
|
100
|
+
environments { edges { node { id name } } }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
`, { id: projectId });
|
|
104
|
+
if (!environmentId) {
|
|
105
|
+
environmentId = data.project.environments.edges[0]?.node.id;
|
|
106
|
+
}
|
|
107
|
+
if (!serviceId) {
|
|
108
|
+
const services = data.project.services.edges.map((e) => e.node);
|
|
109
|
+
if (services.length === 0) {
|
|
110
|
+
s2.stop('');
|
|
111
|
+
outro('No services found in this project.');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
serviceId = services[0].id;
|
|
116
|
+
s2.stop(`Service: ${services[0].name}`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
s2.stop('Resolved');
|
|
120
|
+
}
|
|
121
|
+
// Save for next time
|
|
122
|
+
userConfig.railway_service_id = serviceId;
|
|
123
|
+
if (environmentId)
|
|
124
|
+
userConfig.railway_environment_id = environmentId;
|
|
125
|
+
saveUserConfig(userConfig);
|
|
126
|
+
}
|
|
127
|
+
// Resolve environment ID if not saved
|
|
128
|
+
if (!environmentId) {
|
|
129
|
+
const data = await railwayQuery(token, `
|
|
130
|
+
query($id: String!) {
|
|
131
|
+
project(id: $id) {
|
|
132
|
+
environments { edges { node { id name } } }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
`, { id: projectId });
|
|
136
|
+
environmentId = data.project.environments.edges[0]?.node.id;
|
|
137
|
+
if (environmentId) {
|
|
138
|
+
userConfig.railway_environment_id = environmentId;
|
|
139
|
+
saveUserConfig(userConfig);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (!environmentId) {
|
|
143
|
+
outro('Could not determine Railway environment.');
|
|
144
|
+
process.exit(1);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Update start command to current version
|
|
148
|
+
const s = spinner();
|
|
149
|
+
s.start('Updating start command...');
|
|
150
|
+
try {
|
|
151
|
+
const pkgPath = new URL('../../../package.json', import.meta.url);
|
|
152
|
+
const { readFileSync } = await import('fs');
|
|
153
|
+
const pkgVersion = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
154
|
+
const startCommand = pkgVersion.includes('-')
|
|
155
|
+
? `npx studiograph@${pkgVersion} serve`
|
|
156
|
+
: 'npx studiograph serve';
|
|
157
|
+
await railwayQuery(token, `
|
|
158
|
+
mutation($serviceId: String!, $environmentId: String!, $input: ServiceInstanceUpdateInput!) {
|
|
159
|
+
serviceInstanceUpdate(serviceId: $serviceId, environmentId: $environmentId, input: $input)
|
|
160
|
+
}
|
|
161
|
+
`, { serviceId, environmentId, input: { startCommand } });
|
|
162
|
+
s.stop(`Start command: ${startCommand}`);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
s.stop('Could not update start command — continuing with redeploy');
|
|
166
|
+
}
|
|
167
|
+
// Find latest deployment and redeploy
|
|
168
|
+
const s2 = spinner();
|
|
169
|
+
s2.start('Triggering redeploy...');
|
|
170
|
+
try {
|
|
171
|
+
const deployData = await railwayQuery(token, `
|
|
172
|
+
query($projectId: String!, $serviceId: String!, $environmentId: String!) {
|
|
173
|
+
deployments(
|
|
174
|
+
input: { projectId: $projectId, serviceId: $serviceId, environmentId: $environmentId }
|
|
175
|
+
first: 1
|
|
176
|
+
) {
|
|
177
|
+
edges { node { id status } }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
`, { projectId, serviceId, environmentId });
|
|
181
|
+
const latestDeploy = deployData.deployments.edges[0]?.node;
|
|
182
|
+
if (!latestDeploy) {
|
|
183
|
+
s2.stop('No previous deployment found');
|
|
184
|
+
outro('No deployment to redeploy. Run `studiograph deploy railway` first.');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
await railwayQuery(token, `
|
|
189
|
+
mutation($id: String!) {
|
|
190
|
+
deploymentRedeploy(id: $id) { id status }
|
|
191
|
+
}
|
|
192
|
+
`, { id: latestDeploy.id });
|
|
193
|
+
s2.stop('Redeploy triggered');
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
s2.stop('Redeploy failed');
|
|
197
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
198
|
+
process.exit(1);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
outro('Redeploying — check Railway dashboard for progress.');
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=redeploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../../src/cli/commands/redeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph reset
|
|
3
|
+
*
|
|
4
|
+
* Reset a workspace by removing all entity data while preserving configuration.
|
|
5
|
+
* Keeps: .studiograph/ (config, team, migrations, sources, sync state)
|
|
6
|
+
* Removes: all repo directories (the entity markdown files)
|
|
7
|
+
*
|
|
8
|
+
* Useful for re-running sync pipelines from scratch or starting over
|
|
9
|
+
* without reconfiguring the workspace.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
export declare const resetCommand: Command;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph reset
|
|
3
|
+
*
|
|
4
|
+
* Reset a workspace by removing all entity data while preserving configuration.
|
|
5
|
+
* Keeps: .studiograph/ (config, team, migrations, sources, sync state)
|
|
6
|
+
* Removes: all repo directories (the entity markdown files)
|
|
7
|
+
*
|
|
8
|
+
* Useful for re-running sync pipelines from scratch or starting over
|
|
9
|
+
* without reconfiguring the workspace.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { existsSync, rmSync, readdirSync, statSync, readFileSync, writeFileSync } from 'fs';
|
|
13
|
+
import { join, relative } from 'path';
|
|
14
|
+
import { confirm, intro, isCancel, cancel } from '@clack/prompts';
|
|
15
|
+
import { Workspace } from '../../core/workspace.js';
|
|
16
|
+
export const resetCommand = new Command('reset')
|
|
17
|
+
.description('Reset workspace by removing all entity data (keeps config)')
|
|
18
|
+
.option('--yes', 'Skip confirmation prompt')
|
|
19
|
+
.option('--keep-sync-state', 'Preserve .studiograph/sync-state.json')
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const workspacePath = process.cwd();
|
|
22
|
+
const workspace = new Workspace(workspacePath);
|
|
23
|
+
if (!workspace.isWorkspace()) {
|
|
24
|
+
console.error('Not in a Studiograph workspace. Nothing to reset.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const config = await workspace.loadConfig();
|
|
28
|
+
const repos = config.repos ?? [];
|
|
29
|
+
if (repos.length === 0) {
|
|
30
|
+
console.log('No repos registered in workspace config. Nothing to reset.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Collect directories that will be removed
|
|
34
|
+
const toRemove = [];
|
|
35
|
+
for (const repo of repos) {
|
|
36
|
+
const repoPath = join(workspacePath, repo.path);
|
|
37
|
+
if (!existsSync(repoPath))
|
|
38
|
+
continue;
|
|
39
|
+
const entityCount = countEntities(repoPath);
|
|
40
|
+
toRemove.push({ name: repo.name, path: repoPath, entityCount });
|
|
41
|
+
}
|
|
42
|
+
if (toRemove.length === 0) {
|
|
43
|
+
console.log('All repo directories already removed. Nothing to reset.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Show what will be removed
|
|
47
|
+
if (!opts.yes) {
|
|
48
|
+
intro('Workspace Reset');
|
|
49
|
+
console.log('This will remove all entity data:\n');
|
|
50
|
+
let totalEntities = 0;
|
|
51
|
+
for (const item of toRemove) {
|
|
52
|
+
const rel = relative(workspacePath, item.path);
|
|
53
|
+
console.log(` ${rel.padEnd(30)} ${item.entityCount} entities`);
|
|
54
|
+
totalEntities += item.entityCount;
|
|
55
|
+
}
|
|
56
|
+
console.log(`\n Total: ${totalEntities} entities across ${toRemove.length} repos`);
|
|
57
|
+
console.log('\n Preserved: .studiograph/ (config, team, migrations)');
|
|
58
|
+
const proceed = await confirm({
|
|
59
|
+
message: 'Are you sure you want to reset?',
|
|
60
|
+
});
|
|
61
|
+
if (isCancel(proceed) || !proceed) {
|
|
62
|
+
cancel('Reset cancelled.');
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Remove repo directories
|
|
67
|
+
for (const item of toRemove) {
|
|
68
|
+
rmSync(item.path, { recursive: true, force: true });
|
|
69
|
+
console.log(` Removed ${item.name} (${item.entityCount} entities)`);
|
|
70
|
+
}
|
|
71
|
+
// Optionally clear sync state (preserving tombstones)
|
|
72
|
+
if (!opts.keepSyncState) {
|
|
73
|
+
const syncStatePath = join(workspacePath, '.studiograph', 'sync-state.json');
|
|
74
|
+
if (existsSync(syncStatePath)) {
|
|
75
|
+
let tombstones = [];
|
|
76
|
+
try {
|
|
77
|
+
const existing = JSON.parse(readFileSync(syncStatePath, 'utf-8'));
|
|
78
|
+
tombstones = existing.tombstones ?? [];
|
|
79
|
+
}
|
|
80
|
+
catch { /* ignore parse errors */ }
|
|
81
|
+
writeFileSync(syncStatePath, JSON.stringify({ sources: {}, tombstones }, null, 2) + '\n', 'utf-8');
|
|
82
|
+
if (tombstones.length > 0) {
|
|
83
|
+
console.log(` Cleared sync state (preserved ${tombstones.length} tombstones)`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(' Cleared sync state');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const populateCachePath = join(workspacePath, '.studiograph', 'populate-cache');
|
|
90
|
+
if (existsSync(populateCachePath)) {
|
|
91
|
+
rmSync(populateCachePath, { recursive: true, force: true });
|
|
92
|
+
console.log(' Cleared populate cache');
|
|
93
|
+
}
|
|
94
|
+
const stagingPath = join(workspacePath, '.studiograph', 'staging');
|
|
95
|
+
if (existsSync(stagingPath)) {
|
|
96
|
+
rmSync(stagingPath, { recursive: true, force: true });
|
|
97
|
+
console.log(' Cleared staging');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Remove private graph if it exists
|
|
101
|
+
const privatePath = join(workspacePath, 'private');
|
|
102
|
+
if (existsSync(privatePath)) {
|
|
103
|
+
rmSync(privatePath, { recursive: true, force: true });
|
|
104
|
+
console.log(' Removed private graph');
|
|
105
|
+
}
|
|
106
|
+
console.log('\nWorkspace reset complete. Config preserved at .studiograph/');
|
|
107
|
+
console.log('Re-run sync or create entities to repopulate.');
|
|
108
|
+
});
|
|
109
|
+
/**
|
|
110
|
+
* Count .md files recursively in a directory.
|
|
111
|
+
*/
|
|
112
|
+
function countEntities(dir) {
|
|
113
|
+
let count = 0;
|
|
114
|
+
try {
|
|
115
|
+
const entries = readdirSync(dir);
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const full = join(dir, entry);
|
|
118
|
+
try {
|
|
119
|
+
const stat = statSync(full);
|
|
120
|
+
if (stat.isDirectory()) {
|
|
121
|
+
count += countEntities(full);
|
|
122
|
+
}
|
|
123
|
+
else if (entry.endsWith('.md')) {
|
|
124
|
+
count++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// skip inaccessible entries
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// skip inaccessible directories
|
|
134
|
+
}
|
|
135
|
+
return count;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph resolve — retry conflict resolution for repos stuck mid-rebase.
|
|
3
|
+
*
|
|
4
|
+
* Scans all workspace repos, finds those with an in-progress rebase,
|
|
5
|
+
* and runs the conflict resolver on them.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare const resolveCommand: Command;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph resolve — retry conflict resolution for repos stuck mid-rebase.
|
|
3
|
+
*
|
|
4
|
+
* Scans all workspace repos, finds those with an in-progress rebase,
|
|
5
|
+
* and runs the conflict resolver on them.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { log, outro } from '@clack/prompts';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { Workspace } from '../../core/workspace.js';
|
|
12
|
+
import { isInRebase, gitStashPop } from '../../utils/git.js';
|
|
13
|
+
import { resolveConflicts } from '../../utils/merge-resolver.js';
|
|
14
|
+
export const resolveCommand = new Command('resolve')
|
|
15
|
+
.description('Retry conflict resolution for repos stuck mid-rebase')
|
|
16
|
+
.action(async () => {
|
|
17
|
+
const workspace = new Workspace();
|
|
18
|
+
if (!workspace.isWorkspace()) {
|
|
19
|
+
console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const workspaceRoot = workspace.getWorkspacePath();
|
|
24
|
+
// Gather all repo paths
|
|
25
|
+
const repoPaths = [];
|
|
26
|
+
const studioPath = join(workspaceRoot, '.studiograph');
|
|
27
|
+
if (existsSync(studioPath)) {
|
|
28
|
+
repoPaths.push({ name: '.studiograph', path: studioPath });
|
|
29
|
+
}
|
|
30
|
+
const config = await workspace.loadConfig();
|
|
31
|
+
for (const repo of config.repos) {
|
|
32
|
+
const repoPath = join(workspaceRoot, repo.path);
|
|
33
|
+
if (existsSync(repoPath)) {
|
|
34
|
+
repoPaths.push({ name: repo.name, path: repoPath });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Find repos mid-rebase
|
|
38
|
+
const rebasingRepos = repoPaths.filter(r => isInRebase(r.path));
|
|
39
|
+
if (rebasingRepos.length === 0) {
|
|
40
|
+
log.info('No repos are mid-rebase. Nothing to resolve.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
log.info(`Found ${rebasingRepos.length} repo${rebasingRepos.length === 1 ? '' : 's'} mid-rebase.`);
|
|
44
|
+
let hasFailure = false;
|
|
45
|
+
for (const repo of rebasingRepos) {
|
|
46
|
+
log.info(`\nResolving conflicts in ${repo.name}...`);
|
|
47
|
+
const resolution = await resolveConflicts(repo.path, (msg) => log.info(msg));
|
|
48
|
+
gitStashPop(repo.path);
|
|
49
|
+
if (resolution.success) {
|
|
50
|
+
const count = resolution.resolutions.filter(r => r.resolved).length;
|
|
51
|
+
log.success(`${repo.name}: resolved (${count} conflict${count === 1 ? '' : 's'})`);
|
|
52
|
+
for (const r of resolution.resolutions) {
|
|
53
|
+
if (r.resolved) {
|
|
54
|
+
log.info(` ${r.file} — ${r.summary}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const failed = resolution.resolutions.filter(r => !r.resolved);
|
|
60
|
+
if (failed.length > 0) {
|
|
61
|
+
log.warn(`${repo.name}: ${failed.length} conflict${failed.length === 1 ? '' : 's'} could not be resolved`);
|
|
62
|
+
for (const r of failed) {
|
|
63
|
+
log.info(` ${r.file} — ${r.summary ?? 'unresolved'}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
log.warn(`${repo.name}: resolution failed (no conflicts found — rebase may need manual intervention)`);
|
|
68
|
+
}
|
|
69
|
+
log.info('');
|
|
70
|
+
log.info(' To resolve manually:');
|
|
71
|
+
log.info(` cd ${repo.path}`);
|
|
72
|
+
log.info(' git status');
|
|
73
|
+
log.info(' # edit conflicted files, then: git add <file> && git rebase --continue');
|
|
74
|
+
hasFailure = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (hasFailure) {
|
|
78
|
+
outro('⚠️ Some conflicts remain. Resolve them manually, then run `studiograph push`.');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
outro('All conflicts resolved.');
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/cli/commands/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph review
|
|
3
|
+
*
|
|
4
|
+
* Review uncommitted or recently committed entity changes across workspace repos.
|
|
5
|
+
* Works after sync commit, enrich run, manual edits, or any other modification.
|
|
6
|
+
*
|
|
7
|
+
* studiograph review — interactive review (auto-detects uncommitted vs committed)
|
|
8
|
+
* studiograph review --type task — show colored diff for an entity type
|
|
9
|
+
* studiograph review --file <path> — show colored diff for a specific file
|
|
10
|
+
* studiograph review --committed — review last commit instead of uncommitted changes
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
export interface ReviewOptions {
|
|
14
|
+
type?: string;
|
|
15
|
+
file?: string;
|
|
16
|
+
committed?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function runReview(opts: ReviewOptions): Promise<void>;
|
|
19
|
+
export declare const reviewCommand: Command;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* studiograph review
|
|
3
|
+
*
|
|
4
|
+
* Review uncommitted or recently committed entity changes across workspace repos.
|
|
5
|
+
* Works after sync commit, enrich run, manual edits, or any other modification.
|
|
6
|
+
*
|
|
7
|
+
* studiograph review — interactive review (auto-detects uncommitted vs committed)
|
|
8
|
+
* studiograph review --type task — show colored diff for an entity type
|
|
9
|
+
* studiograph review --file <path> — show colored diff for a specific file
|
|
10
|
+
* studiograph review --committed — review last commit instead of uncommitted changes
|
|
11
|
+
*/
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
import { spawnSync } from 'child_process';
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
|
+
import { join } from 'path';
|
|
16
|
+
import { Workspace } from '../../core/workspace.js';
|
|
17
|
+
import { isGitRepo, gitHasUncommittedChanges } from '../../utils/git.js';
|
|
18
|
+
import { loadWorkspaceConfig } from '../../utils/workspace-config.js';
|
|
19
|
+
import { header, dimText, colorizeDiff } from '../colors.js';
|
|
20
|
+
import { detectDiffMode, runInteractiveReview } from '../sync-review-interactive.js';
|
|
21
|
+
export async function runReview(opts) {
|
|
22
|
+
const workspace = new Workspace(process.cwd());
|
|
23
|
+
if (!workspace.isWorkspace()) {
|
|
24
|
+
console.error('Not in a Studiograph workspace.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const config = loadWorkspaceConfig(process.cwd());
|
|
28
|
+
const repos = (config?.repos ?? []).map((r) => ({
|
|
29
|
+
name: r.name,
|
|
30
|
+
path: r.path,
|
|
31
|
+
}));
|
|
32
|
+
const gitRepos = repos.filter((r) => {
|
|
33
|
+
const p = join(process.cwd(), r.path);
|
|
34
|
+
return existsSync(p) && isGitRepo(p);
|
|
35
|
+
});
|
|
36
|
+
if (gitRepos.length === 0) {
|
|
37
|
+
console.log('No git repositories found in workspace.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Determine diff mode
|
|
41
|
+
const useCommitted = opts.committed ?? (detectDiffMode(process.cwd(), gitRepos) === 'committed');
|
|
42
|
+
const diffArgs = useCommitted
|
|
43
|
+
? ['diff', 'HEAD~1..HEAD']
|
|
44
|
+
: ['diff'];
|
|
45
|
+
// ── Non-interactive: --file ──────────────────────────────────────────────
|
|
46
|
+
if (opts.file) {
|
|
47
|
+
for (const repo of gitRepos) {
|
|
48
|
+
const repoPath = join(process.cwd(), repo.path);
|
|
49
|
+
const result = spawnSync('git', [...diffArgs, '--', opts.file], { cwd: repoPath, encoding: 'utf-8' });
|
|
50
|
+
if (result.status === 0 && result.stdout.trim()) {
|
|
51
|
+
console.log(colorizeDiff(result.stdout));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
console.log(`No changes found for ${opts.file}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// ── Non-interactive: --type ──────────────────────────────────────────────
|
|
59
|
+
if (opts.type) {
|
|
60
|
+
let found = false;
|
|
61
|
+
for (const repo of gitRepos) {
|
|
62
|
+
const repoPath = join(process.cwd(), repo.path);
|
|
63
|
+
const result = spawnSync('git', [...diffArgs, '--', `${opts.type}/`], { cwd: repoPath, encoding: 'utf-8' });
|
|
64
|
+
if (result.status === 0 && result.stdout.trim()) {
|
|
65
|
+
console.log(colorizeDiff(result.stdout));
|
|
66
|
+
found = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!found) {
|
|
70
|
+
console.log(`No changes found for type "${opts.type}"`);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// ── Interactive mode ─────────────────────────────────────────────────────
|
|
75
|
+
if (process.stdout.isTTY) {
|
|
76
|
+
await runInteractiveReview({
|
|
77
|
+
workspacePath: process.cwd(),
|
|
78
|
+
repos: gitRepos,
|
|
79
|
+
committed: useCommitted,
|
|
80
|
+
});
|
|
81
|
+
if (!useCommitted)
|
|
82
|
+
printNextSteps(process.cwd(), gitRepos);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// ── Non-interactive fallback (piped output) ──────────────────────────────
|
|
86
|
+
let totalChanged = 0;
|
|
87
|
+
console.log(`${header('Entity changes')}:\n`);
|
|
88
|
+
for (const repo of gitRepos) {
|
|
89
|
+
const repoPath = join(process.cwd(), repo.path);
|
|
90
|
+
const result = spawnSync('git', [...diffArgs, '--stat'], { cwd: repoPath, encoding: 'utf-8' });
|
|
91
|
+
if (result.status === 0 && result.stdout.trim()) {
|
|
92
|
+
console.log(` ${header(repo.name + '/')}`);
|
|
93
|
+
for (const line of result.stdout.trim().split('\n')) {
|
|
94
|
+
console.log(` ${line}`);
|
|
95
|
+
totalChanged++;
|
|
96
|
+
}
|
|
97
|
+
console.log();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (totalChanged === 0) {
|
|
101
|
+
console.log('No changes in any repo.');
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log(`Review with: ${header('studiograph review --type <type>')}`);
|
|
105
|
+
if (!useCommitted)
|
|
106
|
+
printNextSteps(process.cwd(), gitRepos);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Print next-steps guidance when uncommitted changes remain. */
|
|
110
|
+
function printNextSteps(workspacePath, repos) {
|
|
111
|
+
const hasChanges = repos.some((r) => {
|
|
112
|
+
const p = join(workspacePath, r.path);
|
|
113
|
+
return existsSync(p) && isGitRepo(p) && gitHasUncommittedChanges(p);
|
|
114
|
+
});
|
|
115
|
+
if (!hasChanges)
|
|
116
|
+
return;
|
|
117
|
+
console.log(`\nNext: ${header('studiograph commit')} ${dimText('(git commit changes)')}`);
|
|
118
|
+
console.log(`Or: ${dimText('git checkout -- .')} ${dimText('(discard all changes)')}`);
|
|
119
|
+
}
|
|
120
|
+
export const reviewCommand = new Command('review')
|
|
121
|
+
.description('Review entity changes across workspace repos')
|
|
122
|
+
.option('--type <entity_type>', 'Show colored diff for an entity type')
|
|
123
|
+
.option('--file <path>', 'Show colored diff for a specific file')
|
|
124
|
+
.option('--committed', 'Review last commit instead of uncommitted changes')
|
|
125
|
+
.action(async (opts) => {
|
|
126
|
+
await runReview(opts);
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAQrF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAA0C,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAC1F,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,KAAK,WAAW,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC;QAC1B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEb,4EAA4E;IAC5E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACtG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5G,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzC,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,oBAAoB,CAAC;YACzB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,YAAY;YAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC3B,YAAY,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY;YAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,SAAS,cAAc,CACrB,aAAqB,EACrB,KAA4C;IAE5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,oBAAoB,CAAC,UAAU,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,mBAAmB,CAAC,YAAY,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,sBAAsB,EAAE,sCAAsC,CAAC;KACtE,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,MAAM,CAAC,aAAa,EAAE,mDAAmD,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAmB,EAAE,EAAE;IACpC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC"}
|