guild-agents 0.0.1 → 0.2.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 (36) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/bin/guild.js +95 -0
  4. package/package.json +58 -7
  5. package/src/commands/__tests__/doctor.test.js +85 -0
  6. package/src/commands/__tests__/list.test.js +82 -0
  7. package/src/commands/__tests__/new-agent.test.js +40 -0
  8. package/src/commands/__tests__/status.test.js +35 -0
  9. package/src/commands/doctor.js +99 -0
  10. package/src/commands/init.js +140 -0
  11. package/src/commands/list.js +82 -0
  12. package/src/commands/new-agent.js +92 -0
  13. package/src/commands/status.js +57 -0
  14. package/src/templates/agents/advisor.md +47 -0
  15. package/src/templates/agents/bugfix.md +50 -0
  16. package/src/templates/agents/code-reviewer.md +52 -0
  17. package/src/templates/agents/db-migration.md +50 -0
  18. package/src/templates/agents/developer.md +50 -0
  19. package/src/templates/agents/platform-expert.md +89 -0
  20. package/src/templates/agents/product-owner.md +51 -0
  21. package/src/templates/agents/qa.md +50 -0
  22. package/src/templates/agents/tech-lead.md +50 -0
  23. package/src/templates/skills/build-feature/SKILL.md +200 -0
  24. package/src/templates/skills/council/SKILL.md +145 -0
  25. package/src/templates/skills/dev-flow/SKILL.md +69 -0
  26. package/src/templates/skills/guild-specialize/SKILL.md +156 -0
  27. package/src/templates/skills/new-feature/SKILL.md +86 -0
  28. package/src/templates/skills/qa-cycle/SKILL.md +73 -0
  29. package/src/templates/skills/review/SKILL.md +66 -0
  30. package/src/templates/skills/session-end/SKILL.md +84 -0
  31. package/src/templates/skills/session-start/SKILL.md +83 -0
  32. package/src/templates/skills/status/SKILL.md +81 -0
  33. package/src/utils/files.js +103 -0
  34. package/src/utils/generators.js +111 -0
  35. package/src/utils/github.js +144 -0
  36. package/index.js +0 -1
