Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
c2cde47
feat: add harness-compile skill for cross-platform config compilation
siracusa5 Mar 13, 2026
36aaf27
fix: address code review issues in harness-compile skill
siracusa5 Mar 13, 2026
1e2381a
fix: address minor review observations in harness-compile skill
siracusa5 Mar 13, 2026
72bb04d
feat: add harness-sync skill for bidirectional cross-platform sync
siracusa5 Mar 13, 2026
252ec65
fix: address code review issues in harness-sync skill
siracusa5 Mar 13, 2026
abc8d02
feat: add cross-platform support to harness-import
siracusa5 Mar 13, 2026
cd32745
fix: address code review issues in harness-import cross-platform update
siracusa5 Mar 13, 2026
f6909ad
feat: add cross-platform support to harness-export
siracusa5 Mar 13, 2026
ff2098b
fix: address code review issues in harness-export cross-platform update
siracusa5 Mar 13, 2026
e5f3183
chore: bump harness-share to v0.3.0 with cross-platform support
siracusa5 Mar 13, 2026
c7f4a66
fix: address final cross-skill consistency issues
siracusa5 Mar 13, 2026
b0146b7
docs: fix review issues — broken link, header, missing flags, skill i…
siracusa5 Mar 13, 2026
16f622d
docs: implement doc review suggestions
siracusa5 Mar 13, 2026
e5c65b6
fix: address pre-merge review issues
siracusa5 Mar 13, 2026
a25e8b0
feat: add marketplace app with dense list UI, plugin routes, and prof…
siracusa5 Mar 13, 2026
27b02ab
fix: address code review issues — filters, injection, race condition,…
siracusa5 Mar 13, 2026
c884417
docs: fix marketplace URLs from /components/ to /plugins/ across all …
siracusa5 Mar 13, 2026
bcf295d
docs: address doc review suggestions
siracusa5 Mar 13, 2026
43ec1d7
fix: address final code review issues
siracusa5 Mar 13, 2026
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
52 changes: 40 additions & 12 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,86 +7,114 @@
"description": "Claude Code skills, agents, and configuration — the parts worth sharing.",
"pluginRoot": "./plugins"
},
"categories": [
{ "slug": "research-knowledge", "name": "Research & Knowledge", "display_order": 1 },
{ "slug": "code-quality", "name": "Code Quality", "display_order": 2 },
{ "slug": "data-engineering", "name": "Data Engineering", "display_order": 3 },
{ "slug": "documentation", "name": "Documentation", "display_order": 4 },
{ "slug": "devops", "name": "DevOps & Shipping", "display_order": 5 },
{ "slug": "productivity", "name": "Productivity", "display_order": 6 }
],
"plugins": [
{
"name": "research",
"source": "./research",
"description": "Process any source into a structured, compounding knowledge base",
"version": "0.3.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "research-knowledge",
"tags": ["research", "knowledge-base", "web-scraping", "pdf", "github", "sources"]
},
{
"name": "explain",
"source": "./explain",
"description": "Structured code explainer — layered explanations of files, functions, directories, or concepts",
"version": "0.2.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "code-quality",
"tags": ["code-explanation", "learning", "walkthrough", "codebase-understanding"]
},
{
"name": "data-lineage",
"source": "./data-lineage",
"description": "Trace column-level data lineage through SQL, Kafka, Spark, and JDBC codebases",
"version": "0.2.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "data-engineering",
"tags": ["sql", "data-lineage", "kafka", "spark", "jdbc", "column-level"]
},
{
"name": "orient",
"source": "./orient",
"description": "Topic-focused session orientation — search graph, knowledge, journal, and research for a specific topic",
"version": "0.2.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "research-knowledge",
"tags": ["orientation", "knowledge-graph", "session", "topic-search"]
},
{
"name": "capture-session",
"source": "./capture-session",
"description": "Capture session information into a staging file for later reflection and knowledge graph processing",
"version": "0.2.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "research-knowledge",
"tags": ["session-capture", "knowledge-graph", "reflection", "staging"]
},
{
"name": "review",
"source": "./review",
"description": "Code review for a branch, PR, or path — structured output with severity labels and cross-file analysis",
"version": "0.3.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "code-quality",
"tags": ["code-review", "pull-request", "static-analysis", "github"]
},
{
"name": "docgen",
"source": "./docgen",
"description": "Generate or update README, API docs, architecture overview, or changelog — always confirms before writing",
"version": "0.2.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "documentation",
"tags": ["documentation", "readme", "api-docs", "changelog", "architecture"]
},
{
"name": "harness-share",
"source": "./harness-share",
"description": "Export, share, and import your harness-kit plugin configuration — capture your setup into harness.yaml and restore it anywhere",
"version": "0.2.0",
"description": "Compile, export, import, and sync harness configurations across Claude Code, Cursor, and GitHub Copilot",
"version": "0.3.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "productivity",
"tags": ["configuration", "export", "import", "yaml", "cross-platform"]
},
{
"name": "ship-pr",
"source": "./ship-pr",
"description": "End-of-task shipping workflow: run tests, open a PR, code review, fix CI, sync base, then squash merge",
"version": "0.1.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "devops",
"tags": ["pull-request", "ci-cd", "merge", "testing", "workflow"]
},
{
"name": "pull-request-sweep",
"source": "./pull-request-sweep",
"description": "Cross-repo PR sweep: triage all open PRs, run code reviews, merge what's ready, fix quick CI blockers, and report",
"version": "0.1.0",
"author": { "name": "harnessprotocol" },
"license": "Apache-2.0"
"license": "Apache-2.0",
"category": "devops",
"tags": ["pull-request", "triage", "ci-cd", "code-review", "multi-repo"]
}
]
}
22 changes: 20 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,26 @@ venv/
private/
docs/plans/

