@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/network-roadmap.js
CHANGED
|
@@ -78,6 +78,8 @@ const docs_1 = require("./docs");
|
|
|
78
78
|
const fabrica_estado_1 = require("./fabrica-estado");
|
|
79
79
|
Object.defineProperty(exports, "LIMIAR_SEM_BATIDA_MS", { enumerable: true, get: function () { return fabrica_estado_1.LIMIAR_SEM_BATIDA_MS; } });
|
|
80
80
|
const forja_1 = require("./forja");
|
|
81
|
+
const endereco_1 = require("./forja/endereco");
|
|
82
|
+
const resolver_1 = require("./forja/resolver");
|
|
81
83
|
const horario_1 = require("./horario");
|
|
82
84
|
const estado_thread_1 = require("./estado-thread");
|
|
83
85
|
const manifest_1 = require("./manifest");
|
|
@@ -93,6 +95,7 @@ const vida_da_thread_1 = require("./vida-da-thread");
|
|
|
93
95
|
const thread_1 = require("./thread");
|
|
94
96
|
const versao_1 = require("./versao");
|
|
95
97
|
const yaml_1 = require("./yaml");
|
|
98
|
+
const locale_1 = require("./locale");
|
|
96
99
|
exports.CONTRATO_PANORAMA_DA_REDE = 'ork.network-roadmap/v1';
|
|
97
100
|
/** O registro de projetos da RM-052, lido como ela o grava. */
|
|
98
101
|
exports.CONTRATO_REGISTRO_DE_PROJETOS = 'ork.projetos/v1';
|
|
@@ -116,8 +119,10 @@ class ErroDoPedidoDeProjeto extends Error {
|
|
|
116
119
|
return { erro: this.codigo, detalhe: this.detalhe, candidatos: this.candidatos, correcao: this.correcao };
|
|
117
120
|
}
|
|
118
121
|
get texto() {
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
123
|
+
return [`${this.codigo}: ${m.recusaDetalhe(this.codigo, this.detalhe)}`,
|
|
124
|
+
...(this.candidatos.length ? [m.candidatos, ...this.candidatos.map((c) => ` • ${c}`)] : []),
|
|
125
|
+
m.recusaCorrecao(this.codigo, this.correcao)].join('\n');
|
|
121
126
|
}
|
|
122
127
|
}
|
|
123
128
|
exports.ErroDoPedidoDeProjeto = ErroDoPedidoDeProjeto;
|
|
@@ -138,9 +143,23 @@ const baseValida = (base) => typeof base === 'string' && /^[A-Za-z0-9][A-Za-z0-9
|
|
|
138
143
|
function projetoDoClone(c, origem) {
|
|
139
144
|
const remoto = c.manifesto.fabrica.remoto;
|
|
140
145
|
const url = (0, branch_de_estado_1.remotoValido)(remoto) ? (0, branch_de_estado_1.git)(c.raiz, ['remote', 'get-url', '--', remoto]) : null;
|
|
141
|
-
return { nome: c.manifesto.project.name, forja: url?.ok ? (
|
|
146
|
+
return { nome: c.manifesto.project.name, forja: url?.ok ? forjaDoClone(c, url.stdout.trim()) : null, raiz: c.raiz,
|
|
142
147
|
base: c.manifesto.worktree.base_branch, remoto, origem };
|
|
143
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* A forja do clone, com o manifesto: o bloco `forja:` e o host conhecido decidem, sem rede (como o pulse). So quando
|
|
151
|
+
* nenhum dos dois diz o tipo (`forja.desconhecida`) vale o nome do host, como para os remotos sem clone; o manifesto
|
|
152
|
+
* que contradiz o remoto deixa o projeto sem forja, e a leitura cai no clone.
|
|
153
|
+
*/
|
|
154
|
+
function forjaDoClone(c, url) {
|
|
155
|
+
const endereco = (0, endereco_1.lerEnderecoDoRemoto)(url);
|
|
156
|
+
if (!endereco)
|
|
157
|
+
return null;
|
|
158
|
+
const r = (0, resolver_1.resolverForja)({ endereco, manifesto: c.manifesto.forja, sondas: {} });
|
|
159
|
+
if (r.ok)
|
|
160
|
+
return (0, forja_1.identidadeDaForjaResolvida)(r.valor);
|
|
161
|
+
return r.erro.codigo === 'forja.desconhecida' ? (0, forja_1.identidadeDaForja)(url) : null;
|
|
162
|
+
}
|
|
144
163
|
function mesmoProjeto(a, b) {
|
|
145
164
|
if ((0, forja_1.mesmaForja)(a.forja, b.forja))
|
|
146
165
|
return true;
|
|
@@ -435,7 +454,7 @@ function maquinasDoPanorama(retratos, local, ctx, lacunas) {
|
|
|
435
454
|
const idadeMs = Math.max(0, agora - Date.parse(m.publicadoEm));
|
|
436
455
|
const semBatida = idadeMs > fabrica_estado_1.LIMIAR_SEM_BATIDA_MS;
|
|
437
456
|
if (semBatida) {
|
|
438
|
-
lacunas.push(lacuna('maquina.sem-batida', 'fabrica', m.maquina, `${m.maquina} sem retrato novo há ${(0, horario_1.duracaoCurta)(Math.floor(idadeMs / 60000))} (último em ${(0, horario_1.formatarDataHora)(m.publicadoEm, { fuso: ctx.fuso })}): ` +
|
|
457
|
+
lacunas.push(lacuna('maquina.sem-batida', 'fabrica', m.maquina, `${m.maquina} sem retrato novo há ${(0, horario_1.duracaoCurta)(Math.floor(idadeMs / 60000))} (último em ${(0, horario_1.formatarDataHora)(m.publicadoEm, { fuso: ctx.fuso, agora: ctx.quando })}): ` +
|
|
439
458
|
'as threads dela podem ter andado', `confira a ${m.maquina}: ela publica ao criar thread, despachar fase, entregar e a cada batida do pulse`));
|
|
440
459
|
}
|
|
441
460
|
saida.push({ maquina: m.maquina, por: m.por, publicadoEm: m.publicadoEm, idadeMin: Math.floor(idadeMs / 60000), semBatida,
|
|
@@ -613,7 +632,7 @@ function lerProjetoDoClone(p, geral) {
|
|
|
613
632
|
fontes.push({ parte, origem: 'clone', onde, ref: nome, commit: r.ponta, dataDoCommit, lidoEm: ctx.quando, atualizado: r.atualizado, existe: true });
|
|
614
633
|
if (!r.atualizado) {
|
|
615
634
|
lacunas.push(lacuna(`${parte}.sem-leitura`, parte, onde, `sem leitura nova de ${onde}${porque(r.tentou)}; ` +
|
|
616
|
-
`vale a última cópia desta máquina, commit ${r.ponta.slice(0, 7)} de ${(0, horario_1.formatarDataHora)(dataDoCommit, { fuso: ctx.fuso })}`, correcao()));
|
|
635
|
+
`vale a última cópia desta máquina, commit ${r.ponta.slice(0, 7)} de ${(0, horario_1.formatarDataHora)(dataDoCommit, { fuso: ctx.fuso, agora: ctx.quando })}`, correcao()));
|
|
617
636
|
}
|
|
618
637
|
return r.ponta;
|
|
619
638
|
}
|
|
@@ -683,10 +702,20 @@ function lerProjetoDoClone(p, geral) {
|
|
|
683
702
|
const CORRECAO_DA_FORJA = {
|
|
684
703
|
'forja.ausente': (cli) => `instale ${cli} e faça login (${cli} auth login); gateway e cron têm PATH curto`,
|
|
685
704
|
'forja.sem-login': (cli) => `rode ${cli} auth login nesta máquina; o ork nunca lê nem copia token`,
|
|
686
|
-
'forja.nao-encontrado': () => 'confira o nome (github:dono/repo) e se o login da forja enxerga o repositório',
|
|
687
|
-
'forja.tempo-esgotado': () => 'tente de novo: a forja não respondeu a tempo',
|
|
688
|
-
'forja.inacessivel': () => 'confira a rede e o status da forja',
|
|
689
705
|
'forja.resposta-invalida': () => 'a forja respondeu fora do formato esperado: registre o caso no RM-054',
|
|
706
|
+
'forja.sem-permissao': () => 'o login da forja não tem permissão para isso: confira o escopo do token',
|
|
707
|
+
'forja.nao-achei': () => 'confira o nome (github:dono/repo ou gitlab:grupo/sub/repo) e se o login da forja enxerga o repositório; ' +
|
|
708
|
+
'no GitLab, projeto privado sem acesso também responde assim',
|
|
709
|
+
'forja.limite': () => 'a forja limitou as chamadas: tente de novo mais tarde',
|
|
710
|
+
'forja.conflito': () => 'a forja recusou por conflito: atualize e tente de novo',
|
|
711
|
+
'forja.indisponivel': () => 'tente de novo e confira a rede e o status da forja',
|
|
712
|
+
'forja.pedido-recusado': () => 'a forja recusou o pedido: confira os dados enviados',
|
|
713
|
+
'forja.incompleto': () => 'a forja devolveu uma lista incompleta: tente de novo',
|
|
714
|
+
'forja.desconhecida': () => 'o ork não reconheceu a forja: declare o bloco forja: no manifesto',
|
|
715
|
+
'forja.ambigua': () => 'a forja é ambígua: declare o bloco forja: no manifesto',
|
|
716
|
+
'forja.remoto-divergente': () => 'o remoto do clone não bate com a forja declarada: confira o manifesto',
|
|
717
|
+
'forja.sem-capacidade': () => 'esta forja não oferece o recurso necessário',
|
|
718
|
+
'forja.versao-abaixo-do-piso': () => 'o servidor da forja está abaixo do GitLab 17.0, o piso do ork',
|
|
690
719
|
};
|
|
691
720
|
function lerProjetoDaForja(p, geral) {
|
|
692
721
|
const forja = p.forja, rotulo = (0, forja_1.rotuloDaForja)(forja), cli = forja.tipo === 'github' ? 'gh' : 'glab';
|
|
@@ -699,9 +728,10 @@ function lerProjetoDaForja(p, geral) {
|
|
|
699
728
|
return semLeitura();
|
|
700
729
|
}
|
|
701
730
|
const desde = inicioDoDia(geral.quando, geral.fuso);
|
|
731
|
+
const api = forja.tipo === 'gitlab' && geral.rodarDaForja ? (0, forja_1.apiDoGitlab)(forja, { rodar: geral.rodarDaForja }) : undefined;
|
|
702
732
|
const ler = (base) => (0, forja_1.lerDaForja)(forja, { base, desde, dirRoadmap: docs_1.DIR_ROADMAP, manifesto: manifest_1.NOME_MANIFESTO,
|
|
703
733
|
reservas: { branch: roadmap_reservas_1.BRANCH_DE_RESERVAS, dir: roadmap_reservas_1.DIR_DE_RESERVAS }, fabrica: { branch: fabrica_estado_1.BRANCH_DA_FABRICA, dir: fabrica_estado_1.DIR_DA_FABRICA },
|
|
704
|
-
lidoEm: geral.quando }, geral.executor);
|
|
734
|
+
lidoEm: geral.quando }, geral.executor, api);
|
|
705
735
|
let baseUsada = p.base;
|
|
706
736
|
let r = ler(p.base);
|
|
707
737
|
// Sem clone, a base e a do manifesto lido: se ele aponta outra branch, a leitura e refeita por ela.
|
|
@@ -725,7 +755,7 @@ function lerProjetoDaForja(p, geral) {
|
|
|
725
755
|
let commits = l.base?.commits ?? [], commitsParciais = l.base?.commitsParciais ?? false;
|
|
726
756
|
const inicioNoProjeto = inicioDoDia(ctx.quando, ctx.fuso);
|
|
727
757
|
if (l.base && Date.parse(inicioNoProjeto) < Date.parse(desde)) {
|
|
728
|
-
const h = (0, forja_1.lerCommitsDaForja)(forja, { commit: l.base.commit, desde: inicioNoProjeto }, geral.executor);
|
|
758
|
+
const h = (0, forja_1.lerCommitsDaForja)(forja, { commit: l.base.commit, desde: inicioNoProjeto }, geral.executor, api);
|
|
729
759
|
if (h.ok) {
|
|
730
760
|
commits = h.commits;
|
|
731
761
|
commitsParciais = h.parciais;
|
|
@@ -931,6 +961,7 @@ function montarPanoramaDaRede(opcoes = {}) {
|
|
|
931
961
|
const quando = opcoes.quando ?? new Date().toISOString();
|
|
932
962
|
const cwd = opcoes.cwd ?? process.cwd();
|
|
933
963
|
const ctx = { quando, maquina: (0, maquina_1.nomeDaMaquina)(opcoes.maquina), semRemoto: opcoes.semRemoto === true, executor: opcoes.executor,
|
|
964
|
+
rodarDaForja: opcoes.rodarDaForja,
|
|
934
965
|
fuso: (0, horario_1.fusoDoDono)().fuso };
|
|
935
966
|
const naoConsultado = [];
|
|
936
967
|
const lacunas = [];
|
|
@@ -1000,86 +1031,95 @@ function descreverProjeto(x) {
|
|
|
1000
1031
|
return `${x.nome} (${[x.forja, x.clone ? `clone em ${x.clone}` : 'sem clone nesta máquina'].filter(Boolean).join(', ')})`;
|
|
1001
1032
|
}
|
|
1002
1033
|
function linhaDaFonte(f, quando, fuso) {
|
|
1003
|
-
const
|
|
1004
|
-
const
|
|
1034
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
1035
|
+
const parte = m.fonteParte(f.parte);
|
|
1036
|
+
const lido = f.lidoEm === quando ? m.lidoAgora : m.lidoEm((0, horario_1.formatarDataHora)(f.lidoEm, { fuso, agora: quando }));
|
|
1005
1037
|
if (f.origem === 'estado-local')
|
|
1006
|
-
return
|
|
1038
|
+
return m.fonteLocal(parte, f.onde, lido);
|
|
1007
1039
|
if (!f.existe)
|
|
1008
|
-
return
|
|
1009
|
-
const alvo = f.parte === 'roadmap' ?
|
|
1010
|
-
return
|
|
1011
|
-
(f.atualizado ? lido : 'última cópia desta máquina, sem leitura nova');
|
|
1040
|
+
return m.fonteInexistente(parte, f.onde, lido);
|
|
1041
|
+
const alvo = f.parte === 'roadmap' ? m.alvoDoRoadmap(f.onde) : f.onde;
|
|
1042
|
+
return m.fonteCommit(parte, alvo, (f.commit ?? '').slice(0, 7), (0, horario_1.formatarDataHora)(f.dataDoCommit, { fuso, agora: quando }), f.atualizado ? lido : m.ultimaCopia);
|
|
1012
1043
|
}
|
|
1013
|
-
function linhasDasMaquinas(x, fuso) {
|
|
1044
|
+
function linhasDasMaquinas(x, quando, fuso) {
|
|
1045
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
1014
1046
|
if (x.maquinas === null)
|
|
1015
|
-
return [
|
|
1047
|
+
return [m.maquinasNaoLidas];
|
|
1016
1048
|
if (x.maquinas.length === 0)
|
|
1017
|
-
return [
|
|
1049
|
+
return [m.nenhumaMaquinaNaFabrica];
|
|
1018
1050
|
return x.maquinas.flatMap((m) => {
|
|
1019
|
-
const quem = `${m.maquina}${m.estaMaquina ?
|
|
1051
|
+
const quem = `${m.maquina}${m.estaMaquina ? (0, locale_1.msg)().network.roadmap.estaMaquina : ''}`;
|
|
1020
1052
|
// Fatia 3: a maquina so da rede por pessoa; as threads dela neste projeto nao foram lidas.
|
|
1021
1053
|
if (m.origem === 'rede') {
|
|
1022
|
-
return [
|
|
1023
|
-
`há ${(0, horario_1.duracaoCurta)(m.idadeMin)}${m.semBatida ? ', SEM BATIDA' : ''}) e sem retrato em ${fabrica_estado_1.BRANCH_DA_FABRICA}`];
|
|
1054
|
+
return [(0, locale_1.msg)().network.roadmap.maquinaSoNaRede(quem, (0, horario_1.formatarDataHora)(m.publicadoEm, { fuso, agora: quando }), (0, horario_1.duracaoCurta)(m.idadeMin), m.semBatida, fabrica_estado_1.BRANCH_DA_FABRICA)];
|
|
1024
1055
|
}
|
|
1025
|
-
const
|
|
1026
|
-
|
|
1027
|
-
|
|
1056
|
+
const rm = (0, locale_1.msg)().network.roadmap;
|
|
1057
|
+
const batida = m.origem === 'estado-local' ? rm.estadoLocalAgora
|
|
1058
|
+
: rm.retrato((0, horario_1.formatarDataHora)(m.publicadoEm, { fuso, agora: quando }), (0, horario_1.duracaoCurta)(m.idadeMin), m.semBatida);
|
|
1059
|
+
const cabeca = rm.resumoMaquina(quem, m.ativas.length, m.entreguesSemMaster, batida);
|
|
1028
1060
|
// RM-037 (rm037noite, defeito 4): o runtime e o modelo de cada thread, quando o retrato os traz.
|
|
1029
|
-
return [cabeca, ...m.ativas.map((t) => ` ${t.id} · ${t.modo} · ${t.fase} · ${t.roadmap ??
|
|
1061
|
+
return [cabeca, ...m.ativas.map((t) => ` ${t.id} · ${t.modo} · ${t.fase} · ${t.roadmap ?? rm.semItem}` +
|
|
1030
1062
|
(t.runtime || t.modelo ? ` · ${(0, fabrica_estado_1.runtimeDaThread)(t)}` : '') +
|
|
1031
|
-
(t.esperaVoce ?
|
|
1063
|
+
(t.esperaVoce ? rm.esperaVoce(t.pergunta ?? rm.veredito) : ''))];
|
|
1032
1064
|
});
|
|
1033
1065
|
}
|
|
1034
|
-
function linhasDasReservas(x, fuso) {
|
|
1066
|
+
function linhasDasReservas(x, quando, fuso) {
|
|
1067
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
1035
1068
|
if (x.reservas === null)
|
|
1036
|
-
return [
|
|
1069
|
+
return [m.reservasNaoLidas];
|
|
1037
1070
|
if (x.reservas.length === 0)
|
|
1038
|
-
return [
|
|
1039
|
-
return x.reservas.map((r) =>
|
|
1071
|
+
return [m.nenhumaReserva];
|
|
1072
|
+
return x.reservas.map((r) => m.reserva(r.item, r.maquina, r.thread ?? m.semThread, (0, horario_1.formatarDataHora)(r.desdeEm, { fuso, agora: quando })));
|
|
1040
1073
|
}
|
|
1041
1074
|
/** Fatia 3: a casa da rede por pessoa e as maquinas dela, com a batida e os projetos que declaram. */
|
|
1042
1075
|
function linhasDaRede(r, quando, fuso) {
|
|
1043
|
-
const
|
|
1044
|
-
const
|
|
1045
|
-
|
|
1046
|
-
|
|
1076
|
+
const x = (0, locale_1.msg)().network.roadmap;
|
|
1077
|
+
const lido = r.lidoEm === quando ? x.redeLidaAgora : x.redeLidaEm((0, horario_1.formatarDataHora)(r.lidoEm, { fuso, agora: quando }));
|
|
1078
|
+
const casa = !r.casa ? x.casaAusente
|
|
1079
|
+
: r.atualizado === null ? x.casaNaoLida(r.casa)
|
|
1080
|
+
: x.casaLida(r.casa, r.ponta ? r.ponta.slice(0, 7) : x.semCommit, r.atualizado ? lido : x.casaUltimaCopia);
|
|
1047
1081
|
if (r.membros.length === 0)
|
|
1048
|
-
return [casa,
|
|
1049
|
-
return [casa, ...r.membros.map((m) =>
|
|
1050
|
-
`${(0, horario_1.formatarDataHora)(m.publicadoEm, { fuso })}${m.idadeMin === null ? ' (batida ilegível)' : ` (há ${(0, horario_1.duracaoCurta)(m.idadeMin)})`}` +
|
|
1051
|
-
`${m.semBatida ? ', SEM BATIDA' : ''}${m.versaoOrk ? `, ork ${m.versaoOrk}` : ''}, ` +
|
|
1052
|
-
(m.projetos.length ? `projetos: ${m.projetos.join(', ')}` : 'nenhum projeto declarado aqui'))];
|
|
1082
|
+
return [casa, x.nenhumRetrato];
|
|
1083
|
+
return [casa, ...r.membros.map((m) => x.membro(m.maquina, m.estaMaquina ? x.estaMaquina : '', (0, horario_1.formatarDataHora)(m.publicadoEm, { fuso, agora: quando }), m.idadeMin === null ? x.batidaIlegivel : x.idade((0, horario_1.duracaoCurta)(m.idadeMin)), m.semBatida, m.versaoOrk ? x.versao(m.versaoOrk) : '', m.projetos.length ? x.projetos(m.projetos.join(', ')) : x.nenhumProjeto))];
|
|
1053
1084
|
}
|
|
1054
|
-
const linhaDaLacuna = (l) =>
|
|
1055
|
-
|
|
1085
|
+
const linhaDaLacuna = (l) => {
|
|
1086
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
1087
|
+
return m.lacuna(l.tipo, l.alvo ? ` (${l.alvo})` : '', m.lacunaDetalhe(l.tipo, l.parte, l.alvo, l.detalhe), m.lacunaCorrecao(l.tipo, l.correcao));
|
|
1088
|
+
};
|
|
1089
|
+
/**
|
|
1090
|
+
* O texto de `ork network roadmap`: o consultado e o nao consultado no alto, e cada parte com a fonte e a hora. RM-074 (F4):
|
|
1091
|
+
* as datas omitem o ano pelo ano da leitura (`consultadoEm`), nao pelo relogio de quem le o texto: o mesmo panorama da o
|
|
1092
|
+
* mesmo texto em qualquer dia, e o retrato pt-BR F3c nao fica vermelho na virada do ano.
|
|
1093
|
+
*/
|
|
1056
1094
|
function textoDoPanoramaDaRede(p) {
|
|
1095
|
+
const m = (0, locale_1.msg)().network.roadmap;
|
|
1057
1096
|
if (p.contrato !== exports.CONTRATO_PANORAMA_DA_REDE)
|
|
1058
|
-
throw new Error(
|
|
1097
|
+
throw new Error(m.contratoInvalido);
|
|
1059
1098
|
const h = (0, horario_1.partesLocais)(p.consultadoEm, p.fuso);
|
|
1060
1099
|
const linhas = [
|
|
1061
1100
|
`Panorama da rede lido de ${p.maquina} (${h.dia}/${h.mes}, ${h.hora}:${h.minuto})`,
|
|
1062
1101
|
p.projetos.length ? `Consultado: ${p.projetos.map((x) => descreverProjeto(x.projeto)).join('; ')}` : 'Consultado: nenhum projeto.',
|
|
1063
|
-
'Não consultado:', ...(p.naoConsultado.length ? p.naoConsultado.map(
|
|
1102
|
+
'Não consultado:', ...(p.naoConsultado.length ? p.naoConsultado.map(m.naoConsultado) : [m.nadaForaDoPedido]),
|
|
1064
1103
|
];
|
|
1065
1104
|
if (p.rede)
|
|
1066
|
-
linhas.push('',
|
|
1105
|
+
linhas.push('', m.redePorPessoa, ...linhasDaRede(p.rede, p.consultadoEm, p.fuso));
|
|
1067
1106
|
if (p.lacunas.length)
|
|
1068
|
-
linhas.push('',
|
|
1107
|
+
linhas.push('', m.lacunasDaConsulta, ...p.lacunas.map(linhaDaLacuna));
|
|
1069
1108
|
for (const x of p.projetos) {
|
|
1070
1109
|
// Cada projeto no fuso do dono dele (achado 5 da rodada 2): a legenda do bloco diz quando difere.
|
|
1071
1110
|
const fuso = x.projeto.fuso;
|
|
1072
1111
|
linhas.push('', '────────', '');
|
|
1073
1112
|
// Fatia 2 do ensaio (P7): o fuso ja sai no fim do panorama (e no bloco, quando difere): sem a legenda do status.
|
|
1074
1113
|
linhas.push(x.roadmap ? (0, roadmap_status_1.textoDoStatusDoRoadmap)(x.roadmap, fuso, { legenda: false })
|
|
1075
|
-
:
|
|
1076
|
-
linhas.push('',
|
|
1077
|
-
linhas.push('',
|
|
1078
|
-
linhas.push('',
|
|
1079
|
-
linhas.push('',
|
|
1114
|
+
: m.roadmapNaoLido(x.projeto.nome, x.lacunas.map((l) => l.tipo).filter((t) => t !== 'projeto.sem-clone').join(', ') || m.semFonte));
|
|
1115
|
+
linhas.push('', m.threadsPorMaquina, ...linhasDasMaquinas(x, p.consultadoEm, fuso));
|
|
1116
|
+
linhas.push('', m.reservas, ...linhasDasReservas(x, p.consultadoEm, fuso));
|
|
1117
|
+
linhas.push('', m.fontes, ...(x.fontes.length ? x.fontes.map((f) => linhaDaFonte(f, p.consultadoEm, fuso)) : [m.nenhumaFonte]));
|
|
1118
|
+
linhas.push('', m.lacunas, ...(x.lacunas.length ? x.lacunas.map(linhaDaLacuna) : [m.nenhumaLacuna]));
|
|
1119
|
+
// A legenda e a da hora da leitura, como os horarios do panorama: com a de agora, o horario de verao mudava o texto.
|
|
1080
1120
|
if (fuso !== p.fuso)
|
|
1081
|
-
linhas.push('',
|
|
1121
|
+
linhas.push('', m.nesteProjeto((0, horario_1.legendaDoFuso)(fuso, p.consultadoEm)));
|
|
1082
1122
|
}
|
|
1083
|
-
linhas.push('', (0, horario_1.legendaDoFuso)(p.fuso));
|
|
1123
|
+
linhas.push('', (0, horario_1.legendaDoFuso)(p.fuso, p.consultadoEm));
|
|
1084
1124
|
return linhas.join('\n');
|
|
1085
1125
|
}
|