@andespindola/crow-skills 0.8.0 → 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.
- package/README.md +2 -2
- package/crow_skills/__init__.py +1 -1
- package/crow_skills/cli.py +10 -0
- package/crow_skills/events.py +25 -3
- package/crow_skills/hook.py +57 -1
- package/crow_skills/integrations.py +35 -2
- package/crow_skills/progress.py +55 -5
- package/crow_skills/resources.py +713 -0
- package/docs/cli.md +51 -3
- package/package.json +1 -1
- package/release.json +40 -30
- package/skills/crow-accessibility/SKILL.md +2 -0
- package/skills/crow-api-test/SKILL.md +2 -0
- package/skills/crow-backend/SKILL.md +2 -0
- package/skills/crow-behaviour/SKILL.md +1 -0
- package/skills/crow-behaviour/references/orchestration.md +4 -0
- package/skills/crow-behaviour/references/progress-ledger.md +3 -0
- package/skills/crow-behaviour/references/resources.md +44 -0
- package/skills/crow-behaviour/scripts/crow_ledger.py +75 -2
- package/skills/crow-browser/SKILL.md +2 -0
- package/skills/crow-debug/SKILL.md +2 -0
- package/skills/crow-frontend/SKILL.md +2 -0
- package/skills/crow-infra/SKILL.md +2 -0
- package/skills/crow-interface/SKILL.md +2 -0
- package/skills/crow-media/SKILL.md +2 -0
- package/skills/crow-native-mobile/SKILL.md +2 -0
- package/skills/crow-performance/SKILL.md +2 -0
- package/skills/crow-qa/SKILL.md +2 -0
- package/skills/crow-release/SKILL.md +2 -0
- package/skills/crow-reverse/SKILL.md +2 -0
- package/skills/crow-security-scan/SKILL.md +2 -0
package/docs/cli.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# crow-skills CLI 0.
|
|
1
|
+
# crow-skills CLI 0.9.0
|
|
2
2
|
|
|
3
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
|
|
|
@@ -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.
|
|
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.
|
|
@@ -265,7 +265,7 @@ Regras de preservação:
|
|
|
265
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
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
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`)
|
|
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
269
|
|
|
270
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
271
|
|
|
@@ -276,6 +276,54 @@ Sem superfície que mostre um valor externo persistente (conferido em 2026-10-28
|
|
|
276
276
|
|
|
277
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
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
|
+
|
|
279
327
|
## Modo crow (mode)
|
|
280
328
|
|
|
281
329
|
```sh
|
package/package.json
CHANGED
package/release.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"README.md": {
|
|
4
4
|
"executable": false,
|
|
5
5
|
"kind": "file",
|
|
6
|
-
"sha256": "
|
|
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": "
|
|
21
|
+
"sha256": "b4bcf1c83b6a242f18e3ad09c0eff3d3cf934d362080540eb80f7074354eaac0"
|
|
22
22
|
},
|
|
23
23
|
"crow_skills/__main__.py": {
|
|
24
24
|
"executable": false,
|
|
@@ -38,12 +38,12 @@
|
|
|
38
38
|
"crow_skills/cli.py": {
|
|
39
39
|
"executable": false,
|
|
40
40
|
"kind": "file",
|
|
41
|
-
"sha256": "
|
|
41
|
+
"sha256": "d4b63d2bf962d342113d475064ead6800953ff9f2650470e386e26e4bbf71aa1"
|
|
42
42
|
},
|
|
43
43
|
"crow_skills/events.py": {
|
|
44
44
|
"executable": false,
|
|
45
45
|
"kind": "file",
|
|
46
|
-
"sha256": "
|
|
46
|
+
"sha256": "f3368104864d4e1b2831d8b61d5beeb0d7ee6554b4226942f857cf2c528875a5"
|
|
47
47
|
},
|
|
48
48
|
"crow_skills/guide.py": {
|
|
49
49
|
"executable": false,
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
"crow_skills/hook.py": {
|
|
54
54
|
"executable": false,
|
|
55
55
|
"kind": "file",
|
|
56
|
-
"sha256": "
|
|
56
|
+
"sha256": "8cb6fa8f2efa7a9368ecc6831a5f96368f9464a834f0fd8ac3d15a13121f6b63"
|
|
57
57
|
},
|
|
58
58
|
"crow_skills/integrations.py": {
|
|
59
59
|
"executable": false,
|
|
60
60
|
"kind": "file",
|
|
61
|
-
"sha256": "
|
|
61
|
+
"sha256": "fd961a591a42ae1d807baacb0d8b66f8b834d425ac71a02cfe3b95309560a452"
|
|
62
62
|
},
|
|
63
63
|
"crow_skills/npm_entry.py": {
|
|
64
64
|
"executable": false,
|
|
@@ -68,7 +68,12 @@
|
|
|
68
68
|
"crow_skills/progress.py": {
|
|
69
69
|
"executable": false,
|
|
70
70
|
"kind": "file",
|
|
71
|
-
"sha256": "
|
|
71
|
+
"sha256": "b4c34e8abf29656d38771b0d0ea87664babaeab63507df8c50ac5f248cbe0dc3"
|
|
72
|
+
},
|
|
73
|
+
"crow_skills/resources.py": {
|
|
74
|
+
"executable": false,
|
|
75
|
+
"kind": "file",
|
|
76
|
+
"sha256": "5400b80a406b91924b374f41300725a0f3b6234bf3958854a885b3705309b69d"
|
|
72
77
|
},
|
|
73
78
|
"crow_skills/source.py": {
|
|
74
79
|
"executable": false,
|
|
@@ -88,17 +93,17 @@
|
|
|
88
93
|
"docs/cli.md": {
|
|
89
94
|
"executable": false,
|
|
90
95
|
"kind": "file",
|
|
91
|
-
"sha256": "
|
|
96
|
+
"sha256": "972b37492d6e13edc278e9bb6df21337874bae8304e486d80ea31d718132acb5"
|
|
92
97
|
},
|
|
93
98
|
"package.json": {
|
|
94
99
|
"executable": false,
|
|
95
100
|
"kind": "file",
|
|
96
|
-
"sha256": "
|
|
101
|
+
"sha256": "84e5d52e70b34516e8dc63d7b7c073e5f4f06bd81def1f54ca9a6f2cfd6d932d"
|
|
97
102
|
},
|
|
98
103
|
"skills/crow-accessibility/SKILL.md": {
|
|
99
104
|
"executable": false,
|
|
100
105
|
"kind": "file",
|
|
101
|
-
"sha256": "
|
|
106
|
+
"sha256": "7ee1abafa6a1a2497fcd3b274d2eeda8edea77dcc7c46b87ffa80cc2c98260dc"
|
|
102
107
|
},
|
|
103
108
|
"skills/crow-agent-security/SKILL.md": {
|
|
104
109
|
"executable": false,
|
|
@@ -108,7 +113,7 @@
|
|
|
108
113
|
"skills/crow-api-test/SKILL.md": {
|
|
109
114
|
"executable": false,
|
|
110
115
|
"kind": "file",
|
|
111
|
-
"sha256": "
|
|
116
|
+
"sha256": "ae7dcf7e8e1942f2d68607a0ab8c2243bf0458141b3bd89b6e04a370f4981e39"
|
|
112
117
|
},
|
|
113
118
|
"skills/crow-architecture/SKILL.md": {
|
|
114
119
|
"executable": false,
|
|
@@ -118,12 +123,12 @@
|
|
|
118
123
|
"skills/crow-backend/SKILL.md": {
|
|
119
124
|
"executable": false,
|
|
120
125
|
"kind": "file",
|
|
121
|
-
"sha256": "
|
|
126
|
+
"sha256": "11b5bb19149ba004bcdc814c87472a61a63537ceca16a7ff22edb6309d3b0b76"
|
|
122
127
|
},
|
|
123
128
|
"skills/crow-behaviour/SKILL.md": {
|
|
124
129
|
"executable": false,
|
|
125
130
|
"kind": "file",
|
|
126
|
-
"sha256": "
|
|
131
|
+
"sha256": "a25006aad9b401f14e235f5e920591b5a45d3243525ee631582217655bb0c813"
|
|
127
132
|
},
|
|
128
133
|
"skills/crow-behaviour/agents/openai.yaml": {
|
|
129
134
|
"executable": false,
|
|
@@ -138,32 +143,37 @@
|
|
|
138
143
|
"skills/crow-behaviour/references/orchestration.md": {
|
|
139
144
|
"executable": false,
|
|
140
145
|
"kind": "file",
|
|
141
|
-
"sha256": "
|
|
146
|
+
"sha256": "050179e401263a7327e1e7ff0ebcc633c0626d9132280cd7dace12da8c50b0ab"
|
|
142
147
|
},
|
|
143
148
|
"skills/crow-behaviour/references/progress-ledger.md": {
|
|
144
149
|
"executable": false,
|
|
145
150
|
"kind": "file",
|
|
146
|
-
"sha256": "
|
|
151
|
+
"sha256": "83a0a498e83205b462ccafe3629c1c6512b29c88ceded297175fcefd62679030"
|
|
147
152
|
},
|
|
148
153
|
"skills/crow-behaviour/references/quality-patterns.md": {
|
|
149
154
|
"executable": false,
|
|
150
155
|
"kind": "file",
|
|
151
156
|
"sha256": "8b537d5838e68d948d0231fa68fca2ab940dc49c9c661adb3ad5234001027ada"
|
|
152
157
|
},
|
|
158
|
+
"skills/crow-behaviour/references/resources.md": {
|
|
159
|
+
"executable": false,
|
|
160
|
+
"kind": "file",
|
|
161
|
+
"sha256": "73ff6216afbafb574dd8a34a7ad420f0f60c7194b2ef71e7c13e7a2b2ef1e4eb"
|
|
162
|
+
},
|
|
153
163
|
"skills/crow-behaviour/scripts/crow_ledger.py": {
|
|
154
164
|
"executable": true,
|
|
155
165
|
"kind": "file",
|
|
156
|
-
"sha256": "
|
|
166
|
+
"sha256": "bf381db14c5d996c18970fd5d86bb16d93e9937ea03f46778078393681e4729b"
|
|
157
167
|
},
|
|
158
168
|
"skills/crow-browser/SKILL.md": {
|
|
159
169
|
"executable": false,
|
|
160
170
|
"kind": "file",
|
|
161
|
-
"sha256": "
|
|
171
|
+
"sha256": "516c60f3601762b8f64a4da69e2fc96d89d575507660354c202401ad464d8d09"
|
|
162
172
|
},
|
|
163
173
|
"skills/crow-debug/SKILL.md": {
|
|
164
174
|
"executable": false,
|
|
165
175
|
"kind": "file",
|
|
166
|
-
"sha256": "
|
|
176
|
+
"sha256": "1771fb0ec61277a8883a715bea612fb3cb8facfadbd629f234209386be928fa8"
|
|
167
177
|
},
|
|
168
178
|
"skills/crow-design/SKILL.md": {
|
|
169
179
|
"executable": false,
|
|
@@ -188,7 +198,7 @@
|
|
|
188
198
|
"skills/crow-frontend/SKILL.md": {
|
|
189
199
|
"executable": false,
|
|
190
200
|
"kind": "file",
|
|
191
|
-
"sha256": "
|
|
201
|
+
"sha256": "47df5becccac292dc2030a7eb0511af7a795a18d46b1fe387e4f82eeba141a9b"
|
|
192
202
|
},
|
|
193
203
|
"skills/crow-growth/SKILL.md": {
|
|
194
204
|
"executable": false,
|
|
@@ -198,7 +208,7 @@
|
|
|
198
208
|
"skills/crow-infra/SKILL.md": {
|
|
199
209
|
"executable": false,
|
|
200
210
|
"kind": "file",
|
|
201
|
-
"sha256": "
|
|
211
|
+
"sha256": "cd0e1f558a9c7ef43964d3047abf06857d01a9476ba776732427f15a940e752d"
|
|
202
212
|
},
|
|
203
213
|
"skills/crow-infra/references/kubernetes.md": {
|
|
204
214
|
"executable": false,
|
|
@@ -213,7 +223,7 @@
|
|
|
213
223
|
"skills/crow-interface/SKILL.md": {
|
|
214
224
|
"executable": false,
|
|
215
225
|
"kind": "file",
|
|
216
|
-
"sha256": "
|
|
226
|
+
"sha256": "a2e68ce5a102763dce58d8be110fce16a2d4f780d7f078d6e85dcd890c2c0ca5"
|
|
217
227
|
},
|
|
218
228
|
"skills/crow-interface/agents/impeccable_asset_producer.toml": {
|
|
219
229
|
"executable": false,
|
|
@@ -553,12 +563,12 @@
|
|
|
553
563
|
"skills/crow-media/SKILL.md": {
|
|
554
564
|
"executable": false,
|
|
555
565
|
"kind": "file",
|
|
556
|
-
"sha256": "
|
|
566
|
+
"sha256": "05fae21807c514a52a9c3770b7f03cd48536dd1bff348dd9c90af0cfbadda87e"
|
|
557
567
|
},
|
|
558
568
|
"skills/crow-native-mobile/SKILL.md": {
|
|
559
569
|
"executable": false,
|
|
560
570
|
"kind": "file",
|
|
561
|
-
"sha256": "
|
|
571
|
+
"sha256": "dfbb0702f976d846a9cd77e5e00da36a09cb62dcbc7016e13cebaec0a8bbf0d2"
|
|
562
572
|
},
|
|
563
573
|
"skills/crow-observe/SKILL.md": {
|
|
564
574
|
"executable": false,
|
|
@@ -568,7 +578,7 @@
|
|
|
568
578
|
"skills/crow-performance/SKILL.md": {
|
|
569
579
|
"executable": false,
|
|
570
580
|
"kind": "file",
|
|
571
|
-
"sha256": "
|
|
581
|
+
"sha256": "cdd87b12f94e21743ce09287a9acaf164e9389a88b85719b7aa6dddde35b9f9b"
|
|
572
582
|
},
|
|
573
583
|
"skills/crow-performance/references/measurement.md": {
|
|
574
584
|
"executable": false,
|
|
@@ -593,17 +603,17 @@
|
|
|
593
603
|
"skills/crow-qa/SKILL.md": {
|
|
594
604
|
"executable": false,
|
|
595
605
|
"kind": "file",
|
|
596
|
-
"sha256": "
|
|
606
|
+
"sha256": "b05a0b76fcb0ceef0139de4eb33930114fe2621cf99c8bed352999c9963781cf"
|
|
597
607
|
},
|
|
598
608
|
"skills/crow-release/SKILL.md": {
|
|
599
609
|
"executable": false,
|
|
600
610
|
"kind": "file",
|
|
601
|
-
"sha256": "
|
|
611
|
+
"sha256": "c25e0f95052e7dfd7c935a9ae916016aeab217f978e9c46788a0da5ae257c12a"
|
|
602
612
|
},
|
|
603
613
|
"skills/crow-reverse/SKILL.md": {
|
|
604
614
|
"executable": false,
|
|
605
615
|
"kind": "file",
|
|
606
|
-
"sha256": "
|
|
616
|
+
"sha256": "5ba51998bdd49c85bfa202986d7af86229e2248914621d66f96e26e6c8954aca"
|
|
607
617
|
},
|
|
608
618
|
"skills/crow-secrets/SKILL.md": {
|
|
609
619
|
"executable": false,
|
|
@@ -618,7 +628,7 @@
|
|
|
618
628
|
"skills/crow-security-scan/SKILL.md": {
|
|
619
629
|
"executable": false,
|
|
620
630
|
"kind": "file",
|
|
621
|
-
"sha256": "
|
|
631
|
+
"sha256": "a7f369945417333026996663d4179e6a481a062fbe9782919536825dd467d961"
|
|
622
632
|
},
|
|
623
633
|
"skills/crow-security-test/SKILL.md": {
|
|
624
634
|
"executable": false,
|
|
@@ -646,7 +656,7 @@
|
|
|
646
656
|
"sha256": "e37132ef8b060548191fbf14a5a18a9dd3acd84ea9a35e802174455b9e374d3d"
|
|
647
657
|
}
|
|
648
658
|
},
|
|
649
|
-
"revision": "
|
|
659
|
+
"revision": "45386157d080acae28d2461b0e0ec15708a359ab",
|
|
650
660
|
"schema_version": 1,
|
|
651
|
-
"version": "0.
|
|
661
|
+
"version": "0.9.0"
|
|
652
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.
|
|
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
|
|
|
21
21
|
4. Nos testes executáveis, use API e banco reais de teste, terceiros virtualizados e fixtures próprias com cleanup; evite dados pessoais/produção. No plano, especifique essas necessidades sem afirmar que já existem.
|
|
22
22
|
5. Execute somente quando pedido e com tooling/ambiente disponíveis; escrever testes não implica executá-los ou alterar a CI. Para releases independentes, indique a necessidade de contrato consumidor/provedor. Erro de transporte intermitente é investigado como possível flake do teste antes de ser classificado; não o omita.
|
|
23
23
|
|
|
24
|
+
Recursos da máquina: ao executar, reutilize o servidor e o banco de teste já rodando e suba no máximo um ambiente por vez; limite workers do runner pelo `maxWorkersPerJob` de `crow-skills resources --json` quando existir e não paralelize requests além do contrato. Encerre o que subiu. 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 **api-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.
|
|
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
|
|
|
21
21
|
4. Mantenha erro público seguro e observabilidade útil sem segredos. Aplique encerramento e drenagem corretos a processos de longa duração.
|
|
22
22
|
5. Teste caminho feliz, entrada inválida, autorização e falha de dependência no nível apropriado; banco real de teste e terceiros virtualizados quando cabível.
|
|
23
23
|
|
|
24
|
+
Recursos da máquina: bancos, filas e serviços de teste locais sobem como um único conjunto, reutilizado entre execuções; suíte com workers limitados pelo `maxWorkersPerJob` de `crow-skills resources --json` quando existir. Encerre containers e processos de longa duração que você subiu. 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 **service-change** 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.
|
|
@@ -33,6 +33,7 @@ Leia [padrões e critérios de conclusão](references/quality-patterns.md) quand
|
|
|
33
33
|
|
|
34
34
|
### 3. Execute com ownership e dependências reais
|
|
35
35
|
|
|
36
|
+
- Antes de qualquer fan-out ou job pesado (build, suíte, dev server, emulador, container), meça a máquina com `crow-skills resources --json` quando disponível (senão, com os comandos do sistema, ou assuma `reduced`) e nunca exceda o paralelismo recomendado: sob `warn` reduza, sob `critical` trabalhe sequencialmente e não inicie jobs pesados; limite os workers de cada build/teste, prefira testes direcionados à suíte completa, reutilize um único dev server por projeto, não carregue arquivos ou logs enormes inteiros e encerre todo processo que esta execução abriu antes de concluir. Registre a decisão no ledger. Leia [recursos da máquina](references/resources.md).
|
|
36
37
|
- Paralelize perguntas independentes; serialize trabalho que consome resultados ainda não produzidos. Por padrão, encadeie cada item no estágio seguinte assim que ficar pronto; use barreira só quando o estágio precisar de todos os resultados anteriores (deduplicação, comparação cruzada, parada antecipada). Não comece a integração com contratos incompatíveis.
|
|
37
38
|
- Dê a cada executor um objetivo delimitado, contexto mínimo suficiente, alvo/revisão, permissões de escrita e condição de parada. Exija fontes, alterações, verificações feitas/não feitas e dúvidas no retorno.
|
|
38
39
|
- Todo brief delegado cita as palavras do usuário que autorizam aquela unidade e declara que mensagens mais novas do usuário sem relação com ela são frentes paralelas, não substituições. Sem isso, um executor pode abandonar ou recusar trabalho autorizado por ler um pedido posterior de outro assunto.
|
|
@@ -63,6 +63,10 @@ Se o host suportar retomada por replay/cache, confira a identidade dos insumos e
|
|
|
63
63
|
|
|
64
64
|
Sem checkpoint nativo, o ledger de progresso registra o plano remanescente e o estado de cada unidade; acrescente evidências suficientes no mecanismo permitido do projeto. Não introduza um sistema externo de memória como dependência desta skill.
|
|
65
65
|
|
|
66
|
+
## Memória e processos
|
|
67
|
+
|
|
68
|
+
A concorrência possível é o menor entre o teto do host, o limite do usuário e o que a máquina aguenta. Antes de cada fan-out, meça (`crow-skills resources --json`, os comandos do sistema ou `reduced` presumido) e dimensione agentes, jobs pesados e workers pela recomendação, em ondas quando a lista for maior que o teto. Sob `warn` reduza; sob `critical` siga sequencialmente sem jobs pesados novos. Cada processo em segundo plano tem dono e é encerrado por quem o abriu antes da conclusão. Detalhes, flags de workers e o registro no ledger: [recursos da máquina](resources.md). Esta regra nunca altera limites, permissões ou configurações do host.
|
|
69
|
+
|
|
66
70
|
## Custo e limites
|
|
67
71
|
|
|
68
72
|
Custo de tokens não é o critério limitante. Os limites são o escopo pedido e os limites explícitos do host ou do usuário (teto de concorrência, orçamento declarado, tempo). Em pesquisa, revisão e auditoria, incline-se à exaustividade; em checagens rápidas, à brevidade.
|
|
@@ -39,6 +39,7 @@ Leia ao iniciar uma tarefa substantiva. O ledger é a forma em arquivo do execut
|
|
|
39
39
|
- `progress`: 0 a 1; `done`/`skipped` contam como 1.
|
|
40
40
|
- `owner`: `main`, `subagent:<nome>`, `workflow:<id>` ou `sequential`. Só registre agentes que existiram.
|
|
41
41
|
- `summary`: uma linha de resultado ou motivo da falha. Nada de segredo, prompt completo ou conteúdo de mensagem.
|
|
42
|
+
- `resources` (opcional, desde 0.9.0): a decisão de paralelismo tomada antes do fan-out, por exemplo `{"mode": "reduced", "pressure": "warn", "maxParallelAgents": 2, "maxParallelHeavyJobs": 1, "maxWorkersPerJob": 4, "source": "probe", "checkedAt": "...", "note": "4 revisores viraram 2 ondas"}`. `mode`: `parallel`, `reduced` ou `sequential`; `pressure`: `normal`, `warn`, `critical` ou `unknown`; `source`: `probe` (crow-skills), `os` (comandos do sistema) ou `assumed`. Ledgers sem o campo continuam válidos; leitores ignoram valores fora desse formato.
|
|
42
43
|
|
|
43
44
|
## Quando gravar
|
|
44
45
|
|
|
@@ -47,6 +48,7 @@ O coordenador é o único que grava; workers informam e o coordenador registra.
|
|
|
47
48
|
- início da execução (fases conhecidas, unidades da primeira fase);
|
|
48
49
|
- unidade criada, iniciada, concluída, falhada ou pulada;
|
|
49
50
|
- nova fase dimensionada após ler a anterior;
|
|
51
|
+
- decisão de paralelismo antes de cada fan-out (`resources`; veja [recursos da máquina](resources.md));
|
|
50
52
|
- encerramento (`done`, `failed` ou `cancelled`, com `endedAt`).
|
|
51
53
|
|
|
52
54
|
O script incluído faz isso sem dependências além do Python 3: `scripts/crow_ledger.py`, dentro da pasta desta skill. Use o caminho da pasta que o host informou ao carregar a skill.
|
|
@@ -56,6 +58,7 @@ python3 <pasta-da-skill>/scripts/crow_ledger.py start --title "Paridade" --host
|
|
|
56
58
|
# imprime "<run-id> <caminho>"; guarde o run-id e passe-o em toda chamada seguinte
|
|
57
59
|
python3 <pasta-da-skill>/scripts/crow_ledger.py unit u1 --run <run-id> --phase d --title "Mapear CLI" --owner subagent:leitor --status running
|
|
58
60
|
python3 <pasta-da-skill>/scripts/crow_ledger.py unit u1 --run <run-id> --status done --summary "3 pontos de extensão"
|
|
61
|
+
crow-skills resources --json | python3 <pasta-da-skill>/scripts/crow_ledger.py resources --run <run-id> --from-probe - --note "2 ondas de 2"
|
|
59
62
|
python3 <pasta-da-skill>/scripts/crow_ledger.py show --run <run-id> # bloco de processos para o chat
|
|
60
63
|
python3 <pasta-da-skill>/scripts/crow_ledger.py show --tree --run <run-id> # árvore de fases, se o usuário pedir detalhe
|
|
61
64
|
python3 <pasta-da-skill>/scripts/crow_ledger.py finish --run <run-id> --status done
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Recursos da máquina
|
|
2
|
+
|
|
3
|
+
Leia antes de qualquer fan-out (subagentes, workflow, shells paralelos) e antes de iniciar build, suíte de testes, dev server, watcher, emulador, navegador ou container. Orquestrar não pode travar a máquina do usuário: cada agente, worker e processo em segundo plano disputa a mesma memória.
|
|
4
|
+
|
|
5
|
+
## Medir antes de paralelizar
|
|
6
|
+
|
|
7
|
+
1. Com o CLI do crow-skills disponível, rode `crow-skills resources --json` e use `data.recommendation`: `mode` (`parallel`, `reduced` ou `sequential`), `maxParallelAgents`, `maxParallelHeavyJobs` e `maxWorkersPerJob`. Leva menos de 100 ms e não altera nada além de um cache em `~/.local/state/crow-skills`.
|
|
8
|
+
2. Sem o CLI, meça com o sistema: macOS `sysctl kern.memorystatus_vm_pressure_level kern.memorystatus_level hw.memsize` (1 normal, 2 warn, 4 critical; o level é o % disponível); Linux `/proc/meminfo` (MemAvailable) e `/proc/pressure/memory` (PSI). Aplique os mesmos limites abaixo.
|
|
9
|
+
3. Sem nenhuma medida possível, assuma `reduced`: no máximo 2 agentes e 1 job pesado por vez.
|
|
10
|
+
4. Se o host injetar a linha `[crow-skills] memória: ...` no prompt, ela já é a medida atual; não repita a sonda só para confirmá-la.
|
|
11
|
+
|
|
12
|
+
Meça de novo antes de cada nova rodada de fan-out e quando um job pesado terminar; a recomendação vale para aquele momento, e outras sessões do usuário consomem a mesma máquina.
|
|
13
|
+
|
|
14
|
+
## Limites que você aplica
|
|
15
|
+
|
|
16
|
+
- Nunca exceda a recomendação: agentes simultâneos ≤ `maxParallelAgents`; jobs pesados simultâneos (build, suíte completa, dev server, emulador, container, navegador automatizado) ≤ `maxParallelHeavyJobs`, somando todos os seus agentes.
|
|
17
|
+
- `warn` ou `reduced`: reduza o fan-out ao recomendado, rode jobs pesados um de cada vez quando o limite for 1, encerre o que não usa antes de abrir outro.
|
|
18
|
+
- `critical` ou `sequential` com `maxParallelHeavyJobs` 0: trabalhe sequencialmente, não inicie job pesado novo, termine ou pare os que esta execução abriu e retome quando a pressão cair. Avise o usuário em uma linha.
|
|
19
|
+
- Uma unidade com teto menor que a lista de itens vira lotes: processe em ondas do tamanho permitido, sem pré-lançar a fila inteira.
|
|
20
|
+
- Os limites do host e do usuário continuam valendo; a recomendação só reduz, nunca autoriza mais concorrência do que o host permite.
|
|
21
|
+
|
|
22
|
+
## Jobs pesados com workers limitados
|
|
23
|
+
|
|
24
|
+
`maxWorkersPerJob` é um teto: use-o só para baixar a concorrência que a ferramenta ou o projeto já usa, nunca para paralelizar um comando serial. Ferramentas que por padrão usam todas as CPUs: `ninja -jN`, `cargo build -j N`, `cargo test -- --test-threads=N`, `jest --maxWorkers=N`, `vitest --maxWorkers=N`, `go test -p N`, `gradle --max-workers=N`, `xcodebuild -jobs N`, `ffmpeg -threads N`. Já paralelas por configuração do projeto: reduza o valor existente (`make -jN`, `mvn -T N`, `pytest -n N` só se o projeto já usa pytest-xdist; `terraform plan -parallelism=N` só abaixo do padrão 10). Comandos seriais (`make` sem `-j`, `mvn` sem `-T`, `pytest` sem xdist) ficam como estão. Containers: limite memória e CPU no `docker run --memory/--cpus` ou no compose quando o projeto já usa limites. Sem flag conhecida, rode o comando padrão do projeto sem aumentar a concorrência.
|
|
25
|
+
|
|
26
|
+
- Rode primeiro os testes direcionados à mudança (arquivo, pacote, filtro por nome); a suíte completa vem depois, uma vez, quando os direcionados passarem e o plano exigir.
|
|
27
|
+
- Um dev server ou watcher por projeto: antes de subir outro, procure o que já está rodando (porta, processo ou registro do próprio host) e reutilize-o. Não abra um por agente.
|
|
28
|
+
- Containers, emuladores e navegadores: um por vez salvo necessidade do teste; feche abas e sessões ao terminar a verificação.
|
|
29
|
+
|
|
30
|
+
## Encerrar o que você abriu
|
|
31
|
+
|
|
32
|
+
Antes de concluir a execução (e ao cancelar), pare cada processo em segundo plano, dev server, watcher, navegador, emulador ou container que esta execução iniciou, pelo id que você registrou ao iniciá-lo; confirme que saiu. Não mate processos que você não iniciou: liste-os ao usuário se estiverem pesando. Registre no relato final o que subiu e encerrou.
|
|
33
|
+
|
|
34
|
+
## Contexto e memória do próprio agente
|
|
35
|
+
|
|
36
|
+
Não carregue arquivos, logs ou dumps enormes inteiros no contexto nem em memória: use `head`/`tail`, `grep`, leitura por intervalo, paginação ou streaming, e peça aos workers trechos e posições em vez de conteúdo completo.
|
|
37
|
+
|
|
38
|
+
## Registrar a decisão
|
|
39
|
+
|
|
40
|
+
Antes do fan-out, grave a decisão no ledger: `crow-skills resources --json | python3 <pasta-da-skill>/scripts/crow_ledger.py resources --run <run-id> --from-probe - --note "<o que foi decidido>"`; sem o CLI, `crow_ledger.py resources --run <run-id> --mode reduced --agents 2 --heavy 1 --source os|assumed --note "..."`. O campo é opcional e ledgers antigos continuam válidos.
|
|
41
|
+
|
|
42
|
+
## Limites desta regra
|
|
43
|
+
|
|
44
|
+
Esta regra só reduz a sua própria concorrência. Não altera limites, permissões, swap, prioridades, sandbox ou configurações do host, não instala ferramenta de monitoramento e não encerra processos alheios. Os limiares ficam em `~/.config/crow-skills/resources.json`, que só o usuário edita.
|
|
@@ -8,6 +8,8 @@ coordinator records the transition.
|
|
|
8
8
|
crow_ledger.py start --title "..." --host claude [--phase id=Título ...] [--session ID] [--global]
|
|
9
9
|
crow_ledger.py phase ID --run RUN [--title T] [--status running|done|...]
|
|
10
10
|
crow_ledger.py unit ID --run RUN [--title T] [--phase P] [--owner O] [--status S] [--progress 0..1] [--summary TXT]
|
|
11
|
+
crow_ledger.py resources --run RUN [--from-probe FILE|-] [--mode M] [--agents N] [--heavy N] [--workers N]
|
|
12
|
+
[--pressure L] [--source probe|os|assumed] [--note TXT] # parallelism decision before a fan-out
|
|
11
13
|
crow_ledger.py finish --run RUN [--status done|failed|cancelled]
|
|
12
14
|
crow_ledger.py show [--run RUN] # process list for the chat (● main / ○ owner activity)
|
|
13
15
|
crow_ledger.py show --tree [--run RUN] # phase tree with ASCII bars, when the user asks for detail
|
|
@@ -37,6 +39,9 @@ import tempfile
|
|
|
37
39
|
SCHEMA = "crow-run/1"
|
|
38
40
|
UNIT_STATUSES = ("pending", "running", "done", "failed", "skipped")
|
|
39
41
|
RUN_STATUSES = ("running", "done", "failed", "cancelled")
|
|
42
|
+
RESOURCE_MODES = ("parallel", "reduced", "sequential")
|
|
43
|
+
RESOURCE_LEVELS = ("normal", "warn", "critical", "unknown")
|
|
44
|
+
RESOURCE_SOURCES = ("probe", "os", "assumed")
|
|
40
45
|
|
|
41
46
|
|
|
42
47
|
def now():
|
|
@@ -146,6 +151,39 @@ def locate(run_id=None, write=False):
|
|
|
146
151
|
return best[1], best[2]
|
|
147
152
|
|
|
148
153
|
|
|
154
|
+
def probe_decision(text):
|
|
155
|
+
"""Fields of a resources decision from `crow-skills resources --json` (envelope or bare document)."""
|
|
156
|
+
try:
|
|
157
|
+
data = json.loads(text)
|
|
158
|
+
except ValueError:
|
|
159
|
+
raise SystemExit("crow_ledger: --from-probe não é JSON.")
|
|
160
|
+
if isinstance(data, dict) and isinstance(data.get("data"), dict):
|
|
161
|
+
data = data["data"]
|
|
162
|
+
if not isinstance(data, dict) or data.get("schema") != "crow-resources/1":
|
|
163
|
+
raise SystemExit("crow_ledger: --from-probe não é um documento crow-resources/1.")
|
|
164
|
+
rec = data.get("recommendation") or {}
|
|
165
|
+
return {"mode": rec.get("mode"), "maxParallelAgents": rec.get("maxParallelAgents"),
|
|
166
|
+
"maxParallelHeavyJobs": rec.get("maxParallelHeavyJobs"), "maxWorkersPerJob": rec.get("maxWorkersPerJob"),
|
|
167
|
+
"pressure": (data.get("pressure") or {}).get("level"), "source": "probe"}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def resources_text(data):
|
|
171
|
+
value = data.get("resources")
|
|
172
|
+
if not isinstance(value, dict) or not value.get("mode"):
|
|
173
|
+
return ""
|
|
174
|
+
def count(key):
|
|
175
|
+
number = value.get(key)
|
|
176
|
+
return number if isinstance(number, int) and not isinstance(number, bool) else None
|
|
177
|
+
parts = [clean(value["mode"], 20)]
|
|
178
|
+
if count("maxParallelAgents") is not None:
|
|
179
|
+
parts.append("<=" + str(count("maxParallelAgents")) + " agente(s)")
|
|
180
|
+
if count("maxParallelHeavyJobs") is not None:
|
|
181
|
+
parts.append("<=" + str(count("maxParallelHeavyJobs")) + " job(s) pesado(s)")
|
|
182
|
+
if value.get("pressure"):
|
|
183
|
+
parts.append("pressão " + clean(value["pressure"], 20))
|
|
184
|
+
return "recursos: " + " - ".join(parts) + (" (" + clean(value["note"]) + ")" if value.get("note") else "")
|
|
185
|
+
|
|
186
|
+
|
|
149
187
|
def bar(fraction, width=20):
|
|
150
188
|
filled = int(round(max(0.0, min(1.0, fraction)) * width))
|
|
151
189
|
return "[" + "#" * filled + "-" * (width - filled) + "]"
|
|
@@ -203,6 +241,8 @@ def render(data):
|
|
|
203
241
|
icons = {"done": "x", "running": ">", "failed": "!", "pending": " ", "skipped": "-"}
|
|
204
242
|
lines = ["crow > " + clean(data.get("title")) + " [" + data.get("status", "running") + "]",
|
|
205
243
|
bar(overall) + " " + str(int(overall * 100)) + "% " + str(done) + "/" + str(len(counted)) + " unidades"]
|
|
244
|
+
if resources_text(data):
|
|
245
|
+
lines.append(resources_text(data))
|
|
206
246
|
phases = data.get("phases", []) or []
|
|
207
247
|
known = [p.get("id") for p in phases]
|
|
208
248
|
groups = [(p.get("title") or p.get("id"), [u for u in units if u.get("phase") == p.get("id")]) for p in phases]
|
|
@@ -245,6 +285,15 @@ def main(argv=None):
|
|
|
245
285
|
unit.add_argument("--status", choices=UNIT_STATUSES)
|
|
246
286
|
unit.add_argument("--progress", type=float)
|
|
247
287
|
unit.add_argument("--summary")
|
|
288
|
+
res = sub.add_parser("resources", help="registra a decisão de paralelismo (antes de um fan-out)")
|
|
289
|
+
res.add_argument("--from-probe", help="arquivo com a saída de crow-skills resources --json, ou - para stdin")
|
|
290
|
+
res.add_argument("--mode", choices=RESOURCE_MODES)
|
|
291
|
+
res.add_argument("--agents", type=int, help="máximo de agentes em paralelo decidido")
|
|
292
|
+
res.add_argument("--heavy", type=int, help="máximo de jobs pesados (build, suíte, dev server) em paralelo")
|
|
293
|
+
res.add_argument("--workers", type=int, help="workers por job (-j, --maxWorkers, pytest -n)")
|
|
294
|
+
res.add_argument("--pressure", choices=RESOURCE_LEVELS)
|
|
295
|
+
res.add_argument("--source", choices=RESOURCE_SOURCES, help="probe (crow-skills), os (comandos do sistema) ou assumed")
|
|
296
|
+
res.add_argument("--note", help="uma linha: o que foi decidido e por quê")
|
|
248
297
|
finish = sub.add_parser("finish")
|
|
249
298
|
finish.add_argument("--status", choices=RUN_STATUSES[1:], default="done")
|
|
250
299
|
for name in ("show", "path"):
|
|
@@ -253,7 +302,7 @@ def main(argv=None):
|
|
|
253
302
|
if name == "show":
|
|
254
303
|
child.add_argument("--tree", action="store_true", help="árvore de fases com barras, em vez da lista de processos")
|
|
255
304
|
child.add_argument("--ascii", action="store_true", help="lista de processos só com ASCII")
|
|
256
|
-
for child in (phase, unit, finish):
|
|
305
|
+
for child in (phase, unit, res, finish):
|
|
257
306
|
child.add_argument("--run")
|
|
258
307
|
args = p.parse_args(argv)
|
|
259
308
|
|
|
@@ -272,7 +321,7 @@ def main(argv=None):
|
|
|
272
321
|
save(path, data)
|
|
273
322
|
print(run_id + " " + str(path))
|
|
274
323
|
return 0
|
|
275
|
-
path, data = locate(getattr(args, "run", None), write=args.command in ("phase", "unit", "finish"))
|
|
324
|
+
path, data = locate(getattr(args, "run", None), write=args.command in ("phase", "unit", "resources", "finish"))
|
|
276
325
|
if args.command == "path":
|
|
277
326
|
print(path)
|
|
278
327
|
return 0
|
|
@@ -311,6 +360,30 @@ def main(argv=None):
|
|
|
311
360
|
entry["startedAt"] = entry["endedAt"]
|
|
312
361
|
if args.status in ("done", "skipped"):
|
|
313
362
|
entry["progress"] = 1.0
|
|
363
|
+
elif args.command == "resources":
|
|
364
|
+
decision = {}
|
|
365
|
+
if args.from_probe:
|
|
366
|
+
text = sys.stdin.read() if args.from_probe == "-" else Path(args.from_probe).expanduser().read_text(encoding="utf-8")
|
|
367
|
+
decision = probe_decision(text)
|
|
368
|
+
for field, key in (("mode", "mode"), ("agents", "maxParallelAgents"), ("heavy", "maxParallelHeavyJobs"),
|
|
369
|
+
("workers", "maxWorkersPerJob"), ("pressure", "pressure"), ("source", "source")):
|
|
370
|
+
if getattr(args, field) is not None:
|
|
371
|
+
decision[key] = getattr(args, field)
|
|
372
|
+
for key in ("maxParallelAgents", "maxParallelHeavyJobs", "maxWorkersPerJob"):
|
|
373
|
+
value = decision.get(key)
|
|
374
|
+
if value is not None and (isinstance(value, bool) or not isinstance(value, int) or not 0 <= value <= 256):
|
|
375
|
+
raise SystemExit("crow_ledger: " + key + " deve ser inteiro entre 0 e 256.")
|
|
376
|
+
if decision.get("pressure") is not None and decision["pressure"] not in RESOURCE_LEVELS:
|
|
377
|
+
raise SystemExit("crow_ledger: pressure deve ser " + ", ".join(RESOURCE_LEVELS) + ".")
|
|
378
|
+
if decision.get("source") is not None and decision["source"] not in RESOURCE_SOURCES:
|
|
379
|
+
raise SystemExit("crow_ledger: source deve ser " + ", ".join(RESOURCE_SOURCES) + ".")
|
|
380
|
+
if decision.get("mode") not in RESOURCE_MODES:
|
|
381
|
+
raise SystemExit("crow_ledger: informe --mode ou --from-probe.")
|
|
382
|
+
decision.setdefault("source", "assumed")
|
|
383
|
+
if args.note:
|
|
384
|
+
decision["note"] = clean(args.note, 160)
|
|
385
|
+
decision["checkedAt"] = now()
|
|
386
|
+
data["resources"] = {k: v for k, v in decision.items() if v is not None}
|
|
314
387
|
elif args.command == "finish":
|
|
315
388
|
data["status"] = args.status
|
|
316
389
|
data["endedAt"] = now()
|
|
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
|
|
|
21
21
|
4. Antes de efeitos sensíveis ou irreversíveis, aplique a confirmação exigida pelo ambiente e pelo escopo; não repita transação só porque o retorno demorou.
|
|
22
22
|
5. Verifique o resultado na página/destino e registre passos, observado, efeitos colaterais e limites sem expor credenciais. Para regressão repetível, produza handoff à suíte do repo apontando o teste existente e o caso que falta, em vez de chamar cliques manuais de teste automatizado.
|
|
23
23
|
|
|
24
|
+
Recursos da máquina: use uma sessão de navegador automatizado por vez, salvo necessidade explícita do pedido, e feche abas, contextos e instâncias headless que abriu. Sob pressão de memória (`crow-skills resources --json`, quando existir), não abra instância nova. 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 **browser-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.
|
|
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
|
|
|
21
21
|
4. Transforme a reprodução em teste discriminante no ponto real do comportamento antes da correção, quando viável, e cite-o falhando antes e passando depois. Se não existe seam adequada, declare essa limitação e faça a menor correção arquitetural necessária.
|
|
22
22
|
5. Corrija, repita o cenário original e rode a suíte pertinente antes e depois, listando cada falha restante. Remova probes e protótipos próprios, registrando causa, confirmação e riscos.
|
|
23
23
|
|
|
24
|
+
Recursos da máquina: a cada iteração rode o teste direcionado, não a suíte inteira, com workers limitados e um processo da aplicação por vez, reutilizando o que já roda; consulte `crow-skills resources --json` quando existir e, sob pressão `critical`, pare de iniciar processos novos. Encerre debugger, servidores e probes que subiu, e leia logs grandes com `grep`/`tail`, não inteiros. 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 **bug-fix** 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.
|
|
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
|
|
|
21
21
|
4. Respeite a versão do framework; não aplique APIs de React 19 a React 18. Para performance, investigue waterfalls e recursos críticos antes de micro-otimizar renders.
|
|
22
22
|
5. Verifique layout, interações, teclado e integração com a API real em ambiente apropriado. Relate mocks usados e verificações não executadas.
|
|
23
23
|
|
|
24
|
+
Recursos da máquina: antes de subir dev server, build ou suíte, consulte `crow-skills resources --json` quando existir e respeite `maxParallelHeavyJobs` e use `maxWorkersPerJob` só para baixar os workers que o bundler ou o runner já usam (`--maxWorkers`); sob pressão `critical`, não inicie processo pesado novo. Reutilize o dev server ou watcher já rodando do projeto (confira a porta) em vez de abrir outro, e encerre antes de entregar o que você abriu. 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 **ui-change** 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.
|