@orkastery/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +86 -65
- package/adapters/README.md +30 -15
- package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
- package/adapters/claude-code/README.md +110 -8
- package/adapters/claude-code/commands/onboarding.md +21 -0
- package/adapters/claude-code/commands/ork.md +99 -27
- package/adapters/claude-code/hooks/hooks.json +6 -1
- package/adapters/claude-code/hooks/ork-sensor.js +66 -0
- package/adapters/codex/skills/ork/SKILL.md +57 -0
- package/adapters/hermes/README.md +163 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
- package/adapters/hermes/bin/ork-brain.sh +4 -0
- package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
- package/adapters/hermes/bin/ork-maestro.sh +6 -0
- package/adapters/hermes/bin/ork-master-enviar.py +84 -0
- package/adapters/hermes/bin/ork-objective-message.sh +17 -0
- package/adapters/hermes/bin/ork-objective-status.sh +12 -0
- package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
- package/adapters/hermes/hermes.plugin.json +26 -4
- package/adapters/hermes/hitl-ingress/__init__.py +356 -0
- package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
- package/adapters/openclaw/README.md +135 -26
- package/adapters/openclaw/bin/ork-brain.sh +4 -0
- package/adapters/openclaw/construir.sh +19 -0
- package/adapters/openclaw/dist/hitl-ingress.js +199 -0
- package/adapters/openclaw/dist/index.js +437 -0
- package/adapters/openclaw/openclaw.plugin.json +39 -134
- package/adapters/openclaw/package.json +26 -0
- package/adapters/openclaw/src/hitl-ingress.ts +180 -0
- package/adapters/openclaw/src/index.ts +458 -0
- package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
- package/adapters/openclaw/tsconfig.json +15 -0
- package/assets/docs/markdownlint-cli2.jsonc +22 -0
- package/assets/docs/padroes/documentacao-de-produto.md +133 -0
- package/assets/docs/padroes/roadmap-de-produto.md +98 -0
- package/assets/docs/produto/README.md +14 -0
- package/assets/docs/produto/_modelo-feature.md +59 -0
- package/assets/docs/roadmap/README.md +14 -0
- package/assets/docs/roadmap/_modelo-item.md +73 -0
- package/assets/orkmind-native-schema.json +32 -0
- package/assets/orkmind_bridge.py +357 -0
- package/assets/orkmind_fixture.py +67 -0
- package/assets/orkmind_prospective.py +138 -0
- package/assets/reference-tariffs-i07.json +23 -0
- package/dist/adapters/claude-bg.js +488 -39
- package/dist/adapters/codex-controller-sensor.js +449 -0
- package/dist/adapters/codex-controller-worker.js +361 -0
- package/dist/adapters/codex-controller.js +252 -0
- package/dist/adapters/codex-events.js +205 -0
- package/dist/adapters/codex-question.js +26 -0
- package/dist/adapters/codex-runner.js +133 -0
- package/dist/adapters/codex.js +394 -0
- package/dist/agents-md.js +84 -0
- package/dist/auditoria.js +11 -8
- package/dist/auditrun.js +5 -4
- package/dist/board.js +173 -22
- package/dist/branch-de-estado.js +136 -0
- package/dist/canarios-hitl.js +177 -0
- package/dist/canarios-i43.js +543 -0
- package/dist/canarios-pulse.js +147 -0
- package/dist/canarios-sensores.js +129 -0
- package/dist/canarios.js +111 -2
- package/dist/catalogo.js +9 -0
- package/dist/ci.js +216 -0
- package/dist/ciclos.js +2 -1
- package/dist/claim-lint.js +64 -0
- package/dist/claims.js +60 -0
- package/dist/company-brain-capture.js +195 -0
- package/dist/company-brain-cli.js +123 -0
- package/dist/company-brain-client.js +61 -0
- package/dist/company-brain-contract.js +166 -0
- package/dist/company-brain-journal.js +192 -0
- package/dist/company-brain-mcp.js +33 -0
- package/dist/company-brain-migration.js +60 -0
- package/dist/company-brain-source.js +177 -0
- package/dist/company-brain-worker.js +18 -0
- package/dist/conducao-texto.js +61 -0
- package/dist/conducao.js +876 -0
- package/dist/contrato-publico.js +39 -0
- package/dist/creation-operation-store.js +251 -0
- package/dist/creation-operation.js +148 -0
- package/dist/decisao-autonoma.js +183 -0
- package/dist/delegation.js +79 -0
- package/dist/demo.js +120 -0
- package/dist/docs.js +828 -0
- package/dist/doctor.js +183 -24
- package/dist/entrega-pr.js +117 -0
- package/dist/escopo-escrita.js +71 -0
- package/dist/estado-thread.js +222 -0
- package/dist/evalrunner.js +12 -0
- package/dist/fabrica-estado.js +329 -0
- package/dist/fabrica-publicar.js +76 -0
- package/dist/fix.js +21 -0
- package/dist/gates.js +55 -9
- package/dist/handoff.js +39 -23
- package/dist/hitl-canais.js +333 -0
- package/dist/hitl-classificacao.js +131 -0
- package/dist/hitl-contract.js +465 -0
- package/dist/hitl-estado.js +136 -0
- package/dist/hitl-gates.js +554 -0
- package/dist/hitl-ingress-receipt.js +382 -0
- package/dist/hitl-local-atestado.js +57 -0
- package/dist/hitl-local-receipt.js +328 -0
- package/dist/hitl-local.js +143 -0
- package/dist/hitl-lock.js +139 -0
- package/dist/hitl-lote.js +223 -0
- package/dist/hitl-native-offer.js +97 -0
- package/dist/hitl-native.js +65 -0
- package/dist/hitl-presentation.js +209 -0
- package/dist/hitl-public-receipt.js +176 -0
- package/dist/hitl-resumo.js +209 -0
- package/dist/hitl-sessions.js +475 -0
- package/dist/hitl.js +711 -0
- package/dist/horario.js +269 -0
- package/dist/hosts.js +198 -22
- package/dist/index.js +1736 -93
- package/dist/indice.js +99 -0
- package/dist/init.js +28 -3
- package/dist/integracoes-locais.js +17 -0
- package/dist/leases.js +65 -21
- package/dist/ledger-stats.js +272 -0
- package/dist/ledger.js +107 -2
- package/dist/licoes.js +215 -0
- package/dist/liveness.js +218 -0
- package/dist/maestro-actions.js +51 -0
- package/dist/maestro-authority.js +152 -0
- package/dist/maestro-cli.js +97 -0
- package/dist/maestro-contract.js +55 -0
- package/dist/maestro-discovery.js +132 -0
- package/dist/maestro-runtime.js +268 -0
- package/dist/maestro-snapshot.js +86 -0
- package/dist/maestro-sources.js +224 -0
- package/dist/manifest.js +165 -6
- package/dist/maquina.js +102 -0
- package/dist/master-audit.js +101 -0
- package/dist/master-batch.js +43 -0
- package/dist/master-digest.js +149 -0
- package/dist/master-migracao.js +155 -0
- package/dist/master.js +361 -77
- package/dist/mcp-artifacts.js +234 -0
- package/dist/mcp-git.js +433 -0
- package/dist/mcp-install.js +310 -0
- package/dist/mcp-maestro.js +25 -0
- package/dist/mcp-server.js +469 -0
- package/dist/mcp-ship.js +436 -0
- package/dist/mcp-verify.js +173 -0
- package/dist/memoria-humana.js +207 -0
- package/dist/memoria.js +314 -78
- package/dist/memory-migration.js +279 -0
- package/dist/memory-prospective.js +148 -0
- package/dist/modos-migracao.js +191 -0
- package/dist/modos.js +151 -15
- package/dist/monitor-lock.js +110 -0
- package/dist/objective.js +449 -0
- package/dist/ocupacao.js +267 -0
- package/dist/onboarding.js +303 -0
- package/dist/orkmind.js +389 -90
- package/dist/orquestracao.js +96 -69
- package/dist/phase.js +596 -150
- package/dist/playbook-capabilities.js +150 -0
- package/dist/playbook-contracts.js +188 -0
- package/dist/portfolio-context.js +61 -0
- package/dist/portfolio.js +180 -0
- package/dist/preflight.js +207 -0
- package/dist/process-audit.js +112 -0
- package/dist/project-state.js +93 -0
- package/dist/prompts.js +25 -5
- package/dist/prova-minima.js +112 -0
- package/dist/pulse-cadencia.js +163 -0
- package/dist/pulse-consentimento.js +260 -0
- package/dist/pulse-delivery.js +323 -0
- package/dist/pulse-resposta.js +542 -0
- package/dist/pulse.js +262 -0
- package/dist/ratelimit.js +35 -2
- package/dist/recall.js +80 -3
- package/dist/redacao-saida.js +45 -0
- package/dist/redacao-url.js +66 -0
- package/dist/retry.js +637 -115
- package/dist/roadmap-reservas.js +243 -0
- package/dist/runtime-ambiente.js +38 -0
- package/dist/runtime-context.js +215 -0
- package/dist/runtime-profiles.js +869 -0
- package/dist/runtimes.js +103 -0
- package/dist/sandbox.js +9 -0
- package/dist/session-events.js +203 -0
- package/dist/session-watcher-claude.js +637 -0
- package/dist/session-watcher.js +683 -0
- package/dist/sessoes-adopt.js +154 -0
- package/dist/sessoes-inventario.js +159 -0
- package/dist/sessoes.js +16 -35
- package/dist/setup.js +691 -0
- package/dist/ship.js +150 -15
- package/dist/slug.js +1 -1
- package/dist/thread-close.js +115 -0
- package/dist/thread.js +142 -28
- package/dist/tokens.js +1 -1
- package/dist/util.js +4 -2
- package/dist/verify-sandbox.js +265 -0
- package/dist/verify.js +270 -25
- package/dist/versao.js +60 -0
- package/dist/worktree.js +31 -2
- package/dist/write-activation.js +291 -0
- package/dist/yaml.js +2 -0
- package/eval/casos/onboarding.json +102 -0
- package/eval/casos/orkastery-bootstrap.json +35 -1
- package/eval/casos/scope-check-capability-map.json +45 -7
- package/eval/casos/ship-release.json +2 -2
- package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
- package/eval/fixtures/b2-master-log/caso.json +1 -1
- package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
- package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
- package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
- package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
- package/eval/fixtures/fx-codex-dry/caso.json +18 -0
- package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
- package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
- package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
- package/eval/fixtures/fx-happy/caso.json +6 -4
- package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
- package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
- package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
- package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
- package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
- package/eval/fixtures/fx-omnicanal/caso.json +17 -0
- package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
- package/monitor/company-brain.cjs +17 -0
- package/monitor/pulse-scope.cjs +45 -0
- package/monitor/pulse.cron +18 -0
- package/monitor/varredura-pulse.sh +27 -0
- package/package.json +25 -4
- package/schemas/claims.schema.json +25 -0
- package/schemas/company-brain.schema.json +1158 -0
- package/schemas/creation-operation.schema.json +365 -0
- package/schemas/maestro-snapshot.schema.json +2716 -0
- package/skills/core/onboarding/SKILL.md +50 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
- package/skills/core/thread-state/SKILL.md +3 -1
- package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
|
@@ -0,0 +1,207 @@
|
|
|
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.umaskDoProcesso = umaskDoProcesso;
|
|
37
|
+
exports.sondasDeAmbiente = sondasDeAmbiente;
|
|
38
|
+
exports.checkDeContas = checkDeContas;
|
|
39
|
+
exports.preflight = preflight;
|
|
40
|
+
exports.textoPreflight = textoPreflight;
|
|
41
|
+
/** Preflight contextual de despacho: nenhuma sessão, instalação ou configuração é alterada. */
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
const manifest_1 = require("./manifest");
|
|
45
|
+
const estado_thread_1 = require("./estado-thread");
|
|
46
|
+
const claude_bg_1 = require("./adapters/claude-bg");
|
|
47
|
+
const codex_1 = require("./adapters/codex");
|
|
48
|
+
const runtime_profiles_1 = require("./runtime-profiles");
|
|
49
|
+
const modos_1 = require("./modos");
|
|
50
|
+
const setup_1 = require("./setup");
|
|
51
|
+
const phase_1 = require("./phase");
|
|
52
|
+
const runtimes_1 = require("./runtimes");
|
|
53
|
+
const codex_2 = require("./adapters/codex");
|
|
54
|
+
const runtime_ambiente_1 = require("./runtime-ambiente");
|
|
55
|
+
const slug_1 = require("./slug");
|
|
56
|
+
const util_1 = require("./util");
|
|
57
|
+
const horario_1 = require("./horario");
|
|
58
|
+
const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
|
|
59
|
+
const sensoresPadrao = {
|
|
60
|
+
runtime: nome => !!(0, runtimes_1.resolverRuntime)(nome).disponivel(),
|
|
61
|
+
sandboxCodex: () => (0, codex_2.sondarSandbox)().ok,
|
|
62
|
+
auth: authPadrao,
|
|
63
|
+
};
|
|
64
|
+
/** umask efetivo do processo, lido de /proc (Linux) para nao usar o getter deprecado. */
|
|
65
|
+
function umaskDoProcesso() {
|
|
66
|
+
try {
|
|
67
|
+
const m = /^Umask:\s*([0-7]+)$/m.exec(fs.readFileSync('/proc/self/status', 'utf8'));
|
|
68
|
+
return m ? parseInt(m[1], 8) : null;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* I-33 (D7): sonda de umask e das permissoes do estado, coerente com a recusa 0o022 do sensor
|
|
76
|
+
* (rollout e diretorio pai) e com o 0700 exato da pasta privada (HITL e perfis). Umask que deixa
|
|
77
|
+
* grupo ou outros escreverem afrouxa o que o runtime cria e o sensor reprova depois.
|
|
78
|
+
*/
|
|
79
|
+
function sondasDeAmbiente(raiz, umask = umaskDoProcesso()) {
|
|
80
|
+
const checks = [];
|
|
81
|
+
const octal = (v) => '0' + v.toString(8).padStart(3, '0');
|
|
82
|
+
checks.push(umask === null ? { nome: 'umask', nivel: 'warn', detalhe: 'umask do processo nao medido nesta plataforma' }
|
|
83
|
+
: (umask & 0o022) === 0o022 ? { nome: 'umask', nivel: 'ok', detalhe: `umask ${octal(umask)} nega escrita de grupo e outros` }
|
|
84
|
+
: { nome: 'umask', nivel: 'warn', detalhe: `umask ${octal(umask)} permite escrita de grupo ou outros: o que o runtime criar sera recusado pelo sensor (bits 0o022)`,
|
|
85
|
+
correcao: 'umask 022 (ou 077) no shell que roda o ork e os runtimes' });
|
|
86
|
+
const estado = path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery');
|
|
87
|
+
let st = null;
|
|
88
|
+
try {
|
|
89
|
+
st = fs.lstatSync(estado);
|
|
90
|
+
}
|
|
91
|
+
catch { /* ausencia e do check de estado do projeto */ }
|
|
92
|
+
if (st)
|
|
93
|
+
checks.push(!st.isDirectory() || st.isSymbolicLink() ? { nome: 'permissoes do estado', nivel: 'fail', detalhe: `${estado} nao e diretorio real` }
|
|
94
|
+
: st.mode & 0o022 ? { nome: 'permissoes do estado', nivel: 'warn', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}: grupo ou outros podem escrever no estado`, correcao: `chmod go-w ${estado}` }
|
|
95
|
+
: { nome: 'permissoes do estado', nivel: 'ok', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}` });
|
|
96
|
+
const privada = path.join(estado, 'private');
|
|
97
|
+
let sp = null;
|
|
98
|
+
try {
|
|
99
|
+
sp = fs.lstatSync(privada);
|
|
100
|
+
}
|
|
101
|
+
catch { /* criada sob demanda */ }
|
|
102
|
+
checks.push(!sp ? { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} ausente: criada sob demanda com 0700` }
|
|
103
|
+
: !sp.isDirectory() || sp.isSymbolicLink() || sp.uid !== process.getuid?.() || (sp.mode & 0o777) !== 0o700
|
|
104
|
+
? { nome: 'pasta privada', nivel: 'fail', detalhe: `${privada} precisa ser diretorio 0700 do proprio usuario (modo ${octal(sp.mode & 0o777)}): recibo HITL e perfis recusam`, correcao: `chmod 700 ${privada}` }
|
|
105
|
+
: { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} com modo 0700` });
|
|
106
|
+
return checks;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* I-33 (D7): contas do runtime do bloco. Sem perfil, o despacho usa o ambiente do processo e
|
|
110
|
+
* nada e sondado (P8). Com perfis, o bloco so fica pronto com ao menos um perfil disponivel e
|
|
111
|
+
* com login conferido pelo proprio CLI. A sonda nao marca o store: quem marca e o despacho.
|
|
112
|
+
*/
|
|
113
|
+
function checkDeContas(raiz, runtime, auth = authPadrao) {
|
|
114
|
+
let perfis;
|
|
115
|
+
try {
|
|
116
|
+
perfis = (0, runtime_profiles_1.perfisDoRuntime)((0, runtime_profiles_1.lerPerfisComContas)(raiz), runtime).filter(p => p.estado !== 'desativado');
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
return { nome: 'contas', nivel: 'fail', detalhe: `store de perfis invalido: ${e.message}` };
|
|
120
|
+
}
|
|
121
|
+
if (!perfis.length)
|
|
122
|
+
return { nome: 'contas', nivel: 'ok', detalhe: `${runtime} sem perfil configurado: despacho pelo ambiente do processo` };
|
|
123
|
+
const estados = perfis.map(p => {
|
|
124
|
+
const a = auth((0, runtime_profiles_1.perfilDeDespacho)(p));
|
|
125
|
+
return { id: p.id, pronto: a.ok && (0, runtime_profiles_1.perfilDisponivel)(p),
|
|
126
|
+
texto: !a.ok ? `${a.pago ? 'provider pago, nunca despacha' : a.transitorio ? 'conferencia de login inconclusiva' : 'sem login'} (${a.detalhe})` : (0, runtime_profiles_1.perfilDisponivel)(p) ? 'pronto' : `${p.estado}${p.esgotadoAte ? ` ate ${p.esgotadoAte}` : ''}` };
|
|
127
|
+
});
|
|
128
|
+
const prontos = estados.filter(e => e.pronto).length;
|
|
129
|
+
return { nome: 'contas', nivel: prontos === 0 ? 'fail' : prontos < estados.length ? 'warn' : 'ok',
|
|
130
|
+
detalhe: `${runtime}: ${estados.map(e => `${e.id} ${e.texto}`).join('; ')}`,
|
|
131
|
+
...(prontos < estados.length ? { correcao: 'ork accounts check marca os perfis; ork accounts add refaz o login pelo proprio CLI' } : {}) };
|
|
132
|
+
}
|
|
133
|
+
const limites = [
|
|
134
|
+
'Sonda contextual local: não inventaria sessões, não inicia modelo e não autoriza despacho.',
|
|
135
|
+
'Aceitação do modelo, instalação do adaptador/MCP, contexto da thread, gates e policies do pedido são revalidados no despacho; com perfis, o login de cada conta é conferido aqui e de novo no despacho.',
|
|
136
|
+
'Trio sem override; um override posterior exige resolver e verificar novamente o despacho.',
|
|
137
|
+
'VERIFY/SHIP MCP exigem executor Codex isolado próprio e transporte SHIP válido; a sonda de despacho não comprova entrega.',
|
|
138
|
+
];
|
|
139
|
+
function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDeProviderAtivos)(), sensores = sensoresPadrao) {
|
|
140
|
+
// I-43: a matriz tem os cinco (para LER thread antiga); quem entra aqui e ESCRITA.
|
|
141
|
+
if (!modos_1.ORDEM_DOS_MODOS.includes(modo))
|
|
142
|
+
throw Error('preflight.mode.invalid');
|
|
143
|
+
const checks = [];
|
|
144
|
+
checks.push({ nome: 'node', nivel: Number(process.versions.node.split('.')[0]) >= 20 ? 'ok' : 'fail', detalhe: 'Node 20 ou superior necessário' });
|
|
145
|
+
const git = !!(0, util_1.noPath)('git');
|
|
146
|
+
checks.push({ nome: 'git', nivel: git ? 'ok' : 'fail', detalhe: git ? 'Git disponível' : 'Git ausente' });
|
|
147
|
+
const repo = git ? (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], raiz, 10000) : null;
|
|
148
|
+
checks.push({ nome: 'repositorio', nivel: repo?.ok && repo.stdout.trim() === 'true' ? 'ok' : 'fail', detalhe: 'Repositório Git local necessário' });
|
|
149
|
+
checks.push(...sondasDeAmbiente(raiz));
|
|
150
|
+
const carregado = (0, manifest_1.carregarManifesto)(raiz);
|
|
151
|
+
const blocos = [];
|
|
152
|
+
checks.push({ nome: 'manifesto', nivel: !carregado || carregado.erros.length ? 'fail' : 'ok', detalhe: !carregado ? 'Manifesto ausente' : carregado.erros.length ? 'Manifesto inválido; corrija antes do despacho' : 'Manifesto válido' });
|
|
153
|
+
if (carregado && !carregado.erros.length) {
|
|
154
|
+
const m = carregado.manifesto;
|
|
155
|
+
checks.push({ nome: 'modo', nivel: m.conduction.allowed_modes.includes(modo) ? 'ok' : 'fail', detalhe: `Modo solicitado: ${modo}` });
|
|
156
|
+
checks.push({ nome: 'abbrev', nivel: (0, slug_1.validarAbbrev)(m.project.abbrev).ok ? 'ok' : 'fail', detalhe: 'Identidade curta do projeto validada' });
|
|
157
|
+
const setup = (0, setup_1.lerSetup)(carregado.raiz), observados = new Map(), contas = new Map();
|
|
158
|
+
let sandbox;
|
|
159
|
+
for (const [i, bloco] of modos_1.MODOS[modo].blocos.entries()) {
|
|
160
|
+
const locais = [];
|
|
161
|
+
let trio = null;
|
|
162
|
+
try {
|
|
163
|
+
trio = (0, phase_1.resolverDespacho)(m, {}, (0, setup_1.configDoBloco)(setup, modo, bloco.fases[0]));
|
|
164
|
+
(0, runtimes_1.resolverRuntime)(trio.runtime);
|
|
165
|
+
locais.push({ nome: 'trio', nivel: 'ok', detalhe: 'Runtime/modelo/esforço resolvidos pelo mesmo contrato do despacho; aceitação nativa não comprovada' });
|
|
166
|
+
if (!observados.has(trio.runtime))
|
|
167
|
+
observados.set(trio.runtime, sensores.runtime(trio.runtime));
|
|
168
|
+
const presente = observados.get(trio.runtime);
|
|
169
|
+
locais.push({ nome: 'runtime', nivel: presente ? 'ok' : 'fail', detalhe: presente ? `${trio.runtime} disponível` : `${trio.runtime} ausente` });
|
|
170
|
+
if (presente) {
|
|
171
|
+
if (!contas.has(trio.runtime))
|
|
172
|
+
contas.set(trio.runtime, checkDeContas(carregado.raiz, trio.runtime, sensores.auth ?? authPadrao));
|
|
173
|
+
locais.push(contas.get(trio.runtime));
|
|
174
|
+
}
|
|
175
|
+
if (trio.runtime === 'codex' && presente) {
|
|
176
|
+
sandbox ??= sensores.sandboxCodex();
|
|
177
|
+
locais.push({ nome: 'sandbox de despacho', nivel: sandbox ? 'ok' : m.runtime.sandbox === 'danger-full-access' ? 'warn' : 'fail', detalhe: sandbox ? 'Sonda Codex sem modelo executou' : 'Sonda Codex falhou; não altere o sandbox para contornar a falha' });
|
|
178
|
+
}
|
|
179
|
+
const ativos = nomesHerdados.filter(n => runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO.includes(n));
|
|
180
|
+
const relevantes = ativos.filter(n => trio.runtime === 'claude-bg' ? /^(ANTHROPIC_|CLAUDE_CODE_USE_)/.test(n) : /^(OPENAI_|OPENROUTER_)/.test(n));
|
|
181
|
+
locais.push({ nome: 'provider', nivel: m.runtime.provider_policy === 'subscription-only' && relevantes.length ? 'fail' : ativos.length ? 'warn' : 'ok', detalhe: relevantes.length ? `Nomes de provider incompatíveis com assinatura: ${relevantes.join(', ')}` : ativos.length ? 'Há nomes de provider alheios ao runtime; não usar credenciais pagas' : 'Nenhum nome de provider pago ativo' });
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
locais.push({ nome: 'trio', nivel: 'fail', detalhe: 'Setup/trio ou sonda inválidos; complete o modelo e confira o runtime no setup canônico' });
|
|
185
|
+
}
|
|
186
|
+
blocos.push({ numero: i + 1, fases: [...bloco.fases], trio, checks: locais, pronto: locais.every(c => c.nivel !== 'fail') });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const basePronta = checks.every(c => c.nivel !== 'fail');
|
|
190
|
+
return { modo, scope: 'dispatch-local', checks, blocos,
|
|
191
|
+
prontoPrimeiroBloco: basePronta && !!blocos[0]?.pronto,
|
|
192
|
+
prontoTodosBlocos: basePronta && blocos.length > 0 && blocos.every(b => b.pronto),
|
|
193
|
+
entrega: { verificada: false, dependencias: ['executor Codex isolado', 'transporte SHIP instalado', 'gates e HEADs correntes'] }, limites: [...limites] };
|
|
194
|
+
}
|
|
195
|
+
function textoPreflight(r) {
|
|
196
|
+
// I-35: o Check guarda o ISO (dado de maquina); quem imprime para o dono localiza.
|
|
197
|
+
let localizou = false;
|
|
198
|
+
const local = (t) => { const l = (0, horario_1.localizarTexto)(t); if (l !== t)
|
|
199
|
+
localizou = true; return l; };
|
|
200
|
+
const linhas = ['ork doctor contextual: ' + r.modo, ...r.checks.map(c => `${c.nivel}: ${c.nome}: ${local(c.detalhe)}`),
|
|
201
|
+
...r.blocos.flatMap(b => [`bloco ${b.numero} ${b.fases.join('→')}: ${b.trio ? `${b.trio.runtime}/${b.trio.model}/${b.trio.effort}` : 'trio pendente'}`, ...b.checks.map(c => ` ${c.nivel}: ${c.nome}: ${local(c.detalhe)}`)]),
|
|
202
|
+
`Primeiro bloco: ${r.prontoPrimeiroBloco ? 'sonda pronta' : 'bloqueado'}; todos os blocos: ${r.prontoTodosBlocos ? 'sonda pronta' : 'dependências pendentes'}`, ...r.limites];
|
|
203
|
+
// O fuso sai uma vez por mensagem, depois dos limites.
|
|
204
|
+
if (localizou)
|
|
205
|
+
linhas.push((0, horario_1.legendaDoFuso)());
|
|
206
|
+
return linhas.join('\n');
|
|
207
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
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.inspecionarProcesso = inspecionarProcesso;
|
|
37
|
+
exports.auditarProcesso = auditarProcesso;
|
|
38
|
+
/** PR1..PR3 derivados do estado canônico, sem runtime de LLM. */
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const node_crypto_1 = require("node:crypto");
|
|
41
|
+
const thread_1 = require("./thread");
|
|
42
|
+
const ledger_1 = require("./ledger");
|
|
43
|
+
const master_1 = require("./master");
|
|
44
|
+
const thread_close_1 = require("./thread-close");
|
|
45
|
+
const estado_thread_1 = require("./estado-thread");
|
|
46
|
+
const divida_1 = require("./divida");
|
|
47
|
+
const auditoria_1 = require("./auditoria");
|
|
48
|
+
function inspecionarProcesso(raiz) {
|
|
49
|
+
const achados = [], motivos = new Map();
|
|
50
|
+
const adicionar = (regra, threads, motivo) => {
|
|
51
|
+
threads.sort();
|
|
52
|
+
const chave = (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(regra === 'PR3' ? [regra, motivo] : [regra, threads, motivo])).digest('hex');
|
|
53
|
+
achados.push({ regra, chave, threads, motivo, evidencia: threads.map(id => `.orkastery/threads/${id}/ledger.jsonl`) });
|
|
54
|
+
};
|
|
55
|
+
for (const id of (0, thread_1.listarIds)(raiz)) {
|
|
56
|
+
const t = (0, thread_1.lerThread)(raiz, id), eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id));
|
|
57
|
+
if (!t.fechamentoAdmin && (0, thread_close_1.provaDeEntrega)(raiz, id)) {
|
|
58
|
+
let temLog = false;
|
|
59
|
+
try {
|
|
60
|
+
const log = JSON.parse(fs.readFileSync((0, master_1.caminhoMasterLog)(raiz, id), 'utf8'));
|
|
61
|
+
temLog = log.thread === id && [master_1.CONTRATO_MASTER_LOG, master_1.CONTRATO_MASTER_PENDENTE].includes(log.contrato);
|
|
62
|
+
}
|
|
63
|
+
catch { /* ausência ou JSON inválido é PR1 */ }
|
|
64
|
+
if (!temLog)
|
|
65
|
+
adicionar('PR1', [id], 'entrega sem MASTER log válido');
|
|
66
|
+
if (!(0, master_1.masterRatificado)(raiz, id))
|
|
67
|
+
adicionar('PR2', [id], 'entrega sem ratificação humana');
|
|
68
|
+
}
|
|
69
|
+
for (const e of eventos)
|
|
70
|
+
if (e.tipo === 'gate_blocked' && typeof e.motivo === 'string' && e.motivo.trim()) {
|
|
71
|
+
const ids = motivos.get(e.motivo) ?? new Set();
|
|
72
|
+
ids.add(id);
|
|
73
|
+
motivos.set(e.motivo, ids);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [motivo, ids] of motivos)
|
|
77
|
+
if (ids.size >= 2)
|
|
78
|
+
adicionar('PR3', [...ids], motivo);
|
|
79
|
+
return achados.sort((a, b) => a.chave.localeCompare(b.chave));
|
|
80
|
+
}
|
|
81
|
+
function auditarProcesso(carregado, registrarNoBoard = false) {
|
|
82
|
+
const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz), { manifesto } = carregado;
|
|
83
|
+
const achados = inspecionarProcesso(raiz), postura = auditoria_1.POSTURA_DO_ESTAGIO[manifesto.project.stage];
|
|
84
|
+
const ids = [];
|
|
85
|
+
if (registrarNoBoard) {
|
|
86
|
+
const existentes = (0, divida_1.lerBoard)(raiz);
|
|
87
|
+
for (const a of achados) {
|
|
88
|
+
const rodada = `process-${a.chave}`;
|
|
89
|
+
const anterior = existentes.find(e => e.rodada === rodada && e.regra === a.regra);
|
|
90
|
+
if (anterior) {
|
|
91
|
+
const descricao = `${a.threads.join(', ')}: ${a.motivo}`;
|
|
92
|
+
if (anterior.descricao !== descricao || anterior.arquivo !== a.evidencia[0]) {
|
|
93
|
+
(0, divida_1.carimbarAchado)(raiz, anterior, { descricao, arquivo: a.evidencia[0],
|
|
94
|
+
claim: { ...anterior.claim, arquivo: a.evidencia[0], alegacao: `${a.regra} observado em ${a.threads.join(', ')}` } });
|
|
95
|
+
}
|
|
96
|
+
ids.push(anterior.id);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const comando = `node core/dist/index.js audit process --exigir-achado ${a.chave}`;
|
|
100
|
+
const r = (0, divida_1.registrarAchado)(raiz, { rodada, pack: 'process', regra: a.regra, severidade: 'menor',
|
|
101
|
+
titulo: `${a.regra}: ${a.motivo}`, arquivo: a.evidencia[0], descricao: `${a.threads.join(', ')}: ${a.motivo}`,
|
|
102
|
+
alegacao: `${a.regra} observado em ${a.threads.join(', ')}`, verificar: [comando],
|
|
103
|
+
impacto: 'Entrega ou repetição de falha sem aprendizado humano confirmado',
|
|
104
|
+
fix: a.regra === 'PR3' ? 'Revisar o motivo recorrente e propor controle no roadmap' : 'Revisar a entrega e concluir MASTER com ratificação humana',
|
|
105
|
+
estimativa: '1h', irreversivel: 'nenhum', produto: manifesto.project.name, estagio: manifesto.project.stage,
|
|
106
|
+
postura, memory: manifesto.memory.mode });
|
|
107
|
+
existentes.push(r);
|
|
108
|
+
ids.push(r.id);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { contrato: 'ork.process-audit/v1', postura, achados, board: ids };
|
|
112
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
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.projectState = projectState;
|
|
37
|
+
exports.stateFile = stateFile;
|
|
38
|
+
exports.stateFileStatus = stateFileStatus;
|
|
39
|
+
exports.memoryState = memoryState;
|
|
40
|
+
/** D3: estado da main validada; código e verificadores continuam na candidata. */
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
const estado_thread_1 = require("./estado-thread");
|
|
44
|
+
const manifest_1 = require("./manifest");
|
|
45
|
+
function projectState(root) {
|
|
46
|
+
try {
|
|
47
|
+
const codeRoot = fs.realpathSync(root);
|
|
48
|
+
const canonical = fs.realpathSync((0, estado_thread_1.raizDoEstado)(codeRoot));
|
|
49
|
+
return { root: canonical, codeRoot, linked: canonical !== codeRoot };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error('project-state.root.invalid');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function stateFile(root, name) {
|
|
56
|
+
const state = projectState(root);
|
|
57
|
+
const target = path.join(state.root, '.orkastery', name);
|
|
58
|
+
// Uma leitura da WT não pode criar uma segunda autoridade por falta da fonte.
|
|
59
|
+
if (state.linked && !fs.existsSync(target))
|
|
60
|
+
throw new Error('project-state.source.missing');
|
|
61
|
+
return target;
|
|
62
|
+
}
|
|
63
|
+
/** Diagnóstico separado da leitura: cópias locais nunca substituem a autoridade. */
|
|
64
|
+
function stateFileStatus(root, name) {
|
|
65
|
+
const state = projectState(root);
|
|
66
|
+
const source = stateFile(root, name);
|
|
67
|
+
const local = path.join(state.codeRoot, '.orkastery', name);
|
|
68
|
+
const divergent = state.linked && fs.existsSync(local) &&
|
|
69
|
+
!fs.readFileSync(local).equals(fs.readFileSync(source));
|
|
70
|
+
return { ...state, source, divergent };
|
|
71
|
+
}
|
|
72
|
+
/** Resolve somente a configuração de memória, sem trocar paths de código/build. */
|
|
73
|
+
function memoryState(loaded) {
|
|
74
|
+
const state = projectState(loaded.raiz);
|
|
75
|
+
if (!state.linked)
|
|
76
|
+
return { loaded, source: loaded.caminho, divergent: false };
|
|
77
|
+
try {
|
|
78
|
+
if (![manifest_1.NOME_MANIFESTO, manifest_1.NOME_MANIFESTO_LEGADO].some(n => fs.existsSync(path.join(state.root, n)))) {
|
|
79
|
+
throw new Error('missing');
|
|
80
|
+
}
|
|
81
|
+
const canonical = (0, manifest_1.exigirManifesto)(state.root);
|
|
82
|
+
if (canonical.raiz !== state.root)
|
|
83
|
+
throw new Error('invalid');
|
|
84
|
+
return {
|
|
85
|
+
loaded: { ...loaded, manifesto: { ...loaded.manifesto, memory: canonical.manifesto.memory } },
|
|
86
|
+
source: canonical.caminho,
|
|
87
|
+
divergent: JSON.stringify(loaded.manifesto.memory) !== JSON.stringify(canonical.manifesto.memory),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new Error('project-state.memory.unavailable');
|
|
92
|
+
}
|
|
93
|
+
}
|
package/dist/prompts.js
CHANGED
|
@@ -160,7 +160,7 @@ exports.SECOES_OBRIGATORIAS = [
|
|
|
160
160
|
'## Pedido do builder',
|
|
161
161
|
'## Regras de evidencia',
|
|
162
162
|
];
|
|
163
|
-
/** A frase que nenhum template pode perder, porque ela e o contrato
|
|
163
|
+
/** A frase que nenhum template pode perder, porque ela e o contrato de todo modo. */
|
|
164
164
|
exports.REGRA_CENTRAL = 'REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.';
|
|
165
165
|
/** O contrato do prompt de fase (o do B4). */
|
|
166
166
|
exports.CONTRATO_DE_FASE = {
|
|
@@ -241,18 +241,29 @@ function lintTemplate(t, contrato = exports.CONTRATO_DE_FASE) {
|
|
|
241
241
|
*
|
|
242
242
|
* Ele e a fonte de verdade do prompt do `ork` e a copia versionada em `prompts/fase-padrao.md`
|
|
243
243
|
* precisa ser identica byte a byte (ha teste que prova isso). Renderizado, ele produz
|
|
244
|
-
*
|
|
244
|
+
* o contrato distribuido a projetos sem override; mudar o texto exige sincronizar a copia.
|
|
245
245
|
*/
|
|
246
246
|
exports.TEMPLATE_FASE_PADRAO = `---
|
|
247
247
|
id: fase-padrao
|
|
248
|
-
versao:
|
|
248
|
+
versao: 3
|
|
249
249
|
descricao: Prompt canonico de uma fase do ciclo GOAL..MASTER, com nomenclatura, modo de conducao, contexto da thread, memoria injetada e regras de evidencia.
|
|
250
250
|
fases: [GOAL, PLAN, GO, CHECK, SHIP, MASTER]
|
|
251
251
|
variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, pedido, memoria_injetada, regras_de_evidencia]
|
|
252
252
|
---
|
|
253
253
|
# Orkastery, fase {{fase}} da thread {{thread}}
|
|
254
254
|
|
|
255
|
-
Voce conduz o bloco {{bloco}} da thread "{{nome}}".
|
|
255
|
+
Voce conduz o bloco {{bloco}} da thread "{{nome}}". {{fase}} e a fase de entrada, nao uma nova orquestracao.
|
|
256
|
+
Execute as fases deste bloco na ordem canonica, respeitando o escopo de cada fase e os gates do nucleo; GOAL nao implementa antes de GO.
|
|
257
|
+
Nao abra outra thread nem redespache a si mesmo. Se houver MCP do projeto, prefira suas ferramentas para estado e operacoes suportadas.
|
|
258
|
+
No Claude com servidor \`orkastery\`, use nomes completos expostos: \`ToolSearch\` com \`select:mcp__orkastery__ork_thread_status,mcp__orkastery__ork_artifact_read\` descobre essas leituras; para outra ferramenta, selecione seu nome completo. Nao busque \`select:ork_thread_status\`. Outros hosts usam seu namespace descoberto.
|
|
259
|
+
Quando disponiveis, use ork_artifact_read/write para objetivo, plano e parecer, e ork_claims_list/ork_claim_add para claims; nao escreva ledger nem estado canonico diretamente.
|
|
260
|
+
Decisao que voce tomar sem perguntar ao dono vai ao ledger por \`ork decisao registrar <thread>\`, com o que foi decidido, o porque, como mudar, o custo de reverter agora e depois, o criterio escrito, quem decidiu e a evidencia; e assim que ela chega ao dono no resumo, em vez de sumir na conversa.
|
|
261
|
+
Artefato de autoria do agente nao e recibo oficial; cadastrar claim nao significa verifica-la.
|
|
262
|
+
Para registrar produto, prefira ork_git_commit com HEAD atual e paths com claims; use ork_verify para verificacao real e ork_ship com HEADs fonte/destino conferidos para entrega. Commit local nao e SHIP; retorno incomplete exige reconciliar estado e remoto antes de repetir. Permissao para consultar nao concede essas operacoes: respeite a autorizacao nativa e os gates.
|
|
263
|
+
Decisao do dono deve ser apresentada pela sessao condutora ao host; a sessao filha nao responde nem assume a identidade do dono.
|
|
264
|
+
Preserve o perfil filho configurado: \`interactive\` concede consultas; \`worktree\` exige opt-in da instalacao e autoriza ferramentas exatas na WT validada, sem aprovar gates ou assumir o dono. Nao mude configuracao para contornar bloqueio.
|
|
265
|
+
Consulte \`ork_git_status\` para HEADs reais e estado Git; use \`ork_git_commit\`, \`ork_verify\` e \`ork_ship\` pelos contratos do nucleo, sem Bash Git nem inventar SHAs. Use \`source.head\` como \`expectedHead\` do commit; consulte novamente apos commit e use \`source.head\`/\`destination.head\` como \`expectedSource\`/\`expectedDestination\` do SHIP. Base historica nao substitui a consulta atual. As regras Edit/deny sao permissoes nativas de ferramentas, nao sandbox de processos.
|
|
266
|
+
Permissao nativa ou operacao sem transporte suportado continua um impedimento real, nunca motivo para alterar o sandbox.
|
|
256
267
|
|
|
257
268
|
## Ciclo canonico
|
|
258
269
|
{{ciclo_canonico}}
|
|
@@ -278,6 +289,14 @@ REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.
|
|
|
278
289
|
{{pedido}}
|
|
279
290
|
{{memoria_injetada}}
|
|
280
291
|
|
|
292
|
+
## Isolamento por sessão
|
|
293
|
+
|
|
294
|
+
O runtime pode ser o mesmo da condutora e do revisor. A independência exige IDs nativos
|
|
295
|
+
distintos e vínculos comprovados pelo núcleo; nome de papel no prompt não é autoridade.
|
|
296
|
+
Esta sessão executa o bloco recebido, sem abrir recursão, aprovar gate ou validar o próprio
|
|
297
|
+
trabalho. Preserve runtime/modelo/esforço e perfil \`interactive\`/\`worktree\` já configurados.
|
|
298
|
+
Falha de autenticação permanece impedimento; não troque provider, sandbox ou identidade.
|
|
299
|
+
|
|
281
300
|
## Regras de evidencia
|
|
282
301
|
{{regras_de_evidencia}}`;
|
|
283
302
|
/** Os templates que vem dentro do `ork`, por id. */
|
|
@@ -387,7 +406,8 @@ function threadDeExemplo(modo, fase, projeto) {
|
|
|
387
406
|
nome: 'exemplo de prompt',
|
|
388
407
|
assunto: 'exemplo',
|
|
389
408
|
modo,
|
|
390
|
-
|
|
409
|
+
// I-42: as fases saem dos blocos do modo; no `#Fast` e so a GO.
|
|
410
|
+
fases: def.blocos.flatMap((b) => b.fases),
|
|
391
411
|
blocos: def.blocos,
|
|
392
412
|
faseAtual: fase,
|
|
393
413
|
status: 'aberta',
|
|
@@ -0,0 +1,112 @@
|
|
|
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.LIMITE_DE_COMANDOS_SEM_CHECK = void 0;
|
|
37
|
+
exports.cicloSemCheck = cicloSemCheck;
|
|
38
|
+
exports.testeFocado = testeFocado;
|
|
39
|
+
exports.comandoDoTesteFocado = comandoDoTesteFocado;
|
|
40
|
+
exports.validarProvaSemCheck = validarProvaSemCheck;
|
|
41
|
+
exports.registrarProvaAusente = registrarProvaAusente;
|
|
42
|
+
/**
|
|
43
|
+
* I-42 (D4, D5): a prova minima de um ciclo sem CHECK, em tres degraus.
|
|
44
|
+
*
|
|
45
|
+
* 1. Teste focado: havendo teste homonimo para algum caminho do commit (ou sendo o caminho um
|
|
46
|
+
* teste), roda so ele e grava comando e codigo de saida.
|
|
47
|
+
* 2. Claim retrospectiva: sem teste homonimo, uma claim de uma linha com ate dois comandos
|
|
48
|
+
* baratos. O nucleo recusa claim que rode a suite inteira do manifesto (custo medido na I-42:
|
|
49
|
+
* 227,6 s contra ~12 s do teste focado).
|
|
50
|
+
* 3. Ausencia declarada: sem teste nem comando honesto, o evento `prova_ausente` registra os
|
|
51
|
+
* caminhos sem prova e o motivo. Nao ha prova fingida e nao ha ausencia em silencio.
|
|
52
|
+
*
|
|
53
|
+
* O que nao acontece em degrau nenhum: baseline do manifesto ou a suite completa.
|
|
54
|
+
*/
|
|
55
|
+
const fs = __importStar(require("node:fs"));
|
|
56
|
+
const path = __importStar(require("node:path"));
|
|
57
|
+
const ledger_1 = require("./ledger");
|
|
58
|
+
const thread_1 = require("./thread");
|
|
59
|
+
/** Teto de comandos por claim num ciclo sem CHECK (degrau 2). */
|
|
60
|
+
exports.LIMITE_DE_COMANDOS_SEM_CHECK = 2;
|
|
61
|
+
/** O ciclo da thread nao tem CHECK: a prova e a minima, feita pela propria GO. */
|
|
62
|
+
function cicloSemCheck(thread) {
|
|
63
|
+
return !thread.blocos.some((b) => b.fases.includes('CHECK'));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* O teste focado de um caminho, por convencao: `core/src/X.ts` -> `core/test/X.test.ts`, e um
|
|
67
|
+
* `core/test/X.test.ts` e o proprio teste. Devolve o caminho do teste, ou null quando nao ha.
|
|
68
|
+
*/
|
|
69
|
+
function testeFocado(raiz, caminho) {
|
|
70
|
+
const c = caminho.replace(/\\/g, '/');
|
|
71
|
+
if (/^core\/test\/[^/]+\.test\.ts$/.test(c))
|
|
72
|
+
return fs.existsSync(path.join(raiz, c)) ? c : null;
|
|
73
|
+
const m = /^core\/src\/([^/]+)\.ts$/.exec(c);
|
|
74
|
+
if (!m)
|
|
75
|
+
return null;
|
|
76
|
+
const teste = `core/test/${m[1]}.test.ts`;
|
|
77
|
+
return fs.existsSync(path.join(raiz, teste)) ? teste : null;
|
|
78
|
+
}
|
|
79
|
+
/** O comando que roda so o teste focado (degrau 1). */
|
|
80
|
+
function comandoDoTesteFocado(teste) {
|
|
81
|
+
const nome = path.basename(teste).replace(/\.ts$/, '.js');
|
|
82
|
+
return `npm --prefix core run build:test && node --test core/dist-test/test/${nome}`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Recusa a claim que fura o degrau 2: mais comandos do que o teto, ou a suite inteira do
|
|
86
|
+
* manifesto. Mensagem tipada, com a saida certa.
|
|
87
|
+
*/
|
|
88
|
+
function validarProvaSemCheck(verificar, comandoDeTesteDoManifesto) {
|
|
89
|
+
if (verificar.length > exports.LIMITE_DE_COMANDOS_SEM_CHECK) {
|
|
90
|
+
throw new Error(`claims.custo: ciclo sem CHECK aceita ate ${exports.LIMITE_DE_COMANDOS_SEM_CHECK} comandos por claim ` +
|
|
91
|
+
`(recebidos ${verificar.length}); use o teste focado ou declare a ausencia com ork claims ausente`);
|
|
92
|
+
}
|
|
93
|
+
const suite = comandoDeTesteDoManifesto?.trim();
|
|
94
|
+
if (suite && verificar.some((c) => c.includes(suite))) {
|
|
95
|
+
throw new Error(`claims.custo: ciclo sem CHECK nao roda a suite inteira ("${suite}"); ` +
|
|
96
|
+
'use o teste focado do arquivo que mudou');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Degrau 3: grava no ledger da thread que estes caminhos ficaram sem prova, e por que. */
|
|
100
|
+
function registrarProvaAusente(raiz, threadId, ausencia) {
|
|
101
|
+
(0, thread_1.lerThread)(raiz, threadId); // a thread tem de existir
|
|
102
|
+
const motivo = ausencia.motivo.trim();
|
|
103
|
+
if (!motivo)
|
|
104
|
+
throw new Error('prova.ausente: o motivo e obrigatorio (uma linha)');
|
|
105
|
+
if (ausencia.paths.length === 0)
|
|
106
|
+
throw new Error('prova.ausente: informe os caminhos que ficaram sem prova');
|
|
107
|
+
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.provaAusente, {
|
|
108
|
+
paths: ausencia.paths,
|
|
109
|
+
motivo,
|
|
110
|
+
...(ausencia.commit ? { commit: ausencia.commit } : {}),
|
|
111
|
+
});
|
|
112
|
+
}
|