@orkastery/cli 0.5.3 → 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.
Files changed (212) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/mods/autoridade.json +56 -0
  3. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  4. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  5. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  6. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  8. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  9. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  10. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  11. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  12. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  13. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  16. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  17. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  18. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  19. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  20. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  21. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  25. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  26. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  27. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  28. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  29. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  30. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  33. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  34. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  35. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  36. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  37. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  38. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  44. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  45. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  46. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  47. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  48. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  49. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  52. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  53. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  54. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  55. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  56. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  57. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  59. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  60. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  61. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  62. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  63. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  64. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  67. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  68. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  69. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  70. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  71. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  72. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  77. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  78. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  79. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +1 -1
  80. package/adapters/openclaw/README.md +2 -1
  81. package/adapters/openclaw/openclaw.plugin.json +1 -1
  82. package/adapters/openclaw/package.json +1 -1
  83. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  84. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  85. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  86. package/assets/docs-en/produto/README.md +14 -0
  87. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  88. package/assets/docs-en/roadmap/README.md +14 -0
  89. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  90. package/dist/adapters/claude-bg.js +77 -13
  91. package/dist/adapters/codex.js +10 -1
  92. package/dist/agents-md.js +24 -15
  93. package/dist/auditrun.js +17 -2
  94. package/dist/board.js +4 -3
  95. package/dist/branch-de-estado.js +23 -1
  96. package/dist/catalogo.js +33 -0
  97. package/dist/ci.js +13 -7
  98. package/dist/claims-conferir.js +342 -0
  99. package/dist/claims.js +3 -1
  100. package/dist/company-brain-client.js +36 -1
  101. package/dist/company-brain-journal.js +2 -1
  102. package/dist/company-brain-migration.js +36 -1
  103. package/dist/conducao-sentinela.js +388 -0
  104. package/dist/conducao-texto.js +12 -18
  105. package/dist/conducao.js +122 -30
  106. package/dist/conhecimento.js +490 -0
  107. package/dist/docs.js +22 -8
  108. package/dist/doctor-pulse-cron.js +182 -27
  109. package/dist/doctor-rede.js +18 -17
  110. package/dist/doctor.js +115 -111
  111. package/dist/entrega-pr.js +22 -21
  112. package/dist/escopo-escrita.js +10 -1
  113. package/dist/estado-thread.js +23 -1
  114. package/dist/experiencia-instalacao.js +45 -25
  115. package/dist/fabrica-batida.js +310 -0
  116. package/dist/fabrica-estado.js +38 -8
  117. package/dist/fabrica-publicar.js +3 -1
  118. package/dist/fila-pesada.js +444 -0
  119. package/dist/fix.js +3 -2
  120. package/dist/forja.js +1 -1
  121. package/dist/gates.js +3 -28
  122. package/dist/handoff.js +10 -6
  123. package/dist/hitl-local-receipt.js +2 -0
  124. package/dist/hitl-resumo.js +29 -3
  125. package/dist/hitl-tempo-parado.js +4 -4
  126. package/dist/hitl.js +29 -33
  127. package/dist/horario.js +14 -7
  128. package/dist/hosts.js +52 -1
  129. package/dist/impedimento.js +108 -14
  130. package/dist/index.js +623 -521
  131. package/dist/indice.js +7 -1
  132. package/dist/init.js +43 -47
  133. package/dist/instabilidade.js +144 -0
  134. package/dist/integracoes-locais.js +2 -0
  135. package/dist/intelligence-graph-cli.js +92 -21
  136. package/dist/intelligence-graph-contexto.js +56 -17
  137. package/dist/intelligence-graph-contract.js +2 -1
  138. package/dist/intelligence-graph-extract-md.js +56 -4
  139. package/dist/intelligence-graph-extract-ts.js +71 -3
  140. package/dist/intelligence-graph-query.js +66 -19
  141. package/dist/ledger.js +15 -1
  142. package/dist/liveness.js +6 -3
  143. package/dist/locale-ajuda.js +761 -0
  144. package/dist/locale-gerados.js +160 -0
  145. package/dist/locale-master.js +99 -0
  146. package/dist/locale-onboarding.js +92 -0
  147. package/dist/locale-phase.js +151 -0
  148. package/dist/locale-pulse.js +211 -0
  149. package/dist/locale-retry.js +385 -0
  150. package/dist/locale-roadmap.js +102 -0
  151. package/dist/locale-ship.js +494 -0
  152. package/dist/locale-thread.js +277 -0
  153. package/dist/locale-verify.js +125 -0
  154. package/dist/locale.js +714 -0
  155. package/dist/manifest.js +129 -3
  156. package/dist/maquina.js +23 -4
  157. package/dist/master-digest.js +6 -1
  158. package/dist/master-nota.js +4 -6
  159. package/dist/master.js +21 -24
  160. package/dist/mcp-artifacts.js +11 -2
  161. package/dist/mcp-git.js +23 -6
  162. package/dist/mcp-grafo.js +7 -4
  163. package/dist/mcp-server.js +8 -2
  164. package/dist/mcp-ship.js +3 -1
  165. package/dist/mcp-verify.js +6 -1
  166. package/dist/modos.js +3 -6
  167. package/dist/network-roadmap.js +5 -2
  168. package/dist/noctum-arco.js +911 -0
  169. package/dist/noctum-capacidade.js +141 -0
  170. package/dist/noctum-envelope.js +810 -0
  171. package/dist/noctum-execucao.js +304 -0
  172. package/dist/noctum-fila.js +280 -0
  173. package/dist/ocupacao.js +29 -2
  174. package/dist/onboarding.js +40 -21
  175. package/dist/orkmind.js +9 -2
  176. package/dist/orquestracao.js +13 -12
  177. package/dist/parado-no-condutor.js +34 -9
  178. package/dist/phase.js +94 -39
  179. package/dist/policies.js +4 -4
  180. package/dist/portfolio.js +4 -2
  181. package/dist/postura-local.js +234 -0
  182. package/dist/preflight.js +11 -10
  183. package/dist/procedencia.js +225 -0
  184. package/dist/projeto-alvo.js +127 -4
  185. package/dist/prompts.js +6 -2
  186. package/dist/pulse-delivery.js +13 -2
  187. package/dist/pulse.js +52 -19
  188. package/dist/ratelimit.js +4 -2
  189. package/dist/redacao-saida.js +63 -0
  190. package/dist/rede-status.js +3 -2
  191. package/dist/retry.js +232 -148
  192. package/dist/roadmap-reservas.js +20 -3
  193. package/dist/roadmap-status.js +129 -33
  194. package/dist/runtime-context.js +181 -3
  195. package/dist/runtimes.js +2 -1
  196. package/dist/session-events.js +7 -3
  197. package/dist/session-watcher-claude.js +7 -1
  198. package/dist/session-watcher.js +185 -33
  199. package/dist/sessoes-contas.js +1 -1
  200. package/dist/ship-publicar.js +800 -0
  201. package/dist/ship.js +84 -81
  202. package/dist/steal.js +77 -0
  203. package/dist/thread-close.js +3 -2
  204. package/dist/thread.js +153 -82
  205. package/dist/util.js +8 -1
  206. package/dist/verify.js +141 -52
  207. package/dist/vida-da-thread.js +254 -0
  208. package/dist/worktree-local.js +165 -0
  209. package/dist/worktree.js +20 -0
  210. package/dist/yaml.js +27 -8
  211. package/package.json +1 -1
  212. package/schemas/code-artifact-graph.v1.schema.json +2 -1
package/dist/agents-md.js CHANGED
@@ -39,42 +39,51 @@ exports.atualizarAgentsMd = atualizarAgentsMd;
39
39
  /** Bloco de instrucoes do Orkastery em AGENTS.md, preservando todo texto humano. */
40
40
  const fs = __importStar(require("node:fs"));
41
41
  const path = __importStar(require("node:path"));
42
+ const locale_1 = require("./locale");
42
43
  const util_1 = require("./util");
43
44
  exports.INICIO_AGENTS_ORK = '<!-- orkastery:begin -->';
44
45
  exports.FIM_AGENTS_ORK = '<!-- orkastery:end -->';
45
46
  function seguro(valor) {
46
47
  return valor.replace(/[\r\n\0`]+/g, ' ').trim();
47
48
  }
48
- function blocoAgentsMd(manifesto) {
49
+ /**
50
+ * O bloco do `ork init` no `AGENTS.md`. RM-061 (F3a, D1 e D2): o texto sai na lingua pedida, pela familia `gerados`
51
+ * do catalogo; os marcadores, o titulo e as verificacoes do manifesto sao os mesmos nas duas linguas. Sem locale,
52
+ * pt-BR: so o `ork init` passa a lingua do dono.
53
+ */
54
+ function blocoAgentsMd(manifesto, locale = locale_1.LOCALE_PADRAO) {
55
+ const t = (0, locale_1.msg)(locale).gerados.agents;
49
56
  const comandos = Object.entries(manifesto.verify)
50
57
  .filter((item) => typeof item[1] === 'string' && item[1].trim() !== '')
51
58
  .map(([nome, comando]) => `- ${seguro(nome)}: \`${seguro(comando)}\``);
59
+ const modos = manifesto.conduction.allowed_modes.map(m => `#${m[0].toUpperCase()}${m.slice(1)}`).join(', ');
52
60
  return `${exports.INICIO_AGENTS_ORK}
53
61
  ## Orkastery
54
62
 
55
- Projeto: **${seguro(manifesto.project.name)}** (${seguro(manifesto.project.abbrev)}). Branch base: \`${seguro(manifesto.worktree.base_branch)}\`.
63
+ ${t.projeto(seguro(manifesto.project.name), seguro(manifesto.project.abbrev), seguro(manifesto.worktree.base_branch))}
56
64
 
57
- - Comece com \`ork doctor\`, \`ork onboarding\` e \`ork thread status <thread>\`.
58
- - Conduza o ciclo GOAL → PLAN → GO → CHECK → SHIP → MASTER pelo \`ork\`.
59
- - Respeite o modo da thread: ${manifesto.conduction.allowed_modes.map(m => `#${m[0].toUpperCase()}${m.slice(1)}`).join(', ')}.
60
- - Edite produto somente na worktree vinculada; estado em \`.orkastery/\` pertence ao núcleo.
61
- - PLAN não implementa. GO usa commits atômicos. CHECK não corrige. SHIP acontece por \`ork ship\`.
62
- - Toda alegação exige claim e comando reproduzível; self-report não é evidência.
63
- - MASTER por omissão só da sua thread: \`ork master <thread> --aceitar-omissao\`; sem a thread, fecha também as entregas de outras frentes.
64
- ${comandos.length ? `\nVerificações do manifesto:\n\n${comandos.join('\n')}\n` : ''}
65
- Este bloco é mantido por \`ork init\`. Edite livremente o restante do arquivo.
65
+ - ${t.comece}
66
+ - ${t.ciclo}
67
+ - ${t.modo(modos)}
68
+ - ${t.worktree}
69
+ - ${t.fases}
70
+ - ${t.claims}
71
+ - ${t.master}
72
+ ${comandos.length ? `\n${t.verificacoes}\n\n${comandos.join('\n')}\n` : ''}
73
+ ${t.rodape}
66
74
  ${exports.FIM_AGENTS_ORK}`;
67
75
  }
68
- /** Cria ou substitui somente o bloco delimitado. Marcadores ambiguos recusam sem escrita. */
69
- function atualizarAgentsMd(raiz, manifesto) {
76
+ /** Cria ou substitui somente o bloco delimitado, no `locale` pedido. Marcadores ambiguos recusam sem escrita. */
77
+ function atualizarAgentsMd(raiz, manifesto, locale = locale_1.LOCALE_PADRAO) {
70
78
  const caminho = path.join(raiz, 'AGENTS.md');
71
79
  const anterior = fs.existsSync(caminho) ? fs.readFileSync(caminho, 'utf8') : '';
72
80
  const inicios = anterior.split(exports.INICIO_AGENTS_ORK).length - 1;
73
81
  const fins = anterior.split(exports.FIM_AGENTS_ORK).length - 1;
74
82
  if (inicios !== fins || inicios > 1 || (inicios === 1 && anterior.indexOf(exports.INICIO_AGENTS_ORK) > anterior.indexOf(exports.FIM_AGENTS_ORK))) {
75
- throw new Error('AGENTS.md possui marcadores Orkastery ambiguos; corrija o bloco antes de rodar ork init');
83
+ // RM-061 (F3a): a recusa sai no locale do comando, remontada pela entrada do CLI (D14 da F2a).
84
+ throw new locale_1.ErroDoCatalogo((m) => m.gerados.agents.marcadoresAmbiguos);
76
85
  }
77
- const bloco = blocoAgentsMd(manifesto);
86
+ const bloco = blocoAgentsMd(manifesto, locale);
78
87
  const proximo = inicios === 1
79
88
  ? anterior.slice(0, anterior.indexOf(exports.INICIO_AGENTS_ORK)) + bloco + anterior.slice(anterior.indexOf(exports.FIM_AGENTS_ORK) + exports.FIM_AGENTS_ORK.length)
80
89
  : anterior === '' ? bloco + '\n' : anterior + (anterior.endsWith('\n') ? '\n' : '\n\n') + bloco + '\n';
package/dist/auditrun.js CHANGED
@@ -51,6 +51,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
51
51
  exports.PACK_DA_SUPERFICIE = exports.VERSAO_DA_RODADA = void 0;
52
52
  exports.dirAuditorias = dirAuditorias;
53
53
  exports.dirRodada = dirRodada;
54
+ exports.exigirIdDeRodada = exigirIdDeRodada;
54
55
  exports.caminhoRodada = caminhoRodada;
55
56
  exports.listarRodadas = listarRodadas;
56
57
  exports.lerRodada = lerRodada;
@@ -76,6 +77,7 @@ const adapter = __importStar(require("./adapters/claude-bg"));
76
77
  const auditoria_1 = require("./auditoria");
77
78
  const phase_1 = require("./phase");
78
79
  const policies_1 = require("./policies");
80
+ const projeto_alvo_1 = require("./projeto-alvo");
79
81
  const manifest_1 = require("./manifest");
80
82
  const ledger_1 = require("./ledger");
81
83
  const divida_1 = require("./divida");
@@ -93,7 +95,17 @@ function dirAuditorias(raiz) {
93
95
  }
94
96
  /** Diretorio de uma rodada. */
95
97
  function dirRodada(raiz, id) {
96
- return path.join(dirAuditorias(raiz), id);
98
+ return path.join(dirAuditorias(raiz), exigirIdDeRodada(id));
99
+ }
100
+ /**
101
+ * RM-047 (fronteira de confiança): o id da rodada vira nome de pasta e de relatório, e o `run.json` que o
102
+ * traz pode ter vindo do clone. Um segmento só, como o que `novoIdDeRodada` gera, sem `/` nem `..`.
103
+ */
104
+ function exigirIdDeRodada(id) {
105
+ if (typeof id !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(id) || id.includes('..')) {
106
+ throw new Error(`audit.rodada-invalida: id de rodada ${JSON.stringify(String(id)).slice(0, 60)} não é um nome simples`);
107
+ }
108
+ return id;
97
109
  }
98
110
  /** Caminho do `run.json` da rodada. */
99
111
  function caminhoRodada(raiz, id) {
@@ -372,6 +384,9 @@ function rodarAuditoria(carregado, pack, opcoes = {}) {
372
384
  cwd: raiz,
373
385
  model: base.custo.model,
374
386
  effort,
387
+ // RM-052 (fatia 2, D2, aviso A1 do CHECK): a sessao da auditoria roda na raiz do projeto e le o
388
+ // projeto pelo proprio cwd; o `ORK_PROJETO` e o modo host de quem chamou (ou do daemon) nao a seguem.
389
+ ambienteExtra: { ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO },
375
390
  });
376
391
  if (!resultado.ok || !resultado.sessionId) {
377
392
  const rodada = {
@@ -724,7 +739,7 @@ function relatorioDaRodada(carregado, rodadaId, opcoes = {}) {
724
739
  (0, util_1.gravar)(caminho, texto);
725
740
  let publicado = null;
726
741
  if (opcoes.publicar) {
727
- publicado = path.join(raiz, 'docs', 'audit', `${rodada.id}.md`);
742
+ publicado = path.join(raiz, 'docs', 'audit', `${exigirIdDeRodada(rodada.id)}.md`);
728
743
  (0, util_1.gravar)(publicado, texto);
729
744
  }
730
745
  rodada.status = 'relatada';
package/dist/board.js CHANGED
@@ -71,6 +71,7 @@ const util_1 = require("./util");
71
71
  const sessoes_adopt_1 = require("./sessoes-adopt");
72
72
  const horario_1 = require("./horario");
73
73
  const conducao_1 = require("./conducao");
74
+ const locale_1 = require("./locale");
74
75
  const conducao_texto_1 = require("./conducao-texto");
75
76
  /**
76
77
  * Perfis detectados no projeto.
@@ -316,8 +317,8 @@ function planejar(carregado, opcoes = {}) {
316
317
  situacao: 'espera',
317
318
  motivo: 'vaga.stale',
318
319
  detalhe: oc.detalhe,
319
- correcao: `redespache com ork phase run ${t.id} --fase ${t.faseAtual}, ` +
320
- `ou feche com ork master ${t.id}`,
320
+ // RM-061 (F2b, G2): o pulse mostra esta correcao nas acoes automaticas e a remonta no locale.
321
+ correcao: (0, locale_1.textoDoCatalogo)((m) => m.pulse.vagaStaleCorrecao(t.id, t.faseAtual)),
321
322
  leases: meus,
322
323
  });
323
324
  continue;
@@ -347,7 +348,7 @@ function planejar(carregado, opcoes = {}) {
347
348
  situacao: 'espera',
348
349
  motivo: 'concurrency.limite',
349
350
  detalhe: `a maquina ja tem ${ocupadas} thread(s) em andamento, o limite e ${max}`,
350
- correcao: 'espere uma thread liberar, ou suba concurrency.max_parallel_threads no orkastery.yaml',
351
+ correcao: (0, locale_1.textoDoCatalogo)((m) => m.pulse.limiteCorrecao),
351
352
  leases: [],
352
353
  });
353
354
  continue;
@@ -33,11 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.refRemota = exports.remotoValido = exports.REMOTO_DO_GIT = void 0;
36
+ exports.refRemota = exports.shaValido = exports.remotoValido = exports.REMOTO_DO_GIT = void 0;
37
37
  exports.git = git;
38
38
  exports.exigirGit = exigirGit;
39
39
  exports.remotoRedigido = remotoRedigido;
40
40
  exports.exigirRemoto = exigirRemoto;
41
+ exports.branchValida = branchValida;
41
42
  exports.pontaLocal = pontaLocal;
42
43
  exports.buscarBranch = buscarBranch;
43
44
  exports.jsonsDaPonta = jsonsDaPonta;
@@ -107,6 +108,27 @@ function exigirRemoto(remoto, prefixo) {
107
108
  '(letras, dígitos, ".", "_", "-" e "/" entre partes, cada parte começando por letra ou dígito, sem URL); nada foi passado ao git. ' +
108
109
  'Corrija fabrica.remoto no orkastery.yaml ou --remoto (padrão: origin).');
109
110
  }
111
+ /**
112
+ * RM-047 (fronteira de confiança): nome de branch que pode ir ao git como argumento. O valor vem do
113
+ * `worktree.base_branch` do manifesto, do campo `para` do ledger ou do frontmatter, e todos podem ser
114
+ * do clone: um nome que começa com `-` viraria opção do git (`--output=<arquivo>` grava arquivo).
115
+ * A regra é a do `git check-ref-format --branch`, então nenhum nome que o git aceite é recusado.
116
+ */
117
+ function branchValida(branch) {
118
+ if (typeof branch !== 'string' || branch.length === 0 || branch.length > 255)
119
+ return false;
120
+ if (branch.startsWith('-') || branch === '@' || branch.includes('..') || branch.includes('@{'))
121
+ return false;
122
+ // eslint-disable-next-line no-control-regex
123
+ if (/[\x00-\x20\x7f~^:?*[\\]/.test(branch))
124
+ return false;
125
+ if (branch.startsWith('/') || branch.endsWith('/') || branch.includes('//') || branch.endsWith('.'))
126
+ return false;
127
+ return branch.split('/').every((parte) => !parte.startsWith('.') && !parte.endsWith('.lock'));
128
+ }
129
+ /** Sha hexadecimal (abreviado ou inteiro, SHA-1 ou SHA-256): o único formato de commit lido do ledger que vai ao git. */
130
+ const shaValido = (sha) => typeof sha === 'string' && /^[0-9a-f]{7,64}$/i.test(sha);
131
+ exports.shaValido = shaValido;
110
132
  const refRemota = (remoto, branch) => `refs/remotes/${remoto}/${branch}`;
111
133
  exports.refRemota = refRemota;
112
134
  /** A ultima copia lida da branch nesta maquina, sem rede. `null` quando nunca foi lida. */
package/dist/catalogo.js CHANGED
@@ -45,6 +45,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.BUCKETS = void 0;
46
46
  exports.raizDoCatalogo = raizDoCatalogo;
47
47
  exports.exigirCatalogo = exigirCatalogo;
48
+ exports.catalogoDoPacote = catalogoDoPacote;
49
+ exports.exigirCatalogoDoPacote = exigirCatalogoDoPacote;
48
50
  exports.cliDoCatalogo = cliDoCatalogo;
49
51
  exports.skillsDoCatalogo = skillsDoCatalogo;
50
52
  exports.referenciasDoCatalogo = referenciasDoCatalogo;
@@ -83,6 +85,37 @@ function exigirCatalogo(inicial) {
83
85
  }
84
86
  return raiz;
85
87
  }
88
+ /** A raiz do catálogo do pacote que está rodando: subindo a partir do próprio código, nunca do cwd. */
89
+ function catalogoDoPacote() {
90
+ return subirProcurando(__dirname);
91
+ }
92
+ function real(p) {
93
+ try {
94
+ return fs.realpathSync(p);
95
+ }
96
+ catch {
97
+ return path.resolve(p);
98
+ }
99
+ }
100
+ /**
101
+ * RM-047 (P4): o catálogo que o `ork eval` executa. O eval roda os canários, os hooks e o `core/dist`
102
+ * do catálogo, então ele só vale o do pacote que está rodando. Um diretório com `skills/`,
103
+ * `references/` e `eval/` achado a partir do cwd (um clone qualquer) que não seja o próprio pacote é
104
+ * recusado com `eval.catalogo-alheio`, com o comando que roda o eval daquele checkout de propósito.
105
+ */
106
+ function exigirCatalogoDoPacote(inicial) {
107
+ const pacote = catalogoDoPacote();
108
+ if (!pacote) {
109
+ throw new Error('catalogo do Orkastery nao encontrado (esperado um diretorio com skills/, references/ e eval/)');
110
+ }
111
+ const doCwd = subirProcurando(inicial);
112
+ if (doCwd && real(doCwd) !== real(pacote)) {
113
+ throw new Error(`eval.catalogo-alheio: ${doCwd} tem skills/, references/ e eval/, mas nao e o pacote deste ork ` +
114
+ `(${pacote}). O eval executa os canarios, os hooks e o core/dist do catalogo, e so roda o do proprio pacote. ` +
115
+ `Para avaliar aquele checkout de proposito, rode o ork dele: node ${path.join(doCwd, 'core', 'dist', 'index.js')} eval`);
116
+ }
117
+ return pacote;
118
+ }
86
119
  /** Os buckets do catalogo, na ordem em que o README os apresenta. */
87
120
  exports.BUCKETS = [
88
121
  'core',
package/dist/ci.js CHANGED
@@ -40,6 +40,7 @@ exports.consultarCi = consultarCi;
40
40
  exports.consultarCiDoRepositorio = consultarCiDoRepositorio;
41
41
  exports.executarCi = executarCi;
42
42
  exports.arquivoDoBundle = arquivoDoBundle;
43
+ exports.comandosDoBundle = comandosDoBundle;
43
44
  exports.lintDoBundle = lintDoBundle;
44
45
  exports.destinoDoBundle = destinoDoBundle;
45
46
  exports.prepararBundleCi = prepararBundleCi;
@@ -50,6 +51,7 @@ exports.executarBundleCi = executarBundleCi;
50
51
  const branch_de_estado_1 = require("./branch-de-estado");
51
52
  const util_1 = require("./util");
52
53
  const worktree_1 = require("./worktree");
54
+ const procedencia_1 = require("./procedencia");
53
55
  const verify_1 = require("./verify");
54
56
  const verify_2 = require("./verify");
55
57
  const claims_1 = require("./claims");
@@ -59,6 +61,7 @@ const claim_lint_1 = require("./claim-lint");
59
61
  const integracoes_locais_1 = require("./integracoes-locais");
60
62
  const ledger_1 = require("./ledger");
61
63
  const thread_1 = require("./thread");
64
+ const locale_1 = require("./locale");
62
65
  const MARCADORES_DE_HOST = [
63
66
  /(^|[\s;&|])\/home\//,
64
67
  /(^|[\s;&|])localhost(?=[:/\s;&|]|$)/,
@@ -138,12 +141,12 @@ function consultarCi(carregado, sha, remoto = 'origin', executor = executorPadra
138
141
  const { ci } = carregado.manifesto;
139
142
  const context = ci.context || 'ork-verify';
140
143
  if (!ci.required_for_ship)
141
- return { schema: 'ork.ci-status/v1', required: false, ok: true, provider: 'github', repository: null, sha, context, state: 'disabled', url: null, detail: 'gate de CI não exigido pelo manifesto' };
144
+ return { schema: 'ork.ci-status/v1', required: false, ok: true, provider: 'github', repository: null, sha, context, state: 'disabled', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciNaoExigidoDetalhe) };
142
145
  // RM-047: o `--remoto` do `ork ci status` vem da linha de comando; so nome de remoto chega ao git.
143
146
  const remote = (0, util_1.exec)('git', ['remote', 'get-url', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ci')], carregado.raiz);
144
147
  const repository = remote.ok ? repositorioGitHub(remote.stdout) : null;
145
148
  if (!repository)
146
- return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository: null, sha, context, state: 'unavailable', url: null, detail: `remoto ${remoto} não é um repositório GitHub reconhecível` };
149
+ return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository: null, sha, context, state: 'unavailable', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciRemotoNaoGithub(remoto)) };
147
150
  return consultarCiDoRepositorio(repository, sha, context, executor);
148
151
  }
149
152
  /**
@@ -153,23 +156,23 @@ function consultarCi(carregado, sha, remoto = 'origin', executor = executorPadra
153
156
  function consultarCiDoRepositorio(repository, sha, context, executor = executorPadrao) {
154
157
  const result = executor({ repository, sha, context });
155
158
  if (!result.ok)
156
- return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'unavailable', url: null, detail: (result.stderr || result.stdout || 'consulta ao GitHub falhou').trim().slice(0, 400) };
159
+ return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'unavailable', url: null, detail: (result.stderr || result.stdout || (0, locale_1.textoDoCatalogo)((m) => m.ship.ciConsultaFalhou)).trim().slice(0, 400) };
157
160
  let payload;
158
161
  try {
159
162
  payload = JSON.parse(result.stdout);
160
163
  }
161
164
  catch {
162
- return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'unavailable', url: null, detail: 'GitHub devolveu uma resposta de checks inválida' };
165
+ return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'unavailable', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciRespostaInvalida) };
163
166
  }
164
167
  const checks = (payload.check_runs ?? []).filter((check) => check.name === context);
165
168
  if (!checks.length)
166
- return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'missing', url: null, detail: `check ${context} não encontrado no commit` };
169
+ return { schema: 'ork.ci-status/v1', required: true, ok: false, provider: 'github', repository, sha, context, state: 'missing', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciSemCheck(context)) };
167
170
  const check = checks.at(-1);
168
171
  const status = check.status ?? 'unknown';
169
172
  const conclusion = check.conclusion ?? '';
170
173
  const url = check.html_url ?? '';
171
174
  const state = status !== 'completed' ? 'pending' : conclusion === 'success' ? 'success' : 'failure';
172
- return { schema: 'ork.ci-status/v1', required: true, ok: state === 'success', provider: 'github', repository, sha, context, state, url: url || null, detail: state === 'success' ? 'CHECK independente verde no GitHub' : `check ${context}: ${status}/${conclusion || 'sem conclusão'}` };
175
+ return { schema: 'ork.ci-status/v1', required: true, ok: state === 'success', provider: 'github', repository, sha, context, state, url: url || null, detail: (0, locale_1.textoDoCatalogo)((m) => state === 'success' ? m.ship.ciVerde : m.ship.ciEstado(context, String(status), conclusion)) };
173
176
  }
174
177
  function executarCi(carregado, threadId) {
175
178
  const verify = (0, verify_1.verificar)(carregado, threadId);
@@ -202,6 +205,7 @@ function arquivoDoBundle(threadId) {
202
205
  throw new Error(`ci.bundle: "${threadId}" nao e id de thread`);
203
206
  return `${threadId}.json`;
204
207
  }
208
+ /** Os comandos que o bundle leva ao runner; o `ork ship publicar` confere os do bundle no HEAD contra estes. */
205
209
  function comandosDoBundle(carregado) {
206
210
  return carregado.manifesto.ci.command
207
211
  ? [{ name: 'ci', command: carregado.manifesto.ci.command }]
@@ -233,7 +237,9 @@ function lintDoBundle(claims) {
233
237
  */
234
238
  function destinoDoBundle(carregado, threadId) {
235
239
  const worktree = (0, thread_1.lerThread)(carregado.raiz, threadId).worktree;
236
- return worktree && fs.existsSync(worktree) ? worktree : carregado.raiz;
240
+ // RM-047 (P2): o bundle so e gravado na worktree registrada; outro diretorio do thread.json cai na raiz.
241
+ return worktree && fs.existsSync(worktree) && (0, procedencia_1.cwdLocalOuNulo)(carregado.raiz, threadId, worktree, 'thread') !== null
242
+ ? worktree : carregado.raiz;
237
243
  }
238
244
  function prepararBundleCi(carregado, threadId, opcoes = {}) {
239
245
  const commands = comandosDoBundle(carregado);