English | Espanol
Gracias por tomarte el tiempo de mejorar este plugin. Corre dentro de cada request de modelo de una sesion de OpenCode, asi que el estandar para cualquier cambio es: predecible, fail-open y testeable sin red.
git clone git@github.com:JoshRob297/opencode-commandcode.git
cd opencode-commandcode
bun install
bun test # suite offline, sin red, sin consumir cuota
bun run typecheck # tsc estricto, sin emitLa suite con red es opt-in y llama a la API real (consume una cantidad insignificante de cuota):
COMMANDCODE_LIVE_TESTS=1 bun testNo son preferencias de estilo: protegen las garantias del plugin. Un cambio que rompa alguna vuelve atras.
- Fail-open. Cualquier error del plugin debe dejar el request original intacto. Nunca dejes que un hook lance una excepcion hacia la sesion de OpenCode.
- Credenciales solo tras coincidencia exacta de host. Nunca introduzcas una
verificacion por substring, prefijo o path en la ruta de inyeccion. Los hosts
confiables nuevos entran por
COMMANDCODE_ALLOWED_HOSTS. - Nunca sobrescribas la cabecera
authorizationde un llamador. - Sin secretos en los logs. El plugin escribe ids de sesion, ids de modelo, codigos de estado y mensajes de error. Nunca cuerpos, cabeceras ni la key.
- Exactitud del catalogo antes que tamano. No registres modelos que el transporte compatible con OpenAI no puede servir. Un modelo que falla al seleccionarlo es peor que un modelo ausente.
- Sin rutas de usuario hardcodeadas. Usa
XDGyos.homedir(); los tests deben pasar para cualquier usuario. - Los helpers puros siguen siendo puros.
src/hooks/resilience.tsno tiene acceso a red y solo hace una revision de filesystem (el centinela del kill-switch), para que sus reglas se puedan testear en aislamiento. - Reconstrui el Request solo cuando el cuerpo haya cambiado realmente. Devolve
modified: falsepara payloads limpios.
Conventional Commits, imperativo, asunto en minusculas:
<tipo>(<alcance>): <asunto>
<cuerpo: que y por que, con lineas de 72 columnas>
<pie: refs, cambios incompatibles>Tipos: feat, fix, docs, test, refactor, perf, chore, security.
Alcances: auth, catalog, sanitizer, watchdog, quota, telemetry, docs.
Ejemplos:
fix(auth): require an exact hostname match before injecting the API key
feat(catalog): tag free and promo tiers in the model selector
docs(troubleshooting): document the retired free-tier 403 payloadMantene los commits atomicos: un cambio logico mas sus tests. Cada commit debe pasar
bun test y bun run typecheck.
- Completa la plantilla de pull request. Indica el modo de fallo que observaste, no solo el cambio que hiciste.
- Agrega o actualiza tests. Los fixes de bugs necesitan un test de regresion que falle antes del fix.
- Actualiza
CHANGELOG.mdbajo## [Unreleased]. - La documentacion vive en dos idiomas:
README.md+docs/*.md(ingles) yREADME.es.md+docs/es/*.md(espanol), mas los archivos de comunidad traducidos (docs/es/code-of-conduct.md,SECURITY.es.md,CONTRIBUTING.es.md). Los cambios de comportamiento deben reflejarse en ambos, o decilo explicitamente en el PR para que quede registrado.
- Pone la logica pura en
src/hooks/resilience.tsy exportala. - Testeala en
tests/(sin red, sin instancia de OpenCode). - Documenta la regla en
docs/ARCHITECTURE.md(tabla de reglas) y, si es configurable, endocs/CONFIGURATION.md. - Cableala en
src/index.tsdetras de una verificacion de capacidad (typeof ctx.x?.transform === "function") y envuelta para que no pueda lanzar.
Abre un issue con la plantilla de bug report. Incluye la version de OpenCode, el commit
del plugin, el id del modelo, y las lineas relevantes de
<state>/commandcode-*.log. Nunca pegues una API key en un issue.