diff --git a/.github/workflows/notify-web.yml b/.github/workflows/notify-web.yml index 9875e94..8a7796e 100644 --- a/.github/workflows/notify-web.yml +++ b/.github/workflows/notify-web.yml @@ -12,6 +12,8 @@ on: paths: - '.claude-plugin/**' - 'plugins/**' + - 'tools.json' + - 'tools/**' workflow_dispatch: jobs: diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index e74cc85..bb16190 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -89,6 +89,30 @@ jobs: exit 1 fi + - name: Validate tools.json registry + run: | + set -e + jq empty tools.json + fail=0 + while IFS= read -r row; do + slug=$(echo "$row" | jq -r '.slug') + eco=$(echo "$row" | jq -r '.ecosystem // empty') + web=$(echo "$row" | jq -r '.web // empty') + if [ -z "$eco" ]; then + echo "::error file=tools.json::entry '$slug' is missing an 'ecosystem' field. See CONTRIBUTING.md." + fail=$((fail+1)) + fi + path="${web#./}" + if [ -z "$web" ] || [ ! -f "$path" ]; then + echo "::error file=tools.json::entry '$slug' points at missing web.json '$web'" + fail=$((fail+1)) + else + jq empty "$path" + echo "ok: $slug ($eco) -> $path" + fi + done < <(jq -c '.tools[]' tools.json) + if [ "$fail" -gt 0 ]; then exit 1; fi + - name: Plugin versions are consistent and bumped env: # On a PR, compare against the merge base. On a push to main, compare diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1329b61..f0592de 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,40 @@ Thanks for your interest in flykit! This guide covers how to add a new plugin, work on an existing one, develop locally, and submit changes. +## Two manifests, two audiences + +flykit lists things for more than one ecosystem, and they are listed in different files: + +| You are adding | Goes in | Lives in | +|---|---|---| +| A Claude Code **marketplace plugin** | `.claude-plugin/marketplace.json` | `plugins//` in this repo | +| A Claude Code **standalone tool**, or a plugin for **another ecosystem** (e.g. DeepSeek Harness) | `tools.json` | its own repo, referenced by URL | + +`.claude-plugin/marketplace.json` is read by Claude Code itself. It only understands Claude Code plugins — **never put a non-Claude-Code entry in it**, even one that happens to be about Claude Code. Everything else goes in `tools.json`. + +### Adding a `tools.json` entry + +Add an object under `tools`: + +```json +{ + "name": "your-thing", + "slug": "your-thing", + "ecosystem": "dsh", + "description": "One line.", + "repo": "https://github.com/flykit-cc/your-thing", + "npm": "your-thing", + "install": "dsh plugin --profile web add your-thing", + "category": "agents", + "keywords": ["..."], + "license": "MIT", + "version": "0.1.0", + "web": "./tools/your-thing/web.json" +} +``` + +`ecosystem` is required — `claude-code` or `dsh` today; add a new value when a new ecosystem shows up. Then create `tools//web.json` with the same shape used by plugins (see `tools/ghostcode/web.json`), plus `install` and `externalRepo`. `version` here is display metadata only — the source of truth is the tool's own repo, so keep it roughly in sync, no CI enforces it. + ## Plugin contents A Claude Code plugin can bundle any mix of the following. flykit plugins typically lead with skills, but the other types are fair game. diff --git a/README.md b/README.md index d73f2f8..72d3505 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # flykit -**Open-source [Claude Code](https://docs.claude.com/en/docs/claude-code) plugins for real-world workflows.** +**Open-source plugins and tools for AI coding agents — [Claude Code](https://docs.claude.com/en/docs/claude-code) and [DeepSeek Harness](https://github.com/deepseek-ai).** [![MIT License](https://img.shields.io/github/license/flykit-cc/flykit?style=flat-square&labelColor=111&color=000)](./LICENSE) [![Claude Code](https://img.shields.io/badge/Claude_Code-plugin_marketplace-000?style=flat-square&labelColor=111)](https://docs.claude.com/en/docs/claude-code/plugins) @@ -14,16 +14,23 @@
- flykit — Claude Code plugins for real-world workflows + flykit — plugins and tools for AI coding agents --- -A marketplace of small, focused plugins that turn Claude Code into a useful assistant for the things you actually do — taxes, paperwork, recurring chores. Each plugin is self-contained: skills, scripts, reference docs, MIT-licensed. +A collection of small, focused plugins and tools for AI coding agents — the things you actually do: taxes, paperwork, dev workflow, recurring chores. Everything here is self-contained and MIT-licensed. -## Install +flykit spans two ecosystems today: + +| Ecosystem | What lives here | How it is listed | +|---|---|---| +| **Claude Code** | Plugins installed through the flykit marketplace, plus standalone companion tools | [`.claude-plugin/marketplace.json`](./.claude-plugin/marketplace.json) (plugins), [`tools.json`](./tools.json) (tools) | +| **DeepSeek Harness (dsh)** | Harness plugins, each in its own repo | [`tools.json`](./tools.json) | + +## Claude Code plugins In Claude Code, add the marketplace: @@ -37,17 +44,33 @@ Then install any plugin from it: /plugin install steuer@flykit ``` -## Plugins - | Plugin | What it does | |---|---| | [**flow**](./plugins/flow) | A stack-agnostic dev workflow — session lifecycle (`continue` / `status` / `pause`), parallel deep reviews, and an autonomous autopilot loop. Reads your stack from a per-repo `.flow/config.md`. | | [**steuer**](./plugins/steuer) | German freelancer tax filing — fetch transactions from Wise, classify with Claude, calculate the EÜR, walk through ELSTER. | -| _more coming_ | Got a workflow worth automating? Open an issue or see [CONTRIBUTING.md](./CONTRIBUTING.md). | + +## Claude Code tools + +Standalone — not marketplace plugins, installed on their own. + +| Tool | What it does | +|---|---| +| [**ghostcode**](https://github.com/flykit-cc/ghostcode) | Ghostty launcher for Claude Code — project picker, per-project tints, model/provider/mode switcher. | + +## DeepSeek Harness plugins + +| Plugin | What it does | +|---|---| +| [**dsh-claude-live**](https://github.com/flykit-cc/dsh-claude-live) | Run Claude Code as a subagent inside DeepSeek Harness, with its steps streaming live into the session view. `dsh plugin --profile web add dsh-claude-live` | + +Got something worth adding? Open an issue or see [CONTRIBUTING.md](./CONTRIBUTING.md). ## How it works -flykit is a standard Claude Code [plugin marketplace](https://docs.claude.com/en/docs/claude-code/plugins). Each plugin is a directory under [`plugins/`](./plugins) containing its manifest, skills, scripts, and references. +Two manifests, deliberately separate: + +- [`.claude-plugin/marketplace.json`](./.claude-plugin/marketplace.json) is the **Claude Code marketplace contract**. Claude Code reads it directly and only understands Claude Code plugins, so nothing from another ecosystem ever goes in it. Each plugin is a directory under [`plugins/`](./plugins) containing its manifest, skills, scripts, and references. +- [`tools.json`](./tools.json) is the **ecosystem-neutral registry** for everything that is not a marketplace plugin: standalone Claude Code tools and dsh plugins alike. Each entry carries an `ecosystem` field (`claude-code` or `dsh`), lives in its own repo, and points at a `web.json` sidecar under [`tools/`](./tools). Each plugin also has a [`web.json`](./plugins/steuer/web.json) sidecar — that's what [flykit.cc](https://flykit.cc) renders (tagline, features, skills, sources). The site fetches `marketplace.json` + each `web.json` + live star count at build time. diff --git a/tools.json b/tools.json index ad7ca71..5b6c514 100644 --- a/tools.json +++ b/tools.json @@ -1,8 +1,10 @@ { "$schema": "https://flykit.cc/schemas/tools.json", - "name": "flykit-tools", - "description": "Companion tools for Claude Code", - "owner": { "name": "kaiomp" }, + "name": "flykit-registry", + "description": "Tools and plugins across ecosystems — Claude Code companions, DeepSeek Harness plugins", + "owner": { + "name": "kaiomp" + }, "tools": [ { "name": "ghostcode", @@ -12,10 +14,34 @@ "npm": "@flykit/ghostcode", "install": "git clone https://github.com/flykit-cc/ghostcode && npm install -g ./ghostcode", "category": "workflow", - "keywords": ["ghostty", "launcher", "picker"], + "keywords": [ + "ghostty", + "launcher", + "picker" + ], "license": "MIT", "version": "0.2.0", - "web": "./tools/ghostcode/web.json" + "web": "./tools/ghostcode/web.json", + "ecosystem": "claude-code" + }, + { + "name": "dsh-claude-live", + "slug": "dsh-claude-live", + "ecosystem": "dsh", + "description": "Run Claude Code as a subagent inside DeepSeek Harness, with its steps streaming live into the session view.", + "repo": "https://github.com/flykit-cc/dsh-claude-live", + "npm": "dsh-claude-live", + "install": "dsh plugin --profile web add dsh-claude-live", + "category": "agents", + "keywords": [ + "deepseek-harness", + "cordis", + "claude-code", + "subagent" + ], + "license": "MIT", + "version": "0.1.1", + "web": "./tools/dsh-claude-live/web.json" } ] } diff --git a/tools/dsh-claude-live/web.json b/tools/dsh-claude-live/web.json new file mode 100644 index 0000000..baa50c0 --- /dev/null +++ b/tools/dsh-claude-live/web.json @@ -0,0 +1,22 @@ +{ + "displayName": "dsh-claude-live", + "author": "kaiomp", + "authorUrl": "https://github.com/kaiomp", + "categories": ["DeepSeek Harness", "Agents", "Claude Code"], + "tagline": "Run Claude Code as a subagent inside DeepSeek Harness, with its steps streaming live into the session view.", + "description": "A DeepSeek Harness plugin that dispatches Claude Code headless as a subagent and pushes a throttled digest of its steps into the session UI while the run is still in flight. Uses the tool/code-dispatch event pair the released harness already understands, so sessions stay replayable in the web viewer.", + "install": "dsh plugin --profile web add dsh-claude-live", + "externalRepo": "https://github.com/flykit-cc/dsh-claude-live", + "features": [ + "Live digest rows while the child runs — pushed, not polled", + "One tool (claude_live), one child process, no registry or role library", + "Works on the released harness (0.1.1-rc.2+) — no unreleased core needed", + "Permission modes: readonly (plan), full, or Claude's own configuration", + "Hard timeout with process-group SIGTERM/SIGKILL; cancellation kills the child" + ], + "useCases": [ + "DeepSeek plans and orchestrates while Claude Code executes chunks, both visible in one session", + "Long refactors you want to watch instead of poll", + "Harness users who need replayable sessions in the web UI" + ] +}