@orkastery/cli 0.5.1 → 0.5.6
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 +158 -0
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -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 +7 -6
- package/adapters/openclaw/README.md +26 -5
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +46 -11
- 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 +49 -11
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +116 -18
- package/dist/adapters/codex.js +14 -4
- package/dist/agents-md.js +24 -14
- package/dist/auditrun.js +22 -3
- package/dist/board.js +20 -17
- package/dist/branch-de-estado.js +88 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +21 -8
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +41 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +36 -1
- package/dist/conducao-sentinela.js +388 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +122 -30
- package/dist/conhecimento.js +490 -0
- package/dist/docs.js +70 -17
- package/dist/doctor-pulse-cron.js +349 -0
- package/dist/doctor-rede.js +150 -0
- package/dist/doctor.js +195 -111
- package/dist/entrega-pr.js +42 -29
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +181 -0
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +52 -14
- package/dist/fabrica-publicar.js +9 -1
- package/dist/fechamento.js +20 -66
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +31 -7
- package/dist/gates.js +3 -24
- package/dist/handoff.js +10 -6
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +38 -3
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/hitl.js +29 -33
- package/dist/horario.js +41 -7
- package/dist/hosts.js +104 -11
- package/dist/impedimento.js +299 -0
- package/dist/index.js +961 -542
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +9 -1
- package/dist/init.js +56 -43
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +170 -16
- package/dist/intelligence-graph-contexto.js +254 -0
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/leases.js +664 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +18 -1
- package/dist/licoes.js +1 -0
- package/dist/liveness.js +6 -3
- package/dist/locale-ajuda.js +761 -0
- package/dist/locale-gerados.js +160 -0
- package/dist/locale-master.js +99 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-pulse.js +211 -0
- package/dist/locale-retry.js +385 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-ship.js +494 -0
- package/dist/locale-thread.js +277 -0
- package/dist/locale-verify.js +125 -0
- package/dist/locale.js +714 -0
- package/dist/maestro-runtime.js +4 -1
- package/dist/manifest.js +149 -4
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +18 -11
- package/dist/master.js +145 -31
- package/dist/mcp-artifacts.js +43 -3
- package/dist/mcp-git.js +42 -8
- package/dist/mcp-grafo-worker.js +5 -3
- package/dist/mcp-grafo.js +55 -6
- package/dist/mcp-server.js +22 -3
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +48 -6
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +196 -18
- package/dist/noctum-arco.js +911 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-envelope.js +810 -0
- package/dist/noctum-execucao.js +304 -0
- package/dist/noctum-fila.js +280 -0
- package/dist/ocupacao.js +40 -5
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +99 -7
- package/dist/orquestracao.js +24 -21
- package/dist/parado-no-condutor.js +219 -38
- package/dist/phase.js +160 -52
- package/dist/policies.js +56 -5
- package/dist/portfolio.js +8 -3
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +132 -5
- package/dist/prompts.js +40 -1
- package/dist/prova-ativacao.js +75 -6
- package/dist/pulse-delivery.js +47 -4
- package/dist/pulse.js +98 -19
- package/dist/ratelimit.js +24 -6
- package/dist/recall.js +3 -1
- package/dist/redacao-saida.js +63 -0
- 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 +337 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +291 -140
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +150 -34
- package/dist/runtime-context.js +181 -3
- package/dist/runtime-profiles.js +22 -1
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +120 -24
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -18
- package/dist/sessoes.js +83 -2
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +157 -88
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +299 -49
- package/dist/util.js +8 -1
- package/dist/verify.js +141 -52
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +165 -0
- package/dist/worktree.js +25 -2
- package/dist/yaml.js +27 -8
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -1
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.COMANDO_CONFIRMAR_WORKTREE = exports.ARQUIVO_WORKTREE_LOCAL = exports.CONTRATO_WORKTREE_LOCAL = void 0;
|
|
37
|
+
exports.caminhoRealPrevisto = caminhoRealPrevisto;
|
|
38
|
+
exports.pastaDasWorktreesPedida = pastaDasWorktreesPedida;
|
|
39
|
+
exports.lerWorktreeLocal = lerWorktreeLocal;
|
|
40
|
+
exports.recusaDePastaDasWorktrees = recusaDePastaDasWorktrees;
|
|
41
|
+
exports.exigirPastaDasWorktrees = exigirPastaDasWorktrees;
|
|
42
|
+
exports.confirmarWorktreeLocal = confirmarWorktreeLocal;
|
|
43
|
+
exports.revogarWorktreeLocal = revogarWorktreeLocal;
|
|
44
|
+
/**
|
|
45
|
+
* RM-047 (fronteira de confiança, P3): a pasta das worktrees fora da raiz vale só com a confirmação
|
|
46
|
+
* desta máquina.
|
|
47
|
+
*
|
|
48
|
+
* O `worktree.dir` mora no `orkastery.yaml`, que vem com o repositório, e o `git worktree add` cria o
|
|
49
|
+
* checkout (e o `.gitignore` da pasta) onde ele apontar. Dentro da raiz do projeto, pelo caminho real,
|
|
50
|
+
* nada muda. Fora dela (`..`, caminho absoluto ou um link versionado que leva para fora), a criação
|
|
51
|
+
* recusa com `worktree.dir-fora-da-raiz` até a máquina confirmar a mesma pasta com
|
|
52
|
+
* `ork setup worktree confirmar`. A confirmação fica em `.orkastery/private/worktree-local.json`, com
|
|
53
|
+
* as mesmas regras da postura de sandbox (P1): pasta 0700, arquivo 0600, nunca link, nunca rastreado
|
|
54
|
+
* pelo git, e só para este checkout e esta pasta.
|
|
55
|
+
*/
|
|
56
|
+
const fs = __importStar(require("node:fs"));
|
|
57
|
+
const path = __importStar(require("node:path"));
|
|
58
|
+
const estado_thread_1 = require("./estado-thread");
|
|
59
|
+
const postura_local_1 = require("./postura-local");
|
|
60
|
+
const util_1 = require("./util");
|
|
61
|
+
exports.CONTRATO_WORKTREE_LOCAL = 'ork.worktree-local/v1';
|
|
62
|
+
exports.ARQUIVO_WORKTREE_LOCAL = 'worktree-local.json';
|
|
63
|
+
/**
|
|
64
|
+
* Caminho real de um caminho que talvez ainda não exista: o real do ancestral mais próximo que existe,
|
|
65
|
+
* mais o resto. Um link no caminho (inclusive versionado no clone) é resolvido aqui.
|
|
66
|
+
*/
|
|
67
|
+
function caminhoRealPrevisto(alvo) {
|
|
68
|
+
let atual = path.resolve(alvo);
|
|
69
|
+
const resto = [];
|
|
70
|
+
for (;;) {
|
|
71
|
+
try {
|
|
72
|
+
return path.join(fs.realpathSync(atual), ...resto.reverse());
|
|
73
|
+
}
|
|
74
|
+
catch { /* sobe */ }
|
|
75
|
+
const pai = path.dirname(atual);
|
|
76
|
+
if (pai === atual)
|
|
77
|
+
return path.resolve(alvo);
|
|
78
|
+
resto.push(path.basename(atual));
|
|
79
|
+
atual = pai;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** A pasta das worktrees que o manifesto pede, pelo caminho real, e se ela fica dentro da raiz. */
|
|
83
|
+
function pastaDasWorktreesPedida(raiz, manifesto) {
|
|
84
|
+
let principal;
|
|
85
|
+
try {
|
|
86
|
+
principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
principal = path.resolve(raiz);
|
|
90
|
+
}
|
|
91
|
+
const raizReal = caminhoRealPrevisto(principal);
|
|
92
|
+
const dir = caminhoRealPrevisto(path.resolve(principal, manifesto.worktree.dir));
|
|
93
|
+
const rel = path.relative(raizReal, dir);
|
|
94
|
+
const primeiro = rel.split(path.sep)[0];
|
|
95
|
+
const dentro = !rel.startsWith('..') && !path.isAbsolute(rel) && primeiro !== '.git';
|
|
96
|
+
return { dir, dentro };
|
|
97
|
+
}
|
|
98
|
+
/** Lê a confirmação local; `null` com o motivo quando ela não existe ou não vale. */
|
|
99
|
+
function lerWorktreeLocal(raiz) {
|
|
100
|
+
const { bruto: o, motivo } = (0, postura_local_1.lerArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
|
|
101
|
+
if (!o)
|
|
102
|
+
return { local: null, motivo };
|
|
103
|
+
if (o.contrato !== exports.CONTRATO_WORKTREE_LOCAL || typeof o.dir !== 'string' || typeof o.raiz !== 'string' ||
|
|
104
|
+
typeof o.confirmadoEm !== 'string' || typeof o.por !== 'string') {
|
|
105
|
+
return { local: null, motivo: `${exports.ARQUIVO_WORKTREE_LOCAL} fora do contrato ${exports.CONTRATO_WORKTREE_LOCAL}` };
|
|
106
|
+
}
|
|
107
|
+
if (o.raiz !== (0, postura_local_1.raizRealDoEstado)(raiz))
|
|
108
|
+
return { local: null, motivo: 'a confirmação local é de outro checkout' };
|
|
109
|
+
return { local: o, motivo: null };
|
|
110
|
+
}
|
|
111
|
+
/** Comando que confirma a pasta nesta máquina; vai em toda recusa. */
|
|
112
|
+
exports.COMANDO_CONFIRMAR_WORKTREE = 'ork setup worktree confirmar';
|
|
113
|
+
/**
|
|
114
|
+
* A recusa da criação de worktree: `null` quando a pasta do manifesto fica dentro da raiz, ou quando
|
|
115
|
+
* a máquina confirmou exatamente essa pasta; senão o erro tipado com o comando que confirma.
|
|
116
|
+
*/
|
|
117
|
+
function recusaDePastaDasWorktrees(raiz, manifesto) {
|
|
118
|
+
const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
|
|
119
|
+
if (dentro)
|
|
120
|
+
return null;
|
|
121
|
+
const { local, motivo } = lerWorktreeLocal(raiz);
|
|
122
|
+
if (local && local.dir === dir)
|
|
123
|
+
return null;
|
|
124
|
+
const porque = local ? `a máquina confirmou ${local.dir}` : motivo ?? 'sem confirmação local';
|
|
125
|
+
return `worktree.dir-fora-da-raiz: o orkastery.yaml pede worktree.dir: ${JSON.stringify(manifesto.worktree.dir).slice(0, 200)}, ` +
|
|
126
|
+
`que leva a ${dir}, fora da raiz do projeto (pelo caminho real), e esta máquina não confirmou essa pasta (${porque}). ` +
|
|
127
|
+
'Nenhuma worktree foi criada. O manifesto vem com o repositório; quem decide criar checkout fora da raiz é a ' +
|
|
128
|
+
`máquina. Para aceitar nesta máquina: ${exports.COMANDO_CONFIRMAR_WORKTREE} (ou volte worktree.dir para dentro do projeto, ` +
|
|
129
|
+
'como .claude/worktrees).';
|
|
130
|
+
}
|
|
131
|
+
/** Lança a recusa, quando houver. */
|
|
132
|
+
function exigirPastaDasWorktrees(raiz, manifesto) {
|
|
133
|
+
const recusa = recusaDePastaDasWorktrees(raiz, manifesto);
|
|
134
|
+
if (recusa)
|
|
135
|
+
throw new Error(recusa);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Grava a confirmação local da pasta que o manifesto pede hoje. Com `esperado`, ele precisa levar à
|
|
139
|
+
* mesma pasta: a máquina confirma o que leu, não o que o manifesto pode passar a dizer depois.
|
|
140
|
+
*/
|
|
141
|
+
function confirmarWorktreeLocal(raiz, manifesto, por, esperado) {
|
|
142
|
+
const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
|
|
143
|
+
if (esperado !== undefined) {
|
|
144
|
+
let principal;
|
|
145
|
+
try {
|
|
146
|
+
principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
principal = path.resolve(raiz);
|
|
150
|
+
}
|
|
151
|
+
const pedido = caminhoRealPrevisto(path.resolve(principal, esperado));
|
|
152
|
+
if (pedido !== dir) {
|
|
153
|
+
throw new Error(`worktree.dir-divergente: o orkastery.yaml leva a ${dir}, não a ${pedido}; nada foi confirmado`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (dentro)
|
|
157
|
+
throw new Error(`worktree.dir-dentro-da-raiz: ${dir} fica dentro do projeto e não precisa de confirmação`);
|
|
158
|
+
const local = { contrato: exports.CONTRATO_WORKTREE_LOCAL, dir, raiz: (0, postura_local_1.raizRealDoEstado)(raiz), confirmadoEm: (0, util_1.agora)(), por };
|
|
159
|
+
(0, postura_local_1.gravarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL, local);
|
|
160
|
+
return local;
|
|
161
|
+
}
|
|
162
|
+
/** Apaga a confirmação local; devolve se havia uma. */
|
|
163
|
+
function revogarWorktreeLocal(raiz) {
|
|
164
|
+
return (0, postura_local_1.revogarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
|
|
165
|
+
}
|
package/dist/worktree.js
CHANGED
|
@@ -64,9 +64,13 @@ 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
|
+
const procedencia_1 = require("./procedencia");
|
|
68
|
+
/**
|
|
69
|
+
* Diretorio canonico da worktree de uma thread, resolvido pelo `ork` na arvore principal: o mesmo que a criacao usa,
|
|
70
|
+
* tambem quando o comando roda de dentro de outra worktree (P4 do ensaio da 0.5.0).
|
|
71
|
+
*/
|
|
68
72
|
function dirDaWorktree(carregado, id) {
|
|
69
|
-
return
|
|
73
|
+
return (0, thread_1.pastaDaWorktree)(carregado, id);
|
|
70
74
|
}
|
|
71
75
|
/** Branch canonica da worktree de uma thread. */
|
|
72
76
|
function branchDaWorktree(thread) {
|
|
@@ -517,7 +521,18 @@ function auditarWorktree(carregado, id) {
|
|
|
517
521
|
correcao: `git -C ${dir} switch ${branchEsperada}`,
|
|
518
522
|
});
|
|
519
523
|
}
|
|
524
|
+
// RM-047 (P2): git so roda na worktree registrada e com o thread.json local.
|
|
525
|
+
let procedencia = null;
|
|
520
526
|
if (existe) {
|
|
527
|
+
try {
|
|
528
|
+
(0, procedencia_1.exigirCwdLocal)(raiz, id, dir, 'thread');
|
|
529
|
+
}
|
|
530
|
+
catch (e) {
|
|
531
|
+
procedencia = e.message;
|
|
532
|
+
checks.push({ nome: 'procedencia', nivel: 'fail', detalhe: procedencia, correcao: `ork worktree ensure ${id}` });
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (existe && procedencia === null) {
|
|
521
536
|
const limpa = arvoreLimpa(dir);
|
|
522
537
|
checks.push(limpa === true
|
|
523
538
|
? { nome: 'arvore', nivel: 'ok', detalhe: 'sem alteracao nao commitada' }
|
|
@@ -638,6 +653,14 @@ function liberarWorktree(carregado, id, opcoes = {}) {
|
|
|
638
653
|
correcao: '',
|
|
639
654
|
};
|
|
640
655
|
}
|
|
656
|
+
// RM-047 (P2): nada de git num diretorio que o thread.json escolheu e o git nao registra.
|
|
657
|
+
try {
|
|
658
|
+
(0, procedencia_1.exigirCwdLocal)(raiz, id, dir, 'thread');
|
|
659
|
+
}
|
|
660
|
+
catch (e) {
|
|
661
|
+
return { ok: false, removida: false, dir, branch, leasesLiberados: [], motivo: 'tree.blocked',
|
|
662
|
+
detalhe: e.message, correcao: `confira o diretorio e o thread.json da thread ${id}` };
|
|
663
|
+
}
|
|
641
664
|
const limpa = arvoreLimpa(dir);
|
|
642
665
|
if (limpa === false && !opcoes.forcar) {
|
|
643
666
|
return {
|
package/dist/yaml.js
CHANGED
|
@@ -55,10 +55,16 @@ function escalar(bruto) {
|
|
|
55
55
|
}
|
|
56
56
|
return t;
|
|
57
57
|
}
|
|
58
|
-
function preparar(texto) {
|
|
58
|
+
function preparar(texto, estrito) {
|
|
59
59
|
const linhas = [];
|
|
60
60
|
texto.split('\n').forEach((original, i) => {
|
|
61
|
-
const
|
|
61
|
+
const cortada = tirarComentario(original);
|
|
62
|
+
// D9: no modo estrito, o `#` depois do valor nao corta o valor calado (`titulo: Decisao #42`); com o `#`
|
|
63
|
+
// no texto, o valor vai entre aspas. Comentario na linha inteira segue valendo.
|
|
64
|
+
if (estrito && cortada !== original && cortada.trim() !== '') {
|
|
65
|
+
throw new Error(`YAML invalido na linha ${i + 1}: comentario depois do valor (com # no texto, use aspas)`);
|
|
66
|
+
}
|
|
67
|
+
const semComentario = cortada.replace(/\s+$/, '');
|
|
62
68
|
if (semComentario.trim() === '')
|
|
63
69
|
return;
|
|
64
70
|
if (semComentario.trim() === '---')
|
|
@@ -68,7 +74,7 @@ function preparar(texto) {
|
|
|
68
74
|
});
|
|
69
75
|
return linhas;
|
|
70
76
|
}
|
|
71
|
-
function parseBloco(linhas, inicio, indent) {
|
|
77
|
+
function parseBloco(linhas, inicio, indent, estrito) {
|
|
72
78
|
let i = inicio;
|
|
73
79
|
if (i >= linhas.length)
|
|
74
80
|
return [null, i];
|
|
@@ -89,6 +95,9 @@ function parseBloco(linhas, inicio, indent) {
|
|
|
89
95
|
throw new Error(`YAML invalido na linha ${linha.numero}: esperado "chave: valor"`);
|
|
90
96
|
}
|
|
91
97
|
const chave = linha.conteudo.slice(0, sep).trim().replace(/^["']|["']$/g, '');
|
|
98
|
+
if (estrito && (chave === '__proto__' || Object.hasOwn(mapa, chave))) {
|
|
99
|
+
throw new Error(`YAML invalido na linha ${linha.numero}: chave ${chave === '__proto__' ? 'reservada' : 'repetida'}`);
|
|
100
|
+
}
|
|
92
101
|
const resto = linha.conteudo.slice(sep + 1).trim();
|
|
93
102
|
i++;
|
|
94
103
|
if (resto !== '') {
|
|
@@ -96,7 +105,7 @@ function parseBloco(linhas, inicio, indent) {
|
|
|
96
105
|
continue;
|
|
97
106
|
}
|
|
98
107
|
if (i < linhas.length && linhas[i].indent > indent) {
|
|
99
|
-
const [filho, proximo] = parseBloco(linhas, i, linhas[i].indent);
|
|
108
|
+
const [filho, proximo] = parseBloco(linhas, i, linhas[i].indent, estrito);
|
|
100
109
|
mapa[chave] = filho;
|
|
101
110
|
i = proximo;
|
|
102
111
|
}
|
|
@@ -106,11 +115,21 @@ function parseBloco(linhas, inicio, indent) {
|
|
|
106
115
|
}
|
|
107
116
|
return [mapa, i];
|
|
108
117
|
}
|
|
109
|
-
/**
|
|
110
|
-
|
|
111
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Le um documento YAML do subconjunto suportado.
|
|
120
|
+
*
|
|
121
|
+
* RM-026 K7 (D9): `estrito` serve a quem le texto que nao e do `ork` (o frontmatter do conhecimento). Chave
|
|
122
|
+
* repetida no mesmo mapa, `__proto__`, comentario depois do valor e linha que sobra (indentacao fora do bloco)
|
|
123
|
+
* recusam, em vez de sumir calados como no modo padrao, que o `orkastery.yaml` e as paginas de docs seguem usando.
|
|
124
|
+
*/
|
|
125
|
+
function lerYaml(texto, opcoes = {}) {
|
|
126
|
+
const estrito = opcoes.estrito === true;
|
|
127
|
+
const linhas = preparar(texto, estrito);
|
|
112
128
|
if (linhas.length === 0)
|
|
113
129
|
return {};
|
|
114
|
-
const [valor] = parseBloco(linhas, 0, linhas[0].indent);
|
|
130
|
+
const [valor, proximo] = parseBloco(linhas, 0, linhas[0].indent, estrito);
|
|
131
|
+
if (estrito && proximo < linhas.length) {
|
|
132
|
+
throw new Error(`YAML invalido na linha ${linhas[proximo].numero}: indentacao fora do bloco`);
|
|
133
|
+
}
|
|
115
134
|
return valor;
|
|
116
135
|
}
|
|
@@ -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.6",
|
|
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` |
|
|
@@ -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
|