Skip to content

gbrain upgrade - No package.json, so nothing to update #1029

@clarajohan

Description

@clarajohan

What happened?

gbrain upgrade correctly detects the bun install method but then shells out to bun update gbrain without setting cwd. The child process inherits the user's shell cwd (typically ~), which has no package.json, so bun silently no-ops with No package.json, so nothing to update and gbrain reports the upgrade as failed against a perfectly working install.

The closest existing issue is #656, which added a bun-link code path but left the bare bun (global-install) case unchanged. #658 is adjacent (npm name collision) but distinct.

Manual Workaround

cd ~/.bun/install/global && bun update gbrain

What did you expect?

successful upgrade

Steps to reproduce

bun install -g github:garrytan/gbrain   # canonical global install
cd ~                                    # no package.json here
gbrain upgrade

Output:

Detected install method: bun
Upgrading via bun...
No package.json, so nothing to update
Upgrade failed. Try running manually: bun update gbrain

Pasting the suggested manual command from ~ reproduces the same no-op.

Fix

Detect the install root (the directory above node_modules/gbrain that has both package.json and a node_modules/ subdir) and pass it as cwd to execFileSync('bun', ['update', 'gbrain'], { cwd, ... }). When detection fails, the error message now prints a paste-ready manual recovery command instead of the misleading "Upgrade failed" line.

PR with the fix + unit tests: #1030

Environment

  • gbrain version: gbrain 0.35.0.0
  • OS: MacOS
  • Bun version: 1.3.13
  • Database: self-hosted Postgres

gbrain doctor --json output

[ai.gateway] recipe "google" declares an embedding touchpoint without max_batch_tokens; recursion is the only safety net for batch caps.
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42710",
  message: "extension \"vector\" already exists, skipping",
  file: "extension.c",
  line: "2120",
  routine: "CreateExtension",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42710",
  message: "extension \"pg_trgm\" already exists, skipping",
  file: "extension.c",
  line: "2120",
  routine: "CreateExtension",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42710",
  message: "extension \"pgcrypto\" already exists, skipping",
  file: "extension.c",
  line: "2120",
  routine: "CreateExtension",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"sources\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"pages\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_pages_type\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_pages_frontmatter\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_pages_trgm\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_pages_updated_at_desc\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_pages_source_id\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"pages_deleted_at_purge_idx\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"pages_coalesce_date_idx\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"content_chunks\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_page_index\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_page\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_embedding\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_symbol_name\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_language\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_embedding_image\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_search_vector\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_chunks_symbol_qualified\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"code_edges_chunk\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_code_edges_chunk_from\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_code_edges_chunk_to\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_code_edges_chunk_to_symbol\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"code_edges_symbol\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_code_edges_symbol_from\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_code_edges_symbol_to\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"links\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_links_from\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_links_to\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_links_source\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_links_origin\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"tags\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_tags_tag\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_tags_page_id\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"raw_data\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_raw_data_page\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"timeline_entries\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_timeline_page\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_timeline_date\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_timeline_dedup\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"page_versions\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_versions_page\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"ingest_log\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_ingest_log_source_type_created\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"config\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"access_tokens\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"idx_access_tokens_hash\" already exists, skipping",
  file: "index.c",
  line: "894",
  routine: "index_create",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"mcp_request_log\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
{
  severity_local: "NOTICE",
  severity: "NOTICE",
  code: "42P07",
  message: "relation \"oauth_clients\" already exists, skipping",
  file: "parse_utilcmd.c",
  line: "211",
  routine: "transformCreateStmt",
}
  Schema probe/migrate failed: column "source_id" does not exist
  Try: gbrain init --migrate-only
