Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
7cced9d
[gobby-cli-#111] fix: Suppress gsqz low-savings marker when it would …
joshwilhelmi Apr 10, 2026
cb49094
docs(plans): add sandbox-tolerant hooks plan
joshwilhelmi Apr 16, 2026
bce13f7
[gobby-cli-#112] refactor: Add gobby-core crate with project helpers
joshwilhelmi Apr 16, 2026
f135736
[gobby-cli-#113] feat: Add bootstrap + daemon-URL helpers to gobby-core
joshwilhelmi Apr 16, 2026
25faa57
[gobby-cli-#114] feat: Add ghook crate for sandbox-tolerant hook disp…
joshwilhelmi Apr 16, 2026
3419336
[gobby-cli-#115] refactor: Migrate gcode to use gobby-core project he…
joshwilhelmi Apr 16, 2026
06a7c4b
docs(plans): sync Rust plan with post-PR-3 review findings
joshwilhelmi Apr 16, 2026
ab7ae08
[gobby-cli-#116] ci: Add release-gobby-core workflow + gate GH releas…
joshwilhelmi Apr 16, 2026
45223b8
[gobby-cli-#117] refactor: Rename gobby-hook pkg → gobby-hooks; crate…
joshwilhelmi Apr 16, 2026
33a361e
[gobby-cli-#118] refactor: Dedup graph.rs unresolved response + harde…
joshwilhelmi Apr 16, 2026
12b52f7
[gobby-cli-#119] docs: Add language tag to ghook README CLI fence (MD…
joshwilhelmi Apr 16, 2026
7eaae02
[gobby-cli-#120] chore(release): Prep gcode 0.6.0, gsqz 0.4.1, gcore …
joshwilhelmi Apr 16, 2026
7d0ad7b
[gobby-cli-#121] fix(gsqz): Suppress outer compression header for */n…
joshwilhelmi Apr 16, 2026
f3a1408
[gobby-cli-#122] fix(gsqz): Use sort_by_key for clippy 1.95 unnecessa…
joshwilhelmi Apr 17, 2026
0ca108f
[gobby-cli-#123] fix(gcode): Use match guard for clippy 1.95 collapsi…
joshwilhelmi Apr 17, 2026
317914b
[gobby-cli-#124] fix(ghook): Mark Windows extern block unsafe; releas…
joshwilhelmi Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@ jobs:
- name: Check formatting
run: cargo fmt --all --check

# gobby-core: full clippy + tests
- name: Clippy (gobby-core)
run: cargo clippy -p gobby-core --all-targets -- -D warnings

- name: Test (gobby-core)
run: cargo test -p gobby-core

# ghook: full clippy + tests
- name: Clippy (ghook)
run: cargo clippy -p gobby-hooks --all-targets -- -D warnings

- name: Test (ghook)
run: cargo test -p gobby-hooks

# gsqz: full clippy + tests
- name: Clippy (gsqz)
run: cargo clippy -p gobby-squeeze -- -D warnings
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-gcode.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ jobs:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

release:
needs: build
needs: [build, publish]
runs-on: ubuntu-latest

steps:
Expand Down
42 changes: 42 additions & 0 deletions .github/workflows/release-gcore.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Release gobby-core

on:
push:
tags:
- "gobby-core-v*"

permissions:
contents: read

jobs:
test:
name: Test before release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Clippy
run: cargo clippy -p gobby-core --all-targets -- -D warnings

- name: Run tests
run: cargo test -p gobby-core

publish:
needs: test
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Publish gobby-core to crates.io
run: cargo publish -p gobby-core
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
125 changes: 125 additions & 0 deletions .github/workflows/release-ghook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Release ghook

on:
push:
tags:
- "gobby-hooks-v*"

permissions:
contents: write

jobs:
test:
name: Test before release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Clippy
run: cargo clippy -p gobby-hooks --all-targets -- -D warnings

- name: Run tests
run: cargo test -p gobby-hooks

build:
needs: test
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
os: macos-latest
cross: false
- target: x86_64-apple-darwin
os: macos-latest
cross: false
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
cross: false
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
cross: true
- target: x86_64-pc-windows-msvc
os: windows-latest
cross: false

runs-on: ${{ matrix.os }}
name: ${{ matrix.target }}

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}

- name: Install cross-compilation tools (Linux ARM)
if: matrix.cross && startsWith(matrix.os, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV

- name: Build ghook
run: cargo build --release --target ${{ matrix.target }} -p gobby-hooks

- name: Package (Unix)
if: "!startsWith(matrix.os, 'windows')"
run: |
cd target/${{ matrix.target }}/release
tar czf ../../../ghook-${{ matrix.target }}.tar.gz ghook
cd ../../..

- name: Package (Windows)
if: startsWith(matrix.os, 'windows')
run: |
cd target/${{ matrix.target }}/release
Compress-Archive -Path ghook.exe -DestinationPath ../../../ghook-${{ matrix.target }}.zip
cd ../../..

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ghook-${{ matrix.target }}
path: |
ghook-${{ matrix.target }}.tar.gz
ghook-${{ matrix.target }}.zip

publish:
needs: test
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Publish gobby-hooks to crates.io
run: cargo publish -p gobby-hooks
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

release:
needs: [build, publish]
runs-on: ubuntu-latest

steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
merge-multiple: true

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: |
ghook-*.tar.gz
ghook-*.zip
generate_release_notes: true
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,72 @@ All notable changes to gobby-cli are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.6.0] — gcode

### Changed

#### gcode

- **gobby-core integration** — Migrated to consume the new `gobby-core` crate for project-root walk-up, bootstrap-config resolution, and daemon-URL construction. Inline implementations in `src/project.rs` removed (-109 lines); `src/config.rs` and `src/commands/index.rs` now use the shared helpers. No user-visible behavior change. (#115)

### Fixed

#### gcode

- **FTS LIKE escape** — Hardened FTS5 LIKE-clause escape in `src/search/fts.rs` against patterns containing `%`, `_`, or `\`. Prevents pathological queries from matching unintended rows. (#118)
- **graph.rs dedup** — Deduplicated unresolved-symbol response building in `src/commands/graph.rs` (-63 lines net). No behavior change. (#118)

#### CI/CD

- **Binary-specific tag prefixes** — Release workflows now trigger on `gcode-v*`, `gsqz-v*`, `gloc-v*`, `gcore-v*`, and `ghook-v*` tags so each crate releases independently. (#110)
- **Release gating** — Added `release-gobby-core` workflow; GitHub releases for binary crates are gated on successful crates.io publish. (#116)

## [0.4.1] — gsqz

### Fixed

#### gsqz

- **Low-savings marker** — Suppress `[gsqz:low-savings]` marker when prepending it would grow the output beyond the original. The marker now only annotates when the annotation itself doesn't make things worse. (#111)
- **Outer compression header for `/no-op` strategy** — When the low-savings marker is suppressed (above), the resulting `{pipeline}/no-op` strategy now also skips the outer `[Output compressed by gsqz — …, 0% reduction]` header and the daemon savings report. The user sees the original output verbatim. `CompressionResult::is_passthrough()` classifies `passthrough`, `excluded`, and `*/no-op` together so both call sites stay in sync. (#121)

## [0.1.1] — gobby-hooks

### Fixed

#### gobby-hooks

- **Windows build** — `crates/ghook/src/detach.rs` declared `extern "system" { fn FreeConsole() -> i32; }` for the Windows-only `FreeConsole()` call. Edition 2024 requires extern blocks to be marked `unsafe`, so the Windows build target failed under Rust 1.95. Mac/Linux unaffected (their `#[cfg(unix)]` path uses `setsid(2)` instead). 0.1.0 published to crates.io but Windows users could not `cargo install gobby-hooks`. (#124)

## [0.1.0] — gobby-hooks

### Added

#### gobby-hooks

- **Initial release** — Sandbox-tolerant hook dispatcher binary `ghook`. Spools envelopes to `~/.gobby/hooks/inbox/` *before* POSTing to the local Gobby daemon, so the daemon's drain worker can replay deliveries lost to sandbox FS-read denials, network blips, or daemon restarts. (#114)
- **Dispatch mode** — `ghook --gobby-owned --cli=<c> --type=<t> [--critical] [--detach]` reads stdin, enriches with terminal context where applicable, atomically writes the envelope, then attempts the daemon POST.
- **Diagnose mode** — `ghook --diagnose --cli=<c> --type=<t>` prints a JSON snapshot of what would happen — daemon URL, project root/id, recognized CLI, critical flag, terminal-context preview. No network, no envelope write. Output validated against `schemas/diagnose-output.v1.schema.json`.
- **Version mode** — `ghook --version` prints the version and writes `~/.gobby/bin/.ghook-compatibility` so the daemon can detect schema-version mismatches.
- **Exit codes** — `0` for delivered or non-critical failure (envelope still enqueued); `2` for critical failure (envelope enqueued; signals the host CLI to abort).
- **Schemas** — `inbox-envelope.v1.schema.json` and `diagnose-output.v1.schema.json`, both validated against the Rust types in unit tests.
- **Host CLI registry** — Out-of-the-box support for `claude`, `codex`, `gemini`, `qwen` (per-CLI critical-hooks set + terminal-context-hooks set). Unknown CLIs are tolerated — envelope still spools, just without enrichment.
- **Quarantine** — Malformed stdin lands in `~/.gobby/hooks/inbox/quarantine/` as a body+meta pair. The drain never replays quarantined envelopes; they surface via `gobby status` and daemon logs.
- **Atomic spool writes** — Envelopes use write-temp + `fsync` + rename, so the drain only ever sees fully-written files.
- **Renamed for consistency** — Crate renamed from `gobby-hook` to `gobby-hooks`; binary stays `ghook`. (#117)

## [0.1.0] — gobby-core

### Added

#### gobby-core

- **Initial release** — Shared-primitives crate consumed by `gcode`, `gsqz`, `gloc`, and `ghook`. Three modules:
- `project` — walk up from cwd to find `.gobby/project.json` (or legacy `.gobby/gcode.json`), read `id`/`project_id`.
- `bootstrap` — resolve `~/.gobby/bootstrap.yaml` into a `DaemonEndpoint` (host + port). Falls back to `127.0.0.1:60887` on any failure.
- `daemon_url` — compose a dial URL from a `DaemonEndpoint`, normalizing wildcard listen addresses (`0.0.0.0`, `::`, `::0`) to `127.0.0.1`.
- **Extracted from inline implementations** in the binary crates so behavior changes propagate with one PR instead of four. (#112, #113, #117)

## [0.4.0] — gsqz

### Added
Expand Down
Loading