@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
@@ -77,6 +77,7 @@ const node_crypto_1 = require("node:crypto");
77
77
  const estado_thread_1 = require("./estado-thread");
78
78
  const orkmind_1 = require("./orkmind");
79
79
  const policies_1 = require("./policies");
80
+ const locale_1 = require("./locale");
80
81
  exports.CONTRATO_INDICE = 'ork.indice-vetorial/v1';
81
82
  /** D11: lote por chamada da ponte na indexacao. */
82
83
  exports.TAMANHO_DO_LOTE = 16;
@@ -360,23 +361,24 @@ function avisoDeCobertura(coerentes, entradas, alvo, onde = '') {
360
361
  }
361
362
  /** RM-038: a linha do que fica fora da busca, a mesma no `ork memory index` e no `ork memory status`. */
362
363
  function textoForaDaBusca(f) {
363
- return f ? `${f.injecao} com injection_risk e ${f.expiradas} expirada(s) (governanca da biblioteca), ` +
364
- `${f.outrasColecoes} em outras colecoes (fora da busca do ork); nada disso vai ao embed` : 'nao medido nesta base';
364
+ const m = (0, locale_1.msg)().operacao.restante.memory.indice;
365
+ return f ? m.foraMedido(f.injecao, f.expiradas, f.outrasColecoes) : m.foraNaoMedido;
365
366
  }
366
367
  /** Texto de `ork memory index`: de que universo, o que foi (ou seria) embedado e quanto custa estimado. */
367
368
  function textoDoIndice(r) {
368
- const custo = r.custoEstimadoUsd === null ? 'nao estimado' : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
369
+ const m = (0, locale_1.msg)().operacao.restante.memory.indice;
370
+ const custo = r.custoEstimadoUsd === null ? m.custoNaoEstimado : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
369
371
  const colecoes = Object.entries(r.porColecao).map(([c, n]) => `${c} ${n}`).join(', ');
370
372
  return [
371
- `Indice vetorial (${r.alvo}${r.dryRun ? ', --dry-run' : ''}): ${r.modelo ?? '(sem modelo)'}${r.dim ? ` / ${r.dim} dim` : ''}`,
372
- ` universo da busca ${r.universo} entrada(s): ${colecoes}; coerentes ${r.coerentes}`,
373
- ` fora da busca ${textoForaDaBusca(r.foraDaBusca)}`,
374
- ` embedados ${r.embedados} (reescritos ${r.reescritos}); removidos ${r.removidos}`,
375
- ` fora do indice ${r.recusados} recusada(s) por padrao de segredo, ${r.foraDoLimite} acima do limite`,
376
- ...(r.truncados ? [` truncados ${r.truncados} acima do contexto do modelo local, embedados pelo comeco`] : []),
377
- ` estimativa ${r.tokensEstimados} token(s), ${custo}; chamadas ao provider ${r.chamadasAoProvider}`,
378
- ...(r.arquivo ? [` arquivo ${r.arquivo}`] : []),
379
- ...(r.motivo ? [` motivo ${r.motivo}: ${r.detalhe}`] : r.detalhe ? [` ${r.detalhe}`] : []),
373
+ m.titulo(r.alvo, r.dryRun, r.modelo ?? m.semModelo, r.dim),
374
+ m.universo(r.universo, colecoes, r.coerentes),
375
+ m.fora(textoForaDaBusca(r.foraDaBusca)),
376
+ m.embedados(r.embedados, r.reescritos, r.removidos),
377
+ m.recusados(r.recusados, r.foraDoLimite),
378
+ ...(r.truncados ? [m.truncados(r.truncados)] : []),
379
+ m.estimativa(r.tokensEstimados, custo, r.chamadasAoProvider),
380
+ ...(r.arquivo ? [m.arquivo(r.arquivo)] : []),
381
+ ...(r.motivo ? [m.motivo(r.motivo, r.detalhe)] : r.detalhe ? [` ${r.detalhe}`] : []),
380
382
  ].join('\n');
381
383
  }
382
384
  /** Vetores coerentes de um indice para o universo informado: a base da busca e da cobertura. */
package/dist/init.js CHANGED
@@ -56,6 +56,7 @@ const slug_1 = require("./slug");
56
56
  const util_1 = require("./util");
57
57
  const horario_1 = require("./horario");
58
58
  const modos_1 = require("./modos");
59
+ const detect_1 = require("./security-scan/detect");
59
60
  /** O proximo passo do `ork init` em pt-BR; o texto do CLI sai pelo catalogo (`msg().init.proximoPasso`). */
60
61
  exports.PROXIMO_PASSO_INIT = (0, locale_1.msg)('pt-BR').init.proximoPasso;
61
62
  /** Raiz do repositorio git, resolvendo tambem o caso de worktree. */
@@ -144,6 +145,7 @@ function detectar(dirInicial, nomeForcado, abbrevForcada) {
144
145
  baseBranch: baseBranchDetectada(raiz),
145
146
  gerenciador: gerenciadorDetectado(raiz),
146
147
  verify: verifyDetectado(raiz),
148
+ stacks: [...new Set((0, detect_1.detectStacks)(raiz).map((e) => e.stack))],
147
149
  };
148
150
  }
149
151
  /** Cada linha do texto vira comentario do YAML, com o recuo da chave em que ele fica. */
@@ -203,6 +205,10 @@ verify:
203
205
  ${linhaVerify('build', d.verify.build)}
204
206
  ${linhaVerify('test', d.verify.test)}
205
207
  ${linhaVerify('typecheck', d.verify.typecheck)}
