@jmanuelcorral/openteam 0.2.1 → 0.9.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 (312) hide show
  1. package/.opencode/command/openteam.md +2 -1
  2. package/.opencode/openteam.example.json +27 -8
  3. package/AGENTS.md +5 -2
  4. package/README.es.md +155 -59
  5. package/README.md +418 -62
  6. package/dist/capabilities/types.d.ts +3 -3
  7. package/dist/capabilities/types.d.ts.map +1 -1
  8. package/dist/classifier/localClassifier.d.ts +0 -2
  9. package/dist/classifier/localClassifier.d.ts.map +1 -1
  10. package/dist/cli/consoleServe.d.ts +30 -1
  11. package/dist/cli/consoleServe.d.ts.map +1 -1
  12. package/dist/cli/graphOperator.d.ts +22 -0
  13. package/dist/cli/graphOperator.d.ts.map +1 -0
  14. package/dist/cli/graphStatusSnapshot.d.ts +16 -0
  15. package/dist/cli/graphStatusSnapshot.d.ts.map +1 -0
  16. package/dist/cli/graphViewProvider.d.ts +30 -0
  17. package/dist/cli/graphViewProvider.d.ts.map +1 -0
  18. package/dist/cli/migrateAdapter.d.ts +12 -0
  19. package/dist/cli/migrateAdapter.d.ts.map +1 -0
  20. package/dist/cli/purgeAdapter.d.ts +10 -0
  21. package/dist/cli/purgeAdapter.d.ts.map +1 -0
  22. package/dist/cli/setupAdapters.d.ts.map +1 -1
  23. package/dist/cli.js +13480 -5176
  24. package/dist/commands/agents.d.ts +102 -2
  25. package/dist/commands/agents.d.ts.map +1 -1
  26. package/dist/commands/baseline.d.ts.map +1 -1
  27. package/dist/commands/clearCache.d.ts +23 -0
  28. package/dist/commands/clearCache.d.ts.map +1 -0
  29. package/dist/commands/dispatch.d.ts +197 -4
  30. package/dist/commands/dispatch.d.ts.map +1 -1
  31. package/dist/commands/doctor.d.ts +40 -0
  32. package/dist/commands/doctor.d.ts.map +1 -1
  33. package/dist/commands/frontierCatalog.d.ts +8 -14
  34. package/dist/commands/frontierCatalog.d.ts.map +1 -1
  35. package/dist/commands/graph.d.ts +0 -27
  36. package/dist/commands/graph.d.ts.map +1 -1
  37. package/dist/commands/local.d.ts.map +1 -1
  38. package/dist/commands/migrate.d.ts +11 -0
  39. package/dist/commands/migrate.d.ts.map +1 -0
  40. package/dist/commands/purge.d.ts +132 -0
  41. package/dist/commands/purge.d.ts.map +1 -0
  42. package/dist/commands/report.d.ts +1 -0
  43. package/dist/commands/report.d.ts.map +1 -1
  44. package/dist/commands/setup.d.ts +62 -5
  45. package/dist/commands/setup.d.ts.map +1 -1
  46. package/dist/config/errors.d.ts +10 -0
  47. package/dist/config/errors.d.ts.map +1 -0
  48. package/dist/config/legacyMigration.d.ts +82 -0
  49. package/dist/config/legacyMigration.d.ts.map +1 -0
  50. package/dist/config/legacyPaths.d.ts +105 -0
  51. package/dist/config/legacyPaths.d.ts.map +1 -0
  52. package/dist/config/load.d.ts.map +1 -1
  53. package/dist/config/opencode.d.ts +63 -0
  54. package/dist/config/opencode.d.ts.map +1 -0
  55. package/dist/config/persist.d.ts +8 -0
  56. package/dist/config/persist.d.ts.map +1 -1
  57. package/dist/config/resolve.d.ts +1 -1
  58. package/dist/config/resolve.d.ts.map +1 -1
  59. package/dist/config/runtime.d.ts +62 -0
  60. package/dist/config/runtime.d.ts.map +1 -0
  61. package/dist/config/schema.d.ts +145 -77
  62. package/dist/config/schema.d.ts.map +1 -1
  63. package/dist/console/assets.d.ts +2 -2
  64. package/dist/console/assets.d.ts.map +1 -1
  65. package/dist/console/configView.d.ts +74 -0
  66. package/dist/console/configView.d.ts.map +1 -0
  67. package/dist/console/opencodeClient.d.ts +8 -6
  68. package/dist/console/opencodeClient.d.ts.map +1 -1
  69. package/dist/console/protocol.d.ts +30 -6
  70. package/dist/console/protocol.d.ts.map +1 -1
  71. package/dist/console/render.d.ts +30 -1
  72. package/dist/console/render.d.ts.map +1 -1
  73. package/dist/console/types.d.ts +1 -1
  74. package/dist/console/types.d.ts.map +1 -1
  75. package/dist/context/redaction.d.ts +27 -19
  76. package/dist/context/redaction.d.ts.map +1 -1
  77. package/dist/context/schema.d.ts +26 -26
  78. package/dist/context/schema.d.ts.map +1 -1
  79. package/dist/context/types.d.ts +3 -3
  80. package/dist/contract/opencode.d.ts +39 -23
  81. package/dist/contract/opencode.d.ts.map +1 -1
  82. package/dist/graph/certificate.d.ts +37 -16
  83. package/dist/graph/certificate.d.ts.map +1 -1
  84. package/dist/graph/langgraph/adapter.d.ts +56 -0
  85. package/dist/graph/langgraph/adapter.d.ts.map +1 -0
  86. package/dist/graph/langgraph/certification.d.ts +64 -0
  87. package/dist/graph/langgraph/certification.d.ts.map +1 -0
  88. package/dist/graph/langgraph/checkpointReplay.d.ts +49 -0
  89. package/dist/graph/langgraph/checkpointReplay.d.ts.map +1 -0
  90. package/dist/graph/langgraph/checkpointer.d.ts +49 -0
  91. package/dist/graph/langgraph/checkpointer.d.ts.map +1 -0
  92. package/dist/graph/langgraph/engine.d.ts +34 -0
  93. package/dist/graph/langgraph/engine.d.ts.map +1 -0
  94. package/dist/graph/langgraph/graphModel.d.ts +37 -0
  95. package/dist/graph/langgraph/graphModel.d.ts.map +1 -0
  96. package/dist/graph/langgraph/reducer.d.ts +18 -0
  97. package/dist/graph/langgraph/reducer.d.ts.map +1 -0
  98. package/dist/graph/langgraph/retirement.d.ts +59 -0
  99. package/dist/graph/langgraph/retirement.d.ts.map +1 -0
  100. package/dist/graph/langgraph/types.d.ts +65 -0
  101. package/dist/graph/langgraph/types.d.ts.map +1 -0
  102. package/dist/graph/privacyPolicy.d.ts +7 -0
  103. package/dist/graph/privacyPolicy.d.ts.map +1 -1
  104. package/dist/graph/soakLedger.d.ts.map +1 -1
  105. package/dist/graph/types.d.ts +0 -2
  106. package/dist/graph/types.d.ts.map +1 -1
  107. package/dist/index.d.ts +48 -16
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +11596 -4180
  110. package/dist/local/cacheAdapter.d.ts +7 -0
  111. package/dist/local/cacheAdapter.d.ts.map +1 -0
  112. package/dist/local/concurrency.d.ts +52 -0
  113. package/dist/local/concurrency.d.ts.map +1 -0
  114. package/dist/local/embeddings.d.ts +10 -10
  115. package/dist/local/embeddings.d.ts.map +1 -1
  116. package/dist/local/extractClient.d.ts +13 -10
  117. package/dist/local/extractClient.d.ts.map +1 -1
  118. package/dist/local/lemonade.d.ts +4 -0
  119. package/dist/local/lemonade.d.ts.map +1 -0
  120. package/dist/local/registry.d.ts +16 -0
  121. package/dist/local/registry.d.ts.map +1 -1
  122. package/dist/local/types.d.ts +1 -1
  123. package/dist/local/types.d.ts.map +1 -1
  124. package/dist/mcp/semanticRecall.d.ts +18 -1
  125. package/dist/mcp/semanticRecall.d.ts.map +1 -1
  126. package/dist/mcp/server.d.ts +41 -1
  127. package/dist/mcp/server.d.ts.map +1 -1
  128. package/dist/memory/embedText.d.ts +4 -0
  129. package/dist/memory/embedText.d.ts.map +1 -0
  130. package/dist/memory/extract.d.ts +33 -18
  131. package/dist/memory/extract.d.ts.map +1 -1
  132. package/dist/memory/fold.d.ts +3 -2
  133. package/dist/memory/fold.d.ts.map +1 -1
  134. package/dist/memory/index.d.ts +1 -0
  135. package/dist/memory/index.d.ts.map +1 -1
  136. package/dist/memory/inject.d.ts.map +1 -1
  137. package/dist/memory/log.d.ts +15 -4
  138. package/dist/memory/log.d.ts.map +1 -1
  139. package/dist/memory/merge.d.ts +18 -1
  140. package/dist/memory/merge.d.ts.map +1 -1
  141. package/dist/memory/traverse.d.ts +80 -0
  142. package/dist/memory/traverse.d.ts.map +1 -0
  143. package/dist/memory/types.d.ts +53 -7
  144. package/dist/memory/types.d.ts.map +1 -1
  145. package/dist/messages/commands.d.ts +84 -0
  146. package/dist/messages/commands.d.ts.map +1 -0
  147. package/dist/messages/index.d.ts +46 -0
  148. package/dist/messages/index.d.ts.map +1 -0
  149. package/dist/opencodeArtifacts/index.d.ts +33 -0
  150. package/dist/opencodeArtifacts/index.d.ts.map +1 -0
  151. package/dist/opencodeArtifacts/orchestratorAgent.d.ts +29 -0
  152. package/dist/opencodeArtifacts/orchestratorAgent.d.ts.map +1 -0
  153. package/dist/opencodeArtifacts/slashCommand.d.ts +31 -0
  154. package/dist/opencodeArtifacts/slashCommand.d.ts.map +1 -0
  155. package/dist/orchestrator/coordinator.d.ts +188 -2
  156. package/dist/orchestrator/coordinator.d.ts.map +1 -1
  157. package/dist/orchestrator/graphCancellation.d.ts +40 -37
  158. package/dist/orchestrator/graphCancellation.d.ts.map +1 -1
  159. package/dist/orchestrator/graphEffects.d.ts +24 -24
  160. package/dist/orchestrator/graphEffects.d.ts.map +1 -1
  161. package/dist/orchestrator/graphFacade.d.ts +16 -16
  162. package/dist/orchestrator/graphFacade.d.ts.map +1 -1
  163. package/dist/orchestrator/graphIngress.d.ts +49 -45
  164. package/dist/orchestrator/graphIngress.d.ts.map +1 -1
  165. package/dist/orchestrator/graphReview.d.ts +24 -23
  166. package/dist/orchestrator/graphReview.d.ts.map +1 -1
  167. package/dist/orchestrator/graphRuntime.d.ts +27 -26
  168. package/dist/orchestrator/graphRuntime.d.ts.map +1 -1
  169. package/dist/orchestrator/graphShadow.d.ts +70 -69
  170. package/dist/orchestrator/graphShadow.d.ts.map +1 -1
  171. package/dist/orchestrator/opencodeSessionAdapter.d.ts +25 -25
  172. package/dist/orchestrator/opencodeSessionAdapter.d.ts.map +1 -1
  173. package/dist/orchestrator/permissions.d.ts.map +1 -1
  174. package/dist/orchestrator/ralphLoop.d.ts +57 -0
  175. package/dist/orchestrator/ralphLoop.d.ts.map +1 -0
  176. package/dist/orchestrator/roles.d.ts +50 -8
  177. package/dist/orchestrator/roles.d.ts.map +1 -1
  178. package/dist/orchestrator/roster.d.ts +103 -0
  179. package/dist/orchestrator/roster.d.ts.map +1 -0
  180. package/dist/orchestrator/rosterPersistence.d.ts +22 -0
  181. package/dist/orchestrator/rosterPersistence.d.ts.map +1 -0
  182. package/dist/orchestrator/runtimeSelection.d.ts +46 -0
  183. package/dist/orchestrator/runtimeSelection.d.ts.map +1 -0
  184. package/dist/orchestrator/sddCompiler.d.ts +34 -34
  185. package/dist/orchestrator/sddCompiler.d.ts.map +1 -1
  186. package/dist/orchestrator/sessionReconciler.d.ts +31 -29
  187. package/dist/orchestrator/sessionReconciler.d.ts.map +1 -1
  188. package/dist/orchestrator/shadowComparator.d.ts +23 -23
  189. package/dist/orchestrator/shadowComparator.d.ts.map +1 -1
  190. package/dist/orchestrator/subsessions.d.ts.map +1 -1
  191. package/dist/orchestrator/worktreeAdapter.d.ts +12 -12
  192. package/dist/orchestrator/worktreeAdapter.d.ts.map +1 -1
  193. package/dist/orchestrator/worktreeDispatch.d.ts +34 -34
  194. package/dist/orchestrator/worktreeDispatch.d.ts.map +1 -1
  195. package/dist/orchestrator/worktreeReconciler.d.ts +37 -36
  196. package/dist/orchestrator/worktreeReconciler.d.ts.map +1 -1
  197. package/dist/plugin/availability.d.ts.map +1 -1
  198. package/dist/plugin/capture.d.ts +12 -12
  199. package/dist/plugin/capture.d.ts.map +1 -1
  200. package/dist/plugin/commandTool.d.ts +1 -1
  201. package/dist/plugin/commandTool.d.ts.map +1 -1
  202. package/dist/plugin/graphShadowIngress.d.ts +50 -48
  203. package/dist/plugin/graphShadowIngress.d.ts.map +1 -1
  204. package/dist/plugin/graphTool.d.ts +25 -23
  205. package/dist/plugin/graphTool.d.ts.map +1 -1
  206. package/dist/plugin/hooks.d.ts +10 -10
  207. package/dist/plugin/hooks.d.ts.map +1 -1
  208. package/dist/plugin/legacyRunProducer.d.ts +22 -22
  209. package/dist/plugin/legacyRunProducer.d.ts.map +1 -1
  210. package/dist/plugin/memoryInject.d.ts +6 -6
  211. package/dist/plugin/memoryInject.d.ts.map +1 -1
  212. package/dist/plugin/memoryTool.d.ts +36 -0
  213. package/dist/plugin/memoryTool.d.ts.map +1 -0
  214. package/dist/plugin/orchestrateTool.d.ts +230 -0
  215. package/dist/plugin/orchestrateTool.d.ts.map +1 -0
  216. package/dist/plugin/reportRunSchema.d.ts +8 -8
  217. package/dist/plugin/reportRunSchema.d.ts.map +1 -1
  218. package/dist/plugin/sessionTracker.d.ts +15 -15
  219. package/dist/plugin/sessionTracker.d.ts.map +1 -1
  220. package/dist/plugin/shadowPipeline.d.ts +2 -1
  221. package/dist/plugin/shadowPipeline.d.ts.map +1 -1
  222. package/dist/plugin/soakObserver.d.ts +18 -11
  223. package/dist/plugin/soakObserver.d.ts.map +1 -1
  224. package/dist/plugin/toolcalls.d.ts +3 -3
  225. package/dist/router/chooseModel.d.ts.map +1 -1
  226. package/dist/router/frontierBaseline.d.ts +3 -3
  227. package/dist/router/modelSelection.d.ts +12 -4
  228. package/dist/router/modelSelection.d.ts.map +1 -1
  229. package/dist/router/types.d.ts +6 -1
  230. package/dist/router/types.d.ts.map +1 -1
  231. package/dist/storage/graph/snapshot.d.ts.map +1 -1
  232. package/dist/storage/graph/soakRecorder.d.ts +14 -1
  233. package/dist/storage/graph/soakRecorder.d.ts.map +1 -1
  234. package/dist/storage/graph/workspaceLease.d.ts +1 -1
  235. package/dist/storage/graph/workspaceLease.d.ts.map +1 -1
  236. package/dist/storage/graph/worktreeRegistry.d.ts +1 -1
  237. package/dist/storage/graph/worktreeRegistry.d.ts.map +1 -1
  238. package/dist/storage/httpStorageProvider.d.ts +2 -2
  239. package/dist/storage/index/bunSqlite.d.ts +1 -0
  240. package/dist/storage/index/bunSqlite.d.ts.map +1 -1
  241. package/dist/storage/index/memoryConsolidate.d.ts +2 -0
  242. package/dist/storage/index/memoryConsolidate.d.ts.map +1 -1
  243. package/dist/storage/index/memoryEmbeddings.d.ts +51 -0
  244. package/dist/storage/index/memoryEmbeddings.d.ts.map +1 -0
  245. package/dist/storage/index/memoryIndex.d.ts +36 -4
  246. package/dist/storage/index/memoryIndex.d.ts.map +1 -1
  247. package/dist/storage/index/memoryRecall.d.ts +1 -1
  248. package/dist/storage/index/memoryRecall.d.ts.map +1 -1
  249. package/dist/storage/index/memoryRuntime.d.ts +2 -0
  250. package/dist/storage/index/memoryRuntime.d.ts.map +1 -1
  251. package/dist/storage/index/sqliteIndex.d.ts +18 -1
  252. package/dist/storage/index/sqliteIndex.d.ts.map +1 -1
  253. package/dist/storage/path.d.ts.map +1 -1
  254. package/dist/telemetry/aggregate.d.ts +12 -12
  255. package/dist/telemetry/aggregate.d.ts.map +1 -1
  256. package/dist/telemetry/cost.d.ts.map +1 -1
  257. package/dist/telemetry/decisions.d.ts +11 -11
  258. package/dist/telemetry/decisions.d.ts.map +1 -1
  259. package/dist/telemetry/eventLog.d.ts +41 -25
  260. package/dist/telemetry/eventLog.d.ts.map +1 -1
  261. package/dist/telemetry/events.d.ts +79 -34
  262. package/dist/telemetry/events.d.ts.map +1 -1
  263. package/dist/telemetry/fanout.d.ts +18 -0
  264. package/dist/telemetry/fanout.d.ts.map +1 -0
  265. package/dist/telemetry/graphProjection.d.ts +12 -12
  266. package/dist/telemetry/graphProjection.d.ts.map +1 -1
  267. package/dist/telemetry/graphRuntimeHealth.d.ts +26 -26
  268. package/dist/telemetry/graphRuntimeHealth.d.ts.map +1 -1
  269. package/dist/telemetry/graphView.d.ts +20 -20
  270. package/dist/telemetry/graphView.d.ts.map +1 -1
  271. package/dist/telemetry/otel.d.ts +86 -0
  272. package/dist/telemetry/otel.d.ts.map +1 -0
  273. package/dist/telemetry/otelConfig.d.ts +128 -0
  274. package/dist/telemetry/otelConfig.d.ts.map +1 -0
  275. package/dist/telemetry/otelExporter.d.ts +7 -0
  276. package/dist/telemetry/otelExporter.d.ts.map +1 -0
  277. package/dist/telemetry/read.d.ts +18 -4
  278. package/dist/telemetry/read.d.ts.map +1 -1
  279. package/dist/telemetry/types.d.ts +3 -2
  280. package/dist/telemetry/types.d.ts.map +1 -1
  281. package/dist/version.d.ts +3 -0
  282. package/dist/version.d.ts.map +1 -0
  283. package/dist/web/configApi.d.ts +154 -0
  284. package/dist/web/configApi.d.ts.map +1 -0
  285. package/dist/web/configRoute.d.ts +57 -0
  286. package/dist/web/configRoute.d.ts.map +1 -0
  287. package/dist/web/console.d.ts +8 -0
  288. package/dist/web/console.d.ts.map +1 -1
  289. package/dist/web/paths.d.ts +4 -3
  290. package/dist/web/paths.d.ts.map +1 -1
  291. package/dist/web/server.d.ts +30 -1
  292. package/dist/web/server.d.ts.map +1 -1
  293. package/dist/web/start.d.ts +15 -0
  294. package/dist/web/start.d.ts.map +1 -1
  295. package/dist/web/storageRoute.d.ts +2 -2
  296. package/package.json +13 -7
  297. package/dist/cli/tunnel.d.ts +0 -89
  298. package/dist/cli/tunnel.d.ts.map +0 -1
  299. package/dist/commands/orchestratorAgent.d.ts +0 -30
  300. package/dist/commands/orchestratorAgent.d.ts.map +0 -1
  301. package/dist/commands/slashCommand.d.ts +0 -39
  302. package/dist/commands/slashCommand.d.ts.map +0 -1
  303. package/dist/orchestrator/ledger.d.ts +0 -28
  304. package/dist/orchestrator/ledger.d.ts.map +0 -1
  305. package/dist/storage/graph/importLegacy.d.ts +0 -62
  306. package/dist/storage/graph/importLegacy.d.ts.map +0 -1
  307. package/dist/storage/graph/migrateLegacyBriefs.d.ts +0 -32
  308. package/dist/storage/graph/migrateLegacyBriefs.d.ts.map +0 -1
  309. package/dist/storage/graph/migration.d.ts +0 -91
  310. package/dist/storage/graph/migration.d.ts.map +0 -1
  311. package/dist/storage/graph/projections.d.ts +0 -31
  312. package/dist/storage/graph/projections.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: openteam runtime commands (baseline show|set|auto, doctor, agents, console, report)
