@andespindola/crow-skills 0.12.1 → 0.12.2

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Skills com escopo explícito, conhecimento especializado preservado e fluxos comuns reutilizáveis.
4
4
 
5
- **Versão 0.12.1** ([mudanças](CHANGELOG.md)): correção pequena na proteção de processos registrados e um teste instável. A 0.12.0 fez a crow-behaviour passar a encerrar a árvore inteira de todo processo que a execução inicia (com timeout, registro no ledger e verificação no fim) e `crow-skills resources --orphans` encontra e, com `--kill`, encerra só o que ficou órfão de ferramentas de agente. A 0.11.1 fez o Codex deixar de mostrar em dobro as skills que o Uniflow já projeta em `~/.codex/skills`. A 0.11.0 trouxe `crow-skills setup --yes`, que configura de uma vez todos os CLIs de agente da máquina, e `crow-skills upgrade --yes`, que atualiza tudo numa só passada; os hooks que o crow-skills grava já saem habilitados (no Codex, aprovados pelo próprio `codex app-server`, só os do crow-skills; `--no-trust` desliga) e `status`/`doctor` mostram se cada CLI vai rodá-los; a ajuda ficou curta e organizada por tarefa. A 0.10.1 passou a tratar swap e CPU como eixos de pressão no controle de recursos (swap quase cheio e carga alta reduzem agentes, jobs e workers; nenhuma recomendação cresce com a pressão), mostrou a CPU% dos CLIs de agente, trouxe `crow-skills resources --exec-prefix` para rodar jobs pesados em prioridade baixa e as regras da crow-behaviour sob pressão (reduzir já, um job pesado por vez, não repetir verificação, validação ampla no CI); os hooks do Codex vão para o `config.toml` quando o `hooks.json` é symlink. A 0.10.0 trouxe o crow-broadcast, que compartilha, de forma passiva, o que cada sessão e cada CLI (Claude Code, Codex, Gemini CLI, Antigravity, Devin, inclusive dentro do Uniflow) está fazendo nesta máquina: repositório, clone, branch, execução crow em andamento e arquivos em edição; o prompt recebe um resumo só quando outra sessão viva está no mesmo repositório, editar um arquivo que outra sessão tocou ou trocar de branch num clone em uso gera aviso (ou bloqueio, se configurado), e `crow-skills broadcast claim` reserva áreas; a crow-behaviour consulta isso antes de planejar e reserva as áreas que delega ([crow-broadcast](docs/broadcast.md)). A 0.9.0 trouxe o controle de memória da máquina: `crow-skills resources` mede memória, pressão e os CLIs de agente em execução e recomenda quantos agentes, jobs pesados e workers rodar em paralelo; a crow-behaviour consulta essa recomendação antes de cada fan-out (sob `warn` reduz, sob `critical` segue sequencial), limita workers de builds e testes, reutiliza um dev server por projeto e encerra o que abriu, e 15 especialistas que sobem processos pesados ganharam a regra correspondente; o hook de prompt e as status lines só avisam quando a máquina está sob pressão. A 0.8.0 trouxe `crow-skills mode on|off`, que liga e desliga a crow-behaviour em todas as sessões e CLIs (Claude Code, Codex, Gemini CLI, Antigravity, Devin) a partir do próximo prompt, com `/crow on|off` dentro da sessão e o indicador `▸▸ crow on` na status line; a crow-behaviour mostra o progresso como a lista de agentes do host (`● main`, `○ dono atividade`); `crow-skills events` publica um barramento de eventos dos hooks para terminais; `crow-skills autoupdate on` atualiza o CLI e as skills gerenciadas todo dia e no login. A 0.7.1 trouxe as correções da revalidação no Codex às skills especialistas; a 0.7.0 tornou o Uniflow agente de instalação (`--agents uniflow`); a 0.6.1 passou a mostrar o progresso da crow-behaviour na própria conversa; a 0.6.0 trouxe as regras de entrega das 32 skills especialistas, a partir da [validação no Codex](docs/evaluations/2026-10-26-codex.md).
5
+ **Versão 0.12.2** ([mudanças](CHANGELOG.md)): o snapshot de cada sessão (`crow-skills events snapshot`) passa a trazer o pid do CLI de agente e o terminal dele (`pid`, `tty`), para o crow-term achar o painel de cada sessão. A 0.12.1 corrigiu a proteção de processos registrados e um teste instável; a 0.12.0 fez a crow-behaviour passar a encerrar a árvore inteira de todo processo que a execução inicia (com timeout, registro no ledger e verificação no fim) e `crow-skills resources --orphans` encontra e, com `--kill`, encerra só o que ficou órfão de ferramentas de agente. A 0.11.1 fez o Codex deixar de mostrar em dobro as skills que o Uniflow já projeta em `~/.codex/skills`. A 0.11.0 trouxe `crow-skills setup --yes`, que configura de uma vez todos os CLIs de agente da máquina, e `crow-skills upgrade --yes`, que atualiza tudo numa só passada; os hooks que o crow-skills grava já saem habilitados (no Codex, aprovados pelo próprio `codex app-server`, só os do crow-skills; `--no-trust` desliga) e `status`/`doctor` mostram se cada CLI vai rodá-los; a ajuda ficou curta e organizada por tarefa. A 0.10.1 passou a tratar swap e CPU como eixos de pressão no controle de recursos (swap quase cheio e carga alta reduzem agentes, jobs e workers; nenhuma recomendação cresce com a pressão), mostrou a CPU% dos CLIs de agente, trouxe `crow-skills resources --exec-prefix` para rodar jobs pesados em prioridade baixa e as regras da crow-behaviour sob pressão (reduzir já, um job pesado por vez, não repetir verificação, validação ampla no CI); os hooks do Codex vão para o `config.toml` quando o `hooks.json` é symlink. A 0.10.0 trouxe o crow-broadcast, que compartilha, de forma passiva, o que cada sessão e cada CLI (Claude Code, Codex, Gemini CLI, Antigravity, Devin, inclusive dentro do Uniflow) está fazendo nesta máquina: repositório, clone, branch, execução crow em andamento e arquivos em edição; o prompt recebe um resumo só quando outra sessão viva está no mesmo repositório, editar um arquivo que outra sessão tocou ou trocar de branch num clone em uso gera aviso (ou bloqueio, se configurado), e `crow-skills broadcast claim` reserva áreas; a crow-behaviour consulta isso antes de planejar e reserva as áreas que delega ([crow-broadcast](docs/broadcast.md)). A 0.9.0 trouxe o controle de memória da máquina: `crow-skills resources` mede memória, pressão e os CLIs de agente em execução e recomenda quantos agentes, jobs pesados e workers rodar em paralelo; a crow-behaviour consulta essa recomendação antes de cada fan-out (sob `warn` reduz, sob `critical` segue sequencial), limita workers de builds e testes, reutiliza um dev server por projeto e encerra o que abriu, e 15 especialistas que sobem processos pesados ganharam a regra correspondente; o hook de prompt e as status lines só avisam quando a máquina está sob pressão. A 0.8.0 trouxe `crow-skills mode on|off`, que liga e desliga a crow-behaviour em todas as sessões e CLIs (Claude Code, Codex, Gemini CLI, Antigravity, Devin) a partir do próximo prompt, com `/crow on|off` dentro da sessão e o indicador `▸▸ crow on` na status line; a crow-behaviour mostra o progresso como a lista de agentes do host (`● main`, `○ dono atividade`); `crow-skills events` publica um barramento de eventos dos hooks para terminais; `crow-skills autoupdate on` atualiza o CLI e as skills gerenciadas todo dia e no login. A 0.7.1 trouxe as correções da revalidação no Codex às skills especialistas; a 0.7.0 tornou o Uniflow agente de instalação (`--agents uniflow`); a 0.6.1 passou a mostrar o progresso da crow-behaviour na própria conversa; a 0.6.0 trouxe as regras de entrega das 32 skills especialistas, a partir da [validação no Codex](docs/evaluations/2026-10-26-codex.md).
6
6
 
