Skip to content

release: promote develop → main (toward v0.3.1 — install.sh PATH fix)#64

Merged
saadqbal merged 3 commits into
mainfrom
develop
Jun 8, 2026
Merged

release: promote develop → main (toward v0.3.1 — install.sh PATH fix)#64
saadqbal merged 3 commits into
mainfrom
develop

Conversation

@saadqbal

@saadqbal saadqbal commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

Promotes the one unreleased commit on develop to main, ahead of cutting v0.3.1.

Contains

How this actually ships

install.sh is served from releases/latest/download/install.sh (a release asset), so merging to main is not enough — after this merges, push tag v0.3.1 to trigger release.yml, which rebuilds the binaries and re-attaches the fixed install.sh. (No CHANGELOG.md in this repo; release notes are auto-generated.)

Gate

Targets main, so fr-gate runs and blocks merge until #61's kanban item is in Ready for prod.

🤖 Generated with Claude Code


Note

Medium Risk
install.sh mutates user shell config files (append-only, idempotent), which can surprise power users but is the intended fix; InferSchema changes affect tabular ingest typing for sparse columns.

Overview
Fixes post-install tracebloc: command not found on Unix by having install.sh write PATH into the shell rc the user actually loads (bash/zsh/fish/profile), with idempotent detection and clear added/present/failed messaging—aligned with install.ps1 on Windows instead of print-only hints that fail on Ubuntu non-login shells.

Adds docs/troubleshooting.md and a README callout for PATH/reload steps (new terminal or source rc).

For tabular dataset push, InferSchema now types columns with no sampled values as nullable FLOAT (not VARCHAR(255)), returns an empty column list, and the CLI warns so sparse panels are less likely to fail ingestor string validation; tests updated accordingly.

Reviewed by Cursor Bugbot for commit 2663bf3. Bugbot is set up for automated code reviews on this repo. Configure here.

