@andespindola/crow-skills 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +6 -5
  2. package/crow_skills/__init__.py +1 -1
  3. package/crow_skills/autoupdate.py +398 -0
  4. package/crow_skills/cli.py +99 -3
  5. package/crow_skills/events.py +133 -0
  6. package/crow_skills/guide.py +7 -1
  7. package/crow_skills/hook.py +616 -0
  8. package/crow_skills/integrations.py +460 -63
  9. package/crow_skills/progress.py +157 -15
  10. package/crow_skills/resources.py +713 -0
  11. package/crow_skills/source.py +40 -0
  12. package/crow_skills/storage.py +5 -4
  13. package/docs/cli.md +144 -17
  14. package/package.json +1 -1
  15. package/release.json +56 -31
  16. package/skills/crow-accessibility/SKILL.md +2 -0
  17. package/skills/crow-api-test/SKILL.md +2 -0
  18. package/skills/crow-backend/SKILL.md +2 -0
  19. package/skills/crow-behaviour/SKILL.md +4 -3
  20. package/skills/crow-behaviour/references/orchestration.md +4 -0
  21. package/skills/crow-behaviour/references/progress-ledger.md +20 -3
  22. package/skills/crow-behaviour/references/resources.md +44 -0
  23. package/skills/crow-behaviour/scripts/crow_ledger.py +120 -4
  24. package/skills/crow-browser/SKILL.md +2 -0
  25. package/skills/crow-debug/SKILL.md +2 -0
  26. package/skills/crow-frontend/SKILL.md +2 -0
  27. package/skills/crow-infra/SKILL.md +2 -0
  28. package/skills/crow-interface/SKILL.md +2 -0
  29. package/skills/crow-media/SKILL.md +2 -0
  30. package/skills/crow-native-mobile/SKILL.md +2 -0
  31. package/skills/crow-performance/SKILL.md +2 -0
  32. package/skills/crow-qa/SKILL.md +2 -0
  33. package/skills/crow-release/SKILL.md +2 -0
  34. package/skills/crow-reverse/SKILL.md +2 -0
  35. package/skills/crow-security-scan/SKILL.md +2 -0
@@ -8,6 +8,11 @@ import stat
8
8
  import subprocess
9
9
 
10
10
  NAME = re.compile(r"crow-[a-z0-9]+(?:-[a-z0-9]+)*\Z")
11
+ PACKAGE = "@andespindola/crow-skills"
12
+ # Where a packaged release (npm tarball, also used by the Homebrew formula) lives. The
13
+ # version is part of the Homebrew path and npx caches, so it changes on every upgrade.
14
+ PACKAGED = (re.compile(r"/Cellar/crow-skills/[^/]+/libexec\Z"), re.compile(r"/node_modules/@andespindola/crow-skills\Z"),
15
+ re.compile(r"/_npx/[^/]+/node_modules/@andespindola/crow-skills\Z"))
11
16
  SHA = re.compile(r"[a-f0-9]{40,64}\Z")
12
17
  MAX_FILE = 8 * 1024 * 1024
13
18
  MAX_PACKAGE = 32 * 1024 * 1024
@@ -80,7 +85,9 @@ class Source:
80
85
  if ref not in ("HEAD", self.revision):
81
86
  raise CrowError("immutable_release", "A referência não está neste snapshot npm; selecione um clone Git para outras refs.")
82
87
  raw = self.bundle_file("catalog.json")
88
+ self.identity = self._bundle_identity()
83
89
  else:
90
+ self.identity = "git:" + str(self.path)
84
91
  if fetch:
85
92
  self.git("fetch", "--no-recurse-submodules", "origin", timeout=120)
86
93
  self.revision = self.git("rev-parse", "--verify", "--end-of-options", ref + "^{commit}").decode().strip()
@@ -138,6 +145,18 @@ class Source:
138
145
  except (OSError, ValueError, TypeError, KeyError) as exc:
139
146
  raise CrowError("invalid_release", "Manifesto do snapshot npm inválido.") from exc
140
147
 
148
+ def _bundle_identity(self):
149
+ """A verified snapshot of the published package: same identity on every version/path."""
150
+ try:
151
+ name = json.loads(self.bundle_file("package.json")).get("name")
152
+ except (CrowError, ValueError, AttributeError):
153
+ name = None
154
+ # Only where a release really lives (Homebrew Cellar, npm global, npx cache): a folder
155
+ # elsewhere that merely claims the name is another origin.
156
+ if name == PACKAGE and any(p.search(str(self.path)) for p in PACKAGED):
157
+ return "package:" + name
158
+ return "bundle:" + str(self.path)
159
+
141
160
  def bundle_file(self, name):
142
161
  safe_relative(name)
143
162
  try:
@@ -254,3 +273,24 @@ class Source:
254
273
  except (ValueError, KeyError, UnicodeError) as exc:
255
274
  raise CrowError("invalid_package", "Frontmatter/referências do pacote não correspondem ao catálogo.") from exc
256
275
  return Package(name, files, entries_for(files))
276
+
277
+
278
+ def identity_of(record_source, record_identity=None):
279
+ """Identity recorded for an installation. Records made before 0.8.0 only kept the path:
280
+ a packaged-release path (Homebrew Cellar, npm global or npx cache) means the package."""
281
+ if record_identity:
282
+ return record_identity
283
+ if isinstance(record_source, str) and any(p.search(record_source) for p in PACKAGED):
284
+ return "package:" + PACKAGE
285
+ return "git:" + str(record_source)
286
+
287
+
288
+ def source_identity(source):
289
+ return getattr(source, "identity", None) or "git:" + str(source.path)
290
+
291
+
292
+ def same_source(record, source):
293
+ """An update keeps the recorded origin: the same path, or the same package at another version."""
294
+ if record.get("source") == str(source.path):
295
+ return True
296
+ return identity_of(record.get("source"), record.get("source_id")) == source_identity(source)
@@ -16,7 +16,7 @@ import stat
16
16
  import uuid
17
17
 
18
18
  from .agents import uniflow_store
19
- from .source import CrowError, MAX_FILE, MAX_PACKAGE, MAX_FILES, SHA, digest, file_entry, safe_relative, valid_name
19
+ from .source import CrowError, MAX_FILE, MAX_PACKAGE, MAX_FILES, SHA, digest, file_entry, safe_relative, same_source, source_identity, valid_name
20
20
 
21
21
 
22
22
  def checked(path):
@@ -314,8 +314,9 @@ class Store:
314
314
  raise CrowError("unmanaged_conflict", "Destino já existe e não é gerenciado: " + name + ". Use --replace após revisar.")
315
315
  new = None
316
316
  if command != "uninstall":
317
- if record and command == "update" and record.get("source") != str(source.path):
318
- raise CrowError("source_mismatch", "Update requer a mesma origem; selecione --source explicitamente.")
317
+ if record and command == "update" and not same_source(record, source):
318
+ raise CrowError("source_mismatch", "Update requer a mesma origem (o mesmo clone, ou o mesmo pacote "
319
+ "publicado em outra versão); para trocar de origem, use install com --source.")
319
320
  if name not in packages:
320
321
  packages[name] = source.package(name)
321
322
  new = packages[name].entries
@@ -337,7 +338,7 @@ class Store:
337
338
  after[key]["installed"].pop(name)
338
339
  else:
339
340
  after[key]["installed"][name] = {
340
- "revision": source.revision, "source": str(source.path), "entries": new,
341
+ "revision": source.revision, "source": str(source.path), "source_id": source_identity(source), "entries": new,
341
342
  "package_sha256": digest(new), "agents": target_info["agents"],
342
343
  "installed_at": datetime.now(timezone.utc).isoformat(),
343
344
  }
