@cristiancorreau/forge 2.3.0 → 2.4.2

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.
@@ -1,162 +1,231 @@
1
- import { createInterface } from 'readline';
2
- const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: process.stdin.isTTY });
3
- function ask(question) {
4
- return new Promise(resolve => rl.question(question, answer => resolve(answer.trim())));
5
- }
6
- function askWithDefault(question, def) {
7
- return new Promise(resolve => rl.question(`${question} [${def}]: `, answer => {
8
- const a = answer.trim();
9
- resolve(a === '' ? def : a);
10
- }));
11
- }
12
- function askChoice(question, choices, def) {
13
- const choiceStr = choices.map((c, i) => ` ${i + 1}) ${c}`).join('\n');
14
- const defIdx = def ? choices.indexOf(def) + 1 : 1;
15
- return new Promise(resolve => {
16
- console.log(`\n${question}`);
17
- console.log(choiceStr);
18
- rl.question(`Elegir [${defIdx}]: `, answer => {
19
- const n = parseInt(answer.trim(), 10);
20
- if (n >= 1 && n <= choices.length)
21
- resolve(choices[n - 1]);
22
- else
23
- resolve(choices[defIdx - 1]);
24
- });
25
- });
26
- }
27
- function askMulti(question, choices) {
28
- const choiceStr = choices.map((c, i) => ` ${i + 1}) ${c}`).join('\n');
29
- return new Promise(resolve => {
30
- console.log(`\n${question} (números separados por coma, ej: 1,3)`);
31
- console.log(choiceStr);
32
- rl.question('Elegir: ', answer => {
33
- const selected = answer.trim().split(',')
34
- .map(s => parseInt(s.trim(), 10) - 1)
35
- .filter(i => i >= 0 && i < choices.length)
36
- .map(i => choices[i]);
37
- resolve(selected);
38
- });
39
- });
40
- }
41
- const BACKEND_BY_LANGUAGE = {
42
- typescript: ['hono', 'express', 'nestjs', 'none'],
43
- python: ['fastapi', 'django', 'none'],
44
- ruby: ['rails', 'none'],
45
- go: ['go-gin', 'none'],
46
- php: ['laravel', 'none'],
1
+ import * as p from '@clack/prompts';
2
+ import { detectStack } from './detect.js';
3
+ // ─── Options tables ──────────────────────────────────────────────────────────
4
+ const BACKENDS = {
5
+ typescript: [
6
+ { value: 'hono', label: 'Hono', hint: 'edge-ready, ultraligero' },
7
+ { value: 'express', label: 'Express', hint: 'el clásico' },
8
+ { value: 'nestjs', label: 'NestJS', hint: 'enterprise, opinionado' },
9
+ { value: 'fastify', label: 'Fastify', hint: 'rápido, plugins' },
10
+ { value: 'none', label: 'Ninguno' },
11
+ ],
12
+ python: [{ value: 'fastapi', label: 'FastAPI', hint: 'async' }, { value: 'django', label: 'Django' }, { value: 'none', label: 'Ninguno' }],
13
+ ruby: [{ value: 'rails', label: 'Rails' }, { value: 'none', label: 'Ninguno' }],
14
+ go: [{ value: 'go-gin', label: 'Gin' }, { value: 'none', label: 'Ninguno' }],
15
+ php: [{ value: 'laravel', label: 'Laravel' }, { value: 'none', label: 'Ninguno' }],
47
16
  };
48
- const FRONTEND_BY_LANGUAGE = {
49
- typescript: ['nextjs', 'astro', 'sveltekit', 'nuxt', 'none'],
50
- php: ['none'],
51
- ruby: ['rails-views', 'none'],
52
- python: ['none'],
53
- go: ['none'],
17
+ const FRONTENDS = {
18
+ typescript: [
19
+ { value: 'nextjs', label: 'Next.js', hint: 'fullstack React' },
20
+ { value: 'astro', label: 'Astro', hint: 'content-first' },
21
+ { value: 'nuxt', label: 'Nuxt', hint: 'Vue' },
22
+ { value: 'sveltekit', label: 'SvelteKit', hint: 'Svelte' },
23
+ { value: 'none', label: 'Ninguno' },
24
+ ],
54
25
  };
55
- const DATABASE_OPTIONS = ['postgresql', 'mysql', 'sqlite', 'none'];
56
- const ORM_BY_LANGUAGE = {
57
- typescript: ['drizzle', 'prisma', 'typeorm', 'none'],
58
- python: ['sqlalchemy', 'none'],
59
- ruby: ['active-record', 'none'],
60
- php: ['none'],
61
- go: ['none'],
26
+ const ORMS = {
27
+ typescript: [
28
+ { value: 'drizzle', label: 'Drizzle ORM', hint: 'ligero, type-safe' },
29
+ { value: 'prisma', label: 'Prisma', hint: 'completo, migrations' },
30
+ { value: 'typeorm', label: 'TypeORM' },
31
+ { value: 'none', label: 'Ninguno' },
32
+ ],
33
+ python: [{ value: 'sqlalchemy', label: 'SQLAlchemy' }, { value: 'none', label: 'Ninguno' }],
34
+ ruby: [{ value: 'active-record', label: 'Active Record' }, { value: 'none', label: 'Ninguno' }],
62
35
  };
63
- const PM_BY_LANGUAGE = {
64
- typescript: ['pnpm', 'npm', 'yarn', 'bun'],
65
- python: ['pip', 'poetry'],
66
- ruby: ['bundler'],
67
- go: ['none'],
68
- php: ['none'],
36
+ const PKG_MANAGERS = {
37
+ typescript: [
38
+ { value: 'pnpm', label: 'pnpm', hint: 'recomendado — rápido y eficiente' },
39
+ { value: 'npm', label: 'npm' },
40
+ { value: 'yarn', label: 'yarn' },
41
+ { value: 'bun', label: 'bun', hint: 'ultra-rápido' },
42
+ ],
43
+ python: [{ value: 'pip', label: 'pip' }, { value: 'poetry', label: 'poetry' }],
44
+ ruby: [{ value: 'bundler', label: 'bundler' }],
45
+ go: [{ value: 'go', label: 'go modules' }],
46
+ php: [{ value: 'composer', label: 'composer' }],
69
47
  };
70
- const TESTING_BY_LANGUAGE = {
71
- typescript: ['vitest', 'jest', 'playwright', 'cypress'],
72
- python: ['pytest'],
73
- ruby: ['rspec'],
74
- go: ['none'],
75
- php: ['phpunit'],
48
+ const TESTING_OPTS = {
49
+ typescript: [
50
+ { value: 'vitest', label: 'Vitest', hint: 'unit/integration' },
51
+ { value: 'jest', label: 'Jest' },
52
+ { value: 'playwright', label: 'Playwright', hint: 'E2E' },
53
+ { value: 'cypress', label: 'Cypress', hint: 'E2E' },
54
+ ],
55
+ python: [{ value: 'pytest', label: 'pytest' }],
56
+ ruby: [{ value: 'rspec', label: 'RSpec' }],
57
+ php: [{ value: 'phpunit', label: 'PHPUnit' }],
76
58
  };
77
- const PROFILE_BY_STACK = {
78
- hono: ['hono-drizzle'],
79
- nextjs: ['nextjs-admin'],
80
- astro: ['astro'],
81
- fastapi: ['fastapi'],
82
- rails: ['rails'],
83
- laravel: ['laravel'],
84
- expo: ['expo'],
59
+ const PROFILE_MAP = {
60
+ hono: 'hono-drizzle',
61
+ nextjs: 'nextjs-admin',
62
+ astro: 'astro',
63
+ fastapi: 'fastapi',
64
+ rails: 'rails',
65
+ laravel: 'laravel',
85
66
  };
86
- const RUNTIME_OPTIONS = ['claude-code', 'opencode', 'codex', 'kiro'];
87
67
  function toSlug(name) {
88
68
  return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
89
69
  }
70
+ function cancel() {
71
+ p.cancel('Operación cancelada.');
72
+ process.exit(0);
73
+ }
74
+ function check(v) {
75
+ if (p.isCancel(v))
76
+ cancel();
77
+ return v;
78
+ }
79
+ // ─── Main wizard ─────────────────────────────────────────────────────────────
90
80
  export async function runWizard() {
91
- console.log('\n╔════════════════════════════════════╗');
92
- console.log('║ forge Asistente de inicio ║');
93
- console.log('╚════════════════════════════════════╝\n');
94
- console.log('Responde las preguntas para configurar tu proyecto.\n');
95
- const name = await ask('Nombre del proyecto: ');
96
- if (!name) {
97
- rl.close();
98
- return null;
81
+ p.intro(' forge — Configuración de proyecto ');
82
+ // Auto-detect stack
83
+ const detected = detectStack(process.cwd());
84
+ const hasDetection = !!(detected.language || detected.backend || detected.packageManager);
85
+ if (hasDetection) {
86
+ const detectedItems = [
87
+ detected.language && `lenguaje: ${detected.language}`,
88
+ detected.backend && `backend: ${detected.backend}`,
89
+ detected.frontend && `frontend: ${detected.frontend}`,
90
+ detected.packageManager && `package manager: ${detected.packageManager}`,
91
+ detected.testing.length && `testing: ${detected.testing.join(', ')}`,
92
+ ].filter(Boolean);
93
+ p.note(detectedItems.join('\n'), 'Stack detectado — pre-seleccionado abajo');
99
94
  }
95
+ // ── Proyecto ──
96
+ const name = check(await p.text({
97
+ message: 'Nombre del proyecto',
98
+ placeholder: 'Mi Proyecto',
99
+ validate: (v) => (v ?? '').trim() ? undefined : 'El nombre es requerido',
100
+ }));
100
101
  const slugDefault = toSlug(name);
101
- const slug = await askWithDefault('Slug (identificador URL-safe)', slugDefault);
102
- const description = await askWithDefault('Descripción breve', '');
103
- const language = await askChoice('Lenguaje principal:', ['typescript', 'python', 'ruby', 'go', 'php'], 'typescript');
104
- const mode = await askChoice('Modo del proyecto:', ['startup — mínimo viable, equipo pequeño', 'standard — equipo mediano, CI/CD, revisión de código', 'enterprise — compliance, auditoría, múltiples equipos'], 'startup — mínimo viable, equipo pequeño');
105
- const modeValue = mode.split(' ')[0];
106
- const backends = BACKEND_BY_LANGUAGE[language] ?? ['none'];
107
- const backendChoice = backends.length > 1
108
- ? await askChoice('Backend:', backends, backends[0])
109
- : backends[0];
110
- const backend = backendChoice === 'none' ? undefined : backendChoice;
111
- const frontends = FRONTEND_BY_LANGUAGE[language] ?? ['none'];
112
- const frontendChoice = frontends.length > 1
113
- ? await askChoice('Frontend:', frontends, frontends[0])
114
- : frontends[0];
115
- const frontend = frontendChoice === 'none' ? undefined : frontendChoice;
116
- const dbChoice = await askChoice('Base de datos:', DATABASE_OPTIONS, 'postgresql');
117
- const database = dbChoice === 'none' ? undefined : dbChoice;
102
+ const slugInput = check(await p.text({
103
+ message: 'Slug (URL-safe)',
104
+ placeholder: slugDefault,
105
+ defaultValue: slugDefault,
106
+ }));
107
+ const slug = slugInput || slugDefault;
108
+ const description = check(await p.text({
109
+ message: 'Descripción breve',
110
+ placeholder: 'Describe tu proyecto en una línea',
111
+ }));
112
+ // ── Tech stack ──
113
+ const language = check(await p.select({
114
+ message: 'Lenguaje principal',
115
+ initialValue: detected.language ?? 'typescript',
116
+ options: [
117
+ { value: 'typescript', label: 'TypeScript / JavaScript', hint: 'recomendado' },
118
+ { value: 'python', label: 'Python' },
119
+ { value: 'ruby', label: 'Ruby' },
120
+ { value: 'go', label: 'Go' },
121
+ { value: 'php', label: 'PHP' },
122
+ ],
123
+ }));
124
+ const mode = check(await p.select({
125
+ message: 'Modo del proyecto',
126
+ initialValue: 'standard',
127
+ options: [
128
+ { value: 'startup', label: 'startup', hint: 'mínimo viable, equipo pequeño' },
129
+ { value: 'standard', label: 'standard', hint: 'CI/CD, code review, testing' },
130
+ { value: 'enterprise', label: 'enterprise', hint: 'compliance, auditoría, multi-equipo' },
131
+ ],
132
+ }));
133
+ const backendOpts = BACKENDS[language] ?? [{ value: 'none', label: 'Ninguno' }];
134
+ const backendVal = check(await p.select({
135
+ message: 'Framework backend',
136
+ initialValue: detected.backend ?? backendOpts[0].value,
137
+ options: backendOpts,
138
+ }));
139
+ const backend = backendVal === 'none' ? undefined : backendVal;
140
+ const frontendOpts = FRONTENDS[language];
141
+ let frontend;
142
+ if (frontendOpts) {
143
+ const v = check(await p.select({
144
+ message: 'Framework frontend',
145
+ initialValue: detected.frontend ?? 'none',
146
+ options: frontendOpts,
147
+ }));
148
+ frontend = v === 'none' ? undefined : v;
149
+ }
150
+ const dbVal = check(await p.select({
151
+ message: 'Base de datos',
152
+ initialValue: detected.database ?? 'postgresql',
153
+ options: [
154
+ { value: 'postgresql', label: 'PostgreSQL', hint: 'recomendado' },
155
+ { value: 'mysql', label: 'MySQL / MariaDB' },
156
+ { value: 'sqlite', label: 'SQLite', hint: 'dev/embedded' },
157
+ { value: 'none', label: 'Ninguna' },
158
+ ],
159
+ }));
160
+ const database = dbVal === 'none' ? undefined : dbVal;
118
161
  let orm;
119
- if (database) {
120
- const orms = ORM_BY_LANGUAGE[language] ?? ['none'];
121
- if (orms.length > 1) {
122
- const ormChoice = await askChoice('ORM / query builder:', orms, orms[0]);
123
- orm = ormChoice === 'none' ? undefined : ormChoice;
124
- }
162
+ const ormOpts = ORMS[language];
163
+ if (database && ormOpts) {
164
+ const v = check(await p.select({
165
+ message: 'ORM / query builder',
166
+ initialValue: detected.orm ?? ormOpts[0].value,
167
+ options: ormOpts,
168
+ }));
169
+ orm = v === 'none' ? undefined : v;
170
+ }
171
+ const pmOpts = PKG_MANAGERS[language];
172
+ let packageManager;
173
+ if (pmOpts) {
174
+ const v = check(await p.select({
175
+ message: 'Package manager',
176
+ initialValue: detected.packageManager ?? pmOpts[0].value,
177
+ options: pmOpts,
178
+ }));
179
+ packageManager = v === 'none' ? undefined : v;
180
+ }
181
+ const testOpts = TESTING_OPTS[language];
182
+ let testing = detected.testing;
183
+ if (testOpts) {
184
+ const v = check(await p.multiselect({
185
+ message: 'Frameworks de testing',
186
+ initialValues: detected.testing,
187
+ options: testOpts,
188
+ required: false,
189
+ }));
190
+ testing = v;
125
191
  }
126
- const pms = PM_BY_LANGUAGE[language] ?? ['none'];
127
- const pmChoice = pms.length > 1
128
- ? await askChoice('Package manager:', pms, pms[0])
129
- : pms[0];
130
- const packageManager = pmChoice === 'none' ? undefined : pmChoice;
131
- const testingOptions = TESTING_BY_LANGUAGE[language] ?? [];
132
- let testing = [];
133
- if (testingOptions.length > 0 && testingOptions[0] !== 'none') {
134
- testing = await askMulti('Frameworks de testing:', testingOptions);
192
+ const runtime = check(await p.select({
193
+ message: 'Runtime de IA',
194
+ initialValue: 'claude-code',
195
+ options: [
196
+ { value: 'claude-code', label: 'Claude Code', hint: 'recomendado' },
197
+ { value: 'opencode', label: 'OpenCode' },
198
+ { value: 'codex', label: 'Codex CLI' },
199
+ { value: 'kiro', label: 'Kiro IDE' },
200
+ ],
201
+ }));
202
+ // ── Confirmación ──
203
+ const summary = [
204
+ ` Nombre: ${name}`,
205
+ ` Lenguaje: ${language} Modo: ${mode}`,
206
+ backend ? ` Backend: ${backend}` : '',
207
+ frontend ? ` Frontend: ${frontend}` : '',
208
+ database ? ` Base de datos: ${database}${orm ? ' + ' + orm : ''}` : '',
209
+ testing.length ? ` Testing: ${testing.join(', ')}` : '',
210
+ ` Runtime: ${runtime}`,
211
+ ].filter(Boolean).join('\n');
212
+ p.note(summary, 'Configuración seleccionada');
213
+ const confirmed = check(await p.confirm({ message: '¿Instalar con esta configuración?' }));
214
+ if (!confirmed) {
215
+ p.cancel('Cancelado.');
216
+ return null;
135
217
  }
136
- // Auto-suggest profiles based on stack
137
- const suggestedProfiles = [];
138
- for (const [key, profiles] of Object.entries(PROFILE_BY_STACK)) {
139
- if (backend === key || frontend === key)
140
- suggestedProfiles.push(...profiles);
218
+ p.outro('Configuración lista. Instalando...');
219
+ // Auto-detect profiles
220
+ const profiles = [];
221
+ for (const key of [backend, frontend]) {
222
+ if (key && PROFILE_MAP[key])
223
+ profiles.push(PROFILE_MAP[key]);
141
224
  }
142
- const runtime = await askChoice('Runtime de IA principal:', RUNTIME_OPTIONS, 'claude-code');
143
- rl.close();
144
- // Build profiles list from suggestions
145
- const profiles = [...new Set(suggestedProfiles)];
146
225
  return {
147
- name,
148
- slug,
149
- description,
150
- language,
151
- mode: modeValue,
152
- backend,
153
- frontend,
154
- database,
155
- orm,
156
- packageManager,
157
- testing,
158
- profiles,
159
- runtime,
226
+ name, slug, description: description || '', language, mode,
227
+ backend, frontend, database, orm, packageManager, testing,
228
+ profiles: [...new Set(profiles)], runtime, detected: hasDetection,
160
229
  };
161
230
  }
162
231
  //# sourceMappingURL=wizard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function box(title: string, lines: string[]): string;
2
+ //# sourceMappingURL=box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAY1D"}
package/dist/ui/box.js ADDED
@@ -0,0 +1,15 @@
1
+ import { bold, dim } from './colors.js';
2
+ export function box(title, lines) {
3
+ const width = Math.max(title.length, ...lines.map(l => l.length)) + 4;
4
+ const top = '┌' + '─'.repeat(width) + '┐';
5
+ const bottom = '└' + '─'.repeat(width) + '┘';
6
+ const pad = (s) => '│ ' + s.padEnd(width - 2) + ' │';
7
+ return [
8
+ top,
9
+ pad(bold(title)),
10
+ pad(dim('─'.repeat(title.length))),
11
+ ...lines.map(pad),
12
+ bottom,
13
+ ].join('\n');
14
+ }
15
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7D,OAAO;QACL,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QACjB,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const bold: (s: string) => string;
2
+ export declare const dim: (s: string) => string;
3
+ export declare const green: (s: string) => string;
4
+ export declare const red: (s: string) => string;
5
+ export declare const yellow: (s: string) => string;
6
+ export declare const cyan: (s: string) => string;
7
+ export declare const gray: (s: string) => string;
8
+ export declare const icons: {
9
+ ok: string;
10
+ warn: string;
11
+ error: string;
12
+ info: string;
13
+ skip: string;
14
+ };
15
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,IAAI,MAHJ,MAAM,WAGc,CAAC;AAClC,eAAO,MAAM,GAAG,MAJH,MAAM,WAIc,CAAC;AAClC,eAAO,MAAM,KAAK,MALL,MAAM,WAKe,CAAC;AACnC,eAAO,MAAM,GAAG,MANH,MAAM,WAMe,CAAC;AACnC,eAAO,MAAM,MAAM,MAPN,MAAM,WAOe,CAAC;AACnC,eAAO,MAAM,IAAI,MARJ,MAAM,WAQe,CAAC;AACnC,eAAO,MAAM,IAAI,MATJ,MAAM,WASe,CAAC;AAEnC,eAAO,MAAM,KAAK;;;;;;CAMjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ const NO_COLOR = process.env['NO_COLOR'] !== undefined || !process.stdout.isTTY;
2
+ function wrap(code, reset) {
3
+ return (s) => NO_COLOR ? s : `\x1b[${code}m${s}\x1b[${reset}m`;
4
+ }
5
+ export const bold = wrap(1, 22);
6
+ export const dim = wrap(2, 22);
7
+ export const green = wrap(32, 39);
8
+ export const red = wrap(31, 39);
9
+ export const yellow = wrap(33, 39);
10
+ export const cyan = wrap(36, 39);
11
+ export const gray = wrap(90, 39);
12
+ export const icons = {
13
+ ok: green('✓'),
14
+ warn: yellow('!'),
15
+ error: red('✗'),
16
+ info: cyan('i'),
17
+ skip: yellow('~'),
18
+ };
19
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAEhF,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,GAAG,GAAM,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,KAAK,GAAI,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,GAAG,GAAM,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAK,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,EAAE,EAAK,KAAK,CAAC,GAAG,CAAC;IACjB,IAAI,EAAG,MAAM,CAAC,GAAG,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;IACf,IAAI,EAAG,IAAI,CAAC,GAAG,CAAC;IAChB,IAAI,EAAG,MAAM,CAAC,GAAG,CAAC;CACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function createSpinner(items: Array<{
2
+ runtime: string;
3
+ file: string;
4
+ }>): {
5
+ start(): void;
6
+ update(runtime: string, status: "running" | "done" | "error" | "skip", file?: string): void;
7
+ stop(): void;
8
+ };
9
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAyBA,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;;oBAmBzD,MAAM,UAAU,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;;EAWvF"}
@@ -0,0 +1,46 @@
1
+ import { green, red, yellow, dim, gray } from './colors.js';
2
+ const ICON = {
3
+ pending: ' ',
4
+ running: dim('…'),
5
+ done: green('✓'),
6
+ error: red('✗'),
7
+ skip: yellow('~'),
8
+ };
9
+ function renderLine(item) {
10
+ const icon = ICON[item.status];
11
+ const rt = item.runtime.padEnd(12);
12
+ const f = item.status === 'pending' ? gray(item.file) : item.file;
13
+ return ` ${icon} ${rt} ${f}`;
14
+ }
15
+ export function createSpinner(items) {
16
+ const state = items.map(i => ({ ...i, status: 'pending' }));
17
+ let printed = false;
18
+ function render() {
19
+ if (printed) {
20
+ // Move cursor up N lines to overwrite
21
+ process.stdout.write(`\x1b[${state.length}A`);
22
+ }
23
+ for (const item of state) {
24
+ process.stdout.write('\r\x1b[K' + renderLine(item) + '\n');
25
+ }
26
+ printed = true;
27
+ }
28
+ return {
29
+ start() {
30
+ render();
31
+ },
32
+ update(runtime, status, file) {
33
+ const item = state.find(i => i.runtime === runtime);
34
+ if (!item)
35
+ return;
36
+ item.status = status;
37
+ if (file)
38
+ item.file = file;
39
+ render();
40
+ },
41
+ stop() {
42
+ // Cursor already at end after last render
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAU5D,MAAM,IAAI,GAA+B;IACvC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC;IACjB,IAAI,EAAK,KAAK,CAAC,GAAG,CAAC;IACnB,KAAK,EAAI,GAAG,CAAC,GAAG,CAAC;IACjB,IAAI,EAAK,MAAM,CAAC,GAAG,CAAC;CACrB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA+C;IAC3E,MAAM,KAAK,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAuB,EAAE,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,SAAS,MAAM;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,sCAAsC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,OAAO;QACL,KAAK;YACH,MAAM,EAAE,CAAC;QACX,CAAC;QACD,MAAM,CAAC,OAAe,EAAE,MAA6C,EAAE,IAAa;YAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3B,MAAM,EAAE,CAAC;QACX,CAAC;QACD,IAAI;YACF,0CAA0C;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cristiancorreau/forge",
3
- "version": "2.3.0",
3
+ "version": "2.4.2",
4
4
  "description": "Agentic development framework — multi-runtime support for Claude Code, OpenCode, Codex and Kiro",
5
5
  "author": "Cristian Correa <cristian@socialweb.cl>",
6
6
  "license": "Apache-2.0",
@@ -45,6 +45,7 @@
45
45
  "node": ">=18.0.0"
46
46
  },
47
47
  "dependencies": {
48
+ "@clack/prompts": "^0.9.1",
48
49
  "ajv": "^8.20.0",
49
50
  "ajv-formats": "^3.0.1",
50
51
  "js-yaml": "^4.2.0"