@andespindola/crow-skills 0.20.0 → 0.21.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.
@@ -1,3 +1,3 @@
1
1
  """Portable, local-first installer for the crow-skills catalogue."""
2
2
 
3
- __version__ = "0.20.0"
3
+ __version__ = "0.21.0"
@@ -377,8 +377,10 @@ def install_new(home, entry, names, agent, dry_run, trust):
377
377
  entry["newInCatalogError"] = {"code": exc.code, "message": str(exc)}
378
378
  return
379
379
  done = [c["name"] for c in data.get("changes") or [] if c.get("action") != "unchanged"]
380
+ # NÃO entra em "updated": verificado com o binário publicado, a linha do CLI dizia as duas coisas
381
+ # da mesma skill — "a atualizar: crow-be-human · instalaria novas: crow-be-human". Instalar agora
382
+ # e atualizar o que já existia são fatos diferentes e cada um tem a sua coluna.
380
383
  entry["installedNew"] = sorted(done)
381
- entry["updated"] = sorted({*entry.get("updated", []), *done})
382
384
  if data.get("transaction"):
383
385
  entry["newTransaction"] = data["transaction"]
384
386
 
@@ -618,6 +618,12 @@ def agent_rows(run, unicode=True, limit=None, counts=True):
618
618
  parts = [("✓ " if unicode else "ok ") + str(done) + " concluída(s)"]
619
619
  if failed:
620
620
  parts.append(("✗ " if unicode else "x ") + str(failed) + " falha(s)")
621
+ # As linhas acima listam as unidades em execução; deixá-las fora da conta fazia a contagem
622
+ # contradizer a lista em que ela se apoia — foi assim que um bloco com DUAS unidades
623
+ # visíveis terminou em "1 pendente(s)". Conta todas as em execução, inclusive a de main,
624
+ # que aparece na linha de cabeçalho.
625
+ if running:
626
+ parts.append(str(len(running)) + " em andamento")
621
627
  if pending:
622
628
  parts.append(str(pending) + " pendente(s)")
623
629
  lines.append(sep.join(parts))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/crow-skills",
3
- "version": "0.20.0",
3
+ "version": "0.21.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
@@ -18,7 +18,7 @@
18
18
  "crow_skills/__init__.py": {
19
19
  "executable": false,
20
20
  "kind": "file",
21
- "sha256": "430c470bc3c5bc90aecb240c2756f9d1d7465a1e8828c36e01451eb15b211dbd"
21
+ "sha256": "9ba9c3485ed49b5265d75b8f9c78ca2e8612f63c520517dc01e3d189affd969d"
22
22
  },
