From f1ce7533e6f4d3634611b82c78224ad98302b44b Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 15 May 2026 22:58:54 -0700 Subject: [PATCH 1/5] docs(readme): recommend Claude Code plugin, add npx skills install for Codex/Cursor/Copilot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The skill is now installable across every major agent harness after the SKILL.md path-resolver work landed in PR #400 + #404. README didn't yet reflect that — the install table only listed Claude Code, OpenClaw, and Gemini CLI, and the top-of-file install snippets featured Hermes (an internal dev workflow, not a public install method). Restructured the install section: - Top-of-file snippets: just Claude Code (recommended, auto-updates) and the universal `npx skills add` one-liner. Dropped Hermes from the prominent spot (internal-only); pointed everything else to the Install section below. - Install table: added a third column for update commands, since every harness now has a distinct update path worth surfacing. Added the `npx skills` row covering Codex/Cursor/Copilot/any Agent Skills host. - Claude Code subsection: explains why it's recommended (marketplace handles versioned cache + auto-refresh) and notes that the agent-skills install also works on Claude Code if preferred (`-a claude-code`). - New "Codex, Cursor, Copilot, and other Agent Skills hosts" subsection: shows the default install, per-harness `-a` targeting, and the update commands (`npx skills update last30days` for one skill, bare `npx skills update` for all). - Manual (developer) subsection: switched from a clone-into-skills-dir recipe to a clone + symlink recipe. Symlink keeps the install in sync with the working tree as you edit, no re-copy on each change. No code changes. No version bump (docs-only). --- README.md | 86 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 3ed5c3e..3023a0c 100644 --- a/README.md +++ b/README.md @@ -14,21 +14,17 @@ This README tracks the current v3 pipeline. The runtime skill spec lives in [SKILL.md](SKILL.md), which is the source of truth for the latest command and setup behavior. -Claude Code: +**Claude Code (recommended — auto-updates via marketplace):** ``` /plugin marketplace add mvanhorn/last30days-skill ``` -OpenClaw: +**Codex, Cursor, Copilot, or any Agent Skills host:** ``` -clawhub install last30days-official +npx skills add mvanhorn/last30days-skill ``` -Hermes: -``` -# The skill auto-deploys when you run sync.sh -# Or manually copy to ~/.hermes/skills/research/last30days/ -``` +More install options (claude.ai web, OpenClaw, Gemini CLI, manual) in the [Install](#install) section below. Zero config. Reddit, HN, Polymarket, and GitHub work immediately. Run it once and the setup wizard unlocks X, YouTube, TikTok, and more in 30 seconds. @@ -168,12 +164,59 @@ Say "eli5 on" after any research run. The synthesis rewrites in plain language. ## Install -| Surface | Install | -|---------|---------| -| **claude.ai** (web) | [Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) and upload via Settings > Capabilities > Skills > + | -| **Claude Code** | `/plugin marketplace add mvanhorn/last30days-skill` | -| **OpenClaw** | `clawhub install last30days-official` | -| **Gemini CLI** | Clone then `gemini extensions install ./last30days-skill` (see below) | +| Surface | Install | Updates | +|---------|---------|---------| +| **Claude Code** (recommended) | `/plugin marketplace add mvanhorn/last30days-skill` | Auto via marketplace, or `claude plugin update last30days@last30days-skill` | +| **Codex, Cursor, Copilot, any [Agent Skills](https://agentskills.io) host** | `npx skills add mvanhorn/last30days-skill` | `npx skills update last30days` | +| **claude.ai** (web) | [Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) and upload via Settings > Capabilities > Skills > + | Re-download and re-upload | +| **OpenClaw** | `clawhub install last30days-official` | `clawhub update last30days-official` | +| **Gemini CLI** | Clone then `gemini extensions install ./last30days-skill` (see below) | Re-pull and reinstall | + +### Claude Code (recommended) + +``` +/plugin marketplace add mvanhorn/last30days-skill +``` + +Recommended because the Claude Code marketplace handles updates for you — the plugin cache is versioned and auto-refreshes when a new release publishes. Run `claude plugin update last30days@last30days-skill` to force a check. + +If you'd rather use the agent-skills install path on Claude Code, that's also supported: + +``` +npx skills add mvanhorn/last30days-skill -a claude-code +``` + +The native plugin and the `npx skills` install can coexist; Claude Code dedupes the slash command. + +### Codex, Cursor, Copilot, and other Agent Skills hosts + +Install via the open [Agent Skills](https://agentskills.io) CLI: + +```bash +npx skills add mvanhorn/last30days-skill +``` + +By default this installs for whichever harness it detects. To target a specific one (or multiple): + +```bash +npx skills add mvanhorn/last30days-skill -a codex +npx skills add mvanhorn/last30days-skill -a cursor +npx skills add mvanhorn/last30days-skill -a codex -a cursor +``` + +Update later with: + +```bash +npx skills update last30days +``` + +Or update everything you've installed via `npx skills`: + +```bash +npx skills update +``` + +List and remove with `npx skills list` and `npx skills remove last30days`. ### claude.ai (web) @@ -181,15 +224,7 @@ Say "eli5 on" after any research run. The synthesis rewrites in plain language. 2. Go to [claude.ai Settings > Capabilities > Skills](https://claude.ai/settings/capabilities) 3. Click the `+` button in the Skills panel and drop the file in -Enable "Code execution and file creation" under Capabilities first - skills won't run without it. - -### Claude Code - -``` -/plugin marketplace add mvanhorn/last30days-skill -``` - -Update later with `claude plugin update last30days@last30days-skill`. +Enable "Code execution and file creation" under Capabilities first — skills won't run without it. ### OpenClaw @@ -209,10 +244,11 @@ gemini extensions install ./last30days-skill ### Manual (developer) ```bash -git clone https://github.com/mvanhorn/last30days-skill.git ~/.claude/skills/last30days +git clone https://github.com/mvanhorn/last30days-skill.git +ln -s "$(pwd)/last30days-skill/skills/last30days" ~/.claude/skills/last30days ``` -Or build the claude.ai `.skill` file from source: `bash skills/last30days/scripts/build-skill.sh` produces `dist/last30days.skill`. +The symlink keeps the install in sync with your working tree as you edit — no re-copy needed. For `claude.ai`, build the `.skill` file from source: `bash skills/last30days/scripts/build-skill.sh` produces `dist/last30days.skill`. Reddit (with comments), Hacker News, Polymarket, and GitHub work immediately. Zero configuration. Run `/last30days` once and the setup wizard unlocks more sources in 30 seconds. From 164d7ae6ed1b935bbaba9c53c2137d755bcbeeb1 Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 15 May 2026 23:02:57 -0700 Subject: [PATCH 2/5] docs(readme): surface gemini-cli (and copilot, windsurf, 50+ others) in npx skills coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit npx skills supports 50+ harnesses via the -a flag, including gemini-cli, github-copilot, windsurf, cline, continue, roo, aider-desk, opencode, goose, and more — not just the few I'd listed initially. Updating to reflect that breadth. - Top-of-file snippet now reads "Codex, Cursor, Copilot, Gemini CLI, or any of 50+ Agent Skills hosts" (was: "Codex, Cursor, Copilot, or any Agent Skills host" + Gemini listed separately in the table footer). - Install table: same expansion; Gemini CLI native-extension row relabeled to clarify it's the native path (not the only Gemini option). - npx skills subsection: lists the most common harness flags and links to the upstream vercel-labs/skills repo for the full list. - Gemini CLI native subsection: now leads with "the npx skills path above is simpler" and frames the native install as the alternative for users with an existing Gemini extensions workflow or who hit the v0.9.0 installer bug. --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3023a0c..bfa0d16 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ This README tracks the current v3 pipeline. The runtime skill spec lives in [SKI /plugin marketplace add mvanhorn/last30days-skill ``` -**Codex, Cursor, Copilot, or any Agent Skills host:** +**Codex, Cursor, Copilot, Gemini CLI, or any of 50+ [Agent Skills](https://agentskills.io) hosts:** ``` npx skills add mvanhorn/last30days-skill ``` -More install options (claude.ai web, OpenClaw, Gemini CLI, manual) in the [Install](#install) section below. +More install options (claude.ai web, OpenClaw, manual) in the [Install](#install) section below. Zero config. Reddit, HN, Polymarket, and GitHub work immediately. Run it once and the setup wizard unlocks X, YouTube, TikTok, and more in 30 seconds. @@ -167,10 +167,10 @@ Say "eli5 on" after any research run. The synthesis rewrites in plain language. | Surface | Install | Updates | |---------|---------|---------| | **Claude Code** (recommended) | `/plugin marketplace add mvanhorn/last30days-skill` | Auto via marketplace, or `claude plugin update last30days@last30days-skill` | -| **Codex, Cursor, Copilot, any [Agent Skills](https://agentskills.io) host** | `npx skills add mvanhorn/last30days-skill` | `npx skills update last30days` | +| **Codex, Cursor, Copilot, Gemini CLI, GitHub Copilot, or any of 50+ [Agent Skills](https://agentskills.io) hosts** | `npx skills add mvanhorn/last30days-skill` | `npx skills update last30days` | | **claude.ai** (web) | [Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) and upload via Settings > Capabilities > Skills > + | Re-download and re-upload | | **OpenClaw** | `clawhub install last30days-official` | `clawhub update last30days-official` | -| **Gemini CLI** | Clone then `gemini extensions install ./last30days-skill` (see below) | Re-pull and reinstall | +| **Gemini CLI** (native extension) | Clone then `gemini extensions install ./last30days-skill` (see below) | Re-pull and reinstall | ### Claude Code (recommended) @@ -188,9 +188,9 @@ npx skills add mvanhorn/last30days-skill -a claude-code The native plugin and the `npx skills` install can coexist; Claude Code dedupes the slash command. -### Codex, Cursor, Copilot, and other Agent Skills hosts +### Codex, Cursor, Copilot, Gemini CLI, and other Agent Skills hosts -Install via the open [Agent Skills](https://agentskills.io) CLI: +Install via the open [Agent Skills](https://agentskills.io) CLI — supports 50+ harnesses including `codex`, `cursor`, `github-copilot`, `gemini-cli`, `claude-code`, `windsurf`, `cline`, `continue`, `roo`, `aider-desk`, `opencode`, `goose`, and more (full list on the [vercel-labs/skills repo](https://github.com/vercel-labs/skills)). ```bash npx skills add mvanhorn/last30days-skill @@ -201,6 +201,7 @@ By default this installs for whichever harness it detects. To target a specific ```bash npx skills add mvanhorn/last30days-skill -a codex npx skills add mvanhorn/last30days-skill -a cursor +npx skills add mvanhorn/last30days-skill -a gemini-cli npx skills add mvanhorn/last30days-skill -a codex -a cursor ``` @@ -232,7 +233,9 @@ Enable "Code execution and file creation" under Capabilities first — skills wo clawhub install last30days-official ``` -### Gemini CLI +### Gemini CLI (native extension) + +The `npx skills add -a gemini-cli` path above is the simpler route. The native Gemini extension install is kept here for users who prefer it or already have a Gemini extensions workflow. Gemini CLI v0.9.0 has an upstream installer bug that can fail with `Configuration file not found at /tmp/gemini-extensionXXXXXX/gemini-extension.json` ([upstream issue](https://github.com/google-gemini/gemini-cli/issues/11452)). Workaround: From ded52062e6cbfd1c45fb40c6bb3f7d35058adc05 Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 15 May 2026 23:03:51 -0700 Subject: [PATCH 3/5] docs(readme): drop Gemini CLI native-extension install path The native `gemini extensions install` path was a workaround for the v0.9.0 installer bug (still unresolved per upstream issue #11452). Now that `npx skills add -a gemini-cli` covers Gemini cleanly with the same install/update story as every other supported harness, the native path is just one more confusing option to maintain. Users on Gemini get the same recommendation everyone else does. Removes the dedicated "Gemini CLI (native extension)" subsection and the separate table row. Gemini CLI is now surfaced once, in the npx skills section, alongside Codex, Cursor, Copilot, and the rest. --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index bfa0d16..759995d 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,6 @@ Say "eli5 on" after any research run. The synthesis rewrites in plain language. | **Codex, Cursor, Copilot, Gemini CLI, GitHub Copilot, or any of 50+ [Agent Skills](https://agentskills.io) hosts** | `npx skills add mvanhorn/last30days-skill` | `npx skills update last30days` | | **claude.ai** (web) | [Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) and upload via Settings > Capabilities > Skills > + | Re-download and re-upload | | **OpenClaw** | `clawhub install last30days-official` | `clawhub update last30days-official` | -| **Gemini CLI** (native extension) | Clone then `gemini extensions install ./last30days-skill` (see below) | Re-pull and reinstall | ### Claude Code (recommended) @@ -233,17 +232,6 @@ Enable "Code execution and file creation" under Capabilities first — skills wo clawhub install last30days-official ``` -### Gemini CLI (native extension) - -The `npx skills add -a gemini-cli` path above is the simpler route. The native Gemini extension install is kept here for users who prefer it or already have a Gemini extensions workflow. - -Gemini CLI v0.9.0 has an upstream installer bug that can fail with `Configuration file not found at /tmp/gemini-extensionXXXXXX/gemini-extension.json` ([upstream issue](https://github.com/google-gemini/gemini-cli/issues/11452)). Workaround: - -```bash -git clone https://github.com/mvanhorn/last30days-skill -gemini extensions install ./last30days-skill -``` - ### Manual (developer) ```bash From d1cc29d338bb02dbcebb98a6e88e4265eb4b12cc Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 15 May 2026 23:20:33 -0700 Subject: [PATCH 4/5] docs(readme): add -g (global) flag to every npx skills example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `npx skills add` defaults to project-local install (`./.skills/`, committed with the repo). For a research-the-world skill like this one, that's almost never what users want — they want it available across all projects, not scoped to whichever directory they happened to run the install from. Adding `-g` (global) to every npx skills example in the README: - Top-of-file install snippet - Install table row - Claude Code subsection's "alternative via npx skills" example - Codex/Cursor/etc. subsection's default, per-harness, update, list, and remove commands Brief one-liner explains what `-g` does and notes that dropping it gives a project-local install for users who want team consistency on a specific codebase. --- README.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 759995d..c2758e4 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,9 @@ This README tracks the current v3 pipeline. The runtime skill spec lives in [SKI **Codex, Cursor, Copilot, Gemini CLI, or any of 50+ [Agent Skills](https://agentskills.io) hosts:** ``` -npx skills add mvanhorn/last30days-skill +npx skills add mvanhorn/last30days-skill -g ``` +(`-g` installs globally for your user, available across all projects. Drop it to scope per-project.) More install options (claude.ai web, OpenClaw, manual) in the [Install](#install) section below. @@ -167,7 +168,7 @@ Say "eli5 on" after any research run. The synthesis rewrites in plain language. | Surface | Install | Updates | |---------|---------|---------| | **Claude Code** (recommended) | `/plugin marketplace add mvanhorn/last30days-skill` | Auto via marketplace, or `claude plugin update last30days@last30days-skill` | -| **Codex, Cursor, Copilot, Gemini CLI, GitHub Copilot, or any of 50+ [Agent Skills](https://agentskills.io) hosts** | `npx skills add mvanhorn/last30days-skill` | `npx skills update last30days` | +| **Codex, Cursor, Copilot, Gemini CLI, GitHub Copilot, or any of 50+ [Agent Skills](https://agentskills.io) hosts** | `npx skills add mvanhorn/last30days-skill -g` | `npx skills update last30days -g` | | **claude.ai** (web) | [Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) and upload via Settings > Capabilities > Skills > + | Re-download and re-upload | | **OpenClaw** | `clawhub install last30days-official` | `clawhub update last30days-official` | @@ -182,7 +183,7 @@ Recommended because the Claude Code marketplace handles updates for you — the If you'd rather use the agent-skills install path on Claude Code, that's also supported: ``` -npx skills add mvanhorn/last30days-skill -a claude-code +npx skills add mvanhorn/last30days-skill -g -a claude-code ``` The native plugin and the `npx skills` install can coexist; Claude Code dedupes the slash command. @@ -192,31 +193,33 @@ The native plugin and the `npx skills` install can coexist; Claude Code dedupes Install via the open [Agent Skills](https://agentskills.io) CLI — supports 50+ harnesses including `codex`, `cursor`, `github-copilot`, `gemini-cli`, `claude-code`, `windsurf`, `cline`, `continue`, `roo`, `aider-desk`, `opencode`, `goose`, and more (full list on the [vercel-labs/skills repo](https://github.com/vercel-labs/skills)). ```bash -npx skills add mvanhorn/last30days-skill +npx skills add mvanhorn/last30days-skill -g ``` -By default this installs for whichever harness it detects. To target a specific one (or multiple): +The `-g` (global) flag installs to your user directory so the skill is available across all projects. Without `-g`, `npx skills` installs project-locally into `./.skills/` (committed with the repo). For a research-the-world tool, global is what you want. + +By default this installs for whichever harness `npx skills` detects. To target a specific one (or multiple): ```bash -npx skills add mvanhorn/last30days-skill -a codex -npx skills add mvanhorn/last30days-skill -a cursor -npx skills add mvanhorn/last30days-skill -a gemini-cli -npx skills add mvanhorn/last30days-skill -a codex -a cursor +npx skills add mvanhorn/last30days-skill -g -a codex +npx skills add mvanhorn/last30days-skill -g -a cursor +npx skills add mvanhorn/last30days-skill -g -a gemini-cli +npx skills add mvanhorn/last30days-skill -g -a codex -a cursor ``` Update later with: ```bash -npx skills update last30days +npx skills update last30days -g ``` -Or update everything you've installed via `npx skills`: +Or update everything you've installed globally via `npx skills`: ```bash -npx skills update +npx skills update -g ``` -List and remove with `npx skills list` and `npx skills remove last30days`. +List and remove with `npx skills list -g` and `npx skills remove last30days -g`. ### claude.ai (web) From 9fb19eae633f529de4d197b645a4e81bdda79064 Mon Sep 17 00:00:00 2001 From: Trevin Chow Date: Fri, 15 May 2026 23:42:31 -0700 Subject: [PATCH 5/5] refactor: delete sync.sh, dev workflow moves to `npx skills add . -g -y` + native installers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every job sync.sh did has a better replacement: - Per-harness skill dirs (~/.claude/skills, ~/.codex/skills, ~/.agents/skills): `npx skills add . -g -y` writes to every detected harness's home dir and uses symlinks by default. Edits propagate live — no re-deploy step. - Hermes (~/.hermes/skills/research/last30days): `hermes skills install mvanhorn/last30days-skill --force` pulls from GitHub and handles the deploy itself. The script wrapping was redundant. - OpenClaw variant: `clawhub install last30days-official` is what users already run per the README; the maintainer doesn't need a separate variant-deploy step in the public repo's scripts. - Claude marketplace cache (~/.claude/plugins/cache/...): this was a "test against the official install path" hack we shouldn't have been recommending. With PR #400's resolver collapse, STEP 0 no longer enforces the cache as the only valid SKILL.md location. Just install the skill normally via `npx skills` or the marketplace. Cleanup: - DELETE skills/last30days/scripts/sync.sh - tests/test_version_consistency.py — drop test_sync_cache_path_uses_skill_version - CLAUDE.md — replace the sync.sh command + rule with `npx skills add . -g -y` - HERMES_SETUP.md — Installation now uses `hermes skills install --force`; developer-alternative section shows the symlink pattern for live editing - render.py — _skill_version docstring no longer attributes the ".claude-plugin absent" case to sync.sh; explains it via per-harness install paths in general - .github/PULL_REQUEST_TEMPLATE.md — drop the "Ran bash scripts/sync.sh" checklist item CHANGELOG and historical docs (release notes, plan files) keep their existing sync.sh mentions as accurate history. --- .github/PULL_REQUEST_TEMPLATE.md | 1 - CHANGELOG.md | 3 +- CLAUDE.md | 4 +- HERMES_SETUP.md | 32 +++--- skills/last30days/scripts/lib/render.py | 8 +- skills/last30days/scripts/sync.sh | 126 ------------------------ tests/test_version_consistency.py | 8 -- 7 files changed, 20 insertions(+), 162 deletions(-) delete mode 100755 skills/last30days/scripts/sync.sh diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ad42bd8..50ddb26 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,7 +13,6 @@ - [ ] Ran `uv run python -m pytest -q --tb=short` -- [ ] Ran `bash scripts/sync.sh` (if scripts/ changed) ## Related Issues diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd2eb2..cdf4f4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed -- **BREAKING for Codex native-plugin users:** `.codex-plugin/plugin.json` and the matching SKILL_ROOT resolver branch in SKILL.md Step 1. Codex users should install via `npx skills add mvanhorn/last30days-skill` or copy the skill to `~/.codex/skills/last30days/` (which `sync.sh` already writes to in this repo). +- **BREAKING for Codex native-plugin users:** `.codex-plugin/plugin.json` and the matching SKILL_ROOT resolver branch in SKILL.md Step 1. Codex users should install via `npx skills add mvanhorn/last30days-skill` or copy the skill to `~/.codex/skills/last30days/`. +- **`skills/last30days/scripts/sync.sh`.** The maintainer dev-deploy script is gone. Every job it did has a better replacement: `npx skills add . -g -y` symlinks the working tree into every detected harness's skill dir (better than sync.sh's copy model — edits propagate live), `hermes skills install mvanhorn/last30days-skill --force` handles Hermes, `clawhub install last30days-official` handles OpenClaw, and the Claude marketplace cache target was a "test against the official install path" hack we shouldn't have been recommending in the first place. The `test_sync_cache_path_uses_skill_version` test was dropped along with it. CLAUDE.md, HERMES_SETUP.md, the PR template, and a render.py docstring were updated to drop references; CHANGELOG and historical docs (release notes, plan files) keep their existing mentions as accurate history. ## [3.2.0] - 2026-05-09 diff --git a/CLAUDE.md b/CLAUDE.md index 410e382..a48197a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,12 +12,12 @@ Python scripts with multi-source search aggregation. ## Commands ```bash python3 skills/last30days/scripts/last30days.py "test query" --emit=compact -bash skills/last30days/scripts/sync.sh +npx skills add . -g -y # one-time: symlink this repo into every detected harness's skill dir ``` ## Rules - `lib/__init__.py` must be bare package marker (comment only, NO eager imports) -- After edits: run `bash skills/last30days/scripts/sync.sh` to deploy +- One-time setup: `npx skills add . -g -y` creates symlinks from each detected harness's skill dir to this repo. Edits in the working tree propagate live to every harness — no re-deploy step needed. - Git remote: origin = public (`mvanhorn/last30days-skill`) ## Beta channel diff --git a/HERMES_SETUP.md b/HERMES_SETUP.md index ce0d36b..f72d667 100644 --- a/HERMES_SETUP.md +++ b/HERMES_SETUP.md @@ -10,28 +10,20 @@ This guide covers installing last30days on Hermes AI Agent. ## Installation -### Option 1: Via sync.sh (Recommended) - ```bash -# Clone the repo -git clone https://github.com/mvanhorn/last30days-skill.git -cd last30days-skill - -# Run the sync script -bash skills/last30days/scripts/sync.sh +hermes skills install mvanhorn/last30days-skill --force ``` -This will auto-detect Hermes and deploy to `~/.hermes/skills/research/last30days/` +This pulls the latest release from GitHub and deploys to `~/.hermes/skills/research/last30days/`. `--force` reinstalls over any existing copy. -### Option 2: Manual Copy +### Developer / live-edit alternative + +If you're hacking on the skill locally and want edits to propagate to Hermes without re-installing, symlink your working tree: ```bash -# Create directory -mkdir -p ~/.hermes/skills/research/last30days - -# Copy files -cp skills/last30days/SKILL.md ~/.hermes/skills/research/last30days/ -cp -r skills/last30days/scripts ~/.hermes/skills/research/last30days/ +git clone https://github.com/mvanhorn/last30days-skill.git +mkdir -p ~/.hermes/skills/research +ln -s "$(pwd)/last30days-skill/skills/last30days" ~/.hermes/skills/research/last30days ``` ## Usage @@ -106,14 +98,12 @@ python3.12 scripts/last30days.py --diagnose ## Updating -To update to the latest version: - ```bash -cd last30days-skill -git pull -bash skills/last30days/scripts/sync.sh +hermes skills install mvanhorn/last30days-skill --force ``` +If you symlinked your working tree (developer alternative above), just `git pull` in the repo — edits propagate live, no re-install step. + ## Support - Original repo: https://github.com/mvanhorn/last30days-skill diff --git a/skills/last30days/scripts/lib/render.py b/skills/last30days/scripts/lib/render.py index 7e4aeff..f8f1541 100644 --- a/skills/last30days/scripts/lib/render.py +++ b/skills/last30days/scripts/lib/render.py @@ -21,9 +21,11 @@ _VERSION_RE = re.compile( def _skill_version() -> str: """Read plugin version from .claude-plugin/plugin.json, falling back to SKILL.md frontmatter. - sync.sh does not copy .claude-plugin/ to non-cache install dirs (~/.codex/skills, - ~/.agents/skills, Hermes), so SKILL.md frontmatter is the fallback that keeps the - badge from emitting v? on those installs. Returns "?" only if both sources are missing. + Per-harness skill install dirs (`~/.claude/skills`, `~/.codex/skills`, `~/.agents/skills`, + Hermes, etc.) do not always carry `.claude-plugin/plugin.json` — that file ships with + plugin-cache installs but not with per-harness skill installs. SKILL.md frontmatter is + the fallback that keeps the badge from emitting v? on those installs. Returns "?" only + if both sources are missing. A corrupt manifest at one ancestor does not shadow a valid manifest at a deeper one (continue, not break). YAML frontmatter accepts double-quoted, single-quoted, or diff --git a/skills/last30days/scripts/sync.sh b/skills/last30days/scripts/sync.sh deleted file mode 100755 index 09a7e08..0000000 --- a/skills/last30days/scripts/sync.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env bash -# sync.sh - Deploy last30days skill to all host locations -# Usage: bash skills/last30days/scripts/sync.sh (run from repo root) -set -euo pipefail - -SRC="$(cd "$(dirname "$0")/.." && pwd)" -echo "Source: $SRC" - -COMMON_TARGETS=( - # Claude Code plugin cache for this (public) repo's marketplace install. - # Marketplace name = last30days-skill (.claude-plugin/marketplace.json). - # Plugin name = last30days (.claude-plugin/plugin.json). - # Path shape = .../cache/{marketplace-name}/{plugin-name}/{version}. - # Marketplace pulls overwrite this on update; local sync keeps it fresh - # against the working tree so /last30days reflects local dev without - # waiting for a release. Do NOT add ~/.claude/skills/last30days - it - # creates a duplicate slash-command entry alongside the plugin version. - "$HOME/.claude/plugins/cache/last30days-skill/last30days/3.2.3" - "$HOME/.agents/skills/last30days" - "$HOME/.codex/skills/last30days" -) -OPENCLAW_TARGET="$HOME/.openclaw/skills/last30days" - -sync_target() { - local target="$1" - local skill_md="$2" - - echo "" - echo "--- Syncing to $target ---" - mkdir -p "$target/scripts/lib" - - cp "$skill_md" "$target/SKILL.md" - - rsync -a \ - "$SRC/scripts/last30days.py" \ - "$SRC/scripts/watchlist.py" \ - "$SRC/scripts/briefing.py" \ - "$SRC/scripts/store.py" \ - "$target/scripts/" - rsync -a "$SRC/scripts/lib/"*.py "$target/scripts/lib/" - - # The OpenClaw variant lives in the private repo only. Skip cleanly when - # running this script from the public repo where variants/open does not exist. - if [ -d "$SRC/variants/open" ]; then - mkdir -p "$target/variants/open/references" - rsync -a "$SRC/variants/open/" "$target/variants/open/" - fi - - if [ -d "$SRC/scripts/lib/vendor" ]; then - rsync -a "$SRC/scripts/lib/vendor" "$target/scripts/lib/" - fi - - if [ -d "$SRC/fixtures" ]; then - mkdir -p "$target/fixtures" - rsync -a "$SRC/fixtures/" "$target/fixtures/" - fi - - mod_count=$(ls "$target/scripts/lib/"*.py 2>/dev/null | wc -l | tr -d ' ') - echo " Copied $mod_count modules" - - if ( - cd "$target/scripts" && - python3 -c "import briefing, store, watchlist; from lib import youtube_yt, bird_x, render, ui; print(' Import check: OK')" - ); then - true - else - echo " Import check FAILED" - fi -} - -for t in "${COMMON_TARGETS[@]}"; do - sync_target "$t" "$SRC/SKILL.md" -done - -# Hermes sync: deploy to Hermes skills directory if it exists -HERMES_TARGET="$HOME/.hermes/skills/research/last30days" -if [ -d "$HOME/.hermes/skills/research" ]; then - echo "" - echo "--- Syncing to Hermes ---" - mkdir -p "$HERMES_TARGET/scripts/lib" - - cp "$SRC/SKILL.md" "$HERMES_TARGET/SKILL.md" - - rsync -a \ - "$SRC/scripts/last30days.py" \ - "$SRC/scripts/watchlist.py" \ - "$SRC/scripts/briefing.py" \ - "$SRC/scripts/store.py" \ - "$HERMES_TARGET/scripts/" - rsync -a "$SRC/scripts/lib/"*.py "$HERMES_TARGET/scripts/lib/" - - if [ -d "$SRC/scripts/lib/vendor" ]; then - rsync -a "$SRC/scripts/lib/vendor" "$HERMES_TARGET/scripts/lib/" - fi - - if [ -d "$SRC/fixtures" ]; then - mkdir -p "$HERMES_TARGET/fixtures" - rsync -a "$SRC/fixtures/" "$HERMES_TARGET/fixtures/" - fi - - mod_count=$(ls "$HERMES_TARGET/scripts/lib/"*.py 2>/dev/null | wc -l | tr -d ' ') - echo " Copied $mod_count modules to Hermes" - - if ( - cd "$HERMES_TARGET/scripts" && - python3 -c "import briefing, store, watchlist; from lib import youtube_yt, bird_x, render, ui; print(' Import check: OK')" - ); then - true - else - echo " Import check FAILED" - fi -fi - -# OpenClaw sync only runs when the private-repo OpenClaw variant is present -# in the source tree. The public repo does not ship variants/open (the variant -# is sanitized via strip_for_openclaw.py and published separately from -# last30days-skill-private). -if [ -d "$SRC/variants/open" ]; then - sync_target "$OPENCLAW_TARGET" "$SRC/variants/open/SKILL.md" -else - echo "" - echo "Skipping OpenClaw target (no variants/open in this repo)" -fi - -echo "" -echo "Sync complete." diff --git a/tests/test_version_consistency.py b/tests/test_version_consistency.py index 47d0255..e7fef5d 100644 --- a/tests/test_version_consistency.py +++ b/tests/test_version_consistency.py @@ -21,14 +21,6 @@ class TestVersionConsistency(unittest.TestCase): version = _skill_version() self.assertIn(f"# last30days v{version}:", text) - def test_sync_cache_path_uses_skill_version(self) -> None: - sync_text = (SKILL_ROOT / "scripts" / "sync.sh").read_text(encoding="utf-8") - version = _skill_version() - self.assertIn( - f'last30days-skill/last30days/{version}"', - sync_text, - ) - def test_memory_save_dir_uses_single_env_variable(self) -> None: skill_text = (SKILL_ROOT / "SKILL.md").read_text(encoding="utf-8") compare_text = (SKILL_ROOT / "scripts" / "compare.sh").read_text(encoding="utf-8")