46 Commits

Author SHA1 Message Date
Justin Poehnelt 503315bc42 docs: update installation instructions to prioritize github releases (#656)
* docs: update installation instructions to prioritize github releases

* ci: add explicit verification instructions to github release notes

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-31 12:11:46 -06:00
Justin Poehnelt ecddf2ec86 ci: add cargo-deny for license, advisory, and source auditing (#653)
Generate Skills / Generate and commit skills (push) Has been cancelled
* ci: add cargo-deny configuration for supply chain auditing

* Update deny.toml

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update deny.toml

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update deny.toml

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update deny.toml

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update deny.toml

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* ci: add cargo-deny to workflow

Integrates cargo-deny into the main CI pipeline using the official
EmbarkStudios action. This will automatically block PRs that introduce
banned licenses, insecure crates, or unallowed registries.

* ci: explicitly deny unmaintained, yanked, and unlicensed crates per review

* ci: remove deprecated cargo-deny keys and restore valid config

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-31 12:09:56 -06:00
Justin Poehnelt 5d24ac225b ci: add cargo-audit workflow for dependency vulnerability scanning (#649)
Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-31 11:42:06 -06:00
Justin Poehnelt b422e5d22f ci: pin cross-rs to v0.2.5 in release workflow (#651)
Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-31 11:40:47 -06:00
Justin Poehnelt 86c08cfc0d fix: remove cargo-dist, use native fetch for npm installer (#646)
* chore: remove cargo-dist, use native fetch for npm installer

* fix: harden npm scripts — spawnSync, signal handling, binary-exists check

* fix: address PR review comments

- Add null body guard for fetch response
- Fix PowerShell Expand-Archive path quoting vulnerability
- Sanitize error output to prevent ANSI escape injection
- Add proxy support limitation note
- Fix upgrade bug: use .version marker so npm update downloads new binary
- Downgrade changeset from minor to patch (chore, not feature)
- Update AGENTS.md: remove stale cargo-dist reference from labels

* fix: use flat archives for consistent tar/zip extraction

Both tar.gz and zip archives now contain files at root (no nested
directory). Removes --strip-components 1 from install.js since it is
no longer needed. This makes extraction consistent across platforms.

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-31 11:17:57 -06:00
jpoehnelt-bot 674d53a65a fix(ci): add setup-uv step to Lint Skills job
The Lint Skills job uses uvx to run agentskills validate, but uv
is not pre-installed on GitHub Actions runners. Add astral-sh/setup-uv
action and a skills path filter to the changes detection.
2026-03-26 09:59:40 -06:00
Yannik Tausch b45cdf862a ci: add skills-ref lint step for SKILL.md validation (#626) 2026-03-25 09:44:54 -06:00
googleworkspace-bot 186e88caa0 chore: release versions (#616) 2026-03-24 15:01:28 -06:00
Justin Poehnelt 029e5def2b feat: extract google-workspace library crate (cargo workspace) (#613)
* feat: extract google-workspace library crate and restructure as cargo workspace

- Create crates/google-workspace/ with public modules: discovery, error, services, validate, client
- Move CLI binary to crates/cli/ (package: google-workspace-cli, binary: gws)
- Root Cargo.toml is now workspace-only
- Binary modules use thin re-exports from library (zero behavioral changes)
- Discovery fetch_discovery_document accepts cache_dir parameter for library consumers
- Break output.rs / error.rs circular dep by moving char detection to library validate module
- Update CI workflows for workspace (--workspace flags, path filters)
- Update dist-workspace.toml and policy.yml for new crate locations

Closes #386

* refactor: rename crates/cli to crates/google-workspace-cli

* chore: sync CLI version to 0.20.1 and regenerate skills

* chore: update labeler paths for workspace crate layout

* fix: update flake.nix to read version from CLI crate Cargo.toml

* fix: use tokio::fs for non-blocking I/O in library discovery cache

* docs: update AGENTS.md source layout for workspace structure

* docs: add crate-level READMEs for crates.io

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-24 14:40:03 -06:00
Justin Poehnelt 4663021b4a fix(ci): skip publish-skills on fork PRs (#604)
* fix(ci): skip publish-skills on fork PRs where secrets are unavailable

* chore: regenerate skills [skip ci]

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
Co-authored-by: googleworkspace-bot <googleworkspace-bot@users.noreply.github.com>
2026-03-24 11:50:06 -06:00
Justin Poehnelt d65578190e ci: Add CI validation for changeset package names and update style guide with new sections and AGENTS.md reference. (#552) 2026-03-18 14:42:44 -06:00
Zsombor Szabo 087066f946 fix(auth): enable native keyring backends on top of #359 (#373)
* fix(auth): enable native keyring backends

* test(auth): serialize config dir env test

* fix(auth): scope native keyring backends to desktop targets

* fix(ci): tolerate read-only gemini review tokens

* test(credential_store): cover race winner sync path
2026-03-12 09:58:52 -06:00
Justin Poehnelt bd5041e3da chore: Update workflow to use GOOGLEWORKSPACE_BOT_TOKEN and googleworkspace-bot identity for operations. (#388)
Release / plan (push) Has been cancelled
Release / build-global-artifacts (push) Has been cancelled
Release / build-local-artifacts (${{ join(matrix.targets, ', ') }}) (push) Has been cancelled
Release / host (push) Has been cancelled
Release / publish-npm (push) Has been cancelled
Release / announce (push) Has been cancelled
2026-03-10 14:25:45 -06:00
Justin Poehnelt ad99aa9a2a ci: use bot token for /gemini review comment (#384)
Gemini Code Assist ignores comments from github-actions[bot].
Using GOOGLEWORKSPACE_BOT_TOKEN posts as googleworkspace-bot instead.

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-10 13:23:53 -06:00
jpoehnelt-bot 80fd6c51ea ci: add workflow_dispatch trigger to Release (Changeset)
Allows manual re-triggering when bot-merged PRs don't fire the push event.
2026-03-10 12:28:15 -06:00
Justin Poehnelt b0f159eea0 ci: run smoketest immediately after linux build, gate other builds on it (#349)
Split x86_64-unknown-linux-gnu out of the build matrix into a dedicated
build-linux job. The smoketest now depends only on build-linux, running
as soon as that single build completes. The remaining cross-platform
builds (macOS, Windows, aarch64-linux) depend on the smoketest, so they
are skipped entirely if the smoketest fails — saving CI minutes.

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-09 16:04:44 -06:00
Justin Poehnelt 5872dbe474 fix(credential_store): stop persisting encryption key file when keyring is available (#345)
Previously, get_or_create_key() unconditionally wrote the encryption key
to ~/.config/gws/.encryption_key on first run, even when the OS keyring
was available. This left the key material on disk as a plain file,
making credentials portable by copying the config directory.

Changes:
- Extract save_key_file() helper to deduplicate file-writing logic
- On keyring read success: delete stale .encryption_key (migration)
- On NoEntry + existing file: migrate key into keyring, then delete file
- On NoEntry + new key: try keyring first, only write file as fallback

Fixes #344

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-09 15:51:05 -06:00
Justin Poehnelt 06edf7b05f fix(ci): add missing tool input to taiki-e/install-action for cargo-llvm-cov (#347)
When actions were SHA-pinned in #341, the tool name was lost. The
original uses: taiki-e/install-action@cargo-llvm-cov passed the tool
name as the tag. After pinning to a SHA, the tool input must be
specified explicitly via with: tool: cargo-llvm-cov.

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-09 15:41:37 -06:00
Justin Poehnelt 00adb5cb23 ci: make sccache setup resilient to cache API outages (#346)
Remove RUSTC_WRAPPER from global env and set it per-job only after the
sccache-action succeeds. When GitHub's cache API is unavailable, CI now
falls through to a plain (uncached) cargo build instead of failing.

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-09 15:00:10 -06:00
Justin Poehnelt d5d77d96d0 ci: pin all actions to a sha (#341) 2026-03-09 13:52:49 -06:00
Justin Poehnelt 5836d1527a ci: ignore sccache errors when GitHub down (#339) 2026-03-09 12:54:05 -06:00
Justin Poehnelt ba472602f6 build(ci): optimize nix and windows cache layers (#331) 2026-03-09 11:54:14 -06:00
Justin Poehnelt 7c7310a9a9 fix(ci): use default GITHUB_TOKEN instead of bot account for PR reviews 2026-03-09 11:06:46 -06:00
jpoehnelt-bot 1f47420caa fix: extract CLA label job into dedicated workflow to prevent feedback loop 2026-03-05 16:00:49 -07:00
Justin Poehnelt 49f2e4aa79 ci: Add concurrency control to the automation workflow. 2026-03-05 15:55:10 -07:00
Justin Poehnelt 1ff5bc820f ci: use pull_request_target 2026-03-05 15:34:44 -07:00
Justin Poehnelt 4b2702e539 ci: add path filtering to skip expensive jobs on non-Rust changes (#216)
- Add dorny/paths-filter to detect .rs, Cargo.toml/Lock, flake.nix/lock changes
- Gate test, lint, nix, skills, and build jobs behind change detection
- Remove duplicate coverage job (already in coverage.yml with Codecov upload)
- Main pushes always run all jobs unconditionally

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-05 14:28:17 -08:00
Justin Poehnelt 78817b048c ci: auto-trigger Gemini Code Assist review on PR push (#209) 2026-03-05 13:54:03 -08:00
Justin Poehnelt 88cb65ce80 chore: auto triage and fmt (#204)
* chore: auto triage and fmt

* chore: address PR review — add area:core, setup.rs to auth, move formatter

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-05 13:07:43 -08:00
Justin Poehnelt 62d6ddbfa9 chore: steps to reduce contributor friction (#185)
* chore: steps to reduce contributor friction

* Update CLAUDE.md

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-05 09:08:50 -08:00
Steve Bazyl 37ab483840 feat: Add nix flake (#94) 2026-03-04 22:21:36 -07:00
Justin Poehnelt b3669e04a5 feat: Implement hourly cron and manual trigger for the generate-skills workflow to auto-sync skills via pull requests and downgrade CI drift check to a warning. (#63)
* feat: Implement hourly cron and manual trigger for the generate-skills workflow to auto-sync skills via pull requests and downgrade CI drift check to a warning.

* chore: regenerate skills [skip ci]

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-04 12:57:20 -08:00
Justin Poehnelt 9564896032 fix: add hourly cron to drip-publish skills past rate limit 2026-03-04 12:38:19 -07:00
Justin Poehnelt be29739699 fix: use explicit clawhub login for CI authentication
clawhub CLI requires explicit `clawhub login --token` call rather
than reading the CLAWHUB_TOKEN env var directly. Split the publish
step into separate authenticate and sync steps.
2026-03-04 12:36:07 -07:00
jpoehnelt-bot e8d533e722 ci: add workflow to publish OpenClaw skills to ClawHub (#55)
* ci: add workflow to publish OpenClaw skills to ClawHub

* ci: use documented clawhub sync flags

* ci: harden publish-skills workflow

- Pin clawhub@0.7.0 for supply-chain safety
- Add concurrency group to prevent parallel publishes
- Add PR dry-run validation
- Guard against missing CLAWHUB_TOKEN secret
- Add changeset file

---------

Co-authored-by: jpoehnelt-bot <jpoehnelt-bot@users.noreply.github.com>
2026-03-04 12:15:05 -07:00
Justin Poehnelt 9935ddee39 ci: auto-generate and commit skills on branch push 2026-03-04 00:57:29 -07:00
Justin Poehnelt 214fc18d4f ci: skip smoketest on fork pull requests (#47) 2026-03-04 00:24:13 -07:00
Justin Poehnelt 3cd4d522b2 fix: sync Cargo.toml version with changesets (#7) 2026-03-03 09:46:45 -08:00
Justin Poehnelt fd99954627 fix: use custom tag-release script for private packages 2026-03-03 10:24:27 -07:00
Justin Poehnelt 4d4cabeb16 ci: add concurrency controls to cancel stale PR runs 2026-03-03 10:13:44 -07:00
Justin Poehnelt 8ab58d670f ci: disable Windows Defender for cargo dirs 2026-03-03 10:10:40 -07:00
Justin Poehnelt ceacdbae09 ci: fix release 2026-03-03 10:07:42 -07:00
Justin Poehnelt a0ad08950d ci: speed up builds with rust-cache, sccache, and artifact reuse (#3) 2026-03-03 09:01:42 -08:00
Justin Poehnelt 4ed67adb64 ci: Configure custom npm registry URL and prevent its overwriting in the release workflow. 2026-03-03 09:32:50 -07:00
Justin Poehnelt 835335d85b fix: use changeset tag instead of publish, defer npm publishing to cargo-dist (#2)
* fix: use changeset tag instead of publish, defer npm publishing to cargo-dist

* fix: quote label names containing colons in labeler.yml

* chore: delete labeler
2026-03-02 16:49:37 -08:00
Justin Poehnelt f75bf6dcf7 feat: implement cli (#1) 2026-03-02 17:26:21 -07:00