@cristiancorreau/forge 2.1.0 → 2.3.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/assets/core/hooks/pre-bash-check.js +144 -0
- package/assets/core/hooks/pre-edit-check.js +166 -0
- package/dist/cli.js +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +154 -9
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +39 -28
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +114 -5
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +283 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +92 -6
- package/dist/commands/validate.js.map +1 -1
- package/dist/lib/generators/claude-code.d.ts +3 -0
- package/dist/lib/generators/claude-code.d.ts.map +1 -0
- package/dist/lib/generators/claude-code.js +140 -0
- package/dist/lib/generators/claude-code.js.map +1 -0
- package/dist/lib/generators/codex.d.ts +3 -0
- package/dist/lib/generators/codex.d.ts.map +1 -0
- package/dist/lib/generators/codex.js +69 -0
- package/dist/lib/generators/codex.js.map +1 -0
- package/dist/lib/generators/kiro.d.ts +7 -0
- package/dist/lib/generators/kiro.d.ts.map +1 -0
- package/dist/lib/generators/kiro.js +134 -0
- package/dist/lib/generators/kiro.js.map +1 -0
- package/dist/lib/generators/opencode.d.ts +3 -0
- package/dist/lib/generators/opencode.d.ts.map +1 -0
- package/dist/lib/generators/opencode.js +96 -0
- package/dist/lib/generators/opencode.js.map +1 -0
- package/dist/lib/wizard.d.ts +17 -0
- package/dist/lib/wizard.d.ts.map +1 -0
- package/dist/lib/wizard.js +162 -0
- package/dist/lib/wizard.js.map +1 -0
- package/dist/lib/yaml.d.ts +96 -0
- package/dist/lib/yaml.d.ts.map +1 -0
- package/dist/lib/yaml.js +26 -0
- package/dist/lib/yaml.js.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1,162 @@
|
|
|
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'],
|
|
47
|
+
};
|
|
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'],
|
|
54
|
+
};
|
|
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'],
|
|
62
|
+
};
|
|
63
|
+
const PM_BY_LANGUAGE = {
|
|
64
|
+
typescript: ['pnpm', 'npm', 'yarn', 'bun'],
|
|
65
|
+
python: ['pip', 'poetry'],
|
|
66
|
+
ruby: ['bundler'],
|
|
67
|
+
go: ['none'],
|
|
68
|
+
php: ['none'],
|
|
69
|
+
};
|
|
70
|
+
const TESTING_BY_LANGUAGE = {
|
|
71
|
+
typescript: ['vitest', 'jest', 'playwright', 'cypress'],
|
|
72
|
+
python: ['pytest'],
|
|
73
|
+
ruby: ['rspec'],
|
|
74
|
+
go: ['none'],
|
|
75
|
+
php: ['phpunit'],
|
|
76
|
+
};
|
|
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'],
|
|
85
|
+
};
|
|
86
|
+
const RUNTIME_OPTIONS = ['claude-code', 'opencode', 'codex', 'kiro'];
|
|
87
|
+
function toSlug(name) {
|
|
88
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
89
|
+
}
|
|
90
|
+
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;
|
|
99
|
+
}
|
|
100
|
+
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;
|
|
118
|
+
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
|
+
}
|
|
125
|
+
}
|
|
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);
|
|
135
|
+
}
|
|
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);
|
|
141
|
+
}
|
|
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
|
+
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,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/lib/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export interface ProjectStack {
|
|
2
|
+
backend?: string;
|
|
3
|
+
frontend?: string;
|
|
4
|
+
database?: string;
|
|
5
|
+
orm?: string;
|
|
6
|
+
package_manager?: string;
|
|
7
|
+
monorepo?: string;
|
|
8
|
+
testing?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ProjectAgents {
|
|
11
|
+
active?: string[];
|
|
12
|
+
compliance?: string[];
|
|
13
|
+
profiles?: string[];
|
|
14
|
+
specialized?: string[];
|
|
15
|
+
by_role?: Record<string, string | null>;
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectDeploy {
|
|
18
|
+
provider?: string;
|
|
19
|
+
production_url?: string;
|
|
20
|
+
smoke_tests?: Array<{
|
|
21
|
+
url: string;
|
|
22
|
+
expect_status?: number;
|
|
23
|
+
expect_json?: Record<string, unknown>;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface ProjectRules {
|
|
27
|
+
forbidden_in_production?: string[];
|
|
28
|
+
forbidden_patterns?: string[];
|
|
29
|
+
required_review_before_ship?: boolean;
|
|
30
|
+
require_spec_before_implementation?: boolean;
|
|
31
|
+
conventional_commits?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ProjectCompliance {
|
|
34
|
+
frameworks?: string[];
|
|
35
|
+
pii_handling?: boolean;
|
|
36
|
+
audit_logs?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface ProjectGithub {
|
|
39
|
+
project?: {
|
|
40
|
+
number?: number;
|
|
41
|
+
owner?: string;
|
|
42
|
+
repo?: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export interface ProjectSprint {
|
|
46
|
+
current?: number;
|
|
47
|
+
phases?: Array<{
|
|
48
|
+
id: number;
|
|
49
|
+
name: string;
|
|
50
|
+
specs?: string[];
|
|
51
|
+
status?: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
export interface ProjectPaths {
|
|
55
|
+
api?: string;
|
|
56
|
+
frontend?: string;
|
|
57
|
+
admin?: string;
|
|
58
|
+
mobile?: string;
|
|
59
|
+
specs?: string;
|
|
60
|
+
progress?: string;
|
|
61
|
+
tests?: string;
|
|
62
|
+
scanner?: string;
|
|
63
|
+
migrations?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ProjectYaml {
|
|
66
|
+
project: {
|
|
67
|
+
name: string;
|
|
68
|
+
slug?: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
language?: string;
|
|
71
|
+
mode: 'startup' | 'standard' | 'enterprise';
|
|
72
|
+
status?: string;
|
|
73
|
+
};
|
|
74
|
+
stack?: ProjectStack;
|
|
75
|
+
agents?: ProjectAgents;
|
|
76
|
+
deploy?: ProjectDeploy;
|
|
77
|
+
rules?: ProjectRules;
|
|
78
|
+
compliance?: ProjectCompliance;
|
|
79
|
+
github?: ProjectGithub;
|
|
80
|
+
sprint?: ProjectSprint;
|
|
81
|
+
paths?: ProjectPaths;
|
|
82
|
+
runtimes?: {
|
|
83
|
+
active?: string[];
|
|
84
|
+
};
|
|
85
|
+
mcp?: {
|
|
86
|
+
servers?: Array<{
|
|
87
|
+
name: string;
|
|
88
|
+
auto_approve?: string[];
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
scripts?: Record<string, string>;
|
|
92
|
+
}
|
|
93
|
+
export declare function findProjectYaml(start?: string): string | null;
|
|
94
|
+
export declare function loadProjectYaml(path: string): ProjectYaml;
|
|
95
|
+
export declare function projectRoot(yamlPath: string): string;
|
|
96
|
+
//# sourceMappingURL=yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/yaml.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
export function findProjectYaml(start = process.cwd()) {
|
|
5
|
+
let current = start;
|
|
6
|
+
while (true) {
|
|
7
|
+
const candidate = join(current, 'project.yaml');
|
|
8
|
+
if (existsSync(candidate))
|
|
9
|
+
return candidate;
|
|
10
|
+
const parent = dirname(current);
|
|
11
|
+
if (parent === current)
|
|
12
|
+
return null;
|
|
13
|
+
current = parent;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function loadProjectYaml(path) {
|
|
17
|
+
const content = readFileSync(path, 'utf-8');
|
|
18
|
+
const data = yaml.load(content);
|
|
19
|
+
if (!data || typeof data !== 'object')
|
|
20
|
+
throw new Error('project.yaml está vacío o no es un objeto YAML válido');
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
export function projectRoot(yamlPath) {
|
|
24
|
+
return dirname(yamlPath);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/lib/yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAmF3B,MAAM,UAAU,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAgB,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAChH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cristiancorreau/forge",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
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",
|
|
@@ -37,10 +37,16 @@
|
|
|
37
37
|
"CHANGELOG.md"
|
|
38
38
|
],
|
|
39
39
|
"devDependencies": {
|
|
40
|
+
"@types/js-yaml": "^4.0.9",
|
|
40
41
|
"@types/node": "^20.0.0",
|
|
41
42
|
"typescript": "^5.4.0"
|
|
42
43
|
},
|
|
43
44
|
"engines": {
|
|
44
45
|
"node": ">=18.0.0"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"ajv": "^8.20.0",
|
|
49
|
+
"ajv-formats": "^3.0.1",
|
|
50
|
+
"js-yaml": "^4.2.0"
|
|
45
51
|
}
|
|
46
52
|
}
|