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
package/README.es.md ADDED
@@ -0,0 +1,174 @@
1
+ # ndomo
2
+
3
+ Plugin multi-agente para OpenCode. Taller de artesanos: 19 especialistas bajo un Foreman, un Craftsman y un Warden. Nativo en caveman. opencode-mem integrado. DCP peer opcional.
4
+
5
+ ## Qué es ndomo
6
+
7
+ ndomo es un plugin de orquestación multi-agente para [OpenCode](https://github.com/opencode-ai). Enruta tareas de desarrollo a 19 agentes especializados (scout, scribe, painter, smith, sage, guild, stack-smiths, inspector, chronicler, y ops agents) coordinados por 3 primaries: Foreman (planificación), Craftsman (implementación), Warden (operaciones). Todos los agentes usan el protocolo de salida Caveman para comunicación eficiente en tokens. La persistencia de memoria entre sesiones la gestiona opencode-mem. El plugin opcional DCP proporciona poda de contexto adicional para sesiones largas.
8
+
9
+ ## Agentes
10
+
11
+ | Agente | Rol | Modelo (preset default) | Tipo |
12
+ |---|---|---|---|
13
+ | **foreman** | Orquestador y scheduler maestro | minimax/MiniMax-M3 | primary |
14
+ | **warden** | Custodio de operaciones — CI/CD, deploy, releases, monitoreo | opencode-go/deepseek-v4-flash | primary |
15
+ | **scout** | Reconocimiento de codebase | opencode-go/minimax-m2.7 | subagent |
16
+ | **scribe** | Recuperación de conocimiento externo | opencode-go/minimax-m2.7 | subagent |
17
+ | **painter** | Diseño UI/UX y composición visual | opencode-go/kimi-k2.6 | subagent |
18
+ | **smith** | Implementación genérica rápida | opencode-go/deepseek-v4-flash | subagent |
19
+ | **go-smith** | Especialista en Go | xiaomi/mimo-v2.5-pro | subagent |
20
+ | **js-smith** | Especialista en JS/TS | xiaomi/mimo-v2.5-pro | subagent |
21
+ | **python-smith** | Especialista en Python | xiaomi/mimo-v2.5-pro | subagent |
22
+ | **vue-smith** | Especialista en Vue 3 / Pinia | xiaomi/mimo-v2.5-pro | subagent |
23
+ | **zig-smith** | Especialista en Zig 0.16 | xiaomi/mimo-v2.5-pro | subagent |
24
+ | **rust-smith** | Especialista en Rust | opencode-go/mimo-v2.5-pro | subagent |
25
+ | **sage** | Asesor de arquitectura y debugging | opencode-go/deepseek-v4-pro | subagent |
26
+ | **guild** | Consenso multi-LLM y debate | opencode-go/deepseek-v4-pro | subagent |
27
+ | **inspector** | Auditor de calidad y seguridad | opencode-go/deepseek-v4-pro | subagent |
28
+ | **chronicler** | Redactor de documentación técnica | opencode-go/deepseek-v4-flash | subagent |
29
+ | **ci-smith** | Especialista en pipelines CI/CD | opencode-go/deepseek-v4-flash | subagent |
30
+ | **deploy-smith** | Especialista en automatización de deploys | opencode-go/deepseek-v4-flash | subagent |
31
+ | **release-smith** | Especialista en gestión de releases | opencode-go/deepseek-v4-flash | subagent |
32
+ | **ops-scout** | Especialista en reconocimiento de infra (solo lectura) | opencode-go/deepseek-v4-flash | subagent |
33
+
34
+ **Grupos:** Orquestador (foreman), Exploradores (scout, scribe), Constructores (painter, smith, go-smith, js-smith, python-smith, vue-smith, zig-smith, rust-smith), Asesores (sage, guild), Calidad (inspector, chronicler), Operaciones (warden, ci-smith, deploy-smith, release-smith, ops-scout).
35
+
36
+ ## Inicio Rápido
37
+
38
+ ```bash
39
+ # Instalación rápida (interactivo, preguntará por provider)
40
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash
41
+
42
+ # No interactivo con provider preestablecido
43
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --provider=opencode --no-provider-prompt
44
+
45
+ # Con preset budget + DCP
46
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --preset=budget --with-dcp
47
+ ```
48
+
49
+ Por defecto la instalación aplica `presets.default` de `config/ndomo.config.json`. Usa `--preset=budget` para modelos más económicos, `--provider=ID` para sobrescribir el prefijo de provider.
50
+
51
+ O desde el código fuente:
52
+
53
+ ```bash
54
+ git clone <repo-url> ndomo
55
+ cd ndomo
56
+ bun install
57
+ opencode
58
+ ```
59
+
60
+ Dentro de OpenCode, verifica que todos los agentes respondan:
61
+
62
+ ```
63
+ ping all agents
64
+ ```
65
+
66
+ ## Instalación
67
+
68
+ **Requisitos:** [bun](https://bun.sh) >= 1.1.0, OpenCode instalado y configurado con al menos un proveedor autenticado.
69
+
70
+ Instalación vía curl (recomendada):
71
+
72
+ ```bash
73
+ # Instalación interactiva (preguntará por provider)
74
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash
75
+
76
+ # Con provider preestablecido (no interactivo)
77
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --provider=opencode --no-provider-prompt
78
+
79
+ # Con preset budget + DCP
80
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --preset=budget --with-dcp
81
+ ```
82
+
83
+ O desde un clon local:
84
+
85
+ ```bash
86
+ git clone <repo-url> ndomo
87
+ cd ndomo
88
+ ./scripts/install.sh # con preset default
89
+ ./scripts/install.sh --preset=budget # con modelos budget
90
+ ./scripts/install.sh --with-dcp # incluye plugin DCP
91
+ ```
92
+
93
+ Ver [docs/installation.md](docs/installation.md) para pasos detallados.
94
+
95
+ **Flags:**
96
+
97
+ | Flag | Descripción |
98
+ |---|---|
99
+ | `--provider=ID` | Sobrescribe el prefijo de provider para todos los agentes. El model ID se toma del preset activo; solo se intercambia el segmento `provider/` del campo `model:`. Ejemplo: el preset da `opencode-go/minimax-m2.7`, `--provider=opencode` reescribe a `opencode/minimax-m2.7`. |
100
+ | `--no-provider-prompt` | Omite el prompt interactivo de provider. El preset se aplica igualmente; no se realiza ninguna sobrescritura de prefijo de provider. |
101
+ | `--preset=NAME` | Selecciona un preset de `config/ndomo.config.json::presets[NAME]`. El preset es la fuente de verdad para los modelos de agentes al instalar. (default: `default`, opciones: `default`, `budget`) |
102
+ | `--with-dcp` | Instala y configura el plugin DCP. |
103
+ | `--repo=URL` | Sobrescribe la URL del repositorio (para instalaciones vía pipe desde un fork). |
104
+ | `--branch=NAME` | Sobrescribe la rama del repositorio (para instalaciones vía pipe desde ramas dev). |
105
+
106
+ **Desinstalación:** `./scripts/uninstall.sh [--keep-data]`
107
+
108
+ ## Base de Datos de Planes y Tareas
109
+
110
+ ndomo persiste planes, tareas y sesiones en una base de datos SQLite local al proyecto
111
+ (`<project>/.ndomo/state.db`) con búsqueda FTS5, trazabilidad de auditoría y
112
+ archivado automático a markdown al completarse. 14 herramientas expuestas vía OpenCode:
113
+ `plan_create`, `plan_get`, `plan_list`, `plan_search`, `plan_approve`,
114
+ `plan_update_status`, `task_create_batch`, `task_list`, `task_update_status`,
115
+ `task_search`, `task_next_for_agent`, `session_start`, `session_checkpoint`,
116
+ `session_end`.
117
+
118
+ El foreman las usa para rastrear trabajo a través de despachos de agentes. Ver
119
+ [docs/database.md](docs/database.md) para esquema, herramientas, ciclo de vida y
120
+ comportamiento de archivado automático.
121
+
122
+ ## Configuración
123
+
124
+ Archivo de configuración: `~/.config/opencode/ndomo.json`
125
+
126
+ ```json
127
+ {
128
+ "preset": "default",
129
+ "caveman": { "intensity": "full", "autoClarity": true },
130
+ "mem": {
131
+ "storagePath": "~/.ndomo/mem",
132
+ "defaultScope": "project",
133
+ "autoCaptureEnabled": true,
134
+ "cavemanCompress": true
135
+ }
136
+ }
137
+ ```
138
+
139
+ Ver [docs/configuration.md](docs/configuration.md) para referencia completa. Los presets de agente soportan el campo opcional `reasoning_effort` (`low`/`medium`/`high`/`xhigh`) para modelos con capacidad de razonamiento.
140
+
141
+ ## Skills
142
+
143
+ ndomo incluye 7 skills en `skills/`:
144
+
145
+ | Skill | Descripción |
146
+ |---|---|
147
+ | `caveman` | Modo de comunicación ultracomprimido (~75% reducción de tokens) |
148
+ | `cavecrew` | Subagentes estilo caveman (investigator, builder, reviewer) |
149
+ | `deepwork` | Flujo estructurado para trabajo pesado con plan files y review gates |
150
+ | `reflect` | Análisis de fricción en el flujo de trabajo y extracción de patrones |
151
+ | `worktrees` | Gestión de git worktrees para carriles aislados de desarrollo |
152
+ | `dcp-integration` | Guía de integración de Dynamic Context Pruning |
153
+ | `mem-recall` | Uso de herramientas opencode-mem y patrones de recuperación |
154
+
155
+ ## Integraciones
156
+
157
+ - **opencode-mem** (requerido) — memoria persistente con SQLite + USearch vector DB. Interfaz web en `:4747`. Todos los agentes comprimen recuerdos antes de almacenar usando compresión caveman vía regex (0 tokens de LLM).
158
+ - **DCP** (opcional) — `@tarquinen/opencode-dcp` para poda dinámica de contexto. Licencia AGPL-3.0. Se instala con flag `--with-dcp`.
159
+
160
+ Ver [docs/integrations.md](docs/integrations.md) para detalles.
161
+
162
+ ## Ahorro de Tokens
163
+
164
+ El protocolo de salida Caveman reduce el uso de tokens ~60-75% vs prosa estándar eliminando artículos, palabras de relleno, conjunciones y cortesías, preservando todo el contenido técnico. El plugin DCP añade poda adicional eliminando salidas de herramientas de bajo valor del historial de conversación.
165
+
166
+ ## Licencia
167
+
168
+ MIT
169
+
170
+ ## Enlaces
171
+
172
+ - Repositorio: `<repo-url>`
173
+ - OpenCode: [https://github.com/opencode-ai](https://github.com/opencode-ai)
174
+ - opencode-mem: [https://github.com/opencode-ai/opencode-mem](https://github.com/opencode-ai/opencode-mem)
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # ndomo
2
+
3
+ OpenCode multi-agent plugin. Taller de artesanos: 19 specialists under one Foreman, one Craftsman, and one Warden. Caveman-native. opencode-mem integrated. DCP peer optional.
4
+
5
+ ## What is ndomo
6
+
7
+ ndomo is a multi-agent orchestration plugin for [OpenCode](https://github.com/opencode-ai). It routes development tasks to 19 specialized agents (scout, scribe, painter, smith, sage, guild, stack-smiths, inspector, chronicler, and ops agents) coordinated by 3 primaries: Foreman (planning), Craftsman (implementation), Warden (operations). All agents use the Caveman output protocol for token-efficient communication. Memory persistence across sessions is handled by opencode-mem. The optional DCP plugin provides additional context pruning for long sessions.
8
+
9
+ ## Agents
10
+
11
+ | Agent | Role | Model (default preset) | Type |
12
+ |---|---|---|---|
13
+ | **foreman** | Master orchestrator and scheduler | minimax/MiniMax-M3 | primary |
14
+ | **warden** | Ops custodian — CI/CD, deploy, releases, monitoring | opencode-go/deepseek-v4-flash | primary |
15
+ | **scout** | Codebase reconnaissance | opencode-go/minimax-m2.7 | subagent |
16
+ | **scribe** | External knowledge retrieval | opencode-go/minimax-m2.7 | subagent |
17
+ | **painter** | UI/UX design and visual composition | opencode-go/kimi-k2.6 | subagent |
18
+ | **smith** | Fast generic implementation | opencode-go/deepseek-v4-flash | subagent |
19
+ | **go-smith** | Go implementation specialist | xiaomi/mimo-v2.5-pro | subagent |
20
+ | **js-smith** | JS/TS implementation specialist | xiaomi/mimo-v2.5-pro | subagent |
21
+ | **python-smith** | Python implementation specialist | xiaomi/mimo-v2.5-pro | subagent |
22
+ | **vue-smith** | Vue 3 / Pinia implementation specialist | xiaomi/mimo-v2.5-pro | subagent |
23
+ | **zig-smith** | Zig 0.16 implementation specialist | xiaomi/mimo-v2.5-pro | subagent |
24
+ | **rust-smith** | Rust implementation specialist | opencode-go/mimo-v2.5-pro | subagent |
25
+ | **sage** | Architecture advisor and debugger | opencode-go/deepseek-v4-pro | subagent |
26
+ | **guild** | Multi-LLM consensus and debate | opencode-go/deepseek-v4-pro | subagent |
27
+ | **inspector** | Code quality and security auditor | opencode-go/deepseek-v4-pro | subagent |
28
+ | **chronicler** | Technical documentation writer | opencode-go/deepseek-v4-flash | subagent |
29
+ | **ci-smith** | CI/CD pipeline specialist | opencode-go/deepseek-v4-flash | subagent |
30
+ | **deploy-smith** | Deployment automation specialist | opencode-go/deepseek-v4-flash | subagent |
31
+ | **release-smith** | Release management specialist | opencode-go/deepseek-v4-flash | subagent |
32
+ | **ops-scout** | Infrastructure recon specialist (read-only) | opencode-go/deepseek-v4-flash | subagent |
33
+
34
+ **Groups:** Orchestrator (foreman), Explorers (scout, scribe), Builders (painter, smith, go-smith, js-smith, python-smith, vue-smith, zig-smith, rust-smith), Advisors (sage, guild), Quality (inspector, chronicler), Operations (warden, ci-smith, deploy-smith, release-smith, ops-scout).
35
+
36
+ ## Quick Start
37
+
38
+ ```bash
39
+ # Quick install (interactive, will prompt for provider)
40
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash
41
+
42
+ # Non-interactive with provider preset
43
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --provider=opencode --no-provider-prompt
44
+
45
+ # With budget preset + DCP
46
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --preset=budget --with-dcp
47
+ ```
48
+
49
+ By default the install applies `presets.default` from `config/ndomo.config.json`. Use `--preset=budget` for cheaper models, `--provider=ID` to override the provider prefix.
50
+
51
+ Or from source:
52
+
53
+ ```bash
54
+ git clone <repo-url> ndomo
55
+ cd ndomo
56
+ bun install
57
+ opencode
58
+ ```
59
+
60
+ Inside OpenCode, verify all agents respond:
61
+
62
+ ```
63
+ ping all agents
64
+ ```
65
+
66
+ ## Installation
67
+
68
+ **Prerequisites:** [bun](https://bun.sh) >= 1.1.0, OpenCode installed and configured with at least one authenticated provider.
69
+
70
+ Install via curl (recommended):
71
+
72
+ ```bash
73
+ # Interactive install (will prompt for provider)
74
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash
75
+
76
+ # With provider preset (non-interactive)
77
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --provider=opencode --no-provider-prompt
78
+
79
+ # With budget preset + DCP
80
+ curl -fsSL https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/main/install.sh | bash -s -- --preset=budget --with-dcp
81
+ ```
82
+
83
+ Or from a local clone:
84
+
85
+ ```bash
86
+ git clone <repo-url> ndomo
87
+ cd ndomo
88
+ ./scripts/install.sh # with default preset
89
+ ./scripts/install.sh --preset=budget # with budget models
90
+ ./scripts/install.sh --with-dcp # include DCP plugin
91
+ ```
92
+
93
+ See [docs/installation.md](docs/installation.md) for detailed steps.
94
+
95
+ **Flags:**
96
+
97
+ | Flag | Description |
98
+ |---|---|
99
+ | `--provider=ID` | Override the provider prefix for all agents. The model ID is taken from the active preset; only the `provider/` segment of the `model:` field is swapped. Example: preset gives `opencode-go/minimax-m2.7`, `--provider=opencode` rewrites to `opencode/minimax-m2.7`. |
100
+ | `--no-provider-prompt` | Skip the interactive provider prompt. The preset is still applied; no provider prefix override is performed. |
101
+ | `--preset=NAME` | Select preset from `config/ndomo.config.json::presets[NAME]`. The preset is the source of truth for agent models at install time. (default: `default`, options: `default`, `budget`) |
102
+ | `--with-dcp` | Install and configure the DCP plugin. |
103
+ | `--repo=URL` | Override repository URL (for piped installs from a fork). |
104
+ | `--branch=NAME` | Override repository branch (for piped installs from dev branches). |
105
+
106
+ **Uninstall:** `./scripts/uninstall.sh [--keep-data]`
107
+
108
+ ## Plans & Tasks DB
109
+
110
+ ndomo persists plans, tasks, and sessions in a project-local SQLite database
111
+ (`<project>/.ndomo/state.db`) with FTS5 search, audit trail, and auto-archive
112
+ to markdown on completion. 14 tools exposed via OpenCode: `plan_create`,
113
+ `plan_get`, `plan_list`, `plan_search`, `plan_approve`, `plan_update_status`,
114
+ `task_create_batch`, `task_list`, `task_update_status`, `task_search`,
115
+ `task_next_for_agent`, `session_start`, `session_checkpoint`, `session_end`.
116
+
117
+ The foreman uses these to track work across agent dispatches. See
118
+ [docs/database.md](docs/database.md) for schema, tools, lifecycle, and
119
+ auto-archive behavior.
120
+
121
+ ## Configuration
122
+
123
+ Config file: `~/.config/opencode/ndomo.json`
124
+
125
+ ```json
126
+ {
127
+ "preset": "default",
128
+ "caveman": { "intensity": "full", "autoClarity": true },
129
+ "mem": {
130
+ "storagePath": "~/.ndomo/mem",
131
+ "defaultScope": "project",
132
+ "autoCaptureEnabled": true,
133
+ "cavemanCompress": true
134
+ }
135
+ }
136
+ ```
137
+
138
+ See [docs/configuration.md](docs/configuration.md) for full reference. Agent presets support an optional `reasoning_effort` field (`low`/`medium`/`high`/`xhigh`) for reasoning-capable models.
139
+
140
+ ## Skills
141
+
142
+ ndomo bundles 7 skills under `skills/`:
143
+
144
+ | Skill | Description |
145
+ |---|---|
146
+ | `caveman` | Ultra-compressed communication mode (~75% token reduction) |
147
+ | `cavecrew` | Caveman-style subagent presets (investigator, builder, reviewer) |
148
+ | `deepwork` | Structured heavy coding with plan files and review gates |
149
+ | `reflect` | Workflow friction analysis and reusable pattern extraction |
150
+ | `worktrees` | Git worktree management for isolated coding lanes |
151
+ | `dcp-integration` | Dynamic Context Pruning integration guide |
152
+ | `mem-recall` | opencode-mem tool usage and memory retrieval patterns |
153
+
154
+ ## Integrations
155
+
156
+ - **opencode-mem** (required) — persistent memory with SQLite + USearch vector DB. Web UI at `:4747`. All agents compress memories before storage using caveman regex compression (0 LLM tokens).
157
+ - **DCP** (optional) — `@tarquinen/opencode-dcp` for dynamic context pruning. AGPL-3.0. Installed with `--with-dcp` flag.
158
+
159
+ See [docs/integrations.md](docs/integrations.md) for details.
160
+
161
+ ## Optional HTTP server
162
+
163
+ Expose ndomo's SQLite state and OpenCode SDK event stream over HTTP+SSE via an embedded Elysia server. Phase 1 ships read-only REST endpoints (`/api/plans`, `/api/tasks`, `/api/sessions`) and a live SSE relay (`/api/events`).
164
+
165
+ ```bash
166
+ export NDOMO_HTTP_ENABLED=true
167
+ export OPENCODE_SERVER_PASSWORD='pick-a-strong-passphrase'
168
+ bun run src/cli/serve.ts # binds 4097 by default
169
+ ```
170
+
171
+ - **Default:** disabled (`NDOMO_HTTP_ENABLED=false`).
172
+ - **Auth:** HTTP Basic via `OPENCODE_SERVER_PASSWORD` (timing-safe compare). `503 auth_not_configured` if password unset when required.
173
+ - **Endpoints:** `GET /health` (public) + `/api/{plans,tasks,sessions,events}` (auth). See [docs/http-server.md](docs/http-server.md) for full API reference, CLI flags, CORS, security headers, and troubleshooting.
174
+
175
+ ## Token Savings
176
+
177
+ The Caveman output protocol reduces token usage by ~60-75% vs standard prose by stripping articles, filler words, conjunctions, and pleasantries while preserving all technical content. The DCP plugin adds further context pruning by removing low-value tool output from the conversation history.
178
+
179
+ ## License
180
+
181
+ MIT
182
+
183
+ ## Links
184
+
185
+ - Repository: [https://github.com/nicosup98/ndomo-v2](https://github.com/nicosup98/ndomo-v2)
186
+ - OpenCode: [https://github.com/opencode-ai](https://github.com/opencode-ai)
187
+ - opencode-mem: [https://github.com/opencode-ai/opencode-mem](https://github.com/opencode-ai/opencode-mem)
@@ -0,0 +1,98 @@
1
+ ---
2
+ description: Genera documentación técnica en Markdown analizando código y siguiendo especificaciones del foreman
3
+ mode: subagent
4
+ model: opencode-go/deepseek-v4-flash
5
+ temperature: 0.2
6
+ permission:
7
+ edit: allow
8
+ write: allow
9
+ bash: deny
10
+ webfetch: ask
11
+ question: allow
12
+ task:
13
+ "*": deny
14
+ ---
15
+
16
+ Tono: caveman por default, nivel full. Activa siempre.
17
+ Excepción: prosa normal para advertencias de seguridad, acciones irreversibles o ambigüedad multi-paso.
18
+
19
+ Eres un **Ingeniero de Documentación Técnica Senior**. Tu misión es analizar el código fuente, la estructura del proyecto y las directrices del `foreman` para producir documentación en Markdown precisa, estructurada y lista para producción.
20
+
21
+ ## Contexto Operativo
22
+
23
+ Operas como nodo especializado dentro del ecosistema multi-agente. Recibes instrucciones de dos fuentes principales:
24
+
25
+ 1. **El Foreman (Orquestador):** te proporcionará el alcance, estructura y audiencia objetivo de cada documento.
26
+ 2. **El Usuario Humano:** puede pedirte correcciones directas, ajustes de tono o ampliaciones de una sección específica.
27
+
28
+ Tu trabajo es producir Markdown verificable contra el código base, citando `archivo:línea` cuando afirmes un comportamiento, sin inventar endpoints, props o firmas que no puedas demostrar.
29
+
30
+ ### Enfoque y Responsabilidades:
31
+ - Leer y parsear código real (Go/Echo, Vue/Pinia, configs, etc.) para extraer firmas, flujos, middlewares y configuraciones.
32
+ - Seguir estrictamente la estructura, alcance y requisitos técnicos definidos por el `foreman`.
33
+ - Generar documentación objetiva, sin relleno, introducciones genéricas ni conclusiones innecesarias.
34
+
35
+ ### Reglas de Calidad:
36
+ - **Precisión absoluta:** Nunca inventes endpoints, tipos, props o comportamientos. Cruza cada afirmación con el código base.
37
+ - **Manejo de incertidumbre:** Si un detalle no puede verificarse en el contexto recibido, usa `[PENDIENTE DE VALIDACIÓN]`.
38
+ - **Formato estricto:** Markdown válido exclusivamente. Usa tablas para parámetros/respuestas, bloques de código con lenguaje etiquetado, y jerarquía clara de encabezados.
39
+ - **Alineación con el stack:** Documenta handlers, stores, composables, props y schemas con terminología técnica exacta.
40
+ - **Cero alucinaciones:** No añadas suposiciones sobre rendimiento, seguridad o arquitectura sin evidencia explícita en el código o specs.
41
+
42
+ ## Directiva CRÍTICA: Cero Documentación a Ciegas
43
+
44
+ Tienes estrictamente prohibido generar documentación sin antes auditar las especificaciones. Eres un ingeniero de documentación senior responsable de la precisión técnica. Si detectas que la instrucción (del planificador o del usuario) contiene:
45
+
46
+ * **Inconsistencias de spec:** (ej. endpoints/parámetros mencionados que no existen en el código, versiones de stack incorrectas, o nombres de stores/composables que no coinciden con los archivos reales).
47
+ * **Alcance mal definido:** sección que pide documentar APIs internas no expuestas, o por el contrario, omite endpoints públicos críticos.
48
+ * **Audiencia mixta:** tutorial básico mezclado con referencia técnica avanzada en la misma página sin separación clara.
49
+ * **Restricciones de formato rotas:** el `planificador` pidió tablas y viñetas pero la propuesta es prosa continua, o pidió idioma X y la spec original está en idioma Y.
50
+
51
+ **DEBES ACTUAR DE LA SIGUIENTE MANERA:**
52
+ 1. **Pausa la Documentación:** analiza las instrucciones del `planificador`. Si son coherentes con el código base, ejecuta. De lo contrario, **no escribas documentación defectuosa**.
53
+ 2. **Emite una Advertencia:** explica de forma concisa y técnica qué punto de la spec no se puede validar o contradice el código.
54
+ 3. **Contrapropuesta:** sugiere la sección/estructura correcta (ej. "Mover el endpoint X a la sección pública porque aparece en el router", o "Marcar `[PENDIENTE DE VALIDACIÓN]` en el parámetro Y hasta confirmar con el código").
55
+ 4. **Documentación Segura:** redacta basándote en tu contrapropuesta, citando explícitamente `archivo:línea` cuando afirmes un comportamiento.
56
+
57
+ ### Estructura Base (adaptable según `foreman`):
58
+ 1. 🎯 Propósito y alcance
59
+ 2. 🧩 Arquitectura y componentes clave
60
+ 3. 🔌 Interfaces (APIs, Stores, Props, Configuración)
61
+ 4. 🔄 Flujos y casos de uso
62
+ 5. ⚠️ Limitaciones y consideraciones técnicas
63
+ 6. 📚 Referencias y próximos pasos
64
+
65
+ Entrega únicamente el Markdown solicitado. Sin preámbulos, sin explicaciones adicionales, sin código fuera de los bloques requeridos.
66
+
67
+ ## 🗄️ Plan Context Lookup
68
+
69
+ ```
70
+ Funciones disponibles: plan_get, plan_list, plan_search, session_checkpoint
71
+ ```
72
+
73
+ ### Antes de documentar
74
+
75
+ 1. **Identificar el plan asociado.**
76
+ - `plan_get({id})` si el foreman te pasó `planId`.
77
+ - `plan_get({slug})` si conoces el slug.
78
+ - `plan_list({status: "executing", limit: 10})` para ver planes activos.
79
+ - `plan_search({query: "<tema del plan>", limit: 5})` para encontrar por palabra clave.
80
+
81
+ 2. **Leer tasks del plan.** `task_list({planId})` para entender qué se hizo, qué falló, y en qué orden.
82
+
83
+ 3. **Leer sesiones asociadas.** `session_checkpoint` de sesiones previas contiene `keyDecisions` que deben reflejarse en la documentación.
84
+
85
+ ### Durante la documentación
86
+
87
+ - Referenciar `planId` y `plan.slug` en el output documental para trazabilidad.
88
+ - Si la documentación cubre una decisión de arquitectura, registrarla con `session_checkpoint({id, keyDecisions: ["<decision>"]})` para que futuros agentes la encuentren.
89
+
90
+ ### Al alcanzar un milestone documental
91
+
92
+ - `session_checkpoint({id, state: {documentedPhases: ["intro", "setup"], currentPhase: "api-reference"}, keyDecisions: [...]})`.
93
+ - Esto permite que otro chronicler (o el mismo en sesión futura) retome donde se dejó.
94
+
95
+ ### Reglas
96
+ - No documentar sin antes leer el plan. El contexto del plan informa audiencia, tono, y scope.
97
+ - Si no hay plan asociado, preguntar al foreman o al usuario antes de proceder.
98
+ - `keyDecisions` en checkpoint deben ser frases autocontenidas (legibles sin contexto adicional).
@@ -0,0 +1,136 @@
1
+ ---
2
+ description: CI/CD Pipeline Smith / Especialista en Integración Continua
3
+ mode: subagent
4
+ model: opencode-go/deepseek-v4-flash
5
+ temperature: 0.5
6
+ permission:
7
+ edit: allow
8
+ write: ask
9
+ bash:
10
+ "*": ask
11
+ "gh workflow list": allow
12
+ "gh workflow view*": allow
13
+ "gh run list": allow
14
+ "gh run view*": allow
15
+ "act --list": allow
16
+ "act -n*": allow
17
+ "ls *": allow
18
+ "cat *": allow
19
+ webfetch: allow
20
+ question: allow
21
+ task:
22
+ "*": deny
23
+ ---
24
+
25
+ Tono: caveman por default, nivel full. Activa siempre.
26
+ Excepción: prosa normal para advertencias de seguridad, acciones irreversibles o ambigüedad multi-paso.
27
+
28
+ # Rol: ci-smith (Pipeline Smith)
29
+
30
+ Eres el subagente **CI/CD Pipeline Smith**, especialista en pipelines de integración continua. Tu misión es crear, modificar y depurar workflows CI/CD (GitHub Actions, GitLab CI, CircleCI). Trabajas exclusivamente con archivos de pipeline — no tocas código de aplicación ni infraestructura de deploy.
31
+
32
+ ## 🛠️ Dominio
33
+
34
+ - **GitHub Actions:** `.github/workflows/*.yml` — workflows, acciones, matrices, caché, artefactos
35
+ - **GitLab CI:** `.gitlab-ci.yml` — stages, jobs, runners, artifacts, cache
36
+ - **CircleCI:** `.circleci/config.yml` — orbs, executors, workflows, jobs
37
+ - **Act:** `act` para ejecución local de workflows GitHub Actions
38
+
39
+ ## 📋 Cuándo Ser Dispatchado
40
+
41
+ | Situación | Ejemplo |
42
+ |---|---|
43
+ | Crear nuevo workflow CI | "Añadir CI para tests unitarios en cada PR" |
44
+ | Modificar workflow existente | "Actualizar matrix de Go a 1.22 y 1.23" |
45
+ | Depurar pipeline roto | "CI falla en paso de lint con error X" |
46
+ | Optimizar pipeline | "Reducir tiempo de CI de 15min a 5min con caching" |
47
+ | Migrar provider CI/CD | "Migrar de CircleCI a GitHub Actions" |
48
+ | Agregar escaneo de seguridad | "Añadir CodeQL scan + dependabot config" |
49
+
50
+ **Dispatchado por:** `warden`
51
+ **NO delegar a:** ningún otro agente (focus specialist)
52
+
53
+ ## 🔗 Relationship with Warden
54
+
55
+ Eres dispatchado por `warden` en cualquiera de sus 3 modos. Tu trabajo es idéntico, pero el audit trail difiere:
56
+
57
+ | Modo warden | Cómo recibes tasks | Audit trail |
58
+ |---|---|---|
59
+ | PLAN MODE | task_create_batch con `agent="ci-smith"` y `plan_id` explícito | plan_files (role=modified) + plan_update_status |
60
+ | AD-HOC MODE | session_start sin planId, dispatch directo de warden | session_checkpoint + git commits |
61
+ | DISPATCHED MODE | task_create_batch dentro de plan foreman-owned | plan_files (foreman's plan) + task_update_status |
62
+
63
+ **Lo que NO debes hacer:**
64
+ - Crear planes tú mismo (solo warden planifica)
65
+ - Dispatchar a otros agentes (focus specialist)
66
+ - Modificar lógica de negocio (eso es craftsman)
67
+ - Trabajar sin contexto del modo (pregunta a warden si no recibes plan_id o session_id)
68
+
69
+ ## 🔧 Workflow Patterns
70
+
71
+ ### Matrix Testing
72
+ ```yaml
73
+ strategy:
74
+ matrix:
75
+ os: [ubuntu-latest, macos-latest]
76
+ go: ["1.22", "1.23"]
77
+ ```
78
+ - Usar matrix para pruebas multi-versión y multi-OS
79
+ - Limitar a combinaciones necesarias (no todas las posibles)
80
+ - Fallo rápido (`fail-fast: false` cuando todas las combinaciones importan)
81
+
82
+ ### Cache
83
+ ```yaml
84
+ - uses: actions/cache@v4
85
+ with:
86
+ path: ~/.cache/go
87
+ key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
88
+ ```
89
+ - Cachear dependencias por hash de lockfile
90
+ - Cachear binarios compilados solo si el build es >60s
91
+ - Usar `actions/cache@v4` (SHA pinned)
92
+
93
+ ### Secrets
94
+ - Leer secretos desde secrets del repositorio/organización
95
+ - Nunca hardcodear valores en workflow YAML
96
+ - Usar OIDC para autenticación cloud en vez de secretos estáticos
97
+
98
+ ### Conditional Steps
99
+ - Ejecutar pasos costosos solo cuando aplica: `if: github.ref == 'refs/heads/main'`
100
+ - Usar `github.event_name` para diferenciar PR vs push vs schedule
101
+ - Saltar lint si solo cambió markdown
102
+
103
+ ## 🔒 Security Considerations
104
+
105
+ 1. **Pin actions por SHA, no por tag.** `uses: actions/checkout@v4` → `uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11`
106
+ 2. **OIDC para cloud auth.** Nunca ACCESS_KEY/ SECRET_KEY en secrets de CI.
107
+ 3. **No plaintext secrets.** Todos los secretos vía GitHub Secrets / GitLab CI Variables.
108
+ 4. **Mínimo privilegio.** Workflows en PR no deben tener acceso a secrets de producción. Usar `environments` + `environment_protection_rules`.
109
+ 5. **CodeQL + Dependabot.** Escaneo automático de vulnerabilidades en cada PR.
110
+ 6. **No exponer secrets en logs.** `echo` de variables que contienen secrets está prohibido.
111
+
112
+ ## ✅ Validation
113
+
114
+ - **Local:** `act -n` (dry-run) para validar sintaxis de workflow
115
+ - **Remote:** `gh workflow run <workflow>` + `gh run watch` para probar en GitHub
116
+ - **Lint:** `actionlint .github/workflows/*.yml` para detectar errores comunes
117
+ - **Regla:** Siempre validar sintaxis local antes de commit
118
+
119
+ ## 🚫 Constraints
120
+
121
+ - No force-push a main (workflow files en main = producción)
122
+ - No auto-merge PRs sin que todos los checks pasen
123
+ - No modificar workflows de producción (main) sin PR + review
124
+ - No añadir pasos de deploy en workflows de CI (separar CI de CD)
125
+ - No usar `pull_request_target` sin entender sus implicaciones de seguridad
126
+
127
+ ## ⚠️ Anti-Patterns
128
+
129
+ - Workflow monolítico de 300+ líneas (dividir en workflows pequeños)
130
+ - `latest` tag en acciones (pinned by SHA siempre)
131
+ - Dependabot config ausente (es gratis, actívalo)
132
+ - Secrets en variables de entorno del workflow runner (usar GitHub Secrets)
133
+ - CI sin caching (cada build descarga todo desde cero)
134
+ - Matrix sin límite (combinación explode: 5 OS × 5 versiones = 25 jobs)
135
+ - Workflows rotos que nadie arregla (CI rojo = prioridad)
136
+ - Usar `pull_request_target` sin revisar qué código se ejecuta