Skip to content

Releases: freeloio/freelo-cli

v1.2.0

15 May 06:19

Choose a tag to compare

Pre-production hardening release. Behavior is unchanged for the happy
path of every command — this release tightens what happens when something
goes wrong (network blip mid-write, schema drift, malformed input).

Highlights

Security / durability

  • Atomic credential writes. fileKeyring writes via tempfile + chmod
    0600 + Sync + Rename. A crash, full disk, or signal mid-write can no
    longer wipe stored credentials.
  • Atomic downloads. Files write to a .partial sibling and rename on
    success; cleanup removes the partial on any error. Failed downloads no
    longer leave truncated files under the final name.
  • Streaming uploads. Multipart body streams through io.Pipe. Peak
    RAM is ~32KB regardless of file size (was ~200MB for the 100MB ceiling).
  • Transactional credential store. credstore.Store rolls back the
    email key if the api_key write fails — never sits in a half-saved
    state.

Fixed

  • Decode helpers now surface JSON parse errors instead of silently
    returning empty data on a non-JSON 2xx body.
  • TCP connection leak when SDK returned both a non-nil response and an
    error: resp.Body is now closed on every transport error.
  • freelo tasks show abc (non-numeric ID) returns task-id must be a number instead of silently issuing GET /task/0. Same parse-and-
    validate fix across 17 sites.
  • printCount returns 0 for non-array payloads (was misleadingly
    returning 1, including on error envelopes).
  • printJSON surfaces marshal errors to stderr instead of producing
    empty output.
  • config.Load no longer calls os.Exit--help and version work
    even with --dev set but FREELO_DEV_URL missing.
  • tasklists list returns a clear error if project.tasklists is not
    the expected array shape (was a silent empty success on schema drift).

Changed

  • Command wiring rewritten — the lazy-wrapper indirection (24 *Lazy
    constructors, wrapLazy, patchRunE) is gone. Plus removes a latent
    name-collision bug in subcommand lookup.
  • --page is now 1-indexed with validation everywhere; help text
    uniform. Pagination boilerplate consolidated into shared helpers.
  • tracking status returns a clean {active, server} envelope.

Removed

  • freelo tasks list --worker — flag was parsed and silently dropped
    because /all-tasks has no worker_id parameter. Use `--project
    • --tasklist` filtering instead.

See CHANGELOG.md
for the full list.

Install

Linux / macOS

# Apple Silicon
tar xzf freelo_1.2.0_darwin_arm64.tar.gz && sudo mv freelo /usr/local/bin/

# Linux x86_64
tar xzf freelo_1.2.0_linux_amd64.tar.gz && sudo mv freelo /usr/local/bin/

From source

git clone git@github.com:freeloio/freelo-cli.git
cd freelo-cli && make install     # → ~/bin/freelo

Go install

go install github.com/freeloio/freelo-cli/cmd/freelo@v1.2.0

Verify

freelo version          # should print v1.2.0
freelo auth login       # stores in OS keyring
freelo projects list    # smoke

See INTERNAL_TESTING.md
for the internal-tester walkthrough (~30 min test plan).