Skip to content

Commit 07e2bc9

Browse files
authored
feat: Claude Code marketplace plugin + binary-only installer (#11)
* feat: distribute skills as a Claude Code marketplace plugin - Add .claude-plugin/plugin.json (plugin `upkeep`, v0.2.0) - Add .claude-plugin/marketplace.json (marketplace `llbbl-upkeep`) - Rename skills/upkeep-audit → skills/audit, skills/upkeep-deps → skills/deps, skills/upkeep-quality → skills/quality - Update SKILL.md frontmatter name: to audit/deps/quality - Update doc titles and cross-references to /upkeep:audit, /upkeep:deps, /upkeep:quality for clean plugin-namespaced invocation Closes #9 * fix: install.sh downloads versioned tarballs and is binary-only - Resolve "latest" via GitHub API to get the concrete tag before building the download URL (fixes broken download introduced in #7 where assets moved from raw upkeep-<platform> names to versioned tarballs) - Download upkeep_<version>_<os>_<arch>.tar.gz and extract the binary (Windows still gets a raw .exe) - Fix amd64 arch token: was emitting x64, now correctly emits amd64 - Remove skill-copying logic (install_skills, SKILLS_DIR, bin/ symlinks) — skills are now distributed via the plugin marketplace - Rename download_binary → download_file; remove get_download_url in favor of resolve_version - Update tests to match new contract: resolve_version, download_file, amd64 tokens, binary-only / marketplace-pointer assertions * chore: sync plugin.json version and skill paths in justfile/workflow - Update set-version, update-all-versions, show-versions, and commit-version targets to use the new skills/deps, skills/audit, skills/quality paths - Wire .claude-plugin/plugin.json into version bump targets so plugin version stays in sync with package.json - Update auto-release.yml git add step to include .claude-plugin/plugin.json in the release commit * docs: document Homebrew + marketplace install - Add Homebrew as the primary recommended installation method - Document two-part install: CLI binary (Homebrew/script) + skills (marketplace) - Update manual install asset table to versioned tarballs with checksums note - Update skill invocation names to /upkeep:audit, /upkeep:deps, /upkeep:quality - Add /plugin marketplace add + /plugin install instructions for skills - Update project structure tree to reflect renamed skills dirs and new .claude-plugin/ directory
1 parent f593c4c commit 07e2bc9

10 files changed

Lines changed: 172 additions & 174 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "llbbl-upkeep",
3+
"owner": {
4+
"name": "Logan Lindquist Land",
5+
"email": "logan.lindquist@gmail.com"
6+
},
7+
"metadata": {
8+
"description": "Marketplace for the upkeep Claude Code plugin",
9+
"version": "0.2.0"
10+
},
11+
"plugins": [
12+
{
13+
"name": "upkeep",
14+
"source": "./",
15+
"description": "Security audits, dependency upgrades, and quality scoring for JS/TS repos. Bundles the /upkeep:audit, /upkeep:deps, and /upkeep:quality skills."
16+
}
17+
]
18+
}

.claude-plugin/plugin.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "upkeep",
3+
"description": "AI-powered maintenance workflows for JS/TS repos: security audits, dependency upgrades, and quality scoring. Requires the `upkeep` CLI on PATH (brew install llbbl/tap/upkeep).",
4+
"version": "0.2.0",
5+
"author": {
6+
"name": "Logan Lindquist Land",
7+
"email": "logan.lindquist@gmail.com"
8+
},
9+
"homepage": "https://github.com/llbbl/upkeep",
10+
"repository": "https://github.com/llbbl/upkeep",
11+
"license": "MIT",
12+
"keywords": ["maintenance", "security", "dependencies", "audit", "quality", "typescript"]
13+
}

.github/workflows/auto-release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474
run: |
7575
git config user.name "github-actions[bot]"
7676
git config user.email "github-actions[bot]@users.noreply.github.com"
77-
git add package.json src/cli/index.ts skills/*/SKILL.md
77+
git add package.json src/cli/index.ts skills/*/SKILL.md .claude-plugin/plugin.json
7878
git commit -m "chore(release): bump version to v$VERSION"
7979
git tag -a "$TAG" -m "Release $TAG"
8080
git push origin main --follow-tags

README.md

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,44 @@ A comprehensive maintenance toolkit for JavaScript and TypeScript repositories,
1212
- **Risk Assessment** - Evaluate upgrade risk before making changes
1313
- **Dependabot Integration** - Manage Dependabot PRs from the command line
1414

