@cristiancorreau/forge 2.1.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 +228 -0
- package/LICENSE +191 -0
- package/README.md +156 -0
- package/assets/adapters/claude-code/commands/deploy-check.md +12 -0
- package/assets/adapters/claude-code/commands/new-feature.md +11 -0
- package/assets/adapters/claude-code/commands/plan.md +116 -0
- package/assets/adapters/claude-code/commands/review.md +219 -0
- package/assets/adapters/claude-code/commands/session-close.md +109 -0
- package/assets/adapters/claude-code/commands/session-start.md +59 -0
- package/assets/adapters/claude-code/commands/ship.md +133 -0
- package/assets/adapters/claude-code/commands/wiki-ingest.md +7 -0
- package/assets/adapters/claude-code/commands/wiki-lint.md +5 -0
- package/assets/adapters/claude-code/commands/wiki-query.md +7 -0
- package/assets/adapters/claude-code/commands/work.md +101 -0
- package/assets/adapters/claude-code/generate-claude-md.py +304 -0
- package/assets/adapters/codex/commands/plan.md +63 -0
- package/assets/adapters/codex/commands/review.md +53 -0
- package/assets/adapters/codex/commands/session-close.md +53 -0
- package/assets/adapters/codex/commands/session-start.md +49 -0
- package/assets/adapters/codex/commands/ship.md +53 -0
- package/assets/adapters/codex/commands/work.md +53 -0
- package/assets/adapters/codex/generate-codex-config.py +269 -0
- package/assets/adapters/codex/hooks/codex.yaml.tpl +43 -0
- package/assets/adapters/codex/hooks/forge-codex-finish.sh +158 -0
- package/assets/adapters/codex/hooks/forge-codex-start.sh +186 -0
- package/assets/adapters/kiro/generate-steering.py +367 -0
- package/assets/adapters/opencode/HOOKS.md +123 -0
- package/assets/adapters/opencode/commands/plan.md +119 -0
- package/assets/adapters/opencode/commands/review.md +164 -0
- package/assets/adapters/opencode/commands/session-close.md +111 -0
- package/assets/adapters/opencode/commands/session-start.md +62 -0
- package/assets/adapters/opencode/commands/ship.md +135 -0
- package/assets/adapters/opencode/commands/work.md +82 -0
- package/assets/adapters/opencode/generate-agents-md.py +262 -0
- package/assets/core/agents/backend-engineer.md +61 -0
- package/assets/core/agents/compliance-reviewer.md +83 -0
- package/assets/core/agents/docs-writer.md +77 -0
- package/assets/core/agents/frontend-engineer.md +70 -0
- package/assets/core/agents/orchestrator.md +104 -0
- package/assets/core/agents/security-auditor.md +54 -0
- package/assets/core/agents/test-engineer.md +57 -0
- package/assets/core/hooks/hooks-registry.yaml +48 -0
- package/assets/core/hooks/post-turn-check.sh +139 -0
- package/assets/core/hooks/pre-bash-check.py +202 -0
- package/assets/core/hooks/pre-edit-check.py +317 -0
- package/assets/core/hooks/session-start.sh +184 -0
- package/assets/core/schemas/project.schema.json +503 -0
- package/assets/core/skills/README.md +88 -0
- package/assets/core/skills/aitmpl-search/SKILL.md +74 -0
- package/assets/core/skills/browser-test/SKILL.md +177 -0
- package/assets/core/skills/db-migrate/SKILL.md +163 -0
- package/assets/core/skills/local2prod/SKILL.md +147 -0
- package/assets/core/skills/new-feature/SKILL.md +155 -0
- package/assets/core/skills/obsidian-sync/SKILL.md +152 -0
- package/assets/core/skills/phase-kickoff/SKILL.md +69 -0
- package/assets/core/skills/security-audit/SKILL.md +125 -0
- package/assets/core/skills/spec/SKILL.md +72 -0
- package/assets/core/skills/wiki-ingest/SKILL.md +183 -0
- package/assets/core/skills/wiki-lint/SKILL.md +109 -0
- package/assets/core/skills/wiki-query/SKILL.md +100 -0
- package/assets/core/templates/claude-md/architecture.rules +20 -0
- package/assets/core/templates/claude-md/global.md +30 -0
- package/assets/core/templates/claude-md/project.md +36 -0
- package/assets/core/templates/daily-note.md +38 -0
- package/assets/core/templates/spec-template.md +43 -0
- package/assets/core/workflows/sdd.md +69 -0
- package/assets/core/workflows/sprint.md +59 -0
- package/assets/forge.py +1265 -0
- package/assets/hooks/pre-commit +43 -0
- package/assets/manifest.json +274 -0
- package/assets/profiles/astro/README.md +24 -0
- package/assets/profiles/astro/agents/frontend-engineer.md +74 -0
- package/assets/profiles/django/agents/api-engineer.md +83 -0
- package/assets/profiles/expo/README.md +24 -0
- package/assets/profiles/expo/agents/mobile-engineer.md +69 -0
- package/assets/profiles/express/agents/api-engineer.md +60 -0
- package/assets/profiles/fastapi/README.md +32 -0
- package/assets/profiles/fastapi/agents/api-engineer.md +87 -0
- package/assets/profiles/go-gin/agents/api-engineer.md +98 -0
- package/assets/profiles/hono-drizzle/README.md +31 -0
- package/assets/profiles/hono-drizzle/agents/api-engineer.md +82 -0
- package/assets/profiles/laravel/README.md +32 -0
- package/assets/profiles/laravel/agents/api-engineer.md +114 -0
- package/assets/profiles/laravel/agents/fullstack-engineer.md +67 -0
- package/assets/profiles/laravel/agents/migration-specialist.md +420 -0
- package/assets/profiles/nestjs/agents/api-engineer.md +79 -0
- package/assets/profiles/nextjs-admin/README.md +32 -0
- package/assets/profiles/nextjs-admin/agents/admin-engineer.md +78 -0
- package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +51 -0
- package/assets/profiles/rails/agents/fullstack-engineer.md +61 -0
- package/assets/profiles/sveltekit/agents/frontend-engineer.md +96 -0
- package/assets/profiles/vuenuxt/agents/frontend-engineer.md +82 -0
- package/assets/profiles/wordpress/README.md +30 -0
- package/assets/profiles/wordpress/agents/divi-engineer.md +273 -0
- package/assets/profiles/wordpress/agents/elementor-engineer.md +310 -0
- package/assets/profiles/wordpress/agents/wp-engineer.md +216 -0
- package/assets/requirements.txt +2 -0
- package/assets/scripts/aitmpl-search.py +808 -0
- package/assets/scripts/forge-add-opportunities.py +92 -0
- package/assets/scripts/forge-audit.py +1061 -0
- package/assets/scripts/forge-generate-all.py +283 -0
- package/assets/scripts/forge-init.py +900 -0
- package/assets/scripts/forge-migrate-project-yaml.py +397 -0
- package/assets/scripts/forge-scaffold-profile.py +181 -0
- package/assets/scripts/forge-teardown.py +193 -0
- package/assets/scripts/forge-validate-project-yaml.py +457 -0
- package/assets/scripts/forge-wizard.py +1003 -0
- package/assets/scripts/setup-codex.sh +229 -0
- package/assets/scripts/team-install.sh +147 -0
- package/assets/scripts/token-stats.py +201 -0
- package/assets/templates/modes/enterprise.yaml.tpl +114 -0
- package/assets/templates/modes/multi-runtime.yaml.tpl +89 -0
- package/assets/templates/modes/new-stack.yaml.tpl +101 -0
- package/assets/templates/modes/startup.yaml.tpl +74 -0
- package/assets/templates/project.yaml.tpl +185 -0
- package/assets/templates/wiki/concepts/_template.md +22 -0
- package/assets/templates/wiki/entities/_template.md +19 -0
- package/assets/templates/wiki/index.md +32 -0
- package/assets/templates/wiki/log.md +6 -0
- package/assets/templates/wiki/sources/_template.md +25 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +21 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +58 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +27 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +22 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +20 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/lib/paths.d.ts +10 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/python.d.ts +4 -0
- package/dist/lib/python.d.ts.map +1 -0
- package/dist/lib/python.js +46 -0
- package/dist/lib/python.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# project.yaml — Modo multi-runtime
|
|
2
|
+
# Para equipos que usan Claude Code, OpenCode y/o Kiro simultáneamente.
|
|
3
|
+
# Renombrar a project.yaml en la raíz del repositorio.
|
|
4
|
+
#
|
|
5
|
+
# Adapters disponibles y cómo instalar cada runtime:
|
|
6
|
+
# Claude Code : forge-init --tool claude-code → genera .claude/agents/
|
|
7
|
+
# OpenCode : forge-init --tool opencode → genera AGENTS.md para OpenCode
|
|
8
|
+
# Kiro : forge-init --tool kiro → genera .kiro/steering/
|
|
9
|
+
# Todos : forge-init --tool all → instala los tres runtimes a la vez
|
|
10
|
+
#
|
|
11
|
+
# Ejecutar forge-init una vez por runtime. Los archivos de cada adapter
|
|
12
|
+
# no se solapan — pueden coexistir en el mismo repositorio.
|
|
13
|
+
|
|
14
|
+
project:
|
|
15
|
+
name: "Mi Proyecto"
|
|
16
|
+
slug: "mi-proyecto"
|
|
17
|
+
description: "Descripción breve del proyecto"
|
|
18
|
+
language: "typescript" # typescript | python | ruby | go | php | mixed
|
|
19
|
+
status: "active"
|
|
20
|
+
mode: "multi-runtime" # Indica que el proyecto usa más de un runtime de IA
|
|
21
|
+
|
|
22
|
+
team:
|
|
23
|
+
name: "Equipo Principal"
|
|
24
|
+
members:
|
|
25
|
+
- name: "Nombre Persona"
|
|
26
|
+
role: "lead"
|
|
27
|
+
email: "persona@empresa.cl"
|
|
28
|
+
|
|
29
|
+
stack:
|
|
30
|
+
backend: null # "hono" | "fastapi" | "rails" | "express" | "laravel" | null
|
|
31
|
+
frontend: null # "nextjs" | "nuxt" | "remix" | "rails-views" | null
|
|
32
|
+
database: null # "postgresql" | "mysql" | "sqlite" | null
|
|
33
|
+
cache: null
|
|
34
|
+
testing: ["vitest"]
|
|
35
|
+
|
|
36
|
+
agents:
|
|
37
|
+
active:
|
|
38
|
+
- orchestrator
|
|
39
|
+
- backend-engineer
|
|
40
|
+
- frontend-engineer
|
|
41
|
+
- test-engineer
|
|
42
|
+
- docs-writer
|
|
43
|
+
compliance:
|
|
44
|
+
- compliance-reviewer
|
|
45
|
+
profiles: [] # Mismos profiles aplican a todos los runtimes
|
|
46
|
+
|
|
47
|
+
sprint:
|
|
48
|
+
current: 1
|
|
49
|
+
length_days: 14
|
|
50
|
+
phases:
|
|
51
|
+
- id: "A"
|
|
52
|
+
name: "Core"
|
|
53
|
+
specs: []
|
|
54
|
+
- id: "B"
|
|
55
|
+
name: "Features"
|
|
56
|
+
specs: []
|
|
57
|
+
|
|
58
|
+
skills:
|
|
59
|
+
active:
|
|
60
|
+
- security-audit
|
|
61
|
+
- db-migrate
|
|
62
|
+
- local2prod
|
|
63
|
+
- new-feature
|
|
64
|
+
integrations: []
|
|
65
|
+
|
|
66
|
+
deploy:
|
|
67
|
+
provider: null
|
|
68
|
+
branch: "main"
|
|
69
|
+
|
|
70
|
+
compliance:
|
|
71
|
+
frameworks: []
|
|
72
|
+
pii_handling: false
|
|
73
|
+
audit_logs: false
|
|
74
|
+
|
|
75
|
+
paths:
|
|
76
|
+
specs: "docs/specs"
|
|
77
|
+
progress: "docs/progress.html"
|
|
78
|
+
migrations: null
|
|
79
|
+
tests: null
|
|
80
|
+
|
|
81
|
+
integrations:
|
|
82
|
+
obsidian:
|
|
83
|
+
vault_path: null
|
|
84
|
+
map:
|
|
85
|
+
api: null
|
|
86
|
+
database: null
|
|
87
|
+
frontend: null
|
|
88
|
+
deploy: null
|
|
89
|
+
decisions: null
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# project.yaml — Stack no cubierto por los profiles existentes
|
|
2
|
+
# Para equipos cuyo stack no está entre los 8 profiles de forge:
|
|
3
|
+
# hono-drizzle | nextjs-admin | expo | playwright-crawler
|
|
4
|
+
# fastapi | express | rails | nestjs
|
|
5
|
+
#
|
|
6
|
+
# Opciones:
|
|
7
|
+
# A) Usar agentes Tier 1 genéricos (backend-engineer, frontend-engineer) sin profile.
|
|
8
|
+
# B) Crear un profile Tier 2 para el nuevo stack (recomendado si el equipo es estable).
|
|
9
|
+
#
|
|
10
|
+
# Para crear un profile Tier 2:
|
|
11
|
+
# 1. Crear el directorio forge/profiles/<tu-stack>/agents/
|
|
12
|
+
# 2. Crear forge/profiles/<tu-stack>/agents/<engineer>.md
|
|
13
|
+
# Seguir la anatomía definida en docs/agent-standard.md:
|
|
14
|
+
# frontmatter con name, description, model, tools, tier: 2, profile: <tu-stack>
|
|
15
|
+
# Secciones: Stack, Tu trabajo, Reglas, Workflow, No hagas
|
|
16
|
+
# 3. Agregar el profile en agents.profiles (ver abajo)
|
|
17
|
+
# 4. Documentar el profile en la tabla Tier 2 de docs/agent-standard.md
|
|
18
|
+
# 5. Correr: python3 .agentic/scripts/forge-init.py --tool claude-code
|
|
19
|
+
#
|
|
20
|
+
# Atajo: usar el scaffold automático:
|
|
21
|
+
# python3 .agentic/scripts/forge-scaffold-profile.py --name <stack> --engineer <agent-name>
|
|
22
|
+
#
|
|
23
|
+
# Convención de nombres (ver docs/agent-standard.md):
|
|
24
|
+
# El nombre del agente en el profile debe coincidir con el Tier 1 que extiende.
|
|
25
|
+
# Ejemplos válidos: api-engineer, fullstack-engineer, mobile-engineer
|
|
26
|
+
|
|
27
|
+
project:
|
|
28
|
+
name: "Mi Proyecto"
|
|
29
|
+
slug: "mi-proyecto"
|
|
30
|
+
description: "Descripción breve del proyecto"
|
|
31
|
+
language: "python" # typescript | python | ruby | go | php | mixed
|
|
32
|
+
status: "active"
|
|
33
|
+
mode: "standard" # standard — perfil custom definido abajo
|
|
34
|
+
|
|
35
|
+
team:
|
|
36
|
+
name: "Equipo Principal"
|
|
37
|
+
members:
|
|
38
|
+
- name: "Nombre Persona"
|
|
39
|
+
role: "lead"
|
|
40
|
+
email: "persona@empresa.cl"
|
|
41
|
+
|
|
42
|
+
stack:
|
|
43
|
+
backend: null # Especificar aunque no sea uno de los 8 profiles
|
|
44
|
+
frontend: null
|
|
45
|
+
database: null
|
|
46
|
+
cache: null
|
|
47
|
+
testing: []
|
|
48
|
+
|
|
49
|
+
agents:
|
|
50
|
+
active:
|
|
51
|
+
- orchestrator
|
|
52
|
+
- backend-engineer # Agente Tier 1 genérico — reemplazar con el profile custom
|
|
53
|
+
- test-engineer
|
|
54
|
+
- docs-writer
|
|
55
|
+
compliance: []
|
|
56
|
+
# Una vez creado el profile Tier 2, reemplazar esta lista:
|
|
57
|
+
# profiles: ["<tu-stack>"]
|
|
58
|
+
profiles: []
|
|
59
|
+
|
|
60
|
+
sprint:
|
|
61
|
+
current: 1
|
|
62
|
+
length_days: 14
|
|
63
|
+
phases:
|
|
64
|
+
- id: "A"
|
|
65
|
+
name: "Core"
|
|
66
|
+
specs: []
|
|
67
|
+
- id: "B"
|
|
68
|
+
name: "Features"
|
|
69
|
+
specs: []
|
|
70
|
+
|
|
71
|
+
skills:
|
|
72
|
+
active:
|
|
73
|
+
- new-feature
|
|
74
|
+
# - security-audit
|
|
75
|
+
# - db-migrate
|
|
76
|
+
integrations: []
|
|
77
|
+
|
|
78
|
+
deploy:
|
|
79
|
+
provider: null
|
|
80
|
+
branch: "main"
|
|
81
|
+
|
|
82
|
+
compliance:
|
|
83
|
+
frameworks: []
|
|
84
|
+
pii_handling: false
|
|
85
|
+
audit_logs: false
|
|
86
|
+
|
|
87
|
+
paths:
|
|
88
|
+
specs: "docs/specs"
|
|
89
|
+
progress: "docs/progress.html"
|
|
90
|
+
migrations: null
|
|
91
|
+
tests: null
|
|
92
|
+
|
|
93
|
+
integrations:
|
|
94
|
+
obsidian:
|
|
95
|
+
vault_path: null
|
|
96
|
+
map:
|
|
97
|
+
api: null
|
|
98
|
+
database: null
|
|
99
|
+
frontend: null
|
|
100
|
+
deploy: null
|
|
101
|
+
decisions: null
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# project.yaml — Modo startup (1-2 personas)
|
|
2
|
+
# Overhead mínimo: sin compliance, sin fases de sprint, SDD opcional.
|
|
3
|
+
# Renombrar a project.yaml en la raíz del repositorio.
|
|
4
|
+
|
|
5
|
+
project:
|
|
6
|
+
name: "Mi Proyecto"
|
|
7
|
+
slug: "mi-proyecto"
|
|
8
|
+
description: "Descripción breve del proyecto"
|
|
9
|
+
language: "typescript" # typescript | python | ruby | go | php | mixed
|
|
10
|
+
status: "active"
|
|
11
|
+
mode: "startup" # Indica overhead reducido — sin compliance, sin fases
|
|
12
|
+
|
|
13
|
+
team:
|
|
14
|
+
name: "Equipo"
|
|
15
|
+
members:
|
|
16
|
+
- name: "Fundador"
|
|
17
|
+
role: "fullstack"
|
|
18
|
+
email: "founder@startup.io"
|
|
19
|
+
|
|
20
|
+
stack:
|
|
21
|
+
backend: null # "hono" | "fastapi" | "rails" | "express" | "laravel" | null
|
|
22
|
+
frontend: null # "nextjs" | "nuxt" | "remix" | "rails-views" | null
|
|
23
|
+
database: null # "postgresql" | "mysql" | "sqlite" | null
|
|
24
|
+
cache: null
|
|
25
|
+
testing: ["vitest"]
|
|
26
|
+
|
|
27
|
+
agents:
|
|
28
|
+
# En modo startup se trabaja con el orquestador y UN agente de implementación.
|
|
29
|
+
# Agregar más cuando el equipo crezca o cuando los dominios se separen claramente.
|
|
30
|
+
active:
|
|
31
|
+
- orchestrator
|
|
32
|
+
- backend-engineer # Reemplazar con un profile Tier 2 si el stack lo tiene
|
|
33
|
+
compliance: [] # Activar cuando la regulación lo exija
|
|
34
|
+
profiles: [] # Ejemplo: [hono-drizzle] si usás Hono + Drizzle
|
|
35
|
+
|
|
36
|
+
sprint:
|
|
37
|
+
current: 1
|
|
38
|
+
# En modo startup no se definen fases formales.
|
|
39
|
+
# Agregar phases cuando el proyecto tenga >1 persona o >2 sprints planificados.
|
|
40
|
+
|
|
41
|
+
skills:
|
|
42
|
+
active:
|
|
43
|
+
- new-feature
|
|
44
|
+
# - security-audit # Descomenta antes de ir a producción
|
|
45
|
+
# - db-migrate # Activar si stack.database está configurado
|
|
46
|
+
|
|
47
|
+
deploy:
|
|
48
|
+
provider: null
|
|
49
|
+
branch: "main"
|
|
50
|
+
|
|
51
|
+
# SDD (Spec-Driven Development) es OPCIONAL en modo startup.
|
|
52
|
+
# Se recomienda igual para features que toquen la DB o auth.
|
|
53
|
+
# Para habilitarlo, crear docs/specs/ y referenciar specs en sprint.phases[].specs.
|
|
54
|
+
|
|
55
|
+
compliance:
|
|
56
|
+
frameworks: []
|
|
57
|
+
pii_handling: false
|
|
58
|
+
audit_logs: false
|
|
59
|
+
|
|
60
|
+
paths:
|
|
61
|
+
specs: "docs/specs"
|
|
62
|
+
progress: "docs/progress.html"
|
|
63
|
+
migrations: null
|
|
64
|
+
tests: null
|
|
65
|
+
|
|
66
|
+
integrations:
|
|
67
|
+
obsidian:
|
|
68
|
+
vault_path: null
|
|
69
|
+
map:
|
|
70
|
+
api: null
|
|
71
|
+
database: null
|
|
72
|
+
frontend: null
|
|
73
|
+
deploy: null
|
|
74
|
+
decisions: null
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# project.yaml — Fuente de verdad del proyecto para forge
|
|
2
|
+
# Renombrar a project.yaml en la raíz del repositorio del proyecto
|
|
3
|
+
|
|
4
|
+
# Runtimes habilitados — forge-generate-all.py regenera configs para cada uno.
|
|
5
|
+
# Si se omite esta sección, se auto-detecta por archivos presentes en el proyecto:
|
|
6
|
+
# .claude/ → claude-code | .opencode/ → opencode | .kiro/ → kiro | AGENTS.md → codex
|
|
7
|
+
runtimes:
|
|
8
|
+
active:
|
|
9
|
+
- claude-code # siempre incluido — genera CLAUDE.md
|
|
10
|
+
# - opencode # genera AGENTS.md para OpenCode (comandos seriales, sin teams paralelos)
|
|
11
|
+
# - codex # genera AGENTS.md para Codex CLI (incluye SDD workflow + autonomy limits)
|
|
12
|
+
# - kiro # genera .kiro/steering/ (steering docs + 1 hook, sin slash commands)
|
|
13
|
+
|
|
14
|
+
project:
|
|
15
|
+
name: "Mi Proyecto"
|
|
16
|
+
slug: "mi-proyecto" # lowercase, sin espacios (usado en rutas)
|
|
17
|
+
description: "Descripción breve del proyecto"
|
|
18
|
+
language: "typescript" # typescript | python | ruby | go | php | mixed
|
|
19
|
+
mode: "standard" # startup | standard | enterprise [nuevo en v2]
|
|
20
|
+
status: "active" # active | paused | maintenance | archived
|
|
21
|
+
|
|
22
|
+
team:
|
|
23
|
+
name: "Equipo Principal"
|
|
24
|
+
members:
|
|
25
|
+
- name: "Nombre Persona"
|
|
26
|
+
role: "lead" # lead | backend | frontend | fullstack | qa | design
|
|
27
|
+
email: "persona@empresa.cl"
|
|
28
|
+
|
|
29
|
+
stack:
|
|
30
|
+
backend: null # "hono" | "fastapi" | "rails" | "express" | "laravel" | null
|
|
31
|
+
frontend: null # "nextjs" | "nuxt" | "remix" | "rails-views" | null
|
|
32
|
+
database: null # "postgresql" | "mysql" | "sqlite" | null
|
|
33
|
+
orm: null # "drizzle" | "prisma" | "sqlalchemy" | "active-record" | null [nuevo en v2]
|
|
34
|
+
cache: null # "redis" | "memcached" | null
|
|
35
|
+
package_manager: null # "npm" | "pnpm" | "yarn" | "bun" | "pip" | "poetry" | null [nuevo en v2]
|
|
36
|
+
monorepo: null # "turborepo" | "nx" | "lerna" | null [nuevo en v2]
|
|
37
|
+
testing: ["vitest"] # vitest | jest | pytest | rspec | phpunit | playwright
|
|
38
|
+
|
|
39
|
+
agents:
|
|
40
|
+
# Seleccionar de core/agents/ los agentes activos para este proyecto
|
|
41
|
+
# El orchestrator siempre está incluido
|
|
42
|
+
active:
|
|
43
|
+
- orchestrator
|
|
44
|
+
- backend-engineer
|
|
45
|
+
- frontend-engineer
|
|
46
|
+
- test-engineer
|
|
47
|
+
- docs-writer
|
|
48
|
+
# nuevo en v2: mapeo rol → modelo específico de Claude
|
|
49
|
+
by_role:
|
|
50
|
+
orchestrator: null # ej: claude-opus-4-7
|
|
51
|
+
senior-backend: null # ej: claude-sonnet-4-6
|
|
52
|
+
# Agentes de compliance (activar si aplica)
|
|
53
|
+
compliance:
|
|
54
|
+
- compliance-reviewer # GDPR, LGPD, Ley 21.719, CCPA
|
|
55
|
+
# Profiles stack-específicos (Tier 2) — reemplazan agentes genéricos con versiones especializadas
|
|
56
|
+
# Profiles disponibles: hono-drizzle | nextjs-admin | astro | expo | playwright-crawler
|
|
57
|
+
# fastapi | express | rails | nestjs | django | vuenuxt | go-gin | sveltekit
|
|
58
|
+
profiles: []
|
|
59
|
+
|
|
60
|
+
sprint:
|
|
61
|
+
current: 1
|
|
62
|
+
length_days: 14
|
|
63
|
+
phases:
|
|
64
|
+
- id: "A"
|
|
65
|
+
name: "Core"
|
|
66
|
+
specs: []
|
|
67
|
+
- id: "B"
|
|
68
|
+
name: "Features"
|
|
69
|
+
specs: []
|
|
70
|
+
|
|
71
|
+
skills:
|
|
72
|
+
# Skills universales — activos por defecto si el stack aplica
|
|
73
|
+
active:
|
|
74
|
+
- security-audit # siempre recomendado si hay endpoints de API
|
|
75
|
+
- db-migrate # activar si stack.database está configurado
|
|
76
|
+
- local2prod # activar si hay deploy automatizado
|
|
77
|
+
- new-feature # orquestador de implementación
|
|
78
|
+
# - browser-test # descomenta si tienes agent-browser instalado (npm i -g agent-browser)
|
|
79
|
+
# Wiki — knowledge base del proyecto (instala /wiki-ingest, /wiki-query, /wiki-lint)
|
|
80
|
+
# - wiki-ingest
|
|
81
|
+
# - wiki-query
|
|
82
|
+
# - wiki-lint
|
|
83
|
+
# Integraciones opcionales — requieren herramienta externa
|
|
84
|
+
integrations: [] # "obsidian-sync" si usas Obsidian + Local REST API
|
|
85
|
+
|
|
86
|
+
# Wiki — solo si wiki-ingest/wiki-query/wiki-lint están activos
|
|
87
|
+
# wiki:
|
|
88
|
+
# path: "docs/wiki" # default — donde vive el wiki del proyecto
|
|
89
|
+
|
|
90
|
+
deploy:
|
|
91
|
+
provider: null # "vercel" | "railway" | "fly" | "aws" | "github-actions" | "custom"
|
|
92
|
+
branch: "main" # branch que trigerea el deploy
|
|
93
|
+
project_id: null # ID del proyecto en la plataforma (ej: prj_xxx en Vercel) [nuevo en v2]
|
|
94
|
+
production_url: null # https://mi-proyecto.vercel.app [nuevo en v2]
|
|
95
|
+
# Para Vercel:
|
|
96
|
+
# team_id: "team_..."
|
|
97
|
+
# Para Fly.io:
|
|
98
|
+
# app_name: "mi-app"
|
|
99
|
+
# Para custom:
|
|
100
|
+
# check_command: "kubectl rollout status deploy/mi-app"
|
|
101
|
+
smoke_tests: [] # Tests de humo post-deploy [nuevo en v2]
|
|
102
|
+
# Ejemplo de smoke tests:
|
|
103
|
+
# smoke_tests:
|
|
104
|
+
# - url: /api/health
|
|
105
|
+
# expect_status: 200
|
|
106
|
+
# expect_json:
|
|
107
|
+
# status: ok
|
|
108
|
+
# - url: https://mi-proyecto.vercel.app
|
|
109
|
+
# expect_status: 200
|
|
110
|
+
|
|
111
|
+
compliance:
|
|
112
|
+
frameworks: [] # gdpr | lgpd | ley-21719 | ccpa
|
|
113
|
+
pii_handling: false # true si el proyecto maneja PII
|
|
114
|
+
audit_logs: false # true si requiere logs inmutables
|
|
115
|
+
|
|
116
|
+
# Paths del proyecto (relativos a la raíz del repo)
|
|
117
|
+
paths:
|
|
118
|
+
specs: "docs/specs"
|
|
119
|
+
progress: "docs/progress.html"
|
|
120
|
+
migrations: null # "packages/api/migrations" | "db/migrate" | null
|
|
121
|
+
tests: null # "tests/" | "__tests__/" | null
|
|
122
|
+
|
|
123
|
+
# Paths de scope por agente — se inyectan en el frontmatter de cada agente al hacer forge-init
|
|
124
|
+
# Permite que Claude Code sepa exactamente qué directorio le corresponde a cada agente
|
|
125
|
+
agent_paths:
|
|
126
|
+
api: null # "src/api" | "packages/api" | "app/Http" | null
|
|
127
|
+
frontend: null # "src/app" | "packages/web" | "resources/js" | null
|
|
128
|
+
admin: null # "packages/admin" | "src/admin" | null
|
|
129
|
+
mobile: null # "apps/mobile" | null
|
|
130
|
+
scanner: null # "packages/scanner" | "src/crawlers" | null
|
|
131
|
+
|
|
132
|
+
# Integraciones (solo configurar si están activas en skills.integrations)
|
|
133
|
+
integrations:
|
|
134
|
+
obsidian:
|
|
135
|
+
vault_path: null # "docs/mi-vault" — relativo a la raíz del repo
|
|
136
|
+
# El token va en .env.local como OBSIDIAN_TOKEN (nunca en este archivo)
|
|
137
|
+
map: # área → nota del vault a actualizar
|
|
138
|
+
api: null # "03-api/endpoints.md"
|
|
139
|
+
database: null # "02-base-de-datos/migraciones.md"
|
|
140
|
+
frontend: null # "01-arquitectura/componentes.md"
|
|
141
|
+
deploy: null # "06-deploy/ci-cd.md"
|
|
142
|
+
decisions: null # "08-decisiones/log-decisiones.md"
|
|
143
|
+
|
|
144
|
+
# ---------------------------------------------------------------------------
|
|
145
|
+
# Secciones nuevas en v2
|
|
146
|
+
# ---------------------------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
mcp: # [nuevo en v2] Servidores MCP del proyecto
|
|
149
|
+
servers: []
|
|
150
|
+
# Ejemplo:
|
|
151
|
+
# servers:
|
|
152
|
+
# - name: supabase
|
|
153
|
+
# auto_approve:
|
|
154
|
+
# - list_tables
|
|
155
|
+
# - execute_sql
|
|
156
|
+
# - name: github
|
|
157
|
+
# auto_approve:
|
|
158
|
+
# - list_issues
|
|
159
|
+
|
|
160
|
+
github: # [nuevo en v2] Integración con GitHub Projects
|
|
161
|
+
project:
|
|
162
|
+
number: null # Número del GitHub Project (entero)
|
|
163
|
+
owner: null # usuario u organización (ej: "mi-org")
|
|
164
|
+
repo: null # nombre del repositorio (ej: "mi-proyecto")
|
|
165
|
+
status_field_id: null # ID del campo Status en el GitHub Project
|
|
166
|
+
status_in_progress: null # Valor para tareas en progreso (ej: "In Progress")
|
|
167
|
+
status_done: null # Valor para tareas completadas (ej: "Done")
|
|
168
|
+
|
|
169
|
+
rules: # [nuevo en v2] Guardrails y reglas de desarrollo
|
|
170
|
+
forbidden_in_production:
|
|
171
|
+
- "console.log" # no dejar logs de debug
|
|
172
|
+
- "TODO:" # no dejar TODOs sin resolver
|
|
173
|
+
- "FIXME:"
|
|
174
|
+
required_review_before_ship: false # true → requiere revisión humana antes de ship
|
|
175
|
+
require_spec_before_implementation: false # true → requiere spec aprobada
|
|
176
|
+
conventional_commits: true # enforza Conventional Commits
|
|
177
|
+
forbidden_patterns: [] # regex evaluadas por el hook pre-edit-check
|
|
178
|
+
# Ejemplo de forbidden_patterns:
|
|
179
|
+
# forbidden_patterns:
|
|
180
|
+
# - "process\\.env\\.[A-Z_]+\\s*=\\s*['\"][^'\"]+['\"]" # hardcoded env values
|
|
181
|
+
# - "eval\\(" # uso de eval prohibido
|
|
182
|
+
|
|
183
|
+
scripts: # [nuevo en v2] Comandos de verificación post-turno
|
|
184
|
+
check: null # ej: "pnpm typecheck && pnpm lint"
|
|
185
|
+
# Ejecutado por post-turn-check.sh si está configurado
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Nombre del Concepto
|
|
3
|
+
tags: []
|
|
4
|
+
sources: []
|
|
5
|
+
updated: YYYY-MM-DD
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Nombre del Concepto
|
|
9
|
+
|
|
10
|
+
Definición en 1-2 oraciones.
|
|
11
|
+
|
|
12
|
+
## Detalles
|
|
13
|
+
|
|
14
|
+
Desarrollo. Cross-referencias con [[concepts/otro]] o [[entities/entidad]].
|
|
15
|
+
|
|
16
|
+
## En este proyecto
|
|
17
|
+
|
|
18
|
+
Cómo aplica al proyecto actual.
|
|
19
|
+
|
|
20
|
+
## Fuentes
|
|
21
|
+
|
|
22
|
+
- [[sources/fuente]] — contexto
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Nombre de la Entidad
|
|
3
|
+
type: project | person | company | framework | api
|
|
4
|
+
tags: []
|
|
5
|
+
sources: []
|
|
6
|
+
updated: YYYY-MM-DD
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Nombre de la Entidad
|
|
10
|
+
|
|
11
|
+
Descripción en 1-2 oraciones.
|
|
12
|
+
|
|
13
|
+
## Relevancia para el proyecto
|
|
14
|
+
|
|
15
|
+
Por qué importa.
|
|
16
|
+
|
|
17
|
+
## Fuentes
|
|
18
|
+
|
|
19
|
+
- [[sources/fuente]] — contexto
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Wiki — Índice
|
|
2
|
+
|
|
3
|
+
> Catálogo de páginas. Actualizado automáticamente en cada `/wiki-ingest`.
|
|
4
|
+
> Para agregar conocimiento: `/wiki-ingest <url | archivo | texto>`
|
|
5
|
+
|
|
6
|
+
## Conceptos
|
|
7
|
+
|
|
8
|
+
| Página | Descripción |
|
|
9
|
+
|--------|-------------|
|
|
10
|
+
| _(vacío — ingestar fuentes para poblar)_ | |
|
|
11
|
+
|
|
12
|
+
## Entidades
|
|
13
|
+
|
|
14
|
+
| Página | Descripción |
|
|
15
|
+
|--------|-------------|
|
|
16
|
+
| _(vacío)_ | |
|
|
17
|
+
|
|
18
|
+
## Fuentes
|
|
19
|
+
|
|
20
|
+
| Página | Descripción |
|
|
21
|
+
|--------|-------------|
|
|
22
|
+
| _(vacío)_ | |
|
|
23
|
+
|
|
24
|
+
## Síntesis
|
|
25
|
+
|
|
26
|
+
| Página | Descripción |
|
|
27
|
+
|--------|-------------|
|
|
28
|
+
| _(vacío)_ | |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
*Última actualización: —*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Título de la Fuente
|
|
3
|
+
source: <url o path>
|
|
4
|
+
ingested: YYYY-MM-DD
|
|
5
|
+
tags: []
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Título de la Fuente
|
|
9
|
+
|
|
10
|
+
## Resumen
|
|
11
|
+
|
|
12
|
+
2-3 párrafos con los puntos más importantes.
|
|
13
|
+
|
|
14
|
+
## Hechos clave
|
|
15
|
+
|
|
16
|
+
- Hecho 1
|
|
17
|
+
- Hecho 2
|
|
18
|
+
|
|
19
|
+
## Conceptos mencionados
|
|
20
|
+
|
|
21
|
+
- [[concepts/nombre]] — contexto breve
|
|
22
|
+
|
|
23
|
+
## Entidades mencionadas
|
|
24
|
+
|
|
25
|
+
- [[entities/nombre]] — rol en la fuente
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { init } from './commands/init.js';
|
|
3
|
+
import { audit } from './commands/audit.js';
|
|
4
|
+
import { generate } from './commands/generate.js';
|
|
5
|
+
import { validate } from './commands/validate.js';
|
|
6
|
+
import { doctor } from './commands/doctor.js';
|
|
7
|
+
const VERSION = '2.1.0';
|
|
8
|
+
const HELP = `forge v${VERSION} — Agentic development framework
|
|
9
|
+
|
|
10
|
+
Usage: forge <command> [options]
|
|
11
|
+
|
|
12
|
+
Commands:
|
|
13
|
+
init Initialize forge in a project (wizard + generates agent files)
|
|
14
|
+
audit Audit project against the forge standard
|
|
15
|
+
generate Generate runtime config files from project.yaml
|
|
16
|
+
validate Validate project.yaml schema (exit 1 on error, CI-safe)
|
|
17
|
+
doctor Check environment: Python, pyyaml, forge root, project.yaml
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
-v, --version Show version
|
|
21
|
+
-h, --help Show this help
|
|
22
|
+
|
|
23
|
+
Run forge <command> --help for command-specific options.
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
npx @cristiancorreau/forge init
|
|
27
|
+
npx @cristiancorreau/forge audit --json
|
|
28
|
+
npx @cristiancorreau/forge generate --runtime claude-code
|
|
29
|
+
npx @cristiancorreau/forge validate
|
|
30
|
+
npx @cristiancorreau/forge doctor
|
|
31
|
+
`;
|
|
32
|
+
const [, , cmd, ...rest] = process.argv;
|
|
33
|
+
let exitCode = 0;
|
|
34
|
+
switch (cmd) {
|
|
35
|
+
case 'init':
|
|
36
|
+
exitCode = await init(rest);
|
|
37
|
+
break;
|
|
38
|
+
case 'audit':
|
|
39
|
+
exitCode = await audit(rest);
|
|
40
|
+
break;
|
|
41
|
+
case 'generate':
|
|
42
|
+
exitCode = await generate(rest);
|
|
43
|
+
break;
|
|
44
|
+
case 'validate':
|
|
45
|
+
exitCode = await validate(rest);
|
|
46
|
+
break;
|
|
47
|
+
case 'doctor':
|
|
48
|
+
exitCode = await doctor(rest);
|
|
49
|
+
break;
|
|
50
|
+
case '-v':
|
|
51
|
+
case '--version':
|
|
52
|
+
console.log(VERSION);
|
|
53
|
+
break;
|
|
54
|
+
case undefined:
|
|
55
|
+
case '-h':
|
|
56
|
+
case '--help':
|
|
57
|
+
process.stdout.write(HELP);
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
console.error(`Unknown command: ${cmd}\nRun forge --help for usage.\n`);
|
|
61
|
+
exitCode = 1;
|
|
62
|
+
}
|
|
63
|
+
process.exit(exitCode);
|
|
64
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG,UAAU,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuB7B,CAAC;AAEF,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAExC,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,QAAQ,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM;QACT,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM;IACR,KAAK,OAAO;QACV,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM;IACR,KAAK,UAAU;QACb,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM;IACR,KAAK,UAAU;QACb,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM;IACR,KAAK,QAAQ;QACX,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM;IACR,KAAK,IAAI,CAAC;IACV,KAAK,WAAW;QACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM;IACR,KAAK,SAAS,CAAC;IACf,KAAK,IAAI,CAAC;IACV,KAAK,QAAQ;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM;IACR;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,iCAAiC,CAAC,CAAC;QACxE,QAAQ,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAcA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { resolveScript } from '../lib/paths.js';
|
|
2
|
+
import { runPython } from '../lib/python.js';
|
|
3
|
+
const HELP = `Usage: forge audit [options]
|
|
4
|
+
|
|
5
|
+
Audit a project against the forge standard. Detects missing agents,
|
|
6
|
+
outdated profiles, incomplete hooks, and available opportunities.
|
|
7
|
+
|
|
8
|
+
Options:
|
|
9
|
+
--json Output results as JSON (suitable for CI)
|
|
10
|
+
--only <id,...> Audit only specific agents or profiles
|
|
11
|
+
-h, --help Show this help
|
|
12
|
+
`;
|
|
13
|
+
export async function audit(args) {
|
|
14
|
+
if (args.includes('-h') || args.includes('--help')) {
|
|
15
|
+
process.stdout.write(HELP);
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
const script = resolveScript('forge-audit.py');
|
|
19
|
+
return runPython(script, args);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG;;;;;;;;;CASZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwD7D"}
|