guild-agents 0.0.1 → 0.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/LICENSE +21 -0
- package/README.md +149 -0
- package/bin/guild.js +52 -0
- package/package.json +59 -7
- package/src/commands/init.js +141 -0
- package/src/commands/new-agent.js +97 -0
- package/src/commands/status.js +58 -0
- package/src/templates/agents/advisor.md +45 -0
- package/src/templates/agents/bugfix.md +48 -0
- package/src/templates/agents/code-reviewer.md +50 -0
- package/src/templates/agents/db-migration.md +48 -0
- package/src/templates/agents/developer.md +48 -0
- package/src/templates/agents/product-owner.md +49 -0
- package/src/templates/agents/qa.md +48 -0
- package/src/templates/agents/tech-lead.md +48 -0
- package/src/templates/skills/build-feature/SKILL.md +114 -0
- package/src/templates/skills/council/SKILL.md +113 -0
- package/src/templates/skills/dev-flow/SKILL.md +55 -0
- package/src/templates/skills/guild-specialize/SKILL.md +113 -0
- package/src/templates/skills/new-feature/SKILL.md +59 -0
- package/src/templates/skills/qa-cycle/SKILL.md +54 -0
- package/src/templates/skills/review/SKILL.md +48 -0
- package/src/templates/skills/session-end/SKILL.md +54 -0
- package/src/templates/skills/session-start/SKILL.md +53 -0
- package/src/templates/skills/status/SKILL.md +62 -0
- package/src/utils/files.js +82 -0
- package/src/utils/generators.js +104 -0
- package/src/utils/github.js +126 -0
- package/index.js +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 guild-agents
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Guild
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/guild-agents)
|
|
4
|
+
[](https://github.com/guild-agents/guild/actions/workflows/ci.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
|
|
8
|
+
A multi-agent framework for Claude Code.
|
|
9
|
+
|
|
10
|
+
Sets up 8 specialized agents and 10 skill-based workflows as `.claude/` files in any project.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g guild-agents
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Or run directly without installing:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx guild-agents init
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx guild-agents init
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Interactive onboarding asks for project name, type, stack, and repo details, then generates the full agent and skill structure.
|
|
31
|
+
|
|
32
|
+
Open Claude Code in your project and run:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
/guild-specialize
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This explores your actual codebase and enriches CLAUDE.md with real conventions, patterns, and stack details.
|
|
39
|
+
|
|
40
|
+
Then start building:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
/build-feature Add user authentication with JWT
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This runs the full pipeline: evaluation, spec, implementation, review, and QA.
|
|
47
|
+
|
|
48
|
+
`guild init` generates: CLAUDE.md, PROJECT.md, SESSION.md, `.claude/agents/` (8 agents), `.claude/skills/` (10 skills).
|
|
49
|
+
|
|
50
|
+
## How It Works
|
|
51
|
+
|
|
52
|
+
**Agents** are the WHO. Each agent is a flat `.md` file in `.claude/agents/` that defines identity, responsibilities, and process. Skills invoke agents via the Task tool when their expertise is needed.
|
|
53
|
+
|
|
54
|
+
**Skills** are the HOW. Each skill is a workflow defined in `.claude/skills/*/SKILL.md` and invoked as a slash command. Skills orchestrate one or more agents through a structured process.
|
|
55
|
+
|
|
56
|
+
**State** is maintained across sessions through three files:
|
|
57
|
+
- `CLAUDE.md` — central enriched context (stack, conventions, rules)
|
|
58
|
+
- `PROJECT.md` — project metadata (name, type, architecture)
|
|
59
|
+
- `SESSION.md` — session continuity (current task, progress, next steps)
|
|
60
|
+
|
|
61
|
+
After init, agents are generic. Running `/guild-specialize` reads the real codebase and tailors each agent to the project's specific stack and patterns.
|
|
62
|
+
|
|
63
|
+
## Agents
|
|
64
|
+
|
|
65
|
+
| Agent | Role |
|
|
66
|
+
|---|---|
|
|
67
|
+
| advisor | Evaluates ideas and provides strategic direction |
|
|
68
|
+
| product-owner | Turns approved ideas into concrete tasks |
|
|
69
|
+
| tech-lead | Defines technical approach and architecture |
|
|
70
|
+
| developer | Implements features following project conventions |
|
|
71
|
+
| code-reviewer | Reviews quality, patterns, and technical debt |
|
|
72
|
+
| qa | Testing, edge cases, regression validation |
|
|
73
|
+
| bugfix | Bug diagnosis and resolution |
|
|
74
|
+
| db-migration | Schema changes and safe migrations |
|
|
75
|
+
|
|
76
|
+
## Skills
|
|
77
|
+
|
|
78
|
+
| Skill | Description |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `/guild-specialize` | Explores codebase, enriches CLAUDE.md with real stack and conventions |
|
|
81
|
+
| `/build-feature` | Full pipeline: evaluation, spec, implementation, review, QA |
|
|
82
|
+
| `/new-feature` | Creates branch and scaffold for a new feature |
|
|
83
|
+
| `/council` | Convenes multiple agents to debate a decision |
|
|
84
|
+
| `/qa-cycle` | QA and bugfix loop until clean |
|
|
85
|
+
| `/review` | Code review on the current diff |
|
|
86
|
+
| `/dev-flow` | Shows current pipeline phase and next step |
|
|
87
|
+
| `/status` | Project and session state overview |
|
|
88
|
+
| `/session-start` | Loads context and resumes work |
|
|
89
|
+
| `/session-end` | Saves state to SESSION.md |
|
|
90
|
+
|
|
91
|
+
## CLI Commands
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
guild init # Interactive project onboarding
|
|
95
|
+
guild new-agent <name> # Create a custom agent
|
|
96
|
+
guild status # Show project status
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Generated Structure
|
|
100
|
+
|
|
101
|
+
Running `guild init` creates the following in your project root:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
CLAUDE.md
|
|
105
|
+
PROJECT.md
|
|
106
|
+
SESSION.md
|
|
107
|
+
.claude/
|
|
108
|
+
agents/
|
|
109
|
+
advisor.md
|
|
110
|
+
product-owner.md
|
|
111
|
+
tech-lead.md
|
|
112
|
+
developer.md
|
|
113
|
+
code-reviewer.md
|
|
114
|
+
qa.md
|
|
115
|
+
bugfix.md
|
|
116
|
+
db-migration.md
|
|
117
|
+
skills/
|
|
118
|
+
guild-specialize/SKILL.md
|
|
119
|
+
build-feature/SKILL.md
|
|
120
|
+
new-feature/SKILL.md
|
|
121
|
+
council/SKILL.md
|
|
122
|
+
qa-cycle/SKILL.md
|
|
123
|
+
review/SKILL.md
|
|
124
|
+
dev-flow/SKILL.md
|
|
125
|
+
status/SKILL.md
|
|
126
|
+
session-start/SKILL.md
|
|
127
|
+
session-end/SKILL.md
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
All files are markdown, tracked by git, and work fully offline.
|
|
131
|
+
|
|
132
|
+
## Requirements
|
|
133
|
+
|
|
134
|
+
- Node.js >= 18
|
|
135
|
+
- Claude Code
|
|
136
|
+
- `gh` CLI (optional, for GitHub integration)
|
|
137
|
+
|
|
138
|
+
## Contributing
|
|
139
|
+
|
|
140
|
+
Two types of contributions:
|
|
141
|
+
|
|
142
|
+
- **Agent and skill templates** (`src/templates/`) — improve agent definitions or skill workflows.
|
|
143
|
+
- **CLI code** (`src/`, `bin/`) — bug fixes, new commands, onboarding improvements.
|
|
144
|
+
|
|
145
|
+
See [CONTRIBUTING.md](.github/CONTRIBUTING.md) for details.
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
MIT — see [LICENSE](LICENSE).
|
package/bin/guild.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Guild v1 — CLI entry point
|
|
5
|
+
* Usage:
|
|
6
|
+
* guild init — onboarding interactivo v1
|
|
7
|
+
* guild new-agent — crear un nuevo agente
|
|
8
|
+
* guild status — ver estado del proyecto
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { program } from 'commander';
|
|
12
|
+
import { readFileSync } from 'fs';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
18
|
+
|
|
19
|
+
program
|
|
20
|
+
.name('guild')
|
|
21
|
+
.description('Multi-agent framework for Claude Code')
|
|
22
|
+
.version(pkg.version);
|
|
23
|
+
|
|
24
|
+
// guild init
|
|
25
|
+
program
|
|
26
|
+
.command('init')
|
|
27
|
+
.description('Inicializar Guild v1 en el proyecto actual')
|
|
28
|
+
.action(async () => {
|
|
29
|
+
const { runInit } = await import('../src/commands/init.js');
|
|
30
|
+
await runInit();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// guild new-agent
|
|
34
|
+
program
|
|
35
|
+
.command('new-agent')
|
|
36
|
+
.description('Crear un nuevo agente')
|
|
37
|
+
.argument('<name>', 'Nombre del agente (lowercase, guiones)')
|
|
38
|
+
.action(async (name) => {
|
|
39
|
+
const { runNewAgent } = await import('../src/commands/new-agent.js');
|
|
40
|
+
await runNewAgent(name);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// guild status
|
|
44
|
+
program
|
|
45
|
+
.command('status')
|
|
46
|
+
.description('Ver estado del proyecto Guild')
|
|
47
|
+
.action(async () => {
|
|
48
|
+
const { runStatus } = await import('../src/commands/status.js');
|
|
49
|
+
await runStatus();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
program.parse();
|
package/package.json
CHANGED
|
@@ -1,13 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "guild-agents",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "A multi-agent framework for Claude Code",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A multi-agent framework for Claude Code — specialized AI teams for every project",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"bin/",
|
|
8
|
+
"src/commands/",
|
|
9
|
+
"src/templates/",
|
|
10
|
+
"src/utils/",
|
|
11
|
+
"!src/utils/__tests__/"
|
|
12
|
+
],
|
|
13
|
+
"bin": {
|
|
14
|
+
"guild": "./bin/guild.js"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"test:coverage": "vitest run --coverage",
|
|
20
|
+
"lint": "eslint src/",
|
|
21
|
+
"dev": "node bin/guild.js",
|
|
22
|
+
"prepublishOnly": "npm test && npm run lint"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"claude",
|
|
26
|
+
"claude-code",
|
|
27
|
+
"agents",
|
|
28
|
+
"ai",
|
|
29
|
+
"workflow",
|
|
30
|
+
"multi-agent",
|
|
31
|
+
"developer-tools",
|
|
32
|
+
"cli",
|
|
33
|
+
"framework",
|
|
34
|
+
"anthropic",
|
|
35
|
+
"ai-agents",
|
|
36
|
+
"automation",
|
|
37
|
+
"code-review",
|
|
38
|
+
"nodejs"
|
|
39
|
+
],
|
|
40
|
+
"author": "",
|
|
8
41
|
"license": "MIT",
|
|
9
42
|
"repository": {
|
|
10
43
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/guild-
|
|
44
|
+
"url": "git+https://github.com/guild-agents/guild.git"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/guild-agents/guild",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/guild-agents/guild/issues"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@clack/prompts": "^0.9.0",
|
|
52
|
+
"chalk": "^5.3.0",
|
|
53
|
+
"commander": "^12.0.0",
|
|
54
|
+
"fs-extra": "^11.2.0",
|
|
55
|
+
"picocolors": "^1.0.0"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18.0.0"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@eslint/js": "^10.0.1",
|
|
62
|
+
"eslint": "^10.0.1",
|
|
63
|
+
"vitest": "^4.0.18"
|
|
12
64
|
}
|
|
13
|
-
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
process.exit(0);
|
|
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.'); process.exit(0); }
|
|
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.'); process.exit(0); }
|
|
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.'); process.exit(0); }
|
|
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
|
+
p.log.error(error.message);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ─── Resumen ────────────────────────────────────────────────────────────────
|
|
126
|
+
p.log.success('CLAUDE.md');
|
|
127
|
+
p.log.success('PROJECT.md');
|
|
128
|
+
p.log.success('SESSION.md');
|
|
129
|
+
p.log.success('.claude/agents/ (8 agentes base)');
|
|
130
|
+
p.log.success('.claude/skills/ (10 skills)');
|
|
131
|
+
|
|
132
|
+
p.note(
|
|
133
|
+
'Abre Claude Code en este directorio y ejecuta:\n\n' +
|
|
134
|
+
' /guild-specialize\n\n' +
|
|
135
|
+
'Este skill explorara tu codigo y enriquecera CLAUDE.md\n' +
|
|
136
|
+
'con la informacion real del proyecto.',
|
|
137
|
+
'Siguiente paso'
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
p.outro(chalk.bold.cyan('Guild v1 listo.'));
|
|
141
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
p.log.error(`Nombre invalido: "${agentName}". Solo lowercase, numeros y guiones.`);
|
|
25
|
+
p.log.info('Ejemplo: guild new-agent security-auditor');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Verificar Guild instalado
|
|
30
|
+
if (!existsSync(AGENTS_DIR)) {
|
|
31
|
+
p.log.error('Guild no esta instalado. Ejecuta: guild init');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Verificar que el agente NO existe
|
|
36
|
+
const agentPath = join(AGENTS_DIR, `${agentName}.md`);
|
|
37
|
+
if (existsSync(agentPath)) {
|
|
38
|
+
p.log.error(`El agente "${agentName}" ya existe.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Pedir descripcion
|
|
43
|
+
const description = await p.text({
|
|
44
|
+
message: `Que hace "${agentName}"? (descripcion corta):`,
|
|
45
|
+
placeholder: 'ej: Evalua oportunidades de trading basado en analisis tecnico',
|
|
46
|
+
validate: (val) => !val ? 'La descripcion es requerida' : undefined,
|
|
47
|
+
});
|
|
48
|
+
if (p.isCancel(description)) { p.cancel('Cancelado.'); process.exit(0); }
|
|
49
|
+
|
|
50
|
+
// Crear agente
|
|
51
|
+
const spinner = p.spinner();
|
|
52
|
+
spinner.start(`Creando agente "${agentName}"...`);
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const content = `---
|
|
56
|
+
name: ${agentName}
|
|
57
|
+
description: "${description}"
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
# ${agentName}
|
|
61
|
+
|
|
62
|
+
Eres ${agentName} de [PROYECTO].
|
|
63
|
+
|
|
64
|
+
## Responsabilidades
|
|
65
|
+
[Definir con /guild-specialize]
|
|
66
|
+
|
|
67
|
+
## Lo que NO haces
|
|
68
|
+
[Definir con /guild-specialize]
|
|
69
|
+
|
|
70
|
+
## Proceso
|
|
71
|
+
[Definir con /guild-specialize]
|
|
72
|
+
|
|
73
|
+
## Reglas de comportamiento
|
|
74
|
+
- Siempre lee CLAUDE.md y SESSION.md al inicio de la sesion
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
writeFileSync(agentPath, content, 'utf8');
|
|
78
|
+
|
|
79
|
+
spinner.stop(`Agente "${agentName}" creado.`);
|
|
80
|
+
|
|
81
|
+
p.log.success(`Archivo: ${agentPath}`);
|
|
82
|
+
p.note(
|
|
83
|
+
`Ejecuta /guild-specialize para que Claude\n` +
|
|
84
|
+
`genere las instrucciones completas de "${agentName}".`,
|
|
85
|
+
'Especializacion pendiente'
|
|
86
|
+
);
|
|
87
|
+
p.outro(chalk.bold.cyan(`Agente ${agentName} listo.`));
|
|
88
|
+
} catch (error) {
|
|
89
|
+
spinner.stop('Error al crear agente.');
|
|
90
|
+
p.log.error(error.message);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function isValidAgentName(name) {
|
|
96
|
+
return /^[a-z][a-z0-9-]*$/.test(name);
|
|
97
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
p.log.error('Guild no esta instalado. Ejecuta: guild init');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const projectMd = readFileSync('PROJECT.md', 'utf8');
|
|
17
|
+
const nameMatch = projectMd.match(/\*\*Nombre:\*\*\s*(.+)/);
|
|
18
|
+
const stackMatch = projectMd.match(/\*\*Stack:\*\*\s*(.+)/);
|
|
19
|
+
const projectName = nameMatch ? nameMatch[1].trim() : 'Proyecto';
|
|
20
|
+
|
|
21
|
+
p.intro(chalk.bold.cyan(`Guild — ${projectName}`));
|
|
22
|
+
|
|
23
|
+
if (stackMatch) {
|
|
24
|
+
p.log.info(chalk.gray(`Stack: ${stackMatch[1].trim()}`));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Sesion activa
|
|
28
|
+
if (existsSync('SESSION.md')) {
|
|
29
|
+
p.log.step('Sesion activa');
|
|
30
|
+
const sessionMd = readFileSync('SESSION.md', 'utf8');
|
|
31
|
+
const taskMatch = sessionMd.match(/\*\*Tarea en curso:\*\*\s*(.+)/);
|
|
32
|
+
const stateMatch = sessionMd.match(/\*\*Estado:\*\*\s*(.+)/);
|
|
33
|
+
if (taskMatch && taskMatch[1].trim() !== '—') p.log.info(` Tarea: ${taskMatch[1].trim()}`);
|
|
34
|
+
if (stateMatch) p.log.info(chalk.gray(` ${stateMatch[1].trim()}`));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Agentes
|
|
38
|
+
const agentsDir = join('.claude', 'agents');
|
|
39
|
+
if (existsSync(agentsDir)) {
|
|
40
|
+
p.log.step('Agentes');
|
|
41
|
+
const agents = readdirSync(agentsDir)
|
|
42
|
+
.filter(f => f.endsWith('.md'))
|
|
43
|
+
.map(f => f.replace('.md', ''));
|
|
44
|
+
p.log.info(chalk.gray(` ${agents.join(', ')}`));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Skills
|
|
48
|
+
const skillsDir = join('.claude', 'skills');
|
|
49
|
+
if (existsSync(skillsDir)) {
|
|
50
|
+
p.log.step('Skills');
|
|
51
|
+
const skills = readdirSync(skillsDir, { withFileTypes: true })
|
|
52
|
+
.filter(d => d.isDirectory())
|
|
53
|
+
.map(d => d.name);
|
|
54
|
+
p.log.info(chalk.gray(` ${skills.join(', ')}`));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
p.outro('');
|
|
58
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: advisor
|
|
3
|
+
description: "Evalua ideas y da direccion estrategica antes de comprometer trabajo"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Advisor
|
|
7
|
+
|
|
8
|
+
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.
|
|
9
|
+
|
|
10
|
+
## Responsabilidades
|
|
11
|
+
|
|
12
|
+
- Evaluar propuestas de features y cambios contra la vision del proyecto
|
|
13
|
+
- Identificar riesgos de negocio, dependencias ocultas y conflictos con funcionalidad existente
|
|
14
|
+
- Aprobar, rechazar o ajustar ideas antes de que pasen a planificacion
|
|
15
|
+
- Detectar scope creep y mantener el foco del proyecto
|
|
16
|
+
- Validar que las prioridades propuestas tienen sentido estrategico
|
|
17
|
+
|
|
18
|
+
## Lo que NO haces
|
|
19
|
+
|
|
20
|
+
- No defines arquitectura ni approach tecnico — eso es del Tech Lead
|
|
21
|
+
- No priorizas backlog ni escribes criterios de aceptacion — eso es del Product Owner
|
|
22
|
+
- No revisas codigo — eso es del Code Reviewer
|
|
23
|
+
- No implementas nada — eso es del Developer
|
|
24
|
+
|
|
25
|
+
## Proceso
|
|
26
|
+
|
|
27
|
+
1. Lee CLAUDE.md y SESSION.md para entender el estado actual del proyecto
|
|
28
|
+
2. Analiza la propuesta en contexto del dominio y la vision de [PROYECTO]
|
|
29
|
+
3. Identifica riesgos, dependencias y conflictos
|
|
30
|
+
4. Emite tu evaluacion con el formato de salida
|
|
31
|
+
|
|
32
|
+
## Formato de salida
|
|
33
|
+
|
|
34
|
+
- **Evaluacion**: Aprobado / Rechazado / Requiere ajustes
|
|
35
|
+
- **Razonamiento**: Por que esta decision (2-3 oraciones)
|
|
36
|
+
- **Ajustes sugeridos**: Cambios concretos si aplica
|
|
37
|
+
- **Riesgos identificados**: Lista priorizada de riesgos
|
|
38
|
+
|
|
39
|
+
## Reglas de comportamiento
|
|
40
|
+
|
|
41
|
+
- Siempre lee CLAUDE.md y SESSION.md antes de evaluar
|
|
42
|
+
- Se conciso — el equipo necesita decisiones, no ensayos
|
|
43
|
+
- Fundamenta cada evaluacion con razones concretas, no opiniones vagas
|
|
44
|
+
- Si no tienes suficiente contexto, pide clarificacion antes de evaluar
|
|
45
|
+
- Distingue entre riesgos reales y preferencias personales
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bugfix
|
|
3
|
+
description: "Diagnostico y resolucion de bugs"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bugfix
|
|
7
|
+
|
|
8
|
+
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.
|
|
9
|
+
|
|
10
|
+
## Responsabilidades
|
|
11
|
+
|
|
12
|
+
- Reproducir el bug de forma consistente antes de investigar
|
|
13
|
+
- Identificar la causa raiz, no solo el sintoma
|
|
14
|
+
- Proponer el fix minimo que resuelve el problema sin efectos secundarios
|
|
15
|
+
- Implementar la correccion y verificar que no introduce regresiones
|
|
16
|
+
- Documentar la causa raiz para prevenir bugs similares
|
|
17
|
+
|
|
18
|
+
## Lo que NO haces
|
|
19
|
+
|
|
20
|
+
- No implementas features nuevas — eso es del Developer
|
|
21
|
+
- No validas comportamiento general — eso es de QA
|
|
22
|
+
- No investigas errores triviales de compilacion o sintaxis
|
|
23
|
+
- No defines approach tecnico — eso es del Tech Lead
|
|
24
|
+
|
|
25
|
+
## Proceso
|
|
26
|
+
|
|
27
|
+
1. Lee CLAUDE.md y SESSION.md para entender el contexto del proyecto
|
|
28
|
+
2. Reproduce el bug con los pasos exactos del reporte
|
|
29
|
+
3. Investiga la causa raiz: traza el flujo desde el sintoma hasta el origen
|
|
30
|
+
4. Propone el fix minimo que resuelve el problema
|
|
31
|
+
5. Implementa la correccion
|
|
32
|
+
6. Verifica que el bug esta resuelto y no hay regresiones
|
|
33
|
+
|
|
34
|
+
## Formato de resolucion
|
|
35
|
+
|
|
36
|
+
- **Bug**: Descripcion del problema
|
|
37
|
+
- **Causa raiz**: Que lo provoca y por que
|
|
38
|
+
- **Fix aplicado**: Que se cambio y por que ese approach
|
|
39
|
+
- **Verificacion**: Como se verifico que esta resuelto
|
|
40
|
+
- **Prevencion**: Que se puede hacer para evitar bugs similares
|
|
41
|
+
|
|
42
|
+
## Reglas de comportamiento
|
|
43
|
+
|
|
44
|
+
- Siempre lee CLAUDE.md y SESSION.md antes de investigar
|
|
45
|
+
- Nunca asumas la causa — reproduce primero, investiga despues
|
|
46
|
+
- El fix debe ser minimo: resuelve el bug, no refactoriza el modulo
|
|
47
|
+
- Si el fix requiere cambios grandes, escala al Tech Lead
|
|
48
|
+
- Documenta la causa raiz aunque sea obvia — el equipo aprende de los bugs
|