feat(plugin): publish as Claude Code marketplace plugin
Update .claude-plugin/marketplace.json and plugin.json to v2.9.5 with full metadata. Add plugin install instructions to README as the recommended install method. The repo root serves as both the marketplace and the plugin - skills/last30days/SKILL.md (symlink) is discovered automatically. Users can now install with: /plugin marketplace add mvanhorn/last30days-skill /plugin install last30days@last30days-skill Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,18 +1,23 @@
|
||||
{
|
||||
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
||||
"name": "last30days",
|
||||
"name": "last30days-skill",
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.",
|
||||
"owner": {
|
||||
"name": "mvanhorn",
|
||||
"name": "Matt Van Horn",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"metadata": {
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, and the web",
|
||||
"version": "2.1.0"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "last30days",
|
||||
"source": "./"
|
||||
"description": "Research any topic from the last 30 days. Become an expert and write copy-paste-ready prompts.",
|
||||
"version": "2.9.5",
|
||||
"author": {
|
||||
"name": "Matt Van Horn",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"source": "./",
|
||||
"category": "productivity",
|
||||
"homepage": "https://github.com/mvanhorn/last30days-skill"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
{
|
||||
"name": "last30days",
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, and the web",
|
||||
"version": "2.9.1",
|
||||
"version": "2.9.5",
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.",
|
||||
"author": {
|
||||
"name": "mvanhorn"
|
||||
"name": "Matt Van Horn",
|
||||
"email": "mvanhorn@gmail.com",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"homepage": "https://github.com/mvanhorn/last30days-skill",
|
||||
"repository": "https://github.com/mvanhorn/last30days-skill",
|
||||
"license": "MIT",
|
||||
"keywords": ["research", "reddit", "twitter", "x", "youtube", "trends", "prompts"],
|
||||
"keywords": [
|
||||
"research",
|
||||
"reddit",
|
||||
"twitter",
|
||||
"youtube",
|
||||
"tiktok",
|
||||
"instagram",
|
||||
"trends",
|
||||
"prompts",
|
||||
"polymarket"
|
||||
],
|
||||
"skills": ["./"]
|
||||
}
|
||||
|
||||
@@ -36,12 +36,18 @@ Instagram Reels is now the 8th signal source. TikTok and Instagram both run on S
|
||||
|
||||
## Installation
|
||||
|
||||
### Claude Code Plugin (recommended)
|
||||
```
|
||||
/plugin marketplace add mvanhorn/last30days-skill
|
||||
/plugin install last30days@last30days-skill
|
||||
```
|
||||
|
||||
### Gemini CLI
|
||||
```bash
|
||||
gemini extensions install https://github.com/mvanhorn/last30days-skill.git
|
||||
```
|
||||
|
||||
### Claude Code / Codex
|
||||
### Manual Install (Claude Code / Codex)
|
||||
```bash
|
||||
# Clone the repo
|
||||
git clone https://github.com/mvanhorn/last30days-skill.git ~/.claude/skills/last30days
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
---
|
||||
title: "feat: Publish last30days as Claude Code marketplace plugin"
|
||||
type: feat
|
||||
status: active
|
||||
date: 2026-03-08
|
||||
---
|
||||
|
||||
# feat: Publish last30days as Claude Code Marketplace Plugin
|
||||
|
||||
## Overview
|
||||
|
||||
Publish the last30days skill as a Claude Code plugin so users can install it with:
|
||||
|
||||
```
|
||||
/plugin marketplace add mvanhorn/last30days-skill
|
||||
/plugin install last30days@last30days-skill
|
||||
```
|
||||
|
||||
This gives users auto-updates, versioned installs, and the standard plugin management UX instead of manual git clone.
|
||||
|
||||
## Current State
|
||||
|
||||
The repo already has most of what's needed:
|
||||
|
||||
| Component | Status | Notes |
|
||||
|-----------|--------|-------|
|
||||
| `SKILL.md` | Exists | Source of truth at repo root |
|
||||
| `skills/last30days/SKILL.md` | Exists (symlink) | Points to root SKILL.md, added for Gemini CLI |
|
||||
| `scripts/` | Exists | Python research engine |
|
||||
| `gemini-extension.json` | Exists | Gemini CLI support |
|
||||
| `.claude-plugin/marketplace.json` | **Missing** | Needed to make repo a marketplace |
|
||||
| `.claude-plugin/plugin.json` | **Missing** | Needed (in plugin subdir) to define the plugin |
|
||||
| `plugins/last30days/` | **Missing** | Plugin directory structure |
|
||||
|
||||
## How It Works (compound-engineering as reference)
|
||||
|
||||
The repo serves as BOTH a **marketplace** (distribution channel) and contains **plugins**:
|
||||
|
||||
```
|
||||
repo-root/ # = marketplace
|
||||
├── .claude-plugin/
|
||||
│ └── marketplace.json # Makes repo discoverable as marketplace
|
||||
└── plugins/
|
||||
└── plugin-name/ # = individual plugin
|
||||
├── .claude-plugin/
|
||||
│ └── plugin.json # Plugin manifest
|
||||
└── skills/
|
||||
└── skill-name/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### 1. Create marketplace manifest
|
||||
|
||||
#### `.claude-plugin/marketplace.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
||||
"name": "last30days-skill",
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.",
|
||||
"owner": {
|
||||
"name": "Matt Van Horn",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "last30days",
|
||||
"description": "Research any topic from the last 30 days. Become an expert and write copy-paste-ready prompts.",
|
||||
"version": "2.9.5",
|
||||
"author": {
|
||||
"name": "Matt Van Horn",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"source": "./plugins/last30days",
|
||||
"category": "productivity",
|
||||
"homepage": "https://github.com/mvanhorn/last30days-skill"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Create plugin directory
|
||||
|
||||
#### `plugins/last30days/.claude-plugin/plugin.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "last30days",
|
||||
"version": "2.9.5",
|
||||
"description": "Research any topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.",
|
||||
"author": {
|
||||
"name": "Matt Van Horn",
|
||||
"email": "mvanhorn@gmail.com",
|
||||
"url": "https://github.com/mvanhorn"
|
||||
},
|
||||
"homepage": "https://github.com/mvanhorn/last30days-skill",
|
||||
"repository": "https://github.com/mvanhorn/last30days-skill",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"research",
|
||||
"reddit",
|
||||
"twitter",
|
||||
"youtube",
|
||||
"tiktok",
|
||||
"trends",
|
||||
"prompts"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Symlink skill and scripts into plugin directory
|
||||
|
||||
```bash
|
||||
mkdir -p plugins/last30days/.claude-plugin
|
||||
mkdir -p plugins/last30days/skills/last30days
|
||||
|
||||
# Symlink SKILL.md (single source of truth)
|
||||
ln -s ../../../../SKILL.md plugins/last30days/skills/last30days/SKILL.md
|
||||
|
||||
# Symlink scripts directory (the Python engine)
|
||||
ln -s ../../scripts plugins/last30days/scripts
|
||||
|
||||
# Symlink fixtures if needed
|
||||
ln -s ../../fixtures plugins/last30days/fixtures
|
||||
```
|
||||
|
||||
### 4. Update README with plugin install instructions
|
||||
|
||||
Add before the manual install section:
|
||||
|
||||
```markdown
|
||||
### Plugin Install (recommended)
|
||||
```
|
||||
/plugin marketplace add mvanhorn/last30days-skill
|
||||
/plugin install last30days@last30days-skill
|
||||
```
|
||||
|
||||
Then configure your API keys:
|
||||
```bash
|
||||
mkdir -p ~/.config/last30days
|
||||
# Add SCRAPECREATORS_API_KEY to your env
|
||||
```
|
||||
```
|
||||
|
||||
### 5. Version bump workflow
|
||||
|
||||
When releasing new versions, update version in ALL manifests:
|
||||
- `SKILL.md` frontmatter `version:`
|
||||
- `gemini-extension.json` `version`
|
||||
- `plugins/last30days/.claude-plugin/plugin.json` `version`
|
||||
- `.claude-plugin/marketplace.json` plugins[0].version
|
||||
|
||||
Consider: a `scripts/bump-version.sh` that updates all four in one command.
|
||||
|
||||
## Open Question: Symlinks in Plugin Cache
|
||||
|
||||
**Risk:** When Claude Code installs a plugin, it clones the repo into `~/.claude/plugins/cache/`. Git preserves symlinks on macOS/Linux, so `plugins/last30days/skills/last30days/SKILL.md -> ../../../../SKILL.md` should resolve correctly because the full repo is cloned.
|
||||
|
||||
**Mitigation if symlinks fail:** Replace symlinks with a small build step in sync.sh that copies SKILL.md into the plugin directory. Or just copy the file and accept the duplication in the plugin directory (since the plugin cache is a read-only clone anyway - drift only matters in the source repo, not the installed copy).
|
||||
|
||||
**Test:** After implementing, verify with `git clone` into a temp dir and check symlink resolution.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] `.claude-plugin/marketplace.json` exists with correct schema
|
||||
- [ ] `plugins/last30days/.claude-plugin/plugin.json` exists
|
||||
- [ ] `plugins/last30days/skills/last30days/SKILL.md` resolves to root SKILL.md
|
||||
- [ ] `plugins/last30days/scripts` resolves to root scripts/
|
||||
- [ ] README has plugin install instructions
|
||||
- [ ] `/plugin marketplace add mvanhorn/last30days-skill` works
|
||||
- [ ] `/plugin install last30days@last30days-skill` works
|
||||
- [ ] `/last30days test topic` works after plugin install
|
||||
- [ ] Standalone install (git clone to ~/.claude/skills/) still works
|
||||
- [ ] Gemini CLI install still works
|
||||
|
||||
## User Experience After Publishing
|
||||
|
||||
```
|
||||
# One-time setup
|
||||
/plugin marketplace add mvanhorn/last30days-skill
|
||||
/plugin install last30days@last30days-skill
|
||||
|
||||
# Use it
|
||||
/last30days AI video tools for business
|
||||
|
||||
# Auto-updates happen at startup when version bumps
|
||||
```
|
||||
|
||||
## Sources
|
||||
|
||||
- Claude Code plugin docs: https://code.claude.com/docs/en/plugins
|
||||
- Plugin reference: https://code.claude.com/docs/en/plugins-reference
|
||||
- Marketplace docs: https://code.claude.com/docs/en/plugin-marketplaces
|
||||
- compound-engineering reference: https://github.com/EveryInc/compound-engineering-plugin
|
||||
- Your installed plugins: superpowers (4.3.1), swift-lsp (1.0.0), compound-engineering (2.38.1)
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "feat: Add Gemini CLI extension support"
|
||||
type: feat
|
||||
status: active
|
||||
status: completed
|
||||
date: 2026-03-08
|
||||
origin: docs/plans/2026-03-08-review-pr-53-gemini-cli-support-plan.md
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user