@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,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONTRATO_REDE_DO_ARCO = void 0;
4
+ exports.lerRede = lerRede;
5
+ exports.coordenacaoDaFila = coordenacaoDaFila;
6
+ const maquina_1 = require("./maquina");
7
+ const noctum_arco_1 = require("./noctum-arco");
8
+ const noctum_coordenacao_1 = require("./noctum-coordenacao");
9
+ const noctum_envelope_1 = require("./noctum-envelope");
10
+ exports.CONTRATO_REDE_DO_ARCO = 'ork.noctum-rede/v1';
11
+ const consumoVazio = () => ({ arco: 0, porConta: {}, porRuntime: {} });
12
+ function vazia(arco, maquina, multimaquina, envelopeSha256, lidaEm, lacuna) {
13
+ return { contrato: exports.CONTRATO_REDE_DO_ARCO, arco, multimaquina, maquina, envelopeSha256, lidaEm, autoridade: null, revogada: null,
14
+ maquinas: [], trabalhos: [], consumo: consumoVazio(), obrigacoes: { ordens: [], vagas: [], vezes: [] }, lacuna };
15
+ }
16
+ function ordemProjetada(o) {
17
+ return { ordem: o.ordem, numero: o.n, maquina: o.maquina, estado: o.estado, emitidaEm: o.emitidaEm };
18
+ }
19
+ function projetar(estado, maquina, quando) {
20
+ const conteudo = estado.vigente.conteudo;
21
+ if (!(0, noctum_envelope_1.envelopeMultimaquina)(conteudo))
22
+ return vazia(estado.arco, maquina, false, estado.vigente.envelopeSha256, estado.lidoEm, null);
23
+ const vezes = [...estado.vezes.values()].flat();
24
+ const maquinas = conteudo.maquinas.map(({ nome }) => ({
25
+ nome,
26
+ ultimoSinal: estado.sinais.get(nome) ?? null,
27
+ sinalRecente: (0, noctum_coordenacao_1.batidaRecente)(estado, nome, maquina, quando),
28
+ ordensVivas: [...estado.ordens.values()].filter(o => o.maquina === nome && (0, noctum_coordenacao_1.ordemViva)(o)).map(o => o.ordem).sort(),
29
+ vagasAtivas: estado.vagas.filter(v => v.maquina === nome && !v.solta).map(v => v.vaga).sort(),
30
+ vezesAtivas: vezes.filter(v => v.maquina === nome && !v.fim).map(v => `${v.chave}/${v.n}`).sort(),
31
+ consumo: estado.vagas.filter(v => v.maquina === nome && (!v.solta || v.solta.consumiu)).length,
32
+ }));
33
+ const trabalhos = conteudo.trabalhos.map(t => {
34
+ const situacao = estado.trabalhos.get(t.id);
35
+ const ordem = situacao.ordem ? ordemProjetada(situacao.ordem) : null;
36
+ const registro = estado.entregas.get(t.id);
37
+ const entrega = registro ? { em: registro.em, maquina: registro.por, merge: String(registro.merge) } : null;
38
+ return { id: t.id, estado: situacao.estado, maquina: ordem?.maquina ?? null, ordem, maquinaPresa: t.maquina ?? null, entrega };
39
+ });
40
+ return {
41
+ contrato: exports.CONTRATO_REDE_DO_ARCO,
42
+ arco: estado.arco,
43
+ multimaquina: true,
44
+ maquina,
45
+ envelopeSha256: estado.vigente.envelopeSha256,
46
+ lidaEm: estado.lidoEm,
47
+ autoridade: estado.autoridade ? { maquina: estado.autoridade.maquina, geracao: estado.autoridade.geracao, desde: estado.autoridade.desde } : null,
48
+ revogada: estado.revogada,
49
+ maquinas,
50
+ trabalhos,
51
+ consumo: estado.consumo,
52
+ obrigacoes: {
53
+ ordens: [...estado.ordens.values()].filter(o => o.maquina === maquina && (0, noctum_coordenacao_1.ordemViva)(o)).map(o => o.ordem).sort(),
54
+ vagas: estado.vagas.filter(v => v.maquina === maquina && !v.solta).map(v => v.vaga).sort(),
55
+ vezes: vezes.filter(v => v.maquina === maquina && !v.fim).map(v => `${v.chave}/${v.n}`).sort(),
56
+ },
57
+ lacuna: null,
58
+ };
59
+ }
60
+ /** Lê a rede de um v3. Em v1/v2 não toca o remoto; recusa tipada vira lacuna, sem inventar estado. */
61
+ function lerRede(carregado, arco, opcoes = {}) {
62
+ const quando = opcoes.quando ?? new Date().toISOString();
63
+ const maquina = (0, maquina_1.nomeDaMaquina)(opcoes.maquina);
64
+ const local = (0, noctum_arco_1.lerArco)(carregado.raiz, arco, quando);
65
+ if (!local?.conteudo || !(0, noctum_envelope_1.envelopeMultimaquina)(local.conteudo)) {
66
+ return vazia(arco, maquina, false, local?.envelopeSha256 ?? null, quando, null);
67
+ }
68
+ try {
69
+ return projetar((0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, { ...opcoes, quando }), maquina, quando);
70
+ }
71
+ catch (e) {
72
+ if (!(e instanceof noctum_envelope_1.RecusaDoArco))
73
+ throw e;
74
+ return vazia(arco, maquina, true, local.envelopeSha256, quando, { motivo: e.motivo, detalhe: e.message });
75
+ }
76
+ }
77
+ /** Adapta a projeção íntegra para a fila. Rede local ou ilegível não vira coordenação vazia. */
78
+ function coordenacaoDaFila(rede) {
79
+ if (!rede.multimaquina || rede.lacuna)
80
+ return null;
81
+ const trabalhos = new Set();
82
+ const entregues = new Map();
83
+ const encerrados = new Set();
84
+ const emOutraMaquina = new Set();
85
+ const ordens = new Map();
86
+ for (const t of rede.trabalhos) {
87
+ if (t.entrega)
88
+ entregues.set(t.id, t.entrega.em);
89
+ else if (t.estado === 'entregue')
90
+ entregues.set(t.id, t.ordem?.emitidaEm ?? rede.lidaEm);
91
+ if (t.estado === 'encerrado')
92
+ encerrados.add(t.id);
93
+ if (t.ordem?.maquina === rede.maquina && t.ordem.estado === 'aceita') {
94
+ trabalhos.add(t.id);
95
+ ordens.set(t.id, { ordem: t.ordem.ordem, numero: t.ordem.numero });
96
+ }
97
+ else if (t.ordem && ['emitida', 'aceita', 'isolada'].includes(t.ordem.estado) && t.ordem.maquina !== rede.maquina) {
98
+ emOutraMaquina.add(t.id);
99
+ }
100
+ }
101
+ return { trabalhos, entregues, encerrados, emOutraMaquina, ordens };
102
+ }
@@ -0,0 +1,215 @@
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.RecusaDoRegistro = exports.MOTIVOS_DO_REGISTRO = exports.contratoDoRegistro = exports.DOMINIOS_DO_REGISTRO = void 0;
37
+ exports.pastaDoArco = pastaDoArco;
38
+ exports.lerRegistro = lerRegistro;
39
+ exports.comRegistro = comRegistro;
40
+ /**
41
+ * RM-058, fatia N6 (D7 da ork-rm058n6): o registro da N6 ao lado do log do arco.
42
+ *
43
+ * O fechamento e o relatório da manhã guardam o que fizeram em logs de acréscimo próprios, um por domínio, na pasta do
44
+ * arco (`.orkastery/noctum/arcos/<arco>/fechamento.jsonl` e `relatorio.jsonl`). Cada linha leva o sha256 da anterior e
45
+ * o MAC de uma subchave da chave local do núcleo derivada pelo domínio: a do log do arco não vale aqui, e a de um domínio
46
+ * não vale no outro. O log do arco ganha só o `encerrado` (D2): nada aqui autoriza, renova ou emenda o envelope.
47
+ *
48
+ * A trava de cada domínio é a do kernel num arquivo próprio (`<domínio>.lock`), nunca a do arco: o envio do relatório
49
+ * espera o transporte do canal, e a revogação do dono não pode esperar por ele. A trava solta quando o processo morre.
50
+ *
51
+ * Limites, os mesmos do log do arco: a chave local é legível por qualquer processo do mesmo usuário do sistema, que pode
52
+ * escrever uma linha nova ou truncar o log; o MAC acusa a linha trocada e a cadeia, a linha apagada do meio.
53
+ */
54
+ const fs = __importStar(require("node:fs"));
55
+ const path = __importStar(require("node:path"));
56
+ const node_crypto_1 = require("node:crypto");
57
+ const estado_thread_1 = require("./estado-thread");
58
+ const fila_pesada_1 = require("./fila-pesada");
59
+ const hitl_local_receipt_1 = require("./hitl-local-receipt");
60
+ const noctum_envelope_1 = require("./noctum-envelope");
61
+ exports.DOMINIOS_DO_REGISTRO = ['fechamento', 'relatorio'];
62
+ /** O contrato de cada domínio, que também separa a subchave do MAC. */
63
+ const contratoDoRegistro = (dominio) => `ork.noctum-${dominio}/v1`;
64
+ exports.contratoDoRegistro = contratoDoRegistro;
65
+ /** Tipo fechado próprio, como o da supervisão da N4: o registro não abre gate nem recusa efeito do arco. */
66
+ exports.MOTIVOS_DO_REGISTRO = ['noctum.registro.adulterado', 'noctum.registro.ocupado', 'noctum.registro.sem-trava'];
67
+ class RecusaDoRegistro extends Error {
68
+ motivo;
69
+ constructor(motivo, detalhe) {
70
+ super(`${motivo}: ${detalhe}`);
71
+ this.motivo = motivo;
72
+ this.name = 'RecusaDoRegistro';
73
+ }
74
+ }
75
+ exports.RecusaDoRegistro = RecusaDoRegistro;
76
+ const ZERO = '0'.repeat(64);
77
+ const sha = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');
78
+ const adulterado = (dominio, detalhe) => new RecusaDoRegistro('noctum.registro.adulterado', `${dominio}: ${detalhe}; o registro do arco exige inspeção`);
79
+ const objeto = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
80
+ /** A pasta do arco na raiz do estado, sem link no caminho. */
81
+ function pastaDoArco(raiz, arco) {
82
+ if (typeof arco !== 'string' || !noctum_envelope_1.ID_DO_ARCO.test(arco))
83
+ throw new RecusaDoRegistro('noctum.registro.adulterado', 'identificador de arco inválido');
84
+ const principal = (0, estado_thread_1.raizDoEstado)(raiz);
85
+ (0, estado_thread_1.exigirEstadoSemLink)(principal, ['.orkastery', 'noctum', 'arcos', arco]);
86
+ return path.join(principal, '.orkastery', 'noctum', 'arcos', arco);
87
+ }
88
+ function subchave(raiz, dominio, criar) {
89
+ return (0, node_crypto_1.createHmac)('sha256', (0, hitl_local_receipt_1.chaveLocal)(raiz, criar)).update((0, exports.contratoDoRegistro)(dominio)).digest();
90
+ }
91
+ /** Lê e confere o log inteiro. Linha sem quebra no fim está sendo gravada: fica de fora e não conta. */
92
+ function lerCompleto(raiz, arco, dominio) {
93
+ const file = path.join(pastaDoArco(raiz, arco), `${dominio}.jsonl`);
94
+ let bruto;
95
+ try {
96
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
97
+ try {
98
+ const st = fs.fstatSync(fd);
99
+ if (!st.isFile() || st.nlink !== 1 || st.uid !== process.getuid?.() || (st.mode & 0o077) !== 0) {
100
+ throw adulterado(dominio, 'o log não é arquivo privado do núcleo');
101
+ }
102
+ bruto = fs.readFileSync(fd);
103
+ }
104
+ finally {
105
+ fs.closeSync(fd);
106
+ }
107
+ }
108
+ catch (e) {
109
+ if (e.code === 'ENOENT')
110
+ return { linhas: [], ultima: null, bytesCompletos: 0, bytesLidos: 0 };
111
+ if (e instanceof RecusaDoRegistro)
112
+ throw e;
113
+ throw adulterado(dominio, 'log ilegível');
114
+ }
115
+ // Em bytes: uma cauda que corta um caractere de vários bytes não desalinha os tamanhos.
116
+ const fim = bruto.lastIndexOf(0x0a) + 1;
117
+ const textos = bruto.subarray(0, fim).toString('utf8').split('\n').slice(0, -1);
118
+ if (!textos.length)
119
+ return { linhas: [], ultima: null, bytesCompletos: fim, bytesLidos: bruto.length };
120
+ let chave;
121
+ try {
122
+ chave = subchave(raiz, dominio, false);
123
+ }
124
+ catch {
125
+ throw adulterado(dominio, 'chave do núcleo ausente para conferir o log');
126
+ }
127
+ let anterior = ZERO;
128
+ const contrato = (0, exports.contratoDoRegistro)(dominio);
129
+ const linhas = textos.map((texto, i) => {
130
+ let l;
131
+ try {
132
+ l = JSON.parse(texto);
133
+ }
134
+ catch {
135
+ throw adulterado(dominio, `linha ${i + 1} não é JSON`);
136
+ }
137
+ if (!objeto(l) || Object.keys(l).sort().join(',') !== 'dados,mac' || typeof l.mac !== 'string' || !/^[a-f0-9]{64}$/.test(l.mac)) {
138
+ throw adulterado(dominio, `linha ${i + 1} fora do formato`);
139
+ }
140
+ const esperado = (0, node_crypto_1.createHmac)('sha256', chave).update(JSON.stringify(l.dados)).digest();
141
+ if (!(0, node_crypto_1.timingSafeEqual)(Buffer.from(l.mac, 'hex'), esperado))
142
+ throw adulterado(dominio, `linha ${i + 1} com MAC que não confere`);
143
+ const d = l.dados;
144
+ if (!objeto(d) || d.contrato !== contrato || d.arco !== arco || d.seq !== i + 1 || d.anterior !== anterior) {
145
+ throw adulterado(dominio, `linha ${i + 1} fora da cadeia`);
146
+ }
147
+ anterior = sha(texto);
148
+ return d;
149
+ });
150
+ return { linhas, ultima: textos.at(-1), bytesCompletos: fim, bytesLidos: bruto.length };
151
+ }
152
+ /** As linhas conferidas do registro, sem trava (o log é lido inteiro e conferido). Vazio quando ele ainda não existe. */
153
+ function lerRegistro(raiz, arco, dominio) {
154
+ return lerCompleto(raiz, arco, dominio).linhas;
155
+ }
156
+ const pausa = new Int32Array(new SharedArrayBuffer(4));
157
+ /**
158
+ * Executa sob a trava do domínio, com as linhas lidas sob ela e um `anexar` que grava em cima delas. `esperarMs` é quanto
159
+ * a trava ocupada por outro processo é esperada antes da recusa `noctum.registro.ocupado`; sem ele, a recusa é imediata.
160
+ */
161
+ function comRegistro(raiz, arco, dominio, executar, opcoes = {}) {
162
+ if (!(0, fila_pesada_1.kernelDisponivel)())
163
+ throw new RecusaDoRegistro('noctum.registro.sem-trava', 'o registro do arco só grava com /usr/bin/flock');
164
+ const pasta = pastaDoArco(raiz, arco);
165
+ fs.mkdirSync(pasta, { recursive: true, mode: 0o700 });
166
+ const prazo = Date.now() + Math.max(0, opcoes.esperarMs ?? 0);
167
+ let fd;
168
+ for (;;) {
169
+ fd = (0, fila_pesada_1.tentarTravaExclusiva)(path.join(pasta, `${dominio}.lock`));
170
+ if (fd !== null || Date.now() >= prazo)
171
+ break;
172
+ Atomics.wait(pausa, 0, 0, Math.min(100, Math.max(1, prazo - Date.now())));
173
+ }
174
+ if (fd === null)
175
+ throw new RecusaDoRegistro('noctum.registro.ocupado', `outro processo grava o ${dominio} do arco ${arco}`);
176
+ try {
177
+ let lido = lerCompleto(raiz, arco, dominio);
178
+ const anexar = (evento, quando) => {
179
+ const dados = { contrato: (0, exports.contratoDoRegistro)(dominio), arco, seq: lido.linhas.length + 1,
180
+ anterior: lido.ultima === null ? ZERO : sha(lido.ultima), em: quando, evento };
181
+ const texto = JSON.stringify({ dados, mac: (0, node_crypto_1.createHmac)('sha256', subchave(raiz, dominio, true)).update(JSON.stringify(dados)).digest('hex') });
182
+ const linha = Buffer.from(texto + '\n', 'utf8');
183
+ const file = path.join(pasta, `${dominio}.jsonl`);
184
+ const out = fs.openSync(file, fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_CREAT | fs.constants.O_NOFOLLOW, 0o600);
185
+ try {
186
+ const st = fs.fstatSync(out);
187
+ if (!st.isFile() || st.nlink !== 1 || st.uid !== process.getuid?.() || (st.mode & 0o077) !== 0) {
188
+ throw adulterado(dominio, 'o log não é arquivo privado do núcleo');
189
+ }
190
+ if (st.size !== lido.bytesLidos)
191
+ throw adulterado(dominio, 'o log mudou entre a leitura e a escrita sob a trava');
192
+ // A cauda sem quebra é escrita abortada (queda, disco cheio): nunca contou, e sai antes da linha nova.
193
+ if (lido.bytesLidos !== lido.bytesCompletos)
194
+ fs.ftruncateSync(out, lido.bytesCompletos);
195
+ const escritos = fs.writeSync(out, linha);
196
+ if (escritos !== linha.length) {
197
+ fs.ftruncateSync(out, lido.bytesCompletos);
198
+ fs.fsyncSync(out);
199
+ throw adulterado(dominio, `escrita curta (${escritos} de ${linha.length} bytes); nada foi gravado`);
200
+ }
201
+ fs.fsyncSync(out);
202
+ }
203
+ finally {
204
+ fs.closeSync(out);
205
+ }
206
+ const total = lido.bytesCompletos + linha.length;
207
+ lido = { linhas: [...lido.linhas, dados], ultima: texto, bytesCompletos: total, bytesLidos: total };
208
+ return dados;
209
+ };
210
+ return executar(lido.linhas, anexar);
211
+ }
212
+ finally {
213
+ fs.closeSync(fd);
214
+ }
215
+ }