@orkastery/cli 0.5.6 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +37 -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/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-pista/hooks/ci.ts +9 -5
- 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/hooks/vigia.ts +1 -1
- 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 +2 -2
- package/adapters/openclaw/README.md +81 -9
- 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/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 +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- 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 +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- 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 +123 -80
- package/dist/handoff.js +23 -13
- 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 +51 -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 +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- 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 +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -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 +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -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 +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -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 +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -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 +196 -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 +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- 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 +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- 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 +10 -5
- package/references/security-checklist.md +3 -3
- 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/pulse.js
CHANGED
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.JANELA_DAS_DECISOES_MS = exports.CONTRATO_PULSE = void 0;
|
|
4
4
|
exports.apresentacaoCurtaDoItem = apresentacaoCurtaDoItem;
|
|
5
5
|
exports.comporPulse = comporPulse;
|
|
6
|
+
exports.comandoDaAcaoDaVarredura = comandoDaAcaoDaVarredura;
|
|
7
|
+
exports.textoDaAcaoDaVarredura = textoDaAcaoDaVarredura;
|
|
8
|
+
exports.varreduraDoPulse = varreduraDoPulse;
|
|
6
9
|
exports.montarPulse = montarPulse;
|
|
7
10
|
exports.filaDoDono = filaDoDono;
|
|
8
11
|
exports.textoDoPulse = textoDoPulse;
|
|
@@ -15,6 +18,11 @@ const master_1 = require("./master");
|
|
|
15
18
|
const master_batch_1 = require("./master-batch");
|
|
16
19
|
const orquestracao_1 = require("./orquestracao");
|
|
17
20
|
const impedimento_1 = require("./impedimento");
|
|
21
|
+
const runtime_escada_1 = require("./runtime-escada");
|
|
22
|
+
const autorizacao_duravel_1 = require("./autorizacao-duravel");
|
|
23
|
+
const varredura_acoes_1 = require("./varredura-acoes");
|
|
24
|
+
const conducao_batida_1 = require("./conducao-batida");
|
|
25
|
+
const maquina_ociosa_1 = require("./maquina-ociosa");
|
|
18
26
|
const thread_1 = require("./thread");
|
|
19
27
|
const sessoes_adopt_1 = require("./sessoes-adopt");
|
|
20
28
|
const ledger_1 = require("./ledger");
|
|
@@ -187,10 +195,35 @@ function comporPulse(carregado, entrada) {
|
|
|
187
195
|
item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
|
|
188
196
|
}
|
|
189
197
|
}
|
|
198
|
+
// RM-063 (F4): a escada de recuperacao do runtime que acabou sai como o impedimento, com o comando que confere o
|
|
199
|
+
// runtime, o que retoma a fase com o mesmo prompt e o pedido curto com as tres alternativas (RM-057).
|
|
200
|
+
if (p.escada) {
|
|
201
|
+
item.impedimento = { motivo: p.motivo, comando: p.escada.conferir, retry: p.escada.retomar };
|
|
202
|
+
item.comandoResposta = p.escada.retomar;
|
|
203
|
+
try {
|
|
204
|
+
const curto = (0, runtime_escada_1.pedidoCurtoDaEscada)({ thread: l.thread, fase: p.fase, desdeEm: p.desdeEm, escada: p.escada }, quando);
|
|
205
|
+
item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
|
|
206
|
+
item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
|
|
207
|
+
const recomendada = curto.alternativas.find(a => a.recomendada);
|
|
208
|
+
if (recomendada)
|
|
209
|
+
item.recomendacao = `${recomendada.chave}. ${recomendada.texto}: ${recomendada.recomendada.porque}`;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
item.evidencia.push('Pedido curto da escada indisponível; a correção acima vale.');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
190
215
|
// I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
|
|
191
216
|
const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
|
|
192
217
|
(esperaAutomatica ? automaticas : humanos).push(item);
|
|
193
218
|
}
|
|
219
|
+
// RM-063 (F5): o MASTER por omissao da varredura nao vira item do dono (I-45: a entrega sem nota fica na faixa
|
|
220
|
+
// automatica). Ele completa o item da entrega com o comando desta thread so (RM-008) e com quem o faz agora.
|
|
221
|
+
const v = entrada.varredura;
|
|
222
|
+
const recomendacaoDaVarredura = (a) => a.quemFaz === 'varredura' && v.autorizacao.por && v.autorizacao.ate
|
|
223
|
+
? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.daVarredura(v.autorizacao.por, (0, horario_1.formatarDataHoraRotulada)(v.autorizacao.ate, { agora: quando })))
|
|
224
|
+
: a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueioRecomendacao(a.thread, a.comando))
|
|
225
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.doDono(a.acao));
|
|
226
|
+
const masterDaVarredura = new Map((v?.pendentes ?? []).filter(a => a.acao === 'master').map(a => [a.thread, a]));
|
|
194
227
|
for (const b of batch) {
|
|
195
228
|
const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, b.thread.id));
|
|
196
229
|
const desde = eventos.filter(e => e.tipo === 'ship_done').at(-1)?.ts ??
|
|
@@ -207,6 +240,18 @@ function comporPulse(carregado, entrada) {
|
|
|
207
240
|
recomendacao: 'Aceitar por padrão com registro; a nota humana, quando vier, sobrescreve.',
|
|
208
241
|
comandoResposta: 'ork master --aceitar-omissao',
|
|
209
242
|
evidencia: [`ork master; regime ${b.regime}`], fontes: ['master'], contextoLogs: [] });
|
|
243
|
+
const daVarredura = masterDaVarredura.get(b.thread.id);
|
|
244
|
+
if (daVarredura) {
|
|
245
|
+
const item = automaticas[automaticas.length - 1];
|
|
246
|
+
item.comandoResposta = comandoDaAcaoDaVarredura(daVarredura);
|
|
247
|
+
item.recomendacao = recomendacaoDaVarredura(daVarredura);
|
|
248
|
+
if (daVarredura.bloqueio || daVarredura.recusa)
|
|
249
|
+
item.pergunta = `${item.pergunta} ${textoDaAcaoDaVarredura(daVarredura)}`;
|
|
250
|
+
item.evidencia.push(daVarredura.evidencia);
|
|
251
|
+
if (!item.fontes.includes('varredura'))
|
|
252
|
+
item.fontes.push('varredura');
|
|
253
|
+
masterDaVarredura.delete(b.thread.id);
|
|
254
|
+
}
|
|
210
255
|
}
|
|
211
256
|
for (const o of orfas) {
|
|
212
257
|
if (ehRegistro(o.thread))
|
|
@@ -220,6 +265,20 @@ function comporPulse(carregado, entrada) {
|
|
|
220
265
|
evidencia: [...o.evidencia, `retry ${o.retry.tentativas}/${o.retry.limite}`], fontes: ['liveness'], contextoLogs: [] };
|
|
221
266
|
(o.retry.automatica ? automaticas : humanos).push(item);
|
|
222
267
|
}
|
|
268
|
+
// RM-063 (F5): cada acao da varredura e um item. Sem a autorizacao do dono para ela (ou com bloqueio, ou com a tentativa
|
|
269
|
+
// recusada), e do dono, com o comando pronto; autorizada, e acao automatica da proxima batida. O MASTER ja foi no item
|
|
270
|
+
// da entrega sem nota; so o que sobrou dele (sem item de entrega) entra aqui, na faixa automatica.
|
|
271
|
+
for (const a of v?.pendentes ?? []) {
|
|
272
|
+
if (a.acao === 'master' && !masterDaVarredura.has(a.thread))
|
|
273
|
+
continue;
|
|
274
|
+
const daVarredura = a.quemFaz === 'varredura' || a.acao === 'master';
|
|
275
|
+
const item = { id: `varredura:${a.acao}:${a.thread}${a.sessionId ? `:${a.sessionId.slice(0, 8)}` : ''}`,
|
|
276
|
+
classe: 'varredura', motivo: `varredura.${a.acao}`, thread: a.thread, fase: a.fase, sessionId: null, desdeEm: a.desdeEm,
|
|
277
|
+
paradaHaMin: minutos(a.desdeEm, quando), impacto: impacto(a.fase), pergunta: textoDaAcaoDaVarredura(a), opcoes: [],
|
|
278
|
+
recomendacao: recomendacaoDaVarredura(a), comandoResposta: comandoDaAcaoDaVarredura(a), evidencia: [a.evidencia],
|
|
279
|
+
fontes: ['varredura'], contextoLogs: [] };
|
|
280
|
+
(daVarredura ? automaticas : humanos).push(item);
|
|
281
|
+
}
|
|
223
282
|
const unicos = (items) => [...new Map(items.map(i => [i.id, i])).values()].sort(ordenar);
|
|
224
283
|
const h = unicos(humanos), a = unicos(automaticas);
|
|
225
284
|
for (const item of h) {
|
|
@@ -256,7 +315,30 @@ function comporPulse(carregado, entrada) {
|
|
|
256
315
|
}
|
|
257
316
|
return { contrato: exports.CONTRATO_PULSE, consultadoEm: quando, runtime: { ok: radar.runtimeConsultado, detalhe: radar.runtimeDetalhe },
|
|
258
317
|
precisaDeHumanoAgora: h, acoesAutomaticas: a, resumo: { humanos: h.length, automaticas: a.length, scores: batch.length, fasesOrfas: orfas.length },
|
|
259
|
-
...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {})
|
|
318
|
+
...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {}),
|
|
319
|
+
...(v && (v.pendentes.length || v.feitas.length || v.autorizacao.estado !== 'ausente') ? { varredura: v } : {}) };
|
|
320
|
+
}
|
|
321
|
+
/** RM-063 (F5): com bloqueio, o comando do dono e olhar a thread: a acao iria por cima do trabalho que esta nela. */
|
|
322
|
+
function comandoDaAcaoDaVarredura(a) {
|
|
323
|
+
return a.bloqueio ? `ork thread status ${a.thread}` : a.comando;
|
|
324
|
+
}
|
|
325
|
+
/** RM-063 (F5): o que a acao faz, com o motivo da ultima recusa ou do bloqueio quando ha. */
|
|
326
|
+
function textoDaAcaoDaVarredura(a) {
|
|
327
|
+
return a.recusa ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comRecusa(a.oQue, a.recusa.detalhe))
|
|
328
|
+
: a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueio(a.oQue, a.bloqueio)) : a.oQue;
|
|
329
|
+
}
|
|
330
|
+
/** RM-063 (F5): os estados em que a sessao da consulta ja nao trabalha na worktree. */
|
|
331
|
+
const TERMINAIS_DA_CONSULTA = ['failed', 'done', 'stopped', 'completed', 'exited'];
|
|
332
|
+
/** RM-063 (F5): a autorizacao e as acoes como o pulse as leva: cada acao com quem a faz agora. */
|
|
333
|
+
function varreduraDoPulse(leitura, pendentes, feitas) {
|
|
334
|
+
const a = leitura.valida ? leitura.autorizacao : null;
|
|
335
|
+
return {
|
|
336
|
+
autorizacao: { estado: leitura.valida ? 'valida' : leitura.motivo === 'autorizacao.ausente' ? 'ausente' : 'invalida',
|
|
337
|
+
motivo: leitura.valida ? null : leitura.motivo, detalhe: leitura.valida ? null : leitura.detalhe,
|
|
338
|
+
por: a?.por ?? null, ate: a?.ate ?? null, pode: a ? [...a.pode] : [] },
|
|
339
|
+
pendentes: pendentes.map((p) => ({ ...p, quemFaz: (0, autorizacao_duravel_1.autorizada)(leitura, p.acao) && !p.bloqueio && !p.recusa ? 'varredura' : 'dono' })),
|
|
340
|
+
feitas: feitas.map((f) => ({ acao: f.acao, thread: f.thread, detalhe: f.detalhe, em: f.em, eventId: f.eventId })),
|
|
341
|
+
};
|
|
260
342
|
}
|
|
261
343
|
function montarPulse(carregado, opcoes = {}) {
|
|
262
344
|
if (opcoes.registrar)
|
|
@@ -289,7 +371,8 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
289
371
|
let entregas;
|
|
290
372
|
try {
|
|
291
373
|
entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
|
|
292
|
-
const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas
|
|
374
|
+
const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas, rodar: opcoes.rodarDaForja,
|
|
375
|
+
sondas: opcoes.sondasDaForja });
|
|
293
376
|
if (leitura.ok) {
|
|
294
377
|
try {
|
|
295
378
|
(0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
|
|
@@ -319,7 +402,31 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
319
402
|
catch (e) {
|
|
320
403
|
diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
|
|
321
404
|
}
|
|
322
|
-
|
|
405
|
+
// RM-063 (F5): o que a varredura faria sozinha, com a autorizacao duravel desta maquina. Leitura; falhar aqui nunca
|
|
406
|
+
// derruba a fila de atencao.
|
|
407
|
+
let varredura;
|
|
408
|
+
try {
|
|
409
|
+
const leitura = (0, autorizacao_duravel_1.lerAutorizacao)(carregado.raiz, { projeto: carregado.manifesto.project.name, agora: new Date(quando) });
|
|
410
|
+
// Com a consulta injetada (os testes) ou sem o runtime, as sessoes vem dela: sem a leitura, nada se afirma, e o
|
|
411
|
+
// registro e o MASTER ficam com o dono (`sessoes-sem-leitura`).
|
|
412
|
+
const injetada = opcoes.fantasmas || opcoes.consulta || opcoes.semRuntime;
|
|
413
|
+
const consultada = consulta;
|
|
414
|
+
const pendentes = (0, varredura_acoes_1.acoesPendentes)(carregado, { quando, ...(injetada ? {
|
|
415
|
+
fantasmas: opcoes.fantasmas ?? (() => null),
|
|
416
|
+
vivas: () => consultada.ok ? consultada.sessoes.filter((s) => typeof s.cwd === 'string' && !TERMINAIS_DA_CONSULTA.includes((0, hitl_1.estadoBruto)(s)))
|
|
417
|
+
.map((s) => ({ sessionId: s.sessionId, cwd: s.cwd })) : null,
|
|
418
|
+
} : {}) });
|
|
419
|
+
// RM-063 (F7): o merge e o despacho que a ultima batida da conducao deixou pendentes (check pendente, sem autorizacao,
|
|
420
|
+
// conflito em codigo, PR em rascunho, fase sem prompt gravado), do retrato dela, enquanto ele vale.
|
|
421
|
+
pendentes.push(...(0, conducao_batida_1.pendentesDaUltimaBatida)(carregado.raiz, quando));
|
|
422
|
+
const feitas = (0, varredura_acoes_1.acoesFeitasDesde)(carregado.raiz, new Date(Date.parse(quando) - exports.JANELA_DAS_DECISOES_MS).toISOString());
|
|
423
|
+
varredura = varreduraDoPulse(leitura, pendentes, feitas);
|
|
424
|
+
}
|
|
425
|
+
catch (e) {
|
|
426
|
+
diagnosticos.push(`varredura.indisponivel: ${e.message.slice(0, 120)}`);
|
|
427
|
+
}
|
|
428
|
+
const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}),
|
|
429
|
+
...(varredura ? { varredura } : {}) });
|
|
323
430
|
// RM-061 (F2b, G2): a linha de conducao e da familia `thread` e segue o locale ativo; o JSON a guarda em pt-BR.
|
|
324
431
|
const conducoes = monitor.linhas.filter((l) => l.conducao)
|
|
325
432
|
.map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
|
|
@@ -343,6 +450,15 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
343
450
|
catch (e) {
|
|
344
451
|
diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
|
|
345
452
|
}
|
|
453
|
+
// RM-063 (F6): a maquina ociosa, leitura pura das vagas, das reservas locais e do passo do condutor.
|
|
454
|
+
try {
|
|
455
|
+
const ociosa = (0, maquina_ociosa_1.maquinaOciosa)(carregado, { quando });
|
|
456
|
+
if (ociosa)
|
|
457
|
+
pulse.maquinaOciosa = ociosa;
|
|
458
|
+
}
|
|
459
|
+
catch (e) {
|
|
460
|
+
diagnosticos.push(`ociosidade.indisponivel: ${e.message.slice(0, 120)}`);
|
|
461
|
+
}
|
|
346
462
|
if (diagnosticos.length)
|
|
347
463
|
pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
|
|
348
464
|
return pulse;
|
|
@@ -408,5 +524,22 @@ function textoDoPulse(p) {
|
|
|
408
524
|
// RM-061 (F2b, D4): o item do radar sem tipo de HITL usa a classe como motivo; ela sai pelo id, o motivo tipado fica.
|
|
409
525
|
for (const i of p.acoesAutomaticas)
|
|
410
526
|
linhas.push(m.automatica(String(i.thread), i.motivo === i.classe ? m.classe(i.motivo) : i.motivo, (0, locale_1.remontar)(i.comandoResposta)));
|
|
527
|
+
// RM-063 (F5): a autorizacao da varredura e o que ela fez sozinha na semana.
|
|
528
|
+
if (p.varredura) {
|
|
529
|
+
const v = p.varredura, a = v.autorizacao;
|
|
530
|
+
linhas.push('', a.estado === 'valida' ? m.varredura.autorizacaoValida(String(a.por), (0, horario_1.formatarDataHoraRotulada)(String(a.ate), { agora: p.consultadoEm }), a.pode.join(', ')) : a.estado === 'ausente' ? m.varredura.autorizacaoAusente : m.varredura.autorizacaoInvalida(String(a.motivo), String(a.detalhe)));
|
|
531
|
+
if (v.feitas.length) {
|
|
532
|
+
linhas.push(m.varredura.feitas(v.feitas.length));
|
|
533
|
+
for (const f of v.feitas)
|
|
534
|
+
linhas.push(m.varredura.feita(f.thread, f.acao, f.detalhe));
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
// RM-063 (F6): a maquina ociosa e as proximas threads sugeridas.
|
|
538
|
+
if (p.maquinaOciosa) {
|
|
539
|
+
const o = p.maquinaOciosa;
|
|
540
|
+
linhas.push('', m.ociosa.linha(o.maquina, o.livres, o.limite, o.reservados));
|
|
541
|
+
for (const s of o.sugeridas)
|
|
542
|
+
linhas.push(m.ociosa.sugerida(s.item, s.thread ? `${s.thread}, ${s.fase}` : m.ociosa.semThread, (0, locale_1.remontar)(s.passo), s.comando));
|
|
543
|
+
}
|
|
411
544
|
return linhas.join('\n');
|
|
412
545
|
}
|
package/dist/ratelimit.js
CHANGED
|
@@ -59,6 +59,7 @@ exports.dirRetry = dirRetry;
|
|
|
59
59
|
exports.caminhoDaFila = caminhoDaFila;
|
|
60
60
|
exports.lerFilaDeRetomada = lerFilaDeRetomada;
|
|
61
61
|
exports.janelaPadraoMs = janelaPadraoMs;
|
|
62
|
+
exports.arcoDoPedido = arcoDoPedido;
|
|
62
63
|
exports.enfileirar = enfileirar;
|
|
63
64
|
exports.prazoDaConta = prazoDaConta;
|
|
64
65
|
exports.prazoDaCotaVista = prazoDaCotaVista;
|
|
@@ -104,6 +105,11 @@ function lerFilaDeRetomada(raiz) {
|
|
|
104
105
|
function janelaPadraoMs(manifesto) {
|
|
105
106
|
return manifesto.retry.janela_padrao_min * 60 * 1000;
|
|
106
107
|
}
|
|
108
|
+
/** RM-058 N4 (D17): o arco #Noctum do pedido, quando o despacho que caiu no limite de uso era dele. */
|
|
109
|
+
function arcoDoPedido(pedido) {
|
|
110
|
+
const c = pedido.correlacao;
|
|
111
|
+
return typeof c === 'string' && c.startsWith('noctum:') && c.length > 'noctum:'.length ? c.slice('noctum:'.length) : null;
|
|
112
|
+
}
|
|
107
113
|
/**
|
|
108
114
|
* Enfileira a fase morta por rate limit.
|
|
109
115
|
*
|
|
@@ -136,7 +142,9 @@ function enfileirar(carregado, novo, agoraMs = Date.now()) {
|
|
|
136
142
|
detalhe: novo.detalhe,
|
|
137
143
|
...(novo.runtime !== undefined ? { runtime: novo.runtime } : {}),
|
|
138
144
|
...(novo.perfil !== undefined ? { perfil: novo.perfil } : {}),
|
|
145
|
+
...(novo.perfilPedido ? { perfilPedido: novo.perfilPedido } : {}),
|
|
139
146
|
...(novo.motivo !== undefined ? { motivo: novo.motivo } : {}),
|
|
147
|
+
...(novo.correlacao ? { correlacao: novo.correlacao } : {}),
|
|
140
148
|
};
|
|
141
149
|
(0, util_1.anexarJsonl)(caminhoDaFila(raiz), pedido);
|
|
142
150
|
return pedido;
|
|
@@ -214,18 +222,19 @@ function faltaPara(pedido, quando = (0, util_1.agora)()) {
|
|
|
214
222
|
/** Tabela de `ork retry list`. */
|
|
215
223
|
function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
|
|
216
224
|
const fila = lerFilaDeRetomada(raiz).sort((a, b) => a.id.localeCompare(b.id, 'en', { numeric: true }));
|
|
225
|
+
const m = (0, locale_1.msg)().retry.complementar;
|
|
217
226
|
if (fila.length === 0) {
|
|
218
|
-
return
|
|
227
|
+
return m.filaVazia;
|
|
219
228
|
}
|
|
220
229
|
const linhas = fila.map((p) => [
|
|
221
230
|
p.id,
|
|
222
231
|
p.thread,
|
|
223
232
|
p.fase,
|
|
224
|
-
p.estado,
|
|
233
|
+
m.estados[p.estado] ?? p.estado,
|
|
225
234
|
(0, horario_1.formatarDataHora)(p.liberaEm, { agora: quando }),
|
|
226
|
-
p.janelaEstimada ?
|
|
235
|
+
p.janelaEstimada ? m.horaEstimada(p.sinal.fonte) : m.horaRuntime(p.sinal.fonte),
|
|
227
236
|
p.estado === 'aguardando' ? faltaPara(p, quando) : '',
|
|
228
237
|
String(p.tentativas),
|
|
229
238
|
]);
|
|
230
|
-
return (0, util_1.tabela)([
|
|
239
|
+
return (0, util_1.tabela)([...m.colunasFila], linhas) + `\n${(0, horario_1.legendaDoFuso)(undefined, quando)}`;
|
|
231
240
|
}
|
package/dist/recall.js
CHANGED
|
@@ -65,6 +65,7 @@ const memoria_1 = require("./memoria");
|
|
|
65
65
|
const orkmind_1 = require("./orkmind");
|
|
66
66
|
const thread_1 = require("./thread");
|
|
67
67
|
const util_1 = require("./util");
|
|
68
|
+
const locale_1 = require("./locale");
|
|
68
69
|
/** Momento do ponteiro e momento pedido casam? Comparacao exata, sem case. */
|
|
69
70
|
function momentoCasa(ponteiro, momento) {
|
|
70
71
|
return ponteiro.retrieve_when.trim().toLowerCase() === momento.trim().toLowerCase();
|
|
@@ -291,18 +292,18 @@ function recallDaThread(carregado, memoria, threadId, opcoes = {}) {
|
|
|
291
292
|
}
|
|
292
293
|
/** Texto de `ork recall`. */
|
|
293
294
|
function textoDoRecall(r, comConteudo = true) {
|
|
295
|
+
const m = (0, locale_1.msg)().operacao.restante.recall;
|
|
294
296
|
const linhas = [];
|
|
295
|
-
linhas.push(
|
|
296
|
-
`(regime efetivo ${r.regime}, handoff escrito em regime ${r.regimeDoHandoff})`);
|
|
297
|
+
linhas.push(m.titulo(r.thread, r.momento ?? m.todos, r.regime, r.regimeDoHandoff));
|
|
297
298
|
linhas.push('');
|
|
298
|
-
linhas.push(
|
|
299
|
+
linhas.push(m.resolvidos(r.resolvidos.length));
|
|
299
300
|
for (const p of r.resolvidos) {
|
|
300
301
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
301
|
-
linhas.push(
|
|
302
|
-
linhas.push(
|
|
302
|
+
linhas.push(m.via(p.via, p.metodo));
|
|
303
|
+
linhas.push(m.location(p.location));
|
|
303
304
|
if (p.orkmind)
|
|
304
305
|
linhas.push(` orkmind ${p.orkmind}`);
|
|
305
|
-
linhas.push(
|
|
306
|
+
linhas.push(m.quando(p.retrieve_when));
|
|
306
307
|
if (comConteudo) {
|
|
307
308
|
linhas.push('');
|
|
308
309
|
for (const l of p.conteudo.split('\n'))
|
|
@@ -311,20 +312,20 @@ function textoDoRecall(r, comConteudo = true) {
|
|
|
311
312
|
}
|
|
312
313
|
}
|
|
313
314
|
linhas.push('');
|
|
314
|
-
linhas.push(
|
|
315
|
+
linhas.push(m.adiados(r.adiados.length));
|
|
315
316
|
for (const p of r.adiados) {
|
|
316
317
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
317
|
-
linhas.push(
|
|
318
|
-
linhas.push(
|
|
319
|
-
linhas.push(
|
|
318
|
+
linhas.push(m.quando(p.retrieve_when));
|
|
319
|
+
linhas.push(m.onde(p.location));
|
|
320
|
+
linhas.push(m.recuperar(r.thread, p.retrieve_when));
|
|
320
321
|
}
|
|
321
322
|
if (r.falhas.length > 0) {
|
|
322
323
|
linhas.push('');
|
|
323
|
-
linhas.push(
|
|
324
|
+
linhas.push(m.falhas(r.falhas.length));
|
|
324
325
|
for (const p of r.falhas) {
|
|
325
326
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
326
|
-
linhas.push(
|
|
327
|
-
linhas.push(
|
|
327
|
+
linhas.push(m.motivo(p.motivo));
|
|
328
|
+
linhas.push(m.detalhe(p.detalhe));
|
|
328
329
|
}
|
|
329
330
|
}
|
|
330
331
|
return linhas.join('\n');
|
package/dist/rede-adesao.js
CHANGED
|
@@ -64,6 +64,7 @@ const path = __importStar(require("node:path"));
|
|
|
64
64
|
const maquina_1 = require("./maquina");
|
|
65
65
|
const monitor_lock_1 = require("./monitor-lock");
|
|
66
66
|
const util_1 = require("./util");
|
|
67
|
+
const locale_1 = require("./locale");
|
|
67
68
|
exports.CONTRATO_DA_ADESAO = 'ork.rede/v1';
|
|
68
69
|
exports.REPOSITORIO_PADRAO = 'orkastery-network';
|
|
69
70
|
/**
|
|
@@ -78,6 +79,8 @@ exports.pastaDaRede = pastaDaRede;
|
|
|
78
79
|
const arquivoDaConfig = () => path.join((0, maquina_1.pastaDoUsuario)(), 'rede.json');
|
|
79
80
|
const arquivoDaTentativa = () => path.join((0, exports.pastaDaRede)(), 'tentativa.json');
|
|
80
81
|
const IDENTIFICADOR = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
|
|
82
|
+
/** O dono da casa: o login, ou o caminho de um grupo com subgrupos (`time/sub`). */
|
|
83
|
+
const DONO = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}(?:\/[A-Za-z0-9][A-Za-z0-9._-]{0,99}){0,19}$/;
|
|
81
84
|
const HOST = /^[A-Za-z0-9.-]+(?::\d+)?$/;
|
|
82
85
|
const texto = (v, padrao) => typeof v === 'string' && padrao.test(v) ? v : null;
|
|
83
86
|
function lerConfigDaRede() {
|
|
@@ -88,7 +91,7 @@ function lerConfigDaRede() {
|
|
|
88
91
|
return {
|
|
89
92
|
contrato: exports.CONTRATO_DA_ADESAO, membro: bruto.membro,
|
|
90
93
|
forja: bruto.forja === 'github' || bruto.forja === 'gitlab' ? bruto.forja : null,
|
|
91
|
-
host: texto(bruto.host, HOST), dono: texto(bruto.dono,
|
|
94
|
+
host: texto(bruto.host, HOST), dono: texto(bruto.dono, DONO), repositorio: texto(bruto.repositorio, IDENTIFICADOR),
|
|
92
95
|
atualizadoEm: typeof bruto.atualizadoEm === 'string' ? bruto.atualizadoEm : '',
|
|
93
96
|
};
|
|
94
97
|
}
|
|
@@ -108,11 +111,13 @@ function gravarConfigDaRede(mudanca) {
|
|
|
108
111
|
repositorio: mudanca.repositorio !== undefined ? mudanca.repositorio : atual?.repositorio ?? null,
|
|
109
112
|
atualizadoEm: new Date().toISOString(),
|
|
110
113
|
};
|
|
111
|
-
if (config.host !== null && !HOST.test(config.host))
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
if (config.host !== null && !HOST.test(config.host)) {
|
|
115
|
+
const host = config.host;
|
|
116
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.hostInvalido(host));
|
|
117
|
+
}
|
|
118
|
+
for (const [campo, valor, padrao] of [['dono', config.dono, DONO], ['repositorio', config.repositorio, IDENTIFICADOR]]) {
|
|
119
|
+
if (valor !== null && !padrao.test(valor))
|
|
120
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.campoInvalido(campo, valor));
|
|
116
121
|
}
|
|
117
122
|
const dir = (0, maquina_1.pastaDoUsuario)();
|
|
118
123
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -180,7 +185,7 @@ function idDaMaquina() {
|
|
|
180
185
|
}
|
|
181
186
|
const persistido = lerId(arquivo);
|
|
182
187
|
if (!persistido)
|
|
183
|
-
throw new
|
|
188
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoGravou(arquivo));
|
|
184
189
|
return persistido;
|
|
185
190
|
}
|
|
186
191
|
function gravarTemporario(conteudo) {
|
|
@@ -290,7 +295,7 @@ function trocarIdInvalido(arquivo, st) {
|
|
|
290
295
|
return;
|
|
291
296
|
}
|
|
292
297
|
else {
|
|
293
|
-
throw new
|
|
298
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoArquivo(arquivo));
|
|
294
299
|
}
|
|
295
300
|
// X6 do CHECK 6: a reserva da troca e chaveada pelo que todo host ve igual do arquivo ruim (conteudo,
|
|
296
301
|
// tamanho e hora); `dev` e local a cada host e fica so no id derivado, o caminho de quando a reserva falha.
|
package/dist/rede-forja.js
CHANGED
|
@@ -33,11 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ORDEM_DAS_FORJAS = void 0;
|
|
36
|
+
exports.helperDeCredencialDaCli = exports.ORDEM_DAS_FORJAS = void 0;
|
|
37
37
|
exports.pastasDeBinarios = pastasDeBinarios;
|
|
38
38
|
exports.acharBinario = acharBinario;
|
|
39
39
|
exports.versaoDoBinario = versaoDoBinario;
|
|
40
40
|
exports.comGitIsolado = comGitIsolado;
|
|
41
|
+
exports.gitlabSemSuporteNaRede = gitlabSemSuporteNaRede;
|
|
41
42
|
exports.forjaPorNome = forjaPorNome;
|
|
42
43
|
exports.forjasDaMaquina = forjasDaMaquina;
|
|
43
44
|
exports.ehNomeDeForja = ehNomeDeForja;
|
|
@@ -58,7 +59,12 @@ const node_child_process_1 = require("node:child_process");
|
|
|
58
59
|
const fs = __importStar(require("node:fs"));
|
|
59
60
|
const os = __importStar(require("node:os"));
|
|
60
61
|
const path = __importStar(require("node:path"));
|
|
62
|
+
const api_1 = require("./forja/api");
|
|
63
|
+
const executor_1 = require("./forja/executor");
|
|
64
|
+
const pedidos_1 = require("./forja/gitlab/pedidos");
|
|
65
|
+
const texto_1 = require("./forja/texto");
|
|
61
66
|
const redacao_url_1 = require("./redacao-url");
|
|
67
|
+
const locale_1 = require("./locale");
|
|
62
68
|
exports.ORDEM_DAS_FORJAS = ['github', 'gitlab'];
|
|
63
69
|
const LOGIN = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,254})$/;
|
|
64
70
|
const HOST = /^[A-Za-z0-9.-]+(?::\d+)?$/;
|
|
@@ -170,7 +176,8 @@ function comGitIsolado(f, identidade, opcoes = {}) {
|
|
|
170
176
|
const naoEncontrado = (s) => /HTTP 404|404 Not Found|"status"\s*:\s*"?404/i.test(`${s.stdout}\n${s.stderr}`);
|
|
171
177
|
function falhou(cli, rota, s) {
|
|
172
178
|
const linha = (0, redacao_url_1.redigirCredenciaisUrl)(s.stderr.trim().split('\n').pop() ?? '').slice(0, 200);
|
|
173
|
-
|
|
179
|
+
const montarLinha = (0, locale_1.montadorDe)(linha);
|
|
180
|
+
return new locale_1.ErroDoCatalogo((m) => m.network.apiFalhou(cli, rota, montarLinha(m)));
|
|
174
181
|
}
|
|
175
182
|
/** A resposta de quem nao tem login (ou tem credencial recusada), no `gh` e no `glab`. */
|
|
176
183
|
const SEM_LOGIN = /auth login|not logged|not authenticated|authentication|HTTP 401|401 Unauthorized|Bad credentials|no token/i;
|
|
@@ -178,13 +185,17 @@ const SEM_LOGIN = /auth login|not logged|not authenticated|authentication|HTTP 4
|
|
|
178
185
|
function falhaDoLogin(cli, s) {
|
|
179
186
|
if (!s.ok && SEM_LOGIN.test(`${s.stderr}\n${s.stdout}`))
|
|
180
187
|
return {};
|
|
188
|
+
// RM-061 (F3b): a falha entra no detalhe da lacuna da casa, que a impressao remonta no locale do comando.
|
|
181
189
|
if (s.ok)
|
|
182
|
-
return { falha:
|
|
183
|
-
|
|
190
|
+
return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.respostaSemLogin(cli)) };
|
|
191
|
+
const erro = falhou(cli, 'user', s.stderr.trim() ? s : { ...s, stderr: (0, locale_1.textoDoCatalogo)((m) => m.network.semRespostaNoPrazo) });
|
|
192
|
+
return { falha: (0, locale_1.textoDoCatalogo)((m) => erro.montar(m).replace(/^rede\.forja: /, '')) };
|
|
184
193
|
}
|
|
185
194
|
/** Caminho seguro para o shell que o git usa no helper: aspas simples, com `'` escapada (B10). */
|
|
186
195
|
const citar = (caminho) => /^[A-Za-z0-9_./+-]+$/.test(caminho) ? caminho : `'${caminho.replace(/'/g, `'\\''`)}'`;
|
|
187
196
|
const helper = (binario) => `!${citar(binario)} auth git-credential`;
|
|
197
|
+
/** O mesmo helper do cache da rede, para o transporte `forja-https` do SHIP. */
|
|
198
|
+
exports.helperDeCredencialDaCli = helper;
|
|
188
199
|
/**
|
|
189
200
|
* Privado de verdade (B1): no GitHub, `internal` vem com `private: true`, e a empresa inteira le.
|
|
190
201
|
* Quando a forja diz a visibilidade, so `private` conta; sem ela, o booleano.
|
|
@@ -198,7 +209,7 @@ function github(binario, amb, host = 'github.com') {
|
|
|
198
209
|
// B2: a casa vai sempre por HTTPS, com o helper da propria CLI; SSH pediria agente, que o cron nao tem.
|
|
199
210
|
const repositorioDe = (v) => {
|
|
200
211
|
if (!v)
|
|
201
|
-
throw new
|
|
212
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.repositorioIlegivel);
|
|
202
213
|
return { existe: true, privado: privadoDe(v), url: typeof v.clone_url === 'string' ? v.clone_url : null };
|
|
203
214
|
};
|
|
204
215
|
// B9: o host da casa vai em toda chamada; o cron nao tem o ambiente do terminal.
|
|
@@ -235,38 +246,111 @@ function hostDoGitlab(amb) {
|
|
|
235
246
|
const bruto = (ambienteDe(amb).GITLAB_HOST ?? '').trim().replace(/^https?:\/\//, '').replace(/\/.*$/, '');
|
|
236
247
|
return HOST.test(bruto) ? bruto : 'gitlab.com';
|
|
237
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* O que a casa da rede ainda nao suporta no GitLab da maquina: o `rede.json` guarda so `host[:porta]`, entao um GitLab em
|
|
251
|
+
* subcaminho (`https://host/gitlab`) ou com CA propria (`GLAB_CA_CERT`) nao teria como ser lembrado em outra maquina.
|
|
252
|
+
*/
|
|
253
|
+
function gitlabSemSuporteNaRede(amb, host = hostDoGitlab(amb)) {
|
|
254
|
+
const env = ambienteDe(amb);
|
|
255
|
+
const bruto = (env.GITLAB_HOST ?? '').trim().replace(/^https?:\/\//, '');
|
|
256
|
+
// So o subcaminho do proprio host da casa conta: o `GITLAB_HOST` do terminal pode ser de outra instancia.
|
|
257
|
+
const subcaminho = /^([^/]+)\/+[^/]/.exec(bruto);
|
|
258
|
+
if (subcaminho && subcaminho[1].toLowerCase() === host.toLowerCase())
|
|
259
|
+
return 'subcaminho';
|
|
260
|
+
if ((env.GLAB_CA_CERT ?? '').trim() && host !== 'gitlab.com')
|
|
261
|
+
return 'ca';
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
/** O `rodarCli` com o ambiente e o PATH da maquina da rede (o cron tem outro ambiente que o terminal). */
|
|
265
|
+
const rodarNaMaquina = (amb) => (c) => {
|
|
266
|
+
if (!amb.env)
|
|
267
|
+
return (0, executor_1.rodarCli)(c);
|
|
268
|
+
// O ambiente da maquina da rede no lugar do do `ork`, e reduzido como o do `ork` seria: so o que a CLI le chega a ela.
|
|
269
|
+
return (0, executor_1.rodarCli)({ ...c, base: c.reduzido ? (0, executor_1.ambienteReduzido)(amb.env) : amb.env });
|
|
270
|
+
};
|
|
271
|
+
/** `host` ou `host:porta` da casa como alvo da API; a rede nao guarda caminho base nem CA. */
|
|
272
|
+
function alvoDoGitlab(host) {
|
|
273
|
+
const m = /^(.+?)(?::(\d+))?$/.exec(host);
|
|
274
|
+
return { tipo: 'gitlab', host: m[1].toLowerCase(), porta: m[2] ? Number(m[2]) : null, caminhoBase: '', ca: null };
|
|
275
|
+
}
|
|
276
|
+
const objeto = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : null);
|
|
277
|
+
/** A falha da API com o motivo tipado da forja (`forja.*`) no lugar da ultima linha do stderr. */
|
|
278
|
+
const falhouNaApi = (rota, erro) => new locale_1.ErroDoCatalogo((m) => m.network.apiFalhou('glab', rota, m.forja.motivo(erro, 'gitlab')));
|
|
279
|
+
/** `usuario: null` so e falta de login quando a forja disse isso (`forja.sem-login`); o resto e falha da leitura. */
|
|
280
|
+
function falhaDaApi(r) {
|
|
281
|
+
if (r.ok)
|
|
282
|
+
return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.respostaSemLogin('glab')) };
|
|
283
|
+
if (r.erro.codigo === 'forja.sem-login')
|
|
284
|
+
return {};
|
|
285
|
+
const erro = r.erro;
|
|
286
|
+
return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.apiFalhou('glab', 'user', m.forja.motivo(erro, 'gitlab')).replace(/^rede\.forja: /, '')) };
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* O GitLab da casa pela API da CLI logada (`chamarApi`): o host (com porta) vai por GITLAB_HOST, nunca por
|
|
290
|
+
* `--hostname` (o glab recusa a porta); o login e conferido antes da primeira chamada (sem ele o glab faria o pedido
|
|
291
|
+
* anonimo); o corpo vai pelo stdin com o Content-Type; o erro sai tipado pelo status HTTP.
|
|
292
|
+
*/
|
|
238
293
|
function gitlab(binario, amb, hostPedido) {
|
|
239
294
|
const host = hostPedido ?? hostDoGitlab(amb);
|
|
295
|
+
const alvo = alvoDoGitlab(host);
|
|
296
|
+
const opcoes = { rodar: rodarNaMaquina(amb), logins: new Map() };
|
|
297
|
+
const pedir = (metodo, caminho, corpo, prazoMs = 15000) => (0, api_1.chamarApi)(alvo, { metodo, caminho, prazoMs, ...(corpo !== undefined ? { corpo } : {}) }, opcoes);
|
|
240
298
|
const repositorioDe = (v) => {
|
|
241
299
|
if (!v)
|
|
242
|
-
throw new
|
|
300
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.projetoIlegivel);
|
|
243
301
|
return { existe: true, privado: privadoDe(v), url: typeof v.http_url_to_repo === 'string' ? v.http_url_to_repo : null };
|
|
244
302
|
};
|
|
245
|
-
const
|
|
303
|
+
const repositorio = (dono, nome) => {
|
|
304
|
+
const rota = (0, pedidos_1.projetoNaApi)(`${dono}/${nome}`);
|
|
305
|
+
const r = pedir('GET', rota);
|
|
306
|
+
if (r.ok)
|
|
307
|
+
return repositorioDe(objeto(r.valor.corpo));
|
|
308
|
+
if (r.erro.codigo === 'forja.nao-achei')
|
|
309
|
+
return { existe: false, privado: null, url: null };
|
|
310
|
+
throw falhouNaApi(rota, r.erro);
|
|
311
|
+
};
|
|
246
312
|
return {
|
|
247
313
|
nome: 'gitlab', host, cli: 'glab', binario,
|
|
248
314
|
identidade() {
|
|
249
|
-
const r =
|
|
250
|
-
const login = r.ok ?
|
|
315
|
+
const r = pedir('GET', 'user');
|
|
316
|
+
const login = r.ok ? objeto(r.valor.corpo)?.username : null;
|
|
251
317
|
const usuario = typeof login === 'string' && LOGIN.test(login) ? login : null;
|
|
252
|
-
return { forja: 'gitlab', host, cli: 'glab', versao: versaoDoBinario(binario, amb), usuario, ...(usuario ? {} :
|
|
318
|
+
return { forja: 'gitlab', host, cli: 'glab', versao: versaoDoBinario(binario, amb), usuario, ...(usuario ? {} : falhaDaApi(r)) };
|
|
253
319
|
},
|
|
254
|
-
repositorio
|
|
255
|
-
|
|
256
|
-
const r =
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
320
|
+
repositorio,
|
|
321
|
+
criarPrivado(nome, descricao, dono, namespaceId) {
|
|
322
|
+
const r = pedir('POST', 'projects', { name: nome, path: nome, visibility: 'private', description: descricao,
|
|
323
|
+
...(namespaceId ? { namespace_id: namespaceId } : {}) }, 30000);
|
|
324
|
+
if (r.ok) {
|
|
325
|
+
const criado = objeto(r.valor.corpo), pedido = `${dono ?? ''}${dono ? '/' : ''}${nome}`;
|
|
326
|
+
// O projeto tem de nascer no caminho pedido: outro namespace seria uma casa que a rede nunca acharia.
|
|
327
|
+
const caminho = typeof criado?.path_with_namespace === 'string' ? criado.path_with_namespace : null;
|
|
328
|
+
if (dono && caminho !== null && caminho.toLowerCase() !== pedido.toLowerCase()) {
|
|
329
|
+
const visto = (0, texto_1.deFora)(caminho, 200);
|
|
330
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.projetoEmOutroCaminho(pedido, visto));
|
|
331
|
+
}
|
|
332
|
+
return repositorioDe(criado);
|
|
261
333
|
}
|
|
262
|
-
|
|
334
|
+
// Escrita nunca se repete sozinha: relida a casa, o projeto que a forja criou antes de a resposta se perder vale. A
|
|
335
|
+
// releitura que falha nao apaga o motivo do POST.
|
|
336
|
+
if (dono) {
|
|
337
|
+
let relido = null;
|
|
338
|
+
try {
|
|
339
|
+
relido = repositorio(dono, nome);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
relido = null;
|
|
343
|
+
}
|
|
344
|
+
if (relido?.existe)
|
|
345
|
+
return relido;
|
|
346
|
+
}
|
|
347
|
+
throw falhouNaApi('projects', r.erro);
|
|
263
348
|
},
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
return repositorioDe(json(r.stdout));
|
|
349
|
+
donoDaRede(dono) {
|
|
350
|
+
// Carga tardia: o registro chega a este modulo pelo executor da forja; importar no topo fecharia um ciclo de carga.
|
|
351
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
352
|
+
const { adaptadorDaForja, exigirCapacidade } = require('./forja/registro');
|
|
353
|
+
return exigirCapacidade(adaptadorDaForja('gitlab'), 'donoDaRede')({ api: (p) => (0, api_1.chamarApi)(alvo, p, opcoes), dono });
|
|
270
354
|
},
|
|
271
355
|
helperDeCredencial: () => helper(binario),
|
|
272
356
|
};
|