@irythill/orq 0.1.0 → 0.2.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/LICENSE +21 -21
- package/README.md +241 -240
- package/README.pt-BR.md +242 -241
- package/dist/cli.js +24 -22
- package/dist/commands/block.js +2 -2
- package/dist/commands/board.js +1 -1
- package/dist/commands/claim.js +1 -1
- package/dist/commands/completion.js +43 -43
- package/dist/commands/config.js +2 -2
- package/dist/commands/gc.js +164 -0
- package/dist/commands/instructions.js +7 -7
- package/dist/commands/lock.js +1 -1
- package/dist/commands/pick.js +23 -3
- package/dist/commands/quota.js +32 -2
- package/dist/commands/setup.js +3 -3
- package/dist/config.js +1 -1
- package/dist/pick.js +11 -0
- package/dist/quota.js +67 -9
- package/package.json +48 -27
- package/skills/issue/SKILL.md +229 -197
- package/skills/orq-setup/SKILL.md +114 -114
- package/skills/orq-status/SKILL.md +37 -37
- package/templates/workspace.CLAUDE.md +49 -49
package/README.pt-BR.md
CHANGED
|
@@ -1,241 +1,242 @@
|
|
|
1
|
-
[English](README.md) · **Português**
|
|
2
|
-
|
|
3
|
-
<p align="center"><img src="docs/img/orq-logo.svg" alt="orq — um orc de fraque erguendo a batuta de maestro" width="304"></p>
|
|
4
|
-
|
|
5
|
-
# orq — orquestrando agentes de código com o herdr
|
|
6
|
-
|
|
7
|
-
Você descreve o trabalho numa issue do Plane. Um **conductor** (Claude, de preferência Opus) lê a issue, escolhe o
|
|
8
|
-
agente certo para cada etapa, despacha o **implementador**, os **testes** e uma **review cross-vendor** em abas do
|
|
9
|
-
[herdr](https://herdr.dev), e devolve a issue *In Review* com um resumo no Plane. Merge, PR e deploy continuam com você.
|
|
10
|
-
|
|
11
|
-
O que o orq **não** decide por você: quais agentes você tem, quanto cada um pode gastar e como você gosta de
|
|
12
|
-
trabalhar. Tudo isso fica na sua config.
|
|
13
|
-
|
|
14
|
-
> Nasceu do uso diário numa empresa de saúde: 3–5 issues em paralelo num
|
|
15
|
-
> OpenCode, Antigravity e Copilot. A história, os números e as lições: **[docs/pt-BR/case-study.md](docs/pt-BR/case-study.md)**.
|
|
16
|
-
>
|
|
17
|
-
> 🚧 = ainda não disponível.
|
|
18
|
-
|
|
19
|
-
## Como funciona
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
You ── "/issue DEMO-123" ──► conductor (Claude in herdr)
|
|
23
|
-
│ orq-pick impl ──► which agent/model implements (config + history + quota)
|
|
24
|
-
├─► implementer herdr-agent own tab · worktree from origin/<base> · memory cap
|
|
25
|
-
├─► tests herdr-verify only the diff's tests · queue of one suite at a time
|
|
26
|
-
│ orq-pick review ─► a reviewer from ANOTHER vendor
|
|
27
|
-
├─► reviewer herdr-agent -r read only · diff + criteria + test results attached
|
|
28
|
-
└─► Plane comment, state, labels
|
|
29
|
-
◄── "[HERDR-AGENT DONE] ..." in the conductor's pane (the only completion signal)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
- **Cada etapa numa aba do herdr.** Você acompanha ao vivo e a aba fecha quando termina. Os resultados ficam em
|
|
33
|
-
`.orquestra/<ID>/` (`.out.md`, `.log`, `.done`).
|
|
34
|
-
- **Ordem fixa em toda rodada:** implementador ok → testes sem falha nova → review. Um problema bloqueante vira uma
|
|
35
|
-
rodada de correção na própria sessão do implementador (com máximo configurável).
|
|
36
|
-
- **Ninguém escolhe agente no feeling.** O `orq-pick` decide com base em dados: o que cada agente entregou no
|
|
37
|
-
histórico, quantos tokens gastou, quanto tempo levou, a quota atual e um rodízio para nenhum agente ficar com todo o
|
|
38
|
-
trabalho.
|
|
39
|
-
- **A máquina não cai.** Cada agente roda com seu próprio limite de memória; os testes esperam numa fila.
|
|
40
|
-
|
|
41
|
-
## Agentes suportados
|
|
42
|
-
|
|
43
|
-
| Agente | CLI | Papéis possíveis | Observações |
|
|
44
|
-
|---|---|---|---|
|
|
45
|
-
| Claude Code | `claude` | conductor, implement, review | várias contas (`claude-accounts`); Opus como conductor |
|
|
46
|
-
| Codex | `codex` | implement, review | sandbox sem rede: o conductor roda o `git fetch` |
|
|
47
|
-
| OpenCode | `opencode` | implement, review | qualquer provider (ex.: MiniMax) |
|
|
48
|
-
| Antigravity | `agy` | review | em modo headless nega comandos fora da allowlist: faz a review lendo o diff anexado |
|
|
49
|
-
| GitHub Copilot | `copilot` | segunda opinião | cota pequena em alguns planos: uso ocasional |
|
|
50
|
-
|
|
51
|
-
Você declara só os que tem, e os papéis que cada um pode assumir.
|
|
52
|
-
|
|
53
|
-
## Instalação
|
|
54
|
-
|
|
55
|
-
Linux, macOS ou Windows (nativo, não só WSL), em qualquer shell — bash, zsh, fish, PowerShell, cmd.
|
|
56
|
-
**Requisitos:** Node 20+ com `npm`, `git`, e pelo menos um agente da tabela acima, logado. Opcional:
|
|
57
|
-
[herdr](https://herdr.dev) ou tmux, para cada filho ter sua própria aba ou janela (sem eles, os filhos rodam em
|
|
58
|
-
segundo plano e o `orq board` mostra todos).
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
npm i -g @irythill/orq
|
|
62
|
-
orq setup
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
O `orq setup` mostra o que encontrou (git, terminal, como a memória é limitada, chaveiro, seu shell), liga as skills
|
|
66
|
-
do orq em `~/.claude/skills/` e em cada pasta de conta do `claude-accounts` (uma junction no Windows; nunca por cima
|
|
67
|
-
de uma pasta sua), pergunta sobre seus agentes e planos, escreve o `~/.config/orq/config.toml`
|
|
68
|
-
(`%APPDATA%\orq\config.toml` no Windows) e prepara a pasta que agrupa seus repos para o conductor: `.orquestra/`, o
|
|
69
|
-
mapa `CLAUDE.md` e o playbook do `/issue` no formato do conductor. Partes avulsas: `orq setup --install` (sem
|
|
70
|
-
perguntas), `orq setup --workspace <pasta> --conductor <agente>`. Dentro do Claude, o **`/orq-setup`** faz o mesmo
|
|
71
|
-
como conversa e ainda preenche a tabela de repos. Plane: [docs/pt-BR/plane.md](docs/pt-BR/plane.md).
|
|
72
|
-
|
|
73
|
-
**Limite de memória:** um scope do systemd no Linux com sessão de usuário; senão, um vigia (macOS, Windows, WSL sem
|
|
74
|
-
systemd). **Chaveiro** (cota do Antigravity, cota do Claude no macOS): Secret Service, Keychain ou Credential Manager
|
|
75
|
-
pelo `@napi-rs/keyring`; sem o módulo nativo, `secret-tool`/`security`.
|
|
76
|
-
|
|
77
|
-
### Autocompletar no shell
|
|
78
|
-
|
|
79
|
-
| Shell | Como ligar |
|
|
80
|
-
|---|---|
|
|
81
|
-
| bash | `echo 'eval "$(orq completion bash)"' >> ~/.bashrc` |
|
|
82
|
-
| zsh | `echo 'eval "$(orq completion zsh)"' >> ~/.zshrc` (depois do `compinit`) |
|
|
83
|
-
| fish | `orq completion fish > ~/.config/fish/completions/orq.fish` |
|
|
84
|
-
| PowerShell | `Add-Content $PROFILE 'orq completion powershell \| Out-String \| Invoke-Expression'` |
|
|
85
|
-
| cmd | sem autocompletar programável |
|
|
86
|
-
|
|
87
|
-
### Extras do Linux a partir de um clone: `install.sh` (opcional)
|
|
88
|
-
|
|
89
|
-
Para o herdr como serviço sempre ligado, o plugin dele e os nomes antigos dos scripts (`herdr-*`, `orq-*`,
|
|
90
|
-
`agent-quota`):
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
# herdr (testado na 0.9.3)
|
|
94
|
-
curl -fsSL https://herdr.dev/install.sh -o /tmp/herdr-install.sh && less /tmp/herdr-install.sh && sh /tmp/herdr-install.sh
|
|
95
|
-
git clone https://github.com/irythill/orq ~/Code/orq && cd ~/Code/orq
|
|
96
|
-
./install.sh # links em ~/.local/bin, serviço do herdr, skills do Claude
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
Precisa de `git`, `jq`, Node 20+ com `npm`, `python3` (3.11+ para config em TOML; mais antigo → config em JSON ou
|
|
100
|
-
`pip install --user tomli`) e `systemd` de usuário (WSL2: Ubuntu 22.04+ com systemd habilitado). O `install.sh`
|
|
101
|
-
confere os requisitos (tabela do que foi encontrado e do que falta), compila o CLI `orq` (`src/` → `dist/`) e depois
|
|
102
|
-
cria **symlinks** (nunca copia) dos scripts em `~/.local/bin`, do `setup/herdr.service` em `~/.config/systemd/user/`
|
|
103
|
-
(e habilita o serviço), e de cada skill em `~/.claude/skills/` e em cada pasta de conta listada em
|
|
104
|
-
`~/.config/claude-accounts`. É idempotente: rode de novo depois de um `git pull` ou de uma conta nova. Nunca
|
|
105
|
-
sobrescreve um arquivo de verdade (avisa e pula) e nunca escreve a sua config.
|
|
106
|
-
|
|
107
|
-
| Flag | O que faz |
|
|
108
|
-
|---|---|
|
|
109
|
-
| `--dry-run` | mostra o que faria, sem mudar nada |
|
|
110
|
-
| `--uninstall` | remove só os links que ele cria, e só os que apontam para este repo (config e histórico ficam) |
|
|
111
|
-
|
|
112
|
-
## Configuração
|
|
113
|
-
|
|
114
|
-
Duas camadas, para separar **o seu jeito de trabalhar** do **projeto do time**:
|
|
115
|
-
|
|
116
|
-
| Arquivo | De quem | O que guarda |
|
|
117
|
-
|---|---|---|
|
|
118
|
-
| `~/.config/orq/config.toml` | seu, fica na sua máquina | agentes, contas, modelos por papel e nível, pesos do pick, limites de memória |
|
|
119
|
-
| `<workspace>/.orq/workspace.toml` 🚧 | do time, versionado | Plane (projetos, padrão de issue), repos, branch base, verificação, testes, dependências |
|
|
120
|
-
|
|
121
|
-
O mais específico ganha, chave por chave. JSON também funciona (`config.json`). Para ver o resultado mesclado:
|
|
122
|
-
`orq-config` (tudo), `orq-config get policy.weights`, `orq-config files`.
|
|
123
|
-
|
|
124
|
-
### Exemplo: config pessoal
|
|
125
|
-
Exemplo completo e comentado: [`examples/irythill/config.toml`](examples/irythill/config.toml). O essencial:
|
|
126
|
-
|
|
127
|
-
```toml
|
|
128
|
-
[agents.codex]
|
|
129
|
-
vendor = "openai"
|
|
130
|
-
roles = ["impl", "fix", "review"]
|
|
131
|
-
quota = ["codex"] # name in agent-quota's output
|
|
132
|
-
[agents.codex.models.impl]
|
|
133
|
-
simple = "gpt-6-sol@low" # model@effort
|
|
134
|
-
heavy = "gpt-6.1-sol@medium"
|
|
135
|
-
|
|
136
|
-
[agents.opencode]
|
|
137
|
-
vendor = "minimax"
|
|
138
|
-
roles = ["review"] # here it only reviews; for someone else it may implement
|
|
139
|
-
[agents.opencode.models.review]
|
|
140
|
-
default = "minimax/MiniMax-M3"
|
|
141
|
-
|
|
142
|
-
[policy]
|
|
143
|
-
quota_limit = 90 # ≥ 90% used → agent out
|
|
144
|
-
[policy.weights]
|
|
145
|
-
quality = 0.40 # did it deliver? (impl: approved on the first review)
|
|
146
|
-
tokens = 0.45 # did it spend little?
|
|
147
|
-
speed = 0.15
|
|
148
|
-
rotation = 0.20 # penalty for having been picked recently
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Como o `orq-pick` escolhe
|
|
152
|
-
1. **Filtros:** só agentes com aquele papel, abaixo do limite de quota, não bloqueados (`orq-block`) e, para reviews,
|
|
153
|
-
de um vendor diferente do implementador. Com várias contas, pega a menos usada.
|
|
154
|
-
2. **Pontuação:** `quality × delivery + tokens × economy + speed × quickness − rotation × recent picks`. Os números vêm
|
|
155
|
-
do histórico (`orq-stats`); um agente com poucas execuções usa o `prior` da config e ganha um bônus de exploração.
|
|
156
|
-
3. **Agentes com `reserve = true`** (ex.: Claude, que divide quota com o conductor) só entram quando nada mais serve.
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
orq-pick review --impl-agent codex --explain # every candidate's score and who was left out, and why
|
|
160
|
-
orq-stats --days 30 # scoreboard: delivery, approval, time and tokens per agent and model
|
|
161
|
-
orq-block antigravity --days 3 # out of the picks (e.g. weekly quota gone, no collector for it)
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Idioma e tema
|
|
165
|
-
O orq fala inglês e português: mensagens da CLI, `herdr-board`, avisos e `install.sh`. Ele segue `[ui] lang` na sua
|
|
166
|
-
config (`"auto"` = idioma do sistema, `"en"`, `"pt"`) ou a variável de ambiente `ORQ_LANG`. Para trocar a qualquer
|
|
167
|
-
momento:
|
|
168
|
-
- `orq-lang pt` / `orq-lang en` / `orq-lang toggle` (`orq-lang` sozinho mostra o atual);
|
|
169
|
-
- a tecla `l` dentro do `orq board`;
|
|
170
|
-
- uma tecla no herdr: o `install.sh` liga o plugin `orq` do herdr; associe a ação `orq.lang-toggle` (trecho pronto em
|
|
171
|
-
`herdr-plugin/herdr-plugin.toml`) — por exemplo, `prefix+shift+l` — e a `orq.board` para abrir o painel por cima.
|
|
172
|
-
|
|
173
|
-
O `orq board` tem visual próprio, inspirado no portfólio [SYNTH.DECK](https://github.com/irythill/synth-deck-portfolio):
|
|
174
|
-
`[ui] theme = "gunmetal"` (padrão, grafite escuro), `"chrome"` (prata claro), `"lcd"` (verde fósforo) ou `"terminal"`
|
|
175
|
-
(as cores do seu terminal). A tecla `t` dentro do painel alterna entre eles (`ORQ_THEME` tem prioridade).
|
|
176
|
-
|
|
177
|
-
O que já está rodando continua no idioma em que começou. Os conductors sempre falam com você no seu idioma.
|
|
178
|
-
|
|
179
|
-
## Uso diário
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
herdr # abre a janela (o servidor roda como serviço)
|
|
183
|
-
cd ~/Code/<workspace> && herdr-conductor # dentro de um pane do herdr: abre o conductor (conta e modelo opcionais)
|
|
184
|
-
```
|
|
185
|
-
No conductor: **`/issue DEMO-123`**. Ele responde numa linha e segue sozinho a cada `[HERDR-AGENT DONE]`. Você só volta
|
|
186
|
-
quando ele pede uma decisão ou avisa que terminou.
|
|
187
|
-
|
|
188
|
-
Para ver tudo de uma vez, deixe o **`orq board`** aberto numa aba ou janela (qualquer terminal, qualquer SO; o
|
|
189
|
-
`herdr-board` o chama): fila de testes, agentes rodando (modelo, memória contra o limite, última ação), conductors e
|
|
190
|
-
suas issues, memória, quota, bloqueios e o placar de 7 dias. `--once` imprime uma vez, `--json` para scripts. Com
|
|
191
|
-
`ui.toast.delivery = "system"` na config do herdr, cada etapa concluída também gera uma notificação nativa do sistema.
|
|
192
|
-
|
|
193
|
-
Várias issues ao mesmo tempo: um conductor por issue (de preferência em contas diferentes). O `herdr-claim` impede que
|
|
194
|
-
dois conductors peguem a mesma issue. Detalhes, atalhos e cenários: [docs/pt-BR/herdr.md](docs/pt-BR/herdr.md).
|
|
195
|
-
|
|
196
|
-
## Skills
|
|
197
|
-
|
|
198
|
-
| Skill | Para quê | Status |
|
|
199
|
-
|---|---|---|
|
|
200
|
-
| `/issue <ID>` | Fluxo completo: issue → implementação → testes → review → Plane | pronta |
|
|
201
|
-
| `/orq-setup` | Setup guiado: agentes, contas, repos, verificação | pronta |
|
|
202
|
-
| `/review <PR or branch>` | Review cruzada de algo pronto (ex.: PR de um colega), sem implementação | 🚧 |
|
|
203
|
-
| `/investigate <question>` | Um agente só-leitura investiga um bug ou trecho de código e reporta | 🚧 |
|
|
204
|
-
| `/orq-status` | Resumo no chat: fila, agentes rodando, placar e quota | pronta |
|
|
205
|
-
|
|
206
|
-
## Comandos
|
|
207
|
-
|
|
208
|
-
| Comando | O que faz |
|
|
209
|
-
|---|---|
|
|
210
|
-
| `orq agent -a <agent> ...` (`herdr-agent`) | Roda um agente com limite de memória numa aba do herdr, numa janela do tmux ou em segundo plano; `-r` só leitura, `-R <id>` continua a sessão, `-i` anexa um arquivo, `-b <base>` anexa o diff, `-T` a tela do próprio agente (só herdr) |
|
|
211
|
-
| `orq instructions claude\|agents` | Escreve o playbook do `/issue` como `SKILL.md` (Claude Code) ou dentro do `AGENTS.md` (Codex, OpenCode…) |
|
|
212
|
-
| `orq wait <prefixo>...` | Bloqueia até esses agentes terminarem; imprime `status=` e o arquivo da resposta (qualquer conductor, qualquer terminal) |
|
|
213
|
-
| `orq verify ...` (`herdr-verify`) | Testes relacionados ao diff, em fila e com limite de memória; falhas que também falham na base contam como pré-existentes |
|
|
214
|
-
| `orq board` (`herdr-board`) | Painel ao vivo: fila, agentes, conductors, cota, bloqueios, placar |
|
|
215
|
-
| `herdr-conductor` | Abre o conductor no pane atual |
|
|
216
|
-
| `herdr-claim` | Dono de cada issue entre os conductors |
|
|
217
|
-
| `herdr-deps` | Liga as dependências do worktree às do repo principal (sem reinstalar) |
|
|
218
|
-
| `orq baseline ...` (`herdr-baseline`) | Snapshot manual dos testes que falham na base (fora do fluxo) |
|
|
219
|
-
| `orq
|
|
220
|
-
| `orq
|
|
221
|
-
| `orq
|
|
222
|
-
| `
|
|
223
|
-
| `
|
|
224
|
-
| `orq-
|
|
225
|
-
| `orq-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
- [docs/pt-BR/
|
|
231
|
-
- [docs/pt-BR/
|
|
232
|
-
- [docs/pt-BR/
|
|
233
|
-
- [docs/pt-BR/
|
|
234
|
-
- [docs/pt-BR/
|
|
235
|
-
- [docs/pt-BR/
|
|
236
|
-
- [
|
|
237
|
-
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
1
|
+
[English](README.md) · **Português**
|
|
2
|
+
|
|
3
|
+
<p align="center"><img src="docs/img/orq-logo.svg" alt="orq — um orc de fraque erguendo a batuta de maestro" width="304"></p>
|
|
4
|
+
|
|
5
|
+
# orq — orquestrando agentes de código com o herdr
|
|
6
|
+
|
|
7
|
+
Você descreve o trabalho numa issue do Plane. Um **conductor** (Claude, de preferência Opus) lê a issue, escolhe o
|
|
8
|
+
agente certo para cada etapa, despacha o **implementador**, os **testes** e uma **review cross-vendor** em abas do
|
|
9
|
+
[herdr](https://herdr.dev), e devolve a issue *In Review* com um resumo no Plane. Merge, PR e deploy continuam com você.
|
|
10
|
+
|
|
11
|
+
O que o orq **não** decide por você: quais agentes você tem, quanto cada um pode gastar e como você gosta de
|
|
12
|
+
trabalhar. Tudo isso fica na sua config.
|
|
13
|
+
|
|
14
|
+
> Nasceu do uso diário numa empresa de saúde: 3–5 issues em paralelo num PC de 14 GB, usando Claude Code, Codex,
|
|
15
|
+
> OpenCode, Antigravity e Copilot. A história, os números e as lições: **[docs/pt-BR/case-study.md](docs/pt-BR/case-study.md)**.
|
|
16
|
+
>
|
|
17
|
+
> 🚧 = ainda não disponível.
|
|
18
|
+
|
|
19
|
+
## Como funciona
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
You ── "/issue DEMO-123" ──► conductor (Claude in herdr)
|
|
23
|
+
│ orq-pick impl ──► which agent/model implements (config + history + quota)
|
|
24
|
+
├─► implementer herdr-agent own tab · worktree from origin/<base> · memory cap
|
|
25
|
+
├─► tests herdr-verify only the diff's tests · queue of one suite at a time
|
|
26
|
+
│ orq-pick review ─► a reviewer from ANOTHER vendor
|
|
27
|
+
├─► reviewer herdr-agent -r read only · diff + criteria + test results attached
|
|
28
|
+
└─► Plane comment, state, labels
|
|
29
|
+
◄── "[HERDR-AGENT DONE] ..." in the conductor's pane (the only completion signal)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- **Cada etapa numa aba do herdr.** Você acompanha ao vivo e a aba fecha quando termina. Os resultados ficam em
|
|
33
|
+
`.orquestra/<ID>/` (`.out.md`, `.log`, `.done`).
|
|
34
|
+
- **Ordem fixa em toda rodada:** implementador ok → testes sem falha nova → review. Um problema bloqueante vira uma
|
|
35
|
+
rodada de correção na própria sessão do implementador (com máximo configurável).
|
|
36
|
+
- **Ninguém escolhe agente no feeling.** O `orq-pick` decide com base em dados: o que cada agente entregou no
|
|
37
|
+
histórico, quantos tokens gastou, quanto tempo levou, a quota atual e um rodízio para nenhum agente ficar com todo o
|
|
38
|
+
trabalho.
|
|
39
|
+
- **A máquina não cai.** Cada agente roda com seu próprio limite de memória; os testes esperam numa fila.
|
|
40
|
+
|
|
41
|
+
## Agentes suportados
|
|
42
|
+
|
|
43
|
+
| Agente | CLI | Papéis possíveis | Observações |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| Claude Code | `claude` | conductor, implement, review | várias contas (`claude-accounts`); Opus como conductor |
|
|
46
|
+
| Codex | `codex` | implement, review | sandbox sem rede: o conductor roda o `git fetch` |
|
|
47
|
+
| OpenCode | `opencode` | implement, review | qualquer provider (ex.: MiniMax) |
|
|
48
|
+
| Antigravity | `agy` | review | em modo headless nega comandos fora da allowlist: faz a review lendo o diff anexado |
|
|
49
|
+
| GitHub Copilot | `copilot` | segunda opinião | cota pequena em alguns planos: uso ocasional |
|
|
50
|
+
|
|
51
|
+
Você declara só os que tem, e os papéis que cada um pode assumir.
|
|
52
|
+
|
|
53
|
+
## Instalação
|
|
54
|
+
|
|
55
|
+
Linux, macOS ou Windows (nativo, não só WSL), em qualquer shell — bash, zsh, fish, PowerShell, cmd.
|
|
56
|
+
**Requisitos:** Node 20+ com `npm`, `git`, e pelo menos um agente da tabela acima, logado. Opcional:
|
|
57
|
+
[herdr](https://herdr.dev) ou tmux, para cada filho ter sua própria aba ou janela (sem eles, os filhos rodam em
|
|
58
|
+
segundo plano e o `orq board` mostra todos).
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm i -g @irythill/orq
|
|
62
|
+
orq setup
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
O `orq setup` mostra o que encontrou (git, terminal, como a memória é limitada, chaveiro, seu shell), liga as skills
|
|
66
|
+
do orq em `~/.claude/skills/` e em cada pasta de conta do `claude-accounts` (uma junction no Windows; nunca por cima
|
|
67
|
+
de uma pasta sua), pergunta sobre seus agentes e planos, escreve o `~/.config/orq/config.toml`
|
|
68
|
+
(`%APPDATA%\orq\config.toml` no Windows) e prepara a pasta que agrupa seus repos para o conductor: `.orquestra/`, o
|
|
69
|
+
mapa `CLAUDE.md` e o playbook do `/issue` no formato do conductor. Partes avulsas: `orq setup --install` (sem
|
|
70
|
+
perguntas), `orq setup --workspace <pasta> --conductor <agente>`. Dentro do Claude, o **`/orq-setup`** faz o mesmo
|
|
71
|
+
como conversa e ainda preenche a tabela de repos. Plane: [docs/pt-BR/plane.md](docs/pt-BR/plane.md).
|
|
72
|
+
|
|
73
|
+
**Limite de memória:** um scope do systemd no Linux com sessão de usuário; senão, um vigia (macOS, Windows, WSL sem
|
|
74
|
+
systemd). **Chaveiro** (cota do Antigravity, cota do Claude no macOS): Secret Service, Keychain ou Credential Manager
|
|
75
|
+
pelo `@napi-rs/keyring`; sem o módulo nativo, `secret-tool`/`security`.
|
|
76
|
+
|
|
77
|
+
### Autocompletar no shell
|
|
78
|
+
|
|
79
|
+
| Shell | Como ligar |
|
|
80
|
+
|---|---|
|
|
81
|
+
| bash | `echo 'eval "$(orq completion bash)"' >> ~/.bashrc` |
|
|
82
|
+
| zsh | `echo 'eval "$(orq completion zsh)"' >> ~/.zshrc` (depois do `compinit`) |
|
|
83
|
+
| fish | `orq completion fish > ~/.config/fish/completions/orq.fish` |
|
|
84
|
+
| PowerShell | `Add-Content $PROFILE 'orq completion powershell \| Out-String \| Invoke-Expression'` |
|
|
85
|
+
| cmd | sem autocompletar programável |
|
|
86
|
+
|
|
87
|
+
### Extras do Linux a partir de um clone: `install.sh` (opcional)
|
|
88
|
+
|
|
89
|
+
Para o herdr como serviço sempre ligado, o plugin dele e os nomes antigos dos scripts (`herdr-*`, `orq-*`,
|
|
90
|
+
`agent-quota`):
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# herdr (testado na 0.9.3)
|
|
94
|
+
curl -fsSL https://herdr.dev/install.sh -o /tmp/herdr-install.sh && less /tmp/herdr-install.sh && sh /tmp/herdr-install.sh
|
|
95
|
+
git clone https://github.com/irythill/orq ~/Code/orq && cd ~/Code/orq
|
|
96
|
+
./install.sh # links em ~/.local/bin, serviço do herdr, skills do Claude
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Precisa de `git`, `jq`, Node 20+ com `npm`, `python3` (3.11+ para config em TOML; mais antigo → config em JSON ou
|
|
100
|
+
`pip install --user tomli`) e `systemd` de usuário (WSL2: Ubuntu 22.04+ com systemd habilitado). O `install.sh`
|
|
101
|
+
confere os requisitos (tabela do que foi encontrado e do que falta), compila o CLI `orq` (`src/` → `dist/`) e depois
|
|
102
|
+
cria **symlinks** (nunca copia) dos scripts em `~/.local/bin`, do `setup/herdr.service` em `~/.config/systemd/user/`
|
|
103
|
+
(e habilita o serviço), e de cada skill em `~/.claude/skills/` e em cada pasta de conta listada em
|
|
104
|
+
`~/.config/claude-accounts`. É idempotente: rode de novo depois de um `git pull` ou de uma conta nova. Nunca
|
|
105
|
+
sobrescreve um arquivo de verdade (avisa e pula) e nunca escreve a sua config.
|
|
106
|
+
|
|
107
|
+
| Flag | O que faz |
|
|
108
|
+
|---|---|
|
|
109
|
+
| `--dry-run` | mostra o que faria, sem mudar nada |
|
|
110
|
+
| `--uninstall` | remove só os links que ele cria, e só os que apontam para este repo (config e histórico ficam) |
|
|
111
|
+
|
|
112
|
+
## Configuração
|
|
113
|
+
|
|
114
|
+
Duas camadas, para separar **o seu jeito de trabalhar** do **projeto do time**:
|
|
115
|
+
|
|
116
|
+
| Arquivo | De quem | O que guarda |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| `~/.config/orq/config.toml` | seu, fica na sua máquina | agentes, contas, modelos por papel e nível, pesos do pick, limites de memória |
|
|
119
|
+
| `<workspace>/.orq/workspace.toml` 🚧 | do time, versionado | Plane (projetos, padrão de issue), repos, branch base, verificação, testes, dependências |
|
|
120
|
+
|
|
121
|
+
O mais específico ganha, chave por chave. JSON também funciona (`config.json`). Para ver o resultado mesclado:
|
|
122
|
+
`orq-config` (tudo), `orq-config get policy.weights`, `orq-config files`.
|
|
123
|
+
|
|
124
|
+
### Exemplo: config pessoal
|
|
125
|
+
Exemplo completo e comentado: [`examples/irythill/config.toml`](examples/irythill/config.toml). O essencial:
|
|
126
|
+
|
|
127
|
+
```toml
|
|
128
|
+
[agents.codex]
|
|
129
|
+
vendor = "openai"
|
|
130
|
+
roles = ["impl", "fix", "review"]
|
|
131
|
+
quota = ["codex"] # name in agent-quota's output
|
|
132
|
+
[agents.codex.models.impl]
|
|
133
|
+
simple = "gpt-6-sol@low" # model@effort
|
|
134
|
+
heavy = "gpt-6.1-sol@medium"
|
|
135
|
+
|
|
136
|
+
[agents.opencode]
|
|
137
|
+
vendor = "minimax"
|
|
138
|
+
roles = ["review"] # here it only reviews; for someone else it may implement
|
|
139
|
+
[agents.opencode.models.review]
|
|
140
|
+
default = "minimax/MiniMax-M3"
|
|
141
|
+
|
|
142
|
+
[policy]
|
|
143
|
+
quota_limit = 90 # ≥ 90% used → agent out
|
|
144
|
+
[policy.weights]
|
|
145
|
+
quality = 0.40 # did it deliver? (impl: approved on the first review)
|
|
146
|
+
tokens = 0.45 # did it spend little?
|
|
147
|
+
speed = 0.15
|
|
148
|
+
rotation = 0.20 # penalty for having been picked recently
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Como o `orq-pick` escolhe
|
|
152
|
+
1. **Filtros:** só agentes com aquele papel, abaixo do limite de quota, não bloqueados (`orq-block`) e, para reviews,
|
|
153
|
+
de um vendor diferente do implementador. Com várias contas, pega a menos usada.
|
|
154
|
+
2. **Pontuação:** `quality × delivery + tokens × economy + speed × quickness − rotation × recent picks`. Os números vêm
|
|
155
|
+
do histórico (`orq-stats`); um agente com poucas execuções usa o `prior` da config e ganha um bônus de exploração.
|
|
156
|
+
3. **Agentes com `reserve = true`** (ex.: Claude, que divide quota com o conductor) só entram quando nada mais serve.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
orq-pick review --impl-agent codex --explain # every candidate's score and who was left out, and why
|
|
160
|
+
orq-stats --days 30 # scoreboard: delivery, approval, time and tokens per agent and model
|
|
161
|
+
orq-block antigravity --days 3 # out of the picks (e.g. weekly quota gone, no collector for it)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Idioma e tema
|
|
165
|
+
O orq fala inglês e português: mensagens da CLI, `herdr-board`, avisos e `install.sh`. Ele segue `[ui] lang` na sua
|
|
166
|
+
config (`"auto"` = idioma do sistema, `"en"`, `"pt"`) ou a variável de ambiente `ORQ_LANG`. Para trocar a qualquer
|
|
167
|
+
momento:
|
|
168
|
+
- `orq-lang pt` / `orq-lang en` / `orq-lang toggle` (`orq-lang` sozinho mostra o atual);
|
|
169
|
+
- a tecla `l` dentro do `orq board`;
|
|
170
|
+
- uma tecla no herdr: o `install.sh` liga o plugin `orq` do herdr; associe a ação `orq.lang-toggle` (trecho pronto em
|
|
171
|
+
`herdr-plugin/herdr-plugin.toml`) — por exemplo, `prefix+shift+l` — e a `orq.board` para abrir o painel por cima.
|
|
172
|
+
|
|
173
|
+
O `orq board` tem visual próprio, inspirado no portfólio [SYNTH.DECK](https://github.com/irythill/synth-deck-portfolio):
|
|
174
|
+
`[ui] theme = "gunmetal"` (padrão, grafite escuro), `"chrome"` (prata claro), `"lcd"` (verde fósforo) ou `"terminal"`
|
|
175
|
+
(as cores do seu terminal). A tecla `t` dentro do painel alterna entre eles (`ORQ_THEME` tem prioridade).
|
|
176
|
+
|
|
177
|
+
O que já está rodando continua no idioma em que começou. Os conductors sempre falam com você no seu idioma.
|
|
178
|
+
|
|
179
|
+
## Uso diário
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
herdr # abre a janela (o servidor roda como serviço)
|
|
183
|
+
cd ~/Code/<workspace> && herdr-conductor # dentro de um pane do herdr: abre o conductor (conta e modelo opcionais)
|
|
184
|
+
```
|
|
185
|
+
No conductor: **`/issue DEMO-123`**. Ele responde numa linha e segue sozinho a cada `[HERDR-AGENT DONE]`. Você só volta
|
|
186
|
+
quando ele pede uma decisão ou avisa que terminou.
|
|
187
|
+
|
|
188
|
+
Para ver tudo de uma vez, deixe o **`orq board`** aberto numa aba ou janela (qualquer terminal, qualquer SO; o
|
|
189
|
+
`herdr-board` o chama): fila de testes, agentes rodando (modelo, memória contra o limite, última ação), conductors e
|
|
190
|
+
suas issues, memória, quota, bloqueios e o placar de 7 dias. `--once` imprime uma vez, `--json` para scripts. Com
|
|
191
|
+
`ui.toast.delivery = "system"` na config do herdr, cada etapa concluída também gera uma notificação nativa do sistema.
|
|
192
|
+
|
|
193
|
+
Várias issues ao mesmo tempo: um conductor por issue (de preferência em contas diferentes). O `herdr-claim` impede que
|
|
194
|
+
dois conductors peguem a mesma issue. Detalhes, atalhos e cenários: [docs/pt-BR/herdr.md](docs/pt-BR/herdr.md).
|
|
195
|
+
|
|
196
|
+
## Skills
|
|
197
|
+
|
|
198
|
+
| Skill | Para quê | Status |
|
|
199
|
+
|---|---|---|
|
|
200
|
+
| `/issue <ID>` | Fluxo completo: issue → implementação → testes → review → Plane | pronta |
|
|
201
|
+
| `/orq-setup` | Setup guiado: agentes, contas, repos, verificação | pronta |
|
|
202
|
+
| `/review <PR or branch>` | Review cruzada de algo pronto (ex.: PR de um colega), sem implementação | 🚧 |
|
|
203
|
+
| `/investigate <question>` | Um agente só-leitura investiga um bug ou trecho de código e reporta | 🚧 |
|
|
204
|
+
| `/orq-status` | Resumo no chat: fila, agentes rodando, placar e quota | pronta |
|
|
205
|
+
|
|
206
|
+
## Comandos
|
|
207
|
+
|
|
208
|
+
| Comando | O que faz |
|
|
209
|
+
|---|---|
|
|
210
|
+
| `orq agent -a <agent> ...` (`herdr-agent`) | Roda um agente com limite de memória numa aba do herdr, numa janela do tmux ou em segundo plano; `-r` só leitura, `-R <id>` continua a sessão, `-i` anexa um arquivo, `-b <base>` anexa o diff, `-T` a tela do próprio agente (só herdr) |
|
|
211
|
+
| `orq instructions claude\|agents` | Escreve o playbook do `/issue` como `SKILL.md` (Claude Code) ou dentro do `AGENTS.md` (Codex, OpenCode…) |
|
|
212
|
+
| `orq wait <prefixo>...` | Bloqueia até esses agentes terminarem; imprime `status=` e o arquivo da resposta (qualquer conductor, qualquer terminal) |
|
|
213
|
+
| `orq verify ...` (`herdr-verify`) | Testes relacionados ao diff, em fila e com limite de memória; falhas que também falham na base contam como pré-existentes |
|
|
214
|
+
| `orq board` (`herdr-board`) | Painel ao vivo: fila, agentes, conductors, cota, bloqueios, placar |
|
|
215
|
+
| `herdr-conductor` | Abre o conductor no pane atual |
|
|
216
|
+
| `herdr-claim` | Dono de cada issue entre os conductors |
|
|
217
|
+
| `herdr-deps` | Liga as dependências do worktree às do repo principal (sem reinstalar) |
|
|
218
|
+
| `orq baseline ...` (`herdr-baseline`) | Snapshot manual dos testes que falham na base (fora do fluxo) |
|
|
219
|
+
| `orq gc [-w <workspace>] [--yes]` | Lista worktrees de issues seguras para remover; `--yes` as remove |
|
|
220
|
+
| `orq setup` | Primeira configuração e instalação: ambiente, skills do Claude, config, workspace do conductor |
|
|
221
|
+
| `orq completion bash\|zsh\|fish\|powershell` | Imprime o script de autocompletar do shell (veja Instalação) |
|
|
222
|
+
| `orq <config\|set\|lang\|block\|quota>` | O CLI multiplataforma (TypeScript); os nomes `orq-*` e `agent-quota` abaixo chamam ele |
|
|
223
|
+
| `agent-quota` | Quota atual de cada agente e conta; se a leitura falha, vale a última boa até a janela resetar |
|
|
224
|
+
| `orq-config` · `orq-pick` · `orq-stats` · `orq-block` | Configuração, escolha de agente, placar, bloqueios manuais |
|
|
225
|
+
| `orq-lang` | Mostra ou troca o idioma das mensagens do orq (en/pt) |
|
|
226
|
+
| `orq-set <seção> <chave> <valor>` | Grava um valor na sua config do orq (ex.: `orq-set ui theme lcd`) |
|
|
227
|
+
|
|
228
|
+
## Mais
|
|
229
|
+
|
|
230
|
+
- [docs/pt-BR/case-study.md](docs/pt-BR/case-study.md) — como isso surgiu, com números reais
|
|
231
|
+
- [docs/pt-BR/plane.md](docs/pt-BR/plane.md) — Plane self-hosted via MCP
|
|
232
|
+
- [docs/pt-BR/claude-accounts.md](docs/pt-BR/claude-accounts.md) — várias contas do Claude
|
|
233
|
+
- [docs/pt-BR/herdr.md](docs/pt-BR/herdr.md) — herdr no dia a dia, atalhos, várias issues ao mesmo tempo
|
|
234
|
+
- [docs/pt-BR/troubleshooting.md](docs/pt-BR/troubleshooting.md) — problemas conhecidos e soluções
|
|
235
|
+
- [docs/pt-BR/omarchy.md](docs/pt-BR/omarchy.md) — extras para quem usa Omarchy
|
|
236
|
+
- [docs/pt-BR/portability.md](docs/pt-BR/portability.md) — o roadmap: Linux, macOS e Windows nativo, qualquer agente como conductor, papéis definidos pelo usuário, setup guiado
|
|
237
|
+
- [CHANGELOG.pt-BR.md](CHANGELOG.pt-BR.md) — o que mudou, versão a versão
|
|
238
|
+
- `examples/` — configurações reais para copiar
|
|
239
|
+
|
|
240
|
+
## Licença
|
|
241
|
+
|
|
242
|
+
[MIT](LICENSE)
|
package/dist/cli.js
CHANGED
|
@@ -12,6 +12,7 @@ import { claim, USAGE as CLAIM } from "./commands/claim.js";
|
|
|
12
12
|
import { completion, USAGE as COMPLETION } from "./commands/completion.js";
|
|
13
13
|
import { config, USAGE as CONFIG } from "./commands/config.js";
|
|
14
14
|
import { deps, USAGE as DEPS } from "./commands/deps.js";
|
|
15
|
+
import { gc, USAGE as GC } from "./commands/gc.js";
|
|
15
16
|
import { instructions, USAGE as INSTRUCTIONS } from "./commands/instructions.js";
|
|
16
17
|
import { lang, USAGE as LANG } from "./commands/lang.js";
|
|
17
18
|
import { lock, USAGE as LOCK } from "./commands/lock.js";
|
|
@@ -23,29 +24,30 @@ import { setup, USAGE as SETUP } from "./commands/setup.js";
|
|
|
23
24
|
import { stats, USAGE as STATS } from "./commands/stats.js";
|
|
24
25
|
import { verify, USAGE as VERIFY } from "./commands/verify.js";
|
|
25
26
|
import { wait, USAGE as WAIT } from "./commands/wait.js";
|
|
26
|
-
const COMMANDS = { config, set, board, lang, block, quota, pick, stats, setup, lock, claim, deps, run, agent, wait, instructions, verify, baseline,
|
|
27
|
+
const COMMANDS = { config, set, board, lang, block, quota, pick, stats, setup, lock, claim, deps, gc, run, agent, wait, instructions, verify, baseline,
|
|
27
28
|
completion: (a) => completion(a, Object.keys(COMMANDS)) };
|
|
28
|
-
const usage = () => `orq <command> [args]
|
|
29
|
-
|
|
30
|
-
${SETUP}
|
|
31
|
-
${CONFIG}
|
|
32
|
-
${SET}
|
|
33
|
-
${LANG}
|
|
34
|
-
${QUOTA}
|
|
35
|
-
${PICK}
|
|
36
|
-
${STATS}
|
|
37
|
-
${BOARD}
|
|
38
|
-
${LOCK}
|
|
39
|
-
${RUN}
|
|
40
|
-
${AGENT}
|
|
41
|
-
${WAIT}
|
|
42
|
-
${VERIFY}
|
|
43
|
-
${BASELINE}
|
|
44
|
-
${INSTRUCTIONS}
|
|
45
|
-
${CLAIM}
|
|
46
|
-
${DEPS}
|
|
47
|
-
${
|
|
48
|
-
${
|
|
29
|
+
const usage = () => `orq <command> [args]
|
|
30
|
+
|
|
31
|
+
${SETUP}
|
|
32
|
+
${CONFIG}
|
|
33
|
+
${SET}
|
|
34
|
+
${LANG}
|
|
35
|
+
${QUOTA}
|
|
36
|
+
${PICK}
|
|
37
|
+
${STATS}
|
|
38
|
+
${BOARD}
|
|
39
|
+
${LOCK}
|
|
40
|
+
${RUN}
|
|
41
|
+
${AGENT}
|
|
42
|
+
${WAIT}
|
|
43
|
+
${VERIFY}
|
|
44
|
+
${BASELINE}
|
|
45
|
+
${INSTRUCTIONS}
|
|
46
|
+
${CLAIM}
|
|
47
|
+
${DEPS}
|
|
48
|
+
${GC}
|
|
49
|
+
${COMPLETION}
|
|
50
|
+
${BLOCK.split("\n")[0]}
|
|
49
51
|
(orq block --help ${m("for more", "para mais")})`;
|
|
50
52
|
async function main(argv) {
|
|
51
53
|
try {
|
package/dist/commands/block.js
CHANGED
|
@@ -6,8 +6,8 @@ import { join } from "node:path";
|
|
|
6
6
|
import { writeAtomic } from "../fsutil.js";
|
|
7
7
|
import { m } from "../i18n.js";
|
|
8
8
|
import { stateDir } from "../paths.js";
|
|
9
|
-
export const USAGE = `orq block <agent|account> [--until YYYY-MM-DD[THH:MM] | --days N] [--reason "text"] default: 7 days
|
|
10
|
-
orq block -r <agent|account> unblock early
|
|
9
|
+
export const USAGE = `orq block <agent|account> [--until YYYY-MM-DD[THH:MM] | --days N] [--reason "text"] default: 7 days
|
|
10
|
+
orq block -r <agent|account> unblock early
|
|
11
11
|
orq block -l list active blocks (expired ones disappear by themselves)`;
|
|
12
12
|
const file = () => join(stateDir(), "blocks.json");
|
|
13
13
|
const now = () => Date.now() / 1000;
|
package/dist/commands/board.js
CHANGED
|
@@ -153,7 +153,7 @@ export function parseQuota(text) {
|
|
|
153
153
|
return r ? [{ name: r[1], five: r[2], week: r[3], ...(r[4] ? { note: r[4] } : {}) }] : [];
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
|
-
function quota(now) {
|
|
156
|
+
export function quota(now) {
|
|
157
157
|
let age;
|
|
158
158
|
try {
|
|
159
159
|
age = now - statSync(qfile()).mtimeMs;
|
package/dist/commands/claim.js
CHANGED
|
@@ -12,7 +12,7 @@ import { m } from "../i18n.js";
|
|
|
12
12
|
import { acquire, release } from "../lock.js";
|
|
13
13
|
export const USAGE = `orq claim [-w <workspace>] <ID> | -f <ID> | -r <ID> | -l issue owner among conductors (exit 1 = someone else's)`;
|
|
14
14
|
const field = (text, k) => new RegExp(`${k}=(\\S+)`).exec(text)?.[1] ?? "";
|
|
15
|
-
function aliveOwner(text) {
|
|
15
|
+
export function aliveOwner(text) {
|
|
16
16
|
const id = field(text, "pane"), kind = field(text, "kind") || "herdr";
|
|
17
17
|
if (kind === "herdr")
|
|
18
18
|
return spawnSync("herdr", ["agent", "get", id], { stdio: "ignore" }).status === 0;
|