2
+ description: openteam runtime commands (baseline show|set|auto, doctor, agents, console, report, clear-cache)
3
3
  ---
4
4
 
5
5
  Use the `openteam` tool to execute the command indicated by the user: $ARGUMENTS
@@ -13,5 +13,6 @@ Interpret the arguments like this and call the `openteam` tool exactly once:
13
13
  - `agents` → `action: "agents"`
14
14
  - `console` → `action: "console"`
15
15
  - `report` → `action: "report"`
16
+ - `clear-cache` → `action: "clear-cache"`
16
17
 
17
18
  Return the tool output as-is, without reinterpreting it.
@@ -9,10 +9,7 @@
9
9
  },
10
10
  "router": {
11
11
  "mode": "balanced",
12
- "localDefault": {
13
- "providerID": "ollama",
14
- "modelID": "qwen3:8b"
15
- },
12
+ "localDefault": null,
16
13
  "trivialPromptMaxChars": 280,
17
14
  "frontierPromptMinChars": 2000
18
15
  },
@@ -20,7 +17,7 @@
20
17
  "runtimes": [
21
18
  {
22
19
  "id": "ollama",
23
- "enabled": true,
20
+ "enabled": false,
24
21
  "baseURL": "http://localhost:11434/v1",
25
22
  "defaultModel": {
26
23
  "providerID": "ollama",
@@ -29,16 +26,25 @@
29
26
  },
30
27
  {
31
28
  "id": "lmstudio",
32
- "enabled": true,
29
+ "enabled": false,
33
30
  "baseURL": "http://localhost:1234/v1",
34
31
  "defaultModel": {
35
32
  "providerID": "lmstudio",
36
33
  "modelID": "qwen2.5-coder-local"
37
34
  }
38
35
  },
36
+ {
37
+ "id": "lemonade",
38
+ "enabled": false,
39
+ "baseURL": "http://localhost:8000/api/v1",
40
+ "defaultModel": {
41
+ "providerID": "lemonade",
42
+ "modelID": "Qwen3-Coder-30B-A3B-Instruct-GGUF"
43
+ }
44
+ },
39
45
  {
40
46
  "id": "foundry-local",
41
- "enabled": true,
47
+ "enabled": false,
42
48
  "discovery": "cli",
43
49
  "defaultModel": {
44
50
  "providerID": "foundry-local",
@@ -55,8 +61,21 @@
55
61
  },
56
62
  "privacyMode": "forceLocalOnSensitive",
57
63
  "graph": {
58
- "mode": "off",
64
+ "mode": "shadow",
59
65
  "killSwitch": false,
60
66
  "operatorApproval": false
67
+ },
68
+ "orchestrator": {
69
+ "roles": {
70
+ "galadriel": {
71
+ "opencodeAgent": "galadriel",
72
+ "defaultTier": "moderate",
73
+ "minReasoningTier": 3,
74
+ "minCodeQualityTier": 3,
75
+ "needsToolCallingByDefault": true,
76
+ "preferredFrontierModels": [],
77
+ "localFirst": true
78
+ }
79
+ }
61
80
  }
62
81
  }
package/AGENTS.md CHANGED
@@ -15,9 +15,11 @@ openteam is an opencode plugin built with **TypeScript + Bun** with **local-firs
15
15
  - Read `docs/architecture.md`, `docs/testing-and-quality.md`, and `PLAN.md` before large changes.
16
16
  - `router/` is pure: no I/O, clock, random, env vars, or logs.
17
17
  - `plugin/` contains opencode hooks; any use of an undocumented surface needs a contract test.
18
- - `local/` isolates Ollama, LM Studio, and Foundry Local.
18
+ - `local/` isolates Ollama, LM Studio, Lemonade Server, and Foundry Local.
19
19
  - `config/` validates and persists `.opencode/openteam.json`.
20
20
  - `telemetry/` does not store full prompts; it uses a hash and redacted metadata.
21
+ - `messages/` holds all user-facing text; it is pure and has no I/O.
22
+ - `opencodeArtifacts/` builds the `.opencode/agent/*.md` and `.opencode/command/*.md` content that opencode consumes. That prose is model-facing, not user-facing — do not extract it into the message catalog.
21
23
 
22
24
  ## opencode config and agents
23
25
 
@@ -32,6 +34,7 @@ openteam is an opencode plugin built with **TypeScript + Bun** with **local-firs
32
34
  - Code, paths, types, and identifiers: English.
33
35
  - TypeScript strict, ESM only, Zod at boundaries.
34
36
  - Biome governs lint/format; do not introduce ESLint/Prettier unless a new decision is made.
37
+ - **Any string a user can read — CLI output, warnings, errors surfaced to the user, prompts — must live in `src/messages/`, not inlined at the call site.** Strings that are not user-facing (log keys, ids, file paths, protocol literals, SQL, test fixtures, model-facing artifact prose) stay where they are. Enforcement: `tests/contract/messages-catalog-ratchet.test.ts` (shared literal walker: `tests/contract/literalWalker.ts`) gates `*.ts` files under `src/commands/**` and `src/console/**` — the CLI output layer. It deliberately does not gate all of `src/**`; `src/storage/**`, `src/plugin/**` etc. carry SQL and model-prompt prose that a detector cannot distinguish from user text. Every gated file is in exactly one of two lists: **MIGRATED** (must contain zero detectable inline user-facing messages — gaining one fails the build) or **LEGACY** (not yet extracted — the list may only shrink; when a LEGACY file no longer has any detectable message the gate fails and tells you to promote it). A new `src/commands/**` or `src/console/**` file that appears in neither list also fails, forcing an explicit, reviewable choice. Adding a file to a list to turn a red build green is a fake fix — the gate's own error message says so. Note: MIGRATED means "no *detectable* inline message"; the detector is high-precision / lower-recall by design.
35
38
 
36
39
  ## Test-first with Gherkin
37
40
 
@@ -51,6 +54,6 @@ openteam is an opencode plugin built with **TypeScript + Bun** with **local-firs
51
54
  ## Non-negotiables
52
55
 
53
56
  - No merge without tests, coverage, typecheck, lint/format, and determinism green.
54
- - Do not send `privacySensitive` data to frontier with `forceLocalOnSensitive`.
57
+ - Privacy-sensitive tasks prefer local and are never misleadingly labelled. When `privacyMode` is `"forceLocalOnSensitive"` and a local runtime is configured, sensitive prompts stay local. When **no local runtime is configured**, they escalate to the frontier model, labelled `"frontier"` in telemetry, with rationale `"privacy-force-local-none-configured"` recorded. Hard blocking remains available via the `alwaysLocal` explicit override or the `blockFrontier` budget action. A startup warning fires when the privacy setting is inert (no local runtime configured).
55
58
  - Do not hardcode a premium frontier as the baseline: use a configurable cheapest-capable one.
56
59
  - Do not depend on real local runtimes, network, or secrets in CI.
package/README.es.md CHANGED
@@ -35,7 +35,7 @@ El router mantiene una garantía de privacidad: con `privacyMode: "forceLocalOnS
35
35
  ## Características
36
36
 
37
37
  - Routing por turno desde el hook `chat.message`, mutando `output.message.model` antes de que opencode persista el mensaje.
38
- - Registro de runtimes locales OpenAI-compatible: Ollama, LM Studio y Foundry Local.
38
+ - Registro de runtimes locales OpenAI-compatible: Ollama, LM Studio, Lemonade Server y Foundry Local.
39
39
  - Clasificador local JSON con fallback heurístico determinista.
40
40
  - Perfiles de capacidad desde Models.dev, con cache y fallback curado cuando el catálogo no está disponible.
41
41
  - Selección frontier **cheapest-capable** por coste blended `0.75 * inputUSD + 0.25 * outputUSD`.
@@ -46,12 +46,13 @@ El router mantiene una garantía de privacidad: con `privacyMode: "forceLocalOnS
46
46
 
47
47
  ## Requisitos
48
48
 
49
- - opencode compatible con `@opencode-ai/plugin` `1.18.18`.
49
+ - opencode compatible con `@opencode-ai/plugin` `1.18.19`.
50
50
  - Bun `1.3.14` para instalaciones, desarrollo y tests reproducibles.
51
51
  - Node.js `^22.22.2 || ^24.15.0 || >=26.0.0` para la CLI y el plugin publicados.
52
52
  - Runtimes locales opcionales:
53
53
  - Ollama en `http://localhost:11434/v1`.
54
54
  - LM Studio en `http://localhost:1234/v1`.
55
+ - Lemonade Server en `http://localhost:8000/api/v1`.
55
56
  - Foundry Local con puerto dinámico descubierto por CLI en Windows.
56
57
 
57
58
  ## Instalación
@@ -68,6 +69,8 @@ El paquete se publica como `@jmanuelcorral/openteam`. Estas son las rutas de ins
68
69
 
69
70
  La instalación global con npm **no está soportada**. Bun es el único instalador de paquetes soportado. Node.js ejecuta la CLI y el plugin publicados dentro del rango declarado de engines; npm se limita a operaciones de mantenedor: `pack`, Trusted Publishing y `link:local`.
70
71
 
72
+ > **Ruta de GitHub Packages:** las versiones se publican tanto en npmjs como en GitHub Packages privado. Consulta [docs/es/guide/install-github-packages.md](docs/es/guide/install-github-packages.md) para el procedimiento de instalación autenticada desde GitHub Packages, configuración del PATH en zsh y verificación del proveedor Lemonade.
73
+
71
74
  Para la carga directa desde opencode, basta con referenciar el paquete:
72
75
 
73
76
  ```jsonc
@@ -127,7 +130,7 @@ Para la carga directa desde opencode, basta con referenciar el paquete:
127
130
  "privacyMode": "forceLocalOnSensitive",
128
131
  "telemetry": {
129
132
  "enabled": true,
130
- "path": ".opencode/openteam-telemetry.jsonl"
133
+ "path": ".opencode/openteam-local/telemetry.jsonl"
131
134
  }
132
135
  }
133
136
  ]
@@ -187,7 +190,7 @@ Durante desarrollo puedes cargar un plugin local desde `.opencode/plugins/opente
187
190
  }
188
191
  },
