@orkastery/cli 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 -0
- package/README.md +87 -0
- package/adapters/README.md +22 -0
- package/adapters/claude-code/.claude-plugin/marketplace.json +15 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +31 -0
- package/adapters/claude-code/README.md +102 -0
- package/adapters/claude-code/agents/ork-check.md +32 -0
- package/adapters/claude-code/agents/ork-go.md +32 -0
- package/adapters/claude-code/agents/ork-goal.md +33 -0
- package/adapters/claude-code/agents/ork-master.md +32 -0
- package/adapters/claude-code/agents/ork-plan.md +32 -0
- package/adapters/claude-code/agents/ork-ship.md +32 -0
- package/adapters/claude-code/commands/check.md +45 -0
- package/adapters/claude-code/commands/go.md +46 -0
- package/adapters/claude-code/commands/goal.md +54 -0
- package/adapters/claude-code/commands/master.md +42 -0
- package/adapters/claude-code/commands/ork.md +37 -0
- package/adapters/claude-code/commands/plan.md +47 -0
- package/adapters/claude-code/commands/ship.md +45 -0
- package/adapters/claude-code/hooks/hooks.json +17 -0
- package/adapters/claude-code/hooks/ork-guard.js +130 -0
- package/adapters/hermes/README.md +45 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +25 -0
- package/adapters/hermes/hermes.plugin.json +21 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +116 -0
- package/adapters/openclaw/README.md +63 -0
- package/adapters/openclaw/bin/ork-abrir-thread.sh +24 -0
- package/adapters/openclaw/openclaw.plugin.json +138 -0
- package/dist/adapters/claude-bg.js +308 -0
- package/dist/auditoria.js +848 -0
- package/dist/auditrun.js +976 -0
- package/dist/board.js +314 -0
- package/dist/canarios.js +271 -0
- package/dist/catalogo.js +124 -0
- package/dist/ciclos.js +156 -0
- package/dist/claims.js +226 -0
- package/dist/divida.js +374 -0
- package/dist/doctor.js +246 -0
- package/dist/evalrunner.js +458 -0
- package/dist/fix.js +450 -0
- package/dist/gates.js +92 -0
- package/dist/handoff.js +521 -0
- package/dist/hosts.js +331 -0
- package/dist/index.js +1910 -0
- package/dist/init.js +231 -0
- package/dist/leases.js +508 -0
- package/dist/ledger.js +138 -0
- package/dist/manifest.js +255 -0
- package/dist/master.js +453 -0
- package/dist/memoria.js +773 -0
- package/dist/modos.js +220 -0
- package/dist/orkmind.js +487 -0
- package/dist/orquestracao.js +559 -0
- package/dist/phase.js +572 -0
- package/dist/policies.js +176 -0
- package/dist/prompts.js +406 -0
- package/dist/ratelimit.js +179 -0
- package/dist/recall.js +252 -0
- package/dist/retry.js +917 -0
- package/dist/sandbox.js +94 -0
- package/dist/sessoes.js +104 -0
- package/dist/ship.js +551 -0
- package/dist/slug.js +100 -0
- package/dist/superficie.js +1347 -0
- package/dist/thread.js +333 -0
- package/dist/tokens.js +228 -0
- package/dist/types.js +20 -0
- package/dist/util.js +156 -0
- package/dist/verify.js +262 -0
- package/dist/worktree.js +576 -0
- package/dist/yaml.js +112 -0
- package/eval/README.md +85 -0
- package/eval/casos/check-quality.json +103 -0
- package/eval/casos/code-reviewer.json +102 -0
- package/eval/casos/decision-triage.json +103 -0
- package/eval/casos/go-implementation.json +103 -0
- package/eval/casos/goal-definition.json +103 -0
- package/eval/casos/master-metrics.json +103 -0
- package/eval/casos/narrative-guardian.json +163 -0
- package/eval/casos/orkastery-bootstrap.json +102 -0
- package/eval/casos/plan-specification.json +102 -0
- package/eval/casos/roadmap-keeper.json +103 -0
- package/eval/casos/scope-check-capability-map.json +83 -0
- package/eval/casos/security-auditor.json +102 -0
- package/eval/casos/ship-release.json +122 -0
- package/eval/casos/test-engineer.json +122 -0
- package/eval/casos/thread-state.json +82 -0
- package/eval/casos/thread-tracing.json +83 -0
- package/eval/casos/web-performance-auditor.json +102 -0
- package/eval/fixtures/b0-slug-e-modos/caso.json +56 -0
- package/eval/fixtures/b2-master-log/caso.json +91 -0
- package/eval/fixtures/fx-concurrency/caso.json +15 -0
- package/eval/fixtures/fx-hallucination/caso.json +12 -0
- package/eval/fixtures/fx-happy/caso.json +16 -0
- package/eval/fixtures/fx-schema-drift/caso.json +15 -0
- package/eval/fixtures/fx-stale-base/caso.json +12 -0
- package/eval/fixtures/fx-wiki-destroy/caso.json +16 -0
- package/eval/fixtures/superficie-de-rede/README.md +22 -0
- package/eval/fixtures/superficie-de-rede/api-express.js +30 -0
- package/eval/fixtures/superficie-de-rede/api_fastapi.py +17 -0
- package/eval/fixtures/superficie-de-rede/api_gin.go +18 -0
- package/package.json +56 -0
- package/references/README.md +25 -0
- package/references/code-review-axes.md +82 -0
- package/references/definition-of-done.md +74 -0
- package/references/performance-checklist.md +53 -0
- package/references/security-checklist.md +101 -0
- package/references/testing-patterns.md +51 -0
- package/skills/README.md +43 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +89 -0
- package/skills/core/thread-state/SKILL.md +86 -0
- package/skills/governance/decision-triage/SKILL.md +65 -0
- package/skills/governance/narrative-guardian/SKILL.md +66 -0
- package/skills/governance/roadmap-keeper/SKILL.md +60 -0
- package/skills/governance/scope-check-capability-map/SKILL.md +61 -0
- package/skills/observability/thread-tracing/SKILL.md +63 -0
- package/skills/phases/check-quality/SKILL.md +87 -0
- package/skills/phases/go-implementation/SKILL.md +70 -0
- package/skills/phases/goal-definition/SKILL.md +69 -0
- package/skills/phases/master-metrics/SKILL.md +65 -0
- package/skills/phases/plan-specification/SKILL.md +67 -0
- package/skills/phases/ship-release/SKILL.md +68 -0
- package/skills/reviewers/code-reviewer/SKILL.md +61 -0
- package/skills/reviewers/security-auditor/SKILL.md +68 -0
- package/skills/reviewers/test-engineer/SKILL.md +66 -0
- package/skills/reviewers/web-performance-auditor/SKILL.md +63 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Fecha a thread com POSTMORTEM tipado e o score humano de 0 a 5.
|
|
3
|
+
argument-hint: "<thread-id> --score 0-5"
|
|
4
|
+
allowed-tools: Bash(ork:*), Read, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /master
|
|
8
|
+
|
|
9
|
+
Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado e o score humano com justificativa. Uma entrega sem MASTER log nao aconteceu.
|
|
10
|
+
|
|
11
|
+
## O que este comando faz
|
|
12
|
+
|
|
13
|
+
1. Mostra ao builder as classes de falha do catalogo fixo:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
ork master classes
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Pede ao builder o score e a justificativa. **O score e do humano, em todos os modos.** Este
|
|
20
|
+
comando nunca inventa nota.
|
|
21
|
+
|
|
22
|
+
3. Fecha a thread:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ork master <thread> --score <0-5> --justificativa "<texto>" --classe <classe> --por "<quem>"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
4. Nos modos sem pausa de MASTER, mostra a fila que ainda espera humano:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ork master --batch
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Regras do adaptador
|
|
35
|
+
|
|
36
|
+
- **Zero regra de negocio aqui.** Este comando traduz intencao em chamada de `ork` e nada mais.
|
|
37
|
+
Quem valida modo, monta prompt, decide gate e prova entrega e o nucleo.
|
|
38
|
+
- **A #TAG vem do pedido, nao de configuracao.** O modo sai de `ork modos --do-pedido`, que usa a
|
|
39
|
+
mesma funcao do nucleo; sem tag vale o `conduction.default_mode` do manifesto. A validacao
|
|
40
|
+
contra `conduction.allowed_modes` acontece dentro do `ork thread new`, nunca aqui.
|
|
41
|
+
- **Nada de escrever codigo de produto neste comando.** Quem escreve e a sessao que o `ork`
|
|
42
|
+
despacha, com o prompt gravado e o sha no ledger.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Painel do Orkastery: estado das threads, escalonador, modos e o que a maquina permite agora.
|
|
3
|
+
argument-hint: "[board|plan|doctor|modos]"
|
|
4
|
+
allowed-tools: Bash(ork:*), Read
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /ork
|
|
8
|
+
|
|
9
|
+
Entrada geral do adaptador. Nao conduz fase nenhuma: mostra o estado e diz qual comando responde
|
|
10
|
+
pela intencao do builder.
|
|
11
|
+
|
|
12
|
+
## O que este comando faz
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
ork doctor # o que vale nesta maquina agora (sai != 0 se bloqueado)
|
|
16
|
+
ork board # todas as threads em uma visao
|
|
17
|
+
ork board plan # quem avanca agora, quem espera e por que
|
|
18
|
+
ork modos # a tabela dos 5 modos de conducao por #TAG
|
|
19
|
+
ork master --batch # o que fechou e ainda espera score humano
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Roteamento
|
|
23
|
+
|
|
24
|
+
| O builder quer | Comando |
|
|
25
|
+
|---|---|
|
|
26
|
+
| abrir demanda nova | `/goal <pedido com #TAG>` |
|
|
27
|
+
| especificar | `/plan <thread>` |
|
|
28
|
+
| implementar | `/go <thread>` |
|
|
29
|
+
| verificar | `/check <thread>` |
|
|
30
|
+
| entregar | `/ship <thread>` |
|
|
31
|
+
| fechar e dar o score | `/master <thread>` |
|
|
32
|
+
|
|
33
|
+
## Regras do adaptador
|
|
34
|
+
|
|
35
|
+
- **Zero regra de negocio aqui.** Este comando le e apresenta; quem decide e o humano e quem
|
|
36
|
+
verifica e o `ork`.
|
|
37
|
+
- Um `fail` do `ork doctor` para o ciclo antes de ele abrir, e isso e economia, nao obstaculo.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Conduz a fase PLAN da thread pelo `ork`.
|
|
3
|
+
argument-hint: "<thread-id> [observacao]"
|
|
4
|
+
allowed-tools: Bash(ork:*), Read, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /plan
|
|
8
|
+
|
|
9
|
+
Fase PLAN (F2): tarefas fatiadas com `touch_paths` e verify por tarefa, decisoes D1..Dn com domicilio unico. PLAN nao implementa.
|
|
10
|
+
|
|
11
|
+
## O que este comando faz
|
|
12
|
+
|
|
13
|
+
1. Le o estado real da thread antes de qualquer coisa:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
ork thread status <thread>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Despacha a fase:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
ork phase run <thread> PLAN --prompt "<o que o plano precisa cobrir>"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
3. Reserva as regioes que o plano declarou tocar, para que outra thread nao escreva por cima:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
ork lease acquire "path:<glob>" --thread <thread> --motivo "PLAN reservou a regiao"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
4. Exporta o handoff tipado para a fase seguinte, em vez de confiar na memoria da sessao:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
ork handoff export <thread> --proxima-fase GO
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
5. Se o modo pausa, apresenta os tradeoffs com opcoes e uma recomendacao, e espera o veredito.
|
|
38
|
+
|
|
39
|
+
## Regras do adaptador
|
|
40
|
+
|
|
41
|
+
- **Zero regra de negocio aqui.** Este comando traduz intencao em chamada de `ork` e nada mais.
|
|
42
|
+
Quem valida modo, monta prompt, decide gate e prova entrega e o nucleo.
|
|
43
|
+
- **A #TAG vem do pedido, nao de configuracao.** O modo sai de `ork modos --do-pedido`, que usa a
|
|
44
|
+
mesma funcao do nucleo; sem tag vale o `conduction.default_mode` do manifesto. A validacao
|
|
45
|
+
contra `conduction.allowed_modes` acontece dentro do `ork thread new`, nunca aqui.
|
|
46
|
+
- **Nada de escrever codigo de produto neste comando.** Quem escreve e a sessao que o `ork`
|
|
47
|
+
despacha, com o prompt gravado e o sha no ledger.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Entrega a thread pelo `ork ship`: merge serializado e push provado.
|
|
3
|
+
argument-hint: "<thread-id> [--para <branch>]"
|
|
4
|
+
allowed-tools: Bash(ork:*), Read, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /ship
|
|
8
|
+
|
|
9
|
+
Fase SHIP (F5): merge serializado por lease, atualizacao contra a base, push provado por comando e plano de rollback. Nada de `git push` na mao: o guard bloqueia e o motivo e que push na mao nao e provado.
|
|
10
|
+
|
|
11
|
+
## O que este comando faz
|
|
12
|
+
|
|
13
|
+
1. Ressincroniza quando a base andou:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
ork worktree sync <thread>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Ensaia a entrega inteira antes de tocar em qualquer coisa:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
ork ship <thread> --para main --dry-run
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
3. Entrega, com a autorizacao registrada:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
ork ship <thread> --para main --autorizar-push "<quem>"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
4. Mostra a prova ao builder: `mergeSha`, `shaRemoto` e `pushVerificado` no ledger.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
ork phase list <thread>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Regras do adaptador
|
|
38
|
+
|
|
39
|
+
- **Zero regra de negocio aqui.** Este comando traduz intencao em chamada de `ork` e nada mais.
|
|
40
|
+
Quem valida modo, monta prompt, decide gate e prova entrega e o nucleo.
|
|
41
|
+
- **A #TAG vem do pedido, nao de configuracao.** O modo sai de `ork modos --do-pedido`, que usa a
|
|
42
|
+
mesma funcao do nucleo; sem tag vale o `conduction.default_mode` do manifesto. A validacao
|
|
43
|
+
contra `conduction.allowed_modes` acontece dentro do `ork thread new`, nunca aqui.
|
|
44
|
+
- **Nada de escrever codigo de produto neste comando.** Quem escreve e a sessao que o `ork`
|
|
45
|
+
despacha, com o prompt gravado e o sha no ledger.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PreToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "Bash",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-guard.js\"",
|
|
10
|
+
"timeout": 10,
|
|
11
|
+
"statusMessage": "ork guard: conferindo o comando"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Guard `PreToolUse` do adaptador Claude Code (bloco B4).
|
|
4
|
+
*
|
|
5
|
+
* Ele NAO tem regra de negocio: nao consulta ledger, nao decide quem pode entregar e nao
|
|
6
|
+
* conhece thread nenhuma. Ele bloqueia, mecanicamente, a classe de comando que destroi
|
|
7
|
+
* trabalho alheio sem pedir licenca, e manda o agente pelo caminho que o `ork` verifica.
|
|
8
|
+
*
|
|
9
|
+
* Dois bloqueios, herdados de incidente real:
|
|
10
|
+
* 1. `git add -A` e parentes: engolem arquivo de outra thread que estava na mesma arvore.
|
|
11
|
+
* A regra do produto e um commit atomico por tarefa, com os arquivos nomeados.
|
|
12
|
+
* 2. `git push` na mao: o push do Orkastery e provado, comparando o sha local com o que o
|
|
13
|
+
* remoto reporta, e serializado por lease. Push por fora nao e proibido por gosto: ele
|
|
14
|
+
* e um push que ninguem consegue provar depois.
|
|
15
|
+
*
|
|
16
|
+
* Protocolo: le o JSON do PreToolUse no stdin, escreve a decisao em JSON no stdout e sai
|
|
17
|
+
* com codigo 2 quando nega (os dois canais, para funcionar tanto no host que le a decisao
|
|
18
|
+
* quanto no que le o codigo de saida). Erro interno NUNCA bloqueia: um guard que quebra a
|
|
19
|
+
* sessao por um bug proprio e pior que nenhum guard.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
'use strict';
|
|
23
|
+
|
|
24
|
+
/** Padroes bloqueados. Cada um traz o motivo e o caminho que o `ork` verifica. */
|
|
25
|
+
const BLOQUEIOS = [
|
|
26
|
+
{
|
|
27
|
+
nome: 'git-add-em-massa',
|
|
28
|
+
regex: /\bgit\s+add\s+(?:-A\b|--all\b|\.(?:\s|$))/,
|
|
29
|
+
motivo: 'git add em massa engole arquivo de outra thread que esteja na mesma arvore',
|
|
30
|
+
caminho: 'nomeie os arquivos da tarefa: git add -- <arquivo> [<arquivo>...]',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
nome: 'git-commit-em-massa',
|
|
34
|
+
regex: /\bgit\s+commit\b[^|;&]*\s-(?:a|[a-zA-Z]*a[a-zA-Z]*)\b/,
|
|
35
|
+
motivo: 'git commit -a comita tudo que esta rastreado, nao a tarefa',
|
|
36
|
+
caminho: 'adicione os arquivos da tarefa e comite sem -a',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
nome: 'force-push',
|
|
40
|
+
regex: /\bgit\s+push\b[^|;&]*(?:--force\b|--force-with-lease\b|\s-f\b)/,
|
|
41
|
+
motivo: 'force push reescreve historico publico e apaga entrega de outra thread',
|
|
42
|
+
caminho: 'nunca. Se a base precisa mudar, isso e decisao registrada, nao comando.',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
nome: 'push-nao-provado',
|
|
46
|
+
regex: /\bgit\s+push\b/,
|
|
47
|
+
motivo:
|
|
48
|
+
'push na mao nao e provado: o Orkastery compara o sha local com o que o remoto reporta e serializa o merge por lease',
|
|
49
|
+
caminho: 'entregue por: ork ship <thread> --para <base> --autorizar-push <quem>',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
nome: 'reset-destrutivo',
|
|
53
|
+
regex: /\bgit\s+(?:reset\s+--hard|clean\s+-[a-zA-Z]*[fd]|checkout\s+--\s+\.)/,
|
|
54
|
+
motivo: 'descarte em massa apaga trabalho nao commitado sem deixar rastro',
|
|
55
|
+
caminho: 'descarte por arquivo, ou registre a decisao antes: ork gate approve <thread> <sobre> --por <quem>',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
nome: 'remocao-recursiva-ampla',
|
|
59
|
+
regex: /\brm\s+-[a-zA-Z]*r[a-zA-Z]*f?\s+(?:\/|\*|~|\$|\.\s*$|\.\/\s*$)/,
|
|
60
|
+
motivo: 'remocao recursiva com alvo amplo ou variavel apaga o que ninguem pediu',
|
|
61
|
+
caminho: 'remova caminhos nomeados, dentro da worktree da thread',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
function decidir(entrada) {
|
|
66
|
+
const nome = entrada && entrada.tool_name;
|
|
67
|
+
if (nome !== 'Bash') return null;
|
|
68
|
+
const comando = String((entrada.tool_input && entrada.tool_input.command) || '');
|
|
69
|
+
if (comando.trim() === '') return null;
|
|
70
|
+
// Comando do proprio `ork` passa: quem verifica o push provado e o merge serializado e ele.
|
|
71
|
+
if (/^\s*(?:[A-Za-z0-9_]+=\S*\s+)*(?:\S*\/)?ork\s/.test(comando)) return null;
|
|
72
|
+
for (const b of BLOQUEIOS) {
|
|
73
|
+
if (b.regex.test(comando)) return b;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function main(bruto) {
|
|
79
|
+
let entrada;
|
|
80
|
+
try {
|
|
81
|
+
entrada = JSON.parse(bruto || '{}');
|
|
82
|
+
} catch (e) {
|
|
83
|
+
// Entrada ilegivel nao bloqueia: o guard erra para o lado de deixar passar.
|
|
84
|
+
process.stdout.write(JSON.stringify({ ork_guard: 'entrada-ilegivel', decisao: 'allow' }) + '\n');
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
const bloqueio = decidir(entrada);
|
|
88
|
+
if (!bloqueio) {
|
|
89
|
+
process.stdout.write(
|
|
90
|
+
JSON.stringify({
|
|
91
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow' },
|
|
92
|
+
ork_guard: 'ok',
|
|
93
|
+
}) + '\n'
|
|
94
|
+
);
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
const razao =
|
|
98
|
+
`ork guard bloqueou "${bloqueio.nome}": ${bloqueio.motivo}.\n` + `caminho: ${bloqueio.caminho}`;
|
|
99
|
+
process.stdout.write(
|
|
100
|
+
JSON.stringify({
|
|
101
|
+
hookSpecificOutput: {
|
|
102
|
+
hookEventName: 'PreToolUse',
|
|
103
|
+
permissionDecision: 'deny',
|
|
104
|
+
permissionDecisionReason: razao,
|
|
105
|
+
},
|
|
106
|
+
ork_guard: bloqueio.nome,
|
|
107
|
+
}) + '\n'
|
|
108
|
+
);
|
|
109
|
+
process.stderr.write(razao + '\n');
|
|
110
|
+
return 2;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let bruto = '';
|
|
114
|
+
process.stdin.setEncoding('utf8');
|
|
115
|
+
process.stdin.on('data', (c) => {
|
|
116
|
+
bruto += c;
|
|
117
|
+
});
|
|
118
|
+
process.stdin.on('end', () => {
|
|
119
|
+
let codigo = 0;
|
|
120
|
+
try {
|
|
121
|
+
codigo = main(bruto);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
// Bug do guard nao derruba a sessao do builder.
|
|
124
|
+
process.stderr.write(`ork guard falhou e liberou por seguranca: ${e && e.message}\n`);
|
|
125
|
+
codigo = 0;
|
|
126
|
+
}
|
|
127
|
+
process.exitCode = codigo;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
module.exports = { BLOQUEIOS, decidir };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Adaptador Hermes
|
|
2
|
+
|
|
3
|
+
O Hermes vira **podio** do Orkastery: uma skill roteadora fina, um plugin que a declara e um script
|
|
4
|
+
que abre thread a partir do pedido cru do builder.
|
|
5
|
+
|
|
6
|
+
## Instalacao
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
ork adapter install hermes # instala em <projeto>/.hermes
|
|
10
|
+
ork adapter install hermes --dir ~/.hermes # instala para a maquina
|
|
11
|
+
ork adapter install hermes --dry-run # lista o que seria escrito
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## O que entra
|
|
15
|
+
|
|
16
|
+
| Arquivo | Papel |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `skills/orkastery-devmaster/SKILL.md` | O roteador: le a #TAG, chama o `ork`, apresenta os gates |
|
|
19
|
+
| `hermes.plugin.json` | Declara a skill, o binario do `ork` e as tags de conducao |
|
|
20
|
+
| `bin/ork-abrir-thread.sh` | Abre a thread com o modo lido do pedido, em um comando |
|
|
21
|
+
|
|
22
|
+
## O encolhimento, que e o ponto
|
|
23
|
+
|
|
24
|
+
A skill devmaster do Hermes carregava a metodologia inteira em prosa: era ela quem "lembrava" das
|
|
25
|
+
regras das fases, dos gates e do score. O roteador tem pouco mais de cem linhas e **nao perde
|
|
26
|
+
capacidade nenhuma**, porque o que ele deixou de dizer o `ork` passou a executar. O mesmo ciclo
|
|
27
|
+
real roda antes e depois; o que mudou e quem garante.
|
|
28
|
+
|
|
29
|
+
Se esta skill comecar a crescer de novo com metodologia, isso e bandeira vermelha: a regra nova
|
|
30
|
+
pertence ao nucleo, com teste, e nao a esta prosa.
|
|
31
|
+
|
|
32
|
+
## Os 3 pitfalls de instalacao
|
|
33
|
+
|
|
34
|
+
1. **`ork` fora do PATH do Hermes.** O host costuma rodar com um ambiente mais enxuto que o do
|
|
35
|
+
terminal do builder, e `~/.local/bin` pode nao estar la. O `hermes.plugin.json` grava o caminho
|
|
36
|
+
absoluto em `requires.comando` e o script honra `ORK_BIN`. Prove antes de confiar:
|
|
37
|
+
`ORK_BIN=$(command -v ork) ; "$ORK_BIN" doctor`.
|
|
38
|
+
|
|
39
|
+
2. **Reimplementar o parse da #TAG no host.** E a tentacao obvia, sao cinco strings. Duas
|
|
40
|
+
implementacoes divergem na primeira tag nova, e a divergencia aparece como thread aberta no modo
|
|
41
|
+
errado, o que ninguem percebe ate a pausa que nao veio. Use `ork modos --do-pedido`, sempre.
|
|
42
|
+
|
|
43
|
+
3. **Validar `allowed_modes` no host.** Um host que recusa o modo antes de chamar o `ork` recusa
|
|
44
|
+
com a regra que ele tem em cache, nao com a do manifesto do projeto. Deixe o
|
|
45
|
+
`ork thread new` recusar: o erro vem tipado, com a lista permitida do projeto certo.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
# Abre uma thread do Orkastery a partir do pedido cru do builder.
|
|
3
|
+
#
|
|
4
|
+
# Zero regra de negocio: o modo sai de `ork modos --do-pedido`, que usa a mesma funcao do
|
|
5
|
+
# nucleo, e a validacao contra `conduction.allowed_modes` acontece dentro do `ork thread new`.
|
|
6
|
+
# Este script existe para o host nao ser tentado a reimplementar o parse da #TAG.
|
|
7
|
+
#
|
|
8
|
+
# Uso: ork-abrir-thread.sh "<nome curto>" "<pedido inteiro do builder>" [--worktree auto]
|
|
9
|
+
|
|
10
|
+
set -eu
|
|
11
|
+
|
|
12
|
+
if [ "$#" -lt 2 ]; then
|
|
13
|
+
echo "uso: ork-abrir-thread.sh \"<nome curto>\" \"<pedido do builder>\" [argumentos extras]" >&2
|
|
14
|
+
exit 2
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
ORK="${ORK_BIN:-ork}"
|
|
18
|
+
NOME="$1"
|
|
19
|
+
PEDIDO="$2"
|
|
20
|
+
shift 2
|
|
21
|
+
|
|
22
|
+
MODO="$("$ORK" modos --do-pedido "$PEDIDO")"
|
|
23
|
+
echo "modo de conducao lido do pedido: $MODO" >&2
|
|
24
|
+
|
|
25
|
+
exec "$ORK" thread new "$NOME" --mode "$MODO" "$@"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "orkastery",
|
|
3
|
+
"displayName": "Orkastery",
|
|
4
|
+
"version": "{{versao}}",
|
|
5
|
+
"description": "Conducao de looping threads em 6 fases pelo nucleo `ork`. O Hermes vira podio: le a #TAG do pedido, chama o `ork` e apresenta os gates ao humano.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"kind": "skill-router",
|
|
8
|
+
"skills": ["./skills/orkastery-devmaster"],
|
|
9
|
+
"bin": {
|
|
10
|
+
"ork-abrir-thread": "./bin/ork-abrir-thread.sh"
|
|
11
|
+
},
|
|
12
|
+
"requires": {
|
|
13
|
+
"ork": ">=0.1.0",
|
|
14
|
+
"comando": "{{ork_bin}}"
|
|
15
|
+
},
|
|
16
|
+
"conduction": {
|
|
17
|
+
"tags": ["#Look", "#Ork", "#Classic", "#Maestro", "#Auto"],
|
|
18
|
+
"parse": "ork modos --do-pedido \"<pedido>\"",
|
|
19
|
+
"nota": "O host transporta a tag. A validacao contra conduction.allowed_modes e do nucleo."
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orkastery-devmaster
|
|
3
|
+
description: "Roteador do Orkastery no Hermes: le a #TAG de conducao do pedido do builder, chama o `ork` para abrir e conduzir a thread pelas 6 fases, e apresenta os gates ao humano. Zero regra de negocio: quem decide e o humano, quem verifica e o `ork`."
|
|
4
|
+
bucket: hermes
|
|
5
|
+
roteia: "ork modos --do-pedido | ork thread new | ork phase run | ork ship | ork master"
|
|
6
|
+
license: MIT
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Orkastery no Hermes
|
|
10
|
+
|
|
11
|
+
## O que esta skill e
|
|
12
|
+
|
|
13
|
+
O roteador do Orkastery dentro do Hermes, e **so isso**. Ela nao conduz fase por conta propria,
|
|
14
|
+
nao escreve codigo e nao guarda metodologia: ela traduz o pedido do builder em chamada de `ork`,
|
|
15
|
+
mostra o que o `ork` respondeu e para nos gates.
|
|
16
|
+
|
|
17
|
+
Antes desta skill, a skill devmaster do Hermes carregava a metodologia inteira em prosa e era ela
|
|
18
|
+
quem "lembrava" das regras. Isso e exatamente a fragilidade que corroeu o Devmaster original:
|
|
19
|
+
regra que existe so como texto e regra que ninguem verifica. **Agora a metodologia e executavel e
|
|
20
|
+
mora no `ork`; aqui ficou o roteador.**
|
|
21
|
+
|
|
22
|
+
## Quando usar
|
|
23
|
+
|
|
24
|
+
Sempre que o builder pedir trabalho de produto num repositorio que tem `orkastery.yaml`.
|
|
25
|
+
|
|
26
|
+
## Passo 1: o modo sai do pedido, nao de configuracao
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
MODO=$(ork modos --do-pedido "<pedido inteiro do builder>")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
O comando usa a mesma funcao do nucleo que reconhece `#Look`, `#Ork`, `#Classic`, `#Maestro` e
|
|
33
|
+
`#Auto`. Sem tag no texto vale o `conduction.default_mode` do manifesto. **Nao reimplemente esse
|
|
34
|
+
parse aqui**, e nao valide o modo: `conduction.allowed_modes` e conferido dentro do
|
|
35
|
+
`ork thread new`, que recusa com erro tipado quando o projeto nao permite o modo pedido.
|
|
36
|
+
|
|
37
|
+
| #TAG | Pausas | Quando o builder escolhe |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `#Look` | 6 | Risco alto, passo irreversivel, dominio novo |
|
|
40
|
+
| `#Ork` | 5 | Veredito separado da execucao e da evidencia |
|
|
41
|
+
| `#Classic` | 3 | O padrao: premissas delicadas, entrega solta, score em batch |
|
|
42
|
+
| `#Maestro` | 1 | Solucao clara e agil, score em batch |
|
|
43
|
+
| `#Auto` | 0 | Docs, estudos, configuracoes, auditorias |
|
|
44
|
+
|
|
45
|
+
## Passo 2: antes de abrir, confira a maquina
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
ork doctor # sai != 0 quando o despacho nao vale (custo, runtime, ambiente)
|
|
49
|
+
ork board plan # quem avanca agora, quem espera e por que
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Um `fail` do doctor para o ciclo antes de ele abrir. Isso e economia, nao obstaculo.
|
|
53
|
+
|
|
54
|
+
## Passo 3: abrir a thread e conduzir as fases
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ork thread new "<nome curto>" --mode "$MODO" --worktree auto
|
|
58
|
+
ork phase run <thread> GOAL --prompt "<pedido do builder>"
|
|
59
|
+
ork phase run <thread> PLAN --prompt "<o que o plano precisa cobrir>"
|
|
60
|
+
ork worktree ensure <thread>
|
|
61
|
+
ork verify <thread> --baseline
|
|
62
|
+
ork phase run <thread> GO --prompt "<uma tarefa do PLAN por vez>"
|
|
63
|
+
ork verify <thread>
|
|
64
|
+
ork phase run <thread> CHECK --prompt "<escopo da verificacao>"
|
|
65
|
+
ork ship <thread> --para main --autorizar-push "<quem>"
|
|
66
|
+
ork master <thread> --score <0-5> --justificativa "<texto>" --por "<quem>"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Cada `phase run` grava o prompt exato com sha256 e registra no ledger. O `ork` reverifica no
|
|
70
|
+
runtime que a sessao existe: self-report de despacho nao vale como evidencia.
|
|
71
|
+
|
|
72
|
+
## Passo 4: apresentar os gates ao humano
|
|
73
|
+
|
|
74
|
+
O Hermes e o podio: e aqui que o builder ve a evidencia e da o veredito. Quando o bloco pausa,
|
|
75
|
+
mostre o que o `ork` produziu e espere. A liberacao vira evento:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
ork gate approve <thread> <objetivo|premissas|evidencias|push|score> --por "<quem>"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Quando o bloco nao pausa (`#Maestro`, `#Auto`), o `ork` registra a decisao autonoma com quem
|
|
82
|
+
decidiu, com que evidencia e por que. **O modo afrouxa a pausa, NUNCA a verificacao.**
|
|
83
|
+
|
|
84
|
+
## Passo 5: o score
|
|
85
|
+
|
|
86
|
+
O score de 0 a 5 e humano em todos os modos. Nos modos sem pausa de MASTER, ele vai para a fila:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
ork master --batch
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Fila que ninguem passa e score que nao existe. Traga a fila ao builder.
|
|
93
|
+
|
|
94
|
+
## Racionalizacoes comuns
|
|
95
|
+
|
|
96
|
+
| Desculpa | Realidade |
|
|
97
|
+
|---|---|
|
|
98
|
+
| "Faco a fase aqui mesmo, e mais rapido" | A camada que apresenta nao escreve codigo de produto. Quem escreve e a sessao que o `ork` despacha, com prompt gravado e sha no ledger. |
|
|
99
|
+
| "Guardo as regras da metodologia nesta skill" | Metodologia em prosa e metodologia que ninguem verifica. Ela mora no `ork`; aqui fica o roteamento. |
|
|
100
|
+
| "Valido o modo antes de chamar o `ork`" | Validacao duplicada e validacao que vai divergir. `conduction.allowed_modes` e do nucleo. |
|
|
101
|
+
| "O builder confia, pulo o gate desta vez" | Gate pulado e gate que nao existe. Se o modo nao pausa, o `ork` registra a decisao autonoma; se pausa, ele espera. |
|
|
102
|
+
| "Score eu estimo pelo resultado" | O score e do humano em todos os modos. Estimar nota destroi a unica metrica de conducao do produto. |
|
|
103
|
+
|
|
104
|
+
## Bandeiras vermelhas
|
|
105
|
+
|
|
106
|
+
- Esta skill crescendo de novo para carregar metodologia em vez de roteamento.
|
|
107
|
+
- Chamada de `git` direta em vez de `ork ship`.
|
|
108
|
+
- Modo escolhido por configuracao do host, e nao pela #TAG do pedido.
|
|
109
|
+
- Thread aberta com `ork doctor` em `fail`.
|
|
110
|
+
- Fila de `ork master --batch` crescendo sem ninguem passar nela.
|
|
111
|
+
|
|
112
|
+
## Verificacao antes de responder ao builder
|
|
113
|
+
|
|
114
|
+
Modo lido do pedido pelo `ork`, doctor conferido, thread aberta pelo nucleo, fase despachada com
|
|
115
|
+
prompt gravado, gate apresentado ou decisao autonoma registrada, e uma linha dizendo em que ponto
|
|
116
|
+
a thread esta e o que acontece agora.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Adaptador OpenClaw
|
|
2
|
+
|
|
3
|
+
O OpenClaw recebe o Orkastery como um conjunto de **tools `ork_*`**: cada tool e uma chamada de CLI
|
|
4
|
+
declarada em `openclaw.plugin.json`, sem codigo de cola e sem regra de negocio no host.
|
|
5
|
+
|
|
6
|
+
## Instalacao
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
ork adapter install openclaw # instala em <projeto>/.openclaw
|
|
10
|
+
ork adapter install openclaw --dir ~/.openclaw # instala para a maquina
|
|
11
|
+
ork adapter install openclaw --dry-run # lista o que seria escrito
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
O instalador renderiza `{{ork_bin}}` com o caminho absoluto do `ork` desta maquina e grava
|
|
15
|
+
`INSTALADO.json` com a origem e o sha256 de cada arquivo.
|
|
16
|
+
|
|
17
|
+
## As tools
|
|
18
|
+
|
|
19
|
+
| Tool | O que faz |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `ork_doctor` | O que vale nesta maquina agora; sai != 0 quando o despacho nao vale |
|
|
22
|
+
| `ork_modo_do_pedido` | Le a #TAG do pedido e devolve o modo (use SEMPRE, nao reconheca a tag no host) |
|
|
23
|
+
| `ork_thread_new` | Cria a thread, o slug de 3 partes e o ledger |
|
|
24
|
+
| `ork_thread_status` | Estado da thread cruzado com o runtime |
|
|
25
|
+
| `ork_phase_run` | Despacha uma fase, gravando o prompt exato com sha256 |
|
|
26
|
+
| `ork_phase_list` | O ledger, evento a evento |
|
|
27
|
+
| `ork_claims_add` | Registra alegacao verificavel com o comando que a comprova |
|
|
28
|
+
| `ork_verify` / `ork_verify_baseline` | Reexecuta no HEAD real; grava a baseline antes do GO |
|
|
29
|
+
| `ork_worktree_ensure` / `ork_worktree_audit` | Worktree isolada, conferida no proprio git |
|
|
30
|
+
| `ork_gate_approve` | Autorizacao humana registrada no ledger |
|
|
31
|
+
| `ork_ship` | Merge serializado por lease e push provado contra o remoto |
|
|
32
|
+
| `ork_master` | POSTMORTEM tipado e o score HUMANO de 0 a 5 |
|
|
33
|
+
| `ork_board` / `ork_master_batch` | Escalonador e fila de score |
|
|
34
|
+
|
|
35
|
+
## A #TAG de conducao
|
|
36
|
+
|
|
37
|
+
`ork_modo_do_pedido` devolve JSON com o modo, a tag, se veio do pedido ou do
|
|
38
|
+
`conduction.default_mode`, e quantas pausas humanas aquele modo tem. O host passa o resultado a
|
|
39
|
+
`ork_thread_new` e **nao decide nada**: `conduction.allowed_modes` e conferido dentro do
|
|
40
|
+
`ork thread new`, que recusa com erro tipado quando o projeto nao permite o modo.
|
|
41
|
+
|
|
42
|
+
## Os 3 pitfalls de instalacao
|
|
43
|
+
|
|
44
|
+
1. **Placeholder `{{ork_bin}}` que fica no arquivo.** O OpenClaw executa o vetor de comando como
|
|
45
|
+
ele esta: um `{{ork_bin}}` nao renderizado vira "comando nao encontrado" em toda tool, e a
|
|
46
|
+
sessao so descobre isso quando ja abriu thread na cabeca do agente. O instalador renderiza o
|
|
47
|
+
caminho absoluto; confira depois com
|
|
48
|
+
`grep -c '{{' <destino>/openclaw.plugin.json`, que precisa devolver `0`.
|
|
49
|
+
|
|
50
|
+
2. **Argumento com espaco quebrado em varios argumentos.** Cada tool declara o comando como
|
|
51
|
+
**vetor**, nunca como string de shell, exatamente para que um pedido com espaco, aspas ou
|
|
52
|
+
quebra de linha chegue inteiro em `--prompt`. Se voce adaptar uma tool, mantenha o vetor: uma
|
|
53
|
+
string de shell aqui vira injecao de comando com o texto do builder dentro.
|
|
54
|
+
|
|
55
|
+
3. **Tool que reimplementa regra do nucleo.** A tentacao e criar uma tool "esperta" que decide o
|
|
56
|
+
modo, monta o prompt ou escolhe a base. Toda tool deste plugin e uma chamada de CLI e nada
|
|
57
|
+
mais; a decisao que parece faltar aqui ja existe do outro lado, com teste. Tool nova que precisa
|
|
58
|
+
de logica e sinal de que a logica pertence ao `ork`.
|
|
59
|
+
|
|
60
|
+
## O que este adaptador nao faz
|
|
61
|
+
|
|
62
|
+
Nao escreve codigo de produto, nao decide gate e nao valida modo. Ele traduz intencao em chamada de
|
|
63
|
+
`ork`, apresenta o resultado ao humano e registra o que o humano decidiu.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
# Abre uma thread do Orkastery a partir do pedido cru do builder, no OpenClaw.
|
|
3
|
+
#
|
|
4
|
+
# Existe para o host nao reimplementar o parse da #TAG: o modo sai de `ork modos --do-pedido`,
|
|
5
|
+
# que usa a mesma funcao do nucleo, e `conduction.allowed_modes` e validado pelo `ork thread new`.
|
|
6
|
+
#
|
|
7
|
+
# Uso: ork-abrir-thread.sh "<nome curto>" "<pedido inteiro do builder>" [argumentos extras]
|
|
8
|
+
|
|
9
|
+
set -eu
|
|
10
|
+
|
|
11
|
+
if [ "$#" -lt 2 ]; then
|
|
12
|
+
echo "uso: ork-abrir-thread.sh \"<nome curto>\" \"<pedido do builder>\" [argumentos extras]" >&2
|
|
13
|
+
exit 2
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
ORK="${ORK_BIN:-ork}"
|
|
17
|
+
NOME="$1"
|
|
18
|
+
PEDIDO="$2"
|
|
19
|
+
shift 2
|
|
20
|
+
|
|
21
|
+
MODO="$("$ORK" modos --do-pedido "$PEDIDO")"
|
|
22
|
+
echo "modo de conducao lido do pedido: $MODO" >&2
|
|
23
|
+
|
|
24
|
+
exec "$ORK" thread new "$NOME" --mode "$MODO" "$@"
|