# Docusaurus
website/node_modules/
# Node
node_modules/

# Website (Fumadocs)
website/build/
website/.docusaurus/
website/.cache-loader/
website/.next/
website/out/
website/.source/

# Marketplace
marketplace/.next/
marketplace/out/

# Supabase local
marketplace/supabase/.temp/

# Shared package build output
packages/shared/dist/

# Playwright MCP
.playwright-mcp/
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ A configuration framework for AI coding tools.
[![Validate](https://img.shields.io/github/actions/workflow/status/harnessprotocol/harness-kit/validate.yml?style=flat-square&label=validate)](https://github.com/harnessprotocol/harness-kit/actions/workflows/validate.yml)
[![License](https://img.shields.io/github/license/harnessprotocol/harness-kit?style=flat-square)](LICENSE)

Requires [Claude Code](https://claude.ai/claude-code)
Works with [Claude Code](https://claude.ai/claude-code), [Cursor](https://cursor.com), and [GitHub Copilot](https://github.com/features/copilot)

</div>

Building a good AI setup takes real work. harness-kit makes it portable. Package your plugins, skills, MCP servers, hooks, and conventions into a config you can apply to any harness on any machine — and share with your team in one file. Works with Claude Code today. Designed to travel.
Building a good AI setup takes real work. harness-kit makes it portable. Package your plugins, skills, MCP servers, hooks, and conventions into a config you can apply to any harness on any machine — and share with your team in one file. Works with Claude Code, Cursor, and GitHub Copilot. Designed to travel.

## Install

Expand Down Expand Up @@ -63,7 +63,7 @@ Produces a structured explanation: summary, key components, how it connects, pat
| [`data-lineage`](plugins/data-lineage/skills/data-lineage/README.md) | Trace column-level data lineage through SQL, Kafka, Spark, and JDBC codebases | `/data-lineage orders.amount` |
| [`orient`](plugins/orient/skills/orient/README.md) ¹ | Topic-focused session orientation across graph, knowledge, journal, and research | `/orient auth` |
| [`capture-session`](plugins/capture-session/skills/capture-session/README.md) ¹ | Capture session information into a staging file for later reflection | `/capture-session` |
| [`harness-share`](plugins/harness-share/skills/harness-export/README.md) | Export your plugin setup to `harness.yaml`, import it anywhere, and validate against the Harness Protocol v1 spec | `/harness-export` · `/harness-import` · `/harness-validate` |
| [`harness-share`](plugins/harness-share/skills/harness-export/README.md) | Export your plugin setup to `harness.yaml`, compile to native configs for Claude Code, Cursor, and Copilot, and keep them in sync | `/harness-export` · `/harness-import` · `/harness-validate` · `/harness-compile` · `/harness-sync` |

¹ Personal-workflow plugins designed for projects using the [knowledge graph + journal pattern](docs/claude-md-conventions.md).

Expand All @@ -88,6 +88,8 @@ Capture your installed plugins into a `harness.yaml` file, commit it to your dot
/harness-export # write harness.yaml from your current setup
/harness-import harness.yaml # interactive wizard to pick what to install
/harness-validate # validate harness.yaml against the Harness Protocol v1 schema
/harness-compile # compile harness.yaml to native config files for Claude Code, Cursor, and Copilot
/harness-sync # keep Claude Code, Cursor, and Copilot configuration in sync
```

The import wizard shows each plugin with its description and lets you pick a subset — your config is a starting point, not a mandate.
Expand All @@ -104,7 +106,9 @@ See [`harness.yaml.example`](harness.yaml.example) for the config format.

## Using with Other Tools

harness-kit targets Claude Code, but SKILL.md files are plain markdown — copy them into any tool's instruction system. VS Code Copilot reads `CLAUDE.md` natively via the `chat.useClaudeMdFile` setting, so the conventions guide works without modification. For per-tool setup (Copilot, Cursor, Windsurf, MCP), see the [Cross-Harness setup guide](https://harnesskit.ai/docs/cross-harness/setup-guide).
harness-kit natively supports Claude Code, Cursor, and GitHub Copilot. Use `/harness-compile` to generate native config files for each tool from a single `harness.yaml`, and `/harness-sync` to keep them aligned as your setup evolves.

SKILL.md files are plain markdown — they work in any tool's instruction system. VS Code Copilot reads `CLAUDE.md` natively via the `chat.useClaudeMdFile` setting, so the conventions guide works without modification. The [Harness Protocol spec](https://harnessprotocol.io) documents the full cross-platform target mapping.

## Conventions Guide

Expand Down
77 changes: 77 additions & 0 deletions marketplace/app/api/install/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { NextRequest, NextResponse } from "next/server";
import { createClient } from "@supabase/supabase-js";

function getServiceSupabase() {
const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
const key = process.env.SUPABASE_SERVICE_ROLE_KEY;
if (!url || !key) throw new Error("Supabase not configured");
return createClient(url, key);
}

interface InstallPayload {
slug: string;
}

export async function POST(request: NextRequest) {
const supabase = getServiceSupabase();
let payload: InstallPayload;
try {
payload = await request.json();
} catch {
return NextResponse.json(
{ error: "Invalid JSON body" },
{ status: 400 },
);
}

const { slug } = payload;

if (!slug) {
return NextResponse.json(
{ error: "Missing required field: slug" },
{ status: 400 },
);
}

// Atomically increment install_count to avoid race conditions
const { data: updated, error: updateError } = await supabase
.rpc("increment_install_count", { component_slug: slug });

if (updateError) {
// Fallback: try direct update if RPC not available
const { data: component, error: fetchError } = await supabase
.from("components")
.select("id, install_count")
.eq("slug", slug)
.single();

if (fetchError || !component) {
return NextResponse.json(
{ error: `Plugin not found: ${slug}` },
{ status: 404 },
);
}

const { error: fallbackError } = await supabase
.from("components")
.update({ install_count: (component.install_count ?? 0) + 1 })
.eq("id", component.id);

if (fallbackError) {
return NextResponse.json(
{ error: `Failed to update install count: ${fallbackError.message}` },
{ status: 500 },
);
}

return NextResponse.json({
slug,
install_count: (component.install_count ?? 0) + 1,
});
}

return NextResponse.json({
slug,
install_count: updated,
});
}
Loading
Loading