208
+ ${comentario(c.securityScan)}
209
+ ${d.stacks.length > 0 ? '' : '# '}security_scan: "ork security-scan"
210
+ ${d.stacks.length > 0 ? '' : '# '}timeout_ms_por_comando:
211
+ ${d.stacks.length > 0 ? '' : '# '} security_scan: 900000
206
212
 
207
213
  ci:
208
214
  ${comentario(c.ci)}
@@ -283,6 +289,9 @@ function init(dirInicial, opcoes = {}) {
283
289
  (0, util_1.gravar)(caminho, manifestoYaml(deteccao, opcoes.locale));
284
290
  const estado = path.join(deteccao.raiz, manifest_1.DIR_ESTADO);
285
291
  fs.mkdirSync(path.join(estado, 'threads'), { recursive: true });
286
- // Fatia 2 do ensaio da 0.5.0 (P3): o estado e da maquina; fica fora do git sem mexer no `.gitignore` do usuario.
287
- return { caminho, criado: true, deteccao, estadoIgnorado: (0, util_1.ignorarPastaNoGit)(estado, deteccao.raiz) };
292
+ // RM-061 F3c: so o arquivo do estado criado pelo `init` segue a lingua pedida. O `*` e a protecao
293
+ // contra sobrescrita continuam no util; a pasta de worktrees preserva o default historico.
294
+ const locale = opcoes.locale ?? locale_1.LOCALE_PADRAO;
295
+ const gitignore = `# ${(0, locale_1.msg)(locale).gerados.gitignoreDaMaquina}\n*\n`;
296
+ return { caminho, criado: true, deteccao, estadoIgnorado: (0, util_1.ignorarPastaNoGit)(estado, deteccao.raiz, gitignore) };
288
297
  }
@@ -20,4 +20,8 @@ exports.TESTES_DE_INTEGRACAO_LOCAL = new Set([
20
20
  'rm038-universo-ponte.test.js',
21
21
  // RM-059 (T0.10): a conferencia pontual com o sandbox real do codex, como o mcp-verify.test.js.
22
22
  'claims-conferir-sandbox.test.js',
23
+ // Security scan (Task 13a): o scanner com o Docker real e as imagens do catalogo.
24
+ 'security-scan-integracao.test.js',
25
+ // RM-067 (F4c, D11): o grok falso confinado pelo Landlock do kernel, com o lancador em python3.
26
+ 'rm067-grok-landlock.test.js',
23
27
  ]);
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.CORRECAO_DO_INDICE = exports.USO_DO_GRAFO = exports.AMOSTRA_SCHEMA = exports.REDACAO_DOS_ANALISADORES = exports.STATUS_SCHEMA = void 0;
36
+ exports.CORRECAO_DO_INDICE = exports.TEXTOS_DO_GRAFO = exports.USO_DO_GRAFO = exports.AMOSTRA_SCHEMA = exports.REDACAO_DOS_ANALISADORES = exports.STATUS_SCHEMA = void 0;
37
37
  exports.descreverVersoes = descreverVersoes;
38
38
  exports.correcaoDosAnalisadores = correcaoDosAnalisadores;
39
39
  exports.checarAnalisadoresDoGrafo = checarAnalisadoresDoGrafo;
@@ -125,6 +125,62 @@ exports.USO_DO_GRAFO = [
125
125
  ' ork grafo amostra [--por-estrato N] | ork grafo amostra --conferir ARQ [--json]',
126
126
  ' ork grafo limpar [--tudo] [--json]',
127
127
  ].join('\n');
