Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 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
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*"

Comment on lines +3 to +7
Copy link

Copilot AI Apr 17, 2026

Choose a reason for hiding this comment

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

The workflow triggers on gobby-core-v* tags, but the PR description/release instructions refer to a gcore-v* prefix. This mismatch will cause publishes to not run when following the documented tag naming; please align either the workflow trigger or the documented release tag prefix.

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +7
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Tag trigger does not match the documented release tag prefix.

Line 6 uses gobby-core-v*, but the release instructions/changelog reference gcore-v*. Following the documented tag flow would skip this workflow.

Suggested fix
 on:
   push:
     tags:
-      - "gobby-core-v*"
+      - "gcore-v*"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
push:
tags:
- "gobby-core-v*"
on:
push:
tags:
- "gcore-v*"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release-gcore.yml around lines 4 - 7, The workflow's tag
trigger uses the wrong pattern "gobby-core-v*" in the push.tags entry; update
the push.tags value in .github/workflows/release-gcore.yml (the push: tags:
block) to the documented release prefix "gcore-v*" so the workflow runs for the
intended release tags.

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*"

Comment on lines +3 to +7
Copy link

Copilot AI Apr 17, 2026

Choose a reason for hiding this comment

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

The workflow triggers on gobby-hooks-v* tags, but the PR description/release instructions refer to a ghook-v* prefix. This mismatch will cause releases to not run when following the documented tag naming; please align either the workflow trigger or the documented release tag prefix.

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +7
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Tag trigger likely mismatches the intended release tag prefix.

Line 6 listens for gobby-hooks-v*, while release docs/changelog describe ghook-v*. If ghook-v... is pushed, this workflow won’t fire.

Suggested fix
 on:
   push:
     tags:
-      - "gobby-hooks-v*"
+      - "ghook-v*"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
push:
tags:
- "gobby-hooks-v*"
push:
tags:
- "ghook-v*"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release-ghook.yml around lines 4 - 7, The workflow push
tag pattern uses "gobby-hooks-v*" but docs expect "ghook-v*", so update the push
-> tags pattern (the tag value currently "gobby-hooks-v*") to the correct
release prefix "ghook-v*" so pushes of tags like ghook-v... will trigger the
workflow; locate the tags entry in the release workflow and replace
"gobby-hooks-v*" with "ghook-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
58 changes: 58 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,64 @@ 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.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
Loading