@cristiancorreau/forge 2.11.0 → 2.13.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/CHANGELOG.md +17 -0
- package/assets/manifest.json +1 -1
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit.d.ts +24 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +29 -7
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/doctor.d.ts +23 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +79 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/panel.d.ts +2 -0
- package/dist/commands/panel.d.ts.map +1 -0
- package/dist/commands/panel.js +379 -0
- package/dist/commands/panel.js.map +1 -0
- package/dist/lib/catalog-install.d.ts +62 -0
- package/dist/lib/catalog-install.d.ts.map +1 -0
- package/dist/lib/catalog-install.js +561 -0
- package/dist/lib/catalog-install.js.map +1 -0
- package/dist/lib/panel-data.d.ts +91 -0
- package/dist/lib/panel-data.d.ts.map +1 -0
- package/dist/lib/panel-data.js +243 -0
- package/dist/lib/panel-data.js.map +1 -0
- package/dist/tui/panel.d.ts +2 -0
- package/dist/tui/panel.d.ts.map +1 -0
- package/dist/tui/panel.js +551 -0
- package/dist/tui/panel.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { spawnSync } from 'child_process';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import { resolveForgeRoot } from '../lib/paths.js';
|
|
5
|
+
import { findProjectYaml } from '../lib/yaml.js';
|
|
6
|
+
import { runAudit } from './audit.js';
|
|
7
|
+
import { runDoctor } from './doctor.js';
|
|
8
|
+
import { searchSkills, listInstalledHooks, listTemplates, getConfigSummary, } from '../lib/panel-data.js';
|
|
9
|
+
import { searchCatalog, installItem, } from '../lib/catalog-install.js';
|
|
10
|
+
import { bold, dim, green, cyan, gray, yellow, red, icons } from '../ui/colors.js';
|
|
11
|
+
import { box } from '../ui/box.js';
|
|
12
|
+
const HELP = `Usage: forge panel
|
|
13
|
+
|
|
14
|
+
Open the interactive forge panel: a navigable view of the project's
|
|
15
|
+
configuration, monitoring (audit + doctor), skill search, a catalog
|
|
16
|
+
searcher+installer (skills/profiles/templates), hooks and templates.
|
|
17
|
+
|
|
18
|
+
Runs full-screen under Bun (OpenTUI). On plain Node it falls back to a menu
|
|
19
|
+
that prints each section. With no project.yaml it still works (showing the
|
|
20
|
+
catalog), but it is most useful inside a configured project.
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
-h, --help Show this help
|
|
24
|
+
`;
|
|
25
|
+
// OpenTUI panels require Bun runtime.
|
|
26
|
+
const isBun = typeof globalThis.Bun !== 'undefined';
|
|
27
|
+
/** Locate a usable `bun` binary: PATH first, then standard install locations. */
|
|
28
|
+
function findBun() {
|
|
29
|
+
const candidates = [
|
|
30
|
+
'bun',
|
|
31
|
+
join(process.env.HOME ?? '', '.bun', 'bin', 'bun'),
|
|
32
|
+
'/opt/homebrew/bin/bun',
|
|
33
|
+
'/usr/local/bin/bun',
|
|
34
|
+
];
|
|
35
|
+
for (const bin of candidates) {
|
|
36
|
+
try {
|
|
37
|
+
const r = spawnSync(bin, ['--version'], { encoding: 'utf8', timeout: 2000 });
|
|
38
|
+
if (r.status === 0)
|
|
39
|
+
return bin;
|
|
40
|
+
}
|
|
41
|
+
catch { /* try next */ }
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* If running under Node with a TTY, re-launch the CLI under Bun (if available)
|
|
47
|
+
* so the OpenTUI panel can render. Returns false if it couldn't re-launch (the
|
|
48
|
+
* caller then uses the @clack fallback); exits the process if it did.
|
|
49
|
+
*/
|
|
50
|
+
function tryReLaunchWithBun() {
|
|
51
|
+
if (isBun)
|
|
52
|
+
return false;
|
|
53
|
+
if (process.env.FORGE_NO_BUN === '1')
|
|
54
|
+
return false;
|
|
55
|
+
if (process.env.FORGE_BUN_RELAUNCH === '1')
|
|
56
|
+
return false; // already relaunched
|
|
57
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
58
|
+
return false;
|
|
59
|
+
const bun = findBun();
|
|
60
|
+
if (!bun)
|
|
61
|
+
return false;
|
|
62
|
+
const cliPath = new URL('../cli.js', import.meta.url).pathname;
|
|
63
|
+
const result = spawnSync(bun, [cliPath, 'panel'], {
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
env: { ...process.env, FORGE_BUN_RELAUNCH: '1' },
|
|
66
|
+
});
|
|
67
|
+
process.exit(result.status ?? 0);
|
|
68
|
+
}
|
|
69
|
+
function forgeRootOrNull() {
|
|
70
|
+
try {
|
|
71
|
+
return resolveForgeRoot();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ─── Node fallback (@clack/prompts) ───────────────────────────────────────────
|
|
78
|
+
function printConfigSection(root) {
|
|
79
|
+
const c = getConfigSummary(root);
|
|
80
|
+
if (!c.found) {
|
|
81
|
+
console.log(dim(' No se encontró project.yaml en este directorio.'));
|
|
82
|
+
console.log(dim(' Ejecutá ') + cyan('forge init') + dim(' para configurar el proyecto.'));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const lines = [];
|
|
86
|
+
lines.push(`${bold('Proyecto')} ${c.name}`);
|
|
87
|
+
lines.push(`${bold('Mode')} ${c.mode} ${bold('Lenguaje')} ${c.language}`);
|
|
88
|
+
if (c.stack.length) {
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(bold('Stack'));
|
|
91
|
+
for (const { key, value } of c.stack)
|
|
92
|
+
lines.push(` ${gray(key.padEnd(16))} ${value}`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
lines.push(bold('Agentes'));
|
|
96
|
+
lines.push(` ${gray('active'.padEnd(16))} ${c.agentsActive.join(', ') || dim('—')}`);
|
|
97
|
+
if (c.agentsSpecialized.length)
|
|
98
|
+
lines.push(` ${gray('specialized'.padEnd(16))} ${c.agentsSpecialized.join(', ')}`);
|
|
99
|
+
if (c.agentsCompliance.length)
|
|
100
|
+
lines.push(` ${gray('compliance'.padEnd(16))} ${c.agentsCompliance.join(', ')}`);
|
|
101
|
+
if (c.profiles.length)
|
|
102
|
+
lines.push(` ${gray('profiles'.padEnd(16))} ${c.profiles.join(', ')}`);
|
|
103
|
+
lines.push('');
|
|
104
|
+
lines.push(`${bold('Skills')} ${c.skills.join(', ') || dim('ninguna')}`);
|
|
105
|
+
lines.push(`${bold('Runtimes')} ${c.runtimes.join(', ') || dim('ninguno')}`);
|
|
106
|
+
if (c.compliance.length)
|
|
107
|
+
lines.push(`${bold('Compliance')} ${c.compliance.join(', ')}`);
|
|
108
|
+
if (c.deploy)
|
|
109
|
+
lines.push(`${bold('Deploy')} ${c.deploy.provider ?? '—'}${c.deploy.url ? ' ' + c.deploy.url : ''}`);
|
|
110
|
+
console.log(box('Configuración', lines));
|
|
111
|
+
console.log(dim(` Fuente: ${c.yamlPath}`));
|
|
112
|
+
}
|
|
113
|
+
function printMonitorSection(root) {
|
|
114
|
+
const a = runAudit(root);
|
|
115
|
+
const d = runDoctor(root);
|
|
116
|
+
const lines = [];
|
|
117
|
+
lines.push(`Audit: ${green(a.summary.ok + ' OK')} · ${cyan(a.summary.info + ' info')} · ` +
|
|
118
|
+
`${yellow(a.summary.warnings + ' warn')} · ${red(a.summary.errors + ' ✗')}`);
|
|
119
|
+
lines.push(`Hooks instalados: ${a.hooksInstalled}`);
|
|
120
|
+
lines.push(`Manifest: ${a.manifestStatus}`);
|
|
121
|
+
lines.push('');
|
|
122
|
+
lines.push(`Node ${d.nodeVersion} · forge root ${d.forgeRootOk ? green('ok') : red('no')} · assets ${d.assetsOk ? green('ok') : red('faltan')}`);
|
|
123
|
+
lines.push(`Runtimes detectados: ${d.runtimesDetected.join(', ') || dim('ninguno')}`);
|
|
124
|
+
lines.push('');
|
|
125
|
+
lines.push(bold('Runtimes'));
|
|
126
|
+
for (const rt of d.runtimes) {
|
|
127
|
+
const mark = rt.installed ? icons.ok : gray('○');
|
|
128
|
+
const tag = rt.active ? cyan(' ● active') : '';
|
|
129
|
+
const ver = rt.installed && rt.version ? dim(' ' + rt.version) : (rt.installed ? '' : dim(' — ausente'));
|
|
130
|
+
lines.push(` ${mark} ${rt.label.padEnd(14)}${ver}${tag}`);
|
|
131
|
+
}
|
|
132
|
+
console.log(box(d.ok && a.summary.errors === 0 ? 'Monitoreo — todo en orden' : 'Monitoreo', lines));
|
|
133
|
+
}
|
|
134
|
+
function printSkillRows(rows) {
|
|
135
|
+
if (rows.length === 0) {
|
|
136
|
+
console.log(dim(' Sin resultados.'));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const width = Math.max(...rows.map(r => r.command.length));
|
|
140
|
+
for (const r of rows) {
|
|
141
|
+
const mark = r.active ? icons.ok : gray('·');
|
|
142
|
+
console.log(` ${mark} ${cyan(r.command.padEnd(width))} ${gray('[' + r.category + ']')} ${r.purpose}`);
|
|
143
|
+
console.log(` ${' '.repeat(width)} ${dim('trigger: ' + r.trigger)}`);
|
|
144
|
+
}
|
|
145
|
+
const active = rows.filter(r => r.active).length;
|
|
146
|
+
console.log('\n' + dim(` ${rows.length} skill(s) · ${active} activa(s) en project.yaml`));
|
|
147
|
+
}
|
|
148
|
+
async function skillsSearchSection(root) {
|
|
149
|
+
const q = await p.text({
|
|
150
|
+
message: 'Buscar skills (nombre, categoría, comando, trigger) — Enter para ver todas',
|
|
151
|
+
placeholder: 'wiki, deploy, security…',
|
|
152
|
+
});
|
|
153
|
+
if (p.isCancel(q))
|
|
154
|
+
return;
|
|
155
|
+
printSkillRows(searchSkills(String(q ?? ''), root));
|
|
156
|
+
}
|
|
157
|
+
const TYPE_TAG = {
|
|
158
|
+
skill: 'skill', profile: 'profile', template: 'template',
|
|
159
|
+
};
|
|
160
|
+
function printCatalogRows(items) {
|
|
161
|
+
if (items.length === 0) {
|
|
162
|
+
console.log(dim(' Sin resultados.'));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const width = Math.max(...items.map(i => i.label.length));
|
|
166
|
+
for (const it of items) {
|
|
167
|
+
const mark = it.installed ? green('✓') : gray('·');
|
|
168
|
+
const tag = gray('[' + TYPE_TAG[it.type] + ']');
|
|
169
|
+
const state = it.installed ? dim(' (ya instalado)') : '';
|
|
170
|
+
console.log(` ${mark} ${cyan(it.label.padEnd(width))} ${tag} ${it.description}${state}`);
|
|
171
|
+
}
|
|
172
|
+
const installed = items.filter(i => i.installed).length;
|
|
173
|
+
console.log('\n' + dim(` ${items.length} ítem(s) · ${installed} ya instalado(s)`));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Interactive catalog search → select → install in the @clack fallback. Lets
|
|
177
|
+
* the user filter installable items (skills/profiles/templates), pick one and
|
|
178
|
+
* install it (with a confirm). Idempotent and YAML-safe via the data layer.
|
|
179
|
+
*/
|
|
180
|
+
async function catalogSearchInstallSection(root) {
|
|
181
|
+
const q = await p.text({
|
|
182
|
+
message: 'Buscar en el catálogo (skills, profiles, templates) — Enter para ver todo',
|
|
183
|
+
placeholder: 'wiki, hono, spec…',
|
|
184
|
+
});
|
|
185
|
+
if (p.isCancel(q))
|
|
186
|
+
return;
|
|
187
|
+
const forgeRoot = forgeRootOrNull();
|
|
188
|
+
const items = searchCatalog(forgeRoot, root, String(q ?? ''));
|
|
189
|
+
printCatalogRows(items);
|
|
190
|
+
if (items.length === 0)
|
|
191
|
+
return;
|
|
192
|
+
const installable = items.filter(i => !i.installed);
|
|
193
|
+
if (installable.length === 0) {
|
|
194
|
+
console.log('\n' + dim(' Todos los resultados ya están instalados.'));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const pick = await p.select({
|
|
198
|
+
message: '¿Qué querés instalar/activar?',
|
|
199
|
+
options: [
|
|
200
|
+
...installable.map(i => ({
|
|
201
|
+
value: `${i.type}:${i.id}`,
|
|
202
|
+
label: `${i.label} ${gray('[' + TYPE_TAG[i.type] + ']')}`,
|
|
203
|
+
hint: i.description,
|
|
204
|
+
})),
|
|
205
|
+
{ value: '__cancel__', label: 'Cancelar' },
|
|
206
|
+
],
|
|
207
|
+
});
|
|
208
|
+
if (p.isCancel(pick) || pick === '__cancel__')
|
|
209
|
+
return;
|
|
210
|
+
const chosen = installable.find(i => `${i.type}:${i.id}` === pick);
|
|
211
|
+
if (!chosen)
|
|
212
|
+
return;
|
|
213
|
+
const confirm = await p.confirm({
|
|
214
|
+
message: `Instalar ${chosen.label} (${TYPE_TAG[chosen.type]})?`,
|
|
215
|
+
});
|
|
216
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
217
|
+
console.log(dim(' Cancelado.'));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const res = installItem(root, forgeRoot, { type: chosen.type, id: chosen.id });
|
|
221
|
+
if (res.ok) {
|
|
222
|
+
console.log(' ' + green(icons.ok) + ' ' + res.message);
|
|
223
|
+
for (const f of res.changed)
|
|
224
|
+
console.log(' ' + dim('→ ' + f));
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
console.log(' ' + red('✗') + ' ' + res.message);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function printHooksSection(root) {
|
|
231
|
+
const hooks = listInstalledHooks(root, forgeRootOrNull());
|
|
232
|
+
if (hooks.length === 0) {
|
|
233
|
+
console.log(dim(' No hay hooks en el registry ni en .claude/hooks/.'));
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const truncate = (s, n = 90) => (s.length > n ? s.slice(0, n - 1) + '…' : s);
|
|
237
|
+
const lines = [];
|
|
238
|
+
for (const h of hooks) {
|
|
239
|
+
const mark = h.installed ? icons.ok : gray('○');
|
|
240
|
+
const matcher = h.matcher ? ` ${dim('matcher=' + h.matcher)}` : '';
|
|
241
|
+
lines.push(`${mark} ${bold(h.hook.padEnd(22))} ${cyan(h.event)}${matcher} ${gray('[' + h.mode + ']')}`);
|
|
242
|
+
if (h.description)
|
|
243
|
+
lines.push(` ${dim(truncate(h.description))}`);
|
|
244
|
+
}
|
|
245
|
+
console.log(box('Hooks', lines));
|
|
246
|
+
console.log(dim(' ✓ instalado en .claude/hooks/ ○ declarado en el registry pero no instalado'));
|
|
247
|
+
}
|
|
248
|
+
function printTemplatesSection() {
|
|
249
|
+
const templates = listTemplates(forgeRootOrNull());
|
|
250
|
+
if (templates.length === 0) {
|
|
251
|
+
console.log(dim(' No se encontraron templates (forge root ausente).'));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const lines = [];
|
|
255
|
+
let lastCat = '';
|
|
256
|
+
for (const t of templates) {
|
|
257
|
+
if (t.category !== lastCat) {
|
|
258
|
+
lines.push(bold(t.category));
|
|
259
|
+
lastCat = t.category;
|
|
260
|
+
}
|
|
261
|
+
lines.push(` ${cyan(t.name.padEnd(26))} ${dim(t.description)}`);
|
|
262
|
+
}
|
|
263
|
+
console.log(box('Templates', lines));
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Non-interactive snapshot: print every section once. Used when there is no TTY
|
|
267
|
+
* (piped/CI) so the panel never crashes and still surfaces useful information.
|
|
268
|
+
*/
|
|
269
|
+
function printStaticSnapshot(root) {
|
|
270
|
+
console.log(cyan(bold('forge panel')) + dim(' — snapshot (sin TTY interactiva)') + '\n');
|
|
271
|
+
printConfigSection(root);
|
|
272
|
+
console.log('');
|
|
273
|
+
printMonitorSection(root);
|
|
274
|
+
console.log('');
|
|
275
|
+
printSkillRows(searchSkills('', root));
|
|
276
|
+
console.log('');
|
|
277
|
+
console.log(cyan(bold('Catálogo — buscar e instalar')) + dim(' (skills · profiles · templates)') + '\n');
|
|
278
|
+
printCatalogRows(searchCatalog(forgeRootOrNull(), root, ''));
|
|
279
|
+
console.log('');
|
|
280
|
+
printHooksSection(root);
|
|
281
|
+
console.log('');
|
|
282
|
+
printTemplatesSection();
|
|
283
|
+
return 0;
|
|
284
|
+
}
|
|
285
|
+
async function runClackFallback(root) {
|
|
286
|
+
// No interactive TTY → print a one-shot snapshot instead of prompting (which
|
|
287
|
+
// would throw ERR_TTY_INIT_FAILED on a /dev/null or piped stdin).
|
|
288
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
289
|
+
return printStaticSnapshot(root);
|
|
290
|
+
}
|
|
291
|
+
p.intro(' forge panel ');
|
|
292
|
+
if (!findProjectYaml(root)) {
|
|
293
|
+
p.note('No hay project.yaml en este directorio. El panel muestra el catálogo\nglobal; ejecutá `forge init` para configurar el proyecto.', 'Aviso');
|
|
294
|
+
}
|
|
295
|
+
// Loop until the user picks Salir.
|
|
296
|
+
for (;;) {
|
|
297
|
+
const choice = await p.select({
|
|
298
|
+
message: '¿Qué querés ver?',
|
|
299
|
+
options: [
|
|
300
|
+
{ value: 'config', label: 'Configuración', hint: 'resumen de project.yaml' },
|
|
301
|
+
{ value: 'monitor', label: 'Monitoreo', hint: 'audit + doctor' },
|
|
302
|
+
{ value: 'skills', label: 'Skills', hint: 'buscar en el catálogo' },
|
|
303
|
+
{ value: 'catalog', label: 'Catálogo — buscar e instalar', hint: 'skills · profiles · templates' },
|
|
304
|
+
{ value: 'hooks', label: 'Hooks', hint: 'instalados + registry' },
|
|
305
|
+
{ value: 'templates', label: 'Templates', hint: 'wiki / spec / modes' },
|
|
306
|
+
{ value: 'editor', label: 'Abrir project.yaml en $EDITOR' },
|
|
307
|
+
{ value: 'exit', label: 'Salir' },
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
if (p.isCancel(choice) || choice === 'exit')
|
|
311
|
+
break;
|
|
312
|
+
console.log('');
|
|
313
|
+
switch (choice) {
|
|
314
|
+
case 'config':
|
|
315
|
+
printConfigSection(root);
|
|
316
|
+
break;
|
|
317
|
+
case 'monitor':
|
|
318
|
+
printMonitorSection(root);
|
|
319
|
+
break;
|
|
320
|
+
case 'skills':
|
|
321
|
+
await skillsSearchSection(root);
|
|
322
|
+
break;
|
|
323
|
+
case 'catalog':
|
|
324
|
+
await catalogSearchInstallSection(root);
|
|
325
|
+
break;
|
|
326
|
+
case 'hooks':
|
|
327
|
+
printHooksSection(root);
|
|
328
|
+
break;
|
|
329
|
+
case 'templates':
|
|
330
|
+
printTemplatesSection();
|
|
331
|
+
break;
|
|
332
|
+
case 'editor':
|
|
333
|
+
openEditor(root);
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
console.log('');
|
|
337
|
+
}
|
|
338
|
+
p.outro('Listo.');
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
function openEditor(root) {
|
|
342
|
+
const yamlPath = findProjectYaml(root);
|
|
343
|
+
if (!yamlPath) {
|
|
344
|
+
console.log(dim(' No hay project.yaml para abrir.'));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const editor = process.env.EDITOR || process.env.VISUAL;
|
|
348
|
+
if (!editor) {
|
|
349
|
+
console.log(dim(' $EDITOR no definido. Ruta: ') + yamlPath);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
spawnSync(editor, [yamlPath], { stdio: 'inherit' });
|
|
353
|
+
}
|
|
354
|
+
// ─── Entry point ──────────────────────────────────────────────────────────────
|
|
355
|
+
export async function panel(args) {
|
|
356
|
+
if (args.includes('-h') || args.includes('--help')) {
|
|
357
|
+
process.stdout.write(HELP);
|
|
358
|
+
return 0;
|
|
359
|
+
}
|
|
360
|
+
const root = process.cwd();
|
|
361
|
+
// Full-screen OpenTUI under Bun.
|
|
362
|
+
if (isBun && process.stdout.isTTY) {
|
|
363
|
+
try {
|
|
364
|
+
const { runPanel } = await import('../tui/panel.js');
|
|
365
|
+
await runPanel(root);
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// fall through to the clack fallback
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// On Node with Bun installed + a TTY, re-launch under Bun for OpenTUI.
|
|
373
|
+
if (!isBun && process.stdout.isTTY) {
|
|
374
|
+
tryReLaunchWithBun(); // exits the process on success
|
|
375
|
+
}
|
|
376
|
+
// Node fallback (no Bun, or not a TTY): @clack menu.
|
|
377
|
+
return runClackFallback(root);
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/commands/panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type TemplateEntry } from './panel-data.js';
|
|
2
|
+
export type CatalogItemType = 'skill' | 'profile' | 'template';
|
|
3
|
+
export interface CatalogItem {
|
|
4
|
+
type: CatalogItemType;
|
|
5
|
+
/** Stable id used by the installers (skill id, profile name, template id). */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Short human label for the UI. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** One-line description. */
|
|
10
|
+
description: string;
|
|
11
|
+
/** True when it is already in project.yaml or already scaffolded on disk. */
|
|
12
|
+
installed: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface InstallResult {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
/** True when nothing changed because it was already installed. */
|
|
17
|
+
alreadyInstalled: boolean;
|
|
18
|
+
/** Human message (Spanish) describing the outcome. */
|
|
19
|
+
message: string;
|
|
20
|
+
/** Files created/touched (relative to projectRoot). */
|
|
21
|
+
changed: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Profile names available in the forge assets tree (profiles/<name>/). */
|
|
24
|
+
export declare function listAvailableProfiles(forgeRoot: string | null): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Stable id for a template entry, used by installTemplate. Wiki templates all
|
|
27
|
+
* collapse to the single `wiki` install target; spec/mode/claude-md keep their
|
|
28
|
+
* file name (without extension) so each is addressable.
|
|
29
|
+
*/
|
|
30
|
+
export declare function templateInstallId(t: TemplateEntry): string;
|
|
31
|
+
/**
|
|
32
|
+
* Unified, case-insensitive substring search across installable items: skills,
|
|
33
|
+
* profiles and templates. An empty query returns the whole catalog. Each item
|
|
34
|
+
* is marked `installed` against project.yaml and/or the scaffolded state on
|
|
35
|
+
* disk. Profiles and templates require a `forgeRoot`; with `forgeRoot === null`
|
|
36
|
+
* only skills are returned.
|
|
37
|
+
*/
|
|
38
|
+
export declare function searchCatalog(forgeRoot: string | null, projectRoot: string, query: string): CatalogItem[];
|
|
39
|
+
/**
|
|
40
|
+
* Activate a skill: add its id to project.yaml `skills` (dedupe, surgical edit)
|
|
41
|
+
* and copy its slash command into `.claude/commands/` when one is bundled
|
|
42
|
+
* (`adapters/claude-code/commands/<id>.md`). Idempotent.
|
|
43
|
+
*/
|
|
44
|
+
export declare function installSkill(projectRoot: string, forgeRoot: string | null, id: string): InstallResult;
|
|
45
|
+
/**
|
|
46
|
+
* Activate a profile: add its name to project.yaml `agents.profiles` (dedupe,
|
|
47
|
+
* surgical edit) and install the profile's agents into `.claude/agents/`.
|
|
48
|
+
* Idempotent.
|
|
49
|
+
*/
|
|
50
|
+
export declare function installProfile(projectRoot: string, forgeRoot: string | null, name: string): InstallResult;
|
|
51
|
+
/**
|
|
52
|
+
* Scaffold a template into the project (idempotent):
|
|
53
|
+
* - `wiki` → full templated wiki structure
|
|
54
|
+
* - `spec:spec-template.md` → docs/specs/_template.md from the bundled spec template
|
|
55
|
+
* - `claude-md:project.md` → CLAUDE.md if missing
|
|
56
|
+
* - `claude-md:architecture.rules` → .claude/architecture.rules if missing
|
|
57
|
+
* - `mode:*` → project.yaml mode template into docs/ (reference copy)
|
|
58
|
+
*/
|
|
59
|
+
export declare function installTemplate(projectRoot: string, forgeRoot: string | null, id: string): InstallResult;
|
|
60
|
+
/** Install any catalog item by type. Convenience wrapper for the UI layers. */
|
|
61
|
+
export declare function installItem(projectRoot: string, forgeRoot: string | null, item: Pick<CatalogItem, 'type' | 'id'>): InstallResult;
|
|
62
|
+
//# sourceMappingURL=catalog-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-install.d.ts","sourceRoot":"","sources":["../../src/lib/catalog-install.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8BD,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAG1D;AAuBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,WAAW,EAAE,CAgDf;AA2MD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CA8CrG;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CA6CzG;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CA8ExG;AAsCD,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,GACrC,aAAa,CAOf"}
|