@orkastery/cli 0.2.0 → 0.4.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 (257) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/check.md +4 -3
  7. package/adapters/claude-code/commands/goal.md +3 -2
  8. package/adapters/claude-code/commands/master.md +3 -2
  9. package/adapters/claude-code/commands/onboarding.md +21 -0
  10. package/adapters/claude-code/commands/ork.md +99 -27
  11. package/adapters/claude-code/hooks/hooks.json +6 -1
  12. package/adapters/claude-code/hooks/ork-guard.js +1 -1
  13. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  14. package/adapters/codex/skills/ork/SKILL.md +57 -0
  15. package/adapters/hermes/README.md +161 -0
  16. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  17. package/adapters/hermes/bin/ork-brain.sh +4 -0
  18. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  19. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  20. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  21. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  22. package/adapters/hermes/hermes.plugin.json +24 -4
  23. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  24. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  26. package/adapters/openclaw/README.md +136 -27
  27. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  28. package/adapters/openclaw/construir.sh +19 -0
  29. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  30. package/adapters/openclaw/dist/index.js +437 -0
  31. package/adapters/openclaw/openclaw.plugin.json +39 -134
  32. package/adapters/openclaw/package.json +26 -0
  33. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  34. package/adapters/openclaw/src/index.ts +460 -0
  35. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  36. package/adapters/openclaw/tsconfig.json +15 -0
  37. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  38. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  39. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  40. package/assets/docs/produto/README.md +14 -0
  41. package/assets/docs/produto/_modelo-feature.md +59 -0
  42. package/assets/docs/roadmap/README.md +14 -0
  43. package/assets/docs/roadmap/_modelo-item.md +73 -0
  44. package/assets/orkmind-native-schema.json +32 -0
  45. package/assets/orkmind_bridge.py +357 -0
  46. package/assets/orkmind_fixture.py +67 -0
  47. package/assets/orkmind_prospective.py +138 -0
  48. package/assets/reference-tariffs-i07.json +23 -0
  49. package/dist/adapters/claude-bg.js +488 -39
  50. package/dist/adapters/codex-controller-sensor.js +449 -0
  51. package/dist/adapters/codex-controller-worker.js +361 -0
  52. package/dist/adapters/codex-controller.js +252 -0
  53. package/dist/adapters/codex-events.js +205 -0
  54. package/dist/adapters/codex-question.js +26 -0
  55. package/dist/adapters/codex-runner.js +133 -0
  56. package/dist/adapters/codex.js +394 -0
  57. package/dist/agents-md.js +84 -0
  58. package/dist/auditoria.js +12 -9
  59. package/dist/auditrun.js +5 -4
  60. package/dist/board.js +174 -23
  61. package/dist/branch-de-estado.js +136 -0
  62. package/dist/canarios-hitl.js +177 -0
  63. package/dist/canarios-i43.js +543 -0
  64. package/dist/canarios-pulse.js +147 -0
  65. package/dist/canarios-sensores.js +129 -0
  66. package/dist/canarios.js +111 -2
  67. package/dist/catalogo.js +9 -0
  68. package/dist/ci.js +223 -0
  69. package/dist/ciclos.js +2 -1
  70. package/dist/claim-lint.js +64 -0
  71. package/dist/claims.js +60 -0
  72. package/dist/company-brain-capture.js +195 -0
  73. package/dist/company-brain-cli.js +123 -0
  74. package/dist/company-brain-client.js +61 -0
  75. package/dist/company-brain-contract.js +166 -0
  76. package/dist/company-brain-journal.js +192 -0
  77. package/dist/company-brain-mcp.js +33 -0
  78. package/dist/company-brain-migration.js +60 -0
  79. package/dist/company-brain-source.js +177 -0
  80. package/dist/company-brain-worker.js +18 -0
  81. package/dist/conducao-texto.js +61 -0
  82. package/dist/conducao.js +876 -0
  83. package/dist/contrato-publico.js +39 -0
  84. package/dist/creation-operation-store.js +251 -0
  85. package/dist/creation-operation.js +148 -0
  86. package/dist/decisao-autonoma.js +183 -0
  87. package/dist/delegation.js +79 -0
  88. package/dist/demo.js +120 -0
  89. package/dist/docs.js +828 -0
  90. package/dist/doctor.js +184 -25
  91. package/dist/entrega-pr.js +117 -0
  92. package/dist/escopo-escrita.js +71 -0
  93. package/dist/estado-thread.js +222 -0
  94. package/dist/evalrunner.js +12 -0
  95. package/dist/fabrica-estado.js +329 -0
  96. package/dist/fabrica-publicar.js +76 -0
  97. package/dist/fix.js +22 -1
  98. package/dist/gates.js +59 -11
  99. package/dist/handoff.js +39 -23
  100. package/dist/hitl-canais.js +333 -0
  101. package/dist/hitl-classificacao.js +131 -0
  102. package/dist/hitl-contract.js +465 -0
  103. package/dist/hitl-estado.js +136 -0
  104. package/dist/hitl-gates.js +554 -0
  105. package/dist/hitl-ingress-receipt.js +382 -0
  106. package/dist/hitl-local-atestado.js +57 -0
  107. package/dist/hitl-local-receipt.js +328 -0
  108. package/dist/hitl-local.js +143 -0
  109. package/dist/hitl-lock.js +139 -0
  110. package/dist/hitl-lote.js +223 -0
  111. package/dist/hitl-native-offer.js +97 -0
  112. package/dist/hitl-native.js +65 -0
  113. package/dist/hitl-presentation.js +209 -0
  114. package/dist/hitl-public-receipt.js +176 -0
  115. package/dist/hitl-resumo.js +209 -0
  116. package/dist/hitl-sessions.js +475 -0
  117. package/dist/hitl.js +711 -0
  118. package/dist/horario.js +269 -0
  119. package/dist/hosts.js +198 -22
  120. package/dist/index.js +1741 -94
  121. package/dist/indice.js +99 -0
  122. package/dist/init.js +28 -3
  123. package/dist/integracoes-locais.js +17 -0
  124. package/dist/leases.js +65 -21
  125. package/dist/ledger-stats.js +272 -0
  126. package/dist/ledger.js +109 -2
  127. package/dist/licoes.js +221 -0
  128. package/dist/liveness.js +218 -0
  129. package/dist/maestro-actions.js +51 -0
  130. package/dist/maestro-authority.js +152 -0
  131. package/dist/maestro-cli.js +97 -0
  132. package/dist/maestro-contract.js +55 -0
  133. package/dist/maestro-discovery.js +132 -0
  134. package/dist/maestro-runtime.js +268 -0
  135. package/dist/maestro-snapshot.js +86 -0
  136. package/dist/maestro-sources.js +224 -0
  137. package/dist/manifest.js +165 -6
  138. package/dist/maquina.js +102 -0
  139. package/dist/master-audit.js +101 -0
  140. package/dist/master-batch.js +43 -0
  141. package/dist/master-digest.js +149 -0
  142. package/dist/master-migracao.js +155 -0
  143. package/dist/master.js +361 -77
  144. package/dist/mcp-artifacts.js +234 -0
  145. package/dist/mcp-git.js +433 -0
  146. package/dist/mcp-install.js +310 -0
  147. package/dist/mcp-maestro.js +25 -0
  148. package/dist/mcp-server.js +469 -0
  149. package/dist/mcp-ship.js +436 -0
  150. package/dist/mcp-verify.js +173 -0
  151. package/dist/memoria-humana.js +207 -0
  152. package/dist/memoria.js +314 -78
  153. package/dist/memory-migration.js +279 -0
  154. package/dist/memory-prospective.js +148 -0
  155. package/dist/modos-migracao.js +191 -0
  156. package/dist/modos.js +151 -15
  157. package/dist/monitor-lock.js +110 -0
  158. package/dist/objective.js +449 -0
  159. package/dist/ocupacao.js +267 -0
  160. package/dist/onboarding.js +303 -0
  161. package/dist/orkmind.js +389 -90
  162. package/dist/orquestracao.js +96 -69
  163. package/dist/phase.js +612 -151
  164. package/dist/playbook-capabilities.js +150 -0
  165. package/dist/playbook-contracts.js +188 -0
  166. package/dist/policies.js +72 -0
  167. package/dist/portfolio-context.js +61 -0
  168. package/dist/portfolio.js +180 -0
  169. package/dist/preflight.js +207 -0
  170. package/dist/process-audit.js +112 -0
  171. package/dist/project-state.js +93 -0
  172. package/dist/prompts.js +25 -5
  173. package/dist/prova-minima.js +112 -0
  174. package/dist/pulse-cadencia.js +163 -0
  175. package/dist/pulse-consentimento.js +260 -0
  176. package/dist/pulse-delivery.js +323 -0
  177. package/dist/pulse-resposta.js +542 -0
  178. package/dist/pulse.js +262 -0
  179. package/dist/ratelimit.js +35 -2
  180. package/dist/recall.js +80 -3
  181. package/dist/redacao-saida.js +45 -0
  182. package/dist/redacao-url.js +66 -0
  183. package/dist/retry.js +640 -118
  184. package/dist/roadmap-reservas.js +243 -0
  185. package/dist/runtime-ambiente.js +38 -0
  186. package/dist/runtime-context.js +215 -0
  187. package/dist/runtime-profiles.js +869 -0
  188. package/dist/runtimes.js +103 -0
  189. package/dist/sandbox.js +9 -0
  190. package/dist/session-events.js +203 -0
  191. package/dist/session-watcher-claude.js +637 -0
  192. package/dist/session-watcher.js +700 -0
  193. package/dist/sessoes-adopt.js +154 -0
  194. package/dist/sessoes-inventario.js +159 -0
  195. package/dist/sessoes.js +16 -35
  196. package/dist/setup.js +691 -0
  197. package/dist/ship.js +168 -19
  198. package/dist/slug.js +1 -1
  199. package/dist/thread-close.js +115 -0
  200. package/dist/thread.js +142 -28
  201. package/dist/tokens.js +1 -1
  202. package/dist/util.js +4 -2
  203. package/dist/verify-sandbox.js +265 -0
  204. package/dist/verify.js +270 -25
  205. package/dist/versao.js +60 -0
  206. package/dist/worktree.js +31 -2
  207. package/dist/write-activation.js +291 -0
  208. package/dist/yaml.js +5 -1
  209. package/eval/casos/master-metrics.json +1 -1
  210. package/eval/casos/onboarding.json +102 -0
  211. package/eval/casos/orkastery-bootstrap.json +37 -3
  212. package/eval/casos/scope-check-capability-map.json +45 -7
  213. package/eval/casos/ship-release.json +3 -3
  214. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  215. package/eval/fixtures/b2-master-log/caso.json +1 -1
  216. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  217. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  218. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  219. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  220. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  221. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  222. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  223. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  224. package/eval/fixtures/fx-happy/caso.json +6 -4
  225. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  226. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  227. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  228. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  229. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  230. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  231. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  232. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  233. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  234. package/monitor/company-brain.cjs +17 -0
  235. package/monitor/pulse-scope.cjs +45 -0
  236. package/monitor/pulse.cron +18 -0
  237. package/monitor/varredura-pulse.sh +27 -0
  238. package/package.json +28 -7
  239. package/references/definition-of-done.md +2 -2
  240. package/schemas/claims.schema.json +25 -0
  241. package/schemas/company-brain.schema.json +1158 -0
  242. package/schemas/creation-operation.schema.json +365 -0
  243. package/schemas/maestro-snapshot.schema.json +2716 -0
  244. package/skills/README.md +3 -3
  245. package/skills/core/onboarding/SKILL.md +50 -0
  246. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  247. package/skills/core/thread-state/SKILL.md +3 -1
  248. package/skills/governance/decision-triage/SKILL.md +4 -4
  249. package/skills/governance/narrative-guardian/SKILL.md +1 -1
  250. package/skills/governance/roadmap-keeper/SKILL.md +1 -1
  251. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
  252. package/skills/observability/thread-tracing/SKILL.md +1 -1
  253. package/skills/phases/check-quality/SKILL.md +2 -2
  254. package/skills/phases/goal-definition/SKILL.md +1 -1
  255. package/skills/phases/master-metrics/SKILL.md +9 -7
  256. package/skills/phases/plan-specification/SKILL.md +1 -1
  257. package/skills/phases/ship-release/SKILL.md +1 -1
