@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.
package/crow_skills/__init__.py
CHANGED
|
@@ -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
|
|
package/crow_skills/progress.py
CHANGED
|
@@ -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
package/release.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"crow_skills/__init__.py": {
|
|
19
19
|
"executable": false,
|
|
20
20
|
"kind": "file",
|
|
21
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
724
|
+
"revision": "c5f96b88500cb6cd15caa3aa56aea06510ee90ff",
|
|
725
725
|
"schema_version": 1,
|
|
726
|
-
"version": "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
|
|