Harness export
Skill harnessprotocol/harness-kit/plugins/harness-share/skills/harness-export
Your plugins, skills, MCP servers, hooks, conventions, and governance packaged into a single config
npx -y skills add harnessprotocol/harness-kit --skill harness-exportAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when user invokes /harness-export or wants to save their current harness-kit plugin setup to a shareable harness.yaml file. Detects installed skills, collects source info, and writes the config in Harness Protocol v1 format. Do NOT use for importing or restoring a harness — use /harness-import instead.
SKILL.md
10.6 KB, as published. Nobody here has run it
Export Your Harness Configuration
You are helping the user capture their current harness-kit setup into a harness.yaml file they can share with teammates or commit to their dotfiles repo.
This file follows the Harness Protocol v1 format — the open spec at harnessprotocol.io. It is backward-compatible with harness-import (which handles both old and new formats).
Workflow Order (MANDATORY)
Follow these steps in order. Do not skip any step.
Step 1: Detect installed skills
Scan all four skill directories. Each subdirectory inside these directories is an installed skill:
~/.claude/skills/— Claude Code global skills.cursor/skills/— Cursor project-local skills.github/skills/— Copilot project-local skills.agents/skills/— agentskills.io standard shared location
ls ~/.claude/skills/ 2>/dev/null
ls .cursor/skills/ 2>/dev/null
ls .github/skills/ 2>/dev/null
ls .agents/skills/ 2>/dev/null
Collect the directory names from each location. Deduplicate by skill name across locations — if the same skill name appears in multiple directories, count it once. Track which platforms each skill was found in.
Show the user the combined result:
Found skills across AI tools:
Claude Code (~/.claude/skills/): research, explain, orient
Cursor (.cursor/skills/): research, explain
Copilot (.github/skills/): research
Shared (.agents/skills/): (none)
Unique skills: research, explain, orient
Use this deduplicated list as your list of installed plugin names for the steps that follow.
If all four directories are empty or missing, tell the user: "No installed skills found in any supported location. Nothing to export." and stop.
Step 2: Ask about sources and metadata
Tell the user what skills you found, then ask:
"I found these installed skills: [list]. A couple of quick questions:
For each plugin, which repo is it from? Format:
owner/repo— for exampleharnessprotocol/harness-kit. If a plugin is from harness-kit, just say so and I'll fill it in.What name and description should I give this harness profile? (optional — press enter to skip)
Do you have any MCP servers, env variables, or CLAUDE.md instructions you'd like to include? (optional)
Note: MCP server detection is automatic — Step 2.6 will scan
.mcp.json,.cursor/mcp.json, and.vscode/mcp.jsonand ask you separately. You only need to answer about MCP here if you have MCP servers in a non-standard location not covered by those files.If you've only added harness-kit plugins, just say so."
Wait for the user's response before proceeding.
Step 2.5: Detect cross-platform instruction content
Check whether any cross-platform instruction files exist and contain harness-generated marker blocks:
grep -l "<!-- BEGIN harness:" .cursor/rules/harness.mdc .github/copilot-instructions.md 2>/dev/null
Claude Code instruction files (CLAUDE.md, AGENT.md, SOUL.md) are intentionally excluded — they are managed by the user directly and are not cross-platform sources for export.
If any matching files are found, tell the user what was found and ask. List all slots found in each file — a file may contain multiple harness marker blocks:
"I also found harness-generated instruction content in these files:
.cursor/rules/harness.mdc(containsmy-harness:operationalandmy-harness:behavioralblocks).github/copilot-instructions.md(containsmy-harness:operationalblock)Would you like me to include the
operationalandbehavioralinstruction content in the export?"
(List only the files that actually exist and contain marker blocks — substitute the real profile name from the markers in place of my-harness.)
If the user says yes:
- Extract the content between each
<!-- BEGIN harness:{name}:{slot} -->and<!-- END harness:{name}:{slot} -->marker from those files. - If the same profile + slot block appears in multiple files with identical content, use it once.
- If the same profile + slot block appears in multiple files with different content, show the user both versions and ask which to use.
- Store the extracted content to include as the
instructions:section in harness.yaml (Step 4).
If the user says no, skip — do not include instruction content from cross-platform files.
If no harness marker blocks are found in any cross-platform file, skip this step silently.
Step 2.6: Detect cross-platform MCP servers
Scan these three files for MCP server definitions:
cat .mcp.json 2>/dev/null
cat .cursor/mcp.json 2>/dev/null
cat .vscode/mcp.json 2>/dev/null
Each file uses the same JSON structure with a top-level mcpServers key. Merge all mcpServers entries across all files found. Deduplicate by server name:
- If the same server name appears in multiple files with the same config, note that it is shared and count it once.
- If the same server name appears in multiple files with different configs, show the user both configs and ask which to keep.
Show the user a summary:
Found MCP servers:
postgres (in .mcp.json and .cursor/mcp.json — same config)
filesystem (in .mcp.json only)
"Would you like to include these in the export? (all / pick / none)"
If the user selects all or pick (and picks at least one), store the chosen servers to write to the mcp-servers: section in harness.yaml (Step 4). Convert from JSON format back to harness YAML format: JSON key type → YAML key transport.
If the user selects none, or if no MCP config files are found, skip this step.
Step 3: Build the plugin entries
For each installed skill, determine its source repo:
Known harness-kit plugins (source: harnessprotocol/harness-kit):
| Plugin | Description |
|---|---|
| explain | Layered explanations of files, functions, directories, or concepts |
| research | Process any source into a structured, compounding knowledge base |
| lineage | Column-level lineage tracing through SQL, Kafka, Spark, and JDBC |
| orient | Topic-focused session orientation across graph, knowledge, and research |
| capture | Capture session information into a staging file for later reflection |
| review | Code review for a branch, PR, or path — severity labels and cross-file analysis |
| docgen | Generate or update README, API docs, architecture overview, or changelog |
| harness-export | Export your installed plugins to a shareable harness.yaml |
| harness-import | Import a harness.yaml and interactively select plugins to install |
| harness-validate | Validate a harness.yaml file against the Harness Protocol v1 JSON Schema |
| harness-compile | Compile harness.yaml to native config files for Claude Code, Cursor, and Copilot |
| harness-sync | Sync AI tool configuration across Claude Code, Cursor, and Copilot |
| open-pr | Pre-flight checks and PR creation: run tests, open a PR, code review, and check CI |
| merge-pr | PR merge workflow: verify CI and review status, sync with base, confirm, squash merge, and clean up |
| pr-sweep | Cross-repo PR sweep: triage all open PRs, run code reviews, merge what's ready, fix quick CI blockers, and report |
For any installed skill not in this table, ask the user:
"I see
[name]installed but don't recognize it. Whatowner/repois it from, and what does it do in one sentence?"
Step 4: Write harness.yaml
Write harness.yaml to the current directory (or a path the user specifies). Use the Harness Protocol v1 format:
$schema: https://harnessprotocol.io/schema/v1/harness.schema.json
version: "1"
# Profile identity (optional but recommended)
metadata:
name: my-harness
description: My personal harness configuration.
plugins:
- name: explain
source: harnessprotocol/harness-kit
description: Layered explanations of files, functions, directories, or concepts
# additional plugins follow the same structure
With MCP servers (include only if user provided them):
mcp-servers:
postgres:
transport: stdio
command: uvx
args:
- mcp-server-postgres
- ${DB_CONNECTION_STRING}
With env declarations (include only if user has env vars):
env:
- name: DB_CONNECTION_STRING
description: PostgreSQL connection string.
required: true
sensitive: true
With instructions (include only if user wants to bundle CLAUDE.md/AGENT.md content):
instructions:
operational: |
Your operational instructions here.
import-mode: merge
Rules:
versionmust be the string"1"(quoted), not the integer1sourceisowner/repo— nomarketplace:key, nomarketplaces:section- Only include
mcp-servers,env,instructions, andpermissionssections if the user provided content for them - If instruction content was collected in Step 2.5, include it as the
instructions:section - If MCP servers were collected in Step 2.6, include them as the
mcp-servers:section (using YAMLtransport:key, not JSONtype:) - Omit
metadataif the user skipped the name/description questions - Do NOT include
harness-exportorharness-importin the output unless the user explicitly asks
Step 5: Confirm and suggest next steps
Tell the user where the file was written:
"Saved to
harness.yaml. To compile it to Cursor and Copilot config files, run/harness-compile.To share with teammates: commit it to your dotfiles repo. They can import it with
/harness-importinside Claude Code, or with the shell fallback:curl -fsSL https://raw.githubusercontent.com/harnessprotocol/harness-kit/main/harness-restore.sh | bash -s -- harness.yaml ```"
Common Mistakes
| Mistake | Fix |
|---|---|
Using version: 1 (integer) | Must be version: "1" (string) — this is what distinguishes the protocol format |
Using marketplace: harness-kit | Protocol format uses source: harnessprotocol/harness-kit — no marketplaces: section |
Including harness-export and harness-import in the output | Only include plugins the user actually uses |
| Writing to a path without confirming | Write to ./harness.yaml by default. If user specified a path in the invocation, use that |
Adding mcp-servers: / env: / instructions: as empty sections | Only include these sections when the user has actual content to put in them |