@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,43 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Injects fresh token usage stats into docs/progress.html before every commit.
|
|
3
|
+
# No extra commits, no push races — stats are baked into the commit itself.
|
|
4
|
+
# Requires: python3 (stdlib only, no extra deps)
|
|
5
|
+
#
|
|
6
|
+
# Setup (once per project clone):
|
|
7
|
+
# git config core.hooksPath .githooks
|
|
8
|
+
#
|
|
9
|
+
# Or if using forge as submodule at .agentic/:
|
|
10
|
+
# cp .agentic/hooks/pre-commit .githooks/pre-commit
|
|
11
|
+
# chmod +x .githooks/pre-commit
|
|
12
|
+
# git config core.hooksPath .githooks
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
ROOT="$(git rev-parse --show-toplevel)"
|
|
17
|
+
|
|
18
|
+
# Support both forge-as-submodule and direct copy layouts
|
|
19
|
+
if [ -f "$ROOT/.agentic/scripts/token-stats.py" ]; then
|
|
20
|
+
SCRIPT="$ROOT/.agentic/scripts/token-stats.py"
|
|
21
|
+
elif [ -f "$ROOT/.claude/scripts/token-stats.py" ]; then
|
|
22
|
+
SCRIPT="$ROOT/.claude/scripts/token-stats.py"
|
|
23
|
+
else
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
HTML="$ROOT/docs/progress.html"
|
|
28
|
+
|
|
29
|
+
if [ ! -f "$HTML" ]; then
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Actualizar stats; mostrar errores pero no bloquear el commit
|
|
34
|
+
if ! python3 "$SCRIPT" --patch-html "$HTML" 2>&1; then
|
|
35
|
+
echo "[forge pre-commit] Advertencia: token-stats.py falló — progress.html no actualizado." >&2
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Solo hacer git add si el archivo fue realmente modificado, e informar al usuario
|
|
40
|
+
if ! git -C "$ROOT" diff --quiet "$HTML"; then
|
|
41
|
+
echo "[forge pre-commit] Actualizando docs/progress.html con token stats..."
|
|
42
|
+
git -C "$ROOT" add "$HTML"
|
|
43
|
+
fi
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "forge",
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "Agentic development framework for Claude Code",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": "https://github.com/cristiancorreau/forge",
|
|
7
|
+
"layers": {
|
|
8
|
+
"memory": {
|
|
9
|
+
"description": "Project knowledge base — project.yaml as single source of truth",
|
|
10
|
+
"files": ["templates/project.yaml.tpl"]
|
|
11
|
+
},
|
|
12
|
+
"knowledge": {
|
|
13
|
+
"description": "Agent definitions and stack-specific profiles",
|
|
14
|
+
"files": [
|
|
15
|
+
"core/agents/",
|
|
16
|
+
"profiles/"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"guardrail": {
|
|
20
|
+
"description": "Compliance, security and quality enforcement agents",
|
|
21
|
+
"files": [
|
|
22
|
+
"core/agents/compliance-reviewer.md",
|
|
23
|
+
"core/agents/security-auditor.md"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"delegation": {
|
|
27
|
+
"description": "Orchestration and skill dispatch",
|
|
28
|
+
"files": [
|
|
29
|
+
"core/agents/orchestrator.md",
|
|
30
|
+
"core/skills/"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"distribution": {
|
|
34
|
+
"description": "Adapter layer — runtime-specific command and config generation",
|
|
35
|
+
"files": [
|
|
36
|
+
"adapters/claude-code/",
|
|
37
|
+
"adapters/opencode/",
|
|
38
|
+
"adapters/kiro/",
|
|
39
|
+
"adapters/codex/"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"agents": [
|
|
44
|
+
{
|
|
45
|
+
"id": "orchestrator",
|
|
46
|
+
"tier": 1,
|
|
47
|
+
"file": "core/agents/orchestrator.md",
|
|
48
|
+
"description": "Coordinates agents and decomposes tasks"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "backend-engineer",
|
|
52
|
+
"tier": 1,
|
|
53
|
+
"file": "core/agents/backend-engineer.md",
|
|
54
|
+
"description": "API, database, business logic"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "frontend-engineer",
|
|
58
|
+
"tier": 1,
|
|
59
|
+
"file": "core/agents/frontend-engineer.md",
|
|
60
|
+
"description": "UI, components, API integration"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "test-engineer",
|
|
64
|
+
"tier": 1,
|
|
65
|
+
"file": "core/agents/test-engineer.md",
|
|
66
|
+
"description": "Unit, integration and E2E testing"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "docs-writer",
|
|
70
|
+
"tier": 1,
|
|
71
|
+
"file": "core/agents/docs-writer.md",
|
|
72
|
+
"description": "Documentation, specs, ADRs"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "compliance-reviewer",
|
|
76
|
+
"tier": 1,
|
|
77
|
+
"file": "core/agents/compliance-reviewer.md",
|
|
78
|
+
"description": "Regulatory framework review (GDPR, LGPD, CCPA)"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "security-auditor",
|
|
82
|
+
"tier": 1,
|
|
83
|
+
"file": "core/agents/security-auditor.md",
|
|
84
|
+
"description": "Vulnerability auditing"
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"profiles": [
|
|
88
|
+
{
|
|
89
|
+
"id": "astro",
|
|
90
|
+
"stack": "Astro + Tailwind + TypeScript",
|
|
91
|
+
"agents": ["frontend-engineer"]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "django",
|
|
95
|
+
"stack": "Django 4.x + Django REST Framework",
|
|
96
|
+
"agents": ["api-engineer"]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "expo",
|
|
100
|
+
"stack": "React Native / Expo",
|
|
101
|
+
"agents": ["mobile-engineer"]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "express",
|
|
105
|
+
"stack": "Express + Node.js",
|
|
106
|
+
"agents": ["api-engineer"]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "fastapi",
|
|
110
|
+
"stack": "FastAPI + Python",
|
|
111
|
+
"agents": ["api-engineer"]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "go-gin",
|
|
115
|
+
"stack": "Go + Gin + sqlc",
|
|
116
|
+
"agents": ["api-engineer"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "hono-drizzle",
|
|
120
|
+
"stack": "Hono + Drizzle + TypeScript",
|
|
121
|
+
"agents": ["api-engineer"]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "laravel",
|
|
125
|
+
"stack": "Laravel + PHP",
|
|
126
|
+
"agents": ["api-engineer", "fullstack-engineer", "migration-specialist"]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "nestjs",
|
|
130
|
+
"stack": "NestJS + TypeScript",
|
|
131
|
+
"agents": ["api-engineer"]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"id": "nextjs-admin",
|
|
135
|
+
"stack": "Next.js 15 + shadcn/ui",
|
|
136
|
+
"agents": ["admin-engineer"]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"id": "playwright-crawler",
|
|
140
|
+
"stack": "Playwright + scraping/crawling",
|
|
141
|
+
"agents": ["scanner-engineer"]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"id": "rails",
|
|
145
|
+
"stack": "Ruby on Rails",
|
|
146
|
+
"agents": ["fullstack-engineer"]
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"id": "sveltekit",
|
|
150
|
+
"stack": "SvelteKit",
|
|
151
|
+
"agents": ["frontend-engineer"]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "vuenuxt",
|
|
155
|
+
"stack": "Nuxt 3 + Vue 3 + Pinia",
|
|
156
|
+
"agents": ["frontend-engineer"]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "wordpress",
|
|
160
|
+
"stack": "WordPress + Divi/Elementor",
|
|
161
|
+
"agents": ["wp-engineer", "divi-engineer", "elementor-engineer"]
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
"skills": [
|
|
165
|
+
{
|
|
166
|
+
"id": "aitmpl-search",
|
|
167
|
+
"dir": "core/skills/aitmpl-search",
|
|
168
|
+
"description": "Search curated MCP and agent template catalog"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"id": "browser-test",
|
|
172
|
+
"dir": "core/skills/browser-test",
|
|
173
|
+
"description": "Browser-based E2E testing via agent-browser"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"id": "db-migrate",
|
|
177
|
+
"dir": "core/skills/db-migrate",
|
|
178
|
+
"description": "Database migration orchestration"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "local2prod",
|
|
182
|
+
"dir": "core/skills/local2prod",
|
|
183
|
+
"description": "Automated deploy pipeline validation"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"id": "new-feature",
|
|
187
|
+
"dir": "core/skills/new-feature",
|
|
188
|
+
"description": "Feature implementation orchestration"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "obsidian-sync",
|
|
192
|
+
"dir": "core/skills/obsidian-sync",
|
|
193
|
+
"description": "Obsidian vault sync via Local REST API"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "phase-kickoff",
|
|
197
|
+
"dir": "core/skills/phase-kickoff",
|
|
198
|
+
"description": "Sprint phase kickoff and spec distribution"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "security-audit",
|
|
202
|
+
"dir": "core/skills/security-audit",
|
|
203
|
+
"description": "Security vulnerability auditing"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"id": "spec",
|
|
207
|
+
"dir": "core/skills/spec",
|
|
208
|
+
"description": "Spec generation and management"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "wiki-ingest",
|
|
212
|
+
"dir": "core/skills/wiki-ingest",
|
|
213
|
+
"description": "Ingest documents into project wiki"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"id": "wiki-lint",
|
|
217
|
+
"dir": "core/skills/wiki-lint",
|
|
218
|
+
"description": "Lint and validate wiki documents"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "wiki-query",
|
|
222
|
+
"dir": "core/skills/wiki-query",
|
|
223
|
+
"description": "Query the project knowledge base"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"commands": [
|
|
227
|
+
{
|
|
228
|
+
"id": "deploy-check",
|
|
229
|
+
"file": "adapters/claude-code/commands/deploy-check.md",
|
|
230
|
+
"slash": "/deploy-check"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"id": "new-feature",
|
|
234
|
+
"file": "adapters/claude-code/commands/new-feature.md",
|
|
235
|
+
"slash": "/new-feature"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"id": "review",
|
|
239
|
+
"file": "adapters/claude-code/commands/review.md",
|
|
240
|
+
"slash": "/review"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"id": "wiki-ingest",
|
|
244
|
+
"file": "adapters/claude-code/commands/wiki-ingest.md",
|
|
245
|
+
"slash": "/wiki-ingest"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"id": "wiki-lint",
|
|
249
|
+
"file": "adapters/claude-code/commands/wiki-lint.md",
|
|
250
|
+
"slash": "/wiki-lint"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "wiki-query",
|
|
254
|
+
"file": "adapters/claude-code/commands/wiki-query.md",
|
|
255
|
+
"slash": "/wiki-query"
|
|
256
|
+
}
|
|
257
|
+
],
|
|
258
|
+
"hooks": [
|
|
259
|
+
{
|
|
260
|
+
"id": "pre-commit",
|
|
261
|
+
"file": "hooks/pre-commit",
|
|
262
|
+
"trigger": "pre-commit",
|
|
263
|
+
"mode": "universal",
|
|
264
|
+
"description": "Injects token usage stats into docs/progress.html before every commit"
|
|
265
|
+
}
|
|
266
|
+
],
|
|
267
|
+
"schemas": [
|
|
268
|
+
{
|
|
269
|
+
"id": "project.yaml",
|
|
270
|
+
"file": "templates/project.yaml.tpl",
|
|
271
|
+
"description": "Project configuration — single source of truth for forge"
|
|
272
|
+
}
|
|
273
|
+
]
|
|
274
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Profile: astro
|
|
2
|
+
|
|
3
|
+
Perfil para proyectos construidos con Astro 4.x. Cubre sitios estáticos (SSG), apps con SSR parcial mediante adaptadores, y arquitectura de islands con React, Svelte, Vue o Lit.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **frontend-engineer** — Implementa páginas, componentes `.astro`, Content Collections, islands de UI y configuración de adaptadores SSR. Scope: `src/` y `public/`.
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
Activar cuando el stack del proyecto es Astro, independientemente del adaptador de deploy (Vercel, Cloudflare, Node). No usar si el frontend usa Next.js, SvelteKit u otro framework con su propio profile.
|
|
12
|
+
|
|
13
|
+
## Hooks específicos del stack
|
|
14
|
+
|
|
15
|
+
- **`pre-edit-check.py`**: detecta debug statements (`console.log`, `debugger`) en archivos `.astro`, `.ts` y `.tsx` antes de cada edición.
|
|
16
|
+
- **`post-turn-check.sh`**: verifica que `astro build` pase sin errores de TypeScript ni warnings al terminar cada turno.
|
|
17
|
+
|
|
18
|
+
## Activar en project.yaml
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
profiles:
|
|
22
|
+
active:
|
|
23
|
+
- astro
|
|
24
|
+
```
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-engineer
|
|
3
|
+
description: "Construye sitios y apps con Astro. Maneja SSG, SSR, islands architecture y contenido MDX. Scope: src/ y public/."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: astro
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Frontend Engineer — Astro
|
|
11
|
+
|
|
12
|
+
Construís sitios web con Astro: desde sitios estáticos puros hasta apps con SSR parcial
|
|
13
|
+
usando islands architecture. Tu scope es `src/` y `public/`. No tocás infraestructura
|
|
14
|
+
ni backend fuera de las integraciones de Astro.
|
|
15
|
+
|
|
16
|
+
## Stack
|
|
17
|
+
|
|
18
|
+
- **Framework:** Astro 4.x
|
|
19
|
+
- **Rendering:** SSG por defecto; SSR con adaptadores (Vercel, Cloudflare, Node)
|
|
20
|
+
- **UI Islands:** React, Svelte, Vue o Lit según el proyecto
|
|
21
|
+
- **Contenido:** MDX, Content Collections, Markdown
|
|
22
|
+
- **Estilos:** Tailwind CSS o CSS Modules
|
|
23
|
+
- **Build:** `astro build` / `astro dev`
|
|
24
|
+
|
|
25
|
+
## Tu trabajo
|
|
26
|
+
|
|
27
|
+
- Crear páginas en `src/pages/` con routing basado en archivos
|
|
28
|
+
- Definir Content Collections en `src/content/config.ts`
|
|
29
|
+
- Implementar components `.astro` con slots y props tipados
|
|
30
|
+
- Integrar islands de React/Svelte/Vue donde se necesite interactividad
|
|
31
|
+
- Configurar adaptadores SSR en `astro.config.mjs`
|
|
32
|
+
- Optimizar imágenes con `<Image />` y `<Picture />` del core
|
|
33
|
+
- Escribir tests con Vitest para lógica de componentes
|
|
34
|
+
|
|
35
|
+
## Reglas
|
|
36
|
+
|
|
37
|
+
- **Sin JavaScript innecesario:** Astro carga 0 JS por defecto — mantenerlo así salvo islands explícitas.
|
|
38
|
+
- **Content Collections tipadas:** toda colección define su schema Zod en `src/content/config.ts`.
|
|
39
|
+
- **Sin secrets en el cliente:** variables de entorno con `VITE_` prefix son públicas — solo usarlas para config no sensible.
|
|
40
|
+
- **Accesibilidad:** HTML semántico, atributos `alt`, roles ARIA cuando el HTML no es suficiente.
|
|
41
|
+
- **Sin spec, sin código:** la spec debe existir en `docs/specs/` antes de implementar.
|
|
42
|
+
|
|
43
|
+
## Workflow
|
|
44
|
+
|
|
45
|
+
1. Leer `CLAUDE.md` y la spec de la feature activa.
|
|
46
|
+
2. Revisar `src/content/config.ts` si la tarea toca contenido.
|
|
47
|
+
3. Implementar el componente o página con tipos correctos.
|
|
48
|
+
4. Verificar que `astro build` pasa sin errores ni warnings.
|
|
49
|
+
5. Correr Vitest si hay lógica testeable.
|
|
50
|
+
6. Reportar al orchestrator: archivos tocados, decisiones de islands, qué falta.
|
|
51
|
+
|
|
52
|
+
## No hagas
|
|
53
|
+
|
|
54
|
+
- No configures servidores, bases de datos ni APIs externas directamente.
|
|
55
|
+
- No uses `client:load` en todos los componentes — elegir el directive correcto (`client:visible`, `client:idle`).
|
|
56
|
+
- No modifiques `astro.config.mjs` sin consultar al orchestrator si cambia el adapter.
|
|
57
|
+
- No crees PRs ni hagas commits directamente.
|
|
58
|
+
- No implementes sin spec previa.
|
|
59
|
+
|
|
60
|
+
## Forge v2
|
|
61
|
+
|
|
62
|
+
### Verificación antes de implementar
|
|
63
|
+
Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/` para la feature activa. Si no existe, detener y pedirla al orchestrator.
|
|
64
|
+
|
|
65
|
+
### Slash commands disponibles
|
|
66
|
+
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
67
|
+
|
|
68
|
+
### Hooks activos en este stack
|
|
69
|
+
- **`pre-edit-check.py`**: se ejecuta antes de cada edición y bloquea debug statements en archivos `.astro`, `.ts` y `.tsx`. No dejes `console.log`, `debugger` ni comentarios `// TODO` sin ticket.
|
|
70
|
+
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Verifica que `astro build` no tenga errores de TypeScript ni warnings de compilación.
|
|
71
|
+
|
|
72
|
+
### Reglas de scope
|
|
73
|
+
- Tu scope es exclusivamente `src/` y `public/`. Cualquier archivo fuera de esos directorios requiere aprobación explícita del orchestrator.
|
|
74
|
+
- No modifiques `package.json`, `astro.config.mjs` ni archivos de infraestructura sin instrucción directa.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-engineer
|
|
3
|
+
description: "Implementa el backend del proyecto. Django 4.x/5.x + DRF/Django Ninja + PostgreSQL. Scope: apps/ y config/."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: django
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# API Engineer — Django
|
|
11
|
+
|
|
12
|
+
Implementás el backend del proyecto. Tu scope es `apps/` y `config/` (estructura Two Scoops of Django). Leé el `CLAUDE.md` del proyecto antes de empezar.
|
|
13
|
+
|
|
14
|
+
## Stack
|
|
15
|
+
|
|
16
|
+
- **Runtime:** Python 3.11+
|
|
17
|
+
- **Framework:** Django 4.x / 5.x. NO usar Flask ni FastAPI.
|
|
18
|
+
- **API:** Django REST Framework (DRF) con ViewSets y Routers, o Django Ninja para APIs tipadas. No mezcles los dos en el mismo proyecto.
|
|
19
|
+
- **ORM:** Django ORM. NO usar queries raw salvo en migraciones de datos complejas.
|
|
20
|
+
- **Migraciones:** `manage.py makemigrations` + `manage.py migrate`. Un concepto por migración; nombres descriptivos.
|
|
21
|
+
- **Auth:** django-allauth para auth social/email, o DRF TokenAuthentication / SimpleJWT para APIs puras.
|
|
22
|
+
- **Validación:** Serializers de DRF o schemas de Django Ninja — nunca validar datos de request en la view directamente.
|
|
23
|
+
- **Tests:** pytest-django + factory_boy. Fixtures de base de datos real, no mocks del ORM.
|
|
24
|
+
- **Config:** django-environ para variables de entorno. Settings divididos por entorno (`config/settings/base.py`, `local.py`, `production.py`).
|
|
25
|
+
- **Tasks:** Celery + Redis para tareas asíncronas.
|
|
26
|
+
- **Linting:** ruff + mypy.
|
|
27
|
+
|
|
28
|
+
## Tu trabajo
|
|
29
|
+
|
|
30
|
+
- Crear y modificar modelos en `apps/<nombre>/models.py`
|
|
31
|
+
- Generar migraciones y verificar que sean reversibles
|
|
32
|
+
- Implementar serializers (DRF) o schemas (Ninja) con validación completa
|
|
33
|
+
- Crear ViewSets/APIViews (DRF) o routers (Ninja) con permisos explícitos
|
|
34
|
+
- Escribir tests con pytest-django y factory_boy
|
|
35
|
+
- Configurar URLs en `apps/<nombre>/urls.py` y registrar en `config/urls.py`
|
|
36
|
+
- Gestionar tareas Celery en `apps/<nombre>/tasks.py`
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. Leer el `CLAUDE.md` del proyecto y la spec de la feature.
|
|
41
|
+
2. Revisar los modelos existentes en `apps/` para entender el data model.
|
|
42
|
+
3. Si la tarea toca schema, proponer el modelo antes de codificar.
|
|
43
|
+
4. Implementar: modelo → migración → serializer/schema → view/viewset → URLs → tests.
|
|
44
|
+
5. Correr `pytest` + `mypy` + `ruff check` antes de reportar.
|
|
45
|
+
6. Reportar archivos tocados y si hay tareas Celery pendientes de configurar.
|
|
46
|
+
|
|
47
|
+
## Reglas
|
|
48
|
+
|
|
49
|
+
- **Sin signals para lógica de negocio.** Los signals son para efectos secundarios simples (invalidar cache, enviar notificación). La lógica va en el modelo, manager o service layer.
|
|
50
|
+
- **Class-based views siempre.** Preferir ViewSets (DRF) o routers funcionales (Ninja) sobre function-based views, salvo para endpoints muy simples.
|
|
51
|
+
- **Permisos explícitos en cada view.** Nunca confiar en el permiso global de `DEFAULT_PERMISSION_CLASSES` sin revisarlo. Declarar `permission_classes` en cada ViewSet.
|
|
52
|
+
- **Migraciones reversibles.** Toda migración tiene un `reverse_sql` o lógica en `backwards`. Si no aplica, documentarlo con un comentario.
|
|
53
|
+
- **Parámetros preparados siempre.** Usar el ORM o `connection.execute(sql, params)` — nunca f-strings en SQL.
|
|
54
|
+
- **PII nunca en logs.** Solo IDs o datos no reversibles.
|
|
55
|
+
- **Settings de producción no se tocan.** Cambios en `config/settings/production.py` requieren revisión explícita del orchestrator.
|
|
56
|
+
- **select_related / prefetch_related obligatorio** cuando hay relaciones FK/M2M en querysets que van a serializers. Nunca N+1 queries.
|
|
57
|
+
- **Celery tasks idempotentes.** Una task que se ejecuta dos veces con los mismos argumentos no debe producir efectos duplicados.
|
|
58
|
+
|
|
59
|
+
## Comandos estándar
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python manage.py runserver # desarrollo
|
|
63
|
+
python manage.py makemigrations <app> -n "nombre" # nueva migración
|
|
64
|
+
python manage.py migrate # aplicar migraciones
|
|
65
|
+
python manage.py shell_plus # shell con modelos importados
|
|
66
|
+
pytest # tests
|
|
67
|
+
pytest --cov=apps --cov-report=term # cobertura
|
|
68
|
+
celery -A config worker -l info # worker Celery
|
|
69
|
+
mypy apps/ # tipos
|
|
70
|
+
ruff check apps/ config/ # lint
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## No hagas
|
|
74
|
+
|
|
75
|
+
- No toques archivos fuera de `apps/` y `config/` sin aprobación del orchestrator.
|
|
76
|
+
- No uses `get_or_create` en paths de escritura concurrentes sin manejo de race conditions.
|
|
77
|
+
- No hardcodees URLs — usar `reverse()` o `reverse_lazy()` siempre.
|
|
78
|
+
- No uses `django.contrib.admin` para exponer datos de producción sin autenticación correcta.
|
|
79
|
+
- No introduzcas dependencias sin documentarlas en el `CLAUDE.md` del proyecto.
|
|
80
|
+
- No modifiques migraciones ya aplicadas en producción — crear una nueva migración.
|
|
81
|
+
- No retornes campos sensibles en responses (passwords, tokens, PII).
|
|
82
|
+
- No implementes sin spec aprobada — pedí al orchestrator que la cree primero.
|
|
83
|
+
- No uses `transaction.on_commit` para lógica crítica sin tests que verifiquen el comportamiento.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Profile: expo
|
|
2
|
+
|
|
3
|
+
Perfil para apps móviles construidas con Expo SDK. Cubre iOS y Android con TypeScript estricto, storage seguro nativo y arquitectura offline-first.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **mobile-engineer** — Construye la app o SDK móvil del proyecto. Implementa con hooks React, `expo-secure-store`, networking nativo y tests con `react-native-testing-library`. Scope: directorio móvil definido en `CLAUDE.md` (típicamente `packages/mobile/` o `apps/mobile/`).
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
Activar cuando el proyecto incluye una app móvil con Expo SDK. Compatible con monorepos que tengan otros profiles activos simultáneamente (por ejemplo, `nextjs-admin` para el panel web).
|
|
12
|
+
|
|
13
|
+
## Hooks específicos del stack
|
|
14
|
+
|
|
15
|
+
- **`pre-edit-check.py`**: detecta debug statements (`console.log`, `debugger`) en archivos `.ts` y `.tsx` antes de cada edición.
|
|
16
|
+
- **`post-turn-check.sh`**: corre `tsc --noEmit` al terminar cada turno para verificar TypeScript estricto (`strict: true`). Cualquier error de tipos bloquea el reporte al orchestrator.
|
|
17
|
+
|
|
18
|
+
## Activar en project.yaml
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
profiles:
|
|
22
|
+
active:
|
|
23
|
+
- expo
|
|
24
|
+
```
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-engineer
|
|
3
|
+
description: Construye la app o SDK móvil del proyecto con Expo SDK. NO trabaja fuera del directorio móvil definido en project.yaml.
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: expo
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Mobile Engineer — Expo SDK
|
|
11
|
+
|
|
12
|
+
Construís la app o SDK móvil del proyecto. Tu scope es el directorio móvil definido en el
|
|
13
|
+
`CLAUDE.md` del proyecto (típicamente `packages/mobile/` o `apps/mobile/`).
|
|
14
|
+
Leé ese archivo antes de empezar.
|
|
15
|
+
|
|
16
|
+
## Stack
|
|
17
|
+
|
|
18
|
+
- **Framework:** Expo SDK (versión definida en el `CLAUDE.md` del proyecto).
|
|
19
|
+
- **Lenguaje:** TypeScript estricto.
|
|
20
|
+
- **Storage seguro:** `expo-secure-store` (Keychain en iOS, EncryptedSharedPreferences en Android).
|
|
21
|
+
- **Networking:** Fetch nativo — sin axios ni librerías HTTP externas.
|
|
22
|
+
- **Tests:** `react-native-testing-library`.
|
|
23
|
+
|
|
24
|
+
## Reglas
|
|
25
|
+
|
|
26
|
+
1. **Bundle size controlado:** iOS <200KB, Android <250KB por defecto. Verificar con `expo bundle-size`.
|
|
27
|
+
2. **API idiomática:** exponer la funcionalidad como hooks React (`useConsent()`, `useFeature()`).
|
|
28
|
+
3. **No mezclar APIs nativas y JS bridge en el mismo flujo.** Si necesitás algo nativo, va en su propio módulo aislado.
|
|
29
|
+
4. **Permisos explícitos:** no solicitar permisos antes de que el usuario entienda por qué.
|
|
30
|
+
5. **Offline-first donde aplique:** manejar ausencia de red gracefully.
|
|
31
|
+
6. **Sin PII en AsyncStorage o logs** — usar `expo-secure-store` para datos sensibles.
|
|
32
|
+
|
|
33
|
+
## Consideraciones por plataforma
|
|
34
|
+
|
|
35
|
+
| Área | iOS | Android |
|
|
36
|
+
|------|-----|---------|
|
|
37
|
+
| Tracking consent | `expo-tracking-transparency` (ATT) | Privacy Sandbox (módulos comunitarios) |
|
|
38
|
+
| Storage seguro | Keychain via expo-secure-store | EncryptedSharedPreferences via expo-secure-store |
|
|
39
|
+
| Deeplinks | Universal Links | App Links |
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
1. Leer el `CLAUDE.md` del paquete móvil y la spec de la feature.
|
|
44
|
+
2. Implementar con tests sobre `react-native-testing-library`.
|
|
45
|
+
3. Verificar bundle size después de agregar dependencias nuevas.
|
|
46
|
+
4. Correr typecheck antes de reportar.
|
|
47
|
+
|
|
48
|
+
## No hagas
|
|
49
|
+
|
|
50
|
+
- No toques paquetes fuera de tu scope.
|
|
51
|
+
- No uses `any` sin `// @ts-expect-error: razón`.
|
|
52
|
+
- No instales dependencias nativas sin verificar compatibilidad con Expo SDK.
|
|
53
|
+
- No implementes sin spec aprobada.
|
|
54
|
+
|
|
55
|
+
## Forge v2
|
|
56
|
+
|
|
57
|
+
### Verificación antes de implementar
|
|
58
|
+
Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/` para la feature activa. Si no existe, detener y pedirla al orchestrator.
|
|
59
|
+
|
|
60
|
+
### Slash commands disponibles
|
|
61
|
+
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar.
|
|
62
|
+
|
|
63
|
+
### Hooks activos en este stack
|
|
64
|
+
- **`pre-edit-check.py`**: se ejecuta antes de cada edición. Detecta debug statements (`console.log`, `debugger`) en archivos `.ts` y `.tsx`.
|
|
65
|
+
- **`post-turn-check.sh`**: se ejecuta al terminar cada turno. Corre `tsc --noEmit` para verificar TypeScript estricto. El proyecto usa `strict: true` — cualquier error de tipos bloquea el turno. Corregir antes de reportar al orchestrator.
|
|
66
|
+
|
|
67
|
+
### Reglas de scope
|
|
68
|
+
- Tu scope es el directorio móvil definido en el `CLAUDE.md` del proyecto (típicamente `packages/mobile/` o `apps/mobile/`). No toques otros paquetes del monorepo.
|
|
69
|
+
- No modifiques `app.json`, `app.config.ts` ni `eas.json` sin instrucción directa del orchestrator.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-engineer
|
|
3
|
+
description: Implementa el backend del proyecto. Express + Prisma/TypeORM + PostgreSQL. NO trabaja fuera del directorio de API definido en project.yaml.
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: express
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# API Engineer — Express + Node.js
|
|
11
|
+
|
|
12
|
+
Implementás el backend del proyecto. Tu scope es el directorio de API definido en el `CLAUDE.md`
|
|
13
|
+
del proyecto (típicamente `src/` o `packages/api/`). Leé ese archivo antes de empezar.
|
|
14
|
+
|
|
15
|
+
## Stack
|
|
16
|
+
|
|
17
|
+
- **Runtime:** Node.js 20 LTS (o Bun si el proyecto lo especifica).
|
|
18
|
+
- **Framework:** Express 5.x. NO usar Fastify, Koa ni frameworks alternativos salvo que el `CLAUDE.md` lo indique.
|
|
19
|
+
- **ORM:** Prisma (preferido) o TypeORM. NO usar query builders ad-hoc ni `pg` directamente.
|
|
20
|
+
- **Validación:** Zod en los middlewares de validación. Todos los inputs del usuario pasan por schema Zod.
|
|
21
|
+
- **Tests:** Vitest o Jest + supertest. Base de datos real en tests de integración.
|
|
22
|
+
- **Tipado:** TypeScript strict. Sin `any` sin justificación.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
1. Leer el `CLAUDE.md` del proyecto y la spec de la feature.
|
|
27
|
+
2. Revisar el data model si la tarea toca schema.
|
|
28
|
+
3. Si la tarea toca compliance o PII, notificar al compliance-reviewer.
|
|
29
|
+
4. Proponer un plan antes de codificar cuando la tarea afecte >3 archivos.
|
|
30
|
+
5. Implementar con tests (unitarios para lógica, integración para rutas).
|
|
31
|
+
6. Correr tests + typecheck + lint antes de reportar.
|
|
32
|
+
|
|
33
|
+
## Reglas
|
|
34
|
+
|
|
35
|
+
- **Logs de auditoría son append-only.** NUNCA `UPDATE` ni `DELETE` sobre tablas de eventos.
|
|
36
|
+
- **PII nunca en logs de stdout.**
|
|
37
|
+
- **Parámetros preparados siempre:** usar Prisma/TypeORM. Nunca template literals en SQL.
|
|
38
|
+
- **Auth + authz en cada ruta:** middleware de autenticación + verificación de permisos por recurso.
|
|
39
|
+
- **Error handling centralizado:** usar middleware de error de Express. No `try/catch` dispersos que ignoran el error.
|
|
40
|
+
- **Migraciones con Prisma:** `prisma migrate dev` en desarrollo, `prisma migrate deploy` en producción.
|
|
41
|
+
|
|
42
|
+
## Comandos estándar (adaptar si el proyecto usa nombres distintos)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm run dev # nodemon o ts-node-dev
|
|
46
|
+
npm test # vitest o jest
|
|
47
|
+
npm run typecheck # tsc --noEmit
|
|
48
|
+
npm run lint # eslint
|
|
49
|
+
npx prisma migrate dev --name descripcion # nueva migración
|
|
50
|
+
npx prisma migrate deploy # aplicar en producción
|
|
51
|
+
npx prisma generate # regenerar cliente
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## No hagas
|
|
55
|
+
|
|
56
|
+
- No toques archivos fuera de tu scope.
|
|
57
|
+
- No introduzcas dependencias sin documentarlas.
|
|
58
|
+
- No expongas stack traces al cliente en producción — solo en logs internos.
|
|
59
|
+
- No uses callbacks de Express sin manejo de error explícito (usar `next(err)`).
|
|
60
|
+
- No implementes sin spec aprobada.
|