Centralized editor configurations for RevealUI projects. Configs are symlinked into target projects — edits propagate instantly, nothing gets committed to target repos.
# Link first-party fleet policy only (default editor: revealui)
./link.sh --target ~/revealfleet/revealui --profile revealfleet
# Explicitly opt into all adapters, base configs only (no profile)
./link.sh --target ~/revealfleet/revforge --editor all
# Link a single editor
./link.sh --target ~/revealfleet/revealui --profile revealui --editor zed
# Preview without changes
./link.sh --dry-run --target ~/revealfleet/revealui --profile revealfleet
# Remove symlinks
./unlink.sh --target ~/revealfleet/revealui
# List available profiles
./link.sh --list
# Full flag reference for any script
./link.sh --helprevcon/
├── base/ # Universal configs (all projects)
│ ├── cursor/
│ │ ├── .cursorignore
│ │ ├── environment.json
│ │ └── snippets/
│ └── zed/
│ └── settings.json
├── profiles/ # Per-project overrides (layered on base)
│ └── revealui/
│ ├── cursor/
│ │ ├── .cursorrules
│ │ ├── config.json
│ │ ├── mcp-config.json
│ │ ├── rules.md
│ │ ├── commands/
│ ├── workflows/ # Shared manual Markdown references
│ └── zed/
│ └── tasks.json
├── harnesses/ # AI harness content (generated by @revealui/harnesses)
│ ├── manifest.json # Machine-readable index of all definitions
│ ├── rules/ # Canonical definitions by tier
│ │ ├── oss/ # MIT — available to all
│ │ └── pro/ # Commercial — require license
│ ├── commands/
│ ├── agents/
│ ├── skills/ # INTENTIONAL tier bodies (oss/pro); not SKILL.md
│ └── generators/ # Pre-rendered, ready to copy
│ ├── claude-code/ # → .claude/
│ └── cursor/ # → .cursor/rules/
├── link.sh # Create symlinks + gitignore
└── unlink.sh # Remove symlinks
Shared RevealUI skills ship on three surfaces that must stay byte-identical:
| Role | Path |
|---|---|
| Canonical (edit here) | profiles/revealui/claude/skills/<name>/SKILL.md |
| Lockstep copy | profiles/revealui/agents/skills/<name>/SKILL.md |
| Lockstep copy | harnesses/generators/claude-code/.claude/skills/<name>/SKILL.md |
# After editing a shared skill under profiles/revealui/claude/skills/:
bash scripts/sync-skill-copies.sh
bash scripts/check-skill-lockstep.sh # also a CI job: "Skill multi-copy lockstep"harnesses/skills/oss|pro/*.md are a different intentional shape (harness
package bodies without profile frontmatter). They are not lockstepped against
profile SKILL.md files.
link.shcreates real directories (.zed/,.cursor/) in the target project- Individual config files are symlinked from
base/into those directories --profileis repeatable. Profiles overlay on top ofbase/in the order given, and later profiles override earlier ones on filename collisions (base→ first--profile→ second--profile→ ...):The canonical fleet profile is./link.sh --target ~/revealfleet/revealui --profile revealfleet --profile revealuirevealfleet../link.sh --listnames a deprecated alias when one still resolves to that profile.- Editor-written state (cache, chat history) stays in the real directory, not here
.gitignoreis updated so symlinked dirs are never committed
Symlinks are untracked, so fresh clones, CI runners, and git worktrees of a target repo see none of the distributed config. For repos that need the config to travel with the repo, use copy mode:
./link.sh --target ~/revealfleet/revealui --profile revealfleet --profile revealui --editor claude --mode copyCopy mode materializes real files instead of symlinks, writes a deterministic
<dot_dir>/.revcon-manifest.json (per-file profile source + sha256), and does
NOT add a .gitignore entry: the target repo tracks the copies and gates
drift with a lockstep check against the manifest (revealui:
pnpm validate:rules-lockstep). Re-running with unchanged profiles is a
no-op. Edits belong in the profile, never in the copy; re-apply to converge.
status.sh verifies materialized dirs against both the manifest (local edits)
and the current profile sources (stale copies). unlink.sh removes copies
whose hash still matches the manifest and keeps locally modified files.
mkdir -p profiles/revforge/cursor profiles/revforge/zed
# Add project-specific configs (MCP servers, tasks, rules, etc.)The product ships configs for every supported editor. To skip editors you don't
personally use, or to layer in a private profile that never enters this repo, two
supported configuration mechanisms are available. Linking defaults to first-party
.revealui; use --editor all to opt into every adapter. Status and unlink
default to inspecting all managed trees, including existing vendor projections.
# Per-invocation
./link.sh --target ~/revealfleet/foo --profile revealui --editor all --skip cursor
# Default for your machine — set in ~/.bashrc / ~/.zshrc
export REVCON_SKIP_EDITORS=cursor
# Multiple skips
export REVCON_SKIP_EDITORS=cursor,vscode--skip and REVCON_SKIP_EDITORS apply to link.sh, unlink.sh, and status.sh.
Point REVCON_PRIVATE_PROFILES_DIR at any directory outside this repo. Profile
names there are searched first; in-repo profiles act as fallback.
export REVCON_PRIVATE_PROFILES_DIR=~/private/revcon-profiles
mkdir -p ~/private/revcon-profiles/joshua/{zed,claude}
# Drop your proprietary configs (rules, MCP servers, custom commands) under that tree.
# Same layout as profiles/<name>/<editor>/.
./link.sh --target ~/revealfleet/foo --profile joshua --editor all
# Resolves to ~/private/revcon-profiles/joshua/, NOT this repo../link.sh --list shows both in-repo and private profiles, with (private)
markers on the latter. unlink.sh knows to remove symlinks pointing into the
private dir as well, and status.sh reports them as private:<rel-path> sources.
| Editor | Dot-dir | Status |
|---|---|---|
| RevealUI | .revealui/content/ |
First-party default |
| Claude | .claude/ |
Optional third-party projection |
| Cursor | .cursor/ |
Full support |
| Zed | .zed/ |
Full support |
| VS Code | .vscode/ |
Placeholder |
A selected native editor fails clearly when no native files exist, including
empty profile directories; it never falls back to Claude sources. The product
revealui profile currently contains vendor overlays, so use the native
revealfleet profile for fleet policy and the maintained revealui-harnesses
manager for product definitions. Request vendor overlays explicitly.
--editor revealui is the default and writes native content from
profiles/<profile>/revealui/. Vendor adapters require explicit --editor NAME
or --editor all. Claude projects native content into .claude/; native sources
win same-path collisions and unique explicit Claude-only overlays remain.
Other adapters use base/<editor>/ and profiles/<profile>/<editor>/;
agents writes .agents/. These do not link harnesses/*, which ships
separately via the revealui-harnesses CLI. See Harnesses Content.
The harnesses/ directory contains AI coding rules, commands, agents, and skills
generated from the canonical content layer in @revealui/harnesses. This is the
distribution target for content pull:
# Pull OSS rules into a RevealUI project (Claude Code format)
revealui-harnesses content pull --generator claude-code --tier oss
# Pull all rules (requires Pro license)
revealui-harnesses content pull --generator claude-code --tier allcreate-revealui automatically pulls OSS rules during project scaffolding.
To regenerate after updating definitions:
cd ~/revealfleet/revealui
node packages/harnesses/dist/cli.js content export --output ~/revealfleet/revcon/harnesses| Tier | Contents | License |
|---|---|---|
| OSS (18) | biome, database, monorepo, tailwind, testing, safety, etc. | MIT |
| Pro (11) | agent dispatch, debugging, TDD, code review, db-migrate, etc. | Commercial |
Pro definitions are visible in the repo but the CLI validates a license key before installing them.
main and test are protected: changes land via PR, and commits must be
signed (a verified signature is required on protected branches). Configure
commit signing locally before pushing.
This repo has no package.json, so its version is tracked in the root
VERSION file. Current: 0.2.0.
MIT
profiles/<profile>/workflows/**/*.md is the canonical editor-neutral manual
reference contract. link.sh explicitly maps it to workflows/ inside each
supported adapter directory: .cursor, .zed, .vscode, .claude, .agents.
These adapters can open/read a named Markdown file; this contract does not
claim automatic discovery, rule loading, slash commands, or workflow execution.
Open or explicitly ask the assistant to read the installed document. Adapter
commands and executable automation remain in their existing editor overlays.
All five adapters support this manual consumption; selecting/skipping an
adapter includes/excludes its references with its other content.
Precedence is base editor content, then for each selected profile in order its shared references followed by its editor overlay. Later profiles win. Shared workflow directories must contain readable Markdown files; dangling sources and other file types fail rather than silently omitting guidance.
The RevealUI canonical document moved from
profiles/revealui/cursor/workflows/WORKFLOWS.md to
profiles/revealui/workflows/WORKFLOWS.md; Cursor's installed path stays the
same. Reapplying migrates old managed symlinks (including dangling links) and
unmodified manifest-listed copies to the canonical source. Unrecorded files,
foreign symlinks and locally modified copies are preserved and cause an error.
Copy manifests record the shared canonical source; existing status verification,
copy lockstep and confined unlink operate on these entries normally. Unlink
keeps modified copies. Use the normal unlink lifecycle before switching a workflow copy installation
to symlink mode; this prevents a stale copy manifest from masking link status.
Fleet policy is owned in profiles/revealfleet/revealui/rules/. Materialize
first-party policy without vendor output:
./link.sh --target /path/to/project --profile revealfleet --editor revealui --mode copy
./status.sh --target /path/to/project --editor revealui --verifyThis writes .revealui/content/rules/ and .revealui/.revcon-manifest.json
with content/rules/... keys and native profile source hashes. Claude is an
optional third-party projection requested with --editor claude; native
policy wins collisions while unique Claude-only profile files are retained.
Do not hand-copy or edit installed policy. Edit its owning profile and use
the maintained materializer.