128
+ exports.TEXTOS_DO_GRAFO = {
129
+ uso: exports.USO_DO_GRAFO.split('\n'),
130
+ erroUso: (motivo) => `grafo.uso: ${motivo}`,
131
+ motivos: {
132
+ semSub: 'falta o subcomando', desconhecido: (sub) => `subcomando desconhecido: ${sub}`,
133
+ repetida: (nome) => `--${nome} repetida`, semValor: (nome) => `--${nome} nao leva valor`,
134
+ exigeValor: (nome) => `--${nome} exige valor`, opcao: (sub, valor) => `opcao desconhecida para ${sub}: ${valor}`,
135
+ argumentos: (sub, esperados, recebidos) => `${sub} pede ${esperados} argumento(s), veio ${recebidos}`,
136
+ inteiro: (nome) => `--${nome} precisa ser inteiro`, tipo: (tipo, lista) => `--tipo desconhecido: ${tipo} (use ${lista})`,
137
+ sentido: (valor) => `--sentido desconhecido: ${valor}`, tetoJson: '--teto-bytes exige --json', tetoMin: '--teto-bytes precisa ser ao menos 1',
138
+ amostraExclusiva: '--conferir e --por-estrato nao combinam', estratoMin: '--por-estrato precisa ser ao menos 1',
139
+ },
140
+ indexar: {
141
+ titulo: (repositorio, estado) => `indice do grafo de ${repositorio}: ${estado}`,
142
+ // O rotulo ocupa 13 colunas antes do valor, como na base: 12 do nome e um espaco.
143
+ campo: (nome, valor) => ` ${nome.padEnd(12)} ${valor}`,
144
+ campos: { revisao: 'revisao', chave: 'chave', snapshot: 'snapshot', digest: 'digest', conferencia: 'conferencia',
145
+ nos: 'nos', arestas: 'arestas', lugar: 'lugar', motivo: 'motivo', tempo: 'tempo' },
146
+ conferencia: (fontes, evidencias) => `conferirFontes verificada: ${fontes} fontes e ${evidencias} evidencias contra os bytes`,
147
+ determinismo: (ordem, digest, relatorio, unidades, igual) => ` determinismo ${ordem}: digest ${digest}, relatorio ${relatorio}, unidades ${unidades}, ${igual ? 'igual' : 'DIFERENTE'}`,
148
+ incremental: (base, igual) => ` incremental a partir do indice de ${base}: ${igual ? 'igual a completa nos quatro arquivos' : 'DIFERENTE'}`,
149
+ naoConferido: (motivo) => ` incremental nao conferido: ${motivo}`,
150
+ aprovado: 'aprovado',
151
+ semBase: 'sem base',
152
+ },
153
+ status: {
154
+ titulo: (head, arvore) => `grafo: HEAD ${head}, arvore ${arvore}`,
155
+ indice: (chave, estado) => ` indice do HEAD ${chave} ${estado}`,
156
+ ausente: '(ausente: rode ork grafo indexar)',
157
+ semAnalisadores: '(sem os analisadores nesta instalacao, nem a consulta nem o indexar rodam)',
158
+ semChave: '(sem a chave do indice: o erro esta na linha de baixo)',
159
+ analisadores: (versoes) => ` analisadores ${versoes}`,
160
+ correcao: (correcao) => ` correcao ${correcao}`,
161
+ pasta: (dir, indices, tamanho) => ` pasta ${dir} (${indices} indice(s), ${tamanho})`,
162
+ semCommit: 'sem commit', indisponivel: 'indisponivel', naoCriada: 'ainda nao criada',
163
+ sobras: (sobras) => ` sobras ${sobras}`,
164
+ },
165
+ contexto: {
166
+ titulo: (thread, revisao) => `Contexto ${thread} @ ${revisao}`,
167
+ resumo: (sementes, total, arestas, ligacoes, bytes) => ` ${sementes}/${total} sementes, ${arestas}/${ligacoes} ligacoes agregadas; ${bytes} bytes JSON`,
168
+ tamanho: (bytes) => ` tamanho dos arquivos no pacote (nao descoberta): ${bytes} bytes (revisao indexada); tokens: unavailable`,
169
+ diff: (diff) => ` diff: ${diff}`,
170
+ mudadas: (n) => ` ligacoes com fonte modificada na arvore: ${n}`,
171
+ final: (truncado, arvore) => ` truncado: ${truncado}; arvore: ${arvore}; use --json para nos e evidencias`,
172
+ },
173
+ amostra: {
174
+ titulo: (arestas, estratos, revisao) => `amostra: ${arestas} arestas em ${estratos} estratos, auditada na revisao ${revisao}`,
175
+ vereditos: (vereditos) => ` vereditos ${vereditos}`,
176
+ conferidas: (ok, total) => ` conferidas contra o indice do HEAD: ${ok} de ${total}`,
177
+ falha: (falha) => `FALHA ${falha}`,
178
+ reprovado: (n) => `reprovado: ${n} falha(s)`,
179
+ aprovado: 'aprovado',
180
+ },
181
+ limpar: (removidos, tamanho) => `grafo limpar: ${removidos} removido(s), ${tamanho}`,
182
+ consulta: intelligence_graph_query_1.TEXTOS_DA_CONSULTA,
183
+ };
128
184
  /** KG5 (D5): a correcao das recusas de indice que a proxima indexacao resolve. */
129
185
  exports.CORRECAO_DO_INDICE = 'ork grafo indexar';
130
186
  /** KG5 (D5): o estado do indice do HEAD que cada recusa declara no JSON, ao lado da correcao. */
@@ -134,6 +190,7 @@ const ESTADO_DO_INDICE = Object.freeze({
134
190
  'grafo.indice.outro-extrator': 'outro-extrator',
135
191
  'grafo.indice.corrompido': 'corrompido',
136
192
  });
