@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/mcp-ship.js CHANGED
@@ -33,7 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ambienteDoWorkerDoTransporte = exports.ambienteDoWorkerShip = void 0;
37
+ exports.conferenciaDepoisDoPush = conferenciaDepoisDoPush;
36
38
  exports.criarPerfilShipMcp = criarPerfilShipMcp;
39
+ exports.configDeRedeDoPerfil = configDeRedeDoPerfil;
37
40
  exports.shipMcp = shipMcp;
38
41
  /** SHIP instalado: o cliente escolhe identidade/HEADs, nunca transporte ou autorização.
39
42
  * SSH do dono é infraestrutura confiável explícita; não é uma promessa de SSH sem helpers.
@@ -47,6 +50,10 @@ const thread_1 = require("./thread");
47
50
  const worktree_1 = require("./worktree");
48
51
  const mcp_artifacts_1 = require("./mcp-artifacts");
49
52
  const mcp_git_1 = require("./mcp-git");
53
+ const mcp_ship_transporte_1 = require("./mcp-ship-transporte");
54
+ Object.defineProperty(exports, "ambienteDoWorkerShip", { enumerable: true, get: function () { return mcp_ship_transporte_1.ambienteDoWorkerShip; } });
55
+ Object.defineProperty(exports, "ambienteDoWorkerDoTransporte", { enumerable: true, get: function () { return mcp_ship_transporte_1.ambienteDoWorkerDoTransporte; } });
56
+ const mcp_transportes_1 = require("./mcp-transportes");
50
57
  const leases_1 = require("./leases");
51
58
  const ship_1 = require("./ship");
52
59
  const verify_1 = require("./verify");
@@ -110,7 +117,7 @@ const PRAZO = 240000, RESERVA = 15000, LIMITE = 1048576;
110
117
  const perfis = new WeakMap();
111
118
  function erro(m) { throw Error('mcp.ship.' + m); }
112
119
  function digest(s) { return (0, node_crypto_1.createHash)('sha256').update(s).digest('hex'); }
113
- /** Somente SSH fixado/bare físico: ambos nunca usam credential helpers HTTP. HTTPS é recusado na factory. */
120
+ /** SSH (do GitHub ou fixado) e bare fisico nunca usam helper HTTP; o HTTPS fixado zera os helpers da config no push. */
114
121
  function config(raiz) {
115
122
  const raw = (0, mcp_git_1.gitPassivoMcp)(raiz, ['config', '--null', '--list']);
116
123
  for (const item of raw.split('\0').filter(Boolean)) {
@@ -120,22 +127,7 @@ function config(raiz) {
120
127
  }
121
128
  return digest(raw);
122
129
  }
123
- /** Push usa todas as URLs configuradas; nunca fixar somente a primeira. */
124
- function originUnico(raiz) {
125
- const ler = (push) => {
126
- const raw = (0, mcp_git_1.gitPassivoMcp)(raiz, ['remote', 'get-url', ...(push ? ['--push'] : []), '--all', 'origin']);
127
- const urls = raw.split('\n');
128
- if (urls[urls.length - 1] === '')
129
- urls.pop();
130
- if (urls.length !== 1 || !urls[0] || /[\x00-\x1f\x7f]/.test(urls[0]))
131
- erro('transport.urls: origin exige uma URL efetiva');
132
- return urls[0];
133
- };
134
- const fetch = ler(false), push = ler(true);
135
- if (fetch !== push)
136
- erro('transport.pushurl');
137
- return fetch;
138
- }
130
+ const originUnico = mcp_ship_transporte_1.originUnicoMcp;
139
131
  function guardarBare(url) {
140
132
  if (!path.isAbsolute(url))
141
133
  erro('transport.bare.invalid');
@@ -169,6 +161,42 @@ function guardarBare(url) {
169
161
  erro('transport.bare.invalid');
170
162
  return { dev: st.dev, ino: st.ino };
171
163
  }
164
+ /**
165
+ * A fixacao de agora tem de ser a do startup, byte a byte no que importa: a mesma pasta, o mesmo `transporte.json`
166
+ * (modo, origin, chaves, CLI, hash da CA) e os mesmos arquivos fixados (`lerFixacao` confere pasta, known_hosts, CLI
167
+ * e CA). O `-c` do push nao e recalculado: e o do startup.
168
+ */
169
+ function guardarPino(f, url) {
170
+ const p = f.pino, atual = (0, mcp_ship_transporte_1.lerFixacao)(f.raiz, p.fixacao.transporte, url, f.env);
171
+ if (atual.dir !== p.dir || JSON.stringify(atual.fixacao) !== JSON.stringify(p.fixacao))
172
+ (0, mcp_ship_transporte_1.recusar)('fixacao-divergente', 'transporte.json');
173
+ (0, mcp_ship_transporte_1.conferirFixacao)(p.fixacao, p.dir);
174
+ (0, mcp_ship_transporte_1.conferirConfigDaCli)(p.fixacao, f.env);
175
+ }
176
+ /**
177
+ * Depois do push e da prova, o origin e a config tem de ser os do startup, e a fixacao a mesma: o git releu os dois a
178
+ * cada comando de rede, e uma troca no meio levaria o push a outro lugar que a prova tambem leria.
179
+ */
180
+ function depoisDoPush(f) {
181
+ return () => {
182
+ let url, cfg;
183
+ try {
184
+ url = originUnico(f.raiz);
185
+ cfg = config(f.raiz);
186
+ }
187
+ catch { /* origin ou config ilegivel tambem e troca */ }
188
+ if (url !== f.url || cfg !== f.config)
189
+ (0, mcp_ship_transporte_1.recusar)('mudou-no-push', 'origin');
190
+ guardarPino(f, url);
191
+ };
192
+ }
193
+ /** A conferencia de depois do push do perfil; so os transportes fixados a tem. */
194
+ function conferenciaDepoisDoPush(perfil) {
195
+ const f = perfis.get(perfil);
196
+ if (!f)
197
+ erro('profile.invalid');
198
+ return f.pino ? depoisDoPush(f) : undefined;
199
+ }
172
200
  /** Somente instalação/startup confiável chama esta factory. O objeto é uma capacidade privada. */
173
201
  function criarPerfilShipMcp(raiz, transporte = 'github-ssh') {
174
202
  if (process.platform !== 'linux' || !path.isAbsolute(raiz))
@@ -181,21 +209,34 @@ function criarPerfilShipMcp(raiz, transporte = 'github-ssh') {
181
209
  if (!/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(destino) || destino.includes('..') || destino.endsWith('/'))
182
210
  erro('destination.invalid');
183
211
  const cfg = config(raiz), url = originUnico(raiz);
184
- let bare;
212
+ let bare, pino;
185
213
  if (transporte === 'github-ssh') {
186
- if (!/^git@github\.com:[A-Za-z0-9][A-Za-z0-9-]*\/[A-Za-z0-9][A-Za-z0-9._-]*\.git$/.test(url))
214
+ if (!mcp_ship_transporte_1.URL_GITHUB_SSH.test(url))
187
215
  erro('transport.unsupported: GitHub SSH exigido; HTTPS requer autenticacao instalada auditada');
188
216
  }
189
217
  else if (transporte === 'bare-local')
190
218
  bare = guardarBare(url);
219
+ else if ((0, mcp_transportes_1.ehTransporteFixado)(transporte))
220
+ pino = (0, mcp_ship_transporte_1.lerFixacao)(raiz, transporte, url);
191
221
  else
192
222
  erro('transport.invalid');
223
+ const rede = pino ? (0, mcp_ship_transporte_1.configDeRede)(pino.fixacao, pino.dir) : [];
224
+ if ((0, mcp_ship_transporte_1.chaveRecusadaDaConfigDeRede)(rede) !== null)
225
+ erro('transport.invalid');
193
226
  const perfil = Object.freeze({ transporte, destino }), st = fs.statSync(raiz);
194
- const env = { HOME: process.env.HOME, USER: process.env.USER, LOGNAME: process.env.LOGNAME, XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
195
- SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK, PATH: '/usr/bin:/bin', LANG: 'C.UTF-8', TMPDIR: '/tmp' };
196
- perfis.set(perfil, { raiz, dev: st.dev, ino: st.ino, url, config: cfg, perfil, env, ...(bare ? { bare } : {}) });
227
+ const env = (0, mcp_ship_transporte_1.ambienteDoWorkerDoTransporte)(transporte, process.env, pino?.fixacao.transporte === 'forja-https' ? pino.fixacao.cli : undefined);
228
+ if (pino)
229
+ (0, mcp_ship_transporte_1.conferirConfigDaCli)(pino.fixacao, env);
230
+ perfis.set(perfil, { raiz, dev: st.dev, ino: st.ino, url, config: cfg, perfil, env, rede, ...(bare ? { bare } : {}), ...(pino ? { pino } : {}) });
197
231
  return perfil;
198
232
  }
233
+ /** O `-c` que o push e o `ls-remote` do perfil levam; vazio no `github-ssh` e no `bare-local`. */
234
+ function configDeRedeDoPerfil(perfil) {
235
+ const f = perfis.get(perfil);
236
+ if (!f)
237
+ erro('profile.invalid');
238
+ return [...f.rede];
239
+ }
199
240
  function validar(p) {
200
241
  if (!p || Object.keys(p).sort().join(',') !== 'expectedDestination,expectedSource,threadId' ||
201
242
  typeof p.threadId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,79}$/.test(p.threadId) ||
@@ -299,8 +340,11 @@ function executar(f, p) {
299
340
  guardEstado();
300
341
  if (Date.now() > deadline - RESERVA)
301
342
  erro('deadline');
302
- if (originUnico(raiz) !== f.url || config(raiz) !== f.config)
343
+ const url = originUnico(raiz);
344
+ if (url !== f.url || config(raiz) !== f.config)
303
345
  erro('transport.changed');
346
+ if (f.pino)
347
+ guardarPino(f, url);
304
348
  if (f.bare) {
305
349
  const b = guardarBare(f.url);
306
350
  if (b.dev !== f.bare.dev || b.ino !== f.bare.ino)
@@ -354,7 +398,7 @@ function executar(f, p) {
354
398
  }
355
399
  };
356
400
  // RM-058 N2 (B1 do CHECK): a fila pesada espera so o que cabe no prazo do worker, para o finally soltar as leases.
357
- return (0, ship_1.ship)(c, t.id, { de, para, remoto: 'origin', executorVerify: executor, ttlLeaseMs: PRAZO + RESERVA, retomarLeaseVencido: false,
401
+ return (0, ship_1.ship)(c, t.id, { de, para, remoto: 'origin', configDoRemoto: f.rede, ...(f.pino ? { conferirDepoisDoPush: depoisDoPush(f), urlFixada: f.pino.fixacao.url } : {}), executorVerify: executor, ttlLeaseMs: PRAZO + RESERVA, retomarLeaseVencido: false,
358
402
  esperarFilaPesadaMs: Math.max(0, Math.min(20000, deadline - Date.now() - RESERVA)),
359
403
  revalidarGit: (etapa, dir) => { if (!leasesIntactas())
360
404
  erro('lease.changed'); guard(etapa, dir); } });
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TRANSPORTES_SHIP_MCP = void 0;
4
+ exports.ehTransporteShipMcp = ehTransporteShipMcp;
5
+ exports.ehTransporteFixado = ehTransporteFixado;
6
+ /**
7
+ * Os transportes do `ork_ship` do MCP. `github-ssh` e o SSH do GitHub de sempre; `bare-local`, um repositorio bare
8
+ * fisico; `forja-ssh` e `forja-https` sao fixados na instalacao (`mcp-ship-transporte.ts`). Sem dependencia: o CLI
9
+ * valida o argumento sem carregar o MCP.
10
+ */
11
+ exports.TRANSPORTES_SHIP_MCP = ['github-ssh', 'forja-ssh', 'forja-https', 'bare-local'];
12
+ function ehTransporteShipMcp(v) {
13
+ return typeof v === 'string' && exports.TRANSPORTES_SHIP_MCP.includes(v);
14
+ }
15
+ function ehTransporteFixado(v) {
16
+ return v === 'forja-ssh' || v === 'forja-https';
17
+ }
package/dist/memoria.js CHANGED
@@ -97,6 +97,8 @@ const onboarding_1 = require("./onboarding");
97
97
  const node_crypto_1 = require("node:crypto");
98
98
  const node_util_1 = require("node:util");
99
99
  const memoria_humana_1 = require("./memoria-humana");
100
+ const locale_1 = require("./locale");
101
+ const locale_prompts_1 = require("./locale-prompts");
100
102
  const master_1 = require("./master");
101
103
  const modos_1 = require("./modos");
102
104
  const orkmind_1 = require("./orkmind");
@@ -804,9 +806,10 @@ function primeiraLinha(texto) {
804
806
  * - Entradas `mandatory` do OrkMind entram sempre que as tags casam, em qualquer fase.
805
807
  * - Todo item declara a proveniencia: `path#ancora` ou `orkmind://<colecao>/<id>`.
806
808
  */
807
- function injecaoDaFase(carregado, memoria, thread, fase) {
809
+ function injecaoDaFase(carregado, memoria, thread, fase, locale = (0, locale_1.localeAtivo)()) {
808
810
  carregado = (0, project_state_1.memoryState)(carregado).loaded;
809
811
  const { manifesto } = carregado;
812
+ const m = (locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR).memoria;
810
813
  const itens = [];
811
814
  const caminhoThread = `.orkastery/threads/${thread.id}/thread.json`;
812
815
  let n = 0;
@@ -823,7 +826,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
823
826
  vistas.add(d.id);
824
827
  add({
825
828
  colecao: 'decision',
826
- titulo: `Decisao ${d.id} (fechada por ${d.decididaPor})`,
829
+ titulo: m.decisaoFechada(d.id, d.decididaPor),
827
830
  conteudo: d.texto,
828
831
  origem: 'thread.json',
829
832
  location: `${caminhoThread}#json:decisoes.${d.id}`,
@@ -839,7 +842,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
839
842
  vistas.add(id);
840
843
  add({
841
844
  colecao: 'decision',
842
- titulo: id ? `Decisao ${id} (memoria semantica)` : 'Decisao fechada (memoria semantica)',
845
+ titulo: id ? m.decisaoSemantica(id) : m.decisaoSemId,
843
846
  conteudo: e.content,
844
847
  origem: 'orkmind',
845
848
  location: (0, orkmind_1.enderecoDeMemoria)('decision', e.id),
@@ -856,7 +859,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
856
859
  licoes += 1;
857
860
  add({
858
861
  colecao: 'learning',
859
- titulo: `Licao da thread ${threadDaEntrada(e) ?? '(anterior)'}`,
862
+ titulo: m.licaoDaThread(threadDaEntrada(e) ?? (locale === 'en' ? '(previous)' : '(anterior)')),
860
863
  conteudo: e.content,
861
864
  origem: 'orkmind',
862
865
  location: (0, orkmind_1.enderecoDeMemoria)('learning', e.id),
@@ -873,7 +876,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
873
876
  licoes += 1;
874
877
  add({
875
878
  colecao: 'learning',
876
- titulo: 'Licoes das threads fechadas deste produto (POSTMORTEM e MASTER)',
879
+ titulo: m.licoesDoProduto,
877
880
  conteudo: texto,
878
881
  origem: 'postmortem',
879
882
  location: '.orkastery/threads/*/POSTMORTEM.json',
@@ -891,7 +894,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
891
894
  regras += 1;
892
895
  add({
893
896
  colecao: 'rule',
894
- titulo: `Regra mandatoria: ${primeiraLinha(e.content).slice(0, 70)}`,
897
+ titulo: m.regraMandatoria(primeiraLinha(e.content).slice(0, 70)),
895
898
  conteudo: e.content,
896
899
  origem: 'orkmind',
897
900
  location: (0, orkmind_1.enderecoDeMemoria)('rule', e.id),
@@ -907,7 +910,7 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
907
910
  decisoes,
908
911
  licoes,
909
912
  regras,
910
- texto: textoDaInjecao(itens, memoria.regime),
913
+ texto: textoDaInjecao(itens, memoria.regime, locale),
911
914
  };
912
915
  }
913
916
  /**
@@ -916,38 +919,30 @@ function injecaoDaFase(carregado, memoria, thread, fase) {
916
919
  * Vazio quando nao ha item: a linha da variavel some do prompt e o texto fica byte a byte
917
920
  * igual ao que o B4 ja despachava. Uma thread sem decisao fechada nao ganha secao vazia.
918
921
  */
919
- function textoDaInjecao(itens, regime) {
922
+ function textoDaInjecao(itens, regime, locale = (0, locale_1.localeAtivo)()) {
920
923
  if (itens.length === 0)
921
924
  return '';
925
+ const m = (locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR).memoria;
922
926
  const linhas = [];
923
927
  linhas.push('');
924
- linhas.push(`## Memoria injetada (regime ${regime})`);
925
- linhas.push('Recuperacao deterministica por tag. Todo item declara de onde veio: nada entra neste ' +
926
- 'prompt sem proveniencia. O que NAO esta aqui esta nos ponteiros do handoff, ' +
927
- 'recuperavel por `ork recall`.');
928
+ linhas.push(m.titulo(regime));
929
+ linhas.push(m.explicacao);
928
930
  const porColecao = {};
929
931
  for (const i of itens)
930
932
  (porColecao[i.colecao] ??= []).push(i);
931
- const rotulos = {
932
- decision: 'Decisoes fechadas desta thread (entram em TODA fase)',
933
- learning: 'Licoes de threads anteriores deste produto',
934
- rule: 'Regras mandatorias do ecossistema',
935
- handoff: 'Handoffs anteriores',
936
- roadmap: 'Roadmap',
937
- };
938
933
  for (const colecao of ['decision', 'learning', 'rule', 'handoff', 'roadmap']) {
939
934
  const doGrupo = porColecao[colecao];
940
935
  if (!doGrupo || doGrupo.length === 0)
941
936
  continue;
942
937
  linhas.push('');
943
- linhas.push(`### ${rotulos[colecao] ?? colecao} (${doGrupo.length})`);
938
+ linhas.push(`### ${m.grupos[colecao] ?? colecao} (${doGrupo.length})`);
944
939
  for (const i of doGrupo) {
945
- linhas.push(`- ${i.titulo}${i.mandatory ? ' [MANDATORY]' : ''}`);
940
+ linhas.push(`- ${i.titulo}${i.mandatory ? m.mandatory : ''}`);
946
941
  for (const l of i.conteudo.split('\n')) {
947
942
  if (l.trim() !== '')
948
943
  linhas.push(` ${l}`);
949
944
  }
950
- linhas.push(` origem: ${i.location}`);
945
+ linhas.push(` ${m.origem(i.location)}`);
951
946
  }
952
947
  }
953
948
  return linhas.join('\n');
@@ -1092,29 +1087,37 @@ function publicarPropostas(carregado, achados, memoriaAberta) {
1092
1087
  }
1093
1088
  /** Texto de `ork memory status`. */
1094
1089
  function textoDoEstado(estado) {
1090
+ const m = (0, locale_1.msg)().operacao.restante.memory.estado;
1095
1091
  const linhas = [];
1096
- linhas.push('Regime de memoria do projeto');
1092
+ linhas.push(m.titulo);
1097
1093
  linhas.push('');
1098
- linhas.push(` pedido no manifesto ${estado.pedido}`);
1099
- linhas.push(` regime efetivo ${estado.efetivo}`);
1100
- linhas.push(` tenant ${estado.tenant}`);
1101
- linhas.push(` variavel da base ${estado.variavel || '(nao declarada)'}`);
1102
- linhas.push(` DSN no ambiente ${estado.dsnPresente ? 'sim (valor nunca impresso)' : 'nao'}`);
1103
- linhas.push(` cli do OrkMind ${estado.cli}`);
1094
+ linhas.push(m.pedido(estado.pedido));
1095
+ linhas.push(m.efetivo(estado.efetivo));
1096
+ linhas.push(m.tenant(estado.tenant));
1097
+ // RM-069 (D5): com a fonte de arquivo, o arquivo pelo rotulo com `~`; com ambiente, as linhas de sempre.
1098
+ if (estado.fonteDaDsn === 'arquivo') {
1099
+ linhas.push(m.arquivo(estado.arquivoDaDsn ?? ''));
1100
+ linhas.push(m.dsnNoArquivo(estado.dsnPresente));
1101
+ }
1102
+ else {
1103
+ linhas.push(m.variavel(estado.variavel));
1104
+ linhas.push(m.dsn(estado.dsnPresente));
1105
+ }
1106
+ linhas.push(m.cli(estado.cli));
1104
1107
  linhas.push('');
1105
1108
  if (estado.motivo) {
1106
- linhas.push(` degradacao: ${estado.motivo}`);
1109
+ linhas.push(m.degradacao(estado.motivo));
1107
1110
  linhas.push(` ${estado.detalhe}`);
1108
- linhas.push(` correcao: ${estado.correcao}`);
1111
+ linhas.push(m.correcao(estado.correcao));
1109
1112
  linhas.push('');
1110
- linhas.push(' O ciclo NAO para por isso: em regime files o handoff continua triado em 3 niveis,');
1111
- linhas.push(' os ponteiros continuam `path#ancora` e `ork recall` continua resolvendo.');
1113
+ linhas.push(m.continua1);
1114
+ linhas.push(m.continua2);
1112
1115
  }
1113
1116
  else {
1114
1117
  linhas.push(` ${estado.detalhe}`);
1115
1118
  linhas.push('');
1116
- linhas.push(` colecoes gravadas: ${orkmind_1.COLECOES_DO_ORK.join(', ')}`);
1117
- linhas.push(' governanca: source=agent; decision/human exige human_gate comprovado; mandatory=false e regra nunca critical.');
1119
+ linhas.push(m.colecoes(orkmind_1.COLECOES_DO_ORK.join(', ')));
1120
+ linhas.push(m.governanca);
1118
1121
  }
1119
1122
  if (estado.embeddings)
1120
1123
  linhas.push('', ...textoDosEmbeddings(estado.embeddings));
@@ -1122,37 +1125,38 @@ function textoDoEstado(estado) {
1122
1125
  }
1123
1126
  /** Secao de embeddings do `ork memory status` (I-38 D6): nome da variavel, nunca o valor. */
1124
1127
  function textoDosEmbeddings(e) {
1125
- const linhas = ['Busca por significado (embeddings, nao deterministica; o recall por tag nao muda)', ''];
1126
- linhas.push(` provider ${e.configurado ? `${e.provider} ${e.modelo} (${e.dim} dim)` : 'none (desligada)'}`);
1128
+ const m = (0, locale_1.msg)().operacao.restante.memory.embeddings;
1129
+ const linhas = [m.titulo, ''];
1130
+ linhas.push(m.provider(e.configurado ? `${e.provider} ${e.modelo} (${e.dim} dim)` : m.desligada));
1127
1131
  if (e.configurado) {
1128
- linhas.push(` chave ${e.variavelDaChave} ${e.chavePresente ? 'presente' : 'ausente'} no ambiente (valor nunca impresso)`);
1129
- linhas.push(` fallback local ${e.fallback.modelo ? `${e.fallback.modelo}: ${e.fallback.presente ? `no cache (${e.fallback.dim} dim)` : 'ausente do cache'}, ` +
1130
- `dependencias ${e.fallback.dependencias ? 'ok' : e.sondado ? 'ausentes' : 'nao sondadas'}` : '(nao declarado)'}`);
1131
- linhas.push(` caminho ativo ${e.ativo}${e.sondado ? '' : ' (ponte nao sondada)'}`);
1132
+ linhas.push(m.chave(e.variavelDaChave, e.chavePresente));
1133
+ linhas.push(m.fallback(e.fallback.modelo ? `${e.fallback.modelo}: ${e.fallback.presente ? m.cache(e.fallback.dim) : m.foraCache}, ` +
1134
+ m.deps(e.fallback.dependencias ? m.depsOk : e.sondado ? m.depsAusentes : m.depsNaoSondadas) : m.naoDeclarado));
1135
+ linhas.push(m.ativo(e.ativo, e.sondado));
1132
1136
  }
1133
1137
  if (e.universo) {
1134
1138
  const colecoes = Object.entries(e.universo.porColecao).map(([c, n]) => `${c} ${n}`).join(', ');
1135
- linhas.push(` universo da busca ${e.entradas} entrada(s) do tenant: ${colecoes}`);
1136
- linhas.push(` fora da busca ${(0, indice_vetorial_1.textoForaDaBusca)(e.universo.foraDaBusca)}`);
1139
+ linhas.push(m.universo(e.entradas, colecoes));
1140
+ linhas.push(m.fora((0, indice_vetorial_1.textoForaDaBusca)(e.universo.foraDaBusca)));
1137
1141
  }
1138
1142
  else if (e.falhaDoUniverso) {
1139
- linhas.push(` universo da busca nao lido (${e.falhaDoUniverso}); cobertura nao calculada`);
1143
+ linhas.push(m.universoFalhou(e.falhaDoUniverso));
1140
1144
  }
1141
1145
  for (const i of e.indices) {
1142
- linhas.push(` indice ${i.modelo} / ${i.dim} dim: ${i.vetores} vetor(es), ${i.coerentes ?? '?'} coerente(s), ${i.desatualizados ?? '?'} desatualizado(s)`);
1146
+ linhas.push(m.indice(i.modelo, i.dim, i.vetores, i.coerentes ?? null, i.desatualizados ?? null));
1143
1147
  }
1144
1148
  if (e.entradas !== null) {
1145
- linhas.push(` cobertura ${e.cobertura === null ? '-' : `${Math.round(e.cobertura * 1000) / 10}%`} de ${e.entradas} entrada(s) do universo da busca`);
1149
+ linhas.push(m.cobertura(e.cobertura === null ? '-' : `${Math.round(e.cobertura * 1000) / 10}%`, e.entradas));
1146
1150
  }
1147
1151
  if (e.aviso)
1148
- linhas.push(` aviso ${e.aviso}`);
1152
+ linhas.push(m.aviso(e.aviso));
1149
1153
  if (e.sonda) {
1150
- linhas.push(` sonda ${e.sonda.ok ? `${e.sonda.alvo} respondeu em ${e.sonda.latenciaMs} ms` : `sem resposta (${e.sonda.motivo ?? 'sem caminho ativo'})`}`);
1154
+ linhas.push(m.sonda(e.sonda.ok ? m.sondaOk(e.sonda.alvo, e.sonda.latenciaMs) : m.sondaFalha(e.sonda.motivo ?? m.semCaminho)));
1151
1155
  }
1152
1156
  if (e.motivo) {
1153
- linhas.push(` motivo ${e.motivo}`);
1157
+ linhas.push(m.motivo(e.motivo));
1154
1158
  linhas.push(` ${e.detalhe}`);
1155
- linhas.push(` correcao: ${e.correcao}`);
1159
+ linhas.push((0, locale_1.msg)().operacao.restante.memory.estado.correcao(e.correcao));
1156
1160
  }
1157
1161
  else
1158
1162
  linhas.push(` ${e.detalhe}`);
@@ -1160,30 +1164,31 @@ function textoDosEmbeddings(e) {
1160
1164
  }
1161
1165
  /** Texto de `ork memory sync`. */
1162
1166
  function textoDoSync(r) {
1167
+ const m = (0, locale_1.msg)().operacao.restante.memory.sync;
1163
1168
  const linhas = [];
1164
- linhas.push(`Sincronizacao de memoria (regime ${r.regime})${r.thread ? ` da thread ${r.thread}` : ''}`);
1165
- linhas.push(`Perfil: ${r.perfil ?? 'integral'}; fora do perfil: ${(r.colecoesForaDoPerfil ?? []).join(', ') || '(nenhuma)'}`);
1169
+ linhas.push(m.titulo(r.regime, r.thread));
1170
+ linhas.push(m.perfil(r.perfil ?? 'integral', (r.colecoesForaDoPerfil ?? []).join(', ')));
1166
1171
  if (r.publicacao?.estado === 'pendente')
1167
- linhas.push(`Publicacao pendente: ${r.publicacao.motivo}`);
1172
+ linhas.push(m.pendente(r.publicacao.motivo));
1168
1173
  linhas.push('');
1169
1174
  const linha = (nome, s) => {
1170
- linhas.push(` ${nome.padEnd(10)} ${s.gravadas.length} entrada(s): ${s.detalhe}`);
1175
+ linhas.push(m.entradas(nome, s.gravadas.length, s.detalhe));
1171
1176
  };
1172
1177
  linha('decision', r.decisoes);
1173
1178
  linha('rule', r.policies);
1174
- linhas.push(` human_gate ${r.humanos.elegiveis} elegiveis, ${r.humanos.excluidos} excluidos, ${r.humanos.falhas} falhas`);
1179
+ linhas.push(m.humanos(r.humanos.elegiveis, r.humanos.excluidos, r.humanos.falhas));
1175
1180
  const um = (nome, g) => {
1176
- linhas.push(` ${nome.padEnd(10)} ${g ? (g.ok ? `${g.duplicada ? 'ja existente' : 'gravado'} (${g.id})` : `nao gravado: ${g.detalhe}`) : '(nada a gravar)'}`);
1181
+ linhas.push(m.gravacao(nome, g ? (g.ok ? `${g.duplicada ? m.jaExiste : m.gravado} (${g.id})` : m.naoGravado(g.detalhe)) : m.nada));
1177
1182
  };
1178
1183
  um('handoff', r.handoff);
1179
1184
  um('learning', r.learning);
1180
1185
  um('roadmap', r.roadmap);
1181
1186
  linhas.push('');
1182
- linhas.push(` total ${r.total} tentativa(s), ${r.falhas} sem gravacao`);
1187
+ linhas.push(m.total(r.total, r.falhas));
1183
1188
  if (r.regime === 'files') {
1184
1189
  linhas.push('');
1185
1190
  linhas.push(` ${r.estado.detalhe}`);
1186
- linhas.push(` correcao: ${r.estado.correcao}`);
1191
+ linhas.push(m.correcao(r.estado.correcao));
1187
1192
  }
1188
1193
  return linhas.join('\n');
1189
1194
  }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.branchRegistradaDaEntrega = branchRegistradaDaEntrega;
4
+ exports.mergesDasEntregasNaBase = mergesDasEntregasNaBase;
5
+ /**
6
+ * Reconhecimento unico do merge que entrega uma thread na linha de primeiro pai da base.
7
+ *
8
+ * A forja pode preservar o titulo `ship(<thread>)` no assunto ou usar sua mensagem padrao.
9
+ * Nos formatos padrao, a branch e o vinculo: ela precisa ser exatamente a branch registrada
10
+ * para a thread. O fallback pela convencao existe para o `docs verificar` no CI, que nao tem
11
+ * `.orkastery/`, e fecha o id antes de aceitar o sufixo da fase (`ork-abc` nao casa `ork-abcd`).
12
+ */
13
+ const branch_de_estado_1 = require("./branch-de-estado");
14
+ const ledger_1 = require("./ledger");
15
+ const thread_1 = require("./thread");
16
+ const util_1 = require("./util");
17
+ /** A branch da thread como foi registrada, preferindo o evento especifico da worktree. */
18
+ function branchRegistradaDaEntrega(raiz, thread) {
19
+ try {
20
+ const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, thread));
21
+ const worktree = [...eventos].reverse().find((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeCriada && (0, branch_de_estado_1.branchValida)(e.branch));
22
+ if (worktree)
23
+ return String(worktree.branch);
24
+ const criada = [...eventos].reverse().find((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.threadCriada);
25
+ const base = criada?.base;
26
+ if (base && typeof base === 'object' && !Array.isArray(base)) {
27
+ const branch = base.branch;
28
+ if ((0, branch_de_estado_1.branchValida)(branch))
29
+ return branch;
30
+ }
31
+ }
32
+ catch { /* checkout de CI ou thread sem estado local */ }
33
+ return null;
34
+ }
35
+ const branchConvencionalDaThread = (branch, thread) => {
36
+ const prefixo = `ork/${thread}`;
37
+ return branch === prefixo || branch.startsWith(`${prefixo}-`);
38
+ };
39
+ function threadDoAssunto(assunto, entregas, base) {
40
+ const ship = /^ship\(([^)]+)\)/.exec(assunto);
41
+ if (ship?.[1])
42
+ return ship[1];
43
+ const github = /^Merge pull request #[1-9][0-9]* from [^/\s]+\/(\S+)$/.exec(assunto);
44
+ const gitlab = /^Merge branch '(.+)' into '(.+)'$/.exec(assunto);
45
+ const branch = github?.[1] ?? (gitlab?.[2] === base ? gitlab[1] : null);
46
+ if (!branch)
47
+ return null;
48
+ return entregas.find((entrega) => entrega.branch === null
49
+ ? branchConvencionalDaThread(branch, entrega.thread)
50
+ : branch === entrega.branch)?.thread ?? null;
51
+ }
52
+ /**
53
+ * Merges das entregas na base, em ordem do git log (mais novo primeiro por omissao).
54
+ *
55
+ * O assunto e lido por `%s`, portanto uma citacao somente no corpo nao entra. `--first-parent`
56
+ * tira commits da branch lateral. O segundo pai continua opcional no retorno para preservar a
57
+ * recusa tipada `entrega.sem-vinculo` de squash/rebase quando a CI e obrigatoria.
58
+ */
59
+ function mergesDasEntregasNaBase(raiz, refBase, base, entregas, reverse = false) {
60
+ const saida = new Map(entregas.map((e) => [e.thread, []]));
61
+ if (!(0, branch_de_estado_1.branchValida)(refBase) || !(0, branch_de_estado_1.branchValida)(base))
62
+ return saida;
63
+ const args = ['log', refBase, '--first-parent', '--format=%H%x09%P%x09%cI%x09%s', ...(reverse ? ['--reverse'] : []), '--'];
64
+ const r = (0, util_1.exec)('git', args, raiz, 60000);
65
+ if (!r.ok)
66
+ return saida;
67
+ for (const linha of r.stdout.split('\n')) {
68
+ const [sha, pais, em, assunto] = linha.split('\t');
69
+ if (!(0, branch_de_estado_1.shaValido)(sha) || typeof assunto !== 'string')
70
+ continue;
71
+ const thread = threadDoAssunto(assunto, entregas, base);
72
+ if (!thread)
73
+ continue;
74
+ const segundo = (pais ?? '').split(' ')[1] ?? null;
75
+ const ms = Date.parse(em ?? '');
76
+ const merges = saida.get(thread) ?? [];
77
+ merges.push({
78
+ mergeSha: sha,
79
+ headSha: segundo && (0, branch_de_estado_1.shaValido)(segundo) ? segundo : null,
80
+ em: Number.isFinite(ms) ? new Date(ms).toISOString() : null,
81
+ });
82
+ saida.set(thread, merges);
83
+ }
84
+ return saida;
85
+ }
@@ -67,6 +67,7 @@ const manifest_1 = require("./manifest");
67
67
  const ledger_1 = require("./ledger");
68
68
  const modos_1 = require("./modos");
69
69
  const util_1 = require("./util");
70
+ const locale_1 = require("./locale");
70
71
  const MARCA_BACKUP = 'migracao-modos-i43';
71
72
  /** Le a lista `[a, b, c]` de uma linha de YAML simples, como o manifesto escreve. */
72
73
  function lerListaInline(linha) {
@@ -178,14 +179,15 @@ function migrarModosAposentados(raiz, opcoes = {}) {
178
179
  }
179
180
  /** Texto do `ork modos migrar`, com o antes e o depois de cada campo. */
180
181
  function textoDaMigracaoModos(r) {
182
+ const m = (0, locale_1.msg)().operacao.modos.migracao;
181
183
  if (r.mudancas.length === 0) {
182
- return 'Nada a migrar: nenhum modo aposentado na configuracao deste projeto.';
184
+ return m.nada;
183
185
  }
184
- const linhas = [r.dryRun ? 'Simulacao (--dry-run), nada foi gravado.' : 'Migracao aplicada.'];
185
- for (const m of r.mudancas)
186
- linhas.push(` ${m.arquivo} ${m.campo}`, ` de ${m.de}`, ` para ${m.para}`);
186
+ const linhas = [r.dryRun ? m.simulacao : m.aplicada];
187
+ for (const mudanca of r.mudancas)
188
+ linhas.push(` ${mudanca.arquivo} ${mudanca.campo}`, ` ${m.de.padEnd(4)} ${mudanca.de}`, ` ${m.para} ${mudanca.para}`);
187
189
  if (r.backup)
188
- linhas.push(` backup ${r.backup}`);
189
- linhas.push('', 'Nenhum historico foi tocado: thread, ledger e recibo em modo aposentado ficam como estao.');
190
+ linhas.push(` ${m.backup} ${r.backup}`);
191
+ linhas.push('', m.historico);
190
192
  return linhas.join('\n');
191
193
  }
package/dist/modos.js CHANGED
@@ -25,14 +25,12 @@ exports.fasePausa = fasePausa;
25
25
  exports.tabelaDeModos = tabelaDeModos;
26
26
  const types_1 = require("./types");
27
27
  const locale_1 = require("./locale");
28
- /** Invariantes que valem em TODOS os modos, inclusive `#Auto`. */
29
- exports.INVARIANTES = [
30
- 'Claims, verify e policies rodam identicos em todos os modos.',
31
- 'Policy `block` pausa qualquer modo, inclusive #Auto.',
32
- 'Escalacao tipada para humano pausa qualquer modo, inclusive #Auto.',
33
- 'Toda entrega fecha com indice derivado do ledger; a nota humana, quando vier, sobrescreve.',
34
- 'Toda decisao autonoma vai ao ledger com quem decidiu, evidencia e razao.',
35
- ];
28
+ const locale_prompts_1 = require("./locale-prompts");
29
+ /**
30
+ * Invariantes que valem em TODOS os modos, inclusive `#Auto`. RM-061 F3c: o texto mora no catalogo dos prompts (o
31
+ * pt-BR e a fonte, o ingles e tipado por ele); a tabela do `ork modos` e o prompt de fase leem o mesmo.
32
+ */
33
+ exports.INVARIANTES = locale_prompts_1.PROMPTS_PT_BR.invariantes;
36
34
  /** Monta a parte 3 do slug para um conjunto de fases (visao, secao 3.4). */
37
35
  function slugDasFases(fases) {
38
36
  if (fases.length === 0)
@@ -315,10 +313,11 @@ function fasePausa(modo, fase) {
315
313
  }
316
314
  /** Tabela dos modos VIVOS em texto, usada por `ork modos`. O numero vem da lista. */
317
315
  function tabelaDeModos() {
316
+ const m = (0, locale_1.msg)().operacao.modos;
318
317
  const linhas = [];
319
- linhas.push('Modos de conducao (a #TAG vai no proprio pedido ao orquestrador)');
318
+ linhas.push(m.titulo);
320
319
  linhas.push('');
321
- const cab = ['#TAG'.padEnd(10), 'BLOCOS'.padEnd(6), 'PAUSAS'.padEnd(7), 'CICLO'];
320
+ const cab = [m.cabecalho[0].padEnd(10), m.cabecalho[1].padEnd(6), m.cabecalho[2].padEnd(7), m.cabecalho[3]];
322
321
  linhas.push(' ' + cab.join(' '));
323
322
  linhas.push(' ' + '-'.repeat(78));
324
323
  for (const modo of exports.ORDEM_DOS_MODOS) {
@@ -335,19 +334,19 @@ function tabelaDeModos() {
335
334
  ].join(' '));
336
335
  }
337
336
  linhas.push(' ' + '-'.repeat(78));
338
- linhas.push(' * = bloco que pausa e espera veredito humano');
337
+ linhas.push(` ${m.marcaDaPausa}`);
339
338
  linhas.push('');
340
- linhas.push('Detalhe por modo:');
339
+ linhas.push(m.detalhe);
341
340
  for (const modo of exports.ORDEM_DOS_MODOS) {
342
341
  const def = exports.MODOS[modo];
343
- const pausas = def.blocos.filter((b) => b.pausa).map((b) => b.pausaSobre);
344
- linhas.push(` ${def.tag.padEnd(10)} slug das sessoes: ${def.blocos.map((b) => b.slugFases).join(', ')}`);
345
- linhas.push(` pausas: ${pausas.length > 0 ? pausas.join(', ') : 'nenhuma'}`);
346
- linhas.push(` uso: ${def.recomendadoPara}`);
342
+ const pausas = def.blocos.filter((b) => b.pausa).map((b) => m.pausaSobre[b.pausaSobre] ?? b.pausaSobre);
343
+ linhas.push(` ${def.tag.padEnd(10)} ${m.slug}: ${def.blocos.map((b) => b.slugFases).join(', ')}`);
344
+ linhas.push(` ${m.pausas}: ${pausas.length > 0 ? pausas.join(', ') : m.nenhuma}`);
345
+ linhas.push(` ${m.uso}: ${m.recomendado[modo] ?? def.recomendadoPara}`);
347
346
  }
348
347
  linhas.push('');
349
- linhas.push('REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.');
350
- for (const inv of exports.INVARIANTES)
348
+ linhas.push(m.regra);
349
+ for (const inv of (0, locale_1.msg)().prompts.invariantes)
351
350
  linhas.push(' - ' + inv);
352
351
  return linhas.join('\n');
353
352
  }