@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
@@ -61,6 +61,7 @@ const fs = __importStar(require("node:fs"));
61
61
  const os = __importStar(require("node:os"));
62
62
  const path = __importStar(require("node:path"));
63
63
  const redacao_url_1 = require("./redacao-url");
64
+ const locale_1 = require("./locale");
64
65
  function git(raiz, args, extra = {}) {
65
66
  const r = (0, node_child_process_1.spawnSync)('git', args, { cwd: raiz, encoding: 'utf8', input: extra.input, timeout: extra.timeoutMs ?? 60000,
66
67
  env: { ...process.env, ...extra.env } });
@@ -68,8 +69,11 @@ function git(raiz, args, extra = {}) {
68
69
  }
69
70
  function exigirGit(raiz, args, prefixo, extra = {}) {
70
71
  const r = git(raiz, args, extra);
71
- if (!r.ok)
72
- throw new Error(`${prefixo}.git: git ${args[0]} falhou: ${r.stderr.trim().split('\n').pop() ?? ''}`);
72
+ if (!r.ok) {
73
+ // RM-061 (F3b, GO-FIX 1): pelo catalogo, com o codigo `<prefixo>.git` igual; a saida do git vai como veio.
74
+ const comando = args[0], saida = r.stderr.trim().split('\n').pop() ?? '';
75
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.gitFalhou(prefixo, comando, saida));
76
+ }
73
77
  return r.stdout;
74
78
  }
75
79
  /**
@@ -104,9 +108,9 @@ function remotoRedigido(remoto) {
104
108
  function exigirRemoto(remoto, prefixo) {
105
109
  if ((0, exports.remotoValido)(remoto))
106
110
  return remoto;
107
- throw new Error(`${prefixo}.remoto-invalido: o remoto ${remotoRedigido(remoto)} não é nome de remoto do git ` +
108
- '(letras, dígitos, ".", "_", "-" e "/" entre partes, cada parte começando por letra ou dígito, sem URL); nada foi passado ao git. ' +
109
- 'Corrija fabrica.remoto no orkastery.yaml ou --remoto (padrão: origin).');
111
+ // RM-061 (F3b): a recusa nasce do catalogo; o codigo `<prefixo>.remoto-invalido` e o mesmo nas duas linguas.
112
+ const redigido = remotoRedigido(remoto);
113
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.remotoInvalido(prefixo, redigido));
110
114
  }
111
115
  /**
112
116
  * RM-047 (fronteira de confiança): nome de branch que pode ir ao git como argumento. O valor vem do
@@ -179,7 +183,7 @@ function jsonsDaPonta(raiz, ponta, dir, prefixo) {
179
183
  * Grava uma versao nova da branch em cima de `ponta`, sem tocar arvore de trabalho nem indice:
180
184
  * indice temporario, blobs, `write-tree` e `commit-tree`. Push sem forca; recusa volta `false`.
181
185
  */
182
- function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo, rede = {}) {
186
+ function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo, rede = {}, autor) {
183
187
  exigirRemoto(remoto, prefixo);
184
188
  const indice = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'ork-branch-estado-')), 'index');
185
189
  const env = { GIT_INDEX_FILE: indice };
@@ -188,17 +192,25 @@ function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo
188
192
  exigirGit(raiz, ['read-tree', ponta], prefixo, { env });
189
193
  else
190
194
  exigirGit(raiz, ['read-tree', '--empty'], prefixo, { env });
