@orkastery/cli 0.5.3 → 0.6.0

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 (502) 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 +195 -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/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -0,0 +1,235 @@
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.POSTURAS_QUE_AFROUXAM = exports.ARQUIVO_POSTURA_LOCAL = exports.CONTRATO_POSTURA_LOCAL = void 0;
37
+ exports.pastaPrivadaDaPostura = pastaPrivadaDaPostura;
38
+ exports.caminhoDaPosturaLocal = caminhoDaPosturaLocal;
39
+ exports.posturaAfrouxada = posturaAfrouxada;
40
+ exports.comandoDeConfirmacao = comandoDeConfirmacao;
41
+ exports.lerArquivoPrivado = lerArquivoPrivado;
42
+ exports.raizRealDoEstado = raizRealDoEstado;
43
+ exports.lerPosturaLocal = lerPosturaLocal;
44
+ exports.recusaDePostura = recusaDePostura;
45
+ exports.gravarArquivoPrivado = gravarArquivoPrivado;
46
+ exports.revogarArquivoPrivado = revogarArquivoPrivado;
47
+ exports.confirmarPosturaLocal = confirmarPosturaLocal;
48
+ exports.revogarPosturaLocal = revogarPosturaLocal;
49
+ /**
50
+ * RM-047 (fronteira de confiança, P1): a postura de sandbox que afrouxa vale só com a confirmação
51
+ * desta máquina.
52
+ *
53
+ * O `runtime.sandbox` mora no `orkastery.yaml`, que vem com o repositório. Um valor que afrouxa o
54
+ * sandbox do agente (hoje, `danger-full-access`, que no Codex vai junto com aprovação `never`) não
55
+ * pode valer só porque o manifesto clonado o declara: o despacho recusa com
56
+ * `runtime.sandbox-nao-confirmado` até a máquina confirmar a mesma postura no setup local, com
57
+ * `ork setup sandbox confirmar <postura>`.
58
+ *
59
+ * A confirmação fica em `.orkastery/private/postura-local.json`, na raiz de estado: pasta 0700 e
60
+ * arquivo 0600 do próprio usuário, nunca link e nunca rastreado pelo git. Ela guarda a postura e o
61
+ * caminho real da raiz, então não vale para outra postura nem para outro checkout.
62
+ */
63
+ const fs = __importStar(require("node:fs"));
64
+ const path = __importStar(require("node:path"));
65
+ const node_crypto_1 = require("node:crypto");
66
+ const codex_1 = require("./adapters/codex");
67
+ const estado_thread_1 = require("./estado-thread");
68
+ const procedencia_1 = require("./procedencia");
69
+ const locale_1 = require("./locale");
70
+ const util_1 = require("./util");
71
+ exports.CONTRATO_POSTURA_LOCAL = 'ork.postura-local/v1';
72
+ exports.ARQUIVO_POSTURA_LOCAL = 'postura-local.json';
73
+ const LIMITE_BYTES = 4096;
74
+ /**
75
+ * As posturas de sandbox que afrouxam o padrão (`workspace-write`). `read-only` aperta e vale sem
76
+ * confirmação. Uma postura nova do runtime entra aqui antes de poder ser declarada.
77
+ */
78
+ exports.POSTURAS_QUE_AFROUXAM = ['danger-full-access'];
79
+ function uid() {
80
+ return typeof process.getuid === 'function' ? process.getuid() : null;
81
+ }
82
+ function pastaPrivadaDaPostura(raiz) {
83
+ return path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'private');
84
+ }
85
+ function caminhoDaPosturaLocal(raiz) {
86
+ return path.join(pastaPrivadaDaPostura(raiz), exports.ARQUIVO_POSTURA_LOCAL);
87
+ }
88
+ /** O manifesto pede uma postura que afrouxa o sandbox? */
89
+ function posturaAfrouxada(manifesto) {
90
+ const sandbox = manifesto.runtime.sandbox ?? codex_1.SANDBOX_PADRAO;
91
+ return exports.POSTURAS_QUE_AFROUXAM.includes(sandbox) ? sandbox : null;
92
+ }
93
+ /** Comando que confirma a postura nesta máquina; vai em toda recusa. */
94
+ function comandoDeConfirmacao(postura) {
95
+ return `ork setup sandbox confirmar ${postura}`;
96
+ }
97
+ /**
98
+ * RM-047 (P3): lê um arquivo de `.orkastery/private/` com as regras da confirmação local: pasta 0700 e
99
+ * arquivo 0600 do próprio usuário, nunca link, nunca rastreado pelo git, até 4 KiB e JSON válido.
100
+ * Devolve o objeto cru, ou `null` com o motivo.
101
+ */
102
+ function lerArquivoPrivado(raiz, nome) {
103
+ const pasta = pastaPrivadaDaPostura(raiz), arquivo = path.join(pasta, nome);
104
+ const stPasta = fs.lstatSync(pasta, { throwIfNoEntry: false });
105
+ if (!stPasta)
106
+ return { bruto: null, motivo: 'sem confirmação local' };
107
+ const dono = uid();
108
+ if (!stPasta.isDirectory() || stPasta.isSymbolicLink() || (dono !== null && stPasta.uid !== dono) ||
109
+ (stPasta.mode & 0o077) !== 0)
110
+ return { bruto: null, motivo: '.orkastery/private precisa ser pasta 0700 do próprio usuário' };
111
+ const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
112
+ if (!st)
113
+ return { bruto: null, motivo: 'sem confirmação local' };
114
+ if (!st.isFile() || st.isSymbolicLink() || st.nlink !== 1 || (dono !== null && st.uid !== dono) ||
115
+ (st.mode & 0o077) !== 0 || st.size > LIMITE_BYTES) {
116
+ return { bruto: null, motivo: `${nome} precisa ser arquivo 0600 do próprio usuário` };
117
+ }
118
+ if ((0, procedencia_1.rastreadoPeloGit)(raiz, arquivo)) {
119
+ return { bruto: null, motivo: `${nome} está versionado no git e não vale como confirmação local` };
120
+ }
121
+ let bruto;
122
+ try {
123
+ bruto = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
124
+ }
125
+ catch {
126
+ return { bruto: null, motivo: `${nome} com JSON inválido` };
127
+ }
128
+ if (!bruto || typeof bruto !== 'object' || Array.isArray(bruto))
129
+ return { bruto: null, motivo: `${nome} com JSON inválido` };
130
+ return { bruto: bruto, motivo: null };
131
+ }
132
+ /** Caminho real da raiz de estado: a confirmação local vale só para o checkout que a gravou. */
133
+ function raizRealDoEstado(raiz) {
134
+ try {
135
+ return fs.realpathSync((0, estado_thread_1.raizDoEstado)(raiz));
136
+ }
137
+ catch {
138
+ return path.resolve(raiz);
139
+ }
140
+ }
141
+ /**
142
+ * Lê a confirmação local. `null` quando ela não existe ou não vale (pasta ou arquivo com dono ou modo
143
+ * errado, link, rastreado pelo git, JSON inválido, outra raiz); o motivo vai em `motivo`.
144
+ */
145
+ function lerPosturaLocal(raiz) {
146
+ const { bruto: o, motivo } = lerArquivoPrivado(raiz, exports.ARQUIVO_POSTURA_LOCAL);
147
+ if (!o)
148
+ return { postura: null, motivo };
149
+ if (o.contrato !== exports.CONTRATO_POSTURA_LOCAL || typeof o.sandbox !== 'string' ||
150
+ typeof o.raiz !== 'string' || typeof o.confirmadoEm !== 'string' || typeof o.por !== 'string') {
151
+ return { postura: null, motivo: `${exports.ARQUIVO_POSTURA_LOCAL} fora do contrato ${exports.CONTRATO_POSTURA_LOCAL}` };
152
+ }
153
+ if (o.raiz !== raizRealDoEstado(raiz))
154
+ return { postura: null, motivo: 'a confirmação local é de outro checkout' };
155
+ return { postura: o, motivo: null };
156
+ }
157
+ /**
158
+ * A recusa do despacho: `null` quando a postura do manifesto vale nesta máquina (não afrouxa, ou
159
+ * foi confirmada localmente com o mesmo valor); senão o erro tipado com o comando que confirma.
160
+ * Só o Codex recebe a postura de sandbox do manifesto.
161
+ */
162
+ function recusaDePostura(raiz, manifesto, runtime) {
163
+ if (runtime !== 'codex')
164
+ return null;
165
+ const postura = posturaAfrouxada(manifesto);
166
+ if (!postura)
167
+ return null;
168
+ const { postura: local, motivo } = lerPosturaLocal(raiz);
169
+ if (local && local.sandbox === postura)
170
+ return null;
171
+ const porque = local ? `a máquina confirmou ${local.sandbox}, não ${postura}` : motivo ?? 'sem confirmação local';
172
+ return `runtime.sandbox-nao-confirmado: o orkastery.yaml pede runtime.sandbox: ${postura}, que desliga o sandbox ` +
173
+ `do agente, e esta máquina não confirmou essa postura (${porque}). Nada foi despachado. O manifesto vem com o ` +
174
+ `repositório; quem decide afrouxar o sandbox é a máquina. Para aceitar nesta máquina: ${comandoDeConfirmacao(postura)}` +
175
+ ` (ou volte o manifesto para ${codex_1.SANDBOX_PADRAO}).`;
176
+ }
177
+ /**
178
+ * RM-047 (P3): grava um objeto em `.orkastery/private/<nome>` com as regras da confirmação local
179
+ * (pasta 0700, arquivo 0600 por temporário exclusivo e `rename`, nunca seguindo link).
180
+ */
181
+ function gravarArquivoPrivado(raiz, nome, objeto) {
182
+ const pasta = pastaPrivadaDaPostura(raiz), arquivo = path.join(pasta, nome);
183
+ const estado = path.dirname(pasta);
184
+ const stEstado = fs.lstatSync(estado, { throwIfNoEntry: false });
185
+ if (stEstado && (!stEstado.isDirectory() || stEstado.isSymbolicLink()))
186
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaEstadoLink);
187
+ fs.mkdirSync(estado, { recursive: true });
188
+ try {
189
+ fs.mkdirSync(pasta, { mode: 0o700 });
190
+ }
191
+ catch (e) {
192
+ if (e.code !== 'EEXIST')
193
+ throw e;
194
+ }
195
+ const stPasta = fs.lstatSync(pasta);
196
+ if (!stPasta.isDirectory() || stPasta.isSymbolicLink())
197
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaPrivadaLink);
198
+ fs.chmodSync(pasta, 0o700);
199
+ if ((0, procedencia_1.rastreadoPeloGit)(raiz, arquivo)) {
200
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaRastreada(nome));
201
+ }
202
+ const temp = path.join(pasta, `.${nome}.${(0, node_crypto_1.randomUUID)()}.tmp`);
203
+ const fd = fs.openSync(temp, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW, 0o600);
204
+ try {
205
+ fs.fchmodSync(fd, 0o600);
206
+ fs.writeFileSync(fd, JSON.stringify(objeto, null, 2) + '\n');
207
+ fs.fsyncSync(fd);
208
+ }
209
+ finally {
210
+ fs.closeSync(fd);
211
+ }
212
+ fs.renameSync(temp, arquivo);
213
+ }
214
+ /** Apaga um arquivo de `.orkastery/private/`; devolve se havia um. */
215
+ function revogarArquivoPrivado(raiz, nome) {
216
+ const arquivo = path.join(pastaPrivadaDaPostura(raiz), nome);
217
+ const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
218
+ if (!st)
219
+ return false;
220
+ fs.rmSync(arquivo, { force: true });
221
+ return true;
222
+ }
223
+ /** Grava a confirmação local de uma postura de sandbox para este checkout. */
224
+ function confirmarPosturaLocal(raiz, sandbox, por) {
225
+ if (!codex_1.SANDBOXES_DO_CODEX.includes(sandbox)) {
226
+ throw new Error(`runtime.sandbox-invalido: "${sandbox}" (aceitos: ${codex_1.SANDBOXES_DO_CODEX.join(', ')})`);
227
+ }
228
+ const postura = { contrato: exports.CONTRATO_POSTURA_LOCAL, sandbox, raiz: raizRealDoEstado(raiz), confirmadoEm: (0, util_1.agora)(), por };
229
+ gravarArquivoPrivado(raiz, exports.ARQUIVO_POSTURA_LOCAL, postura);
230
+ return postura;
231
+ }
232
+ /** Apaga a confirmação local; devolve se havia uma. */
233
+ function revogarPosturaLocal(raiz) {
234
+ return revogarArquivoPrivado(raiz, exports.ARQUIVO_POSTURA_LOCAL);
235
+ }
package/dist/preflight.js CHANGED
@@ -51,6 +51,7 @@ const modos_1 = require("./modos");
51
51
  const setup_1 = require("./setup");
