@orkastery/cli 0.5.6 → 0.6.1

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 (396) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +123 -9
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/ship.js CHANGED
@@ -59,6 +59,7 @@ exports.shaDaRef = shaDaRef;
59
59
  exports.shaNoRemoto = shaNoRemoto;
60
60
  exports.remotoConfigurado = remotoConfigurado;
61
61
  exports.detectarReversaoDaEntrega = detectarReversaoDaEntrega;
62
+ exports.unscannedCategories = unscannedCategories;
62
63
  exports.registrarReversaoDaEntrega = registrarReversaoDaEntrega;
63
64
  exports.ship = ship;
64
65
  exports.textoDoShip = textoDoShip;
@@ -71,16 +72,22 @@ const ledger_1 = require("./ledger");
71
72
  const manifest_1 = require("./manifest");
72
73
  const modos_1 = require("./modos");
73
74
  const policies_1 = require("./policies");
75
+ const estado_thread_1 = require("./estado-thread");
76
+ const report_1 = require("./security-scan/report");
77
+ const types_1 = require("./security-scan/types");
74
78
  const thread_1 = require("./thread");
75
79
  const util_1 = require("./util");
76
80
  const verify_1 = require("./verify");
77
81
  const ci_1 = require("./ci");
82
+ const forja_1 = require("./forja");
78
83
  const contrato_publico_1 = require("./contrato-publico");
79
84
  const prova_minima_1 = require("./prova-minima");
80
85
  const horario_1 = require("./horario");
81
86
  const fabrica_publicar_1 = require("./fabrica-publicar");
87
+ const mcp_ship_transporte_1 = require("./mcp-ship-transporte");
82
88
  const branch_de_estado_1 = require("./branch-de-estado");
83
89
  const locale_1 = require("./locale");
90
+ const noctum_guarda_1 = require("./noctum-guarda");
84
91
  /**
85
92
  * RM-037 (fatia 5, A1): o commit de primeiro pai da base que incorporou o `shaDe`: o merge que trouxe a branch, ou
86
93
  * o proprio `shaDe` quando a base avancou por fast-forward ate ele. Com a branch ja incorporada, a ponta da base e
@@ -235,12 +242,17 @@ function prepararArvore(raiz, para) {
235
242
  return { dir, temporaria: true };
236
243
  }
237
244
  /** Remove a worktree temporaria do merge (best effort: o lease ja foi liberado). */
238
- function descartarArvore(raiz, arvore) {
245
+ function descartarArvore(raiz, arvore, trava = []) {
239
246
  if (!arvore.temporaria)
240
247
  return;
241
- (0, util_1.exec)('git', ['worktree', 'remove', '--force', arvore.dir], raiz);
242
- (0, util_1.exec)('git', ['worktree', 'prune'], raiz);
248
+ (0, util_1.exec)('git', [...trava, 'worktree', 'remove', '--force', arvore.dir], raiz);
249
+ (0, util_1.exec)('git', [...trava, 'worktree', 'prune'], raiz);
243
250
  }
251
+ /**
252
+ * O git local que o transporte fixado roda no projeto depois da ultima conferencia: nenhum hook (o
253
+ * `reference-transaction` do `update-ref`, inclusive) e nenhum fsmonitor, que o agente pode ter posto ali durante o push.
254
+ */
255
+ const TRAVA_LOCAL_DO_FIXADO = ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor='];
244
256
  /** sha de uma referencia local, ou null quando ela nao existe. */
245
257
  function shaDaRef(dir, ref) {
246
258
  const r = (0, util_1.exec)('git', ['rev-parse', '--verify', '--quiet', ref], dir);
@@ -253,9 +265,34 @@ function shaDaRef(dir, ref) {
253
265
  * E o unico jeito aceito de provar push nesta maquina: `gh api` e imprevisivel aqui, e o
254
266
  * codigo de saida do `git push` nao prova que o remoto ficou com o commit certo.
255
267
  */
256
- function shaNoRemoto(dir, remoto, branch) {
268
+ function shaNoRemoto(dir, remoto, branch, config = []) {
257
269
  // RM-047: so nome de remoto chega ao git, e depois do `--` (nunca vira opcao nem transporte).
258
- const r = (0, util_1.exec)('git', ['ls-remote', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), `refs/heads/${branch}`], dir, 120000);
270
+ const r = (0, util_1.exec)('git', [...configDoRemotoValida(config), 'ls-remote', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), `refs/heads/${branch}`], dir, 120000);
271
+ return shaDoLsRemote(r, branch);
272
+ }
273
+ function validarUrlFixada(url, config) {
274
+ const protocolo = (0, mcp_ship_transporte_1.protocoloDaConfigDeRede)(config);
275
+ const recusa = () => { throw new locale_1.ErroDoCatalogo((m) => m.ship.configDoRemotoInvalida('urlFixada')); };
276
+ if (!protocolo || typeof url !== 'string' || /[\x00-\x20\x7f]/.test(url) || url.startsWith('-'))
277
+ return recusa();
278
+ try {
279
+ const e = (0, mcp_ship_transporte_1.enderecoDoOrigin)(protocolo === 'ssh' ? 'forja-ssh' : 'forja-https', url);
280
+ if (e.transporte === 'forja-https' && (0, mcp_ship_transporte_1.urlDaConfigDeRede)(config) !== url)
281
+ return recusa();
282
+ }
283
+ catch {
284
+ return recusa();
285
+ }
286
+ return { url, protocolo };
287
+ }
288
+ /** O git que vai a rede no transporte fixado: do gitdir privado, so com o protocolo do modo. */
289
+ function gitDoRemotoFixado(f, args, timeoutMs) {
290
+ return (0, util_1.exec)('git', [`--git-dir=${f.gitdir}`, ...f.config, ...args], f.gitdir, timeoutMs, { ...process.env, GIT_ALLOW_PROTOCOL: f.protocolo });
291
+ }
292
+ function shaNoRemotoFixado(f, branch) {
293
+ return shaDoLsRemote(gitDoRemotoFixado(f, ['ls-remote', '--', f.url, `refs/heads/${branch}`], 120000), branch);
294
+ }
295
+ function shaDoLsRemote(r, branch) {
259
296
  if (!r.ok)
260
297
  return null;
261
298
  // RM-059 (S1 da revisao da ork-rm059pista): o padrao do ls-remote casa por sufixo; vale so a linha da ref exata.
@@ -263,6 +300,14 @@ function shaNoRemoto(dir, remoto, branch) {
263
300
  const sha = linha?.[0] ?? '';
264
301
  return /^[0-9a-f]{40}$/.test(sha) ? sha : null;
265
302
  }
303
+ /** So a lista que `configDeRede` emite, chave e valor: nenhuma outra opcao, chave ou valor chega antes do subcomando de rede. */
304
+ function configDoRemotoValida(config) {
305
+ const recusada = (0, mcp_ship_transporte_1.chaveRecusadaDaConfigDeRede)(config);
306
+ // Nunca ecoa o valor: so a chave (ate 80 caracteres) mostra o que foi recusado.
307
+ if (recusada !== null)
308
+ throw new locale_1.ErroDoCatalogo((m) => m.ship.configDoRemotoInvalida(recusada.slice(0, 80)));
309
+ return config;
310
+ }
266
311
  /** O remoto esta configurado neste repositorio? */
267
312
  function remotoConfigurado(dir, remoto) {
268
313
  return (0, util_1.exec)('git', ['remote', 'get-url', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship')], dir).ok;
@@ -347,6 +392,23 @@ function detectarReversaoDaEntrega(raiz, thread, para) {
347
392
  }
348
393
  return null;
349
394
  }
395
+ /**
396
+ * Loop categories (secret, dependency, sast, iac, workflow) not scanned for `sha` (spec 11.2): `[]` without
397
+ * `verify.security_scan` and with `ci.required_for_ship` (the scan is then in the CI bundle, which the independent CI
398
+ * check covers). Otherwise the report of `sha` decides: a loop tool `unavailable` or `failed` leaves its category
399
+ * unscanned (the spec says `unavailable`; a `failed` loop tool is equally not scanned, never clean), except the
400
+ * "nothing to scan" reasons excused by `isExcusedUnscanned` (same rule as the exit code), and no report at all leaves
401
+ * every loop category unscanned (no evidence is not clean). Sorted, distinct.
402
+ */
403
+ function unscannedCategories(carregado, sha) {
404
+ if (carregado.manifesto.verify.security_scan === undefined || carregado.manifesto.ci.required_for_ship)
405
+ return [];
406
+ const report = (0, report_1.readReport)((0, estado_thread_1.raizDoEstado)(carregado.raiz), sha);
407
+ if (!report)
408
+ return [...types_1.LOOP_CATEGORIES].sort();
409
+ const missing = (0, report_1.unscannedLoopTools)(report).map(t => t.category);
410
+ return [...new Set(missing)].sort();
411
+ }
350
412
  /**
351
413
  * Grava `rollback_done` quando a reversao e nova, e devolve o que encontrou.
352
414
  *
@@ -379,7 +441,20 @@ function ship(carregado, threadId, opcoes) {
379
441
  // so nome de remoto passa; o resto recusa com `ship.remoto-invalido`, e o ship nao entrega sem push provado
380
442
  // por um remoto que nunca existiu.
381
443
  const remoto = (0, branch_de_estado_1.exigirRemoto)(opcoes.remoto ?? 'origin', 'ship');
444
+ const configDoRemoto = configDoRemotoValida(opcoes.configDoRemoto ?? []);
445
+ const comConfig = (args) => `git ${[...configDoRemoto, ...args].join(' ')}`;
446
+ const urlFixada = opcoes.urlFixada === undefined ? null : validarUrlFixada(opcoes.urlFixada, configDoRemoto);
447
+ // Nos passos, o gitdir privado e a URL fixada vao por nome: o caminho temporario nao diz nada a quem le.
382
448
  const r = baseDoResultado(thread, de, opcoes);
449
+ // RM-058, integracao (T1.1, D3 da ork-rm058integra): a thread de um arco #Noctum que a guarda e entregue pelo passo da
450
+ // entrega do arco, nunca por aqui (nem pelo `ork_ship` do MCP, que chama este mesmo ship). A recusa vem antes de qualquer
451
+ // git e nao vai ao ledger da thread: um `ship_blocked` ou um gate por uma tentativa de fora pesaria no indice da thread e
452
+ // apareceria como pausa do dono na fila do arco.
453
+ const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId);
454
+ if (guarda) {
455
+ return { ...r, autorizacao: autorizacaoDePush(raiz, thread, opcoes), bloqueado: true, ok: false, motivo: 'policy.violation',
456
+ codigo: guarda.motivo, detalhe: guarda.detalhe, correcao: guarda.correcao };
457
+ }
383
458
  // I-43 (T7): antes de qualquer coisa, se a entrega ANTERIOR desta thread foi
384
459
  // revertida na base, isso vira `rollback_done`. E o insumo de maior peso do indice
385
460
  // de qualidade, e o unico fato que diz sem interpretacao que a entrega nao servia.
@@ -388,7 +463,18 @@ function ship(carregado, threadId, opcoes) {
388
463
  registrarReversaoDaEntrega(raiz, thread, para);
389
464
  }
390
465
  catch { /* git indisponivel nao barra o ship */ }
391
- const bloquear = (motivo, detalhe, correcao) => {
466
+ // O push pode ter saido: a troca do origin ou da config durante ele bloqueia o gate no ledger e sobe tipada.
467
+ const conferirDepoisDoPush = (passos) => {
468
+ try {
469
+ opcoes.conferirDepoisDoPush?.();
470
+ }
471
+ catch (e) {
472
+ r.passos = passos;
473
+ bloquear('runtime.unavailable', e instanceof locale_1.ErroDoCatalogo ? (0, locale_1.textoDoCatalogo)(e.montar) : e.message, (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProvaCorrecao), 'transport.mudou-no-push');
474
+ throw e;
475
+ }
476
+ };
477
+ const bloquear = (motivo, detalhe, correcao, codigo) => {
392
478
  (0, gates_1.registrarGateBloqueado)(dir, threadId, {
393
479
  gate: 'ship',
394
480
  motivo,
@@ -404,12 +490,13 @@ function ship(carregado, threadId, opcoes) {
404
490
  de,
405
491
  para,
406
492
  motivo,
493
+ ...(codigo ? { codigo } : {}),
407
494
  detalhe,
408
495
  correcao,
409
496
  modo: thread.modo,
410
497
  dryRun: r.dryRun,
411
498
  });
412
- return { ...r, bloqueado: true, ok: false, motivo, detalhe, correcao };
499
+ return { ...r, bloqueado: true, ok: false, motivo, detalhe, correcao, ...(codigo ? { codigo } : {}) };
413
500
  };
414
501
  // 1. Autorizacao de push pelo gate do modo de conducao.
415
502
  const autorizacao = autorizacaoDePush(raiz, thread, opcoes);
@@ -497,6 +584,21 @@ function ship(carregado, threadId, opcoes) {
497
584
  if (!ci.ok) {
498
585
  return bloquear('ci.failed', (0, locale_1.textoDoCatalogo)((m) => m.ship.ciReprovou((0, locale_1.remontar)(ci.detail), shaDe, ci.context)), (0, locale_1.textoDoCatalogo)((m) => m.ship.ciReprovouCorrecao(ci.context)));
499
586
  }
587
+ // Security scan (spec 11.2): com `verify.security_scan` e sem o scan no bundle do CI, categoria do laco sem varredura
588
+ // no SHA da candidata pede autorizacao humana, antes de qualquer push.
589
+ const naoVarridas = unscannedCategories(carregado, shaDe);
590
+ let autorizariaSemScan = null;
591
+ if (naoVarridas.length > 0) {
592
+ const quem = opcoes.allowUnscanned?.trim();
593
+ if (!quem) {
594
+ return bloquear('human.pending', (0, locale_1.textoDoCatalogo)((m) => m.ship.scanNaoVarrido(naoVarridas.join(', '), shaDe)), (0, locale_1.textoDoCatalogo)((m) => m.ship.scanNaoVarridoCorrecao(threadId)));
595
+ }
596
+ // O ensaio nao grava a autorizacao: so diz, nos passos, o que o ship real gravaria.
597
+ if (r.dryRun)
598
+ autorizariaSemScan = (0, locale_1.textoDoCatalogo)((m) => m.ship.passoAutorizariaSemScan(quem, naoVarridas.join(', '), shaDe));
599
+ else
600
+ (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.entregaSemScanAutorizada, { por: quem, categorias: naoVarridas, sha: shaDe });
601
+ }
500
602
  // 4. Lease `main-tree`: so uma thread mergeia por vez.
501
603
  if (r.dryRun) {
502
604
  const ocupado = (0, leases_1.leasesColidentes)(raiz, leases_1.LEASE_MAIN_TREE)[0] ?? null;
@@ -514,6 +616,7 @@ function ship(carregado, threadId, opcoes) {
514
616
  ? (m) => opcoes.semPush ? m.ship.semPushPorFlag : m.ship.semRemoto(remoto) : null;
515
617
  r.passos = [
516
618
  r.detalhe,
619
+ ...(autorizariaSemScan ? [autorizariaSemScan] : []),
517
620
  (0, locale_1.textoDoCatalogo)((m) => m.ship.passoMerge(de)),
518
621
  ...(semPushNoReal ? [(0, locale_1.textoDoCatalogo)((m) => m.ship.passoSemPush(semPushNoReal(m)))] : [
519
622
  `git push ${remoto} ${para}`,
@@ -632,27 +735,65 @@ function ship(carregado, threadId, opcoes) {
632
735
  r.pontaDaBase = pontaDaBase;
633
736
  opcoes.revalidarGit?.('push', arvore.dir);
634
737
  // 6. Push PROVADO por ls-remote.
635
- const temRemoto = remotoConfigurado(arvore.dir, remoto);
738
+ const temRemoto = urlFixada !== null || remotoConfigurado(arvore.dir, remoto);
636
739
  r.remoto = temRemoto ? remoto : null;
637
- if (opcoes.semPush || !temRemoto) {
740
+ if (urlFixada && !opcoes.semPush) {
741
+ const fixado = { gitdir: (0, mcp_ship_transporte_1.criarGitdirDoPush)(raiz), ...urlFixada, config: configDoRemoto };
742
+ const comFixado = (args) => `git --git-dir=<gitdir privado> ${[...configDoRemoto, ...args].join(' ')}`.replaceAll(urlFixada.url, '<origin fixado>');
743
+ try {
744
+ // O sha e o decidido aqui. Sem `-u`: o gitdir privado nao tem branch para rastrear, e gravar o upstream na
745
+ // config do projeto mudaria a config conferida; o `ls-remote` que so decidia o `-u` sai junto.
746
+ const argsPush = ['push', '--', urlFixada.url, `${pontaDaBase}:refs/heads/${para}`];
747
+ const push = gitDoRemotoFixado(fixado, argsPush, 300000);
748
+ passos.push(comFixado(argsPush));
749
+ if (!push.ok) {
750
+ r.passos = passos;
751
+ const erro = (0, forja_1.detalheDoPush)(push.stderr || push.stdout);
752
+ if ((0, forja_1.pushRecusadoPelaProtecao)(`${push.stderr}\n${push.stdout}`)) {
753
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegida(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegidaCorrecao(threadId)), 'entrega.base-protegida');
754
+ }
755
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhou(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhouCorrecao));
756
+ }
757
+ const shaRemoto = shaNoRemotoFixado(fixado, para);
758
+ passos.push(comFixado(['ls-remote', '--', urlFixada.url, `refs/heads/${para}`]));
759
+ conferirDepoisDoPush(passos);
760
+ r.shaRemoto = shaRemoto;
761
+ r.pushVerificado = shaRemoto !== null && shaRemoto === pontaDaBase;
762
+ if (!r.pushVerificado) {
763
+ r.passos = passos;
764
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProva(shaRemoto, pontaDaBase)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProvaCorrecao));
765
+ }
766
+ // A ref de rastreio do projeto acompanha o remoto provado, como no push por nome; local, sem rede.
767
+ (0, util_1.exec)('git', [...TRAVA_LOCAL_DO_FIXADO, 'update-ref', '--', `refs/remotes/${remoto}/${para}`, pontaDaBase], raiz);
768
+ }
769
+ finally {
770
+ fs.rmSync(fixado.gitdir, { recursive: true, force: true });
771
+ }
772
+ }
773
+ else if (opcoes.semPush || !temRemoto) {
638
774
  r.pushVerificado = false;
639
775
  r.detalhe = (0, locale_1.textoDoCatalogo)((m) => opcoes.semPush ? m.ship.semPushPorFlag : m.ship.semRemoto(remoto));
640
776
  }
641
777
  else {
642
- const existeNoRemoto = shaNoRemoto(arvore.dir, remoto, para) !== null;
778
+ const existeNoRemoto = shaNoRemoto(arvore.dir, remoto, para, configDoRemoto) !== null;
643
779
  const argsPush = existeNoRemoto
644
780
  ? ['push', '--', remoto, `refs/heads/${para}:refs/heads/${para}`]
645
781
  : ['push', '-u', '--', remoto, `refs/heads/${para}:refs/heads/${para}`];
646
- const push = (0, util_1.exec)('git', argsPush, arvore.dir, 300000);
647
- passos.push(`git ${argsPush.join(' ')}`);
782
+ const push = (0, util_1.exec)('git', [...configDoRemoto, ...argsPush], arvore.dir, 300000);
783
+ passos.push(comConfig(argsPush));
648
784
  if (!push.ok) {
649
785
  r.passos = passos;
650
- const erro = (push.stderr || push.stdout).trim().slice(0, 400);
786
+ const erro = (0, forja_1.detalheDoPush)(push.stderr || push.stdout);
787
+ // A protecao da base recusou: a entrega e por PR/MR e o registro dele. O motivo do gate nao muda, so a orientacao.
788
+ if ((0, forja_1.pushRecusadoPelaProtecao)(`${push.stderr}\n${push.stdout}`)) {
789
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegida(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegidaCorrecao(threadId)), 'entrega.base-protegida');
790
+ }
651
791
  return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhou(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhouCorrecao));
652
792
  }
653
793
  // A prova: o sha que o REMOTO devolve tem que ser o mesmo do destino local.
654
- const shaRemoto = shaNoRemoto(arvore.dir, remoto, para);
655
- passos.push(`git ls-remote ${remoto} refs/heads/${para}`);
794
+ const shaRemoto = shaNoRemoto(arvore.dir, remoto, para, configDoRemoto);
795
+ passos.push(comConfig(['ls-remote', remoto, `refs/heads/${para}`]));
796
+ conferirDepoisDoPush(passos);
656
797
  r.shaRemoto = shaRemoto;
657
798
  r.pushVerificado = shaRemoto !== null && shaRemoto === pontaDaBase;
658
799
  if (!r.pushVerificado) {
@@ -695,7 +836,9 @@ function ship(carregado, threadId, opcoes) {
695
836
  passos,
696
837
  },
697
838
  });
698
- (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
839
+ // A publicacao da fabrica empurra pelo origin do projeto, sem o transporte fixado: no fixado, nao sai daqui.
840
+ if (!urlFixada)
841
+ (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
699
842
  const atualizada = (0, thread_1.lerThread)(raiz, threadId);
700
843
  // I-42: ciclo sem SHIP (o `#Fast`) entrega sem trocar de fase; `faseAtual` fica sempre
701
844
  // dentro do ciclo, porque board, pulse e prompt resolvem o bloco a partir dela.
@@ -710,7 +853,7 @@ function ship(carregado, threadId, opcoes) {
710
853
  }
711
854
  finally {
712
855
  if (arvore)
713
- descartarArvore(raiz, arvore);
856
+ descartarArvore(raiz, arvore, urlFixada ? TRAVA_LOCAL_DO_FIXADO : []);
714
857
  const solto = (0, leases_1.liberar)(raiz, leases_1.LEASE_MAIN_TREE, threadId);
715
858
  (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.leaseLiberado, {
716
859
  lease: leases_1.LEASE_MAIN_TREE,
@@ -90,6 +90,7 @@ exports.blocoDoFormato = blocoDoFormato;
90
90
  const fs = __importStar(require("node:fs"));
91
91
  const path = __importStar(require("node:path"));
92
92
  const util_1 = require("./util");
93
+ const locale_1 = require("./locale");
93
94
  /** Ordem canonica das regras novas, usada no catalogo e nas saidas. */
94
95
  exports.REGRAS_DE_SUPERFICIE = ['SP8', 'SP9', 'SP10', 'SP11', 'SP12'];
95
96
  /** O que cada nivel de confianca significa, dito por extenso em toda saida. */
@@ -1286,8 +1287,9 @@ function entradaBrutaDaSuperficie(a) {
1286
1287
  }
1287
1288
  /** Tabela dos achados da varredura. */
1288
1289
  function tabelaDaVarredura(r) {
1290
+ const m = (0, locale_1.msg)().audit.superficie;
1289
1291
  if (r.achados.length === 0) {
1290
- return `Nenhum achado de superficie de ataque. ${r.detalhe}`;
1292
+ return m.vazia(r.detalhe);
1291
1293
  }
1292
1294
  const linhas = r.achados.map((a) => [
1293
1295
  a.regra,
@@ -1298,30 +1300,31 @@ function tabelaDaVarredura(r) {
1298
1300
  `${a.arquivo}:${a.linha}`,
1299
1301
  a.titulo,
1300
1302
  ]);
1301
- return (0, util_1.tabela)(['REGRA', 'SEVERIDADE', 'CONFIANCA', 'FRAMEWORK', 'ROTA', 'EVIDENCIA', 'TITULO'], linhas);
1303
+ return (0, util_1.tabela)([...m.cabecalho], linhas);
1302
1304
  }
1303
1305
  /** Texto completo de `ork audit surface`. */
1304
1306
  function textoDaVarredura(r) {
1307
+ const m = (0, locale_1.msg)().audit.superficie;
1305
1308
  const L = [];
1306
- L.push('Varredura deterministica da superficie de ataque de rede (pack security-privacy, SP8..SP12)');
1309
+ L.push(m.titulo);
1307
1310
  L.push('');
1308
- L.push(` raiz ${r.raiz}`);
1309
- L.push(` escopo ${r.detalhe}`);
1310
- L.push(` frameworks ${r.frameworks.length > 0 ? r.frameworks.join(', ') : '(nenhum reconhecido)'}`);
1311
- L.push(` teto ${r.limitePorRegra} achado(s) por regra`);
1311
+ L.push(m.campo(m.campos.raiz, r.raiz));
1312
+ L.push(m.campo(m.campos.escopo, r.detalhe));
1313
+ L.push(m.campo(m.campos.frameworks, r.frameworks.length > 0 ? r.frameworks.join(', ') : m.nenhumFramework));
1314
+ L.push(m.campo(m.campos.teto, m.teto(r.limitePorRegra)));
1312
1315
  L.push('');
1313
1316
  L.push(tabelaDaVarredura(r));
1314
1317
  L.push('');
1315
1318
  for (const t of r.truncados) {
1316
- L.push(` ATENCAO: ${t.ocultos} achado(s) de ${t.regra} ficaram fora do teto desta varredura.`);
1319
+ L.push(m.truncado(t.ocultos, t.regra));
1317
1320
  }
1318
1321
  const baixas = r.achados.filter((a) => a.confianca === 'baixa').length;
1319
1322
  if (baixas > 0) {
1320
- L.push(` ${baixas} achado(s) sairam com confianca baixa: ${exports.DESCRICAO_DA_CONFIANCA.baixa}`);
1323
+ L.push(m.baixa(baixas, exports.DESCRICAO_DA_CONFIANCA.baixa));
1321
1324
  }
1322
1325
  L.push('');
1323
- L.push('Cada achado carrega o comando que o reexecuta no HEAD real (o auditor nao tem self-report).');
1324
- L.push('Para registrar no board de divida de uma rodada: ork audit surface --registrar <rodada>');
1326
+ L.push(m.claims);
1327
+ L.push(m.registrar);
1325
1328
  return L.join('\n');
1326
1329
  }
1327
1330
  /** O bloco que a rodada deixa no `FORMATO.md` para o auditor nao repetir o que ja foi achado. */
@@ -51,17 +51,17 @@ const fechamento_1 = require("./fechamento");
51
51
  const locale_1 = require("./locale");
52
52
  function validarArtefato(raiz, arquivo, sha256) {
53
53
  if (!/^[a-f0-9]{64}$/.test(sha256))
54
- throw new Error('sha256 inválido');
54
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.sha256Invalido);
55
55
  const root = fs.realpathSync((0, estado_thread_1.raizDoEstado)(raiz));
56
56
  const destino = fs.realpathSync(path.resolve(root, arquivo));
57
57
  const relativo = path.relative(root, destino);
58
58
  if (!relativo || relativo === '..' || relativo.startsWith(`..${path.sep}`) || path.isAbsolute(relativo)) {
59
- throw new Error('artefato deve estar dentro do projeto');
59
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.artefatoForaDoProjeto);
60
60
  }
61
61
  if (!fs.statSync(destino).isFile())
62
- throw new Error('artefato deve ser arquivo regular');
62
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.artefatoNaoRegular);
63
63
  if ((0, node_crypto_1.createHash)('sha256').update(fs.readFileSync(destino)).digest('hex') !== sha256) {
64
- throw new Error('hash do artefato diverge');
64
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.artefatoDiverge);
65
65
  }
66
66
  return { tipo: 'artefato', arquivo: relativo, sha256 };
67
67
  }
@@ -90,24 +90,24 @@ function exigirEntrega(raiz, id) {
90
90
  function registrarArtefato(raiz, id, arquivo, sha256, por) {
91
91
  const t = (0, thread_1.lerThread)(raiz, id);
92
92
  if (t.status === 'fechada' || !por.trim())
93
- throw new Error('artefato exige thread aberta e autoria explícita');
93
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.artefatoExige);
94
94
  const prova = validarArtefato(raiz, arquivo, sha256);
95
95
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.artefatoEntregue, { arquivo, sha256, fase: 'SHIP', por: por.trim() });
96
96
  return prova;
97
97
  }
98
98
  function fecharAdministrativamente(raiz, id, opcoes) {
99
99
  if (!['orfa', 'engano', 'superada'].includes(opcoes.motivo))
100
- throw new Error('motivo deve ser orfa, engano ou superada');
100
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.motivoDoFechamento);
101
101
  if (!opcoes.por.trim() || opcoes.justificativa.trim().length < 3)
102
- throw new Error('fechamento exige autoria e justificativa');
102
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.fechamentoExige);
103
103
  const t = (0, thread_1.lerThread)(raiz, id);
104
104
  if (t.fechamentoAdmin) {
105
105
  if (t.fechamentoAdmin.motivo !== opcoes.motivo)
106
- throw new Error('thread já encerrada por outro motivo');
106
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.encerradaPorOutroMotivo);
107
107
  return t;
108
108
  }
109
109
  if (provaDeEntrega(raiz, id) || t.score)
110
- throw new Error('thread entregue ou pontuada exige MASTER, não fechamento administrativo');
110
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.entregueExigeMaster);
111
111
  t.fechamentoAdmin = { motivo: opcoes.motivo, por: opcoes.por.trim(), justificativa: opcoes.justificativa.trim(), fechadoEm: (0, util_1.agora)() };
112
112
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.threadFechadaAdmin, t.fechamentoAdmin);
113
113
  t.status = 'fechada';