claude-agent-framework 1.0.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/README.md +128 -0
- package/bin/claude-framework +3 -0
- package/framework/agents/design-lead.md +240 -0
- package/framework/agents/product-owner.md +179 -0
- package/framework/agents/tech-lead.md +226 -0
- package/framework/commands/ayuda.md +127 -0
- package/framework/commands/a/303/261adir.md +98 -0
- package/framework/commands/backup.md +397 -0
- package/framework/commands/cambiar.md +110 -0
- package/framework/commands/cloud.md +457 -0
- package/framework/commands/code.md +142 -0
- package/framework/commands/debug.md +334 -0
- package/framework/commands/deploy.md +383 -0
- package/framework/commands/deshacer.md +120 -0
- package/framework/commands/estado.md +218 -0
- package/framework/commands/explica.md +227 -0
- package/framework/commands/feature.md +120 -0
- package/framework/commands/git.md +427 -0
- package/framework/commands/historial.md +202 -0
- package/framework/commands/learn.md +408 -0
- package/framework/commands/movil.md +245 -0
- package/framework/commands/nuevo.md +118 -0
- package/framework/commands/plan.md +134 -0
- package/framework/commands/prd.md +113 -0
- package/framework/commands/probar.md +148 -0
- package/framework/commands/revisar.md +208 -0
- package/framework/commands/seeds.md +230 -0
- package/framework/commands/seguridad.md +226 -0
- package/framework/commands/tasks.md +157 -0
- package/framework/skills/architecture/algorithms.md +970 -0
- package/framework/skills/architecture/clean-code.md +1080 -0
- package/framework/skills/architecture/design-patterns.md +1984 -0
- package/framework/skills/architecture/functional-programming.md +972 -0
- package/framework/skills/architecture/solid.md +991 -0
- package/framework/skills/cloud/cloud-aws.md +848 -0
- package/framework/skills/cloud/cloud-azure.md +931 -0
- package/framework/skills/cloud/cloud-gcp.md +848 -0
- package/framework/skills/cloud/message-queues.md +1229 -0
- package/framework/skills/core/accessibility.md +401 -0
- package/framework/skills/core/api.md +474 -0
- package/framework/skills/core/authentication.md +306 -0
- package/framework/skills/core/authorization.md +388 -0
- package/framework/skills/core/background-jobs.md +341 -0
- package/framework/skills/core/caching.md +473 -0
- package/framework/skills/core/code-review.md +341 -0
- package/framework/skills/core/controllers.md +290 -0
- package/framework/skills/core/cua.md +285 -0
- package/framework/skills/core/documentation.md +472 -0
- package/framework/skills/core/file-uploads.md +351 -0
- package/framework/skills/core/hotwire-native.md +296 -0
- package/framework/skills/core/hotwire.md +278 -0
- package/framework/skills/core/i18n.md +334 -0
- package/framework/skills/core/imports-exports.md +750 -0
- package/framework/skills/core/infrastructure.md +337 -0
- package/framework/skills/core/models.md +228 -0
- package/framework/skills/core/notifications.md +672 -0
- package/framework/skills/core/payments.md +581 -0
- package/framework/skills/core/performance.md +361 -0
- package/framework/skills/core/rails-scaffold.md +131 -0
- package/framework/skills/core/search.md +518 -0
- package/framework/skills/core/security.md +565 -0
- package/framework/skills/core/seeds.md +307 -0
- package/framework/skills/core/seo.md +542 -0
- package/framework/skills/core/testing.md +393 -0
- package/framework/skills/core/views.md +260 -0
- package/framework/skills/core/websockets.md +564 -0
- package/framework/skills/data/advanced-sql.md +1204 -0
- package/framework/skills/data/nosql.md +1141 -0
- package/framework/skills/devops/containers-advanced.md +1237 -0
- package/framework/skills/devops/debugging.md +834 -0
- package/framework/skills/devops/git-workflow.md +752 -0
- package/framework/skills/devops/networking.md +932 -0
- package/framework/skills/devops/shell-scripting.md +1132 -0
- package/framework/sub-agents/architecture-patterns-agent.md +1450 -0
- package/framework/sub-agents/cloud-agent.md +677 -0
- package/framework/sub-agents/data.md +504 -0
- package/framework/sub-agents/debugging-agent.md +554 -0
- package/framework/sub-agents/devops.md +483 -0
- package/framework/sub-agents/docs.md +176 -0
- package/framework/sub-agents/frontend-dev.md +349 -0
- package/framework/sub-agents/git-workflow-agent.md +697 -0
- package/framework/sub-agents/integrations.md +630 -0
- package/framework/sub-agents/native-dev.md +434 -0
- package/framework/sub-agents/qa.md +138 -0
- package/framework/sub-agents/rails-dev.md +375 -0
- package/framework/sub-agents/security.md +526 -0
- package/framework/sub-agents/ui.md +437 -0
- package/framework/sub-agents/ux.md +284 -0
- package/framework/templates/api-spec.md +500 -0
- package/framework/templates/component-spec.md +248 -0
- package/framework/templates/feature.json +13 -0
- package/framework/templates/model-spec.md +318 -0
- package/framework/templates/prd-template.md +80 -0
- package/framework/templates/task-plan.md +122 -0
- package/framework/templates/task-user-story.md +52 -0
- package/framework/templates/technical-spec.md +260 -0
- package/framework/templates/user-story.md +95 -0
- package/package.json +42 -0
- package/project-templates/CLAUDE.md +42 -0
- package/project-templates/contexts/architecture.md +25 -0
- package/project-templates/contexts/conventions.md +46 -0
- package/project-templates/contexts/design-system.md +47 -0
- package/project-templates/contexts/requirements.md +38 -0
- package/project-templates/contexts/stack.md +30 -0
- package/project-templates/history/active/models.md +11 -0
- package/project-templates/history/changelog.md +15 -0
- package/project-templates/workspace/.gitkeep +0 -0
- package/src/cli.js +52 -0
- package/src/init.js +104 -0
- package/src/status.js +75 -0
- package/src/update.js +88 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Comando: /seeds
|
|
2
|
+
|
|
3
|
+
Genera datos de prueba realistas para la aplicación.
|
|
4
|
+
|
|
5
|
+
## Flujo de trabajo
|
|
6
|
+
|
|
7
|
+
### Paso 1: Analizar modelos existentes
|
|
8
|
+
|
|
9
|
+
1. Leer todos los modelos en `app/models/`
|
|
10
|
+
2. Identificar relaciones entre modelos
|
|
11
|
+
3. Determinar validaciones y restricciones
|
|
12
|
+
|
|
13
|
+
### Paso 2: Preguntar preferencias
|
|
14
|
+
|
|
15
|
+
"¿Cuántos datos de prueba quieres generar?"
|
|
16
|
+
- Mínimo (5-10 registros por modelo)
|
|
17
|
+
- Medio (20-50 registros por modelo)
|
|
18
|
+
- Extenso (100+ registros por modelo)
|
|
19
|
+
|
|
20
|
+
"¿Quieres un usuario de prueba específico?"
|
|
21
|
+
- Email: test@example.com
|
|
22
|
+
- Contraseña: password123
|
|
23
|
+
|
|
24
|
+
### Paso 3: Generar archivo de seeds
|
|
25
|
+
|
|
26
|
+
```ruby
|
|
27
|
+
# db/seeds.rb
|
|
28
|
+
|
|
29
|
+
puts "🌱 Iniciando seed de datos..."
|
|
30
|
+
|
|
31
|
+
# Limpiar datos existentes (en orden inverso de dependencias)
|
|
32
|
+
puts "Limpiando datos existentes..."
|
|
33
|
+
# [Modelos dependientes primero]
|
|
34
|
+
Comment.destroy_all
|
|
35
|
+
Article.destroy_all
|
|
36
|
+
User.destroy_all
|
|
37
|
+
|
|
38
|
+
# Crear usuario de prueba
|
|
39
|
+
puts "Creando usuario de prueba..."
|
|
40
|
+
test_user = User.create!(
|
|
41
|
+
email_address: "test@example.com",
|
|
42
|
+
password: "password123",
|
|
43
|
+
password_confirmation: "password123"
|
|
44
|
+
)
|
|
45
|
+
puts " ✅ Usuario de prueba: test@example.com / password123"
|
|
46
|
+
|
|
47
|
+
# Crear usuarios adicionales
|
|
48
|
+
puts "Creando usuarios..."
|
|
49
|
+
users = 10.times.map do |i|
|
|
50
|
+
User.create!(
|
|
51
|
+
email_address: Faker::Internet.unique.email,
|
|
52
|
+
password: "password123",
|
|
53
|
+
password_confirmation: "password123"
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
puts " ✅ #{users.count} usuarios creados"
|
|
57
|
+
|
|
58
|
+
# Crear artículos
|
|
59
|
+
puts "Creando artículos..."
|
|
60
|
+
all_users = [test_user] + users
|
|
61
|
+
article_count = 0
|
|
62
|
+
|
|
63
|
+
all_users.each do |user|
|
|
64
|
+
rand(3..8).times do
|
|
65
|
+
Article.create!(
|
|
66
|
+
title: Faker::Lorem.sentence(word_count: rand(4..8)),
|
|
67
|
+
body: Faker::Lorem.paragraphs(number: rand(3..8)).join("\n\n"),
|
|
68
|
+
published: [true, true, true, false].sample,
|
|
69
|
+
user: user,
|
|
70
|
+
created_at: Faker::Time.between(from: 6.months.ago, to: Time.current)
|
|
71
|
+
)
|
|
72
|
+
article_count += 1
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
puts " ✅ #{article_count} artículos creados"
|
|
76
|
+
|
|
77
|
+
# Crear comentarios
|
|
78
|
+
puts "Creando comentarios..."
|
|
79
|
+
comment_count = 0
|
|
80
|
+
|
|
81
|
+
Article.where(published: true).each do |article|
|
|
82
|
+
rand(0..10).times do
|
|
83
|
+
Comment.create!(
|
|
84
|
+
body: Faker::Lorem.paragraph(sentence_count: rand(1..4)),
|
|
85
|
+
user: all_users.sample,
|
|
86
|
+
article: article,
|
|
87
|
+
created_at: Faker::Time.between(from: article.created_at, to: Time.current)
|
|
88
|
+
)
|
|
89
|
+
comment_count += 1
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
puts " ✅ #{comment_count} comentarios creados"
|
|
93
|
+
|
|
94
|
+
# Resumen final
|
|
95
|
+
puts ""
|
|
96
|
+
puts "=" * 50
|
|
97
|
+
puts "🎉 Seed completado!"
|
|
98
|
+
puts "=" * 50
|
|
99
|
+
puts ""
|
|
100
|
+
puts "Resumen:"
|
|
101
|
+
puts " - Usuarios: #{User.count}"
|
|
102
|
+
puts " - Artículos: #{Article.count} (#{Article.where(published: true).count} publicados)"
|
|
103
|
+
puts " - Comentarios: #{Comment.count}"
|
|
104
|
+
puts ""
|
|
105
|
+
puts "Usuario de prueba:"
|
|
106
|
+
puts " 📧 Email: test@example.com"
|
|
107
|
+
puts " 🔑 Contraseña: password123"
|
|
108
|
+
puts ""
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Paso 4: Ejecutar seeds
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
rails db:seed
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Paso 5: Verificar datos
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
rails runner "puts 'Users: ' + User.count.to_s; puts 'Articles: ' + Article.count.to_s"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Paso 6: Mostrar resumen
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
# Datos de Prueba Generados
|
|
127
|
+
|
|
128
|
+
## Resumen
|
|
129
|
+
| Modelo | Cantidad |
|
|
130
|
+
|--------|----------|
|
|
131
|
+
| Users | 11 |
|
|
132
|
+
| Articles | 55 |
|
|
133
|
+
| Comments | 234 |
|
|
134
|
+
|
|
135
|
+
## Usuario de prueba
|
|
136
|
+
- **Email**: test@example.com
|
|
137
|
+
- **Contraseña**: password123
|
|
138
|
+
|
|
139
|
+
## Datos generados
|
|
140
|
+
Los datos incluyen:
|
|
141
|
+
- Usuarios con emails realistas
|
|
142
|
+
- Artículos con títulos y contenido variado
|
|
143
|
+
- Mezcla de artículos publicados y borradores
|
|
144
|
+
- Comentarios en artículos publicados
|
|
145
|
+
- Fechas distribuidas en los últimos 6 meses
|
|
146
|
+
|
|
147
|
+
## Comandos útiles
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Regenerar datos
|
|
151
|
+
rails db:seed
|
|
152
|
+
|
|
153
|
+
# Limpiar y regenerar
|
|
154
|
+
rails db:reset # Cuidado: borra todo
|
|
155
|
+
|
|
156
|
+
# Ver datos en consola
|
|
157
|
+
rails console
|
|
158
|
+
> User.all
|
|
159
|
+
> Article.published.count
|
|
160
|
+
```
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Variantes del comando
|
|
164
|
+
|
|
165
|
+
### `/seeds [modelo]`
|
|
166
|
+
Genera seeds solo para un modelo específico.
|
|
167
|
+
|
|
168
|
+
### `/seeds reset`
|
|
169
|
+
Limpia todos los datos y regenera.
|
|
170
|
+
|
|
171
|
+
### `/seeds add [n]`
|
|
172
|
+
Añade N registros más sin borrar existentes.
|
|
173
|
+
|
|
174
|
+
## Datos específicos por modelo
|
|
175
|
+
|
|
176
|
+
### Usuarios
|
|
177
|
+
```ruby
|
|
178
|
+
User.create!(
|
|
179
|
+
email_address: Faker::Internet.unique.email,
|
|
180
|
+
password: "password123",
|
|
181
|
+
# Si hay campos adicionales:
|
|
182
|
+
name: Faker::Name.name,
|
|
183
|
+
bio: Faker::Lorem.paragraph
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Contenido con texto
|
|
188
|
+
```ruby
|
|
189
|
+
Article.create!(
|
|
190
|
+
title: Faker::Book.title, # O Faker::Lorem.sentence
|
|
191
|
+
body: Faker::Markdown.sandwich(sentences: 6),
|
|
192
|
+
summary: Faker::Lorem.paragraph
|
|
193
|
+
)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Con fechas
|
|
197
|
+
```ruby
|
|
198
|
+
Event.create!(
|
|
199
|
+
name: Faker::Company.catch_phrase,
|
|
200
|
+
starts_at: Faker::Time.forward(days: 30),
|
|
201
|
+
ends_at: Faker::Time.forward(days: 60)
|
|
202
|
+
)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Con archivos (Active Storage)
|
|
206
|
+
```ruby
|
|
207
|
+
user = User.create!(...)
|
|
208
|
+
user.avatar.attach(
|
|
209
|
+
io: URI.open(Faker::Avatar.image),
|
|
210
|
+
filename: "avatar.jpg"
|
|
211
|
+
)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Con enums
|
|
215
|
+
```ruby
|
|
216
|
+
Order.create!(
|
|
217
|
+
status: Order::STATUSES.sample,
|
|
218
|
+
# o
|
|
219
|
+
status: [:pending, :processing, :completed].sample
|
|
220
|
+
)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Notas importantes
|
|
224
|
+
|
|
225
|
+
- Los seeds deben ser idempotentes (seguros de ejecutar múltiples veces)
|
|
226
|
+
- Usar `destroy_all` con cuidado en producción
|
|
227
|
+
- Faker genera datos en inglés por defecto
|
|
228
|
+
- Para datos en español: `Faker::Config.locale = 'es'`
|
|
229
|
+
- Siempre incluir un usuario de prueba conocido
|
|
230
|
+
- Los datos de prueba no deben ir a producción
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Comando: /seguridad
|
|
2
|
+
|
|
3
|
+
Ejecuta una auditoría de seguridad completa de la aplicación.
|
|
4
|
+
|
|
5
|
+
## Descripción
|
|
6
|
+
|
|
7
|
+
Este comando analiza la aplicación en busca de vulnerabilidades de seguridad, revisa la configuración, y genera un reporte detallado con recomendaciones.
|
|
8
|
+
|
|
9
|
+
## Proceso
|
|
10
|
+
|
|
11
|
+
### 1. Análisis estático con Brakeman
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Verificar si Brakeman está instalado
|
|
15
|
+
bundle show brakeman || bundle add brakeman --group development
|
|
16
|
+
|
|
17
|
+
# Ejecutar análisis
|
|
18
|
+
bundle exec brakeman -q -o tmp/brakeman-report.json -f json
|
|
19
|
+
bundle exec brakeman -o tmp/brakeman-report.html
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Auditoría de dependencias
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Verificar si bundler-audit está instalado
|
|
26
|
+
bundle show bundler-audit || bundle add bundler-audit --group development
|
|
27
|
+
|
|
28
|
+
# Actualizar base de datos de vulnerabilidades
|
|
29
|
+
bundle exec bundle-audit update
|
|
30
|
+
|
|
31
|
+
# Ejecutar auditoría
|
|
32
|
+
bundle exec bundle-audit check
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. Verificar configuración de seguridad
|
|
36
|
+
|
|
37
|
+
Revisar los siguientes archivos:
|
|
38
|
+
|
|
39
|
+
```ruby
|
|
40
|
+
# config/environments/production.rb
|
|
41
|
+
- [ ] config.force_ssl = true
|
|
42
|
+
- [ ] config.consider_all_requests_local = false
|
|
43
|
+
- [ ] config.hosts configurado
|
|
44
|
+
|
|
45
|
+
# config/initializers/content_security_policy.rb
|
|
46
|
+
- [ ] CSP configurado
|
|
47
|
+
|
|
48
|
+
# config/initializers/filter_parameter_logging.rb
|
|
49
|
+
- [ ] Parámetros sensibles filtrados
|
|
50
|
+
|
|
51
|
+
# config/initializers/session_store.rb
|
|
52
|
+
- [ ] Cookies seguras (secure, httponly, same_site)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4. Revisar autenticación
|
|
56
|
+
|
|
57
|
+
```ruby
|
|
58
|
+
# Verificar:
|
|
59
|
+
- [ ] has_secure_password implementado
|
|
60
|
+
- [ ] Validaciones de password (longitud, complejidad)
|
|
61
|
+
- [ ] Rate limiting en login
|
|
62
|
+
- [ ] Account lockout tras intentos fallidos
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 5. Revisar autorización
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
# Verificar:
|
|
69
|
+
- [ ] Pundit implementado
|
|
70
|
+
- [ ] after_action :verify_authorized en controllers
|
|
71
|
+
- [ ] Políticas restrictivas por defecto
|
|
72
|
+
- [ ] verify_policy_scoped para index actions
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 6. Buscar patrones vulnerables
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# SQL Injection potencial
|
|
79
|
+
grep -rn "where.*\#{" app/ --include="*.rb"
|
|
80
|
+
grep -rn "\.find_by_sql" app/ --include="*.rb"
|
|
81
|
+
|
|
82
|
+
# XSS potencial
|
|
83
|
+
grep -rn "\.html_safe" app/ --include="*.rb"
|
|
84
|
+
grep -rn "raw(" app/ --include="*.erb"
|
|
85
|
+
grep -rn "<%= raw" app/ --include="*.erb"
|
|
86
|
+
|
|
87
|
+
# Mass assignment
|
|
88
|
+
grep -rn "permit!" app/ --include="*.rb"
|
|
89
|
+
|
|
90
|
+
# Hardcoded secrets
|
|
91
|
+
grep -rn "password\s*=" app/ --include="*.rb" | grep -v "password_digest"
|
|
92
|
+
grep -rn "api_key\s*=" app/ --include="*.rb"
|
|
93
|
+
grep -rn "secret" app/ --include="*.rb" | grep -v credentials
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 7. Verificar headers de seguridad
|
|
97
|
+
|
|
98
|
+
```ruby
|
|
99
|
+
# Hacer request y verificar headers
|
|
100
|
+
curl -I https://localhost:3000 2>/dev/null | grep -E "X-Frame|X-Content|X-XSS|Content-Security|Strict-Transport"
|
|
101
|
+
|
|
102
|
+
# Headers esperados:
|
|
103
|
+
# X-Frame-Options: DENY o SAMEORIGIN
|
|
104
|
+
# X-Content-Type-Options: nosniff
|
|
105
|
+
# X-XSS-Protection: 1; mode=block
|
|
106
|
+
# Content-Security-Policy: ...
|
|
107
|
+
# Strict-Transport-Security: max-age=...
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Output
|
|
111
|
+
|
|
112
|
+
### Reporte de seguridad
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
# Auditoría de Seguridad
|
|
116
|
+
Fecha: [fecha actual]
|
|
117
|
+
Proyecto: [nombre del proyecto]
|
|
118
|
+
|
|
119
|
+
## Resumen Ejecutivo
|
|
120
|
+
|
|
121
|
+
| Categoría | Estado |
|
|
122
|
+
|-----------|--------|
|
|
123
|
+
| Brakeman | ✅ / ⚠️ / ❌ |
|
|
124
|
+
| Dependencias | ✅ / ⚠️ / ❌ |
|
|
125
|
+
| Configuración | ✅ / ⚠️ / ❌ |
|
|
126
|
+
| Autenticación | ✅ / ⚠️ / ❌ |
|
|
127
|
+
| Autorización | ✅ / ⚠️ / ❌ |
|
|
128
|
+
| Headers | ✅ / ⚠️ / ❌ |
|
|
129
|
+
|
|
130
|
+
## Hallazgos por Severidad
|
|
131
|
+
|
|
132
|
+
### Críticos (requieren acción inmediata)
|
|
133
|
+
[Lista de hallazgos críticos]
|
|
134
|
+
|
|
135
|
+
### Altos (resolver pronto)
|
|
136
|
+
[Lista de hallazgos altos]
|
|
137
|
+
|
|
138
|
+
### Medios (planificar corrección)
|
|
139
|
+
[Lista de hallazgos medios]
|
|
140
|
+
|
|
141
|
+
### Bajos (mejoras recomendadas)
|
|
142
|
+
[Lista de hallazgos bajos]
|
|
143
|
+
|
|
144
|
+
## Detalles
|
|
145
|
+
|
|
146
|
+
### Brakeman
|
|
147
|
+
[Resumen de warnings encontrados]
|
|
148
|
+
|
|
149
|
+
### Dependencias vulnerables
|
|
150
|
+
[Lista de gems con vulnerabilidades conocidas]
|
|
151
|
+
|
|
152
|
+
### Configuración
|
|
153
|
+
[Problemas de configuración encontrados]
|
|
154
|
+
|
|
155
|
+
## Recomendaciones
|
|
156
|
+
|
|
157
|
+
1. [Recomendación prioritaria con pasos]
|
|
158
|
+
2. [Siguiente recomendación]
|
|
159
|
+
...
|
|
160
|
+
|
|
161
|
+
## Próximos pasos
|
|
162
|
+
|
|
163
|
+
- [ ] Corregir hallazgos críticos
|
|
164
|
+
- [ ] Actualizar dependencias vulnerables
|
|
165
|
+
- [ ] Implementar mejoras de configuración
|
|
166
|
+
- [ ] Programar siguiente auditoría
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Ejemplos de uso
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Usuario escribe:
|
|
173
|
+
/seguridad
|
|
174
|
+
|
|
175
|
+
# O en lenguaje natural:
|
|
176
|
+
"Revisa la seguridad de la app"
|
|
177
|
+
"Ejecuta una auditoría de seguridad"
|
|
178
|
+
"Busca vulnerabilidades"
|
|
179
|
+
"¿Es segura mi aplicación?"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Automatización
|
|
183
|
+
|
|
184
|
+
### GitHub Action para CI
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
# .github/workflows/security.yml
|
|
188
|
+
name: Security Audit
|
|
189
|
+
|
|
190
|
+
on:
|
|
191
|
+
push:
|
|
192
|
+
branches: [main]
|
|
193
|
+
pull_request:
|
|
194
|
+
branches: [main]
|
|
195
|
+
schedule:
|
|
196
|
+
- cron: '0 0 * * 1' # Lunes a medianoche
|
|
197
|
+
|
|
198
|
+
jobs:
|
|
199
|
+
security:
|
|
200
|
+
runs-on: ubuntu-latest
|
|
201
|
+
steps:
|
|
202
|
+
- uses: actions/checkout@v4
|
|
203
|
+
|
|
204
|
+
- name: Set up Ruby
|
|
205
|
+
uses: ruby/setup-ruby@v1
|
|
206
|
+
with:
|
|
207
|
+
ruby-version: '3.3'
|
|
208
|
+
bundler-cache: true
|
|
209
|
+
|
|
210
|
+
- name: Run Brakeman
|
|
211
|
+
run: |
|
|
212
|
+
gem install brakeman
|
|
213
|
+
brakeman -q -w2 --no-pager
|
|
214
|
+
|
|
215
|
+
- name: Run Bundle Audit
|
|
216
|
+
run: |
|
|
217
|
+
gem install bundler-audit
|
|
218
|
+
bundle-audit check --update
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Notas
|
|
222
|
+
|
|
223
|
+
- Ejecutar regularmente (al menos semanalmente)
|
|
224
|
+
- Revisar antes de cada deploy a producción
|
|
225
|
+
- Mantener dependencias actualizadas
|
|
226
|
+
- Documentar excepciones de seguridad aceptadas
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Comando: /tasks
|
|
2
|
+
|
|
3
|
+
Crea tareas (historias de usuario) a partir del PRD del feature siguiendo el **Principio de Independencia**.
|
|
4
|
+
|
|
5
|
+
## Argumentos
|
|
6
|
+
- `feature_id` (requerido): ID del feature (ej. 2025-12-19-143052-mi-feature)
|
|
7
|
+
|
|
8
|
+
## Principio: Independencia de Tareas
|
|
9
|
+
|
|
10
|
+
Cada tarea debe cumplir:
|
|
11
|
+
|
|
12
|
+
| Aspecto | Requisito |
|
|
13
|
+
|---------|-----------|
|
|
14
|
+
| **Independiente** | Puede implementarse sin depender de tareas no completadas |
|
|
15
|
+
| **Atómica** | Una sola funcionalidad por tarea |
|
|
16
|
+
| **Verificable** | Criterios de aceptación claros y testeables |
|
|
17
|
+
| **Estimable** | Tamaño razonable para una sesión de trabajo |
|
|
18
|
+
| **Ordenada** | Prioridad clara basada en dependencias y valor |
|
|
19
|
+
|
|
20
|
+
### Detección de Violaciones
|
|
21
|
+
|
|
22
|
+
**CRÍTICO**: Al generar tareas, detectar activamente:
|
|
23
|
+
|
|
24
|
+
1. **Dependencias Circulares**: Tarea A depende de B, B depende de A
|
|
25
|
+
2. **Tareas Muy Grandes**: Más de 5 criterios de aceptación
|
|
26
|
+
3. **Tareas Duplicadas**: Misma funcionalidad en diferentes tareas
|
|
27
|
+
4. **Conflictos con Otros Features**: Tareas que modifican los mismos archivos
|
|
28
|
+
|
|
29
|
+
**Si se encuentran violaciones, dividir o reorganizar las tareas.**
|
|
30
|
+
|
|
31
|
+
## Flujo de trabajo
|
|
32
|
+
|
|
33
|
+
### Fase 1: Localizar y Validar el Feature
|
|
34
|
+
|
|
35
|
+
1. Buscar en `features/{feature_id}/`
|
|
36
|
+
2. Verificar que existe `feature.json` y `prd.md`
|
|
37
|
+
3. Si falta el PRD, mostrar error y sugerir `/prd {feature_id}` primero
|
|
38
|
+
|
|
39
|
+
### Fase 2: Análisis de Tareas Existentes (OBLIGATORIO)
|
|
40
|
+
|
|
41
|
+
1. Listar todas las tareas en `features/*/tasks/*/`
|
|
42
|
+
2. Identificar tareas con status `defined`, `planned`, `in_progress`
|
|
43
|
+
3. Extraer archivos que planean modificar (de sus plan.md si existen)
|
|
44
|
+
|
|
45
|
+
**Crear matriz de conflictos potenciales:**
|
|
46
|
+
```
|
|
47
|
+
| Archivo/Recurso | Este Feature | Otro Feature | Conflicto? |
|
|
48
|
+
|-----------------|--------------|--------------|------------|
|
|
49
|
+
| users_controller.rb | Tarea 001 | feature-abc/002 | REVISAR |
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Fase 3: Leer y Analizar el PRD
|
|
53
|
+
|
|
54
|
+
1. Cargar `features/{feature_id}/prd.md`
|
|
55
|
+
2. Identificar los requisitos funcionales (RF-XX)
|
|
56
|
+
3. Entender el flujo de usuario
|
|
57
|
+
4. Identificar dependencias entre funcionalidades
|
|
58
|
+
5. Revisar el alcance (incluido vs excluido)
|
|
59
|
+
|
|
60
|
+
### Fase 4: Crear Carpeta de Tareas
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
mkdir -p features/{feature_id}/tasks/
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Fase 5: Generar Tareas
|
|
67
|
+
|
|
68
|
+
Aplicar criterios:
|
|
69
|
+
|
|
70
|
+
1. **Una tarea por requisito funcional principal**
|
|
71
|
+
2. **Ordenar por dependencias** (las base primero)
|
|
72
|
+
3. **IDs secuenciales**: 001, 002, 003...
|
|
73
|
+
4. **Slugs descriptivos**: `crear-comentario`, `responder-comentario`
|
|
74
|
+
|
|
75
|
+
### Fase 6: Crear Estructura de Cada Tarea
|
|
76
|
+
|
|
77
|
+
Para cada tarea, crear:
|
|
78
|
+
```
|
|
79
|
+
features/{feature_id}/tasks/{id}-{slug}/
|
|
80
|
+
features/{feature_id}/tasks/{id}-{slug}/user-story.md
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Usar el template de `.claude/templates/task-user-story.md`
|
|
84
|
+
|
|
85
|
+
### Fase 7: Actualizar feature.json
|
|
86
|
+
|
|
87
|
+
1. Agregar array `tasks` con cada tarea:
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"id": "001",
|
|
91
|
+
"slug": "crear-comentario",
|
|
92
|
+
"title": "Crear comentario en artículo",
|
|
93
|
+
"status": "defined",
|
|
94
|
+
"priority": 1,
|
|
95
|
+
"requisito": "RF-01",
|
|
96
|
+
"depends_on": []
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
2. Cambiar `status` a `"tasks_created"`
|
|
100
|
+
3. Cambiar `current_phase` a `"tasks"`
|
|
101
|
+
4. Actualizar `updated_at`
|
|
102
|
+
|
|
103
|
+
### Fase 8: Validar Tareas Creadas
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Verificar que existe al menos una tarea
|
|
107
|
+
ls features/{feature_id}/tasks/*/user-story.md | wc -l
|
|
108
|
+
|
|
109
|
+
# Verificar tamaño de tareas (máximo 5 criterios por tarea)
|
|
110
|
+
for story in features/{feature_id}/tasks/*/user-story.md; do
|
|
111
|
+
count=$(grep -c "^\- \[ \]" "$story")
|
|
112
|
+
if [ "$count" -gt 5 ]; then
|
|
113
|
+
echo "WARNING: $story tiene $count criterios (máximo recomendado: 5)"
|
|
114
|
+
fi
|
|
115
|
+
done
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Criterios de Priorización
|
|
119
|
+
|
|
120
|
+
| Prioridad | Descripción | Ejemplo |
|
|
121
|
+
|-----------|-------------|---------|
|
|
122
|
+
| **1** | Funcionalidad base necesaria para otras tareas | Modelo de datos |
|
|
123
|
+
| **2** | Funcionalidad de alto valor para el usuario | CRUD principal |
|
|
124
|
+
| **3** | Funcionalidades complementarias o de mejora | Validaciones extra |
|
|
125
|
+
| **4** | Funcionalidades opcionales o de bajo impacto | Mejoras de UX |
|
|
126
|
+
|
|
127
|
+
## Report
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Tareas generadas exitosamente!
|
|
131
|
+
|
|
132
|
+
Feature: {título}
|
|
133
|
+
Total: {N} tareas creadas
|
|
134
|
+
|
|
135
|
+
TAREAS:
|
|
136
|
+
001 - {título tarea 1} [defined] (RF-01) P1
|
|
137
|
+
Depende de: ninguna
|
|
138
|
+
002 - {título tarea 2} [defined] (RF-02) P1
|
|
139
|
+
Depende de: 001
|
|
140
|
+
003 - {título tarea 3} [defined] (RF-03) P2
|
|
141
|
+
Depende de: 001, 002
|
|
142
|
+
|
|
143
|
+
Conflictos detectados: {M}
|
|
144
|
+
- {descripción del conflicto si hay}
|
|
145
|
+
|
|
146
|
+
Siguiente paso:
|
|
147
|
+
/plan features/{feature_id}/tasks/001-{slug}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Consideraciones
|
|
151
|
+
|
|
152
|
+
- Las tareas deben ser independientes cuando sea posible
|
|
153
|
+
- Si hay dependencias, la tarea dependiente debe tener prioridad mayor (número mayor)
|
|
154
|
+
- Cada tarea debe ser lo suficientemente pequeña para completarse en una sesión
|
|
155
|
+
- Los criterios de aceptación deben ser verificables objetivamente
|
|
156
|
+
- Documentar conflictos con tareas de otros features
|
|
157
|
+
- Máximo 5 criterios de aceptación por tarea (dividir si hay más)
|