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.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/bin/guild.js +95 -0
- package/package.json +58 -7
- package/src/commands/__tests__/doctor.test.js +85 -0
- package/src/commands/__tests__/list.test.js +82 -0
- package/src/commands/__tests__/new-agent.test.js +40 -0
- package/src/commands/__tests__/status.test.js +35 -0
- package/src/commands/doctor.js +99 -0
- package/src/commands/init.js +140 -0
- package/src/commands/list.js +82 -0
- package/src/commands/new-agent.js +92 -0
- package/src/commands/status.js +57 -0
- package/src/templates/agents/advisor.md +47 -0
- package/src/templates/agents/bugfix.md +50 -0
- package/src/templates/agents/code-reviewer.md +52 -0
- package/src/templates/agents/db-migration.md +50 -0
- package/src/templates/agents/developer.md +50 -0
- package/src/templates/agents/platform-expert.md +89 -0
- package/src/templates/agents/product-owner.md +51 -0
- package/src/templates/agents/qa.md +50 -0
- package/src/templates/agents/tech-lead.md +50 -0
- package/src/templates/skills/build-feature/SKILL.md +200 -0
- package/src/templates/skills/council/SKILL.md +145 -0
- package/src/templates/skills/dev-flow/SKILL.md +69 -0
- package/src/templates/skills/guild-specialize/SKILL.md +156 -0
- package/src/templates/skills/new-feature/SKILL.md +86 -0
- package/src/templates/skills/qa-cycle/SKILL.md +73 -0
- package/src/templates/skills/review/SKILL.md +66 -0
- package/src/templates/skills/session-end/SKILL.md +84 -0
- package/src/templates/skills/session-start/SKILL.md +83 -0
- package/src/templates/skills/status/SKILL.md +81 -0
- package/src/utils/files.js +103 -0
- package/src/utils/generators.js +111 -0
- package/src/utils/github.js +144 -0
- 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
|