@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/thread.js
CHANGED
|
@@ -39,6 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.TETO_DO_PEDIDO = exports.ARQUIVO_DO_PEDIDO = void 0;
|
|
42
43
|
exports.dirThreads = dirThreads;
|
|
43
44
|
exports.dirThread = dirThread;
|
|
44
45
|
exports.caminhoThread = caminhoThread;
|
|
@@ -57,7 +58,12 @@ exports.avisoDeThreadSemWorktree = avisoDeThreadSemWorktree;
|
|
|
57
58
|
exports.avisoDeWorktreeQueFalharia = avisoDeWorktreeQueFalharia;
|
|
58
59
|
exports.avisoDeChaveSemCommit = avisoDeChaveSemCommit;
|
|
59
60
|
exports.avisoDaWorktree = avisoDaWorktree;
|
|
61
|
+
exports.prepararPedido = prepararPedido;
|
|
62
|
+
exports.pedidoDaThread = pedidoDaThread;
|
|
60
63
|
exports.novaThread = novaThread;
|
|
64
|
+
exports.dependenciasPendentes = dependenciasPendentes;
|
|
65
|
+
exports.prepararDependenciasPendentes = prepararDependenciasPendentes;
|
|
66
|
+
exports.prepararDependenciasDaThread = prepararDependenciasDaThread;
|
|
61
67
|
exports.exigirVarianteCompativel = exigirVarianteCompativel;
|
|
62
68
|
exports.blocoDaThread = blocoDaThread;
|
|
63
69
|
exports.pausaNaThread = pausaNaThread;
|
|
@@ -67,20 +73,26 @@ exports.resumoDaThread = resumoDaThread;
|
|
|
67
73
|
exports.threadsDaListagem = threadsDaListagem;
|
|
68
74
|
exports.tabelaDeThreads = tabelaDeThreads;
|
|
69
75
|
exports.exigirFase = exigirFase;
|
|
76
|
+
const worktree_local_1 = require("./worktree-local");
|
|
70
77
|
const fs = __importStar(require("node:fs"));
|
|
71
78
|
const path = __importStar(require("node:path"));
|
|
72
79
|
const ciclos_1 = require("./ciclos");
|
|
73
80
|
const modos_1 = require("./modos");
|
|
74
81
|
const manifest_1 = require("./manifest");
|
|
75
82
|
const slug_1 = require("./slug");
|
|
83
|
+
const node_crypto_1 = require("node:crypto");
|
|
76
84
|
const types_1 = require("./types");
|
|
77
85
|
const util_1 = require("./util");
|
|
78
86
|
const ledger_1 = require("./ledger");
|
|
79
87
|
const estado_thread_1 = require("./estado-thread");
|
|
80
88
|
const creation_operation_store_1 = require("./creation-operation-store");
|
|
81
89
|
const horario_1 = require("./horario");
|
|
90
|
+
const check_modo_1 = require("./check-modo");
|
|
82
91
|
const maquina_1 = require("./maquina");
|
|
83
92
|
const conducao_texto_1 = require("./conducao-texto");
|
|
93
|
+
const locale_1 = require("./locale");
|
|
94
|
+
const branch_de_estado_1 = require("./branch-de-estado");
|
|
95
|
+
const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
|
|
84
96
|
/** Diretorio de threads do projeto. */
|
|
85
97
|
function dirThreads(raiz) {
|
|
86
98
|
return path.join((0, manifest_1.dirEstado)((0, estado_thread_1.raizDoEstado)(raiz)), 'threads');
|
|
@@ -108,7 +120,7 @@ function listarIds(raiz) {
|
|
|
108
120
|
function lerThread(raiz, id) {
|
|
109
121
|
const caminho = caminhoThread(raiz, id);
|
|
110
122
|
if (!fs.existsSync(caminho)) {
|
|
111
|
-
throw new
|
|
123
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.naoEncontrada(id, dirThreads(raiz)));
|
|
112
124
|
}
|
|
113
125
|
return (0, util_1.lerJson)(caminho);
|
|
114
126
|
}
|
|
@@ -133,11 +145,7 @@ function carimbarBase(raiz) {
|
|
|
133
145
|
function avisoDeThreadSemBase(thread, gravada) {
|
|
134
146
|
if (thread.base.commit !== util_1.COMMIT_DESCONHECIDO)
|
|
135
147
|
return null;
|
|
136
|
-
return gravada
|
|
137
|
-
? `Aviso: o repositório ainda não tem commit, e a thread ${thread.id} nasceu sem base: o ship não tem de onde partir. ` +
|
|
138
|
-
`Faça o primeiro commit, feche esta com ork thread close ${thread.id} --motivo engano --por <quem> ` +
|
|
139
|
-
'--justificativa "aberta antes do primeiro commit" e abra outra.'
|
|
140
|
-
: 'Aviso: o repositório ainda não tem commit, e a thread nasceria sem base: faça o primeiro commit antes de abrir a primeira thread.';
|
|
148
|
+
return (0, locale_1.msg)().thread.semBase(thread.id, gravada);
|
|
141
149
|
}
|
|
142
150
|
/** Resolve um id livre a partir do assunto normalizado (`<abbrev>-<assunto>`). */
|
|
143
151
|
function idDisponivel(raiz, abbrev, assunto) {
|
|
@@ -170,9 +178,11 @@ function alvoDaWorktree(carregado, id, slug, opcoes = {}) {
|
|
|
170
178
|
*/
|
|
171
179
|
function worktreePrevista(carregado, id, slug, opcoes = {}) {
|
|
172
180
|
const alvo = alvoDaWorktree(carregado, id, slug, opcoes);
|
|
181
|
+
const base = opcoes.base ?? carregado.manifesto.worktree.base_branch;
|
|
182
|
+
const remoto = (0, branch_de_estado_1.exigirRemoto)(carregado.manifesto.fabrica.remoto, 'worktree');
|
|
173
183
|
const refs = opcoes.branchExistente
|
|
174
184
|
? [opcoes.branchExistente]
|
|
175
|
-
: [
|
|
185
|
+
: [(0, branch_de_estado_1.refRemota)(remoto, base), base, 'HEAD'];
|
|
176
186
|
let commit = null;
|
|
177
187
|
for (const ref of refs) {
|
|
178
188
|
const r = (0, util_1.exec)('git', ['rev-parse', '--verify', ref], carregado.raiz);
|
|
@@ -187,6 +197,36 @@ function worktreePrevista(carregado, id, slug, opcoes = {}) {
|
|
|
187
197
|
: commit === null ? 'sem-commit' : branchJaExiste ? 'branch-existe' : null;
|
|
188
198
|
return { ...alvo, commit, falha };
|
|
189
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Resolve a base de uma worktree nova. Com remoto configurado e presente, a fonte e sempre
|
|
202
|
+
* `refs/remotes/<remoto>/<base>` atualizada por um fetch explicito; a branch local pode pertencer a
|
|
203
|
+
* outra worktree e ficar parada indefinidamente. Repositorio sem esse remoto preserva o caso local.
|
|
204
|
+
*/
|
|
205
|
+
function baseAtualDaWorktree(carregado, base) {
|
|
206
|
+
const { raiz, manifesto } = carregado;
|
|
207
|
+
const remoto = (0, branch_de_estado_1.exigirRemoto)(manifesto.fabrica.remoto, 'worktree');
|
|
208
|
+
const temRemoto = (0, util_1.exec)('git', ['remote', 'get-url', '--', remoto], raiz).ok;
|
|
209
|
+
let ref = base;
|
|
210
|
+
if (temRemoto) {
|
|
211
|
+
ref = (0, branch_de_estado_1.refRemota)(remoto, base);
|
|
212
|
+
const ambiente = { ...process.env, GIT_TERMINAL_PROMPT: '0',
|
|
213
|
+
GIT_SSH_COMMAND: process.env.GIT_SSH_COMMAND ?? 'ssh -o BatchMode=yes' };
|
|
214
|
+
const fetch = (0, util_1.exec)('git', ['fetch', '-q', '--no-tags', '--', remoto,
|
|
215
|
+
`+refs/heads/${base}:${ref}`], raiz, 120000, ambiente);
|
|
216
|
+
if (!fetch.ok) {
|
|
217
|
+
const saida = (fetch.stderr || fetch.stdout).trim().split('\n').slice(-2).join(' | ');
|
|
218
|
+
throw new locale_1.ErroDoCatalogo((m) => m.worktree.baseRemotaFalhou(remoto, base, saida));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const resolvida = (0, util_1.exec)('git', ['rev-parse', '--verify', ref], raiz);
|
|
222
|
+
if (!resolvida.ok) {
|
|
223
|
+
// Repositorio local ainda sem a branch do manifesto conserva a recusa historica do
|
|
224
|
+
// `git worktree add ... HEAD`; com remoto presente, o fetch acima ja teria recusado.
|
|
225
|
+
const head = (0, util_1.exec)('git', ['rev-parse', '--verify', 'HEAD'], raiz);
|
|
226
|
+
return { ref: 'HEAD', commit: head.ok ? head.stdout.trim() : util_1.COMMIT_DESCONHECIDO };
|
|
227
|
+
}
|
|
228
|
+
return { ref, commit: resolvida.stdout.trim() };
|
|
229
|
+
}
|
|
190
230
|
/**
|
|
191
231
|
* Cria a worktree isolada da thread (paralelismo sem colisao entre threads).
|
|
192
232
|
*
|
|
@@ -196,33 +236,42 @@ function worktreePrevista(carregado, id, slug, opcoes = {}) {
|
|
|
196
236
|
*/
|
|
197
237
|
function criarWorktree(carregado, id, slug, opcoes = {}) {
|
|
198
238
|
const { raiz, manifesto } = carregado;
|
|
239
|
+
// RM-047 (P3): worktree.dir do manifesto fora da raiz só cria checkout com a confirmação desta máquina.
|
|
240
|
+
(0, worktree_local_1.exigirPastaDasWorktrees)(raiz, manifesto);
|
|
199
241
|
const { dir, branch } = alvoDaWorktree(carregado, id, slug, opcoes);
|
|
200
242
|
if (fs.existsSync(dir)) {
|
|
201
|
-
throw new
|
|
243
|
+
throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeJaExisteEm(dir));
|
|
202
244
|
}
|
|
203
245
|
const base = opcoes.base ?? manifesto.worktree.base_branch;
|
|
204
|
-
const
|
|
205
|
-
|
|
246
|
+
const resolvida = opcoes.branchExistente
|
|
247
|
+
? (() => {
|
|
248
|
+
const r = (0, util_1.exec)('git', ['rev-parse', '--verify', opcoes.branchExistente], raiz);
|
|
249
|
+
if (!r.ok)
|
|
250
|
+
throw new locale_1.ErroDoCatalogo((m) => m.worktree.baseInexistente(opcoes.branchExistente));
|
|
251
|
+
return { ref: opcoes.branchExistente, commit: r.stdout.trim() };
|
|
252
|
+
})()
|
|
253
|
+
: baseAtualDaWorktree(carregado, base);
|
|
206
254
|
// Fatia 2 do ensaio da 0.5.0 (P3): a pasta das worktrees que o ork cria agora nasce fora do git.
|
|
207
255
|
const pastaDasWorktrees = path.dirname(dir);
|
|
208
256
|
const pastaNova = !fs.existsSync(pastaDasWorktrees);
|
|
209
257
|
// Branch nova (`-b`) no caso comum; branch que ja existe no ciclo `merge-branch`.
|
|
210
258
|
const argumentos = opcoes.branchExistente
|
|
211
259
|
? ['worktree', 'add', dir, opcoes.branchExistente]
|
|
212
|
-
: ['worktree', 'add', '-b', branch, dir, ref];
|
|
260
|
+
: ['worktree', 'add', '-b', branch, dir, resolvida.ref];
|
|
213
261
|
const r = (0, util_1.exec)('git', argumentos, raiz);
|
|
214
262
|
if (!r.ok) {
|
|
215
|
-
|
|
263
|
+
const saida = (r.stderr || r.stdout).trim();
|
|
264
|
+
throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeAddFalhou(saida));
|
|
216
265
|
}
|
|
217
266
|
if (pastaNova)
|
|
218
267
|
(0, util_1.ignorarPastaNoGit)(pastaDasWorktrees, (0, estado_thread_1.raizDoEstado)(raiz));
|
|
219
268
|
const lista = (0, util_1.exec)('git', ['worktree', 'list', '--porcelain'], raiz);
|
|
220
269
|
const criada = lista.ok && lista.stdout.split('\n').some((l) => l.trim() === `worktree ${dir}`);
|
|
221
270
|
if (!criada) {
|
|
222
|
-
throw new
|
|
271
|
+
throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeNaoApareceu(dir));
|
|
223
272
|
}
|
|
224
273
|
(0, estado_thread_1.vincularEstado)(raiz, id, dir);
|
|
225
|
-
return { dir, branch };
|
|
274
|
+
return { dir, branch, commit: resolvida.commit };
|
|
226
275
|
}
|
|
227
276
|
/**
|
|
228
277
|
* Resolve `--worktree`, `--sem-worktree` e `worktree.por_thread`. As flags vencem a chave; as duas juntas, ou
|
|
@@ -232,13 +281,12 @@ function criarWorktree(carregado, id, slug, opcoes = {}) {
|
|
|
232
281
|
function pedidoDeWorktree(flags, porThread) {
|
|
233
282
|
const worktree = flags.worktree === false ? undefined : flags.worktree;
|
|
234
283
|
if (typeof worktree === 'string' && !worktree.trim())
|
|
235
|
-
throw new Error(
|
|
236
|
-
if (typeof flags.semWorktree === 'string')
|
|
237
|
-
throw new Error(
|
|
238
|
-
}
|
|
284
|
+
throw new Error((0, locale_1.msg)().thread.worktreeVazia);
|
|
285
|
+
if (typeof flags.semWorktree === 'string')
|
|
286
|
+
throw new Error((0, locale_1.msg)().thread.semWorktreeComValor(flags.semWorktree));
|
|
239
287
|
const semWorktree = flags.semWorktree === true;
|
|
240
288
|
if (semWorktree && worktree !== undefined)
|
|
241
|
-
throw new Error(
|
|
289
|
+
throw new Error((0, locale_1.msg)().thread.worktreeESemWorktree);
|
|
242
290
|
if (semWorktree)
|
|
243
291
|
return { criar: false, dir: null, origem: 'sem-worktree' };
|
|
244
292
|
if (worktree === true || worktree === 'auto')
|
|
@@ -254,13 +302,12 @@ function pedidoDeWorktree(flags, porThread) {
|
|
|
254
302
|
function linhaDaWorktree(por, gravada, variante) {
|
|
255
303
|
if (!por || (gravada && por !== 'chave'))
|
|
256
304
|
return null;
|
|
257
|
-
const
|
|
258
|
-
if (por === 'chave')
|
|
259
|
-
return
|
|
260
|
-
}
|
|
305
|
+
const m = (0, locale_1.msg)().thread;
|
|
306
|
+
if (por === 'chave')
|
|
307
|
+
return m.worktreeChave(gravada);
|
|
261
308
|
if (por === 'flag')
|
|
262
|
-
return
|
|
263
|
-
return
|
|
309
|
+
return m.worktreeFlag(gravada);
|
|
310
|
+
return m.worktreeCiclo(gravada, variante ?? null);
|
|
264
311
|
}
|
|
265
312
|
/**
|
|
266
313
|
* P4 do ensaio da 0.5.0: o que acontece no SHIP com a thread criada por `--sem-worktree`. O `ork ship` entrega a
|
|
@@ -271,49 +318,27 @@ function linhaDaWorktree(por, gravada, variante) {
|
|
|
271
318
|
function avisoDeThreadSemWorktree(thread, manifesto, gravada = true) {
|
|
272
319
|
const base = manifesto.worktree.base_branch;
|
|
273
320
|
const branch = thread.base.branch;
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
if (
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
if (branch === 'HEAD') {
|
|
284
|
-
return `${inicio}, com o HEAD destacado, fora de qualquer branch, e o ork ship não tem branch de origem para entregar. ${ensure}.`;
|
|
285
|
-
}
|
|
286
|
-
if (branch !== base) {
|
|
287
|
-
return `${inicio}, na branch ${branch}, e o ork ship entrega essa branch como estiver, com o que mais entrar nela; ` +
|
|
288
|
-
`com --para ${branch}, a entrega vira push direto, que a policy push_direto_na_base confere. ${ensure}.`;
|
|
289
|
-
}
|
|
321
|
+
const aviso = (c) => (0, locale_1.msg)().thread.avisoSemWorktree(thread.id, gravada, c);
|
|
322
|
+
// Sem commit, nem o `ork worktree ensure` tem de onde partir: o caminho e o do aviso de thread sem base.
|
|
323
|
+
if (thread.base.commit === util_1.COMMIT_DESCONHECIDO)
|
|
324
|
+
return aviso({ caso: 'sem-commit' });
|
|
325
|
+
if (branch === 'HEAD')
|
|
326
|
+
return aviso({ caso: 'head' });
|
|
327
|
+
if (branch !== base)
|
|
328
|
+
return aviso({ caso: 'outra', branch });
|
|
290
329
|
const policy = manifesto.policies?.push_direto_na_base;
|
|
291
|
-
|
|
292
|
-
? 'o ork ship barra a entrega por push_direto_na_base (block): não há branch de thread para mergear'
|
|
293
|
-
: policy === undefined || policy === 'off'
|
|
294
|
-
? 'o ork ship empurra a base direto, sem branch de thread (push_direto_na_base desligada)'
|
|
295
|
-
: `o ork ship avisa push_direto_na_base (${policy}) e empurra a base direto, sem branch de thread`;
|
|
296
|
-
return `${inicio}, na branch base ${base}, e ${efeito}. ${ensure}; depois do GO, os commits já estão na base e o ship não os separa.`;
|
|
330
|
+
return aviso({ caso: 'base', base, policy: policy === undefined ? undefined : String(policy) });
|
|
297
331
|
}
|
|
298
332
|
/**
|
|
299
333
|
* P4 do ensaio da 0.5.0 (CHECK): no `--dry-run`, por que a criacao de verdade recusaria a worktree, em vez de preve-la.
|
|
300
334
|
* O ciclo que exige worktree nao aceita `--sem-worktree`, entao a saida so e sugerida para a chave e a flag.
|
|
301
335
|
*/
|
|
302
336
|
function avisoDeWorktreeQueFalharia(f) {
|
|
303
|
-
|
|
304
|
-
if (f.motivo === 'pasta-existe') {
|
|
305
|
-
return `Aviso: a pasta ${f.dir} já existe, e a criação de verdade recusaria a worktree da thread: tire a pasta${semWorktree}.`;
|
|
306
|
-
}
|
|
307
|
-
if (f.motivo === 'branch-existe') {
|
|
308
|
-
return `Aviso: a branch ${f.branch} já existe, e a criação de verdade recusaria a worktree da thread: tire a branch${semWorktree}.`;
|
|
309
|
-
}
|
|
310
|
-
return 'Aviso: o repositório ainda não tem commit, e a criação de verdade recusaria a worktree da thread no git worktree add: ' +
|
|
311
|
-
'faça o primeiro commit antes.';
|
|
337
|
+
return (0, locale_1.msg)().thread.worktreeFalharia(f.motivo, f.dir, f.branch, f.por === 'ciclo');
|
|
312
338
|
}
|
|
313
339
|
/** P4 do ensaio da 0.5.0: a worktree que a chave pede nao tem de onde partir num repositorio sem commit. */
|
|
314
340
|
function avisoDeChaveSemCommit(gravada) {
|
|
315
|
-
return
|
|
316
|
-
`a thread ${gravada ? 'nasceu' : 'nasceria'} na raiz do projeto, sem worktree.`;
|
|
341
|
+
return (0, locale_1.msg)().thread.chaveSemCommit(gravada);
|
|
317
342
|
}
|
|
318
343
|
/** P4: o aviso de worktree do `ork thread new`, para o stderr, ou `null` quando nao ha o que avisar. */
|
|
319
344
|
function avisoDaWorktree(origem, resultado, manifesto) {
|
|
@@ -323,11 +348,147 @@ function avisoDaWorktree(origem, resultado, manifesto) {
|
|
|
323
348
|
return avisoDeChaveSemCommit(resultado.gravada);
|
|
324
349
|
return null;
|
|
325
350
|
}
|
|
351
|
+
/** RM-059 (T6.0): o arquivo do pedido guardado, na pasta da thread. */
|
|
352
|
+
exports.ARQUIVO_DO_PEDIDO = 'pedido.md';
|
|
353
|
+
/**
|
|
354
|
+
* O prompt da fase vai inteiro como UM argumento do `claude --bg`, e o Linux recusa argumento acima de
|
|
355
|
+
* 128 KiB (MAX_ARG_STRLEN); o pedido fica com a metade, para o template caber junto.
|
|
356
|
+
*/
|
|
357
|
+
exports.TETO_DO_PEDIDO = 64 * 1024;
|
|
358
|
+
/** O pedido como ele vai ser guardado: sem espaco nas pontas, nao vazio e dentro do teto. */
|
|
359
|
+
function prepararPedido(bruto) {
|
|
360
|
+
const texto = bruto.trim();
|
|
361
|
+
if (!texto)
|
|
362
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.pedidoVazio);
|
|
363
|
+
const bytes = Buffer.byteLength(texto, 'utf8');
|
|
364
|
+
if (bytes > exports.TETO_DO_PEDIDO)
|
|
365
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.pedidoGrande(bytes, exports.TETO_DO_PEDIDO));
|
|
366
|
+
return { texto, meta: { arquivo: exports.ARQUIVO_DO_PEDIDO, sha256: (0, node_crypto_1.createHash)('sha256').update(texto, 'utf8').digest('hex'), bytes } };
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* RM-059 (T6.0): o pedido guardado na criacao da thread, conferido contra o sha256 gravado; `null` na
|
|
370
|
+
* thread criada sem pedido. Arquivo que falta ou que nao bate com o sha256 (editado fora do nucleo) e
|
|
371
|
+
* erro tipado: o render nunca usa um pedido sem a prova de que e o da criacao.
|
|
372
|
+
*/
|
|
373
|
+
function pedidoDaThread(raiz, thread) {
|
|
374
|
+
const meta = thread.pedido;
|
|
375
|
+
if (!meta)
|
|
376
|
+
return null;
|
|
377
|
+
const restaurar = 'passe --pedido no render ou restaure o arquivo';
|
|
378
|
+
// O nome do arquivo e fixo: um thread.json editado nao aponta o render para outro arquivo do projeto.
|
|
379
|
+
if (meta.arquivo !== exports.ARQUIVO_DO_PEDIDO || !/^[a-f0-9]{64}$/.test(String(meta.sha256))) {
|
|
380
|
+
throw new Error(`thread.pedido.divergente: o pedido da thread ${thread.id} no thread.json nao e o que a criacao grava; ${restaurar}`);
|
|
381
|
+
}
|
|
382
|
+
const arquivo = path.join(dirThread(raiz, thread.id), exports.ARQUIVO_DO_PEDIDO);
|
|
383
|
+
let fd;
|
|
384
|
+
try {
|
|
385
|
+
fd = fs.openSync(arquivo, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
|
|
386
|
+
}
|
|
387
|
+
catch (e) {
|
|
388
|
+
if (e.code === 'ENOENT')
|
|
389
|
+
throw new Error(`thread.pedido.ausente: a thread ${thread.id} guardou o pedido em ${meta.arquivo} e ele sumiu; ${restaurar}`);
|
|
390
|
+
throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao abre como arquivo comum; ${restaurar}`);
|
|
391
|
+
}
|
|
392
|
+
try {
|
|
393
|
+
const st = fs.fstatSync(fd);
|
|
394
|
+
if (!st.isFile() || st.size > exports.TETO_DO_PEDIDO)
|
|
395
|
+
throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao e o arquivo guardado; ${restaurar}`);
|
|
396
|
+
const bytes = fs.readFileSync(fd);
|
|
397
|
+
const sha256 = (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex');
|
|
398
|
+
if (sha256 !== meta.sha256) {
|
|
399
|
+
throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao bate com o sha256 gravado na criacao ` +
|
|
400
|
+
`(${(0, util_1.shaCurto)(meta.sha256)}): foi editado fora do nucleo; ${restaurar}`);
|
|
401
|
+
}
|
|
402
|
+
return { texto: bytes.toString('utf8'), sha256 };
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
fs.closeSync(fd);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Grava o pedido sem meio-termo: escreve num temporario com fsync e o liga ao nome final, que nao pode existir
|
|
410
|
+
* (o `link` recusa sobrescrever). Uma falha no meio nao deixa `pedido.md` pela metade.
|
|
411
|
+
*/
|
|
412
|
+
function gravarPedido(dir, texto) {
|
|
413
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
414
|
+
const alvo = path.join(dir, exports.ARQUIVO_DO_PEDIDO);
|
|
415
|
+
const temporario = path.join(dir, `.${exports.ARQUIVO_DO_PEDIDO}.${process.pid}.${Date.now()}.tmp`);
|
|
416
|
+
const fd = fs.openSync(temporario, 'wx', 0o600);
|
|
417
|
+
try {
|
|
418
|
+
try {
|
|
419
|
+
fs.writeFileSync(fd, texto, 'utf8');
|
|
420
|
+
fs.fsyncSync(fd);
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
fs.closeSync(fd);
|
|
424
|
+
}
|
|
425
|
+
fs.linkSync(temporario, alvo);
|
|
426
|
+
}
|
|
427
|
+
finally {
|
|
428
|
+
fs.rmSync(temporario, { force: true });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
326
431
|
/** Cria a thread: valida modo contra o manifesto, gera o slug e carimba a base. */
|
|
327
432
|
function novaThread(carregado, opcoes) {
|
|
328
433
|
if (opcoes.dryRun)
|
|
329
434
|
return criarThreadSerializada(carregado, opcoes);
|
|
330
|
-
|
|
435
|
+
const criada = (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(carregado.raiz), 'threads', () => criarThreadSerializada(carregado, opcoes));
|
|
436
|
+
// RM-037 (defeito 2 de 19 e 20/10/2026): o preparo das dependencias roda depois da trava de criacao, que espera
|
|
437
|
+
// segundos, e nao os minutos de um `npm ci`.
|
|
438
|
+
if (!criada.gravada || !criada.worktreePor || !criada.thread.worktree)
|
|
439
|
+
return criada;
|
|
440
|
+
if (opcoes.adiarDependencias) {
|
|
441
|
+
adiarDependenciasDaThread(carregado, criada.thread.id, criada.thread.worktree);
|
|
442
|
+
return { ...criada, dependencias: null };
|
|
443
|
+
}
|
|
444
|
+
return { ...criada, dependencias: prepararDependenciasDaThread(carregado, criada.thread.id, criada.thread.worktree) };
|
|
445
|
+
}
|
|
446
|
+
/** RM-037 (CHECK 3 da ork-rm037defeit2): a criacao que nao pode esperar o preparo so o anota como pendente. */
|
|
447
|
+
function adiarDependenciasDaThread(carregado, id, dir) {
|
|
448
|
+
const { dependencias } = carregado.manifesto.worktree;
|
|
449
|
+
if (!dependencias)
|
|
450
|
+
return;
|
|
451
|
+
(0, ledger_1.registrar)(dirThread(carregado.raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeDependenciasPendentes, { dir, comando: dependencias, fonte: 'worktree.dependencias do manifesto' });
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* RM-037 (CHECK 3 da ork-rm037defeit2): a worktree `dir` tem o preparo adiado na criacao sem um preparo ok depois dele? O
|
|
455
|
+
* preparo que falhou nao cobre: a baseline e o verify o repetem e recusam seguir enquanto ele falhar.
|
|
456
|
+
*/
|
|
457
|
+
function dependenciasPendentes(eventos, dir) {
|
|
458
|
+
let pendente = false;
|
|
459
|
+
for (const e of eventos) {
|
|
460
|
+
if (typeof e.dir !== 'string' || path.resolve(e.dir) !== path.resolve(dir))
|
|
461
|
+
continue;
|
|
462
|
+
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeDependenciasPendentes)
|
|
463
|
+
pendente = true;
|
|
464
|
+
else if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeDependencias && e.ok === true)
|
|
465
|
+
pendente = false;
|
|
466
|
+
}
|
|
467
|
+
return pendente;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* RM-037 (CHECK 3 da ork-rm037defeit2): roda o preparo que a criacao adiou, antes de a baseline ou o verify rodarem um
|
|
471
|
+
* comando, com a vez na fila pesada que eles ja seguram; `antes` so e chamado quando ha preparo a rodar (a renovacao da
|
|
472
|
+
* conducao pelo prazo dele), e o `executor` da operacao, quando ela traz um (o do sandbox do MCP), roda o preparo no lugar
|
|
473
|
+
* do executor do verify. Devolve o preparo rodado agora, ou `null` sem nada pendente; quem chama recusa a falha.
|
|
474
|
+
*/
|
|
475
|
+
function prepararDependenciasPendentes(carregado, id, dir, opcoes = {}) {
|
|
476
|
+
if (!dependenciasPendentes((0, ledger_1.lerLedger)(dirThread(carregado.raiz, id)), dir))
|
|
477
|
+
return null;
|
|
478
|
+
opcoes.antes?.();
|
|
479
|
+
return prepararDependenciasDaThread(carregado, id, dir, opcoes.executor);
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* RM-037 (defeito 2 de 19 e 20/10/2026): roda `worktree.dependencias` na worktree que acabou de nascer e grava o
|
|
483
|
+
* resultado no ledger da thread. Sem a chave no manifesto, nada roda e nada se grava. A falha nao desfaz nada.
|
|
484
|
+
*/
|
|
485
|
+
function prepararDependenciasDaThread(carregado, id, dir, executor) {
|
|
486
|
+
const comando = carregado.manifesto.worktree.dependencias;
|
|
487
|
+
if (!comando)
|
|
488
|
+
return null;
|
|
489
|
+
const preparo = (0, dependencias_da_worktree_1.prepararDependencias)(dir, comando, undefined, executor);
|
|
490
|
+
(0, ledger_1.registrar)(dirThread(carregado.raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeDependencias, (0, dependencias_da_worktree_1.eventoDoPreparo)(dir, preparo));
|
|
491
|
+
return preparo;
|
|
331
492
|
}
|
|
332
493
|
/**
|
|
333
494
|
* I-42 (D12): variante que redesenha blocos nao cabe num modo de bloco unico e parcial.
|
|
@@ -342,21 +503,23 @@ function exigirVarianteCompativel(variante, def) {
|
|
|
342
503
|
return;
|
|
343
504
|
const [unico, ...resto] = def.blocos;
|
|
344
505
|
if (unico && resto.length === 0 && unico.fases.length < types_1.FASES.length) {
|
|
345
|
-
throw new
|
|
346
|
-
`(${unico.fases.join('-')}): crie a thread sem --ciclo ou escolha um modo de ciclo completo`);
|
|
506
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.varianteIncompativel(variante, def.tag, unico.fases.join('-')));
|
|
347
507
|
}
|
|
348
508
|
}
|
|
349
509
|
function criarThreadSerializada(carregado, opcoes) {
|
|
350
510
|
const { raiz, manifesto } = carregado;
|
|
351
511
|
const permitidos = manifesto.conduction.allowed_modes;
|
|
352
512
|
if (!permitidos.includes(opcoes.modo)) {
|
|
353
|
-
|
|
354
|
-
|
|
513
|
+
const tag = modos_1.MODOS[opcoes.modo].tag, lista = permitidos.map((p) => modos_1.MODOS[p].tag).join(', ');
|
|
514
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.modoNaoPermitido(tag, lista));
|
|
355
515
|
}
|
|
356
516
|
const assuntoBruto = (0, slug_1.normalizarAssunto)(opcoes.assunto ?? opcoes.nome);
|
|
357
517
|
if (!assuntoBruto) {
|
|
358
|
-
|
|
518
|
+
const nome = opcoes.nome;
|
|
519
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.nomeSemAssunto(nome));
|
|
359
520
|
}
|
|
521
|
+
// RM-059 (T6.0): o pedido e conferido antes de qualquer gravacao, tambem no ensaio.
|
|
522
|
+
const pedido = opcoes.pedido !== undefined ? prepararPedido(opcoes.pedido) : null;
|
|
360
523
|
const abbrev = manifesto.project.abbrev;
|
|
361
524
|
const def = (0, modos_1.definicaoDoModo)(opcoes.modo);
|
|
362
525
|
const variante = opcoes.variante ?? null;
|
|
@@ -368,17 +531,18 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
368
531
|
if (variante) {
|
|
369
532
|
const dv = (0, ciclos_1.definicaoDaVariante)(variante);
|
|
370
533
|
if (dv.exigeBranch && !opcoes.branch) {
|
|
371
|
-
throw new
|
|
534
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.cicloExigeBranch(variante));
|
|
372
535
|
}
|
|
373
|
-
|
|
374
|
-
|
|
536
|
+
const branch = opcoes.branch;
|
|
537
|
+
if (branch) {
|
|
538
|
+
const existe = (0, util_1.exec)('git', ['rev-parse', '--verify', `refs/heads/${branch}`], raiz);
|
|
375
539
|
if (!existe.ok) {
|
|
376
|
-
throw new
|
|
540
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.branchInexistente(branch));
|
|
377
541
|
}
|
|
378
542
|
}
|
|
379
543
|
}
|
|
380
544
|
else if (opcoes.branch) {
|
|
381
|
-
throw new
|
|
545
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.branchSemCiclo);
|
|
382
546
|
}
|
|
383
547
|
// `greenfield`, `merge-branch` e `feature-xl-faseada` exigem worktree isolada: sao os
|
|
384
548
|
// ciclos que escrevem codigo em paralelo com outras threads.
|
|
@@ -419,7 +583,7 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
419
583
|
const slug = opcoes.slug ?? (0, slug_1.montarSlug)(abbrev, assunto, blocos[0].slugFases);
|
|
420
584
|
// O override `--slug` do builder tambem passa pela regex canonica.
|
|
421
585
|
if (!(0, slug_1.slugValido)(slug)) {
|
|
422
|
-
throw new
|
|
586
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.slugInvalido(slug, slug_1.REGEX_SLUG.source));
|
|
423
587
|
}
|
|
424
588
|
const thread = {
|
|
425
589
|
...(origin ? { creationOrigin: origin } : {}),
|
|
@@ -442,6 +606,7 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
442
606
|
sessoes: [],
|
|
443
607
|
...(opcoes.exigeRuntimeDiferente === true ? { exigeRuntimeDiferente: true } : {}),
|
|
444
608
|
...(opcoes.doneWhen && opcoes.doneWhen.length > 0 ? { doneWhen: opcoes.doneWhen } : {}),
|
|
609
|
+
...(pedido ? { pedido: pedido.meta } : {}),
|
|
445
610
|
decisoes: [],
|
|
446
611
|
claims: [],
|
|
447
612
|
leases: [],
|
|
@@ -478,8 +643,9 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
478
643
|
const ocupadaPelaChave = pelaChave && !exigeWorktree && prevista &&
|
|
479
644
|
(prevista.falha === 'pasta-existe' || prevista.falha === 'branch-existe') ? prevista : null;
|
|
480
645
|
if (ocupadaPelaChave) {
|
|
481
|
-
const
|
|
482
|
-
|
|
646
|
+
const pasta = ocupadaPelaChave.falha === 'pasta-existe';
|
|
647
|
+
const alvo = pasta ? ocupadaPelaChave.dir : ocupadaPelaChave.branch;
|
|
648
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.ocupadaPelaChave(pasta, alvo));
|
|
483
649
|
}
|
|
484
650
|
let worktreeCriada = null;
|
|
485
651
|
if (worktreePor) {
|
|
@@ -487,12 +653,15 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
487
653
|
branchExistente: opcoes.branch,
|
|
488
654
|
});
|
|
489
655
|
thread.worktree = worktreeCriada.dir;
|
|
490
|
-
const commitDaBranch = (0, util_1.exec)('git', ['rev-parse', worktreeCriada.branch], raiz);
|
|
491
656
|
thread.base = {
|
|
492
657
|
branch: worktreeCriada.branch,
|
|
493
|
-
commit:
|
|
658
|
+
commit: worktreeCriada.commit,
|
|
494
659
|
};
|
|
495
660
|
}
|
|
661
|
+
// RM-059 (T6.0): o pedido vai ao lado do thread.json, so com permissao do dono, como ele, e antes dele: o
|
|
662
|
+
// thread.json nunca aponta para um pedido que nao foi gravado.
|
|
663
|
+
if (pedido)
|
|
664
|
+
gravarPedido(dirThread(raiz, id), pedido.texto);
|
|
496
665
|
gravarThread(raiz, thread);
|
|
497
666
|
(0, ledger_1.registrar)(dirThread(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.threadCriada, {
|
|
498
667
|
...(origin ? { creationOrigin: origin } : {}),
|
|
@@ -510,6 +679,7 @@ function criarThreadSerializada(carregado, opcoes) {
|
|
|
510
679
|
branchDeOrigem: opcoes.branch ?? null,
|
|
511
680
|
maquina: thread.maquina,
|
|
512
681
|
...(thread.roadmap ? { roadmap: thread.roadmap } : {}),
|
|
682
|
+
...(pedido ? { pedido: pedido.meta } : {}),
|
|
513
683
|
});
|
|
514
684
|
if (worktreeCriada) {
|
|
515
685
|
(0, ledger_1.registrar)(dirThread(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeCriada, {
|
|
@@ -552,38 +722,43 @@ function canalDaSessao(s) {
|
|
|
552
722
|
}
|
|
553
723
|
function resumoDaThread(thread, conducao) {
|
|
554
724
|
const def = (0, modos_1.definicaoDoModo)(thread.modo);
|
|
725
|
+
const m = (0, locale_1.msg)().thread, r = m.rotulos;
|
|
726
|
+
// RM-061 (F2a): o rotulo vem do catalogo, na largura do locale; o valor gravado (nome, criterio) sai como esta.
|
|
727
|
+
const campo = (rotulo, valor) => ` ${rotulo.padEnd(m.largura)} ${valor}`;
|
|
555
728
|
const linhas = [];
|
|
556
|
-
linhas.push(
|
|
557
|
-
linhas.push(
|
|
558
|
-
linhas.push(
|
|
559
|
-
linhas.push(
|
|
560
|
-
linhas.push(
|
|
561
|
-
linhas.push(
|
|
562
|
-
linhas.push(
|
|
563
|
-
linhas.push(
|
|
564
|
-
linhas.push(
|
|
729
|
+
linhas.push(campo(r.id, thread.id));
|
|
730
|
+
linhas.push(campo(r.slug, thread.slug));
|
|
731
|
+
linhas.push(campo(r.nome, thread.nome));
|
|
732
|
+
linhas.push(campo(r.modo, m.modo(def.tag, pausasDaThread(thread))));
|
|
733
|
+
linhas.push(campo(r.ciclo, thread.variante ?? m.cicloPadrao));
|
|
734
|
+
linhas.push(campo(r.fase, thread.faseAtual));
|
|
735
|
+
linhas.push(campo(r.status, m.status(thread.status)));
|
|
736
|
+
linhas.push(campo(r.base, `${thread.base.branch} @ ${(0, util_1.shaCurto)(thread.base.commit)}`));
|
|
737
|
+
linhas.push(campo(r.worktree, thread.worktree ?? m.raizDoProjeto));
|
|
565
738
|
// I-36 (T17): quem passa a leitura da conducao ve a linha unica; sem ela o resumo fica como era.
|
|
566
739
|
if (conducao !== undefined)
|
|
567
|
-
linhas.push(
|
|
740
|
+
linhas.push(campo(r.conducao, conducao ? (0, conducao_texto_1.linhaDeConducao)(conducao) : m.ninguemConduz));
|
|
568
741
|
// I-43 (D4, viga a): a exigencia so aparece quando existe, para nao poluir o resumo
|
|
569
742
|
// das threads que nao a declararam.
|
|
570
|
-
if (thread.exigeRuntimeDiferente === true)
|
|
571
|
-
linhas.push(
|
|
572
|
-
}
|
|
743
|
+
if (thread.exigeRuntimeDiferente === true)
|
|
744
|
+
linhas.push(m.validacao);
|
|
573
745
|
// I-43 (D4, viga b): o criterio aparece COM o comando. Mostrar so o criterio seria
|
|
574
746
|
// reproduzir a prosa do envelope numa tela nova.
|
|
575
747
|
if (thread.doneWhen && thread.doneWhen.length > 0) {
|
|
576
|
-
linhas.push(
|
|
748
|
+
linhas.push(m.prontoQuando(thread.doneWhen.length));
|
|
577
749
|
for (const d of thread.doneWhen)
|
|
578
750
|
linhas.push(` ${d.criterio}\n $ ${d.comando}`);
|
|
579
751
|
}
|
|
580
752
|
if (thread.score) {
|
|
581
|
-
linhas.push(
|
|
582
|
-
|
|
753
|
+
linhas.push(campo(r.score, m.score(thread.score.valor, thread.score.avaliadoPor, thread.score.regime, (0, horario_1.formatarDataHoraRotulada)(thread.score.avaliadoEm))));
|
|
754
|
+
}
|
|
755
|
+
// RM-072 (D17): o modo do ultimo CHECK, so quando a thread ja teve verify.
|
|
756
|
+
if (thread.check) {
|
|
757
|
+
linhas.push(campo(r.check, m.check(check_modo_1.NOME_DO_MODO[thread.check.modo], thread.check.origem, (0, horario_1.formatarDataHoraRotulada)(thread.check.em), (0, util_1.shaCurto)(thread.check.commit))));
|
|
583
758
|
}
|
|
584
|
-
linhas.push(
|
|
759
|
+
linhas.push(m.blocosPrevistos);
|
|
585
760
|
for (const b of thread.blocos) {
|
|
586
|
-
const marca = b.pausa ?
|
|
761
|
+
const marca = b.pausa ? m.pausaPrevista(m.pausaSobre(b.pausaSobre)) : m.semPausa;
|
|
587
762
|
linhas.push(` ${b.slugFases.padEnd(6)} ${b.fases.join('-').padEnd(18)} ${marca}`);
|
|
588
763
|
}
|
|
589
764
|
return linhas.join('\n');
|
|
@@ -617,29 +792,28 @@ function threadsDaListagem(raiz, opcoes = {}) {
|
|
|
617
792
|
/** Tabela de `ork thread list`. */
|
|
618
793
|
function tabelaDeThreads(raiz, opcoes = {}) {
|
|
619
794
|
const linhas = threadsDaListagem(raiz, opcoes);
|
|
795
|
+
// RM-061 (F3b): o texto pelo catalogo; o status (dado do `--json`) so se traduz na impressao, pelo id.
|
|
796
|
+
const mt = (0, locale_1.msg)().thread;
|
|
620
797
|
if (linhas.length === 0) {
|
|
621
798
|
// A divida paga aqui: a mensagem sugeria `--modo default`, um modo que
|
|
622
799
|
// `parseModo` recusa, e e a origem provavel das 3 threads com `modo: default`
|
|
623
800
|
// gravadas em disco. A sugestao agora e um modo que existe.
|
|
624
|
-
|
|
625
|
-
? 'Nenhuma thread em .orkastery/threads.'
|
|
626
|
-
: 'Nenhuma thread aberta ou pausada (use --todas para ver as fechadas).';
|
|
627
|
-
return `${vazio} Crie uma com: ork thread new "<nome>" --modo ${modos_1.ORDEM_DOS_MODOS[0]}`;
|
|
801
|
+
return mt.listaVazia(opcoes.todas === true, modos_1.ORDEM_DOS_MODOS[0]);
|
|
628
802
|
}
|
|
629
803
|
const corpo = linhas.map((l) => [
|
|
630
|
-
l.id, l.slug, l.tag, l.fase, l.status, String(l.pausas), String(l.sessoes),
|
|
804
|
+
l.id, l.slug, l.tag, l.fase, mt.status(l.status), String(l.pausas), String(l.sessoes),
|
|
631
805
|
]);
|
|
632
|
-
const t = (0, util_1.tabela)([
|
|
806
|
+
const t = (0, util_1.tabela)([...mt.colunasDaLista], corpo);
|
|
633
807
|
if (opcoes.todas === true)
|
|
634
808
|
return t;
|
|
635
809
|
const fechadas = listarIds(raiz).length - linhas.length;
|
|
636
|
-
return fechadas > 0 ? `${t}\n\n
|
|
810
|
+
return fechadas > 0 ? `${t}\n\n${mt.fechadasOmitidas(fechadas)}` : t;
|
|
637
811
|
}
|
|
638
812
|
/** Fase valida e pertencente ao ciclo da thread. */
|
|
639
813
|
function exigirFase(thread, bruto) {
|
|
640
814
|
const fase = bruto.toUpperCase();
|
|
641
815
|
if (!thread.fases.includes(fase)) {
|
|
642
|
-
throw new Error(
|
|
816
|
+
throw new Error((0, locale_1.msg)().phase.faseInvalida(bruto, thread.fases.join(', ')));
|
|
643
817
|
}
|
|
644
818
|
return fase;
|
|
645
819
|
}
|