studiograph 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +18 -0
  2. package/dist/agent/orchestrator.d.ts +69 -0
  3. package/dist/agent/orchestrator.js +211 -0
  4. package/dist/agent/orchestrator.js.map +1 -0
  5. package/dist/agent/tools/graph-tools.d.ts +30 -0
  6. package/dist/agent/tools/graph-tools.js +536 -0
  7. package/dist/agent/tools/graph-tools.js.map +1 -0
  8. package/dist/auth/github.d.ts +53 -0
  9. package/dist/auth/github.js +180 -0
  10. package/dist/auth/github.js.map +1 -0
  11. package/dist/cli/commands/auth.d.ts +10 -0
  12. package/dist/cli/commands/auth.js +63 -0
  13. package/dist/cli/commands/auth.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +7 -0
  15. package/dist/cli/commands/init.js +299 -0
  16. package/dist/cli/commands/init.js.map +1 -0
  17. package/dist/cli/commands/join.d.ts +14 -0
  18. package/dist/cli/commands/join.js +230 -0
  19. package/dist/cli/commands/join.js.map +1 -0
  20. package/dist/cli/commands/members.d.ts +11 -0
  21. package/dist/cli/commands/members.js +230 -0
  22. package/dist/cli/commands/members.js.map +1 -0
  23. package/dist/cli/commands/serve.d.ts +17 -0
  24. package/dist/cli/commands/serve.js +90 -0
  25. package/dist/cli/commands/serve.js.map +1 -0
  26. package/dist/cli/commands/start.d.ts +7 -0
  27. package/dist/cli/commands/start.js +381 -0
  28. package/dist/cli/commands/start.js.map +1 -0
  29. package/dist/cli/commands/sync.d.ts +10 -0
  30. package/dist/cli/commands/sync.js +121 -0
  31. package/dist/cli/commands/sync.js.map +1 -0
  32. package/dist/cli/index.d.ts +7 -0
  33. package/dist/cli/index.js +31 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/core/graph.d.ts +169 -0
  36. package/dist/core/graph.js +558 -0
  37. package/dist/core/graph.js.map +1 -0
  38. package/dist/core/types.d.ts +216 -0
  39. package/dist/core/types.js +71 -0
  40. package/dist/core/types.js.map +1 -0
  41. package/dist/core/user-config.d.ts +31 -0
  42. package/dist/core/user-config.js +50 -0
  43. package/dist/core/user-config.js.map +1 -0
  44. package/dist/core/validation.d.ts +2371 -0
  45. package/dist/core/validation.js +432 -0
  46. package/dist/core/validation.js.map +1 -0
  47. package/dist/core/workspace-manager.d.ts +104 -0
  48. package/dist/core/workspace-manager.js +432 -0
  49. package/dist/core/workspace-manager.js.map +1 -0
  50. package/dist/core/workspace.d.ts +103 -0
  51. package/dist/core/workspace.js +306 -0
  52. package/dist/core/workspace.js.map +1 -0
  53. package/dist/server/index.d.ts +25 -0
  54. package/dist/server/index.js +84 -0
  55. package/dist/server/index.js.map +1 -0
  56. package/dist/server/plugin-loader.d.ts +31 -0
  57. package/dist/server/plugin-loader.js +81 -0
  58. package/dist/server/plugin-loader.js.map +1 -0
  59. package/dist/server/routes/chat.d.ts +11 -0
  60. package/dist/server/routes/chat.js +66 -0
  61. package/dist/server/routes/chat.js.map +1 -0
  62. package/dist/server/routes/graph-api.d.ts +9 -0
  63. package/dist/server/routes/graph-api.js +72 -0
  64. package/dist/server/routes/graph-api.js.map +1 -0
  65. package/dist/server/routes/webhook.d.ts +14 -0
  66. package/dist/server/routes/webhook.js +69 -0
  67. package/dist/server/routes/webhook.js.map +1 -0
  68. package/dist/services/assets/base.d.ts +69 -0
  69. package/dist/services/assets/base.js +113 -0
  70. package/dist/services/assets/base.js.map +1 -0
  71. package/dist/services/assets/index.d.ts +36 -0
  72. package/dist/services/assets/index.js +89 -0
  73. package/dist/services/assets/index.js.map +1 -0
  74. package/dist/services/assets/local.d.ts +42 -0
  75. package/dist/services/assets/local.js +161 -0
  76. package/dist/services/assets/local.js.map +1 -0
  77. package/dist/services/assets/r2.d.ts +36 -0
  78. package/dist/services/assets/r2.js +182 -0
  79. package/dist/services/assets/r2.js.map +1 -0
  80. package/dist/services/csv-service.d.ts +36 -0
  81. package/dist/services/csv-service.js +143 -0
  82. package/dist/services/csv-service.js.map +1 -0
  83. package/dist/services/git.d.ts +99 -0
  84. package/dist/services/git.js +306 -0
  85. package/dist/services/git.js.map +1 -0
  86. package/dist/services/github-provisioner.d.ts +30 -0
  87. package/dist/services/github-provisioner.js +89 -0
  88. package/dist/services/github-provisioner.js.map +1 -0
  89. package/dist/services/markdown.d.ts +82 -0
  90. package/dist/services/markdown.js +338 -0
  91. package/dist/services/markdown.js.map +1 -0
  92. package/dist/services/memory-service.d.ts +74 -0
  93. package/dist/services/memory-service.js +183 -0
  94. package/dist/services/memory-service.js.map +1 -0
  95. package/dist/utils/git.d.ts +28 -0
  96. package/dist/utils/git.js +55 -0
  97. package/dist/utils/git.js.map +1 -0
  98. package/dist/utils/preflight.d.ts +44 -0
  99. package/dist/utils/preflight.js +95 -0
  100. package/dist/utils/preflight.js.map +1 -0
  101. package/package.json +55 -0
