Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .github/workflows/pi-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: pi-package

on:
pull_request:
paths:
- "extensions/**"
- "package.json"
- "LICENSE"
- ".github/workflows/pi-package.yml"
push:
branches: [main]
paths:
- "extensions/**"
- "package.json"
- "LICENSE"
- ".github/workflows/pi-package.yml"

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22

- name: Install typecheck dependencies
run: npm install --no-save --ignore-scripts typescript @types/node @earendil-works/pi-coding-agent

- name: Typecheck Pi extensions
run: >-
npx tsc --noEmit --target ES2022 --module NodeNext
--moduleResolution NodeNext --skipLibCheck --types node
--allowImportingTsExtensions
extensions/status-window/index.ts
extensions/status-window/api.ts
extensions/github-status-section.ts
extensions/picture-status-bar.ts
extensions/subagents/index.ts
extensions/subagents/personas.ts

- name: Validate package contents
run: npm pack --dry-run

- name: Load package in Pi
run: npx pi --approve --no-extensions -e . --list-models >/dev/null
44 changes: 40 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ name: release
# Auto-versioning for the marketplace plugin. On every push to main:
# 1. validate the manifests parse
# 2. pick the next version (auto patch-bump, or honor a manual bump in plugin.json)
# 3. write it into plugin.json + marketplace.json so all version fields agree
# 4. commit the bump (with [skip ci] to avoid re-triggering), tag v<version>, release
# 3. write it into plugin.json + marketplace.json + package.json
# 4. publish the Pi npm package when NPM_TOKEN is configured
# 5. commit the bump (with [skip ci] to avoid re-triggering), tag v<version>, release
#
# GitHub Actions natively skips runs whose head commit message contains "[skip ci]",
# so the bump commit this workflow pushes will NOT trigger another run.
Expand All @@ -23,6 +24,8 @@ concurrency:
jobs:
release:
runs-on: ubuntu-latest
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -33,10 +36,15 @@ jobs:
run: |
jq empty plugin.json
jq empty .claude-plugin/marketplace.json
jq empty package.json
# required fields must be present
test "$(jq -r '.name // empty' plugin.json)" != ""
test "$(jq -r '.version // empty' plugin.json)" != ""
test "$(jq -r '.metadata.version // empty' .claude-plugin/marketplace.json)" != ""
test "$(jq -r '.name // empty' package.json)" != ""
test "$(jq -r '.version // empty' package.json)" != ""
jq -e '.keywords | index("pi-package") != null' package.json >/dev/null
npm pack --dry-run >/dev/null

- name: Compute next version
id: ver
Expand Down Expand Up @@ -81,6 +89,34 @@ jobs:
jq --arg v "$v" '.metadata.version = $v | .plugins |= map(if .source == "./" then .version = $v else . end)' \
.claude-plugin/marketplace.json > "$tmp" && mv "$tmp" .claude-plugin/marketplace.json

tmp=$(mktemp)
jq --arg v "$v" '.version = $v' package.json > "$tmp" && mv "$tmp" package.json

- name: Set up Node for npm
if: steps.ver.outputs.skip == 'false' && env.NPM_TOKEN != ''
uses: actions/setup-node@v4
with:
node-version: 22
registry-url: https://registry.npmjs.org

- name: Publish Pi package
if: steps.ver.outputs.skip == 'false' && env.NPM_TOKEN != ''
env:
NODE_AUTH_TOKEN: ${{ env.NPM_TOKEN }}
run: |
set -euo pipefail
name=$(jq -r '.name' package.json)
version=$(jq -r '.version' package.json)
if npm view "$name@$version" version >/dev/null 2>&1; then
echo "$name@$version already published"
else
npm publish --access public --provenance
fi

- name: NPM publishing not configured
if: steps.ver.outputs.skip == 'false' && env.NPM_TOKEN == ''
run: echo "NPM_TOKEN is not configured; skipping Pi package publication"

- name: Commit, tag, and release
if: steps.ver.outputs.skip == 'false'
env:
Expand All @@ -92,8 +128,8 @@ jobs:
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

if ! git diff --quiet -- plugin.json .claude-plugin/marketplace.json; then
git add plugin.json .claude-plugin/marketplace.json
if ! git diff --quiet -- plugin.json .claude-plugin/marketplace.json package.json; then
git add plugin.json .claude-plugin/marketplace.json package.json
git commit -m "chore(release): v$v [skip ci]"
git push origin HEAD:main
fi
Expand Down
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Danie van Zyl

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
43 changes: 37 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,52 @@
# Claude Code Config
# Code Skills

Personal configuration for [Claude Code](https://claude.ai/claude-code) — Anthropic's CLI for Claude.
Personal coding-agent platform for [Claude Code](https://claude.ai/claude-code) and [Pi](https://pi.dev).

## Installing skills
## Installation

Install skills from this repo with:
Install skills with:

```sh
npx skills@latest add danievanzyl/code-skills
```

Install the Pi package from npm:

```sh
pi install npm:@danievanzyl/code-skills
```

Try the current Git checkout without installing:

```sh
pi --no-extensions -e .
```

The Pi package includes a shared fixed status window, GitHub status section, custom editor status bar, background subagents, and bundled GitHub/web research personas. The fixed dock requires Pi's `fullscreen` TUI mode, selectable through `/settings`.

### Publishing the Pi package

The `pi-package` npm keyword makes the published package eligible for [pi.dev/packages](https://pi.dev/packages). Before the first release:

1. Create or select the `@danievanzyl` npm organization/scope.
2. Publish once locally with `npm login && npm publish --access public`, or add an npm automation token as the repository secret `NPM_TOKEN`.
3. Later merges to `main` synchronize `package.json` with the Claude plugin version and publish automatically when `NPM_TOKEN` is configured.

Validate before publishing:

```sh
npm pack --dry-run
pi --approve --no-extensions -e . --list-models
```

## Structure

| Path | Description |
|------|-------------|
| `CLAUDE.md` | Global instructions applied to all sessions |
| `agents/` | Custom sub-agent definitions (codebase-analyzer, codebase-locator, etc.) |
| `CLAUDE.md` | Global Claude instructions applied to all sessions |
| `agents/` | Claude sub-agent definitions |
| `extensions/` | Pi extensions and bundled Pi subagent personas |
| `package.json` | npm/Pi package manifest |
| `skills/` | Reusable skill definitions — hand-authored + vendored (see below) |
| `commands/` | Custom slash commands |
| `settings.json` | Claude Code settings |
Expand Down
Loading
Loading