package/dist/modos.js CHANGED
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  /**
3
- * Modos de conducao por #TAG (visao unificada, secao 3.5).
3
+ * Modos de conducao por #TAG (guia: docs/guias/modos.md).
4
4
  *
5
5
  * Regra central, nao negociavel: o modo afrouxa a PAUSA, nunca a VERIFICACAO.
6
6
  * Claims, verify, policies e gates tipados rodam identicos em todos os modos;
7
7
  * o que muda e se o veredito espera o humano ou segue sozinho com registro no ledger.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.TAG_DE_MODO_DESCONHECIDO = exports.ORDEM_DOS_MODOS = exports.MODOS = exports.INVARIANTES = void 0;
10
+ exports.TAG_DE_MODO_DESCONHECIDO = exports.MOTIVO_MODO_APOSENTADO = exports.ORDEM_DOS_MODOS = exports.MODOS_LEGADOS = exports.MODOS_APOSENTADOS = exports.MODOS = exports.INVARIANTES = void 0;
11
11
  exports.slugDasFases = slugDasFases;
12
+ exports.substitutosVivos = substitutosVivos;
13
+ exports.cicloCompleto = cicloCompleto;
14
+ exports.modoAposentado = modoAposentado;
15
+ exports.recusaDeModoAposentado = recusaDeModoAposentado;
16
+ exports.exigirModoVivo = exigirModoVivo;
12
17
  exports.parseModo = parseModo;
13
18
  exports.extrairTagDoPedido = extrairTagDoPedido;
19
+ exports.extrairTagAposentadaDoPedido = extrairTagAposentadaDoPedido;
14
20
  exports.tagDoModo = tagDoModo;
15
21
  exports.definicaoDoModo = definicaoDoModo;
16
22
  exports.pausasDoModo = pausasDoModo;
@@ -23,7 +29,7 @@ exports.INVARIANTES = [
23
29
  'Claims, verify e policies rodam identicos em todos os modos.',
24
30
  'Policy `block` pausa qualquer modo, inclusive #Auto.',
25
31
  'Escalacao tipada para humano pausa qualquer modo, inclusive #Auto.',
26
- 'Um score humano por entrega sempre; nos modos sem pausa de MASTER ele vai para a fila de batch.',
32
+ 'Toda entrega fecha com indice derivado do ledger; a nota humana, quando vier, sobrescreve.',
27
33
  'Toda decisao autonoma vai ao ledger com quem decidiu, evidencia e razao.',
28
34
  ];
29
35
  /** Monta a parte 3 do slug para um conjunto de fases (visao, secao 3.4). */