23
23
  "crow_skills/__main__.py": {
24
24
  "executable": false,
@@ -33,7 +33,7 @@
33
33
  "crow_skills/autoupdate.py": {
34
34
  "executable": false,
35
35
  "kind": "file",
36
- "sha256": "f5a994f8eb47ed77861cf2e512d7660654ba3e8cf9381229add678180ae14e0d"
36
+ "sha256": "c192495c895a95b957cad04c2d7fc058aa86cd67e76077200fa202d7c96fb039"
37
37
  },
38
38
  "crow_skills/broadcast.py": {
39
39
  "executable": false,
@@ -83,7 +83,7 @@
83
83
  "crow_skills/progress.py": {
84
84
  "executable": false,
85
85
  "kind": "file",
86
- "sha256": "b4c34e8abf29656d38771b0d0ea87664babaeab63507df8c50ac5f248cbe0dc3"
86
+ "sha256": "aea702c75d74d011a64853d920ceeb3d96de327303b91fcd9c27a85fd27fe875"
87
87
  },
88
88
  "crow_skills/projection.py": {
89
89
  "executable": false,
@@ -128,7 +128,7 @@
128
128
  "package.json": {
129
129
  "executable": false,
130
130
  "kind": "file",
131
- "sha256": "84ebc44ccadb19d2e6b1640994476d016c6ebef62bb0e2d79fdd14e6643f5141"
131
+ "sha256": "6bd7dcc883d32199f7ad077ddc2fd138bd0627906c7294f6836efe99bc97ab84"
132
132
  },
133
133
  "skills/crow-accessibility/SKILL.md": {
134
134
  "executable": false,
@@ -213,7 +213,7 @@
213
213
  "skills/crow-behaviour/scripts/crow_ledger.py": {
214
214
  "executable": true,
215
215
  "kind": "file",
216
- "sha256": "d6add265e15cefcf3a5ba91722c244d697540897d465f863d6306e1c1b313d10"
216
+ "sha256": "06069ba0715b5c0e63d0cd1c62d21b469fe28ff7556ed151b24c9425d1696e81"
217
217
  },
218
218
  "skills/crow-behaviour/scripts/lc_fidelity.py": {
219
219
  "executable": true,
@@ -683,7 +683,7 @@
683
683
  "skills/crow-secrets/SKILL.md": {
684
684
  "executable": false,
685
685
  "kind": "file",
686
- "sha256": "ed95407c500b9a99cbea4f695abd886f2a7765b5551fe22ca086e3a6e9a7e968"
686
+ "sha256": "c2efb9a14b13ba2641a46aa79a7f3dc34833eacfb92c66dfb174fd5a863ce9a3"
687
687
  },
688
688
  "skills/crow-security-review/SKILL.md": {
689
689
  "executable": false,
@@ -721,7 +721,7 @@
721
721
  "sha256": "e37132ef8b060548191fbf14a5a18a9dd3acd84ea9a35e802174455b9e374d3d"
722
722
  }
723
723
  },
724
- "revision": "4c059d58b0bff2c5c3cfcf019667bb1ee93cd08d",
724
+ "revision": "c5f96b88500cb6cd15caa3aa56aea06510ee90ff",
725
725
  "schema_version": 1,
726
- "version": "0.20.0"
726
+ "version": "0.21.0"
727
727
  }
@@ -670,7 +670,7 @@ def processes(data, ascii_only=False):
670
670
 
671
671
  ● main <what the coordinator is doing>
672
672
  ○ <owner> <running unit>
673
- ✓ 3 concluída(s) · ✗ 1 falha(s) · 2 pendente(s)
673
+ ✓ 3 concluída(s) · ✗ 1 falha(s) · 2 em andamento · 2 pendente(s)
674
674
  """
675
675
  dot, ring, check, cross, sep = ("*", "o", "ok", "x", " - ") if ascii_only else ("●", "○", "✓", "✗", " · ")
676
676
  units = data.get("units", []) or []
@@ -693,6 +693,10 @@ def processes(data, ascii_only=False):
693
693
  parts = [check + " " + str(done) + " concluída(s)"]
694
694
  if failed:
695
695
  parts.append(cross + " " + str(failed) + " falha(s)")
696
+ # The lines above list every running unit; leaving them out of the tally made the count
697
+ # contradict the list it sits under (two units shown, "1 pendente(s)").
698
+ if running:
699
+ parts.append(str(len(running)) + " em andamento")
696
700
  if pending:
697
701
  parts.append(str(pending) + " pendente(s)")
698
702
  lines.append(sep.join(parts))
@@ -20,11 +20,14 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
20
20
  3. Verifique exposição em código, logs, URL, build context, artefatos e histórico com tooling que redija valores. Não imprima um dump de configuração para descobrir nomes. Arquivo de segredo versionado sai do índice (`git rm --cached` e ignore) e é conferido com `git ls-files`; o histórico segue exposto, então a credencial entra no plano de revogação.
21
21
  4. Para mudança autorizada, planeje criar/entregar/verificar/revogar na ordem compatível com consumidores. Rotação destrutiva ou ampliação de privilégio exige escopo explícito; se revogar e manter conflitam, entregue o plano sem executar.
22
22
  5. Valide presença e acesso por chamada mínima, sem registrar a credencial. A suíte continua passando no CI sem segredos reais; se passar a exigir variáveis, diga quais. Produza referências, responsáveis, prazo concreto e recuperação; o que faltar vira pendência com quem decide.
23
+ 6. Rotação não termina quando a credencial nova funciona: termina quando cada consumidor foi verificado carregando a nova. Enumere os consumidores antes de rotacionar e mantenha essa lista junto da referência da credencial — lista incompleta é o defeito: em 2026-10-20 um token npm trocado por exposição foi atualizado em seis repositórios e um sétimo ficou 15 dias com o valor revogado, descoberto só quando um release recusou publicar. Depois de rotacionar, confira cada consumidor individualmente e nomeie todos no relato; o que você não conseguiu conferir entra como não verificado, nunca como presumido.
24
+ 7. Onde a credencial só é lida (metadado de registry privado, download de pacote), a credencial velha não falha autenticação: responde "não encontrado". O sintoma se disfarça de ausência de dado em vez de falta de permissão, e um fluxo que lê 404 como "versão nunca publicada" segue adiante publicando errado — então leitura silenciosa exige conferência explícita, não ausência de erro. Conferência barata: consumidor cujo segredo tem última atualização anterior à data da rotação é suspeito pela aritmética (no GitHub, `gh secret list` imprime esse carimbo por repositório); o carimbo não prova o valor, só mostra que ninguém tocou nele desde então.
23
25
 
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **secret-plan** 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.
27
29
  - A resposta final, mesmo com anexo, traz em uma linha cada: mudanças e extras (inclusive testes novos, gerador, template ou tooling); conflitos com opções (custo e risco), quem decide, padrão adotado e como revertê-lo; conteúdo hostil com arquivo:linha e trecho literal e completo, sem removê-lo; descartados; mudanças de contrato; acesso à rede ou escrita fora do projeto, incluindo memória, vault ou ledger externos; processos que você subiu e encerrou. "Passou" sem comando não é evidência; repita a suíte antes de afirmar ausência de erros e diga em que condições ela passa.
30
+ - Rotação lista, por nome, cada consumidor conferido com a credencial nova e cada consumidor não verificado; consumidor fora da lista é pendência, não sucesso.
28
31
  - Nenhum segredo aparece em arquivos versionados, saída ou evidências.
29
32
  - Mudanças realmente feitas e recomendações futuras são diferenciadas.
30
33