context-attachment-manager
Codex and Claude Code plugin (works in Claude Desktop): choose which past images go to the model with your next message. Unchecked images become placeholders, the conversation goes on, and requests st
翻譯準備中
Chewiesoft Marketplace — Claude Code plugin marketplace with skills and commands for development workflows
翻譯準備中
外掛GitHub @j0ruge自行安裝營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Plugin marketplace for Claude Code, Cursor and Codex — CI/CD, code review, deployments, releases, and more.
Installation · Plugins · Auto-updates · Team Distribution · References
A curated plugin marketplace for Claude Code and Cursor by j0ruge. Each plugin packages production-ready skills and commands that integrate directly into your workflow — no configuration needed beyond install.
| Plugin | Claude Code | Cursor | Codex CLI | Notes |
|---|---|---|---|---|
| ansible-docker-backup-restore | ✓ | ✓ | ✓ | Skill — backup + restore of Dockerized services via Ansible, with a read-only backup-freshness check |
| cicd | ✓ | ✓ | ✓ | Skill — works on both platforms without changes |
| codereview | ✓ | ✓ | partial | Skills — adapted automatically by the installer Codex: As duas entradas carregam, mas o corpo exige Agent/model sonnet; equivalência completa não comprovada. |
| cors | ✓ | ✓ | ✓ | Skill — works on both platforms |
| criar-prd | ✓ | ✓ | ✓ | Command (Claude Code) / Skill (Cursor) |
| criar-task | ✓ | ✓ | ✓ | Command (Claude Code) / Skill (Cursor) |
| criar-techspec | ✓ | ✓ | ✓ | Command (Claude Code) / Skill (Cursor) |
| ddd | ✓ | ✓ | ✓ | Skill — works on both platforms |
| deploy | ✓ | ✓ | ✓ | Skill — works on both platforms |
| dev-script | ✓ | ✓ | ✓ | Skill — generates dev.sh (bash) + dev.ps1 (PowerShell) per project |
| dotnet-wpf | ✓ | ✓ | partial | Skills — works on both platforms Codex: Agrupamento preservado: setup exige regras, hooks e configuração Claude; três skills isoladas não autorizam publicar o pacote inteiro. |
Codex: 27 plugins / 30 workflows, com smoke de distribuição e entrada no CLI 0.163.0
(hook-builder na 0.164.0 e env-docs-sync na 0.165.0) em Ubuntu 24.04. Desktop, macOS e Windows: not_checked; versão mínima não estabelecida.
Dependências, limitações e exclusões: matriz detalhada.
O catálogo Codex é filtrado; a extensão de IDE está fora desta distribuição.
partial também cobre adaptações locais que funcionam no Codex, mas ainda não
estão empacotadas neste catálogo, como retrofit-watch.
# Add the marketplace (pick one)
/plugin marketplace add j0ruge/skills # via GitHub
/plugin marketplace add [email protected]:j0ruge/skills.git # via SSH
Then install any plugin:
/plugin install codereview # or: ansible-docker-backup-restore, cicd, cors, criar-prd, criar-task, criar-techspec, ddd, deploy, dev-script, dotnet-wpf, env-docs-sync, executar-task, git-housekeeping, hook-builder, html-presentation, kaizen-software, n8n-ops, pdf-generation, release, retrofit-skill, retrofit-watch, skill-quality-audit, statusline, ticket, todo-to-github-issues, ts-library, unlovable, whisper-preprocess, windows-disk-cleanup, windows-games-linux, wsl-windows-onboarding, zitadel-idp
[!TIP] Keep plugins up to date with a single command:
/plugin marketplace update
Clone the repo and run the interactive installer:
git clone [email protected]:j0ruge/skills.git
cd skills
python install.py
The installer prompts for platform (Claude Code, Cursor, Codex, or Claude Code + Cursor) and where to place the Cursor skills. It automatically adapts plugin content for Cursor.
[!IMPORTANT] Cursor has no global skills directory — only project-local
.cursor/skills/is auto-loaded by the agent (Cursor docs). Runpython install.pyfrom inside each project where you want the skills available, and pick the Project option.The installer also offers a Staging cache option that copies the converted skills to
~/.cursor/skills/as a master copy — handy as a source to mirror into projects, but Cursor itself will not pick those up directly.
python3 install.py oferece Codex e mostra os comandos sem executá-los.
A opção Claude Code + Cursor continua limitada às duas plataformas.
Escolha plugins individualmente; um pacote com várias skills mantém seu
agrupamento e não instala o restante da loja.
Depois que esta revisão estiver publicada no repositório remoto:
codex plugin marketplace add j0ruge/skills
codex plugin list --marketplace chewiesoft-marketplace --available --json
codex plugin add cors@chewiesoft-marketplace
Antes da publicação, registre a raiz do clone candidato com
codex plugin marketplace add /caminho/absoluto/skills. O remoto antigo não prova
esta implementação. Inicie sessão nova após instalar e use /skills ou
$cors:cors. skill-quality-audit expõe suas quatro skills; release exige
$release:release explícito. Ferramentas e credenciais são requisitos do consumidor.
env-docs-sync traz hooks, e o Codex só os roda depois de
python3 <cache do plugin>/skills/env-docs-sync/scripts/env_docs_sync.py install --codex --apply,
que grava o trust no config.toml (sem --apply, mostra o diff). Cada update do plugin pede o comando de novo.
Para atualizar a origem Git, no CLI testado o refresh também atualiza os plugins instalados. Confira a versão e inicie uma sessão nova:
codex plugin marketplace upgrade chewiesoft-marketplace --json
codex plugin list --marketplace chewiesoft-marketplace --json
Para remover um plugin e depois a origem:
codex plugin remove cors@chewiesoft-marketplace --json
codex plugin marketplace remove chewiesoft-marketplace --json
Confira a sequência medida, hashes e limites em
verification.md. Reinstalar pelo comando plugin add
também foi comprovado, mas não foi necessário após o refresh Git da versão testada.
| Plugin | Version | Category | Description |
|---|---|---|---|
| cicd | 2.39.1 | Development | CI/CD troubleshooting for GitHub Actions, Docker, GHCR, and self-hosted runners (systemd-on-host e containerizado via myoung34/github-runner) — cobre CMD-herdado-zerado, env LABELS vs RUNNER_LABELS, EPHEMERAL+restart:always loop, gpg --dearmor em buildkit, deploy keys per-repo unique, .env leading whitespace + sed silenciando, monorepo workspace hoisting diagnosis, vitest jsdom→happy-dom recipe pra msw v2. (NEW v2.12.0) troubleshooting-shared.md §1a — GHCR net/http: TLS handshake timeout no docker login do deploy job self-hosted é bug DISTINTO de §1 unauthorized (TCP conectou mas handshake não completou — credencial é irrelevante); isolation key é build-and-push em ubuntu-latest passar enquanto deploy em self-hosted falha; causa raiz típica é MTU mismatch em VPN/overlay ou TLS-inspection proxy; Fix A bash retry wrapper 3x backoff 10s/20s ao redor de docker login (20 linhas, sem nick-fields/retry); Fix B mtu: 1400 em /etc/docker/daemon.json + restart. Reference dedicada cd-pipeline-pitfalls.md cobre 7 classes de bugs de cutover/CI prod: (1) VITE/CRA/Next build args bake'd no image, frontend rebuild mandatory; (2) operator clone reconciliando stack stale; (3) docker compose --profile X run reconciliando containers de outros services; (4) compose run --rm orphan + nginx-proxy upstream poisoning (~50% intermittent 401s); (5) container scripts que escrevem upward de __dirname batem ENOENT em prod (Dockerfile só copia packages/<self>/) — fix canônico é try/catch best-effort, v2.11.0 refinement narrow catch para ENOENT/ENOTDIR e propagar EACCES/ENOSPC/EROFS preserva visibilidade de problemas reais em dev (especialmente importante quando bootstrap.json é consumido por sanity check downstream); v2.11.0 §6 — GHA bind mount uid mismatch: container vendorado roda uid 1000 (Postgres, Zitadel, vários), runner GHA ubuntu-latest é uid 1001 com pasta 0755 → EACCES no init/setup, e o estado parcial deixado para trás cascata em erros DIFERENTES nas retries (constraint violation, already-exists), burying the real cause; cura é pre-create do bind mount com ; — espera TODOS os serviços com healthcheck por default; um sibling lento (Next.js/Vite ~90s+ no runner pequeno) estoura da stack inteira; cura é passar service names explícitos no + companion sempre dumpar logs do serviço lento no on-failure (Up 19 hours (healthy)RestartCountonline busy=falseListening for JobsBrokerMigration message received_diagls -d /actions-runner/bin.` a indicator rather than a post-mortem, and is the strongest argument for the version-currency layer. It also softens the claim about layer B: it sees nothing until someone deploys, but here it would have fired an hour before the human did. The method lesson is the one worth keeping — "three weeks" was from a directory dated 01/09 and a "last deploy 21/08" that only meant nobody had deployed since; neither measured downtime. An artifact's date is not a failure's date. |
Unified troubleshooting and pipeline configuration for GitHub Actions, Docker, GHCR, and self-hosted runners. Auto-detects backend (Prisma/Biome) or frontend (Vite) projects and routes to specific references.
| Skill | Description |
|---|---|
/cicd | Troubleshoots and configures CI/CD pipelines — 30+ scenarios, 50+ lessons learned (incl. dedicated self-hosted-runner-docker.md reference for myoung34/github-runner setups com §7 cobrindo o cenário deadlock-em-prod por RUNNER_REGISTRATION_TOKEN estática + a migração ACCESS_TOKEN in-place como fix durável (lesson 46), + §8/§9 (lessons 47–49) cobrindo crashloops ortogonais ao token — versão de binário deprecada e config stale reaproveitada, e cd-pipeline-pitfalls.md cobrindo 5 classes de cutover-prod bugs incluindo upstream pool poisoning por compose run orphans e §5 sobre container scripts escrevendo paths fora do WORKDIR — ENOENT mascarado por soft-failure que pinta yellow warning ambiente em todo deploy) |
Highlights: project-type detection, tagged troubleshooting ([S] shared / [B] backend / [F] frontend), Jest OOM fixes, Biome 2.x migration, stale Docker image cache handling.
Diagnóstico e configuração de CORS, organizado em torno de um fato: o sintoma mente. O catch do app traduz o bloqueio para "serviço indisponível", e o curl — que não implementa a same-origin policy — devolve 200 alegremente. Nasceu de uma sessão real em que essas duas mentiras juntas custaram duas tentativas antes de alguém abrir o console.
| Skill | Description |
|---|---|
/cors | Decide qual portão barrou (CORS × CSP connect-src × mixed content), lê a mensagem literal do Chrome, e dá a receita por stack (nginx, Express, Django, Spring, FastAPI, CDN/API Gateway) |
Highlights: triagem em 3 comandos · sonda de console que separa os portões em uma execução · add_header sem always fazendo um 500 legítimo virar "erro de CORS" · preflight que não pode redirecionar nem ser autenticado · Vary: Origin e cache poisoning em CDN · reflexão de origem, null e bypass de regex · Local Network Access do Chrome 142 · checklist de fechamento.
Stack-agnostic pre-PR code review built on The Zen of Python as a universal analysis framework. Five principles — readability, explicitness, simplicity, flatness, and error handling — applied as analysis lenses to any codebase. Now with model routing for 76-86% Opus token savings.
| Skill | Description |
|---|---|
/codereview | Full pre-PR review — diffs against base branch, severity-rated findings (CRITICAL → LOW), final grade (A-F). Gathers git context inline, uses sonnet for per-file analysis and the main model for cross-file review and report; was: haiku for git context, sonnet for per-file analysis, opus for cross-file review and report. |
/codereview:coderabbit-pr | Resolves AI review bot comments (CodeRabbit, Copilot, Gemini, Codex) on a GitHub PR — auto-detects reviewers, creates per-reviewer checklists, triages with severity recalibration, applies fixes, runs regression tests, resolves all GitHub conversations |
Analysis layers: Bug Detection · Security · Secrets Detection (deterministic regex script + optional ggshield/gitleaks, always-on, blocks grade F) · Performance · Type Safety · Test Coverage · Documentation Sync · Race Conditions (TOCTOU) · Accessibility · Data Integrity
Model routing: inline (git/CLI, secrets pre-scan) → Sonnet (per-file analysis, parallel) → main model (cross-file review, report)
Framework presets: react (default) · vue · angular · node · dotnet · generic
Promotion to staging, and on to production, through the CD pipeline the repository actually has.
| Skill | Description |
|---|---|
/deploy:staging | Maps branch → pipeline from each workflow's on.push.branches, checks runs-on at the promoted commit, gates the exact sha locally, promotes by PR merge commit and proves the deploy by the data |
Highlights: never pushes the production branch as a side effect; sensors for content only on the target, criss-cross merge bases and long backlogs; verified database dump before a production merge; SKILL.md with the flow and four references with the measured detail.
Auto-generates categorized release notes from git history and creates a GitHub Release via gh CLI.
| Skill | Description |
|---|---|
/release:release [VERSION] [--path DIR] | Generates release notes and creates a GitHub Release |
Multi-stack: C#/.NET · Node.js · Go · Rust · Python
Monorepo: --path filter scopes commits to subdirectories
Contributors: resolved via GitHub API with org membership cross-reference
Tag series: follows the repo's tags (v1.2.0 or <package>-v1.2.0); a version already published gets its notes edited, never a second tag
Invocation: disable-model-invocation: true — it publishes a release, so it runs only when called by name (/release in Cursor), never from context
Interactive wizard to configure Claude Code's status line — model info, context bar, git branch/PR state, cost, and 5h/weekly usage limits.
| Command | Description |
|---|---|
/statusline:setup | Interactive setup wizard — sections, colors, emojis, separator |
12 composable sections: Model name · Context bar · Git branch · Project folder · Session cost · Duration · Lines changed · Token counts · Vim mode · 5h usage window · Weekly usage · PR state
Sections 10-12 (5h/weekly usage limits, PR state) are part of the recommended default set and degrade gracefully — usage limits appear only for Pro/Max subscribers, PR state only when the branch has an open PR.
Effort-level badge (v1.4.0): when effortLevel is set in ~/.claude/settings.json, the Model section shows it inline (e.g., 🤖 Opus 4.7 [high]). Re-read on every invocation — no regeneration needed when you toggle the value.
Cross-platform: Bash + PowerShell, no jq dependency, Windows/Git Bash compatible.
Complete development toolkit for C#/.NET WPF desktop applications — from project setup to E2E testing.
| Skill | Description |
|---|---|
/dotnet-wpf:dotnet-desktop-setup | Configures and audits .NET desktop projects for Claude Code |
/dotnet-wpf:dotnet-wpf-design | Fluent Design guide — layout patterns, typography, 90+ WPF-UI controls catalog, date validation traps, Grid row separators (FORM-004), multi-column form layouts, ContentDialog confirmation for destructive actions (CTRL-008) |
/dotnet-wpf:dotnet-wpf-mvvm | WinForms → WPF MVVM migration with CommunityToolkit.Mvvm and WPF-UI |
/dotnet-wpf:dotnet-wpf-e2e-testing | FlaUI + xUnit E2E testing — Page Objects, AutomationId patterns, CI/CD setup |
Generates a single-command development launcher for any project — dev.sh (bash, Linux/macOS) and dev.ps1 (PowerShell 5.1/7+, Windows). Detects the stack (compose files, monorepo workspaces, frontend/backend dev servers, IdP, mkcert posture, existing launcher) and emits an idempotent script that brings up Postgres, the IdP, the backend(s), and the frontend with colored per-service prefixes, per-component healthchecks, two-strategy port handling (find-next-free port discovery with per-subshell peer-coordination env vars for ports a foreign process might legitimately own, kill-and-reclaim with fuser → lsof → ss → pgrep fallback chain for orphans the script itself spawned), trap cleanup, and HTTPS-on-LAN via mkcert + Caddy when the SPA does OIDC PKCE.
| Skill | Description |
|---|---|
/dev-script | Walks the project, confirms the plan, generates dev.sh and/or dev.ps1, updates .gitignore, prints onboarding for LAN clients |
What it encodes (the gotchas painfully learned in JRC projects):
allowedHosts blocks non-localhost — wrap config without editing vite.config.tsNODE_EXTRA_CA_CERTSexternalDomain on init — drift detection + --reset flag400 COMMAND-1m88i "No changes"--tlsMode external triad (env vars + start flag) for TLS-terminating proxiescrypto.subtle outside secure contexts → signinRedirect silently failssetsid + kill -- -PGID) so Ctrl+C doesn't orphan childrenprojectId/clientId from bootstrap.json on every boot — never hardcodestrictPort silent-hang cascade (P17) — kill_stale_ports against a process the script can't kill silently fails, downstream Vite with strictPort: true hard-fails, parent wait keeps tracking surviving children → visually identical to a hang. Fix is port discovery + peer coordination instead of port reclaim.env reads (P18) — Windows/WSL CRLF appends \r to grep|cut values, so docker exec "$name\r" fails No such container and the healthcheck times out while every log line looks correct; fix is a tr -d '\r' read helpernode_modules (P19) — a tree installed on Windows then run on WSL crashes Vite/swc/esbuild with Failed to load native binding (missing platform-optional binary); re-install on the target OSyarn↔cmdtest collision (P20) — Corepack off by default → apt install yarn installs Debian's cmdtest (Parsing scenario file …); corepack enable shadows the impostor and the script resolves the package manager Corepack-awareCross-platform: Linux/macOS bash and Windows/cross-platform PowerShell — same flags, same semantics, idiomatic primitives in each.
Captures patterns and pitfalls discovered while integrating Zitadel v4.x self-hosted as the IdP for the JRC Brasil ERP. Read this skill BEFORE drafting Zitadel compose files, writing a Management API bootstrap, validating Zitadel JWTs, customizing the Login UI v1, or wiring an SPA via OIDC PKCE — it averages 1–3 hours saved per integration.
| Skill | Description |
|---|---|
zitadel-idp | Field guide with 54 documented quirks (v4-first with proto-aligned v4.15.0 examples, v2.66.x masterkey edge case, full v2.66→v4 upgrade runbook, Login UI v2 deploy bug + Path B mitigation, CD cutover survival kit, Console UI human-user creation pitfalls, production 401-storm hairpin NAT + 3-layer SPA defense, smoke-e2e CI plumbing checklist, real-browser smoke E2E gaps — seed user grant reconciliation + CORS preflight 401 + Playwright self-signed Zitadel recipe), drill-down references, and bundled working assets |
Bundled references (references/): api-cheatsheet.md, api-v1-to-v2-mapping.md (NEW v0.3.0), branding.md, docker-compose-bootstrap.md, migration-v2-to-v4.md (NEW v0.3.0), spa-recipes.md, tenant-org-mapping.md, token-validation.md, troubleshooting.md.
Bundled assets: docker-compose.zitadel.yml (working FirstInstance + volume perms), bootstrap-zitadel.ts (idempotent Management API bootstrap with multi-app applications[] and env > YAML > hardcoded precedence for dynamic dev hosts), scripts/reset-zitadel.sh.
Highlights of the gotchas encoded:
orgId mappingNODE_EXTRA_CA_CERTS, createRemoteJWKSet traps, tlsMode external, x-zitadel-orgidsigninSilent boot-time recursion; StrictMode + closure cancelled flag locking SPA in "Verifying session…"post_logout_redirect_uri invalid; InMemoryWebStorage + F5 trap; crypto.subtle PKCE secure-context requirement on LANprivateLabelingSetting, custom_login_text, LANG-lg4DP, 405 on /assets/v1/orgs/me/policy/label/...COMMAND-1m88i "No changes" and Org-8nfSr "Private Label Policy has not been changed"--reset-zitadel from orphaned tsx watch / nodemon processes holding stale env+JWKS in heapdev.sh must dominate static YAML when LAN host is dynamic (.sslip.io)Scope: Zitadel v4.x self-hosted, OIDC-only (Login UI v1 primary; Login UI v2 deploy bug + Path B mitigation also covered). Out of scope: Zitadel Cloud, v3, SAML, federation IdPs.
Language-agnostic DDD toolkit that audits a codebase for tactical/strategic violations and guides design. Synthesizes Evans, Vernon and modular-monolith practice.
| Skill | Description |
|---|---|
/ddd | Analyzes the codebase for DDD violations, guides strategic design (event storming, context mapping, bounded-context canvas), and generates legacy→DDD migration specs |
References: bounded-context-canvas.md (DDD Crew v5), ddd-crew-process.md (6-phase canonical sequence: Big Picture → Domain Message Flow → BC Canvas → Context Map → Design Level → ADRs), plus tactical/strategic pattern guides.
Cria PRDs claros e acionáveis a partir de uma descrição de funcionalidade, mantendo foco no que será entregue e por quê.
| Command | Description |
|---|---|
/criar-prd:criar-prd <funcionalidade> | Faz até 5 perguntas de clarificação, usa o template de PRD (do projeto, ou o empacotado no plugin) e salva tasks/prd-[slug]/prd.md |
Guardrails: não pesquisa na web por padrão, limita o PRD a 2.000 palavras e evita decisões detalhadas de implementação.
Transforma um PRD local aprovado em uma Tech Spec implementável, explorando só o necessário do projeto.
| Command | Description |
|---|---|
/criar-techspec:criar-techspec <slug> | Lê tasks/prd-[slug]/prd.md, segue o template de Tech Spec (do projeto, ou o empacotado) e salva tasks/prd-[slug]/techspec.md |
Guardrails: consulta as convenções do projeto quando existem, usa rg (e a ferramenta de grafo de impacto do projeto, se houver) e pergunta só quando houver bloqueio real.
Quebra PRD e Tech Spec em tarefas principais incrementais, funcionais e testáveis.
| Command | Description |
|---|---|
/criar-task:criar-task <slug> | Propõe até 10 tarefas high-level, aguarda aprovação e então gera tasks.md + N_task.md |
Guardrails: não implementa código, não altera arquivos fora da pasta da funcionalidade e exige testes planejados por tarefa.
Executa a próxima task planejada sem expandir escopo, usando TDD quando viável e validação antes de marcar conclusão.
| Command | Description |
|---|---|
/executar-task:executar-task <slug> [num] | Seleciona a task indicada ou a primeira desbloqueada, implementa, valida e atualiza tasks.md |
Guardrails: não marca conclusão sem testes relevantes passando, não faz refatoração oportunista e documenta mudanças relevantes.
Captures non-obvious lessons from the current session and applies them to a target skill, in one of two modes so the workflow matches where the skill lives.
| Command | Description |
|---|---|
/retrofit-skill <skill> | Lists session lessons, filters to the target skill, previews the diff, then applies it |
Full mode (skill published in this marketplace): bumps plugin.json + marketplace.json, updates CHANGELOG and README, commits and pushes.
Lean mode (local skill in another repo, e.g. <repo>/.claude/skills/<name>/): edits the files + a CHANGELOG entry and commits in that repo — no version bump or marketplace changes.
Both modes audit the touched skill with skill-quality-audit (baseline before, regression gate after); skill-creator joins only when the description changes.
A Stop hook notices when one of our skills did real work in the session and asks Claude, in that same turn, for a retro of it with evidence. When there is a lesson, Claude ends by asking whether to run /retrofit-skill:retrofit-skill <target> — one "yes" and the retrofit (which keeps its own confirmation gate) takes over.
| Piece | What it does |
|---|---|
Stop hook | Reads only the new transcript lines, spots skill loads (Skill tool and typed /skill), classifies the owner, counts work and friction, and asks for the retro via additionalContext |
SessionStart (resume|fork) | Baselines the transcript offset so a fork's copied history never triggers |
/retrofit-watch:retrofit-watch [skill] | The same retro on demand |
/retrofit-watch:retrofit-watch pendentes | The retros queued by headless sessions |
Ours = the chewiesoft-marketplace cache or clone (full mode; the retrofit argument is the plugin name) or a skill tracked in git in a repo owned by j0ruge, JRC-Brasil or chewiesoft (lean mode). Third-party skills, skills-lock.json entries, .agents/skills, ~/.hermes and untracked skills are ignored.
It defers while the turn waits for you, asks at most twice per skill per session, never talks back to a claude -p session (it queues the retro outside the repo instead, for /retrofit-watch:retrofit-watch pendentes) and never stores assistant text. RETROFIT_WATCH=off disables it; ~/.claude/retrofit-watch.json tunes owners/include/exclude.
Codex CLI: há uma adaptação local ativa, separada do plugin desta loja.
Na instalação observada, ~/.codex/hooks.json chama
~/.agents/skills/retrofit-watch/scripts/codex_retrofit_watch.py. Os avisos de
retro desta sessão vêm desse adaptador. O pacote publicado ainda traz o motor e
os hooks Claude; falta incluir a camada Codex e validar sua instalação pelo
marketplace. Por isso a tabela usa partial e ele permanece fora do catálogo
Codex nativo. Veja a distinção na matriz.
Credits. The retro criteria (moment signals, promotion rule, triage and the secret self-audit) are adapted from self-learning by Kulaxyz (MIT). Thank you for publishing it. The difference is in purpose: self-learning creates a new skill on its own, while retrofit-watch sends the lesson to a skill that already exists, through /retrofit-skill and its confirmation gate.
Deletes the branches that are already merged, locally and on the remote, and the worktrees that hold them. A read-only script proves each merge; a second one deletes only the approved plan, proving each item again first.
| Skill | Description |
|---|---|
/git-housekeeping | Report (delete / unproven / keep, each with its reason), a first confirmation for local branches and worktrees, a second one for the remote, and the undo command for everything deleted |
What counts as merged: a merge commit into the default branch, or a merged PR into the default whose head sha is the branch tip (squash and rebase). A branch with a commit after the merge, merged only into staging, or never used stays, with the reason.
Never deleted: the default and current branch, long-lived branches, branches named in a workflow's branches:, the head or base of an open PR, a dirty or locked worktree. A worktree removal lists the ignored files that go with it (.env.local, node_modules/).
Partial approval (0.2.0): --only <name> deletes just the items the user approved, and a name that is not in the plan exits 2 instead of a silent "nothing to delete".
A skill for writing hooks that actually fire. It was written against a baseline where agents without it put "Bash failed" logic in PostToolUse (it only runs on success), gated /deploy through UserPromptSubmit, stored plugin state outside ${CLAUDE_PLUGIN_DATA} and sent turn-end guidance as decision: "block" (shown as a hook error).
| Tool | Purpose |
|---|---|
scripts/capture_payload.py | Probe hook: records the real stdin + CLAUDE_*/CODEX*/PLUGIN_* env of any event via claude -p --settings, or a Codex hooks.json (--host codex) for codex exec --dangerously-bypass-hook-trust |
scripts/hook_test.py | Runs a hook against a fixture and asserts exit code and JSON |
scripts/lint_hooks.py | Lints hooks.json/settings and plugin.json (event names, type per event, if outside tool events, ignored matcher, unquoted placeholder, missing stop_hook_active guard, "hooks": "./hooks"); --host codex|both adds the Codex contract (no args, ignored if, no http, integer timeout, top-level keys, 14 events) |
References cover the 33 events, input/output schemas, handler types and cost, packaging and trust, stateful patterns, testing, safety (absorbs the former local hooks-2-0-builder) and the 11 points where the official plugin-dev/hook-development skill is out of date, plus references/codex.md: the Codex CLI contract checked against its source (rust-v0.164.0) and a live probe.
Keeps the page that documents a project's environments true by itself. A .env-docs.json at the repo root turns it on; each .env* of the repo, and the .env of each server (read over ssh), becomes one block of a restricted page, rewritten only when its sha256 changes. The intro, the environments table, the CI/CD section (workflows, runs-on, secret names via gh) and how-to-run are derived from the config. Values never reach logs, argv or local state, which keeps only hashes. The same hooks/hooks.json runs on Claude Code and Codex CLI (PostToolUse, Stop, SessionStart), only in the main checkout of the declared machine.
| Tool | Purpose |
|---|---|
scripts/env_docs_sync.py | Python 3 stdlib CLI: init, validate, scan, plan, sync, status, migrate, render-page, hook, install --codex (records hook trust in config.toml, dry-run diff first) |
tests/oraculo_codex.py | Run by hand on each new codex-cli: checks the trust hash against the Codex app-server hooks/list |
The only destination in this version is kb, a wiki CLI driven with a permission lock; sync --to-dir writes to a local folder for tests.
Uma skill boa é encontrada pelo gatilho certo, roda sem contexto externo e só afirma o que dá para reconferir. O plugin traz quatro skills que se enxergam (pastas vizinhas) e se ajudam: a porta de entrada sequencia, e cada irmã decide uma fase.
| Skill | Description |
|---|---|
skill-quality-audit | Porta de entrada: modos simples, completa e reparo (reparo só com autorização e allowlist), cinco fases fixas, teto de 2 ciclos de reparo e relatório por contrato. scripts/audit_skill_quality.py roda checks A1–G2 (spec, autocontenção, progressive disclosure, boas práticas, sinais de afirmação, vínculos da família) |
skill-self-containment | Fase 1 — caça path de máquina, arquivo citado ausente ou órfão e dependência de outro repo; diz o que vendorizar e o que é exceção legítima |
skill-claim-check | Fase 2 — toda afirmação factual ganha sensor, derivação ou data; ausência na doc não prova nada; skill fora do git é trabalho perdido. scripts/listar-afirmacoes.sh lista os candidatos |
skill-refactoring | Fase 3 — extrair para references/scripts ou comprimir por tabelas, preservando a narrativa de execução e os pitfalls |
Somente leitura por padrão: "audite" não autoriza editar; as irmãs só corrigem com pedido explícito. [SKIP] é gate que não rodou, nunca aprovação.
No Cursor: marque as quatro skills no instalador, para que fiquem lado a lado e se achem.
Requisitos: Python 3 (só biblioteca padrão). Opcionais: skills-ref/agentskills ou uvx para o validador oficial.
Turns source material (PDF, doc, notes, numbers) into a talk that looks designed, fits its slot and still reads on its own as a PDF — one offline HTML file, no framework.
| Skill / Agent | Description |
|---|---|
/html-presentation | Brief → source to Markdown → talk plan with data-t per slide → design from the project's DESIGN.md → build.py (inline assets, speaker script, time-budget gate) → shoot.sh (screenshots, laptop views, PDF page check) → independent review → deliver |
deck-reviewer (agent) | Read-only fresh reviewer: fidelity slide-by-slide against the source, layout from screenshots, notes vs slot; returns SHIP / SHIP WITH FIXES / REDO with exact fixes |
Presenter keys: → ← · N notes · P presenter window (notes + timer + next) · F fullscreen · R reset timer.
Designs PDF generation from reference templates — maps dynamic vs fixed fields, recommends a library with trade-offs, and architects modular sections with conditional columns and revision control.
| Skill | Description |
|---|---|
/pdf-generation | Analyzes a reference template (PDF/Excel), recommends a library (pdfmake, pdf-lib, PDFKit, Puppeteer, @react-pdf), and designs the section architecture |
Production-proven pitfalls encoded: cell padding not discounted from widths (last column cut off on A4 with 8+ columns); Roboto fi/fl ligatures drop the f; addFonts() rejects AFM; header/footer in content[] vanish on page 2+; revision cache stale on layout change; SVG fills from a <style> block render blank unless inlined. Phase 6 Visual Verification — render and inspect every page, not just page 1.
Jira ticket lifecycle integrated with Git for JRC Brasil projects. Per-repo project detection via a .jira-project file (PROJECT/BOARD/BRANCH_PREFIX, optional BASE_BRANCH) — no hardcoded project. Prefers acli + the atlassian MCP.
| Command | Description |
|---|---|
/ticket start | split | close | status | Create issues/sub-issues + branches, split work, and close with an auto-generated summary |
Encoded lessons: transitions are project-specific (discover via getTransitionsForJiraIssue, transition by id; acli --status matches the destination status name, not the transition name); the base branch is project-specific (optional BASE_BRANCH, don't assume develop).
Kaizen methodology applied to the three phases of a software's life — planning, implementation and maintenance — with PDCA as the backbone, plus material for teaching Kaizen to the team (history, vocabulary, training script).
| Skill | Description |
|---|---|
/kaizen-software | Plans features as small verifiable increments, keeps defects from moving forward during implementation (jidoka), and drives maintenance through 5 whys + 5S — logging every closed cycle in KAIZEN_LOG.md |
Fits into the repo instead of replacing it: Kaizen artifacts map onto the ones the project already has (architectural decisions → ADRs, opportunities/debt → TODO.md or backlog, recurring gotchas → the project runbook, history → CHANGELOG.md). Where the project forbids refactoring without an explicit request, the boy-scout rule becomes a logged opportunity rather than an edit — a finding never authorizes a change.
References: desperdicios.md (the 7 wastes translated to software, with detection questions, plus mura/muri), kaizen-conceitos.md (history, vocabulary, teaching script for onboarding or a board presentation), templates.md (PDCA plan, Kaizen Log, 5 whys, retrospective).
Create, extract, review, version and distribute a TypeScript library for Node. The package rules apply to any library; the distribution rules say when they apply — the measured case is a private organization with no registry and no GitHub Actions.
| Skill | Description |
|---|---|
/ts-library | Package shape, sensors on the packed tarball, semver that includes the persisted format, distribution choice (registry, git tag, vendored tarball), a release proven by rebuilding the tag, and docs for agents shipped inside the package |
Honest about what is proven: each claim is tagged measured (with the command), sourced (external fact with the date it was read, in references/fontes.md) or design (decided, not yet executed end to end).
References: pacote.md (annotated package.json and tsconfig), sensores.md (the gate and how to sabotage each sensor), distribuicao.md (the four distribution forms, vendored-tarball mechanics, updating a consumer, the reproducible release), docs-para-agentes.md (README.md/AGENTS.md inside the package), extracao.md (extracting from a workspace with history), fontes.md (dated external facts).
Audio preprocessing + transcription pipeline (ffmpeg + OpenAI Whisper), 100% offline — extract, silence removal, voice enhancement, segmentation, and transcription (optional two-language pass + auto-merge).
| Skill | Description |
|---|---|
/whisper-preprocess | Runs the full pipeline from a media file (MKV/MP4/WAV/M4A) to text |
Anti-"picotamento" lessons (proven on a 65-min low-volume, dysarthric recording): the listenable *_enhanced.opus is decoupled from the transcription chain (stable gain only — no dynamic AGC or silence removal); a 2-pass loudnorm linear=true silently reverts to dynamic on clipping sources (compressor + limiter used instead); Opus inter-sample overshoot needs limiter headroom (--listen-limit 0.6) to keep the decoded true-peak below 0 dBFS.
O TODO.md no esqueleto do kit sdd continua sendo a fonte da verdade; cada issue é um espelho dele, e o script só cria ou edita o que mudou.
| Skill | Description |
|---|---|
todo-to-github-issues | plan (só lê) → canário --apply --limit 1 → --apply; --close-orphans só depois de ler as órfãs. --audit/--fix medem contra o sensor do kit (tests/check-todo.sh), e ACHADOS-*.md vira issues pela tabela de roteamento |
Requisitos: Python 3, gh autenticado e o kit sdd na máquina (SDD_HOME, sdd no PATH ou ~/repos/sdd_agents) — a skill não carrega cópia do formato nem do sensor.
Field guide for recovering a Linux server's Docker services from backup, and for keeping the backup that protects them actually alive. Both halves live in one skill because the incident that closes the loop is born on the seam: a restore renamed a container, the backup inventory did not follow in the same commit, and the nightly backup stopped completing — for days, with no alert.
| Skill | Description |
|---|---|
ansible-docker-backup-restore | 11 inviolable rules, a routing table into 7 references, and two mandatory gates — audit the vhost before any VIRTUAL_HOST, and no restore is done until the backup ran end to end with failed=0 |
Highlights: silent compose-project-name trap (wrong prefix creates an empty volume and the service comes up clean); 8-step anti-overwrite guard that fetches and verifies the replacement before deleting anything; find returning files: [] on an unreadable path being read as "empty, safe to overwrite"; generic service key becoming a shared-network DNS alias that resolves round-robin between two different databases; certificate PEMs surviving without the ACME client state; the four silent-death patterns of a backup pipeline; and a read-only check-backup-freshness.sh that flags gaps in the date sequence — the cheapest signal there is, and the one that would have caught the original incident on day one.
Agnostic by construction: no server, domain, container, volume or network address from any specific environment — the real cases are told by mechanism, with placeholders.
For private repo auto-updates at startup, set a GitHub token with repo scope:
export GITHUB_TOKEN
[!IMPORTANT] Generate a token at github.com/settings/tokens with the
reposcope.
Projects that clone this repo get automatic marketplace discovery via .claude/settings.json. When team members trust the folder, Claude Code prompts them to install the marketplace — no manual setup needed.
Use este modo quando quiser trabalhar com as skills no Cursor (ativacao por contexto).
python install.py e escolha Cursor ou Both.~/.cursor/skills/ (uso pessoal em todos os projetos), ou.cursor/skills/ (uso compartilhado no projeto).Exemplos de pedidos no chat:
Faz um code review das minhas alteracoes antes do PR.
Resolve os comentarios do CodeRabbit no PR #49.
Deploy para staging da branch atual.
A skill release nao entra por contexto: ela publica uma release, entao so roda chamada pelo nome (/release 2.1.0).
Observacao: o plugin statusline e exclusivo do Claude Code.
Use este modo quando quiser utilizar comandos e skills diretamente no Claude Code.
/plugin marketplace add j0ruge/skills
/plugin install ansible-docker-backup-restore
/plugin install cicd
/plugin install codereview
/plugin install cors
/plugin install criar-prd
/plugin install criar-task
/plugin install criar-techspec
/plugin install ddd
/plugin install deploy
/plugin install dev-script
/plugin install dotnet-wpf
/plugin install env-docs-sync
/plugin install executar-task
/plugin install git-housekeeping
/plugin install hook-builder
/plugin install html-presentation
/plugin install kaizen-software
/plugin install pdf-generation
/plugin install release
/plugin install retrofit-skill
/plugin install retrofit-watch
/plugin install skill-quality-audit
/plugin install statusline
/plugin install ticket
/plugin install todo-to-github-issues
/plugin install ts-library
/plugin install whisper-preprocess
/plugin install windows-disk-cleanup
/plugin install windows-games-linux
/plugin install wsl-windows-onboarding
/plugin install zitadel-idp
/deploy:staging
/release:release 2.1.0
/statusline:setup
/codereview
/codereview:coderabbit-pr 49
Para atualizar plugins instalados:
/plugin marketplace update
Sources used for the implemented Codex support. CLI distribution is verified; desktop, macOS, Windows, and the minimum client version remain unverified. Review fixes cover adapter input errors, JSONL transport, shared installer validation, and native skill arguments. Local frontmatter warnings can still be strict external audit errors; see compatibility. Release argument parsing passed six isolated model scenarios; two controls on the previous version also passed. See argument evidence. Integration and external review are tracked in PR #6; the desktop acceptance check remains pending. Research, decisions, and the DDD/Kaizen checklist are tracked in CONTEXT.md, with the design, implementation plan, and session handoff.
agents/openai.yaml metadata.retrofit-watch's retro (plugins/retrofit-watch/skills/retrofit-watch/references/criteria.md). Thanks to the author for sharing it.install.py and the platforms field).cursor/skills/<name>/SKILL.md and how the agent triggers skills by description.cursor/skills/ (no global directory)~/.cursor/skills/ global directory; informed the "Staging cache" rename in the installercursor_description strings used in command→skill conversions| env-docs-sync |
| ✓ |
| — |
| ✓ |
Skill + hooks — mirrors each .env* into a restricted environments page, values never in logs or state; Python 3 stdlib script; on Codex the hooks run only after install --codex --apply records their trust |
| executar-task | ✓ | ✓ | ✓ | Command (Claude Code) / Skill (Cursor) |
| git-housekeeping | ✓ | ✓ | ✓ | Skill — Python 3 stdlib scripts (read-only analysis + plan applier) and git; gh optional, to prove squash merges |
| hook-builder | ✓ | — | ✓ | Skill — builds and proves hooks for Claude Code and Codex CLI; Python 3 stdlib scripts (probe, fixture harness, config lint with --host codex|both) |
| html-presentation | ✓ | ✓ | ✓ | Skill + agent — timed HTML slide deck from source material; the deck-reviewer agent is Claude Code only (Cursor falls back to a general-purpose reviewer) |
| kaizen-software | ✓ | ✓ | ✓ | Skill — Kaizen (continuous improvement) methodology for planning, implementing and maintaining software, plus teaching material; verifies by artifact, not by the tool's label |
| n8n-ops | ✓ | ✓ | ✓ | Use quando JÁ existe um n8n rodando e algo nele está errado, não provado ou invisível — não para desenhar fluxos na tela. Cron ou webhook que não disparou nem avisou ninguém, sem prova de que rodou; import que duplica, erra projectId/userId ou diz sucesso sem mudar nada; execution_entity/execution_data com valor estranho; ensaiar antes de ativar; alarme que deduplica sem esconder a segunda falha. active não prova que roda; exit 0 não prova que importou. Não use para Zapier, Make ou Airflow. |
| pdf-generation | ✓ | ✓ | ✓ | Skill — PDF template design + library selection (pdfmake/pdf-lib/PDFKit/Puppeteer/@react-pdf), modular sections, visual verification |
| release | ✓ | ✓ | ✓ | Skill (runs only when invoked) |
| retrofit-skill | ✓ | ✓ | partial | Command (Claude Code) / Skill (Cursor) Codex: O comando depende de /plugins/ e caminhos de instalação do Claude; autocontenção no cache e integração com outros plugins não comprovadas. |
| retrofit-watch | ✓ | — | partial | Codex CLI: adaptação local em funcionamento; o plugin desta loja ainda empacota os hooks Claude e não inclui o adaptador Codex. |
| skill-quality-audit | ✓ | ✓ | ✓ | Skills — four skills in one plugin (audit entry point + 3 sisters that find each other); Python 3 stdlib script |
| statusline | ✓ | — | unsupported | Claude Code only (uses the Claude Code status line API) Codex: Comando setup escreve configurações e script exclusivos do Claude. |
| ticket | ✓ | — | ✓ | Claude Code only (/ticket slash command + Jira acli + atlassian MCP) |
| todo-to-github-issues | ✓ | ✓ | ✓ | Skill — Python scripts + gh; needs the sdd kit on the machine |
| ts-library | ✓ | ✓ | ✓ | Skill — TypeScript/Node library packaging, sensors, release and distribution; no scripts yet |
| unlovable | ✓ | ✓ | ✓ | Skill — works on both platforms |
| whisper-preprocess | ✓ | ✓ | ✓ | Skill — ffmpeg + OpenAI Whisper offline audio→text pipeline (silence removal, voice enhancement, segmentation, multilingual merge); decoupled stable-gain listening copy (no "picotamento") |
| windows-disk-cleanup | ✓ | ✓ | ✓ | Skill — frees Windows disk space without losing data: C#-backed inventory with coverage, duplicates proven by SHA256 with hardlinks discounted, zip×folder by CRC32, user-authorized rounds (manifest → reversible step → delete from list → re-measure), Google Drive cache cap-before-clear, old-profile rescue, WSL/Docker vhdx, sabotage self-test |
| windows-games-linux | ✓ | ✓ | not_checked | Skill — diagnoses Windows games on Linux layer by layer (Lutris → umu → Proton/Wine → game): read-only diagnose.sh (game config, effective runner, graphics DLLs in the prefix, Unity crash logs, missing i386 packages), ab-launch.sh A/B launch outside Lutris with a RUNNING/CRASH/EXITED verdict; catches Lutris 0.5.22 injecting its own VKD3D/NVAPI into Proton prefixes; 1.1.0 reads umu's output from the user journal and tests whether AppArmor lets umu's bwrap create its user namespace |
| wsl-windows-onboarding | ✓ | ✓ | ✓ | Skill — onboards a Windows box to WSL2: install the Ubuntu distro + a non-root sudo user, diagnose WSL, install rtk + Claude Code (global rtk hook), migrate projects into the Linux FS (copy→validate→delete, incl. a tight-disk one-repo-at-a-time loop for a nearly-full C: and the reserved-name nul/\\?\ delete trap, CRLF/filemode "whole tree modified" diagnosis), and set up zsh + the Windows Terminal profile (icon + default) |
| zitadel-idp | ✓ | ✓ | ✓ | Skill — Zitadel self-hosted OIDC integration field guide (bootstrap, JWT, branding, 50 gotchas with proto-aligned v4.15 examples + CD cutover survival kit + Console UI human-user creation pitfalls + production-cutover v0.7.0 (backend extra_hosts for hairpin-NAT IdP, 3-layer SPA defense vs RT-reuse session revoke) + smoke-e2e CI v0.8.0 (admin.pat bind mount EACCES cascade into unique_constraints_pkey, default password policy 4-class trap, Login UI v2 healthcheck slow on small runners) + real-browser smoke v0.9.0 (seed user grant reconciliation gap on YAML evolution, browser→backend CORS preflight 401 mimicking JWT failure, Playwright self-signed Zitadel recipe) + admin-console Failed to fetch mixed-content v0.10.0 (api http vs issuer https from --tlsMode disabled; recreate, don't docker start) + v2.66→v4 upgrade runbook + API v1→v2 mapping) |
chmod 0777docker compose up -d --wait--wait-timeoutup --waitv2.30.0 adds the signature the skill was missing: a runner that refuses work **without announcing it** —, 28 (not thousands),, log ending at , and the only trace once a minute in — where the decisive sensor is the **filesystem** (, a downloaded version that never swapped in), not the log; auto-update being **on** does not help, because an ephemeral entrypoint that wipes state makes the swap structurally impossible, which closes option (a) of lesson 49 for that design (§8a/§8b, lessons 86–87). It also corrects §11 by measurement: neither prescribed layer catches this — presence is genuinely true, and stuck-deploy found nothing because nobody deployed for 17 days — so a third layer compares .runners[].versionagainst the currentactions/runnerrelease, read live (§11 C, lesson 88). And §2a qualifies §2: the operator clone is inert for the app (proved — the live container carried a setting the host compose lacked) but is the **only** deploy path for therunner, which CD's up -dnever lists (lesson 89). v2.30.1 corrects a factual claim in that entry: the runner was not mute for three weeks. A production deploy had **succeeded on the same day at 15:12**, and the runner went silent at 15:15:56, ~35 seconds after GitHub stopped merely offering the update and started requiring it. What lasted three weeks was the **latent** defect —bin.2.337.0/sat there from 01/09 with everything still working — which makesls -d /actions-runner/bin.| codereview | 2.27.23 | Quality | Pre-PR code review with tiered model routing, TOCTOU detection, accessibility, deterministic hardcoded secrets detection via Python regex script + optional ggshield/gitleaks (GitGuardian-equivalent, blocks PRs with leaked credentials), and multi-reviewer PR resolver (CodeRabbit, Copilot, Gemini, Codex) with baseline-aware regression testing, verify-before-trust validation of reviewer-cited references, and byte-exact verification (od -c / xxd) when reviewers cite NUL bytes, BOM, zero-width chars, or other invisible/control characters — Read renders those bytes as plain whitespace and silently induces false-positive verdicts. v1.12.0 hardens Phase A output discipline (literal return template + END_OF_PHASE_A_REPORT end-marker) and adds a mandatory orchestrator-side fallback so the F-grade secrets gate never silently degrades when the haiku agent under-reports (running 9 tool calls but final-messaging only "results returned above"). v1.13.0 adds detection pass 6.5.3 "Contract Drift in Tests" — when the diff modifies an exported constant (export const X = [...] as const, Zod/Yup/literal-union schemas) and a test file in the codebase asserts that constant literally (expect(X).toEqual([...]) / toStrictEqual / toMatchObject / deepEqual), cross-check the asserted shape against the current export and flag mismatches as HIGH (public contract) / MEDIUM (internal). Same release also forces the final report's ### Overall Grade table and ### Recommended Actions block to ALWAYS render — even on zero-findings happy path, focus-area runs, or token-tight reviews where the model would otherwise collapse them into prose. v1.14.0 adds detection pass 6.9 "Dead Code & Unused Symbols" plus a dedicated parallel Dead Code Sweep agent (Phase B2) — because the per-file analysis agents each see only one file and structurally cannot tell whether an exported symbol is referenced elsewhere, dead code (unused exports, orphaned files, unreachable code, dead deps) needs a whole-repo reference sweep. It runs a hybrid scope (code morto introduced or orphaned by this PR first, then a capped pre-existing project-health summary) using the repo's own tooling when present (knip / ts-prune / vulture / depcheck / Roslyn / staticcheck, read-only) and a grep reference deepsearch otherwise, with strong false-positive guardrails (public API, framework/DI/reflection wiring, non-code references, barrels, test-only utils) and a per-finding Confidence. Dead code is hygiene: MEDIUM/LOW only, never blocks the PR, and feeds the new 🧹 Dead Code & Cleanup report section + Recommended Actions → Consider Fixing. v1.15.0 calibrates pass 6.9's reading of knip/ts-prune output with two false-positive guardrails learned from a real run: over-export (a symbol used only WITHIN its own file is reported as an "unused export" but isn't dead — recommend dropping the export, not deleting it) and regenerable scaffolding (shadcn components/ui/** / **/generated/** surfaced in bulk → keep in Bucket B, capped, never an actionable app finding). v1.16.0 splits that over-export guardrail into two opposite fixes — pure in-file plumbing → drop the export; a symbol that's part of an exported type-surface/API (e.g. an interface typing an exported hook's return, like AuthUser in UseAuthReturn) → keep the export and mark @public/@internal, never delete (dropping it can break tsc -b/declaration emit with "uses private name") — and makes the within-file/exported-signature grep a mandatory per-symbol check on every "unused export". v1.17.0 makes coderabbit_pr's mechanical phases deterministic and self-cleaning: reviewer detection, comment extraction and thread resolution now run inline as fixed gh api/--jq/GraphQL commands instead of prose-prompted subagents (a delegated batch that silently skips a thread is indistinguishable from a clean run), with Phase 5 ending on an unresolved: 0 assertion that gates completion; extraction is separated from interpretation via a --jq projection that drops diff_hunk/URLs before they reach any context (delegating to sonnet only above a size threshold) and encodes two non-obvious traps — .line // .original_line (null once a comment's diff goes stale) and select(.body != "") (empty approval bodies became phantom findings); a new Phase 6 deletes the {reviewer}-review.md checklists on the success path, since a stale checklist from an earlier PR is read by the cross-reviewer check as if it were current (opt out with --keep-checklists). Also fixes two real defects: fixes were applied to whatever branch was checked out rather than the PR's headRefName (silently landing them on unrelated work), and a reviewer that never ran — e.g. Copilot returning "unable to review — quota limit" — was recorded as "approved without issues", burying a coverage gap. v1.17.1 closes four coherence defects that a live run of v1.17.0 exposed: the zero-findings checklist is no longer written just for Phase 6 to delete moments later (the determination goes into the final report unless --keep-checklists is passed); the "no review comments → stop" error no longer collides with Phase 2's zero-findings path (stop means no bot posted anything at all — a reviewer that posted but found nothing, or reported it could not run, must still be reported); Phase 4 is skipped when Phase 3 changed no files, since a before/after comparison with no "after" only burns minutes and makes pre-existing failures look like this run caused them; and Phase 6's cleanup drops its hardcoded filename list plus an unexecutable "plus any {bot-login}-review.md" comment in favour of matching the header this skill writes — which covers unknown reviewers while leaving unrelated project docs like security-review.md untouched, where a bare rm -f *-review.md would not. v1.18.0 prompt audit against current models: Phase A (git context, classification, secrets pre-scan) now runs inline instead of in a haiku agent — the fixed commands have one right answer and the agent only added variance and a silently dropped field; 28 of 32 caps-emphasis lines dialed back, the four-way "Forbidden" block for the final sections became one paragraph with the reason, the sales-quote incident left the reference. coderabbit_pr 3.6.0: reviewer registry corrected by measurement (Copilot posts under two logins, the Codex logins did not exist), version-relative phrasing and PR archaeology removed, the pre-fix test baseline placed where it actually runs. v1.19.0 cuts the cost of a review, measured on 16 pipeline sessions where /codereview was 46–65% of each session's spend: the per-file and sweep agents now read their own contract from references/per-file-agent.md / references/sweep-agent.md (absolute paths, one batch of tool calls, static analysis of the diff and its file only — no repro sandboxes, no test runs), the launch prompt shrinks to ~12 lines so the orchestrator stops paraphrasing it, model: "sonnet" becomes a stated poka-yoke, Phase A batches into three turns, Bucket B of the dead-code sweep becomes opt-in (dead-code focus or sweep=full), and every report ends with a one-line Cost footprint. v1.20.0 adds always-on detection pass 6.11 "Silent-Blinding Sensors" — code whose job is to notice (guard, gate, health check, alarm, verification step) but whose failure mode is silence, which reads as success: swallowed errors in the sensor itself (`2>/dev/null |
| n8n-ops | 1.0.2 | Operations | Operar n8n como infraestrutura, não desenhar fluxos: diagnosticar automação que não avisou pela escada "gravou? notificou? entregou?", importar workflow sem criar duplicata invisível, ensaiar antes de ativar, e desenhar alarme que não mente. A lição central: workflow_entity.active NÃO prova que um workflow está executando — o agendamento vive em memória (medido: coluna f com o workflow rodando de 10 em 10 min, sem falhar, por 11 h), então o sensor é sempre execution_entity. Cobre as quatro mensagens do import:workflow que mentem (id ausente; --projectId em projeto pessoal; flag de destino em reimport, cuja mensagem fala de "credential" com o id do workflow; --activeState=fromJson fora de modo queue), o verde mentiroso do CLI (sai 0 mesmo falhando, e veredito negativo deixa passar Connection refused), o flatted de execution_data (strings são índices; JSON.parse devolve lixo válido), por que n8n execute não serve para ensaio (o CLI não carrega módulos que o servidor carrega), chave de dedup com discriminante por família (dedup grosseiro faz a segunda falha real sumir para sempre) e superfície de acesso só-leitura (SQL por stdin, docker exec -i, credencial pela UI) |
| deploy | 3.3.4 | Development | Promoção para staging (e daí para produção) pelo pipeline de CD que o repo realmente tem. (v2.0.0 — correção crítica) A topologia de branches deixa de ser presumida: a versão anterior cravava "push em develop dispara o cd-staging" e ainda fazia git push origin main para "sincronizar" — num repo com a cadeia develop → staging → main isso dispara o cd-production, ou seja, deployava produção reportando "staging". Agora o Step 0 lê o on.push.branches de cada workflow, monta o mapa branch → pipeline, exige identificar qual branch é gatilho de produção e só empurra a branch-alvo. Junto: pre-flight derivado do lockfile/package.json em vez de yarn/eslint src/ hardcoded (que viravam no-op silencioso em npm/monorepo, e tsc --noEmit é no-op em tsconfig solution-style → tsc -b); gate de CI verde conferindo o headSha do commit promovido; promoção por PR com merge commit (squash em branch de ambiente cria divergência sobre conteúdo idêntico na promoção seguinte); e sensores de conteúdo exclusivo do alvo + git diff -- .github/workflows/, que responde qual pipeline vai rodar quando a promoção altera os próprios workflows. (v2.1.0) Step 0b lê o runs-on do cd-*.yml no commit promovido: job hospedado sob bloqueio de cobrança do Actions nunca inicia (assinatura: zero steps, runner_name vazio, log not found; mensagem só nas annotations) — promover só é seguro se o pipeline-alvo rodar em self-hosted, e se a própria promoção move os jobs para lá é esse push que revive o CD. Junto: PR em conflito não tem run de pull_request (checar mergeable antes de esperar o verde); a dívida de lint que o alvo traz vira o seu gate; paths-ignore explica run ausente em promoção só de docs; e Step 7 prova o deploy pelo dado (migrate status no banco-alvo, docker inspect … Created × horário do run, HTTP no hostname) em vez de confiar no verde. (v2.1.1) O Step 7 passa a ensinar a ler os dois campos do docker inspect, não só o Created: um Config.Image sem prefixo de registry (dsr-web:latest em vez de ghcr.io/<org>/<img>:staging) significa que o container foi buildado à mão no host e o pipeline nunca entregou ali — medido num caso real em que "container up + hostname 200" foi lido por semanas como pipeline funcionando. E o Step 4 passa a contar o backlog: com o CD parado, o primeiro deploy verde não é incremental (15 commits e a troca da imagem feita à mão por uma de pipeline nunca executada ali — duas novidades no mesmo instante, impossíveis de separar se algo quebrar). (v2.2.0) O Step 7 passa a separar falha transitória de falha real: ERROR: unknown blob no push ao GHCR — medido depois de todas as camadas subirem — não se conserta re-promovendo (isso só gera outro merge commit na branch de ambiente), e sim com gh run rerun --failed, que reaproveita o mesmo run id, então gh run watch e os comandos de prova seguem valendo e o gh run list não mostra run novo. Antes de reexecutar, provar pelo docker inspect … {{.Created}} que o ambiente ficou intacto: qual passo falhou decide se o rerun é neutro — falha em build-and-push é anterior ao deploy, falha em smoke/cleanup é posterior e redeploya; e duas falhas iguais no mesmo passo deixam de ser transitórias. Junto, o Step 4 ganha o alvo de rollback para ambiente que só publica tag móvel (:staging é re-apontada pelo próprio deploy, então depois de promover não sobra nome para a imagem anterior): marcá-la antes do push, o que sobrevive ao docker image prune -f do próprio deploy porque prune sem -a só remove imagem dangling. |
| cors | 1.1.2 | Development | Diagnóstico e configuração de CORS — o erro que mente sobre a própria causa. A espinha é o método: o catch do app embrulha CORS num "falha de rede" e o curl não reproduz o bloqueio (ele prova alcance, não permissão — 200 no curl com o browser bloqueado é a assinatura de uma falha de CORS, não uma contradição), então o primeiro passo é decidir qual dos três portões barrou: CORS, CSP connect-src ou mixed content — os três falham idênticos no JS. Traz triagem em um minuto (3 comandos), tabela sintoma→causa com a mensagem literal do Chrome, e uma sonda para colar no console que distingue os portões em uma execução (cors: THROW + nocors: type=opaque = é CORS; ambos THROW = não é). configuracao.md cobre por stack, priorizando o que quebra em produção e não em dev: nginx add_header sem always (o 500 legítimo chega sem headers e o console culpa o CORS), if que não herda header, ausência de wildcard de subdomínio no protocolo (daí map), ordem do cors() antes da auth no Express (preflight não carrega credencial — autenticá-lo é sempre erro), CSRF_TRUSTED_ORIGINS do Django que não é CORS, ordem de filtro do Spring Security, allow_origins=["*"] + allow_credentials silenciosamente degradado no FastAPI, e o Vary: Origin que nem todo CDN respeita. seguranca.md é enfática porque afrouxar é a correção mais rápida e algumas formas são a vulnerabilidade: refletir a origem sem allowlist é pior que * (funciona com credenciais), null na allowlist é explorável via <iframe sandbox>, endsWith/includes/regex sem âncora têm bypass conhecido — e fecha com o que CORS não faz (não é auth, não é anti-CSRF, não torna API privada). casos-limite.md cobre preflight que não pode redirecionar nem ser autenticado, Expose-Headers (paginação e Content-Disposition "só quebram em produção"), o Local Network Access do Chrome 142 (público → localhost por permissão do usuário, substituindo o PNA — parece CORS e não é), e o que só parece CORS: WebSocket, canvas tainted, fontes, SSE. v1.0.1 prompt audit: the measured case in diagnostico.md keeps its literal Chrome strings and both lessons but loses the internal staging hostnames and the date; the description gets its missing accents. v1.1.0 cobre o preflight que responde 204 e mesmo assim tem a requisição real bloqueada, porque Access-Control-Allow-Methods não lista o método (casos-limite.md §1a): sintoma parcial — só a edição quebra, então a suspeita cai na tela e não no CORS —, a sonda da triagem deixa de perguntar por POST fixo (perguntar pelo método errado devolve 204 e atesta saúde onde há doença), e o conserto durável é derivar a lista de métodos do router em vez de curá-la à mão, com o teste e as duas armadilhas dele. |
| release | 2.0.3 | Development | GitHub Release creation with categorized notes, multi-stack and monorepo support; runs only when invoked |
| statusline | 1.5.2 | Customization | Interactive status line setup — cross-platform (Bash + PowerShell), 12 sections incl. 5h/weekly usage limits + PR state, optional effort-level badge |
| dotnet-wpf | 1.8.0 | Development | WPF toolkit — project audit, Fluent Design guide (90+ controls, form spacing, height clipping, Grid row separators, multi-column layouts, ContentDialog confirmation for destructive actions), MVVM migration, E2E testing v1.7.0 prompt audit across the four skills: the Passo 8 hooks JSON used a non-existent PreCommit event and an invalid shape (fixed; pre-commit tests go to a git hook), the mvvm references still registered ViewModels as Transient against the body's own memory-leak rule (aligned to Singleton), a pointer to a non-existent spec now points at the sibling e2e skill, the design skill drops its inline changelog and fixes brush names, origin-project residue (VDAControls, VDRDataAnalyzer, MMSI) is neutralised and caps-emphasis dialed back |
| ddd | 0.5.2 | Architecture | Domain-Driven Design toolkit — analyzes codebases for DDD violations, guides strategic design (event storming, context mapping, bounded-context canvas), generates legacy→DDD migration specs. Language-agnostic; synthesizes Evans + Vernon + modular-monolith practice v0.4.2 prompt audit: the author's e-mail and the JRC brand leave the distributed code examples (→ example.com / Acme), the "out of scope (v0.4.0)" section stops being a diff against a version the model never saw, the sub-agent template drops its numeric word cap, and three caps go back to normal register. v0.5.0: Mode 1 gains a diff-scoped review (task/PR change: git diff + direct collaborators, checklist sections 1-6, no fan-out, short output) |
| dev-script | 0.6.1 | Development | Generates dev.sh (bash) + dev.ps1 (PowerShell) launchers tailored to the current project — detects compose/monorepo/IdP/mkcert, emits idempotent script with healthchecks, two-strategy port handling (find-next-free discovery with peer-coordination env vars for foreign-owned service ports / kill-and-reclaim with pgrep fallback for own orphans), trap cleanup, HTTPS-on-LAN via mkcert + Caddy when the SPA does OIDC PKCE, Playwright LAN-HTTPS testing recipe, monorepo kill_known_dev_servers regex gotcha (path appears before tsx in cmdline), tsx watch --include=.env so launcher-patched env actually reaches runtime, the boot-time sanity-check pattern (app warns LOUD when runtime config diverges from launcher's source-of-truth file), and v0.4.0 P17 — foreign port owner + strictPort: true silent-hang cascade (kill silently fails → Vite hard-fails → parent wait keeps tracking surviving backend = looks like a hang; fix is pre-flight port discovery with peer-coordination env vars instead of trying to kill foreign processes). v0.5.0 adds three Windows↔WSL migration pitfalls: P18 — CRLF .env silently appends \r to values read with grep|cut (docker exec "$name\r" → No such container, healthcheck times out while every log line looks correct; fix is a tr -d '\r' read helper); P19 — node_modules built on another platform crashes Vite/swc/esbuild with Failed to load native binding (missing platform-optional binary; re-install inside the target OS); P20 — yarn resolves to Debian's cmdtest impostor (Parsing scenario file …) when Corepack isn't enabled (corepack enable shadows it; resolve the package manager Corepack-aware) v0.5.3 prompt audit: incident tallies and "bit us" archaeology leave the pitfalls (the rules stay, in the present tense), numeric output caps (5–10 bullets, 10–15 lines) become qualitative, a false ordering constraint and a CVE placeholder are gone, description trimmed to 8 triggers |
| retrofit-skill | 0.10.0 | Development | Apply non-obvious session lessons to a target skill in two modes — full (marketplace skill: bumps version, updates CHANGELOG/marketplace.json/README, commits and pushes) or lean (local skill in another repo: edits files + CHANGELOG and commits there, no bump or marketplace changes) v0.3.0 turns "run the validator" into an actual gate: it runs before the commit, its WARNINGS are blocking for the skill being touched (a warning that never fails becomes background noise — 7 plugins drifted to as much as 871 chars under one), README version bumps stop being conditional (a bump always changes it; that "if" is how a stale 2.20.0 survived), and a snippet re-reads all four places instead of trusting that the edit landed. Also warns that git checkout on the shared marketplace.json takes your real edits with it. (NEW v0.3.1) o cheque de confirmação do README, que a v0.3.0 introduziu, era ele próprio um sensor cego: perguntava se ` |
| retrofit-watch | 0.3.3 | Development | Stop hook that notices when one of our skills (marketplace or a git-tracked project skill) did real work in the session and asks Claude for an evidence-backed retro, ending with an offer to run /retrofit-skill — the improvement loop no longer depends on someone remembering to ask. Defers while the turn waits for you, at most 2 retros per skill per session, silent in claude -p (v0.2.0) also watches our kits (default sdd: /sdd-*, sdd-* subagents, the sdd CLI) and sends their lessons to the kit's TODO.md instead of /retrofit-skill. (v0.3.0) headless sessions (sdd run phases) get nothing back; with friction they are queued in the plugin's data dir, outside any repo, and a one-line notice at the next interactive session points to /retrofit-watch:retrofit-watch pendentes. (v0.3.1) documents a measured limit: attribution sticks to the last loaded skill across tasks (41% of attributed friction), and the prompt-based fix was refuted. (v0.3.2) runs on Windows: no fcntl crash on every turn, and the silent failures behind it (\ paths unwatching marketplace skills, cp1252 stdio swallowing the retro) are fixed. (v0.3.3) during a kit mission in a linked worktree the retro also names that worktree's TODO.md, not only the main checkout the PATH binary resolves (writing there stops target runs with KIT-TOUCHED), and a finding recorded in any worktree of the kit ends the retro. |
| git-housekeeping | 0.5.0 | Development | Safely deletes merged git branches, local and remote, and their worktrees. A read-only scan proves each merge by merge commit or by the merged PR's head sha; only the approved plan is deleted, with sha leases and two confirmations. Triggers — merged branches, branch cleanup, delete merged branches, stale worktrees, git housekeeping, prune branches. |
| hook-builder | 0.2.0 | Development | Build, package and prove hooks for Claude Code and Codex CLI against the current official references: event and output channel by intent, real payload capture (capture_payload.py), loop guards, plugin-data state, fixture harness (hook_test.py), config lint (lint_hooks.py) and a live firing check; 0.2.0 adds Codex CLI: no args, hash trust, apply_patch and real Codex fixtures |
| env-docs-sync | 0.1.0 | Development | Mirrors every .env* file of a repo into a restricted environments page: one section per environment, one block per file, rewritten only when its hash changes, plus a CI/CD section with secret names. Values never reach logs or local state. Triggers — env docs, .env sync, environments page, env-docs-sync, .env-docs.json, environment variables docs. |
| skill-quality-audit | 0.9.1 | Quality | Audita Agent Skills em quatro skills que se ajudam: a porta de entrada skill-quality-audit fixa a ordem das fases (estrutura e autocontenção, claims, progressive disclosure, integração e portabilidade, verificação final), é somente leitura por padrão e entrega relatório com comando e rc; cada irmã decide uma fase — skill-self-containment (a skill roda sozinha?), skill-claim-check (toda afirmação com sensor, derivação ou data) e skill-refactoring (SKILL.md inchado). Script Python só stdlib, que nunca escreve na skill auditada nem executa código dela; valida a spec agentskills.io (e, com uvx no PATH, baixa e roda o skills-ref oficial fixado; --no-uvx desliga). v0.4.0: entra no marketplace, que passa a ser a fonte oficial; as irmãs trocam o gate do harness de origem pelo script da porta de entrada, e os casos reais passam a usar exemplos generalizados. v0.5.0: campo de topo do Claude Code (argument-hint, model, paths…) em plugin que declara só claude-code vira custo aceito (A4 e G2 INFO), como os do Hermes — movê-lo para metadata apagaria a função. 0.6.0 skill-refactoring com prova antes de remover (scripts/repetidos.py aponta o que o SKILL.md repete das references ou de si mesmo), medida em caracteres e não em bytes, limiares iguais aos do C1, ponteiros consertados depois de mover e a leitura fria (agente sem contexto) depois da auditoria; o molde do Passo 4 vale para skill de operação, não para skill de fluxo. 0.7.0 skill-claim-check ganha sensor para a versão de skill sem CLI (metadata.version contra o CHANGELOG próprio; a do plugin é independente). 0.7.1 skill-claim-check 0.5.1 define precedência: primeiro cabeçalho do CHANGELOG próprio, seção nomeada do plugin como fallback e divergência registrada. 0.8.0 skill-quality-audit 0.6.0: C2 de citação pela raiz da skill ({SKILL_DIR}/references/…) vira INFO, contrato de subagente. |
| pdf-generation | 1.6.4 | Development | PDF generation design toolkit — analyzes reference templates, recommends libraries (pdfmake/pdf-lib/PDFKit/Puppeteer/@react-pdf), designs modular section architecture with conditional columns, auto-generated observations and revision control. v1.2.0 adds three production-proven pdfmake pitfalls: cell padding NOT discounted from widths (last column silently cuts on A4 with 8+ cols, most painful pdfmake gotcha); Roboto bundled fi/fl/ffi ligatures drop the f (fiscal→fscal) — v1.2.1 corrects the cause: pdfkit applies the liga substitution but fails to embed the glyph (bundled font is current, not old; confirm via SFNT parse; @fontsource-variable/* ships only .woff2, unusable by pdfmake); addFonts() silently rejects AFM (errors 500 on getBuffer). Plus Phase 6 Visual Verification — render bugs only surface in the rendered PDF, never in automated tests. v1.3.0 adds three visual-verification lessons: render/inspect EVERY page — header/footer in content[] (vs the header/footer slots) vanish on page 2+ (invisible in 1-page tests); conditional/optional field absence ≠ bug (populate the data to verify); hash-by-input revision cache doesn't regenerate on layout/code change (bust the cache). v1.4.0 adds vector-logo (SVG) handling: pdfmake renders SVG natively via { svg, width } (no svg-to-pdfkit dependency — the "pdfmake can't do SVG" belief is wrong); an SVG whose fills come from a <style>/class block renders with NO color unless each class is inlined to a fill= attribute (silent — only the visual render reveals it); ship a small default vector as a .ts string constant so it survives tsc → dist builds (which don't copy non-.ts files) and gitignored runtime asset dirs (which don't exist on fresh deploy). v1.6.0 adds two table-width patterns and one pitfall: declare the unit (R$/%) once in the column header or a caption, never in every cell (the trade is asymmetric — a header that wraps costs one line per page, a cell that wraps breaks every row); measure glyph widths with fontkit (already transitive via pdfmake → pdfkit) instead of guess-and-re-render; and a "*" column grows past the page when a cell holds an unbreakable token (serial-number list, URL) — same symptom as the padding pitfall but widths are correct, and it fails only on some data rows. The trigger is not description length: 84 chars with spaces render fine, 48 chars without spaces overflow by 110pt, so a "long description" stress case does not reproduce it v1.6.1 prompt audit: the undated npm-downloads row (now off by 1.5–8× and inverting the ranking) leaves the library matrix, the pointer to a non-existent pdf-intelligent-forms skill is gone, and "(NON-NEGOTIABLE)"/"MUST" return to normal register with their reasons intact |
| html-presentation | 1.4.1 | Operations | Polished, self-contained HTML deck (1920×1080) for a timed talk from source material — the project's DESIGN.md at projection scale, per-slide time budget enforced by the build, presenter window with timer, PDF for absentees and a speaker script generated from the notes, plus an independent deck-reviewer agent. Born from a real 15-minute training deck; every gotcha (stage clipped on laptops, faded headless captures, stale screenshots, file:// presenter sync, content lost in adaptation) is a failure that happened. v1.0.1 makes it installable: agents/ is auto-discovered, and declaring "agents": "./agents" in plugin.json fails validation. v1.2.0 shares the timer between the deck and the presenter window, relinks the popup after an F5, warns when a note runs longer than its time, and adds the check-presenter.mjs regression check; v1.2.1 hides the key hint while the presenter window is open; v1.3.0 reveals a slide by clicks (data-steps, synced with the presenter window and checked by check-presenter.mjs) and lets shoot.sh run on WSL without Chrome, pdfinfo or ImageMagick; v1.3.1 fills the screenshots (the headless viewport was 87 px short), turns off transitions under reduced motion and re-measures the footer labels once the fonts load; v1.4.0 adds hover tips (a translation, or a glossary entry kept in one hidden block), gated by the build and checked by check-presenter.mjs, and fixes the reopened-popup race in that check |
| zitadel-idp | 0.20.2 | Development | Zitadel v4.x self-hosted OIDC integration field guide — captures 56 high-friction quirks with proto-aligned examples verified against raw GitHub Zitadel v4.15.0 (FirstInstance env placement, volume perms, v1/v2 API split, tenant→orgId mapping, JWT validation over self-signed HTTPS via NODE_EXTRA_CA_CERTS + JWKS, loginV2 instance flag, silent-renew redirect URI byte-match, idempotent bootstrap No changes 400, TLS-terminating reverse proxy, secure-context PKCE on LAN, boot-time signinSilent recursion, StrictMode closure trap, post_logout_redirect_uri invalid, Login UI v1 branding via privateLabelingSetting / custom_login_text / LANG-lg4DP, F5 with InMemoryWebStorage, 401 storm post --reset-zitadel from tsx watch zombies, multi-app YAML refactor regression vs dynamic env, Zitadel v2.66.x --masterkey flag fix, v0.3.0: Login UI v2 as a separate Next.js container (zitadel-login) with reverse-proxy split, API v2 idempotence via deterministic IDs, contextual orgId moved from header into body, v0.4.0: proto-aligned payloads (CreateApplication discriminator = oidcConfiguration top-level com applicationType / developmentMode internos, NÃO oidc com appType / devMode); per-service ListResponse field names (projects[] / projectRoles[] / applications[] / authorizations[] vs result[]); CreateAuthorization exige organizationId, Update/Delete usam id (não authorizationId); Authorization shape nested (project.id, user.id); AlreadyExisting no matcher; quirk 28 — Login UI v2 auto-provisioning quebrado em v4.15.0 (zitadel/zitadel#8910 + #9293 — LOGINCLIENT_MACHINE_* envs causa unique_constraints_pkey em 03_default_instance migration; sem essas envs zitadel-login fica em loop Awaiting file and reading token eternamente; mitigação Path B loginV2.required: false); v0.5.0 — CD cutover survival kit: quirk 29 OIDC client_id é o numeric clientId do oidcConfiguration (gerado pelo Zitadel) NÃO o applicationId UUID determinístico que você passou em CreateApplicationRequest — frontend VITE_OIDC_CLIENT_ID wired no UUID retorna 400 Errors.App.NotFound em todo /oauth/v2/authorize; quirk 30 ZITADEL_BOOTSTRAP_ENV (ou qualquer env-driven dev/prod ID selector) silently defaultando pra dev em CD cria entidades com IDs do ambiente errado, mismatch silent contra secrets prod, mesmo sintoma Errors.App.NotFound; quirk 31 ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED=false no FirstInstance time quebra a chicken-and-egg dos quirks 25 + 28 — instância nasce com Login UI v1 ativo, operador loga no console post-wipe sem precisar PAT, sem precisar bootstrap rodar primeiro; quirk 32 nginx-proxy ignora silently containers sem VIRTUAL_PATH quando sibling tem VIRTUAL_PATH=/<algo> (todas as rotas fora do prefix retornam 404, sintoma é trailing "-" upstream nos logs nginx) — fix é declarar VIRTUAL_PATH=/ + VIRTUAL_DEST=/ no container "default"; ListUsers per-item field é userId não id (proto-confirmed v4.15.0 — code que lê result[0].id returns undefined e fallback bogus → CreateAuthorization 404 User could not be found); eventstore SQL pra diagnose password.check.failed (SELECT created_at, event_type FROM eventstore.events2 WHERE aggregate_type='user' AND aggregate_id=... mostra timeline completa de attempts + change events); idp-bootstrap Dockerfile pitfalls (precisa COPY src/ pra tsx imports + audit do path do YAML em cada release)); v0.6.0 — Console UI human-user creation pitfalls (manual operator flow only, NOT triggered by API/bootstrap): quirk 33 Console v4 "Add Human User" form auto-truncates Username to email's local-part on auto-fill — combined with userLoginMustBeDomain=false default, loginName drops the @domain and end users get "O usuário não pôde ser encontrado" / "User could not be found" when typing their full email; quirk 34 userLoginMustBeDomain=true (Settings → Domain settings → "Add Organization Domain as suffix to loginnames") stamps loginNames irreversibly on existing users, disabling + Reset to Instance default does NOT undo, doubly hostile in self-hosted because org primaryDomain auto-generates as <orgSlug>.<externalDomain> (not the company email domain) so toggling without a custom domain produces nonsensical or double-suffixed loginNames; quirk 35 Console "Add Human User" leaves "E-mail Verificado" / "Email verified" unchecked by default, first login then stalls on SMTP code prompt that never arrives in self-hosted setups where SMTP is deferred); v0.7.0 — Production-cutover quirks (validade_bateria_estoque PR #9): quirk 36 backend container that validates JWT needs extra_hosts: idp.<domain>:host-gateway when IdP is co-located on a VPS with unreliable hairpin NAT — jose.createRemoteJWKSet reload after the 600s cacheMaxAge TTL silently fails the network fetch, causing 401-storm starting at ~10min uptime with JWT iss/aud/exp/kid all verifiable by hand (third documented cause of "401-storm with apparently-valid JWT" alongside quirks 12 and 13); fix is extra_hosts mapping to docker bridge (same path external traffic takes), apply to ANY co-located container (bootstrap, observability, runners); also covers logging tip — use pino.warn not console.error for JOSEError because the same path fires for malformed tokens from clients (log-spam vector at error level); quirk 37 frontend defense-in-depth against 401-storm-revokes-session requires THREE coordinated layers, not just dedupe: L1 dedupe lives in ApiClient with pendingRenew instance field cleared in .finally() + public refreshToken() method shared between 401-retry path AND addAccessTokenExpiring handler (provider-level useRef dedupe alone leaves the expiring path leaking — same RT used by both sides → Zitadel detects reuse → revokes session); L2 TanStack Query retry predicate filters ApiError 401 because 401 is not transient (retrying amplifies the storm); L3 listener for apiclient:unauthorized CustomEvent in <AuthProvider> with isAuthRoute() early-return guard + state: { returnTo: location.pathname+search+hash } on signinRedirect (without guard a 401 from /auth/callback triggers another redirect → loop; without state.returnTo user lands on / after re-auth instead of where they were); each layer addresses a different race and skipping any one leaves a known leak path. v0.8.0 — smoke-e2e CI quirks: quirk 38 ZITADEL_FIRSTINSTANCE_PATPATH bind mount EACCES cascading into misleading unique_constraints_pkey; quirk 39 default password policy 4-class trap (openssl rand -hex is lowercase-only, dies with COMMA-VoaRj); quirk 40 zitadel-login healthcheck slow on small CI runners. v0.9.0 — real-browser smoke from sales_quote T150: quirk 41 idempotent bootstrap creates initial user grants but does NOT reconcile existing ones when YAML evolves — adding a new app + role leaves pre-existing seed user grants stuck at day-0 roleKeys, JWT ships missing the new role, symptom collides with quirks 11/12/13/36/28 family but a brand-new user via the same bootstrap works fine (that asymmetry is the diagnostic); cure is search-then-PUT via Quirk 8 pattern. Quirk 42 browser SPA → backend Express needs CORS or every preflight OPTIONS hits authJwt and 401s, mimicking the 401-storm family; key diagnostic asymmetry is curl -H "Authorization: Bearer <JWT>" returns 200 (no Origin → no preflight) while the browser fails 100%; MSW/supertest integration tests miss this entirely; cure is minimal CORS middleware as FIRST app-level middleware, short-circuiting OPTIONS with 204 + headers. Plus a new spa-recipes.md recipe — 'E2E browser tests (Playwright) against self-signed Zitadel' — covering ignoreHTTPSErrors: true (browser-side counterpart of Quirk 12's NODE_EXTRA_CA_CERTS), conditional username fill for login_hint-prefilled flows in Login UI v1, and the storageState+InMemoryWebStorage reuse caveat. v0.10.0 — admin-console mixed-content (quirk 43): Zitadel's own Console shows [unknown] Failed to fetch when the generated environment.json renders api: http:// while issuer: https:// — mixed content on the HTTPS page; root cause is --tlsMode disabled (the binary doesn't trust the proxy's X-Forwarded-Proto), compounded by docker start reviving a stale container's create-time args; cure is the full Quirk 15 triad + up -d --force-recreate (never docker start). References: migration-v2-to-v4.md (full upgrade runbook — pre-flight, schema migration, validation matrix, rollback) and api-v1-to-v2-mapping.md (Connect protocol mapping). Bundles working docker-compose.zitadel.yml, idempotent bootstrap-zitadel.ts (annotated with // v2 equivalent comments) and reset-zitadel.sh. (NEW v0.11.0) quirks 44–47, de um cutover de produção real: 44 provar client_id + redirect_uri sem credencial nenhuma — montar a URL do authorization_endpoint com PKCE S256 (vetor de teste da RFC 7636; o fluxo nunca é completado) e conferir 302 → /ui/login/login?authRequestID=…, porque toda verificação de client que a skill tinha exige PAT, o que as torna inúteis no pré-cutover de um ambiente novo; 45 grepar a config OIDC no bundle servido (não o de dentro do container — o servido também pega container stale no upstream pool), já que "o secret está setado" e "o bundle contém o valor" são afirmações diferentes e o sintoma da divergência é só "o login não completa"; 46 ZITADEL_SEED_USER_ROLE como lista quando duas apps dividem o Zitadel — o CreateAuthorization grava a lista literal e o UpdateAuthorization faz união, então o defeito fica dormente até alguém recriar o IdP do zero; 47 + reference nova multi-instance-and-user-migration.md — o que precisa divergir entre duas instâncias (token cruzado dá JWSSignatureVerificationFailed, que se lê como rotação de chave) e a assimetria da migração de usuários: importar hash é suportado (AddHumanUser), extrair da origem não é (vive no eventstore). Junto: contraparte positiva do quirk 36 em token-validation.md (o 401-storm é tardio por construção — TTL de ~600s —, então smoke verde em T+30s não diz nada, e um /health/ready que devolve jwks: ok de cache que nunca revalida mente durante o storm inteiro). v0.12.0 prompt audit: installation-specific data (an operator e-mail, LAN IP, idp.jrcbrasil.com) replaced by placeholders, "47 documented quirks" becomes a catalogue that does not age in the trigger text, quirks 38–42/44/45 shrink back to trigger paragraphs with their recipes living in the references (44 and 45 gain sections there), and "Source of truth" points at the skill's own assets instead of another project's files. (NEW v0.13.0) quirk 48 — a chave de um project role é imutável (UpdateProjectRole só muda displayName/group), então renomear é uma migração de quatro passos cujos dois primeiros passos adicionam e os dois últimos destroem; o bootstrap declarativo é aditivo e recria o papel velho em toda instância nova, e a ordem vira dependência entre repositórios quando o IdP mora fora do repo da app — o que a remove é um alias na borda do claim (aceitar as duas chaves, normalizar para a nova, com data de remoção e um caso negativo ao lado), receita em api-cheatsheet.md §"Renaming a project role". (NEW v0.13.1) correção do próprio 48: o alias liberta a ordem de conceder, nunca a de retirar — ele mora no build novo, então tirar a chave velha antes de o deploy chegar àquele ambiente devolve o mesmo 401 role_nao_reconhecida, agora mirado em quem o operador acabou de tocar; e como roleKeys substitui, a API convida a colapsar os passos 2 e 3 num PUT só, que é exatamente a interrupção (NEW v0.14.0) quirks 49 e 50 + reference nova role-migration.md, que separa as CHAMADAS do rename (no api-cheatsheet.md) da OPERAÇÃO dele entre ambientes: 49 ListProjectRoles não tem equivalente em Connect/v2 (404 code:5; a leitura segue REST v1 com a org no header) — e o que faz isso doer não é o 404, é que uma guarda construída sobre essa leitura passa a recusar tudo, pela causa errada, imprimindo a mesma mensagem de quando funciona; 50 campo de config que o schema aceita e o bootstrap nunca lê é pior que campo ausente — campo ausente é uma pergunta, campo que parseia limpo é uma resposta, e ela está errada: o seedUser.roles valia enquanto a fonte real era uma env var que um dos três composes não definia, e staging nasceu sem o papel do segundo produto, sem erro nenhum. Fix é precedência env > YAML > default (env definida-mas-VAZIA não é escolha) com poka-yoke pareado no schema. O reference traz ainda o passo 2 como ferramenta (união idempotente, dry-run por default, depois ⊇ antes conferido antes de cada PUT) e a tabela de estado por ambiente v0.15.0 adds Quirk 51 — an idempotent bootstrap cannot tell you it succeeded, because reuse/ALREADY_EXISTS is printed both when the declaration was satisfied and when the script is reading a stale one (Quirk 30's family, one layer down: 30 warns the output file only refreshes when the bootstrap runs; this is the input going stale the same way, via a COPYed YAML in an image that was never rebuilt). The tell is a negative — no created lines — so prove it against the instance by the path that needs no credential: projections.project_roles<N> in Postgres, where the creation_date is what separates "applied an old list" from "failed", and the numeric suffix must be discovered from information_schema rather than hardcoded. Measured: four green CD steps, zero roles created, image from 13 June. v0.16.0 names the symptom that every role quirk shares and that names neither roles nor permissions — the login page accepts the credentials and the browser bounces straight back to the IdP, because the API answers 401 for an unrecognised role and the SPA reacts to 401 by re-authenticating. Triage starts with a free fact (another account with a different role logs in fine, which clears the instance, JWKS, audience and redirect URIs in one stroke) and ends with the step the other quirks assume: prove the process serving the port runs the code you are reading. Measured — a dev backend whose watcher had silently stopped served a build from before the role existed, and reasoning from timestamps actively misled, because the running child was younger than the commit and still lacked it. Corollary: an unrecognised role is authenticated but not permitted, so 403 is the honest status; 401 is what manufactures the loop.. v0.16.1 corrige o snippet de CORS do quirk 42, que omitia PUT e era copiado ao pé da letra — com a nota de que a lista de métodos é duplicata da tabela de rotas e pertence ao router, não à mão (skill cors, casos-limite.md §1a). v0.17.0 corrige o quirk 5 (o payload de usuário humano difere entre v1 e v2, medido no v4.15.0), acrescenta a prova de senha sem navegador pela Session API v2 e o quirk 53: o idioma do usuário chega ao app como o claim locale, no id_token só com idTokenUserinfoAssertion, com a receita de SPA medida por e2e. v0.18.1 ensina a ler quem tem cada papel sem PAT, pelas projeções user_grants/users no Postgres, e a comparar com elas, não com um relatório gerado do YAML. v0.19.0 adds Quirk 54: an email address is an attribute, not an identity — two accounts may share one in the same organization, verified or not (read at the v4.15.0 tag), so authorization keys on sub or requires email_verified. v0.20.0 adds Quirk 55 (the v1 grants search answers for the org in the header: use the org that owns the project), Quirk 56 (a v2 user search can lag a write) and the recipe to change an existing user's language. v0.20.2 makes the Quirk 24 reads print counts and lengths instead of the masterkey, and adds each account's e-mail, verification and state to the who-holds-which-role query, filtered by role prefix. |
| ticket | 1.14.0 | Development | Jira ticket lifecycle for JRC Brasil projects integrated with Git — /ticket start | split | close | status. Per-repo project detection via .jira-project (PROJECT/BOARD/BRANCH_PREFIX, optional BASE_BRANCH) — no hardcoded project. Prefers acli + atlassian MCP. v1.0.0 initial packaging, capturing two production-proven lessons: (1) transitions are PROJECT-SPECIFIC — discover via getTransitionsForJiraIssue and transition by id (RS: Em andamento→Aprovação→Finished; SQ: Em andamento→Concluído via id 31, no Aprovação), and acli --status matches the DESTINATION STATUS name so --status "Concluído" works (the transition name "Itens concluídos" fails) → MCP transition-by-id stays a robust alternative; (2) base branch is project-specific (optional BASE_BRANCH, default = repo's detected default branch) — don't assume either main or develop — detect it (v1.1.1 corrected a stale claim here: SQ/sales_quote uses develop). v1.0.1 corrects the acli transition guidance (the v1.0.0 corollary was inverted). v1.1.0 fixes cards landing in the backlog without points: new issues are now born inside the active sprint via acli workitem create --from-json with additionalAttributes (custom fields on create need no MCP — validated on SQ), because the old create-then-edit path silently failed whenever the MCP wasn't authenticated. Adds a mandatory read-back after writing sprint/score (plus sprint list-workitems as independent proof), field-ID discovery via --fields "*all" (a plain --json returns 5 fields and no custom ones), fallbacks for "no active sprint" (wrong $BOARD, JQL sprint in openSprints(), kanban boards), and the measured acli asymmetry — create --from-json accepts additionalAttributes, edit --from-json rejects it, so an existing issue has no non-MCP path. Also documents two traps: sprint id is a plain number (405, not {"id": 405}), and the active sprint is the one with state: active regardless of a past endDate. MCP endpoint migrated from the retired HTTP+SSE (/v1/sse, EOL 30-Jun-2026) to Streamable HTTP (/v1/mcp), with /v1/mcp/authv2 noted as the variant that answers with OAuth resource_metadata discovery. v1.2.0 attacks one failure class — the skill's own verification steps were the thing failing, always toward the side that looks safe: acli prints ✗ Failure yet exits 0; --assignee with an e-mail is refused because the session's userEmail isn't the Jira account (use @me, or accountId via REST); sprint list-workitems paginates (~30) so a fresh card falls off page 1 and reads as "not in the sprint" (replaced by JQL); and `git pull … |
| todo-to-github-issues | 2.8.3 | Development | Espelha o TODO.md no esqueleto do kit sdd (<!-- sdd:open --> / <!-- sdd:decided -->) como issues do GitHub, de forma idempotente (plan → canário --apply --limit 1 → --apply, órfãs só com --close-orphans); --audit/--fix medem contra o sensor do kit, e ACHADOS-*.md vai ao tracker. v2.0.1: entra no marketplace, e a cópia que o sensor mede passa a ser gravada ao lado do arquivo — desde o ADR 0011 do kit a âncora é resolvida contra o repo do arquivo checado, e a cópia em /tmp fazia toda âncora falhar (188 violações onde o kit vê 97). v2.0.2: o --audit quebra linha na largura do sensor do kit (WIDTH_CAP, 120), lida a cada execução — um WRAP = 100 próprio fazia a skill acusar 6 itens acima do teto num TODO.md que o kit chamava de limpo. v2.2.0: o plano marca cada UPDATE como (anchor) (só número de linha) ou (text), e o ORPHAN manda fechar à mão, como not planned, o item que saiu por decisão. (v2.3.0) ORPHAN diz em que commit o item saiu e quem o consertou (fixed by <hash>, lido no commit da remoção), e o --close-orphans fecha só a órfã consertada, citando o conserto; a que saiu por decisão fica para fechar à mão como not planned. (v2.3.1) a remoção da órfã é achada pela chave quando o git log -S do título não a vê (espaços normalizados, item movido para a seção decidida), e a órfã sem remoção achada sai como last text unknown, não mais empurrada para not planned. (v2.4.0) --allow-empty plans a backlog emptied on purpose, so --close-orphans reaches the last mirrored issues; without it the empty file is still refused. (v2.4.1) a mirror blocked by an out-of-shape TODO.md (rc 4) no longer leaves its orphans open: find the removal commit by git log -S and close by hand. (v2.5.0) an orphan whose item still lives in an open PR (issue created from the PR branch) reads PENDING, not ORPHAN, and --close-orphans never closes it. (v2.5.1) the symbol an anchor designates (`path:N` (`symbol`)) stays on the issue's Âncora: line instead of opening the next paragraph, and an issue rendered the old way still reads UPDATE (anchor) on a line shift. (v2.5.2) before re-anchoring a broken anchor, check the finding still holds: an anchor that lost its target can be an already-fixed finding, which leaves the file citing the commit instead of becoming an issue on --apply. (v2.6.0) --fix also deletes an open item whose RESOLVED by commits all reached the default branch (the sensor accepted it and the plan read SKIP forever), and references/conferir-o-fix.md lists what to check before committing a format migration. (v2.6.1) the docs say what the canary limits: --limit caps creations only, and every UPDATE of the plan already goes out on --apply --limit 1. (v2.6.2) a trigger eval set (assets/trigger-evals.json), and each factual claim the audit flagged now names its sensor, its derivation or its date. (v2.8.2) an orphan without RESOLVED by that was fixed (an sdd mission deletes the item that way) closes by hand as completed, not not planned, and the skip hint says both cases. (v2.8.3) run the plan (no --apply) on the PR branch before the merge: a REF? there is fixed in the same PR, not in a follow-up one. |
| unlovable | 1.1.1 | Development | Remove todos os traços do Lovable de um projeto gerado no lovable.dev. Separa o cosmético (strings de marca, README, metadados og/twitter que fazem o preview do WhatsApp "remeter ao Lovable", favicon) do estrutural — os dois pontos que quebram o build se removidos sem substituto: a feature de email (api.lovable.dev/v1/email/send + LOVABLE_API_KEY, migrada para SMTP via Nodemailer com credencial em env var) e o wrapper de config do Vite. O wrapper tem duas formas com custo de ordem de grandeza diferente, e a skill bifurca por elas: lovable-tagger é um plugin dev-only listado no próprio vite.config.ts (remoção local, o build não muda de forma), enquanto @lovable.dev/vite-tanstack-config é a config — removê-lo esvazia o build e exige recriar vite.config.ts à mão, com server.entry dentro de tanstackStart({}), onde fora dali o Vite ignora em silêncio. Inventário read-only antes de qualquer edição, e estrutural antes de cosmético (falha de build depois de dez edições de string não diz qual delas a causou). Cobre ainda o .env tracked sem .gitignore (git rm --cached, com a ressalva de que o segredo permanece no histórico e precisa ser rotacionado, não só apagado) e dois falsos positivos que custam tempo: .tanstack/ é do TanStack e não do Lovable, e a string "lovable" no lockfile costuma ser só mirror de registry (sandbox-npm-cache.lovable.dev), não código. (NEW v1.1.0), do primeiro uso real: a recomendação sobre og:image estava invertida — "apontar para asset próprio" soa como uma linha e não é (a tag quer URL absoluta, que difere entre staging e produção, e o logo do repo costuma ser faixa de cabeçalho, não o 1200x630 do card), então a saída é remover og:image/twitter:image com twitter:card: summary e registrar a arte como pendência; a verificação do §6 passa a ler o artefato (grep -c lovable dist/index.html), porque o crawler lê o build servido e não a fonte; e o falso positivo do lockfile ganha o gêmeo que não é falso — em monorepo, npm install da raiz não toca lockfiles órfãos de workspace, que seguem declarando o pacote como dependência real e fazem o grep acusar depois de o trabalho estar certo. |
| whisper-preprocess | 1.1.1 | Development | Audio→text pipeline (ffmpeg + OpenAI Whisper), 100% offline — extract, silence-removal, voice enhancement, segmentation, transcription (optional 2-language pass + auto-merge). v1.0.0 initial packaging of the local skill, capturing the anti-"picotamento" (choppy/pumping voice) lessons proven against a real 65-min recording with a low-volume, impaired (dysarthric) speaker: (1) the listenable *_enhanced.opus is now decoupled from the transcription chain — it used to inherit silenceremove + a fast-release acompressor + single-pass dynamic loudnorm AGC (three stacked gain-modulation/chopping sources); build_listenable() builds the listening copy from the original file at 48 kHz with no silence removal (continuous audio) and stable gain only (slow-release compressor + makeup + true-peak alimiter), no dynamic AGC; (2) a 2-pass loudnorm linear=true is not reliable — on a clipping source it silently reverts to Normalization Type: Dynamic (verified via print_format=summary), reintroducing the pump; (3) Opus adds inter-sample overshoot above the limiter ceiling (a -1.5 dBFS sample limit measured +1.3 dBTP after Opus) so the limiter needs headroom (--listen-limit 0.6) to keep the decoded true-peak below 0 dBFS — the old recipe clipped at +0.7 dBFS; (4) gentler silenceremove (detection=rms, window=0.025, stop_silence=0.5, stop_duration=2.0) helps Whisper on slow/quiet speakers while the -30dB threshold lesson is kept; afftdn stays opt-in/off (musical-noise risk, arnndn preferred). Listening copy now encoded -application audio 48k/64k (was narrowband voip) v1.1.0 prompt audit: the instructions now say to copy both scripts (the bilingual merge imports merge_passes and silently produced no merged transcript with only one file), lesson #9 is rewritten in the present tense instead of as a session changelog, "NEVER use afftdn" is scoped to the transcription path (the script has --denoise), and the troubleshooting table drops its "old/fixed" archaeology |
| ansible-docker-backup-restore | 1.3.4 | Development | Backup and restore of a Linux server's Docker services with Ansible. Restore half: the silent compose-project-name trap (wrong prefix ⇒ brand-new empty volume, containers up, no error), an 8-step anti-overwrite guard that never deletes before the replacement is on disk and verified, SQL-dump guards that count rows instead of trusting schema presence, and a reverse-proxy/TLS gate — a config directory that is a volume survives a disk swap while a sibling that is not one dies, leaving an orphan directive that takes down every HTTPS vhost on the host the moment a container claims the domain. Backup half: the four ways a nightly backup dies without a sound — ignore_errors + no_log on the same task, the same root cause on a task without ignore_errors (aborts the play, looks like slowness), set -euo pipefail meeting tar rc=1 on a live database datadir (alphabetical volume order makes it look intermittent), and a fixed path that stopped existing after a restore. Ships a read-only freshness check (gaps in the date sequence, one dump per database, undersized dumps, volume coverage, retention arithmetic vs real free space). v1.1.0 adds the edges found bringing a sibling server that never had a backup online, with three stacked blockers: the SSH push path is a per-host prerequisite that can silently not exist (verify from each client, don't generalize) and must be granted least-privilege (a dedicated rrsync -wo key proven to open no shell, so the backup host can't become a lateral-movement pivot); a preflight that checks docker ps vs the inventory both ways (running-but-undeclared DB is dumped by no one and errors nowhere); bind mounts escape docker volume ls (DB dumps present gives false coverage while a bind-mounted datadir is missed); delegate_to on a shared authorized_keys from parallel hosts races (throttle: 1); and history rewrites can't scrub a weak password equal to a public identifier — only rotation can. v1.2.0 adds the lessons from a service everyone believed restored for four days that was in fact broken in two places, both of which passed a green playbook: a restored MySQL datadir carries each user's authentication plugin, not just the password, so caching_sha2_password refuses old clients (DBD::mysql, older mysqli, old JDBC) with the entirely correct password — and the compose flag --default-authentication-plugin does not fix it, since it only governs users created after it; the failure shows in one client and not another (the PHP UI stayed up while the Perl agent endpoint was down for a week), so verify every entry plane, because the one still standing masks the one that fell; proof-of-content is promoted from advice to role contract (verify_body_contains, empty by default) after the very domain cited in the reference spent four more days serving the web server's default page; a log error pointing at teardown code (rollback, finally, a destructor) is usually the error handler failing on top of the real fault, which is typically suppressed by default — raise verbosity before theorizing, and revert it in the same script; and lineinfile whose regexp matches nothing silently appends the line at end of file, landing outside every config block, inert, and reports changed. (NEW v1.3.0) o achado veio de fora, num deploy de produção de outro produto no mesmo host: o container de backup do ERP e do IdP estava unhealthy desde 06/05/2026 e nunca havia gerado um único dump — três meses. §1.1 tamanho é proxy fraco: a skill parava na heurística -size -1k ("um dump que é só a mensagem de erro tem poucos bytes"), que pega o caso grosseiro e deixa passar o inverso — um dump só com o schema é grande, bem formado e inútil para restaurar; três perguntas em ordem de custo (gzip -t, contar blocos COPY, e um registro conhecido, a única que distingue "dump válido" de "dump DESTE banco"). §1.2 o healthcheck de container de backup mede a coisa errada: essas imagens observam a porta HTTP de status que elas próprias expõem, não o artefato, então o container fica genuinamente healthy enquanto o pg_dump falha todas as noites (no caso real, lista CSV em POSTGRES_HOST/POSTGRES_USER, onde o valor é literal → pg_dump autenticando com o usuário erp,zitadel; a imagem só faz fan-out de lista em POSTGRES_DB). provas-que-nao-mentem.md §4b — a ausência de sinal também não prova nada: o arquivo cobria só o gêmeo oposto (§1 "um 301 não prova nada", §4 "um 200 também pode mentir"), e vazio é produzido por dois mundos indistinguíveis — nada aconteceu, ou o instrumento nunca esteve vivo; cura é provocar um positivo que você mesmo causou. check-backup-freshness.sh ganha gzip -t e detecção de dump schema-only; Gate 2 ganha um passo. v1.3.2 prompt audit: an installation's user names (erp,zitadel) become placeholders in the silent-failure example (the probe showed the model repeating them on other hosts), and the "how this section aged" paragraph turns into the lesson itself; scripts and assets untouched |
| kaizen-software | 1.4.10 | Development | Kaizen (continuous improvement) methodology for planning, implementing and maintaining software — and for teaching Kaizen to the team. Drives the three phases through PDCA (plan sliced into small verifiable increments, jidoka "stop the line" during implementation, 5 whys + 5S during maintenance) and keeps a KAIZEN_LOG.md as the team's institutional memory. v1.0.0 initial packaging of the local skill: the description was rewritten to fit the /skills budget (the original ~1000-char one, opening with "use SEMPRE", risked being dropped silently — which disables the trigger it was trying to strengthen), and the Kaizen Log template gained the two subsections that real use proved most consulted — "Desperdícios evitados (cortes conscientes)" (a deliberate cut reads as an oversight six months later, and someone reopens a scope that was rejected for good reason) and "O que aprendemos" (the technical gotcha the next person would otherwise rediscover). Defers to repo conventions: where refactoring without an explicit request is forbidden, the boy-scout rule becomes a logged opportunity, not an edit v1.1.0 names the idea that three separate findings in one real session turned out to share: Rótulo ≠ artefato — a tool's label describes the process, and the process can be fine while the thing that should exist does not (a backup container reporting healthy before it ever produced a dump; PR MERGED describing what the PR consumed, not what the branch holds now). The same defect showed up inside the log itself, so the Padronizado em field now has to be verified against the file it names — it is the one line that asserts something about the world outside the log. Poka-yoke gains its most common failure mode (a home-made probe that measures a proxy alarms falsely and teaches the operator to ignore it, so sabotage it on purpose and check both states), and phase 3 gains Ações irreversíveis: when an increment cannot be reverted, ordering does the work reversibility used to — slice so the reversible step runs first and surprises surface while they still cost a check v1.2.0 poka-yoke enters the operational flow, not just the teaching glossary: a standardization ladder (error-proofing > template/script > written rule) in principle 6, the "which poka-yoke makes this error impossible?" question in phases 1–3 and in the 5-whys countermeasure field; plus a prompt audit against current models (description consolidated to 8 triggers, a caps word and a domain leak removed) v1.3.0 seven more Kaizen concepts become operational steps instead of glossary entries: yokoten (spread the root cause fix to every neighbour), andon (stop visibly, never fix in silence), Ishikawa when the 5 whys branch, mura/muri in the waste hunt, a decision rule for kaikaku, the 8th waste (unused talent/knowledge) and gemba without a ticket v1.3.2 the Check now covers derived prose (a number copied into a note or e-mail comes from a command, not mental math), and gemba includes what was already answered before asking anyone v1.3.3 the artifact is what reaches its destination (the commit, not the local copy: ls -l showed rwx while git ls-tree held 100644), and a probe's good and sabotaged cases are built from scratch, since a fixture left by an earlier run passes without testing anything v1.3.4 a probe that normalizes by its own sample (median, z-score, moving baseline) is sabotaged with the whole sample defective, since a defect that fills the population also fills the reference and the relative measure goes neutral v1.3.5 when something changes before its time, the first explanation to try is a question to whoever has access to the artifact; self-run forensics (logs, history, recycle bin) is for when they cannot answer v1.3.6 a gotchas section: a conversion's Check counts units at both ends, a green probe is checked for scope (did it read the new artifact?), and a rule found only in an agent-written handoff is traced to the user's request before it is obeyed v1.4.0 a template to validate a plan that arrives already decided (wastes against the plan, adjustments that go back into it, a checklist), and a gotcha: a sabotaged case only counts if the sabotage reached the tool, since a global cache (~/.npm, pip, Docker layers) serves the old artifact v1.4.6 a poka-yoke counts only on the path that always runs (a check that lives in an optional preflight protects nothing), and a Check made on a copy carries over to the delivered artifact only with the same content hash v1.4.9 an empty search result is a label too (a tool can stop mid-file without an error, so before using an absence as evidence check that the first and last units it read are the artifact's), and the state and sources a handoff describes are re-read at the destination before they enter the plan v1.4.10 corrects the 1.4.9 case: re-reading a source means opening it, not a note's description of it |
| ts-library | 0.3.1 | Development | Build and ship a TypeScript/Node library the 2026 way: ESM-only package (exports with types first, files allowlist, private + UNLICENSED, isolatedDeclarations, src shipped for source maps), sensors on the packed tarball (install into an empty consumer on each supported Node, publint, attw, an API report as the semver poka-yoke), a release script proven by rebuilding the tag, and vendored-tarball distribution (vendor/*.tgz + file:) when there is no registry or CI. Every claim is tagged measured, sourced (dated) or design (not yet run end to end). v0.1.0 born from planning a real library extraction; ships the measured npm 12 traps (publish --dry-run ignores private, the global cache hides a swapped tarball, prepublishOnly never runs on npm pack) v0.2.0 starts from the requester's constraints instead of the measured case's, attributes every measured fact to the skill and its date, checks the vendored tarball in the commit (a *.tgz in .gitignore drops it from git add -A with rc=0) and turns the frozen copy at the origin into a sensor (git log <extraction-sha>.. -- <dir> must be empty) v0.3.0 from the real extraction: the message rewrite catches PR #N outside parentheses too, and five checks run before the first push (commit count, loose references, identical tree hash, a credential scan over every commit, the lib installed and tested on its own) |
| windows-disk-cleanup | 0.2.2 | Development | Frees Windows disk space without losing data: inventories drives, proves duplicates by hash (hardlinks discounted), deletes only in user-authorized rounds — manifest and reversible step first, re-measure after. Knows dev caches, Drive cache, old profiles, WSL/Docker disks. Triggers — disk full, free up space, C: full, clean disk, what can I delete. v0.1.1 from evals: a broad "clean whatever is safe" is no longer taken as authorization for a list the user has not seen; drivefs-status.py names dirty items, lets a stale Office lock file (~$name) pass and exits 1 when not safe (two new selftest checks, 12 in all) v0.1.2 steam-games.ps1 measures the game folder instead of trusting the manifest's SizeOnDisk, which lags behind patched games (MTG Arena: 11.51 GB in the manifest, 12.24 on disk), and a manifest without installdir no longer counts the whole library (two new selftest checks, 14 in all) v0.1.3 what an uninstaller leaves behind is what the program created and can be personal data (85 MTG Arena replays in a Steam leftover), so it is shown and copied before deletion; and an unexplained drop on C: now includes a launcher staging an update on another drive (a 25 GB Steam update for a game on J: filled C:) v0.2.0 steam-games.ps1 also lists the folders in steamapps\common that no manifest claims, so an uninstall's leftover shows up without measuring by hand (two new selftest checks, 16 in all) v0.2.1 a deletion the user reports as done is checked like any round: a 79 GB one left the folder in place with a game save inside |
| windows-games-linux | 1.1.0 | Development | Diagnose and fix Windows games on Linux run through Lutris, umu, Proton or Wine: find the layer where the game dies, A/B-launch it outside Lutris, read Unity/Proton logs, fix the game config. Catches Lutris injecting its own VKD3D/NVAPI into Proton prefixes. |
| wsl-windows-onboarding | 0.4.4 | Development | End-to-end onboarding of a Windows machine to WSL2 — diagnose/enable WSL, install rtk (rtk-ai/rtk), and safely migrate dev projects from C:\…\repos into the Linux filesystem. Built from a real migration and encodes the non-obvious gotchas: Docker users already have WSL2 and the docker-desktop distro is NOT your workspace; rtk is a zero-dependency Rust binary whose installer drops it in ~/.local/bin but does not add it to PATH (the #1 "rtk not found" cause), and one global install serves every project; git clone drops gitignored .env so migration uses rsync (keep .git and .env, exclude only rebuildable dirs); /mnt/c is slow and du over it hangs (use df, run rsync in background); validate by diffing file PATHS not counts (a .env inside node_modules/psl is a harmless false positive); copy → validate → delete, with the irreversible delete last via PowerShell Remove-Item; and after migrating a repo git status may show the whole tree modified with zero untracked files — a CRLF/LF + filemode artifact (autocrlf, 0777 from /mnt/c), diagnosed with git diff --ignore-cr-at-eol --stat + core.fileMode=false and fixed by renormalization, not panic. Bundles wsl-diagnose.sh (read-only) and migrate-repos.sh (rsync + validation, never deletes). v0.2.0 adds an optional Phase 4 shell setup (references/shell-setup.md, deep-research-validated): zsh + oh-my-zsh, default shell via chsh (wsl.conf can't set it), the ~/.bashrc config doesn't carry to ~/.zshrc trap (rtk PATH/aliases must be re-added; Ubuntu's empty /etc/zsh/zprofile makes the explicit export required), the Docker _docker completion warning fix, and JetBrains Mono Nerd Font + ligatures on Windows Terminal (font.features { liga: 1 }) v0.4.2 prompt audit: source-path discovery no longer assumes the author's source\repos layout, the "on current WSL" claim becomes "use the name exactly as wsl --list --online prints it", "150 files" becomes whole-tree, and a CRITICAL heading returns to normal register |
| criar-prd | 0.1.1 | Development | Cria PRDs enxutos a partir de uma descrição de funcionalidade, com até 5 perguntas de clarificação, template de PRD empacotado no plugin e pesquisa web só quando houver dependência externa ou informação atual. |
| criar-techspec | 0.1.1 | Architecture | Cria Tech Specs objetivas a partir de um PRD local, lendo o template (do projeto ou o empacotado), as convenções do projeto e apenas os arquivos necessários para definir uma solução implementável. |
| criar-task | 0.1.1 | Development | Transforma PRD e Tech Spec em tarefas incrementais, funcionais e testáveis, com aprovação high-level antes de escrever tasks.md e os arquivos individuais. |
| executar-task | 0.1.1 | Development | Executa a próxima task planejada com leitura mínima, TDD quando viável, testes obrigatórios e marcação de conclusão somente depois da validação. |