@cristiancorreau/forge 2.9.6 → 2.9.7
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/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +2 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/lib/paths.d.ts +1 -2
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +12 -16
- package/dist/lib/paths.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/assets/adapters/claude-code/generate-claude-md.py +0 -304
- package/assets/adapters/codex/generate-codex-config.py +0 -269
- package/assets/adapters/kiro/generate-steering.py +0 -367
- package/assets/adapters/opencode/generate-agents-md.py +0 -262
- package/assets/core/hooks/pre-bash-check.py +0 -202
- package/assets/core/hooks/pre-edit-check.py +0 -317
- package/assets/forge.py +0 -1265
- package/assets/requirements.txt +0 -2
- package/assets/scripts/aitmpl-search.py +0 -808
- package/assets/scripts/forge-add-opportunities.py +0 -92
- package/assets/scripts/forge-audit.py +0 -1061
- package/assets/scripts/forge-generate-all.py +0 -283
- package/assets/scripts/forge-init.py +0 -900
- package/assets/scripts/forge-migrate-project-yaml.py +0 -397
- package/assets/scripts/forge-scaffold-profile.py +0 -181
- package/assets/scripts/forge-teardown.py +0 -193
- package/assets/scripts/forge-validate-project-yaml.py +0 -457
- package/assets/scripts/forge-wizard.py +0 -1003
- package/assets/scripts/setup-codex.sh +0 -229
- package/assets/scripts/team-install.sh +0 -147
- package/assets/scripts/token-stats.py +0 -201
- package/dist/lib/python.d.ts +0 -4
- package/dist/lib/python.d.ts.map +0 -1
- package/dist/lib/python.js +0 -46
- package/dist/lib/python.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAwCA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAwCA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwL7D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -60,7 +60,8 @@ export async function doctor(_args) {
|
|
|
60
60
|
// Core assets
|
|
61
61
|
const coreOk = existsSync(join(root, 'core', 'agents'))
|
|
62
62
|
&& existsSync(join(root, 'core', 'schemas'))
|
|
63
|
-
&& existsSync(join(root, '
|
|
63
|
+
&& existsSync(join(root, 'profiles'))
|
|
64
|
+
&& existsSync(join(root, 'adapters'));
|
|
64
65
|
if (coreOk) {
|
|
65
66
|
const assetsLine = `${icons.ok} forge assets: completos`;
|
|
66
67
|
console.log(' ' + assetsLine);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -410,7 +410,7 @@ export async function init(args) {
|
|
|
410
410
|
...allAgents.map(a => `.claude/agents/${a}.md`),
|
|
411
411
|
];
|
|
412
412
|
const ts = new Date().toISOString();
|
|
413
|
-
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.
|
|
413
|
+
saveManifest(projectRoot, buildManifest(runtime, installedFiles, projectRoot, '2.9.7', ts));
|
|
414
414
|
},
|
|
415
415
|
},
|
|
416
416
|
]);
|
package/dist/lib/paths.d.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Resolves the forge root directory in priority order:
|
|
3
3
|
* 1. FORGE_HOME env var
|
|
4
4
|
* 2. assets/ next to the compiled CLI (npm package mode)
|
|
5
|
-
* 3. Walk up from __dirname
|
|
5
|
+
* 3. Walk up from __dirname (dev mode)
|
|
6
6
|
* 4. .agentic/ or forge/ in cwd (consumer project with submodule)
|
|
7
7
|
*/
|
|
8
8
|
export declare function resolveForgeRoot(): string;
|
|
9
|
-
export declare function resolveScript(name: string): string;
|
|
10
9
|
//# sourceMappingURL=paths.d.ts.map
|
package/dist/lib/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6BzC"}
|
package/dist/lib/paths.js
CHANGED
|
@@ -2,48 +2,44 @@ import { existsSync } from 'fs';
|
|
|
2
2
|
import { join, dirname } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
// A directory is a forge root if it contains core/agents (the defining asset).
|
|
6
|
+
function isForgeRoot(dir) {
|
|
7
|
+
return existsSync(join(dir, 'core', 'agents'));
|
|
8
|
+
}
|
|
5
9
|
/**
|
|
6
10
|
* Resolves the forge root directory in priority order:
|
|
7
11
|
* 1. FORGE_HOME env var
|
|
8
12
|
* 2. assets/ next to the compiled CLI (npm package mode)
|
|
9
|
-
* 3. Walk up from __dirname
|
|
13
|
+
* 3. Walk up from __dirname (dev mode)
|
|
10
14
|
* 4. .agentic/ or forge/ in cwd (consumer project with submodule)
|
|
11
15
|
*/
|
|
12
16
|
export function resolveForgeRoot() {
|
|
13
17
|
if (process.env.FORGE_HOME) {
|
|
14
18
|
const p = process.env.FORGE_HOME;
|
|
15
|
-
if (
|
|
19
|
+
if (isForgeRoot(p))
|
|
16
20
|
return p;
|
|
17
|
-
throw new Error(`FORGE_HOME="${p}"
|
|
21
|
+
throw new Error(`FORGE_HOME="${p}" is not a forge root (missing core/agents)`);
|
|
18
22
|
}
|
|
19
23
|
// npm package mode: __dirname is dist/lib/, assets/ is at package root (two levels up)
|
|
20
24
|
const assetsPath = join(__dirname, '..', '..', 'assets');
|
|
21
|
-
if (
|
|
25
|
+
if (isForgeRoot(assetsPath))
|
|
22
26
|
return assetsPath;
|
|
23
|
-
// dev mode: walk up from __dirname to find
|
|
27
|
+
// dev mode: walk up from __dirname to find the repo root
|
|
24
28
|
let dir = __dirname;
|
|
25
29
|
for (let i = 0; i < 8; i++) {
|
|
26
|
-
if (
|
|
30
|
+
if (isForgeRoot(dir))
|
|
27
31
|
return dir;
|
|
28
32
|
const parent = dirname(dir);
|
|
29
33
|
if (parent === dir)
|
|
30
34
|
break;
|
|
31
35
|
dir = parent;
|
|
32
36
|
}
|
|
33
|
-
// consumer project: look for .agentic/ or forge/
|
|
37
|
+
// consumer project: look for a vendored forge under .agentic/ or forge/
|
|
34
38
|
for (const candidate of ['.agentic', 'forge']) {
|
|
35
39
|
const p = join(process.cwd(), candidate);
|
|
36
|
-
if (
|
|
40
|
+
if (isForgeRoot(p))
|
|
37
41
|
return p;
|
|
38
42
|
}
|
|
39
43
|
throw new Error('forge root not found. Set FORGE_HOME or install via: npx @cristiancorreau/forge');
|
|
40
44
|
}
|
|
41
|
-
export function resolveScript(name) {
|
|
42
|
-
const root = resolveForgeRoot();
|
|
43
|
-
const scriptPath = join(root, 'scripts', name);
|
|
44
|
-
if (!existsSync(scriptPath)) {
|
|
45
|
-
throw new Error(`Script not found: ${scriptPath}`);
|
|
46
|
-
}
|
|
47
|
-
return scriptPath;
|
|
48
|
-
}
|
|
49
45
|
//# sourceMappingURL=paths.js.map
|
package/dist/lib/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,+EAA+E;AAC/E,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,IAAI,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,6CAA6C,CAAC,CAAC;IACjF,CAAC;IAED,uFAAuF;IACvF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,WAAW,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAE/C,yDAAyD;IACzD,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,KAAK,MAAM,SAAS,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;AACJ,CAAC"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cristiancorreau/forge",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.7",
|
|
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",
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# Copyright 2026 Cristian Correa — Apache License 2.0
|
|
3
|
-
# https://github.com/cristiancorreau/forge
|
|
4
|
-
"""
|
|
5
|
-
Genera CLAUDE.md para un proyecto usando forge.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
python3 .agentic/adapters/claude-code/generate-claude-md.py
|
|
9
|
-
|
|
10
|
-
Lee project.yaml en la raíz y genera CLAUDE.md adaptado al stack del proyecto.
|
|
11
|
-
Si ya existe un CLAUDE.md, muestra el diff antes de sobreescribir.
|
|
12
|
-
|
|
13
|
-
Requiere: pyyaml
|
|
14
|
-
"""
|
|
15
|
-
import os
|
|
16
|
-
import sys
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
|
|
19
|
-
FORCE = "--force" in sys.argv
|
|
20
|
-
|
|
21
|
-
try:
|
|
22
|
-
import yaml
|
|
23
|
-
except ImportError:
|
|
24
|
-
print("ERROR: pyyaml requerido. pip install pyyaml", file=sys.stderr)
|
|
25
|
-
sys.exit(1)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def find_project_root() -> Path:
|
|
29
|
-
here = Path.cwd()
|
|
30
|
-
for p in [here] + list(here.parents):
|
|
31
|
-
if (p / "project.yaml").exists():
|
|
32
|
-
return p
|
|
33
|
-
raise FileNotFoundError("No se encontró project.yaml")
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _render_phases(config: dict) -> str:
|
|
37
|
-
sprint = config.get("sprint", {})
|
|
38
|
-
current = sprint.get("current", 1)
|
|
39
|
-
phases = sprint.get("phases", [])
|
|
40
|
-
if not phases:
|
|
41
|
-
return (
|
|
42
|
-
f"- **Sprint actual:** Sprint {current}\n"
|
|
43
|
-
"- **Completadas:** —\n"
|
|
44
|
-
"- **En curso:** —\n"
|
|
45
|
-
"- **Pendientes:** —"
|
|
46
|
-
)
|
|
47
|
-
lines = [f"- **Sprint actual:** Sprint {current}"]
|
|
48
|
-
for phase in phases:
|
|
49
|
-
pid = phase.get("id", "?")
|
|
50
|
-
name = phase.get("name", "")
|
|
51
|
-
specs = phase.get("specs", [])
|
|
52
|
-
status = phase.get("status", "pendiente")
|
|
53
|
-
spec_list = ", ".join(specs) if specs else "—"
|
|
54
|
-
lines.append(f"- **Fase {pid} — {name}** ({status}): {spec_list}")
|
|
55
|
-
return "\n".join(lines)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
_AGENT_TRIGGER = {
|
|
59
|
-
"orchestrator": ("tareas multi-agente, análisis de >3 archivos, descomposición de features completas", None),
|
|
60
|
-
"backend-engineer": ("endpoints, middleware, validaciones, lógica de negocio", "api"),
|
|
61
|
-
"api-engineer": ("endpoints REST, middleware, validaciones, migraciones de BD", "api"),
|
|
62
|
-
"frontend-engineer": ("componentes UI, páginas, estilos, integración con API", "frontend"),
|
|
63
|
-
"admin-engineer": ("UI de gestión interna, dashboards de admin", "admin"),
|
|
64
|
-
"mobile-engineer": ("pantallas móviles, navegación, stores de estado", "mobile"),
|
|
65
|
-
"fullstack-engineer": ("features full-stack end-to-end que abarcan backend y frontend", None),
|
|
66
|
-
"test-engineer": ("tests unitarios, integración, E2E — nunca código de producción", "tests"),
|
|
67
|
-
"docs-writer": ("specs, ADRs, READMEs, documentación — nunca código de producción", "specs"),
|
|
68
|
-
"compliance-reviewer": ("revisión de PRs con PII, consentimientos, logs de auditoría", None),
|
|
69
|
-
"security-auditor": ("auditoría de vulnerabilidades, revisión de dependencias, pentest", None),
|
|
70
|
-
"migration-specialist": ("migraciones de versión de framework (ej: L6→L13)", "migrations"),
|
|
71
|
-
"wp-engineer": ("temas WordPress, FSE, Gutenberg, child themes", "frontend"),
|
|
72
|
-
"divi-engineer": ("layouts Divi 5, módulos custom, Divi Builder", "frontend"),
|
|
73
|
-
"elementor-engineer": ("templates Elementor Pro, widgets custom", "frontend"),
|
|
74
|
-
"scanner-engineer": ("scraping, crawling, extracción estructurada de datos", "scanner"),
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def _build_agent_scope_table(agents_cfg: dict, paths: dict) -> str:
|
|
79
|
-
active = agents_cfg.get("active", [])
|
|
80
|
-
compliance = agents_cfg.get("compliance", [])
|
|
81
|
-
agent_paths = {**(paths or {})}
|
|
82
|
-
rows = []
|
|
83
|
-
for agent in active + compliance:
|
|
84
|
-
trigger, path_key = _AGENT_TRIGGER.get(agent, ("implementación", None))
|
|
85
|
-
scope = agent_paths.get(path_key) if path_key else None
|
|
86
|
-
scope_str = f"`{scope}`" if scope else "`/`"
|
|
87
|
-
rows.append(f"| `{agent}` | {scope_str} | {trigger} |")
|
|
88
|
-
if not rows:
|
|
89
|
-
return ""
|
|
90
|
-
header = (
|
|
91
|
-
"## Agentes y su scope\n\n"
|
|
92
|
-
"| Agente | Scope | Cuándo usarlo |\n"
|
|
93
|
-
"|--------|-------|---------------|\n"
|
|
94
|
-
)
|
|
95
|
-
return header + "\n".join(rows) + "\n\n> Invocar el agente del scope correcto, no el orchestrator, para tareas acotadas.\n\n"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def generate_claude_md(config: dict) -> str:
|
|
99
|
-
proj = config.get("project", {})
|
|
100
|
-
stack = config.get("stack", {})
|
|
101
|
-
team = config.get("team", {})
|
|
102
|
-
compliance_cfg = config.get("compliance", {})
|
|
103
|
-
agents_cfg = config.get("agents", {})
|
|
104
|
-
paths = config.get("paths", {})
|
|
105
|
-
|
|
106
|
-
name = proj.get("name", "Mi Proyecto")
|
|
107
|
-
description = proj.get("description", "")
|
|
108
|
-
language = proj.get("language", "typescript")
|
|
109
|
-
backend = stack.get("backend") or "N/A"
|
|
110
|
-
frontend = stack.get("frontend") or "N/A"
|
|
111
|
-
database = stack.get("database") or "N/A"
|
|
112
|
-
frameworks = compliance_cfg.get("frameworks", [])
|
|
113
|
-
specs_path = paths.get("specs", "docs/specs")
|
|
114
|
-
progress_path = paths.get("progress", "docs/progress.html")
|
|
115
|
-
agent_scope_section = _build_agent_scope_table(agents_cfg, paths)
|
|
116
|
-
|
|
117
|
-
# Agentes activos
|
|
118
|
-
active = agents_cfg.get("active", [])
|
|
119
|
-
|
|
120
|
-
# Comandos según lenguaje
|
|
121
|
-
if language == "typescript":
|
|
122
|
-
dev_cmd = "pnpm dev"
|
|
123
|
-
test_cmd = "pnpm test"
|
|
124
|
-
lint_cmd = "pnpm lint"
|
|
125
|
-
build_cmd = "pnpm build"
|
|
126
|
-
elif language == "python":
|
|
127
|
-
dev_cmd = "python manage.py runserver # o uvicorn main:app"
|
|
128
|
-
test_cmd = "pytest"
|
|
129
|
-
lint_cmd = "ruff check ."
|
|
130
|
-
build_cmd = "# no aplica"
|
|
131
|
-
elif language == "ruby":
|
|
132
|
-
dev_cmd = "rails server"
|
|
133
|
-
test_cmd = "bundle exec rspec"
|
|
134
|
-
lint_cmd = "rubocop"
|
|
135
|
-
build_cmd = "# no aplica"
|
|
136
|
-
elif language == "go":
|
|
137
|
-
dev_cmd = "go run ./cmd/..."
|
|
138
|
-
test_cmd = "go test ./..."
|
|
139
|
-
lint_cmd = "golangci-lint run"
|
|
140
|
-
build_cmd = "go build ./..."
|
|
141
|
-
elif language == "php":
|
|
142
|
-
dev_cmd = "php artisan serve # o php -S localhost:8000 -t public"
|
|
143
|
-
test_cmd = "vendor/bin/phpunit # o ./vendor/bin/pest"
|
|
144
|
-
lint_cmd = "vendor/bin/phpstan analyse"
|
|
145
|
-
build_cmd = "composer install --no-dev --optimize-autoloader"
|
|
146
|
-
elif language == "mixed":
|
|
147
|
-
dev_cmd = "# ver documentación del proyecto (stack mixto)"
|
|
148
|
-
test_cmd = "# ver documentación del proyecto (stack mixto)"
|
|
149
|
-
lint_cmd = "# ver documentación del proyecto (stack mixto)"
|
|
150
|
-
build_cmd = "# ver documentación del proyecto (stack mixto)"
|
|
151
|
-
else:
|
|
152
|
-
dev_cmd = "# ver documentación del proyecto"
|
|
153
|
-
test_cmd = "# ver documentación del proyecto"
|
|
154
|
-
lint_cmd = "# ver documentación del proyecto"
|
|
155
|
-
build_cmd = "# ver documentación del proyecto"
|
|
156
|
-
|
|
157
|
-
compliance_section = ""
|
|
158
|
-
if frameworks:
|
|
159
|
-
compliance_section = f"""
|
|
160
|
-
## Compliance activo
|
|
161
|
-
|
|
162
|
-
Este proyecto opera bajo los siguientes marcos regulatorios:
|
|
163
|
-
{chr(10).join(f'- **{f.upper()}**' for f in frameworks)}
|
|
164
|
-
|
|
165
|
-
Reglas no-negociables:
|
|
166
|
-
- Sin datos personales en logs de stdout
|
|
167
|
-
- Consentimiento explícito antes de cualquier tracker no esencial
|
|
168
|
-
- Logs de auditoría append-only (sin UPDATE/DELETE)
|
|
169
|
-
- Derechos del titular implementados (acceso, rectificación, supresión, oposición, portabilidad)
|
|
170
|
-
"""
|
|
171
|
-
|
|
172
|
-
return f"""# CLAUDE.md — {name}
|
|
173
|
-
|
|
174
|
-
> Generado por forge. Actualizar project.yaml para cambiar la configuración.
|
|
175
|
-
> Si actualizás el código de manera que invalide algo aquí, actualizá este archivo en el mismo PR.
|
|
176
|
-
|
|
177
|
-
## Misión del proyecto
|
|
178
|
-
|
|
179
|
-
{description}
|
|
180
|
-
|
|
181
|
-
## Stack
|
|
182
|
-
|
|
183
|
-
- **Lenguaje**: {language}
|
|
184
|
-
- **Backend**: {backend}
|
|
185
|
-
- **Frontend**: {frontend}
|
|
186
|
-
- **Base de datos**: {database}
|
|
187
|
-
- **Testing**: {", ".join(stack.get("testing", []))}
|
|
188
|
-
|
|
189
|
-
{agent_scope_section}## Estructura
|
|
190
|
-
|
|
191
|
-
```
|
|
192
|
-
{proj.get("slug", "proyecto")}/
|
|
193
|
-
├── CLAUDE.md ← Estás acá
|
|
194
|
-
├── AGENTS.md ← Convenciones del agent team
|
|
195
|
-
├── project.yaml ← Config de forge (fuente de verdad)
|
|
196
|
-
├── {specs_path}/ ← Specs de features (requeridas antes de implementar)
|
|
197
|
-
└── {progress_path} ← Dashboard de progreso del proyecto
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## Cómo trabajar (SDD)
|
|
201
|
-
|
|
202
|
-
Cuando recibás una tarea:
|
|
203
|
-
|
|
204
|
-
1. **Identificá la spec.** Si no está en `{specs_path}/`, pará y pedí que se cree.
|
|
205
|
-
2. **Leé la spec correspondiente.**
|
|
206
|
-
3. **Leé el `CLAUDE.md` del módulo** que vas a modificar (si existe).
|
|
207
|
-
4. **Proponé opciones** para decisiones arquitectónicas no cubiertas por la spec.
|
|
208
|
-
5. **Esperá aprobación** antes de generar código.
|
|
209
|
-
6. **Tests** junto con la implementación, no al final.
|
|
210
|
-
7. **Al terminar**, actualizá la spec con decisiones tomadas durante la implementación.
|
|
211
|
-
8. **Antes de cerrar**: `{test_cmd}`, `{lint_cmd}`.
|
|
212
|
-
{compliance_section}
|
|
213
|
-
## Phases activas y estado
|
|
214
|
-
|
|
215
|
-
{_render_phases(config)}
|
|
216
|
-
|
|
217
|
-
> Actualizar `project.yaml` (sprint.phases) para reflejar el estado real.
|
|
218
|
-
|
|
219
|
-
## Comandos frecuentes
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
{dev_cmd} # Desarrollo
|
|
223
|
-
{test_cmd} # Tests
|
|
224
|
-
{lint_cmd} # Lint
|
|
225
|
-
{build_cmd} # Build
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Qué NO hacer
|
|
229
|
-
|
|
230
|
-
- No implementar sin spec en `{specs_path}/`
|
|
231
|
-
- No hardcodear tokens, passwords o secrets
|
|
232
|
-
- No usar `any` en TypeScript sin comentario que explique por qué
|
|
233
|
-
- No commits con `console.log` o `print` de depuración
|
|
234
|
-
- No hacer force push a main/master
|
|
235
|
-
"""
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def _generate_architecture_rules(root: Path, forge: Path, config: dict):
|
|
239
|
-
"""Crea .claude/architecture.rules desde el template si no existe. Nunca sobreescribe."""
|
|
240
|
-
dst = root / ".claude" / "architecture.rules"
|
|
241
|
-
if dst.exists():
|
|
242
|
-
return
|
|
243
|
-
|
|
244
|
-
# Buscar el template en forge
|
|
245
|
-
tpl_path = forge / "core" / "templates" / "claude-md" / "architecture.rules"
|
|
246
|
-
if not tpl_path.exists():
|
|
247
|
-
return
|
|
248
|
-
|
|
249
|
-
project_name = config.get("project", {}).get("name", "Mi Proyecto")
|
|
250
|
-
content = tpl_path.read_text(encoding="utf-8")
|
|
251
|
-
content = content.replace("<NOMBRE_PROYECTO>", project_name)
|
|
252
|
-
|
|
253
|
-
dst.parent.mkdir(parents=True, exist_ok=True)
|
|
254
|
-
dst.write_text(content, encoding="utf-8")
|
|
255
|
-
print(f"[OK] .claude/architecture.rules — creado desde template")
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def _find_forge_dir(root: Path) -> Path:
|
|
259
|
-
"""Localiza el directorio de forge relativo a este script."""
|
|
260
|
-
# Este script está en forge/adapters/claude-code/generate-claude-md.py
|
|
261
|
-
script_dir = Path(__file__).parent
|
|
262
|
-
# forge_dir = forge/
|
|
263
|
-
candidate = script_dir.parent.parent
|
|
264
|
-
if (candidate / "core").exists():
|
|
265
|
-
return candidate
|
|
266
|
-
# Fallback: buscar .agentic o forge en la raíz del proyecto
|
|
267
|
-
for name in (".agentic", "forge"):
|
|
268
|
-
c = root / name
|
|
269
|
-
if (c / "core").exists():
|
|
270
|
-
return c
|
|
271
|
-
return candidate
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
def main():
|
|
275
|
-
try:
|
|
276
|
-
root = find_project_root()
|
|
277
|
-
except FileNotFoundError as e:
|
|
278
|
-
print(f"ERROR: {e}", file=sys.stderr)
|
|
279
|
-
sys.exit(1)
|
|
280
|
-
|
|
281
|
-
with open(root / "project.yaml") as f:
|
|
282
|
-
config = yaml.safe_load(f)
|
|
283
|
-
|
|
284
|
-
content = generate_claude_md(config)
|
|
285
|
-
output_path = root / "CLAUDE.md"
|
|
286
|
-
|
|
287
|
-
if output_path.exists() and not FORCE:
|
|
288
|
-
print(f"CLAUDE.md ya existe en {root}. Sobreescribir? [s/N] ", end="")
|
|
289
|
-
resp = input().strip().lower()
|
|
290
|
-
if resp not in ("s", "si", "sí", "y", "yes"):
|
|
291
|
-
print("Cancelado.")
|
|
292
|
-
sys.exit(0)
|
|
293
|
-
|
|
294
|
-
with open(output_path, "w") as f:
|
|
295
|
-
f.write(content)
|
|
296
|
-
|
|
297
|
-
print(f"CLAUDE.md generado en {output_path}")
|
|
298
|
-
|
|
299
|
-
forge = _find_forge_dir(root)
|
|
300
|
-
_generate_architecture_rules(root, forge, config)
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if __name__ == "__main__":
|
|
304
|
-
main()
|