@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.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/roadmap-reservas.js
CHANGED
|
@@ -48,6 +48,7 @@ exports.soltarItem = soltarItem;
|
|
|
48
48
|
exports.reservasOrfas = reservasOrfas;
|
|
49
49
|
exports.soltarReservaDaThread = soltarReservaDaThread;
|
|
50
50
|
exports.soltarReservasOrfas = soltarReservasOrfas;
|
|
51
|
+
exports.leituraDasReservas = leituraDasReservas;
|
|
51
52
|
exports.textoDasReservas = textoDasReservas;
|
|
52
53
|
/**
|
|
53
54
|
* I-47: reservas de item do roadmap entre maquinas, como documentacao em codigo.
|
|
@@ -71,6 +72,7 @@ const os = __importStar(require("node:os"));
|
|
|
71
72
|
const path = __importStar(require("node:path"));
|
|
72
73
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
73
74
|
const horario_1 = require("./horario");
|
|
75
|
+
const locale_1 = require("./locale");
|
|
74
76
|
const ledger_1 = require("./ledger");
|
|
75
77
|
const maquina_1 = require("./maquina");
|
|
76
78
|
const thread_1 = require("./thread");
|
|
@@ -101,15 +103,16 @@ const PREFIXO = 'roadmap';
|
|
|
101
103
|
/** O item precisa existir no roadmap do projeto (`docs/roadmap/RM-NNN-*.md`). */
|
|
102
104
|
function exigirItem(raiz, item) {
|
|
103
105
|
const id = item.trim().toUpperCase();
|
|
106
|
+
// RM-061 (D14): `thread new --roadmap` chama isto no escopo pt-BR da reserva; a entrada do CLI remonta no locale dele.
|
|
104
107
|
if (!ITEM.test(id))
|
|
105
|
-
throw new
|
|
108
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.roadmapItemInvalido(item));
|
|
106
109
|
const dir = path.join(raiz, 'docs', 'roadmap');
|
|
107
110
|
const doItem = (f) => path.basename(f).startsWith(`${id}-`) && f.endsWith('.md');
|
|
108
111
|
const naArvore = fs.existsSync(dir) && fs.readdirSync(dir).some(doItem);
|
|
109
112
|
// O checkout pode estar numa branch antiga, sem o item: vale tambem o que a main ja tem.
|
|
110
113
|
const naBase = !naArvore && ['main', 'origin/main'].some((ref) => (0, branch_de_estado_1.git)(raiz, ['ls-tree', '--name-only', ref, '--', 'docs/roadmap/']).stdout.split('\n').some(doItem));
|
|
111
114
|
if (!naArvore && !naBase)
|
|
112
|
-
throw new
|
|
115
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.roadmapItemInexistente(id));
|
|
113
116
|
return id;
|
|
114
117
|
}
|
|
115
118
|
/** Quem esta pegando: `--por`, senao o `user.name` do git, senao o usuario do sistema. */
|
|
@@ -192,11 +195,11 @@ function reservarFeat(raiz, opcoes = {}) {
|
|
|
192
195
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
193
196
|
const { ponta, atualizado } = buscar(raiz, remoto);
|
|
194
197
|
if (!atualizado)
|
|
195
|
-
throw new
|
|
198
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
196
199
|
const feats = featsDaPonta(raiz, ponta);
|
|
197
200
|
const proximo = Math.max(maiorFeatConhecida(raiz, remoto), ...feats.map((r) => numeroDaFeat(r.feat))) + 1;
|
|
198
201
|
if (proximo > 999)
|
|
199
|
-
throw new
|
|
202
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.featsAcabaram);
|
|
200
203
|
const feat = `FEAT-${String(proximo).padStart(3, '0')}`;
|
|
201
204
|
const reserva = { contrato: exports.CONTRATO_FEAT, feat, por: eu.por, maquina: eu.maquina,
|
|
202
205
|
thread: opcoes.thread ?? null, nota: opcoes.nota ?? null, em: opcoes.agora ?? (0, util_1.agora)() };
|
|
@@ -207,7 +210,7 @@ function reservarFeat(raiz, opcoes = {}) {
|
|
|
207
210
|
if (commit)
|
|
208
211
|
return { feat, reserva, commit, tentativas: tentativa };
|
|
209
212
|
}
|
|
210
|
-
throw new
|
|
213
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
211
214
|
}
|
|
212
215
|
/** O `RESERVAS.md` da branch: a mesma lista, para quem abre o GitHub. */
|
|
213
216
|
function painelEmMarkdown(reservas, feats = []) {
|
|
@@ -240,14 +243,14 @@ function gravar(raiz, remoto, ponta, mudanca, todas, mensagem, rede = {}) {
|
|
|
240
243
|
function ehMinha(r, eu) {
|
|
241
244
|
return r.por === eu.por && r.maquina === eu.maquina;
|
|
242
245
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
+
/** RM-061 (F3b): a descricao no locale de quem a monta; o erro e o ledger a montam pelo catalogo. */
|
|
247
|
+
function descrever(r, m = (0, locale_1.msg)().reservas) {
|
|
248
|
+
return m.descricao(r.item, r.por, r.maquina, (0, horario_1.formatarDataHora)(r.desdeEm), r.thread ?? null);
|
|
246
249
|
}
|
|
247
250
|
function exigirMotivo(opcoes) {
|
|
248
251
|
const motivo = (opcoes.motivo ?? '').trim();
|
|
249
252
|
if (!motivo)
|
|
250
|
-
throw new
|
|
253
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.forcarSemMotivo);
|
|
251
254
|
return motivo;
|
|
252
255
|
}
|
|
253
256
|
/**
|
|
@@ -261,7 +264,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
261
264
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
262
265
|
const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
|
|
263
266
|
if (!atualizado)
|
|
264
|
-
throw new
|
|
267
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
265
268
|
const todas = lerDaPonta(raiz, ponta);
|
|
266
269
|
const atual = todas.find((r) => r.item === id) ?? null;
|
|
267
270
|
if (opcoes.threadEsperada !== undefined && (atual?.thread ?? null) !== opcoes.threadEsperada) {
|
|
@@ -274,7 +277,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
274
277
|
acao = 'renovou';
|
|
275
278
|
else if (atual) {
|
|
276
279
|
if (!opcoes.forcar)
|
|
277
|
-
throw new
|
|
280
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoPegar(descrever(atual, m.reservas)));
|
|
278
281
|
tomadaDe = { por: atual.por, maquina: atual.maquina, motivo: exigirMotivo(opcoes) };
|
|
279
282
|
acao = 'tomou';
|
|
280
283
|
}
|
|
@@ -294,7 +297,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
294
297
|
if (commit)
|
|
295
298
|
return { acao, item: id, reserva, commit, tentativas: tentativa };
|
|
296
299
|
}
|
|
297
|
-
throw new
|
|
300
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
298
301
|
}
|
|
299
302
|
/** `ork roadmap soltar`: devolve o item. Soltar a reserva de outra maquina exige `--forcar --motivo`. */
|
|
300
303
|
function soltarItem(raiz, item, opcoes = {}) {
|
|
@@ -304,7 +307,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
304
307
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
305
308
|
const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
|
|
306
309
|
if (!atualizado)
|
|
307
|
-
throw new
|
|
310
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaSoltar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
308
311
|
const todas = lerDaPonta(raiz, ponta);
|
|
309
312
|
const atual = todas.find((r) => r.item === id);
|
|
310
313
|
if (!atual)
|
|
@@ -315,7 +318,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
315
318
|
let motivo = '';
|
|
316
319
|
if (!ehMinha(atual, eu)) {
|
|
317
320
|
if (!opcoes.forcar)
|
|
318
|
-
throw new
|
|
321
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoSoltar(descrever(atual, m.reservas)));
|
|
319
322
|
motivo = `: ${exigirMotivo(opcoes)}`;
|
|
320
323
|
}
|
|
321
324
|
const restantes = todas.filter((r) => r.item !== id);
|
|
@@ -324,7 +327,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
324
327
|
if (commit)
|
|
325
328
|
return { acao: 'soltou', item: id, reserva: atual, commit, tentativas: tentativa };
|
|
326
329
|
}
|
|
327
|
-
throw new
|
|
330
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
328
331
|
}
|
|
329
332
|
function threadsLocais(raiz) {
|
|
330
333
|
const threads = [];
|
|
@@ -364,10 +367,12 @@ function soltarOrfa(raiz, orfa, origem, opcoes) {
|
|
|
364
367
|
// A reserva mudou de dono no meio (ou ja tinha saido): nada foi gravado e nada vai ao ledger como soltura.
|
|
365
368
|
if (r.acao === 'nada') {
|
|
366
369
|
return { item, thread, acao: 'intocada', para: null, commit: null,
|
|
367
|
-
detalhe:
|
|
370
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.reservas.mudouDeDono(item)) };
|
|
368
371
|
}
|
|
369
372
|
const acao = orfa.sucessora ? 'reapontada' : 'solta';
|
|
370
|
-
|
|
373
|
+
// RM-061 (F3b, G4): o detalhe vai ao ledger e ao --json em pt-BR; a impressao o remonta.
|
|
374
|
+
const sucessora = orfa.sucessora;
|
|
375
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => sucessora ? m.reservas.passouPara(item, sucessora) : m.reservas.devolvido(item));
|
|
371
376
|
// Sugestao 3 do CHECK 2: a soltura ja foi ao remoto; erro so no registro nao a transforma em pendencia.
|
|
372
377
|
try {
|
|
373
378
|
(0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, thread), thread, ledger_1.TIPOS_DE_EVENTO.reservaLiberada, { item, acao, para: orfa.sucessora, commit: r.commit, origem, detalhe });
|
|
@@ -415,7 +420,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
415
420
|
return [pendenteDaThread(raiz, threadId, oItem, primeiraLinha(e))];
|
|
416
421
|
}
|
|
417
422
|
if (!painel.atualizado) {
|
|
418
|
-
return [pendenteDaThread(raiz, threadId, oItem,
|
|
423
|
+
return [pendenteDaThread(raiz, threadId, oItem, (0, locale_1.textoDoCatalogo)((m) => m.reservas.semLeituraPendente(exports.BRANCH_DE_RESERVAS, remoto)))];
|
|
419
424
|
}
|
|
420
425
|
const dela = painel.reservas.filter((r) => r.thread === threadId);
|
|
421
426
|
let orfas;
|
|
@@ -429,7 +434,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
429
434
|
const saida = [];
|
|
430
435
|
// Sugestao 1 do CHECK 1: toda reserva da thread, nao so a primeira; a de outra maquina fica pendente.
|
|
431
436
|
for (const r of dela.filter((x) => !orfas.some((o) => o.reserva.item === x.item))) {
|
|
432
|
-
saida.push(pendenteDaThread(raiz, threadId, r.item,
|
|
437
|
+
saida.push(pendenteDaThread(raiz, threadId, r.item, (0, locale_1.textoDoCatalogo)((m) => m.reservas.soQuemPegou(descrever(r, m.reservas)))));
|
|
433
438
|
}
|
|
434
439
|
for (const orfa of orfas) {
|
|
435
440
|
try {
|
|
@@ -448,7 +453,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
448
453
|
function soltarReservasOrfas(raiz, opcoes = {}) {
|
|
449
454
|
const painel = listarReservas(raiz, { remoto: opcoes.remoto, rede: opcoes.rede });
|
|
450
455
|
if (!painel.atualizado)
|
|
451
|
-
throw new
|
|
456
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaOrfas(exports.BRANCH_DE_RESERVAS));
|
|
452
457
|
return reservasOrfas(raiz, painel.reservas, opcoes).map((orfa) => {
|
|
453
458
|
try {
|
|
454
459
|
return soltarOrfa(raiz, orfa, 'orfas', opcoes);
|
|
@@ -458,28 +463,40 @@ function soltarReservasOrfas(raiz, opcoes = {}) {
|
|
|
458
463
|
}
|
|
459
464
|
});
|
|
460
465
|
}
|
|
466
|
+
function leituraDasReservas(p, temRemoto) {
|
|
467
|
+
if (!temRemoto)
|
|
468
|
+
return 'sem-remoto';
|
|
469
|
+
return p.atualizado ? 'lido-agora' : p.ponta ? 'copia-local' : 'sem-copia';
|
|
470
|
+
}
|
|
461
471
|
/** O texto de `ork roadmap reservas` para o terminal, no fuso do dono. */
|
|
462
|
-
function textoDasReservas(p, orfas = []) {
|
|
472
|
+
function textoDasReservas(p, orfas = [], lida = {}) {
|
|
473
|
+
const remoto = lida.remoto ?? exports.REMOTO_PADRAO;
|
|
474
|
+
const leitura = leituraDasReservas(p, lida.temRemoto !== false);
|
|
475
|
+
// RM-061 (F3b): o painel no terminal pelo catalogo; item, pessoa, maquina, thread e nota sao dado.
|
|
476
|
+
const m = (0, locale_1.msg)().reservas;
|
|
477
|
+
if (leitura === 'sem-remoto')
|
|
478
|
+
return m.semRemoto(lida.projeto ?? null, remoto, exports.BRANCH_DE_RESERVAS);
|
|
479
|
+
if (leitura === 'sem-copia')
|
|
480
|
+
return m.semCopia(remoto, exports.BRANCH_DE_RESERVAS);
|
|
463
481
|
const linhas = [];
|
|
464
482
|
if (!p.atualizado)
|
|
465
|
-
linhas.push(
|
|
483
|
+
linhas.push(m.copiaLocal, '');
|
|
466
484
|
const feats = p.feats ?? [];
|
|
467
|
-
const numeros = feats.length === 0 ? [] : ['',
|
|
468
|
-
feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', ') + '. O próximo sai de: ork roadmap feat'];
|
|
485
|
+
const numeros = feats.length === 0 ? [] : ['', m.numerosDeFeat(feats.length, feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', '))];
|
|
469
486
|
if (p.reservas.length === 0) {
|
|
470
|
-
linhas.push(
|
|
487
|
+
linhas.push(m.nenhuma, ...numeros);
|
|
471
488
|
return linhas.join('\n');
|
|
472
489
|
}
|
|
473
|
-
linhas.push(
|
|
490
|
+
linhas.push(m.cabecalho);
|
|
474
491
|
const orfaDoItem = new Map(orfas.map((o) => [o.reserva.item, o]));
|
|
475
492
|
for (const r of p.reservas) {
|
|
476
493
|
const orfa = orfaDoItem.get(r.item);
|
|
477
|
-
const marca = orfa ?
|
|
494
|
+
const marca = orfa ? m.orfa(orfa.sucessora) : '';
|
|
478
495
|
linhas.push(`${r.item.padEnd(8)} ${r.por.slice(0, 19).padEnd(19)} ${r.maquina.slice(0, 15).padEnd(15)} ` +
|
|
479
496
|
`${(r.thread ?? '-').slice(0, 18).padEnd(18)} ${(0, horario_1.formatarDataHora)(r.desdeEm)}` + (r.nota ? ` ${r.nota}` : '') + marca);
|
|
480
497
|
}
|
|
481
498
|
if (orfas.length > 0)
|
|
482
|
-
linhas.push('',
|
|
499
|
+
linhas.push('', m.orfas(orfas.length));
|
|
483
500
|
linhas.push(...numeros, '', (0, horario_1.legendaDoFuso)());
|
|
484
501
|
return linhas.join('\n');
|
|
485
502
|
}
|
package/dist/roadmap-status.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TETO_DO_FECHO = exports.GRUPO_DO_CICLO = exports.GRUPOS_DO_ROADMAP = exports.CONTRATO_STATUS_DO_ROADMAP = void 0;
|
|
4
4
|
exports.esperaDoDono = esperaDoDono;
|
|
5
|
+
exports.esperaVoce = esperaVoce;
|
|
5
6
|
exports.fatosLocais = fatosLocais;
|
|
6
7
|
exports.batidaDaFabrica = batidaDaFabrica;
|
|
7
8
|
exports.montarStatusDoRoadmap = montarStatusDoRoadmap;
|
|
@@ -26,6 +27,11 @@ exports.textoDoStatusDoRoadmap = textoDoStatusDoRoadmap;
|
|
|
26
27
|
* RM-054: o montador recebe FATOS de thread (`FatoDeThread`), nao so as threads deste disco. O
|
|
27
28
|
* relatorio local continua com os fatos locais; o panorama da rede soma os retratos das outras
|
|
28
29
|
* maquinas, e so ai o fecho diz entre parenteses em que maquina a thread anda.
|
|
30
|
+
*
|
|
31
|
+
* RM-063 (F2): o fecho so diz "sigo <thread> na fase <F>" com sessao viva verificada no runtime
|
|
32
|
+
* (`vida-da-thread.ts`) ou com o processo do condutor conduzindo agora; sessao fantasma, despacho falho ou
|
|
33
|
+
* nenhuma sessao viram "<thread> parada desde HH:MM: <motivo>". E "O que precisa de voce" le a MESMA fila do `ork pulse` (`precisaDeHumanoAgora`),
|
|
34
|
+
* que o CLI e o MCP passam: com item do dono na fila, o fecho nunca diz "Nada agora".
|
|
29
35
|
*/
|
|
30
36
|
const docs_1 = require("./docs");
|
|
31
37
|
const ledger_1 = require("./ledger");
|
|
@@ -42,6 +48,10 @@ const manifest_1 = require("./manifest");
|
|
|
42
48
|
const maquina_1 = require("./maquina");
|
|
43
49
|
const parado_no_condutor_1 = require("./parado-no-condutor");
|
|
44
50
|
const util_1 = require("./util");
|
|
51
|
+
const impedimento_1 = require("./impedimento");
|
|
52
|
+
const ocupacao_1 = require("./ocupacao");
|
|
53
|
+
const locale_1 = require("./locale");
|
|
54
|
+
const vida_da_thread_1 = require("./vida-da-thread");
|
|
45
55
|
exports.CONTRATO_STATUS_DO_ROADMAP = 'ork.roadmap-status/v1';
|
|
46
56
|
/** Os grupos, na ordem e com os icones que o dono aprovou. */
|
|
47
57
|
exports.GRUPOS_DO_ROADMAP = Object.freeze([
|
|
@@ -117,13 +127,31 @@ function esperaDoDono(raiz, t, quando) {
|
|
|
117
127
|
}
|
|
118
128
|
return undefined;
|
|
119
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* R3 (RM-049): a thread espera o dono, pela regra de `esperaDoDono` ou pela do monitor e do pulse
|
|
132
|
+
* (`ehEsperaDoDono`): a escalada `human.pending` ou o impedimento do despacho que so o dono resolve,
|
|
133
|
+
* ainda sem evento que destrave. O fim de turno sem pergunta continua do condutor. Leitura pura.
|
|
134
|
+
*/
|
|
135
|
+
function esperaVoce(raiz, t, quando) {
|
|
136
|
+
if (t.status === 'fechada')
|
|
137
|
+
return false;
|
|
138
|
+
if (esperaDoDono(raiz, t, quando))
|
|
139
|
+
return true;
|
|
140
|
+
const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.id));
|
|
141
|
+
const doCondutor = (0, parado_no_condutor_1.esperaDoCondutor)(t, eventos, quando) !== null;
|
|
142
|
+
return eventos.some((e, i) => (0, impedimento_1.ehEsperaDoDono)(e) && !(doCondutor && e.motivo === 'human.pending') &&
|
|
143
|
+
!eventos.slice(i + 1).some(p => ocupacao_1.EVENTOS_QUE_DESTRAVAM.includes(p.tipo) || (0, ocupacao_1.ehAprovacaoHumana)(p)));
|
|
144
|
+
}
|
|
120
145
|
/**
|
|
121
146
|
* Os fatos das threads deste disco: `ship_done` do dia e espera do dono lidos do ledger local.
|
|
122
147
|
* `fuso`: o do projeto consultado, na visao da rede; sem ele, o do dono deste processo.
|
|
123
148
|
*/
|
|
124
|
-
function fatosLocais(raiz, quando, fuso) {
|
|
149
|
+
function fatosLocais(raiz, quando, fuso, opcoes = {}) {
|
|
125
150
|
const hoje = (0, horario_1.dataLocal)(quando, fuso);
|
|
126
151
|
const fatos = [];
|
|
152
|
+
// RM-063 (F2): o runtime e consultado uma vez por relatorio, e so quando alguma thread tem sessao a conferir.
|
|
153
|
+
let leitura;
|
|
154
|
+
const lerUmaVez = () => (leitura ??= (opcoes.runtime ?? (() => (0, vida_da_thread_1.lerRuntime)(raiz)))());
|
|
127
155
|
// RM-037 (fatia 4): o estado das entregas sai uma vez, sob demanda, do git local e do retrato de PRs do pulse.
|
|
128
156
|
let entregas;
|
|
129
157
|
const lerEntregas = () => {
|
|
@@ -160,7 +188,19 @@ function fatosLocais(raiz, quando, fuso) {
|
|
|
160
188
|
id: t.id, roadmap: t.roadmap ?? null, aberta: t.status !== 'fechada', fase: t.faseAtual,
|
|
161
189
|
entregueHoje: () => (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.id)).some(e => e.tipo === 'ship_done' && (0, horario_1.dataLocal)(e.ts, fuso) === hoje),
|
|
162
190
|
espera: () => esperaDoDono(raiz, t, quando),
|
|
191
|
+
esperaVoce: () => esperaVoce(raiz, t, quando),
|
|
163
192
|
entrega: () => (t.status === 'fechada' ? undefined : entrega(t.id)),
|
|
193
|
+
vida: () => {
|
|
194
|
+
if (t.status === 'fechada')
|
|
195
|
+
return undefined;
|
|
196
|
+
try {
|
|
197
|
+
return (0, vida_da_thread_1.vidaDaThread)(t, (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.id)), lerUmaVez, Date.parse(quando));
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
const causa = { tipo: 'naoLida', detalhe: e.message.slice(0, 80) };
|
|
201
|
+
return { viva: false, sessionId: null, desdeEm: null, motivo: (0, vida_da_thread_1.motivoDaCausa)(causa), causa };
|
|
202
|
+
}
|
|
203
|
+
},
|
|
164
204
|
});
|
|
165
205
|
}
|
|
166
206
|
return fatos;
|
|
@@ -169,7 +209,8 @@ function fatosLocais(raiz, quando, fuso) {
|
|
|
169
209
|
function entregaNoStatus(e) {
|
|
170
210
|
if (!e || (!e.resumo && !e.parado))
|
|
171
211
|
return undefined;
|
|
172
|
-
|
|
212
|
+
// RM-063 (F2): o lease de sessao nao prova trabalho (a K7 morta seguia com ele); quem diz e a vida da sessao no runtime.
|
|
213
|
+
return { estado: e.resumo, ...(e.conduzidaAgora && e.donoDaConducao !== 'sessao' ? { conduzida: true } : {}),
|
|
173
214
|
...(e.parado ? { parado: { desdeEm: e.parado.desdeEm, proximoPasso: e.parado.proximoPasso,
|
|
174
215
|
...(e.parado.prLidoEm ? { prLidoEm: e.parado.prLidoEm } : {}) } } : {}),
|
|
175
216
|
...(e.prLidoEm ? { prLidoEm: e.prLidoEm } : {}) };
|
|
@@ -185,7 +226,7 @@ function batidaDaFabrica(carregado, quando) {
|
|
|
185
226
|
// a 2.45 ignora o GIT_NO_LAZY_FETCH, entao o clone parcial nem e lido aqui (N4 da seguranca, rodada 2).
|
|
186
227
|
// N4 da seguranca (rodada 3): o git novo registra o clone parcial no `remote.<r>.promisor`, o velho no `extensions`.
|
|
187
228
|
if ((0, util_1.exec)('git', ['config', '--get-regexp', '^(extensions\\.partialclone|remote\\..+\\.promisor)$'], carregado.raiz).stdout.trim()) {
|
|
188
|
-
return { lido: false, motivo:
|
|
229
|
+
return { lido: false, motivo: (0, locale_1.textoDoCatalogo)((m) => m.roadmap.fabricaClone(fabrica_estado_1.BRANCH_DA_FABRICA)), semBatida: [] };
|
|
189
230
|
}
|
|
190
231
|
const antes = process.env.GIT_NO_LAZY_FETCH;
|
|
191
232
|
process.env.GIT_NO_LAZY_FETCH = '1';
|
|
@@ -194,7 +235,7 @@ function batidaDaFabrica(carregado, quando) {
|
|
|
194
235
|
painel = (0, fabrica_estado_1.lerFabrica)(carregado.raiz, { remoto: carregado.manifesto.fabrica.remoto, semRemoto: true });
|
|
195
236
|
}
|
|
196
237
|
catch {
|
|
197
|
-
return { lido: false, motivo:
|
|
238
|
+
return { lido: false, motivo: (0, locale_1.textoDoCatalogo)((m) => m.roadmap.fabricaIlegivel(fabrica_estado_1.BRANCH_DA_FABRICA)), semBatida: [] };
|
|
198
239
|
}
|
|
199
240
|
finally {
|
|
200
241
|
if (antes === undefined)
|
|
@@ -237,8 +278,17 @@ function montarStatusDoRoadmap(raiz, opcoes = {}) {
|
|
|
237
278
|
catch {
|
|
238
279
|
hitlDeConducao = undefined;
|
|
239
280
|
}
|
|
240
|
-
|
|
241
|
-
|
|
281
|
+
let fila;
|
|
282
|
+
if (opcoes.fila) {
|
|
283
|
+
try {
|
|
284
|
+
fila = opcoes.fila(quando);
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
fila = { lida: false, detalhe: e.message.slice(0, 160), itens: [] };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return montarStatusDeFatos((0, docs_1.carregarDocs)(raiz).docs, fatosLocais(raiz, quando, undefined, { runtime: opcoes.runtime }), { quando, projeto: opcoes.projeto, consulta: opcoes.consulta,
|
|
291
|
+
...(fabrica ? { fabrica } : {}), ...(hitlDeConducao ? { hitlDeConducao } : {}), ...(fila ? { fila } : {}) });
|
|
242
292
|
}
|
|
243
293
|
/** O relatorio a partir das paginas do roadmap e dos fatos das threads, de onde quer que venham. */
|
|
244
294
|
function montarStatusDeFatos(docs, fatos, opcoes) {
|
|
@@ -264,8 +314,11 @@ function montarStatusDeFatos(docs, fatos, opcoes) {
|
|
|
264
314
|
}
|
|
265
315
|
// RM-037 (fatia 4): a thread que diz o estado real vem primeiro: a parada no condutor, depois a entrega em curso.
|
|
266
316
|
const entregas = new Map(abertas.map(f => [f.id, f.entrega?.()]));
|
|
267
|
-
|
|
317
|
+
// RM-063 (F2): sem parada nem entrega a dizer, a thread com sessao viva vem antes das paradas.
|
|
318
|
+
const conduz = abertas.find(f => entregas.get(f.id)?.parado) ?? abertas.find(f => entregas.get(f.id)?.estado) ??
|
|
319
|
+
abertas.find(f => f.vida?.()?.viva) ?? abertas[0];
|
|
268
320
|
const entrega = conduz ? entregas.get(conduz.id) : undefined;
|
|
321
|
+
const vida = conduz?.vida?.();
|
|
269
322
|
const emAberto = exports.GRUPO_DO_CICLO[ciclo] === 'disponiveis' ? [
|
|
270
323
|
...(texto(estado.exposicao) && texto(estado.exposicao) !== 'Geral' ? [`exposição ${texto(estado.exposicao)}`] : []),
|
|
271
324
|
...(texto(estado.habilitacao) && texto(estado.habilitacao) !== 'Concluída' ? [`habilitação ${texto(estado.habilitacao)}`] : []),
|
|
@@ -275,19 +328,36 @@ function montarStatusDeFatos(docs, fatos, opcoes) {
|
|
|
275
328
|
grupo: entregueHoje ? 'hoje' : exports.GRUPO_DO_CICLO[ciclo] ?? 'proposto',
|
|
276
329
|
emAberto, threads: ligadas,
|
|
277
330
|
...(conduz ? { conduzindo: { thread: conduz.id, fase: conduz.fase, ...(conduz.maquina ? { maquina: conduz.maquina } : {}),
|
|
278
|
-
...(entrega ? { entrega } : {}) } } : {}),
|
|
331
|
+
...(entrega ? { entrega } : {}), ...(vida ? { vida } : {}) } } : {}),
|
|
279
332
|
...(hitl ? { hitl } : {}),
|
|
280
333
|
});
|
|
281
334
|
}
|
|
282
335
|
const grupos = exports.GRUPOS_DO_ROADMAP.map(g => ({ ...g, itens: itens.filter(i => i.grupo === g.id) }));
|
|
336
|
+
// R3 (RM-049): a thread aberta que nao conduz item nenhum e espera o dono. O relatorio continua por item;
|
|
337
|
+
// isto so evita que "O que precisa de voce" negue o que o pulse mostra.
|
|
338
|
+
const doRoadmap = new Set(itens.flatMap(i => i.threads));
|
|
339
|
+
const fora = fatos.filter(f => f.aberta && !doRoadmap.has(f.id) && (f.esperaVoce ? f.esperaVoce() : !!f.espera()))
|
|
340
|
+
.map(f => f.id).sort();
|
|
341
|
+
const precisaDeVoce = itens.filter(i => i.hitl).map(i => ({ item: i.id, espera: i.hitl }));
|
|
342
|
+
// RM-063 (F2): a fila do pulse entra no fecho com o que ele ainda nao dizia; a thread que espera o dono sai do "sigo".
|
|
343
|
+
const ditas = new Set([...precisaDeVoce.map(x => x.espera.thread), ...fora]);
|
|
344
|
+
const itemDaThread = new Map(itens.flatMap(i => i.threads.map(t => [t, i.id])));
|
|
345
|
+
const daFila = (opcoes.fila?.itens ?? []).filter(x => !(x.thread && ditas.has(x.thread)))
|
|
346
|
+
.map(x => (x.thread && itemDaThread.has(x.thread) ? { ...x, item: itemDaThread.get(x.thread) } : x));
|
|
347
|
+
const esperamODono = new Set(daFila.map(x => x.thread).filter((t) => !!t));
|
|
348
|
+
const fila = opcoes.fila;
|
|
283
349
|
return {
|
|
284
350
|
contrato: exports.CONTRATO_STATUS_DO_ROADMAP, consultadoEm: quando,
|
|
285
351
|
projeto: opcoes.projeto ?? 'projeto', grupos,
|
|
286
|
-
precisaDeVoce
|
|
287
|
-
emSeguida: itens.filter(i => i.conduzindo && !i.hitl
|
|
352
|
+
precisaDeVoce,
|
|
353
|
+
emSeguida: itens.filter(i => i.conduzindo && !i.hitl && !esperamODono.has(i.conduzindo.thread))
|
|
354
|
+
.map(i => ({ item: i.id, ...i.conduzindo })),
|
|
288
355
|
...(opcoes.consulta ? { consulta: opcoes.consulta } : {}),
|
|
289
356
|
...(opcoes.fabrica ? { fabrica: opcoes.fabrica } : {}),
|
|
290
357
|
...(opcoes.hitlDeConducao ? { hitlDeConducao: opcoes.hitlDeConducao } : {}),
|
|
358
|
+
...(fora.length ? { foraDoRoadmap: { threads: fora } } : {}),
|
|
359
|
+
...(fila && (!fila.lida || daFila.length) ? { filaDoDono: { lida: fila.lida,
|
|
360
|
+
...(!fila.lida && fila.detalhe ? { detalhe: fila.detalhe } : {}), itens: daFila } } : {}),
|
|
291
361
|
};
|
|
292
362
|
}
|
|
293
363
|
/** "orkastery" vira "Orkastery": o titulo diz o nome do projeto como gente escreve. */
|
|
@@ -299,35 +369,52 @@ const naMaquina = (maquina) => maquina ? ` (${maquina})` : '';
|
|
|
299
369
|
* proximo passo; entrega em curso, com o estado do PR e a hora em que ele foi lido; sem nada disso, a fase.
|
|
300
370
|
*/
|
|
301
371
|
function linhaDoQueVem(x, agora, fuso) {
|
|
372
|
+
const m = (0, locale_1.msg)().roadmap;
|
|
302
373
|
const e = x.entrega;
|
|
303
374
|
if (e?.parado) {
|
|
304
375
|
const { prLidoEm: lido } = e.parado;
|
|
305
376
|
return `• ${x.item}: ${(0, hitl_resumo_1.linhaDoParadoNoCondutor)({ thread: x.thread, ...e.parado }, { agora, fuso })}${naMaquina(x.maquina)}` +
|
|
306
|
-
`${lido ?
|
|
307
|
-
}
|
|
308
|
-
if (e?.estado) {
|
|
309
|
-
const { prLidoEm: lido } = e;
|
|
310
|
-
const daLeitura = lido ? ` (PR lido às ${(0, horario_1.formatarHora)(lido, { agora, fuso })})` : '';
|
|
311
|
-
return e.conduzida ? `• ${x.item}: sigo ${x.thread} na fase ${x.fase}${naMaquina(x.maquina)}; ${e.estado}${daLeitura}.`
|
|
312
|
-
: `• ${x.item}: ${x.thread} na fase ${x.fase}${naMaquina(x.maquina)}, ${e.estado}${daLeitura}.`;
|
|
377
|
+
`${lido ? m.prLido((0, horario_1.formatarHora)(lido, { agora, fuso })) : ''}.`;
|
|
313
378
|
}
|
|
314
|
-
|
|
379
|
+
const daLeitura = e?.estado && e.prLidoEm ? m.prLido((0, horario_1.formatarHora)(e.prLidoEm, { agora, fuso })) : '';
|
|
380
|
+
const maquina = naMaquina(x.maquina);
|
|
381
|
+
const linha = (sigo) => e?.estado
|
|
382
|
+
? (sigo ? m.sigoComEstado(x.item, x.thread, x.fase, maquina, e.estado, daLeitura) : m.comEstado(x.item, x.thread, x.fase, maquina, e.estado, daLeitura))
|
|
383
|
+
: (sigo ? m.sigo(x.item, x.thread, x.fase, maquina) : m.semSessaoVerificada(x.item, x.thread, x.fase, maquina));
|
|
384
|
+
const v = x.vida;
|
|
385
|
+
// Sem `vida` (status montado sem ela), a linha de antes: "sigo" sem entrega, ou com o processo do condutor.
|
|
386
|
+
if (!v)
|
|
387
|
+
return linha(!e?.estado || !!e.conduzida);
|
|
388
|
+
// RM-063 (F2): "sigo" so com a sessao viva verificada no runtime ou com o processo do condutor conduzindo agora; sem
|
|
389
|
+
// isso, a parada com o desde e o motivo; sem motivo (retrato que nao publica a sessao), nada foi verificado.
|
|
390
|
+
if (v.viva || e?.conduzida)
|
|
391
|
+
return linha(true);
|
|
392
|
+
if (!v.motivo)
|
|
393
|
+
return linha(false);
|
|
394
|
+
return m.parada(x.item, x.thread, maquina, v.desdeEm && Number.isFinite(Date.parse(v.desdeEm)) ? (0, horario_1.formatarHora)(v.desdeEm, { agora, fuso }) : null, v.causa ? (0, vida_da_thread_1.motivoDaCausa)(v.causa, m.motivoDaParada) : v.motivo, e?.estado ? `${e.estado}${daLeitura}` : null);
|
|
395
|
+
}
|
|
396
|
+
/** RM-063 (F2): um item da fila do pulse no fecho, numa linha: quem, a pergunta e o que responder. */
|
|
397
|
+
function linhaDaFila(x) {
|
|
398
|
+
const m = (0, locale_1.msg)().roadmap;
|
|
399
|
+
const quem = x.item ? `${x.item} (${x.thread}${x.fase ? `, ${x.fase}` : ''})`
|
|
400
|
+
: x.thread ? `${x.thread}${x.fase ? ` (${x.fase})` : ''}` : m.sessaoSemThread((x.sessionId ?? '?').slice(0, 8));
|
|
401
|
+
const pergunta = x.pergunta.trim();
|
|
402
|
+
return `• ${quem}: ${pergunta}${/[.?!…]$/u.test(pergunta) ? '' : '.'}${x.comando ? m.responder(x.comando) : ''}`;
|
|
315
403
|
}
|
|
316
404
|
/** RM-037 (fatia 4, D8): uma linha so para a fabrica, e so quando ha o que avisar. */
|
|
317
405
|
function linhaDaFabrica(f, agora, fuso) {
|
|
318
406
|
if (!f)
|
|
319
407
|
return [];
|
|
408
|
+
const m = (0, locale_1.msg)().roadmap;
|
|
320
409
|
if (!f.lido)
|
|
321
|
-
return [
|
|
410
|
+
return [m.fabricaNaoLida(f.motivo !== undefined ? (0, locale_1.remontar)(f.motivo) : m.fabricaSemCopia(fabrica_estado_1.BRANCH_DA_FABRICA))];
|
|
322
411
|
if (f.copiaVelha) {
|
|
323
412
|
const { ultimoDestaMaquina: ultimo } = f.copiaVelha;
|
|
324
|
-
return [
|
|
325
|
-
`${(0, horario_1.formatarDataHora)(ultimo, { agora, fuso })}` : 'esta máquina não aparece nela'}); não dá para dizer quem está sem batida.`];
|
|
413
|
+
return [m.fabricaVelha(fabrica_estado_1.BRANCH_DA_FABRICA, ultimo ? (0, horario_1.formatarDataHora)(ultimo, { agora, fuso }) : null)];
|
|
326
414
|
}
|
|
327
415
|
if (!f.semBatida.length)
|
|
328
416
|
return [];
|
|
329
|
-
return [
|
|
330
|
-
`(último retrato ${(0, horario_1.formatarDataHora)(m.publicadoEm, { agora, fuso })})`).join('; ')}, pela cópia local de ${fabrica_estado_1.BRANCH_DA_FABRICA}.`];
|
|
417
|
+
return [m.fabricaSemBatida(f.semBatida.map(x => m.semBatida(x.maquina, (0, horario_1.duracaoCurta)(x.idadeMin), (0, horario_1.formatarDataHora)(x.publicadoEm, { agora, fuso }))).join('; '), fabrica_estado_1.BRANCH_DA_FABRICA)];
|
|
331
418
|
}
|
|
332
419
|
/**
|
|
333
420
|
* O texto do relatorio, igual em todo canal: os icones sao parte do formato aprovado. `fuso`: o do
|
|
@@ -346,23 +433,32 @@ function textoDoStatusDoRoadmap(s, fuso, opcoes = {}) {
|
|
|
346
433
|
? ` (${i.conduzindo.fase}${i.conduzindo.maquina ? `, ${i.conduzindo.maquina}` : ''})` : '';
|
|
347
434
|
return `• ${i.id} ${i.titulo}${detalhe}${i.hitl ? ' #HITL' : ''}`;
|
|
348
435
|
};
|
|
349
|
-
const
|
|
436
|
+
const m = (0, locale_1.msg)().roadmap;
|
|
437
|
+
const cortar = (lista, f) => [...lista.slice(0, exports.TETO_DO_FECHO).map(f), ...(lista.length > exports.TETO_DO_FECHO ? [m.eMais(lista.length - exports.TETO_DO_FECHO)] : [])];
|
|
350
438
|
return [
|
|
351
|
-
|
|
439
|
+
m.titulo(capitalizar(s.projeto), p),
|
|
352
440
|
...(opcoes.legenda === false ? [] : [(0, horario_1.legendaDoFuso)(fuso, s.consultadoEm)]),
|
|
353
441
|
// RM-052: logo abaixo do titulo aprovado (e do fuso), qual projeto foi lido e o que nao foi.
|
|
354
442
|
...(s.consulta ? (0, projeto_alvo_1.linhasDaConsulta)(s.consulta) : []),
|
|
355
443
|
...linhaDaFabrica(s.fabrica, s.consultadoEm, fuso),
|
|
356
|
-
|
|
357
|
-
'', '
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
444
|
+
// RM-061 (F2b, D4): o titulo do grupo e dado do contrato; a impressao o traduz pelo id.
|
|
445
|
+
...s.grupos.filter(g => g.itens.length).flatMap(g => ['', `${g.icone} ${(0, locale_1.localeAtivo)() === 'pt-BR' ? g.titulo : m.grupos[g.id] ?? g.titulo}`,
|
|
446
|
+
...g.itens.map(linhaDoItem)]),
|
|
447
|
+
'', m.precisaDeVoce,
|
|
448
|
+
...cortar(s.precisaDeVoce, x => `• ${x.item}${naMaquina(x.espera.maquina)}: ${x.espera.pergunta}` +
|
|
449
|
+
(x.espera.codigo ? m.responda(x.espera.codigo, x.espera.recomendada ?? 'a') : m.chegaNoResumo)),
|
|
450
|
+
// RM-063 (F2): a fila do pulse, com o que ainda nao foi dito; a que nao foi lida inteira e dita, nunca "Nada agora".
|
|
451
|
+
...cortar(s.filaDoDono?.itens ?? [], linhaDaFila),
|
|
452
|
+
...(s.filaDoDono && !s.filaDoDono.lida ? [m.filaNaoLida(s.filaDoDono.detalhe ?? null)] : []),
|
|
453
|
+
// R3 (RM-049): so quando ha; o detalhe de cada thread esta no `ork pulse`.
|
|
454
|
+
...(s.foraDoRoadmap?.threads.length ? [m.foraDoRoadmap(s.foraDoRoadmap.threads.length)] : []),
|
|
455
|
+
// RM-063 (F2): "Nada agora" so quando nada do dono foi dito acima (substitui a alternativa a da R3).
|
|
456
|
+
...(!s.precisaDeVoce.length && !s.filaDoDono && !s.foraDoRoadmap?.threads.length ? [m.nadaAgora] : []),
|
|
361
457
|
// RM-057 (fatia 3): ha quanto tempo cada pergunta de conducao parou a thread, e a mediana da semana.
|
|
362
|
-
...(s.hitlDeConducao ? [
|
|
458
|
+
...(s.hitlDeConducao ? [m.hitlDeConducao(s.hitlDeConducao.abertas.length, (0, hitl_tempo_parado_1.textoDaMediana)(s.hitlDeConducao)),
|
|
363
459
|
...cortar(s.hitlDeConducao.abertas, a => ` ${(0, hitl_tempo_parado_1.linhaDaPerguntaParada)(a, { agora: s.consultadoEm, fuso })}.`)] : []),
|
|
364
|
-
'',
|
|
460
|
+
'', m.emSeguida,
|
|
365
461
|
...(s.emSeguida.length ? cortar(s.emSeguida, x => linhaDoQueVem(x, s.consultadoEm, fuso))
|
|
366
|
-
: [
|
|
462
|
+
: [m.nadaEmAndamento]),
|
|
367
463
|
].join('\n');
|
|
368
464
|
}
|
package/dist/runtime-ambiente.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENVS_DE_PROVIDER_PAGO = void 0;
|
|
4
4
|
exports.nomesDeProviderAtivos = nomesDeProviderAtivos;
|
|
5
|
+
exports.sessaoDespachada = sessaoDespachada;
|
|
5
6
|
exports.ambienteDeAssinatura = ambienteDeAssinatura;
|
|
6
7
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
7
8
|
/**
|
|
@@ -27,6 +28,10 @@ function nomesDeProviderAtivos(base = process.env) {
|
|
|
27
28
|
*/
|
|
28
29
|
exports.ENV_IDENTIDADE_DE_DESPACHO = 'ORK_DISPATCH_ID';
|
|
29
30
|
exports.ENV_THREAD_DO_DESPACHO = 'ORK_DISPATCH_THREAD';
|
|
31
|
+
/** O processo roda numa sessao despachada pelo `ork`: a identidade ou a thread do despacho estao no ambiente. */
|
|
32
|
+
function sessaoDespachada(env = process.env) {
|
|
33
|
+
return (env[exports.ENV_IDENTIDADE_DE_DESPACHO] ?? '').trim() !== '' || (env[exports.ENV_THREAD_DO_DESPACHO] ?? '').trim() !== '';
|
|
34
|
+
}
|
|
30
35
|
/** Copia, sem alterar o ambiente em que as policies ainda precisam ser avaliadas. */
|
|
31
36
|
function ambienteDeAssinatura(base = process.env) {
|
|
32
37
|
const env = { ...base };
|