@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.
Files changed (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/adapters/README.md +22 -0
  4. package/adapters/claude-code/.claude-plugin/marketplace.json +15 -0
  5. package/adapters/claude-code/.claude-plugin/plugin.json +31 -0
  6. package/adapters/claude-code/README.md +102 -0
  7. package/adapters/claude-code/agents/ork-check.md +32 -0
  8. package/adapters/claude-code/agents/ork-go.md +32 -0
  9. package/adapters/claude-code/agents/ork-goal.md +33 -0
  10. package/adapters/claude-code/agents/ork-master.md +32 -0
  11. package/adapters/claude-code/agents/ork-plan.md +32 -0
  12. package/adapters/claude-code/agents/ork-ship.md +32 -0
  13. package/adapters/claude-code/commands/check.md +45 -0
  14. package/adapters/claude-code/commands/go.md +46 -0
  15. package/adapters/claude-code/commands/goal.md +54 -0
  16. package/adapters/claude-code/commands/master.md +42 -0
  17. package/adapters/claude-code/commands/ork.md +37 -0
  18. package/adapters/claude-code/commands/plan.md +47 -0
  19. package/adapters/claude-code/commands/ship.md +45 -0
  20. package/adapters/claude-code/hooks/hooks.json +17 -0
  21. package/adapters/claude-code/hooks/ork-guard.js +130 -0
  22. package/adapters/hermes/README.md +45 -0
  23. package/adapters/hermes/bin/ork-abrir-thread.sh +25 -0
  24. package/adapters/hermes/hermes.plugin.json +21 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +116 -0
  26. package/adapters/openclaw/README.md +63 -0
  27. package/adapters/openclaw/bin/ork-abrir-thread.sh +24 -0
  28. package/adapters/openclaw/openclaw.plugin.json +138 -0
  29. package/dist/adapters/claude-bg.js +308 -0
  30. package/dist/auditoria.js +848 -0
  31. package/dist/auditrun.js +976 -0
  32. package/dist/board.js +314 -0
  33. package/dist/canarios.js +271 -0
  34. package/dist/catalogo.js +124 -0
  35. package/dist/ciclos.js +156 -0
  36. package/dist/claims.js +226 -0
  37. package/dist/divida.js +374 -0
  38. package/dist/doctor.js +246 -0
  39. package/dist/evalrunner.js +458 -0
  40. package/dist/fix.js +450 -0
  41. package/dist/gates.js +92 -0
  42. package/dist/handoff.js +521 -0
  43. package/dist/hosts.js +331 -0
  44. package/dist/index.js +1910 -0
  45. package/dist/init.js +231 -0
  46. package/dist/leases.js +508 -0
  47. package/dist/ledger.js +138 -0
  48. package/dist/manifest.js +255 -0
  49. package/dist/master.js +453 -0
  50. package/dist/memoria.js +773 -0
  51. package/dist/modos.js +220 -0
  52. package/dist/orkmind.js +487 -0
  53. package/dist/orquestracao.js +559 -0
  54. package/dist/phase.js +572 -0
  55. package/dist/policies.js +176 -0
  56. package/dist/prompts.js +406 -0
  57. package/dist/ratelimit.js +179 -0
  58. package/dist/recall.js +252 -0
  59. package/dist/retry.js +917 -0
  60. package/dist/sandbox.js +94 -0
  61. package/dist/sessoes.js +104 -0
  62. package/dist/ship.js +551 -0
  63. package/dist/slug.js +100 -0
  64. package/dist/superficie.js +1347 -0
  65. package/dist/thread.js +333 -0
  66. package/dist/tokens.js +228 -0
  67. package/dist/types.js +20 -0
  68. package/dist/util.js +156 -0
  69. package/dist/verify.js +262 -0
  70. package/dist/worktree.js +576 -0
  71. package/dist/yaml.js +112 -0
  72. package/eval/README.md +85 -0
  73. package/eval/casos/check-quality.json +103 -0
  74. package/eval/casos/code-reviewer.json +102 -0
  75. package/eval/casos/decision-triage.json +103 -0
  76. package/eval/casos/go-implementation.json +103 -0
  77. package/eval/casos/goal-definition.json +103 -0
  78. package/eval/casos/master-metrics.json +103 -0
  79. package/eval/casos/narrative-guardian.json +163 -0
  80. package/eval/casos/orkastery-bootstrap.json +102 -0
  81. package/eval/casos/plan-specification.json +102 -0
  82. package/eval/casos/roadmap-keeper.json +103 -0
  83. package/eval/casos/scope-check-capability-map.json +83 -0
  84. package/eval/casos/security-auditor.json +102 -0
  85. package/eval/casos/ship-release.json +122 -0
  86. package/eval/casos/test-engineer.json +122 -0
  87. package/eval/casos/thread-state.json +82 -0
  88. package/eval/casos/thread-tracing.json +83 -0
  89. package/eval/casos/web-performance-auditor.json +102 -0
  90. package/eval/fixtures/b0-slug-e-modos/caso.json +56 -0
  91. package/eval/fixtures/b2-master-log/caso.json +91 -0
  92. package/eval/fixtures/fx-concurrency/caso.json +15 -0
  93. package/eval/fixtures/fx-hallucination/caso.json +12 -0
  94. package/eval/fixtures/fx-happy/caso.json +16 -0
  95. package/eval/fixtures/fx-schema-drift/caso.json +15 -0
  96. package/eval/fixtures/fx-stale-base/caso.json +12 -0
  97. package/eval/fixtures/fx-wiki-destroy/caso.json +16 -0
  98. package/eval/fixtures/superficie-de-rede/README.md +22 -0
  99. package/eval/fixtures/superficie-de-rede/api-express.js +30 -0
  100. package/eval/fixtures/superficie-de-rede/api_fastapi.py +17 -0
  101. package/eval/fixtures/superficie-de-rede/api_gin.go +18 -0
  102. package/package.json +56 -0
  103. package/references/README.md +25 -0
  104. package/references/code-review-axes.md +82 -0
  105. package/references/definition-of-done.md +74 -0
  106. package/references/performance-checklist.md +53 -0
  107. package/references/security-checklist.md +101 -0
  108. package/references/testing-patterns.md +51 -0
  109. package/skills/README.md +43 -0
  110. package/skills/core/orkastery-bootstrap/SKILL.md +89 -0
  111. package/skills/core/thread-state/SKILL.md +86 -0
  112. package/skills/governance/decision-triage/SKILL.md +65 -0
  113. package/skills/governance/narrative-guardian/SKILL.md +66 -0
  114. package/skills/governance/roadmap-keeper/SKILL.md +60 -0
  115. package/skills/governance/scope-check-capability-map/SKILL.md +61 -0
  116. package/skills/observability/thread-tracing/SKILL.md +63 -0
  117. package/skills/phases/check-quality/SKILL.md +87 -0
  118. package/skills/phases/go-implementation/SKILL.md +70 -0
  119. package/skills/phases/goal-definition/SKILL.md +69 -0
  120. package/skills/phases/master-metrics/SKILL.md +65 -0
  121. package/skills/phases/plan-specification/SKILL.md +67 -0
  122. package/skills/phases/ship-release/SKILL.md +68 -0
  123. package/skills/reviewers/code-reviewer/SKILL.md +61 -0
  124. package/skills/reviewers/security-auditor/SKILL.md +68 -0
  125. package/skills/reviewers/test-engineer/SKILL.md +66 -0
  126. 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" "$@"