package/docs/cli.md CHANGED
@@ -1,6 +1,6 @@
1
- # crow-skills CLI 0.7.1
1
+ # crow-skills CLI 0.9.0
2
2
 
3
- CLI local-first para humanos e agentes. Python 3.10+, sem bibliotecas Python externas; Git é necessário para fontes em clone, não para o snapshot npm. O launcher npm requer Node 18+. Mutações suportadas em macOS/Linux (locks POSIX). Não instala o agente, não executa scripts das skills e não muda modelos, prompts base ou permissões. Instruções de uso das skills (o guia do agente, abaixo) são gravadas pelo comando `guide` e, por padrão, por `install`/`update`/`uninstall` em `--global` quando a crow-behaviour fica instalada para um agente com mecanismo verificado; `--no-guide` desliga isso. Os mesmos comandos também aplicam as [integrações de interface](#integrações-de-interface-integrations) (status line do Claude Code e do Codex, segmento tmux); `--no-integrations` desliga. `crow-skills progress` mostra o [painel de progresso](#progresso-progress) da execução crow-behaviour ativa.
3
+ CLI local-first para humanos e agentes. Python 3.10+, sem bibliotecas Python externas; Git é necessário para fontes em clone, não para o snapshot npm. O launcher npm requer Node 18+. Mutações suportadas em macOS/Linux (locks POSIX). Não instala o agente, não executa scripts das skills e não muda modelos, prompts base ou permissões. Instruções de uso das skills (o guia do agente, abaixo) são gravadas pelo comando `guide` e, por padrão, por `install`/`update`/`uninstall` em `--global` quando a crow-behaviour fica instalada para um agente com mecanismo verificado; `--no-guide` desliga isso. Os mesmos comandos também aplicam as [integrações de interface](#integrações-de-interface-integrations) (status lines do Claude Code, do Codex e do Antigravity, hooks do modo crow em cada CLI, comando `/crow`, segmento tmux); `--no-integrations` desliga. `crow-skills mode on|off` liga e desliga a crow-behaviour em [todas as sessões e CLIs](#modo-crow-mode); `crow-skills progress` mostra o [painel de progresso](#progresso-progress) da execução ativa; `crow-skills events` expõe o [barramento de eventos](#eventos-events) dos hooks; `crow-skills autoupdate on` liga a [atualização automática](#atualização-automática-autoupdate).
4
4
 
5
5
  ## Executar
6
6
 
@@ -31,7 +31,7 @@ Para testar/distribuir o arquivo local sem registry:
31
31
 
32
32
  ```sh
33
33
  npm pack
34
- npm install -g ./andespindola-crow-skills-0.7.1.tgz --ignore-scripts
34
+ npm install -g ./andespindola-crow-skills-0.9.0.tgz --ignore-scripts
35
35
  ```
36
36
 
37
37
  O pacote contém o CLI Python e todas as skills do commit, com `release.json` de hashes. Não requer acesso ao GitHub ou clone para list/install. O launcher Node encaminha argumentos sem shell para Python em modo isolado, evitando imports pelo diretório do chamador/PYTHONPATH. `CROW_SKILLS_PYTHON` pode apontar para outro executável Python 3.10+. Não há dependências npm nem hooks de instalação que instalem skills automaticamente.
@@ -80,9 +80,9 @@ A fonte em checkout deve ser um clone Git já existente. O padrão é o checkout
80
80
 
81
81
  `--fetch` busca `origin` somente quando solicitado, usando credenciais Git externas; não atualiza o checkout. É incompatível com `--dry-run`. Sem fetch, uma ref remota pode estar desatualizada. Git replace-objects e hooks não são usados para interpretar a fonte; erros de Git não imprimem stderr que possa conter credenciais. URL arbitrária/credencial não é argumento suportado de `--source`.
82
82
 
83
- Atualização é explícita. `update` sem nomes atualiza apenas instalações gerenciadas nos destinos selecionados; não instala o catálogo inteiro. A origem deve corresponder à registrada. Mudança intencional de origem requer install/revisão explícita, não troca silenciosa durante update.
83
+ Atualização é explícita (ou agendada com [autoupdate](#atualização-automática-autoupdate)). `update` sem nomes atualiza apenas instalações gerenciadas nos destinos selecionados; não instala o catálogo inteiro. A origem deve corresponder à registrada. Mudança intencional de origem requer install/revisão explícita, não troca silenciosa durante update.
84
84
 
85
- No npm, primeiro atualize o pacote npm e então execute o update das skills, ou escolha uma fonte Git explicitamente. Com npx, o caminho de cache pode mudar entre versões; nesse caso, use install explícito para revisar/registrar a nova origem em vez de contornar source_mismatch.
85
+ Desde a 0.8.0, a origem registrada é também uma identidade (`source_id`): `git:<caminho do clone>` para um clone, ou `package:@andespindola/crow-skills` para o snapshot publicado, só quando ele está onde um release é instalado (Cellar do Homebrew, `lib/node_modules` do npm global, cache do npx); uma pasta em outro lugar que só declare esse nome é `bundle:<caminho>`, outra origem. O caminho do pacote muda a cada versão (`.../Cellar/crow-skills/<versão>/libexec`, cache do npx), mas a identidade não: `update` aceita o mesmo pacote em outro caminho e registra o novo. Registros anteriores à 0.8.0, que só guardavam o caminho, são reconhecidos pelo formato do caminho de um pacote publicado (Cellar do Homebrew, `node_modules/@andespindola/crow-skills`). Um snapshot com outro nome de pacote, ou um clone Git, continua sendo outra origem: `source_mismatch`, e a troca exige install. No npm, primeiro atualize o pacote e então execute o update das skills (o autoupdate faz os dois).
86
86
 
87
87
  ## Estado, conflitos e recuperação
88
88
 
@@ -139,7 +139,7 @@ Erros retornam `ok:false` e `error.code/message`. Saídas reais incluem alteraç
139
139
 
140
140
  Codex/shared são deduplicados quando apontam para o mesmo diretório. O diretório compartilhado também pode ser lido por outros hosts; não é isolamento entre agentes. `.codex/skills` é uma localização legada encontrada em ambientes existentes; o adaptador usa a localização moderna documentada. Para um destino legado específico, use `--dest` explicitamente.
141
141
 
142
- `agents` só verifica PATH e caminhos, sem iniciar agente/LLM. `status`/`doctor` conferem arquivos e estado de instalação, não provam carregamento, ativação, independência dos workers ou execução correta da skill. Gemini oferece `/skills reload`; para outros hosts, confira sua lista/reload ou reinicie a sessão conforme a versão. Nenhum hook ou system prompt base é alterado para forçar uso; o guia abaixo, aplicado por padrão em `--global` e desligável com `--no-guide`, é aditivo.
142
+ `agents` só verifica PATH e caminhos, sem iniciar agente/LLM. `status`/`doctor` conferem arquivos e estado de instalação, não provam carregamento, ativação, independência dos workers ou execução correta da skill. Gemini oferece `/skills reload`; para outros hosts, confira sua lista/reload ou reinicie a sessão conforme a versão. Nenhum system prompt base é alterado; o guia abaixo e os hooks do modo crow, aplicados por padrão em `--global` e desligáveis com `--no-guide` e `--no-integrations`, são aditivos: só informam ao agente o modo escolhido pelo usuário.
143
143
 
144
144
  ### Uniflow
145
145
 
@@ -177,7 +177,7 @@ crow-skills guide status
177
177
  crow-skills guide uninstall --agents codex --global --yes
178
178
  ```
179
179
 
180
- `guide` grava, no mecanismo nativo e sempre carregado de cada CLI, instruções curtas em pt-BR para o agente usar as skills instaladas: carregar a crow-behaviour por iniciativa própria antes de tarefas substantivas (várias etapas ou partes, decisões, vários arquivos, verificação), responder direto em conversa ou ajuste trivial, consultar a lista de skills disponíveis no agente (crow ou não) e carregar a especialista pertinente pelo nome. O conteúdo é gerado do catálogo e das skills gerenciadas pelo CLI naquele agente, com a forma de invocação dele. Exige a crow-behaviour instalada para o agente.
180
+ `guide` grava, no mecanismo nativo e sempre carregado de cada CLI, instruções curtas em pt-BR para o agente usar as skills instaladas: obedecer ao [modo crow](#modo-crow-mode) vigente (anunciado pelo hook a cada prompt ou, sem hook, lido de `~/.config/crow-skills/mode.json`), carregar a crow-behaviour por iniciativa própria antes de tarefas substantivas (várias etapas ou partes, decisões, vários arquivos, verificação), responder direto em conversa ou ajuste trivial, consultar a lista de skills disponíveis no agente (crow ou não) e carregar a especialista pertinente pelo nome. O conteúdo é gerado do catálogo e das skills gerenciadas pelo CLI naquele agente, com a forma de invocação dele. Exige a crow-behaviour instalada para o agente.
181
181
 
182
182
  Aplicação automática (padrão em `install`, `update` e `uninstall` com `--global`, desligada por `--no-guide`):
183
183
 
@@ -211,6 +211,8 @@ crow-skills progress --watch # redesenha a cada segundo; sai sozinho ap
211
211
  crow-skills progress --run ID --json # leitura por agente/automação
212
212
  ```
213
213
 
214
+ O painel começa pela lista de processos no formato da lista de agentes do host: `● main <atividade do coordenador>` e uma linha `○ <dono> <atividade>` por unidade em andamento de outro dono (o prefixo `subagent:` sai do nome). É o mesmo bloco que a crow-behaviour mostra na conversa (`crow_ledger.py show`) e que a status line do Claude Code e do Antigravity exibem abaixo da linha principal.
215
+
214
216
  Lê o ledger `crow-run/1` que a crow-behaviour mantém em tarefas substantivas (formato em `skills/crow-behaviour/references/progress-ledger.md`): `$CROW_LEDGER`, `.crow/runs/*.json` no diretório atual e nos pais, e `~/.crow/runs/`. Sem `--run`, prefere execuções do diretório (ou de pais e filhos dele), depois as em andamento, depois a mais recente; um ledger `running` sem atualização há mais de 2 h conta como abandonado. Status line e tmux só mostram execuções do próprio diretório. Somente leitura; não inicia agentes.
215
217
 
216
218
  Tokens vêm dos logs locais do próprio host, filtrados pela janela da execução (`startedAt` até `endedAt` ou agora) e pela sessão (`session.id` no ledger) ou, sem ela, pelo diretório de trabalho (marcado como aproximado, pois outras sessões no mesmo diretório e janela entram na soma). Só campos numéricos de uso são lidos e impressos; conteúdo de mensagens, prompts e credenciais nunca é exibido.
@@ -237,13 +239,21 @@ crow-skills integrations uninstall --global --yes
237
239
  crow-skills install crow-behaviour --agents claude --global --no-integrations --yes # sem integrações
238
240
  ```
239
241
 
240
- Aplicadas por padrão junto com `install`/`update` em `--global` para os agentes selecionados que ficam com a crow-behaviour, e removidas quando ela sai (`uninstall`, `rollback`, `recover`). `--no-integrations` desliga o passo; `--project`/`--dest` não têm integração. São um passo posterior às transações de skills e guia: uma recusa aparece em `integrations.skipped` e não desfaz as skills.
242
+ Aplicadas por padrão junto com `install`/`update` em `--global` para os agentes selecionados que ficam com a crow-behaviour, e removidas quando ela sai (`uninstall`, `rollback`, `recover`). `--no-integrations` desliga o passo; `--project`/`--dest` não têm integração. São um passo posterior às transações de skills e guia: uma recusa aparece em `integrations.skipped` e não desfaz as skills. Integrações de um CLI que não está configurado no perfil (sem `~/.codex`, `~/.gemini/settings.json`, `~/.gemini/antigravity-cli` ou `~/.config/devin/config.json`) são puladas com o motivo, sem criar arquivos.
241
243
 
242
- | Integração | Agentes | Mecanismo | O que mostra |
244
+ | Integração | Agentes | Mecanismo | O que faz |
243
245
  |---|---|---|---|
244
- | claude-statusline | claude | chave `statusLine` (`type: command`) em `~/.claude/settings.json` | `crow ▸ título x/y ████░░ 46% · 1.2M tok` enquanto houver execução ativa no diretório da sessão (nunca de outro projeto, nunca uma execução gravada para outra sessão, nunca um ledger `running` parado há mais de 2 h); tokens da transcrição da sessão, com `~` quando forem aproximados |
246
+ | claude-statusline | claude | chave `statusLine` (`type: command`) em `~/.claude/settings.json` | 1ª linha: `▸▸ crow on │ crow ▸ título x/y ████░░ 46% · 1.2M tok` (o indicador sempre; o resto enquanto houver execução ativa no diretório da sessão, nunca de outro projeto, de outra sessão ou de um ledger parado há mais de 2 h); linhas seguintes: a lista de processos (`● main …`, `○ dono atividade`, até 6) |
247
+ | claude-hooks | claude | entradas em `hooks` de `~/.claude/settings.json` | modo por prompt (`UserPromptSubmit`, síncrono) e eventos (demais, `async: true`) |
248
+ | claude-command | claude | `~/.claude/commands/crow.md` (arquivo próprio) | `/crow on\|off\|status`: roda o toggle por `!` com `allowed-tools` restrito ao script; `disable-model-invocation` impede o modelo de chamá-lo |
245
249
  | codex-statusline | codex | `[tui].status_line` em `~/.codex/config.toml`, em bloco marcado | itens nativos `model-with-reasoning`, `context-remaining`, `current-dir`, `task-progress`, `used-tokens`; `task-progress` reflete o plano nativo que a skill espelha |
246
- | tmux-status | claude, codex, gemini (agy), devin | `~/.config/crow-skills/tmux.conf` (arquivo próprio) e um bloco `source-file -q` no fim do seu `tmux.conf` | segmento acrescentado ao `status-right` (`set -ag`, sem substituir o seu), com o diretório do painel ativo |
250
+ | codex-hooks | codex | entradas em `~/.codex/hooks.json` | modo por prompt, `/crow on\|off\|status` interceptado e bloqueado com o resultado, `systemMessage` com o modo no início da sessão e quando muda, eventos (`async: true`) |
251
+ | gemini-hooks | gemini (Gemini CLI) | `hooks` em `~/.gemini/settings.json` | modo por prompt (`BeforeAgent`), `systemMessage` quando muda, eventos |
252
+ | gemini-command | gemini (Gemini CLI) | `~/.gemini/commands/crow.toml` (arquivo próprio) | `/crow on\|off\|status` por `!{…}` (o Gemini pede confirmação do shell, salvo política que o permita) |
253
+ | agy-hooks | gemini (Antigravity) | chave `crow-skills` em `~/.gemini/config/hooks.json` | modo por prompt (`PreInvocation` → `injectSteps`), `/crow …` interceptado quando o agy envia o texto (`lastUserInput`, 1.4.7+), eventos |
254
+ | agy-statusline | gemini (Antigravity) | `statusLine` em `~/.gemini/antigravity-cli/settings.json` com `stack_with_default: true` | indicador e lista de processos empilhados sob a linha padrão do agy |
255
+ | devin-hooks | devin | `hooks` em `~/.config/devin/config.json` | modo por prompt, `/crow …` interceptado, `systemMessage` quando muda, eventos |
256
+ | tmux-status | claude, codex, gemini (agy), devin | `~/.config/crow-skills/tmux.conf` (arquivo próprio) e um bloco `source-file -q` no fim do seu `tmux.conf` | `▸▸ crow on · crow ▸ …` acrescentado ao `status-right` (`set -ag`, sem substituir o seu), com o diretório do painel ativo |
247
257
 
248
258
  Regras de preservação:
249
259
 
@@ -251,12 +261,129 @@ Regras de preservação:
251
261
  - Claude: um `statusLine` existente do tipo `command` é encadeado: o comando anterior roda primeiro, com o mesmo stdin, sua saída é mantida inteira (todas as linhas, espaços internos) e o segmento crow entra no fim da última linha; as demais chaves dele (`padding` etc.) são preservadas. Outro tipo é mantido e a integração é pulada. Se você mudar o `statusLine` depois, ele não é sobrescrito nem removido. No uninstall, se `settings.json` ainda tiver exatamente o que o crow-skills gravou, os bytes originais do backup voltam; se você editou outra parte do arquivo, a restauração é só da chave `statusLine` (JSON reescrito com indentação 2).
252
262
  - Codex: só aplicado se você ainda não definiu `tui.status_line`; um `[tui]` existente recebe o bloco logo após o cabeçalho, senão o bloco cria a tabela no fim do arquivo. A edição é verificada por parse TOML (Python 3.11+). O uninstall só remove o bloco se ele estiver como foi gravado e se o resultado tiver as mesmas chaves que o arquivo atual menos `tui.status_line`; sem outras edições, o arquivo volta byte a byte. Chaves acrescentadas a um `[tui]` criado pelo crow-skills mantêm o cabeçalho `[tui]`; bloco editado ou remoção que mudaria outra chave é recusado e reportado em `skipped`. O Codex não aceita comando externo na status line, então ela não lê o ledger.
253
263
  - tmux: só quando o `tmux` está no PATH e já existe `~/.tmux.conf` ou `~/.config/tmux/tmux.conf`. Se o `tmux.conf` for symlink, o snippet é instalado mas o arquivo não é editado: o resultado traz a linha `source-file -q ...` para você adicionar. O snippet acrescenta o segmento só quando `status-right` ainda não o contém, então ele volta depois de cada `tmux source-file` do seu `tmux.conf` sem duplicar. O diretório do painel chega ao script escapado por `#{q:pane_current_path}` (tmux 3.0 ou mais novo): nome de diretório com `$(...)` ou crase não é executado. Depois de remover, o segmento sai da sessão atual quando o `status-right` é redefinido (recarregar um `tmux.conf` que o define) ou quando o servidor tmux reinicia.
254
- - O script usado pela status line e pelo tmux é uma cópia de `crow_skills/progress.py` em `~/.local/state/crow-skills/integrations/`, executada com o `python3` do PATH no momento da instalação; não depende do caminho do cache npm.
264
+ - Hooks: as entradas do crow-skills são acrescentadas depois das suas, em todos os eventos (no Codex, a aprovação de `/hooks` é por índice, então o hook que você já aprovou continua aprovado), e reconhecidas pelo caminho do script. No Antigravity, ficam numa chave própria (`crow-skills`) de `hooks.json`, ao lado das suas. Uninstall tira só essas entradas; se ninguém mais editou o arquivo, os bytes originais voltam.
265
+ - Arquivos JSON compartilhados por duas integrações (o `settings.json` do Claude Code recebe a status line e os hooks) têm um único ponto de restauração por arquivo: o conteúdo antes da primeira gravação do crow-skills. Removidas as duas, ele volta byte a byte; se o arquivo foi editado por você no meio do caminho, só as chaves/entradas do crow-skills saem.
266
+ - O Devin também lê os hooks do `~/.claude/settings.json`. Para não duplicar nem rotular errado, o hook instalado para o Claude Code só age quando quem o executa é o Claude Code: a transcrição informada fica em `~/.claude/projects` (ou em `$CLAUDE_CONFIG_DIR/projects`), ou, sem transcrição, o ambiente traz `CLAUDECODE=1` (exportado pelo Claude Code para os processos filhos); um campo exclusivo do Devin (`tool_provenance`) também o silencia. O Devin usa a entrada própria, rotulada `devin`. Do mesmo modo, a entrada do Gemini CLI fica em silêncio quando o Antigravity a executa (`ANTIGRAVITY_AGENT=1`).
267
+ - Codex: hooks novos ou alterados só rodam depois de aprovados em `/hooks` dentro do Codex, e só com `[features] hooks = true` no `config.toml`; o crow-skills não altera esse flag e avisa na nota da instalação quando ele falta.
268
+ - Os scripts usados pela status line, pelo tmux, pelos hooks e pelos comandos `/crow` são cópias de `crow_skills/progress.py` (`crow_progress.py`), `crow_skills/hook.py` (`crow_hook.py`) e `crow_skills/resources.py` (`crow_resources.py`, a sonda de memória) em `~/.local/state/crow-skills/integrations/`, executadas com o `python3` do PATH no momento da instalação (os hooks com `-I -S`); não dependem do caminho do cache npm ou do Homebrew.
269
+
270
+ Sem superfície que mostre um valor externo persistente (conferido em 2026-10-28, Codex CLI 0.165.0, Gemini CLI 0.66.0, Devin CLI 3000.11.228):
271
+
272
+ - Codex: `[tui].status_line` e `terminal_title` só aceitam itens nativos; o rodapé não mostra o modo crow. O hook mostra `▸▸ crow on|off` como `systemMessage` no início da sessão e quando o modo muda.
273
+ - Gemini CLI: `ui.footer.items` aceita só itens nativos; idem, `systemMessage` quando muda.
274
+ - Devin CLI: sem status line ou rodapé configurável; idem, `systemMessage` quando muda.
275
+ - Nenhum CLI aceita alimentar a lista nativa de subagentes de fora; a lista de processos vem do ledger (status line do Claude Code e do agy, `crow-skills progress`, bloco no chat).
276
+
277
+ O Antigravity (`agy`, agente `gemini` do instalador) ganhou `statusLine` por comando: a integração agy-statusline usa `stack_with_default` (o agy desliga a status line após falhas seguidas; o script sempre sai com código 0). O formato da chave foi lido do binário 1.4.4 e das notas de versão, sem sessão de verificação: se a linha não aparecer, rode `/statusline` no agy. No ledger, o host dele é `agy`; `gemini` no ledger significa Gemini CLI. Para os demais, use o segmento tmux ou `crow-skills progress --watch` num painel ao lado.
278
+
279
+ ## Recursos da máquina (resources)
280
+
281
+ ```sh
282
+ crow-skills resources # memória, pressão, CPU, agentes em execução e recomendação
283
+ crow-skills resources --json # crow-resources/1 no envelope padrão (data.recommendation)
284
+ crow-skills resources --no-processes # sem varrer processos (mais rápido)
285
+ ```
286
+
287
+ Somente leitura: não altera limites, prioridades, swap ou processos; grava apenas um cache de 5 s em `~/.local/state/crow-skills/resources-cache.json`. Sem dependências e em torno de 70 ms (medido: mediana 72 ms com a varredura de processos, 51 ms sem, n=20, macOS 26, 12 CPUs, 18 GB).
288
+
289
+ | O que | macOS | Linux |
290
+ |---|---|---|
291
+ | Memória total e disponível | `sysctl hw.memsize` e `kern.memorystatus_level` (% que o kernel conta como disponível; `vm_stat` como alternativa) | `/proc/meminfo` (`MemAvailable`); dentro de cgroup v2 com limite (o menor `memory.max` subindo até a raiz), limite menos o working set (`memory.current - inactive_file`) |
292
+ | Pressão | `kern.memorystatus_vm_pressure_level` (1 normal, 2 warn, 4 critical) | PSI `/proc/pressure/memory` (`some`/`full avg10`), ou o `memory.pressure` do nível do cgroup que define o limite |
293
+ | Swap, CPU, carga | `vm.swapusage`, `hw.ncpu`, `getloadavg` | `/proc/meminfo`, afinidade de CPU limitada pelo `cpu.max` do cgroup, `getloadavg` |
294
+ | Agentes | `ps -axo pid=,ppid=,rss=,comm=` | `/proc/<pid>/stat` e `statm` |
295
+
296
+ Agentes: processos cujo executável se chama `claude`, `codex`, `gemini`, `agy`/`antigravity` ou `devin`, com a RSS da árvore inteira (workers node, servidores MCP, shells). Só o tipo, a contagem e os MB saem; linha de comando, argumentos e nomes de outros processos nunca são lidos para a saída. CLIs que rodam como `node` sem renomear o processo não são detectados. Outros sistemas: memória não medida, pressão `unknown` e recomendação `reduced`.
297
+
298
+ A pressão é a pior entre a do sistema, a PSI e a porcentagem disponível. A recomendação:
299
+
300
+ - `budget = disponível - reserva`, com reserva = o menor entre `reservedMb` e `reservedPercent` da memória total; `maxParallelAgents = budget / perAgentMb`, entre 1 e `maxParallelAgents`; `maxParallelHeavyJobs = budget / perHeavyJobMb`, entre 1 e o menor de `maxParallelHeavyJobs` e CPUs/4; `maxWorkersPerJob` = CPUs por job, limitado por `budget / jobs / perWorkerMb`.
301
+ - `warn`: agentes e jobs pela metade. Carga de 1 min acima de `loadPerCpuReduce` por CPU: jobs e workers pela metade. `critical`: `sequential`, 1 agente, 0 jobs pesados novos, 1 worker.
302
+ - `mode`: `sequential` quando só cabe 1 agente; `reduced` sob pressão `warn` ou carga alta; senão `parallel` (o dimensionamento pela memória livre já está nos números). Plataforma não medida: `reduced`.
303
+
304
+ Limiares em `~/.config/crow-skills/resources.json` (opcional; chaves desconhecidas ou valores fora da faixa são ignorados e listados em `config.errors`):
305
+
306
+ | Chave | Padrão | Origem |
307
+ |---|---|---|
308
+ | `reservedMb` | 2048 | memória deixada para o sistema, editor e navegador |
309
+ | `reservedPercent` | 15 | teto da reserva em % da memória total, para máquinas pequenas (8 GB reservam ~1,2 GB) |
310
+ | `perAgentMb` | 1024 | medido: uma sessão do Claude Code com MCPs e shells usou ~0,95 GB de RSS em árvore; Codex CLI avulso 60–70 MB; o app-server do Codex desktop ~2,1 GB. Vale o CLI comum mais pesado, já que o fan-out não sabe qual worker o host abre |
311
+ | `perHeavyJobMb` | 1536 | estimativa conservadora para build, suíte, dev server, emulador ou container (não medida) |
312
+ | `perWorkerMb` | 512 | estimativa para um worker de teste ou compilador (não medida) |
313
+ | `maxParallelAgents` | 6 | teto fixo |
314
+ | `maxParallelHeavyJobs` | 4 | teto fixo; também limitado a CPUs/4 |
315
+ | `warnAvailablePercent` / `criticalAvailablePercent` | 15 / 7 | disponível abaixo disso vira `warn` / `critical` |
316
+ | `psiWarnSomeAvg10` / `psiCriticalFullAvg10` | 10 / 10 | PSI (Linux) a partir disso vira `warn` / `critical` |
317
+ | `loadPerCpuReduce` | 1.5 | carga por CPU acima disso reduz jobs e workers |
318
+ | `cacheSeconds` | 5 | idade máxima da leitura reaproveitada por hooks, status line e snapshot |
319
+
320
+ Onde aparece:
321
+
322
+ - Hook de prompt (todos os CLIs com `*-hooks`): acrescenta uma linha `[crow-skills] memória: pressão …, … GB livres de … GB. Recomendação …` ao contexto só quando a pressão é `warn`/`critical` ou a recomendação não é `parallel`; com a máquina folgada, nada muda. Usa a leitura em cache (até `cacheSeconds`). Medido na cópia instalada (`python3 -I -S`, n=40): 38,5 ms de mediana com cache e 41,7 ms sem, contra 33,1 ms do hook da 0.8.0; RSS máxima de 12 MB com cache (igual à 0.8.0) e ~24 MB no prompt que renova a leitura (no máximo um a cada `cacheSeconds`, com o subprocesso `sysctl`). O bytecode da sonda fica em `__pycache__` ao lado dos scripts e sai no uninstall das integrações.
323
+ - Status line do Claude Code e do agy, e segmento tmux: `mem ▲ 85% ×2` (uso de memória e agentes recomendados; `▲` em warn, `▲▲` em crítico, sem seta quando só cabe um agente sem pressão; `^`/`x` sem Unicode) só nas mesmas condições. Medido (n=40): 41,2 ms com cache e 44,5 ms sem, contra 40,1 ms da 0.8.0; RSS máxima de 13 MB, igual à 0.8.0.
324
+ - `events snapshot`: campo `resources` ([contrato](events.md#snapshot-agregado-crow-snapshot1)).
325
+ - Ledger da crow-behaviour: a decisão de paralelismo tomada antes de um fan-out fica no campo opcional `resources` (`crow_ledger.py resources --from-probe -`).
326
+
327
+ ## Modo crow (mode)
328
+
329
+ ```sh
330
+ crow-skills mode # status: ▸▸ crow on
331
+ crow-skills mode off # desliga em todas as sessões e CLIs, a partir do próximo prompt
332
+ crow-skills mode on
333
+ crow-skills mode toggle --json
334
+ ```
335
+
336
+ O modo é um interruptor único para a crow-behaviour em todos os CLIs. `on` (padrão, também quando o arquivo não existe) é o modo de orquestração permanente: o agente carrega e segue a crow-behaviour em toda tarefa substantiva, sem o usuário pedir. `off`: o agente não a carrega nem aplica, salvo se o usuário a invocar no pedido; as especialistas continuam disponíveis. O estado fica em `~/.config/crow-skills/mode.json` (`crow-mode/1`, gravação atômica com `updatedAt` e quem mudou).
337
+
338
+ Como cada CLI fica sabendo, sem reiniciar a sessão:
339
+
340
+ | CLI | A cada prompt | Alternar dentro da sessão | Indicador visível |
341
+ |---|---|---|---|
342
+ | Claude Code | hook `UserPromptSubmit` injeta `[crow-skills] modo crow: ON\|OFF` | `/crow on\|off\|status` (`~/.claude/commands/crow.md`) | status line `▸▸ crow on` |
343
+ | Codex | hook `UserPromptSubmit` (após aprovar em `/hooks`) | prompt exatamente `/crow on\|off\|status`: o hook alterna e bloqueia o prompt com o resultado | `systemMessage` no início e quando muda; o rodapé não aceita item externo |
344
+ | Gemini CLI | hook `BeforeAgent` | `/crow on\|off\|status` (`~/.gemini/commands/crow.toml`) | `systemMessage` quando muda |
345
+ | Antigravity (agy) | hook `PreInvocation` (`injectSteps`) | `/crow …` interceptado só quando o agy envia o texto do prompt (1.4.7+); senão peça ao agente para rodar `crow-skills mode on\|off` | status line `▸▸ crow on` (empilhada) |
346
+ | Devin | hook `UserPromptSubmit` | prompt `/crow on\|off\|status`, como no Codex | `systemMessage` quando muda |
347
+ | qualquer um | — | `crow-skills mode on\|off` num terminal | segmento tmux `▸▸ crow on` |
348
+
349
+ O guia de cada agente diz para obedecer ao anúncio mais recente e, sem hook (não instalado ou não aprovado), ler o arquivo de modo no início da sessão. O modelo nunca muda o modo por conta própria (no Claude Code, o comando tem `disable-model-invocation`). `mode` sem `--yes` é intencional: alternar é o pedido explícito do usuário e não altera arquivos de configuração dos CLIs.
350
+
351
+ ## Eventos (events)
352
+
353
+ ```sh
354
+ crow-skills events # resumo: sessões ativas, execuções crow, autoupdate
355
+ crow-skills events snapshot --json # crow-snapshot/1 para terminais (crow-term)
356
+ crow-skills events tail --json --limit 100
357
+ crow-skills events tail --follow # JSONL puro até Ctrl-C
358
+ ```
359
+
360
+ Os hooks gravam eventos compactos (`crow-event/1`) num JSONL rotacionado e um snapshot por sessão (host, sessão, diretório, branch, modelo, modo de permissão, modo crow, estado, ferramenta atual, última ação, subagentes em andamento, shells iniciados, bloqueio em aprovação, custo e uso quando a status line os envia). Nunca entram texto de prompt, mensagem, entrada/saída de ferramenta ou segredos. Contrato completo, campos e limites de disco em [docs/events.md](events.md).
361
+
362
+ ## Atualização automática (autoupdate)
363
+
364
+ ```sh
365
+ crow-skills autoupdate on --dry-run
366
+ crow-skills autoupdate on --yes # agenda diário e no login
367
+ crow-skills autoupdate status
368
+ crow-skills autoupdate run --yes # agora, manualmente
369
+ crow-skills autoupdate run --skills-only --yes
370
+ crow-skills autoupdate off --yes
371
+ ```
372
+
373
+ `on` instala um agendador do usuário que roda `crow-skills autoupdate run --yes --json` todo dia e no login:
374
+
375
+ | Sistema | Arquivos | Quando |
376
+ |---|---|---|
377
+ | macOS | `~/Library/LaunchAgents/com.andersonflima.crow-skills.autoupdate.plist`, carregado com `launchctl bootstrap gui/<uid>` | `RunAtLoad` (login) e `StartCalendarInterval` diário às 10:17 (roda ao acordar se o Mac dormia) |
378
+ | Linux | `~/.config/systemd/user/crow-skills-autoupdate.{service,timer}`, habilitado com `systemctl --user enable --now` | `OnStartupSec=5min` e `OnCalendar=daily` com `Persistent=true` |
379
+ | outros | — | `unsupported_platform`; agende `crow-skills autoupdate run --yes --json` por conta própria (por exemplo, cron) |
380
+
381
+ O agendador chama o launcher estável (`<prefixo do Homebrew>/bin/crow-skills`, `<prefixo do npm>/bin/crow-skills` ou `bin/crow-skills` do checkout), não o caminho versionado. Um arquivo de agendador que já existe e não foi gravado pelo crow-skills é recusado (`unmanaged_conflict`); `off` não remove um arquivo editado depois da instalação (informa em `kept`). Com `--home` isolado, os arquivos são gravados mas nada é carregado.
255
382
 
256
- Sem superfície que mostre um valor externo (documentado em 2026-10-23, Gemini CLI 0.65.0, agy 1.4.4, Devin CLI 3000.11.92):
383
+ Cada execução:
257
384
 
258
- - Gemini CLI: `ui.footer.items` aceita só itens nativos; hooks podem injetar contexto, não um item de rodapé.
259
- - Antigravity (`agy`, agente `gemini` do instalador): sem configuração de status line ou rodapé. No ledger, o host dele é `agy`; `gemini` no ledger significa Gemini CLI.
260
- - Devin CLI: sem status line ou rodapé configurável; hooks e plugins existem, mas não exibem um valor persistente.
385
+ 1. Atualiza o próprio crow-skills conforme a instalação: Homebrew (`brew upgrade andersonflima/tap/crow-skills`), npm global (`npm install -g @andespindola/crow-skills@latest`). Checkout Git só com `autoupdate on --git-pull`, e só se estiver limpo em `main`/`master` (`git pull --ff-only`); caso contrário, é pulado com o motivo. Saída de brew/npm/git não é guardada nem impressa, só código de saída e versões.
386
+ 2. Se a versão mudou, a versão nova (o launcher) faz o passo seguinte, para usar o snapshot novo como fonte.
387
+ 3. Para cada agente com skills gerenciadas (claude, codex/`~/.agents/skills`, gemini, devin, uniflow), roda o equivalente a `update <skills> --agents <agente> --global --yes`: regenera guia, integrações e hooks; a [identidade do pacote](#origem-e-versões) evita `source_mismatch` depois do upgrade. Skills editadas localmente (`modified`), ausentes ou instaladas de outra origem (`other_origin`, por exemplo de um clone Git) ficam como estão e aparecem em `kept`; nada é sobrescrito. Uma reaplicação dos hooks troca as entradas do crow-skills no lugar, sem mudar a posição das suas. Uma recusa num agente (por exemplo, guia editado) aparece em `error` e não interrompe os outros.
261
388
 
262
- Para esses, use o segmento tmux ou `crow-skills progress --watch` num painel ao lado.
389
+ O resultado fica em `~/.local/state/crow-skills/autoupdate/state.json` (`lastRun` e as últimas 20 execuções), aparece em `autoupdate status`, em `status`/`doctor` (doctor `healthy:false` se a última execução falhou ou o agendador foi alterado/removido) e em `events snapshot`. Duas execuções simultâneas são recusadas (`busy`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/crow-skills",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "Versioned, complementary agent skills with a protected multi-agent installer",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
package/release.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "README.md": {
4
4
  "executable": false,
5
5
  "kind": "file",
6
- "sha256": "32eddd05da22e1f5cc1771af32e207d51f2167ca16ee1388a0648917921bc046"
6
+ "sha256": "3562a72f701d7c01465edb2d2042bd3b06d2cb91c7d58519f0aeef765bfff56e"
7
7
  },
8
8
  "bin/npm-crow-skills.cjs": {
9
9
  "executable": true,
@@ -18,7 +18,7 @@
18
18
  "crow_skills/__init__.py": {
19
19
  "executable": false,
20
20
  "kind": "file",
21
- "sha256": "0a226e15403a704aed44b620d6d7ae1348e200319516a5c6f4016520995f69d2"
21
+ "sha256": "b4bcf1c83b6a242f18e3ad09c0eff3d3cf934d362080540eb80f7074354eaac0"
22
22
  },
23
23
  "crow_skills/__main__.py": {
24
24
  "executable": false,
@@ -30,20 +30,35 @@
30
30
  "kind": "file",
31
31
  "sha256": "b14c37d2f1becfe38c74411fc413608b375c05bd6961a0757e3ec085ec2e1f66"
32
32
  },
33
+ "crow_skills/autoupdate.py": {
34
+ "executable": false,
35
+ "kind": "file",
36
+ "sha256": "aaafc556e530997dd3de2e075fe4fd70c1886f61435cf7bf23fb89d13c627466"
37
+ },
33
38
  "crow_skills/cli.py": {
34
39
  "executable": false,
35
40
  "kind": "file",
36
- "sha256": "fd3c4e63be95f0a616932438f1d2648facffabf825a89bb15d9f1a466d33b075"
41
+ "sha256": "d4b63d2bf962d342113d475064ead6800953ff9f2650470e386e26e4bbf71aa1"
42
+ },
43
+ "crow_skills/events.py": {
44
+ "executable": false,
45
+ "kind": "file",
46
+ "sha256": "f3368104864d4e1b2831d8b61d5beeb0d7ee6554b4226942f857cf2c528875a5"
37
47
  },
38
48
  "crow_skills/guide.py": {
39
49
  "executable": false,
40
50
  "kind": "file",
41
- "sha256": "cabfe0809c0fc607b7deac0cd8df9025acaadddf4deb05f45288158dc51b0391"
51
+ "sha256": "9130cb9b59a340aaf674c0b062c38849d59a7789643cc30ed1e5091dff31b7a7"
52
+ },
53
+ "crow_skills/hook.py": {
54
+ "executable": false,
55
+ "kind": "file",
56
+ "sha256": "8cb6fa8f2efa7a9368ecc6831a5f96368f9464a834f0fd8ac3d15a13121f6b63"
42
57
  },
43
58
  "crow_skills/integrations.py": {
44
59
  "executable": false,
45
60
  "kind": "file",
46
- "sha256": "fa2b53ef54e157cadb5579f0a10f7267026e749d255a40787279b66c495e1c1e"
61
+ "sha256": "fd961a591a42ae1d807baacb0d8b66f8b834d425ac71a02cfe3b95309560a452"
47
62
  },
48
63
  "crow_skills/npm_entry.py": {
49
64
  "executable": false,
@@ -53,17 +68,22 @@
53
68
  "crow_skills/progress.py": {
54
69
  "executable": false,
55
70
  "kind": "file",
56
- "sha256": "c7521b069781dfcb3c083ab14cfcb6de6d2e71199963d595149dcdf2807aa802"
71
+ "sha256": "b4c34e8abf29656d38771b0d0ea87664babaeab63507df8c50ac5f248cbe0dc3"
72
+ },
73
+ "crow_skills/resources.py": {
74
+ "executable": false,
75
+ "kind": "file",
76
+ "sha256": "5400b80a406b91924b374f41300725a0f3b6234bf3958854a885b3705309b69d"
57
77
  },
58
78
  "crow_skills/source.py": {
59
79
  "executable": false,
60
80
  "kind": "file",
61
- "sha256": "b140a538967dc6c101ae3a8c7121f56ef2b256715c631b3f7adba3d981f2b978"
81
+ "sha256": "bd9ad8841369d512a7fab08d805767278ec40c5e7cf67aa9979a6a0c5a898c32"
62
82
  },
63
83
  "crow_skills/storage.py": {
64
84
  "executable": false,
65
85
  "kind": "file",
66
- "sha256": "bf3c4bcb83888b74c72773aa1d0c0def4b3ba08f0c7bdbb918d2c549438e4d83"
86
+ "sha256": "e3a7a41bcb3aa52530bbc1770165308b61a42017a8d8962fdb6a271ce2b5188f"
67
87
  },
68
88
  "docs/cli-security.md": {
69
89
  "executable": false,
@@ -73,17 +93,17 @@
73
93
  "docs/cli.md": {
74
94
  "executable": false,
75
95
  "kind": "file",
76
- "sha256": "eb9eefccb081f1f473eb7312c0b0735c13297d5b2a010b254abb7dad98cf3fef"
96
+ "sha256": "972b37492d6e13edc278e9bb6df21337874bae8304e486d80ea31d718132acb5"
77
97
  },
78
98
  "package.json": {
79
99
  "executable": false,
80
100
  "kind": "file",
81
- "sha256": "7abd07ab9e8af66d7bcc19a3306b8c09a7d8cfc3f9d41a03ebafd39469cc467b"
101
+ "sha256": "84e5d52e70b34516e8dc63d7b7c073e5f4f06bd81def1f54ca9a6f2cfd6d932d"
82
102
  },
83
103
  "skills/crow-accessibility/SKILL.md": {
84
104
  "executable": false,
85
105
  "kind": "file",
86
- "sha256": "0fa9cceb563941eb2eb87c2dd599c8e5edc3746ebe1c96d9c1a419cc8c52b98f"
106
+ "sha256": "7ee1abafa6a1a2497fcd3b274d2eeda8edea77dcc7c46b87ffa80cc2c98260dc"
87
107
  },
88
108
  "skills/crow-agent-security/SKILL.md": {
89
109
  "executable": false,
@@ -93,7 +113,7 @@
93
113
  "skills/crow-api-test/SKILL.md": {
94
114
  "executable": false,
95
115
  "kind": "file",
96
- "sha256": "28abe41efdc304116827ffe4719aa96c24081953f424bc39c6edc441a7d1d3bf"
116
+ "sha256": "ae7dcf7e8e1942f2d68607a0ab8c2243bf0458141b3bd89b6e04a370f4981e39"
97
117
  },
98
118
  "skills/crow-architecture/SKILL.md": {
99
119
  "executable": false,
@@ -103,12 +123,12 @@
103
123
  "skills/crow-backend/SKILL.md": {
104
124
  "executable": false,
105
125
  "kind": "file",
106
- "sha256": "212896f376f1038f76d88dd62e173546d06992ccace654390b799839f0da86ea"
126
+ "sha256": "11b5bb19149ba004bcdc814c87472a61a63537ceca16a7ff22edb6309d3b0b76"
107
127
  },
108
128
  "skills/crow-behaviour/SKILL.md": {
109
129
  "executable": false,
110
130
  "kind": "file",
111
- "sha256": "0e1360266fb7b5943f4fc0f9710b2294db08e14400a742d441deb23567a0ea2b"
131
+ "sha256": "a25006aad9b401f14e235f5e920591b5a45d3243525ee631582217655bb0c813"
112
132
  },
113
133
  "skills/crow-behaviour/agents/openai.yaml": {
114
134
  "executable": false,
@@ -123,32 +143,37 @@
123
143
  "skills/crow-behaviour/references/orchestration.md": {
124
144
  "executable": false,
125
145
  "kind": "file",
126
- "sha256": "11c582309c9c8e109861dc6b6c7dc5e55da60a1784cc2d2fcbc9ce4cb44893fa"
146
+ "sha256": "050179e401263a7327e1e7ff0ebcc633c0626d9132280cd7dace12da8c50b0ab"
127
147
  },
128
148
  "skills/crow-behaviour/references/progress-ledger.md": {
129
149
  "executable": false,
130
150
  "kind": "file",
131
- "sha256": "70a03809def8c65fa1c6390d57158cfdcd553246c4a91382feb35927a84b3af9"
151
+ "sha256": "83a0a498e83205b462ccafe3629c1c6512b29c88ceded297175fcefd62679030"
132
152
  },
133
153
  "skills/crow-behaviour/references/quality-patterns.md": {
134
154
  "executable": false,
135
155
  "kind": "file",
136
156
  "sha256": "8b537d5838e68d948d0231fa68fca2ab940dc49c9c661adb3ad5234001027ada"
137
157
  },
158
+ "skills/crow-behaviour/references/resources.md": {
159
+ "executable": false,
160
+ "kind": "file",
161
+ "sha256": "73ff6216afbafb574dd8a34a7ad420f0f60c7194b2ef71e7c13e7a2b2ef1e4eb"
162
+ },
138
163
  "skills/crow-behaviour/scripts/crow_ledger.py": {
139
164
  "executable": true,
140
165
  "kind": "file",
141
- "sha256": "68e6d5f567564eeb7f55f887f59f1d9857f59e64d9b09a41241ac6aa70134f62"
166
+ "sha256": "bf381db14c5d996c18970fd5d86bb16d93e9937ea03f46778078393681e4729b"
142
167
  },
143
168
  "skills/crow-browser/SKILL.md": {
144
169
  "executable": false,
145
170
  "kind": "file",
146
- "sha256": "8457015e28605694e86519c3fa9c06839d637ed4c6ab9f1c9ad995c888455655"
171
+ "sha256": "516c60f3601762b8f64a4da69e2fc96d89d575507660354c202401ad464d8d09"
147
172
  },
148
173
  "skills/crow-debug/SKILL.md": {
149
174
  "executable": false,
150
175
  "kind": "file",
151
- "sha256": "826eabc7134919ba22d7bf16994cf7d89f53684ec6f1d48d417355588b9f8af9"
176
+ "sha256": "1771fb0ec61277a8883a715bea612fb3cb8facfadbd629f234209386be928fa8"
152
177
  },
153
178
  "skills/crow-design/SKILL.md": {
154
179
  "executable": false,
@@ -173,7 +198,7 @@
173
198
  "skills/crow-frontend/SKILL.md": {
174
199
  "executable": false,
175
200
  "kind": "file",
176
- "sha256": "3c6c0dde76bf60198f2e5be17778cb1214aab66e1664b6bfdc04460e00e51903"
201
+ "sha256": "47df5becccac292dc2030a7eb0511af7a795a18d46b1fe387e4f82eeba141a9b"
177
202
  },
178
203
  "skills/crow-growth/SKILL.md": {
179
204
  "executable": false,
@@ -183,7 +208,7 @@
183
208
  "skills/crow-infra/SKILL.md": {
184
209
  "executable": false,
185
210
  "kind": "file",
186
- "sha256": "32ddc559893e3564a89d638ba0e67e556b530ecdcc7f49f2af7b8c18c7178090"
211
+ "sha256": "cd0e1f558a9c7ef43964d3047abf06857d01a9476ba776732427f15a940e752d"
187
212
  },
188
213
  "skills/crow-infra/references/kubernetes.md": {
189
214
  "executable": false,
@@ -198,7 +223,7 @@
198
223
  "skills/crow-interface/SKILL.md": {
199
224
  "executable": false,
200
225
  "kind": "file",
201
- "sha256": "c0640c7a511a5218800287dc5b287895fbac14b1b777abef8c5c9f94eabd7907"
226
+ "sha256": "a2e68ce5a102763dce58d8be110fce16a2d4f780d7f078d6e85dcd890c2c0ca5"
202
227
  },
203
228
  "skills/crow-interface/agents/impeccable_asset_producer.toml": {
204
229
  "executable": false,
@@ -538,12 +563,12 @@
538
563
  "skills/crow-media/SKILL.md": {
539
564
  "executable": false,
540
565
  "kind": "file",
541
- "sha256": "d42d92f22a165ba53938ac367916e37b7887c9a9daa19b4b1f563e6489a3d042"
566
+ "sha256": "05fae21807c514a52a9c3770b7f03cd48536dd1bff348dd9c90af0cfbadda87e"
542
567
  },
543
568
  "skills/crow-native-mobile/SKILL.md": {
544
569
  "executable": false,
545
570
  "kind": "file",
546
- "sha256": "725e01a55f962a725496e3776efcefab203b7c78307cb1f9783e1d3a53b167cf"
571
+ "sha256": "dfbb0702f976d846a9cd77e5e00da36a09cb62dcbc7016e13cebaec0a8bbf0d2"
547
572
  },
548
573
  "skills/crow-observe/SKILL.md": {
549
574
  "executable": false,
@@ -553,7 +578,7 @@
553
578
  "skills/crow-performance/SKILL.md": {
554
579
  "executable": false,
555
580
  "kind": "file",
556
- "sha256": "322b497c2c13bc57751c08229cdc3c7a2fd5aec95a5b2bf63709df9e912722c5"
581
+ "sha256": "cdd87b12f94e21743ce09287a9acaf164e9389a88b85719b7aa6dddde35b9f9b"
557
582
  },
558
583
  "skills/crow-performance/references/measurement.md": {
559
584
  "executable": false,
@@ -578,17 +603,17 @@
578
603
  "skills/crow-qa/SKILL.md": {
579
604
  "executable": false,
580
605
  "kind": "file",
581
- "sha256": "bc261a9fc64a2048f47589f1c73bd7732d46361ba7f2b2acd3e8a3247217ea35"
606
+ "sha256": "b05a0b76fcb0ceef0139de4eb33930114fe2621cf99c8bed352999c9963781cf"
582
607
  },
583
608
  "skills/crow-release/SKILL.md": {
584
609
  "executable": false,
585
610
  "kind": "file",
586
- "sha256": "816e6e8489b9c24c874b257cb2269c3735484313f0eae0e630b6fe009a339b87"
611
+ "sha256": "c25e0f95052e7dfd7c935a9ae916016aeab217f978e9c46788a0da5ae257c12a"
587
612
  },
588
613
  "skills/crow-reverse/SKILL.md": {
589
614
  "executable": false,
590
615
  "kind": "file",
591
- "sha256": "14faff0685867d0f718e00cd16d661472990824e56608dee35e85c6cf9624f4b"
616
+ "sha256": "5ba51998bdd49c85bfa202986d7af86229e2248914621d66f96e26e6c8954aca"
592
617
  },
593
618
  "skills/crow-secrets/SKILL.md": {
594
619
  "executable": false,
@@ -603,7 +628,7 @@
603
628
  "skills/crow-security-scan/SKILL.md": {
604
629
  "executable": false,
605
630
  "kind": "file",
606
- "sha256": "a89f9d50a721cf34c8735d547d169f8bc572c95b1f941f1e6b53fc3678b36d2e"
631
+ "sha256": "a7f369945417333026996663d4179e6a481a062fbe9782919536825dd467d961"
607
632
  },
608
633
  "skills/crow-security-test/SKILL.md": {
609
634
  "executable": false,
@@ -631,7 +656,7 @@
631
656
  "sha256": "e37132ef8b060548191fbf14a5a18a9dd3acd84ea9a35e802174455b9e374d3d"
632
657
  }
633
658
  },
634
- "revision": "2d294571f175113574a22446529025303243d271",
659
+ "revision": "45386157d080acae28d2461b0e0ec15708a359ab",
635
660
  "schema_version": 1,
636
- "version": "0.7.1"
661
+ "version": "0.9.0"
637
662
  }
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Use scanner para estrutura e teste manual/assistivo para comportamento. Anuncie atualizações dinâmicas sem ruído excessivo.
22
22
  5. Corrija no componente responsável e teste de novo o fluxo; se houver suíte, deixe teste de regressão com ferramenta já presente e o comando para reexecutar. Registre navegador, dispositivo, ferramenta e o que não pôde ser avaliado.
23
23
 
24
+ Recursos da máquina: um navegador ou leitor de tela automatizado por vez e scanner com concorrência mínima; feche as sessões que abriu. Sob pressão `critical` (`crow-skills resources --json`, quando existir), adie a varredura e relate. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **a11y-evidence** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.