189
192
  "telemetry": {
190
- "path": ".opencode/openteam-telemetry.jsonl"
193
+ "path": ".opencode/openteam-local/telemetry.jsonl"
191
194
  }
192
195
  }
193
196
  ]
@@ -197,10 +200,10 @@ Durante desarrollo puedes cargar un plugin local desde `.opencode/plugins/opente
197
200
 
198
201
  ## Quickstart: `openteam setup`
199
202
 
200
- La forma más rápida de dejar un repositorio listo para opencode + openteam es el comando interactivo `openteam setup`. Detecta los runtimes locales instalados (Ollama, LM Studio, Foundry Local) —que son **opcionales**: puedes usar openteam **solo con frontier**, o apuntar a un Ollama/LM Studio que corra en **otra máquina de la red local**—, te deja elegir los modelos locales y el modelo **frontier baseline** (ordenados de más barato-capaz a más caro), y genera tres ficheros:
203
+ La forma más rápida de dejar un repositorio listo para opencode + openteam es el comando interactivo `openteam setup`. Detecta los runtimes locales instalados (Ollama, LM Studio, Lemonade Server, Foundry Local) —que son **opcionales**: puedes usar openteam **solo con frontier**, o apuntar a un Ollama/LM Studio/Lemonade Server que corra en **otra máquina de la red local**—, te deja elegir los modelos locales y el modelo **frontier baseline** (ordenados de más barato-capaz a más caro), y genera tres ficheros:
201
204
 
202
205
  - `opencode.json` en la raíz: declara el plugin `@jmanuelcorral/openteam`, los `provider` locales OpenAI-compatible, el `model` frontier y el `small_model` local.
203
- - `.opencode/openteam.json`: la configuración runtime validada de openteam (baseline, routing, runtimes locales y privacidad).
206
+ - `.opencode/openteam.json`: la configuración runtime validada de openteam (baseline, routing, runtimes locales, roles del orquestador y privacidad).
204
207
  - `.opencode/agent/openteam.md`: el **agente primario `openteam`**, visible en el Tab-switcher.
205
208
 
206
209
  ```powershell
