@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.
Files changed (153) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +191 -0
  3. package/README.md +156 -0
  4. package/assets/adapters/claude-code/commands/deploy-check.md +12 -0
  5. package/assets/adapters/claude-code/commands/new-feature.md +11 -0
  6. package/assets/adapters/claude-code/commands/plan.md +116 -0
  7. package/assets/adapters/claude-code/commands/review.md +219 -0
  8. package/assets/adapters/claude-code/commands/session-close.md +109 -0
  9. package/assets/adapters/claude-code/commands/session-start.md +59 -0
  10. package/assets/adapters/claude-code/commands/ship.md +133 -0
  11. package/assets/adapters/claude-code/commands/wiki-ingest.md +7 -0
  12. package/assets/adapters/claude-code/commands/wiki-lint.md +5 -0
  13. package/assets/adapters/claude-code/commands/wiki-query.md +7 -0
  14. package/assets/adapters/claude-code/commands/work.md +101 -0
  15. package/assets/adapters/claude-code/generate-claude-md.py +304 -0
  16. package/assets/adapters/codex/commands/plan.md +63 -0
  17. package/assets/adapters/codex/commands/review.md +53 -0
  18. package/assets/adapters/codex/commands/session-close.md +53 -0
  19. package/assets/adapters/codex/commands/session-start.md +49 -0
  20. package/assets/adapters/codex/commands/ship.md +53 -0
  21. package/assets/adapters/codex/commands/work.md +53 -0
  22. package/assets/adapters/codex/generate-codex-config.py +269 -0
  23. package/assets/adapters/codex/hooks/codex.yaml.tpl +43 -0
  24. package/assets/adapters/codex/hooks/forge-codex-finish.sh +158 -0
  25. package/assets/adapters/codex/hooks/forge-codex-start.sh +186 -0
  26. package/assets/adapters/kiro/generate-steering.py +367 -0
  27. package/assets/adapters/opencode/HOOKS.md +123 -0
  28. package/assets/adapters/opencode/commands/plan.md +119 -0
  29. package/assets/adapters/opencode/commands/review.md +164 -0
  30. package/assets/adapters/opencode/commands/session-close.md +111 -0
  31. package/assets/adapters/opencode/commands/session-start.md +62 -0
  32. package/assets/adapters/opencode/commands/ship.md +135 -0
  33. package/assets/adapters/opencode/commands/work.md +82 -0
  34. package/assets/adapters/opencode/generate-agents-md.py +262 -0
  35. package/assets/core/agents/backend-engineer.md +61 -0
  36. package/assets/core/agents/compliance-reviewer.md +83 -0
  37. package/assets/core/agents/docs-writer.md +77 -0
  38. package/assets/core/agents/frontend-engineer.md +70 -0
  39. package/assets/core/agents/orchestrator.md +104 -0
  40. package/assets/core/agents/security-auditor.md +54 -0
  41. package/assets/core/agents/test-engineer.md +57 -0
  42. package/assets/core/hooks/hooks-registry.yaml +48 -0
  43. package/assets/core/hooks/post-turn-check.sh +139 -0
  44. package/assets/core/hooks/pre-bash-check.py +202 -0
  45. package/assets/core/hooks/pre-edit-check.py +317 -0
  46. package/assets/core/hooks/session-start.sh +184 -0
  47. package/assets/core/schemas/project.schema.json +503 -0
  48. package/assets/core/skills/README.md +88 -0
  49. package/assets/core/skills/aitmpl-search/SKILL.md +74 -0
  50. package/assets/core/skills/browser-test/SKILL.md +177 -0
  51. package/assets/core/skills/db-migrate/SKILL.md +163 -0
  52. package/assets/core/skills/local2prod/SKILL.md +147 -0
  53. package/assets/core/skills/new-feature/SKILL.md +155 -0
  54. package/assets/core/skills/obsidian-sync/SKILL.md +152 -0
  55. package/assets/core/skills/phase-kickoff/SKILL.md +69 -0
  56. package/assets/core/skills/security-audit/SKILL.md +125 -0
  57. package/assets/core/skills/spec/SKILL.md +72 -0
  58. package/assets/core/skills/wiki-ingest/SKILL.md +183 -0
  59. package/assets/core/skills/wiki-lint/SKILL.md +109 -0
  60. package/assets/core/skills/wiki-query/SKILL.md +100 -0
  61. package/assets/core/templates/claude-md/architecture.rules +20 -0
  62. package/assets/core/templates/claude-md/global.md +30 -0
  63. package/assets/core/templates/claude-md/project.md +36 -0
  64. package/assets/core/templates/daily-note.md +38 -0
  65. package/assets/core/templates/spec-template.md +43 -0
  66. package/assets/core/workflows/sdd.md +69 -0
  67. package/assets/core/workflows/sprint.md +59 -0
  68. package/assets/forge.py +1265 -0
  69. package/assets/hooks/pre-commit +43 -0
  70. package/assets/manifest.json +274 -0
  71. package/assets/profiles/astro/README.md +24 -0
  72. package/assets/profiles/astro/agents/frontend-engineer.md +74 -0
  73. package/assets/profiles/django/agents/api-engineer.md +83 -0
  74. package/assets/profiles/expo/README.md +24 -0
  75. package/assets/profiles/expo/agents/mobile-engineer.md +69 -0
  76. package/assets/profiles/express/agents/api-engineer.md +60 -0
  77. package/assets/profiles/fastapi/README.md +32 -0
  78. package/assets/profiles/fastapi/agents/api-engineer.md +87 -0
  79. package/assets/profiles/go-gin/agents/api-engineer.md +98 -0
  80. package/assets/profiles/hono-drizzle/README.md +31 -0
  81. package/assets/profiles/hono-drizzle/agents/api-engineer.md +82 -0
  82. package/assets/profiles/laravel/README.md +32 -0
  83. package/assets/profiles/laravel/agents/api-engineer.md +114 -0
  84. package/assets/profiles/laravel/agents/fullstack-engineer.md +67 -0
  85. package/assets/profiles/laravel/agents/migration-specialist.md +420 -0
  86. package/assets/profiles/nestjs/agents/api-engineer.md +79 -0
  87. package/assets/profiles/nextjs-admin/README.md +32 -0
  88. package/assets/profiles/nextjs-admin/agents/admin-engineer.md +78 -0
  89. package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +51 -0
  90. package/assets/profiles/rails/agents/fullstack-engineer.md +61 -0
  91. package/assets/profiles/sveltekit/agents/frontend-engineer.md +96 -0
  92. package/assets/profiles/vuenuxt/agents/frontend-engineer.md +82 -0
  93. package/assets/profiles/wordpress/README.md +30 -0
  94. package/assets/profiles/wordpress/agents/divi-engineer.md +273 -0
  95. package/assets/profiles/wordpress/agents/elementor-engineer.md +310 -0
  96. package/assets/profiles/wordpress/agents/wp-engineer.md +216 -0
  97. package/assets/requirements.txt +2 -0
  98. package/assets/scripts/aitmpl-search.py +808 -0
  99. package/assets/scripts/forge-add-opportunities.py +92 -0
  100. package/assets/scripts/forge-audit.py +1061 -0
  101. package/assets/scripts/forge-generate-all.py +283 -0
  102. package/assets/scripts/forge-init.py +900 -0
  103. package/assets/scripts/forge-migrate-project-yaml.py +397 -0
  104. package/assets/scripts/forge-scaffold-profile.py +181 -0
  105. package/assets/scripts/forge-teardown.py +193 -0
  106. package/assets/scripts/forge-validate-project-yaml.py +457 -0
  107. package/assets/scripts/forge-wizard.py +1003 -0
  108. package/assets/scripts/setup-codex.sh +229 -0
  109. package/assets/scripts/team-install.sh +147 -0
  110. package/assets/scripts/token-stats.py +201 -0
  111. package/assets/templates/modes/enterprise.yaml.tpl +114 -0
  112. package/assets/templates/modes/multi-runtime.yaml.tpl +89 -0
  113. package/assets/templates/modes/new-stack.yaml.tpl +101 -0
  114. package/assets/templates/modes/startup.yaml.tpl +74 -0
  115. package/assets/templates/project.yaml.tpl +185 -0
  116. package/assets/templates/wiki/concepts/_template.md +22 -0
  117. package/assets/templates/wiki/entities/_template.md +19 -0
  118. package/assets/templates/wiki/index.md +32 -0
  119. package/assets/templates/wiki/log.md +6 -0
  120. package/assets/templates/wiki/sources/_template.md +25 -0
  121. package/dist/cli.d.ts +3 -0
  122. package/dist/cli.d.ts.map +1 -0
  123. package/dist/cli.js +64 -0
  124. package/dist/cli.js.map +1 -0
  125. package/dist/commands/audit.d.ts +2 -0
  126. package/dist/commands/audit.d.ts.map +1 -0
  127. package/dist/commands/audit.js +21 -0
  128. package/dist/commands/audit.js.map +1 -0
  129. package/dist/commands/doctor.d.ts +2 -0
  130. package/dist/commands/doctor.d.ts.map +1 -0
  131. package/dist/commands/doctor.js +58 -0
  132. package/dist/commands/doctor.js.map +1 -0
  133. package/dist/commands/generate.d.ts +2 -0
  134. package/dist/commands/generate.d.ts.map +1 -0
  135. package/dist/commands/generate.js +27 -0
  136. package/dist/commands/generate.js.map +1 -0
  137. package/dist/commands/init.d.ts +2 -0
  138. package/dist/commands/init.d.ts.map +1 -0
  139. package/dist/commands/init.js +22 -0
  140. package/dist/commands/init.js.map +1 -0
  141. package/dist/commands/validate.d.ts +2 -0
  142. package/dist/commands/validate.d.ts.map +1 -0
  143. package/dist/commands/validate.js +20 -0
  144. package/dist/commands/validate.js.map +1 -0
  145. package/dist/lib/paths.d.ts +10 -0
  146. package/dist/lib/paths.d.ts.map +1 -0
  147. package/dist/lib/paths.js +49 -0
  148. package/dist/lib/paths.js.map +1 -0
  149. package/dist/lib/python.d.ts +4 -0
  150. package/dist/lib/python.d.ts.map +1 -0
  151. package/dist/lib/python.js +46 -0
  152. package/dist/lib/python.js.map +1 -0
  153. 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,6 @@
1
+ # Wiki — Log de operaciones
2
+
3
+ > Append-only. NUNCA editar ni borrar entradas anteriores.
4
+ > Formato: `## [YYYY-MM-DD] <operación> | <título>`
5
+
6
+ <!-- Las entradas se agregan aquí arriba, las más recientes primero -->
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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,2 @@
1
+ export declare function audit(args: string[]): Promise<number>;
2
+ //# sourceMappingURL=audit.d.ts.map
@@ -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,2 @@
1
+ export declare function doctor(_args: string[]): Promise<number>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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"}