@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
@@ -0,0 +1,539 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.USO_DO_NOCTUM = void 0;
37
+ exports.avisosDaProposta = avisosDaProposta;
38
+ exports.conduzirPeloCli = conduzirPeloCli;
39
+ exports.comandoNoctum = comandoNoctum;
40
+ /**
41
+ * RM-058, fatia N6 (D1, D12 e D13 da ork-rm058n6): o comando `ork noctum`, a porta do CLI para o arco.
42
+ *
43
+ * ork noctum propor --arquivo <envelope.json> [--json] o pedido de abertura vira proposta e pergunta ao dono; nada é autorizado
44
+ * ork noctum maquina [--json] a entrada desta máquina em `maquinas` do envelope `v3`: o nome, a
45
+ * chave pública e a impressão (RM-058, bloco B, D5)
46
+ * ork noctum revogar <arco> [--json] a pergunta de revogação ao dono (RM-057); nada é revogado
47
+ * ork noctum responder <arco> --resposta-stdin ... o envelope assinado do gateway (autorizar ou revogar)
48
+ * ork noctum terminal --hook-stdin o ingresso do terminal, que o hook UserPromptSubmit chama (RM-057);
49
+ * desligado (D22): só devolve o aviso de por onde responder
50
+ * ork noctum status [<arco>] [--json] o retrato do arco, com as lacunas; sem arco, a lista
51
+ * ork noctum tique <arco> [--json] fechamento, passo e relatório: o que o cron do dono chama
52
+ * ork noctum relatorio <arco> [--json] [--reenviar C] o relatório no terminal, ou o reenvio que o dono pede
53
+ * ork noctum conduzir <arco> [--json] o condutor do arco (RM-058, integração, D9): o cron do piloto o
54
+ * relança, e a trava do kernel prova o vivo
55
+ * ork noctum aceite <arco> [--json] [--injecoes A] o aceite do piloto (D12): as medidas M1 a M10, os critérios e o
56
+ * [--limiares A] [--publicar A] veredito, o arquivo completo no estado e o publicável
57
+ *
58
+ * Nenhum subcomando autoriza pelo terminal: o dono autoriza por ingresso autenticado (o gateway assinado, que chega
59
+ * aqui pelo `responder`, ou o diálogo nativo do host pelo MCP). Recusa tipada sai na saída de erro, com código 2.
60
+ */
61
+ const fs = __importStar(require("node:fs"));
62
+ const node_crypto_1 = require("node:crypto");
63
+ const fila_pesada_1 = require("./fila-pesada");
64
+ const hitl_gates_1 = require("./hitl-gates");
65
+ const hitl_public_receipt_1 = require("./hitl-public-receipt");
66
+ const impedimento_1 = require("./impedimento");
67
+ const noctum_aceite_1 = require("./noctum-aceite");
68
+ const horario_1 = require("./horario");
69
+ const manifest_1 = require("./manifest");
70
+ const noctum_arco_1 = require("./noctum-arco");
71
+ const noctum_pergunta_1 = require("./noctum-pergunta");
72
+ const noctum_pergunta_canal_1 = require("./noctum-pergunta-canal");
73
+ const pulse_resposta_1 = require("./pulse-resposta");
74
+ const noctum_envelope_1 = require("./noctum-envelope");
75
+ const noctum_modo_1 = require("./noctum-modo");
76
+ const noctum_relatorio_1 = require("./noctum-relatorio");
77
+ const noctum_registro_1 = require("./noctum-registro");
78
+ const noctum_supervisao_1 = require("./noctum-supervisao");
79
+ const noctum_transporte_1 = require("./noctum-transporte");
80
+ const noctum_vigia_1 = require("./noctum-vigia");
81
+ const maquina_1 = require("./maquina");
82
+ const runtime_profiles_1 = require("./runtime-profiles");
83
+ const noctum_terminal_1 = require("./noctum-terminal");
84
+ const transporte_do_canal_1 = require("./transporte-do-canal");
85
+ exports.USO_DO_NOCTUM = 'uso: ork noctum propor --arquivo <envelope.json> | maquina [--json] | revogar <arco> [--json] | ' +
86
+ 'responder <arco> --resposta-stdin ' +
87
+ '--origem O --canal C --por P --mensagem M [--conta X] | terminal --hook-stdin | status [<arco>] [--json] | tique <arco> [--json] | ' +
88
+ 'relatorio <arco> [--json] [--reenviar <canal>] | conduzir <arco> [--json] | aceite <arco> [--json] [--injecoes <arquivo>] ' +
89
+ '[--limiares <arquivo>] [--outra-maquina <arquivo>[,<arquivo>]] [--publicar <arquivo>]';
90
+ /** A linha da entrega da pergunta ao canal do dono, sem caminho de máquina. */
91
+ function linhaDaEntrega(e) {
92
+ if (e.entregue)
93
+ return `A pergunta também saiu no canal do dono, como a pergunta ${e.numero} (${e.detalhe}).`;
94
+ if (e.jaServida)
95
+ return `A pergunta já tinha saído no canal do dono como a pergunta ${e.numero}.`;
96
+ return `A pergunta não saiu no canal do dono: ${e.detalhe}.`;
97
+ }
98
+ /** RM-057 (resposta curta): a entrada do hook `UserPromptSubmit` tem teto, como o envelope do ingresso. */
99
+ const TETO_DA_ENTRADA_DO_HOOK = 64 * 1024;
100
+ /** A entrada do hook pela entrada padrão, ou `null` quando ela passa do teto ou não é JSON. */
101
+ function lerEntradaDoHookStdin() {
102
+ const partes = [];
103
+ let total = 0;
104
+ for (;;) {
105
+ const buf = Buffer.alloc(4096), n = fs.readSync(0, buf, 0, buf.length, null);
106
+ if (!n)
107
+ break;
108
+ total += n;
109
+ if (total > TETO_DA_ENTRADA_DO_HOOK)
110
+ return null;
111
+ partes.push(buf.subarray(0, n));
112
+ }
113
+ try {
114
+ return JSON.parse(Buffer.concat(partes).toString('utf8'));
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ }
120
+ /** O pedido de abertura cabe numa leitura do dono: o envelope inteiro tem teto, como o pedido de cada trabalho. */
121
+ const TETO_DO_ARQUIVO_DO_ENVELOPE = 64 * 1024;
122
+ const texto = (v) => typeof v === 'string' ? v : undefined;
123
+ /**
124
+ * RM-058, bloco B (D22): no `v3`, esta máquina só entra no arco se está em `maquinas` com o nome e a chave desta raiz,
125
+ * a mesma conferência do `euNaVersaoVigente`. O aviso só antecipa a recusa: a proposta segue.
126
+ */
127
+ function avisosDaMaquina(maquinas, eu) {
128
+ const listada = maquinas.find(m => m.nome === eu.nome);
129
+ const correcao = 'rode ork noctum maquina --json nesta máquina e ponha a saída em maquinas do envelope';
130
+ if (!listada) {
131
+ return [{ motivo: 'noctum.proposta.maquina-ausente', correcao,
132
+ detalhe: `esta máquina (${eu.nome}) não está em maquinas do envelope v3: fica fora do arco, sem ordem, despacho nem entrega` }];
133
+ }
134
+ if (listada.chave === eu.chave)
135
+ return [];
136
+ return [{ motivo: 'noctum.proposta.maquina-outra-chave', correcao,
137
+ detalhe: `o envelope dá à máquina ${eu.nome} a chave de impressão ${(0, noctum_envelope_1.impressaoDaChave)(listada.chave)}, e a desta raiz é ` +
138
+ `${(0, noctum_envelope_1.impressaoDaChave)(eu.chave)}: a máquina fica fora do arco` }];
139
+ }
140
+ /**
141
+ * Pré-voo informativo da proposta: antecipa as causas que fariam o arco esperar, mas não autoriza nem bloqueia nada.
142
+ * As dependências opcionais deixam os testes usar perfis, trust e a identidade da máquina simulados sem ler contas reais.
143
+ */
144
+ function avisosDaProposta(carregado, conteudo, opcoes = {}) {
145
+ if (!(0, noctum_envelope_1.envelopeComTrabalhos)(conteudo))
146
+ return [];
147
+ const avisos = (0, noctum_envelope_1.envelopeMultimaquina)(conteudo)
148
+ ? avisosDaMaquina(conteudo.maquinas, (opcoes.identidade ?? (() => (0, noctum_transporte_1.identidadeDaMaquina)(carregado.raiz)))()) : [];
149
+ let store = null;
150
+ try {
151
+ store = opcoes.store ?? (0, runtime_profiles_1.lerPerfisComContas)(carregado.raiz);
152
+ }
153
+ catch {
154
+ avisos.push({ motivo: 'noctum.proposta.contas-sem-leitura', detalhe: 'as contas do envelope não puderam ser conferidas',
155
+ correcao: 'rode ork accounts check e proponha de novo depois de corrigir a leitura' });
156
+ }
157
+ const confiar = opcoes.confianca ?? ((raiz, p) => (0, impedimento_1.impedimentoResolvido)('runtime.workspace-untrusted', { cwd: raiz, runtime: p.runtime, configDir: (0, runtime_profiles_1.diretorioDoPerfil)(p) }));
158
+ if (store) {
159
+ for (const { conta } of conteudo.capacidade.porConta) {
160
+ const p = store.perfis.find(x => x.id === conta);
161
+ if (!p || p.estado === 'sem-auth') {
162
+ avisos.push({ motivo: 'noctum.proposta.conta-sem-login',
163
+ detalhe: `a conta ${conta} do envelope está sem login de assinatura conferido`,
164
+ correcao: `refaça o login da conta ${conta} pelo próprio CLI e rode ork accounts check ${conta}` });
165
+ }
166
+ if (p?.runtime === 'claude-bg' && confiar(carregado.raiz, p) !== true) {
167
+ avisos.push({ motivo: 'noctum.proposta.workspace-untrusted',
168
+ detalhe: `a conta ${conta} não tem o trust da pasta do projeto aceito no runtime; o despacho cairia em runtime.workspace-untrusted`,
169
+ correcao: `abra o runtime da conta ${conta} na pasta do projeto e aceite a confiança` });
170
+ }
171
+ }
172
+ }
173
+ if (conteudo.capacidade.maquina - conteudo.capacidade.revisao === 1) {
174
+ avisos.push({ motivo: 'noctum.proposta.vaga-de-execucao-unica',
175
+ detalhe: `a capacidade da máquina (${conteudo.capacidade.maquina}) menos a revisão (${conteudo.capacidade.revisao}) deixa uma vaga de execução`,
176
+ correcao: 'confirme que uma única sessão de execução por vez é suficiente ou emende a capacidade' });
177
+ }
178
+ const hostLocal = () => {
179
+ try {
180
+ const lido = JSON.parse(fs.readFileSync((0, transporte_do_canal_1.caminhoDoPulseHost)(carregado.raiz), 'utf8'));
181
+ if (!(0, transporte_do_canal_1.transporteValido)(lido))
182
+ return null;
183
+ const host = (0, transporte_do_canal_1.hostDoTransporte)(lido);
184
+ return transporte_do_canal_1.HOSTS_DO_CANAL.includes(host) ? host : null;
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ };
190
+ const host = opcoes.hostDoDono === undefined ? hostLocal() : opcoes.hostDoDono;
191
+ if (host && !(0, hitl_public_receipt_1.canVerifyPublicReceipt)(host, false, opcoes.env ?? process.env)) {
192
+ avisos.push({ motivo: 'noctum.proposta.sem-verificador-do-canal',
193
+ detalhe: `este processo não consegue reconferir a prova do dono recebida pelo ${host}`,
194
+ correcao: 'o cron do condutor e do tique precisa de ORK_RECEIPT_VERIFIERS com o verificador público gerado por publicHitlVerifiers; ' +
195
+ 'a chave de ingresso nunca deve ir ao ambiente dos agentes' });
196
+ }
197
+ return avisos;
198
+ }
199
+ const TERMINAIS = ['expirado', 'revogado', 'encerrado'];
200
+ /**
201
+ * O que o `ork noctum conduzir` roda: confere o arco antes da trava (o arco terminal, ou parado pela supervisão, sai 0 sem
202
+ * tomar a trava nem gravar geração) e então conduz pelo `conduzirArco`, com as dependências reais. Os testes passam as
203
+ * simuladas (o `dormir`, o `relogio`, o `maxPassos` e as do passo); o comando de terminal não tem opção de teste.
204
+ */
205
+ function conduzirPeloCli(carregado, arco, opcoes = {}) {
206
+ const { raiz } = carregado;
207
+ if (!(0, fila_pesada_1.kernelDisponivel)())
208
+ return { acao: 'sem-kernel', detalhe: 'o condutor exige /usr/bin/flock', codigo: 2 };
209
+ const estado = (0, noctum_arco_1.lerArco)(raiz, arco);
210
+ if (!estado)
211
+ return { acao: 'sem-arco', detalhe: `o arco ${arco} não tem proposta`, codigo: 2 };
212
+ if (!estado.autorizadoPor) {
213
+ return { acao: 'nunca-autorizado', motivo: 'noctum.modo.sem-envelope', detalhe: `o arco ${arco} nunca foi autorizado pelo dono: o #Noctum não vale`,
214
+ codigo: 2 };
215
+ }
216
+ if (TERMINAIS.includes(estado.situacao)) {
217
+ return { acao: 'terminal', situacao: estado.situacao, detalhe: `o arco ${arco} está ${estado.situacao}: não há o que conduzir`, codigo: 0 };
218
+ }
219
+ let parada;
220
+ try {
221
+ parada = (0, noctum_supervisao_1.lerSupervisao)(raiz, arco).parada;
222
+ }
223
+ catch (e) {
224
+ if (e instanceof noctum_supervisao_1.RecusaDaSupervisao)
225
+ return { acao: 'supervisao-ilegivel', motivo: e.motivo, detalhe: e.message, codigo: 2 };
226
+ throw e;
227
+ }
228
+ if (parada)
229
+ return { acao: 'parado', motivo: parada.motivo, detalhe: `a supervisão parou o arco ${arco}: ${parada.detalhe}`, codigo: 0 };
230
+ const r = (0, noctum_vigia_1.conduzirArco)(carregado, arco, opcoes);
231
+ const codigo = r.acao === 'outro-condutor' ? 3 : r.acao === 'saiu' ? (r.ultimo?.acao === 'geracao-vencida' ? 4 : 0) : 2;
232
+ return { ...r, codigo };
233
+ }
234
+ /** A linha do condutor no terminal: o desfecho, com o motivo. */
235
+ function textoDoCondutor(arco, r) {
236
+ if (r.acao !== 'saiu')
237
+ return `Condutor do arco ${arco}: ${r.acao}${'motivo' in r ? ` (${r.motivo})` : ''}: ${r.detalhe}`;
238
+ const u = r.ultimo;
239
+ const ultimo = !u ? 'nenhum passo' : `${u.acao}${'motivo' in u && u.motivo ? ` (${u.motivo})` : ''}${'detalhe' in u && u.detalhe ? `: ${u.detalhe}` : ''}`;
240
+ return `Condutor do arco ${arco}: saiu na geração ${r.geracao}, depois de ${r.passos} passo(s); o último: ${ultimo}`;
241
+ }
242
+ /** O aceite no terminal: o veredito, as marcas de simulação, as medidas, os critérios e onde ficou o arquivo completo. */
243
+ function textoDoAceite(r, gravado) {
244
+ const valor = (v, unidade) => v === null ? 'lacuna' : `${v} ${unidade}`;
245
+ return [`Aceite do piloto do arco ${r.arco}: ${r.veredito} (sha256 ${gravado.sha256.slice(0, 12)})`,
246
+ ...(r.simulacao.simulado ? ['Simulado, nunca vale como piloto:', ...r.simulacao.marcas.map(x => ` • ${x}`)] : []),
247
+ 'Medidas:', ...r.medidas.map(x => ` ${x.id} ${x.nome}: ${valor(x.valor, x.unidade)}${x.lacunas.length ? ` (lacunas: ${x.lacunas.join('; ')})` : ''}`),
248
+ 'Critérios:', ...r.criterios.map(c => ` ${c.id} [${c.veredito}] ${c.texto}` +
249
+ `${c.limiar ? ` (limiar ${Object.entries(c.limiar).map(([k, v]) => `${k}=${v}`).join(', ')}, ${c.origemDoLimiar})` : ''}: ${c.detalhe}`),
250
+ `Arquivo completo: ${gravado.arquivo}`].join('\n');
251
+ }
252
+ function recusado(e) {
253
+ // A recusa da supervisão (o log adulterado ou ocupado no meio do laço do condutor) também é recusa: sai 2, como o contrato diz.
254
+ if (e instanceof noctum_envelope_1.RecusaDoArco || e instanceof noctum_registro_1.RecusaDoRegistro || e instanceof noctum_aceite_1.RecusaDoAceite || e instanceof noctum_supervisao_1.RecusaDaSupervisao) {
255
+ console.error(e.message);
256
+ return 2;
257
+ }
258
+ throw e;
259
+ }
260
+ function comandoNoctum(args) {
261
+ const sub = args.posicionais[1];
262
+ const json = args.opcoes.json === true;
263
+ try {
264
+ if (sub === 'propor') {
265
+ const arquivo = texto(args.opcoes.arquivo);
266
+ if (!arquivo || args.posicionais.length !== 2) {
267
+ console.error(exports.USO_DO_NOCTUM);
268
+ return 2;
269
+ }
270
+ let st;
271
+ try {
272
+ st = fs.statSync(arquivo);
273
+ }
274
+ catch {
275
+ console.error(`noctum.envelope.invalido: o pedido de abertura ${arquivo} não se lê`);
276
+ return 2;
277
+ }
278
+ if (!st.isFile() || st.size > TETO_DO_ARQUIVO_DO_ENVELOPE) {
279
+ console.error(`noctum.envelope.invalido: o pedido de abertura é um arquivo JSON de até ${TETO_DO_ARQUIVO_DO_ENVELOPE} bytes`);
280
+ return 2;
281
+ }
282
+ let pedido;
283
+ try {
284
+ pedido = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
285
+ }
286
+ catch {
287
+ console.error('noctum.envelope.invalido: o pedido de abertura não é JSON');
288
+ return 2;
289
+ }
290
+ const carregado = (0, manifest_1.exigirManifesto)();
291
+ const { raiz } = carregado;
292
+ const quando = new Date().toISOString();
293
+ const r = (0, noctum_arco_1.proporEnvelope)(raiz, pedido, quando, (0, pulse_resposta_1.codigosEmUso)(raiz));
294
+ // Os avisos olham o envelope que o dono vai autorizar, já validado pelo proporEnvelope: o vigente (lerArco) só
295
+ // existe depois da autorização, e na primeira proposta os avisos sumiam (RM-058, bloco B).
296
+ const proposto = (0, noctum_envelope_1.validarPedidoDeAbertura)(pedido);
297
+ const fuso = proposto.janela.fuso;
298
+ const avisos = avisosDaProposta(carregado, proposto);
299
+ // RM-057 (resposta curta, D4 e D9): a proposta é a pergunta ao dono, que sai também pelo canal dele quando ele tem um.
300
+ const q = r.codigo ? (0, noctum_arco_1.perguntasDoArco)(raiz, r.arco, quando).find(x => x.codigo === r.codigo && x.situacao === 'pendente') : undefined;
301
+ const entrega = q ? (0, noctum_pergunta_canal_1.entregarPerguntaDoArco)(raiz, q, { quando }) : null;
302
+ const textoDaPergunta = q ? (0, noctum_pergunta_1.textoDaPerguntaDoArco)(q, 'terminal', { quando, ...(entrega?.numero ? { numero: entrega.numero } : {}) }) : null;
303
+ const instrucoes = q ? (0, noctum_pergunta_canal_1.comoResponderAoArco)(q) : [`O envelope ${r.envelopeSha256.slice(0, 12)} já vale no arco ${r.arco}: não há o que autorizar`];
304
+ if (json) {
305
+ console.log(JSON.stringify({ ...r, autorizado: false, avisos, comoAutorizar: instrucoes,
306
+ pergunta: q ? { codigo: q.codigo, prazo: q.prazo, texto: textoDaPergunta, entrega } : null }, null, 2));
307
+ }
308
+ else {
309
+ console.log([...r.resumo, '',
310
+ ...(avisos.length ? ['Avisos (não bloqueiam a proposta):', ...avisos.map(a => `• ${a.motivo}: ${a.detalhe}. Correção: ${a.correcao}.`), ''] : []),
311
+ `Proposta ${r.versao} do arco ${r.arco}, vale até ${(0, horario_1.formatarDataHora)(r.prazo, { fuso, locale: 'pt-BR' })}.`,
312
+ 'Nada foi autorizado: o dono autoriza respondendo à pergunta, nunca por silêncio nem por este comando.',
313
+ ...(textoDaPergunta ? ['', textoDaPergunta, '', linhaDaEntrega(entrega)] : instrucoes)].join('\n'));
314
+ }
315
+ return 0;
316
+ }
317
+ if (sub === 'maquina') {
318
+ // RM-058, bloco B (B4, D5): o que o dono copia de cada máquina para `maquinas` do envelope `v3`. O nome vem antes da
319
+ // chave: o recusado não cria a chave local. A chave privada nunca sai desta raiz.
320
+ if (args.posicionais.length !== 2) {
321
+ console.error(exports.USO_DO_NOCTUM);
322
+ return 2;
323
+ }
324
+ const { raiz } = (0, manifest_1.exigirManifesto)();
325
+ const nome = (0, maquina_1.nomeDaMaquina)();
326
+ if (!noctum_transporte_1.NOME_DE_MAQUINA.test(nome)) {
327
+ console.error(`noctum.maquina.nome-invalido: o nome desta máquina ("${nome}") não serve no envelope v3: letras, dígitos, ` +
328
+ 'ponto, _ ou -, até 64, começando por letra ou dígito. Correção: grave um nome válido em ~/.orkastery/maquina.json ' +
329
+ '(o campo nome) ou defina ORK_MAQUINA em todo processo do ork desta máquina, o cron e os gateways inclusive');
330
+ return 2;
331
+ }
332
+ const { chave } = (0, noctum_transporte_1.identidadeDaMaquina)(raiz, nome);
333
+ const impressao = (0, noctum_envelope_1.impressaoDaChave)(chave);
334
+ if (json)
335
+ console.log(JSON.stringify({ nome, chave, impressao }, null, 2));
336
+ else {
337
+ console.log(['Esta máquina no envelope v3:', ` nome ${nome}`, ` chave ${chave}`, ` impressão ${impressao}`, '',
338
+ 'A entrada para maquinas do envelope:', JSON.stringify({ nome, chave }), '',
339
+ 'A chave privada não sai desta raiz; o dono confere a impressão no resumo da proposta.'].join('\n'));
340
+ }
341
+ return 0;
342
+ }
343
+ if (sub === 'revogar') {
344
+ // RM-057 (resposta curta, D10): abre a pergunta de revogação e a entrega; quem revoga é a resposta do dono.
345
+ const arco = args.posicionais[2];
346
+ if (!arco || args.posicionais.length !== 3) {
347
+ console.error(exports.USO_DO_NOCTUM);
348
+ return 2;
349
+ }
350
+ const { raiz } = (0, manifest_1.exigirManifesto)();
351
+ const quando = new Date().toISOString();
352
+ const r = (0, noctum_arco_1.pedirRevogacao)(raiz, arco, quando, (0, pulse_resposta_1.codigosEmUso)(raiz));
353
+ const q = (0, noctum_arco_1.perguntasDoArco)(raiz, arco, quando).find(x => x.codigo === r.codigo);
354
+ const entrega = (0, noctum_pergunta_canal_1.entregarPerguntaDoArco)(raiz, q, { quando });
355
+ const textoDaPergunta = (0, noctum_pergunta_1.textoDaPerguntaDoArco)(q, 'terminal', { quando, ...(entrega.numero ? { numero: entrega.numero } : {}) });
356
+ if (json) {
357
+ console.log(JSON.stringify({ arco, revogado: false, comoRevogar: (0, noctum_pergunta_canal_1.comoResponderAoArco)(q),
358
+ pergunta: { codigo: q.codigo, prazo: q.prazo, nova: r.nova, texto: textoDaPergunta, entrega } }, null, 2));
359
+ }
360
+ else {
361
+ console.log([textoDaPergunta, '', linhaDaEntrega(entrega), 'Nada foi revogado: o dono revoga respondendo à pergunta.'].join('\n'));
362
+ }
363
+ return 0;
364
+ }
365
+ if (sub === 'responder') {
366
+ const arco = args.posicionais[2];
367
+ if (!arco || args.posicionais.length !== 3 || args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined) {
368
+ console.error('noctum responder exige o arco, --resposta-stdin e o envelope do ingresso autenticado na entrada');
369
+ return 2;
370
+ }
371
+ // A entrada malformada ou o argv que diverge do envelope é recusa tipada, como a do núcleo, e nunca autoriza nada.
372
+ let envelope;
373
+ try {
374
+ envelope = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem), origem: texto(args.opcoes.origem),
375
+ canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
376
+ }
377
+ catch (e) {
378
+ console.error(`noctum.origem.sem-prova: ${e.message.slice(0, 300)}`);
379
+ return 2;
380
+ }
381
+ console.log(JSON.stringify((0, noctum_modo_1.responderAoArco)((0, manifest_1.exigirManifesto)().raiz, arco, envelope)));
382
+ return 0;
383
+ }
384
+ if (sub === 'terminal') {
385
+ // RM-057 (resposta curta, D5): o ingresso do terminal, que o hook UserPromptSubmit do plugin chama. Sai 0 sempre: a
386
+ // decisão vai em JSON, e o hook só a transporta. GO-FIX 2 (D22): o ingresso está desligado, e este comando nunca o
387
+ // liga; a resposta curta a uma pergunta que espera o dono volta recusada, com o aviso de por onde responder.
388
+ if (args.opcoes['hook-stdin'] !== true || args.posicionais.length !== 2) {
389
+ console.error(exports.USO_DO_NOCTUM);
390
+ return 2;
391
+ }
392
+ const entrada = lerEntradaDoHookStdin();
393
+ let raiz = null;
394
+ try {
395
+ raiz = (0, manifest_1.exigirManifesto)().raiz;
396
+ }
397
+ catch {
398
+ raiz = null;
399
+ }
400
+ try {
401
+ console.log(JSON.stringify((0, noctum_terminal_1.responderPeloTerminal)(raiz, entrada, { env: process.env })));
402
+ }
403
+ catch (e) {
404
+ console.error(`noctum terminal: ${e.message.slice(0, 200)}`);
405
+ console.log(JSON.stringify({ contrato: noctum_terminal_1.CONTRATO_DO_TERMINAL, acao: 'ignorar', motivo: 'erro-interno' }));
406
+ }
407
+ return 0;
408
+ }
409
+ if (sub === 'status') {
410
+ const carregado = (0, manifest_1.exigirManifesto)();
411
+ const arco = args.posicionais[2];
412
+ if (!arco) {
413
+ const arcos = (0, noctum_modo_1.listarArcos)(carregado.raiz).map(a => {
414
+ try {
415
+ return { arco: a, situacao: (0, noctum_arco_1.lerArco)(carregado.raiz, a)?.situacao ?? 'sem-proposta' };
416
+ }
417
+ catch (e) {
418
+ return { arco: a, situacao: 'ilegivel', detalhe: e.message.slice(0, 200) };
419
+ }
420
+ });
421
+ if (json)
422
+ console.log(JSON.stringify({ arcos }, null, 2));
423
+ else
424
+ console.log(arcos.length ? arcos.map(x => `${x.arco}: ${x.situacao}`).join('\n') : 'Nenhum arco #Noctum neste projeto.');
425
+ return 0;
426
+ }
427
+ const r = (0, noctum_modo_1.retratoDoArco)(carregado, arco);
428
+ if (!r) {
429
+ console.error(`noctum.efeito.sem-autorizacao: o arco ${arco} não tem proposta`);
430
+ return 2;
431
+ }
432
+ console.log(json ? JSON.stringify(r, null, 2) : (0, noctum_modo_1.textoDoRetrato)(r));
433
+ return 0;
434
+ }
435
+ if (sub === 'tique') {
436
+ const arco = args.posicionais[2];
437
+ if (!arco || args.posicionais.length !== 3) {
438
+ console.error(exports.USO_DO_NOCTUM);
439
+ return 2;
440
+ }
441
+ const r = (0, noctum_modo_1.tiqueDoArco)((0, manifest_1.exigirManifesto)(), arco);
442
+ if (json)
443
+ console.log(JSON.stringify(r, null, 2));
444
+ else {
445
+ console.log([`Tique do arco ${arco}:`,
446
+ ` fechamento: ${r.fechamento.fechado ? `${r.fechamento.motivo}${r.fechamento.agora ? ' (agora)' : ''}` : r.fechamento.detalhe}`,
447
+ ` passo: ${r.passo ? `${r.passo.acao}${'motivo' in r.passo && r.passo.motivo ? ` (${r.passo.motivo})` : ''}` : 'nenhum'}`,
448
+ ` relatório: ${r.relatorio.acao}: ${r.relatorio.detalhe}`,
449
+ ...r.falhas.map(f => ` falha no ${f.etapa}: ${f.detalhe}`)].join('\n'));
450
+ }
451
+ // A falha de uma etapa não segura o relatório, mas o cron do dono a vê pela saída.
452
+ return r.falhas.length ? 1 : 0;
453
+ }
454
+ if (sub === 'relatorio') {
455
+ const arco = args.posicionais[2];
456
+ if (!arco || args.posicionais.length !== 3) {
457
+ console.error(exports.USO_DO_NOCTUM);
458
+ return 2;
459
+ }
460
+ const carregado = (0, manifest_1.exigirManifesto)();
461
+ const reenviar = texto(args.opcoes.reenviar);
462
+ if (args.opcoes.reenviar !== undefined) {
463
+ if (!reenviar || reenviar === 'terminal' || !noctum_envelope_1.CANAIS_DO_RELATORIO.includes(reenviar)) {
464
+ console.error('noctum relatorio --reenviar exige o canal telegram ou openclaw');
465
+ return 2;
466
+ }
467
+ const r = (0, noctum_relatorio_1.reenviarRelatorio)(carregado, arco, reenviar);
468
+ console.log(json ? JSON.stringify(r, null, 2) : `Reenvio pelo canal ${reenviar}: ${r.acao}, ${r.enviadas} página(s) confirmada(s). ${r.detalhe}`);
469
+ return r.acao === 'entregue' ? 0 : 1;
470
+ }
471
+ // O recibo do canal terminal só vem do terminal interativo, nunca de saída redirecionada nem do --json.
472
+ const r = (0, noctum_relatorio_1.relatorioNoTerminal)(carregado, arco, { interativo: !json && process.stdout.isTTY === true });
473
+ if (!r) {
474
+ console.error(`noctum.efeito.sem-autorizacao: o arco ${arco} não tem envelope autorizado`);
475
+ return 2;
476
+ }
477
+ console.log(json ? JSON.stringify(r, null, 2) : r.paginas.join('\n\n'));
478
+ return 0;
479
+ }
480
+ if (sub === 'conduzir') {
481
+ const arco = args.posicionais[2];
482
+ if (!arco || args.posicionais.length !== 3) {
483
+ console.error(exports.USO_DO_NOCTUM);
484
+ return 2;
485
+ }
486
+ const r = conduzirPeloCli((0, manifest_1.exigirManifesto)(), arco);
487
+ if (json)
488
+ console.log(JSON.stringify(r, null, 2));
489
+ else if (r.codigo === 2)
490
+ console.error(textoDoCondutor(arco, r));
491
+ else
492
+ console.log(textoDoCondutor(arco, r));
493
+ return r.codigo;
494
+ }
495
+ if (sub === 'aceite') {
496
+ const arco = args.posicionais[2];
497
+ const arquivo = (nome) => args.opcoes[nome] === undefined ? null : texto(args.opcoes[nome]) ?? false;
498
+ const [injecoes, limiares, outraMaquina, publicar] = [arquivo('injecoes'), arquivo('limiares'), arquivo('outra-maquina'), arquivo('publicar')];
499
+ if (!arco || args.posicionais.length !== 3 || injecoes === false || limiares === false || outraMaquina === false || publicar === false) {
500
+ console.error(exports.USO_DO_NOCTUM);
501
+ return 2;
502
+ }
503
+ let agenda = null, doDono = null;
504
+ const outrasMaquinas = [];
505
+ try {
506
+ if (injecoes)
507
+ agenda = (0, noctum_aceite_1.lerInjecoes)(fs.readFileSync(injecoes, 'utf8'));
508
+ if (limiares)
509
+ doDono = (0, noctum_aceite_1.lerLimiares)(JSON.parse(fs.readFileSync(limiares, 'utf8')));
510
+ for (const fonte of (outraMaquina ? outraMaquina.split(',') : []).map(x => x.trim()).filter(Boolean)) {
511
+ const bruto = fs.readFileSync(fonte, 'utf8');
512
+ outrasMaquinas.push({ fonte, sha256: (0, node_crypto_1.createHash)('sha256').update(bruto).digest('hex'), resultado: JSON.parse(bruto) });
513
+ }
514
+ }
515
+ catch (e) {
516
+ if (e instanceof noctum_aceite_1.RecusaDoAceite)
517
+ throw e;
518
+ console.error(`noctum.aceite.arquivo: ${e.message.slice(0, 200)}`);
519
+ return 2;
520
+ }
521
+ const carregado = (0, manifest_1.exigirManifesto)();
522
+ // RM-058, integração (T8, D12): o arquivo completo fica no estado; o publicável vai aonde o dono pedir.
523
+ const r = (0, noctum_aceite_1.aceiteDoPiloto)(carregado, arco, { injecoes: agenda, limiares: doDono, outrasMaquinas });
524
+ const gravado = (0, noctum_aceite_1.gravarAceite)(carregado.raiz, r);
525
+ if (publicar)
526
+ fs.writeFileSync(publicar, `${JSON.stringify((0, noctum_aceite_1.publicavel)(r, gravado.sha256, (0, noctum_aceite_1.sensiveisDoArco)(carregado, arco)), null, 2)}\n`);
527
+ if (json)
528
+ console.log(JSON.stringify({ ...r, sha256: gravado.sha256, arquivo: gravado.arquivo }, null, 2));
529
+ else
530
+ console.log(textoDoAceite(r, gravado));
531
+ return r.veredito === 'aprovado' ? 0 : 1;
532
+ }
533
+ }
534
+ catch (e) {
535
+ return recusado(e);
536
+ }
537
+ console.error(exports.USO_DO_NOCTUM);
538
+ return 2;
539
+ }