@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/branch-de-estado.js
CHANGED
|
@@ -61,6 +61,7 @@ const fs = __importStar(require("node:fs"));
|
|
|
61
61
|
const os = __importStar(require("node:os"));
|
|
62
62
|
const path = __importStar(require("node:path"));
|
|
63
63
|
const redacao_url_1 = require("./redacao-url");
|
|
64
|
+
const locale_1 = require("./locale");
|
|
64
65
|
function git(raiz, args, extra = {}) {
|
|
65
66
|
const r = (0, node_child_process_1.spawnSync)('git', args, { cwd: raiz, encoding: 'utf8', input: extra.input, timeout: extra.timeoutMs ?? 60000,
|
|
66
67
|
env: { ...process.env, ...extra.env } });
|
|
@@ -68,8 +69,11 @@ function git(raiz, args, extra = {}) {
|
|
|
68
69
|
}
|
|
69
70
|
function exigirGit(raiz, args, prefixo, extra = {}) {
|
|
70
71
|
const r = git(raiz, args, extra);
|
|
71
|
-
if (!r.ok)
|
|
72
|
-
|
|
72
|
+
if (!r.ok) {
|
|
73
|
+
// RM-061 (F3b, GO-FIX 1): pelo catalogo, com o codigo `<prefixo>.git` igual; a saida do git vai como veio.
|
|
74
|
+
const comando = args[0], saida = r.stderr.trim().split('\n').pop() ?? '';
|
|
75
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.gitFalhou(prefixo, comando, saida));
|
|
76
|
+
}
|
|
73
77
|
return r.stdout;
|
|
74
78
|
}
|
|
75
79
|
/**
|
|
@@ -104,9 +108,9 @@ function remotoRedigido(remoto) {
|
|
|
104
108
|
function exigirRemoto(remoto, prefixo) {
|
|
105
109
|
if ((0, exports.remotoValido)(remoto))
|
|
106
110
|
return remoto;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
// RM-061 (F3b): a recusa nasce do catalogo; o codigo `<prefixo>.remoto-invalido` e o mesmo nas duas linguas.
|
|
112
|
+
const redigido = remotoRedigido(remoto);
|
|
113
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.remotoInvalido(prefixo, redigido));
|
|
110
114
|
}
|
|
111
115
|
/**
|
|
112
116
|
* RM-047 (fronteira de confiança): nome de branch que pode ir ao git como argumento. O valor vem do
|
|
@@ -179,7 +183,7 @@ function jsonsDaPonta(raiz, ponta, dir, prefixo) {
|
|
|
179
183
|
* Grava uma versao nova da branch em cima de `ponta`, sem tocar arvore de trabalho nem indice:
|
|
180
184
|
* indice temporario, blobs, `write-tree` e `commit-tree`. Push sem forca; recusa volta `false`.
|
|
181
185
|
*/
|
|
182
|
-
function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo, rede = {}) {
|
|
186
|
+
function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo, rede = {}, autor) {
|
|
183
187
|
exigirRemoto(remoto, prefixo);
|
|
184
188
|
const indice = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'ork-branch-estado-')), 'index');
|
|
185
189
|
const env = { GIT_INDEX_FILE: indice };
|
|
@@ -188,17 +192,25 @@ function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo
|
|
|
188
192
|
exigirGit(raiz, ['read-tree', ponta], prefixo, { env });
|
|
189
193
|
else
|
|
190
194
|
exigirGit(raiz, ['read-tree', '--empty'], prefixo, { env });
|
|
191
|
-
for (const m of mudancas) {
|
|
195
|
+
for (const [i, m] of mudancas.entries()) {
|
|
192
196
|
if (m.conteudo === null) {
|
|
193
197
|
exigirGit(raiz, ['update-index', '--force-remove', m.caminho], prefixo, { env });
|
|
194
198
|
}
|
|
195
199
|
else {
|
|
196
|
-
|
|
200
|
+
// `spawnSync` nem sempre fecha o pipe de entrada em runtimes hospedados, deixando o
|
|
201
|
+
// `hash-object --stdin` preso mesmo depois de receber todos os bytes. Um arquivo privado no
|
|
202
|
+
// mesmo diretorio temporario conserva o conteudo exato e torna o termino deterministico.
|
|
203
|
+
const conteudo = path.join(path.dirname(indice), `conteudo-${i}`);
|
|
204
|
+
fs.writeFileSync(conteudo, m.conteudo, { mode: 0o600 });
|
|
205
|
+
const blob = exigirGit(raiz, ['hash-object', '-w', conteudo], prefixo).trim();
|
|
197
206
|
exigirGit(raiz, ['update-index', '--add', '--cacheinfo', `100644,${blob},${m.caminho}`], prefixo, { env });
|
|
198
207
|
}
|
|
199
208
|
}
|
|
200
209
|
const arvore = exigirGit(raiz, ['write-tree'], prefixo, { env }).trim();
|
|
201
|
-
|
|
210
|
+
// RM-058 N3 (S6 da revisão da ork-rm058n3): quem grava pode dar a identidade do commit, para a do git da pessoa não ir ao remoto.
|
|
211
|
+
const identidade = autor ? { env: { GIT_AUTHOR_NAME: autor.nome, GIT_AUTHOR_EMAIL: autor.email, GIT_COMMITTER_NAME: autor.nome,
|
|
212
|
+
GIT_COMMITTER_EMAIL: autor.email } } : {};
|
|
213
|
+
const commit = exigirGit(raiz, ['commit-tree', arvore, ...(ponta ? ['-p', ponta] : []), '-m', mensagem], prefixo, identidade).trim();
|
|
202
214
|
// `rede`: prazo e ambiente so do que vai a rede (RM-037, achado A3: o fechamento nao espera 60 s).
|
|
203
215
|
const push = git(raiz, ['push', '--quiet', '--', remoto, `${commit}:refs/heads/${branch}`], rede);
|
|
204
216
|
if (push.ok) {
|
|
@@ -207,7 +219,8 @@ function gravarNaBranch(raiz, remoto, branch, ponta, mudancas, mensagem, prefixo
|
|
|
207
219
|
}
|
|
208
220
|
if (/rejected|non-fast-forward|fetch first|stale info|failed to push/i.test(push.stderr))
|
|
209
221
|
return false;
|
|
210
|
-
|
|
222
|
+
const saida = push.stderr.trim().split('\n').pop() ?? '';
|
|
223
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.pushFalhou(prefixo, remoto, saida));
|
|
211
224
|
}
|
|
212
225
|
finally {
|
|
213
226
|
fs.rmSync(path.dirname(indice), { recursive: true, force: true });
|
package/dist/busca-semantica.js
CHANGED
|
@@ -22,6 +22,7 @@ exports.fundirRrf = fundirRrf;
|
|
|
22
22
|
exports.buscarPorSignificado = buscarPorSignificado;
|
|
23
23
|
exports.textoDaBuscaPorSignificado = textoDaBuscaPorSignificado;
|
|
24
24
|
const indice_vetorial_1 = require("./indice-vetorial");
|
|
25
|
+
const locale_1 = require("./locale");
|
|
25
26
|
exports.MODOS_DE_BUSCA = ['hibrido', 'vetor', 'fts'];
|
|
26
27
|
/** D9: constante da fusao RRF. */
|
|
27
28
|
exports.RRF_K = 60;
|
|
@@ -185,17 +186,18 @@ function buscarPorSignificado(o) {
|
|
|
185
186
|
* id do FTS fora do universo e o aviso de cobertura vivem nele, e o texto os perdia na busca que deu certo.
|
|
186
187
|
*/
|
|
187
188
|
function textoDaBuscaPorSignificado(r) {
|
|
188
|
-
const
|
|
189
|
+
const m = (0, locale_1.msg)().operacao.restante.memory.busca;
|
|
190
|
+
const linhas = [m.titulo(r.modo, r.origem, r.modeloUsado ?? '')];
|
|
189
191
|
if (r.motivo)
|
|
190
|
-
linhas.push(
|
|
192
|
+
linhas.push(m.motivo(r.motivo, r.detalhe));
|
|
191
193
|
else if (r.detalhe)
|
|
192
|
-
linhas.push(
|
|
194
|
+
linhas.push(m.detalhe(r.detalhe));
|
|
193
195
|
linhas.push('');
|
|
194
196
|
r.resultados.forEach((e, i) => {
|
|
195
|
-
const sim = e.similaridade === null ? '' :
|
|
197
|
+
const sim = e.similaridade === null ? '' : m.similaridade(e.similaridade);
|
|
196
198
|
linhas.push(` ${i + 1}. [${e.collection}] ${e.id} score ${e.score} ${e.fontes.join('+')}${sim}`);
|
|
197
199
|
linhas.push(` ${e.resumo}`);
|
|
198
200
|
});
|
|
199
|
-
linhas.push('',
|
|
201
|
+
linhas.push('', m.resumo(r.resultados.length));
|
|
200
202
|
return linhas.join('\n');
|
|
201
203
|
}
|
package/dist/catalogo.js
CHANGED
|
@@ -52,6 +52,7 @@ exports.skillsDoCatalogo = skillsDoCatalogo;
|
|
|
52
52
|
exports.referenciasDoCatalogo = referenciasDoCatalogo;
|
|
53
53
|
const fs = __importStar(require("node:fs"));
|
|
54
54
|
const path = __importStar(require("node:path"));
|
|
55
|
+
const locale_1 = require("./locale");
|
|
55
56
|
/** O que precisa existir para um diretorio ser a raiz do catalogo. */
|
|
56
57
|
const MARCAS = ['skills', 'references', 'eval'];
|
|
57
58
|
function ehRaizDoCatalogo(dir) {
|
|
@@ -81,7 +82,7 @@ function raizDoCatalogo(inicial) {
|
|
|
81
82
|
function exigirCatalogo(inicial) {
|
|
82
83
|
const raiz = raizDoCatalogo(inicial);
|
|
83
84
|
if (!raiz) {
|
|
84
|
-
throw new
|
|
85
|
+
throw new locale_1.ErroDoCatalogo((m) => m.adapter.catalogoNaoEncontrado);
|
|
85
86
|
}
|
|
86
87
|
return raiz;
|
|
87
88
|
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RM-063 (F7): a reconciliacao deterministica do CHANGELOG no merge da base na branch da thread.
|
|
4
|
+
*
|
|
5
|
+
* Incidente de 12 e 13/10/2026: os PRs #153 e #154 ficaram prontos e esperaram de 5 a 6 horas pelo condutor, e cada
|
|
6
|
+
* merge da outra maquina na `main` reabria o conflito no CHANGELOG. Duas formas do mesmo defeito:
|
|
7
|
+
*
|
|
8
|
+
* - o PR de versao troca `## Não publicado` pela secao da versao (`## [0.5.6] - ...`), e o merge da `main` na branch
|
|
9
|
+
* poe os itens da thread DENTRO da versao publicada, sem conflito nenhum; o `checar-changelog` do CI acusa
|
|
10
|
+
* `changelog.linha-ausente`;
|
|
11
|
+
* - duas threads acrescentam item no topo do mesmo grupo de `## Não publicado`, e o merge conflita so no CHANGELOG.
|
|
12
|
+
*
|
|
13
|
+
* O condutor resolvia a mao, com um script. Aqui a mesma regra, num lugar so e sem adivinhar: os itens que a thread
|
|
14
|
+
* acrescentou a `## Não publicado` (os que nem a base comum nem a `main` tem) voltam para la, no mesmo grupo
|
|
15
|
+
* (`### Adicionado`, `### Corrigido`...), no fim dele e na ordem da thread. O resto do arquivo e o da `main` (no conflito)
|
|
16
|
+
* ou o do merge (sem conflito): as secoes publicadas nunca recebem nem perdem item da thread por esta funcao. Item que a
|
|
17
|
+
* thread tirou de `## Não publicado` (a linha reescrita, por exemplo) sai tambem de la, e so de la.
|
|
18
|
+
*
|
|
19
|
+
* Funcao pura: recebe os tres textos (base comum, o da thread e o da `main`) e, quando houve, o resultado do merge sem
|
|
20
|
+
* conflito. Quem roda o git e decide se o conflito e so no CHANGELOG e `conducao-batida.ts`.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.SECAO_NAO_PUBLICADA = exports.ARQUIVO_DO_CHANGELOG = void 0;
|
|
24
|
+
exports.temMarcadorDeConflito = temMarcadorDeConflito;
|
|
25
|
+
exports.reconciliarChangelog = reconciliarChangelog;
|
|
26
|
+
exports.ARQUIVO_DO_CHANGELOG = 'CHANGELOG.md';
|
|
27
|
+
exports.SECAO_NAO_PUBLICADA = '## Não publicado';
|
|
28
|
+
/** A ordem dos grupos que o CHANGELOG ja usa; grupo fora dela vai para o fim da secao. */
|
|
29
|
+
const ORDEM_DOS_GRUPOS = ['Adicionado', 'Alterado', 'Mudado', 'Corrigido', 'Removido', 'Segurança'];
|
|
30
|
+
/** As pontas do conflito do git; o `=======` sozinho tambem e o sublinhado de um titulo setext, e nao conta. */
|
|
31
|
+
const INICIO_DO_CONFLITO = /^<{7}( |$)/m;
|
|
32
|
+
const FIM_DO_CONFLITO = /^>{7}( |$)/m;
|
|
33
|
+
const ehTitulo = (l) => /^#{1,6} /.test(l);
|
|
34
|
+
const ehSecao = (l) => /^## /.test(l);
|
|
35
|
+
const ehGrupo = (l) => /^### /.test(l);
|
|
36
|
+
const ehItem = (l) => /^[-*] /.test(l);
|
|
37
|
+
const emBranco = (l) => l.trim() === '';
|
|
38
|
+
const recuada = (l) => /^\s+\S/.test(l);
|
|
39
|
+
const chaveDe = (linhas) => linhas.map((l) => l.trimEnd()).join('\n');
|
|
40
|
+
/** As linhas do texto, sem o `\r` do Windows. */
|
|
41
|
+
function linhasDe(texto) {
|
|
42
|
+
return texto.replace(/\r\n/g, '\n').split('\n');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Os itens de lista de primeiro nivel do CHANGELOG, com a secao e o grupo de cada um. O item vai da linha `- ` ate a
|
|
46
|
+
* proxima linha que nao e continuacao dele: continuacao e a linha recuada, e a linha em branco so continua o item
|
|
47
|
+
* quando a seguinte nao vazia e recuada.
|
|
48
|
+
*/
|
|
49
|
+
function itensDe(linhas) {
|
|
50
|
+
const itens = [];
|
|
51
|
+
let secao = null, grupo = null;
|
|
52
|
+
for (let i = 0; i < linhas.length; i++) {
|
|
53
|
+
const l = linhas[i];
|
|
54
|
+
if (ehSecao(l)) {
|
|
55
|
+
secao = l.trim();
|
|
56
|
+
grupo = null;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (ehGrupo(l)) {
|
|
60
|
+
grupo = l.replace(/^###\s+/, '').trim();
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (ehTitulo(l) || !ehItem(l))
|
|
64
|
+
continue;
|
|
65
|
+
let fim = i + 1;
|
|
66
|
+
while (fim < linhas.length) {
|
|
67
|
+
const c = linhas[fim];
|
|
68
|
+
if (recuada(c)) {
|
|
69
|
+
fim++;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (emBranco(c)) {
|
|
73
|
+
let k = fim;
|
|
74
|
+
while (k < linhas.length && emBranco(linhas[k]))
|
|
75
|
+
k++;
|
|
76
|
+
if (k < linhas.length && recuada(linhas[k])) {
|
|
77
|
+
fim = k;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
itens.push({ secao, grupo, inicio: i, fim, chave: chaveDe(linhas.slice(i, fim)) });
|
|
84
|
+
i = fim - 1;
|
|
85
|
+
}
|
|
86
|
+
return itens;
|
|
87
|
+
}
|
|
88
|
+
/** As linhas [inicio, fim) da secao `## Não publicado`, sem o titulo; `null` sem ela. */
|
|
89
|
+
function faixaDaSecao(linhas) {
|
|
90
|
+
const titulo = linhas.findIndex((l) => l.trim() === exports.SECAO_NAO_PUBLICADA);
|
|
91
|
+
if (titulo < 0)
|
|
92
|
+
return null;
|
|
93
|
+
let fim = titulo + 1;
|
|
94
|
+
while (fim < linhas.length && !ehSecao(linhas[fim]))
|
|
95
|
+
fim++;
|
|
96
|
+
return { titulo, inicio: titulo + 1, fim };
|
|
97
|
+
}
|
|
98
|
+
/** Junta as linhas em branco seguidas numa so (MD012), fora dos blocos de codigo cercados, que ficam como estao. */
|
|
99
|
+
function semBrancosRepetidos(linhas) {
|
|
100
|
+
const saida = [];
|
|
101
|
+
let cerca = null;
|
|
102
|
+
for (const l of linhas) {
|
|
103
|
+
const marca = /^\s*(`{3,}|~{3,})/.exec(l)?.[1] ?? null;
|
|
104
|
+
if (marca && (cerca === null || marca[0] === cerca[0]))
|
|
105
|
+
cerca = cerca === null ? marca : null;
|
|
106
|
+
if (cerca === null && !marca && emBranco(l) && saida.length > 0 && emBranco(saida[saida.length - 1]))
|
|
107
|
+
continue;
|
|
108
|
+
saida.push(cerca === null && emBranco(l) ? '' : l);
|
|
109
|
+
}
|
|
110
|
+
return saida;
|
|
111
|
+
}
|
|
112
|
+
/** Quantas vezes cada linha nao vazia aparece (sem o espaco do fim). */
|
|
113
|
+
function contagem(linhas) {
|
|
114
|
+
const m = new Map();
|
|
115
|
+
for (const l of linhas) {
|
|
116
|
+
const k = l.trimEnd();
|
|
117
|
+
if (k.trim())
|
|
118
|
+
m.set(k, (m.get(k) ?? 0) + 1);
|
|
119
|
+
}
|
|
120
|
+
return m;
|
|
121
|
+
}
|
|
122
|
+
/** As linhas que a thread acrescentou (do lado dela, alem das da base) e que o resultado nao tem tantas vezes. */
|
|
123
|
+
function linhasPerdidas(base, nosso, resultado) {
|
|
124
|
+
const daBase = contagem(base), doResultado = contagem(resultado);
|
|
125
|
+
const perdidas = [];
|
|
126
|
+
for (const [linha, vezes] of contagem(nosso)) {
|
|
127
|
+
const acrescentadas = vezes - (daBase.get(linha) ?? 0);
|
|
128
|
+
if (acrescentadas > 0 && (doResultado.get(linha) ?? 0) < acrescentadas)
|
|
129
|
+
perdidas.push(linha);
|
|
130
|
+
}
|
|
131
|
+
return perdidas;
|
|
132
|
+
}
|
|
133
|
+
/** Tira os grupos `### ...` que ficaram sem item nenhum por causa da remocao (os que ja eram vazios ficam). */
|
|
134
|
+
function semGruposEsvaziados(linhas, esvaziados) {
|
|
135
|
+
const tirar = new Set();
|
|
136
|
+
for (const g of esvaziados) {
|
|
137
|
+
let k = g + 1;
|
|
138
|
+
while (k < linhas.length && emBranco(linhas[k]))
|
|
139
|
+
k++;
|
|
140
|
+
if (k >= linhas.length || ehTitulo(linhas[k]))
|
|
141
|
+
tirar.add(g);
|
|
142
|
+
}
|
|
143
|
+
return linhas.filter((_, i) => !tirar.has(i));
|
|
144
|
+
}
|
|
145
|
+
/** O indice do titulo do grupo dentro da faixa, ou -1. */
|
|
146
|
+
function grupoNaFaixa(linhas, faixa, grupo) {
|
|
147
|
+
for (let i = faixa.inicio; i < faixa.fim; i++) {
|
|
148
|
+
if (ehGrupo(linhas[i]) && linhas[i].replace(/^###\s+/, '').trim() === grupo)
|
|
149
|
+
return i;
|
|
150
|
+
}
|
|
151
|
+
return -1;
|
|
152
|
+
}
|
|
153
|
+
/** Onde o item entra no grupo: depois da ultima linha nao vazia antes do proximo titulo. */
|
|
154
|
+
function fimDoGrupo(linhas, titulo, limite) {
|
|
155
|
+
let fim = titulo + 1;
|
|
156
|
+
while (fim < limite && !ehTitulo(linhas[fim]))
|
|
157
|
+
fim++;
|
|
158
|
+
while (fim > titulo + 1 && emBranco(linhas[fim - 1]))
|
|
159
|
+
fim--;
|
|
160
|
+
return fim;
|
|
161
|
+
}
|
|
162
|
+
/** Garante a secao `## Não publicado` antes da primeira versao e devolve as linhas com ela. */
|
|
163
|
+
function comSecao(linhas) {
|
|
164
|
+
if (faixaDaSecao(linhas))
|
|
165
|
+
return linhas;
|
|
166
|
+
const primeira = linhas.findIndex((l) => ehSecao(l));
|
|
167
|
+
const em = primeira < 0 ? linhas.length : primeira;
|
|
168
|
+
return [...linhas.slice(0, em), exports.SECAO_NAO_PUBLICADA, '', ...linhas.slice(em)];
|
|
169
|
+
}
|
|
170
|
+
/** Insere o item no grupo dele em `## Não publicado`, criando o grupo na ordem do CHANGELOG quando falta. */
|
|
171
|
+
function inserirNoGrupo(linhas, grupo, item) {
|
|
172
|
+
const faixa = faixaDaSecao(linhas);
|
|
173
|
+
if (grupo === null) {
|
|
174
|
+
// Item solto na secao (sem `###`): entra antes do primeiro grupo, depois dos soltos que ja estao la.
|
|
175
|
+
let em = faixa.inicio;
|
|
176
|
+
while (em < faixa.fim && !ehGrupo(linhas[em]))
|
|
177
|
+
em++;
|
|
178
|
+
while (em > faixa.inicio && emBranco(linhas[em - 1]))
|
|
179
|
+
em--;
|
|
180
|
+
return [...linhas.slice(0, em), ...(em === faixa.inicio ? [''] : []), ...item, '', ...linhas.slice(em)];
|
|
181
|
+
}
|
|
182
|
+
const titulo = grupoNaFaixa(linhas, faixa, grupo);
|
|
183
|
+
if (titulo >= 0) {
|
|
184
|
+
const em = fimDoGrupo(linhas, titulo, faixa.fim);
|
|
185
|
+
const vazio = em === titulo + 1;
|
|
186
|
+
return [...linhas.slice(0, em), ...(vazio ? [''] : []), ...item, ...linhas.slice(em)];
|
|
187
|
+
}
|
|
188
|
+
// O grupo ainda nao existe na secao: entra antes do primeiro grupo que vem depois dele na ordem conhecida.
|
|
189
|
+
const ordem = (g) => { const i = ORDEM_DOS_GRUPOS.indexOf(g); return i < 0 ? ORDEM_DOS_GRUPOS.length : i; };
|
|
190
|
+
let em = faixa.fim;
|
|
191
|
+
for (let i = faixa.inicio; i < faixa.fim; i++) {
|
|
192
|
+
if (ehGrupo(linhas[i]) && ordem(linhas[i].replace(/^###\s+/, '').trim()) > ordem(grupo)) {
|
|
193
|
+
em = i;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return [...linhas.slice(0, em), '', `### ${grupo}`, '', ...item, '', ...linhas.slice(em)];
|
|
198
|
+
}
|
|
199
|
+
/** O texto tem as duas pontas de um conflito do git? */
|
|
200
|
+
function temMarcadorDeConflito(texto) {
|
|
201
|
+
return INICIO_DO_CONFLITO.test(texto) && FIM_DO_CONFLITO.test(texto);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Reconcilia o CHANGELOG depois do merge da base na branch da thread. Os itens da thread em `## Não publicado`
|
|
205
|
+
* voltam para la, no mesmo grupo; o que a thread tirou de la sai de la; o resto e o da `main` ou o do merge.
|
|
206
|
+
*/
|
|
207
|
+
function reconciliarChangelog(e) {
|
|
208
|
+
const base = linhasDe(e.base), nosso = linhasDe(e.nosso), deles = linhasDe(e.deles);
|
|
209
|
+
const daBase = itensDe(base), dosNossos = itensDe(nosso), dosDeles = itensDe(deles);
|
|
210
|
+
const chavesDaBase = new Set(daBase.map((i) => i.chave));
|
|
211
|
+
const chavesDosDeles = new Set(dosDeles.map((i) => i.chave));
|
|
212
|
+
// Os itens da thread: em `## Não publicado` do lado dela, e em nenhum lugar da base comum nem da `main`.
|
|
213
|
+
const vistos = new Set();
|
|
214
|
+
const daThread = dosNossos.filter((i) => i.secao === exports.SECAO_NAO_PUBLICADA && !chavesDaBase.has(i.chave) &&
|
|
215
|
+
!chavesDosDeles.has(i.chave) && !vistos.has(i.chave) && (vistos.add(i.chave), true));
|
|
216
|
+
// O que a thread tirou de `## Não publicado`: estava la na base comum e nao esta mais em lugar nenhum do lado dela.
|
|
217
|
+
const chavesDosNossos = new Set(dosNossos.map((i) => i.chave));
|
|
218
|
+
const tiradas = new Set(daBase.filter((i) => i.secao === exports.SECAO_NAO_PUBLICADA && !chavesDosNossos.has(i.chave)).map((i) => i.chave));
|
|
219
|
+
const textoInicial = e.mesclado && !temMarcadorDeConflito(e.mesclado) ? e.mesclado : e.deles;
|
|
220
|
+
const crlf = textoInicial.includes('\r\n');
|
|
221
|
+
const fimDeLinha = textoInicial.endsWith('\n');
|
|
222
|
+
let linhas = linhasDe(textoInicial);
|
|
223
|
+
if (fimDeLinha)
|
|
224
|
+
linhas.pop();
|
|
225
|
+
const original = chaveDe(linhas);
|
|
226
|
+
// A thread que nao acrescentou nem tirou item de "Não publicado" nao muda nada: o arquivo fica como o merge (ou a main)
|
|
227
|
+
// o deixou, sem normalizar o que nao e dela.
|
|
228
|
+
if (!daThread.length && !tiradas.size) {
|
|
229
|
+
return { texto: textoInicial, perdidas: linhasPerdidas(base, nosso, linhas), itens: [], devolvidos: 0, mudou: false };
|
|
230
|
+
}
|
|
231
|
+
// 1. Tira os itens da thread de onde o merge os pos, e os tirados pela thread de `## Não publicado`. O item da thread
|
|
232
|
+
// que o merge deixou em `## Não publicado`, no grupo dele, fica onde esta (a primeira vez); as outras copias saem.
|
|
233
|
+
const grupoDaThread = new Map(daThread.map((i) => [i.chave, i.grupo]));
|
|
234
|
+
const noLugar = new Set();
|
|
235
|
+
const remover = itensDe(linhas).filter((i) => {
|
|
236
|
+
if (i.secao === exports.SECAO_NAO_PUBLICADA && tiradas.has(i.chave))
|
|
237
|
+
return true;
|
|
238
|
+
if (!grupoDaThread.has(i.chave))
|
|
239
|
+
return false;
|
|
240
|
+
if (i.secao === exports.SECAO_NAO_PUBLICADA && i.grupo === grupoDaThread.get(i.chave) && !noLugar.has(i.chave)) {
|
|
241
|
+
noLugar.add(i.chave);
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
});
|
|
246
|
+
const gruposTocados = new Set();
|
|
247
|
+
for (const i of remover) {
|
|
248
|
+
for (let g = i.inicio - 1; g >= 0; g--) {
|
|
249
|
+
if (ehGrupo(linhas[g])) {
|
|
250
|
+
gruposTocados.add(g);
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
if (ehSecao(linhas[g]))
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const linhasRemovidas = new Set();
|
|
258
|
+
for (const i of remover)
|
|
259
|
+
for (let k = i.inicio; k < i.fim; k++)
|
|
260
|
+
linhasRemovidas.add(k);
|
|
261
|
+
// Os titulos de grupo que ficaram vazios saem, com o indice ajustado pela remocao.
|
|
262
|
+
const novoIndice = new Map();
|
|
263
|
+
let n = 0;
|
|
264
|
+
const filtradas = [];
|
|
265
|
+
for (let k = 0; k < linhas.length; k++) {
|
|
266
|
+
if (linhasRemovidas.has(k))
|
|
267
|
+
continue;
|
|
268
|
+
novoIndice.set(k, n++);
|
|
269
|
+
filtradas.push(linhas[k]);
|
|
270
|
+
}
|
|
271
|
+
linhas = semGruposEsvaziados(filtradas, new Set([...gruposTocados].map((g) => novoIndice.get(g)).filter((g) => g !== undefined)));
|
|
272
|
+
// 2. Os itens da thread que nao ficaram no lugar entram em `## Não publicado`, no grupo de cada um, na ordem da thread.
|
|
273
|
+
const aDevolver = daThread.filter((i) => !noLugar.has(i.chave));
|
|
274
|
+
if (aDevolver.length)
|
|
275
|
+
linhas = comSecao(linhas);
|
|
276
|
+
for (const i of aDevolver)
|
|
277
|
+
linhas = inserirNoGrupo(linhas, i.grupo, nosso.slice(i.inicio, i.fim).map((l) => l.trimEnd()));
|
|
278
|
+
linhas = semBrancosRepetidos(linhas);
|
|
279
|
+
while (linhas.length && emBranco(linhas[linhas.length - 1]))
|
|
280
|
+
linhas.pop();
|
|
281
|
+
const quebra = crlf ? '\r\n' : '\n';
|
|
282
|
+
const texto = linhas.join(quebra) + (fimDeLinha ? quebra : '');
|
|
283
|
+
return {
|
|
284
|
+
texto,
|
|
285
|
+
perdidas: linhasPerdidas(base, nosso, linhas),
|
|
286
|
+
itens: daThread.map((i) => ({ grupo: i.grupo, titulo: nosso[i.inicio].trim().slice(0, 200) })),
|
|
287
|
+
devolvidos: aDevolver.length,
|
|
288
|
+
mudou: chaveDe(linhas) !== original,
|
|
289
|
+
};
|
|
290
|
+
}
|