52
52
  const phase_1 = require("./phase");
53
53
  const runtimes_1 = require("./runtimes");
54
+ const locale_1 = require("./locale");
54
55
  const codex_2 = require("./adapters/codex");
55
56
  const runtime_ambiente_1 = require("./runtime-ambiente");
56
57
  const slug_1 = require("./slug");
@@ -92,10 +93,10 @@ function umaskDoProcesso() {
92
93
  function sondasDeAmbiente(raiz, umask = umaskDoProcesso()) {
93
94
  const checks = [];
94
95
  const octal = (v) => '0' + v.toString(8).padStart(3, '0');
95
- checks.push(umask === null ? { nome: 'umask', nivel: 'warn', detalhe: 'umask do processo nao medido nesta plataforma' }
96
- : (umask & 0o022) === 0o022 ? { nome: 'umask', nivel: 'ok', detalhe: `umask ${octal(umask)} nega escrita de grupo e outros` }
97
- : { nome: 'umask', nivel: 'warn', detalhe: `umask ${octal(umask)} permite escrita de grupo ou outros: o que o runtime criar sera recusado pelo sensor (bits 0o022)`,
98
- correcao: 'umask 022 (ou 077) no shell que roda o ork e os runtimes' });
96
+ const m = (0, locale_1.msg)().doctor;
97
+ checks.push(umask === null ? { nome: 'umask', nivel: 'warn', detalhe: m.umaskNaoMedido }
98
+ : (umask & 0o022) === 0o022 ? { nome: 'umask', nivel: 'ok', detalhe: m.umaskOk(octal(umask)) }
99
+ : { nome: 'umask', nivel: 'warn', detalhe: m.umaskAberto(octal(umask)), correcao: m.umaskCorrecao });
99
100
  const estado = path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery');
100
101
  let st = null;
101
102
  try {
@@ -103,19 +104,19 @@ function sondasDeAmbiente(raiz, umask = umaskDoProcesso()) {
103
104
  }
104
105
  catch { /* ausencia e do check de estado do projeto */ }
105
106
  if (st)
106
- checks.push(!st.isDirectory() || st.isSymbolicLink() ? { nome: 'permissoes do estado', nivel: 'fail', detalhe: `${estado} nao e diretorio real` }
107
- : st.mode & 0o022 ? { nome: 'permissoes do estado', nivel: 'warn', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}: grupo ou outros podem escrever no estado`, correcao: `chmod go-w ${estado}` }
108
- : { nome: 'permissoes do estado', nivel: 'ok', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}` });
107
+ checks.push(!st.isDirectory() || st.isSymbolicLink() ? { nome: 'permissoes do estado', nivel: 'fail', detalhe: m.estadoNaoDiretorio(estado) }
108
+ : st.mode & 0o022 ? { nome: 'permissoes do estado', nivel: 'warn', detalhe: m.estadoAberto(estado, octal(st.mode & 0o777)), correcao: `chmod go-w ${estado}` }
109
+ : { nome: 'permissoes do estado', nivel: 'ok', detalhe: m.estadoComModo(estado, octal(st.mode & 0o777)) });
109
110
  const privada = path.join(estado, 'private');
110
111
  let sp = null;
111
112
  try {
112
113
  sp = fs.lstatSync(privada);
113
114
  }
114
115
  catch { /* criada sob demanda */ }
115
- checks.push(!sp ? { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} ausente: criada sob demanda com 0700` }
116
+ checks.push(!sp ? { nome: 'pasta privada', nivel: 'ok', detalhe: m.privadaAusente(privada) }
116
117
  : !sp.isDirectory() || sp.isSymbolicLink() || sp.uid !== process.getuid?.() || (sp.mode & 0o777) !== 0o700
117
- ? { nome: 'pasta privada', nivel: 'fail', detalhe: `${privada} precisa ser diretorio 0700 do proprio usuario (modo ${octal(sp.mode & 0o777)}): recibo HITL e perfis recusam`, correcao: `chmod 700 ${privada}` }
118
- : { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} com modo 0700` });
118
+ ? { nome: 'pasta privada', nivel: 'fail', detalhe: m.privadaAberta(privada, octal(sp.mode & 0o777)), correcao: `chmod 700 ${privada}` }
119
+ : { nome: 'pasta privada', nivel: 'ok', detalhe: m.privadaOk(privada) });
119
120
  return checks;
