@orkastery/cli 0.5.1 → 0.5.6
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/claude-code/README.md +158 -0
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
- package/adapters/openclaw/README.md +26 -5
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +46 -11
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +49 -11
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +116 -18
- package/dist/adapters/codex.js +14 -4
- package/dist/agents-md.js +24 -14
- package/dist/auditrun.js +22 -3
- package/dist/board.js +20 -17
- package/dist/branch-de-estado.js +88 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +21 -8
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +41 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +36 -1
- package/dist/conducao-sentinela.js +388 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +122 -30
- package/dist/conhecimento.js +490 -0
- package/dist/docs.js +70 -17
- package/dist/doctor-pulse-cron.js +349 -0
- package/dist/doctor-rede.js +150 -0
- package/dist/doctor.js +195 -111
- package/dist/entrega-pr.js +42 -29
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +181 -0
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +52 -14
- package/dist/fabrica-publicar.js +9 -1
- package/dist/fechamento.js +20 -66
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +31 -7
- package/dist/gates.js +3 -24
- package/dist/handoff.js +10 -6
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +38 -3
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/hitl.js +29 -33
- package/dist/horario.js +41 -7
- package/dist/hosts.js +104 -11
- package/dist/impedimento.js +299 -0
- package/dist/index.js +961 -542
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +9 -1
- package/dist/init.js +56 -43
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +170 -16
- package/dist/intelligence-graph-contexto.js +254 -0
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/leases.js +664 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +18 -1
- package/dist/licoes.js +1 -0
- package/dist/liveness.js +6 -3
- package/dist/locale-ajuda.js +761 -0
- package/dist/locale-gerados.js +160 -0
- package/dist/locale-master.js +99 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-pulse.js +211 -0
- package/dist/locale-retry.js +385 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-ship.js +494 -0
- package/dist/locale-thread.js +277 -0
- package/dist/locale-verify.js +125 -0
- package/dist/locale.js +714 -0
- package/dist/maestro-runtime.js +4 -1
- package/dist/manifest.js +149 -4
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +18 -11
- package/dist/master.js +145 -31
- package/dist/mcp-artifacts.js +43 -3
- package/dist/mcp-git.js +42 -8
- package/dist/mcp-grafo-worker.js +5 -3
- package/dist/mcp-grafo.js +55 -6
- package/dist/mcp-server.js +22 -3
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +48 -6
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +196 -18
- package/dist/noctum-arco.js +911 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-envelope.js +810 -0
- package/dist/noctum-execucao.js +304 -0
- package/dist/noctum-fila.js +280 -0
- package/dist/ocupacao.js +40 -5
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +99 -7
- package/dist/orquestracao.js +24 -21
- package/dist/parado-no-condutor.js +219 -38
- package/dist/phase.js +160 -52
- package/dist/policies.js +56 -5
- package/dist/portfolio.js +8 -3
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +132 -5
- package/dist/prompts.js +40 -1
- package/dist/prova-ativacao.js +75 -6
- package/dist/pulse-delivery.js +47 -4
- package/dist/pulse.js +98 -19
- package/dist/ratelimit.js +24 -6
- package/dist/recall.js +3 -1
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +337 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +291 -140
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +150 -34
- package/dist/runtime-context.js +181 -3
- package/dist/runtime-profiles.js +22 -1
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +120 -24
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -18
- package/dist/sessoes.js +83 -2
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +157 -88
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +299 -49
- package/dist/util.js +8 -1
- package/dist/verify.js +141 -52
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +165 -0
- package/dist/worktree.js +25 -2
- package/dist/yaml.js +27 -8
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -1
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NAO_CONSULTADO = exports.SEM_BATIDA_MS = exports.CONTRATO_DO_STATUS = void 0;
|
|
37
|
+
exports.lerRede = lerRede;
|
|
38
|
+
exports.duracao = duracao;
|
|
39
|
+
exports.textoDaRede = textoDaRede;
|
|
40
|
+
exports.jsonDaRede = jsonDaRede;
|
|
41
|
+
/**
|
|
42
|
+
* RM-053: a leitura da Orkastery Network, `ork network status` (contrato `ork.rede-status/v1`).
|
|
43
|
+
*
|
|
44
|
+
* Responde "quais maquinas desta pessoa existem e o que cada uma tem" de QUALQUER diretorio, e diz
|
|
45
|
+
* sempre de onde leu, quando, e o que NAO leu. Lacuna e o que faltou ler, e ela nunca vira lista
|
|
46
|
+
* vazia: no incidente de 29/09 o agente disse "nenhuma maquina publicou" quando so nao tinha olhado.
|
|
47
|
+
*
|
|
48
|
+
* D10: a branch `ork/fabrica-estado` dos projetos conhecidos continua lida. Maquina que so aparece
|
|
49
|
+
* la entra com `origem: fabrica-estado` e `adesao: null` (vista, sem supor adesao), ate publicar na
|
|
50
|
+
* rede; quando esta nos dois, o retrato da rede vence.
|
|
51
|
+
* D15: maquina sem batida ha mais de 3 h vira a lacuna `maquina.sem-batida`.
|
|
52
|
+
*/
|
|
53
|
+
const fs = __importStar(require("node:fs"));
|
|
54
|
+
const path = __importStar(require("node:path"));
|
|
55
|
+
const branch_de_estado_1 = require("./branch-de-estado");
|
|
56
|
+
const fabrica_estado_1 = require("./fabrica-estado");
|
|
57
|
+
const horario_1 = require("./horario");
|
|
58
|
+
const locale_1 = require("./locale");
|
|
59
|
+
const manifest_1 = require("./manifest");
|
|
60
|
+
const maquina_1 = require("./maquina");
|
|
61
|
+
const rede_1 = require("./rede");
|
|
62
|
+
const rede_adesao_1 = require("./rede-adesao");
|
|
63
|
+
const rede_forja_1 = require("./rede-forja");
|
|
64
|
+
const rede_projetos_1 = require("./rede-projetos");
|
|
65
|
+
const saida_segura_1 = require("./saida-segura");
|
|
66
|
+
exports.CONTRATO_DO_STATUS = 'ork.rede-status/v1';
|
|
67
|
+
/** D15: tres batidas perdidas. */
|
|
68
|
+
exports.SEM_BATIDA_MS = 3 * 60 * 60 * 1000;
|
|
69
|
+
/** O que esta leitura nunca olha: quem conclui sobre isso a partir daqui erra. */
|
|
70
|
+
exports.NAO_CONSULTADO = ['roadmap', 'reservas', 'threads'];
|
|
71
|
+
const mensagem = (e) => e.message.replace(/^[a-z.-]+: /, '');
|
|
72
|
+
/** Sem rede, a casa vem da adesao gravada ou da ultima publicacao desta maquina. */
|
|
73
|
+
function casaSemRede() {
|
|
74
|
+
const cfg = (0, rede_adesao_1.adesaoDaRede)().config;
|
|
75
|
+
if (cfg?.forja && cfg.host && cfg.dono && cfg.repositorio) {
|
|
76
|
+
return { forja: cfg.forja, host: cfg.host, dono: cfg.dono, repositorio: cfg.repositorio, origem: 'rede.json' };
|
|
77
|
+
}
|
|
78
|
+
const marca = (0, rede_1.lerMarcaDaRede)();
|
|
79
|
+
const partes = marca?.casa?.split('/') ?? [];
|
|
80
|
+
if (marca && (0, rede_forja_1.ehNomeDeForja)(marca.forja) && partes.length === 3) {
|
|
81
|
+
return { forja: marca.forja, host: partes[0], dono: partes[1], repositorio: partes[2], origem: 'marca' };
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
function membroDoRetrato(r, agoraMs) {
|
|
86
|
+
return { maquina: r.maquina, origem: 'rede', publicadoEm: r.publicadoEm, idadeMs: Math.max(0, agoraMs - Date.parse(r.publicadoEm)),
|
|
87
|
+
hostname: r.hostname ?? null, adesao: r.adesao ?? null, pessoa: null, forjas: r.forjas, runtimes: r.runtimes, hosts: r.hosts,
|
|
88
|
+
projetos: r.projetos.map((p) => ({ nome: p.nome, remoto: p.remoto, caminho: p.caminho })), versaoOrk: r.versaoOrk ?? null };
|
|
89
|
+
}
|
|
90
|
+
/** `ork network status`: a rede inteira, de qualquer diretorio, com fontes e lacunas. */
|
|
91
|
+
function lerRede(o = {}) {
|
|
92
|
+
const consultadoEm = o.agora ?? new Date().toISOString();
|
|
93
|
+
const agoraMs = Date.parse(consultadoEm);
|
|
94
|
+
const eu = (0, rede_1.nomeSeguro)((0, maquina_1.nomeDaMaquina)(o.maquina));
|
|
95
|
+
const adesao = (0, rede_adesao_1.adesaoDaRede)();
|
|
96
|
+
const lacunas = [], fontes = [];
|
|
97
|
+
const membros = new Map();
|
|
98
|
+
// 1. A casa: resolvida pela forja (com rede) ou pela adesao e pela marca (sem rede).
|
|
99
|
+
let casa = null;
|
|
100
|
+
let ler = true;
|
|
101
|
+
let semHttps = false;
|
|
102
|
+
if (o.semRemoto) {
|
|
103
|
+
casa = casaSemRede();
|
|
104
|
+
if (!casa)
|
|
105
|
+
lacunas.push({ tipo: 'rede.sem-leitura', detalhe: 'sem rede e sem casa conhecida nesta maquina: rode sem --sem-remoto' });
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const r = (0, rede_1.resolverCasa)({ amb: o.amb });
|
|
109
|
+
casa = r.casa;
|
|
110
|
+
if (r.motivo)
|
|
111
|
+
lacunas.push({ tipo: r.motivo.tipo, detalhe: r.motivo.detalhe });
|
|
112
|
+
if (r.casa && r.forja) {
|
|
113
|
+
try {
|
|
114
|
+
const repo = r.forja.repositorio(r.casa.dono, r.casa.repositorio);
|
|
115
|
+
if (!repo.existe) {
|
|
116
|
+
ler = false;
|
|
117
|
+
lacunas.push({ tipo: 'rede.sem-repositorio', detalhe: `${(0, rede_1.refDaCasa)(r.casa)} ainda nao existe: nenhuma maquina rodou ork network entrar` });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (repo.privado !== true)
|
|
121
|
+
lacunas.push({ tipo: 'rede.repositorio-publico', detalhe: `${(0, rede_1.refDaCasa)(r.casa)} nao e privado: nenhuma maquina publica nele` });
|
|
122
|
+
if (repo.url && (0, rede_1.urlDaCasaAceita)(repo.url))
|
|
123
|
+
(0, rede_1.prepararCache)(r.casa, repo.url, r.forja.helperDeCredencial(), eu);
|
|
124
|
+
else if (repo.url) {
|
|
125
|
+
// W10 da revisao 5: sem https nao ha leitura nova; o cache fica com a URL antiga e so a copia local vale.
|
|
126
|
+
semHttps = true;
|
|
127
|
+
lacunas.push({ tipo: 'rede.sem-leitura', detalhe: `${(0, rede_1.refDaCasa)(r.casa)}: a forja devolveu uma URL sem https; a rede so fala por https (vale a ultima copia local, quando ha)` });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
lacunas.push({ tipo: 'rede.sem-leitura', detalhe: `${(0, rede_1.refDaCasa)(r.casa)}: ${mensagem(e)}` });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 2. Os retratos da casa.
|
|
137
|
+
let retratos = [];
|
|
138
|
+
let lida = null;
|
|
139
|
+
if (casa && ler) {
|
|
140
|
+
const cache = (0, rede_1.dirDoCache)(casa);
|
|
141
|
+
if ((0, rede_1.cachePronto)(cache) && (0, rede_forja_1.comGitIsolado)(() => (0, branch_de_estado_1.git)(cache, ['config', 'remote.origin.url']).ok)) {
|
|
142
|
+
const soLocal = o.semRemoto || semHttps;
|
|
143
|
+
const { ponta, atualizado } = (0, rede_forja_1.comGitIsolado)(() => soLocal
|
|
144
|
+
? { ponta: (0, branch_de_estado_1.pontaLocal)(cache, 'origin', rede_1.BRANCH_DA_REDE), atualizado: false }
|
|
145
|
+
: (0, branch_de_estado_1.buscarBranch)(cache, 'origin', rede_1.BRANCH_DA_REDE, 'rede', o.timeoutMs ?? 30000));
|
|
146
|
+
fontes.push({ fonte: 'rede', ref: `${(0, rede_1.refDaCasa)(casa)}#${rede_1.BRANCH_DA_REDE}`, ponta, atualizado });
|
|
147
|
+
if (!atualizado && !soLocal) {
|
|
148
|
+
lacunas.push({ tipo: 'rede.sem-leitura', detalhe: `${(0, rede_1.refDaCasa)(casa)} sem leitura nova: ${ponta ? 'mostrando a ultima copia local' : 'nenhuma copia local'}` });
|
|
149
|
+
}
|
|
150
|
+
const lidos = (0, rede_1.retratosDaPonta)(cache, ponta);
|
|
151
|
+
lida = { cache, ponta };
|
|
152
|
+
retratos = lidos.retratos;
|
|
153
|
+
for (const inv of lidos.invalidos)
|
|
154
|
+
lacunas.push({ tipo: 'retrato.invalido', detalhe: `${inv.arquivo}: ${inv.motivo}` });
|
|
155
|
+
}
|
|
156
|
+
else if (!lacunas.some((l) => l.tipo === 'rede.sem-leitura')) {
|
|
157
|
+
lacunas.push({ tipo: 'rede.sem-leitura', detalhe: `${(0, rede_1.refDaCasa)(casa)} nunca foi lida nesta maquina` });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
for (const r of retratos)
|
|
161
|
+
membros.set(r.maquina, membroDoRetrato(r, agoraMs));
|
|
162
|
+
// 3. A fabrica legada dos projetos conhecidos (D10).
|
|
163
|
+
const marca = (0, rede_1.lerMarcaDaRede)();
|
|
164
|
+
const anteriores = retratos.find((r) => r.maquina === eu)?.projetos ?? (marca?.maquina === eu ? marca.projetos : undefined);
|
|
165
|
+
const conhecidos = (0, rede_projetos_1.projetosConhecidos)({ arquivo: o.arquivoDeProjetos, diretorio: o.diretorio, anteriores }).projetos;
|
|
166
|
+
const raizDe = (c) => { try {
|
|
167
|
+
return fs.realpathSync(c);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return path.resolve(c);
|
|
171
|
+
} };
|
|
172
|
+
const projetos = o.soRaiz === undefined ? conhecidos : conhecidos.filter((p) => raizDe(p.caminho) === raizDe(o.soRaiz));
|
|
173
|
+
for (const p of projetos) {
|
|
174
|
+
if (!p.presente) {
|
|
175
|
+
lacunas.push({ tipo: 'projeto.sem-clone', projeto: p.nome, detalhe: `${p.nome}: ${p.caminho} nao tem mais o projeto nesta maquina` });
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
let remoto = 'origin';
|
|
179
|
+
try {
|
|
180
|
+
remoto = (0, manifest_1.carregarManifesto)(p.caminho)?.manifesto.fabrica.remoto ?? 'origin';
|
|
181
|
+
}
|
|
182
|
+
catch { /* manifesto ruim: origin */ }
|
|
183
|
+
// RM-047: o `fabrica.remoto` vem do manifesto versionado; so nome de remoto vai ao git (depois do `--`),
|
|
184
|
+
// e o valor recusado sai redigido, sem a credencial de uma URL, no texto e no JSON.
|
|
185
|
+
if (!(0, branch_de_estado_1.remotoValido)(remoto)) {
|
|
186
|
+
lacunas.push({ tipo: 'fabrica.sem-leitura', projeto: p.nome,
|
|
187
|
+
detalhe: `${p.nome}: fabrica.remoto ${(0, branch_de_estado_1.remotoRedigido)(remoto)} nao e nome de remoto do git; nada foi lido pelo git` });
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (!(0, rede_forja_1.comGitIsolado)(() => (0, branch_de_estado_1.git)(p.caminho, ['remote', 'get-url', '--', remoto]).ok)) {
|
|
191
|
+
lacunas.push({ tipo: 'fabrica.sem-leitura', projeto: p.nome, detalhe: `${p.nome}: sem o remoto ${remoto}, nao ha fabrica compartilhada para ler` });
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
// M5: sem prompt de senha; um remoto que pediria senha vira lacuna, nao trava o status. S4: o
|
|
196
|
+
// `core.sshCommand` do projeto (chave propria, proxy) continua valendo.
|
|
197
|
+
const sshProprio = (0, rede_forja_1.comGitIsolado)(() => (0, branch_de_estado_1.git)(p.caminho, ['config', '--get', 'core.sshCommand']).stdout.trim() !== '');
|
|
198
|
+
const painel = (0, rede_forja_1.comGitIsolado)(() => (0, fabrica_estado_1.lerFabrica)(p.caminho, { remoto, semRemoto: o.semRemoto, timeoutMs: o.timeoutMs ?? 10000 }), undefined, { ssh: sshProprio ? 'herdado' : 'lote' });
|
|
199
|
+
fontes.push({ fonte: 'fabrica-estado', projeto: p.nome, ref: fabrica_estado_1.BRANCH_DA_FABRICA, ponta: painel.ponta, atualizado: painel.atualizado });
|
|
200
|
+
if (!painel.atualizado && !o.semRemoto) {
|
|
201
|
+
lacunas.push({ tipo: 'fabrica.sem-leitura', projeto: p.nome, detalhe: `${p.nome}: ${fabrica_estado_1.BRANCH_DA_FABRICA} sem leitura nova; usei a ultima copia local` });
|
|
202
|
+
}
|
|
203
|
+
for (const bruto of painel.maquinas) {
|
|
204
|
+
// U4 da revisao 3: a fabrica guarda o nome cru, a rede o saneado; casam pelo saneado.
|
|
205
|
+
const m = { ...bruto, maquina: (0, rede_1.nomeSeguro)(bruto.maquina) };
|
|
206
|
+
const atual = membros.get(m.maquina);
|
|
207
|
+
if (atual?.origem === 'rede')
|
|
208
|
+
continue;
|
|
209
|
+
const idadeMs = Math.max(0, agoraMs - Date.parse(m.publicadoEm));
|
|
210
|
+
if (atual) {
|
|
211
|
+
if (!atual.projetos.some((x) => x.nome === m.projeto))
|
|
212
|
+
atual.projetos.push({ nome: m.projeto, remoto: null, caminho: null });
|
|
213
|
+
// Y1 da revisao 7: a batida ilegivel (NaN) guardada antes perde para qualquer batida legivel.
|
|
214
|
+
if (Number.isFinite(idadeMs) && !(atual.idadeMs <= idadeMs))
|
|
215
|
+
Object.assign(atual, { publicadoEm: m.publicadoEm, idadeMs, versaoOrk: m.versaoOrk ?? null });
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// B11 do CHECK 1: quem so aparece na fabrica nao e dado como membro. Pode ser um `ork` antigo, uma
|
|
219
|
+
// maquina que saiu da rede ou uma sem forja: a leitura diz o que viu, nao o que supoe.
|
|
220
|
+
membros.set(m.maquina, { maquina: m.maquina, origem: 'fabrica-estado', publicadoEm: m.publicadoEm, idadeMs, hostname: null,
|
|
221
|
+
adesao: null, pessoa: m.por ?? null, forjas: [], runtimes: [], hosts: [],
|
|
222
|
+
projetos: [{ nome: m.projeto, remoto: null, caminho: null }], versaoOrk: m.versaoOrk ?? null });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
lacunas.push({ tipo: 'fabrica.sem-leitura', projeto: p.nome, detalhe: `${p.nome}: ${mensagem(e)}` });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// S7 da revisao 2: o retrato com o nome desta maquina pode ser de outra instalacao (tomou o nome).
|
|
230
|
+
const meuId = (0, rede_adesao_1.lerIdDaMaquina)();
|
|
231
|
+
const comMeuNome = retratos.find((r) => r.maquina === eu);
|
|
232
|
+
// V7 da revisao 4: o arquivo com este nome num contrato mais novo, com outro `id`, tambem e de outra instalacao.
|
|
233
|
+
let idDeOutraVersao = null;
|
|
234
|
+
if (!comMeuNome && lida) {
|
|
235
|
+
try {
|
|
236
|
+
idDeOutraVersao = (0, rede_1.idNoArquivo)(lida.cache, lida.ponta, (0, rede_1.arquivoDoRetrato)(eu));
|
|
237
|
+
}
|
|
238
|
+
catch { /* nome impossivel */ }
|
|
239
|
+
}
|
|
240
|
+
const idNaCasa = comMeuNome?.id ?? idDeOutraVersao;
|
|
241
|
+
// Revisao de 03/10: sem id local (nunca publicou, ou ~/.orkastery apagada), a proxima publicacao cria um id novo
|
|
242
|
+
// e o `publicarRede` recusa com `rede.nome-em-uso`; o status diz o mesmo, em vez de chamar de "esta maquina".
|
|
243
|
+
const nomeEmUso = !!idNaCasa && idNaCasa !== meuId;
|
|
244
|
+
if (nomeEmUso) {
|
|
245
|
+
lacunas.push({ tipo: 'maquina.nome-em-uso', maquina: eu, detalhe: `o retrato "${eu}" na casa e de outra instalacao: esta maquina nao ` +
|
|
246
|
+
'publica ate trocar de nome (ork network entrar --maquina NOME) ou retomar este (ork network entrar --forcar)' });
|
|
247
|
+
}
|
|
248
|
+
// 4. O frescor de cada maquina (D15).
|
|
249
|
+
const lista = [...membros.values()].sort((a, b) => a.maquina.localeCompare(b.maquina));
|
|
250
|
+
for (const m of lista) {
|
|
251
|
+
// X5 da revisao 6: batida ilegivel (a fabrica legada aceita qualquer texto) nao passa por fresca.
|
|
252
|
+
if (!Number.isFinite(m.idadeMs))
|
|
253
|
+
lacunas.push({ tipo: 'maquina.sem-batida', maquina: m.maquina, detalhe: `${m.maquina}: batida ilegivel` });
|
|
254
|
+
else if (m.idadeMs > exports.SEM_BATIDA_MS)
|
|
255
|
+
lacunas.push({ tipo: 'maquina.sem-batida', maquina: m.maquina, detalhe: `${m.maquina}: sem batida ha ${duracao(m.idadeMs)}` });
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
contrato: exports.CONTRATO_DO_STATUS, consultadoEm, casa: casa ? { ...casa } : null,
|
|
259
|
+
estaMaquina: { maquina: eu, membro: adesao.membro, adesao: adesao.adesao, publicada: !!comMeuNome && !nomeEmUso, nomeEmUso },
|
|
260
|
+
fontes, membros: lista, lacunas, naoConsultado: [...exports.NAO_CONSULTADO],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function duracao(ms) {
|
|
264
|
+
if (!Number.isFinite(ms))
|
|
265
|
+
return (0, locale_1.msg)().horario.duracaoDesconhecida;
|
|
266
|
+
const min = Math.round(ms / 60000);
|
|
267
|
+
if (min < 1)
|
|
268
|
+
return (0, locale_1.msg)().horario.menosDeUmMin;
|
|
269
|
+
if (min < 120)
|
|
270
|
+
return `${min} min`;
|
|
271
|
+
const h = Math.round(ms / 3600000);
|
|
272
|
+
return h < 48 ? `${h} h` : `${Math.round(ms / 86400000)} d`;
|
|
273
|
+
}
|
|
274
|
+
/** O texto de `ork network status`: fonte e o que nao foi lido primeiro, lacunas sempre no fim. */
|
|
275
|
+
function textoDaRede(status) {
|
|
276
|
+
// V2 da revisao 4 e W4 da revisao 5: a fabrica legada vem do remoto de um projeto, onde outras pessoas
|
|
277
|
+
// escrevem. Cada VALOR vai numa linha so e sem nada que o terminal execute ou que ninguem ve, antes de
|
|
278
|
+
// entrar no texto: um `\n` num valor nao abre uma linha que parece do `ork`.
|
|
279
|
+
// X5 da revisao 6: um mapa que so troca texto (a ida e volta em JSON trocava `NaN` por `null`).
|
|
280
|
+
const s = (0, saida_segura_1.valoresEmUmaLinha)(status);
|
|
281
|
+
const linhas = [];
|
|
282
|
+
const rede = s.fontes.find((f) => f.fonte === 'rede');
|
|
283
|
+
const estadoDaCasa = rede ? (rede.atualizado ? 'lida agora' : 'última cópia local') : 'não lida';
|
|
284
|
+
linhas.push(s.casa
|
|
285
|
+
? `Orkastery Network de ${s.casa.dono} · ${s.casa.forja}: ${(0, rede_1.refDaCasa)(s.casa)} · ${estadoDaCasa}`
|
|
286
|
+
: 'Orkastery Network · sem casa: nenhuma forja com login nesta máquina');
|
|
287
|
+
const consultado = [
|
|
288
|
+
...(rede ? [`repositório da rede (${rede.ponta ? rede.ponta.slice(0, 7) : 'vazio'})`] : []),
|
|
289
|
+
...s.fontes.filter((f) => f.fonte === 'fabrica-estado')
|
|
290
|
+
.map((f) => `fábrica de ${f.projeto} (${f.ref}, ${f.atualizado ? 'lida agora' : 'última cópia'})`),
|
|
291
|
+
];
|
|
292
|
+
linhas.push(`Consultado: ${consultado.length ? consultado.join('; ') : 'nada (veja as lacunas)'}.`);
|
|
293
|
+
linhas.push(`Não consultado: ${s.naoConsultado.join(', ')}. O roadmap de um projeto sai do ork roadmap status nele.`);
|
|
294
|
+
linhas.push('');
|
|
295
|
+
if (s.membros.length === 0)
|
|
296
|
+
linhas.push('Nenhuma máquina lida. Isso não quer dizer que não há máquinas: veja as lacunas.');
|
|
297
|
+
for (const m of s.membros) {
|
|
298
|
+
const esta = m.maquina !== s.estaMaquina.maquina ? ''
|
|
299
|
+
: m.origem === 'rede' && s.estaMaquina.nomeEmUso ? ' (outra instalação com o nome desta máquina)' : ' (esta máquina)';
|
|
300
|
+
const origem = m.origem === 'rede' ? `rede${m.adesao === 'fabrica' ? ', adesão herdada da fábrica' : ''}`
|
|
301
|
+
: `vista só na fábrica de ${m.projetos.map((p) => p.nome).join(', ')}; sem retrato na rede`;
|
|
302
|
+
linhas.push(`${m.maquina}${esta} · ${origem} · batida ${(0, horario_1.formatarDataHora)(m.publicadoEm)} (há ${duracao(m.idadeMs)})`);
|
|
303
|
+
const ficha = [m.hostname ? `hostname ${m.hostname}` : null, m.versaoOrk ? `ork ${m.versaoOrk}` : null,
|
|
304
|
+
...m.forjas.map((f) => `${f.forja}: ${f.usuario ?? 'sem login'}`), m.pessoa ? `pessoa ${m.pessoa}` : null].filter(Boolean);
|
|
305
|
+
if (ficha.length)
|
|
306
|
+
linhas.push(` ${ficha.join(' · ')}`);
|
|
307
|
+
if (m.runtimes.length)
|
|
308
|
+
linhas.push(` runtimes: ${m.runtimes.map((r) => `${r.runtime} ${r.versao ?? '?'}`).join(', ')}`);
|
|
309
|
+
if (m.hosts.length) {
|
|
310
|
+
linhas.push(` hosts: ${m.hosts.map((h) => `${h.host} ${h.versao ?? '?'}${h.adaptador ? ` (adaptador ${h.adaptador})` : ''}`).join(', ')}`);
|
|
311
|
+
}
|
|
312
|
+
if (m.projetos.length) {
|
|
313
|
+
linhas.push(` projetos: ${m.projetos.map((p) => `${p.nome}${p.remoto ? ` (${p.remoto})` : ''}${p.caminho ? ` em ${p.caminho}` : ''}`).join('; ')}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
linhas.push('');
|
|
317
|
+
const aqui = s.estaMaquina;
|
|
318
|
+
linhas.push(aqui.membro
|
|
319
|
+
? `Esta máquina (${aqui.maquina}) é membro${aqui.adesao === 'fabrica' ? ', herdado da fábrica' : ''}${aqui.publicada ? '.' : '; o retrato dela ainda não está na casa.'}`
|
|
320
|
+
: `Esta máquina (${aqui.maquina}) não está na rede: ork network entrar.`);
|
|
321
|
+
if (s.lacunas.length === 0)
|
|
322
|
+
linhas.push('Lacunas: nenhuma.');
|
|
323
|
+
else {
|
|
324
|
+
linhas.push(`Lacunas (${s.lacunas.length}), o que faltou ler:`);
|
|
325
|
+
for (const l of s.lacunas)
|
|
326
|
+
linhas.push(` • ${l.tipo}: ${l.detalhe}`);
|
|
327
|
+
}
|
|
328
|
+
linhas.push((0, horario_1.legendaDoFuso)());
|
|
329
|
+
return linhas.join('\n');
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* `ork network status --json`: o mesmo JSON, com os caracteres invisiveis escritos como `\uXXXX`
|
|
333
|
+
* (o valor lido e o mesmo; so o terminal deixa de executa-los). A quebra de linha da indentacao fica.
|
|
334
|
+
*/
|
|
335
|
+
function jsonDaRede(s) {
|
|
336
|
+
return (0, saida_segura_1.jsonSemInvisivel)(s);
|
|
337
|
+
}
|