7
7
  **Reconstrução em andamento.** A primeira versão com 32 contratos genéricos não atende à preservação de capacidades solicitada. Não use esse número nem o mapeamento por categoria como prova de substituição das originais. A revisão passa a abranger cada definição e seus recursos, modos e dependências, sem número fixo de skills ou limite artificial de linhas. Veja [critérios e progresso](docs/reconstruction.md).
8
8
 
@@ -42,7 +42,7 @@ Exemplos:
42
42
  O pacote de cada skill é somente sua pasta em `skills/`. O [CLI crow-skills](docs/cli.md) instala cópias completas e versionadas em agentes/escopos explícitos, com preview, saída JSON, detecção de conflitos e recuperação. Requer Python 3.10+; Git para fontes em clone, Node 18+ para o launcher npm; mutações em macOS/Linux. A distribuição npm privada `@andespindola/crow-skills` inclui um snapshot completo das skills, sem clone ou hooks que as instalem automaticamente. No [Uniflow](docs/cli.md#uniflow), `--agents uniflow --global` grava as skills no store dele (`~/.config/uniflow/skills`), sem tocar no resto da configuração. Em `--global`, instalar a crow-behaviour também grava o guia aditivo do agente (claude, codex, gemini, devin) para usar as skills; `--no-guide` desliga. As integrações de interface (status lines do Claude Code, do Codex e do Antigravity, hooks do modo crow em cada CLI, comando `/crow`, segmento tmux) seguem o mesmo fluxo, preservando a configuração existente; `--no-integrations` desliga. O [barramento de eventos](docs/events.md) e a atualização automática (`crow-skills autoupdate on`) estão no [CLI](docs/cli.md).
43
43
 
44
44
  ```sh
45
- npm install -g @andespindola/crow-skills@0.12.1
45
+ npm install -g @andespindola/crow-skills@0.12.2
46
46
  crow-skills mode
47
47
  crow-skills progress
48
48
  ./bin/crow-skills list
@@ -1,3 +1,3 @@
1
1
  """Portable, local-first installer for the crow-skills catalogue."""
2
2
 
3
- __version__ = "0.12.1"
3
+ __version__ = "0.12.2"
@@ -461,7 +461,42 @@ def pid_alive(pid):
461
461
  return None # exists but not ours, or unknown: fall back to the heartbeat
462
462
 
463
463
 
464
- def fold(snap, event, touched=(), now=None, ppid=None, cli_pid=None):
464
+ TTY_TIMEOUT = 1.0
465
+ TTY_TRIES = 2
466
+
467
+
468
+ def tty_lookup(pid, runner=None):
469
+ """(tty, answered): the controlling terminal of pid as a device path (``/dev/ttys012``,
470
+ ``/dev/pts/3``) or None, and whether ``ps`` actually answered (False on error, timeout or a
471
+ non-POSIX system, so the caller may retry later). One ``ps -o tty= -p PID`` limited to
472
+ TTY_TIMEOUT; never raises."""
473
+ if not isinstance(pid, int) or isinstance(pid, bool) or pid <= 1 or os.name != "posix":
474
+ return None, False
475
+ try:
476
+ if runner is None:
477
+ import subprocess
478
+ done = subprocess.run(["ps", "-o", "tty=", "-p", str(pid)], stdin=subprocess.DEVNULL, capture_output=True,
479
+ text=True, timeout=TTY_TIMEOUT)
480
+ if done.returncode != 0:
481
+ return None, done.returncode == 1 # 1: no such process (a definite answer)
482
+ out = done.stdout
483
+ else:
484
+ out = runner(pid)
485
+ except Exception: # noqa: BLE001 - a missing tty is never an error
486
+ return None, False
487
+ name = (out or "").strip().splitlines()[0].strip() if (out or "").strip() else ""
488
+ base = name[len("/dev/"):] if name.startswith("/dev/") else name
489
+ if not base or base.strip("?-") == "" or not re.fullmatch(r"[A-Za-z0-9._-][A-Za-z0-9/._-]{0,63}", base) or ".." in base:
490
+ return None, True
491
+ return "/dev/" + base, True
492
+
493
+
494
+ def tty_of(pid, runner=None):
495
+ """Controlling terminal of pid as a device path, or None (see tty_lookup)."""
496
+ return tty_lookup(pid, runner)[0]
497
+
498
+
499
+ def fold(snap, event, touched=(), now=None, ppid=None, cli_pid=None, tty_runner=None):
465
500
  """Update the session snapshot's presence object (in place) for one event.
466
501
 
467
502
  cli_pid: the agent CLI resolved from a process table (Stop/SessionEnd); once known and alive it
@@ -483,6 +518,29 @@ def fold(snap, event, touched=(), now=None, ppid=None, cli_pid=None):
483
518
  if ppid:
484
519
  presence["pidStable"] = presence.get("pid") == ppid
485
520
  presence["pid"] = ppid
521
+ # Top-level, for terminal multiplexers that match a session to a pane (crow-term): the agent CLI pid and
522
+ # its controlling terminal, only once the pid is stable (the resolved CLI, or the same hook parent on two
523
+ # events in a row; a transient ``sh -c`` wrapper never qualifies) and each only when known.
524
+ pid = presence.get("pid")
525
+ stable = isinstance(pid, int) and (pid == presence.get("cliPid") or presence.get("pidStable"))
526
+ if stable and presence.get("ttyPid") != pid: # one short ps per stable pid (retried if ps did not answer)
527
+ presence.pop("tty", None)
528
+ tty, answered = tty_lookup(pid, tty_runner)
529
+ tries = presence.get("ttyTries") if isinstance(presence.get("ttyTries"), list) and presence["ttyTries"][:1] == [pid] else [pid, 0]
530
+ tries = [pid, int(tries[1]) + 1 if isinstance(tries[1], int) else 1]
531
+ presence["ttyTries"] = tries
532
+ if answered or tries[1] >= TTY_TRIES: # a ps that failed or timed out is retried once, never per event
533
+ presence["ttyPid"] = pid
534
+ if tty:
535
+ presence["tty"] = tty
536
+ if stable:
537
+ snap["pid"] = pid
538
+ else:
539
+ snap.pop("pid", None)
540
+ if stable and presence.get("ttyPid") == pid and presence.get("tty"):
541
+ snap["tty"] = presence["tty"]
542
+ else:
543
+ snap.pop("tty", None)
486
544
  files = [f for f in presence.get("files") or [] if isinstance(f, dict) and isinstance(f.get("path"), str)
487
545
  and now - (parse_time(f.get("ts")) or 0) <= FILE_TTL]
488
546
  for path in touched:
package/docs/cli.md CHANGED
@@ -1,4 +1,4 @@
1
- # crow-skills CLI 0.12.1
1
+ # crow-skills CLI 0.12.2
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
 
@@ -81,7 +81,7 @@ Para testar/distribuir o arquivo local sem registry:
81
81
 
82
82
  ```sh
83
83
  npm pack
84
- npm install -g ./andespindola-crow-skills-0.12.1.tgz --ignore-scripts
84
+ npm install -g ./andespindola-crow-skills-0.12.2.tgz --ignore-scripts
85
85
  ```
86
86
 
87
87
  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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/crow-skills",
3
- "version": "0.12.1",
3
+ "version": "0.12.2",
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": "ca600ff64f0c3d794b42135654c172dd040b6284f8b79f291dbe854481fe37b7"
6
+ "sha256": "0f62137b76ad0ac3d810f75944bf89930f4067ca21824afec8d7dfece52957de"
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": "72d65fe5e39f0cfc22e0bbfd54dbc9e0e443b2c34afd95c986e42f5df20dca20"
21
+ "sha256": "dcc3c77f4c7140af30bd170bc5f5a0c9ea234255056aba679b52014b4efa757d"
22
22
  },
23
23
  "crow_skills/__main__.py": {
24
24
  "executable": false,
@@ -38,7 +38,7 @@
38
38
  "crow_skills/broadcast.py": {
39
39
  "executable": false,
40
40
  "kind": "file",
41
- "sha256": "9ddc3cabd933813d24335cbd44c062a2894132e4c101c4e849965387411ce495"
41
+ "sha256": "f7e36eed476c5ae74e9185e55e7e8ee8ce38427561e26972ad14f7810f2899b0"
42
42
  },
43
43
  "crow_skills/cli.py": {
44
44
  "executable": false,
@@ -123,12 +123,12 @@
123
123
  "docs/cli.md": {
124
124
  "executable": false,
125
125
  "kind": "file",
126
- "sha256": "445940b764248e25bf71800a8aed9e184b2c6527b5bf90ccd7a4dc49d2ff0d6b"
126
+ "sha256": "37c8f2ac0f6e9360c5b507258c40df46295503952561353ea66883df40929bcb"
127
127
  },
128
128
  "package.json": {
129
129
  "executable": false,
130
130
  "kind": "file",
131
- "sha256": "5f74bd91fb0a725d1c73f685add978f46d77dde016c3c47f07cbf9c3e5bfd5ca"
131
+ "sha256": "71600ce34d6eb20348f8257423dfc17cd55d7146f28bb58a52bc99d8b39205ad"
132
132
  },
133
133
  "skills/crow-accessibility/SKILL.md": {
134
134
  "executable": false,
@@ -696,7 +696,7 @@
696
696
  "sha256": "e37132ef8b060548191fbf14a5a18a9dd3acd84ea9a35e802174455b9e374d3d"
697
697
  }
698
698
  },
699
- "revision": "993780fce9cee8136ab10bcfd460148fd65508c5",
699
+ "revision": "ac4064b80b4f3cd8057ec1bd177fadf58a95a8e8",
700
700
  "schema_version": 1,
701
- "version": "0.12.1"
701
+ "version": "0.12.2"
702
702
  }