# Installation

> Install via Claude Code marketplace, npx skills add for Agent Skills hosts, Hermes, live-edit symlinks, and version sync expectations.

- Repository: mvanhorn/last30days-skill
- GitHub: https://github.com/mvanhorn/last30days-skill
- Human docs: https://grok-wiki.com/public/docs/mvanhorn-last30days-skill-50b5421a8cca
- Complete Markdown: https://grok-wiki.com/public/docs/mvanhorn-last30days-skill-50b5421a8cca/llms-full.txt

## Source Files

- `README.md`
- `HERMES_SETUP.md`
- `.claude-plugin/plugin.json`
- `.claude-plugin/marketplace.json`
- `gemini-extension.json`
- `AGENTS.md`

---

---
title: "Installation"
description: "Install via Claude Code marketplace, npx skills add for Agent Skills hosts, Hermes, live-edit symlinks, and version sync expectations."
---

The distributable unit is the Agent Skills package at `skills/last30days/` (`SKILL.md` plus `scripts/last30days.py` and `scripts/lib/`). Harnesses load that package through marketplace plugins, `npx skills`, harness-native installers, or a manual symlink; the engine always runs from whichever directory contains the `SKILL.md` the model read (`SKILL_DIR`).

## Prerequisites

| Requirement | Used for | Notes |
|---|---|---|
| Python **3.12+** | Engine (`scripts/last30days.py`) | `requires-python = ">=3.12"` in `pyproject.toml`; Hermes docs recommend `python3.12` explicitly |
| **Node.js** | Vendored Bird client for X search | Listed under `metadata.openclaw.requires.bins` in `SKILL.md` |
| **yt-dlp** (optional) | YouTube search and transcripts | `brew install yt-dlp` or `pip install yt-dlp` |
| **gh** CLI (optional) | GitHub source | Uses your existing GitHub auth when present |

Reddit (public JSON), Hacker News, Polymarket, and GitHub (with `gh`) work with zero API configuration after install. Additional sources unlock via the first-run setup wizard or keys documented on [Configure sources](/configure-sources).

## Install surfaces

| Surface | Command | Update | On-disk layout (typical) |
|---|---|---|---|
| **Claude Code** (recommended) | `/plugin marketplace add mvanhorn/last30days-skill` then `/plugin install last30days` | Marketplace auto-refresh; `claude plugin update last30days@last30days-skill` | `~/.claude/plugins/cache/last30days-skill/last30days/{version}/skills/last30days/` |
| **Agent Skills hosts** (Codex, Cursor, Copilot, Gemini CLI, 50+ others) | `npx skills add mvanhorn/last30days-skill -g` | `npx skills update last30days -g` | `~/.agents/skills/last30days/` (copy; see sync below) |
| **Claude Code via Agent Skills CLI** | `npx skills add mvanhorn/last30days-skill -g -a claude-code` | Same as above | Per-host symlink under `~/.claude/skills/` pointing at `~/.agents/skills/last30days` when supported |
| **claude.ai** (web) | Download `last30days.skill` from latest release; upload in Settings | Re-download and re-upload | Hosted skill bundle (not local engine path) |
| **Hermes** | `hermes skills install mvanhorn/last30days-skill --force` | Re-run install, or `git pull` if symlinked | `~/.hermes/skills/research/last30days/` |
| **OpenClaw** | `clawhub install last30days-official` | `clawhub update last30days-official` | OpenClaw skill dir (see OpenClaw metadata in `SKILL.md`) |
| **Developer / live-edit** | `git clone` + symlink into a harness skill dir | `git pull` in the clone | Symlink targets `skills/last30days/` in your checkout |

Current release version is **3.3.1**, pinned consistently in `pyproject.toml`, `skills/last30days/SKILL.md` frontmatter, `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, and `gemini-extension.json` (enforced by `tests/test_plugin_contract.py`).

```text
skills/last30days/                 # canonical package in the repo
├── SKILL.md                       # runtime contract (slash command reads this)
└── scripts/
    ├── last30days.py              # Python engine
    └── lib/                       # search, render, env modules

