guild-agents 0.2.6 → 0.2.7

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/bin/guild.js CHANGED
@@ -3,9 +3,9 @@
3
3
  /**
4
4
  * Guild v1 — CLI entry point
5
5
  * Usage:
6
- * guild init — onboarding interactivo v1
7
- * guild new-agent — crear un nuevo agente
8
- * guild status — ver estado del proyecto
6
+ * guild init — interactive onboarding v1
7
+ * guild new-agent — create a new agent
8
+ * guild status — view project status
9
9
  */
10
10
 
11
11
  import { program } from 'commander';
@@ -24,7 +24,7 @@ program
24
24
  // guild init
25
25
  program
26
26
  .command('init')
27
- .description('Inicializar Guild v1 en el proyecto actual')
27
+ .description('Initialize Guild v1 in the current project')
28
28
  .action(async () => {
29
29
  try {
30
30
  const { runInit } = await import('../src/commands/init.js');
@@ -38,8 +38,8 @@ program
38
38
  // guild new-agent
39
39
  program
40
40
  .command('new-agent')
41
- .description('Crear un nuevo agente')
42
- .argument('<name>', 'Nombre del agente (lowercase, guiones)')
41
+ .description('Create a new agent')
42
+ .argument('<name>', 'Agent name (lowercase, hyphens)')
43
43
  .action(async (name) => {
44
44
  try {
45
45
  const { runNewAgent } = await import('../src/commands/new-agent.js');
@@ -53,7 +53,7 @@ program
53
53
  // guild status
54
54
  program
55
55
  .command('status')
56
- .description('Ver estado del proyecto Guild')
56
+ .description('View Guild project status')
57
57
  .action(async () => {
58
58
  try {
59
59
  const { runStatus } = await import('../src/commands/status.js');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "guild-agents",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "A multi-agent framework for Claude Code — specialized AI teams for every project",
5
5
  "type": "module",
6
6
  "files": [
@@ -50,9 +50,9 @@
50
50
  "url": "https://github.com/guild-agents/guild/issues"
51
51
  },
52
52
  "dependencies": {
53
- "@clack/prompts": "^0.9.0",
53
+ "@clack/prompts": "^1.0.1",
54
54
  "chalk": "^5.3.0",
55
- "commander": "^12.0.0",
55
+ "commander": "^14.0.3",
56
56
  "picocolors": "^1.0.0"
57
57
  },
58
58
  "engines": {
@@ -21,13 +21,13 @@ describe('runNewAgent', () => {
21
21
  it('should throw with invalid agent name', async () => {
22
22
  process.chdir(tempDir);
23
23
  const { runNewAgent } = await import('../new-agent.js');
24
- await expect(runNewAgent('Invalid Name!')).rejects.toThrow('Nombre invalido');
24
+ await expect(runNewAgent('Invalid Name!')).rejects.toThrow('Invalid name');
25
25
  });
26
26
 
27
27
  it('should throw when .claude/agents/ does not exist', async () => {
28
28
  process.chdir(tempDir);
29
29
  const { runNewAgent } = await import('../new-agent.js');
30
- await expect(runNewAgent('valid-name')).rejects.toThrow('Guild no esta instalado');
30
+ await expect(runNewAgent('valid-name')).rejects.toThrow('Guild is not installed');
31
31
  });
32
32
 
33
33
  it('should throw when agent already exists', async () => {
@@ -35,6 +35,6 @@ describe('runNewAgent', () => {
35
35
  mkdirSync(join(tempDir, '.claude', 'agents'), { recursive: true });
36
36
  writeFileSync(join(tempDir, '.claude', 'agents', 'existing.md'), '# existing');
37
37
  const { runNewAgent } = await import('../new-agent.js');
38
- await expect(runNewAgent('existing')).rejects.toThrow('ya existe');
38
+ await expect(runNewAgent('existing')).rejects.toThrow('already exists');
39
39
  });
40
40
  });
@@ -21,12 +21,12 @@ describe('runStatus', () => {
21
21
  it('should throw when PROJECT.md does not exist', async () => {
22
22
  process.chdir(tempDir);
23
23
  const { runStatus } = await import('../status.js');
24
- await expect(runStatus()).rejects.toThrow('Guild no esta instalado');
24
+ await expect(runStatus()).rejects.toThrow('Guild is not installed');
25
25
  });
26
26
 
27
27
  it('should not throw when PROJECT.md exists', async () => {
28
28
  process.chdir(tempDir);
29
- writeFileSync(join(tempDir, 'PROJECT.md'), '**Nombre:** TestProject\n**Stack:** Node.js');
29
+ writeFileSync(join(tempDir, 'PROJECT.md'), '**Name:** TestProject\n**Stack:** Node.js');
30
30
  mkdirSync(join(tempDir, '.claude', 'agents'), { recursive: true });
31
31
  mkdirSync(join(tempDir, '.claude', 'skills'), { recursive: true });
32
32
  const { runStatus } = await import('../status.js');
@@ -1,12 +1,12 @@
1
1
  /**
2
- * guild init — Onboarding interactivo v1
2
+ * guild init — Interactive onboarding v1
3
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
4
+ * Flow:
5
+ * 1. Verify that a Guild installation does not already exist
6
+ * 2. Collect: name, type, stack, GitHub, existing code
7
+ * 3. Generate PROJECT.md, CLAUDE.md, SESSION.md
8
+ * 4. Copy agents and skills
9
+ * 5. Instructions for /guild-specialize
10
10
  */
11
11
 
12
12
  import * as p from '@clack/prompts';
@@ -17,68 +17,68 @@ import { copyTemplates } from '../utils/files.js';
17
17
 
18
18
  export async function runInit() {
19
19
  console.log('');
20
- p.intro(chalk.bold.cyan('Guild v1 — Nuevo proyecto'));
20
+ p.intro(chalk.bold.cyan('Guild v1 — New project'));
21
21
 
22
- // Verificar instalacion existente
22
+ // Check for existing installation
23
23
  if (existsSync('.claude/agents')) {
24
24
  const overwrite = await p.confirm({
25
- message: 'Guild ya esta instalado en este proyecto. Reinicializar?',
25
+ message: 'Guild is already installed in this project. Reinitialize?',
26
26
  initialValue: false,
27
27
  });
28
28
 
29
29
  if (p.isCancel(overwrite) || !overwrite) {
30
- p.cancel('Cancelado.');
30
+ p.cancel('Cancelled.');
31
31
  return;
32
32
  }
33
33
  }
34
34
 
35
- // ─── Nombre ─────────────────────────────────────────────────────────────────
35
+ // ─── Name ─────────────────────────────────────────────────────────────────
36
36
  const name = await p.text({
37
- message: 'Nombre del proyecto:',
38
- placeholder: 'mi-proyecto',
37
+ message: 'Project name:',
38
+ placeholder: 'my-project',
39
39
  validate: (val) => {
40
- if (!val) return 'El nombre es requerido';
40
+ if (!val) return 'Name is required';
41
41
  },
42
42
  });
43
- if (p.isCancel(name)) { p.cancel('Cancelado.'); return; }
43
+ if (p.isCancel(name)) { p.cancel('Cancelled.'); return; }
44
44
 
45
- // ─── Tipo ───────────────────────────────────────────────────────────────────
45
+ // ─── Type ───────────────────────────────────────────────────────────────────
46
46
  const type = await p.select({
47
- message: 'Tipo de proyecto:',
47
+ message: 'Project type:',
48
48
  options: [
49
49
  { value: 'webapp', label: 'Web app (React/Vue/Angular)' },
50
50
  { value: 'api', label: 'API / Backend service' },
51
51
  { value: 'cli', label: 'CLI tool' },
52
52
  { value: 'mobile', label: 'Mobile (React Native)' },
53
- { value: 'fullstack', label: 'Otro / Fullstack' },
53
+ { value: 'fullstack', label: 'Other / Fullstack' },
54
54
  ],
55
55
  });
56
- if (p.isCancel(type)) { p.cancel('Cancelado.'); return; }
56
+ if (p.isCancel(type)) { p.cancel('Cancelled.'); return; }
57
57
 
58
58
  // ─── Stack ──────────────────────────────────────────────────────────────────
59
59
  const stack = await p.text({
60
- message: 'Stack principal:',
61
- placeholder: 'ej: Next.js, Supabase, Vercel',
60
+ message: 'Main stack:',
61
+ placeholder: 'e.g.: Next.js, Supabase, Vercel',
62
62
  validate: (val) => {
63
- if (!val) return 'El stack es requerido';
63
+ if (!val) return 'Stack is required';
64
64
  },
65
65
  });
66
- if (p.isCancel(stack)) { p.cancel('Cancelado.'); return; }
66
+ if (p.isCancel(stack)) { p.cancel('Cancelled.'); return; }
67
67
 
68
68
  // ─── GitHub ─────────────────────────────────────────────────────────────────
69
69
  let github = null;
70
70
  const hasRepo = await p.confirm({
71
- message: 'Tiene repositorio GitHub?',
71
+ message: 'Has a GitHub repository?',
72
72
  initialValue: true,
73
73
  });
74
74
 
75
75
  if (!p.isCancel(hasRepo) && hasRepo) {
76
76
  const repoUrl = await p.text({
77
- message: 'URL del repositorio:',
77
+ message: 'Repository URL:',
78
78
  placeholder: 'https://github.com/org/repo',
79
79
  validate: (val) => {
80
- if (!val) return 'La URL es requerida';
81
- if (!val.includes('github.com')) return 'Debe ser una URL de GitHub';
80
+ if (!val) return 'URL is required';
81
+ if (!val.includes('github.com')) return 'Must be a GitHub URL';
82
82
  },
83
83
  });
84
84
  if (!p.isCancel(repoUrl)) {
@@ -86,15 +86,15 @@ export async function runInit() {
86
86
  }
87
87
  }
88
88
 
89
- // ─── Codigo existente ───────────────────────────────────────────────────────
89
+ // ─── Existing code ────────────────────────────────────────────────────────
90
90
  const hasExistingCode = await p.confirm({
91
- message: 'Tiene codigo existente?',
91
+ message: 'Has existing code?',
92
92
  initialValue: true,
93
93
  });
94
94
 
95
- // ─── Generacion ─────────────────────────────────────────────────────────────
95
+ // ─── Generation ───────────────────────────────────────────────────────────
96
96
  const spinner = p.spinner();
97
- spinner.start('Generando estructura Guild v1...');
97
+ spinner.start('Generating Guild v1 structure...');
98
98
 
99
99
  const projectData = {
100
100
  name,
@@ -106,35 +106,35 @@ export async function runInit() {
106
106
 
107
107
  try {
108
108
  await copyTemplates();
109
- spinner.message('Generando CLAUDE.md...');
109
+ spinner.message('Generating CLAUDE.md...');
110
110
  await generateClaudeMd(projectData);
111
111
 
112
- spinner.message('Generando PROJECT.md...');
112
+ spinner.message('Generating PROJECT.md...');
113
113
  await generateProjectMd(projectData);
114
114
 
115
- spinner.message('Generando SESSION.md...');
115
+ spinner.message('Generating SESSION.md...');
116
116
  await generateSessionMd();
117
117
 
118
- spinner.stop('Estructura creada.');
118
+ spinner.stop('Structure created.');
119
119
  } catch (error) {
120
- spinner.stop('Error durante la inicializacion.');
120
+ spinner.stop('Error during initialization.');
121
121
  throw error;
122
122
  }
123
123
 
124
- // ─── Resumen ────────────────────────────────────────────────────────────────
124
+ // ─── Summary ──────────────────────────────────────────────────────────────
125
125
  p.log.success('CLAUDE.md');
126
126
  p.log.success('PROJECT.md');
127
127
  p.log.success('SESSION.md');
128
- p.log.success('.claude/agents/ (8 agentes base)');
128
+ p.log.success('.claude/agents/ (8 base agents)');
129
129
  p.log.success('.claude/skills/ (10 skills)');
130
130
 
131
131
  p.note(
132
- 'Abre Claude Code en este directorio y ejecuta:\n\n' +
132
+ 'Open Claude Code in this directory and run:\n\n' +
133
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'
134
+ 'This skill will explore your code and enrich CLAUDE.md\n' +
135
+ 'with the actual project information.',
136
+ 'Next step'
137
137
  );
138
138
 
139
- p.outro(chalk.bold.cyan('Guild v1 listo.'));
139
+ p.outro(chalk.bold.cyan('Guild v1 ready.'));
140
140
  }
@@ -1,12 +1,12 @@
1
1
  /**
2
- * new-agent.js — Crea un nuevo agente v1 (archivo plano)
2
+ * new-agent.js — Creates a new v1 agent (plain file)
3
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
4
+ * Flow:
5
+ * 1. Validate name (lowercase, hyphens, no spaces)
6
+ * 2. Verify that Guild is installed
7
+ * 3. Verify that the agent does NOT exist
8
+ * 4. Ask for agent description
9
+ * 5. Create .claude/agents/[name].md with placeholder
10
10
  */
11
11
 
12
12
  import * as p from '@clack/prompts';
@@ -17,35 +17,35 @@ import { join } from 'path';
17
17
  const AGENTS_DIR = join('.claude', 'agents');
18
18
 
19
19
  export async function runNewAgent(agentName) {
20
- p.intro(chalk.bold.cyan('Guild — Nuevo agente'));
20
+ p.intro(chalk.bold.cyan('Guild — New agent'));
21
21
 
22
- // Validar nombre
22
+ // Validate name
23
23
  if (!isValidAgentName(agentName)) {
24
- throw new Error(`Nombre invalido: "${agentName}". Solo lowercase, numeros y guiones. Ejemplo: guild new-agent security-auditor`);
24
+ throw new Error(`Invalid name: "${agentName}". Only lowercase, numbers, and hyphens allowed. Example: guild new-agent security-auditor`);
25
25
  }
26
26
 
27
- // Verificar Guild instalado
27
+ // Verify Guild is installed
28
28
  if (!existsSync(AGENTS_DIR)) {
29
- throw new Error('Guild no esta instalado. Ejecuta: guild init');
29
+ throw new Error('Guild is not installed. Run: guild init');
30
30
  }
31
31
 
32
- // Verificar que el agente NO existe
32
+ // Verify that the agent does NOT exist
33
33
  const agentPath = join(AGENTS_DIR, `${agentName}.md`);
34
34
  if (existsSync(agentPath)) {
35
- throw new Error(`El agente "${agentName}" ya existe.`);
35
+ throw new Error(`Agent "${agentName}" already exists.`);
36
36
  }
37
37
 
38
- // Pedir descripcion
38
+ // Ask for description
39
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,
40
+ message: `What does "${agentName}" do? (short description):`,
41
+ placeholder: 'e.g.: Evaluates trading opportunities based on technical analysis',
42
+ validate: (val) => !val ? 'Description is required' : undefined,
43
43
  });
44
- if (p.isCancel(description)) { p.cancel('Cancelado.'); return; }
44
+ if (p.isCancel(description)) { p.cancel('Cancelled.'); return; }
45
45
 
46
- // Crear agente
46
+ // Create agent
47
47
  const spinner = p.spinner();
48
- spinner.start(`Creando agente "${agentName}"...`);
48
+ spinner.start(`Creating agent "${agentName}"...`);
49
49
 
50
50
  try {
51
51
  const content = `---
@@ -55,34 +55,34 @@ description: "${description}"
55
55
 
56
56
  # ${agentName}
57
57
 
58
- Eres ${agentName} de [PROYECTO].
58
+ You are ${agentName} of [PROJECT].
59
59
 
60
- ## Responsabilidades
61
- [Definir con /guild-specialize]
60
+ ## Responsibilities
61
+ [Define with /guild-specialize]
62
62
 
63
- ## Lo que NO haces
64
- [Definir con /guild-specialize]
63
+ ## What you do NOT do
64
+ [Define with /guild-specialize]
65
65
 
66
- ## Proceso
67
- [Definir con /guild-specialize]
66
+ ## Process
67
+ [Define with /guild-specialize]
68
68
 
69
- ## Reglas de comportamiento
70
- - Siempre lee CLAUDE.md y SESSION.md al inicio de la sesion
69
+ ## Behavioral rules
70
+ - Always read CLAUDE.md and SESSION.md at the start of the session
71
71
  `;
72
72
 
73
73
  writeFileSync(agentPath, content, 'utf8');
74
74
 
75
- spinner.stop(`Agente "${agentName}" creado.`);
75
+ spinner.stop(`Agent "${agentName}" created.`);
76
76
 
77
- p.log.success(`Archivo: ${agentPath}`);
77
+ p.log.success(`File: ${agentPath}`);
78
78
  p.note(
79
- `Ejecuta /guild-specialize para que Claude\n` +
80
- `genere las instrucciones completas de "${agentName}".`,
81
- 'Especializacion pendiente'
79
+ `Run /guild-specialize so that Claude\n` +
80
+ `generates the full instructions for "${agentName}".`,
81
+ 'Specialization pending'
82
82
  );
83
- p.outro(chalk.bold.cyan(`Agente ${agentName} listo.`));
83
+ p.outro(chalk.bold.cyan(`Agent ${agentName} ready.`));
84
84
  } catch (error) {
85
- spinner.stop('Error al crear agente.');
85
+ spinner.stop('Error creating agent.');
86
86
  throw error;
87
87
  }
88
88
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * status.js — Muestra el estado actual del proyecto v1
2
+ * status.js — Shows the current project status v1
3
3
  */
4
4
 
5
5
  import * as p from '@clack/prompts';
@@ -9,13 +9,13 @@ import { join } from 'path';
9
9
 
10
10
  export async function runStatus() {
11
11
  if (!existsSync('PROJECT.md')) {
12
- throw new Error('Guild no esta instalado. Ejecuta: guild init');
12
+ throw new Error('Guild is not installed. Run: guild init');
13
13
  }
14
14
 
15
15
  const projectMd = readFileSync('PROJECT.md', 'utf8');
16
- const nameMatch = projectMd.match(/\*\*Nombre:\*\*\s*(.+)/);
16
+ const nameMatch = projectMd.match(/\*\*Name:\*\*\s*(.+)/);
17
17
  const stackMatch = projectMd.match(/\*\*Stack:\*\*\s*(.+)/);
18
- const projectName = nameMatch ? nameMatch[1].trim() : 'Proyecto';
18
+ const projectName = nameMatch ? nameMatch[1].trim() : 'Project';
19
19
 
20
20
  p.intro(chalk.bold.cyan(`Guild — ${projectName}`));
21
21
 
@@ -23,20 +23,20 @@ export async function runStatus() {
23
23
  p.log.info(chalk.gray(`Stack: ${stackMatch[1].trim()}`));
24
24
  }
25
25
 
26
- // Sesion activa
26
+ // Active session
27
27
  if (existsSync('SESSION.md')) {
28
- p.log.step('Sesion activa');
28
+ p.log.step('Active session');
29
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()}`);
30
+ const taskMatch = sessionMd.match(/\*\*Current task:\*\*\s*(.+)/);
31
+ const stateMatch = sessionMd.match(/\*\*Status:\*\*\s*(.+)/);
32
+ if (taskMatch && taskMatch[1].trim() !== '—') p.log.info(` Task: ${taskMatch[1].trim()}`);
33
33
  if (stateMatch) p.log.info(chalk.gray(` ${stateMatch[1].trim()}`));
34
34
  }
35
35
 
36
- // Agentes
36
+ // Agents
37
37
  const agentsDir = join('.claude', 'agents');
38
38
  if (existsSync(agentsDir)) {
39
- p.log.step('Agentes');
39
+ p.log.step('Agents');
40
40
  const agents = readdirSync(agentsDir)
41
41
  .filter(f => f.endsWith('.md'))
42
42
  .map(f => f.replace('.md', ''));
@@ -1,47 +1,47 @@
1
1
  ---
2
2
  name: advisor
3
- description: "Evalua ideas y da direccion estrategica antes de comprometer trabajo"
3
+ description: "Evaluates ideas and provides strategic direction before committing work"
4
4
  tools: Read, Glob, Grep
5
5
  permissionMode: plan
6
6
  ---
7
7
 
8
8
  # Advisor
9
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.
10
+ You are the domain guardian of [PROJECT]. Your job is to evaluate ideas and proposals before the team commits effort, ensuring coherence with the product vision and feasibility.
11
11
 
12
- ## Responsabilidades
12
+ ## Responsibilities
13
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
14
+ - Evaluate feature proposals and changes against the project vision
15
+ - Identify business risks, hidden dependencies, and conflicts with existing functionality
16
+ - Approve, reject, or request adjustments to ideas before they move to planning
17
+ - Detect scope creep and keep the project focused
18
+ - Validate that proposed priorities make strategic sense
19
19
 
20
- ## Lo que NO haces
20
+ ## What you do NOT do
21
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
22
+ - You do not define architecture or technical approach -- that is the Tech Lead's role
23
+ - You do not prioritize the backlog or write acceptance criteria -- that is the Product Owner's role
24
+ - You do not review code -- that is the Code Reviewer's role
25
+ - You do not implement anything -- that is the Developer's role
26
26
 
27
- ## Proceso
27
+ ## Process
28
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
29
+ 1. Read CLAUDE.md and SESSION.md to understand the current project state
30
+ 2. Analyze the proposal in the context of the domain and [PROJECT]'s vision
31
+ 3. Identify risks, dependencies, and conflicts
32
+ 4. Issue your evaluation using the output format
33
33
 
34
- ## Formato de salida
34
+ ## Output format
35
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
36
+ - **Evaluation**: Approved / Rejected / Requires adjustments
37
+ - **Reasoning**: Why this decision (2-3 sentences)
38
+ - **Suggested adjustments**: Concrete changes if applicable
39
+ - **Identified risks**: Prioritized list of risks
40
40
 
41
- ## Reglas de comportamiento
41
+ ## Behavior rules
42
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
43
+ - Always read CLAUDE.md and SESSION.md before evaluating
44
+ - Be concise -- the team needs decisions, not essays
45
+ - Ground every evaluation in concrete reasons, not vague opinions
46
+ - If you lack sufficient context, ask for clarification before evaluating
47
+ - Distinguish between real risks and personal preferences
@@ -1,50 +1,50 @@
1
1
  ---
2
2
  name: bugfix
3
- description: "Diagnostico y resolucion de bugs"
3
+ description: "Bug diagnosis and resolution"
4
4
  tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  permissionMode: bypassPermissions
6
6
  ---
7
7
 
8
8
  # Bugfix
9
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.
10
+ You are the bug diagnosis and resolution specialist for [PROJECT]. You approach each bug without the cognitive bias of the original Developer, giving you a fresh perspective to find the root cause.
11
11
 
12
- ## Responsabilidades
12
+ ## Responsibilities
13
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
14
+ - Reproduce the bug consistently before investigating
15
+ - Identify the root cause, not just the symptom
16
+ - Propose the minimal fix that resolves the problem without side effects
17
+ - Implement the fix and verify it does not introduce regressions
18
+ - Document the root cause to prevent similar bugs
19
19
 
20
- ## Lo que NO haces
20
+ ## What you do NOT do
21
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
22
+ - You do not implement new features -- that is the Developer's role
23
+ - You do not validate general behavior -- that is QA's role
24
+ - You do not investigate trivial compilation or syntax errors
25
+ - You do not define technical approach -- that is the Tech Lead's role
26
26
 
27
- ## Proceso
27
+ ## Process
28
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
29
+ 1. Read CLAUDE.md and SESSION.md to understand the project context
30
+ 2. Reproduce the bug with the exact steps from the report
31
+ 3. Investigate the root cause: trace the flow from symptom to origin
32
+ 4. Propose the minimal fix that resolves the problem
33
+ 5. Implement the fix
34
+ 6. Verify the bug is resolved and there are no regressions
35
35
 
36
- ## Formato de resolucion
36
+ ## Resolution format
37
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
38
+ - **Bug**: Description of the problem
39
+ - **Root cause**: What triggers it and why
40
+ - **Fix applied**: What was changed and why this approach
41
+ - **Verification**: How it was verified as resolved
42
+ - **Prevention**: What can be done to avoid similar bugs
43
43
 
44
- ## Reglas de comportamiento
44
+ ## Behavior rules
45
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
46
+ - Always read CLAUDE.md and SESSION.md before investigating
47
+ - Never assume the cause -- reproduce first, investigate after
48
+ - The fix must be minimal: resolve the bug, do not refactor the module
49
+ - If the fix requires large changes, escalate to the Tech Lead
50
+ - Document the root cause even if it seems obvious -- the team learns from bugs