15+
upkeep has two parts that install independently:
16+
17+
- **The `upkeep` CLI binary** — via Homebrew or the install script (below).
18+
- **The Claude Code skills** — via the [plugin marketplace](#claude-code-skills) (`/plugin install upkeep@llbbl-upkeep`).
19+
1520
## Installation
1621

17-
### Quick Install (Recommended)
22+
### Homebrew (Recommended)
23+
24+
```bash
25+
brew install llbbl/tap/upkeep
26+
```
27+
28+
### Install Script
1829

1930
```bash
2031
curl -fsSL https://raw.githubusercontent.com/llbbl/upkeep/main/scripts/install.sh | bash
2132
```
2233

23-
This installs:
24-
- The `upkeep` CLI binary to `~/.local/bin/` (or `~/.upkeep/bin/` if that doesn't exist)
25-
- Claude Code skills to `~/.claude/skills/` for AI-powered workflows
34+
This installs the `upkeep` CLI binary to `~/.local/bin/` (or `~/.upkeep/bin/` if that doesn't exist). It no longer installs the skills — those come from the plugin marketplace (see [Claude Code Skills](#claude-code-skills)).
2635

2736
To install a specific version:
2837

2938
```bash
30-
UPKEEP_VERSION=v0.1.3 curl -fsSL https://raw.githubusercontent.com/llbbl/upkeep/main/scripts/install.sh | bash
39+
UPKEEP_VERSION=v0.2.0 curl -fsSL https://raw.githubusercontent.com/llbbl/upkeep/main/scripts/install.sh | bash
3140
```
3241

3342
### Manual Installation
3443

35-
Download the appropriate binary from [releases](https://github.com/llbbl/upkeep/releases):
44+
Download the appropriate archive from [releases](https://github.com/llbbl/upkeep/releases) and extract the `upkeep` binary (verify against `checksums.txt`):
3645

37-
| Platform | Binary |
38-
|----------|--------|
39-
| Linux x64 | `upkeep-linux-x64` |
40-
| macOS ARM64 (Apple Silicon) | `upkeep-darwin-arm64` |
41-
| macOS x64 (Intel) | `upkeep-darwin-x64` |
42-
| Windows x64 | `upkeep-windows-x64.exe` |
46+
| Platform | Asset |
47+
|----------|-------|
48+
| Linux x64 | `upkeep_<version>_linux_amd64.tar.gz` |
49+
| Linux ARM64 | `upkeep_<version>_linux_arm64.tar.gz` |
50+
| macOS ARM64 (Apple Silicon) | `upkeep_<version>_darwin_arm64.tar.gz` |
51+
| macOS x64 (Intel) | `upkeep_<version>_darwin_amd64.tar.gz` |
52+
| Windows x64 | `upkeep_<version>_windows_amd64.exe` |
4353

4454
### From Source
4555

@@ -122,23 +132,30 @@ upkeep --log-level=debug audit
122132

123133
## Claude Code Skills
124134

125-
upkeep includes skills for Claude Code that provide AI-powered maintenance workflows. Each skill has access to the upkeep binary:
135+
upkeep ships its Claude Code skills as a plugin distributed through its own marketplace. Install them with:
136+
137+
```text
138+
/plugin marketplace add llbbl/upkeep
139+
/plugin install upkeep@llbbl-upkeep
140+
```
126141

127-
### `/upkeep-deps`
142+
This installs all three skills, namespaced under the `upkeep` plugin. The skills shell out to the `upkeep` CLI, so make sure the binary is installed and on your `PATH` first (see [Installation](#installation)).
143+
144+
### `/upkeep:deps`
128145

129146
Upgrade dependencies with intelligent risk assessment:
130147
- Prioritizes Dependabot PRs and security fixes
131148
- Assesses risk before each upgrade
132149
- Runs tests and rolls back on failure
133150

134-
### `/upkeep-audit`
151+
### `/upkeep:audit`
135152

136153
Security audit with fix recommendations:
137154
- Explains each vulnerability
138155
- Shows dependency paths
139156
- Guides through safe fixes
140157

141-
### `/upkeep-quality`
158+
### `/upkeep:quality`
142159

143160
Improve project health:
144161
- Explains quality metrics
@@ -203,9 +220,13 @@ src/
203220
└── logger.ts # Pino logging
204221
205222
skills/
206-
├── upkeep-deps/ # Dependency upgrade skill
207-
├── upkeep-audit/ # Security audit skill
208-
└── upkeep-quality/ # Quality improvement skill
223+
├── deps/ # Dependency upgrade skill (/upkeep:deps)
224+
├── audit/ # Security audit skill (/upkeep:audit)
225+
└── quality/ # Quality improvement skill (/upkeep:quality)
226+
227+
.claude-plugin/
228+
├── plugin.json # Plugin manifest (the `upkeep` plugin)
229+
└── marketplace.json # Marketplace manifest (`llbbl-upkeep`)
209230
210231
tests/
211232
├── cli/ # CLI integration tests

justfile

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,15 @@ bump-version bump:
6969
update-all-versions:
7070
@VERSION=$(jq -r '.version' package.json); \
7171
sed -i '' 's/const VERSION = "[^"]*";/const VERSION = "'"$VERSION"'";/' src/cli/index.ts; \
72-
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-deps/SKILL.md; \
73-
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-audit/SKILL.md; \
74-
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-quality/SKILL.md; \
72+
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/deps/SKILL.md; \
73+
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/audit/SKILL.md; \
74+
sed -i '' 's/^version: .*/version: '"$VERSION"'/' skills/quality/SKILL.md; \
75+
jq --arg v "$VERSION" '.version = $v' .claude-plugin/plugin.json > .claude-plugin/plugin.json.tmp && mv .claude-plugin/plugin.json.tmp .claude-plugin/plugin.json; \
7576
echo "Updated versions to $VERSION"
7677

7778
commit-version:
7879
@VERSION=$(jq -r '.version' package.json); \
79-
git add package.json src/cli/index.ts skills/*/SKILL.md; \
80+
git add package.json src/cli/index.ts skills/*/SKILL.md .claude-plugin/plugin.json; \
8081
git commit -m "chore: bump version to v$VERSION"; \
8182
git tag v$VERSION; \
8283
echo "Created tag v$VERSION"; \
@@ -86,9 +87,10 @@ set-version version:
8687
jq --arg v "{{version}}" '.version = $v' package.json > package.json.tmp && mv package.json.tmp package.json
8788
@VERSION="{{version}}"; \
8889
sed -i 's/const VERSION = "[^"]*";/const VERSION = "'"$VERSION"'";/' src/cli/index.ts; \
89-
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-deps/SKILL.md; \
90-
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-audit/SKILL.md; \
91-
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/upkeep-quality/SKILL.md; \
90+
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/deps/SKILL.md; \
91+
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/audit/SKILL.md; \
92+
sed -i 's/^version: .*/version: '"$VERSION"'/' skills/quality/SKILL.md; \
93+
jq --arg v "$VERSION" '.version = $v' .claude-plugin/plugin.json > .claude-plugin/plugin.json.tmp && mv .claude-plugin/plugin.json.tmp .claude-plugin/plugin.json; \
9294
echo "Set all versions to $VERSION"
9395

9496
version-sync:
@@ -98,6 +100,7 @@ show-versions:
98100
echo "=== Current Versions ==="
99101
echo "package.json: $(jq -r '.version' package.json)"
100102
echo "src/cli/index.ts: $(grep 'const VERSION' src/cli/index.ts | sed 's/.*"\(.*\)".*/\1/')"
101-
echo "upkeep-deps/SKILL.md: $(grep '^version:' skills/upkeep-deps/SKILL.md | sed 's/version: //')"
102-
echo "upkeep-audit/SKILL.md: $(grep '^version:' skills/upkeep-audit/SKILL.md | sed 's/version: //')"
103-
echo "upkeep-quality/SKILL.md: $(grep '^version:' skills/upkeep-quality/SKILL.md | sed 's/version: //')"
103+
echo "skills/deps/SKILL.md: $(grep '^version:' skills/deps/SKILL.md | sed 's/version: //')"
104+
echo "skills/audit/SKILL.md: $(grep '^version:' skills/audit/SKILL.md | sed 's/version: //')"
105+
echo "skills/quality/SKILL.md: $(grep '^version:' skills/quality/SKILL.md | sed 's/version: //')"
106+
echo ".claude-plugin/plugin.json: $(jq -r '.version' .claude-plugin/plugin.json)"

0 commit comments

Comments
 (0)