191
- for (const m of mudancas) {
195
+ for (const [i, m] of mudancas.entries()) {
192
196
  if (m.conteudo === null) {
193
197
  exigirGit(raiz, ['update-index', '--force-remove', m.caminho], prefixo, { env });
194
198
  }
195
199
  else {
196
- const blob = exigirGit(raiz, ['hash-object', '-w', '--stdin'], prefixo, { input: m.conteudo }).trim();
200
+ // `spawnSync` nem sempre fecha o pipe de entrada em runtimes hospedados, deixando o
201
+ // `hash-object --stdin` preso mesmo depois de receber todos os bytes. Um arquivo privado no
202
+ // mesmo diretorio temporario conserva o conteudo exato e torna o termino deterministico.
203
+ const conteudo = path.join(path.dirname(indice), `conteudo-${i}`);
204
+ fs.writeFileSync(conteudo, m.conteudo, { mode: 0o600 });
205
+ const blob = exigirGit(raiz, ['hash-object', '-w', conteudo], prefixo).trim();
197
206
  exigirGit(raiz, ['update-index', '--add', '--cacheinfo', `100644,${blob},${m.caminho}`], prefixo, { env });
198
207
  }
199
208
  }
200
209
  const arvore = exigirGit(raiz, ['write-tree'], prefixo, { env }).trim();
201
- const commit = exigirGit(raiz, ['commit-tree', arvore, ...(ponta ? ['-p', ponta] : []), '-m', mensagem], prefixo).trim();
210
+ // RM-058 N3 (S6 da revisão da ork-rm058n3): quem grava pode dar a identidade do commit, para a do git da pessoa não ir ao remoto.
211
+ const identidade = autor ? { env: { GIT_AUTHOR_NAME: autor.nome, GIT_AUTHOR_EMAIL: autor.email, GIT_COMMITTER_NAME: autor.nome,
212
+ GIT_COMMITTER_EMAIL: autor.email } } : {};
213
+ const commit = exigirGit(raiz, ['commit-tree', arvore, ...(ponta ? ['-p', ponta] : []), '-m', mensagem], prefixo, identidade).trim();
202
214
  // `rede`: prazo e ambiente so do que vai a rede (RM-037, achado A3: o fechamento nao espera 60 s).
203
215
  const push = git(raiz, ['push', '--quiet', '--', remoto, `${commit}:refs/heads/${branch}`], rede);
204
216
  if (push.ok) {
@@ -207,7 +219,8 @@ function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo
207
219
  }
208
220
  if (/rejected|non-fast-forward|fetch first|stale info|failed to push/i.test(push.stderr))
209
221
  return false;
210
- throw new Error(`${prefixo}.sem-remoto: o push para ${remoto} falhou: ${push.stderr.trim().split('\n').pop() ?? ''}`);
222
+ const saida = push.stderr.trim().split('\n').pop() ?? '';
223
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.pushFalhou(prefixo, remoto, saida));
211
224
  }
