Harnessy is a reusable agent harness for software projects.
It installs a shared AI operating layer into a repo so supported coding agents can discover the same skills, context, commands, and verification surfaces.
Harnessy gives a repository:
- a minimal root
AGENTS.mdpointer plus a full protocol in.jarvis/context/AGENTS.md - a shared context vault and memory system under
.jarvis/context/ - shared Harnessy skills installed globally in
~/.agents/skills/ - optional project-local skills in
.agents/skills/ - generated lifecycle scripts for registration, validation, sync, and verification
- global command shims in the user-local bin directory such as
jarvis,qa, andflow-deps - registration parity across OpenCode, Claude Code, and Codex
- installation verification harnesses for local and remote-style bootstrap flows
- Meta-Harness capabilities for feedback capture, skill improvement, promotion, validation, publishing, and bounded autoresearch loops
- knowledge-management integrations and workflows for AnyType, Obsidian/wiki compilation, and Notion-backed Jarvis usage
- Shared skill distribution from
tools/flow-install/skills/ - Project-local skill registration from
.agents/skills/ - Cross-agent registration for OpenCode, Claude Code, and Codex
- Context vault scaffolding in
.jarvis/context/ - File-based scoped memory under
.jarvis/context/scopes/ - Optional Autoflow GitHub Actions setup during install
- Pipeline hooks and helper script installation
- Explicit dependency management for skill runtimes via
flow-deps - Deterministic QA runtime via
qa - Repo-agnostic QA orchestration through
/qa-sweep,/qa-feature-catalog, and/qa-security-sweep - Meta-Harness skill auto-improvement workflows across
skill-feedback,skill-improve,skill-promote,skill-validate, andskill-publish - Knowledge-management workflows for AnyType object operations, Jarvis Wiki/Obsidian compilation, and multi-backend Jarvis integrations including Notion
.
├── install.sh # bootstrap + in-place installer entrypoint
├── jarvis-cli/ # Jarvis CLI source
├── scripts/flow/ # generated/project lifecycle scripts
├── tests/harness/ # install and verification harnesses
└── tools/flow-install/
├── index.mjs # core installer
├── lib/ # installer/runtime shared logic
├── templates/ # install templates
└── skills/ # shared Harnessy skills
After in-place installation into a target repo, the baseline structure looks like this:
.
├── AGENTS.md
├── .agents/
│ └── skills/ # project-local skills (optional)
├── .jarvis/
│ └── context/
│ ├── README.md
│ ├── AGENTS.md
│ ├── technical-debt.md
│ ├── skills/_catalog.md
│ ├── scopes/_scopes.yaml
│ ├── private/<username>/
│ └── ...
└── package.json scripts
├── skills:register
├── skills:validate
├── harness:verify
└── postinstall
Global/shared assets are installed for the local user:
- shared skills:
~/.agents/skills/ - Claude symlinks:
~/.claude/skills/ - Codex links:
~/.codex/skills/harnessy/ - user-local command shims:
$XDG_BIN_HOMEor~/.local/bin - lifecycle helper scripts:
~/.scripts/
Harnessy core skills are sourced from tools/flow-install/skills/ and installed into ~/.agents/skills/.
Project-specific skills stay in each repo's .agents/skills/ directory and are copied into ~/.agents/skills/ by the generated scripts, which also refresh supported agent registrations.
If you need a curated active skill set, set AGENTS_SKILLS_ROOT to an alternate directory before running the registration scripts. Harnessy will use that directory instead of the default ~/.agents/skills/.
- Node.js 18+
- pnpm 9+
- Git
- Python 3.11+
uv
uvis installed byinstall.shif missing
- skill runtime dependencies declared in manifests
Harnessy treats skill dependencies as explicit user-managed installs. Use flow-deps to inspect and install them after reviewing the plan.
curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh | bashThis path:
- installs
uvif needed - verifies
nodeandpnpm - clones or updates a local Harnessy checkout
- installs
jarvis - runs
flow-install - installs shared skills and command shims
- optionally installs community skills
Useful environment variables:
| Variable | Purpose | Example |
|---|---|---|
FLOW_REPO_URL |
Override the Harnessy git source | custom fork URL |
FLOW_INSTALL_DIR |
Workspace clone destination | /Users/name/harnessy |
FLOW_CACHE_DIR |
Cache used for in-place installs | $HOME/.cache/harnessy |
FLOW_NONINTERACTIVE |
Skip prompts | 1 |
FLOW_SKIP_SUBPROJECTS |
Skip optional bundled sub-project logic | 1 |
Example:
FLOW_INSTALL_DIR="$HOME/work/harnessy" \
FLOW_NONINTERACTIVE=1 \
FLOW_SKIP_SUBPROJECTS=1 \
bash -c "$(curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh)"uv tool install --force "git+https://github.com/Flow-Research/harnessy.git#subdirectory=jarvis-cli"
jarvis --helpFrom the target repo root:
curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh | bash -s -- --hereOr target another repo explicitly:
curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh | bash -s -- --target "/path/to/project"This mode:
- treats the target repository as the install destination
- installs
jarvis - uses a cached Harnessy checkout as installer source
- scaffolds the context vault and memory files
- installs shared skills globally
- generates project lifecycle scripts and package scripts
- skips community skill installation by default for a leaner in-place install path
If the repo already has harnessy.lock.json and you want to re-ask path prompts:
curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh | bash -s -- --here --reconfigureLocal equivalent:
node tools/flow-install/index.mjs --yes --target "/path/to/project"| Command | Purpose |
|---|---|
pnpm setup |
Run local setup wizard |
pnpm skills:validate |
Validate shared skill source and catalog consistency |
pnpm skills:register |
Register project-local skills for supported agents |
pnpm skills:register:claude |
Refresh Claude skill registration |
pnpm skills:register:opencode |
Refresh OpenCode skills.paths |
pnpm skills:register:codex |
Refresh Codex skill links |
pnpm harness:verify |
Verify repo and runtime parity |
pnpm harness:eval |
Run local fixture-based install evaluation |
pnpm harness:eval:remote |
Run remote-style Docker bootstrap evaluation |
pnpm flow:cleanup |
Clean stale plugin artifacts |
pnpm flow:sync |
Re-run in-place sync from cached source |
pnpm flow:sync:force |
Force in-place sync |
pnpm flow:sync:remote |
Refresh cached source, then sync |
pnpm flow:sync:remote:force |
Refresh cached source, then force sync |
| Command | Purpose |
|---|---|
jarvis |
User-facing CLI for planning, journaling, context operations, reading lists, Android tooling, and more |
qa |
Deterministic QA runtime for spec parsing, test scanning, drift detection, and coverage from a repo-local profile |
flow-deps |
Plan, check, and explicitly install runtime dependencies declared in skill manifests |
Harnessy's shared QA contract is documented in .jarvis/context/docs/standards/qa-process.md.
flow-qa remains installed as a backward-compatible alias for older projects.
Harnessy QA is repo-agnostic. Target repositories provide their own
.harnessy/qa-profile.json, .flow/qa-profile.json, or qa/qa-profile.json
to describe spec paths, app IDs, test roots, output paths, and optional
repo-local execution or result-sync commands.
| Command | Purpose |
|---|---|
qa ids |
Parse configured regression specs and emit canonical scenario records |
qa tests |
Scan configured test roots and extract scenario IDs plus QA headers |
qa drift |
Detect spec/test drift, missing headers, missing tests, and orphan test IDs |
qa coverage |
Generate a profile-driven QA coverage report |
| Skill | Purpose |
|---|---|
/qa-sweep |
Full-cycle coverage sweep: discover, browser-walk, map scenarios, coordinate codegen, execute/plan, and report |
/qa-feature-catalog |
Maintain semantic feature catalogs, stable prefixes, generated catalogs, overrides, result snapshots, and optional result sinks |
/qa-security-sweep |
Convert adversarial security findings into canonical Layer: security regression scenarios |
/spec-to-regression |
Generate browser/API regression scenarios from approved specs |
/browser-integration-codegen |
Generate browser integration suites from canonical regression specs and adapter metadata |
/api-integration-codegen |
Generate API integration suites from canonical regression specs and adapter metadata |
/browser-qa |
Run Playwright-based walkthroughs, auth handoffs, scripted checks, and artifact summaries |
/test-quality-validator |
Validate coverage completeness, correctness, false-green risk, selectors, DB assertions, and drift |
The shared QA process covers scenario IDs, spec fields, feature catalogs, run-result snapshots, result sinks, Playwright walkthroughs, DB assertions, security scenarios, codegen, validator expectations, and project extension points:
.jarvis/context/docs/standards/qa-process.md
# Install or refresh shared skills only
node tools/flow-install/index.mjs --skills --yes
# Preview installer changes
node tools/flow-install/index.mjs --dry-run
# Update only the managed block in .jarvis/context/AGENTS.md
node tools/flow-install/index.mjs --update-context-agents
# Check dependencies for one skill manifest
flow-deps check --manifest "tools/flow-install/skills/goal-agent/manifest.yaml"
# Audit all installed shared skills
flow-deps check --skills-root "$HOME/.agents/skills"
# Parse QA specs from a repo-local profile
qa ids --profile .harnessy/qa-profile.json
# Run a QA drift check
qa drift --profile .harnessy/qa-profile.jsontools/flow-install/index.mjs is the idempotent installer. It handles:
- shared skill install and registration
- project script generation
- package.json patching
- context vault scaffolding
- memory system install
AGENTS.mdmerge- optional Autoflow workflow setup
- hook and pipeline helper install
- cron registration from skill manifests
- lockfile writing
jarvis-cli/ is the user-facing agent CLI.
Install paths:
- local workspace:
uv tool install --force ./jarvis-cli - GitHub:
uv tool install --force "git+https://github.com/Flow-Research/harnessy.git#subdirectory=jarvis-cli"
Shared reusable skills live in:
tools/flow-install/skills/
They are copied into the active global skills root, usually:
~/.agents/skills/
If you need a curated active skill set, set AGENTS_SKILLS_ROOT before registration or install.
Project-specific skills live in:
.agents/skills/
They are not part of shared Harnessy core. The generated skills:register script copies them into the active global skills root and refreshes supported agent registrations.
Every installed project gets:
.jarvis/context/
Important files:
README.md- context loading protocolAGENTS.md- full Harnessy protocol for the installed repotechnical-debt.md- tracked debt registerskills/_catalog.md- skill registry for the reposcopes/_scopes.yaml- memory scope registryprivate/<username>/- gitignored personal space
The memory system is file-based and scoped.
Core hierarchy:
org:<git-org>project:<repo-name>user:<username>via.jarvis/context/private/<username>/
Memory record types:
factdecisionpreferenceevent
flow-install installs helper scripts into the project in a configurable folder.
Default:
scripts/flow/
These power:
skills:registerskills:validateskills:register:claudeskills:register:opencodeskills:register:codexharness:verifypostinstall
Global convenience scripts are still installed into $HOME/.scripts/, but committed project wiring uses repo-local script paths so CI stays portable.
Skill manifests can declare runtime dependencies such as:
- shell tools via
dependencies: - Python packages via
python_packages: - Node packages via
node_packages:
Harnessy does not silently provision these anymore. Use flow-deps to inspect and explicitly install what a skill needs.
pnpm skills:register
pnpm harness:verifypnpm harness:verify checks:
AGENTS.mdand.jarvis/context/AGENTS.mdpresence and protocol wiring- context and memory files under
.jarvis/context/ - lifecycle scripts and package wiring
jarvisonPATH- global skills directory presence
- OpenCode, Claude, and Codex registration parity
- every declared core skill is installed and discoverable
- project-local skills, when present, are visible to supported agents
- community skill inventory behavior from
harnessy.lock.json
For heavier install validation:
pnpm harness:eval
pnpm harness:eval:remoteThese cover local fixture installs, reruns, isolated home directories, remote-style Docker bootstrap, and agent-surface parity. More details live in tests/harness/README.md.
pnpm skills:validate
pnpm skills:register
pnpm harness:verify
uv tool install --force ./jarvis-cli
jarvis --help# Reinstall or refresh shared skills into your active skills root
node tools/flow-install/index.mjs --skills --yes
# Re-run full in-place installer against this repo
node tools/flow-install/index.mjs --yes
# Refresh the local Jarvis CLI build
uv tool install --force ./jarvis-cliRecommended team workflow for an existing repository:
- Install Harnessy in place:
curl -fsSL https://github.com/Flow-Research/harnessy/main/install.sh | bash -s -- --here- Commit generated files:
AGENTS.md.jarvis/context/harnessy.lock.json- any repo-local
.agents/skills/
- Have each engineer run the repo-local registration command:
pnpm skills:registeror the equivalent package-manager script in that repo.
- If needed, apply newer managed context protocol explicitly later:
node tools/flow-install/index.mjs --update-context-agentsuv tool install --force "git+https://github.com/Flow-Research/harnessy.git#subdirectory=jarvis-cli"Reinstall shared skills and ensure your user-local bin directory is on PATH:
node tools/flow-install/index.mjs --skills --yesHarnessy uses $XDG_BIN_HOME when set, otherwise ~/.local/bin.
flow-qa is still available as a compatibility alias for older project scripts.
Inspect the dependency plan first:
flow-deps check --skills-root "$HOME/.agents/skills"Then explicitly install what you approve:
flow-deps install --skills-root "$HOME/.agents/skills"That usually means the current repo has no project-local skills in .agents/skills/. Shared skills are already installed globally by flow-install.
node /path/to/harnessy/tools/flow-install/index.mjs --yesThe installer is designed to be re-runnable and skip already-current parts.
Start here:
CONTRIBUTING.md.jarvis/context/docs/contribution-protocol.md.jarvis/context/templates/contribution/shared-skill-candidate-packet.md
When changing shared functionality, update the shared source in this repository first, then verify it through the install harnesses.
This repository is the source repo for Harnessy.
- bootstrap entry point:
install.sh - installer source:
tools/flow-install/ - shared skill source:
tools/flow-install/skills/ - Jarvis package source:
jarvis-cli/