Harness install → copy or symlink of skills/last30days/
Model sets SKILL_DIR = directory containing the SKILL.md it Read
Engine invoked as:  ${SKILL_DIR}/scripts/last30days.py
```

## Claude Code marketplace

<Steps>
<Step title="Add the marketplace">
In Claude Code:

```
/plugin marketplace add mvanhorn/last30days-skill
```

The marketplace manifest (`.claude-plugin/marketplace.json`) registers plugin name `last30days` with `source: "./"` from the public repo.
</Step>
<Step title="Install the plugin">
```
/plugin install last30days
```

Claude Code auto-discovers `skills/*/SKILL.md` when the plugin manifest omits a `"skills"` key (current `.claude-plugin/plugin.json` shape).
</Step>
<Step title="Verify version in cache">
```bash
cat ~/.claude/plugins/cache/last30days-skill/last30days/*/.claude-plugin/plugin.json | grep version
```

Expect `"version": "3.3.1"` (or whatever release you installed).
</Step>
</Steps>

<Tip>
Force an update check with `claude plugin update last30days@last30days-skill`. After upgrades, run `/plugin update last30days` then `/reload-plugins` if slash-command registration or `/doctor` errors persist.
</Tip>

### Stale marketplace clone (Claude Code only)

Claude Code maintains two plugin paths:

- **Versioned cache** — `~/.claude/plugins/cache/last30days-skill/last30days/{version}/` (preferred)
- **Marketplaces git clone** — `~/.claude/plugins/marketplaces/last30days-skill/` (can lag `origin/main`)

`SKILL.md` **STEP 0** tells the model: if the loaded path contains `/.claude/plugins/marketplaces/` and a newer cache `SKILL.md` exists, stop and re-read from the cache. Symptoms of a stale marketplace load include missing CLI flags (for example `--competitors`) and improvised comparison flows.

<Warning>
Do not run engine `--help` or plan against `marketplaces/` when the versioned cache is available. Users cannot fix this with `git pull` alone — rely on marketplace update or the STEP 0 re-read behavior baked into the skill contract.
</Warning>

### One install method per machine

The native marketplace plugin and `npx skills add … -a claude-code` can coexist. Claude Code does **not** dedupe slash commands across methods — both active installs surface two `/last30days` entries. Pick one path per machine.

## Agent Skills CLI (`npx skills`)

Default install for Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, Continue, Roo, OpenCode, Goose, and other [Agent Skills](https://agentskills.io) hosts:

```bash
npx skills add mvanhorn/last30days-skill -g
```

| Flag | Effect |
|---|---|
| `-g` | Global user install (`~/.agents/skills/last30days/`) — available in all projects |
| (omit `-g`) | Project-local install into `./.skills/` (committed with the repo) |
| `-a <harness>` | Target specific harness(es), e.g. `-a codex`, `-a cursor`, `-a gemini-cli` |
| `-y` | Non-interactive (used in contributor docs: `npx skills add . -g -y` from repo root) |

<Tabs>
<Tab title="Single harness">
```bash
npx skills add mvanhorn/last30days-skill -g -a codex
```
</Tab>
<Tab title="Multiple harnesses">
```bash
npx skills add mvanhorn/last30days-skill -g -a codex -a cursor
```
</Tab>
<Tab title="Claude Code via skills CLI">
```bash
npx skills add mvanhorn/last30days-skill -g -a claude-code
```
</Tab>
</Tabs>

Maintenance commands:

```bash
npx skills update last30days -g    # update this skill globally
npx skills update -g               # update all globally installed skills
npx skills list -g
npx skills remove last30days -g
```

<Note>
`.codex-plugin/` was removed from the repo; Codex should use `npx skills add` or a copy/symlink under `~/.codex/skills/last30days/`. `tests/test_plugin_contract.py` asserts the Codex plugin scaffold stays removed to avoid a forked install surface.
</Note>

## Hermes

Prerequisites: Hermes installed, Python 3.12+, optional `yt-dlp` for YouTube. See `HERMES_SETUP.md`.

<Steps>
<Step title="Install from GitHub">
```bash
hermes skills install mvanhorn/last30days-skill --force
```

Deploys to `~/.hermes/skills/research/last30days/`. `--force` reinstalls over an existing copy.
</Step>
<Step title="Invoke in Hermes">
```
last30days "your research topic"
```

Options pass through to the engine, e.g. `last30days "AI news" --days=7 --deep`.
</Step>
<Step title="Diagnose from install dir">
```bash
cd ~/.hermes/skills/research/last30days
python3.12 scripts/last30days.py --diagnose
```
</Step>
</Steps>

### Hermes live-edit symlink

```bash
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
```

Edits in the clone propagate immediately; update with `git pull` instead of re-running `hermes skills install`.

## claude.ai (web)

<Steps>
<Step title="Enable code execution">
In [claude.ai Settings → Capabilities](https://claude.ai/settings/capabilities), enable **Code execution and file creation** — skills do not run without it.
</Step>
<Step title="Download the bundle">
[Download `last30days.skill`](https://github.com/mvanhorn/last30days-skill/releases/latest/download/last30days.skill) from the latest GitHub release.
</Step>
<Step title="Upload">
Settings → Capabilities → Skills → `+`, drop the file.
</Step>
</Steps>

Maintainers rebuild the upload artifact from a clean tree:

```bash
bash skills/last30days/scripts/build-skill.sh
```

Produces `dist/last30days.skill` (zip with top-level `last30days/`, capped at 200 files for claude.ai). Requires a clean git working tree.

## OpenClaw

```bash
clawhub install last30days-official
clawhub update last30days-official
```

`SKILL.md` includes `metadata.openclaw` (optional env keys, required bins `node` and `python3`, `primaryEnv: SCRAPECREATORS_API_KEY`).

## Developer install and live-edit symlinks

For contributors hacking the repo, two patterns matter: **frozen copy** vs **live symlink**.

### Frozen copy (`npx skills` default)

From the repository root:

```bash
npx skills add . -g -y
```

This copies `skills/last30days` into `~/.agents/skills/last30days/`. **Working-tree edits do not propagate** until you re-run `npx skills add . -g -y`.

### Live symlink (recommended for local dev)

From the repository root:

```bash
ln -sfn "$PWD/skills/last30days" ~/.agents/skills/last30days
```

Equivalent manual paths from the README:

```bash
git clone https://github.com/mvanhorn/last30days-skill.git
ln -s "$(pwd)/last30days-skill/skills/last30days" ~/.claude/skills/last30days
```

Symlinked installs track `git pull` in the clone with no re-copy step.

<Check>
After either pattern, confirm the engine exists:

```bash
test -f ~/.agents/skills/last30days/scripts/last30days.py && echo OK
```

For Claude marketplace cache, substitute the resolved `SKILL_DIR` under `~/.claude/plugins/cache/.../skills/last30days/`.
</Check>

## Version sync expectations

| Install model | When you get new releases | What to run |
|---|---|---|
| Claude Code marketplace | Auto-refresh on new GitHub releases; versioned cache directory per release | `claude plugin update last30days@last30days-skill` or `/plugin update last30days` |
| `npx skills add` (copy) | **Not** automatic — install is a snapshot | `npx skills update last30days -g` or re-run `npx skills add mvanhorn/last30days-skill -g` |
| Git symlink / repo checkout | Immediate for local edits; upstream fixes via git | `git pull` in the clone |
| claude.ai `.skill` upload | Manual | Re-download release artifact and re-upload |
| Hermes `hermes skills install` | On demand | `hermes skills install mvanhorn/last30days-skill --force` |
| OpenClaw ClawHub | On demand | `clawhub update last30days-official` |

Manifest version drift historically broke Claude marketplace resolution (marketplace.json lagging plugin.json). CI now requires `pyproject.toml`, `SKILL.md`, `plugin.json`, `marketplace.json` plugins[0].version, and `gemini-extension.json` to match.

The synthesizing model reports installed version in the mandatory badge (`🌐 last30days v{VERSION} · synced {YYYY-MM-DD}`), resolved from `SKILL_DIR/../../.claude-plugin/plugin.json` or `SKILL.md` frontmatter.

## Verify installation

| Check | Command / signal |
|---|---|
| Slash command registered | `/last30days` appears once (not duplicated) in your harness |
| Engine reachable | `python3 skills/last30days/scripts/last30days.py --diagnose` from `SKILL_DIR` |
| Sources available | `--diagnose` prints per-source keys, CLIs, and backends without a full search |
| Version alignment | Marketplace cache `plugin.json` version matches `SKILL.md` `version:` frontmatter |

First successful `/last30days` invocation triggers the setup wizard (browser cookie scan for X, `yt-dlp` check, optional ScrapeCreators signup). See [Quickstart](/quickstart).

## Beta channel (parallel install)

Experimental work ships from private repo `mvanhorn/last30days-skill-private` as slash command `/last30days-beta`. Install and promotion workflow live in `BETA.md` (private repo). Do not ship beta-only changes to the public marketplace without a review PR here.

## Related pages

<CardGroup>
<Card title="Quickstart" href="/quickstart">
First `/last30days` run, setup wizard signals, saved output location, and `--diagnose`.
</Card>
<Card title="Model clients" href="/model-clients">
Per-harness install targets, `-a` flags, and stale-install avoidance in depth.
</Card>
<Card title="Configure sources" href="/configure-sources">
API keys, `.env` lookup order, and source enablement after install.
</Card>
<Card title="Troubleshooting" href="/troubleshooting">
`--diagnose`, missing sources, stale marketplace clones, and thin results.
</Card>
<Card title="Skill, engine, and harness" href="/skill-engine-harness">
Boundaries between the Agent Skills package, Python engine, and harness runtimes.
</Card>
<Card title="Beta channel" href="/beta-channel">
Parallel `/last30days-beta` install and promotion workflow.
</Card>
</CardGroup>
