@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,503 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Forge project.yaml v2",
|
|
4
|
+
"description": "Schema de validación para project.yaml v2 del framework Forge",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [],
|
|
8
|
+
"properties": {
|
|
9
|
+
"project": {
|
|
10
|
+
"description": "Metadatos principales del proyecto",
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"required": ["name", "mode"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"name": {
|
|
16
|
+
"description": "Nombre legible del proyecto",
|
|
17
|
+
"type": "string",
|
|
18
|
+
"minLength": 1
|
|
19
|
+
},
|
|
20
|
+
"slug": {
|
|
21
|
+
"description": "Identificador único en lowercase sin espacios, usado en rutas y nombres de recursos",
|
|
22
|
+
"type": ["string", "null"],
|
|
23
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
24
|
+
},
|
|
25
|
+
"description": {
|
|
26
|
+
"description": "Descripción breve del propósito del proyecto",
|
|
27
|
+
"type": ["string", "null"]
|
|
28
|
+
},
|
|
29
|
+
"language": {
|
|
30
|
+
"description": "Lenguaje principal del proyecto",
|
|
31
|
+
"type": ["string", "null"],
|
|
32
|
+
"enum": ["typescript", "python", "ruby", "go", "php", "mixed", null]
|
|
33
|
+
},
|
|
34
|
+
"mode": {
|
|
35
|
+
"description": "Modo operativo del proyecto: startup (velocidad), standard (balance), enterprise (compliance)",
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": ["startup", "standard", "enterprise"]
|
|
38
|
+
},
|
|
39
|
+
"status": {
|
|
40
|
+
"description": "Estado actual del proyecto",
|
|
41
|
+
"type": ["string", "null"],
|
|
42
|
+
"enum": ["active", "paused", "maintenance", "archived", null]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"team": {
|
|
47
|
+
"description": "Equipo del proyecto",
|
|
48
|
+
"type": ["object", "null"],
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"properties": {
|
|
51
|
+
"name": {
|
|
52
|
+
"description": "Nombre del equipo",
|
|
53
|
+
"type": ["string", "null"]
|
|
54
|
+
},
|
|
55
|
+
"members": {
|
|
56
|
+
"description": "Lista de miembros del equipo",
|
|
57
|
+
"type": ["array", "null"],
|
|
58
|
+
"items": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"additionalProperties": false,
|
|
61
|
+
"properties": {
|
|
62
|
+
"name": { "type": "string" },
|
|
63
|
+
"role": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"enum": ["lead", "backend", "frontend", "fullstack", "qa", "design"]
|
|
66
|
+
},
|
|
67
|
+
"email": { "type": ["string", "null"], "format": "email" }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"stack": {
|
|
74
|
+
"description": "Stack tecnológico del proyecto",
|
|
75
|
+
"type": ["object", "null"],
|
|
76
|
+
"additionalProperties": false,
|
|
77
|
+
"properties": {
|
|
78
|
+
"backend": {
|
|
79
|
+
"description": "Framework o runtime del backend",
|
|
80
|
+
"type": ["string", "null"],
|
|
81
|
+
"enum": ["hono", "fastapi", "rails", "express", "laravel", "nestjs", "django", "go-gin", null]
|
|
82
|
+
},
|
|
83
|
+
"frontend": {
|
|
84
|
+
"description": "Framework del frontend",
|
|
85
|
+
"type": ["string", "null"],
|
|
86
|
+
"enum": ["nextjs", "nuxt", "remix", "rails-views", "astro", "sveltekit", null]
|
|
87
|
+
},
|
|
88
|
+
"database": {
|
|
89
|
+
"description": "Motor de base de datos principal",
|
|
90
|
+
"type": ["string", "null"],
|
|
91
|
+
"enum": ["postgresql", "mysql", "sqlite", null]
|
|
92
|
+
},
|
|
93
|
+
"orm": {
|
|
94
|
+
"description": "ORM o query builder utilizado (nuevo en v2)",
|
|
95
|
+
"type": ["string", "null"],
|
|
96
|
+
"enum": ["drizzle", "prisma", "sequelize", "typeorm", "sqlalchemy", "active-record", null]
|
|
97
|
+
},
|
|
98
|
+
"cache": {
|
|
99
|
+
"description": "Sistema de caché",
|
|
100
|
+
"type": ["string", "null"],
|
|
101
|
+
"enum": ["redis", "memcached", null]
|
|
102
|
+
},
|
|
103
|
+
"package_manager": {
|
|
104
|
+
"description": "Gestor de paquetes del proyecto (nuevo en v2)",
|
|
105
|
+
"type": ["string", "null"],
|
|
106
|
+
"enum": ["npm", "pnpm", "yarn", "bun", "pip", "poetry", "bundler", null]
|
|
107
|
+
},
|
|
108
|
+
"monorepo": {
|
|
109
|
+
"description": "Herramienta de monorepo si aplica (nuevo en v2)",
|
|
110
|
+
"type": ["string", "null"],
|
|
111
|
+
"enum": ["turborepo", "nx", "lerna", null]
|
|
112
|
+
},
|
|
113
|
+
"testing": {
|
|
114
|
+
"description": "Frameworks de testing activos",
|
|
115
|
+
"type": ["array", "null"],
|
|
116
|
+
"items": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"enum": ["vitest", "jest", "pytest", "rspec", "phpunit", "playwright", "cypress"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"runtimes": {
|
|
124
|
+
"description": "Runtimes de IA habilitados. Si se omite, forge-generate-all.py auto-detecta por archivos presentes.",
|
|
125
|
+
"type": "object",
|
|
126
|
+
"additionalProperties": false,
|
|
127
|
+
"properties": {
|
|
128
|
+
"active": {
|
|
129
|
+
"description": "Lista de runtimes a generar. Tiene prioridad sobre la auto-detección.",
|
|
130
|
+
"type": "array",
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"enum": ["claude-code", "opencode", "codex", "kiro"]
|
|
134
|
+
},
|
|
135
|
+
"uniqueItems": true,
|
|
136
|
+
"minItems": 1
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"agents": {
|
|
141
|
+
"description": "Configuración de agentes activos para este proyecto",
|
|
142
|
+
"type": ["object", "null"],
|
|
143
|
+
"additionalProperties": false,
|
|
144
|
+
"properties": {
|
|
145
|
+
"active": {
|
|
146
|
+
"description": "Lista de nombres de agentes activos (de core/agents/)",
|
|
147
|
+
"type": ["array", "null"],
|
|
148
|
+
"items": { "type": "string" }
|
|
149
|
+
},
|
|
150
|
+
"by_role": {
|
|
151
|
+
"description": "Mapeo de rol a modelo específico (nuevo en v2)",
|
|
152
|
+
"type": ["object", "null"],
|
|
153
|
+
"additionalProperties": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Nombre del modelo Claude a usar para este rol (ej: claude-opus-4-7)"
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"compliance": {
|
|
159
|
+
"description": "Agentes de compliance opcionales",
|
|
160
|
+
"type": ["array", "null"],
|
|
161
|
+
"items": { "type": "string" }
|
|
162
|
+
},
|
|
163
|
+
"profiles": {
|
|
164
|
+
"description": "Profiles stack-específicos (Tier 2) que reemplazan agentes genéricos",
|
|
165
|
+
"type": ["array", "null"],
|
|
166
|
+
"items": {
|
|
167
|
+
"type": "string",
|
|
168
|
+
"enum": [
|
|
169
|
+
"hono-drizzle", "nextjs-admin", "astro", "expo", "playwright-crawler",
|
|
170
|
+
"fastapi", "express", "rails", "nestjs", "django", "vuenuxt",
|
|
171
|
+
"go-gin", "sveltekit"
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"sprint": {
|
|
178
|
+
"description": "Configuración del sprint actual",
|
|
179
|
+
"type": ["object", "null"],
|
|
180
|
+
"additionalProperties": false,
|
|
181
|
+
"properties": {
|
|
182
|
+
"current": {
|
|
183
|
+
"description": "Número del sprint actual",
|
|
184
|
+
"type": ["integer", "null"],
|
|
185
|
+
"minimum": 1
|
|
186
|
+
},
|
|
187
|
+
"length_days": {
|
|
188
|
+
"description": "Duración del sprint en días",
|
|
189
|
+
"type": ["integer", "null"],
|
|
190
|
+
"minimum": 1
|
|
191
|
+
},
|
|
192
|
+
"phases": {
|
|
193
|
+
"description": "Fases del sprint con sus specs",
|
|
194
|
+
"type": ["array", "null"],
|
|
195
|
+
"items": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"additionalProperties": false,
|
|
198
|
+
"properties": {
|
|
199
|
+
"id": { "type": "string" },
|
|
200
|
+
"name": { "type": "string" },
|
|
201
|
+
"specs": {
|
|
202
|
+
"type": ["array", "null"],
|
|
203
|
+
"items": { "type": "string" }
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"skills": {
|
|
211
|
+
"description": "Skills de Forge activos para el proyecto",
|
|
212
|
+
"type": ["object", "null"],
|
|
213
|
+
"additionalProperties": false,
|
|
214
|
+
"properties": {
|
|
215
|
+
"active": {
|
|
216
|
+
"description": "Lista de skills activos (de core/skills/)",
|
|
217
|
+
"type": ["array", "null"],
|
|
218
|
+
"items": { "type": "string" }
|
|
219
|
+
},
|
|
220
|
+
"integrations": {
|
|
221
|
+
"description": "Integraciones opcionales que requieren herramienta externa",
|
|
222
|
+
"type": ["array", "null"],
|
|
223
|
+
"items": { "type": "string" }
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"wiki": {
|
|
228
|
+
"description": "Configuración del wiki del proyecto (solo si wiki-ingest/wiki-query están activos)",
|
|
229
|
+
"type": ["object", "null"],
|
|
230
|
+
"additionalProperties": false,
|
|
231
|
+
"properties": {
|
|
232
|
+
"path": {
|
|
233
|
+
"description": "Ruta al wiki del proyecto, relativa a la raíz del repo",
|
|
234
|
+
"type": ["string", "null"]
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"deploy": {
|
|
239
|
+
"description": "Configuración de deploy y smoke tests (nuevo en v2)",
|
|
240
|
+
"type": ["object", "null"],
|
|
241
|
+
"additionalProperties": false,
|
|
242
|
+
"properties": {
|
|
243
|
+
"provider": {
|
|
244
|
+
"description": "Plataforma de deploy",
|
|
245
|
+
"type": ["string", "null"],
|
|
246
|
+
"enum": ["vercel", "railway", "fly", "aws", "github-actions", "custom", null]
|
|
247
|
+
},
|
|
248
|
+
"branch": {
|
|
249
|
+
"description": "Branch que trigerea el deploy automático",
|
|
250
|
+
"type": ["string", "null"]
|
|
251
|
+
},
|
|
252
|
+
"project_id": {
|
|
253
|
+
"description": "ID del proyecto en la plataforma de deploy (ej: prj_xxx en Vercel)",
|
|
254
|
+
"type": ["string", "null"]
|
|
255
|
+
},
|
|
256
|
+
"production_url": {
|
|
257
|
+
"description": "URL de producción del proyecto",
|
|
258
|
+
"type": ["string", "null"],
|
|
259
|
+
"format": "uri"
|
|
260
|
+
},
|
|
261
|
+
"team_id": {
|
|
262
|
+
"description": "ID del equipo en Vercel (ej: team_xxx)",
|
|
263
|
+
"type": ["string", "null"]
|
|
264
|
+
},
|
|
265
|
+
"app_name": {
|
|
266
|
+
"description": "Nombre de la app en Fly.io",
|
|
267
|
+
"type": ["string", "null"]
|
|
268
|
+
},
|
|
269
|
+
"check_command": {
|
|
270
|
+
"description": "Comando para verificar el deploy en providers custom",
|
|
271
|
+
"type": ["string", "null"]
|
|
272
|
+
},
|
|
273
|
+
"smoke_tests": {
|
|
274
|
+
"description": "Tests de humo a ejecutar después del deploy",
|
|
275
|
+
"type": ["array", "null"],
|
|
276
|
+
"items": {
|
|
277
|
+
"type": "object",
|
|
278
|
+
"additionalProperties": false,
|
|
279
|
+
"required": ["url"],
|
|
280
|
+
"properties": {
|
|
281
|
+
"url": {
|
|
282
|
+
"description": "URL o ruta relativa a verificar (ej: /api/health o https://...)",
|
|
283
|
+
"type": "string"
|
|
284
|
+
},
|
|
285
|
+
"expect_status": {
|
|
286
|
+
"description": "HTTP status code esperado",
|
|
287
|
+
"type": ["integer", "null"],
|
|
288
|
+
"minimum": 100,
|
|
289
|
+
"maximum": 599
|
|
290
|
+
},
|
|
291
|
+
"expect_json": {
|
|
292
|
+
"description": "Objeto JSON que debe estar contenido en la respuesta",
|
|
293
|
+
"type": ["object", "null"]
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"mcp": {
|
|
301
|
+
"description": "Configuración de servidores MCP (Model Context Protocol) (nuevo en v2)",
|
|
302
|
+
"type": ["object", "null"],
|
|
303
|
+
"additionalProperties": false,
|
|
304
|
+
"properties": {
|
|
305
|
+
"servers": {
|
|
306
|
+
"description": "Lista de servidores MCP configurados para el proyecto",
|
|
307
|
+
"type": ["array", "null"],
|
|
308
|
+
"items": {
|
|
309
|
+
"type": "object",
|
|
310
|
+
"additionalProperties": false,
|
|
311
|
+
"required": ["name"],
|
|
312
|
+
"properties": {
|
|
313
|
+
"name": {
|
|
314
|
+
"description": "Nombre del servidor MCP",
|
|
315
|
+
"type": "string"
|
|
316
|
+
},
|
|
317
|
+
"auto_approve": {
|
|
318
|
+
"description": "Lista de nombres de tools que se auto-aprueban sin confirmación",
|
|
319
|
+
"type": ["array", "null"],
|
|
320
|
+
"items": { "type": "string" }
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
"github": {
|
|
328
|
+
"description": "Integración con GitHub Projects para tracking de tareas (nuevo en v2)",
|
|
329
|
+
"type": ["object", "null"],
|
|
330
|
+
"additionalProperties": false,
|
|
331
|
+
"properties": {
|
|
332
|
+
"project": {
|
|
333
|
+
"description": "Configuración del GitHub Project asociado",
|
|
334
|
+
"type": ["object", "null"],
|
|
335
|
+
"additionalProperties": false,
|
|
336
|
+
"properties": {
|
|
337
|
+
"number": {
|
|
338
|
+
"description": "Número del GitHub Project",
|
|
339
|
+
"type": ["integer", "null"],
|
|
340
|
+
"minimum": 1
|
|
341
|
+
},
|
|
342
|
+
"owner": {
|
|
343
|
+
"description": "Owner del repositorio (usuario u organización)",
|
|
344
|
+
"type": ["string", "null"]
|
|
345
|
+
},
|
|
346
|
+
"repo": {
|
|
347
|
+
"description": "Nombre del repositorio",
|
|
348
|
+
"type": ["string", "null"]
|
|
349
|
+
},
|
|
350
|
+
"status_field_id": {
|
|
351
|
+
"description": "ID del campo Status en el GitHub Project",
|
|
352
|
+
"type": ["string", "null"]
|
|
353
|
+
},
|
|
354
|
+
"status_in_progress": {
|
|
355
|
+
"description": "Valor del campo Status para tareas en progreso",
|
|
356
|
+
"type": ["string", "null"]
|
|
357
|
+
},
|
|
358
|
+
"status_done": {
|
|
359
|
+
"description": "Valor del campo Status para tareas completadas",
|
|
360
|
+
"type": ["string", "null"]
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"rules": {
|
|
367
|
+
"description": "Reglas de desarrollo y guardrails del proyecto (nuevo en v2)",
|
|
368
|
+
"type": ["object", "null"],
|
|
369
|
+
"additionalProperties": false,
|
|
370
|
+
"properties": {
|
|
371
|
+
"forbidden_in_production": {
|
|
372
|
+
"description": "Lista de strings o patrones que no deben estar en código de producción",
|
|
373
|
+
"type": ["array", "null"],
|
|
374
|
+
"items": { "type": "string" }
|
|
375
|
+
},
|
|
376
|
+
"required_review_before_ship": {
|
|
377
|
+
"description": "Requiere revisión humana antes de hacer ship",
|
|
378
|
+
"type": ["boolean", "null"]
|
|
379
|
+
},
|
|
380
|
+
"require_spec_before_implementation": {
|
|
381
|
+
"description": "Requiere spec aprobada antes de comenzar implementación",
|
|
382
|
+
"type": ["boolean", "null"]
|
|
383
|
+
},
|
|
384
|
+
"conventional_commits": {
|
|
385
|
+
"description": "Enforza Conventional Commits en todos los commits",
|
|
386
|
+
"type": ["boolean", "null"]
|
|
387
|
+
},
|
|
388
|
+
"forbidden_patterns": {
|
|
389
|
+
"description": "Lista de patrones regex evaluados por el hook pre-edit-check",
|
|
390
|
+
"type": ["array", "null"],
|
|
391
|
+
"items": { "type": "string" }
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
"scripts": {
|
|
396
|
+
"description": "Comandos de scripts del proyecto (nuevo en v2)",
|
|
397
|
+
"type": ["object", "null"],
|
|
398
|
+
"additionalProperties": false,
|
|
399
|
+
"properties": {
|
|
400
|
+
"check": {
|
|
401
|
+
"description": "Comando ejecutado por post-turn-check.sh para validar el proyecto",
|
|
402
|
+
"type": ["string", "null"]
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
"compliance": {
|
|
407
|
+
"description": "Configuración de compliance y regulaciones",
|
|
408
|
+
"type": ["object", "null"],
|
|
409
|
+
"additionalProperties": false,
|
|
410
|
+
"properties": {
|
|
411
|
+
"frameworks": {
|
|
412
|
+
"description": "Frameworks regulatorios aplicables al proyecto",
|
|
413
|
+
"type": ["array", "null"],
|
|
414
|
+
"items": {
|
|
415
|
+
"type": "string",
|
|
416
|
+
"enum": ["gdpr", "lgpd", "ley-21719", "ccpa"]
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
"pii_handling": {
|
|
420
|
+
"description": "El proyecto maneja Personally Identifiable Information",
|
|
421
|
+
"type": ["boolean", "null"]
|
|
422
|
+
},
|
|
423
|
+
"audit_logs": {
|
|
424
|
+
"description": "El proyecto requiere logs inmutables de auditoría",
|
|
425
|
+
"type": ["boolean", "null"]
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"paths": {
|
|
430
|
+
"description": "Paths del proyecto relativos a la raíz del repo",
|
|
431
|
+
"type": ["object", "null"],
|
|
432
|
+
"additionalProperties": false,
|
|
433
|
+
"properties": {
|
|
434
|
+
"specs": {
|
|
435
|
+
"description": "Directorio de specs del proyecto",
|
|
436
|
+
"type": ["string", "null"]
|
|
437
|
+
},
|
|
438
|
+
"progress": {
|
|
439
|
+
"description": "Archivo de progreso HTML",
|
|
440
|
+
"type": ["string", "null"]
|
|
441
|
+
},
|
|
442
|
+
"migrations": {
|
|
443
|
+
"description": "Directorio de migraciones de base de datos",
|
|
444
|
+
"type": ["string", "null"]
|
|
445
|
+
},
|
|
446
|
+
"tests": {
|
|
447
|
+
"description": "Directorio de tests",
|
|
448
|
+
"type": ["string", "null"]
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
"agent_paths": {
|
|
453
|
+
"description": "Paths de scope por agente, inyectados en el frontmatter de cada agente durante forge-init",
|
|
454
|
+
"type": ["object", "null"],
|
|
455
|
+
"additionalProperties": false,
|
|
456
|
+
"properties": {
|
|
457
|
+
"api": {
|
|
458
|
+
"description": "Directorio del agente backend/API",
|
|
459
|
+
"type": ["string", "null"]
|
|
460
|
+
},
|
|
461
|
+
"frontend": {
|
|
462
|
+
"description": "Directorio del agente frontend",
|
|
463
|
+
"type": ["string", "null"]
|
|
464
|
+
},
|
|
465
|
+
"admin": {
|
|
466
|
+
"description": "Directorio del agente admin",
|
|
467
|
+
"type": ["string", "null"]
|
|
468
|
+
},
|
|
469
|
+
"mobile": {
|
|
470
|
+
"description": "Directorio del agente mobile",
|
|
471
|
+
"type": ["string", "null"]
|
|
472
|
+
},
|
|
473
|
+
"scanner": {
|
|
474
|
+
"description": "Directorio del agente scanner/crawler",
|
|
475
|
+
"type": ["string", "null"]
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
"integrations": {
|
|
480
|
+
"description": "Configuración de integraciones externas",
|
|
481
|
+
"type": ["object", "null"],
|
|
482
|
+
"additionalProperties": false,
|
|
483
|
+
"properties": {
|
|
484
|
+
"obsidian": {
|
|
485
|
+
"description": "Integración con Obsidian via Local REST API",
|
|
486
|
+
"type": ["object", "null"],
|
|
487
|
+
"additionalProperties": false,
|
|
488
|
+
"properties": {
|
|
489
|
+
"vault_path": {
|
|
490
|
+
"description": "Ruta al vault de Obsidian, relativa a la raíz del repo",
|
|
491
|
+
"type": ["string", "null"]
|
|
492
|
+
},
|
|
493
|
+
"map": {
|
|
494
|
+
"description": "Mapeo de área de código a nota del vault",
|
|
495
|
+
"type": ["object", "null"],
|
|
496
|
+
"additionalProperties": { "type": ["string", "null"] }
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Skills del framework forge
|
|
2
|
+
|
|
3
|
+
## Mapa de skills y dependencias
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
new-feature ──────────────────────────────────────────────────┐
|
|
7
|
+
│ │
|
|
8
|
+
├── spec (Fase 1 — verificar/crear spec) │
|
|
9
|
+
├── phase-kickoff (Fase 3 — si se crea team de agentes) │
|
|
10
|
+
├── security-audit (Fase 4 — checklist antes de API routes) │
|
|
11
|
+
├── db-migrate (Fase 5 — si hay cambios de schema) │
|
|
12
|
+
├── browser-test (Fase 6 — OPCIONAL, screenshot evidencia)│
|
|
13
|
+
├── obsidian-sync (Fase 6 — OPCIONAL, si está configurado) │
|
|
14
|
+
└── local2prod (Fase 6 — deploy a producción) │
|
|
15
|
+
└── obsidian-sync (Paso 5 — OPCIONAL) ───────┘
|
|
16
|
+
|
|
17
|
+
wiki-ingest ← fuente (URL | archivo | texto)
|
|
18
|
+
↓ crea/actualiza
|
|
19
|
+
wiki/ (concepts, entities, sources, synthesis)
|
|
20
|
+
↑
|
|
21
|
+
wiki-query ← pregunta → respuesta con citas
|
|
22
|
+
wiki-lint → health check + auto-reparación
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Catálogo
|
|
26
|
+
|
|
27
|
+
| Skill | Categoría | Requiere herramienta externa | Invocado por |
|
|
28
|
+
|-------|-----------|------------------------------|--------------|
|
|
29
|
+
| `spec` | Core | No | new-feature, orchestrator |
|
|
30
|
+
| `phase-kickoff` | Core | No | orchestrator, new-feature |
|
|
31
|
+
| `security-audit` | Universal | No | new-feature, security-auditor |
|
|
32
|
+
| `db-migrate` | Universal | No (solo el ORM del proyecto) | new-feature |
|
|
33
|
+
| `browser-test` | Universal | `agent-browser` CLI (npm i -g) | new-feature, usuario directo |
|
|
34
|
+
| `wiki-ingest` | Wiki | No | usuario directo, docs-writer |
|
|
35
|
+
| `wiki-query` | Wiki | No | usuario directo, new-feature |
|
|
36
|
+
| `wiki-lint` | Wiki | No | usuario directo |
|
|
37
|
+
| `local2prod` | Universal | CLI del provider de deploy | new-feature |
|
|
38
|
+
| `new-feature` | Universal | No (orquesta los otros) | Usuario directo |
|
|
39
|
+
| `obsidian-sync` | Integración | Obsidian + Local REST API | new-feature, local2prod |
|
|
40
|
+
|
|
41
|
+
## Categorías
|
|
42
|
+
|
|
43
|
+
### Core — siempre presentes
|
|
44
|
+
- **`spec`**: redactar specs siguiendo la plantilla obligatoria
|
|
45
|
+
- **`phase-kickoff`**: protocolo para iniciar un sprint o fase nueva
|
|
46
|
+
|
|
47
|
+
### Universales — activar según el proyecto
|
|
48
|
+
Configurar en `project.yaml` bajo `skills.active`:
|
|
49
|
+
- **`security-audit`**: checklist de auth, authz, IDOR, input validation
|
|
50
|
+
- **`db-migrate`**: flujo seguro de migraciones (Prisma, Drizzle, Rails, Alembic, Goose)
|
|
51
|
+
- **`browser-test`**: automatización de navegador — screenshots, verificación de UI, testeo visual. Requiere `agent-browser` instalado globalmente (`npm i -g agent-browser && agent-browser install`)
|
|
52
|
+
- **`local2prod`**: commit → push → esperar CI → verificar (Vercel, Railway, Fly, custom)
|
|
53
|
+
- **`new-feature`**: checklist completo de implementación (orquesta los otros)
|
|
54
|
+
|
|
55
|
+
### Wiki — knowledge base del proyecto
|
|
56
|
+
Configurar en `project.yaml` bajo `skills.active`. Generan slash commands `/wiki-ingest`, `/wiki-query`, `/wiki-lint` en Claude Code. La estructura `docs/wiki/` se inicializa con `forge-init.py`:
|
|
57
|
+
- **`wiki-ingest`**: ingesta fuentes (URL, archivo, texto) → actualiza `raw/` + páginas wiki + index + log
|
|
58
|
+
- **`wiki-query`**: responde preguntas usando el wiki como base, con citas a páginas
|
|
59
|
+
- **`wiki-lint`**: verifica integridad del wiki: links, huérfanos, frontmatter, log
|
|
60
|
+
|
|
61
|
+
Configuración opcional en `project.yaml`:
|
|
62
|
+
```yaml
|
|
63
|
+
wiki:
|
|
64
|
+
path: "docs/wiki" # default
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Integraciones — requieren herramienta externa
|
|
68
|
+
Configurar en `project.yaml` bajo `skills.integrations`:
|
|
69
|
+
- **`obsidian-sync`**: mantiene vault de Obsidian sincronizado con el código
|
|
70
|
+
|
|
71
|
+
## Cómo conviven
|
|
72
|
+
|
|
73
|
+
Los skills son componibles: `new-feature` invoca los demás en el orden correcto.
|
|
74
|
+
Las integraciones son opcionales — si no están configuradas en `project.yaml`, los
|
|
75
|
+
skills que las referencian las saltean silenciosamente.
|
|
76
|
+
|
|
77
|
+
No hay conflicto entre skills porque cada uno tiene un dominio claro:
|
|
78
|
+
- `security-audit` y `db-migrate` son standalone (no se invocan entre sí)
|
|
79
|
+
- `local2prod` solo invoca `obsidian-sync` opcionalmente
|
|
80
|
+
- `new-feature` es el único que orquesta los demás
|
|
81
|
+
|
|
82
|
+
## Cómo agregar un skill nuevo
|
|
83
|
+
|
|
84
|
+
1. Crear `core/skills/<nombre>/SKILL.md` con frontmatter `name`, `description`, `triggers`
|
|
85
|
+
2. Definir claramente: cuándo usarlo, qué hace, qué no hace
|
|
86
|
+
3. Declarar relación con otros skills al final ("Relación con otros skills")
|
|
87
|
+
4. Agregar al catálogo en este README
|
|
88
|
+
5. Si requiere configuración en `project.yaml`, actualizar `templates/project.yaml.tpl`
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Skill: aitmpl-search
|
|
2
|
+
|
|
3
|
+
Busca en el catálogo curado de forge: frameworks de agentes IA, MCP servers instalables,
|
|
4
|
+
profiles de stack y herramientas. La búsqueda es offline (catálogo local); opcionalmente
|
|
5
|
+
puede extenderse a GitHub con `--github`.
|
|
6
|
+
|
|
7
|
+
Triggers: /aitmpl-search, "buscar templates", "buscar en catálogo", "templates de AI",
|
|
8
|
+
"buscar template", "buscar MCP", "buscar profile".
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Cuándo usar este skill
|
|
13
|
+
|
|
14
|
+
- Cuando el usuario quiere explorar frameworks o herramientas de agentes IA
|
|
15
|
+
- Antes de diseñar un agente Tier 2 nuevo, para ver si ya existe un profile en forge
|
|
16
|
+
- Cuando se necesita instalar un MCP server y se quiere ver qué hay disponible
|
|
17
|
+
- Para explorar patrones de arquitectura de agentes reutilizables
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Protocolo
|
|
22
|
+
|
|
23
|
+
### Paso 1 — Ejecutar la búsqueda
|
|
24
|
+
|
|
25
|
+
Búsqueda por texto en el catálogo local:
|
|
26
|
+
```bash
|
|
27
|
+
python3 .agentic/scripts/aitmpl-search.py "<query>" --limit 10
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Filtrar por categoría (`framework`, `mcp-server`, `profile`, `tool`, `resource`):
|
|
31
|
+
```bash
|
|
32
|
+
python3 .agentic/scripts/aitmpl-search.py "<query>" --category mcp-server
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Ver todas las categorías disponibles:
|
|
36
|
+
```bash
|
|
37
|
+
python3 .agentic/scripts/aitmpl-search.py --list-categories
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Salida JSON (para integración o análisis):
|
|
41
|
+
```bash
|
|
42
|
+
python3 .agentic/scripts/aitmpl-search.py "<query>" --json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Extender con búsqueda en GitHub (requiere red; límite 60 req/h sin token):
|
|
46
|
+
```bash
|
|
47
|
+
python3 .agentic/scripts/aitmpl-search.py "<query>" --github
|
|
48
|
+
export GITHUB_TOKEN=ghp_... # aumenta a 5000 req/h
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Desde el CLI interactivo:
|
|
52
|
+
```bash
|
|
53
|
+
python3 .agentic/forge.py # → "Buscar templates" → buscar o filtrar por categoría
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Paso 2 — Analizar resultados
|
|
57
|
+
|
|
58
|
+
- Revisar los items más relevantes a la necesidad del proyecto
|
|
59
|
+
- Para MCP servers: verificar el campo `install` del resultado JSON para el comando exacto
|
|
60
|
+
- Para profiles: comparar con los profiles activos en `agents.profiles` de `project.yaml`
|
|
61
|
+
- Para frameworks: comparar con el stack del proyecto antes de sugerir adopción
|
|
62
|
+
|
|
63
|
+
### Paso 3 — Instalar (opcional)
|
|
64
|
+
|
|
65
|
+
Para MCP servers, el CLI interactivo ofrece instalación directa que escribe en `.claude/settings.json`.
|
|
66
|
+
Para profiles, ofrece agregar el profile a `project.yaml` directamente.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## No hagas
|
|
71
|
+
|
|
72
|
+
- No asumir que un resultado del catálogo está actualizado — verificar el repositorio antes de recomendar
|
|
73
|
+
- No crear agentes Tier 2 sin revisar si el stack ya tiene un profile en `profiles/`
|
|
74
|
+
- No instalar MCP servers sin verificar que el usuario tiene Python 3.9+ y las dependencias requeridas
|