@@ -0,0 +1,381 @@
1
+ /**
2
+ * studiograph start command
3
+ *
4
+ * Launches the Studiograph agent chat interface with memory support
5
+ */
6
+ import { Command } from 'commander';
7
+ import { Agent } from '@mariozechner/pi-agent-core';
8
+ import { getModel } from '@mariozechner/pi-ai';
9
+ import { Workspace } from '../../core/workspace.js';
10
+ import { WorkspaceManager } from '../../core/workspace-manager.js';
11
+ import { MemoryService } from '../../services/memory-service.js';
12
+ import { createGraphTools } from '../../agent/tools/graph-tools.js';
13
+ import { intro, select, text, outro, spinner } from '@clack/prompts';
14
+ import { runPreflight } from '../../utils/preflight.js';
15
+ import { loadUserConfig } from '../../core/user-config.js';
16
+ import * as readline from 'readline';
17
+ // Model provider configurations
18
+ const MODEL_PROVIDERS = {
19
+ anthropic: {
20
+ name: 'Anthropic (Claude)',
21
+ models: [
22
+ { id: 'claude-opus-4-6', name: 'Claude Opus 4.6 (Most Capable)', hint: 'Best reasoning, can be slower' },
23
+ { id: 'claude-sonnet-4-5-20250929', name: 'Claude Sonnet 4.5 (Recommended)', hint: 'Great balance of speed and quality' },
24
+ { id: 'claude-3-7-sonnet-20250219', name: 'Claude 3.7 Sonnet', hint: 'Faster, good for most tasks' },
25
+ { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', hint: 'Fastest, lightweight tasks' },
26
+ ],
27
+ requiresApiKey: true,
28
+ envVar: 'ANTHROPIC_API_KEY',
29
+ },
30
+ openai: {
31
+ name: 'OpenAI (GPT)',
32
+ models: [
33
+ { id: 'gpt-4o', name: 'GPT-4o (Recommended)', hint: 'Latest multimodal model' },
34
+ { id: 'gpt-4o-mini', name: 'GPT-4o Mini', hint: 'Faster and cheaper' },
35
+ { id: 'gpt-4-turbo', name: 'GPT-4 Turbo', hint: 'Previous generation' },
36
+ ],
37
+ requiresApiKey: true,
38
+ envVar: 'OPENAI_API_KEY',
39
+ },
40
+ google: {
41
+ name: 'Google (Gemini)',
42
+ models: [
43
+ { id: 'gemini-2.0-flash-exp', name: 'Gemini 2.0 Flash (Experimental)', hint: 'Latest experimental model' },
44
+ { id: 'gemini-1.5-pro', name: 'Gemini 1.5 Pro', hint: 'Most capable' },
45
+ { id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash', hint: 'Fast and efficient' },
46
+ ],
47
+ requiresApiKey: true,
48
+ envVar: 'GOOGLE_API_KEY',
49
+ },
50
+ xai: {
51
+ name: 'xAI (Grok)',
52
+ models: [
53
+ { id: 'grok-2-1212', name: 'Grok 2', hint: 'Latest xAI model' },
54
+ { id: 'grok-2-vision-1212', name: 'Grok 2 Vision', hint: 'With vision capabilities' },
55
+ ],
56
+ requiresApiKey: true,
57
+ envVar: 'XAI_API_KEY',
58
+ },
59
+ groq: {
60
+ name: 'Groq (Fast Inference)',
61
+ models: [
62
+ { id: 'llama-3.3-70b-versatile', name: 'Llama 3.3 70B', hint: 'Very fast inference' },
63
+ { id: 'mixtral-8x7b-32768', name: 'Mixtral 8x7B', hint: 'Fast and capable' },
64
+ ],
65
+ requiresApiKey: true,
66
+ envVar: 'GROQ_API_KEY',
67
+ },
68
+ openrouter: {
69
+ name: 'OpenRouter (Access to many models)',
70
+ models: [
71
+ { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6 (via OpenRouter)', hint: 'Access Claude without Anthropic API' },
72
+ { id: 'openai/gpt-4o', name: 'GPT-4o (via OpenRouter)', hint: 'Access OpenAI without direct API' },
73
+ { id: 'meta-llama/llama-3.3-70b-instruct', name: 'Llama 3.3 70B', hint: 'Open source model' },
74
+ ],
75
+ requiresApiKey: true,
76
+ envVar: 'OPENROUTER_API_KEY',
77
+ },
78
+ };
79
+ export const startCommand = new Command('start')
80
+ .description('Start the Studiograph agent chat interface')
81
+ .action(async () => {
82
+ const workspace = new Workspace();
83
+ // Check if workspace is initialized
84
+ if (!workspace.isWorkspace()) {
85
+ console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
86
+ process.exit(1);
87
+ }
88
+ const ready = runPreflight();
89
+ if (!ready) {
90
+ process.exit(1);
91
+ return;
92
+ }
93
+ // Load workspace config and user config
94
+ const config = workspace.loadConfig();
95
+ const repos = workspace.getRepos();
96
+ const userConfig = loadUserConfig();
97
+ // Check if model is configured — user config takes precedence over workspace config
98
+ let modelProvider = userConfig.model_provider || config.model_provider;
99
+ let modelId = userConfig.model_id || config.model_id;
100
+ // API key: user config → workspace.json legacy field → env var (resolved below)
101
+ let apiKey = userConfig.api_key || config.api_key || config.anthropic_api_key;
102
+ if (!modelProvider || !modelId) {
103
+ // First-time setup
104
+ intro('🎨 Studiograph Setup');
105
+ console.log('Let\'s configure your AI model.\n');
106
+ // Select provider
107
+ const providerChoice = await select({
108
+ message: 'Which AI provider would you like to use?',
109
+ options: [
110
+ { value: 'anthropic', label: 'Anthropic (Claude)', hint: 'Recommended - Best reasoning' },
111
+ { value: 'openai', label: 'OpenAI (GPT)', hint: 'Popular, widely used' },
112
+ { value: 'google', label: 'Google (Gemini)', hint: 'Free tier available' },
113
+ { value: 'xai', label: 'xAI (Grok)', hint: 'Real-time knowledge' },
114
+ { value: 'groq', label: 'Groq', hint: 'Fastest inference' },
115
+ { value: 'openrouter', label: 'OpenRouter', hint: 'Access many models with one API key' },
116
+ ],
117
+ });
118
+ if (typeof providerChoice === 'symbol') {
119
+ outro('Cancelled');
120
+ process.exit(0);
121
+ }
122
+ modelProvider = providerChoice;
123
+ const provider = MODEL_PROVIDERS[modelProvider];
124
+ // Select model
125
+ const modelChoice = await select({
126
+ message: `Which ${provider.name} model?`,
127
+ options: provider.models.map(m => ({
128
+ value: m.id,
129
+ label: m.name,
130
+ hint: m.hint,
131
+ })),
132
+ });
133
+ if (typeof modelChoice === 'symbol') {
134
+ outro('Cancelled');
135
+ process.exit(0);
136
+ }
137
+ modelId = modelChoice;
138
+ // Get API key if required
139
+ if (provider.requiresApiKey && !apiKey) {
140
+ // Check environment variable first
141
+ const envKey = process.env[provider.envVar];
142
+ if (envKey) {
143
+ console.log(`✓ Using ${provider.envVar} from environment\n`);
144
+ apiKey = envKey;
145
+ }
146
+ else {
147
+ const keyInput = await text({
148
+ message: `Enter your ${provider.name} API key:`,
149
+ placeholder: 'sk-...',
150
+ validate: (value) => {
151
+ if (!value || value.length < 10)
152
+ return 'API key seems too short';
153
+ },
154
+ });
155
+ if (typeof keyInput !== 'string') {
156
+ outro('Cancelled');
157
+ process.exit(0);
158
+ }
159
+ apiKey = keyInput;
160
+ }
161
+ }
162
+ // Save configuration
163
+ const s = spinner();
164
+ s.start('Saving configuration...');
165
+ workspace.setModelConfig(modelProvider, modelId, apiKey);
166
+ s.stop('Configuration saved ✓');
167
+ outro(`Model configured: ${provider.name} - ${modelId}\n`);
168
+ }
169
+ // Validate we have all required config
170
+ if (!modelProvider || !modelId) {
171
+ console.error('❌ Model configuration incomplete');
172
+ process.exit(1);
173
+ }
174
+ // Check if we need API key for this provider
175
+ const provider = MODEL_PROVIDERS[modelProvider];
176
+ if (provider?.requiresApiKey && !apiKey) {
177
+ const envKey = process.env[provider.envVar];
178
+ if (envKey) {
179
+ apiKey = envKey;
180
+ }
181
+ else {
182
+ console.error(`❌ API key required for ${provider.name}`);
183
+ console.error(` Set ${provider.envVar} environment variable or run setup again`);
184
+ process.exit(1);
185
+ }
186
+ }
187
+ // Initialize memory service
188
+ const memoryService = new MemoryService(process.cwd());
189
+ const recentMemory = memoryService.loadRecentMemory();
190
+ // Create system prompt with memory context
191
+ const systemPrompt = createSystemPrompt(config.team_name, repos, recentMemory);
192
+ // Initialize agent
193
+ const agent = new Agent({
194
+ getApiKey: () => apiKey,
195
+ });
196
+ // Set model and system prompt
197
+ const model = getModel(modelProvider, modelId);
198
+ agent.setModel(model);
199
+ agent.setSystemPrompt(systemPrompt);
200
+ // Load graph tools
201
+ const gitUser = { id: 'cli-user', name: config.team_name, email: 'noreply@studiograph.local' };
202
+ const cliUser = { id: 'cli-user', name: config.team_name, email: 'noreply@studiograph.local', role: 'admin' };
203
+ const workspaceManager = new WorkspaceManager(process.cwd(), config, gitUser, cliUser);
204
+ const tools = createGraphTools(workspaceManager, gitUser);
205
+ agent.setTools(tools);
206
+ console.log('🎨 Studiograph agent started');
207
+ console.log(`📁 Workspace: ${config.team_name}`);
208
+ console.log(`🤖 Model: ${modelProvider}/${modelId}`);
209
+ console.log(`💾 Memory loaded: ${memoryService.listMemoryFiles().length} days`);
210
+ console.log('\nType your message and press Enter. Type "exit" to quit.\n');
211
+ // Track conversation for memory
212
+ const conversationLog = [];
213
+ // Track first delta to fix leading spacing
214
+ let isFirstDelta = false;
215
+ // Track tool sequence for spacing
216
+ let inToolSequence = false;
217
+ // Subscribe to agent events
218
+ agent.subscribe((event) => {
219
+ if (event.type === 'message_start') {
220
+ isFirstDelta = true;
221
+ }
222
+ else if (event.type === 'message_update') {
223
+ const msgEvent = event.assistantMessageEvent;
224
+ if (msgEvent.type === 'text_delta') {
225
+ let output = msgEvent.delta;
226
+ // Strip both leading newlines from first delta (we already moved cursor)
227
+ if (isFirstDelta) {
228
+ output = output.replace(/^\n\n/, '');
229
+ isFirstDelta = false;
230
+ }
231
+ // Add blank line before text if we just finished a tool sequence
232
+ if (inToolSequence) {
233
+ process.stdout.write('\n');
234
+ inToolSequence = false;
235
+ }
236
+ process.stdout.write(output);
237
+ }
238
+ }
239
+ else if (event.type === 'message_end') {
240
+ // Message complete - extract text for logging
241
+ const msg = event.message;
242
+ if (msg.role === 'assistant') {
243
+ const textContent = msg.content
244
+ .filter((c) => c.type === 'text')
245
+ .map((c) => c.text)
246
+ .join('');
247
+ if (textContent) {
248
+ conversationLog.push(`Assistant: ${textContent}`);
249
+ }
250
+ // Add blank line after assistant response before next prompt
251
+ process.stdout.write('\n\n');
252
+ }
253
+ }
254
+ else if (event.type === 'tool_execution_start') {
255
+ // Add blank line between consecutive tools (not before first)
256
+ if (inToolSequence) {
257
+ process.stdout.write('\n');
258
+ }
259
+ else {
260
+ inToolSequence = true;
261
+ }
262
+ // Log tool execution
263
+ process.stdout.write(`🔧 Using tool: ${event.toolName}\n`);
264
+ }
265
+ else if (event.type === 'tool_execution_end') {
266
+ // Log tool execution errors
267
+ if (event.isError) {
268
+ process.stdout.write(`⚠️ Tool error (${event.toolName}): Execution failed\n`);
269
+ }
270
+ else if (event.result?.details?.success === false) {
271
+ process.stdout.write(`⚠️ Tool error (${event.toolName}): ${event.result.details.error || 'Unknown error'}\n`);
272
+ }
273
+ }
274
+ });
275
+ // Create readline interface
276
+ const rl = readline.createInterface({
277
+ input: process.stdin,
278
+ output: process.stdout,
279
+ prompt: '> ',
280
+ });
281
+ rl.prompt();
282
+ rl.on('line', async (input) => {
283
+ const message = input.trim();
284
+ if (message.toLowerCase() === 'exit') {
285
+ // Save session summary to memory
286
+ if (conversationLog.length > 0) {
287
+ const summary = conversationLog.join('\n\n');
288
+ memoryService.saveSessionSummary(summary, {
289
+ timestamp: new Date().toISOString(),
290
+ message_count: conversationLog.length,
291
+ });
292
+ }
293
+ rl.close();
294
+ process.exit(0);
295
+ return;
296
+ }
297
+ if (!message) {
298
+ rl.prompt();
299
+ return;
300
+ }
301
+ try {
302
+ conversationLog.push(`User: ${message}`);
303
+ // Move cursor to where agent response will appear (prevents double-jump)
304
+ process.stdout.write('\n');
305
+ // Send message to agent and wait for completion
306
+ await agent.prompt(message);
307
+ await agent.waitForIdle();
308
+ }
309
+ catch (error) {
310
+ console.error('\n❌ Error:', error instanceof Error ? error.message : 'Unknown error');
311
+ if (error instanceof Error && error.stack) {
312
+ console.error('Stack trace:', error.stack);
313
+ }
314
+ }
315
+ rl.prompt();
316
+ });
317
+ rl.on('close', () => {
318
+ console.log('\n👋 Goodbye!');
319
+ process.exit(0);
320
+ });
321
+ });
322
+ /**
323
+ * Create system prompt with workspace and memory context
324
+ */
325
+ function createSystemPrompt(teamName, repos, recentMemory) {
326
+ return `You are Studiograph, an AI agent that helps creative teams manage their knowledge graphs.
327
+
328
+ # Workspace: ${teamName}
329
+
330
+ You are working in a Studiograph workspace with the following repositories:
331
+
332
+ ${repos.map(repo => `- ${repo.name} (${repo.type}): ${repo.description || 'No description'}`).join('\n')}
333
+
334
+ # Memory Context
335
+
336
+ ${recentMemory}
337
+
338
+ # Your Role
339
+
340
+ You help the team:
341
+ - Create and manage entities in their knowledge graphs
342
+ - Search and discover relationships between entities
343
+ - Generate presentations and documentation
344
+ - Track decisions and project history
345
+
346
+ # Entity Types by Repository Type
347
+
348
+ PROJECT repositories contain:
349
+ - Projects, Clients, People, Meetings, Decisions, Artifacts
350
+
351
+ FUNCTION repositories contain:
352
+ - Function-specific entities (varies by team)
353
+
354
+ SHARED_RESOURCE repositories contain:
355
+ - Templates, Standards, Processes, Research, References
356
+
357
+ # Guidelines
358
+
359
+ - Be conversational and helpful
360
+ - Ask clarifying questions when needed
361
+ - Suggest related entities and connections
362
+ - Track important decisions and context in memory
363
+ - Always save significant insights to memory for future sessions
364
+
365
+ # Output Formatting
366
+
367
+ IMPORTANT: You are running in a CLI (command-line interface). Use plain text formatting:
368
+ - NO markdown syntax: no bold (**text**), italic (*text*), code formatting (\`code\`), headings (# Heading), or tables
369
+ - For section headers, use ALL CAPS on a single line with NO blank line after:
370
+ Example:
371
+ MANAGE YOUR KNOWLEDGE
372
+ - Create entities
373
+ - Search and discover
374
+ - Use simple bullet points with single hyphens: "- item"
375
+ - For punctuation, use single hyphens (-) not double hyphens (--)
376
+ - Separate different sections with ONE blank line between them
377
+ - Keep responses concise and conversational
378
+
379
+ Start by greeting the user and asking how you can help them today.`;
380
+ }
381
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * studiograph pull / push commands
3
+ *
4
+ * Pull and push changes across the workspace:
5
+ * - the .studiograph config repo
6
+ * - each entity repo that has a github_url and is cloned locally
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare const pullCommand: Command;
10
+ export declare const pushCommand: Command;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * studiograph pull / push commands
3
+ *
4
+ * Pull and push changes across the workspace:
5
+ * - the .studiograph config repo
6
+ * - each entity repo that has a github_url and is cloned locally
7
+ */
8
+ import { Command } from 'commander';
9
+ import { log, outro } from '@clack/prompts';
10
+ import { existsSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { Workspace } from '../../core/workspace.js';
13
+ import { gitPull, gitPush } from '../../utils/git.js';
14
+ function getRepoEntries(workspace, workspaceRoot) {
15
+ const entries = [];
16
+ // The .studiograph config directory is itself a git repo (when GitHub-provisioned)
17
+ entries.push({ name: '.studiograph', path: join(workspaceRoot, '.studiograph') });
18
+ const config = workspace.loadConfig();
19
+ for (const repo of config.repos) {
20
+ if (!repo.github_url)
21
+ continue; // no remote configured — skip
22
+ const repoPath = join(workspaceRoot, repo.path);
23
+ entries.push({ name: repo.name, path: repoPath });
24
+ }
25
+ return entries;
26
+ }
27
+ function isGitRepo(path) {
28
+ return existsSync(path) && existsSync(join(path, '.git'));
29
+ }
30
+ // ─── pull ─────────────────────────────────────────────────────────────────────
31
+ export const pullCommand = new Command('pull')
32
+ .description('Pull latest changes from remote across the workspace')
33
+ .action(async () => {
34
+ const workspace = new Workspace();
35
+ if (!workspace.isWorkspace()) {
36
+ console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
37
+ process.exit(1);
38
+ return;
39
+ }
40
+ const workspaceRoot = workspace.getWorkspacePath();
41
+ const entries = getRepoEntries(workspace, workspaceRoot);
42
+ let hasConflict = false;
43
+ let hasError = false;
44
+ for (const entry of entries) {
45
+ if (!existsSync(entry.path)) {
46
+ log.info(`${entry.name}: skipped (not cloned locally)`);
47
+ continue;
48
+ }
49
+ if (!isGitRepo(entry.path)) {
50
+ log.info(`${entry.name}: skipped (not a git repo)`);
51
+ continue;
52
+ }
53
+ try {
54
+ const result = gitPull(entry.path);
55
+ if (result === 'updated') {
56
+ log.success(`${entry.name}: updated`);
57
+ }
58
+ else if (result === 'up-to-date') {
59
+ log.info(`${entry.name}: already up to date`);
60
+ }
61
+ else {
62
+ log.warn(`${entry.name}: conflict — resolve with git in ${entry.path}`);
63
+ hasConflict = true;
64
+ }
65
+ }
66
+ catch (error) {
67
+ log.error(`${entry.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);
68
+ hasError = true;
69
+ }
70
+ }
71
+ if (hasConflict) {
72
+ outro('⚠️ Pull complete with conflicts. Resolve them, then run `studiograph push`.');
73
+ process.exit(1);
74
+ }
75
+ else if (hasError) {
76
+ outro('❌ Pull failed for one or more repos.');
77
+ process.exit(1);
78
+ }
79
+ });
80
+ // ─── push ─────────────────────────────────────────────────────────────────────
81
+ export const pushCommand = new Command('push')
82
+ .description('Push local commits to remote across the workspace')
83
+ .action(async () => {
84
+ const workspace = new Workspace();
85
+ if (!workspace.isWorkspace()) {
86
+ console.error('❌ Not a Studiograph workspace. Run `studiograph init` first.');
87
+ process.exit(1);
88
+ return;
89
+ }
90
+ const workspaceRoot = workspace.getWorkspacePath();
91
+ const entries = getRepoEntries(workspace, workspaceRoot);
92
+ let hasError = false;
93
+ for (const entry of entries) {
94
+ if (!existsSync(entry.path)) {
95
+ log.info(`${entry.name}: skipped (not cloned locally)`);
96
+ continue;
97
+ }
98
+ if (!isGitRepo(entry.path)) {
99
+ log.info(`${entry.name}: skipped (not a git repo)`);
100
+ continue;
101
+ }
102
+ try {
103
+ const result = gitPush(entry.path);
104
+ if (result === 'pushed') {
105
+ log.success(`${entry.name}: pushed`);
106
+ }
107
+ else {
108
+ log.info(`${entry.name}: nothing to push`);
109
+ }
110
+ }
111
+ catch (error) {
112
+ log.error(`${entry.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);
113
+ hasError = true;
114
+ }
115
+ }
116
+ if (hasError) {
117
+ outro('❌ Push failed for one or more repos.');
118
+ process.exit(1);
119
+ }
120
+ });
121
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Studiograph CLI
4
+ *
5
+ * Main entry point for the studiograph command
6
+ */
7
+ export {};
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Studiograph CLI
4
+ *
5
+ * Main entry point for the studiograph command
6
+ */
7
+ import { Command } from 'commander';
8
+ import { initCommand } from './commands/init.js';
9
+ import { startCommand } from './commands/start.js';
10
+ import { joinCommand } from './commands/join.js';
11
+ import { authCommand } from './commands/auth.js';
12
+ import { membersCommand } from './commands/members.js';
13
+ import { pullCommand, pushCommand } from './commands/sync.js';
14
+ import { serveCommand } from './commands/serve.js';
15
+ const program = new Command();
16
+ program
17
+ .name('studiograph')
18
+ .description('Team-based AI agent platform with Git-backed knowledge graphs')
19
+ .version('1.0.0');
20
+ // Register commands
21
+ program.addCommand(initCommand);
22
+ program.addCommand(startCommand);
23
+ program.addCommand(joinCommand);
24
+ program.addCommand(authCommand);
25
+ program.addCommand(membersCommand);
26
+ program.addCommand(pullCommand);
27
+ program.addCommand(pushCommand);
28
+ program.addCommand(serveCommand);
29
+ // Parse arguments
30
+ program.parse();
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}