120
121
  }
121
122
  /**
@@ -0,0 +1,220 @@
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.rastreadoPeloGit = rastreadoPeloGit;
37
+ exports.exigirCwdLocal = exigirCwdLocal;
38
+ exports.cwdLocalOuNulo = cwdLocalOuNulo;
39
+ exports.diretorioDaThread = diretorioDaThread;
40
+ exports.exigirHostLocal = exigirHostLocal;
41
+ exports.caminhoContidoOuNulo = caminhoContidoOuNulo;
42
+ exports.exigirCaminhoContido = exigirCaminhoContido;
43
+ /**
44
+ * RM-047 (fronteira de confiança, P2): procedência do estado que escolhe onde o `ork` roda.
45
+ *
46
+ * O `.orkastery/` é estado desta máquina, mas nada impede um repositório de versioná-lo, e o clone
47
+ * traz então `thread.json`, ledger, fila e arquivos de host escritos em outro lugar. Duas regras
48
+ * separam o estado local do que veio no clone:
49
+ *
50
+ * 1. Estado rastreado pelo git não vale como estado local para escolher diretório ou executável.
51
+ * `thread.json`, ledger e fila rastreados não escolhem o cwd; `pulse-host.json` e
52
+ * `master-host.json` rastreados não escolhem o transporte.
53
+ * 2. O cwd do agente e do git, quando sai do estado (worktree da thread, cwd do despacho no ledger,
54
+ * cwd de um pedido da fila), só vale se for uma worktree que o `git worktree list` do próprio
55
+ * repositório registra. A raiz do projeto, escolhida por quem roda o comando, segue valendo.
56
+ *
57
+ * As recusas são tipadas: `estado.rastreado`, `estado.worktree-nao-registrada` e
58
+ * `transporte.rastreado`. Cada mensagem diz o que fazer.
59
+ */
60
+ const fs = __importStar(require("node:fs"));
61
+ const path = __importStar(require("node:path"));
62
+ const estado_thread_1 = require("./estado-thread");
63
+ const locale_1 = require("./locale");
64
+ const util_1 = require("./util");
65
+ /** Caminho relativo à árvore principal, com `/` (o formato do `git ls-files`). */
66
+ function relativoAoRepositorio(principal, arquivo) {
67
+ const rel = path.relative(principal, path.resolve(arquivo));
68
+ if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
69
+ return null;
70
+ return rel.split(path.sep).join('/');
71
+ }
72
+ /**
73
+ * O arquivo está no índice do git da árvore principal? Sem git (projeto fora de repositório, git
74
+ * ausente), nada está rastreado. A consulta roda na raiz do projeto, como todo git do `ork`.
75
+ */
76
+ function rastreadoPeloGit(raiz, arquivo) {
77
+ let principal;
78
+ try {
79
+ principal = (0, estado_thread_1.raizDoEstado)(raiz);
80
+ }
81
+ catch {
82
+ principal = path.resolve(raiz);
83
+ }
84
+ const rel = relativoAoRepositorio(principal, arquivo);
85
+ if (rel === null)
86
+ return false;
87
+ const r = (0, util_1.exec)('git', ['ls-files', '-z', '--', rel], principal, 30000);
88
+ return r.ok && r.stdout.split('\0').some(Boolean);
89
+ }
90
+ /** As worktrees que o git do repositório registra, pelo caminho real. */
91
+ function worktreesRegistradas(principal) {
92
+ const r = (0, util_1.exec)('git', ['worktree', 'list', '--porcelain'], principal, 30000);
93
+ if (!r.ok)
94
+ return [];
95
+ return r.stdout.split('\n').filter(l => l.startsWith('worktree ')).map(l => {
96
+ const dir = l.slice('worktree '.length).trim();
97
+ try {
98
+ return fs.realpathSync(dir);
99
+ }
100
+ catch {
101
+ return path.resolve(dir);
102
+ }
103
+ });
104
+ }
105
+ function real(p) {
106
+ try {
107
+ return fs.realpathSync(p);
108
+ }
109
+ catch {
110
+ return path.resolve(p);
111
+ }
112
+ }
113
+ const ARQUIVO_DA_ORIGEM = {
114
+ thread: id => `.orkastery/threads/${id}/thread.json`,
115
+ ledger: id => `.orkastery/threads/${id}/ledger.jsonl`,
116
+ fila: () => '.orkastery/retry/fila.jsonl',
117
+ };
118
+ /**
119
+ * Confere o diretório que o estado escolheu para rodar git ou agente. Devolve o próprio diretório
120
+ * quando ele vale; senão lança `estado.rastreado` ou `estado.worktree-nao-registrada`.
121
+ *
122
+ * A raiz do projeto (o checkout de quem roda o comando) e a árvore principal valem sem consulta: não
123
+ * saem do estado.
124
+ */
125
+ function exigirCwdLocal(raiz, threadId, dir, origem) {
126
+ let principal;
127
+ try {
128
+ principal = (0, estado_thread_1.raizDoEstado)(raiz);
129
+ }
130
+ catch {
131
+ principal = path.resolve(raiz);
132
+ }
133
+ const alvo = real(dir);
134
+ if (alvo === real(raiz) || alvo === real(principal))
135
+ return dir;
136
+ const arquivo = path.join(principal, ARQUIVO_DA_ORIGEM[origem](threadId));
137
+ if (rastreadoPeloGit(principal, arquivo)) {
138
+ const rel = path.relative(principal, arquivo);
139
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.rastreado(rel));
140
+ }
141
+ if (!path.isAbsolute(dir) || !fs.existsSync(dir) || !worktreesRegistradas(principal).includes(alvo)) {
142
+ const citado = JSON.stringify(String(dir)).slice(0, 200);
143
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.worktreeNaoRegistrada(citado, threadId));
144
+ }
145
+ return dir;
146
+ }
147
+ /** Como `exigirCwdLocal`, sem lançar: `null` quando o diretório não vale. */
148
+ function cwdLocalOuNulo(raiz, threadId, dir, origem) {
149
+ try {
150
+ return exigirCwdLocal(raiz, threadId, dir, origem);
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * O diretório de trabalho de uma thread: a worktree registrada dela, ou a raiz do projeto quando a
158
+ * thread não tem worktree.
159
+ */
160
+ function diretorioDaThread(raiz, thread) {
161
+ return thread.worktree ? exigirCwdLocal(raiz, thread.id, thread.worktree, 'thread') : raiz;
162
+ }
163
+ /**
164
+ * O arquivo de host (`pulse-host.json`, `master-host.json`) escolhe o executável que recebe a
165
+ * mensagem. Só vale o arquivo local: versionado no git, ele veio com o repositório.
166
+ */
167
+ function exigirHostLocal(raiz, arquivo) {
168
+ if (rastreadoPeloGit(raiz, arquivo)) {
169
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.transporteRastreado(path.basename(arquivo)));
170
+ }
171
+ const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
172
+ if (st && !st.isFile()) {
173
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.transporteNaoComum(path.basename(arquivo)));
174
+ }
175
+ }
176
+ /** `filho` está dentro de `pai` (ou é o próprio `pai`), pelos caminhos reais? */
177
+ function dentroDe(pai, filho) {
178
+ const rel = path.relative(pai, filho);
179
+ return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
180
+ }
181
+ /**
182
+ * Um ponteiro que o estado guarda (`location` do `handoff.json`, `arquivo` de uma claim, `promptPath`
183
+ * de uma sessão, arquivo de handoff ou de lição da memória) só é lido se, pelo caminho real (links
184
+ * resolvidos), cair na raiz do projeto, na árvore principal ou na worktree registrada da thread.
185
+ * Devolve o caminho real, ou `null` quando ele sai dessas raízes ou não existe.
186
+ */
187
+ function caminhoContidoOuNulo(raiz, thread, caminho) {
188
+ let alvo;
189
+ try {
190
+ alvo = fs.realpathSync(caminho);
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ let principal;
196
+ try {
197
+ principal = (0, estado_thread_1.raizDoEstado)(raiz);
198
+ }
199
+ catch {
200
+ principal = path.resolve(raiz);
201
+ }
202
+ const raizes = [real(raiz), real(principal)];
203
+ if (thread?.worktree) {
204
+ const w = cwdLocalOuNulo(raiz, thread.id, thread.worktree, 'thread');
205
+ if (w)
206
+ raizes.push(real(w));
207
+ }
208
+ return raizes.some(r => dentroDe(r, alvo)) ? alvo : null;
209
+ }
210
+ /**
211
+ * Como `caminhoContidoOuNulo`, com a recusa tipada `ponteiro.fora-da-raiz` quando o arquivo existe
212
+ * mas sai das raízes. Arquivo ausente segue para quem chamou dizer que o ponteiro não resolve.
213
+ */
214
+ function exigirCaminhoContido(raiz, thread, caminho, origem) {
215
+ const contido = caminhoContidoOuNulo(raiz, thread, caminho);
216
+ if (contido)
217
+ return contido;
218
+ const citado = JSON.stringify(String(origem)).slice(0, 200);
219
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.ponteiroForaDaRaiz(citado));
220
+ }