@nac3/forge-cli 0.2.0-alpha.2 → 0.2.0-alpha.20
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/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +25 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +22 -15
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +75 -22
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +90 -3
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.js +498 -32
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/audit_consumers.d.ts +66 -0
- package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
- package/dist/chat/tools/audit_consumers.js +231 -0
- package/dist/chat/tools/audit_consumers.js.map +1 -0
- package/dist/chat/tools/git.js +4 -4
- package/dist/chat/tools/github.js +3 -3
- package/dist/chat/tools/lifecycle.js +3 -3
- package/dist/chat/tools/manual.js +1 -1
- package/dist/chat/tools/reader.js +8 -8
- package/dist/chat/tools/workflow.d.ts +45 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -0
- package/dist/chat/tools/workflow.js +404 -0
- package/dist/chat/tools/workflow.js.map +1 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +23 -4
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/approve.d.ts +32 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +198 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/block.d.ts +28 -0
- package/dist/commands/block.d.ts.map +1 -0
- package/dist/commands/block.js +189 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +35 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +205 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +46 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/clarify.d.ts +30 -0
- package/dist/commands/clarify.d.ts.map +1 -0
- package/dist/commands/clarify.js +671 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.js +94 -42
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/keys_setup.d.ts +53 -0
- package/dist/commands/keys_setup.d.ts.map +1 -0
- package/dist/commands/keys_setup.js +487 -0
- package/dist/commands/keys_setup.js.map +1 -0
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +41 -0
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/operate.d.ts +22 -0
- package/dist/commands/operate.d.ts.map +1 -0
- package/dist/commands/operate.js +483 -0
- package/dist/commands/operate.js.map +1 -0
- package/dist/commands/spec.d.ts +38 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +256 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +214 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/commands/voice.js +1 -1
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/workflow-coverage.d.ts +30 -0
- package/dist/commands/workflow-coverage.d.ts.map +1 -0
- package/dist/commands/workflow-coverage.js +138 -0
- package/dist/commands/workflow-coverage.js.map +1 -0
- package/dist/core/keys_envelope.d.ts +13 -0
- package/dist/core/keys_envelope.d.ts.map +1 -1
- package/dist/core/keys_envelope.js.map +1 -1
- package/dist/deploy/adapter.d.ts +93 -0
- package/dist/deploy/adapter.d.ts.map +1 -0
- package/dist/deploy/adapter.js +42 -0
- package/dist/deploy/adapter.js.map +1 -0
- package/dist/deploy/aws_adapter.d.ts +28 -0
- package/dist/deploy/aws_adapter.d.ts.map +1 -0
- package/dist/deploy/aws_adapter.js +65 -0
- package/dist/deploy/aws_adapter.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts +24 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +169 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/license/hito4_client.d.ts +17 -1
- package/dist/license/hito4_client.d.ts.map +1 -1
- package/dist/license/hito4_client.js +71 -10
- package/dist/license/hito4_client.js.map +1 -1
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +7 -0
- package/dist/license/index.js.map +1 -1
- package/dist/license/sync.d.ts +54 -0
- package/dist/license/sync.d.ts.map +1 -0
- package/dist/license/sync.js +131 -0
- package/dist/license/sync.js.map +1 -0
- package/dist/telemetry/usage.d.ts +67 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +208 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/intents.d.ts +1 -1
- package/dist/voice/intents.js +0 -0
- package/dist/voice/providers/google.d.ts.map +1 -1
- package/dist/voice/providers/google.js +157 -27
- package/dist/voice/providers/google.js.map +1 -1
- package/dist/voice/router.d.ts +10 -0
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +39 -20
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/types.d.ts +5 -2
- package/dist/voice/types.d.ts.map +1 -1
- package/dist/voice/types.js.map +1 -1
- package/dist/workflow/state.d.ts +190 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +119 -0
- package/dist/workflow/state.js.map +1 -0
- package/package.json +13 -15
- package/templates/nextjs-app/README.md +48 -0
- package/templates/nextjs-app/next.config.js +8 -0
- package/templates/nextjs-app/package.json +33 -0
- package/templates/nextjs-app/src/app/globals.css +43 -0
- package/templates/nextjs-app/src/app/layout.tsx +29 -0
- package/templates/nextjs-app/src/app/page.tsx +63 -0
- package/templates/nextjs-app/src/nac/manifest.ts +36 -0
- package/templates/nextjs-app/tsconfig.json +21 -0
- package/templates/nextjs-app/yujin.forge.json +11 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import { c, header } from '../ui/colors.js';
|
|
6
|
+
import { Vault } from '../vault/store.js';
|
|
7
|
+
import { configDir } from '../license/index.js';
|
|
8
|
+
import { readLicense } from '../core/polar.js';
|
|
9
|
+
import { signBearer, HITO4_BASE_URL } from '../license/hito4_client.js';
|
|
10
|
+
import { encryptUserKeys, decryptUserKeys, envelopeToBlob, envelopeFromBlob, } from '../core/keys_envelope.js';
|
|
11
|
+
const VAULT_SECRET_SLOT = 'yf_server_api_key';
|
|
12
|
+
const LOCAL_KEYS_FILE = 'provider_keys.json';
|
|
13
|
+
function localKeysPath() {
|
|
14
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
15
|
+
return path.join(home, '.yujin-forge', LOCAL_KEYS_FILE);
|
|
16
|
+
}
|
|
17
|
+
async function readLocalKeys() {
|
|
18
|
+
try {
|
|
19
|
+
const raw = await fs.readFile(localKeysPath(), 'utf-8');
|
|
20
|
+
const parsed = JSON.parse(raw);
|
|
21
|
+
if (parsed && parsed.v === 1)
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
catch { /* missing or malformed -- treat as empty */ }
|
|
25
|
+
return { v: 1, updated_at: '1970-01-01T00:00:00Z' };
|
|
26
|
+
}
|
|
27
|
+
async function writeLocalKeys(payload) {
|
|
28
|
+
const p = localKeysPath();
|
|
29
|
+
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
30
|
+
const tmp = p + '.tmp';
|
|
31
|
+
await fs.writeFile(tmp, JSON.stringify(payload, null, 2), 'utf-8');
|
|
32
|
+
await fs.rename(tmp, p);
|
|
33
|
+
}
|
|
34
|
+
function maskKey(k) {
|
|
35
|
+
if (!k)
|
|
36
|
+
return '(none)';
|
|
37
|
+
if (k.length <= 8)
|
|
38
|
+
return '****';
|
|
39
|
+
return k.slice(0, 4) + '...' + k.slice(-4);
|
|
40
|
+
}
|
|
41
|
+
async function loadServerSecret() {
|
|
42
|
+
const vault = await Vault.open({ configDir: configDir() });
|
|
43
|
+
if (!vault.has(VAULT_SECRET_SLOT)) {
|
|
44
|
+
throw new Error('keys setup: vault slot "' + VAULT_SECRET_SLOT + '" is empty. '
|
|
45
|
+
+ 'Run `yf vault set ' + VAULT_SECRET_SLOT + '` with the value '
|
|
46
|
+
+ 'provided at signup before configuring provider keys.');
|
|
47
|
+
}
|
|
48
|
+
return vault.get(VAULT_SECRET_SLOT);
|
|
49
|
+
}
|
|
50
|
+
async function loadUserHandle() {
|
|
51
|
+
const lic = await readLicense();
|
|
52
|
+
if (!lic.user_handle) {
|
|
53
|
+
throw new Error('keys setup: no user_handle on the local license cache. '
|
|
54
|
+
+ 'Run `yf license activate --user-handle <you@example.com>` first.');
|
|
55
|
+
}
|
|
56
|
+
return lic.user_handle;
|
|
57
|
+
}
|
|
58
|
+
async function pushToServer(payload) {
|
|
59
|
+
const secret = await loadServerSecret();
|
|
60
|
+
const handle = await loadUserHandle();
|
|
61
|
+
const env = await encryptUserKeys(payload, secret);
|
|
62
|
+
const blob = envelopeToBlob(env);
|
|
63
|
+
const bearer = signBearer(secret, handle);
|
|
64
|
+
const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
|
|
65
|
+
const r = await fetch(url, {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
headers: { Authorization: 'Bearer ' + bearer, 'content-type': 'application/json' },
|
|
68
|
+
body: JSON.stringify({ blob, ts: payload.updated_at }),
|
|
69
|
+
});
|
|
70
|
+
if (!r.ok) {
|
|
71
|
+
let detail = '';
|
|
72
|
+
try {
|
|
73
|
+
detail = await r.text();
|
|
74
|
+
}
|
|
75
|
+
catch { /* */ }
|
|
76
|
+
throw new Error('keys setup: server push failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function pullFromServer() {
|
|
80
|
+
const secret = await loadServerSecret();
|
|
81
|
+
const handle = await loadUserHandle();
|
|
82
|
+
const bearer = signBearer(secret, handle);
|
|
83
|
+
const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
|
|
84
|
+
const r = await fetch(url, { method: 'GET', headers: { Authorization: 'Bearer ' + bearer } });
|
|
85
|
+
if (!r.ok) {
|
|
86
|
+
let detail = '';
|
|
87
|
+
try {
|
|
88
|
+
detail = await r.text();
|
|
89
|
+
}
|
|
90
|
+
catch { /* */ }
|
|
91
|
+
throw new Error('keys setup: server pull failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
|
|
92
|
+
}
|
|
93
|
+
const body = await r.json();
|
|
94
|
+
if (!body.blob)
|
|
95
|
+
return null;
|
|
96
|
+
const env = envelopeFromBlob(body.blob);
|
|
97
|
+
return decryptUserKeys(env, secret);
|
|
98
|
+
}
|
|
99
|
+
/** Fetch the live model list from the worker. The worker proxies
|
|
100
|
+
* to the upstream provider using the BYOK key in the header --
|
|
101
|
+
* key is never persisted nor logged on the server. */
|
|
102
|
+
async function fetchBrainModels(provider, apiKey) {
|
|
103
|
+
const url = HITO4_BASE_URL.replace(/\/+$/, '')
|
|
104
|
+
+ '/v1/brain-providers/' + encodeURIComponent(provider) + '/models';
|
|
105
|
+
try {
|
|
106
|
+
const r = await fetch(url, {
|
|
107
|
+
method: 'GET',
|
|
108
|
+
headers: { 'x-yf-brain-key': apiKey },
|
|
109
|
+
});
|
|
110
|
+
if (!r.ok) {
|
|
111
|
+
return { models: [], fromUpstream: false, error: 'HTTP ' + r.status };
|
|
112
|
+
}
|
|
113
|
+
const body = await r.json();
|
|
114
|
+
return {
|
|
115
|
+
models: body.models ?? [],
|
|
116
|
+
fromUpstream: body.from_upstream === true,
|
|
117
|
+
error: body.upstream_error ?? undefined,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
return { models: [], fromUpstream: false, error: e instanceof Error ? e.message : String(e) };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const BRAIN_PROVIDER_CHOICES = [
|
|
125
|
+
{ title: 'Anthropic (Claude opus/sonnet/haiku)', value: 'anthropic',
|
|
126
|
+
hint: 'API key starts with sk-ant-' },
|
|
127
|
+
{ title: 'OpenAI (GPT-5 / GPT-4o / o3 / o3-mini)', value: 'openai',
|
|
128
|
+
hint: 'API key starts with sk-' },
|
|
129
|
+
{ title: 'Google AI Studio (Gemini 2.5 Pro/Flash)', value: 'google',
|
|
130
|
+
hint: 'API key from aistudio.google.com (NOT a Cloud STT/TTS key)' },
|
|
131
|
+
{ title: 'DeepSeek (chat / reasoner R1)', value: 'deepseek',
|
|
132
|
+
hint: 'API key starts with sk-' },
|
|
133
|
+
];
|
|
134
|
+
function brainKeyOf(p, provider) {
|
|
135
|
+
if (provider === 'anthropic')
|
|
136
|
+
return p.anthropic_api_key;
|
|
137
|
+
if (provider === 'openai')
|
|
138
|
+
return p.openai_api_key;
|
|
139
|
+
if (provider === 'google')
|
|
140
|
+
return p.google_ai_key;
|
|
141
|
+
if (provider === 'deepseek')
|
|
142
|
+
return p.deepseek_api_key;
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
function setBrainKey(p, provider, key) {
|
|
146
|
+
if (provider === 'anthropic')
|
|
147
|
+
p.anthropic_api_key = key;
|
|
148
|
+
else if (provider === 'openai')
|
|
149
|
+
p.openai_api_key = key;
|
|
150
|
+
else if (provider === 'google')
|
|
151
|
+
p.google_ai_key = key;
|
|
152
|
+
else if (provider === 'deepseek')
|
|
153
|
+
p.deepseek_api_key = key;
|
|
154
|
+
}
|
|
155
|
+
function brainModelOf(p, provider) {
|
|
156
|
+
if (provider === 'anthropic')
|
|
157
|
+
return p.anthropic_model_preference;
|
|
158
|
+
if (provider === 'openai')
|
|
159
|
+
return p.openai_brain_model_preference;
|
|
160
|
+
if (provider === 'google')
|
|
161
|
+
return p.google_brain_model_preference;
|
|
162
|
+
if (provider === 'deepseek')
|
|
163
|
+
return p.deepseek_model_preference;
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
function setBrainModel(p, provider, model) {
|
|
167
|
+
if (provider === 'anthropic')
|
|
168
|
+
p.anthropic_model_preference = model;
|
|
169
|
+
else if (provider === 'openai')
|
|
170
|
+
p.openai_brain_model_preference = model;
|
|
171
|
+
else if (provider === 'google')
|
|
172
|
+
p.google_brain_model_preference = model;
|
|
173
|
+
else if (provider === 'deepseek')
|
|
174
|
+
p.deepseek_model_preference = model;
|
|
175
|
+
}
|
|
176
|
+
function printCurrent(p) {
|
|
177
|
+
header('Yujin Forge -- keys setup (current local)');
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(c.brand(' Brain (AI for chat + code):'));
|
|
180
|
+
console.log(' Preferred provider: ' + c.brand(p.brain_provider_preference ?? '(not set)'));
|
|
181
|
+
console.log(' Anthropic key: ' + c.dim(maskKey(p.anthropic_api_key))
|
|
182
|
+
+ (p.anthropic_model_preference ? ' -- model: ' + c.brand(p.anthropic_model_preference) : ''));
|
|
183
|
+
console.log(' OpenAI key: ' + c.dim(maskKey(p.openai_api_key))
|
|
184
|
+
+ (p.openai_brain_model_preference ? ' -- model: ' + c.brand(p.openai_brain_model_preference) : ''));
|
|
185
|
+
console.log(' Google AI key: ' + c.dim(maskKey(p.google_ai_key))
|
|
186
|
+
+ (p.google_brain_model_preference ? ' -- model: ' + c.brand(p.google_brain_model_preference) : ''));
|
|
187
|
+
console.log(' DeepSeek key: ' + c.dim(maskKey(p.deepseek_api_key))
|
|
188
|
+
+ (p.deepseek_model_preference ? ' -- model: ' + c.brand(p.deepseek_model_preference) : ''));
|
|
189
|
+
console.log('');
|
|
190
|
+
console.log(c.brand(' Voice (STT + TTS):'));
|
|
191
|
+
console.log(' OpenAI key (shared): ' + c.dim(maskKey(p.openai_api_key)));
|
|
192
|
+
console.log(' Google STT key: ' + c.dim(maskKey(p.google_stt_key)));
|
|
193
|
+
console.log(' Google TTS key: ' + c.dim(maskKey(p.google_tts_key)));
|
|
194
|
+
console.log(' ElevenLabs key: ' + c.dim(maskKey(p.elevenlabs_api_key)));
|
|
195
|
+
console.log(' STT preference: ' + c.brand(p.stt_provider_preference ?? '(not set)'));
|
|
196
|
+
console.log(' TTS preference: ' + c.brand(p.tts_provider_preference ?? '(not set)'));
|
|
197
|
+
console.log(' STT language: ' + (p.stt_language ?? c.dim('(default)')));
|
|
198
|
+
console.log(' TTS voice: ' + (p.tts_voice ?? c.dim('(default)')));
|
|
199
|
+
console.log('');
|
|
200
|
+
console.log(' Last updated: ' + c.dim(p.updated_at));
|
|
201
|
+
}
|
|
202
|
+
const NON_INTERACTIVE_PROVIDERS = new Set([
|
|
203
|
+
'anthropic', 'openai', 'google-ai', 'deepseek',
|
|
204
|
+
'openai-voice', 'google-stt', 'google-tts', 'elevenlabs',
|
|
205
|
+
]);
|
|
206
|
+
function applyNonInteractiveSet(merged, provider, key) {
|
|
207
|
+
const p = provider.toLowerCase();
|
|
208
|
+
if (!NON_INTERACTIVE_PROVIDERS.has(p))
|
|
209
|
+
return false;
|
|
210
|
+
if (p === 'anthropic')
|
|
211
|
+
merged.anthropic_api_key = key;
|
|
212
|
+
else if (p === 'openai' || p === 'openai-voice')
|
|
213
|
+
merged.openai_api_key = key;
|
|
214
|
+
else if (p === 'google-ai')
|
|
215
|
+
merged.google_ai_key = key;
|
|
216
|
+
else if (p === 'deepseek')
|
|
217
|
+
merged.deepseek_api_key = key;
|
|
218
|
+
else if (p === 'google-stt')
|
|
219
|
+
merged.google_stt_key = key;
|
|
220
|
+
else if (p === 'google-tts')
|
|
221
|
+
merged.google_tts_key = key;
|
|
222
|
+
else if (p === 'elevenlabs')
|
|
223
|
+
merged.elevenlabs_api_key = key;
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
export function registerKeysSetupCommand(parent) {
|
|
227
|
+
parent
|
|
228
|
+
.command('setup')
|
|
229
|
+
.description('Configure BYOK provider keys -- Brain (Anthropic / OpenAI / Google AI / DeepSeek) '
|
|
230
|
+
+ 'and Voice (OpenAI / Google Cloud / ElevenLabs). Encrypts + syncs to your other devices.')
|
|
231
|
+
.option('--show', 'print current local config (keys masked)')
|
|
232
|
+
.option('--pull', 'pull the server copy + overwrite local')
|
|
233
|
+
.option('--provider <name>', 'non-interactive: anthropic|openai|google-ai|deepseek|google-stt|google-tts|elevenlabs')
|
|
234
|
+
.option('--key <value>', 'non-interactive: the API key value for --provider')
|
|
235
|
+
.action(async (opts) => { await runKeysSetup(opts); });
|
|
236
|
+
}
|
|
237
|
+
/** Back-compat alias -- `yf voice setup` still works. */
|
|
238
|
+
export function registerVoiceSetupCommand(parent) {
|
|
239
|
+
registerKeysSetupCommand(parent);
|
|
240
|
+
}
|
|
241
|
+
export async function runKeysSetup(opts) {
|
|
242
|
+
/* --show: print current + exit. */
|
|
243
|
+
if (opts.show) {
|
|
244
|
+
const current = await readLocalKeys();
|
|
245
|
+
printCurrent(current);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
/* --pull: server -> local. */
|
|
249
|
+
if (opts.pull) {
|
|
250
|
+
let pulled;
|
|
251
|
+
try {
|
|
252
|
+
pulled = await pullFromServer();
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
256
|
+
process.exitCode = 1;
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (!pulled) {
|
|
260
|
+
console.log(c.dim('Server has no provider keys for this user yet.'));
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
await writeLocalKeys(pulled);
|
|
264
|
+
header('Yujin Forge -- keys setup (pulled from server)');
|
|
265
|
+
console.log('');
|
|
266
|
+
printCurrent(pulled);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
/* --provider / --key: non-interactive single set. */
|
|
270
|
+
if (opts.provider || opts.key) {
|
|
271
|
+
if (!opts.provider || !opts.key) {
|
|
272
|
+
console.error(c.error('--provider and --key must be used together.'));
|
|
273
|
+
process.exitCode = 1;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const merged = await readLocalKeys();
|
|
277
|
+
if (!applyNonInteractiveSet(merged, opts.provider, opts.key)) {
|
|
278
|
+
console.error(c.error('--provider must be one of: '
|
|
279
|
+
+ Array.from(NON_INTERACTIVE_PROVIDERS).join(', ')));
|
|
280
|
+
process.exitCode = 1;
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
merged.updated_at = new Date().toISOString();
|
|
284
|
+
try {
|
|
285
|
+
await pushToServer(merged);
|
|
286
|
+
await writeLocalKeys(merged);
|
|
287
|
+
header('Yujin Forge -- keys setup (saved)');
|
|
288
|
+
console.log('');
|
|
289
|
+
printCurrent(merged);
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
293
|
+
process.exitCode = 1;
|
|
294
|
+
}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
/* Interactive flow. */
|
|
298
|
+
const current = await readLocalKeys();
|
|
299
|
+
header('Yujin Forge -- keys setup');
|
|
300
|
+
console.log('');
|
|
301
|
+
console.log(c.dim('Configure the API keys for your chosen providers. The keys are'));
|
|
302
|
+
console.log(c.dim('encrypted with your account secret + synced to your mobile + other'));
|
|
303
|
+
console.log(c.dim('paired devices automatically. The server never sees plaintext.'));
|
|
304
|
+
console.log('');
|
|
305
|
+
console.log(c.dim('Press Enter on any field to keep its current value.'));
|
|
306
|
+
console.log('');
|
|
307
|
+
const cats = await prompts({
|
|
308
|
+
type: 'multiselect',
|
|
309
|
+
name: 'cats',
|
|
310
|
+
message: 'Which categories do you want to configure?',
|
|
311
|
+
choices: [
|
|
312
|
+
{ title: 'Brain (AI for chat + code) -- REQUIRED for Forge',
|
|
313
|
+
value: 'brain', selected: !current.brain_provider_preference },
|
|
314
|
+
{ title: 'Voice (STT + TTS)',
|
|
315
|
+
value: 'voice', selected: false },
|
|
316
|
+
],
|
|
317
|
+
min: 1,
|
|
318
|
+
hint: 'Space to select, Enter to confirm.',
|
|
319
|
+
});
|
|
320
|
+
if (!cats.cats || cats.cats.length === 0) {
|
|
321
|
+
console.log(c.dim('Nothing selected. Aborting.'));
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const merged = { ...current };
|
|
325
|
+
/* ----- Brain section ----- */
|
|
326
|
+
if (cats.cats.includes('brain')) {
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log(c.brand('Brain provider'));
|
|
329
|
+
console.log(c.dim('A heavy dev easily burns $100-$200/mo on any of these. Forge is BYOK --'));
|
|
330
|
+
console.log(c.dim('you pay the provider directly. Pick the one you already have credits on.'));
|
|
331
|
+
console.log('');
|
|
332
|
+
const providerAns = await prompts({
|
|
333
|
+
type: 'select',
|
|
334
|
+
name: 'p',
|
|
335
|
+
message: 'Pick your brain provider',
|
|
336
|
+
choices: BRAIN_PROVIDER_CHOICES.map((ch) => ({
|
|
337
|
+
title: ch.title + (brainKeyOf(current, ch.value) ? c.success(' [configured]') : ''),
|
|
338
|
+
value: ch.value,
|
|
339
|
+
description: ch.hint,
|
|
340
|
+
})),
|
|
341
|
+
initial: BRAIN_PROVIDER_CHOICES.findIndex((ch) => ch.value === (current.brain_provider_preference ?? 'anthropic')),
|
|
342
|
+
});
|
|
343
|
+
const provider = (providerAns.p ?? null);
|
|
344
|
+
if (provider) {
|
|
345
|
+
merged.brain_provider_preference = provider;
|
|
346
|
+
const existingKey = brainKeyOf(merged, provider);
|
|
347
|
+
const keyAns = await prompts({
|
|
348
|
+
type: 'password',
|
|
349
|
+
name: 'k',
|
|
350
|
+
message: 'API key for ' + provider + '. Current: ' + maskKey(existingKey),
|
|
351
|
+
});
|
|
352
|
+
const keyToUse = keyAns.k || existingKey;
|
|
353
|
+
if (keyToUse) {
|
|
354
|
+
setBrainKey(merged, provider, keyToUse);
|
|
355
|
+
/* Fetch live model list from the worker, fall back to
|
|
356
|
+
* baked-in default list if unreachable. */
|
|
357
|
+
console.log(c.dim('Fetching available models from ' + provider + '...'));
|
|
358
|
+
const ml = await fetchBrainModels(provider, keyToUse);
|
|
359
|
+
if (!ml.fromUpstream) {
|
|
360
|
+
console.log(c.dim(' (upstream call failed' + (ml.error ? ': ' + ml.error : '') + ' -- using default list)'));
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
console.log(c.success(' found ' + ml.models.length + ' chat models on your account'));
|
|
364
|
+
}
|
|
365
|
+
const currentModel = brainModelOf(merged, provider);
|
|
366
|
+
const modelChoices = ml.models.map((m) => ({
|
|
367
|
+
title: (m.display_name && m.display_name !== m.id)
|
|
368
|
+
? m.display_name + c.dim(' (' + m.id + ')')
|
|
369
|
+
: m.id,
|
|
370
|
+
value: m.id,
|
|
371
|
+
description: m.created_at ? 'released ' + m.created_at.slice(0, 10) : undefined,
|
|
372
|
+
}));
|
|
373
|
+
const initialIdx = Math.max(0, modelChoices.findIndex((ch) => ch.value === currentModel));
|
|
374
|
+
const modelAns = await prompts({
|
|
375
|
+
type: 'select',
|
|
376
|
+
name: 'm',
|
|
377
|
+
message: 'Pick the model to use as default',
|
|
378
|
+
choices: modelChoices,
|
|
379
|
+
initial: initialIdx,
|
|
380
|
+
});
|
|
381
|
+
if (modelAns.m)
|
|
382
|
+
setBrainModel(merged, provider, modelAns.m);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
console.log(c.warn('No API key entered + none on file -- brain will fail until you set one.'));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/* ----- Voice section ----- */
|
|
390
|
+
if (cats.cats.includes('voice')) {
|
|
391
|
+
console.log('');
|
|
392
|
+
console.log(c.brand('Voice providers'));
|
|
393
|
+
const answers = await prompts({
|
|
394
|
+
type: 'multiselect',
|
|
395
|
+
name: 'providers',
|
|
396
|
+
message: 'Which voice providers do you want to configure?',
|
|
397
|
+
choices: [
|
|
398
|
+
{ title: 'OpenAI (Whisper for STT + tts-1 for TTS)', value: 'openai',
|
|
399
|
+
selected: !!merged.openai_api_key },
|
|
400
|
+
{ title: 'Google Cloud (STT + TTS)', value: 'google',
|
|
401
|
+
selected: !!(merged.google_stt_key || merged.google_tts_key) },
|
|
402
|
+
{ title: 'ElevenLabs (TTS only -- higher quality voice)', value: 'elevenlabs',
|
|
403
|
+
selected: !!merged.elevenlabs_api_key },
|
|
404
|
+
],
|
|
405
|
+
min: 0,
|
|
406
|
+
hint: 'Space to select, Enter to confirm.',
|
|
407
|
+
});
|
|
408
|
+
if (answers.providers && answers.providers.includes('openai')) {
|
|
409
|
+
const r = await prompts({
|
|
410
|
+
type: 'password',
|
|
411
|
+
name: 'k',
|
|
412
|
+
message: 'OpenAI API key (sk-...). Current: ' + maskKey(merged.openai_api_key),
|
|
413
|
+
});
|
|
414
|
+
if (r.k)
|
|
415
|
+
merged.openai_api_key = r.k;
|
|
416
|
+
}
|
|
417
|
+
if (answers.providers && answers.providers.includes('google')) {
|
|
418
|
+
const sttR = await prompts({
|
|
419
|
+
type: 'password',
|
|
420
|
+
name: 'k',
|
|
421
|
+
message: 'Google Cloud Speech-to-Text API key. Current: ' + maskKey(merged.google_stt_key),
|
|
422
|
+
});
|
|
423
|
+
if (sttR.k)
|
|
424
|
+
merged.google_stt_key = sttR.k;
|
|
425
|
+
const ttsR = await prompts({
|
|
426
|
+
type: 'password',
|
|
427
|
+
name: 'k',
|
|
428
|
+
message: 'Google Cloud Text-to-Speech API key (can be same as STT). Current: ' + maskKey(merged.google_tts_key),
|
|
429
|
+
});
|
|
430
|
+
if (ttsR.k)
|
|
431
|
+
merged.google_tts_key = ttsR.k;
|
|
432
|
+
}
|
|
433
|
+
if (answers.providers && answers.providers.includes('elevenlabs')) {
|
|
434
|
+
const r = await prompts({
|
|
435
|
+
type: 'password',
|
|
436
|
+
name: 'k',
|
|
437
|
+
message: 'ElevenLabs API key. Current: ' + maskKey(merged.elevenlabs_api_key),
|
|
438
|
+
});
|
|
439
|
+
if (r.k)
|
|
440
|
+
merged.elevenlabs_api_key = r.k;
|
|
441
|
+
}
|
|
442
|
+
const sttCandidates = [];
|
|
443
|
+
if (merged.openai_api_key)
|
|
444
|
+
sttCandidates.push({ title: 'OpenAI (Whisper)', value: 'openai' });
|
|
445
|
+
if (merged.google_stt_key)
|
|
446
|
+
sttCandidates.push({ title: 'Google', value: 'google' });
|
|
447
|
+
if (sttCandidates.length > 0) {
|
|
448
|
+
const pref = await prompts({
|
|
449
|
+
type: 'select', name: 'p', message: 'Preferred STT provider',
|
|
450
|
+
choices: sttCandidates, initial: 0,
|
|
451
|
+
});
|
|
452
|
+
if (pref.p)
|
|
453
|
+
merged.stt_provider_preference = pref.p;
|
|
454
|
+
}
|
|
455
|
+
const ttsCandidates = [];
|
|
456
|
+
if (merged.openai_api_key)
|
|
457
|
+
ttsCandidates.push({ title: 'OpenAI (tts-1)', value: 'openai' });
|
|
458
|
+
if (merged.google_tts_key)
|
|
459
|
+
ttsCandidates.push({ title: 'Google', value: 'google' });
|
|
460
|
+
if (merged.elevenlabs_api_key)
|
|
461
|
+
ttsCandidates.push({ title: 'ElevenLabs', value: 'elevenlabs' });
|
|
462
|
+
if (ttsCandidates.length > 0) {
|
|
463
|
+
const pref = await prompts({
|
|
464
|
+
type: 'select', name: 'p', message: 'Preferred TTS provider',
|
|
465
|
+
choices: ttsCandidates, initial: 0,
|
|
466
|
+
});
|
|
467
|
+
if (pref.p)
|
|
468
|
+
merged.tts_provider_preference = pref.p;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
merged.updated_at = new Date().toISOString();
|
|
472
|
+
try {
|
|
473
|
+
await pushToServer(merged);
|
|
474
|
+
await writeLocalKeys(merged);
|
|
475
|
+
console.log('');
|
|
476
|
+
console.log(c.success('Provider keys saved + synced.'));
|
|
477
|
+
console.log('');
|
|
478
|
+
printCurrent(merged);
|
|
479
|
+
}
|
|
480
|
+
catch (err) {
|
|
481
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
482
|
+
process.exitCode = 1;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/* Back-compat aliases so callers using the old names still work. */
|
|
486
|
+
export const runVoiceSetup = runKeysSetup;
|
|
487
|
+
//# sourceMappingURL=keys_setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys_setup.js","sourceRoot":"","sources":["../../src/commands/keys_setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf legacy audit` -- Phase I step 3.5 of PRODUCT_WORKFLOW.md.
|
|
3
|
+
*
|
|
4
|
+
* Pure inspection of an existing project. Detects framework +
|
|
5
|
+
* version + dependencies + tests + NAC-3 readiness, and writes
|
|
6
|
+
* a workflow.legacy_audit summary to yujin.forge.json so the
|
|
7
|
+
* subsequent clarification rounds + architecture doc have data
|
|
8
|
+
* to ground on.
|
|
9
|
+
*
|
|
10
|
+
* Never mutates. Safe to run on production projects. Output is
|
|
11
|
+
* a JSON report (write-only to yujin.forge.json) + a human
|
|
12
|
+
* summary in the terminal.
|
|
13
|
+
*
|
|
14
|
+
* Heuristics:
|
|
15
|
+
* - framework = React / Angular / Vue / Svelte / Vanilla
|
|
16
|
+
* based on dependencies in package.json
|
|
17
|
+
* - framework_version = the exact installed version (we read
|
|
18
|
+
* dependencies[<framework-pkg>], stripping caret/tilde)
|
|
19
|
+
* - nac3_readiness = % of "decoratable" elements that already
|
|
20
|
+
* have a data-nac-id (computed by greppng src/ for JSX
|
|
21
|
+
* interactive elements + counting matches)
|
|
22
|
+
* - tech_debt_signals = framework < N versions behind latest,
|
|
23
|
+
* known-deprecated deps, missing test directory, package-lock
|
|
24
|
+
* out of sync with package.json
|
|
25
|
+
*
|
|
26
|
+
* ASCII-only.
|
|
27
|
+
*/
|
|
28
|
+
import type { Command } from 'commander';
|
|
29
|
+
export interface LegacyAuditOptions {
|
|
30
|
+
cwd?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function runLegacyAudit(opts: LegacyAuditOptions): Promise<void>;
|
|
33
|
+
export declare function registerLegacyAuditCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=legacy-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-audit.d.ts","sourceRoot":"","sources":["../../src/commands/legacy-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+GD,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqH5E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcjE"}
|