[doctor.db_checks] done
{"schema_version":2,"status":"unhealthy","health_score":10,"checks":[{"name":"resolver_health","status":"ok","message":"42 skills, all reachable"},{"name":"skill_conformance","status":"ok","message":"42/42 skills pass"},{"name":"minions_migration","status":"fail","message":"WEDGED MIGRATION(s): 0.32.2 (>=3 consecutive partials). Run: gbrain apply-migrations --force-retry 0.32.2"},{"name":"upgrade_errors","status":"warn","message":"Post-upgrade failure on 2026-05-15 (0.34.4.0 → 0.35.0.0, phase: post-upgrade). Recovery: Run: gbrain apply-migrations --yes"},{"name":"sync_failures","status":"warn","message":"1 unacknowledged sync failure(s) [UNKNOWN=1]. people/will-vanish.md (file vanished mid-sync (working tree drifted from headCommit). Fix the file(s) and re-run 'gbrain sync', or use 'gbrain sync --skip-failed' to acknowledge."},{"name":"slug_fallback_audit","status":"ok","message":"info: 2 slug fallbacks in the last 7 days (SLUG_FALLBACK_FRONTMATTER)."},{"name":"multi_source_drift","status":"warn","message":"337 page slug(s) appear at 'default' but NOT at the intended source (e.g., resolver (intended=brain), personal/readme (intended=brain), civic/readme (intended=brain), inbox/readme (intended=brain), archive/readme (intended=brain)). Two possible causes: (1) pre-v0.30.3 putPage misroutes; (2) source X never completed initial sync and the default page is unrelated. Verify with 'gbrain sources status', then either re-sync with 'gbrain sync --source <id> --full' or 'gbrain delete <slug>' if the default-source row is the misroute. (A 'gbrain sources rehome' cleanup command is tracked for v0.32.0.)"},{"name":"connection","status":"ok","message":"Connected, 337 pages"},{"name":"pgvector","status":"ok","message":"Extension installed"},{"name":"rls","status":"ok","message":"RLS enabled on 36/36 public tables"},{"name":"schema_version","status":"warn","message":"Version 50, latest is 66. Fix: gbrain apply-migrations --yes"},{"name":"rls_event_trigger","status":"ok","message":"Auto-RLS event trigger installed"},{"name":"embeddings","status":"ok","message":"100% coverage, 0 missing"},{"name":"embedding_provider","status":"ok","message":"openai:text-embedding-3-large ✓ 1601ms, 1536 dims, DB aligned"},{"name":"graph_coverage","status":"warn","message":"Entity link coverage 0%, timeline 0% (2 entity pages). Run: gbrain extract all"},{"name":"brain_score","status":"warn","message":"Brain score 45/100 (embed 35/35, links 0/25, timeline 0/15, orphans 0/15, dead-links 10/10)"},{"name":"integrity","status":"warn","message":"Sampled 337 pages; 1 bare-tweet phrase(s), 89 external link(s). Run: gbrain integrity check (or integrity auto to repair)."},{"name":"jsonb_integrity","status":"ok","message":"All JSONB columns store objects/arrays"},{"name":"takes_weight_grid","status":"ok","message":"No takes yet"},{"name":"whoknows_health","status":"warn","message":"whoknows eval fixture missing at test/fixtures/whoknows-eval.jsonl. Fix: hand-label 10 queries you'd actually run, format {query, expected_top_3_slugs, notes}."},{"name":"markdown_body_completeness","status":"ok","message":"No truncated bodies detected"},{"name":"frontmatter_integrity","status":"warn","message":"314 frontmatter issue(s) across 2 source(s). aicortex: 313 (MISSING_OPEN=313); brain: 1 (MISSING_OPEN=1). Fix: gbrain frontmatter validate <source-path> --fix"},{"name":"eval_capture","status":"ok","message":"No capture failures in the last 24h"},{"name":"contradictions","status":"ok","message":"Skipped (eval_contradictions_runs table unavailable — apply migrations to enable)"},{"name":"facts_extraction_health","status":"ok","message":"No facts:absorb failures in the last 24h."},{"name":"effective_date_health","status":"ok","message":"Sample of last 1000 pages clean (no fallback-with-parseable-fm-date, no future-dated, no pre-1990)"},{"name":"salience_health","status":"ok","message":"Skipped (no pages have emotional_weight > 0; either fresh install or recompute hasn't run yet)"},{"name":"queue_health","status":"ok","message":"No stalled-forever jobs; no queue over depth 10."},{"name":"subagent_provider","status":"ok","message":"Subagent tier resolves to Anthropic"},{"name":"facts_health","status":"ok","message":"facts_health(default): 0 active, 0 today, 0 this week, 0 consolidated, top entities —"},{"name":"image_assets","status":"ok","message":"No image assets indexed yet"},{"name":"ocr_health","status":"ok","message":"OCR not in use (or no images ingested with OCR opt-in)"},{"name":"sync_freshness","status":"fail","message":"Source 'brain' (Local Brain) last synced 3d ago — brain search is stale!; Source 'aicortex' (AI Cortex Documents) last synced 3d ago — brain search is stale!. Run `gbrain sync --source <id>` for each stale source"},{"name":"search_mode","status":"ok","message":"search.mode is unset (using balanced fallback). Run `gbrain search modes` to see what is running and pick a mode explicitly."},{"name":"eval_drift","status":"ok","message":"No retrieval-affecting files changed in working tree."},{"name":"reranker_health","status":"warn","message":"2 reranker auth failure(s) in last 7 days. Fix: verify ZEROENTROPY_API_KEY and run `gbrain models doctor`."}]}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions