@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.
- package/README.md +52 -109
- package/dist/cli.js +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +27 -7
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +54 -19
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +88 -37
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/detect.d.ts +13 -0
- package/dist/lib/detect.d.ts.map +1 -0
- package/dist/lib/detect.js +85 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/lock.d.ts +15 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +48 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/wizard.d.ts +3 -2
- package/dist/lib/wizard.d.ts.map +1 -1
- package/dist/lib/wizard.js +211 -142
- package/dist/lib/wizard.js.map +1 -1
- package/dist/ui/box.d.ts +2 -0
- package/dist/ui/box.d.ts.map +1 -0
- package/dist/ui/box.js +15 -0
- package/dist/ui/box.js.map +1 -0
- package/dist/ui/colors.d.ts +15 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +19 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/spinner.d.ts +9 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +46 -0
- package/dist/ui/spinner.js.map +1 -0
- package/package.json +2 -1
package/dist/lib/wizard.js
CHANGED
|
@@ -1,162 +1,231 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
49
|
-
typescript: [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
64
|
-
typescript: [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
71
|
-
typescript: [
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
78
|
-
hono:
|
|
79
|
-
nextjs:
|
|
80
|
-
astro:
|
|
81
|
-
fastapi:
|
|
82
|
-
rails:
|
|
83
|
-
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
:
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
orm
|
|
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
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
149
|
-
|
|
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
|
package/dist/lib/wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/box.d.ts
ADDED
|
@@ -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
|
+
"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"
|