@@ -45,7 +51,14 @@ function bloco(fases, pausaSobre) {
45
51
  };
46
52
  }
47
53
  const SEM_PAUSA = '';
48
- /** A matriz dos 5 modos, do mais HITL ao mais autonomo. */
54
+ /**
55
+ * A matriz dos modos, do mais HITL ao mais autonomo.
56
+ *
57
+ * I-43: ela guarda tambem os aposentados, de proposito. Quem encolhe e
58
+ * `ORDEM_DOS_MODOS`, que alimenta todo ESCRITOR. Se `look` saisse daqui,
59
+ * `tagDoModo` devolveria `#?look` para a thread `ork-smokeb0` de 02/09 e o
60
+ * board passaria a mostrar lixo no lugar da tag de uma thread que existe.
61
+ */
49
62
  exports.MODOS = {
50
63
  look: {
51
64
  modo: 'look',
@@ -84,7 +97,7 @@ exports.MODOS = {
84
97
  bloco(['SHIP', 'MASTER'], SEM_PAUSA),
85
98
  ],
86
99
  pausas: 3,
87
- recomendadoPara: 'O padrao: premissas delicadas com entrega confiavel; score em batch',
100
+ recomendadoPara: 'O padrao: premissas delicadas com entrega confiavel',
88
101
  },
89
102
  maestro: {
90
103
  modo: 'maestro',
@@ -95,7 +108,7 @@ exports.MODOS = {
95
108
  bloco(['MASTER'], SEM_PAUSA),
96
109
  ],
97
110
  pausas: 1,
98
- recomendadoPara: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs; score em batch',
111
+ recomendadoPara: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs',
99
112
  },
100
113
  auto: {
101
114
  modo: 'auto',
@@ -104,9 +117,101 @@ exports.MODOS = {
104
117
  pausas: 0,
105
118
  recomendadoPara: 'Solucoes menores, docs, estudos, pesquisas, configuracoes, auditorias, migracoes',
106
119
  },
120
+ // I-42: uma fase so, a GO, sem cerimonia. Nao autoriza push sozinho (fora de
121
+ // MODOS_QUE_AUTORIZAM_PUSH) e nao escreve contrato publico (ver contrato-publico.ts).
122
+ fast: {
123
+ modo: 'fast',
124
+ tag: '#Fast',
125
+ blocos: [bloco(['GO'], SEM_PAUSA)],
126
+ pausas: 0,
127
+ recomendadoPara: 'Pedido pequeno e claro, de minutos: uma fase so (GO), sem cerimonia; o push pede autorizacao',
128
+ },
107
129
  };
108
- /** Todos os modos na ordem do espectro, do mais HITL ao mais autonomo. */
109
- exports.ORDEM_DOS_MODOS = ['look', 'ork', 'classic', 'maestro', 'auto'];
130
+ /**
131
+ * Os modos APOSENTADOS pela I-43, na ordem do espectro.
132
+ *
133
+ * Domicilio unico da lista. Nenhum outro arquivo repete estes dois literais.
134
+ */
135
+ exports.MODOS_APOSENTADOS = ['look', 'ork'];
136
+ /**
137
+ * Todos os modos que podem estar GRAVADOS em disco, na ordem do espectro.
138
+ *
139
+ * Domicilio unico do literal de todos. Antes da I-43 ele existia em tres copias
140
+ * (`hitl-contract.ts`, `creation-operation-store.ts` e aqui), e encolher uma sem
141
+ * encolher as outras quebraria recibo historico em silencio. Esta lista NUNCA encolhe.
142
+ */
143
+ exports.MODOS_LEGADOS = ['look', 'ork', 'classic', 'maestro', 'auto', 'fast'];
144
+ /**
145
+ * Os modos VIVOS na ordem do espectro, do mais HITL ao mais autonomo.
146
+ *
147
+ * E a unica lista que alimenta ESCRITOR: `parseModo`, `extrairTagDoPedido`, a tabela
148
+ * de `ork modos`, a entrevista do `#setup` e o fallback do manifesto. Encolher aqui
149
+ * apaga o modo de toda entrada de uma vez, sem tocar em nenhum leitor. Uma thread que
150
+ * acrescente um modo (a I-42 e `#Fast`) cresce esta mesma lista e mais nada.
151
+ */
152
+ exports.ORDEM_DOS_MODOS = ['classic', 'maestro', 'auto', 'fast'];
153
+ /**
154
+ * As #TAGs vivas oferecidas como substituto de um modo aposentado (D7).
155
+ *
156
+ * DERIVADA de `ORDEM_DOS_MODOS`, nunca escrita a mao, e essa e a propriedade que
157
+ * importa: no dia em que a I-42 acrescentar `fast` a lista viva, toda mensagem de
158
+ * recusa passa a nomear `#Fast` sozinha, sem uma linha de edicao e sem conflito de
159
+ * merge nessa linha. Nomear um modo que ainda nao existe seria o pecado que o produto
160
+ * combate; derivar a lista e o que garante que isso nunca aconteca.
161
+ *
162
+ * `#Maestro` fica de fora porque ele nao e substituto de `#Look` nem de `#Ork`: e o
163
+ * modo de gate, com bloco e pausa de outra natureza.
164
+ *
165
+ * I-42: so modo de ciclo completo substitui um aposentado. `#Look` e `#Ork` eram os modos
166
+ * de maior vigilancia; oferecer o `#Fast` (so a GO, sem PLAN nem CHECK) no lugar deles
167
+ * trocaria o regime de supervisao pelas costas de quem pediu, que e o defeito que a
168
+ * recusa existe para impedir. A regra e por desenho de ciclo, nao pelo nome do modo.
169
+ */
170
+ function substitutosVivos() {
171
+ return exports.ORDEM_DOS_MODOS.filter((m) => m !== 'maestro' && cicloCompleto(m)).map((m) => exports.MODOS[m].tag);
172
+ }
173
+ /** O modo percorre as seis fases canonicas? */
174
+ function cicloCompleto(modo) {
175
+ return exports.MODOS[modo].blocos.reduce((n, b) => n + b.fases.length, 0) === types_1.FASES.length;
176
+ }
177
+ /** O modo esta aposentado? (esta gravado em disco, e nao pode mais ser escrito) */
178
+ function modoAposentado(modo) {
179
+ return typeof modo === 'string' && exports.MODOS_APOSENTADOS.includes(modo);
180
+ }
181
+ /** O motivo tipado de quem tentou escrever um modo aposentado (I-43). */
182
+ exports.MOTIVO_MODO_APOSENTADO = 'modo.aposentado';
183
+ /**
184
+ * A recusa tipada de um modo aposentado, no formato `<dominio>.<motivo>` do produto.
185
+ *
186
+ * Ignorar em silencio esta PROIBIDO: e o pecado que o produto inteiro combate, e seria
187
+ * o pior resultado possivel desta aposentadoria (o builder pede `#Look` e recebe `#Auto`
188
+ * sem saber). A recusa nomeia o modo pedido e os substitutos VIVOS.
189
+ *
190
+ * O texto e DERIVADO de `ORDEM_DOS_MODOS` (ver `substitutosVivos`), nunca escrito a mao.
191
+ */
192
+ function recusaDeModoAposentado(modo) {
193
+ const tag = exports.MODOS[modo].tag;
194
+ return `${exports.MOTIVO_MODO_APOSENTADO}: ${tag} foi aposentado e nao abre trabalho novo. `
195
+ + `Use ${substitutosVivos().join(' ou ')}. `
196
+ + `Thread ja gravada em ${tag} continua abrindo normalmente.`;
197
+ }
198
+ /**
199
+ * O portao de ESCRITA de modo, com recusa tipada em vez de silencio.
200
+ *
201
+ * Devolve o modo vivo, ou lanca: `modo.aposentado` para quem saiu do produto e
202
+ * `modo.desconhecido` para quem nunca existiu. Sao dois erros diferentes de proposito,
203
+ * porque a acao do dono tambem e diferente: um troca a #TAG, o outro corrige um typo.
204
+ */
205
+ function exigirModoVivo(entrada) {
206
+ const vivo = parseModo(entrada);
207
+ if (vivo)
208
+ return vivo;
209
+ const cru = (entrada ?? '').trim().replace(/^--?modo[= ]/i, '').replace(/^#/, '').toLowerCase();
210
+ if (modoAposentado(cru))
211
+ throw new Error(recusaDeModoAposentado(cru));
212
+ throw new Error(`modo.desconhecido: "${entrada ?? ''}" nao e um modo de conducao. `
213
+ + `Use um de: ${exports.ORDEM_DOS_MODOS.map((m) => exports.MODOS[m].tag).join(', ')}.`);
214
+ }
110
215
  /**
111
216
  * Parseia a #TAG de modo de conducao.
112
217
  * Aceita `#Auto`, `auto`, `--modo auto`, com ou sem caixa. Retorna null se nao reconhecer.
@@ -118,14 +223,40 @@ function parseModo(entrada) {
118
223
  return exports.ORDEM_DOS_MODOS.includes(limpo) ? limpo : null;
119
224
  }
120
225
  /**
121
- * Extrai a primeira #TAG de modo presente no texto livre de um pedido do builder.
122
- * E o caminho usado pelos adaptadores de host antes de chamar `ork thread new --modo`.
226
+ * A primeira #TAG de modo do texto, VIVA OU APOSENTADA, sem julgar qual das duas.
227
+ *
228
+ * A lista e derivada de `MODOS_LEGADOS`: nenhuma lista de modos e escrita a mao aqui.
229
+ * Reconhecer o aposentado e o que permite RECUSAR em vez de ignorar em silencio.
123
230
  */
124
- function extrairTagDoPedido(texto) {
125
- const achadas = texto.match(/#(look|ork|classic|maestro|auto)\b/gi);
231
+ function primeiraTagDoPedido(texto) {
232
+ const alternativas = exports.MODOS_LEGADOS.join('|');
233
+ const achadas = texto.match(new RegExp(`#(?:${alternativas})\\b`, 'gi'));
126
234
  if (!achadas || achadas.length === 0)
127
235
  return null;
128
- return parseModo(achadas[0]);
236
+ const cru = achadas[0].slice(1).toLowerCase();
237
+ return exports.MODOS_LEGADOS.includes(cru) ? cru : null;
238
+ }
239
+ /**
240
+ * Extrai a primeira #TAG de modo VIVO presente no texto livre de um pedido do builder.
241
+ * E o caminho usado pelos adaptadores de host antes de chamar `ork thread new --modo`.
242
+ *
243
+ * Uma #TAG aposentada devolve null AQUI e e reconhecida por `extrairTagAposentadaDoPedido`:
244
+ * quem chama decide recusar com motivo, nunca seguir como se nada tivesse sido escrito.
245
+ */
246
+ function extrairTagDoPedido(texto) {
247
+ const achada = primeiraTagDoPedido(texto);
248
+ return achada && !modoAposentado(achada) ? achada : null;
249
+ }
250
+ /**
251
+ * A #TAG do pedido nomeia um modo APOSENTADO? E o caminho da recusa tipada da I-43.
252
+ *
253
+ * Devolve o modo aposentado quando ele e a PRIMEIRA tag do texto, que e a mesma regra
254
+ * de precedencia de `extrairTagDoPedido`: um pedido com `#Look` antes de `#Auto` e um
255
+ * pedido em `#Look`, e recusar e diferente de escolher o proximo da fila por conta.
256
+ */
257
+ function extrairTagAposentadaDoPedido(texto) {
258
+ const achada = primeiraTagDoPedido(texto);
259
+ return achada && modoAposentado(achada) ? achada : null;
129
260
  }
130
261
  /** Tag mostrada quando a thread em disco nao traz um modo reconhecido. */
131
262
  exports.TAG_DE_MODO_DESCONHECIDO = '#?';
@@ -156,7 +287,12 @@ function tagDoModo(modo) {
156
287
  }
157
288
  return exports.TAG_DE_MODO_DESCONHECIDO;
158
289
  }
159
- /** Definicao de um modo, com erro tipado quando o modo nao existe. */
290
+ /**
291
+ * Definicao de um modo, com erro tipado quando o modo nao existe.
292
+ *
293
+ * Leitor: aceita modo aposentado, porque `MODOS` mantem os cinco e porque abrir
294
+ * thread antiga nao pode estourar. Quem VALIDA entrada usa `parseModo`.
295
+ */
160
296
  function definicaoDoModo(modo) {
161
297
  const def = exports.MODOS[modo];
162
298
  if (!def)
@@ -180,7 +316,7 @@ function fasePausa(modo, fase) {
180
316
  const b = blocoDaFase(modo, fase);
181
317
  return b.pausa && b.fases[b.fases.length - 1] === fase;
182
318
  }
183
- /** Tabela dos 5 modos em texto, usada por `ork modos`. */
319
+ /** Tabela dos modos VIVOS em texto, usada por `ork modos`. O numero vem da lista. */
184
320
  function tabelaDeModos() {
185
321
  const linhas = [];
186
322
  linhas.push('Modos de conducao (a #TAG vai no proprio pedido ao orquestrador)');
@@ -0,0 +1,110 @@
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.adquirirLockMonitor = adquirirLockMonitor;
37
+ exports.comLockDaConversa = comLockDaConversa;
38
+ /**
39
+ * Locks dos monitores do projeto (`.orkastery/monitor/`).
40
+ *
41
+ * `adquirirLockMonitor` morava em `pulse-delivery.ts`. I-41 (GO-FIX 1) o trouxe para ca porque o
42
+ * receptor do pulse (`pulse-resposta.ts`) tambem precisa dele, e `pulse-delivery` importa o
43
+ * receptor: um ciclo de modulos em tempo de execucao so aparece como `undefined is not a function`.
44
+ * `pulse-delivery` continua reexportando o nome, para quem ja o importava de la.
45
+ */
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ /** Lock compartilhado pelos monitores. ESRCH comprova que o dono morreu. */
49
+ function adquirirLockMonitor(lock) {
50
+ const pidFile = path.join(lock, 'pid');
51
+ try {
52
+ try {
53
+ fs.mkdirSync(lock);
54
+ }
55
+ catch (erro) {
56
+ if (erro.code !== 'EEXIST')
57
+ throw erro;
58
+ const pid = Number(fs.readFileSync(pidFile, 'utf8'));
59
+ if (!Number.isInteger(pid) || pid <= 0)
60
+ throw new Error(`lock sem proprietário válido: ${lock}`);
61
+ try {
62
+ process.kill(pid, 0);
63
+ return { ok: false, ativo: true, detalhe: 'varredura já em andamento' };
64
+ }
65
+ catch (e) {
66
+ if (e.code !== 'ESRCH')
67
+ throw e;
68
+ }
69
+ fs.unlinkSync(pidFile);
70
+ fs.rmdirSync(lock);
71
+ fs.mkdirSync(lock);
72
+ }
73
+ fs.writeFileSync(pidFile, String(process.pid), { flag: 'wx' });
74
+ return { ok: true, liberar: () => {
75
+ if (fs.readFileSync(pidFile, 'utf8') !== String(process.pid))
76
+ throw new Error(`lock mudou de proprietário: ${lock}`);
77
+ fs.unlinkSync(pidFile);
78
+ fs.rmdirSync(lock);
79
+ } };
80
+ }
81
+ catch (e) {
82
+ return { ok: false, ativo: false, detalhe: `lock ocupado ou ilegível em ${lock}: ${e.message}` };
83
+ }
84
+ }
85
+ const pausa = (ms) => { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); };
86
+ /**
87
+ * I-41 (GO-FIX 1): o estado da conversa do pulse (consentimento aberto e lote servido) tem dois
88
+ * escritores: a varredura, que abre o pedido do resumo, e o receptor, que grava o sim e o lote.
89
+ * Sem este lock, um sim chegando no meio de uma varredura podia ser sobrescrito por ela. A espera
90
+ * e curta e limitada: nenhum dos dois segura o lock enquanto fala com o transporte.
91
+ */
92
+ function comLockDaConversa(dir, executar, esperaMs = 5000) {
93
+ fs.mkdirSync(dir, { recursive: true });
94
+ const lock = path.join(dir, 'pulse-conversa.lock');
95
+ const limite = Date.now() + esperaMs;
96
+ for (;;) {
97
+ const trava = adquirirLockMonitor(lock);
98
+ if (trava.ok) {
99
+ try {
100
+ return executar();
101
+ }
102
+ finally {
103
+ trava.liberar();
104
+ }
105
+ }
106
+ if (Date.now() >= limite)
107
+ throw new Error(`conversa do pulse ocupada: ${trava.detalhe}`);
108
+ pausa(50);
109
+ }
110
+ }