ndomo 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.
Files changed (247) hide show
  1. package/.bun-version +1 -0
  2. package/.dockerignore +79 -0
  3. package/.editorconfig +18 -0
  4. package/.env.example +19 -0
  5. package/.github/CODEOWNERS +8 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.yml +62 -0
  7. package/.github/ISSUE_TEMPLATE/config.yml +2 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.yml +34 -0
  9. package/.github/dependabot.yml +36 -0
  10. package/.github/pull_request_template.md +24 -0
  11. package/.github/release.yml +30 -0
  12. package/.github/workflows/gitleaks.yml +28 -0
  13. package/.github/workflows/release-please.yml +27 -0
  14. package/.github/workflows/smoke.yml +29 -0
  15. package/.husky/commit-msg +1 -0
  16. package/CHANGELOG.md +114 -0
  17. package/Dockerfile +32 -0
  18. package/README.es.md +174 -0
  19. package/README.md +187 -0
  20. package/agents/chronicler.md +98 -0
  21. package/agents/ci-smith.md +136 -0
  22. package/agents/craftsman.md +341 -0
  23. package/agents/deploy-smith.md +138 -0
  24. package/agents/foreman.md +377 -0
  25. package/agents/go-smith.md +164 -0
  26. package/agents/guild.md +188 -0
  27. package/agents/inspector.md +83 -0
  28. package/agents/js-smith.md +127 -0
  29. package/agents/ops-scout.md +173 -0
  30. package/agents/painter.md +200 -0
  31. package/agents/python-smith.md +120 -0
  32. package/agents/ranger.md +307 -0
  33. package/agents/release-smith.md +165 -0
  34. package/agents/rust-smith.md +159 -0
  35. package/agents/sage.md +178 -0
  36. package/agents/scout.md +144 -0
  37. package/agents/scribe.md +156 -0
  38. package/agents/smith.md +201 -0
  39. package/agents/vue-smith.md +155 -0
  40. package/agents/warden.md +216 -0
  41. package/agents/zig-smith.md +156 -0
  42. package/bin/ndomo-analyses.ts +4 -0
  43. package/bin/ndomo-status.ts +4 -0
  44. package/biome.json +57 -0
  45. package/bun.lock +514 -0
  46. package/commitlint.config.js +3 -0
  47. package/config/ndomo.config.json +258 -0
  48. package/config/ndomo.schema.json +166 -0
  49. package/docs/agents.md +375 -0
  50. package/docs/bugs/plan-create-orphan-fk.md +131 -0
  51. package/docs/bugs/task_create_batch-order-index-collision.md +158 -0
  52. package/docs/configuration.md +276 -0
  53. package/docs/database.md +364 -0
  54. package/docs/features/feature-flexible-builder-v1.md +724 -0
  55. package/docs/features/feature-flexible-builder-v2.md +882 -0
  56. package/docs/features/feature-flexible-builder.md +974 -0
  57. package/docs/http-server.md +244 -0
  58. package/docs/installation.md +259 -0
  59. package/docs/integrations.md +129 -0
  60. package/docs/operations/anti-pattern-sub-agent-verify-2026-06-21.md +32 -0
  61. package/docs/operations/audit-v1.md +417 -0
  62. package/docs/operations/audit-v2.md +197 -0
  63. package/docs/operations/audit-v3.md +306 -0
  64. package/docs/operations/db-optimize-foundations.md +123 -0
  65. package/docs/operations/verify-gate-architecture.md +82 -0
  66. package/docs/workflows.md +448 -0
  67. package/opencode.json +5 -0
  68. package/package.json +65 -0
  69. package/release-please-config.json +11 -0
  70. package/scripts/dev-bust-cache.sh +164 -0
  71. package/scripts/install.sh +688 -0
  72. package/scripts/smoke-e2e.ts +704 -0
  73. package/scripts/smoke-hot.ts +417 -0
  74. package/scripts/smoke-http.sh +228 -0
  75. package/scripts/smoke-v4.ts +256 -0
  76. package/scripts/smoke-v5.ts +397 -0
  77. package/scripts/smoke.sh +9 -0
  78. package/scripts/uninstall.sh +224 -0
  79. package/skills/api-security-best-practices/SKILL.md +915 -0
  80. package/skills/bash-scripting/SKILL.md +201 -0
  81. package/skills/bun/SKILL.md +313 -0
  82. package/skills/cavecrew/SKILL.md +82 -0
  83. package/skills/caveman/SKILL.md +74 -0
  84. package/skills/caveman-review/README.md +33 -0
  85. package/skills/caveman-review/SKILL.md +55 -0
  86. package/skills/find-skills/SKILL.md +142 -0
  87. package/skills/frontend-design/LICENSE.txt +177 -0
  88. package/skills/frontend-design/SKILL.md +55 -0
  89. package/skills/golang-patterns/SKILL.md +674 -0
  90. package/skills/golang-security/SKILL.md +185 -0
  91. package/skills/golang-security/evals/evals.json +595 -0
  92. package/skills/golang-security/references/architecture.md +268 -0
  93. package/skills/golang-security/references/checklist.md +80 -0
  94. package/skills/golang-security/references/cookies.md +200 -0
  95. package/skills/golang-security/references/cryptography.md +424 -0
  96. package/skills/golang-security/references/filesystem.md +285 -0
  97. package/skills/golang-security/references/injection.md +315 -0
  98. package/skills/golang-security/references/logging.md +163 -0
  99. package/skills/golang-security/references/memory-safety.md +241 -0
  100. package/skills/golang-security/references/network.md +253 -0
  101. package/skills/golang-security/references/secrets.md +189 -0
  102. package/skills/golang-security/references/third-party.md +159 -0
  103. package/skills/golang-security/references/threat-modeling.md +189 -0
  104. package/skills/golang-testing/SKILL.md +720 -0
  105. package/skills/grill-me/SKILL.md +7 -0
  106. package/skills/javascript-testing-patterns/SKILL.md +537 -0
  107. package/skills/javascript-testing-patterns/references/advanced-testing-patterns.md +513 -0
  108. package/skills/modern-javascript-patterns/SKILL.md +43 -0
  109. package/skills/modern-javascript-patterns/references/advanced-patterns.md +487 -0
  110. package/skills/modern-javascript-patterns/references/details.md +457 -0
  111. package/skills/python-anti-patterns/SKILL.md +349 -0
  112. package/skills/python-design-patterns/SKILL.md +85 -0
  113. package/skills/python-design-patterns/references/details.md +353 -0
  114. package/skills/python-error-handling/SKILL.md +193 -0
  115. package/skills/python-error-handling/references/details.md +171 -0
  116. package/skills/python-testing-patterns/SKILL.md +278 -0
  117. package/skills/python-testing-patterns/references/advanced-patterns.md +411 -0
  118. package/skills/python-testing-patterns/references/details.md +349 -0
  119. package/skills/rust-patterns/SKILL.md +500 -0
  120. package/skills/rust-testing/SKILL.md +501 -0
  121. package/skills/security-review/SKILL.md +504 -0
  122. package/skills/security-review/cloud-infrastructure-security.md +361 -0
  123. package/skills/vue-best-practices/SKILL.md +154 -0
  124. package/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
  125. package/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
  126. package/skills/vue-best-practices/references/component-async.md +97 -0
  127. package/skills/vue-best-practices/references/component-data-flow.md +307 -0
  128. package/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
  129. package/skills/vue-best-practices/references/component-keep-alive.md +137 -0
  130. package/skills/vue-best-practices/references/component-slots.md +216 -0
  131. package/skills/vue-best-practices/references/component-suspense.md +228 -0
  132. package/skills/vue-best-practices/references/component-teleport.md +108 -0
  133. package/skills/vue-best-practices/references/component-transition-group.md +128 -0
  134. package/skills/vue-best-practices/references/component-transition.md +125 -0
  135. package/skills/vue-best-practices/references/composables.md +290 -0
  136. package/skills/vue-best-practices/references/directives.md +162 -0
  137. package/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
  138. package/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
  139. package/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
  140. package/skills/vue-best-practices/references/plugins.md +166 -0
  141. package/skills/vue-best-practices/references/reactivity.md +344 -0
  142. package/skills/vue-best-practices/references/render-functions.md +201 -0
  143. package/skills/vue-best-practices/references/sfc.md +310 -0
  144. package/skills/vue-best-practices/references/state-management.md +135 -0
  145. package/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
  146. package/skills/vue-pinia-best-practices/SKILL.md +21 -0
  147. package/skills/vue-pinia-best-practices/reference/pinia-no-active-pinia-error.md +248 -0
  148. package/skills/vue-pinia-best-practices/reference/pinia-setup-store-return-all-state.md +227 -0
  149. package/skills/vue-pinia-best-practices/reference/pinia-store-destructuring-breaks-reactivity.md +193 -0
  150. package/skills/vue-pinia-best-practices/reference/state-url-for-ephemeral-filters.md +238 -0
  151. package/skills/vue-pinia-best-practices/reference/state-use-pinia-for-large-apps.md +262 -0
  152. package/skills/vue-pinia-best-practices/reference/store-method-binding-parentheses.md +191 -0
  153. package/skills/zig-0.16/SKILL.md +840 -0
  154. package/skills/zig-0.16/scripts/check-zig-version.sh +21 -0
  155. package/src/cli/analyses.ts +280 -0
  156. package/src/cli/index.ts +108 -0
  157. package/src/cli/serve.ts +192 -0
  158. package/src/cli/smoke.ts +131 -0
  159. package/src/cli/status.test.ts +204 -0
  160. package/src/cli/status.ts +263 -0
  161. package/src/cli/vacuum.test.ts +82 -0
  162. package/src/cli/vacuum.ts +96 -0
  163. package/src/config/schema.test.ts +88 -0
  164. package/src/config/schema.ts +64 -0
  165. package/src/db/analyses-migration.test.ts +210 -0
  166. package/src/db/analyses.test.ts +466 -0
  167. package/src/db/analyses.ts +375 -0
  168. package/src/db/auto-checkpoint.ts +131 -0
  169. package/src/db/client.test.ts +129 -0
  170. package/src/db/client.ts +55 -0
  171. package/src/db/fts-escape.ts +20 -0
  172. package/src/db/incidents.test.ts +201 -0
  173. package/src/db/incidents.ts +93 -0
  174. package/src/db/index.ts +86 -0
  175. package/src/db/migrations-v13.test.ts +141 -0
  176. package/src/db/migrations-v8.test.ts +301 -0
  177. package/src/db/migrations.ts +147 -0
  178. package/src/db/plan-archive.test.ts +180 -0
  179. package/src/db/plan-archive.ts +274 -0
  180. package/src/db/plan-create.test.ts +276 -0
  181. package/src/db/plan-create.ts +78 -0
  182. package/src/db/plan-files.test.ts +289 -0
  183. package/src/db/plan-update-status.ts +287 -0
  184. package/src/db/plans.test.ts +490 -0
  185. package/src/db/plans.ts +534 -0
  186. package/src/db/resolve-project-dir.test.ts +143 -0
  187. package/src/db/resolve-project-dir.ts +75 -0
  188. package/src/db/rollbacks.test.ts +150 -0
  189. package/src/db/rollbacks.ts +67 -0
  190. package/src/db/schema.ts +907 -0
  191. package/src/db/sessions.test.ts +80 -0
  192. package/src/db/sessions.ts +135 -0
  193. package/src/db/shutdown.test.ts +147 -0
  194. package/src/db/shutdown.ts +45 -0
  195. package/src/db/tasks.test.ts +921 -0
  196. package/src/db/tasks.ts +747 -0
  197. package/src/db/types.ts +619 -0
  198. package/src/http/__tests__/auth.test.ts +196 -0
  199. package/src/http/__tests__/routes.test.ts +465 -0
  200. package/src/http/__tests__/sse.test.ts +317 -0
  201. package/src/http/auth.ts +72 -0
  202. package/src/http/middleware/cors.ts +53 -0
  203. package/src/http/middleware/security-headers.ts +21 -0
  204. package/src/http/routes/events.ts +112 -0
  205. package/src/http/routes/health.ts +51 -0
  206. package/src/http/routes/plans.ts +66 -0
  207. package/src/http/routes/sessions.ts +50 -0
  208. package/src/http/routes/tasks.ts +60 -0
  209. package/src/http/server.ts +95 -0
  210. package/src/http/sse.ts +116 -0
  211. package/src/index.ts +37 -0
  212. package/src/lib.ts +65 -0
  213. package/src/mem/scoped.ts +65 -0
  214. package/src/orchestrator/background.test.ts +268 -0
  215. package/src/orchestrator/background.ts +293 -0
  216. package/src/orchestrator/memory-hook.ts +182 -0
  217. package/src/orchestrator/reconciler.ts +123 -0
  218. package/src/orchestrator/scheduler.test.ts +300 -0
  219. package/src/orchestrator/scheduler.ts +243 -0
  220. package/src/plugin.test.ts +2574 -0
  221. package/src/plugin.ts +1690 -0
  222. package/src/sdk/client.ts +66 -0
  223. package/src/worktrees/manager.ts +236 -0
  224. package/src/worktrees/state.ts +87 -0
  225. package/tests/integration/ranger-flow.test.ts +257 -0
  226. package/tools/analysis_archive.ts +28 -0
  227. package/tools/analysis_create.ts +55 -0
  228. package/tools/analysis_get.ts +33 -0
  229. package/tools/analysis_link_plan.ts +44 -0
  230. package/tools/analysis_list.ts +48 -0
  231. package/tools/analysis_search.ts +36 -0
  232. package/tools/analysis_update.ts +44 -0
  233. package/tools/plan_approve.ts +31 -0
  234. package/tools/plan_create.ts +58 -0
  235. package/tools/plan_get.ts +40 -0
  236. package/tools/plan_list.ts +37 -0
  237. package/tools/plan_search.ts +34 -0
  238. package/tools/plan_update_status.ts +71 -0
  239. package/tools/session_checkpoint.ts +31 -0
  240. package/tools/session_end.ts +26 -0
  241. package/tools/session_start.ts +43 -0
  242. package/tools/task_create_batch.ts +70 -0
  243. package/tools/task_list.ts +35 -0
  244. package/tools/task_next_for_agent.ts +30 -0
  245. package/tools/task_search.ts +34 -0
  246. package/tools/task_update_status.ts +37 -0
  247. package/tsconfig.json +31 -0