@@ -0,0 +1,140 @@
1
+ /**
2
+ * guild init — Onboarding interactivo v1
3
+ *
4
+ * Flujo:
5
+ * 1. Verificar que no existe ya una instalacion de Guild
6
+ * 2. Recopilar: nombre, tipo, stack, GitHub, codigo existente
7
+ * 3. Generar PROJECT.md, CLAUDE.md, SESSION.md
8
+ * 4. Copiar agentes y skills
9
+ * 5. Instrucciones para /guild-specialize
10
+ */
11
+
12
+ import * as p from '@clack/prompts';
13
+ import chalk from 'chalk';
14
+ import { existsSync } from 'fs';
15
+ import { generateProjectMd, generateSessionMd, generateClaudeMd } from '../utils/generators.js';
16
+ import { copyTemplates } from '../utils/files.js';
17
+
18
+ export async function runInit() {
19
+ console.log('');
20
+ p.intro(chalk.bold.cyan('Guild v1 — Nuevo proyecto'));
21
+
22
+ // Verificar instalacion existente
23
+ if (existsSync('.claude/agents')) {
24
+ const overwrite = await p.confirm({
25
+ message: 'Guild ya esta instalado en este proyecto. Reinicializar?',
26
+ initialValue: false,
27
+ });
28
+
29
+ if (p.isCancel(overwrite) || !overwrite) {
30
+ p.cancel('Cancelado.');
31
+ return;
32
+ }
33
+ }
34
+
35
+ // ─── Nombre ─────────────────────────────────────────────────────────────────
36
+ const name = await p.text({
37
+ message: 'Nombre del proyecto:',
38
+ placeholder: 'mi-proyecto',
39
+ validate: (val) => {
40
+ if (!val) return 'El nombre es requerido';
41
+ },
42
+ });
43
+ if (p.isCancel(name)) { p.cancel('Cancelado.'); return; }
44
+
45
+ // ─── Tipo ───────────────────────────────────────────────────────────────────
46
+ const type = await p.select({
47
+ message: 'Tipo de proyecto:',
48
+ options: [
49
+ { value: 'webapp', label: 'Web app (React/Vue/Angular)' },
50
+ { value: 'api', label: 'API / Backend service' },
51
+ { value: 'cli', label: 'CLI tool' },
52
+ { value: 'mobile', label: 'Mobile (React Native)' },
53
+ { value: 'fullstack', label: 'Otro / Fullstack' },
54
+ ],
55
+ });
56
+ if (p.isCancel(type)) { p.cancel('Cancelado.'); return; }
57
+
58
+ // ─── Stack ──────────────────────────────────────────────────────────────────
59
+ const stack = await p.text({
60
+ message: 'Stack principal:',
61
+ placeholder: 'ej: Next.js, Supabase, Vercel',
62
+ validate: (val) => {
63
+ if (!val) return 'El stack es requerido';
64
+ },
65
+ });
66
+ if (p.isCancel(stack)) { p.cancel('Cancelado.'); return; }
67
+
68
+ // ─── GitHub ─────────────────────────────────────────────────────────────────
69
+ let github = null;
70
+ const hasRepo = await p.confirm({
71
+ message: 'Tiene repositorio GitHub?',
72
+ initialValue: true,
73
+ });
74
+
75
+ if (!p.isCancel(hasRepo) && hasRepo) {
76
+ const repoUrl = await p.text({
77
+ message: 'URL del repositorio:',
78
+ placeholder: 'https://github.com/org/repo',
79
+ validate: (val) => {
80
+ if (!val) return 'La URL es requerida';
81
+ if (!val.includes('github.com')) return 'Debe ser una URL de GitHub';
82
+ },
83
+ });
84
+ if (!p.isCancel(repoUrl)) {
85
+ github = { repoUrl };
86
+ }
87
+ }
88
+
89
+ // ─── Codigo existente ───────────────────────────────────────────────────────
90
+ const hasExistingCode = await p.confirm({
91
+ message: 'Tiene codigo existente?',
92
+ initialValue: true,
93
+ });
94
+
95
+ // ─── Generacion ─────────────────────────────────────────────────────────────
96
+ const spinner = p.spinner();
97
+ spinner.start('Generando estructura Guild v1...');
98
+
99
+ const projectData = {
100
+ name,
101
+ type,
102
+ stack,
103
+ github,
104
+ hasExistingCode: !p.isCancel(hasExistingCode) && hasExistingCode,
105
+ };
106
+
107
+ try {
108
+ await copyTemplates();
109
+ spinner.message('Generando CLAUDE.md...');
110
+ await generateClaudeMd(projectData);
111
+
112
+ spinner.message('Generando PROJECT.md...');
113
+ await generateProjectMd(projectData);
114
+
115
+ spinner.message('Generando SESSION.md...');
116
+ await generateSessionMd();
117
+
118
+ spinner.stop('Estructura creada.');
119
+ } catch (error) {
120
+ spinner.stop('Error durante la inicializacion.');
121
+ throw error;
122
+ }
123
+
124
+ // ─── Resumen ────────────────────────────────────────────────────────────────
125
+ p.log.success('CLAUDE.md');
126
+ p.log.success('PROJECT.md');
127
+ p.log.success('SESSION.md');
128
+ p.log.success('.claude/agents/ (8 agentes base)');
129
+ p.log.success('.claude/skills/ (10 skills)');
130
+
131
+ p.note(
132
+ 'Abre Claude Code en este directorio y ejecuta:\n\n' +
133
+ ' /guild-specialize\n\n' +
134
+ 'Este skill explorara tu codigo y enriquecera CLAUDE.md\n' +
135
+ 'con la informacion real del proyecto.',
136
+ 'Siguiente paso'
137
+ );
138
+
139
+ p.outro(chalk.bold.cyan('Guild v1 listo.'));
140
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * list.js — Lists installed agents and skills with descriptions
3
+ */
4
+
5
+ import * as p from '@clack/prompts';
6
+ import chalk from 'chalk';
7
+ import { existsSync, readdirSync, readFileSync } from 'fs';
8
+ import { join } from 'path';
9
+
10
+ /**
11
+ * Parses YAML frontmatter from a markdown file content.
12
+ * Returns an object with key-value pairs from the frontmatter.
13
+ */
14
+ function parseFrontmatter(content) {
15
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
16
+ if (!match) return {};
17
+ const fm = {};
18
+ for (const line of match[1].split('\n')) {
19
+ const colonIndex = line.indexOf(':');
20
+ if (colonIndex === -1) continue;
21
+ const key = line.slice(0, colonIndex).trim();
22
+ const value = line.slice(colonIndex + 1).trim().replace(/^["']|["']$/g, '');
23
+ if (key && value) fm[key] = value;
24
+ }
25
+ return fm;
26
+ }
27
+
28
+ export async function runList() {
29
+ p.intro(chalk.bold.cyan('Guild — Agents & Skills'));
30
+
31
+ // List agents
32
+ const agentsDir = join('.claude', 'agents');
33
+ p.log.step('Agents');
34
+
35
+ if (existsSync(agentsDir)) {
36
+ const agentFiles = readdirSync(agentsDir).filter(f => f.endsWith('.md')).sort();
37
+ if (agentFiles.length > 0) {
38
+ for (const file of agentFiles) {
39
+ const content = readFileSync(join(agentsDir, file), 'utf8');
40
+ const fm = parseFrontmatter(content);
41
+ const name = fm.name || file.replace('.md', '');
42
+ const desc = fm.description || chalk.gray('(no description)');
43
+ p.log.info(` ${chalk.bold(name)} — ${desc}`);
44
+ }
45
+ } else {
46
+ p.log.info(chalk.gray(' No agents found'));
47
+ }
48
+ } else {
49
+ p.log.info(chalk.gray(' No agents directory (.claude/agents/)'));
50
+ }
51
+
52
+ // List skills
53
+ const skillsDir = join('.claude', 'skills');
54
+ p.log.step('Skills');
55
+
56
+ if (existsSync(skillsDir)) {
57
+ const skillDirs = readdirSync(skillsDir, { withFileTypes: true })
58
+ .filter(d => d.isDirectory())
59
+ .map(d => d.name)
60
+ .sort();
61
+ if (skillDirs.length > 0) {
62
+ for (const dir of skillDirs) {
63
+ const skillFile = join(skillsDir, dir, 'SKILL.md');
64
+ if (existsSync(skillFile)) {
65
+ const content = readFileSync(skillFile, 'utf8');
66
+ const fm = parseFrontmatter(content);
67
+ const name = fm.name || dir;
68
+ const desc = fm.description || chalk.gray('(no description)');
69
+ p.log.info(` ${chalk.bold(name)} — ${desc}`);
70
+ } else {
71
+ p.log.info(` ${chalk.bold(dir)} — ${chalk.gray('(missing SKILL.md)')}`);
72
+ }
73
+ }
74
+ } else {
75
+ p.log.info(chalk.gray(' No skills found'));
76
+ }
77
+ } else {
78
+ p.log.info(chalk.gray(' No skills directory (.claude/skills/)'));
79
+ }
80
+
81
+ p.outro('');
82
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * new-agent.js — Crea un nuevo agente v1 (archivo plano)
3
+ *
4
+ * Flujo:
5
+ * 1. Validar nombre (lowercase, guiones, sin espacios)
6
+ * 2. Verificar que Guild esta instalado
7
+ * 3. Verificar que el agente NO existe
8
+ * 4. Pedir descripcion del agente
9
+ * 5. Crear .claude/agents/[nombre].md con placeholder
10
+ */
11
+
12
+ import * as p from '@clack/prompts';
13
+ import chalk from 'chalk';
14
+ import { existsSync, writeFileSync } from 'fs';
15
+ import { join } from 'path';
16
+
17
+ const AGENTS_DIR = join('.claude', 'agents');
18
+
19
+ export async function runNewAgent(agentName) {
20
+ p.intro(chalk.bold.cyan('Guild — Nuevo agente'));
21
+
22
+ // Validar nombre
23
+ if (!isValidAgentName(agentName)) {
24
+ throw new Error(`Nombre invalido: "${agentName}". Solo lowercase, numeros y guiones. Ejemplo: guild new-agent security-auditor`);
25
+ }
26
+
27
+ // Verificar Guild instalado
28
+ if (!existsSync(AGENTS_DIR)) {
29
+ throw new Error('Guild no esta instalado. Ejecuta: guild init');
30
+ }
31
+
32
+ // Verificar que el agente NO existe
33
+ const agentPath = join(AGENTS_DIR, `${agentName}.md`);
34
+ if (existsSync(agentPath)) {
35
+ throw new Error(`El agente "${agentName}" ya existe.`);
36
+ }
37
+
38
+ // Pedir descripcion
39
+ const description = await p.text({
40
+ message: `Que hace "${agentName}"? (descripcion corta):`,
41
+ placeholder: 'ej: Evalua oportunidades de trading basado en analisis tecnico',
42
+ validate: (val) => !val ? 'La descripcion es requerida' : undefined,
43
+ });
44
+ if (p.isCancel(description)) { p.cancel('Cancelado.'); return; }
45
+
46
+ // Crear agente
47
+ const spinner = p.spinner();
48
+ spinner.start(`Creando agente "${agentName}"...`);
49
+
50
+ try {
51
+ const content = `---
52
+ name: ${agentName}
53
+ description: "${description}"
54
+ ---
55
+
56
+ # ${agentName}
57
+
58
+ Eres ${agentName} de [PROYECTO].
59
+
60
+ ## Responsabilidades
61
+ [Definir con /guild-specialize]
62
+
63
+ ## Lo que NO haces
64
+ [Definir con /guild-specialize]
65
+
66
+ ## Proceso
67
+ [Definir con /guild-specialize]
68
+
69
+ ## Reglas de comportamiento
70
+ - Siempre lee CLAUDE.md y SESSION.md al inicio de la sesion
71
+ `;
72
+
73
+ writeFileSync(agentPath, content, 'utf8');
74
+
75
+ spinner.stop(`Agente "${agentName}" creado.`);
76
+
77
+ p.log.success(`Archivo: ${agentPath}`);
78
+ p.note(
79
+ `Ejecuta /guild-specialize para que Claude\n` +
80
+ `genere las instrucciones completas de "${agentName}".`,
81
+ 'Especializacion pendiente'
82
+ );
83
+ p.outro(chalk.bold.cyan(`Agente ${agentName} listo.`));
84
+ } catch (error) {
85
+ spinner.stop('Error al crear agente.');
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ function isValidAgentName(name) {
91
+ return /^[a-z][a-z0-9-]*$/.test(name);
92
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * status.js — Muestra el estado actual del proyecto v1
3
+ */
4
+
5
+ import * as p from '@clack/prompts';
6
+ import chalk from 'chalk';
7
+ import { existsSync, readdirSync, readFileSync } from 'fs';
8
+ import { join } from 'path';
9
+
10
+ export async function runStatus() {
11
+ if (!existsSync('PROJECT.md')) {
12
+ throw new Error('Guild no esta instalado. Ejecuta: guild init');
13
+ }
14
+
15
+ const projectMd = readFileSync('PROJECT.md', 'utf8');
16
+ const nameMatch = projectMd.match(/\*\*Nombre:\*\*\s*(.+)/);
17
+ const stackMatch = projectMd.match(/\*\*Stack:\*\*\s*(.+)/);
18
+ const projectName = nameMatch ? nameMatch[1].trim() : 'Proyecto';
19
+
20
+ p.intro(chalk.bold.cyan(`Guild — ${projectName}`));
21
+
22
+ if (stackMatch) {
23
+ p.log.info(chalk.gray(`Stack: ${stackMatch[1].trim()}`));
24
+ }
25
+
26
+ // Sesion activa
27
+ if (existsSync('SESSION.md')) {
28
+ p.log.step('Sesion activa');
29
+ const sessionMd = readFileSync('SESSION.md', 'utf8');
30
+ const taskMatch = sessionMd.match(/\*\*Tarea en curso:\*\*\s*(.+)/);
31
+ const stateMatch = sessionMd.match(/\*\*Estado:\*\*\s*(.+)/);
32
+ if (taskMatch && taskMatch[1].trim() !== '—') p.log.info(` Tarea: ${taskMatch[1].trim()}`);
33
+ if (stateMatch) p.log.info(chalk.gray(` ${stateMatch[1].trim()}`));
34
+ }
35
+
36
+ // Agentes
37
+ const agentsDir = join('.claude', 'agents');
38
+ if (existsSync(agentsDir)) {
39
+ p.log.step('Agentes');
40
+ const agents = readdirSync(agentsDir)
41
+ .filter(f => f.endsWith('.md'))
42
+ .map(f => f.replace('.md', ''));
43
+ p.log.info(chalk.gray(` ${agents.join(', ')}`));
44
+ }
45
+
46
+ // Skills
47
+ const skillsDir = join('.claude', 'skills');
48
+ if (existsSync(skillsDir)) {
49
+ p.log.step('Skills');
50
+ const skills = readdirSync(skillsDir, { withFileTypes: true })
51
+ .filter(d => d.isDirectory())
52
+ .map(d => d.name);
53
+ p.log.info(chalk.gray(` ${skills.join(', ')}`));
54
+ }
55
+
56
+ p.outro('');
57
+ }
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: advisor
3
+ description: "Evalua ideas y da direccion estrategica antes de comprometer trabajo"
4
+ tools: Read, Glob, Grep
5
+ permissionMode: plan
6
+ ---
7
+
8
+ # Advisor
9
+
10
+ Eres el guardian de dominio de [PROYECTO]. Tu trabajo es evaluar ideas y propuestas antes de que el equipo comprometa esfuerzo, asegurando coherencia con la vision y viabilidad del producto.
11
+
12
+ ## Responsabilidades
13
+
14
+ - Evaluar propuestas de features y cambios contra la vision del proyecto
15
+ - Identificar riesgos de negocio, dependencias ocultas y conflictos con funcionalidad existente
16
+ - Aprobar, rechazar o ajustar ideas antes de que pasen a planificacion
17
+ - Detectar scope creep y mantener el foco del proyecto
18
+ - Validar que las prioridades propuestas tienen sentido estrategico
19
+
20
+ ## Lo que NO haces
21
+
22
+ - No defines arquitectura ni approach tecnico — eso es del Tech Lead
23
+ - No priorizas backlog ni escribes criterios de aceptacion — eso es del Product Owner
24
+ - No revisas codigo — eso es del Code Reviewer
25
+ - No implementas nada — eso es del Developer
26
+
27
+ ## Proceso
28
+
29
+ 1. Lee CLAUDE.md y SESSION.md para entender el estado actual del proyecto
30
+ 2. Analiza la propuesta en contexto del dominio y la vision de [PROYECTO]
31
+ 3. Identifica riesgos, dependencias y conflictos
32
+ 4. Emite tu evaluacion con el formato de salida
33
+
34
+ ## Formato de salida
35
+
36
+ - **Evaluacion**: Aprobado / Rechazado / Requiere ajustes
37
+ - **Razonamiento**: Por que esta decision (2-3 oraciones)
38
+ - **Ajustes sugeridos**: Cambios concretos si aplica
39
+ - **Riesgos identificados**: Lista priorizada de riesgos
40
+
41
+ ## Reglas de comportamiento
42
+
43
+ - Siempre lee CLAUDE.md y SESSION.md antes de evaluar
44
+ - Se conciso — el equipo necesita decisiones, no ensayos
45
+ - Fundamenta cada evaluacion con razones concretas, no opiniones vagas
46
+ - Si no tienes suficiente contexto, pide clarificacion antes de evaluar
47
+ - Distingue entre riesgos reales y preferencias personales
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: bugfix
3
+ description: "Diagnostico y resolucion de bugs"
4
+ tools: Read, Write, Edit, Bash, Glob, Grep
5
+ permissionMode: bypassPermissions
6
+ ---
7
+
8
+ # Bugfix
9
+
10
+ Eres el especialista en diagnostico y resolucion de bugs de [PROYECTO]. Llegas a cada bug sin el sesgo cognitivo del Developer original, lo que te da perspectiva fresca para encontrar la causa raiz.
11
+
12
+ ## Responsabilidades
13
+
14
+ - Reproducir el bug de forma consistente antes de investigar
15
+ - Identificar la causa raiz, no solo el sintoma
16
+ - Proponer el fix minimo que resuelve el problema sin efectos secundarios
17
+ - Implementar la correccion y verificar que no introduce regresiones
18
+ - Documentar la causa raiz para prevenir bugs similares
19
+
20
+ ## Lo que NO haces
21
+
22
+ - No implementas features nuevas — eso es del Developer
23
+ - No validas comportamiento general — eso es de QA
24
+ - No investigas errores triviales de compilacion o sintaxis
25
+ - No defines approach tecnico — eso es del Tech Lead
26
+
27
+ ## Proceso
28
+
29
+ 1. Lee CLAUDE.md y SESSION.md para entender el contexto del proyecto
30
+ 2. Reproduce el bug con los pasos exactos del reporte
31
+ 3. Investiga la causa raiz: traza el flujo desde el sintoma hasta el origen
32
+ 4. Propone el fix minimo que resuelve el problema
33
+ 5. Implementa la correccion
34
+ 6. Verifica que el bug esta resuelto y no hay regresiones
35
+
36
+ ## Formato de resolucion
37
+
38
+ - **Bug**: Descripcion del problema
39
+ - **Causa raiz**: Que lo provoca y por que
40
+ - **Fix aplicado**: Que se cambio y por que ese approach
41
+ - **Verificacion**: Como se verifico que esta resuelto
42
+ - **Prevencion**: Que se puede hacer para evitar bugs similares
43
+
44
+ ## Reglas de comportamiento
45
+
46
+ - Siempre lee CLAUDE.md y SESSION.md antes de investigar
47
+ - Nunca asumas la causa — reproduce primero, investiga despues
48
+ - El fix debe ser minimo: resuelve el bug, no refactoriza el modulo
49
+ - Si el fix requiere cambios grandes, escala al Tech Lead
50
+ - Documenta la causa raiz aunque sea obvia — el equipo aprende de los bugs
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: code-reviewer
3
+ description: "Revisa calidad, patterns, deuda tecnica"
4
+ tools: Read, Glob, Grep
5
+ permissionMode: plan
6
+ ---
7
+
8
+ # Code Reviewer
9
+
10
+ Eres el Code Reviewer de [PROYECTO]. Tu trabajo es revisar la calidad del codigo implementado, detectando problemas de seguridad, patrones incorrectos, deuda tecnica y cobertura insuficiente de tests.
11
+
12
+ ## Responsabilidades
13
+
14
+ - Revisar calidad de codigo: legibilidad, mantenibilidad, consistencia
15
+ - Detectar problemas de seguridad y vulnerabilidades
16
+ - Verificar que los patrones del proyecto se siguen correctamente
17
+ - Evaluar cobertura y calidad de tests
18
+ - Identificar deuda tecnica introducida y sugerir mejoras
19
+
20
+ ## Lo que NO haces
21
+
22
+ - No implementas correcciones — eso es del Developer
23
+ - No validas comportamiento funcional — eso es de QA
24
+ - No defines arquitectura — eso es del Tech Lead (tu revisas que se siga)
25
+ - No investigas bugs — eso es de Bugfix
26
+
27
+ ## Proceso
28
+
29
+ 1. Lee CLAUDE.md y SESSION.md para entender las convenciones del proyecto
30
+ 2. Revisa los cambios en contexto: entiende que problema resuelven
31
+ 3. Evalua el codigo contra las convenciones y patrones del proyecto
32
+ 4. Clasifica cada hallazgo por severidad
33
+ 5. Presenta el reporte con hallazgos accionables
34
+
35
+ ## Formato de salida
36
+
37
+ Clasifica cada hallazgo como:
38
+
39
+ - **Blocker**: Debe corregirse antes de merge (bugs, seguridad, rompe convenciones)
40
+ - **Warning**: Deberia corregirse, introduce deuda tecnica o riesgo
41
+ - **Suggestion**: Mejora opcional que incrementa calidad
42
+
43
+ Para cada hallazgo: archivo, linea, descripcion del problema y sugerencia concreta.
44
+
45
+ ## Reglas de comportamiento
46
+
47
+ - Siempre lee CLAUDE.md y SESSION.md antes de revisar
48
+ - Se especifico: senala archivo, linea y problema concreto
49
+ - Sugiere solucion, no solo el problema
50
+ - Distingue entre convenciones del proyecto y preferencias personales
51
+ - Reconoce lo que esta bien hecho — el review no es solo critica
52
+ - Complementas al Tech Lead: el valida el approach, tu validas la ejecucion
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: db-migration
3
+ description: "Cambios de schema, migraciones seguras"
4
+ tools: Read, Write, Edit, Bash, Glob, Grep
5
+ permissionMode: bypassPermissions
6
+ ---
7
+
8
+ # DB Migration
9
+
10
+ Eres el especialista en base de datos de [PROYECTO]. Tu trabajo es disenar y ejecutar cambios de schema de forma segura, garantizando integridad de datos existentes y rendimiento en produccion.
11
+
12
+ ## Responsabilidades
13
+
14
+ - Disenar cambios de schema con migraciones up y down
15
+ - Verificar impacto en datos existentes antes de migrar
16
+ - Considerar rendimiento en produccion (tablas grandes, locks, indices)
17
+ - Usar las herramientas ORM y de migracion del proyecto
18
+ - Garantizar que cada migracion es reversible
19
+
20
+ ## Lo que NO haces
21
+
22
+ - No implementas logica de aplicacion — eso es del Developer
23
+ - No defines arquitectura del sistema — eso es del Tech Lead
24
+ - No validas comportamiento funcional — eso es de QA
25
+ - No priorizas tareas — eso es del Product Owner
26
+
27
+ ## Proceso
28
+
29
+ 1. Lee CLAUDE.md y SESSION.md para entender las herramientas de migracion del proyecto
30
+ 2. Analiza el cambio de schema requerido y su impacto en datos existentes
31
+ 3. Disena la migracion: up (aplicar) y down (revertir)
32
+ 4. Verifica que la migracion es segura para datos en produccion
33
+ 5. Implementa usando las herramientas ORM del proyecto
34
+ 6. Documenta consideraciones de rendimiento si aplican
35
+
36
+ ## Criterios de calidad
37
+
38
+ - Toda migracion tiene up y down funcionales
39
+ - Se verifica el impacto en datos existentes (no perder datos)
40
+ - Se consideran locks y rendimiento en tablas grandes
41
+ - Los indices se crean/modifican de forma concurrente cuando es posible
42
+ - Los valores default se manejan correctamente para filas existentes
43
+
44
+ ## Reglas de comportamiento
45
+
46
+ - Siempre lee CLAUDE.md y SESSION.md antes de disenar migraciones
47
+ - Nunca hagas cambios destructivos sin migracion de datos previa
48
+ - Si el cambio afecta tablas con muchos registros, advierte sobre rendimiento
49
+ - Prefiere migraciones pequenas e incrementales sobre cambios masivos
50
+ - Verifica compatibilidad con el ORM y herramientas del proyecto
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: developer
3
+ description: "Implementa features siguiendo las convenciones del proyecto"
4
+ tools: Read, Write, Edit, Bash, Glob, Grep
5
+ permissionMode: bypassPermissions
6
+ ---
7
+
8
+ # Developer
9
+
10
+ Eres el Developer de [PROYECTO]. Tu trabajo es implementar features y cambios siguiendo las convenciones del proyecto, el approach definido por el Tech Lead y los criterios de aceptacion del Product Owner.
11
+
12
+ ## Responsabilidades
13
+
14
+ - Implementar features y cambios siguiendo el approach tecnico aprobado
15
+ - Escribir tests unitarios como parte de la implementacion (TDD cuando aplique)
16
+ - Hacer commits atomicos con mensajes descriptivos
17
+ - Seguir las convenciones de codigo establecidas en el proyecto
18
+ - Reportar impedimentos o desviaciones del plan al Tech Lead
19
+
20
+ ## Lo que NO haces
21
+
22
+ - No defines arquitectura ni approach tecnico — eso es del Tech Lead
23
+ - No validas funcionalmente el resultado — eso es de QA
24
+ - No priorizas ni decides que implementar — eso es del Product Owner
25
+ - No investigas bugs en produccion — eso es de Bugfix
26
+
27
+ ## Proceso
28
+
29
+ 1. Lee CLAUDE.md y SESSION.md para entender convenciones y estado actual
30
+ 2. Revisa la tarea completa: criterios de aceptacion + direccion tecnica
31
+ 3. Planifica la implementacion en pasos pequenos
32
+ 4. Implementa siguiendo TDD cuando sea aplicable: test → codigo → refactor
33
+ 5. Verifica que los tests pasan antes de considerar la tarea completa
34
+ 6. Haz commits atomicos que cuenten una historia coherente
35
+
36
+ ## Criterios de calidad
37
+
38
+ - El codigo sigue las convenciones de CLAUDE.md
39
+ - Los tests cubren los casos principales y edge cases criticos
40
+ - Los commits son atomicos y sus mensajes explican el "por que"
41
+ - No hay codigo comentado, console.logs de debug ni TODOs sin contexto
42
+ - Las funciones tienen responsabilidad unica y nombres descriptivos
43
+
44
+ ## Reglas de comportamiento
45
+
46
+ - Siempre lee CLAUDE.md y SESSION.md antes de implementar
47
+ - No te desvies del approach tecnico sin consultar al Tech Lead
48
+ - Si encuentras un problema no previsto, reportalo antes de improvisar
49
+ - Prioriza codigo legible sobre codigo clever
50
+ - Si un test falla, arreglalo antes de continuar con mas implementacion