diff --git a/data/manifest.json b/data/manifest.json index 76a6b9a..1e9df36 100644 --- a/data/manifest.json +++ b/data/manifest.json @@ -1,10 +1,10 @@ { - "brainVersion": "1.9.4-dev", - "generated": "2026-07-06T16:26:26.393Z", - "generatedHuman": "Mon, 06 Jul 2026 16:26:26 GMT", + "brainVersion": "v1.9.4-dev", + "generated": "2026-07-07T00:31:44.703Z", + "generatedHuman": "Tue, 07 Jul 2026 00:31:44 GMT", "coverage": { - "built": 19, - "catalogued": 168, + "built": 23, + "catalogued": 172, "orgTotalApprox": 248, "pending": 149 }, @@ -58,10 +58,10 @@ "status": "built" }, { - "name": "agent-harness-generator", + "name": "metaharness", "tier": "T1", "stars": 330, - "builtFromSha": "b7276ceb615b9b7627781d59104796982214dbaa", + "builtFromSha": "38284c8c49509decf14ce991bf17965433449e96", "latestRemoteSha": null, "status": "built" }, @@ -160,6 +160,38 @@ "builtFromSha": "bb1269fb9f4b0920de5944d248e4e79a01f3b80c", "latestRemoteSha": null, "status": "built" + }, + { + "name": "agenticow", + "tier": "T2", + "stars": 40, + "builtFromSha": "dd4f437b92d2dbbc1f40dfa00023eed6e9c3bd84", + "latestRemoteSha": null, + "status": "built" + }, + { + "name": "CVE-bench", + "tier": "T2", + "stars": 15, + "builtFromSha": "47abc2b2b522f4d8afd07296d2a35042d8639f1d", + "latestRemoteSha": null, + "status": "built" + }, + { + "name": "cognitum-cogs", + "tier": "T2", + "stars": 14, + "builtFromSha": "d48161eb2b676753a5b0e6d107805a2217dbaf9b", + "latestRemoteSha": null, + "status": "built" + }, + { + "name": "cognitum-support", + "tier": "T2", + "stars": 19, + "builtFromSha": "26a92df8c17341fe73c0e455168c3f849130fafd", + "latestRemoteSha": null, + "status": "built" } ], "pendingRepos": [ diff --git a/data/registry.tiers.json b/data/registry.tiers.json index 3edde5f..02d427a 100644 --- a/data/registry.tiers.json +++ b/data/registry.tiers.json @@ -47,7 +47,7 @@ "sha": "RESOLVE_AT_BUILD" }, { - "name": "agent-harness-generator", + "name": "metaharness", "stars": 330, "pushed": "2026-06-27", "sha": "RESOLVE_AT_BUILD" @@ -296,6 +296,34 @@ "stars": 2, "pushed": "2026-06-22", "sha": "RESOLVE_AT_BUILD" + }, + { + "name": "agenticow", + "stars": 40, + "pushed": "2026-07-04", + "sha": "RESOLVE_AT_BUILD" + }, + { + "name": "CVE-bench", + "stars": 15, + "pushed": "2026-06-27", + "sha": "RESOLVE_AT_BUILD" + }, + { + "name": "cognitum-cogs", + "owner": "cognitum-one", + "repo": "cogs", + "stars": 14, + "pushed": "2026-07-02", + "sha": "RESOLVE_AT_BUILD" + }, + { + "name": "cognitum-support", + "owner": "cognitum-one", + "repo": "support", + "stars": 19, + "pushed": "2026-07-06", + "sha": "RESOLVE_AT_BUILD" } ] }, @@ -1031,4 +1059,4 @@ ] } } -} \ No newline at end of file +} diff --git a/kb/SOURCE.json b/kb/SOURCE.json index a438ec4..adb1028 100644 --- a/kb/SOURCE.json +++ b/kb/SOURCE.json @@ -1,19 +1,19 @@ { "builder": "rvf-kb-forge", - "builtUtc": "2026-07-05T18:15:09.157Z", + "builtUtc": "2026-07-06T20:09:10.697Z", "canonicalManifestUrl": "https://raw.githubusercontent.com/ruvnet/ruvnet-brain/main/kb/.last-built.json", "selfUpdate": "node forge-update.mjs", "stores": { - "ruflo": { - "kbName": "ruflo", - "sourceRepo": "https://github.com/ruvnet/ruflo", - "sourceCommit": "f71ffa2f99147b0236fc267aaf1d4cd8285ad3c1", - "sourceDescribe": "v3.25.0", - "builtUtc": "2026-07-05T18:15:09.157Z", + "cognitum-cogs": { + "kbName": "cognitum-cogs", + "sourceRepo": "https://github.com/cognitum-one/cogs", + "sourceCommit": "d48161eb2b676753a5b0e6d107805a2217dbaf9b", + "sourceDescribe": "d48161e", + "builtUtc": "2026-07-06T20:09:10.697Z", "builder": "rvf-kb-forge", "canonicalManifestUrl": "https://raw.githubusercontent.com/ruvnet/ruvnet-brain/main/kb/.last-built.json", - "canonicalBundleUrl": "https://raw.githubusercontent.com/ruvnet/ruvnet-brain/main/kb/ruflo-kb-bundle.zip", - "selfUpdate": "node forge-update.mjs ruflo" + "canonicalBundleUrl": "https://raw.githubusercontent.com/ruvnet/ruvnet-brain/main/kb/cognitum-cogs-kb-bundle.zip", + "selfUpdate": "node forge-update.mjs cognitum-cogs" } } } diff --git a/kb/forge-ask-all.mjs b/kb/forge-ask-all.mjs index f420692..1b7c355 100644 --- a/kb/forge-ask-all.mjs +++ b/kb/forge-ask-all.mjs @@ -61,7 +61,15 @@ export async function searchAll({ dir, query, k = 6, pool = 8, repos }) { // multi-word names like `agent-harness-generator` still match. Boost clears a sibling that merely // *contains a file named after* the repo (e.g. dspy.ts/…/safla.ts) when the question names the repo. const esc = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const isNamed = (repo) => repo.length >= 4 && new RegExp(`\\b${esc(repo)}\\b`, 'i').test(query); + // A repo can be known by a former name too (e.g. GitHub renamed + // ruvnet/agent-harness-generator -> ruvnet/metaharness; the kb store was re-imported under + // the new name metaharness, but a query naming the old name should still get the boost). + // Extend here as repos rename. + const ALIASES = { 'metaharness': ['agent-harness-generator'] }; + const isNamed = (repo) => { + const names = [repo, ...(ALIASES[repo] || [])]; + return names.some((n) => n.length >= 4 && new RegExp(`\\b${esc(n)}\\b`, 'i').test(query)); + }; const NAME_BOOST = 2.0; for (const r of ranked) { // A concepts hit is labelled repo="concepts" but its path is "//" — attribute the diff --git a/primer/ruvnet-primer.md b/primer/ruvnet-primer.md index da29991..f6f7067 100644 --- a/primer/ruvnet-primer.md +++ b/primer/ruvnet-primer.md @@ -1,6 +1,6 @@ # The RuvNet Primer — the building blocks, on one page -`Brain version: v0.3.0-dev · Built: 2026-07-05 · Covers: 19/168 repos built @ pinned SHAs (see data/manifest.json)` +`Brain version: v1.9.4-dev · Built: 2026-07-07 · Covers: 23/172 repos built @ pinned SHAs (see data/manifest.json)` > **What this is:** a portable, source-grounded "brain" over the reusable RuvNet building blocks by > **Reuven Cohen (rUv)**. It ships as a **Claude Code plugin** so your assistant answers from Ruv's real diff --git a/scripts/self-update.mjs b/scripts/self-update.mjs index b7e776e..c419edf 100644 --- a/scripts/self-update.mjs +++ b/scripts/self-update.mjs @@ -26,7 +26,54 @@ const MODEL_CACHE = process.env.KB_MODEL_CACHE || path.join(ROOT, 'kb', 'models- const KNOWN_CLONES = JSON.parse(process.env.RUVNET_KNOWN_CLONES || '{}'); const CLONE_DIR = path.join(ROOT, 'clones'); // --full source-dir hints per repo (extend as repos onboard; default = whole tree, docs+manifests+lead-comments) -const FULL_HINTS = { ruflo: 'v3/@claude-flow,v3/mcp,ruflo/src' }; +// +// The shipped v0.5.0-dev bundle's kb/*.passages.jsonl already contains substantial full-body +// source indexing for 14 repos, but only ruflo was ever recorded here. Without a hint, the FIRST +// time self-update.mjs ever rebuilds one of the other 13 (the moment any of them actually +// drifts), it silently downgrades that content from full source bodies to doc-comment-only +// snippets. Confirmed this happens in practice: rebuilding agent-harness-generator via +// self-update.mjs --apply (before this fix) took it from 201 full-body entries to 0. +// +// ruflo/agentdb/rulake have one clean top-level prefix each (or a hand-curated small set, for +// ruflo) that reproduces the existing indexing. The rest are genuinely scattered multi-crate/ +// multi-package workspaces with no single clean prefix -- most span nearly every crate/package +// in the repo, which strongly suggests the original bulk build simply used --full over the +// whole tree for these T0-T2 tier repos rather than a hand-curated subset. The lists below are +// the exhaustive, empirically-derived minimal prefix set that reproduces every full-body path +// currently in the shipped bundle -- extracted directly from each repo's own +// kb/.passages.jsonl, not guessed. The original build command isn't recorded anywhere, so +// these are reconstructed from evidence rather than confirmed against original intent -- please +// correct if the authoritative list (or a switch to a tier-based default) is preferred instead. +const FULL_HINTS = { + 'ruflo': 'v3/@claude-flow,v3/mcp,ruflo/src', + 'agentdb': 'src', + 'rulake': 'crates', + 'daa': 'crates/daa-ai,crates/daa-chain,crates/daa-economy,crates/daa-rules,daa-ai/src,daa-chain/src,daa-cli/src,daa-compute/benches,daa-compute/build.rs,daa-compute/src,daa-compute/tests,daa-economy/src,daa-mcp/src,daa-orchestrator/daa-napi,daa-orchestrator/src,daa-orchestrator/tests,daa-rules/src,daa-sdk/crates,examples/agents,examples/basic-crypto.ts,examples/decentralized-task-scheduler.ts,examples/federated-learning.ts,examples/full-stack-agent.ts,examples/orchestrator.ts,examples/performance-benchmark.ts,prime-rust/crates,prime-rust/prime-napi,prime-rust/tests,src/main.rs,src/security', + 'qudag': 'benchmarks/benches,benchmarks/cli,benchmarks/dark_addressing,benchmarks/lib.rs,benchmarks/optimized_benchmarks.rs,benchmarks/src,cli-standalone/src,cli-standalone/tests,core/crypto,core/dag,core/health.rs,core/monitoring,core/network,core/optimized,core/protocol,core/swarm,core/vault,examples/bitchat,examples/crypto,examples/dark_addressing_example.rs,examples/dht_discovery_example.rs,examples/nat_traversal_example.rs,examples/onion_routing_example.rs,examples/peer_management_example.rs,examples/persistence_example.rs,examples/shadow_address_example.rs,examples/traffic_obfuscation_example.rs,qudag-exchange/cli,qudag-exchange/core,qudag-exchange/crates,qudag-exchange/src,qudag-exchange/test_core_fee_model.rs,qudag-exchange/test_fee_model.rs,qudag-exchange/tests,qudag-mcp/benches,qudag-mcp/examples,qudag-mcp/src,qudag-mcp/tests,qudag-testnet/configs,qudag-wasm/final-test.mjs,qudag-wasm/simple-test.mjs,qudag-wasm/src,qudag-wasm/test-nodejs.mjs,qudag-wasm/test-setup.ts,qudag-wasm/tests,qudag-wasm/vitest.config.ts,qudag-wasm/vitest.workspace.ts,qudag-wasm/working-features-test.mjs,tools/cli,tools/simulator,tools/swarm-test,vault-standalone/examples,vault-standalone/src,vault-standalone/tests', + 'ruvector': 'crates/agentic-robotics-core,crates/agentic-robotics-mcp,crates/agentic-robotics-node,crates/agentic-robotics-rt,crates/cognitum-gate-kernel,crates/cognitum-gate-tilezero,crates/emergent-time,crates/emergent-time-wasm,crates/hailort-sys,crates/mcp-brain,crates/mcp-brain-server,crates/mcp-gate,crates/micro-hnsw-wasm,crates/neural-trader-coherence,crates/neural-trader-core,crates/neural-trader-replay,crates/neural-trader-wasm,crates/photonlayer-bench,crates/photonlayer-cli,crates/photonlayer-core,crates/photonlayer-ruvector,crates/photonlayer-wasm,crates/prime-radiant,crates/ruos-thermal,crates/ruvector-acorn,crates/ruvector-acorn-wasm,crates/ruvector-agent-memory,crates/ruvector-attention,crates/ruvector-attention-cli,crates/ruvector-attention-node,crates/ruvector-attention-wasm,crates/ruvector-attn-mincut,crates/ruvector-bench,crates/ruvector-bet4-ivf-bench,crates/ruvector-capgated,crates/ruvector-cli,crates/ruvector-cluster,crates/ruvector-cnn,crates/ruvector-cnn-wasm,crates/ruvector-coherence,crates/ruvector-coherence-hnsw,crates/ruvector-collections,crates/ruvector-consciousness,crates/ruvector-core,crates/ruvector-crv,crates/ruvector-dag,crates/ruvector-dag-wasm,crates/ruvector-decompiler,crates/ruvector-delta-core,crates/ruvector-delta-graph,crates/ruvector-delta-index,crates/ruvector-delta-wasm,crates/ruvector-diskann,crates/ruvector-diskann-node,crates/ruvector-dither,crates/ruvector-economy-wasm,crates/ruvector-exotic-wasm,crates/ruvector-filter,crates/ruvector-gnn,crates/ruvector-gnn-node,crates/ruvector-gnn-rerank,crates/ruvector-gnn-wasm,crates/ruvector-graph,crates/ruvector-graph-condense,crates/ruvector-graph-node,crates/ruvector-graph-wasm,crates/ruvector-hailo,crates/ruvector-hailo-cluster,crates/ruvector-hnsw-repair,crates/ruvector-hybrid,crates/ruvector-kalshi,crates/ruvector-learning-wasm,crates/ruvector-lsm-ann,crates/ruvector-math,crates/ruvector-math-wasm,crates/ruvector-matryoshka,crates/ruvector-maxsim,crates/ruvector-metrics,crates/ruvector-mincut,crates/ruvector-mincut-node,crates/ruvector-mincut-wasm,crates/ruvector-mmwave,crates/ruvector-nervous-system,crates/ruvector-node,crates/ruvector-perception,crates/ruvector-postgres,crates/ruvector-pq-search,crates/ruvector-profiler,crates/ruvector-proof-gate,crates/ruvector-rabitq,crates/ruvector-rabitq-wasm,crates/ruvector-raft,crates/ruvector-rairs,crates/ruvector-replication,crates/ruvector-robotics,crates/ruvector-router-cli,crates/ruvector-router-core,crates/ruvector-router-ffi,crates/ruvector-router-wasm,crates/ruvector-rulake,crates/ruvector-server,crates/ruvector-snapshot,crates/ruvector-solver,crates/ruvector-solver-node,crates/ruvector-solver-wasm,crates/ruvector-sota-bench,crates/ruvector-spann,crates/ruvector-sparsifier,crates/ruvector-tiny-dancer-node,crates/ruvector-verified,crates/ruvector-verified-wasm,crates/ruvector-wasm,crates/ruvix,crates/ruvllm,crates/ruvllm-cli,crates/ruvllm-wasm,crates/ruvllm_sparse_attention,crates/rvAgent,crates/rvf,crates/rvlite,crates/rvm,crates/sona,crates/sonic-ct,crates/sonic-ct-wasm,crates/thermorust,crates/timesfm', + 'ruv-fann': 'cuda-wasm/.eslintrc.js,cuda-wasm/benches,cuda-wasm/build.rs,cuda-wasm/cli,cuda-wasm/cuda-examples,cuda-wasm/demo,cuda-wasm/examples,cuda-wasm/jest.config.js,cuda-wasm/scripts,cuda-wasm/src,cuda-wasm/tests,examples/basic_usage.rs,examples/cuda_wasm_neural_integration.rs,examples/final_performance_demo.rs,examples/gpu_sweet_spot_benchmark.rs,examples/gpu_training_test.rs,examples/test_adam.rs,examples/test_gpu_detection.rs,examples/test_optimizers_simple.rs,examples/xor.rs,neuro-divergent/src,neuro-divergent/tests,opencv-rust/opencv-core,opencv-rust/opencv-sdk,opencv-rust/opencv-sys,opencv-rust/opencv-wasm,opencv-rust/tests,ruv-swarm/benches,ruv-swarm/benchmarking,ruv-swarm/crates,ruv-swarm/examples,ruv-swarm/ml-training,ruv-swarm/models,ruv-swarm/npm,ruv-swarm/test,ruv-swarm/test-simd-fix.mjs,ruv-swarm/test-wasm.js,ruv-swarm/tests,ruv-swarm/vitest.config.js,src/activation.rs,src/cascade.rs,src/connection.rs,src/errors.rs,src/integration.rs,src/io,src/layer.rs,src/lib.rs,src/memory_manager.rs,src/mock_types.rs,src/network.rs,src/network_gpu.rs,src/neuron.rs,src/simd,src/tests,src/training,src/webgpu', + 'agentic-flow': 'agentic-flow/.claude,agentic-flow/Python,agentic-flow/add_two_numbers.py,agentic-flow/app,agentic-flow/benchmark,agentic-flow/examples,agentic-flow/path,agentic-flow/scripts,agentic-flow/src,agentic-flow/tests,agentic-flow/validation,agentic-flow/vitest.config.ts,crates/agentic-flow-quic,examples/batch-query.js,examples/batch-store.js,examples/billing-example.ts,examples/cached-query.js,examples/climate-prediction,examples/connection-pool.js,examples/deepseek-direct-api.js,examples/nova-medicina,examples/perf-monitor.js,examples/quic-server-coordinator.js,examples/quic-swarm-coordination.js,examples/reasoningbank-benchmark.js,examples/reasoningbank-learning-demo.js,examples/reasoningbank-optimize.js,examples/research-swarm,examples/verification-example.ts,packages/agent-booster,packages/agentdb-onnx,packages/agentic-jujutsu,packages/agentic-llm,reasoningbank/examples,reasoningbank/tests,src/App.tsx,src/api,src/cli,src/components,src/consent,src/controller,src/controllers,src/main.tsx,src/mcp,src/middleware,src/notifications,src/pages,src/providers,src/routing,src/security,src/services,src/transport,src/types,src/utils,src/verification', + // ruvnet/agent-harness-generator was renamed upstream to ruvnet/metaharness; the kb store + // was fully wiped and re-imported under the new name (not just relabeled) to avoid stale + // internal metadata (meta.json's clone path, embed.json's builtFrom) that a raw file rename + // would have left behind. + 'metaharness': 'crates/kernel,crates/kernel-napi,crates/kernel-wasm,crates/poker-darwin,crates/template-catalog,packages/aws-finops,packages/bench,packages/create-agent-harness,packages/darwin-mode,packages/harness,packages/host-claude-code,packages/host-codex,packages/host-copilot,packages/host-github-actions,packages/host-hermes,packages/host-openclaw,packages/host-opencode,packages/host-pi-dev,packages/host-rvm,packages/jujutsu,packages/kernel-js,packages/projects,packages/redblue,packages/router,packages/sdk,packages/vertical-base,packages/vertical-trading,packages/weight-eft', + 'safla': 'benchmarks/__init__.py,benchmarks/cli_benchmarks.py,benchmarks/core.py,benchmarks/database.py,benchmarks/safla_benchmarks.py,benchmarks/utils.py,examples/01_basic_setup.py,examples/02_simple_memory.py,examples/03_basic_safety.py,examples/05_delta_evaluation.py,examples/12_ai_assistant.py,examples/15_enterprise_integration.py,examples/config_examples.py,examples/hybrid_memory_demo.py,examples/mcp_auth_client.py,examples/mcp_usage,examples/safety_validation_demo.py,safla/__init__.py,safla/__main__.py,safla/api,safla/auth,safla/cli.py,safla/cli_implementations.py,safla/cli_interactive.py,safla/cli_main.py,safla/cli_manager.py,safla/core,safla/exceptions.py,safla/installer.py,safla/integrations,safla/mcp,safla/mcp_stdio_server.py,safla/middleware,safla/security,safla/utils,safla/validation,safla_mcp_enhanced.py,safla_mcp_server.py,safla_mcp_simple.py,scripts/advanced_optimization_engine.py,scripts/agent_swarm_optimizer.py,scripts/build.py,scripts/comprehensive_capability_test.py,scripts/continuous_optimization_engine.py,scripts/debug_enhanced_server.py,scripts/demo_jwt_mcp_client.py,scripts/final_capability_verification.py,scripts/final_system_test.py,scripts/gpu_optimization_benchmark.py,scripts/install.py,scripts/minimal_security_test.py,scripts/quick_capability_test.py,scripts/remote_gpu_benchmarker.py,scripts/save_extreme_optimizations.py,scripts/save_optimized_models.py,scripts/system_status_report.py,scripts/verify_system.py', + 'ruview': 'firmware/esp32-csi-node,firmware/esp32-hello-world,v2/crates', + 'open-claude-code': 'v2/src', + 'ruv-dev': 'bin/index.js,src/cli,src/core,src/index.js,src/utils', + 'agenticow': 'bin/agenticow.js,examples/_shared.mjs,examples/ab-at-scale.mjs,examples/ab-branches.mjs,examples/checkpointing.mjs,examples/compliance-lineage.mjs,examples/git-workflow.mjs,examples/memory-evolution.mjs,examples/multi-persona-consensus.mjs,examples/multi-tenant-saas.mjs,examples/parallel-agents.mjs,examples/parallel-selves.mjs,examples/personalization.mjs,examples/promotion-pipeline.mjs,examples/red-team-sandbox.mjs,examples/rollback-quarantine.mjs,examples/simulated-org.mjs,examples/time-travel-debug.mjs,src/index.d.ts,src/index.js', + // cognitum-cogs (cognitum-one org): unlike the repos above, this one's existing full-body + // coverage is thin and scattered across nearly every directory (e.g. crates/fxnn 91/507, + // examples/fixel 20/180) rather than a clean whole-directory --full pass, so there's no exact + // original prefix set to reverse-engineer. Using every top-level dir that has ANY full-body + // content today as a superset --full prefix guarantees no regression (nothing currently + // full-body can become snippet-only); doc-only dirs (docs, .github, ui-templates, root .md) + // are excluded since they have zero full-body content to protect. + 'cognitum-cogs': 'benches,benchmarks,cognitum-sim,crates,examples,scripts,shared,src,tests', + // cognitum-support (cognitum-one org): 100% docs/README/GitHub-template content, zero + // full-body entries in the existing build — no --full prefix needed, nothing to protect. +}; const tiers = JSON.parse(fs.readFileSync(path.join(ROOT, 'data/registry.tiers.json'), 'utf8')); const manifest = fs.existsSync(path.join(ROOT, 'data/manifest.json')) @@ -34,8 +81,10 @@ const manifest = fs.existsSync(path.join(ROOT, 'data/manifest.json')) // case-insensitive: registry names are capitalized (RuVector) but built artifacts are lowercase (ruvector) const builtSha = Object.fromEntries(manifest.builtRepos.map((r) => [r.name.toLowerCase(), r.builtFromSha])); -const remoteHead = (slug) => { - try { return execFileSync('git', ['ls-remote', `https://github.com/ruvnet/${slug}`, 'HEAD'], { timeout: 30000 }).toString().split(/\s/)[0] || null; } +// owner/repo default to 'ruvnet'/ so existing registry entries (no owner/repo field) are +// unaffected; a repo living outside the ruvnet org (e.g. a different GitHub org) sets both. +const remoteHead = (owner, slug) => { + try { return execFileSync('git', ['ls-remote', `https://github.com/${owner}/${slug}`, 'HEAD'], { timeout: 30000 }).toString().split(/\s/)[0] || null; } catch { return null; } }; const clonePath = (name) => KNOWN_CLONES[name] || path.join(CLONE_DIR, name); @@ -52,7 +101,7 @@ for (const t of ['T0', 'T1', 'T2', 'T3']) { const plan = []; for (const r of inScope) { - const live = remoteHead(r.name); + const live = remoteHead(r.owner || 'ruvnet', r.repo || r.name); const built = builtSha[r.name.toLowerCase()] || null; let action = 'up-to-date'; if (!built) action = 'build (new)'; @@ -61,7 +110,7 @@ for (const r of inScope) { // most-central repos were invisible to the freshness loop until a 3.24 release exposed it.) else if (built === 'unknown') action = live ? 'rebuild (changed)' : 'up-to-date'; else if (live && live !== built) action = 'rebuild (changed)'; - plan.push({ name: r.name, tier: r.tier, built: built?.slice(0, 12) || '—', live: live?.slice(0, 12) || '?', action }); + plan.push({ name: r.name, owner: r.owner, repo: r.repo, tier: r.tier, built: built?.slice(0, 12) || '—', live: live?.slice(0, 12) || '?', action }); } console.log(`self-update ${APPLY ? '(APPLY)' : '(dry-run)'} — ${plan.length} repos in scope\n`); @@ -86,7 +135,7 @@ for (const p of todo) { if (!fs.existsSync(path.join(dir, '.git'))) { console.log(`[clone] ${p.name}`); fs.mkdirSync(CLONE_DIR, { recursive: true }); - execFileSync('git', ['clone', '--depth', '1', `https://github.com/ruvnet/${p.name}`, dir], { stdio: 'inherit' }); + execFileSync('git', ['clone', '--depth', '1', `https://github.com/${p.owner || 'ruvnet'}/${p.repo || p.name}`, dir], { stdio: 'inherit' }); } else { execFileSync('git', ['-C', dir, 'fetch', '--depth', '1', 'origin'], { stdio: 'inherit' }); execFileSync('git', ['-C', dir, 'reset', '--hard', 'origin/HEAD'], { stdio: 'inherit' });