…1) (#61)

* fix(install.sh): persist PATH to the shell rc (parity with install.ps1)

When the binary lands in the ~/.local/bin fallback (the normal unprivileged
`curl | sh` case), the installer now appends the PATH entry to the rc file the
user's shell actually reads — instead of only printing advice.

Fixes the recurring "CLI still not in PATH after restarting the shell" ticket.
install.ps1 already persists user PATH on Windows; this brings Unix to parity.
The print-only behavior silently failed on Ubuntu: ~/.profile adds ~/.local/bin
only at login and only if it already existed, but the installer creates it
mid-session, so a new (non-login) terminal reading ~/.bashrc never saw it.

- Detects the rc per shell + OS: zsh -> .zshrc, bash -> .bashrc (Linux) /
  .bash_profile (macOS login shell), fish -> config.fish, else .profile.
- Idempotent (skips if the rc already references the dir); falls back to
  printing the line if the rc isn't writable.

Validated: sh -n + bash -n; functional + idempotency + per-shell routing tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs: add install troubleshooting guide + harden rc-write fallback

Completes the install-PATH work tracked in #60. The installer change
already on this branch fixes the Ubuntu "not on PATH after restart"
report; this adds the troubleshooting doc + README link that #60 also
asked for, plus a small hardening of the rc-write fallback.

- docs/troubleshooting.md: command-not-found / PATH guide covering the
  ~/.local/bin fallback, login vs non-login shells (Linux + macOS), the
  /usr/local/bin alternative, the Windows new-window case, and SSH login
  shells.
- README: link the guide from the install section.
- install.sh: group the rc append as `{ …; } 2>/dev/null` so a read-only
  or unwritable rc no longer leaks a raw "Permission denied" line before
  the clean fallback message. Verified leak-free under dash + bash; all
  shell/OS routing and idempotency unchanged.

Refs #60.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Asad Iqbal <asad.dsoft@gmail.com>
@LukasWodka

Copy link
Copy Markdown
Contributor

👋 Heads-up — Code review queue is at 26 / 8

Above the WIP limit. The team convention is to review existing PRs before opening new work.

Open PRs currently in Code review (oldest first):

Pull from review before opening new work. (This is a nudge from the kanban WIP check, not a block.)

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4b3737e. Configure here.

Comment thread scripts/install.sh Outdated
Comment thread scripts/install.sh
LukasWodka and others added 2 commits June 8, 2026 13:28
When InferSchema saw a column with no non-empty value in the sample it fell
back to VARCHAR(255). An entirely-empty column then fails ingest: the
data-ingestors string validator rejects the all-NULL column ("N non-string
values"). Sparse panels (e.g. a proteomics matrix where an analyte is
measured in zero samples) hit this on every empty column.

Type such columns as a nullable FLOAT instead — the FLOAT validator accepts
NULLs, so an all-empty column ingests cleanly — and return them in a new
`empty` slice so `dataset push` warns which columns were empty (the user can
--schema-override if a column is really text).

Updates the renamed test + the InferSchema callers for the new return.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
… (Bugbot on #61) (#65)

* fix(install.sh): persist user-local PREFIX even when on PATH; tighten rc idempotency

Two Cursor Bugbot findings on #61's PATH-persistence block, both of which
let the installer print a false "Added ... to your PATH" while a new shell
still couldn't find the binary — the exact failure #61 set out to kill.

1. Loose idempotency: `grep -F "$PREFIX"` matched the directory anywhere in
   the rc, including a bare comment, so a stray mention set added=1 with no
   export written. Now strip comment lines, keep only real
   PATH=/fish_add_path lines, then fixed-match the prefix.

2. Session PATH skipped the rc: the outer `case ":$PATH:"` skipped rc
   persistence whenever $PREFIX was on PATH for the current shell, so a
   one-off `export` (which won't survive a new terminal) left the rc
   untouched. Branch on the install location instead — a user-local prefix
   (under $HOME) always persists; a system prefix (e.g. /usr/local/bin) is
   already on PATH for every shell and only gets a nudge if it isn't.

Validated: sh -n / bash -n / dash -n, shellcheck clean, and a functional
matrix over the extracted block (fresh, idempotent re-run, comment-only,
unrelated PYTHONPATH= line, system-prefix nudge, session-on-PATH persist,
plus zsh/fish/macOS-bash routing) — 9/9.

Refs #61

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(install.sh): tolerate a trailing slash in $HOME for the user-local match

Bugbot on #65: `case "$PREFIX" in "$HOME"/*)` misclassifies a user-local
prefix as a system one when $HOME ends in a slash (e.g. HOME=/home/u/ with
--prefix /home/u/.local/bin -> pattern /home/u//* never matches the single-
slash path), so rc persistence is skipped. Normalize with home_dir="${HOME%/}"
(POSIX suffix strip) before matching.

Functional matrix extended with a trailing-slash-HOME case — 10/10; sh/bash/
dash -n + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(install.sh): accurate present/added/failed messaging; recognize PATH+= and zsh path+=()

Two more Bugbot findings on #65:

- The user-local branch's failure message claimed "$PREFIX is not on $PATH",
  which is wrong now that the branch runs regardless of session PATH (a one-off
  export could already include it). Replaced the added/else pair with explicit
  present/added/failed states so each message is accurate; the failed case no
  longer asserts PATH state.

- The idempotency filter only matched PATH=/fish_add_path, missing the PATH+=
  append idiom (and zsh's path+=() array), so a manual entry of that form wasn't
  recognized and a re-run could append a duplicate block. Broadened to
  case-insensitive (^|[^A-Za-z_])path[+]?= (still excludes PYTHONPATH=/MYPATH=).

Functional matrix now 13/13 (adds PATH+=, zsh path+=(), persist-failure message);
sh/bash/dash -n + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(install.sh): persist any off-PATH prefix to rc, not just $HOME-local ones

Bugbot on #65: keying rc persistence on `case "$PREFIX" in "$home_dir"/*)`
dropped writable non-$HOME targets (e.g. `--prefix /opt/tracebloc`) into the
system branch, which only nudges — so a custom off-PATH install no longer
persisted and a new terminal couldn't find tracebloc. cli#61's original code
persisted ANY off-PATH prefix.

Compute a `persist` decision instead: yes when the prefix is under $HOME
(always — survives a new terminal even if a session export already has it) or
when it's a non-$HOME prefix not on the current $PATH (e.g. /opt/...); no for a
non-$HOME prefix already on PATH (the default /usr/local/bin needs nothing). One
rc-writing block then handles every persist case.

Functional matrix 14/14 (adds off-PATH /opt prefix persists; default system
prefix on PATH stays silent); sh/bash/dash -n + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@saadqbal saadqbal merged commit 506b810 into main Jun 8, 2026
26 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants