@orkastery/cli 0.5.0 → 0.5.3
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/adapters/claude-code/README.md +11 -2
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/onboarding.md +3 -2
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
- package/adapters/openclaw/README.md +35 -4
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +47 -12
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +50 -12
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +59 -11
- package/dist/adapters/codex.js +4 -3
- package/dist/agents-md.js +1 -0
- package/dist/auditrun.js +6 -2
- package/dist/board.js +16 -14
- package/dist/branch-de-estado.js +66 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/ci.js +8 -1
- package/dist/claim-lint.js +3 -1
- package/dist/claims.js +39 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/docs.js +110 -3
- package/dist/doctor-pulse-cron.js +194 -0
- package/dist/doctor-rede.js +149 -0
- package/dist/doctor.js +294 -37
- package/dist/entrega-pr.js +27 -8
- package/dist/esgotamentos.js +181 -0
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-estado.js +35 -9
- package/dist/fabrica-publicar.js +6 -0
- package/dist/fechamento.js +20 -66
- package/dist/fix.js +3 -3
- package/dist/forja.js +31 -7
- package/dist/gates.js +5 -1
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +33 -1
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/horario.js +27 -0
- package/dist/hosts.js +59 -13
- package/dist/impedimento.js +205 -0
- package/dist/index.js +433 -88
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +3 -1
- package/dist/init.js +28 -5
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +267 -30
- package/dist/intelligence-graph-contexto.js +215 -0
- package/dist/intelligence-graph-contract.js +71 -12
- package/dist/intelligence-graph-extract-md.js +41 -23
- package/dist/intelligence-graph-extract-ts.js +181 -11
- package/dist/intelligence-graph-extract.js +186 -9
- package/dist/intelligence-graph-index.js +205 -24
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-repo.js +10 -0
- package/dist/leases.js +680 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +12 -0
- package/dist/licoes.js +6 -4
- package/dist/liveness.js +2 -1
- package/dist/maestro-runtime.js +7 -1
- package/dist/manifest.js +44 -1
- package/dist/master-nota.js +14 -5
- package/dist/master.js +129 -12
- package/dist/mcp-artifacts.js +36 -3
- package/dist/mcp-git.js +80 -15
- package/dist/mcp-grafo-worker.js +93 -0
- package/dist/mcp-grafo.js +279 -0
- package/dist/mcp-install.js +2 -1
- package/dist/mcp-server.js +23 -1
- package/dist/mcp-ship.js +2 -0
- package/dist/mcp-verify.js +3 -1
- package/dist/memoria.js +48 -6
- package/dist/network-roadmap.js +195 -20
- package/dist/ocupacao.js +17 -5
- package/dist/onboarding.js +9 -4
- package/dist/orkmind.js +90 -5
- package/dist/orquestracao.js +14 -11
- package/dist/parado-no-condutor.js +1089 -0
- package/dist/phase.js +68 -15
- package/dist/policies.js +79 -3
- package/dist/portfolio.js +4 -1
- package/dist/projeto-alvo.js +5 -1
- package/dist/prompts.js +36 -1
- package/dist/prova-ativacao.js +414 -0
- package/dist/pulse-delivery.js +60 -7
- package/dist/pulse.js +99 -3
- package/dist/ratelimit.js +20 -4
- package/dist/recall.js +3 -1
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +336 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +69 -2
- package/dist/roadmap-status.js +162 -7
- package/dist/runtime-context.js +5 -1
- package/dist/runtime-profiles.js +22 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-watcher-claude.js +113 -23
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -12
- package/dist/sessoes.js +87 -3
- package/dist/ship.js +110 -20
- package/dist/thread.js +212 -14
- package/dist/util.js +71 -4
- package/dist/verify.js +2 -2
- package/dist/worktree.js +34 -8
- package/eval/casos/onboarding.json +1 -1
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/skills/README.md +1 -1
- package/skills/core/onboarding/SKILL.md +3 -2
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
- package/skills/phases/ship-release/SKILL.md +6 -3
package/dist/util.js
CHANGED
|
@@ -34,8 +34,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
};
|
|
35
35
|
})();
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.GITIGNORE_DA_MAQUINA = exports.COMMIT_DESCONHECIDO = void 0;
|
|
37
38
|
exports.exec = exec;
|
|
39
|
+
exports.shaCurto = shaCurto;
|
|
40
|
+
exports.branchDoHead = branchDoHead;
|
|
38
41
|
exports.noPath = noPath;
|
|
42
|
+
exports.ignorarPastaNoGit = ignorarPastaNoGit;
|
|
39
43
|
exports.subirAte = subirAte;
|
|
40
44
|
exports.gravar = gravar;
|
|
41
45
|
exports.lerJson = lerJson;
|
|
@@ -66,10 +70,73 @@ function exec(cmd, args, cwd, timeoutMs = 120000, env = process.env) {
|
|
|
66
70
|
...(r.error ? { error: r.error.code ?? r.error.message } : {}),
|
|
67
71
|
};
|
|
68
72
|
}
|
|
69
|
-
/** O
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
/** O commit quando o repositorio ainda nao tem commit (base da thread, HEAD do verify). */
|
|
74
|
+
exports.COMMIT_DESCONHECIDO = 'desconhecido';
|
|
75
|
+
/**
|
|
76
|
+
* Sha para exibir: 8 caracteres quando o valor e um sha hexadecimal (SHA-1 ou SHA-256); qualquer
|
|
77
|
+
* outro valor, como o marcador de repositorio sem commit, sai inteiro (o ensaio da 0.5.0 viu "desconhe").
|
|
78
|
+
*/
|
|
79
|
+
function shaCurto(valor) {
|
|
80
|
+
return /^[0-9a-f]{7,64}$/i.test(valor) ? valor.slice(0, 8) : valor;
|
|
81
|
+
}
|
|
82
|
+
/** A branch para onde o HEAD aponta, com ou sem commit; `null` com o HEAD destacado. */
|
|
83
|
+
function branchDoHead(dir) {
|
|
84
|
+
const r = exec('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], dir);
|
|
85
|
+
return r.ok && r.stdout.trim() ? r.stdout.trim() : null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* O binario esta no PATH? A busca e do proprio processo, como o `which` fazia: o primeiro arquivo
|
|
89
|
+
* regular executavel na ordem do PATH. Registro R3 do ensaio da 0.5.0: sem o binario `which` na
|
|
90
|
+
* maquina, o doctor dizia que o `git` e o `claude` faltavam. Entrada vazia do PATH e pulada (nao vira
|
|
91
|
+
* o diretorio atual), e nome com barra e conferido direto.
|
|
92
|
+
*/
|
|
93
|
+
function noPath(bin, env = process.env) {
|
|
94
|
+
const executavel = (alvo) => {
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.statSync(alvo).isFile())
|
|
97
|
+
return false;
|
|
98
|
+
fs.accessSync(alvo, fs.constants.X_OK);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
if (bin.includes('/'))
|
|
106
|
+
return executavel(bin) ? bin : null;
|
|
107
|
+
for (const dir of (env.PATH ?? '').split(path.delimiter)) {
|
|
108
|
+
if (dir && executavel(path.join(dir, bin)))
|
|
109
|
+
return path.join(dir, bin);
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/** O `.gitignore` que o ork poe na pasta que e da maquina (fatia 2 do ensaio da 0.5.0, P3). */
|
|
114
|
+
exports.GITIGNORE_DA_MAQUINA = '# Criado pelo ork: esta pasta é da máquina, não do repositório.\n*\n';
|
|
115
|
+
/**
|
|
116
|
+
* Fatia 2 do ensaio da 0.5.0 (P3): a pasta que o ork cria para a maquina (o estado em `.orkastery/`
|
|
117
|
+
* e a pasta das worktrees) fica fora do git por um `.gitignore` proprio com `*`; o `.gitignore` do
|
|
118
|
+
* usuario nao e tocado. Nunca sobrescreve um existente, so vale para pasta dentro do repositorio e
|
|
119
|
+
* nao cria quando o repositorio ja rastreia algo nela: o projeto que versiona o proprio estado segue
|
|
120
|
+
* versionando. Devolve se criou.
|
|
121
|
+
*/
|
|
122
|
+
function ignorarPastaNoGit(dir, raizDoRepo) {
|
|
123
|
+
const relativo = path.relative(raizDoRepo, dir);
|
|
124
|
+
if (!relativo || relativo.startsWith('..') || path.isAbsolute(relativo))
|
|
125
|
+
return false;
|
|
126
|
+
const arquivo = path.join(dir, '.gitignore');
|
|
127
|
+
if (fs.existsSync(arquivo))
|
|
128
|
+
return false;
|
|
129
|
+
const rastreados = exec('git', ['ls-files', '-z', '--', relativo], raizDoRepo);
|
|
130
|
+
if (rastreados.ok && rastreados.stdout.length > 0)
|
|
131
|
+
return false;
|
|
132
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
133
|
+
try {
|
|
134
|
+
fs.writeFileSync(arquivo, exports.GITIGNORE_DA_MAQUINA, { flag: 'wx' });
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
73
140
|
}
|
|
74
141
|
/** Sobe a arvore de diretorios procurando um arquivo. Retorna o diretorio que o contem. */
|
|
75
142
|
function subirAte(dirInicial, arquivo) {
|
package/dist/verify.js
CHANGED
|
@@ -183,7 +183,7 @@ function cwdDaThread(raiz, thread) {
|
|
|
183
183
|
/** HEAD real do diretorio de trabalho, carimbado em toda verificacao. */
|
|
184
184
|
function commitReal(cwd) {
|
|
185
185
|
const r = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], cwd);
|
|
186
|
-
return r.ok ? r.stdout.trim() :
|
|
186
|
+
return r.ok ? r.stdout.trim() : util_1.COMMIT_DESCONHECIDO;
|
|
187
187
|
}
|
|
188
188
|
/** O pedido de conducao de uma verificacao, com o prazo derivado dos comandos que ela vai rodar (D3). */
|
|
189
189
|
function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
@@ -456,7 +456,7 @@ function textoDoVerify(r) {
|
|
|
456
456
|
linhas.push(`ork verify da thread ${r.thread}`);
|
|
457
457
|
linhas.push(` HEAD real ${r.commit}`);
|
|
458
458
|
linhas.push(` diretorio ${r.cwd}`);
|
|
459
|
-
linhas.push(` baseline ${r.baseline ? `${r.baseline.commit
|
|
459
|
+
linhas.push(` baseline ${r.baseline ? `${(0, util_1.shaCurto)(r.baseline.commit)} de ${(0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)}` : '(nao gravada: falha nao pode ser chamada de regressao)'}`);
|
|
460
460
|
if (r.preparo) {
|
|
461
461
|
const p = r.preparo;
|
|
462
462
|
linhas.push(` preparo ${p.resultado.ok ? 'ok' : situacaoDoComando(p.resultado)} em ` +
|
package/dist/worktree.js
CHANGED
|
@@ -64,9 +64,12 @@ const leases_1 = require("./leases");
|
|
|
64
64
|
const thread_1 = require("./thread");
|
|
65
65
|
const util_1 = require("./util");
|
|
66
66
|
const estado_thread_1 = require("./estado-thread");
|
|
67
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Diretorio canonico da worktree de uma thread, resolvido pelo `ork` na arvore principal: o mesmo que a criacao usa,
|
|
69
|
+
* tambem quando o comando roda de dentro de outra worktree (P4 do ensaio da 0.5.0).
|
|
70
|
+
*/
|
|
68
71
|
function dirDaWorktree(carregado, id) {
|
|
69
|
-
return
|
|
72
|
+
return (0, thread_1.pastaDaWorktree)(carregado, id);
|
|
70
73
|
}
|
|
71
74
|
/** Branch canonica da worktree de uma thread. */
|
|
72
75
|
function branchDaWorktree(thread) {
|
|
@@ -196,6 +199,11 @@ function garantirWorktree(carregado, id) {
|
|
|
196
199
|
* commit que o git nao tem mais nao entra. `proprios` conta o que o HEAD tem fora delas e da base
|
|
197
200
|
* atual (`null` sem nenhuma base conhecida); `pontoDePartida` e a base conhecida mais nova que e
|
|
198
201
|
* ancestral do HEAD; `semAncestral` diz que HEAD e base atual nao tem historia em comum.
|
|
202
|
+
*
|
|
203
|
+
* RM-037 (fatia 3, defeito 3): `baseReescrita` diz que o ponto de partida nao esta mais na base atual.
|
|
204
|
+
* A base so anda para a frente; quando o ponto em que a thread saiu dela deixa de ser ancestral, a base
|
|
205
|
+
* foi reescrita, mesmo com ancestral comum mais antigo (force-push que tirou commits). Nesse caso o
|
|
206
|
+
* `git rebase <base>` reaplicaria, junto com os commits da thread, os `sairamDaBase` que a reescrita tirou.
|
|
199
207
|
*/
|
|
200
208
|
function historiaPropria(raiz, thread, dir, shaBase) {
|
|
201
209
|
const git = (...args) => (0, util_1.exec)('git', args, dir);
|
|
@@ -212,11 +220,13 @@ function historiaPropria(raiz, thread, dir, shaBase) {
|
|
|
212
220
|
const conhecidas = [...new Set([pontoDaCriacao, ...sincronizadas])].filter(valido);
|
|
213
221
|
const semAncestral = git('merge-base', 'HEAD', shaBase).code === 1;
|
|
214
222
|
const pontoDePartida = [...conhecidas].reverse().find(sha => git('merge-base', '--is-ancestor', sha, 'HEAD').ok) ?? null;
|
|
223
|
+
const baseReescrita = pontoDePartida !== null && !git('merge-base', '--is-ancestor', pontoDePartida, shaBase).ok;
|
|
224
|
+
const numero = (r) => r.ok && /^\d+$/.test(r.stdout.trim()) ? Number(r.stdout.trim()) : null;
|
|
225
|
+
const sairamDaBase = baseReescrita ? numero(git('rev-list', '--count', pontoDePartida, '--not', shaBase)) : null;
|
|
215
226
|
if (!conhecidas.length)
|
|
216
|
-
return { proprios: null, pontoDePartida, semAncestral };
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
return { proprios, pontoDePartida, semAncestral };
|
|
227
|
+
return { proprios: null, pontoDePartida, semAncestral, baseReescrita, sairamDaBase };
|
|
228
|
+
const proprios = numero(git('rev-list', '--count', 'HEAD', '--not', ...conhecidas, shaBase));
|
|
229
|
+
return { proprios, pontoDePartida, semAncestral, baseReescrita, sairamDaBase };
|
|
220
230
|
}
|
|
221
231
|
/**
|
|
222
232
|
* Sincroniza a branch da thread com a base ATUAL (rebase), quando a base avancou.
|
|
@@ -360,9 +370,25 @@ function sincronizarWorktree(carregado, id, opcoes = {}) {
|
|
|
360
370
|
`${historia.proprios ?? 'um numero desconhecido de'} commit(s) proprio(s): o rebase reaplicaria a historia antiga inteira`;
|
|
361
371
|
if (!opcoes.dryRun)
|
|
362
372
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeSincronizada, { dir, branch, base, shaBase, shaAntes,
|
|
363
|
-
rebaseFeito: false, motivo: 'tree.blocked', semAncestral: true, detalhe });
|
|
373
|
+
rebaseFeito: false, motivo: 'tree.blocked', causa: 'base-reescrita', semAncestral: true, detalhe });
|
|
374
|
+
return { ...vazio, shaBase, shaAntes, shaDepois: shaAntes, ok: false, jaAtualizada: false, rebaseFeito: false,
|
|
375
|
+
motivo: 'tree.blocked', causa: 'base-reescrita', detalhe, correcao: `reaplique so os commits da thread sobre a base nova: ${onto}` };
|
|
376
|
+
}
|
|
377
|
+
// RM-037 (fatia 3, defeito 3): com ancestral comum, o sync caia no `git rebase <base>` abaixo e
|
|
378
|
+
// reaplicava tambem o que a reescrita tirou da base. O ponto de partida fora da base atual e o sinal.
|
|
379
|
+
if (historia.baseReescrita) {
|
|
380
|
+
const ponto = historia.pontoDePartida;
|
|
381
|
+
passos.push(`git merge-base --is-ancestor ${ponto.slice(0, 8)} ${shaBase.slice(0, 8)} (falso: a base foi reescrita)`);
|
|
382
|
+
const detalhe = `a base ${base} foi reescrita: o ponto de partida ${ponto.slice(0, 8)} da branch ${branch} nao esta mais nela, ` +
|
|
383
|
+
`e o rebase comum reaplicaria ${historia.sairamDaBase ?? 'um numero desconhecido de'} commit(s) que sairam da base junto com ` +
|
|
384
|
+
`o(s) ${historia.proprios ?? '?'} da thread (git rev-list --count HEAD --not ${ponto.slice(0, 8)} ${shaBase.slice(0, 8)})`;
|
|
385
|
+
if (!opcoes.dryRun)
|
|
386
|
+
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeSincronizada, { dir, branch, base, shaBase, shaAntes,
|
|
387
|
+
rebaseFeito: false, motivo: 'tree.blocked', causa: 'base-reescrita', baseReescrita: true, pontoDePartida: ponto,
|
|
388
|
+
sairamDaBase: historia.sairamDaBase, proprios: historia.proprios, detalhe });
|
|
364
389
|
return { ...vazio, shaBase, shaAntes, shaDepois: shaAntes, ok: false, jaAtualizada: false, rebaseFeito: false,
|
|
365
|
-
motivo: 'tree.blocked',
|
|
390
|
+
motivo: 'tree.blocked', causa: 'base-reescrita', detalhe,
|
|
391
|
+
correcao: `reaplique so os commits da thread sobre a base nova: git -C ${dir} rebase --onto ${shaBase} ${ponto}` };
|
|
366
392
|
}
|
|
367
393
|
if (opcoes.dryRun) {
|
|
368
394
|
passos.push(`git rebase ${shaBase}`);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fx-pedido-colado",
|
|
3
|
+
"sobre": "Incidente de 01/10/2026 (RM-057): o pedido colado com autorização explícita segue sem parar",
|
|
4
|
+
"precisa": [
|
|
5
|
+
"git"
|
|
6
|
+
],
|
|
7
|
+
"esperado": {
|
|
8
|
+
"simulado": true,
|
|
9
|
+
"modoDoPedido": "auto",
|
|
10
|
+
"semPausaDoModo": true,
|
|
11
|
+
"decisaoInformada": true,
|
|
12
|
+
"confirmoRecusado": "hitl.selecao.texto-livre",
|
|
13
|
+
"nadaGravadoNaRecusa": true,
|
|
14
|
+
"humanosNoPulse": 0,
|
|
15
|
+
"perguntasDeConducao": 0,
|
|
16
|
+
"tempoParadoMs": 0,
|
|
17
|
+
"adaptadoresComARegra": 4
|
|
18
|
+
},
|
|
19
|
+
"porque": "Na noite de 01 para 02/10 o condutor parou mais de 10 h pedindo um confirmo em texto livre a um pedido colado que já trazia a autorização. O canário prova, contra o código real, que o #Auto não pausa, a dúvida vira decisão informada, o confirmo em texto é recusado sem gravar nada, ninguém aparece esperando no pulse, o tempo parado é zero e os quatro adaptadores dizem a regra."
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orkastery/cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "A software factory of AI agents that proves its work: parallel threads, verified results, and short decisions only when they matter.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/orkastery/orkastery#readme",
|
|
@@ -65,12 +65,16 @@
|
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/node": "^22.10.2",
|
|
68
|
-
"markdownlint-cli2": "^0.
|
|
69
|
-
"typescript": "^5.9.2"
|
|
68
|
+
"markdownlint-cli2": "^0.22.1"
|
|
70
69
|
},
|
|
71
70
|
"dependencies": {
|
|
72
71
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
72
|
+
"decode-named-character-reference": "1.3.0",
|
|
73
|
+
"micromark": "4.0.2",
|
|
74
|
+
"micromark-extension-gfm-table": "2.1.1",
|
|
75
|
+
"micromark-util-decode-numeric-character-reference": "2.0.2",
|
|
73
76
|
"smol-toml": "1.8.0",
|
|
77
|
+
"typescript": "5.9.3",
|
|
74
78
|
"zod": "3.25.76",
|
|
75
79
|
"zod-to-json-schema": "3.25.2"
|
|
76
80
|
}
|
|
@@ -54,7 +54,7 @@ flowchart LR
|
|
|
54
54
|
|
|
55
55
|
| # | Verificacao | Como se comprova |
|
|
56
56
|
|---|---|---|
|
|
57
|
-
| 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>"
|
|
57
|
+
| 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>" --por <quem>`. O comando recusa score fora da escala, score sem justificativa, score sem autoria humana em `--por` e classe fora do catalogo, e nao grava nada quando recusa. |
|
|
58
58
|
|
|
59
59
|
## Toda thread, no seu inicio
|
|
60
60
|
|
package/skills/README.md
CHANGED
|
@@ -18,7 +18,7 @@ faz, o nucleo vence, e a divergencia e defeito da skill.
|
|
|
18
18
|
| phases | [go-implementation](phases/go-implementation/SKILL.md) | `ork worktree ensure`, `ork verify --baseline` |
|
|
19
19
|
| phases | [check-quality](phases/check-quality/SKILL.md) | `ork verify`, `ork gate request` |
|
|
20
20
|
| phases | [ship-release](phases/ship-release/SKILL.md) | `ork ship` |
|
|
21
|
-
| phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master --aceitar-omissao` |
|
|
21
|
+
| phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master <thread> --aceitar-omissao` |
|
|
22
22
|
| reviewers | [code-reviewer](reviewers/code-reviewer/SKILL.md) | `references/code-review-axes.md` |
|
|
23
23
|
| reviewers | [security-auditor](reviewers/security-auditor/SKILL.md) | `references/security-checklist.md` |
|
|
24
24
|
| reviewers | [test-engineer](reviewers/test-engineer/SKILL.md) | `references/testing-patterns.md` |
|
|
@@ -24,8 +24,9 @@ preservando as demais respostas. Exemplo de opt-out:
|
|
|
24
24
|
`ork onboarding set maestro --conteudo '{"owner":{"experience":false}}' --por equipe`.
|
|
25
25
|
Sem resposta, mantenha a pergunta pendente: defaults efetivos não são autoria humana.
|
|
26
26
|
|
|
27
|
-
Peça somente referências de variáveis nas etapas sensíveis. Valores secretos ficam
|
|
28
|
-
`~/.hermes/.env
|
|
27
|
+
Peça somente referências de variáveis nas etapas sensíveis. Valores secretos ficam no ambiente do
|
|
28
|
+
processo ou no cofre do host (no Hermes, `~/.hermes/.env`); não os leia nem leve credenciais para
|
|
29
|
+
conversa, onboarding ou ledger.
|
|
29
30
|
Se o builder fornecer um segredo, não o repita: oriente a configuração local e registre apenas
|
|
30
31
|
a referência pública aceita pelo núcleo.
|
|
31
32
|
|
|
@@ -56,6 +56,7 @@ Prefira MCP no projeto fixado pelo servidor, sem outro root/cwd. No Claude com s
|
|
|
56
56
|
| Demanda nova | `ork_thread_new(nome, modo)` | `ork thread new "<nome>" --mode <modo> --worktree auto` |
|
|
57
57
|
| Despacho | `ork_phase_run(threadId, fase, prompt, runtime?, model?, effort?, dryRun?)` | `ork phase run <thread> GOAL --prompt "<pedido>"` |
|
|
58
58
|
| Progresso nativo | `ork_observe(threadId)` | `ork thread status <thread>` |
|
|
59
|
+
| Contexto do grafo (somente com `grafo.mcp: true`) | `ork_grafo_contexto(threadId, tetoBytes?)`; aprofundar com `ork_grafo_vizinhos`, `ork_grafo_chamadores`, `ork_grafo_importadores`, `ork_grafo_caminho` | `ork grafo contexto <thread> --json` |
|
|
59
60
|
| Pendencia/decisao | `ork_hitl_pending`, `ork_request_decision(threadId, pedidoId)` | Consulte o ingresso suportado; nao fabrique resposta. |
|
|
60
61
|
|
|
61
62
|
Prefira `ork_git_commit` (HEAD atual, paths com claims), `ork_verify` e `ork_ship` (HEADs fonte/destino reais) para registrar, verificar e entregar. Autoria/commit nao e SHIP; retorno incomplete exige reconciliacao antes de repetir. Para demandas novas, use `ork modos --do-pedido "<pedido do dono>"` e `ork_preflight({modo})` (CLI: `ork doctor --modo <modo>`). A sonda por bloco não comprova autenticação, gates ou entrega.
|
|
@@ -71,8 +72,7 @@ Dry-run nao inicia modelo, mas pode gravar prompt/eventos. Confira o trio efetiv
|
|
|
71
72
|
|
|
72
73
|
## Conducao durante o trabalho
|
|
73
74
|
|
|
74
|
-
O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados
|
|
75
|
-
rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
|
|
75
|
+
O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
|
|
76
76
|
|
|
77
77
|
Depois de uma acao, use o resultado do nucleo para executar o proximo passo autorizado.
|
|
78
78
|
Em #Auto/#Maestro, nao termine um bloco apenas oferecendo continuar quando ainda ha trabalho
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: master-metrics
|
|
3
|
-
description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master --aceitar-omissao."
|
|
3
|
+
description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master <thread> --aceitar-omissao."
|
|
4
4
|
bucket: phases
|
|
5
|
-
roteia: "ork master <thread> --score N --justificativa \"...\" | ork master --aceitar-omissao"
|
|
5
|
+
roteia: "ork master <thread> --score N --justificativa \"...\" | ork master <thread> --aceitar-omissao"
|
|
6
6
|
license: MIT
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -21,9 +21,14 @@ ork master classes # as classes de falha do catalogo
|
|
|
21
21
|
ork master <thread> --score 4 --justificativa "<texto>" --classe base-avancou --por <quem>
|
|
22
22
|
ork master # as entregas, com o indice derivado do ledger
|
|
23
23
|
ork master --todas # inclusive as ja pontuadas
|
|
24
|
-
ork master --aceitar-omissao
|
|
24
|
+
ork master <thread> --aceitar-omissao # aceita so a entrega desta thread, com indice e insumos no ledger
|
|
25
|
+
ork master --aceitar-omissao --dry-run # lista o que a forma sem thread fecharia, sem gravar
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
Agente fecha so a propria thread: `ork master <thread> --aceitar-omissao`. Sem a thread, o comando
|
|
29
|
+
aceita TODAS as entregues do projeto, inclusive as de outras frentes paralelas (o que aconteceu tres
|
|
30
|
+
vezes em 03/10/2026); de processo de agente com mais de uma, o `ork` avisa em stderr.
|
|
31
|
+
|
|
27
32
|
## O que o MASTER entrega
|
|
28
33
|
|
|
29
34
|
1. **POSTMORTEM tipado**, com as fases percorridas, o que falhou e a classe de falha vinda de um
|
|
@@ -38,9 +38,12 @@ ork phase list <thread> # a prova: mergeSha, shaRemoto, push
|
|
|
38
38
|
|
|
39
39
|
## O que o nucleo verifica por voce
|
|
40
40
|
|
|
41
|
-
A policy `push_direto_na_base` e bloqueante: origem igual ao destino,
|
|
42
|
-
do projeto,
|
|
43
|
-
|
|
41
|
+
A policy `push_direto_na_base` e bloqueante: origem igual ao destino, origem igual a branch base
|
|
42
|
+
do projeto, ou entrega sem delta com a base local a frente do remoto (o push publicaria commit que
|
|
43
|
+
nao passou por merge de thread) reprova antes de o `ork` tocar no remoto. O merge que o proprio
|
|
44
|
+
ship ja fez e nao chegou ao remoto (push recusado, `--sem-push`) nao conta: o ship repetido empurra.
|
|
45
|
+
Arvore de destino ocupada sai como `tree.blocked`; lease tomado por outra thread sai como
|
|
46
|
+
`lease.busy`.
|
|
44
47
|
|
|
45
48
|
## Racionalizacoes comuns
|
|
46
49
|
|