@@ -222,15 +225,15 @@ El asistente:
222
225
 
223
226
  Tras `setup`, autentica el provider frontier (`opencode auth login`), asegúrate de que tu runtime local (en esta máquina o en la red) esté accesible si lo habilitaste, y abre opencode en el repositorio: openteam enruta local-first automáticamente. Puedes reajustar el baseline después con `openteam baseline set <provider/model>` o `openteam baseline auto`.
224
227
 
225
- ### El agente `openteam`
228
+ ## El agente `openteam`
226
229
 
227
230
  `openteam setup` genera un único **agente primario** llamado `openteam` (`.opencode/agent/openteam.md`). Pulsa **Tab** en opencode para seleccionarlo: así sabes explícitamente que estás en modo openteam, mientras el plugin sigue optimizando el modelo por debajo.
228
231
 
229
- Ese orquestador **no trae subagentes precreados**. En **cada petición** su primera acción es comprobar si ya existe equipo (`.opencode/openteam-roster.md` + subagentes en `.opencode/agent/`). Si **existe**, reparte el trabajo entre los especialistas adecuados; si **no existe**, entiende las tareas que implica tu petición, diseña el equipo mínimo y **lo crea a demanda** —sin que tengas que pedírselo explícitamente— antes de pasarle esas tareas (escribiendo `.opencode/agent/<nombre>.md` con `mode: subagent`), reutilizando los existentes antes de crear nuevos. Los roles mecánicos/bulk se dejan enrutar a modelos locales y solo se escala a frontier para arquitectura, seguridad o debugging ambiguo. (Este modelo de equipo temático creado a demanda está inspirado en [Squad](https://bradygaster.github.io/squad/); ver [Agradecimientos](#agradecimientos-e-inspiración).)
232
+ Ese orquestador **no trae subagentes precreados**. En **cada petición** su primera acción es comprobar si ya existe equipo (`.opencode/openteam/roster.md` + subagentes en `.opencode/agent/`). Si **existe**, reparte el trabajo entre los especialistas adecuados; si **no existe**, entiende las tareas que implica tu petición, diseña el equipo mínimo y **lo crea a demanda** —sin que tengas que pedírselo explícitamente— antes de pasarle esas tareas (escribiendo `.opencode/agent/<nombre>.md` con `mode: subagent`), reutilizando los existentes antes de crear nuevos. Los roles mecánicos/bulk se dejan enrutar a modelos locales y solo se escala a frontier para arquitectura, seguridad o debugging ambiguo. (Este modelo de equipo temático creado a demanda está inspirado en [Squad](https://bradygaster.github.io/squad/); ver [Agradecimientos](#agradecimientos-e-inspiración).)
230
233
 
231
- El equipo tiene **identidad temática**: el orquestador elige (o te pregunta) un **universo** y nombra a cada agente con un personaje de ese universo, registrando el reparto en `.opencode/openteam-roster.md` (fuera de `.opencode/agent/`, para que opencode no lo cargue como un agente fantasma) para que los nombres **persistan** entre sesiones. Además de los roles específicos del proyecto, contempla tres **roles estándar** creados a demanda:
234
+ El equipo tiene **identidad temática**: el orquestador elige (o te pregunta) un **universo** y nombra a cada agente con un personaje de ese universo, registrando el reparto en `.opencode/openteam/roster.md` (fuera de `.opencode/agent/`, para que opencode no lo cargue como un agente fantasma) para que los nombres **persistan** entre sesiones. Además de los roles específicos del proyecto, contempla tres **roles estándar** creados a demanda:
232
235
 
233
- - **scribe** — memoria silenciosa: registra decisiones y aprendizajes en `.opencode/openteam-decisions.md` sin tocar el código (modelo local).
236
+ - **scribe** — memoria silenciosa: registra decisiones y aprendizajes en `.opencode/openteam/decisions.md` sin tocar el código (modelo local).
234
237
  - **ralph** — automatización y triage: monitoriza el trabajo pendiente, lo prioriza, coordina la ejecución y **escala al humano** ante bloqueos o aprobaciones.
235
238
  - **guardian** — seguridad y privacidad: **detecta y enmascara datos sensibles** (PII, secretos, API keys, tokens) antes de que salgan a frontier y hace revisión de seguridad; corre siempre en local y respeta `forceLocalOnSensitive`.
236
239
 
@@ -302,19 +305,70 @@ Notas al actualizar:
302
305
 
303
306
  La configuración runtime canónica vive en `.opencode/openteam.json`; este repositorio incluye `.opencode/openteam.example.json` como ejemplo completo. La forma validada por Zod es la de `src/config/schema.ts`. `telemetry` es una opción del plugin leída por `src/index.ts`, no parte del objeto `OpenTeamConfig` persistido.
304
307
 
308
+ Los archivos de configuración son estrictos: las claves desconocidas fallan
309
+ cerrado tanto en la CLI como en el plugin en vez de ignorarse en silencio. Los
310
+ errores nombran cada ruta rechazada (por ejemplo `router.trivialPromptMxChars`)
311
+ e incluyen una sugerencia de la clave más cercana cuando existe.
312
+ Esta validación estricta se aplica al archivo de configuración en ambas rutas;
313
+ las opciones programáticas del plugin son una superficie separada y aún no se
314
+ validan de forma estricta (#102). Las configs existentes sin `configVersion`
315
+ siguen siendo válidas porque openteam las migra a la versión actual antes de
316
+ validarlas.
317
+
318
+ ### Resolución del archivo de configuración de opencode
319
+
320
+ openteam lee la configuración del proyecto opencode desde **dos rutas candidatas**
321
+ y las fusiona — igual que hace el propio opencode con múltiples archivos de config:
322
+
323
+ | Prioridad | Ruta |
324
+ | --- | --- |
325
+ | Mayor (prevalece) | `.opencode/opencode.json` |
326
+ | Base | `opencode.json` (raíz del proyecto) |
327
+
328
+ Las claves no conflictivas de ambos archivos se conservan. Cuando la misma
329
+ clave aparece en los dos, `.opencode/opencode.json` gana. Esto está verificado
330
+ contra opencode 1.18.18: un provider declarado en cualquiera de las dos
331
+ ubicaciones aparece en `opencode models --pure`.
332
+
333
+ **Comentarios JSONC** — los comentarios de línea (`//`) y de bloque (`/* … */`)
334
+ están permitidos en ambos archivos. El propio opencode los acepta; openteam los
335
+ elimina antes de parsear, así que un archivo con comentarios funciona igual que
336
+ uno JSON puro.
337
+
338
+ **Config malformada** — si uno de los archivos candidatos existe pero no puede
339
+ parsearse (JSON inválido, violación de schema), `doctor` y `agents` emiten un
340
+ aviso que nombra el archivo problemático y continúan en vez de abortar.
341
+
342
+ **Mensajes "provider not configured"** — nombran las dos rutas buscadas, para
343
+ que sepas de inmediato si el archivo no se encontró o si el provider está
344
+ genuinamente ausente en ambas ubicaciones.
345
+
346
+ **Ubicación de escritura de `openteam setup`** — al configurar un proyecto nuevo
347
+ (sin archivo de config opencode existente), `setup` escribe ahora en
348
+ `.opencode/opencode.json`. Cuando se detecta un archivo existente, se actualiza
349
+ en el mismo sitio — nunca se escribe en los dos a la vez. Usuarios que hacen
350
+ upgrade: si no existe un `opencode.json` en la raíz, una nueva ejecución de
351
+ `setup` escribirá en `.opencode/`.
352
+
353
+ **Sin traversal ascendente** — openteam lee únicamente las dos rutas candidatas
354
+ relativas al directorio de trabajo actual. No sube hasta la raíz git. Los
355
+ comandos están diseñados para ejecutarse desde la raíz del proyecto; si los
356
+ ejecutas desde un subdirectorio verás "provider not configured" y debes hacer
357
+ `cd` a la raíz primero.
358
+
305
359
  | Key | Tipo | Default | Descripción |
306
360
  | --- | --- | --- | --- |
307
361
  | `baseline.mode` | `"auto" \| "pinned"` | `"auto"` | En `auto`, usa perfiles frontier cheapest-capable cuando se pasan al router; en `pinned`, usa `baseline.pinnedModel` si existe. |
308
362
  | `baseline.pinnedModel` | `ModelRef \| null` | `null` | Modelo frontier fijado explícitamente. `ModelRef` usa `{ "providerID": string, "modelID": string }`. |
309
363
  | `baseline.hardDefault` | `ModelRef` | `{ "providerID": "anthropic", "modelID": "claude-sonnet-4-5" }` | Fallback frontier si no hay perfiles cheapest-capable o pin válido. |
310
364
  | `router.mode` | `"economy" \| "balanced" \| "quality"` | `"balanced"` | Modo de routing validado y reservado para política. |
311
- | `router.localDefault` | `ModelRef` | `{ "providerID": "ollama", "modelID": "qwen3:8b" }` | Modelo local principal. |
365
+ | `router.localDefault` | `ModelRef \| null` | `null` | Modelo local principal. No configurado por defecto — ningún modelo local se enruta hasta que configures uno con `openteam setup` o manualmente. |
312
366
  | `router.trivialPromptMaxChars` | `number` entero positivo | `280` | Prompts sin código hasta este tamaño prefieren local. |
313
367
  | `router.frontierPromptMinChars` | `number` entero positivo | `2000` | Prompts desde este tamaño se tratan como candidatos a frontier si no aplican guards. |
314
- | `local.runtimes` | `LocalRuntime[]` | Ollama enabled en `http://localhost:11434/v1` con `qwen3:8b` | Lista mínima de un runtime local. |
315
- | `local.runtimes[].id` | `"ollama" \| "lmstudio" \| "foundry-local"` | requerido | Runtime local. |
368
+ | `local.runtimes` | `LocalRuntime[]` | `[]` | Runtimes locales a sondear. Vacío por defecto ningún runtime está configurado hasta que ejecutes `openteam setup` o añadas una entrada manualmente. |
369
+ | `local.runtimes[].id` | `"ollama" \| "lmstudio" \| "foundry-local" \| "lemonade"` | requerido | Runtime local. |
316
370
  | `local.runtimes[].enabled` | `boolean` | `true` | Habilita o deshabilita ese runtime. |
317
- | `local.runtimes[].baseURL` | URL opcional | según runtime/config | Endpoint OpenAI-compatible `/v1`; Foundry Local puede omitirlo si usa discovery. |
371
+ | `local.runtimes[].baseURL` | URL opcional | según runtime/config | Endpoint OpenAI-compatible (`/v1` para Ollama/LM Studio, `/api/v1` para Lemonade); Foundry Local puede omitirlo si usa discovery. |
318
372
  | `local.runtimes[].discovery` | `"cli" \| "sdk" \| "manual"` opcional | sin default por item | Discovery de Foundry Local; el registry usa CLI si está configurado y no es `manual`. |
319
373
  | `local.runtimes[].defaultModel` | `ModelRef` | requerido | Modelo por defecto de ese runtime. |
320
374
  | `budgets.sessionUSD` | `number` positivo opcional | sin límite | Presupuesto frontier por sesión. |
@@ -322,8 +376,36 @@ La configuración runtime canónica vive en `.opencode/openteam.json`; este repo
322
376
  | `budgets.frontierTokensPerSession` | `number` entero positivo opcional | sin límite | Límite de tokens frontier por sesión. |
323
377
  | `budgets.hardStopOnBudgetExhaustion` | `boolean` | `false` | Si es `true`, agotar presupuesto devuelve `blockFrontier`; si es `false`, fuerza local. |
324
378
  | `privacyMode` | `"forceLocalOnSensitive" \| "consentBeforeFrontier" \| "off"` | `"forceLocalOnSensitive"` | Política de privacidad para tareas sensibles. |
379
+ | `orchestrator.roles` | `Record<string, AgentRoleProfile>` | `{}` | Perfiles de rol personalizados o sobrescritos, indexados por role ID. Las entradas de config se validan con el mismo schema estricto que los roles integrados y tienen prioridad sobre `TEAM_ROLES`; si una entrada omite `roleID`, se usa la clave del mapa. Los roles desconocidos no declarados aquí siguen usando el fallback neutral y avisan una vez. |
380
+ | `orchestrator.roles.<role>.opencodeAgent` | `string` no vacío opcional | role ID | Nombre del agente opencode al que se despacha ese rol. |
381
+ | `orchestrator.roles.<role>.defaultTier` | `"trivial" \| "simple" \| "moderate" \| "hard"` | requerido | Tier base de complejidad antes de aplicar heurística y elevación por permisos. |
382
+ | `orchestrator.roles.<role>.minReasoningTier` | `1`–`5` | requerido | Capacidad mínima de razonamiento para candidatos frontier. |
383
+ | `orchestrator.roles.<role>.minCodeQualityTier` | `1`–`5` | requerido | Capacidad mínima de calidad de código para candidatos frontier. |
384
+ | `orchestrator.roles.<role>.needsToolCallingByDefault` | `boolean` | requerido | Si el rol requiere tool calling salvo que la tarea indique otra cosa. |
385
+ | `orchestrator.roles.<role>.preferredFrontierModels` | `Array<ModelRef \| "auto">` | requerido | Modelos frontier preferidos; usa `[]` para un rol local-first sin preferencia frontier explícita. |
386
+ | `orchestrator.roles.<role>.localFirst` | `boolean` | requerido | Si el rol conserva la postura local-first normal en vez de forzar frontier para tareas hard. |
325
387
  | `telemetry.enabled` | `boolean` plugin option | `true` | Activa/desactiva escritura JSONL. |
326
- | `telemetry.path` | `string` plugin option | `.opencode/openteam-telemetry.jsonl` | Ruta del log `CostRecord` JSONL. |
388
+ | `telemetry.path` | `string` plugin option | `.opencode/openteam-local/telemetry.jsonl` | Ruta del log `CostRecord` JSONL. |
389
+
390
+ Ejemplo de auditor de privacidad/seguridad personalizado:
391
+
392
+ ```jsonc
393
+ {
394
+ "orchestrator": {
395
+ "roles": {
396
+ "galadriel": {
397
+ "opencodeAgent": "galadriel",
398
+ "defaultTier": "moderate",
399
+ "minReasoningTier": 3,
400
+ "minCodeQualityTier": 3,
401
+ "needsToolCallingByDefault": true,
402
+ "preferredFrontierModels": [],
403
+ "localFirst": true
404
+ }
405
+ }
406
+ }
407
+ }
408
+ ```
327
409
 
328
410
  ## Uso
329
411
 
@@ -387,18 +469,20 @@ openteam baseline set openai/gpt-5-mini
387
469
  openteam doctor --config .opencode/openteam.json
388
470
  openteam agents
389
471
  openteam console
390
- openteam report --telemetry .opencode/openteam-telemetry.jsonl
472
+ openteam report --telemetry .opencode/openteam-local/telemetry.jsonl
391
473
  openteam yolo status
392
474
  openteam yolo on
393
475
  openteam local status
394
476
  openteam local off
477
+ openteam clear-cache
478
+ openteam clear-cache --delete
395
479
  ```
396
480
 
397
- Flags: `--config <path>` y `--telemetry <path>` sobrescriben las rutas por defecto; `--opencode <path>` apunta el comando `yolo` a un `opencode.json` concreto.
481
+ Flags: `--config <path>` y `--telemetry <path>` sobrescriben las rutas por defecto; `--opencode <path>` apunta el comando `yolo` a un `opencode.json` concreto. Un `--config` explícito puede ser relativo o absoluto y debe poder leerse; solo la búsqueda por defecto de `.opencode/openteam.json` cae a los defaults integrados cuando falta.
398
482
 
399
483
  ### Ver el LLM de cada agente: `openteam agents`
400
484
 
401
- Lista los agentes de `.opencode/agent/` indicando **qué LLM usa cada uno**: si es **local** (Ollama/LM Studio/Foundry, sin coste de tokens) o **frontier** (consume tu suscripción), y el **proveedor** (Anthropic, OpenAI, GitHub Copilot, Google…). Los agentes sin `model` propio **heredan** el default de `opencode.json` (que openteam enruta local-first por mensaje).
485
+ Lista los agentes de `.opencode/agent/` indicando **qué LLM usa cada uno**: si es **local** (Ollama/LM Studio/Lemonade/Foundry, sin coste de tokens) o **frontier** (consume tu suscripción), y el **proveedor** (Anthropic, OpenAI, GitHub Copilot, Google…). Los agentes sin `model` propio **heredan** el default de `opencode.json` (que openteam enruta local-first por mensaje).
402
486
 
403
487
  ```powershell
404
488
  openteam agents
@@ -446,18 +530,38 @@ openteam local on # vuelve al routing local-first
446
530
 
447
531
  Esto persiste el flag `router.frontierOnly` en `.opencode/openteam.json`. Con `frontierOnly` activo, el router escoge el **frontier cheapest-capable** en lugar de la heurística local-first, pero **respeta la privacidad, los presupuestos y los overrides explícitos por tarea**: los prompts sensibles con `forceLocalOnSensitive` no salen a frontier, y `local off` degrada esa política a `consentBeforeFrontier` (imposible forzar local sin runtime) informándote del cambio.
448
532
 
449
- ### Modo desatendido: `openteam loop` (patrón Ralph) 🎯 *(diseño)*
533
+ ### Actualizar el plugin y limpiar la caché: `openteam clear-cache`
534
+
535
+ opencode almacena cada instalación de plugin en un directorio de caché y no
536
+ refresca las entradas existentes: no hay comparación de versión, TTL ni comando
537
+ de evicción en upstream. Publicar una nueva versión del plugin no tiene **ningún
538
+ efecto** en una máquina que ya tiene una entrada de caché. Borrar el directorio
539
+ de caché es la única vía de evicción que existe.
540
+
541
+ ```powershell
542
+ openteam clear-cache # solo informe — imprime la tabla, no borra nada
543
+ openteam clear-cache --delete # borra todas las entradas de caché coincidentes
544
+ openteam clear-cache --cache-root <ruta> # sobreescribe el directorio raíz de caché
545
+ ```
546
+
547
+ Alias de slash command dentro de opencode: `/openteam-clear-cache`
548
+
549
+ El modo por defecto (sin flags) imprime una tabla con columnas `spec dir`,
550
+ `spec-pinned`, `installed` y `mtime` para cada entrada de caché
551
+ `@jmanuelcorral/openteam*` encontrada. Solo se tocan entradas de ese scope.
552
+ Los symlinks y reparse points de Windows aparecen como `[SKIP — reparse point]`
553
+ y nunca se borran. En Windows, cierra opencode antes de ejecutar `--delete`
554
+ para evitar errores `[LOCKED]`.
555
+
556
+ Consulta [docs/es/guide/update-plugin.md](docs/es/guide/update-plugin.md)
557
+ para la explicación completa del mecanismo de congelamiento y el procedimiento
558
+ de actualización paso a paso.
450
559
 
451
- Segundo modo de operación: un **bucle externo** que invoca `opencode run` contra un backlog persistente hasta vaciarlo, con contexto fresco por iteración y topes de seguridad (presupuesto, máx. iteraciones, sin-progreso). Complementa al orquestador interactivo, no lo sustituye. Consulta el diseño y los ejemplos en **[docs/loop.md](docs/loop.md)**.
560
+ ### Modo desatendido: `openteam loop` (patrón Ralph) 🎯 *(`--dry-run` verificado; despacho real en diseño)*
452
561
 
453
- ### Console web multi-sesión (se lanza desde la CLI) alfa
562
+ Segundo modo de operación: un **bucle externo** que invoca `opencode run` contra un backlog persistente hasta vaciarlo, con contexto fresco por iteración y topes de seguridad (presupuesto, máx. iteraciones, sin-progreso). Complementa al orquestador interactivo, no lo sustituye. Como propiedad de seguridad, `openteam loop` **se niega a ejecutarse de forma desatendida sin confirmación explícita**: ejecutado sin argumentos imprime *"Refusing to run unattended without confirmation. Re-run with --dry-run to preview the plan, or --yes to run."* y termina con código distinto de cero; `openteam loop --dry-run` previsualiza el plan (backlog, topes de iteraciones y presupuesto, sleep, contexto fresco y condiciones de parada) sin despachar nada. La previsualización con `--dry-run` y la negativa al invocarlo sin argumentos están **verificadas contra el binario publicado**; el despacho desatendido real (`--yes`) **aún no está verificado de extremo a extremo y sigue en fase de diseño**. Consulta el diseño y los ejemplos en **[docs/loop.md](docs/loop.md)**.
454
563
 
455
- > ⚠️ **Alfa sin terminar.** La Console (y el comando `tunnel` de más abajo) es
456
- > una funcionalidad **experimental** que todavía puede **rehacerse o
457
- > reconstruirse**, con cambios incompatibles en su UI, endpoints, config (bloque
458
- > `console`) y formato de eventos. El router, presupuestos, telemetría y el core
459
- > de memoria son estables; la superficie web aún no. Úsala para observación
460
- > local, no como API estable.
564
+ ### Console web multi-sesión (se lanza desde la CLI)
461
565
 
462
566
  openteam expone una **Console web local** que **lanzas tú desde la CLI** con
463
567
  `openteam console`.
@@ -487,10 +591,12 @@ openteam console --open # además abre el navegador
487
591
  openteam console --status # solo imprime la config (no lanza el servidor)
488
592
  ```
489
593
 
594
+ Consulta la [guía de la Console](docs/es/console.md) para la referencia completa.
595
+
490
596
  Las sesiones se leen de:
491
597
 
492
598
  ```text
493
- .opencode/openteam/sessions/*.jsonl
599
+ .opencode/openteam-local/sessions/*.jsonl
494
600
  ```
495
601
 
496
602
  Puedes ajustar host/puerto y la terminal en `.opencode/openteam.json` (bloque
@@ -510,31 +616,11 @@ Puedes ajustar host/puerto y la terminal en `.opencode/openteam.json` (bloque
510
616
  }
511
617
  ```
512
618
 
513
- > **Seguridad**: el servidor escucha **solo en loopback** (`127.0.0.1`/`localhost`, validado por Zod) y **nunca expone prompts** (solo `promptHash`), args de toolcall ni contenido de mensajes: solo contadores, costes y resúmenes redactados. La vista "Sesión"/"Terminal" exige el token efímero. Si el puerto está ocupado y `autoPortFallback` es `true`, prueba el siguiente libre.
514
-
515
- ### Acceso remoto seguro: `openteam tunnel` — alfa
619
+ **Vista del grafo de agentes en vivo.** La Console también puede renderizar un **grafo de agentes** en vivo de una ejecución de Graph; está **desactivada por defecto** y se activa con `console.graphView.enabled: true` consulta [Graph observability web](docs/es/guide/graph-observability-web.md) para la configuración y los requisitos completos.
516
620
 
517
- > ⚠️ **Alfa sin terminar.** Igual que la Console, `tunnel` es experimental y
518
- > puede rehacerse o reconstruirse. Trata sus flags y comportamiento como
519
- > inestables.
621
+ > **Seguridad**: el servidor escucha **solo en loopback** (`127.0.0.1`/`localhost`, validado por Zod) y **nunca expone prompts** (solo `promptHash`), args de toolcall ni contenido de mensajes: solo contadores, costes y resúmenes redactados. La vista "Sesión"/"Terminal" exige el token efímero. Si el puerto está ocupado y `autoPortFallback` es `true`, prueba el siguiente libre. El acceso remoto mediante `openteam tunnel` se **eliminó del MVP** (2026-08-31) y se redefinirá más adelante; la Console no tiene camino de exposición remota integrado.
520
622
 
521
- Para acceder a la Console (y, opcionalmente, operar la terminal) **desde fuera**,
522
- `openteam tunnel` la expone vía **Microsoft Dev Tunnels** en lugar de bindear a
523
- `0.0.0.0`. Comprueba que `devtunnel` esté instalado y con sesión iniciada,
524
- hospeda el puerto de la Console e imprime la URL pública hasta **Ctrl+C**:
525
-
526
- ```powershell
527
- openteam tunnel # expone solo la Console (observación), autenticado
528
- openteam tunnel --terminal # además expone opencode para la terminal remota
529
- openteam tunnel --allow-anonymous --yes # túnel anónimo (requiere doble confirmación)
530
- ```
531
-
532
- > **Seguridad del túnel**: autenticado por defecto. La **terminal remota** exige
533
- > `OPENCODE_SERVER_PASSWORD` definido; sin ella, `--terminal` se ignora y solo se
534
- > expone la Console (observación). El túnel **anónimo** requiere `--yes` (doble
535
- > confirmación) y avisa de que opencode puede ejecutar comandos y editar ficheros.
536
- > Instala devtunnel con `winget install Microsoft.devtunnel` e inicia sesión con
537
- > `devtunnel user login`.
623
+ **Estabilidad de la interfaz.** La superficie web de la Console es **pre-1.0**: su UI, sus endpoints, el bloque de configuración `console` y el formato de eventos pueden cambiar todavía. El router, los presupuestos, la telemetría y el core de memoria son estables.
538
624
 
539
625
  ### Memoria del equipo por MCP (solo lectura): `openteam mcp`
540
626
 
@@ -635,6 +721,12 @@ Invoke-RestMethod -Uri "http://localhost:11434/v1/models" -Method Get
635
721
  Invoke-RestMethod -Uri "http://localhost:1234/v1/models" -Method Get
636
722
  ```
637
723
 
724
+ ### Lemonade Server
725
+
726
+ ```powershell
727
+ Invoke-RestMethod -Uri "http://localhost:8000/api/v1/models" -Method Get
728
+ ```
729
+
638
730
  ### Foundry Local
639
731
 
640
732
  ```powershell
@@ -646,14 +738,14 @@ openteam extrae el puerto de la salida del CLI y normaliza el endpoint a `http:/
646
738
  ### Telemetría
647
739
 
648
740
  ```powershell
649
- $telemetryPath = "C:\gitrepos\openteam\.opencode\openteam-telemetry.jsonl"
741
+ $telemetryPath = "C:\ruta\a\tu\repo\.opencode\openteam-telemetry.jsonl"
650
742
  Get-Content -Path $telemetryPath -Tail 5
651
743
  ```
652
744
 
653
745
  ### Verificación local
654
746
 
655
747
  ```powershell
656
- Set-Location -Path "C:\gitrepos\openteam"
748
+ Set-Location -Path "C:\ruta\a\tu\repo"
657
749
  bun test
658
750
  bun run typecheck
659
751
  bun run lint
@@ -669,7 +761,7 @@ lugar de la versión publicada (sin pasar por ningún registry), se enlaza el
669
761
  paquete con un symlink global:
670
762
 
671
763
  ```powershell
672
- Set-Location -Path "C:\gitrepos\openteam"
764
+ Set-Location -Path "C:\ruta\a\tu\repo"
673
765
  bun run link:local # = bun run build && npm link
674
766
  ```
675
767
 
@@ -723,22 +815,26 @@ Gates no negociables:
723
815
 
724
816
  ## Compatibilidad
725
817
 
726
- Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `2026-08-23`:
818
+ Consulta [docs/compatibility.md](docs/compatibility.md). Resumen verificado el `2026-08-24`:
727
819
 
728
820
  | Superficie | Versión / contrato |
729
821
  | --- | --- |
730
- | openteam | `0.2.1`; versión actual del paquete |
731
- | `@opencode-ai/plugin` | `1.18.18` |
732
- | `@opencode-ai/sdk` | `1.18.18` |
822
+ | openteam | `0.9.0`; versión actual del paquete |
823
+ | `@opencode-ai/plugin` | `1.18.19` |
824
+ | `@opencode-ai/sdk` | `1.18.19` |
733
825
  | Hook de routing | `chat.message`; no `chat.params` para cambiar modelo |
734
826
  | Subsesiones | `client.session.create` + `client.session.prompt({ body: { model } })` |
735
827
 
828
+ ## Contribuir
829
+
830
+ Las contribuciones son bienvenidas. Lee [CONTRIBUTING.md](CONTRIBUTING.md) para la configuración de desarrollo (Bun), las barreras de calidad no negociables, los límites de módulos (`router/` es puro — sin I/O, reloj, aleatoriedad ni logging) y el proceso de pull request. Al participar aceptas cumplir nuestro [Código de conducta](CODE_OF_CONDUCT.md).
831
+
736
832
  ## Roadmap
737
833
 
738
834
  | Fase | Estado | Entregables |
739
835
  | --- | --- | --- |
740
836
  | 0. Scaffold/PoC | Hecha | TS/Bun, plugin mínimo, hook `chat.message`. |
741
- | 1. Local registry + router heurístico | Hecha | Ollama/LM Studio/Foundry, probes y `chooseModel` determinista. |
837
+ | 1. Local registry + router heurístico | Hecha | Ollama/LM Studio/Lemonade/Foundry, probes y `chooseModel` determinista. |
742
838
  | 2. Clasificador + perfiles + presupuesto + telemetría | Hecha | Clasificador local, `ModelCapabilityProfile`, budgets y `CostRecord`. |
743
839
  | 3. Orquestación multiagente | Hecha | Coordinator, roles, child sessions y permisos. |
744
840
  | 4. Empaquetado npm + docs | Hecha | Package exportable, README, ejemplos Windows y matriz de compatibilidad. |