@@ -0,0 +1,882 @@
1
+ # Feature: Primary Craftsman — refactor arquitectónico (v2)
2
+
3
+ **Slug:** `feature-flexible-builder`
4
+ **Status:** Draft (spec v2)
5
+ **Plan ID:** `be21c801-b770-4d82-979a-2bb5186928f1`
6
+ **Plan slug:** `flexible-builder-v2`
7
+ **Created:** 2026-06-19
8
+ **Supersedes:** `docs/features/feature-flexible-builder-v1.md`
9
+
10
+ ---
11
+
12
+ ## 1. Resumen ejecutivo
13
+
14
+ Refactor arquitectónico mayor del ecosistema ndomo. Dos cambios estructurales que transforman el modelo de orquestación:
15
+
16
+ 1. **Foreman simplificado a 4 pasos** (Aclaración → Exploración → Plan atómico → Persistir): se eliminan 6 pasos del flujo original de 10 (Brief de Delegación, Trivium en Vivo, Reconciliación, Validación, Reporte Final). Foreman pasa de orquestador ejecutor a **planner puro**: planifica y persiste en DB; la ejecución la toma otro agente.
17
+
18
+ 2. **Nuevo primary `craftsman`** (antes `builder` en v1): agente implementador disciplinado con threshold estricto 2/5/1. Ataca bugs, features pequeñas y refactors acotados sin pasar por el ciclo de planificación del foreman. Opera con 4 estados de complejidad progresiva.
19
+
20
+ El user alterna manualmente entre foreman (planificación formal) y craftsman (ejecución directa) mediante el TUI. No hay dispatch automático ni enrutamiento foreman→craftsman — la separación es manual por diseño.
21
+
22
+ **Decisión clave del grill:** El nombre final es `craftsman` (no `builder`). El threshold es **2/5/1** (no 1/2-5/3 como en v1). El prompt del craftsman incluye 4 estados (no 3). Foreman baja a 4 pasos puramente planificadores.
23
+
24
+ ---
25
+
26
+ ## 2. Contexto y motivación
27
+
28
+ ### 2.1 Problemas del foreman original (10 pasos)
29
+
30
+ El `foreman` (`agents/foreman.md`) operaba con un flujo de 10 pasos obligatorios que mezclaba planificación con ejecución:
31
+
32
+ | # | Paso | Problema |
33
+ |---|------|----------|
34
+ | 1 | Aclaración | OK — necesario |
35
+ | 2 | Memory Search | OK — necesario |
36
+ | 3 | Routing | OK — necesario |
37
+ | 4 | Plan Atómico | OK — necesario |
38
+ | 5 | Brief de Delegación | Inflado: el prompt del subagente ya contiene el objetivo |
39
+ | 6 | Trivium en Vivo | Contradictorio: foreman no debe implementar |
40
+ | 7 | Reconciliación | Innecesario si craftsman ejecuta completo |
41
+ | 8 | Validación | Craftsman corre sus propios tests |
42
+ | 9 | Reporte Final | Craftsman reporta en su output |
43
+
44
+ **Evidencia:** `agents/foreman.md:162-200` — secuencia de 10 pasos que el foreman debía seguir en cada request.
45
+
46
+ ### 2.2 Grietas específicas identificadas
47
+
48
+ | Grieta | Ubicación en v1 | Impacto |
49
+ |--------|-----------------|---------|
50
+ | Trivium ≤5 líneas, 1 archivo, 0 nuevos exports | `agents/foreman.md:29-34` | Foreman no puede corregir ni un typo sin delegar |
51
+ | No hay modo ad-hoc; toda tarea requiere `plan_create` + `task_create_batch` | `agents/foreman.md:238` | Tareas de 1 archivo requieren ciclo completo de plan_db |
52
+ | `session_start` colisiona con `ctx.sessionID` | `docs/bugs/plan-create-orphan-fk.md:60-70` | `plan_approve`/`plan_update_status` fallan sin `session_start` explícito |
53
+ | `task_update_status` trunca `result`/`error` a 16KB | `src/db/tasks.ts:109-121` | Outputs grandes se pierden sin advertencia |
54
+ | Foreman monopoliza rol de "único primary" | `agents/foreman.md:28` y `agents/*.md` (`mode: subagent`) | User no puede delegar directamente a un smith |
55
+ | Routing estático en scheduler | `src/orchestrator/scheduler.ts:41-47` | No hay detección dinámica de stack |
56
+ | `opencode.json` ausente en el repo | `glob("*opencode.json*")` → 0 resultados | Config global no versionada |
57
+ | Sin asociación plan↔archivos | `src/db/schema.ts` | No hay trazabilidad de qué archivos toca cada plan |
58
+ | Sin `original_plan_data` | `src/db/schema.ts` | No hay audit trail de "qué se planeó vs qué se hizo" |
59
+ | Sin `plan_delete` | `src/plugin.ts` | No hay forma segura de eliminar planes huérfanos |
60
+
61
+ ### 2.3 Diferencias clave entre v1 y v2
62
+
63
+ | Aspecto | v1 (`builder`) | v2 (`craftsman`) |
64
+ |---------|----------------|-------------------|
65
+ | Nombre | `builder` | `craftsman` (confirmado en grill) |
66
+ | Estados | 3 (trivial, ad-hoc, formal) | 4 (con threshold 2/5/1) |
67
+ | Threshold archivos | 1 / 2-5 / >5 | ≤2 Estado 1, 3-5 Estado 2, >5 Estado 4 |
68
+ | Foreman | Sin cambios (10 pasos) | Simplificado a 4 pasos (planner puro) |
69
+ | Cross-session close | `created_by` básico | `executed_by_agent` + `executed_by_session` + `created_by_agent` |
70
+ | Migraciones DB | v6 + v7 | v6 (original_plan_data) + v7 (plan_files) + v8 (agent/session audit) |
71
+ | Painter routing | Foreman | Solo craftsman |
72
+ | Caveman | 14 agents target | Mismos 14 + snippet estándar |
73
+ | `plan_delete` | Fase 3 | Fase 1 (priorizada) |
74
+ | Plan ≤5 steps | Soft warning | Soft warning + log |
75
+
76
+ ---
77
+
78
+ ## 3. Análisis comparativo con nicosup98/ndomo
79
+
80
+ ### 3.1 Arquitectura referencia: architect + builder + qagent
81
+
82
+ El proyecto referencia `nicosup98/ndomo` (opencode-core-slim) define tres modos de trabajo:
83
+
84
+ | Modo | Agente | Cuándo |
85
+ |------|--------|--------|
86
+ | Plan formal | `architect` (primary) | Tarea multi-archivo, necesita diseño |
87
+ | Ejecución directa | `builder` (primary) | Tarea bien definida, 1-5 archivos |
88
+ | Ad-hoc audit | `qagent` (ad-hoc tool) | Scope se deriva del query |
89
+
90
+ **Patrón clave:** `architect` NO usa `task` para invocar `builder`. Ambos son primaries que se comunican vía `plan_db` asíncrona. El user cambia de agente manualmente en el TUI.
91
+
92
+ ### 3.2 Tabla comparativa ndomo-v1 vs nicosup98/ndomo vs ndomo-v2
93
+
94
+ | Aspecto | ndomo-v1 (foreman 10 pasos) | nicosup98/ndomo | ndomo-v2 (craftsman + foreman 4 pasos) |
95
+ |---------|-----------------------------|-----------------|----------------------------------------|
96
+ | Default agent | foreman (primary) | `build` (built-in) | foreman (primary planner) |
97
+ | Implementador | foreman delega a smiths | builder/scout/qagent | **craftsman** (primary implementer) |
98
+ | Modo trivial | Trivium ≤5 líneas + plan_db | `build` single-turn | Craftsman Estado 1 (sin plan_db) |
99
+ | Modo plan formal | foreman → 10 pasos → smiths | architect → plan_db → builder | Foreman 4 pasos → plan_db → craftsman |
100
+ | Coordinación | `task` síncrono | `plan_db` async + TUI switch | `plan_db` async + TUI switch |
101
+ | Audit trail | Solo `created_at`/`updated_at` | `original_plan_data` | `original_plan_data` + agent/session FK |
102
+ | Plan↔file | No existe | `plan_files` | `plan_files` |
103
+ | Tono global | Caveman parcial (foreman + algunos) | Caveman en TODOS | Caveman en TODOS los 14 + craftsman |
104
+ | `plan_delete` | No existe | Rechaza si `status='pending'` | Safety 3-capas |
105
+ | Plan ≤5 steps | No hay regla | Regla en architect.md | Soft warning en task_create_batch |
106
+
107
+ ### 3.3 Por qué el patrón async + user switch gana
108
+
109
+ Modelo v1 (foreman 10 pasos):
110
+ 1. Foreman crea plan en DB (2 writes)
111
+ 2. Foreman crea tasks batch (N writes)
112
+ 3. Foreman llama `task` para cada smith (N LLM invocations)
113
+ 4. Foreman espera resultados (N context switches)
114
+ 5. Foreman reconcilia resultados (N reads)
115
+
116
+ Modelo v2 (foreman 4 pasos + craftsman):
117
+ 1. Foreman crea plan en DB (1-2 writes) — solo si >5 archivos o diseño arquitectura
118
+ 2. User cambia a craftsman en TUI (0 LLM tokens)
119
+ 3. Craftsman lee plan y ejecuta (1 read + N writes)
120
+ 4. Craftsman cierra plan con `plan_update_status("completed")`
121
+
122
+ **Diferencia clave:** El modelo v2 gasta ~60% menos tokens en coordinación porque el "router" (foreman) solo escribe a DB, no invoca LLMs secundarios. Craftsman opera autónomamente.
123
+
124
+ ---
125
+
126
+ ## 4. Decisiones de diseño
127
+
128
+ ### D1. Nombre `craftsman` (no `builder`)
129
+
130
+ **Decisión:** El primary implementador se llama `craftsman`, no `builder` como en v1.
131
+
132
+ **Justificación:** Decisión del grill. `craftsman` evoca artesanía disciplinada (implementación precisa, threshold estricto, 4 estados). `builder` quedó descartado por ambigüedad con "builder pattern" y por la connotación genérica en el referencia.
133
+
134
+ **Archivo:** `agents/craftsman.md`
135
+
136
+ ### D2. Threshold estricto 2/5/1
137
+
138
+ **Decisión:** El craftsman opera con threshold numérico estricto:
139
+
140
+ | Estado | Archivos | Comportamiento |
141
+ |--------|----------|----------------|
142
+ | Estado 1 | ≤2 archivos | Implementación directa, sin plan_db |
143
+ | Estado 2 | 3-5 archivos | Implementación con plan_db (crea plan y tasks) |
144
+ | Estado 3 | — | Lee plan existente del foreman y ejecuta |
145
+ | Estado 4 | >5 archivos | **Rechaza** — "fuera de mi dominio" → cambiar a foreman |
146
+
147
+ **Diferencia con v1:** v1 proponía 1/2-5 con threshold 1 archivo para Estado 1. v2 sube a ≤2 archivos para Estado 1, reflejando que fixes de 2 archivos son comunes y no requieren plan_db.
148
+
149
+ **Enforcement:** Solo por prompt (no hay validación en código). Craftsman es un primary agent; su prompt es la única barrera.
150
+
151
+ ### D3. Routing interno: `task.files` extensión + `metadata.stack`
152
+
153
+ **Decisión:** El craftsman decide a qué sub-smith delegar basándose en (1) extensión de archivo en `task.files`, (2) `task.metadata.stack` si existe, (3) LLM fallback.
154
+
155
+ | Extensión | Sub-smith |
156
+ |-----------|-----------|
157
+ | `.go` | `go-smith` |
158
+ | `.vue`, `.svelte` | `vue-smith` |
159
+ | `.ts`, `.tsx`, `.js`, `.jsx` | `js-smith` |
160
+ | `.py` | `python-smith` |
161
+ | `.rs` | `rust-smith` |
162
+ | `.zig` | `zig-smith` |
163
+ | Sin match | `smith` (genérico) |
164
+
165
+ **Archivo:** `agents/craftsman.md` — tabla de routing interno.
166
+
167
+ ### D4. Painter solo disponible vía craftsman
168
+
169
+ **Decisión:** `painter` (UI/UX designer) solo es invocable desde craftsman, no desde foreman.
170
+
171
+ **Justificación:** Foreman es planner puro (4 pasos). Si hay componente UI, craftsman decide: painter si `stack === "vue"` y `type === "design"`, o vue-smith si es implementación lógica.
172
+
173
+ **Diferencia con v1:** v1 no especificaba painter routing — quedaba como responsabilidad del foreman.
174
+
175
+ ### D5. Cross-session close con audit trail completo
176
+
177
+ **Decisión:** Tres nuevos campos en tabla `plans`:
178
+
179
+ | Campo | Tipo | Descripción |
180
+ |-------|------|-------------|
181
+ | `created_by_agent` | TEXT | Agente que creó el plan (`foreman` o `craftsman`) |
182
+ | `executed_by_agent` | TEXT | Agente que ejecutó (`craftsman`, `go-smith`, etc.) |
183
+ | `executed_by_session` | TEXT FK → sessions.id | Sesión en que se ejecutó |
184
+
185
+ **Justificación:** Permite trazabilidad cross-session: "qué agente creó este plan, qué agente lo ejecutó, en qué sesión". Especialmente útil cuando foreman planifica y craftsman ejecuta en sesiones separadas.
186
+
187
+ **Comportamiento:**
188
+ - `plan_create` setea `created_by_agent` desde `ctx.agent`
189
+ - `task_update_status` / `plan_update_status` setea `executed_by_agent` y `executed_by_session` al primer `running`
190
+ - Write-once: no se sobrescriben si ya están seteados
191
+
192
+ ### D6. `plan_delete` en Phase 1 (priorizada)
193
+
194
+ **Decisión:** `plan_delete` tool se implementa en Phase 1 (no Phase 3 como en v1).
195
+
196
+ **Safety checks:**
197
+ 1. Rechaza si `confirm !== true`
198
+ 2. Rechaza si `plan.status === 'pending'`
199
+ 3. Rechaza si hay tasks `pending` o `running`
200
+ 4. CASCADE: borra plan_tasks, plan_tags, plan_files, sessions ON DELETE SET NULL
201
+
202
+ ### D7. Plan ≤5 steps: soft warning (no bloqueo)
203
+
204
+ **Decisión:** `task_create_batch` emite `console.warn` si `tasks.length > 5`. No bloquea. La regla se documenta en el prompt del foreman.
205
+
206
+ **Justificación:** Bloquear sería contraproducente — el usuario podría tener razón. El warning es suficiente para que el foreman reevalúe.
207
+
208
+ ### D8. Caveman global snippet estándar
209
+
210
+ **Decisión:** Insertar snippet exacto al inicio del prompt de 14 agents (después del frontmatter, antes del primer heading):
211
+
212
+ ```
213
+ Tono: caveman por default, nivel full. Activa siempre.
214
+ Excepción: prosa normal para advertencias de seguridad,
215
+ acciones irreversibles o ambigüedad multi-paso.
216
+ ```
217
+
218
+ **Agentes:** chronicler, go-smith, guild, inspector, js-smith, painter, python-smith, rust-smith, sage, scout, scribe, smith, vue-smith, zig-smith.
219
+
220
+ **NO tocar:** `agents/craftsman.md` (ya incluye caveman en su prompt), `agents/foreman.md` (ya tiene caveman).
221
+
222
+ ---
223
+
224
+ ## 5. Diseño del craftsman
225
+
226
+ ### 5.1 Frontmatter YAML
227
+
228
+ ```yaml
229
+ ---
230
+ description: Implementador Artesano / Disciplined Craftsman (modo ad-hoc o planificado)
231
+ mode: primary
232
+ model: opencode-go/deepseek-v4-flash
233
+ temperature: 0.1
234
+ permission:
235
+ edit: allow
236
+ write: allow
237
+ bash:
238
+ "*": ask
239
+ "git status*": allow
240
+ "git log*": allow
241
+ "git diff*": allow
242
+ "git add *": allow
243
+ "git commit*": allow
244
+ "git checkout*": ask
245
+ "git push*": ask
246
+ "ls *": allow
247
+ "cat *": allow
248
+ "mkdir *": allow
249
+ "mv *": allow
250
+ "cp *": allow
251
+ "bun *": allow
252
+ "npm *": allow
253
+ "rm *": ask
254
+ webfetch: deny
255
+ question: allow
256
+ task:
257
+ "scout": allow
258
+ "scribe": allow
259
+ "smith": allow
260
+ "go-smith": allow
261
+ "js-smith": allow
262
+ "vue-smith": allow
263
+ "python-smith": allow
264
+ "rust-smith": allow
265
+ "zig-smith": allow
266
+ "painter": allow
267
+ plan_db: allow
268
+ ---
269
+ ```
270
+
271
+ **Diferencias con el foreman:**
272
+ - `mode: primary` (NO subagent)
273
+ - `task` permitido solo a subagents implementadores + painter
274
+ - `task` NO permitido a foreman, guild, sage (son planners/advisors)
275
+ - `task` permitido a chronicler (post-implementation docs) e inspector (review gate) — decisión confirmada en user dialog v2
276
+ - Permisos `edit: allow`, `bash: ask` (craftsman implementa; foreman solo planifica)
277
+ - `plan_db` tools disponibles pero condicionales (Estado 1 no las usa)
278
+
279
+ ### 5.2 Prompt con 4 estados
280
+
281
+ ```
282
+ # Rol: Craftsman (Implementador Artesano)
283
+
284
+ Eres un **primary agent** diseñado para implementar código con precisión
285
+ artesanal. Atacas bugs, features pequeñas y refactors acotados. Operas en
286
+ 4 estados según el alcance del trabajo. Cuando el alcance excede tu umbral,
287
+ escalas al foreman.
288
+
289
+ ## Tono
290
+ Caveman nivel full SIEMPRE. Cero saludos, cero justificaciones.
291
+
292
+ ## Threshold estricto 2/5/1
293
+
294
+ ### Estado 1: Trivial (≤2 archivos, sin plan_db)
295
+ **Cuándo:** ≤2 archivos, cambios acotados (≤50 líneas diff), sin dependencias externas.
296
+ **Flujo:**
297
+ 1. Lee archivos objetivo
298
+ 2. Implementa cambios
299
+ 3. Corre validación (typecheck / tests / lint)
300
+ 4. Commit opcional (preguntar al user)
301
+ 5. Reporta directo: archivos, líneas, verificación
302
+ **NO crea plan_create. NO toca plan_db.**
303
+
304
+ ### Estado 2: Multi-archivo acotado (3-5 archivos, con plan_db)
305
+ **Cuándo:** 3-5 archivos, cambios que cruzan stacks, o necesita tracking cross-session.
306
+ **Flujo:**
307
+ 1. `plan_create` con slug, overview, approach (1 línea cada uno)
308
+ 2. `task_create_batch` con steps (máximo 5)
309
+ 3. Para cada step: `task_update_status("running")` → implementar → `task_update_status("done")`
310
+ 4. Al final: `plan_update_status("completed")`
311
+ **Obligatorio si toca más de 1 stack o requiere trazabilidad.**
312
+
313
+ ### Estado 3: Plan formal (lee plan_db existente)
314
+ **Cuándo:** El foreman ya creó un plan con tasks asignadas a craftsman.
315
+ **Flujo:**
316
+ 1. `plan_get({id})` o `task_next_for_agent({agent: "craftsman"})`
317
+ 2. Lee plan_data completo: overview, approach, contexto
318
+ 3. Implementa TDD: test → code → refactor
319
+ 4. `task_update_status("done")` con reporte
320
+ 5. Si todas las tasks hechas: `plan_update_status("completed")`
321
+
322
+ ### Estado 4: FUERA DE MI DOMINIO (>5 archivos)
323
+ **Cuándo:** La tarea involucra >5 archivos o requiere diseño de arquitectura.
324
+ **Acción:**
325
+ → Reportar: `[FUERA DE MI DOMINIO]` + cuantos archivos/por qué
326
+ → Sugerir cambiar a `foreman` en TUI
327
+ → NO implementar parcialmente
328
+
329
+ ### Regla de selección
330
+ ```
331
+ ¿Archivos ≤ 2 y sin dependencias externas?
332
+ → Estado 1: trivial (0 writes a DB)
333
+ ¿Archivos 3-5 o necesita tracking?
334
+ → Estado 2: plan_db propio
335
+ ¿Plan existente con tasks para craftsman?
336
+ → Estado 3: ejecutar plan formal
337
+ ¿Archivos > 5 o requiere diseño?
338
+ → Estado 4: fuera de dominio → foreman
339
+ ```
340
+
341
+ ## Routing interno (delegación a sub-smiths)
342
+ Cuando necesites implementación especializada, usa:
343
+
344
+ | Extensión archivo | Sub-smith |
345
+ |---|---|
346
+ | `.go` | `go-smith` |
347
+ | `.vue` / `.svelte` | `vue-smith` |
348
+ | `.ts` / `.tsx` / `.js` / `.jsx` | `js-smith` |
349
+ | `.py` | `python-smith` |
350
+ | `.rs` | `rust-smith` |
351
+ | `.zig` | `zig-smith` |
352
+ | UI/design + `type=design` | `painter` |
353
+ | Sin match | `smith` (genérico) |
354
+
355
+ Si `task.metadata.stack` existe, úsalo como override explícito.
356
+ Si no hay match y no hay stack, usa `smith`.
357
+
358
+ ## Cross-session close
359
+ - `executed_by_agent`: siempre `craftsman`
360
+ - `executed_by_session`: siempre `current_session_id` (ctx.sessionID)
361
+ - `created_by_agent`: setear en `plan_create` si creaste el plan
362
+
363
+ ## TDD workflow
364
+ 1. Test first (si existen tests en el proyecto)
365
+ 2. Code mínimo para pasar
366
+ 3. Refactor
367
+ 4. Verificar con suite del scope
368
+ 5. Commit atómico
369
+
370
+ ## Lo que NO puedes hacer
371
+ - ❌ Invocar foreman, guild, sage vía task
372
+ - ⚠️ Invocar chronicler solo post-implementación; inspector solo como review gate (no chaining entre ambos)
373
+ - ❌ Editar prompts de otros agents
374
+ - ❌ Editar tools MCP
375
+ - ❌ Usar `plan_approve`
376
+ - ❌ Modificar archivos sin leerlos primero
377
+
378
+ ## Output format
379
+ ```
380
+ cambios:
381
+ - archivo:linea — desc — verified: OK
382
+ tests:
383
+ - typecheck: passed
384
+ - test suite: N/N passed
385
+ plan:
386
+ - id: (si se creó/usó)
387
+ - estado: completed | ad-hoc (no plan_db)
388
+ ```
389
+
390
+ ## Caveman skill
391
+ Activa siempre. Excepción: prosa normal para advertencias de
392
+ seguridad, acciones irreversibles o ambigüedad multi-paso.
393
+ ```
394
+
395
+ ---
396
+
397
+ ## 6. Foreman nuevo flow: 4 pasos (planner puro)
398
+
399
+ ### 6.1 Comparativa 10 pasos → 4 pasos
400
+
401
+ | v1 (10 pasos) | v2 (4 pasos) | Diferencia |
402
+ |---------------|--------------|------------|
403
+ | 1. Aclaración | **1. Aclaración** | Se conserva |
404
+ | 2. Memory Search | **2. Exploración** | Se fusiona: memory + scout/scribe/sage/guild |
405
+ | 3. Routing | — | Routing implícito en la exploración |
406
+ | 4. Plan Atómico | **3. Plan Atómico** | Se conserva, más liviano |
407
+ | 5. Brief de Delegación | — | Eliminado: craftsman lee plan_db directamente |
408
+ | 6. Trivium en Vivo | — | Eliminado: craftsman implementa |
409
+ | 7. Reconciliación | — | Eliminado: craftsman ejecuta todo |
410
+ | 8. Validación | — | Eliminado: craftsman corre tests |
411
+ | 9. Reporte Final | — | Eliminado: craftsman reporta |
412
+ | — | **4. Persistir** | Nuevo: plan_create + write plan_db |
413
+
414
+ ### 6.2 Flujo detallado
415
+
416
+ #### Paso 1: Aclaración
417
+ - Identificar intención en 1-2 frases
418
+ - Si ambigüedad: `question` al usuario
419
+ - Si la tarea es ≤5 archivos y bien definida → sugerir `craftsman`
420
+ - Si >5 archivos o requiere diseño → continuar con planificación
421
+
422
+ #### Paso 2: Exploración
423
+ - `memory({mode:"search", scope:"project"})` — decisiones pasadas
424
+ - Delegar a subagentes según necesidad:
425
+ - `scout` — mapear repo, encontrar archivos, detectar stack
426
+ - `scribe` — investigar APIs, versiones, docs externas
427
+ - `sage` — evaluar trade-offs arquitectónicos
428
+ - `guild` — solo si usuario pide debate explícito
429
+ - NO delegar a smiths, painter, chronicler, inspector
430
+
431
+ #### Paso 3: Plan Atómico
432
+ - Desglosar en ≤5 steps top-level
433
+ - Cada step: `(Acción) → archivos esperados → dependencias`
434
+ - Estimar complejidad (1-5) y riesgo (low/medium/high)
435
+
436
+ #### Paso 4: Persistir
437
+ - `plan_create` con slug, overview, approach
438
+ - `task_create_batch` con steps (máximo 5, warning si >5)
439
+ - NO crear `session_start` (lo hace craftsman al ejecutar)
440
+ - NO ejecutar tasks — craftsman las toma via `task_next_for_agent`
441
+
442
+ ### 6.3 Routing table del foreman (v2)
443
+
444
+ | Petición | Delegar a |
445
+ |----------|-----------|
446
+ | Explorar código / mapear repo | `scout` |
447
+ | Investigar APIs / docs / versiones | `scribe` |
448
+ | Arquitectura / trade-offs / debugging difícil | `sage` |
449
+ | Debate multi-perspectiva | `guild` (solo manual) |
450
+
451
+ NOTA: foreman solo planifica. Ejecución es craftsman. NO delegar a smiths, painter, chronicler, inspector.
452
+
453
+ ### 6.4 Output del foreman (v2)
454
+
455
+ ```
456
+ **Objetivo:** [1 línea]
457
+ **Exploración:** [scout/scribe/sage findings]
458
+ **Plan:**
459
+ 1. [acción] → archivos: [paths] → complejidad: N
460
+ 2. [acción] → archivos: [paths] → complejidad: N
461
+ **Persistido:** plan_id=[uuid] slug=[slug]
462
+ **Siguiente:** cambiar a craftsman en TUI → task_next_for_agent
463
+ ```
464
+
465
+ ### 6.5 Plan Approve (legacy)
466
+
467
+ `plan_approve` es un tool MCP registrado en `src/plugin.ts:621-632` que marca un plan como `approved` seteando `approved_at`.
468
+
469
+ **Estado:** **LEGACY** — El flujo v2 de foreman (4 pasos, sección 6.2) **NO usa `plan_approve`**. En v2, el foreman pasa directo de `plan_create` (status `draft`) a `task_create_batch`. El status `approved` queda implícito al dispatchar tasks via `task_create_batch`.
470
+
471
+ **Por qué existe aún:** Compatibilidad con código externo y workflows manuales que requieren gating explícito antes de ejecutar. Se mantiene como tool MCP para uso legacy/humano.
472
+
473
+ **Cuándo invocarlo manualmente:** Si un usuario externo o script quiere un gating explícito "aprobar antes de ejecutar", puede llamar `plan_approve` entre `plan_create` y `task_create_batch`. En el flujo v2 normal esto es innecesario.
474
+
475
+ **Diferencia con v2 flow:**
476
+
477
+ | Aspecto | v2 flow (foreman 4 pasos) | Legacy (con `plan_approve`) |
478
+ |---------|---------------------------|-----------------------------|
479
+ | Flujo | `plan_create` → `task_create_batch` | `plan_create` → `plan_approve` → `task_create_batch` |
480
+ | Status intermedio | `draft` → directo a tasks | `draft` → `approved` → tasks |
481
+ | Gating | Ninguno (dispatch inmediato) | Explícito (aprobación manual) |
482
+ | Uso en v2 | Siempre | Nunca (solo externo/manual) |
483
+
484
+ **Archivo:** `src/plugin.ts:621-632`
485
+
486
+ ---
487
+
488
+ ## 7. Cambios al sistema
489
+
490
+ ### 7.1 Migración v6: `original_plan_data`
491
+
492
+ | Campo | Tabla | Tipo | Comportamiento |
493
+ |-------|-------|------|----------------|
494
+ | `original_plan_data` | `plans` | `TEXT` | En `plan_create`: copiar snapshot de args como JSON |
495
+ | `original_plan_data` | `plan_tasks` | `TEXT` | En `task_create_batch`: copiar `{description, files, dependencies}` como JSON |
496
+
497
+ **Reglas:**
498
+ - `plan_create` setea `original_plan_data` al serializar los args de entrada
499
+ - `plan_approve` NO toca `original_plan_data`
500
+ - `plan_update_status` NO toca `original_plan_data`
501
+ - `archivePlan` lo incluye en markdown pero NO lo modifica
502
+ - `task_create_batch` setea `original_plan_data` por task
503
+
504
+ **Archivos afectados:**
505
+ - `src/db/schema.ts` — agregar columna vía `addColumnIfMissing` en migrations.ts (patrón v5)
506
+ - `src/db/types.ts` — agregar `originalPlanData: string | null` a Plan y PlanTask, PlanRow, TaskRow
507
+ - `src/db/plan-create.ts` — serializar `PlanCreateArgs` como `original_plan_data`
508
+ - `src/db/tasks.ts` — serializar cada task input como `original_plan_data`; warning si `tasks.length > 5`
509
+ - `src/db/plan-archive.ts` — leer y exportar `original_plan_data` en markdown archive
510
+ - `src/db/plans.ts` — `createPlan` acepta `originalPlanData`; `updatePlanStatus` / `approvePlan` NO lo sobrescriben
511
+
512
+ ### 7.2 Migración v7: `plan_files`
513
+
514
+ ```sql
515
+ CREATE TABLE IF NOT EXISTS plan_files (
516
+ plan_id TEXT NOT NULL REFERENCES plans(id) ON DELETE CASCADE,
517
+ file_path TEXT NOT NULL,
518
+ role TEXT,
519
+ PRIMARY KEY (plan_id, file_path)
520
+ );
521
+ CREATE INDEX IF NOT EXISTS idx_plan_files_path ON plan_files(file_path);
522
+ ```
523
+
524
+ **Comportamiento:**
525
+ - `plan_create` acepta `files: string[]` opcional → inserta con role `'input'`
526
+ - `task_create_batch` acepta `files: string[]` por task → inserta con role `'modified'`
527
+ - `plan_get` retorna `files[]` via JOIN
528
+ - `plan_search` acepta `file_path` filter opcional
529
+ - `plan_delete` CASCADE borra `plan_files`
530
+ - `archivePlan` incluye files en el markdown archive
531
+
532
+ **Archivos afectados:**
533
+ - `src/db/schema.ts` — SCHEMA_V7_SQL con CREATE TABLE
534
+ - `src/db/types.ts` — extender Plan/PlanTask con `files` array
535
+ - `src/db/plan-create.ts` — `files?: string[]` en args, insertar en plan_files
536
+ - `src/db/tasks.ts` — insertar en plan_files si `files` no vacío
537
+ - `src/db/plans.ts` — `getPlan` JOIN con plan_files
538
+ - `src/db/plan-archive.ts` — incluir files en markdown
539
+
540
+ ### 7.3 Migración v8: `created_by_agent` + `executed_by_agent` + `executed_by_session`
541
+
542
+ ```sql
543
+ ALTER TABLE plans ADD COLUMN created_by_agent TEXT;
544
+ ALTER TABLE plans ADD COLUMN executed_by_agent TEXT;
545
+ ALTER TABLE plans ADD COLUMN executed_by_session TEXT REFERENCES sessions(id) ON DELETE SET NULL;
546
+ ```
547
+
548
+ **Comportamiento:**
549
+ - `plan_create`: setea `created_by_agent = ctx.agent` (write-once)
550
+ - `task_update_status("running")` o `plan_update_status("executing")`: setea `executed_by_agent` y `executed_by_session` si es el primer running
551
+ - `plan_approve` / `plan_update_status("completed")`: NO tocan estos campos
552
+ - `getPlan`: retorna los campos en el objeto Plan
553
+
554
+ **Archivos afectados:**
555
+ - `src/db/schema.ts` — `addColumnIfMissing` en migrations.ts
556
+ - `src/db/types.ts` — agregar `createdByAgent`, `executedByAgent`, `executedBySession` a Plan y PlanRow
557
+ - `src/db/plan-create.ts` — pasar `ctx.agent` como `createdByAgent`
558
+ - `src/db/plans.ts` — en `updatePlanStatus`, setear `executed_by_agent`/`executed_by_session` al pasar a `executing`; en `createPlan`, setear `created_by_agent`
559
+ - `src/db/plan-archive.ts` — incluir en markdown archive
560
+
561
+ ### 7.4 `plan_delete` safety
562
+
563
+ **Tool:** Nuevo en `src/plugin.ts`
564
+
565
+ **Función:** `deletePlan(db, id, confirm)` en `src/db/plans.ts`
566
+
567
+ **Validaciones:**
568
+ 1. `typeof confirm !== 'boolean' || confirm !== true` → error `"ndomo: plan_delete requires confirm: true"`
569
+ 2. `plan.status === 'draft'` → error `"ndomo: cannot delete a draft plan — use abandonPlan or approve first"`
570
+ 3. Existen tasks con `status IN ('pending', 'running')` → error `"ndomo: plan has active tasks — resolve them first"`
571
+
572
+ **Si pasa:** `DELETE FROM plans WHERE id = ?` (CASCADE: plan_tasks, plan_tags, plan_files; sessions → SET NULL)
573
+
574
+ ### 7.5 Plan ≤5 steps soft warning
575
+
576
+ En `src/db/tasks.ts`, función `createTasksBatch`:
577
+
578
+ ```typescript
579
+ if (tasks.length > 5) {
580
+ console.warn(`[ndomo] plan ${planId} has ${tasks.length} tasks (>5): consider splitting`);
581
+ }
582
+ ```
583
+
584
+ No bloquea. Warning visible en logs de OpenCode.
585
+
586
+ ### 7.6 Caveman global en 14 agents
587
+
588
+ Insertar snippet estándar después del frontmatter YAML, antes del primer heading:
589
+
590
+ ```
591
+ Tono: caveman por default, nivel full. Activa siempre.
592
+ Excepción: prosa normal para advertencias de seguridad,
593
+ acciones irreversibles o ambigüedad multi-paso.
594
+ ```
595
+
596
+ **Archivos:** `agents/chronicler.md`, `agents/go-smith.md`, `agents/guild.md`, `agents/inspector.md`, `agents/js-smith.md`, `agents/painter.md`, `agents/python-smith.md`, `agents/rust-smith.md`, `agents/sage.md`, `agents/scout.md`, `agents/scribe.md`, `agents/smith.md`, `agents/vue-smith.md`, `agents/zig-smith.md`.
597
+
598
+ ---
599
+
600
+ ## 8. Acceptance criteria
601
+
602
+ ### 8.1 Craftsman existe y es primary
603
+ - [ ] `agents/craftsman.md` existe con `mode: primary`, frontmatter completo
604
+ - [ ] Prompt cubre 4 estados con threshold 2/5/1
605
+ - [ ] User puede cambiar a craftsman en TUI
606
+
607
+ ### 8.2 Threshold 2/5/1 funcional
608
+ - [ ] Estado 1: tarea ≤2 archivos → implementa sin plan_db
609
+ - [ ] Estado 2: tarea 3-5 archivos → crea plan_db + tasks
610
+ - [ ] Estado 3: plan existente → ejecuta tasks asignadas
611
+ - [ ] Estado 4: tarea >5 archivos → reporta fuera de dominio
612
+
613
+ ### 8.3 Routing interno del craftsman
614
+ - [ ] Delegación por extensión: .go → go-smith, .vue → vue-smith, etc.
615
+ - [ ] `metadata.stack` override funciona
616
+ - [ ] LLM fallback a `smith` genérico
617
+
618
+ ### 8.4 Painter solo vía craftsman
619
+ - [ ] Foreman NO lista painter en su routing
620
+ - [ ] Craftsman puede delegar a painter si `stack === "vue"` y `type === "design"`
621
+ - [ ] Craftsman usa vue-smith para UI no-design
622
+
623
+ ### 8.5 Cross-session close
624
+ - [ ] `plan_create` setea `created_by_agent` (write-once)
625
+ - [ ] Primer `task_update_status("running")` setea `executed_by_agent` + `executed_by_session`
626
+ - [ ] Campos no se sobrescriben en updates posteriores
627
+
628
+ ### 8.6 Migraciones DB
629
+ - [ ] v6: `original_plan_data` write-once en plans y plan_tasks
630
+ - [ ] v7: `plan_files` insert + query + CASCADE
631
+ - [ ] v8: `created_by_agent`, `executed_by_agent`, `executed_by_session` en plans
632
+ - [ ] Migraciones aplican limpias a DB existente
633
+
634
+ ### 8.7 `plan_delete` safety
635
+ - [ ] Rechaza sin `confirm: true`
636
+ - [ ] Rechaza si `status='draft'`
637
+ - [ ] Rechaza si hay tasks pending/running
638
+ - [ ] CASCADE ejecuta correctamente
639
+
640
+ ### 8.8 Plan ≤5 steps
641
+ - [ ] `agents/foreman.md` contiene regla de ≤5 steps
642
+ - [ ] `task_create_batch` emite console.warn si >5 tasks
643
+
644
+ ### 8.9 Caveman global
645
+ - [ ] 14 agents tienen snippet caveman estándar
646
+ - [ ] Craftsman tiene caveman en prompt
647
+ - [ ] Foreman ya tenía caveman (no duplicar)
648
+
649
+ ### 8.10 Tests y verificación
650
+ - [ ] `plan_delete` tests (3 sub-casos)
651
+ - [ ] `original_plan_data` write-once test
652
+ - [ ] `plan_files` insert + query + CASCADE test
653
+ - [ ] Audit trail write-once test (v8)
654
+ - [ ] `bun run typecheck` pasa sin errores
655
+ - [ ] `bun test` pasa (suite completa)
656
+
657
+ ### 8.11 Docs
658
+ - [ ] `docs/agents.md` tiene sección craftsman (rol, cuándo usar, threshold 2/5/1)
659
+ - [ ] `docs/workflows.md` árbol de decisión actualizado
660
+
661
+ ---
662
+
663
+ ## 9. Plan de implementación (5 fases)
664
+
665
+ ### Fase 0: Spec v2 + backup v1 (chronicler, ~30min)
666
+
667
+ **Qué:**
668
+ 1. Backup `docs/features/feature-flexible-builder.md` → `-v1.md`
669
+ 2. Reescribir spec v2 con arquitectura craftsman + foreman 4 pasos + threshold 2/5/1
670
+
671
+ **Archivos:**
672
+ - `docs/features/feature-flexible-builder.md` (rewrite)
673
+ - `docs/features/feature-flexible-builder-v1.md` (backup)
674
+
675
+ ### Fase 1: Migraciones DB + tests (js-smith, ~2h)
676
+
677
+ **Qué:**
678
+ 1. v6: `original_plan_data` en plans + plan_tasks
679
+ 2. v7: `plan_files` join table
680
+ 3. v8: `created_by_agent` + `executed_by_agent` + `executed_by_session`
681
+ 4. `deletePlan` en `src/db/plans.ts` con safety checks
682
+ 5. Tests: `plans.test.ts` (delete), `plan-files.test.ts`, `migrations-v8.test.ts`
683
+
684
+ **Archivos:** Ver sección 7.1, 7.2, 7.3, 7.4
685
+
686
+ ### Fase 2: `agents/craftsman.md` (chronicler, ~1h)
687
+
688
+ **Qué:**
689
+ 1. Crear `agents/craftsman.md` con frontmatter + prompt 4 estados + routing + cross-session close
690
+
691
+ **Archivos:**
692
+ - `agents/craftsman.md` (nuevo)
693
+
694
+ **Dependencia:** Phase 1 (para referencias DB en el prompt)
695
+
696
+ ### Fase 3: Foreman rewrite + caveman global (smith/chronicler, ~1.5h)
697
+
698
+ **Qué:**
699
+ 1. Rewrite `agents/foreman.md` a 4 pasos: Aclaración→Exploración→Plan Atómico→Persistir
700
+ 2. Agregar caveman a 14 agents (diff mecánico)
701
+ 3. Registrar `plan_delete` en `src/plugin.ts`
702
+ 4. Soft warning ≤5 tasks en `src/db/tasks.ts`
703
+
704
+ **Archivos:**
705
+ - `agents/foreman.md` (rewrite)
706
+ - `agents/*.md` (14 archivos, +caveman)
707
+ - `src/plugin.ts` (+plan_delete tool)
708
+ - `src/db/tasks.ts` (+warning)
709
+
710
+ **Dependencia:** Phase 2 (foreman routing ya no incluye smiths)
711
+
712
+ ### Fase 4: Docs + smoke tests (chronicler, ~1h)
713
+
714
+ **Qué:**
715
+ 1. Actualizar `docs/agents.md` con craftsman
716
+ 2. Actualizar `docs/workflows.md` con árbol de decisión
717
+ 3. Smoke tests checklist (no automatizados):
718
+ - Foreman flow 4 pasos: plan_create + task_create_batch
719
+ - Craftsman Estado 1: ≤2 archivos, sin plan_db
720
+ - Craftsman Estado 4: >5 archivos → rechazo
721
+ 4. `bun run typecheck` y `bun test` verdes
722
+
723
+ **Archivos:**
724
+ - `docs/agents.md` (nueva sección craftsman)
725
+ - `docs/workflows.md` (árbol actualizado)
726
+
727
+ **Dependencia:** Phase 2 + Phase 3
728
+
729
+ ---
730
+
731
+ ## 10. Riesgos y trade-offs
732
+
733
+ ### R1. Abuso del craftsman para tareas grandes
734
+
735
+ **Riesgo:** Craftsman tiene `edit: allow` + `task: allow`. El user podría usarlo para features >5 archivos, saltándose el foreman.
736
+
737
+ **Mitigación (2 capas):**
738
+ 1. **Prompt:** Estado 4 rechaza explícitamente >5 archivos
739
+ 2. **Modelo:** craftsman usa temperatura 0.1, menos propenso a auto-expandir scope
740
+
741
+ **Severidad:** baja (el sistema es una herramienta, no un guardián).
742
+
743
+ ### R2. Separación manual foreman→craftsman confusa
744
+
745
+ **Riesgo:** El user no sabe cuándo usar foreman vs craftsman, resultando en planes mal diseñados o implementaciones sin plan.
746
+
747
+ **Mitigación:**
748
+ 1. Foreman en el Paso 1 (Aclaración) sugiere craftsman si la tarea es ≤5 archivos
749
+ 2. Craftsman en Estado 4 sugiere foreman si >5 archivos
750
+ 3. `docs/workflows.md` documenta árbol de decisión
751
+
752
+ **Severidad:** media (curva de aprendizaje inicial).
753
+
754
+ ### R3. Crecimiento de DB con `original_plan_data`
755
+
756
+ **Riesgo:** Duplica `plan_data` (2x por fila). En proyectos grandes, puede sumar MB.
757
+
758
+ **Mitigación:**
759
+ 1. Auto-archive a markdown cuando el plan se completa
760
+ 2. Archivar setea `archived_at`, limpiando de DB activa
761
+
762
+ **Severidad:** baja (SQLite, 1000 planes ≈ 2-5MB extra).
763
+
764
+ ### R4. Write-once no enforced en DB
765
+
766
+ **Riesgo:** Los campos `created_by_agent`, `executed_by_agent`, `executed_by_session` y `original_plan_data` son write-once por convención, no por constraint DB.
767
+
768
+ **Mitigación:**
769
+ 1. El código en `planCreateExecutor`, `createPlan`, `updatePlanStatus` verifica antes de setear
770
+ 2. Tests unitarios validan write-once behavior
771
+
772
+ **Severidad:** baja (si se sobrescribe, es bug en el código, no en la DB).
773
+
774
+ ### R5. Caveman en 14 agents = 14 lugares de mantenimiento
775
+
776
+ **Riesgo:** El snippet caveman puede volverse inconsistente si se edita en un agent y no en los otros.
777
+
778
+ **Mitigación:**
779
+ 1. Snippet exacto documentado en spec (sección 7.6)
780
+ 2. Si cambia, buscar/replace en 14 archivos
781
+
782
+ **Severidad:** baja (diff mecánico).
783
+
784
+ ### R6. Foreman sin acceso a smiths — posible fricción
785
+
786
+ **Riesgo:** Si el user pide al foreman "implementa X en Go" y el foreman no puede delegar a go-smith directamente, el user debe cambiar manualmente a craftsman.
787
+
788
+ **Mitigación:**
789
+ 1. Foreman en Paso 1 sugiere craftsman temprano
790
+ 2. Foreman puede planificar y craftsman ejecuta — el user cambia una vez
791
+
792
+ **Severidad:** media-baja (un switch manual adicional vs delegación automática).
793
+
794
+ ---
795
+
796
+ ## 11. Referencias cruzadas
797
+
798
+ ### 11.1 Archivos clave
799
+
800
+ | Archivo | Líneas relevantes | Notas |
801
+ |---------|-------------------|-------|
802
+ | `agents/foreman.md` | 1-21 (frontmatter), 162-200 (10 pasos v1) | Se reescribe a 4 pasos en Phase 3 |
803
+ | `agents/craftsman.md` | (nuevo) | Creado en Phase 2 |
804
+ | `src/db/schema.ts` | 8-497 (v1-v5), MIGRATIONS array 465-497 | Se agregan v6/v7/v8 |
805
+ | `src/db/types.ts` | 41-64 (Plan), 66-91 (PlanTask), 119-166 (Rows) | Se extienden con nuevos campos |
806
+ | `src/db/plans.ts` | createPlan, updatePlanStatus, approvePlan | Puntos de inserción original_plan_data + v8 |
807
+ | `src/db/tasks.ts` | 13-80 (createTasksBatch), 109-121 (truncation) | original_plan_data + warning ≤5 |
808
+ | `src/db/plan-create.ts` | 15-30 (PlanCreateArgs), 32-62 (planCreateExecutor) | ensureSession ya existe |
809
+ | `src/db/plan-archive.ts` | serializePlanToMarkdown, archivePlan | Incluir nuevos campos |
810
+ | `src/db/migrations.ts` | addColumnIfMissing, runMigrations | Patrón para v6/v7/v8 |
811
+ | `src/plugin.ts` | 352-822 (tools) | Nuevo tool plan_delete + adjust plan_create |
812
+ | `src/db/plans.ts` | (nueva función) | deletePlan con safety checks |
813
+ | `docs/bugs/plan-create-orphan-fk.md` | 60-70, 88-103 | Bug conocido, no resuelto |
814
+
815
+ ### 11.2 Specs relacionados
816
+
817
+ | Recurso | Relación |
818
+ |---------|----------|
819
+ | `docs/features/feature-flexible-builder-v1.md` | Spec original v1 (archivada). Define `builder` con 3 estados. Reemplazada por v2. |
820
+ | `agents/foreman.md` | Prompt actual del foreman (10 pasos). Se reescribe en Phase 3. |
821
+ | `docs/agents.md` | Se actualiza en Phase 4 con craftsman. |
822
+ | `docs/workflows.md` | Se actualiza en Phase 4 con árbol de decisión. |
823
+ | `src/db/schema.ts` | Schema DB actual (v1-v5). Migraciones v6+v7+v8 en spec. |
824
+
825
+ ### 11.3 Árbol de decisión actualizado
826
+
827
+ ```
828
+ User envía prompt
829
+
830
+ ├─ ¿Tarea ≤2 archivos, ≤50 líneas, bien definida?
831
+ │ → `craftsman` en TUI → Estado 1 (trivial, sin plan_db)
832
+
833
+ ├─ ¿Tarea 3-5 archivos, multi-stack, necesita tracking?
834
+ │ → `craftsman` en TUI → Estado 2 (ad-hoc con plan_db)
835
+
836
+ ├─ ¿Tarea >5 archivos, diseño de arquitectura, o ambigua?
837
+ │ → `foreman` en TUI → 4 pasos: Aclaración → Exploración → Plan → Persistir
838
+ │ → Luego `craftsman` en TUI → Estado 3 (lee plan formal)
839
+
840
+ ├─ ¿Auditoría de PR existente o tarea read-only?
841
+ │ → `craftsman` o `scout` según necesite escribir
842
+
843
+ └─ ¿Exploración read-only?
844
+ → `scout` en TUI
845
+ ```
846
+
847
+ ---
848
+
849
+ ## Apéndice A: Decisiones del grill
850
+
851
+ | Decisión | Opción elegida | Alternativas descartadas |
852
+ |----------|---------------|--------------------------|
853
+ | Nombre del primary | `craftsman` | `builder` (v1), `implementer`, `artisan` |
854
+ | Threshold | 2/5/1 (≤2 Estado 1, 3-5 Estado 2, >5 Estado 4) | 1/2-5 (v1), 1/3-5/6+ |
855
+ | Estados del craftsman | 4 (trivial / multi-archivo / plan formal / fuera dominio) | 3 (v1) |
856
+ | Foreman pasos | 4 (Aclaración / Exploración / Plan / Persistir) | 10 (v1), 6, 3 |
857
+ | Painter routing | Solo craftsman | Foreman + craftsman |
858
+ | Cross-session close | `created_by_agent` + `executed_by_agent` + `executed_by_session` | Solo `created_by` |
859
+ | `plan_delete` fase | Phase 1 (priorizada) | Phase 3 (v1) |
860
+ | Plan ≤5 steps | Soft warning (no bloqueo) | Bloqueo estricto |
861
+ | Caveman snippet | Estándar en 14 agents | Caveman solo en prompt |
862
+
863
+ ---
864
+
865
+ ## Apéndice B: Relación con bugs existentes
866
+
867
+ ### Bug `ctx.sessionID` (`docs/bugs/plan-create-orphan-fk.md`)
868
+
869
+ No se resuelve en este spec. Craftsman usa `plan_create` + `plan_update_status("completed")`:
870
+ - `planCreateExecutor` ya tiene `ensureSession` automático (`src/db/plan-create.ts:39-41`)
871
+ - `planUpdateStatus` solo chequea FK para status `executing`/`approved` (`src/db/plans.ts:122`)
872
+ - Craftsman no usa `plan_approve`
873
+
874
+ **Impacto:** El bug no afecta al flujo craftsman.
875
+
876
+ ### Truncation 16KB (`src/db/tasks.ts:109-121`)
877
+
878
+ No se resuelve en este spec. Craftsman genera resultados pequeños (formato caveman). Si un sub-smith produce output grande, el truncation aplica igual que hoy.
879
+
880
+ ---
881
+
882
+ *Fin del feature spec v2 — ~600 líneas*