@studio-foundation/cli 0.3.0-beta.1
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/ARCHITECTURE.md +40 -0
- package/LICENSE +663 -0
- package/README.md +165 -0
- package/dist/commands/api.d.ts +16 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +118 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/config.d.ts +32 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +390 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +93 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +728 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +22 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/integrations.d.ts +14 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +282 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +161 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +7 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +98 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ollama.d.ts +6 -0
- package/dist/commands/ollama.d.ts.map +1 -0
- package/dist/commands/ollama.js +161 -0
- package/dist/commands/ollama.js.map +1 -0
- package/dist/commands/project.d.ts +38 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +137 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/registry/audit.d.ts +13 -0
- package/dist/commands/registry/audit.d.ts.map +1 -0
- package/dist/commands/registry/audit.js +65 -0
- package/dist/commands/registry/audit.js.map +1 -0
- package/dist/commands/registry/index.d.ts +3 -0
- package/dist/commands/registry/index.d.ts.map +1 -0
- package/dist/commands/registry/index.js +53 -0
- package/dist/commands/registry/index.js.map +1 -0
- package/dist/commands/registry/install.d.ts +17 -0
- package/dist/commands/registry/install.d.ts.map +1 -0
- package/dist/commands/registry/install.js +153 -0
- package/dist/commands/registry/install.js.map +1 -0
- package/dist/commands/registry/publish.d.ts +8 -0
- package/dist/commands/registry/publish.d.ts.map +1 -0
- package/dist/commands/registry/publish.js +94 -0
- package/dist/commands/registry/publish.js.map +1 -0
- package/dist/commands/registry/remove.d.ts +8 -0
- package/dist/commands/registry/remove.d.ts.map +1 -0
- package/dist/commands/registry/remove.js +82 -0
- package/dist/commands/registry/remove.js.map +1 -0
- package/dist/commands/registry/search.d.ts +9 -0
- package/dist/commands/registry/search.d.ts.map +1 -0
- package/dist/commands/registry/search.js +68 -0
- package/dist/commands/registry/search.js.map +1 -0
- package/dist/commands/registry/sync.d.ts +8 -0
- package/dist/commands/registry/sync.d.ts.map +1 -0
- package/dist/commands/registry/sync.js +19 -0
- package/dist/commands/registry/sync.js.map +1 -0
- package/dist/commands/registry/update.d.ts +15 -0
- package/dist/commands/registry/update.d.ts.map +1 -0
- package/dist/commands/registry/update.js +48 -0
- package/dist/commands/registry/update.js.map +1 -0
- package/dist/commands/replay.d.ts +36 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +453 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/run.d.ts +18 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +406 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +144 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/template/index.d.ts +2 -0
- package/dist/commands/template/index.d.ts.map +1 -0
- package/dist/commands/template/index.js +57 -0
- package/dist/commands/template/index.js.map +1 -0
- package/dist/commands/template/validate.d.ts +8 -0
- package/dist/commands/template/validate.d.ts.map +1 -0
- package/dist/commands/template/validate.js +135 -0
- package/dist/commands/template/validate.js.map +1 -0
- package/dist/commands/templates.d.ts +14 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +86 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/tools.d.ts +12 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +200 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/users.d.ts +4 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +123 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +39 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +178 -0
- package/dist/index.js.map +1 -0
- package/dist/models-cache.d.ts +13 -0
- package/dist/models-cache.d.ts.map +1 -0
- package/dist/models-cache.js +106 -0
- package/dist/models-cache.js.map +1 -0
- package/dist/output/file-changes.d.ts +15 -0
- package/dist/output/file-changes.d.ts.map +1 -0
- package/dist/output/file-changes.js +77 -0
- package/dist/output/file-changes.js.map +1 -0
- package/dist/output/formatter.d.ts +6 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +70 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatters.d.ts +42 -0
- package/dist/output/formatters.d.ts.map +1 -0
- package/dist/output/formatters.js +280 -0
- package/dist/output/formatters.js.map +1 -0
- package/dist/output/logger.d.ts +3 -0
- package/dist/output/logger.d.ts.map +1 -0
- package/dist/output/logger.js +15 -0
- package/dist/output/logger.js.map +1 -0
- package/dist/output/parallel-progress.d.ts +33 -0
- package/dist/output/parallel-progress.d.ts.map +1 -0
- package/dist/output/parallel-progress.js +85 -0
- package/dist/output/parallel-progress.js.map +1 -0
- package/dist/output/progress.d.ts +32 -0
- package/dist/output/progress.d.ts.map +1 -0
- package/dist/output/progress.js +393 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/provider-validator.d.ts +15 -0
- package/dist/provider-validator.d.ts.map +1 -0
- package/dist/provider-validator.js +85 -0
- package/dist/provider-validator.js.map +1 -0
- package/dist/registry/cache.d.ts +10 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +36 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/client.d.ts +19 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +63 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/lockfile.d.ts +17 -0
- package/dist/registry/lockfile.d.ts.map +1 -0
- package/dist/registry/lockfile.js +61 -0
- package/dist/registry/lockfile.js.map +1 -0
- package/dist/registry/resolver.d.ts +13 -0
- package/dist/registry/resolver.d.ts.map +1 -0
- package/dist/registry/resolver.js +79 -0
- package/dist/registry/resolver.js.map +1 -0
- package/dist/registry/types.d.ts +59 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +14 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/run-logger.d.ts +8 -0
- package/dist/run-logger.d.ts.map +1 -0
- package/dist/run-logger.js +53 -0
- package/dist/run-logger.js.map +1 -0
- package/dist/run-store-factory.d.ts +9 -0
- package/dist/run-store-factory.d.ts.map +1 -0
- package/dist/run-store-factory.js +26 -0
- package/dist/run-store-factory.js.map +1 -0
- package/dist/studio-dir.d.ts +7 -0
- package/dist/studio-dir.d.ts.map +1 -0
- package/dist/studio-dir.js +27 -0
- package/dist/studio-dir.js.map +1 -0
- package/dist/utils/input-wizard.d.ts +4 -0
- package/dist/utils/input-wizard.d.ts.map +1 -0
- package/dist/utils/input-wizard.js +56 -0
- package/dist/utils/input-wizard.js.map +1 -0
- package/dist/utils/placeholders.d.ts +6 -0
- package/dist/utils/placeholders.d.ts.map +1 -0
- package/dist/utils/placeholders.js +12 -0
- package/dist/utils/placeholders.js.map +1 -0
- package/package.json +43 -0
- package/src/commands/api.ts +126 -0
- package/src/commands/config.ts +433 -0
- package/src/commands/init.ts +879 -0
- package/src/commands/install.ts +23 -0
- package/src/commands/integrations.ts +332 -0
- package/src/commands/list.ts +197 -0
- package/src/commands/logs.ts +119 -0
- package/src/commands/ollama.ts +168 -0
- package/src/commands/project.ts +167 -0
- package/src/commands/registry/audit.ts +87 -0
- package/src/commands/registry/index.ts +63 -0
- package/src/commands/registry/install.ts +222 -0
- package/src/commands/registry/publish.ts +112 -0
- package/src/commands/registry/remove.ts +89 -0
- package/src/commands/registry/search.ts +93 -0
- package/src/commands/registry/sync.ts +24 -0
- package/src/commands/registry/update.ts +63 -0
- package/src/commands/replay.ts +559 -0
- package/src/commands/run.ts +454 -0
- package/src/commands/status.ts +163 -0
- package/src/commands/template/index.ts +59 -0
- package/src/commands/template/validate.ts +175 -0
- package/src/commands/templates.ts +99 -0
- package/src/commands/tools.ts +227 -0
- package/src/commands/users.ts +127 -0
- package/src/commands/validate.ts +46 -0
- package/src/config.ts +101 -0
- package/src/index.ts +201 -0
- package/src/models-cache.ts +127 -0
- package/src/output/file-changes.ts +97 -0
- package/src/output/formatter.ts +85 -0
- package/src/output/formatters.ts +303 -0
- package/src/output/logger.ts +18 -0
- package/src/output/parallel-progress.ts +103 -0
- package/src/output/progress.ts +414 -0
- package/src/provider-validator.ts +109 -0
- package/src/registry/cache.ts +46 -0
- package/src/registry/client.ts +84 -0
- package/src/registry/lockfile.ts +68 -0
- package/src/registry/resolver.ts +113 -0
- package/src/registry/types.ts +66 -0
- package/src/run-logger.ts +66 -0
- package/src/run-store-factory.ts +30 -0
- package/src/studio-dir.ts +28 -0
- package/src/utils/input-wizard.ts +73 -0
- package/src/utils/placeholders.ts +10 -0
- package/templates/.studiorc.yaml +16 -0
- package/templates/projects/blank/metadata.json +7 -0
- package/templates/studio-config.yaml +14 -0
- package/tests/__stubs__/studio-runner.ts +104 -0
- package/tests/commands/api.test.ts +110 -0
- package/tests/commands/config.test.ts +221 -0
- package/tests/commands/init.test.ts +919 -0
- package/tests/commands/install.test.ts +52 -0
- package/tests/commands/integrations.test.ts +158 -0
- package/tests/commands/ollama.test.ts +139 -0
- package/tests/commands/project.test.ts +179 -0
- package/tests/commands/registry/audit.test.ts +56 -0
- package/tests/commands/registry/install.test.ts +200 -0
- package/tests/commands/registry/publish.test.ts +56 -0
- package/tests/commands/registry/remove.test.ts +103 -0
- package/tests/commands/registry/search.test.ts +44 -0
- package/tests/commands/registry/sync.test.ts +37 -0
- package/tests/commands/registry/update.test.ts +62 -0
- package/tests/commands/replay.test.ts +283 -0
- package/tests/commands/template/validate.test.ts +150 -0
- package/tests/commands/templates.test.ts +42 -0
- package/tests/commands/tools.test.ts +106 -0
- package/tests/config.test.ts +142 -0
- package/tests/formatter.test.ts +158 -0
- package/tests/integration/sigint.test.ts +188 -0
- package/tests/models-cache.test.ts +250 -0
- package/tests/output/file-changes.test.ts +178 -0
- package/tests/output/formatters.test.ts +448 -0
- package/tests/output/progress-spinner.test.ts +232 -0
- package/tests/output/progress-timer.test.ts +230 -0
- package/tests/provider-validator.test.ts +182 -0
- package/tests/registry/cache.test.ts +66 -0
- package/tests/registry/client.test.ts +70 -0
- package/tests/registry/lockfile.test.ts +87 -0
- package/tests/registry/resolver.test.ts +122 -0
- package/tests/run-logger-events.test.ts +326 -0
- package/tests/run-logger.test.ts +64 -0
- package/tests/run-store-factory.test.ts +51 -0
- package/tests/studio-dir.test.ts +31 -0
- package/tests/utils/input-wizard.test.ts +153 -0
- package/tests/utils/placeholders.test.ts +36 -0
- package/tsconfig.json +24 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { resolve, join, dirname } from 'node:path';
|
|
3
|
+
import * as yaml from 'js-yaml';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { select, password, confirm, input } from '@inquirer/prompts';
|
|
7
|
+
import { findStudioDir } from '../studio-dir.js';
|
|
8
|
+
import { resolveEnvVars } from '../config.js';
|
|
9
|
+
import { validateApiKeyLive } from '../provider-validator.js';
|
|
10
|
+
import { getAvailableModels } from '../models-cache.js';
|
|
11
|
+
export const PROVIDERS = [
|
|
12
|
+
{ id: 'anthropic', label: 'Anthropic (Claude)', defaultModel: 'claude-sonnet-4-20250514' },
|
|
13
|
+
{ id: 'openai', label: 'OpenAI (GPT)', defaultModel: 'gpt-4o' },
|
|
14
|
+
{ id: 'google', label: 'Google (Gemini)', defaultModel: 'gemini-1.5-pro' },
|
|
15
|
+
{ id: 'ollama', label: 'Ollama (local)', defaultModel: 'llama3.2' },
|
|
16
|
+
];
|
|
17
|
+
export function validateApiKeyForProvider(provider, key) {
|
|
18
|
+
if (provider === 'anthropic') {
|
|
19
|
+
if (!key.startsWith('sk-ant-'))
|
|
20
|
+
return 'Anthropic API keys must start with sk-ant-';
|
|
21
|
+
}
|
|
22
|
+
else if (provider === 'openai') {
|
|
23
|
+
if (!key.startsWith('sk-') || key.startsWith('sk-ant-'))
|
|
24
|
+
return 'OpenAI API keys must start with sk- (and not be an Anthropic key)';
|
|
25
|
+
}
|
|
26
|
+
else if (provider === 'google') {
|
|
27
|
+
if (!key.startsWith('AIza'))
|
|
28
|
+
return 'Google API keys must start with AIza';
|
|
29
|
+
}
|
|
30
|
+
// ollama / unknown providers: no format constraint
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
export async function addProviderConfig(configFile, provider, apiKey, setDefault, model) {
|
|
34
|
+
const config = await loadRawConfig(configFile);
|
|
35
|
+
if (!config.providers || typeof config.providers !== 'object') {
|
|
36
|
+
config.providers = {};
|
|
37
|
+
}
|
|
38
|
+
if (provider === 'ollama') {
|
|
39
|
+
config.providers[provider] = { baseUrl: apiKey };
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
config.providers[provider] = { apiKey };
|
|
43
|
+
}
|
|
44
|
+
if (setDefault) {
|
|
45
|
+
const meta = PROVIDERS.find((p) => p.id === provider);
|
|
46
|
+
config.defaults = {
|
|
47
|
+
provider,
|
|
48
|
+
model: model ?? meta?.defaultModel ?? 'claude-sonnet-4-20250514',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
await saveConfig(configFile, config);
|
|
52
|
+
}
|
|
53
|
+
export async function isProviderConfigured(configFile, provider) {
|
|
54
|
+
const config = await loadRawConfig(configFile);
|
|
55
|
+
if (!config.providers || typeof config.providers !== 'object')
|
|
56
|
+
return false;
|
|
57
|
+
return provider in config.providers;
|
|
58
|
+
}
|
|
59
|
+
export function getConfigValue(config, path) {
|
|
60
|
+
const parts = path.split('.');
|
|
61
|
+
let current = config;
|
|
62
|
+
for (const part of parts) {
|
|
63
|
+
if (current === null || typeof current !== 'object')
|
|
64
|
+
return undefined;
|
|
65
|
+
current = current[part];
|
|
66
|
+
}
|
|
67
|
+
return current;
|
|
68
|
+
}
|
|
69
|
+
export function setConfigValue(config, path, value) {
|
|
70
|
+
const parts = path.split('.');
|
|
71
|
+
let current = config;
|
|
72
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
73
|
+
const part = parts[i];
|
|
74
|
+
if (typeof current[part] !== 'object' || current[part] === null) {
|
|
75
|
+
current[part] = {};
|
|
76
|
+
}
|
|
77
|
+
current = current[part];
|
|
78
|
+
}
|
|
79
|
+
current[parts[parts.length - 1]] = value;
|
|
80
|
+
}
|
|
81
|
+
export function maskSecrets(obj) {
|
|
82
|
+
if (Array.isArray(obj))
|
|
83
|
+
return obj.map(maskSecrets);
|
|
84
|
+
if (obj !== null && typeof obj === 'object') {
|
|
85
|
+
return Object.fromEntries(Object.entries(obj).map(([k, v]) => {
|
|
86
|
+
if (k.toLowerCase() === 'apikey' && typeof v === 'string') {
|
|
87
|
+
const prefix = v.slice(0, 3);
|
|
88
|
+
return [k, `${prefix}***...`];
|
|
89
|
+
}
|
|
90
|
+
return [k, maskSecrets(v)];
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
return obj;
|
|
94
|
+
}
|
|
95
|
+
async function resolveConfigFilePath() {
|
|
96
|
+
const studioDir = await findStudioDir(process.cwd());
|
|
97
|
+
if (studioDir)
|
|
98
|
+
return join(studioDir, 'config.yaml');
|
|
99
|
+
// Create .studio/ at cwd if nothing found
|
|
100
|
+
const newStudioDir = resolve(process.cwd(), '.studio');
|
|
101
|
+
await mkdir(newStudioDir, { recursive: true });
|
|
102
|
+
return join(newStudioDir, 'config.yaml');
|
|
103
|
+
}
|
|
104
|
+
async function loadRawConfig(configFile) {
|
|
105
|
+
try {
|
|
106
|
+
const raw = await readFile(configFile, 'utf-8');
|
|
107
|
+
const parsed = yaml.load(resolveEnvVars(raw));
|
|
108
|
+
return (parsed && typeof parsed === 'object' ? parsed : {});
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return {};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function saveConfig(configFile, config) {
|
|
115
|
+
await mkdir(dirname(configFile), { recursive: true });
|
|
116
|
+
await writeFile(configFile, yaml.dump(config), 'utf-8');
|
|
117
|
+
}
|
|
118
|
+
async function configAddProviderWizard(configFile) {
|
|
119
|
+
const config = await loadRawConfig(configFile);
|
|
120
|
+
const existingProviders = config.providers
|
|
121
|
+
? Object.keys(config.providers)
|
|
122
|
+
: [];
|
|
123
|
+
// Step 1: Select provider
|
|
124
|
+
const providerId = await select({
|
|
125
|
+
message: 'Which provider would you like to add?',
|
|
126
|
+
choices: PROVIDERS.map((p) => ({ value: p.id, name: p.label })),
|
|
127
|
+
});
|
|
128
|
+
// Step 2: Handle already-configured case
|
|
129
|
+
if (existingProviders.includes(providerId)) {
|
|
130
|
+
const providerLabel = PROVIDERS.find((p) => p.id === providerId)?.label ?? providerId;
|
|
131
|
+
const override = await confirm({
|
|
132
|
+
message: `${providerLabel} is already configured. Override?`,
|
|
133
|
+
default: false,
|
|
134
|
+
});
|
|
135
|
+
if (!override) {
|
|
136
|
+
console.log('Aborted.');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Step 3: Ask for API key (or base URL for ollama)
|
|
141
|
+
let apiKey = '';
|
|
142
|
+
if (providerId === 'ollama') {
|
|
143
|
+
apiKey = await input({
|
|
144
|
+
message: 'Ollama base URL:',
|
|
145
|
+
default: 'http://localhost:11434',
|
|
146
|
+
});
|
|
147
|
+
const spinner = ora('Validating connection...').start();
|
|
148
|
+
const result = await validateApiKeyLive('ollama', '', { baseUrl: apiKey });
|
|
149
|
+
if (result.status === 'valid')
|
|
150
|
+
spinner.succeed('Connected');
|
|
151
|
+
else if (result.status === 'warning')
|
|
152
|
+
spinner.warn(result.message);
|
|
153
|
+
else
|
|
154
|
+
spinner.fail(result.error);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const providerLabel = PROVIDERS.find((p) => p.id === providerId)?.label ?? providerId;
|
|
158
|
+
while (true) {
|
|
159
|
+
apiKey = await password({
|
|
160
|
+
message: `${providerLabel} API Key:`,
|
|
161
|
+
validate: (value) => validateApiKeyForProvider(providerId, value),
|
|
162
|
+
});
|
|
163
|
+
const spinner = ora('Validating...').start();
|
|
164
|
+
const result = await validateApiKeyLive(providerId, apiKey);
|
|
165
|
+
spinner.stop();
|
|
166
|
+
if (result.status === 'valid') {
|
|
167
|
+
console.log(chalk.green(' ✓ Valid'));
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
else if (result.status === 'warning') {
|
|
171
|
+
console.log(chalk.yellow(` ⚠ ${result.message}`));
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.log(chalk.red(` ✗ ${result.error}`));
|
|
176
|
+
console.log(chalk.gray(' Please try again.'));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Step 4: Set as default?
|
|
181
|
+
const isFirstProvider = existingProviders.filter((p) => p !== providerId).length === 0;
|
|
182
|
+
const setDefault = isFirstProvider ||
|
|
183
|
+
(await confirm({
|
|
184
|
+
message: 'Set as default provider?',
|
|
185
|
+
default: true,
|
|
186
|
+
}));
|
|
187
|
+
// Step 4b: Choose default model (if setting as default and models are available)
|
|
188
|
+
let defaultModel;
|
|
189
|
+
if (setDefault && providerId !== 'ollama') {
|
|
190
|
+
const models = await getAvailableModels(providerId, apiKey);
|
|
191
|
+
const meta = PROVIDERS.find((p) => p.id === providerId);
|
|
192
|
+
const fallbackModel = meta?.defaultModel ?? 'claude-sonnet-4-20250514';
|
|
193
|
+
if (models.length > 0) {
|
|
194
|
+
const choices = [
|
|
195
|
+
...models.map((m) => ({ value: m, name: m })),
|
|
196
|
+
{ value: '__custom__', name: 'Enter custom model ID' },
|
|
197
|
+
];
|
|
198
|
+
const selected = await select({
|
|
199
|
+
message: 'Default model:',
|
|
200
|
+
choices,
|
|
201
|
+
default: models.includes(fallbackModel) ? fallbackModel : models[0],
|
|
202
|
+
});
|
|
203
|
+
if (selected === '__custom__') {
|
|
204
|
+
defaultModel = await input({ message: 'Model ID:', default: fallbackModel });
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
defaultModel = selected;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
defaultModel = await input({ message: 'Default model:', default: fallbackModel });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Step 5: Write config
|
|
215
|
+
await addProviderConfig(configFile, providerId, apiKey, setDefault, defaultModel);
|
|
216
|
+
// Step 6: Confirmation output
|
|
217
|
+
const label = PROVIDERS.find((p) => p.id === providerId)?.label ?? providerId;
|
|
218
|
+
console.log('');
|
|
219
|
+
console.log(chalk.green(`✓ ${label} provider configured`));
|
|
220
|
+
if (setDefault)
|
|
221
|
+
console.log(chalk.green('✓ Set as default'));
|
|
222
|
+
console.log('');
|
|
223
|
+
console.log('You can now run:');
|
|
224
|
+
console.log(` ${chalk.cyan('studio run <pipeline> --input "..."')}`);
|
|
225
|
+
console.log('');
|
|
226
|
+
}
|
|
227
|
+
export async function configCommand(action, args, options) {
|
|
228
|
+
try {
|
|
229
|
+
const configFile = await resolveConfigFilePath();
|
|
230
|
+
switch (action) {
|
|
231
|
+
case 'list': {
|
|
232
|
+
const config = await loadRawConfig(configFile);
|
|
233
|
+
const masked = maskSecrets(config);
|
|
234
|
+
console.log('');
|
|
235
|
+
console.log(chalk.bold('Studio Configuration:'));
|
|
236
|
+
console.log(chalk.gray(` File: ${configFile}`));
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log(yaml.dump(masked));
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'get': {
|
|
242
|
+
const path = args[0];
|
|
243
|
+
if (!path) {
|
|
244
|
+
console.error('Usage: studio config get <dotted.path>');
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
const config = await loadRawConfig(configFile);
|
|
248
|
+
const value = getConfigValue(config, path);
|
|
249
|
+
if (value === undefined) {
|
|
250
|
+
console.log(chalk.yellow(`(not set)`));
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
console.log(String(value));
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case 'set': {
|
|
258
|
+
const config = await loadRawConfig(configFile);
|
|
259
|
+
// Convenience: studio config set provider <name> --api-key <key>
|
|
260
|
+
if (args[0] === 'provider' && args[1] && options.apiKey) {
|
|
261
|
+
const providerName = args[1];
|
|
262
|
+
setConfigValue(config, `providers.${providerName}.apiKey`, options.apiKey);
|
|
263
|
+
await saveConfig(configFile, config);
|
|
264
|
+
console.log(chalk.green(`✓ Set providers.${providerName}.apiKey`));
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
// Special case: interactive model selection when no value provided
|
|
268
|
+
if (args[0] === 'defaults.model' && args[1] === undefined) {
|
|
269
|
+
const rawConfig = await loadRawConfig(configFile);
|
|
270
|
+
const defaults = rawConfig.defaults;
|
|
271
|
+
const provider = defaults?.provider;
|
|
272
|
+
const providerConfig = provider && rawConfig.providers
|
|
273
|
+
? rawConfig.providers[provider]
|
|
274
|
+
: undefined;
|
|
275
|
+
const apiKey = providerConfig?.apiKey ?? '';
|
|
276
|
+
if (!provider) {
|
|
277
|
+
console.error('Error: no default provider configured. Run studio config add-provider first.');
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
const spinner = ora(`Fetching models for ${provider}...`).start();
|
|
281
|
+
const models = await getAvailableModels(provider, apiKey);
|
|
282
|
+
spinner.stop();
|
|
283
|
+
if (models.length === 0) {
|
|
284
|
+
console.error(`Error: could not fetch models for provider '${provider}'. ` +
|
|
285
|
+
`Provide the model ID directly: studio config set defaults.model <model-id>`);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
const selectedModel = await select({
|
|
289
|
+
message: 'Default model:',
|
|
290
|
+
choices: models.map((m) => ({ value: m, name: m })),
|
|
291
|
+
default: defaults?.model && models.includes(defaults.model) ? defaults.model : models[0],
|
|
292
|
+
});
|
|
293
|
+
setConfigValue(rawConfig, 'defaults.model', selectedModel);
|
|
294
|
+
await saveConfig(configFile, rawConfig);
|
|
295
|
+
console.log(chalk.green(`✓ Set defaults.model = ${selectedModel}`));
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
// Generic: studio config set <dotted.path> <value>
|
|
299
|
+
const path = args[0];
|
|
300
|
+
const value = args[1];
|
|
301
|
+
if (!path || value === undefined) {
|
|
302
|
+
console.error('Usage: studio config set <dotted.path> <value>');
|
|
303
|
+
console.error(' studio config set provider <name> --api-key <key>');
|
|
304
|
+
process.exit(1);
|
|
305
|
+
}
|
|
306
|
+
setConfigValue(config, path, value);
|
|
307
|
+
await saveConfig(configFile, config);
|
|
308
|
+
console.log(chalk.green(`✓ Set ${path} = ${value}`));
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
case 'add-provider': {
|
|
312
|
+
const provider = args[0];
|
|
313
|
+
if (!provider) {
|
|
314
|
+
// Wizard mode
|
|
315
|
+
await configAddProviderWizard(configFile);
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
// Direct mode
|
|
319
|
+
if (provider !== 'ollama' && !options.apiKey) {
|
|
320
|
+
console.error(`Error: --api-key is required for provider '${provider}'`);
|
|
321
|
+
process.exit(1);
|
|
322
|
+
}
|
|
323
|
+
const apiKey = options.apiKey ?? '';
|
|
324
|
+
if (provider !== 'ollama') {
|
|
325
|
+
const validation = validateApiKeyForProvider(provider, apiKey);
|
|
326
|
+
if (validation !== true) {
|
|
327
|
+
console.error(`Error: ${validation}`);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
process.stdout.write('Validating...');
|
|
331
|
+
const result = await validateApiKeyLive(provider, apiKey);
|
|
332
|
+
if (result.status === 'valid') {
|
|
333
|
+
console.log(chalk.green(' ✓ Valid'));
|
|
334
|
+
}
|
|
335
|
+
else if (result.status === 'warning') {
|
|
336
|
+
console.log(chalk.yellow(` ⚠ ${result.message}`));
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
console.error(chalk.red(` ✗ ${result.error}`));
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
process.stdout.write('Validating connection...');
|
|
345
|
+
const result = await validateApiKeyLive('ollama', '', {
|
|
346
|
+
baseUrl: apiKey || 'http://localhost:11434',
|
|
347
|
+
});
|
|
348
|
+
const msg = 'message' in result ? result.message : '';
|
|
349
|
+
if (result.status === 'valid') {
|
|
350
|
+
console.log(chalk.green(' ✓ Connected'));
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
console.log(chalk.yellow(` ⚠ ${msg}`));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Check already configured
|
|
357
|
+
const alreadyConfigured = await isProviderConfigured(configFile, provider);
|
|
358
|
+
if (alreadyConfigured) {
|
|
359
|
+
console.error(`Error: Provider '${provider}' is already configured. Use 'studio config set' to update it, or run the wizard to override.`);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
// Determine setDefault
|
|
363
|
+
const config = await loadRawConfig(configFile);
|
|
364
|
+
const existingCount = config.providers
|
|
365
|
+
? Object.keys(config.providers).length
|
|
366
|
+
: 0;
|
|
367
|
+
const setDefault = options.setDefault ?? existingCount === 0;
|
|
368
|
+
await addProviderConfig(configFile, provider, apiKey, setDefault);
|
|
369
|
+
const label = PROVIDERS.find((p) => p.id === provider)?.label ?? provider;
|
|
370
|
+
console.log(chalk.green(`✓ ${label} provider configured`));
|
|
371
|
+
if (setDefault)
|
|
372
|
+
console.log(chalk.green('✓ Set as default'));
|
|
373
|
+
console.log('');
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
default:
|
|
377
|
+
console.error(`Unknown config action: ${action}. Available: list, get, set, add-provider`);
|
|
378
|
+
process.exit(1);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
if (error instanceof Error && error.name === 'ExitPromptError') {
|
|
383
|
+
console.log('\nAborted.');
|
|
384
|
+
process.exit(0);
|
|
385
|
+
}
|
|
386
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rename .studio/ to .studio.backup-<timestamp>/ in `cwd`.
|
|
3
|
+
* Returns the absolute path to the backup directory.
|
|
4
|
+
*/
|
|
5
|
+
export declare function backupStudioDir(cwd: string): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Create the full .studio/ directory structure in `cwd`.
|
|
8
|
+
* If templateName is provided and is not 'blank', installs the template from the registry
|
|
9
|
+
* to .studio/projects/<name>/ and copies studio-specific subdirs (pipelines, agents, etc.)
|
|
10
|
+
* from the installed location into .studio/.
|
|
11
|
+
* Throws if .studio/ already exists anywhere in the directory tree.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createStudioStructure(cwd: string, templateName?: string, withTools?: boolean): Promise<void>;
|
|
14
|
+
export declare function detectOllamaInstalled(): boolean;
|
|
15
|
+
export declare function hasAdequateRam(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Write provider credentials and defaults into .studio/config.yaml.
|
|
18
|
+
* Parses the existing config, sets the provider key, then rewrites.
|
|
19
|
+
* Comments from the original template are lost — accepted for Phase 1.
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeProviderToConfig(studioDir: string, provider: string, credentials?: {
|
|
22
|
+
apiKey?: string;
|
|
23
|
+
baseUrl?: string;
|
|
24
|
+
}, model?: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Direct init (non-interactive) — creates .studio/ structure and writes config.
|
|
27
|
+
* @deprecated Use generateFullApp() for full app generation (src/, prisma/, git init).
|
|
28
|
+
* This function only creates the .studio/ workspace without app scaffold files.
|
|
29
|
+
* Kept for backward compatibility.
|
|
30
|
+
*/
|
|
31
|
+
export declare function directInit(cwd: string, templateName: string, provider: string, apiKey: string, noTools?: boolean): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Validate API key format without making a network call.
|
|
34
|
+
* Returns true if valid, or an error string to display.
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateApiKeyFormat(provider: string, key: string): true | string;
|
|
37
|
+
/**
|
|
38
|
+
* Validate a project name for use as a directory name.
|
|
39
|
+
* Returns true if valid, or an error string to display.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateProjectName(name: string): true | string;
|
|
42
|
+
/**
|
|
43
|
+
* Copy app scaffold files (src/, prisma/, package.json, README.md) from
|
|
44
|
+
* `templateDir` to `targetDir`, applying placeholder replacement to all
|
|
45
|
+
* text file contents. Items missing from the template are silently skipped.
|
|
46
|
+
*
|
|
47
|
+
* @returns List of top-level items that were generated (e.g. ['src/', 'package.json'])
|
|
48
|
+
*/
|
|
49
|
+
export declare function generateAppFiles(templateDir: string, targetDir: string, vars: Record<string, string>): Promise<string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Run `git init` in `cwd` unless `.git/` already exists.
|
|
52
|
+
* Returns true if git was initialized, false if skipped.
|
|
53
|
+
* Throws if `git init` exits with non-zero status.
|
|
54
|
+
*/
|
|
55
|
+
export declare function initGitRepo(cwd: string): Promise<boolean>;
|
|
56
|
+
interface GenerateFullAppOptions {
|
|
57
|
+
noTools?: boolean;
|
|
58
|
+
skipGit?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Generate a complete app from a template:
|
|
62
|
+
* 1. Creates .studio/ workspace and installs the template from the registry to .studio/projects/<name>/
|
|
63
|
+
* 2. Copies app scaffold files (src/, prisma/, package.json, README.md) from the installed template
|
|
64
|
+
* 3. Initializes a git repository (unless skipGit)
|
|
65
|
+
*
|
|
66
|
+
* Does NOT write provider config — call writeProviderToConfig separately.
|
|
67
|
+
*
|
|
68
|
+
* @returns `{ gitInitialized, generatedFiles }` — gitInitialized is true if git was initialized,
|
|
69
|
+
* generatedFiles is the list of top-level scaffold items actually created (e.g. ['src/', 'package.json']).
|
|
70
|
+
*/
|
|
71
|
+
export declare function generateFullApp(cwd: string, projectName: string, templateName: string, options?: GenerateFullAppOptions): Promise<{
|
|
72
|
+
gitInitialized: boolean;
|
|
73
|
+
generatedFiles: string[];
|
|
74
|
+
}>;
|
|
75
|
+
interface InitOptions {
|
|
76
|
+
template?: string;
|
|
77
|
+
project?: string;
|
|
78
|
+
provider?: string;
|
|
79
|
+
apiKey?: string;
|
|
80
|
+
force?: boolean;
|
|
81
|
+
yes?: boolean;
|
|
82
|
+
tools?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface HardwareInfo {
|
|
85
|
+
totalRamGb: number;
|
|
86
|
+
hasDocker: boolean;
|
|
87
|
+
hasNativeOllama: boolean;
|
|
88
|
+
ollamaAvailable: boolean;
|
|
89
|
+
}
|
|
90
|
+
export declare function detectHardware(): HardwareInfo;
|
|
91
|
+
export declare function initCommand(nameArg?: string, options?: InitOptions): Promise<void>;
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlE;AA6CD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,UAAO,GACf,OAAO,CAAC,IAAI,CAAC,CA2Df;AAyBD,wBAAgB,qBAAqB,IAAI,OAAO,CAK/C;AAID,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,UAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAWjF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAM/D;AAKD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB;AAsCD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW/D;AAED,UAAU,sBAAsB;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAuBhE;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,cAAc,IAAI,YAAY,CAU7C;AAiCD,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsY5F"}
|