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.
- package/README.md +18 -0
- package/dist/agent/orchestrator.d.ts +69 -0
- package/dist/agent/orchestrator.js +211 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +30 -0
- package/dist/agent/tools/graph-tools.js +536 -0
- package/dist/agent/tools/graph-tools.js.map +1 -0
- package/dist/auth/github.d.ts +53 -0
- package/dist/auth/github.js +180 -0
- package/dist/auth/github.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.js +63 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.js +299 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/join.d.ts +14 -0
- package/dist/cli/commands/join.js +230 -0
- package/dist/cli/commands/join.js.map +1 -0
- package/dist/cli/commands/members.d.ts +11 -0
- package/dist/cli/commands/members.js +230 -0
- package/dist/cli/commands/members.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +17 -0
- package/dist/cli/commands/serve.js +90 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.js +381 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +10 -0
- package/dist/cli/commands/sync.js +121 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/graph.d.ts +169 -0
- package/dist/core/graph.js +558 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/types.d.ts +216 -0
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/user-config.d.ts +31 -0
- package/dist/core/user-config.js +50 -0
- package/dist/core/user-config.js.map +1 -0
- package/dist/core/validation.d.ts +2371 -0
- package/dist/core/validation.js +432 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/workspace-manager.d.ts +104 -0
- package/dist/core/workspace-manager.js +432 -0
- package/dist/core/workspace-manager.js.map +1 -0
- package/dist/core/workspace.d.ts +103 -0
- package/dist/core/workspace.js +306 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/server/index.d.ts +25 -0
- package/dist/server/index.js +84 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plugin-loader.d.ts +31 -0
- package/dist/server/plugin-loader.js +81 -0
- package/dist/server/plugin-loader.js.map +1 -0
- package/dist/server/routes/chat.d.ts +11 -0
- package/dist/server/routes/chat.js +66 -0
- package/dist/server/routes/chat.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +9 -0
- package/dist/server/routes/graph-api.js +72 -0
- package/dist/server/routes/graph-api.js.map +1 -0
- package/dist/server/routes/webhook.d.ts +14 -0
- package/dist/server/routes/webhook.js +69 -0
- package/dist/server/routes/webhook.js.map +1 -0
- package/dist/services/assets/base.d.ts +69 -0
- package/dist/services/assets/base.js +113 -0
- package/dist/services/assets/base.js.map +1 -0
- package/dist/services/assets/index.d.ts +36 -0
- package/dist/services/assets/index.js +89 -0
- package/dist/services/assets/index.js.map +1 -0
- package/dist/services/assets/local.d.ts +42 -0
- package/dist/services/assets/local.js +161 -0
- package/dist/services/assets/local.js.map +1 -0
- package/dist/services/assets/r2.d.ts +36 -0
- package/dist/services/assets/r2.js +182 -0
- package/dist/services/assets/r2.js.map +1 -0
- package/dist/services/csv-service.d.ts +36 -0
- package/dist/services/csv-service.js +143 -0
- package/dist/services/csv-service.js.map +1 -0
- package/dist/services/git.d.ts +99 -0
- package/dist/services/git.js +306 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/github-provisioner.d.ts +30 -0
- package/dist/services/github-provisioner.js +89 -0
- package/dist/services/github-provisioner.js.map +1 -0
- package/dist/services/markdown.d.ts +82 -0
- package/dist/services/markdown.js +338 -0
- package/dist/services/markdown.js.map +1 -0
- package/dist/services/memory-service.d.ts +74 -0
- package/dist/services/memory-service.js +183 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/utils/git.d.ts +28 -0
- package/dist/utils/git.js +55 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/preflight.d.ts +44 -0
- package/dist/utils/preflight.js +95 -0
- package/dist/utils/preflight.js.map +1 -0
- 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,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"}
|