212
225
  finally {
213
226
  fs.rmSync(path.dirname(indice), { recursive: true, force: true });
@@ -22,6 +22,7 @@ exports.fundirRrf = fundirRrf;
22
22
  exports.buscarPorSignificado = buscarPorSignificado;
23
23
  exports.textoDaBuscaPorSignificado = textoDaBuscaPorSignificado;
24
24
  const indice_vetorial_1 = require("./indice-vetorial");
25
+ const locale_1 = require("./locale");
25
26
  exports.MODOS_DE_BUSCA = ['hibrido', 'vetor', 'fts'];
26
27
  /** D9: constante da fusao RRF. */
27
28
  exports.RRF_K = 60;
@@ -185,17 +186,18 @@ function buscarPorSignificado(o) {
185
186
  * id do FTS fora do universo e o aviso de cobertura vivem nele, e o texto os perdia na busca que deu certo.
186
187
  */
187
188
  function textoDaBuscaPorSignificado(r) {
188
- const linhas = [`Busca por significado (NAO deterministica; modo ${r.modo}, origem ${r.origem}${r.modeloUsado ? ` ${r.modeloUsado}` : ''})`];
189
+ const m = (0, locale_1.msg)().operacao.restante.memory.busca;
190
+ const linhas = [m.titulo(r.modo, r.origem, r.modeloUsado ?? '')];
189
191
  if (r.motivo)
190
- linhas.push(` motivo: ${r.motivo}${r.detalhe ? `; ${r.detalhe}` : ''}`);
192
+ linhas.push(m.motivo(r.motivo, r.detalhe));
191
193
  else if (r.detalhe)
192
- linhas.push(` detalhe: ${r.detalhe}`);
194
+ linhas.push(m.detalhe(r.detalhe));
193
195
  linhas.push('');
194
196
  r.resultados.forEach((e, i) => {
195
- const sim = e.similaridade === null ? '' : ` similaridade ${e.similaridade}`;
197
+ const sim = e.similaridade === null ? '' : m.similaridade(e.similaridade);
196
198
  linhas.push(` ${i + 1}. [${e.collection}] ${e.id} score ${e.score} ${e.fontes.join('+')}${sim}`);
197
199
  linhas.push(` ${e.resumo}`);
198
200
  });
199
- linhas.push('', ` ${r.resultados.length} resultado(s); busca por tag continua em ork memory search --tags`);
201
+ linhas.push('', m.resumo(r.resultados.length));
200
202
  return linhas.join('\n');
201
203
  }
package/dist/catalogo.js CHANGED
@@ -52,6 +52,7 @@ exports.skillsDoCatalogo = skillsDoCatalogo;
52
52
  exports.referenciasDoCatalogo = referenciasDoCatalogo;
53
53
  const fs = __importStar(require("node:fs"));
54
54
  const path = __importStar(require("node:path"));
55
+ const locale_1 = require("./locale");
55
56
  /** O que precisa existir para um diretorio ser a raiz do catalogo. */
56
57
  const MARCAS = ['skills', 'references', 'eval'];
57
58
  function ehRaizDoCatalogo(dir) {
@@ -81,7 +82,7 @@ function raizDoCatalogo(inicial) {
81
82
  function exigirCatalogo(inicial) {
82
83
  const raiz = raizDoCatalogo(inicial);
83
84
  if (!raiz) {
84
- throw new Error('catalogo do Orkastery nao encontrado (esperado um diretorio com skills/, references/ e eval/)');
85
+ throw new locale_1.ErroDoCatalogo((m) => m.adapter.catalogoNaoEncontrado);
85
86
  }
86
87
  return raiz;
87
88
  }
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * RM-063 (F7): a reconciliacao deterministica do CHANGELOG no merge da base na branch da thread.
4
+ *
5
+ * Incidente de 12 e 13/10/2026: os PRs #153 e #154 ficaram prontos e esperaram de 5 a 6 horas pelo condutor, e cada
6
+ * merge da outra maquina na `main` reabria o conflito no CHANGELOG. Duas formas do mesmo defeito:
7
+ *
8
+ * - o PR de versao troca `## Não publicado` pela secao da versao (`## [0.5.6] - ...`), e o merge da `main` na branch
9
+ * poe os itens da thread DENTRO da versao publicada, sem conflito nenhum; o `checar-changelog` do CI acusa
10
+ * `changelog.linha-ausente`;
11
+ * - duas threads acrescentam item no topo do mesmo grupo de `## Não publicado`, e o merge conflita so no CHANGELOG.
12
+ *
13
+ * O condutor resolvia a mao, com um script. Aqui a mesma regra, num lugar so e sem adivinhar: os itens que a thread
14
+ * acrescentou a `## Não publicado` (os que nem a base comum nem a `main` tem) voltam para la, no mesmo grupo
15
+ * (`### Adicionado`, `### Corrigido`...), no fim dele e na ordem da thread. O resto do arquivo e o da `main` (no conflito)
16
+ * ou o do merge (sem conflito): as secoes publicadas nunca recebem nem perdem item da thread por esta funcao. Item que a
17
+ * thread tirou de `## Não publicado` (a linha reescrita, por exemplo) sai tambem de la, e so de la.
18
+ *
19
+ * Funcao pura: recebe os tres textos (base comum, o da thread e o da `main`) e, quando houve, o resultado do merge sem
20
+ * conflito. Quem roda o git e decide se o conflito e so no CHANGELOG e `conducao-batida.ts`.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.SECAO_NAO_PUBLICADA = exports.ARQUIVO_DO_CHANGELOG = void 0;
24
+ exports.temMarcadorDeConflito = temMarcadorDeConflito;
25
+ exports.reconciliarChangelog = reconciliarChangelog;
26
+ exports.ARQUIVO_DO_CHANGELOG = 'CHANGELOG.md';
27
+ exports.SECAO_NAO_PUBLICADA = '## Não publicado';
28
+ /** A ordem dos grupos que o CHANGELOG ja usa; grupo fora dela vai para o fim da secao. */
29
+ const ORDEM_DOS_GRUPOS = ['Adicionado', 'Alterado', 'Mudado', 'Corrigido', 'Removido', 'Segurança'];
30
+ /** As pontas do conflito do git; o `=======` sozinho tambem e o sublinhado de um titulo setext, e nao conta. */
31
+ const INICIO_DO_CONFLITO = /^<{7}( |$)/m;
32
+ const FIM_DO_CONFLITO = /^>{7}( |$)/m;
33
+ const ehTitulo = (l) => /^#{1,6} /.test(l);
34
+ const ehSecao = (l) => /^## /.test(l);
35
+ const ehGrupo = (l) => /^### /.test(l);
36
+ const ehItem = (l) => /^[-*] /.test(l);
37
+ const emBranco = (l) => l.trim() === '';
38
+ const recuada = (l) => /^\s+\S/.test(l);
39
+ const chaveDe = (linhas) => linhas.map((l) => l.trimEnd()).join('\n');
40
+ /** As linhas do texto, sem o `\r` do Windows. */
41
+ function linhasDe(texto) {
42
+ return texto.replace(/\r\n/g, '\n').split('\n');
43
+ }
44
+ /**
45
+ * Os itens de lista de primeiro nivel do CHANGELOG, com a secao e o grupo de cada um. O item vai da linha `- ` ate a
46
+ * proxima linha que nao e continuacao dele: continuacao e a linha recuada, e a linha em branco so continua o item
47
+ * quando a seguinte nao vazia e recuada.
48
+ */
49
+ function itensDe(linhas) {
50
+ const itens = [];
51
+ let secao = null, grupo = null;
52
+ for (let i = 0; i < linhas.length; i++) {
53
+ const l = linhas[i];
54
+ if (ehSecao(l)) {
55
+ secao = l.trim();
56
+ grupo = null;
57
+ continue;
58
+ }
59
+ if (ehGrupo(l)) {
60
+ grupo = l.replace(/^###\s+/, '').trim();
61
+ continue;
62
+ }
63
+ if (ehTitulo(l) || !ehItem(l))
64
+ continue;
65
+ let fim = i + 1;
66
+ while (fim < linhas.length) {
67
+ const c = linhas[fim];
68
+ if (recuada(c)) {
69
+ fim++;
70
+ continue;
71
+ }
72
+ if (emBranco(c)) {
73
+ let k = fim;
74
+ while (k < linhas.length && emBranco(linhas[k]))
75
+ k++;
76
+ if (k < linhas.length && recuada(linhas[k])) {
77
+ fim = k;
78
+ continue;
79
+ }
80
+ }
81
+ break;
82
+ }
83
+ itens.push({ secao, grupo, inicio: i, fim, chave: chaveDe(linhas.slice(i, fim)) });
84
+ i = fim - 1;
85
+ }
86
+ return itens;
87
+ }
88
+ /** As linhas [inicio, fim) da secao `## Não publicado`, sem o titulo; `null` sem ela. */
89
+ function faixaDaSecao(linhas) {
90
+ const titulo = linhas.findIndex((l) => l.trim() === exports.SECAO_NAO_PUBLICADA);
91
+ if (titulo < 0)
92
+ return null;
93
+ let fim = titulo + 1;
94
+ while (fim < linhas.length && !ehSecao(linhas[fim]))
95
+ fim++;
96
+ return { titulo, inicio: titulo + 1, fim };
97
+ }
98
+ /** Junta as linhas em branco seguidas numa so (MD012), fora dos blocos de codigo cercados, que ficam como estao. */
99
+ function semBrancosRepetidos(linhas) {
100
+ const saida = [];
101
+ let cerca = null;
102
+ for (const l of linhas) {
103
+ const marca = /^\s*(`{3,}|~{3,})/.exec(l)?.[1] ?? null;
104
+ if (marca && (cerca === null || marca[0] === cerca[0]))
105
+ cerca = cerca === null ? marca : null;
106
+ if (cerca === null && !marca && emBranco(l) && saida.length > 0 && emBranco(saida[saida.length - 1]))
107
+ continue;
108
+ saida.push(cerca === null && emBranco(l) ? '' : l);
109
+ }
110
+ return saida;
111
+ }
112
+ /** Quantas vezes cada linha nao vazia aparece (sem o espaco do fim). */
113
+ function contagem(linhas) {
114
+ const m = new Map();
115
+ for (const l of linhas) {
116
+ const k = l.trimEnd();
117
+ if (k.trim())
118
+ m.set(k, (m.get(k) ?? 0) + 1);
119
+ }
120
+ return m;
121
+ }
122
+ /** As linhas que a thread acrescentou (do lado dela, alem das da base) e que o resultado nao tem tantas vezes. */
123
+ function linhasPerdidas(base, nosso, resultado) {
124
+ const daBase = contagem(base), doResultado = contagem(resultado);
125
+ const perdidas = [];
126
+ for (const [linha, vezes] of contagem(nosso)) {
127
+ const acrescentadas = vezes - (daBase.get(linha) ?? 0);
128
+ if (acrescentadas > 0 && (doResultado.get(linha) ?? 0) < acrescentadas)
129
+ perdidas.push(linha);
130
+ }
131
+ return perdidas;
132
+ }
133
+ /** Tira os grupos `### ...` que ficaram sem item nenhum por causa da remocao (os que ja eram vazios ficam). */
134
+ function semGruposEsvaziados(linhas, esvaziados) {
135
+ const tirar = new Set();
136
+ for (const g of esvaziados) {
137
+ let k = g + 1;
138
+ while (k < linhas.length && emBranco(linhas[k]))
139
+ k++;
140
+ if (k >= linhas.length || ehTitulo(linhas[k]))
141
+ tirar.add(g);
142
+ }
143
+ return linhas.filter((_, i) => !tirar.has(i));
144
+ }
145
+ /** O indice do titulo do grupo dentro da faixa, ou -1. */
146
+ function grupoNaFaixa(linhas, faixa, grupo) {
147
+ for (let i = faixa.inicio; i < faixa.fim; i++) {
148
+ if (ehGrupo(linhas[i]) && linhas[i].replace(/^###\s+/, '').trim() === grupo)
149
+ return i;
150
+ }
151
+ return -1;
152
+ }
153
+ /** Onde o item entra no grupo: depois da ultima linha nao vazia antes do proximo titulo. */
154
+ function fimDoGrupo(linhas, titulo, limite) {
155
+ let fim = titulo + 1;
156
+ while (fim < limite && !ehTitulo(linhas[fim]))
157
+ fim++;
158
+ while (fim > titulo + 1 && emBranco(linhas[fim - 1]))
159
+ fim--;
160
+ return fim;
161
+ }
162
+ /** Garante a secao `## Não publicado` antes da primeira versao e devolve as linhas com ela. */
163
+ function comSecao(linhas) {
164
+ if (faixaDaSecao(linhas))
165
+ return linhas;
166
+ const primeira = linhas.findIndex((l) => ehSecao(l));
167
+ const em = primeira < 0 ? linhas.length : primeira;
168
+ return [...linhas.slice(0, em), exports.SECAO_NAO_PUBLICADA, '', ...linhas.slice(em)];
169
+ }
170
+ /** Insere o item no grupo dele em `## Não publicado`, criando o grupo na ordem do CHANGELOG quando falta. */
171
+ function inserirNoGrupo(linhas, grupo, item) {
172
+ const faixa = faixaDaSecao(linhas);
173
+ if (grupo === null) {
174
+ // Item solto na secao (sem `###`): entra antes do primeiro grupo, depois dos soltos que ja estao la.
175
+ let em = faixa.inicio;
176
+ while (em < faixa.fim && !ehGrupo(linhas[em]))
177
+ em++;
178
+ while (em > faixa.inicio && emBranco(linhas[em - 1]))
179
+ em--;
180
+ return [...linhas.slice(0, em), ...(em === faixa.inicio ? [''] : []), ...item, '', ...linhas.slice(em)];
181
+ }
182
+ const titulo = grupoNaFaixa(linhas, faixa, grupo);
183
+ if (titulo >= 0) {
184
+ const em = fimDoGrupo(linhas, titulo, faixa.fim);
185
+ const vazio = em === titulo + 1;
186
+ return [...linhas.slice(0, em), ...(vazio ? [''] : []), ...item, ...linhas.slice(em)];
187
+ }
188
+ // O grupo ainda nao existe na secao: entra antes do primeiro grupo que vem depois dele na ordem conhecida.
189
+ const ordem = (g) => { const i = ORDEM_DOS_GRUPOS.indexOf(g); return i < 0 ? ORDEM_DOS_GRUPOS.length : i; };
190
+ let em = faixa.fim;
191
+ for (let i = faixa.inicio; i < faixa.fim; i++) {
192
+ if (ehGrupo(linhas[i]) && ordem(linhas[i].replace(/^###\s+/, '').trim()) > ordem(grupo)) {
193
+ em = i;
194
+ break;
195
+ }
196
+ }
197
+ return [...linhas.slice(0, em), '', `### ${grupo}`, '', ...item, '', ...linhas.slice(em)];
198
+ }
199
+ /** O texto tem as duas pontas de um conflito do git? */
200
+ function temMarcadorDeConflito(texto) {
201
+ return INICIO_DO_CONFLITO.test(texto) && FIM_DO_CONFLITO.test(texto);
202
+ }
203
+ /**
204
+ * Reconcilia o CHANGELOG depois do merge da base na branch da thread. Os itens da thread em `## Não publicado`
205
+ * voltam para la, no mesmo grupo; o que a thread tirou de la sai de la; o resto e o da `main` ou o do merge.
206
+ */
207
+ function reconciliarChangelog(e) {
208
+ const base = linhasDe(e.base), nosso = linhasDe(e.nosso), deles = linhasDe(e.deles);
209
+ const daBase = itensDe(base), dosNossos = itensDe(nosso), dosDeles = itensDe(deles);
210
+ const chavesDaBase = new Set(daBase.map((i) => i.chave));
211
+ const chavesDosDeles = new Set(dosDeles.map((i) => i.chave));
212
+ // Os itens da thread: em `## Não publicado` do lado dela, e em nenhum lugar da base comum nem da `main`.
213
+ const vistos = new Set();
214
+ const daThread = dosNossos.filter((i) => i.secao === exports.SECAO_NAO_PUBLICADA && !chavesDaBase.has(i.chave) &&
215
+ !chavesDosDeles.has(i.chave) && !vistos.has(i.chave) && (vistos.add(i.chave), true));
216
+ // O que a thread tirou de `## Não publicado`: estava la na base comum e nao esta mais em lugar nenhum do lado dela.
217
+ const chavesDosNossos = new Set(dosNossos.map((i) => i.chave));
218
+ const tiradas = new Set(daBase.filter((i) => i.secao === exports.SECAO_NAO_PUBLICADA && !chavesDosNossos.has(i.chave)).map((i) => i.chave));
219
+ const textoInicial = e.mesclado && !temMarcadorDeConflito(e.mesclado) ? e.mesclado : e.deles;
220
+ const crlf = textoInicial.includes('\r\n');
221
+ const fimDeLinha = textoInicial.endsWith('\n');
222
+ let linhas = linhasDe(textoInicial);
223
+ if (fimDeLinha)
224
+ linhas.pop();
225
+ const original = chaveDe(linhas);
226
+ // A thread que nao acrescentou nem tirou item de "Não publicado" nao muda nada: o arquivo fica como o merge (ou a main)
227
+ // o deixou, sem normalizar o que nao e dela.
228
+ if (!daThread.length && !tiradas.size) {
229
+ return { texto: textoInicial, perdidas: linhasPerdidas(base, nosso, linhas), itens: [], devolvidos: 0, mudou: false };
230
+ }
231
+ // 1. Tira os itens da thread de onde o merge os pos, e os tirados pela thread de `## Não publicado`. O item da thread
232
+ // que o merge deixou em `## Não publicado`, no grupo dele, fica onde esta (a primeira vez); as outras copias saem.
233
+ const grupoDaThread = new Map(daThread.map((i) => [i.chave, i.grupo]));
234
+ const noLugar = new Set();
235
+ const remover = itensDe(linhas).filter((i) => {
236
+ if (i.secao === exports.SECAO_NAO_PUBLICADA && tiradas.has(i.chave))
237
+ return true;
238
+ if (!grupoDaThread.has(i.chave))
239
+ return false;
240
+ if (i.secao === exports.SECAO_NAO_PUBLICADA && i.grupo === grupoDaThread.get(i.chave) && !noLugar.has(i.chave)) {
241
+ noLugar.add(i.chave);
242
+ return false;
243
+ }
244
+ return true;
245
+ });
246
+ const gruposTocados = new Set();
247
+ for (const i of remover) {
248
+ for (let g = i.inicio - 1; g >= 0; g--) {
249
+ if (ehGrupo(linhas[g])) {
250
+ gruposTocados.add(g);
251
+ break;
252
+ }
253
+ if (ehSecao(linhas[g]))
254
+ break;
255
+ }
256
+ }
257
+ const linhasRemovidas = new Set();
258
+ for (const i of remover)
259
+ for (let k = i.inicio; k < i.fim; k++)
260
+ linhasRemovidas.add(k);
261
+ // Os titulos de grupo que ficaram vazios saem, com o indice ajustado pela remocao.
262
+ const novoIndice = new Map();
263
+ let n = 0;
264
+ const filtradas = [];
265
+ for (let k = 0; k < linhas.length; k++) {
266
+ if (linhasRemovidas.has(k))
267
+ continue;
268
+ novoIndice.set(k, n++);
269
+ filtradas.push(linhas[k]);
270
+ }
271
+ linhas = semGruposEsvaziados(filtradas, new Set([...gruposTocados].map((g) => novoIndice.get(g)).filter((g) => g !== undefined)));
272
+ // 2. Os itens da thread que nao ficaram no lugar entram em `## Não publicado`, no grupo de cada um, na ordem da thread.
273
+ const aDevolver = daThread.filter((i) => !noLugar.has(i.chave));
274
+ if (aDevolver.length)
275
+ linhas = comSecao(linhas);
276
+ for (const i of aDevolver)
277
+ linhas = inserirNoGrupo(linhas, i.grupo, nosso.slice(i.inicio, i.fim).map((l) => l.trimEnd()));
278
+ linhas = semBrancosRepetidos(linhas);
279
+ while (linhas.length && emBranco(linhas[linhas.length - 1]))
280
+ linhas.pop();
281
+ const quebra = crlf ? '\r\n' : '\n';
282
+ const texto = linhas.join(quebra) + (fimDeLinha ? quebra : '');
283
+ return {
284
+ texto,
285
+ perdidas: linhasPerdidas(base, nosso, linhas),
286
+ itens: daThread.map((i) => ({ grupo: i.grupo, titulo: nosso[i.inicio].trim().slice(0, 200) })),
287
+ devolvidos: aDevolver.length,
288
+ mudou: chaveDe(linhas) !== original,
289
+ };
290
+ }