193
+ const textosDe = (ctx) => ctx.textos ?? exports.TEXTOS_DO_GRAFO;
137
194
  const SUBCOMANDOS = Object.freeze({
138
195
  indexar: { posicionais: 0, bandeiras: ['verificar', 'forcar', 'json'], valores: [] },
139
196
  status: { posicionais: 0, bandeiras: ['json'], valores: [] },
@@ -145,16 +202,16 @@ const SUBCOMANDOS = Object.freeze({
145
202
  amostra: { posicionais: 0, bandeiras: ['json'], valores: ['por-estrato', 'conferir'] },
146
203
  limpar: { posicionais: 0, bandeiras: ['tudo', 'json'], valores: [] },
147
204
  });
148
- function uso(motivo) {
149
- throw new Error(`grafo.uso: ${motivo}\n${exports.USO_DO_GRAFO}`);
205
+ function uso(motivo, t) {
206
+ throw new Error(`${t.erroUso(motivo)}\n${t.uso.join('\n')}`);
150
207
  }
151
- function lerPedido(argv) {
208
+ function lerPedido(argv, t = exports.TEXTOS_DO_GRAFO) {
152
209
  const [sub, ...resto] = argv;
153
210
  if (!sub)
154
- uso('falta o subcomando');
211
+ uso(t.motivos.semSub, t);
155
212
  const esp = SUBCOMANDOS[sub];
156
213
  if (!Object.prototype.hasOwnProperty.call(SUBCOMANDOS, sub) || !esp)
157
- uso(`subcomando desconhecido: ${sub}`);
214
+ uso(t.motivos.desconhecido(sub), t);
158
215
  const posicionais = [], bandeiras = new Set(), valores = new Map();
159
216
  for (let i = 0; i < resto.length; i++) {
160
217
  const a = resto[i];
@@ -165,59 +222,59 @@ function lerPedido(argv) {
165
222
  const igual = a.indexOf('=');
166
223
  const nome = igual > 0 ? a.slice(2, igual) : a.slice(2);
167
224
  if (bandeiras.has(nome) || valores.has(nome))
168
- uso(`--${nome} repetida`);
225
+ uso(t.motivos.repetida(nome), t);
169
226
  if (esp.bandeiras.includes(nome)) {
170
227
  if (igual > 0)
171
- uso(`--${nome} nao leva valor`);
228
+ uso(t.motivos.semValor(nome), t);
172
229
  bandeiras.add(nome);
173
230
  }
174
231
  else if (esp.valores.includes(nome)) {
175
232
  const valor = igual > 0 ? a.slice(igual + 1) : resto[++i];
176
233
  if (valor === undefined || valor === '' || (igual < 0 && valor.startsWith('--')))
177
- uso(`--${nome} exige valor`);
234
+ uso(t.motivos.exigeValor(nome), t);
178
235
  valores.set(nome, valor);
179
236
  }
180
237
  else {
181
- uso(`opcao desconhecida para ${sub}: ${a}`);
238
+ uso(t.motivos.opcao(sub, a), t);
182
239
  }
183
240
  }
184
241
  if (posicionais.length !== esp.posicionais)
185
- uso(`${sub} pede ${esp.posicionais} argumento(s), veio ${posicionais.length}`);
242
+ uso(t.motivos.argumentos(sub, esp.posicionais, posicionais.length), t);
186
243
  return { sub, posicionais, bandeiras, valores };
187
244
  }
188
- function inteiro(p, nome) {
245
+ function inteiro(p, nome, t) {
189
246
  const v = p.valores.get(nome);
190
247
  if (v === undefined)
191
248
  return undefined;
192
249
  if (!/^[0-9]{1,6}$/.test(v))
193
- uso(`--${nome} precisa ser inteiro`);
250
+ uso(t.motivos.inteiro(nome), t);
194
251
  return Number(v);
195
252
  }
196
- function tipos(p) {
253
+ function tipos(p, t) {
197
254
  const v = p.valores.get('tipo');
198
255
  if (v === undefined)
199
256
  return undefined;
200
257
  const lista = v.split(',');
201
- for (const t of lista)
202
- if (!intelligence_graph_contract_1.TIPOS_DE_ARESTA.includes(t))
203
- uso(`--tipo desconhecido: ${t} (use ${intelligence_graph_contract_1.TIPOS_DE_ARESTA.join(',')})`);
258
+ for (const x of lista)
259
+ if (!intelligence_graph_contract_1.TIPOS_DE_ARESTA.includes(x))
260
+ uso(t.motivos.tipo(x, intelligence_graph_contract_1.TIPOS_DE_ARESTA.join(',')), t);
204
261
  return lista;
205
262
  }
206
- function sentido(p) {
263
+ function sentido(p, t) {
207
264
  const v = p.valores.get('sentido');
208
265
  if (v !== undefined && !['entrada', 'saida', 'ambos'].includes(v))
209
- uso(`--sentido desconhecido: ${v}`);
266
+ uso(t.motivos.sentido(v), t);
210
267
  return v;
211
268
  }
212
269
  /** KG5 (D4): o teto vale para o JSON, que e o que vai ao contexto de quem consulta. */
213
- function tetoDeBytes(p) {
214
- const teto = inteiro(p, 'teto-bytes');
270
+ function tetoDeBytes(p, t) {
271
+ const teto = inteiro(p, 'teto-bytes', t);
215
272
  if (teto === undefined)
216
273
  return undefined;
217
274
  if (!p.bandeiras.has('json'))
218
- uso('--teto-bytes exige --json');
275
+ uso(t.motivos.tetoJson, t);
219
276
  if (teto < 1)
220
- uso('--teto-bytes precisa ser ao menos 1');
277
+ uso(t.motivos.tetoMin, t);
221
278
  return teto;
222
279
  }
223
280
  const mb = (bytes) => `${(bytes / 1024 / 1024).toFixed(1)} MB`;
@@ -250,30 +307,27 @@ function indexar(ctx, p) {
250
307
  return 0;
251
308
  }
252
309
  const m = r.manifesto;
310
+ const mi = textosDe(ctx).indexar;
253
311
  const linhas = [
254
- `indice do grafo de ${m.repository_id}: ${r.estado}`,
255
- ` revisao ${m.revision}`,
256
- ` chave ${r.chave}`,
257
- ` snapshot ${m.snapshot_id}`,
258
- ` digest ${m.graph_digest}`,
259
- ` conferencia conferirFontes verificada: ${m.conferencia.fontes} fontes e ${m.conferencia.evidencias} evidencias contra os bytes`,
260
- ` nos ${contagem(m.contagens.nos)}`,
261
- ` arestas ${contagem(m.contagens.arestas)}`,
262
- ` lugar ${r.dir} (${mb(m.graph_bytes + m.report_bytes + m.units_bytes)})`,
312
+ mi.titulo(m.repository_id, r.estado), mi.campo(mi.campos.revisao, m.revision), mi.campo(mi.campos.chave, r.chave),
313
+ mi.campo(mi.campos.snapshot, m.snapshot_id), mi.campo(mi.campos.digest, m.graph_digest),
314
+ mi.campo(mi.campos.conferencia, mi.conferencia(m.conferencia.fontes, m.conferencia.evidencias)),
315
+ mi.campo(mi.campos.nos, contagem(m.contagens.nos)), mi.campo(mi.campos.arestas, contagem(m.contagens.arestas)),
316
+ mi.campo(mi.campos.lugar, `${r.dir} (${mb(m.graph_bytes + m.report_bytes + m.units_bytes)})`),
263
317
  ...linhasDaExtracao(r),
264
318
  ];
265
319
  if (r.motivo)
266
- linhas.push(` motivo ${r.motivo}`);
320
+ linhas.push(mi.campo(mi.campos.motivo, r.motivo));
267
321
  for (const d of r.determinismo ?? []) {
268
- linhas.push(` determinismo ${d.ordem}: digest ${d.digest.slice(0, 16)}, relatorio ${d.relatorio.slice(0, 16)}, unidades ${d.unidades.slice(0, 16)}, ${d.igual ? 'igual' : 'DIFERENTE'}`);
322
+ linhas.push(mi.determinismo(d.ordem, d.digest.slice(0, 16), d.relatorio.slice(0, 16), d.unidades.slice(0, 16), d.igual));
269
323
  }
270
324
  if (r.incremental)
271
- linhas.push(` incremental a partir do indice de ${r.incremental.base.slice(0, 12)}: ${r.incremental.igual ? 'igual a completa nos quatro arquivos' : 'DIFERENTE'}`);
325
+ linhas.push(mi.incremental(r.incremental.base.slice(0, 12), r.incremental.igual));
272
326
  else if (r.determinismo)
273
- linhas.push(` incremental nao conferido: ${r.motivo_completo ?? 'sem base'}`);
274
- linhas.push(` tempo ${r.ms} ms`);
327
+ linhas.push(mi.naoConferido(r.motivo_completo ?? mi.semBase));
328
+ linhas.push(mi.campo(mi.campos.tempo, `${r.ms} ms`));
275
329
  if (r.determinismo)
276
- linhas.push('aprovado');
330
+ linhas.push(mi.aprovado);
277
331
  ctx.escrever(linhas.join('\n'));
278
332
  return 0;
279
333
  }
@@ -304,21 +358,22 @@ function status(ctx, p) {
304
358
  ctx.escrever(JSON.stringify(r, null, 2));
305
359
  return 0;
306
360
  }
361
+ const ms = textosDe(ctx).status;
307
362
  const linhas = [
308
- `grafo: HEAD ${arvore.head ? arvore.head.slice(0, 12) : 'sem commit'}, arvore ${r.arvore}`,
309
- ` indice do HEAD ${chave ?? 'indisponivel'} ${r.indice_do_head === 'ausente' ? '(ausente: rode ork grafo indexar)'
363
+ ms.titulo(arvore.head ? arvore.head.slice(0, 12) : ms.semCommit, r.arvore),
364
+ ms.indice(chave ?? ms.indisponivel, r.indice_do_head === 'ausente' ? ms.ausente
310
365
  : r.indice_do_head === 'indisponivel'
311
- ? (correcao ? '(sem os analisadores nesta instalacao, nem a consulta nem o indexar rodam)' : '(sem a chave do indice: o erro esta na linha de baixo)')
312
- : `(${r.indice_do_head})`}`,
313
- ` analisadores ${erro ?? descreverVersoes(analisadores)}`,
314
- ...(correcao ? [` correcao ${correcao}`] : []),
315
- ` pasta ${estado.dir ?? 'ainda nao criada'} (${estado.indices.length} indice(s), ${mb(estado.bytes)})`,
366
+ ? (correcao ? ms.semAnalisadores : ms.semChave)
367
+ : `(${r.indice_do_head})`),
368
+ ms.analisadores(erro ?? descreverVersoes(analisadores)),
369
+ ...(correcao ? [ms.correcao(correcao)] : []),
370
+ ms.pasta(estado.dir ?? ms.naoCriada, estado.indices.length, mb(estado.bytes)),
316
371
  ];
317
372
  for (const i of estado.indices) {
318
373
  linhas.push(` ${i.chave.slice(0, 20)} ${i.revision ? i.revision.slice(0, 12) : '?'} ${i.repository_id ?? '?'} ${mb(i.bytes)} ${i.problema ?? 'ok'}`);
319
374
  }
320
375
  if (estado.sobras.length)
321
- linhas.push(` sobras ${estado.sobras.join(', ')}`);
376
+ linhas.push(ms.sobras(estado.sobras.join(', ')));
322
377
  ctx.escrever(linhas.join('\n'));
323
378
  return 0;
324
379
  }
@@ -395,7 +450,7 @@ function consultavel(ctx) {
395
450
  return { g: (0, intelligence_graph_query_1.prepararConsulta)(grafo, concessao), cabecalho, grafo, raiz: arvore.raiz, situacao };
396
451
  }
397
452
  function responder(ctx, p, r) {
398
- ctx.escrever(p.bandeiras.has('json') ? (0, intelligence_graph_query_1.jsonDaResposta)(r) : (0, intelligence_graph_query_1.textoDaResposta)(r));
453
+ ctx.escrever(p.bandeiras.has('json') ? (0, intelligence_graph_query_1.jsonDaResposta)(r) : (0, intelligence_graph_query_1.textoDaResposta)(r, textosDe(ctx).consulta));
399
454
  return 0;
400
455
  }
401
456
  /**
@@ -435,8 +490,8 @@ function respostaComTeto(perguntar, limite, teto) {
435
490
  }
436
491
  function consultar(ctx, p) {
437
492
  // As opcoes sao conferidas antes de carregar o indice: erro de uso nao custa a leitura do grafo.
438
- const [a, b] = p.posicionais;
439
- const profundidade = inteiro(p, 'profundidade'), limite = inteiro(p, 'limite'), s = sentido(p), t = tipos(p), teto = tetoDeBytes(p);
493
+ const [a, b] = p.posicionais, x = textosDe(ctx);
494
+ const profundidade = inteiro(p, 'profundidade', x), limite = inteiro(p, 'limite', x), s = sentido(p, x), t = tipos(p, x), teto = tetoDeBytes(p, x);
440
495
  const { g, cabecalho, situacao } = consultavel(ctx);
441
496
  // A busca binaria do teto pergunta de novo com outro limite; a situacao guarda o que ja leu da arvore.
442
497
  const perguntar = (lim) => {
@@ -454,7 +509,7 @@ function consultar(ctx, p) {
454
509
  return 0;
455
510
  }
456
511
  function contexto(ctx, p) {
457
- const teto = tetoDeBytes(p);
512
+ const teto = tetoDeBytes(p, textosDe(ctx));
458
513
  if (teto !== undefined && (teto < 4096 || teto > 65536))
459
514
  throw new intelligence_graph_query_1.ErroDeConsulta('grafo.contexto.teto-invalido', 'teto deve ser inteiro de 4096 a 65536 bytes');
460
515
  if (!ctx.contextoDaThread)
@@ -470,12 +525,11 @@ function contexto(ctx, p) {
470
525
  const r = JSON.parse(json);
471
526
  // KG5 fatia 5 (D9): o resumo conta as ligacoes cuja fonte mudou na arvore, como o JSON marca.
472
527
  const mudadas = r.arestas.filter((a) => a.arvore === 'modificada').length;
473
- ctx.escrever([`Contexto ${r.thread} @ ${r.indice.revision}`,
474
- ` ${r.sementes.length}/${r.total_sementes} sementes, ${r.arestas.length}/${r.total_ligacoes} ligacoes agregadas; ${r.medida.pacote_bytes} bytes JSON`,
475
- ` tamanho dos arquivos no pacote (nao descoberta): ${r.medida.leitura_crua_bytes} bytes (revisao indexada); tokens: unavailable`,
476
- ` diff: ${r.fontes.diff}`,
477
- ...(mudadas ? [` ligacoes com fonte modificada na arvore: ${mudadas}`] : []),
478
- ` truncado: ${r.truncado}; arvore: ${r.indice.arvore}; use --json para nos e evidencias`, json].join('\n'));
528
+ const mc = textosDe(ctx).contexto;
529
+ ctx.escrever([mc.titulo(r.thread, r.indice.revision),
530
+ mc.resumo(r.sementes.length, r.total_sementes, r.arestas.length, r.total_ligacoes, r.medida.pacote_bytes),
531
+ mc.tamanho(r.medida.leitura_crua_bytes), mc.diff(r.fontes.diff), ...(mudadas ? [mc.mudadas(mudadas)] : []),
532
+ mc.final(r.truncado, r.indice.arvore), json].join('\n'));
479
533
  }
480
534
  return 0;
481
535
  }
@@ -618,7 +672,7 @@ function amostrar(grafo, ler, porEstrato, digest) {
618
672
  };
619
673
  }
620
674
  /** Confere a amostra auditada contra o indice do HEAD: aresta, trecho pelo hash, veredito com nota. */
621
- function conferirAmostra(grafo, ler, arquivo) {
675
+ function conferirAmostra(grafo, ler, arquivo, ma) {
622
676
  const amostra = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
623
677
  if (amostra.schema !== exports.AMOSTRA_SCHEMA || !Array.isArray(amostra.arestas))
624
678
  return { linhas: [], falhas: [`schema da amostra: ${amostra.schema}`] };
@@ -646,32 +700,32 @@ function conferirAmostra(grafo, ler, arquivo) {
646
700
  if (!bate)
647
701
  falhas.push(`${chave}: nenhuma evidencia com o trecho auditado`);
648
702
  }
649
- const linhas = [
650
- `amostra: ${amostra.arestas.length} arestas em ${estratos.size} estratos, auditada na revisao ${amostra.revision ?? amostra.revision_unavailable_reason}`,
651
- ` vereditos ${Object.entries(vereditos).sort(([x], [y]) => (0, intelligence_graph_contract_1.compararUtf8)(x, y)).map(([k, v]) => `${k}=${v}`).join(' ')}`,
652
- ` conferidas contra o indice do HEAD: ${amostra.arestas.length - falhas.length} de ${amostra.arestas.length}`,
653
- ];
703
+ const linhas = [ma.titulo(amostra.arestas.length, estratos.size, amostra.revision ?? amostra.revision_unavailable_reason),
704
+ ma.vereditos(Object.entries(vereditos).sort(([x], [y]) => (0, intelligence_graph_contract_1.compararUtf8)(x, y)).map(([k, v]) => `${k}=${v}`).join(' ')),
705
+ ma.conferidas(amostra.arestas.length - falhas.length, amostra.arestas.length)];
654
706
  return { linhas, falhas };
655
707
  }
656
708
  function amostra(ctx, p) {
709
+ const t = textosDe(ctx);
657
710
  if (p.valores.has('conferir') && p.valores.has('por-estrato'))
658
- uso('--conferir e --por-estrato nao combinam');
711
+ uso(t.motivos.amostraExclusiva, t);
659
712
  const { grafo, raiz, cabecalho } = consultavel(ctx);
660
713
  const ler = leitorDaArvore(raiz, grafo);
661
714
  const arquivo = p.valores.get('conferir');
662
715
  if (arquivo === undefined) {
663
- const n = inteiro(p, 'por-estrato') ?? 3;
716
+ const n = inteiro(p, 'por-estrato', t) ?? 3;
664
717
  if (n < 1)
665
- uso('--por-estrato precisa ser ao menos 1');
718
+ uso(t.motivos.estratoMin, t);
666
719
  ctx.escrever(JSON.stringify(amostrar(grafo, ler, n, cabecalho.graph_digest), null, 2));
667
720
  return 0;
668
721
  }
669
- const { linhas, falhas } = conferirAmostra(grafo, ler, arquivo);
722
+ const { linhas, falhas } = conferirAmostra(grafo, ler, arquivo, t.amostra);
670
723
  if (p.bandeiras.has('json')) {
671
724
  ctx.escrever(JSON.stringify({ schema: exports.AMOSTRA_SCHEMA, conferencia: linhas, falhas, aprovado: falhas.length === 0 }, null, 2));
672
725
  }
673
726
  else {
674
- ctx.escrever([...linhas, ...falhas.map((f) => `FALHA ${f}`), falhas.length ? `reprovado: ${falhas.length} falha(s)` : 'aprovado'].join('\n'));
727
+ const ma = t.amostra;
728
+ ctx.escrever([...linhas, ...falhas.map((f) => ma.falha(f)), falhas.length ? ma.reprovado(falhas.length) : ma.aprovado].join('\n'));
675
729
  }
676
730
  return falhas.length ? 1 : 0;
677
731
  }
@@ -688,7 +742,7 @@ function limpar(ctx, p) {
688
742
  if (p.bandeiras.has('json'))
689
743
  ctx.escrever(JSON.stringify({ schema: exports.STATUS_SCHEMA, manter, manter_revisoes: manterRevisoes, ...r }, null, 2));
690
744
  else
691
- ctx.escrever([`grafo limpar: ${r.removidos.length} removido(s), ${mb(r.bytes)}`, ...r.removidos.map((x) => ` ${x.nome} ${mb(x.bytes)}`)].join('\n'));
745
+ ctx.escrever([textosDe(ctx).limpar(r.removidos.length, mb(r.bytes)), ...r.removidos.map((x) => ` ${x.nome} ${mb(x.bytes)}`)].join('\n'));
692
746
  return 0;
693
747
  }
694
748
  /** KG5 (D4, D5): com `--teto-bytes` o erro tambem sai compacto; recusa de indice traz o estado e a correcao. */
@@ -709,7 +763,7 @@ function executarGrafo(argv, ctx) {
709
763
  const compacto = argv[0] === 'contexto' || argv.some((a) => a === '--teto-bytes' || a.startsWith('--teto-bytes='));
710
764
  let p;
711
765
  try {
712
- p = lerPedido(argv);
766
+ p = lerPedido(argv, textosDe(ctx));
713
767
  }
714
768
  catch (e) {
715
769
  // Com `--json` no argv, tambem o erro de uso sai como objeto, como os demais.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.rotuloDoNo = exports.ErroDeConsulta = exports.TUDO_IGUAL = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
3
+ exports.rotuloDoNo = exports.ErroDeConsulta = exports.TUDO_IGUAL = exports.TEXTOS_DA_CONSULTA = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
4
4
  exports.filtrarGrafo = filtrarGrafo;
5
5
  exports.prepararConsulta = prepararConsulta;
6
6
  exports.resolverNo = resolverNo;
@@ -36,6 +36,22 @@ exports.LIMITE_MAXIMO = 10_000;
36
36
  /** Candidatos listados quando um nome solto e ambiguo. */
37
37
  exports.CANDIDATOS_LISTADOS = 20;
38
38
  exports.AVISO_DE_PARCIALIDADE = 'parcial: so arestas que o extrator prova; chamada por despacho de tipo, import nao resolvido e as lacunas do relatorio de extracao ficam fora';
39
+ exports.TEXTOS_DA_CONSULTA = {
40
+ titulo: (repositorio, revisao, chave, snapshot) => `grafo de ${repositorio} na revisao ${revisao}, indice ${chave}, snapshot ${snapshot}`,
41
+ arvore: 'aviso: a arvore tem mudanca rastreada; a resposta e do HEAD, nao da arvore',
42
+ fontes: (lista, resto) => `fontes que mudaram na arvore: ${lista}${resto ? ` e mais ${resto}` : ''}`,
43
+ marca: ' [fonte modificada na arvore]',
44
+ pagina: (pagina) => `pagina ${pagina}`,
45
+ extratores: (lista) => `extratores: ${lista}`,
46
+ semCaminho: (de, para, sentido, nos) => `sem caminho de ${de} para ${para} (sentido ${sentido}): ${nos} nos explorados`,
47
+ caminho: (de, para, sentido, passos) => `caminho de ${de} para ${para} (sentido ${sentido}): ${passos} passo(s)`,
48
+ contra: '(contra a aresta) ',
49
+ todos: 'todos',
50
+ resultado: (tipo, alvo, profundidade, filtro, arestas, nos) => `${tipo} de ${alvo} (profundidade ${profundidade}${filtro}): ${arestas} aresta(s), ${nos} no(s)`,
51
+ filtro: (sentido, tipos) => `, sentido ${sentido}, tipos ${tipos}`,
52
+ truncado: (devolvidas, total) => `truncado: ${devolvidas} de ${total} arestas, as mais perto do alvo; use --limite`,
53
+ parcial: exports.AVISO_DE_PARCIALIDADE,
54
+ };
39
55
  /** Sem saber da arvore, toda fonte vale `igual`: e o que a arvore limpa garante. */
40
56
  const TUDO_IGUAL = () => 'igual';
41
57
  exports.TUDO_IGUAL = TUDO_IGUAL;
@@ -339,53 +355,52 @@ function caminho(g, cabecalho, de, para, opcoes = {}, situacao = exports.TUDO_IG
339
355
  function jsonDaResposta(r) {
340
356
  return JSON.stringify(r, null, 2);
341
357
  }
342
- function linhasDaEvidencia(e) {
358
+ function linhasDaEvidencia(e, m) {
343
359
  const s = e.span;
344
360
  const onde = s.type === 'text'
345
361
  ? `${e.path}:${s.line_start ?? '?'}${s.line_end !== null && s.line_end !== s.line_start ? `-${s.line_end}` : ''}`
346
- : `${e.path} pagina ${s.page}`;
362
+ : `${e.path} ${m.pagina(s.page)}`;
347
363
  return ` ${e.extractor_id} ${e.extraction_method} ${onde} bytes ${s.byte_start}-${s.byte_end}`;
348
364
  }
349
365
  /** KG5 fatia 5 (D9): a aresta cuja fonte mudou diz isso na propria linha, como o JSON diz no campo `arvore`. */
350
- function linhasDaAresta(a, prefixo = ' ') {
351
- const marca = a.arvore === 'modificada' ? ' [fonte modificada na arvore]' : '';
352
- return [`${prefixo}${a.kind} ${a.from} -> ${a.to}${marca}`, ...a.evidencias.map(linhasDaEvidencia)];
366
+ function linhasDaAresta(a, m, prefixo = ' ') {
367
+ const marca = a.arvore === 'modificada' ? m.marca : '';
368
+ return [`${prefixo}${a.kind} ${a.from} -> ${a.to}${marca}`, ...a.evidencias.map((e) => linhasDaEvidencia(e, m))];
353
369
  }
354
370
  /** KG5 fatia 5 (D9): ate cinco fontes que nao tem na arvore os bytes do indice, com a situacao de cada uma. */
355
- function linhaDasFontesMudadas(fontes) {
371
+ function linhaDasFontesMudadas(fontes, m) {
356
372
  const mudaram = fontes.filter((f) => f.arvore !== 'igual');
357
373
  if (!mudaram.length)
358
374
  return [];
359
- const resto = mudaram.length > 5 ? ` e mais ${mudaram.length - 5}` : '';
360
- return [`fontes que mudaram na arvore: ${mudaram.slice(0, 5).map((f) => `${f.path} (${f.arvore})`).join(', ')}${resto}`];
375
+ return [m.fontes(mudaram.slice(0, 5).map((f) => `${f.path} (${f.arvore})`).join(', '), Math.max(0, mudaram.length - 5))];
361
376
  }
362
- function textoDaResposta(r) {
377
+ function textoDaResposta(r, m = exports.TEXTOS_DA_CONSULTA) {
363
378
  const c = r.consulta, i = r.indice;
364
379
  const linhas = [
365
- `grafo de ${i.repository_id} na revisao ${i.revision.slice(0, 12)}, indice ${i.chave.slice(0, 16)}, snapshot ${i.snapshot_id.slice(0, 17)}`,
380
+ m.titulo(i.repository_id, i.revision.slice(0, 12), i.chave.slice(0, 16), i.snapshot_id.slice(0, 17)),
366
381
  ];
367
382
  if (i.arvore === 'modificada')
368
- linhas.push('aviso: a arvore tem mudanca rastreada; a resposta e do HEAD, nao da arvore');
369
- linhas.push(...linhaDasFontesMudadas(r.fontes));
370
- linhas.push(`extratores: ${i.extratores.map((e) => `${e.extractor_id} ${e.extractor_version}`).join(', ')}`);
383
+ linhas.push(m.arvore);
384
+ linhas.push(...linhaDasFontesMudadas(r.fontes, m));
385
+ linhas.push(m.extratores(i.extratores.map((e) => `${e.extractor_id} ${e.extractor_version}`).join(', ')));
371
386
  if (c.tipo === 'caminho') {
372
387
  const para = r.para;
373
388
  if (!r.caminho) {
374
- linhas.push(`sem caminho de ${r.alvo.rotulo} para ${para.rotulo} (sentido ${c.sentido}): ${r.nos_explorados} nos explorados`);
389
+ linhas.push(m.semCaminho(r.alvo.rotulo, para.rotulo, c.sentido, r.nos_explorados));
375
390
  }
376
391
  else {
377
- linhas.push(`caminho de ${r.alvo.rotulo} para ${para.rotulo} (sentido ${c.sentido}): ${r.caminho.length} passo(s)`);
378
- r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, ` ${n + 1}. ${p.sentido === 'entrada' ? '(contra a aresta) ' : ''}`)));
392
+ linhas.push(m.caminho(r.alvo.rotulo, para.rotulo, c.sentido, r.caminho.length));
393
+ r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, m, ` ${n + 1}. ${p.sentido === 'entrada' ? m.contra : ''}`)));
379
394
  }
380
395
  }
381
396
  else {
382
- const filtro = c.tipo === 'vizinhos' ? `, sentido ${c.sentido}, tipos ${c.tipos.length === intelligence_graph_contract_1.TIPOS_DE_ARESTA.length ? 'todos' : c.tipos.join(',')}` : '';
383
- linhas.push(`${c.tipo} de ${r.alvo.rotulo} (profundidade ${c.profundidade}${filtro}): ${r.total_arestas} aresta(s), ${r.total_nos - 1} no(s)`);
397
+ const filtro = c.tipo === 'vizinhos' ? m.filtro(c.sentido, c.tipos.length === intelligence_graph_contract_1.TIPOS_DE_ARESTA.length ? m.todos : c.tipos.join(',')) : '';
398
+ linhas.push(m.resultado(c.tipo, r.alvo.rotulo, c.profundidade, filtro, r.total_arestas, r.total_nos - 1));
384
399
  for (const a of r.arestas)
385
- linhas.push(...linhasDaAresta(a));
400
+ linhas.push(...linhasDaAresta(a, m));
386
401
  if (r.truncado)
387
- linhas.push(`truncado: ${r.arestas.length} de ${r.total_arestas} arestas, as mais perto do alvo; use --limite`);
402
+ linhas.push(m.truncado(r.arestas.length, r.total_arestas));
388
403
  }
389
- linhas.push(r.parcial);
404
+ linhas.push(m.parcial);
390
405
  return linhas.join('\n');
391
406
  }