# Vaultspec
> Vaultspec is a coding harness: it implements a structured coding workflow focused on #features, decision records and the documents grounding them. It bundles rules, agents, skills, and tools to author the documents that describe and track a feature's development.
Actively developed. MIT licensed.
## The harness
- [vaultspec-core](https://github.com/nevenincs/vaultspec-core):
Decision-driven harness for coding agents, and humans.
- [vaultspec-rag](https://github.com/nevenincs/vaultspec-rag):
The semantic search component for vault and code. Indexing and search require an
NVIDIA GPU with CUDA on Linux or Windows, or Apple silicon with MPS. CPU-only and
AMD inference are not supported.
## Get started
- [Install vaultspec-core](https://vaultspec.neve.md/docs/core/installation.html)
- [Install vaultspec-rag](https://vaultspec.neve.md/docs/rag/installation.html)
- [Start RAG, index the project, and run a search](https://vaultspec.neve.md/docs/rag/getting-started.html)
- [Run a feature with your coding agent](https://vaultspec.neve.md/docs/guides/workflow.html)
## Interfaces
Records are Markdown files in your repository; open them in an editor or Obsidian.
[vaultspec-dashboard](https://github.com/nevenincs/vaultspec-dashboard) is a separate
project building a dedicated frontend on the same files. It is in early development, in
the open.
## Docs
[Download the site-authored guides](https://vaultspec.neve.md/llms-full.txt) as one text file.
Imported manuals remain on the documentation site with source and compatibility notices.
- [Documentation home](https://vaultspec.neve.md/docs/)
- [Concepts](https://vaultspec.neve.md/docs/concepts.html)
- [CLI guide](https://vaultspec.neve.md/docs/guides/cli.html)
- [MCP guide](https://vaultspec.neve.md/docs/guides/mcp.html)
- [Semantic search quickstart](https://vaultspec.neve.md/docs/rag/getting-started.html)
- [Core documentation](https://vaultspec.neve.md/docs/core/index.html)
- [RAG documentation](https://vaultspec.neve.md/docs/rag/index.html)
- [vaultspec-core on PyPI](https://pypi.org/project/vaultspec-core/)
- [vaultspec-rag on PyPI](https://pypi.org/project/vaultspec-rag/)
---
# The Pages Written for This Site
This section carries the full text of the 8 pages written for
this documentation site. It is not the whole site. The other
24 pages are vendored copies of the vaultspec-core and
vaultspec-rag manuals - the two CLI references, the search product's
configuration, indexing, service-mode and query pages, and the framework and
syntax manuals - and they are readable only at https://vaultspec.neve.md/docs/. Each
is served under a notice naming the file and upstream commit it was taken
from, and where the copied text disagrees with the shipped tool that notice
says what the tool actually does. Reproducing the pages here would drop the
corrections, so this file links to them instead: https://vaultspec.neve.md/docs/core/
and https://vaultspec.neve.md/docs/rag/.
## Documentation Home
```{raw} html
```
Vaultspec adds a decision-led development workflow and semantic codebase search to your coding agent.
## Install
Install both required components:
1. [Install vaultspec-core](core/installation.md).
2. [Install vaultspec-rag](rag/installation.md).
3. [Start RAG, index the project, and run a search](rag/getting-started.md).
## Use the workflow
Open your configured coding agent and use one of these prompts:
> Use vaultspec-research to investigate adding full-text search to the API. Use the feature tag search-api.
> Execute the approved plan for search-api.
> Use vaultspec-code-review to review the completed search-api implementation.
The agent pauses for approval before it records the decision and before it executes the plan. [Read the operating model](concepts.md) for the records and approval points.
## Command references
- [vaultspec-core CLI reference](core/cli.md): every Core command, option, outcome, and exit code.
- [vaultspec-rag CLI reference](rag/cli.md): every RAG command, option, outcome, and exit code.
## Advanced
- [Core document syntax](core/syntax.md)
- [Core MCP tools](core/mcp.md)
- [Review and correctness](core/correctness.md)
- [RAG query craft](rag/query-craft.md)
- [RAG configuration](rag/configuration.md)
- [RAG service operation](rag/service-mode.md)
- [RAG automation](rag/automation.md)
- [RAG storage maintenance](rag/storage-maintenance.md)
- [RAG preprocessing hooks](rag/preprocessing-hooks.md)
(when-something-goes-wrong)=
## Troubleshooting
- Core installation or validation: [check the workspace and records](core/verification.md).
- Missing or stale results: [verify the RAG service and index](rag/verification.md).
- Installation or GPU failures: [RAG installation troubleshooting](rag/installation.md#when-something-goes-wrong).
```{toctree}
:maxdepth: 2
:hidden:
:caption: Start
core/installation
rag/installation
rag/getting-started
concepts
guides/workflow
guides/cli
guides/mcp
```
```{toctree}
:maxdepth: 2
:hidden:
:caption: Reference
core/cli
rag/cli
core/index
rag/index
```
---
## The Pipeline and Its Vocabulary
(the-words-in-one-place)=
Vaultspec stores the reasoning and verification for a feature beside its code. One feature tag connects the records.
| Stage | Record | Purpose | Approval |
| --- | --- | --- | --- |
| Research | `.vault/research/` or `.vault/reference/` | Evidence, existing behavior, and options | Confirm the evidence before a decision |
| Decision | `.vault/adr/` | Chosen approach, rejected alternatives, and consequences | Approve before planning |
| Plan | `.vault/plan/` | Ordered implementation steps and verification | Approve before execution |
| Execute | `.vault/exec/` | Files changed and verification evidence | Follow the approved plan |
| Review | `.vault/audit/` | Scope, findings, and recommendations | Resolve blocking findings |
Feature indexes under `.vault/index/` are generated. Runtime state under `.vault/data/` is local and must not be committed.
## What you approve
Two decisions are yours, and the agent stops for both: the architecture decision before anything is planned, and the plan before anything is built. Approve a decision when it matches the requirement, and reject an ADR that leaves one unresolved.
The review at the end is a separate gate. Record validation checks structure and links, so it can pass over an implementation nobody has proved.
## Find the current state
```bash
vaultspec-core status search-api
```
## Where to go next
- [Run a feature from research to review](guides/workflow.md) - the three prompts and the two approvals, stage by stage.
- [Core CLI reference](core/cli.md) - exact commands and advanced plan management.
- [Document syntax](core/syntax.md) - for authoring records by hand.
---
## One Feature, End to End
The ordinary workflow is three prompts and two approval decisions. Replace `search-api` with one feature tag throughout.
(research-the-problem)=
## Research and decide
> Use vaultspec-research to investigate adding full-text search to the API. Use the feature tag search-api.
Read the evidence and alternatives. Ask for corrections or approve the research and architecture decision. Do not approve an ADR that leaves a requirement unresolved.
## Approve and execute the plan
Read the proposed plan. Check its scope, ordering, and verification. Approve it, then ask:
> Execute the approved plan for search-api.
Check progress without changing the vault:
```bash
vaultspec-core status search-api
```
## Review
> Use vaultspec-code-review to review the completed search-api implementation.
Read the audit with the final code diff. Resolve blocking findings before accepting the feature. Record checks validate structure and links; they do not prove correctness or require an audit.
## Manual and advanced operation
Use the [vaultspec-core CLI reference](../core/cli.md) to create records, edit plan structure, resolve branch collisions, rename or archive features, and automate checks. Use [review guidance](../core/correctness.md) for the correctness gate.
(make-the-check-a-gate)=
For commit and continuous-integration gates, use the [Core check command reference](../core/cli.md#vaultspec-core-vault-check).
## Where to go next
- [How Vaultspec works](../concepts.md) - the records each stage writes and who approves them.
- [Driving the vault from the command line](cli.md) - the same operations without an agent.
- [Reaching Vaultspec from your agent](mcp.md) - the same operations over MCP.
---
## Use the command line
Run commands from your repository root. Use the [command prefix for your installation](../core/installation.md#how-you-run-it-afterwards) with the commands shown here.
This page covers the operations you run yourself. To run a complete feature through your coding agent, follow the [feature workflow](workflow.md).
## Check progress
Run `status` for a read-only overview of in-flight plans, completion, next open steps, and recent changes:
```bash
vaultspec-core status
```
If a feature has a plan, narrow the report to its tag. Replace `notes-search` with your feature's tag:
```bash
vaultspec-core status notes-search
```
The report links execution evidence; it does not prove the implementation is correct. See the [status reference](../core/cli.md#vaultspec-core-status) for output details and [workspace verification](../core/verification.md) for checks.
## Create documents
Create a research document. Replace `payment-retries` with your feature tag and
`"Payment retry options"` with your title:
```bash
vaultspec-core vault add research --feature payment-retries --title "Payment retry options"
```
```text
Next action:
Define an Architecture Decision Record (ADR) for your research
vaultspec-core vault add adr --feature payment-retries --related 2026-09-05-payment-retries-research
Created: .vault/research/2026-09-05-payment-retries-research.md
```
Captured on `0.1.73`. The `Created` path is absolute in the real output and
shortened here. Supplying `--title` is what keeps the run quiet: without it the
scaffolder reports `WARNING Potential unhydrated placeholder found in
template: {topic}` as it writes.
The command assigns the filename, frontmatter, and tags. Open the file named in
`Created` and write its body using the [research guidance](workflow.md#research-and-decide).
Complete the research before running the command under `Next action`. That command
creates an architecture decision record (ADR) linked to your research file.
To create another research document for the same feature, add `--topic backoff`.
See the [creation reference](../core/cli.md#vaultspec-core-vault-add) for other
document types and options, and [document syntax](../core/syntax.md) for fields
maintained by the CLI.
## Edit a plan
Start with an existing plan in `.vault/plan/` with `tier: L2`. For other tiers,
restructuring, or removal, see the [plan command reference](../core/cli.md#vaultspec-core-vault-plan).
That reference writes the plan argument the other way round, as a full
`.vault/plan/...md` path after the flags rather than a stem before them. Both
resolve, and so does a stem after the flags: measured on one plan on `0.1.73`,
all three added a Step. It is house style between a page written here and a page
copied from the harness, not two different commands.
Replace `PLAN` in each command with your plan's filename without `.md`. Adapt the
example titles and actions to your work.
1. Add a phase:
```bash
vaultspec-core vault plan phase add PLAN --title "Retry the capture" --intent "Retry failed captures with exponential backoff."
```
2. Use the returned phase ID in place of `P01`. Replace `src/billing/retry.py` with
the file path the step affects, then add the step:
```bash
vaultspec-core vault plan step add PLAN --phase P01 --action "Retry a failed capture with exponential backoff" --scope "src/billing/retry.py"
```
3. After completing the work and verification, mark the step complete. Replace
`P01.S01` with the returned step ID:
```bash
vaultspec-core vault plan step check PLAN P01.S01
```
This command marks the checkbox; it doesn't run tests.
## Reach a tier above L2
`L1` is Steps. `L2` adds Phases, `L3` adds Waves above them, and `L4` adds an
Epic frame above those. The tier is a frontmatter field, `tier: L4`, and the
containers it requires have to be present or the plan fails its own check.
There is one route to a plan above `L2`, and it is not the obvious one.
Scaffolding straight at the tier you want leaves a plan you cannot edit. `L1` is
the only tier whose scaffold passes its own check on the day it is written; at
`L2` the fresh document is already short a Phase, and the walkthrough above only
hides it by adding one in the next command:
```
vaultspec-core vault add plan --feature search-api --tier L4 --related 2026-09-05-search-api-adr
vaultspec-core vault plan check 2026-09-05-search-api-plan
```
```text
[error] PLAN010 line 0: L4 plan must contain an Epic intent block
fix (manual): Reconcile the 'tier:' frontmatter field with the document's heading structure per the convention ADR's tier-driven structure rules.
[error] PLAN010 line 0: L4 plan must contain at least one Wave heading
fix (manual): Reconcile the 'tier:' frontmatter field with the document's heading structure per the convention ADR's tier-driven structure rules.
```
The scaffold succeeds and the plan it wrote is invalid, at the moment it is
written: the tier in the frontmatter promises containers the document does not
have. Both missing containers are named on that first run, so the requirements
are not withheld from you. What the check will not do is create them, and adding
them by hand clears that list one entry at a time. The Wave is allowed - `Added
Wave W01` - and the Epic intent the same run already named is still outstanding:
```
vaultspec-core vault plan wave add --title "Index the corpus" --intent "Get documents into a searchable store." 2026-09-05-search-api-plan
vaultspec-core vault plan check 2026-09-05-search-api-plan
```
```text
[error] PLAN010 line 0: L4 plan must contain an Epic intent block
fix (manual): Reconcile the 'tier:' frontmatter field with the document's heading structure per the convention ADR's tier-driven structure rules.
```
Filling a tier's containers by hand is not a route, it is doing one container at
a time what a single verb does in one call.
Build at `L2` and promote. Promotion is the verb that creates the containers, so
it asks for their titles rather than writing placeholders: run it without them
and it names exactly which are missing - `Cannot promote L2 -> L4 without the
following flag(s): --wave-title, --wave-intent`, and it adds that "the CLI does
not write TODO placeholders into plan documents".
It asks only for the containers it has to create, which is worth knowing before
you read the reference. Its promotion example passes `--epic-intent` and nothing
else, and that is correct for the plan it is written against: promoting an `L3`
to `L4` adds the Epic frame over a Wave that already exists, so there is no Wave
to name. The same command from `L2` has to create the Wave as well, and refuses
until you name it. Read the flags as a function of the distance you are moving
rather than of the tier you are moving to.
```
vaultspec-core vault plan tier promote --target L4 --epic-intent "Ship full-text search across the API, tracked as EPIC-412." --wave-title "Index the corpus" --wave-intent "Get documents into a searchable store." 2026-09-05-search-api-plan
```
```text
Tier promoted to L4. (Preserved 3 unknown blocks)
```
That plan passes `vault plan check` with exit `0`, and what it wrote is:
```markdown
## Epic intent
Ship full-text search across the API, tracked as EPIC-412.
## Wave `W01` - Index the corpus
Get documents into a searchable store.
### Phase `W01.P01` - Tokenizer
Choose and wire the tokenizer.
- [ ] `W01.P01.S01` - Wire the tokenizer into the index writer; `src/search/index.py`.
```
The Epic intent is a section, not a frontmatter field, and it is where an
external tracker reference belongs. Each container carries its intent as the
paragraph under its heading. And the identifiers lengthen as the tiers nest:
the Step that was `S01` at `L1` is `W01.P01.S01` here, because a Step is
addressed by its whole path once there is more than one container above it.
Demotion is the same verb backwards, and it is worth running once before you
need it. It removes the containers above the target tier and reports what it
kept:
```
vaultspec-core vault plan tier demote --target L2 2026-09-05-search-api-plan
vaultspec-core vault plan check 2026-09-05-search-api-plan
```
```text
Tier demoted to L2. (Preserved 3 unknown blocks)
[error] PLAN010 line 0: L2 plan must contain at least one Phase heading
fix (manual): Reconcile the 'tier:' frontmatter field with the document's heading structure per the convention ADR's tier-driven structure rules.
```
The demote succeeds with exit `0` and leaves the plan failing its own check with
exit `1`. That is the same asymmetry as the scaffold: these verbs move the tier
and strip what sits above it, and neither one writes the containers the tier you
land on requires. Promotion is the exception, and only because it refuses to run
until you have named them. After a demotion, add the Phase yourself.
## Keep it healthy
Check the records after editing them:
```sh
vaultspec-core vault check all
```
Follow the [verification guide](../core/verification.md) to interpret exit codes,
apply supported repairs, and review the changes before committing.
Use the [CI examples](#gate-a-pipeline-on-it) to check records automatically.
One thing about the summary line is worth knowing before you try to reconcile
it: the three numbers do not subtract. Here is one vault, checked, repaired, and
checked again, showing only the last line of each report:
```text
Total: 6 errors, 36 warnings
Total: 6 errors, 27 warnings, 19 fixed
Total: 6 errors, 27 warnings
```
Thirty-six warnings, nineteen fixed, twenty-seven left. `fixed` counts the
repairs applied; the warning count beside it is a fresh count taken afterwards,
against a corpus those repairs have already changed. Repairing one thing can
settle a check that was never counted and unsettle one that was, so the middle
line is a new reading rather than the first line minus the repairs. The third
line confirms it by agreeing with the second. Compare runs, not arithmetic.
## Rename a feature without breaking its trail
A feature tag is in the filename of every document that carries it, in the
frontmatter of each one, and in the `related:` links between them. Renaming it
by hand means editing all three in step, and the check that would catch a miss
runs after the damage. One verb does the whole set.
Preview it first. This is the one place the preview earns its keep, because it
tells you the size of what you are about to do:
```
vaultspec-core vault feature rename payment-retries capture-retries --dry-run
```
```text
Dry-run: Previewing feature rename 'payment-retries' -> 'capture-retries'
Planned renames (3 documents):
.vault/adr/2026-09-04-payment-retries-adr.md -> .vault/adr/2026-09-04-capture-retries-adr.md
.vault/plan/2026-09-04-payment-retries-plan.md -> .vault/plan/2026-09-04-capture-retries-plan.md
.vault/research/2026-09-04-payment-retries-research.md -> .vault/research/2026-09-04-capture-retries-research.md
Predicted: 3 tag rewrite(s), 2 related-link rewrite(s)
No incoming cross-feature links found.
```
The last two lines are the ones to read. `tag rewrite(s)` and
`related-link rewrite(s)` are the edits inside the files, which are the part a
by-hand rename forgets, and the cross-feature line says whether any other
feature points at this one. Drop the flag to apply:
```
vaultspec-core vault feature rename payment-retries capture-retries
```
```text
Next action:
Verify your vault is completely clean after renaming the feature
vaultspec-core vault check all
Renamed 3 documents 'payment-retries' -> 'capture-retries'.
.vault/adr/2026-09-04-payment-retries-adr.md -> .vault/adr/2026-09-04-capture-retries-adr.md
.vault/plan/2026-09-04-payment-retries-plan.md -> .vault/plan/2026-09-04-capture-retries-plan.md
.vault/research/2026-09-04-payment-retries-research.md -> .vault/research/2026-09-04-capture-retries-research.md
3 tag rewrite(s), 2 related-link rewrite(s)
```
It exits `0` and the counts match the preview, which is what you are checking.
Body prose is not rewritten, and that reaches further than the reference's
wording suggests, because a document's title is body prose. The research file
above still carries `payment-retries` in its own heading afterwards. The trail is
intact and every heading is stale, which is the half of this operation you
finish by hand. Nothing finds those mentions for you.
Paths above are written with `/`. That run was made on Windows, where the tool
prints `\`.
## Retire a feature without deleting it
A vault accumulates. Every feature you finish stays in `feature list` beside the
ones you are working on, and the list is the inventory a later reader - or a
later you - reads to find out what this project has decided. A finished feature
that never leaves it makes that list worse the longer the project runs.
Archiving is the way out, and it is the only one that keeps the records. Start
from what the list holds:
```
vaultspec-core vault feature list
```
```text
billing 1 docs (research) 2026-09-05
shipping 1 docs (research) 2026-09-05
```
```
vaultspec-core vault feature archive billing
```
```text
Next action:
Verify your vault remains completely clean after archiving
vaultspec-core vault check all
Archived 1 documents.
.vault\_archive\research\2026-09-05-billing-research.md
```
The hint prints above the result rather than below it, which reads oddly and is
what the tool does. The documents move to `.vault/_archive/` rather than being
removed, and the feature drops out of the list:
```
vaultspec-core vault feature list
```
```text
shipping 1 docs (research) 2026-09-05
```
To undo it, unarchive the same tag. It reverses exactly, and this half prints
no hint at all:
```
vaultspec-core vault feature unarchive billing
```
```text
Unarchived 1 documents.
.vault\research\2026-09-05-billing-research.md
```
Archiving is reversible and deleting is not, so reach for this first. It is
also the only undo here: nothing restores a document the filesystem no longer
has, and `vault archive restore` recovers only what was archived rather than
removed. Captured
on `0.1.73`; that run was made on Windows, where the tool prints `\`.
## Gate a pipeline on it
Check out the repository and
[install `vaultspec-core` on `PATH`](../core/installation.md#how-you-run-it-afterwards)
before running these steps. For the optional gates, install Bash and `jq`.
Run the vault checks as a pipeline step. Errors fail the step; warnings pass.
```yaml
- name: Check the vault
run: vaultspec-core vault check all
```
To reject `code-boundary` and `modified-stamp` findings, add this gate:
```yaml
- name: Check source boundaries and record stamps
shell: bash
run: |
set -euo pipefail
for check in code-boundary modified-stamp; do
vaultspec-core vault check "$check" --json |
jq -e --arg check "$check" '
.schema == ("vaultspec.vault.check." + $check + ".v2")
and .status == "unchanged"
and .data.diagnostics.total == 0'
done
```
The gate checks the response schema and total findings, not one page of results.
It deliberately rejects warnings. `code-boundary` is excluded from `all`;
`modified-stamp` runs in `all` but reports advisory findings. A stamp mismatch
flags a record for inspection; it doesn't prove whether the record was approved.
See the [check reference](../core/cli.md#vaultspec-core-vault-check) for details.
To validate every plan, add:
```yaml
- name: Check plan conventions
shell: bash
run: |
set -euo pipefail
shopt -s nullglob
for plan in .vault/plan/*.md; do
vaultspec-core vault plan check "$plan"
done
```
When `.vault/plan/` contains no Markdown files, this step skips cleanly.
Apply corrections locally,
[review the diff, and recheck](../core/verification.md#check-records-before-committing).
Keep `--fix` out of the pipeline so it checks the committed files.
## Get JSON output
Request status as JSON:
```bash
vaultspec-core status --json
```
See the [JSON output reference](../core/cli.md#json-output-envelope) for response fields.
The `--json` flag is command-specific. Check a command's `--help` output to see
whether it supports JSON.
## When a command refuses
Five refusals cover most of what stops you, and each names its own way out.
`vaultspec is already installed at ...` comes from a second `install` in a
project that has one. It names three ways forward - `--upgrade` to re-seed the
bundled rules and skills, `--force` to overwrite, `uninstall` to start over -
and exits `1`.
`error: L1 plans do not support Phase headings; promote first` means the plan
has no container above its Steps. Scaffold with `--tier L2`, or run
`vaultspec-core vault plan tier promote`, which wants the new container's title
and intent as flags.
`'vaultspec-core vault check orphans' has no auto-fix capabilities` means the
check rejects `--fix`. Run it without that flag and resolve the findings manually.
See the [check reference](../core/cli.md#vaultspec-core-vault-check) for supported fixes.
`Step canonical identifier 'S02' appears 2 times in document order` comes from
`vaultspec-core vault plan check`, and it is the one thing a hand-edited plan
can break that nothing repairs. Its fix is marked manual because the tool
cannot know which row the execution records naming `S02` were written against.
`vault check all` does not run the plan conventions, so a duplicate survives a
clean run of it.
For an unresolved related document, run `vaultspec-core vault list` and use the
existing document's filename or stem in `--related`.
## Where to go next
If you'd rather your agent called these operations directly than shelled out,
read [reaching Vaultspec from your agent](mcp.md).
---
## Reaching Vaultspec From Your Agent
Connect your agent through Model Context Protocol (MCP) to call vault operations
as tools. The MCP server uses the same validation and identifier rules as the
command-line interface (CLI). See the [MCP reference](../core/mcp.md) for tools
and parameters.
## Point your agent at it
Run `vaultspec-core install` to configure supported agents. The installer writes
the server entry in each provider's format. A default `.mcp.json` entry is:
```json
{
"mcpServers": {
"vaultspec-core": {
"command": "uvx",
"args": [
"--from",
"vaultspec-core",
"python",
"-m",
"vaultspec_core.mcp_server.app"
]
}
}
}
```
The launch command depends on the installation mode. With both core and vaultspec-rag
installed as project dependencies, the entries use the project environment:
```json
{
"mcpServers": {
"vaultspec-core": {
"command": "uv",
"args": [
"run",
"--no-sync",
"python",
"-m",
"vaultspec_core.mcp_server.app"
]
},
"vaultspec-rag": {
"command": "uv",
"args": [
"run",
"--no-sync",
"python",
"-m",
"vaultspec_rag.server"
]
}
}
}
```
Check `install mode` in `vaultspec-core doctor` before comparing your generated
configuration with an example. See [installation modes](../core/installation.md)
for setup details and [combined server entries](#two-products-one-file) for
core and vaultspec-rag in the default mode.
In `.codex/config.toml`, find the installer-managed `mcps` region:
```toml
#
[mcp_servers."vaultspec-core"]
args = ["--from", "vaultspec-core", "python", "-m", "vaultspec_core.mcp_server.app"]
command = "uvx"
#
```
Your agent launches the core MCP server over standard input and output; no
separate core service or network port is needed for this configuration.
For vaultspec-rag, start its background service before using its search tools.
Follow [vaultspec-rag MCP setup](../rag/mcp.md) for the startup sequence.
If your agent requests approval for the configured server, review and approve it
in the agent's interface before using its tools.
## Two products, one file
The search component answers to two names here, and only one of them belongs in
a project file. The package and the `.mcp.json` key are both `vaultspec-rag`,
which is what the entries below use. `vaultspec-search-mcp` is a console script
the base install registers, and it is one of two ways to launch the same server
rather than a second server.
vaultspec-rag declares its own server in the same `.mcp.json`, and its installer writes
that entry the same way core writes its own. Running `vaultspec-rag install` in a
project that already has the harness leaves you this, which is the file a reader
who installed both as tools ends up holding:
```json
{
"mcpServers": {
"vaultspec-core": {
"command": "uvx",
"args": [
"--from",
"vaultspec-core",
"python",
"-m",
"vaultspec_core.mcp_server.app"
]
},
"vaultspec-rag": {
"command": "uvx",
"args": [
"--from",
"vaultspec-rag[gpu,mcp]",
"python",
"-m",
"vaultspec_rag.server"
]
}
}
}
```
core and vaultspec-rag use separate keys in the same configuration. The vaultspec-rag entry requests
the `gpu,mcp` extras at launch. To skip MCP enrollment during vaultspec-rag installation,
use `vaultspec-rag install --no-mcp`.
Keep installer-managed entries in their generated form. Use the manual
`vaultspec-search-mcp` configuration only for clients the installer does not
manage; see [vaultspec-rag MCP setup](../rag/mcp.md).
## When the two components are in different modes
The file above is the tool route: both components installed as tools, both
launched with `uvx`. The quickstarts on this site do not take it. The front page
installs core with `uv tool install vaultspec-core`, and vaultspec-rag's tutorial
installs it with `uv add "vaultspec-rag[gpu]"`, which is one of each. A
workspace records the mode per package rather than for itself, so that
combination is a supported state and not a mistake.
It does not arrive tidy. Because vaultspec-rag depends on core, adding vaultspec-rag to a
project also brings core into the project environment, and the entries written
at that point launch both out of the project - which is no longer the tool mode
core is declared in. The mode check reports the mismatch rather than the mode
(showing only the two install-mode lines of a longer report):
```bash
vaultspec-core doctor
```
```text
install mode (vaultspec-core) warn declared tool; hook entries or MCP command do not match; run vaultspec-core install --upgrade, or install --mode to re-provision
install mode (vaultspec-rag) ok declared dependency; artifacts match
```
Of the two remedies that message offers, `--mode` is not the one to reach for on
a project that is already installed: it stops on `Error: vaultspec is already
installed at `. Reconcile with the other:
```bash
vaultspec-core install --upgrade
```
Running the check again reports the declared modes instead of the mismatch, and
core stays a tool:
```bash
vaultspec-core doctor
```
```text
install mode (vaultspec-core) ok declared tool; artifacts match
install mode (vaultspec-rag) ok declared dependency; artifacts match
```
The reconciled file is the one this combination ends up holding. Core launches
as a tool and vaultspec-rag out of the project, in the same `.mcp.json`:
```json
{
"mcpServers": {
"vaultspec-core": {
"command": "uvx",
"args": [
"--from",
"vaultspec-core",
"python",
"-m",
"vaultspec_core.mcp_server.app"
]
},
"vaultspec-rag": {
"command": "uv",
"args": [
"run",
"--no-sync",
"python",
"-m",
"vaultspec_rag.server"
]
}
}
}
```
Compare the `command` of each entry against the mode the check reports for that
package, not against the file a single-mode route would leave. `uvx --from` is a
tool; `uv run --no-sync` is a project dependency. An entry in the other package's
form is the mismatch above, and `vaultspec-core install --upgrade` is what
settles it.
A hand-edited managed entry can cause sync to skip it:
```bash
vaultspec-core spec mcps sync
```
```text
Scoped sync: native MCP targets only. Run vaultspec-core sync for the full provider refresh.
MCPs sync
claude
s vaultspec-rag
= antigravity up to date
= codex up to date
5 unchanged 1 skipped
- MCP server 'vaultspec-rag' in .mcp.json differs from its definition
(use --force to overwrite).
```
The counts refer to server entries, not files. Do not treat a skipped entry as
a durable override; see [managed-entry ownership](#hand-editing-the-file).
To replace it with the managed definition, use `--force`:
```bash
vaultspec-core spec mcps sync --force
```
```text
Scoped sync: native MCP targets only. Run vaultspec-core sync for the full provider refresh.
MCPs sync
claude
~ vaultspec-rag
= antigravity up to date
= codex up to date
1 updated 5 unchanged
```
Check the generated entries:
```bash
vaultspec-core spec mcps status
```
```text
mcps status
claude project ok .mcp.json vaultspec-core, vaultspec-rag none none none
antigravity project ok .agents\mcp_config.json vaultspec-core, vaultspec-rag none none none
codex project ok .codex\config.toml vaultspec-core, vaultspec-rag none none none
ok: 3 provider target(s)
```
This reports native MCP configuration targets, not every enabled agent, and the
two counts differ on an ordinary install. Setup enables four providers -
`.vaultspec/providers.json` lists `antigravity`, `claude`, `codex` and `gemini` -
while the report above names three. Gemini is the one missing, because on
`0.1.73` it has no MCP configuration file for the installer to own: it receives
the harness through `.gemini/SYSTEM.md` and `.gemini/agents/` instead, and a
search of `.gemini/` turns up no MCP config at all. So three targets on a
four-provider install is the expected reading rather than a row that fell out,
and the same asymmetry is why the provider table in the
[MCP reference](../core/mcp.md) has three rows. These Windows captures have both
components installed; absolute paths are shortened to their final file.
For an unmanaged client, such as a desktop application with its own configuration,
install the `vaultspec-rag` `mcp` extra in the environment that provides `vaultspec-search-mcp`.
Set an explicit project root:
```json
{
"mcpServers": {
"vaultspec-rag": {
"command": "vaultspec-search-mcp",
"args": ["--read-only"],
"env": {
"VAULTSPEC_RAG_ROOT": "/absolute/path/to/your/project"
}
}
}
}
```
Use an absolute path for `VAULTSPEC_RAG_ROOT`. In JSON, write Windows paths with
forward slashes, such as `C:/Users/me/project`, or escape each backslash.
Do not replace an installer-managed `.mcp.json` entry with this manual configuration.
## Hand-editing the file
vaultspec-core records a fingerprint of every entry it wrote. An entry whose
bytes no longer match its fingerprint is treated as yours for one run: that sync
skips it with a warning rather than repairing it, and records what you wrote as
the bytes it now tracks. The run after that finds a fingerprint that matches,
reads the entry as its own, and refreshes the launch shape to the current
standard. `vaultspec-core spec mcps sync --force` reaches the same end in one
run rather than two. An entry core never wrote at all is never adopted or
modified without that flag.
```{raw} html
core wrote itthe bytes match the fingerprint it recorded
you edit itthe bytes no longer match
first syncskips it with a warning, and adopts what you wrote - your edit survives
second syncthe fingerprint matches now, so it refreshes the entry - your edit is gone
sync --force reaches the last box in one run; an entry core never wrote is never adopted or modified without it.
An edit does not survive. It buys one sync, and the run that takes
it away is an ordinary one with no flags.
```
If you would rather core never touched the file at all, pass `--skip mcp` to the
*first* install. `vaultspec-core install --skip mcp` leaves a workspace with no
recorded enrolment, and a workspace with no enrolment is one sync leaves alone
entirely - there is no fingerprint to compare against, so nothing to adopt or
refresh. On a project that is already installed the same command refuses, and
the section on withholding the destructive tools has the route that works
there.
The [Model Context Protocol (MCP) reference](../core/mcp.md) sets out the
ownership rules in full.
## Withholding the destructive tools
```{warning}
Do not rely on a hand-added `--read-only` flag in an installer-managed entry.
Two ordinary `vaultspec-core spec mcps sync` runs can remove it: the first skips
the edited entry; the second refreshes it and drops the flag. This restores
mutating tools, including index deletion for vaultspec-rag. Recheck the launch arguments
after sync, even if its message says hand-edited entries are never refreshed.
```
Launch vaultspec-rag with `--read-only` to expose only search and read tools over MCP.
The server advertises twelve tools and the flag halves them. Six stay:
`search_codebase`, `search_vault`, `search_documents`, `search_combined`,
`get_code_file` and `get_index_status`. Six go: `reindex_all`,
`reindex_codebase`, `reindex_vault`, `reindex_documents`, `clean_documents` and
`clean_all`. Check your client's available-tool list after reconnecting.
Append the flag to the existing launch arguments:
```json
{
"mcpServers": {
"vaultspec-rag": {
"command": "uvx",
"args": [
"--from",
"vaultspec-rag[gpu,mcp]",
"python",
"-m",
"vaultspec_rag.server",
"--read-only"
]
}
}
}
```
Core's server takes the same flag, and its surface is smaller than the rag one.
Probed over stdio with `tools/list` on 0.1.73, the default launch advertises nine
tools - `find`, `create`, `edit`, `status`, `check`, `plan_progress`,
`plan_edit`, `discover` and `invoke` - of which six carry `readOnlyHint: false`.
With `--read-only` four are advertised: `find`, `status`, `check` and
`discover`. The five that go are `create`, `edit`, `plan_progress`, `plan_edit`
and `invoke`, and they go from the listing rather than being refused when
called, so a client is never handed the schema of something it cannot use.
`check` stays but narrows: its `fix` parameter is gone and its description
changes from "Run the vault health-check suite, optionally repairing." to "Run
the vault health-check suite without repair." That is why six of the nine count
as mutating while only five are withdrawn.
Whichever server you run, the mutating tools write straight into the working
tree and never commit: calling `create` on a clean checkout leaves the new
records as untracked changes and adds no commit. Run them on a clean tree if you
want the diff reviewable.
This Core example demonstrates the overwrite risk after appending `--read-only`
to a managed entry. The first sync skips it:
```
vaultspec-core spec mcps sync
```
```text
Scoped sync: native MCP targets only. Run vaultspec-core sync for the full provider refresh.
MCPs sync
claude
s vaultspec-core
= antigravity up to date
= codex up to date
2 unchanged 1 skipped
- MCP server 'vaultspec-core' in /.mcp.json differs from its definition (use --force to overwrite).
```
The second run, identical, takes it back:
```
vaultspec-core spec mcps sync
```
```text
MCPs sync
claude
~ vaultspec-core
= antigravity up to date
= codex up to date
1 updated 2 unchanged
- MCP server 'vaultspec-core' launch refreshed to the current standard: 'uvx --from vaultspec-core python -m vaultspec_core.mcp_server.app --read-only' -> 'uvx --from vaultspec-core python -m vaultspec_core.mcp_server.app' (managed entry was unchanged since vaultspec wrote it; hand-edited entries are never refreshed automatically).
```
The refreshed launch no longer contains `--read-only`, despite the message's
claim that hand-edited entries are never refreshed automatically.
This behavior was also reproduced on Core `0.1.73` with a second managed server
added through `spec mcps add`: the first sync reported `2 skipped`; the second
reported `2 updated` and removed both flags. The captures use a Core-only
Windows project, with its path shortened to ``.
To preserve custom launch arguments across ordinary syncs, remove managed
enrollment before creating your own entries. `install --skip mcp` applies to
the first install; it refuses an already-installed project. Preview removal:
```
vaultspec-core spec mcps uninstall --dry-run
```
```text
claude
- vaultspec-core
- vaultspec-rag
antigravity
- vaultspec-core
- vaultspec-rag
codex
- vaultspec-core
- vaultspec-rag
6 removed
```
Re-run it with `--force` to apply:
```
vaultspec-core spec mcps uninstall --force
```
```text
MCPs uninstall sync
claude
- vaultspec-core
antigravity
- vaultspec-core
codex
- vaultspec-core
3 removed
```
These captures use different projects: the preview includes core and vaultspec-rag;
the applied run includes Core only. Removal deletes managed entries and can
delete their configuration file if nothing else remains.
Recreate each entry you need with `--read-only`, then check ownership with sync.
This excerpt shows an externally managed Core entry in a project with both components:
```
vaultspec-core spec mcps sync
```
```text
5 created 1 skipped
- MCP server 'vaultspec-core' in /.mcp.json is externally managed; use --force to adopt it explicitly.
```
Confirm that each custom entry is reported as externally managed and still
contains `--read-only`. Ordinary syncs leave external entries alone;
`sync --force` adopts and overwrites them. The captured path is shortened.
Core also accepts `--read-only`, through both its module launch and the
`vaultspec-core-mcp` command. Releases before 0.2.4 named that command
`vaultspec-mcp`:
```
vaultspec-core-mcp --help
```
```text
Usage: vaultspec-core-mcp [OPTIONS] COMMAND [ARGS]...
Run the Vaultspec MCP server.
Options:
--parent-pid Explicit client PID for the stdio lifetime watchdog
(watched in addition to the discovered client)
--read-only Expose only non-mutating MCP tools.
--help Show this message and exit.
```
Append the flag to Core's launch arguments. The same
[managed-entry overwrite warning](#hand-editing-the-file) applies.
Confirm your client's available tools against
[Core's read-only tool list](../core/mcp.md#serving-a-read-only-surface).
`check` remains available without repairs; `invoke` is withheld.
For vaultspec-rag, start the resident service before using its tools; follow
[vaultspec-rag MCP setup](../rag/mcp.md).
## Check that it connected
Open your client's available-tool list and check for Core's `status` and `find`.
Read-only mode exposes fewer tools, and vaultspec-rag adds a separate set.
If Core's tools are missing, restart the client and check whether it requires
approval to launch the server. Check the installed configuration:
```
vaultspec-core doctor
```
For a Claude configuration, look for:
```text
mcp ok .mcp.json present
```
This confirms the configuration file exists, not that the client connected.
To prove the server itself answers, speak to it directly. It is a stdio server,
so a client is three lines of JSON on its standard input: the handshake, the
notification that the handshake is done, and one call. Run this from a project
that has a vault:
```
vaultspec-core-mcp <<'EOF'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"status","arguments":{}}}
EOF
```
That is a POSIX heredoc. PowerShell has no such operator and reserves `<`, so
the block above is a parse error there rather than a failed run. Its equivalent
is a single-quoted here-string piped in, and the closing `'@` has to sit at the
start of its line:
```powershell
@'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"status","arguments":{}}}
'@ | vaultspec-core-mcp
```
Both were run against `0.2.4`, and the refusal further down translates the
same way. It answers one line of JSON per request. The second is the `status` call, and
its `result` is the shape every tool on this page returns - abridged here to the
summary line and the first feature, because the rollup also carries totals and
the plans in flight:
```text
{"jsonrpc":"2.0","id":2,"result":{"content":[{"text":"1 active features, 0 plans in flight","type":"text"}],"isError":false,"structuredContent":{"tool_schema_version":"0.2.4","kind":"rollup","features":[{"name":"search-api","doc_count":2,"latest_activity":"2026-09-21","has_plan":true,"status":"Planned","plan_tier":"L2","plan_completion_percent":0.0}],...}}}
```
Two things in that answer are worth knowing before you read the tool reference.
`content` carries a sentence for a person, and `structuredContent` carries the
same answer as data - your agent reads the second, which is why its summaries
can be more specific than the one line the server wrote. And `isError` is a
field inside `result` rather than a JSON-RPC `error`, so a refusal arrives on
the success path. Ask `status` for a feature that is not there - the same three
lines, with one argument changed:
```
vaultspec-core-mcp <<'EOF'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"status","arguments":{"target":"no-such-feature"}}}
EOF
```
```text
{"jsonrpc":"2.0","id":2,"result":{"content":[{"text":"Error executing tool status: Could not resolve orientation target 'no-such-feature'. Run `vaultspec-core vault feature list` to enumerate available targets.","type":"text"}],"isError":true}}
```
That is `result`, not `error`. A client that only checks whether the call
completed reads it as a success, which is why the refusals on this page are
worth reading rather than assuming a silent tool worked.
(the-hot-path)=
## Start a feature
Follow [Run a feature from research to review](workflow.md) to research,
approve, and implement a change. Use the [tool reference](../core/mcp.md#tools)
to look up parameters and write behavior.
## When to use the command line instead
Use the CLI for resource syncs and plan changes above step level, including
phases, waves, and tiers. These operations use the destructive `invoke` gateway
over MCP, which can require host confirmation.
Rebuilding a feature index, managing MCP entries, and uninstalling require the
CLI. See [command-line guidance](cli.md) and the
[MCP reference](../core/mcp.md).
## Two writers, one vault
Supply `expected_blob_hash` when calling `edit` to reject a write if the document
has changed since you read it. See the [edit parameters](../core/mcp.md#edit).
The CLI equivalent is `--expected-blob-hash`. This example supplies a mismatched
hash to demonstrate a refused write. Replace the document stem and body-file
path with existing files in your project:
```
vaultspec-core vault set-body 2026-09-04-payment-retries-research --body-file new-body.md --expected-blob-hash deadbeefdeadbeefdeadbeefdeadbeef
```
```text
Blob-hash conflict: document changed on disk since it was read
expected deadbeefdeadbeefdeadbeefdeadbeef, on disk 63ce7068181d11f30e097ef43d04e5dc150f5d27
```
The command exits `1` without changing the document. The captured on-disk hash
will differ in your project. After a conflict, reread the document and reconcile
your changes before retrying with its current hash.
## Where to go next
- [Model Context Protocol reference](../core/mcp.md) - setup, install modes,
environment, and every tool's parameters.
- [Driving the vault from the command line](cli.md) - the same operations from a
prompt.
---
## vaultspec-core
Core installs the workflow, configures supported coding agents, and manages the feature records under `.vault/`.
## Start
- [Install Core](installation.md)
- [Understand the workflow](../concepts.md)
- [Run a feature](../guides/workflow.md)
## Reference
- [CLI reference](cli.md)
- [Document syntax](syntax.md)
- [MCP tools](mcp.md)
- [Workspace and record checks](verification.md)
- [Review and correctness](correctness.md)
- [Distribution channels](channels.md)
Records are Markdown files under `.vault/`. Open that directory in [Obsidian](https://obsidian.md) to browse the linked documents.
## Support and license
vaultspec-core is in beta. Report bugs, ask questions, or propose changes on the [issue tracker](https://github.com/nevenincs/vaultspec-core/issues). Released under the [MIT License](https://github.com/nevenincs/vaultspec-core/blob/main/LICENSE).
```{toctree}
:hidden:
:caption: Core
installation
framework
syntax
correctness
verification
channels
mcp
cli
```
---
## Installing vaultspec-core
## Before you begin
Install [uv](https://docs.astral.sh/uv/getting-started/installation/) and your
coding agent. Core supports CPython 3.13 and 3.14; uv downloads a supported
interpreter if needed.
Run the project setup from your repository root. Git is not required to
install, but committing the records and policy lets teammates share them.
Core 0.1.73 has an [installer bug](https://github.com/nevenincs/vaultspec-core/issues/399)
that skips ignore rules when `.gitignore` is missing. Create the file before you
install:
```bash
touch .gitignore
```
PowerShell has no `touch`; use `New-Item -ItemType File .gitignore` there.
Skipping this costs nothing visible. The install still succeeds, still exits
`0`, and still reports no problem - it simply writes no ignore rules at all,
and the managed block below is absent rather than incomplete. With the empty
file in place first, the same install writes it:
```text
# >>> vaultspec-managed (do not edit this block) >>>
.vault/.obsidian/
.vault/.trash/
.vault/data/
.vault/logs/
.vaultspec/*.lock
.vaultspec/_snapshots/
.vaultspec/mcp-ownership.json
.vaultspec/providers.json
/.agents/mcp_config.json.lock
/.codex/config.toml.lock
/.gitignore.lock
/.mcp.json.lock
/.pre-commit-config.yaml.lock
# <<< vaultspec-managed <<<
```
`0.1.73` is the version the command below resolves to: `0.1.73` is what
PyPI serves as current, and what a fresh install reports back under
[verify the install](#verify-the-install). The fix is on main, so this applies
until the next release rather than to some older one you might already have.
Core does not require a GPU. The [search package](../rag/installation.md) has
separate hardware requirements.
## Install
1. From your repository root, install the command-line tool:
```bash
uv tool install vaultspec-core
```
2. Configure the current project for all supported coding agents:
```bash
vaultspec-core install
```
3. [Verify the installation](#verify-the-install).
For other installation options, see [distribution channels](channels.md) and
[command prefixes](#how-you-run-it-afterwards).
```{vs-cast} vaultspec-core-install
:caption: Recorded project setup with `uvx vaultspec-core install`. This route does not add Core to PATH.
```
## How you run it afterwards
After a [tool installation](#install) or [standalone download](channels.md#direct-release-downloads),
use the command on your PATH:
```
vaultspec-core status
```
When running Core through `uvx`, keep that prefix on every command:
```
uvx vaultspec-core status
```
For a project dependency, add Core to the project and use `uv run`:
```
uv add vaultspec-core
uv run vaultspec-core status
```
For development-only dependencies, see [provisioning modes](#choose-a-provisioning-mode).
If your shell cannot find `vaultspec-core`, check the prefix: `uvx` does not add
the command to PATH. For a tool installation, follow uv's PATH instructions if
it reports that the executable directory is missing from PATH.
## What it writes
The installer creates records directories, project policy, and coding-agent
configuration:
```none
.vault/ the records: research, adr, plan, exec, audit, reference, index
.vaultspec/ the harness: rules, skills, agents, system, hooks, mcps,
templates, reference
.claude/ .gemini/ .codex/ .agents/ generated per-provider configuration
CLAUDE.md AGENTS.md GEMINI.md the file each agent reads on startup
.mcp.json the MCP server declaration
.pre-commit-config.yaml vault checks, for pre-commit to wire
.gitattributes a managed block pinning line endings
.gitignore a managed block for runtime-state ignore rules
```
`.vault/` starts empty apart from its subdirectories. It fills as you work.
Commit `.vaultspec/workspace.json` with the project policy so teammates share
the provisioning mode. Keep machine-local ownership records, locks, and
snapshots untracked; see [ignored runtime files](#ignored-runtime-files).
## Agent configuration
| Coding agent | Skill instructions | Agent definitions | System guidance |
| --- | --- | --- | --- |
| Claude Code | `.claude/skills/` | `.claude/agents/` | `.claude/rules/vaultspec-system.builtin.md` |
| Codex | Folded into `.codex/config.toml` | `.codex/config.toml` | `.codex/rules/vaultspec-system.builtin.md` |
| Gemini CLI | Folded into `.gemini/SYSTEM.md` | `.gemini/agents/` | `.gemini/SYSTEM.md` |
| Antigravity | `.agents/skills/` | Not generated | No dedicated output |
The first column is the one that decides whether you have anything to type.
Measured on a fresh install of `0.1.73`: ten skill directories under
`.claude/skills/` and ten under `.agents/skills/`, and no skills directory for
either of the other two. `.agents/` is Antigravity's, and nothing the install
writes points Codex or Gemini at it - searched for `.agents` across
`.codex/`, `.gemini/`, `AGENTS.md` and `GEMINI.md`, and it does not appear.
What those two get instead is the same instruction set folded into files they
already read, so their stages are driven from
[the command line](../guides/cli.md) rather than invoked by name.
To edit `.vaultspec/` sources and sync your changes, see
[customize project policy](framework.md#customize-the-policy).
## Choose a provisioning mode
The mode controls how generated project commands launch core. Leave `--mode`
unset to reuse the saved mode, or detect it from `pyproject.toml` on a new installation.
- `tool` is the default. Commands launch through `uvx`; core is not a project dependency.
- `dev` uses core from the default development dependency group. Contributors get
it through `uv sync`, and generated commands use the project environment.
- `dependency` uses core as a runtime dependency. Choose this only when your
package calls core at runtime; it becomes a dependency of your published package.
The mode does not add the package to `pyproject.toml`. For a development
dependency, run `uv add --dev vaultspec-core`, then configure the harness:
```
vaultspec-core install --mode dev
```
The `tool` mode is separate from `uv tool install`, which installs the command
for your shell. See [command prefixes](#how-you-run-it-afterwards).
## Install for one agent only
The installer configures every provider it supports. To configure one, name it:
```
vaultspec-core install claude
```
Valid providers are `all`, `core`, `claude`, `gemini`, `antigravity`, and
`codex`. `core` writes the framework without configuring any agent, which is
what you want if you drive the pipeline entirely from the command line.
To keep everything except one piece, skip it instead. `--skip` is repeatable and
takes a provider name, `core`, `mcp`, or `precommit`:
```
vaultspec-core install --skip precommit
```
## Preview before writing
Preview the affected paths without changing the project:
```bash
vaultspec-core install --dry-run
```
Review the paths before installing into a project with existing agent
configuration. The preview's `unchanged` marker does not guarantee that a
modified bundled file will retain its contents.
For an existing installation, follow the [upgrade steps](#upgrade).
`install --force` restores bundled files and can replace your edits to them;
commit your changes first. User-added rules survive.
(the-other-force)=
### Force a sync
Force sync prunes stale generated files and can overwrite provider configuration,
including custom MCP launch settings. Review your changes before running it:
```bash
vaultspec-core sync --force
```
This removes generated copies of deleted source rules. Unmanaged files in
provider directories are not pruned. See the [sync reference](cli.md#sync)
for options.
Do not rely on ordinary syncs to preserve a hand-edited MCP entry indefinitely.
See [MCP ownership and read-only settings](../guides/mcp.md#withholding-the-destructive-tools)
before changing its launch arguments.
(installing-into-a-repository-with-no-gitignore)=
## Ignored runtime files
The managed block in `.gitignore` excludes runtime state such as `.vault/data/`,
caches, and lock files. Keep your feature
records and project policy in Git.
Ignore rules do not untrack files that were already committed. Check whether
runtime data is tracked:
```bash
git ls-files -- .vault/data
```
If that command lists files, remove them from Git's index while leaving them on disk:
```bash
git rm -r --cached -- .vault/data
```
Review and commit the staged removals. If the listing is empty, no cleanup is needed.
## Verify the install
Check the installed CLI version, workspace configuration, and vault validation:
```bash
vaultspec-core --version
vaultspec-core doctor
```
```text
0.1.73
workspace diagnosis
framework ok .vaultspec/ present
claude ok dir: complete
gemini ok dir: complete
antigravity ok dir: complete
codex ok dir: complete
builtins ok current
gitignore ok complete
gitattributes ok complete
mcp ok .mcp.json present
migration ok all registered migrations applied
vault content ok no generated template annotations
precommit ok all hooks present
rename integrity ok all rules, skills, and agents names are consistent
install mode (vaultspec-core) ok declared tool; artifacts match
semantic search none vaultspec-rag not provisioned; core discovery and find cover document lookup without it
Vault Check - All
ok structure: clean
ok frontmatter: clean
ok annotations: clean
ok encoding: clean
```
Captured on a fresh install of `0.1.73` into an empty repository, exit `0`. Read
it down the verdict column - `ok`, `warn` or `none` - rather than reading every
row.
Two abridgements. The `process registry` row is omitted, because it reports
machine-global records left by other projects and says nothing about this
workspace. The vault check runs nineteen entries where four are shown, and all
nineteen read `clean` on a vault with no documents in it yet.
Compare your version with [published releases](https://pypi.org/project/vaultspec-core/).
Address reported problems and rerun `vaultspec-core doctor`. See
[workspace and vault verification](verification.md) for check details and exit
codes.
`semantic search none` means RAG is not provisioned for this workspace;
Core works without it.
To add search, follow the [RAG installation guide](../rag/installation.md).
To run vault checks when you commit, [activate the Git hooks](../guides/workflow.md#manual-and-advanced-operation).
Installing hook configuration alone does not enable Git to run it.
## Upgrade
Commit your project changes first. Refreshing bundled content replaces edits to
bundled files while preserving user-added rules.
If you installed Core with `uv tool install`, upgrade the CLI:
```bash
uv tool upgrade vaultspec-core
```
uv respects any [version constraints set at installation](https://docs.astral.sh/uv/guides/tools/#upgrading-tools).
After updating Core, refresh the project's bundled content from its root:
```bash
vaultspec-core install --upgrade
```
Inspect migration status without changing the project:
```bash
vaultspec-core migrations status
```
If migrations are pending, apply them:
```bash
vaultspec-core migrations run
```
Review the changed files before committing. See the [migration reference](cli.md#vaultspec-core-migrations-status)
for options and exit codes.
## Uninstall
Uninstall removes `.vaultspec/`, provider directories, and generated configuration.
It preserves `.vault/` unless you add `--remove-vault`; back up your feature
records before using that option.
Preview the affected paths without removing anything:
```bash
vaultspec-core uninstall --dry-run
```
Review the list and save any configuration you need. Then confirm removal:
```bash
vaultspec-core uninstall --force
```
For permanent removal, review the remaining vaultspec blocks in `.gitignore`
and `.gitattributes`. Remove them if you no longer need their rules. After all
vaultspec processes have stopped, remove leftover `.gitignore.lock`,
`.mcp.json.lock`, and `.pre-commit-config.yaml.lock` files. Leave these files
and blocks in place if you plan to reinstall.
## Joining a project that already has it
Clone the repository and install the CLI using the project's
[installation route](#how-you-run-it-afterwards). From the clone's root,
create your local provider configuration from the shared `.vaultspec/` policy:
```bash
vaultspec-core install
```
Use plain `install` for a fresh clone, not `--upgrade` or `--force`. The installer
establishes local manifest state from the existing policy. A second install
reports `already installed`; see [upgrading](#upgrade) when updating an existing
installation.
Git hooks do not travel with a clone. [Activate the commit checks](../guides/workflow.md#manual-and-advanced-operation)
locally. If the project uses search, [set up your own index](../rag/getting-started.md).
Then run `vaultspec-core status` to find the team's in-flight work:
```bash
vaultspec-core status
```
```text
Vault Status
Plans in flight (at least one open step)
2026-09-06-payment-retries-plan L2 - P0/1 0/1 steps 0% next P01.S01 2026-09-06
Recent changes
adr
2026-09-06-payment-retries-adr 2026-09-06
plan
2026-09-06-payment-retries-plan 2026-09-06
research
2026-09-06-payment-retries-research 2026-09-06
Active features
payment-retries 3 docs plan L2 0/1 0% 2026-09-06
Discovery
vaultspec-rag not provisioned - use find and grep for discovery
Totals
Total documents: 3
Total features: 1
```
`Plans in flight` is the answer to what anyone is working on: one row per plan
that still has an open Step, carrying its tier, how far through its Phases and
Steps it is, and the identifier of the next Step to pick up. A clone with
nothing started prints `none` there and the rest of the report unchanged, so an
empty first section means the vault is idle rather than unreadable.
`Discovery` reports whether the search component is available in this project;
the line above is what it prints when only Core is installed.
## Where to go next
- [Run a feature with your coding agent](../guides/workflow.md).
- [Drive the vault from the command line](../guides/cli.md).
- [Look up document types and workflow concepts](../concepts.md).
---
## vaultspec-rag
RAG indexes Vaultspec records, source code, and routed documents for semantic search. It is required in the standard Vaultspec setup.
## Start
- [Install RAG](installation.md)
- [Start the service and run a search](getting-started.md)
- [Write a precise query](query-craft.md)
## Reference
- [CLI reference](cli.md)
- [Configuration](configuration.md)
- [MCP tools](mcp.md)
- [Index verification](verification.md)
## Advanced
- [Service operation](service-mode.md)
- [Storage backends](backends.md)
- [Storage maintenance](storage-maintenance.md)
- [Automation](automation.md)
- [Automatic convergence](automatic-convergence.md)
- [Preprocessing hooks](preprocessing-hooks.md)
- [Service discovery](service-discovery.md)
- [Indexing internals](indexing.md)
## Support and license
vaultspec-rag is in beta. [Report issues](https://github.com/nevenincs/vaultspec-rag/issues) with your version, operating system, GPU, command, and error output, and redact credentials and private content before posting. Released under the [MIT License](https://github.com/nevenincs/vaultspec-rag/blob/main/LICENSE).
```{toctree}
:hidden:
:caption: RAG
installation
getting-started
query-craft
verification
configuration
mcp
service-mode
backends
storage-maintenance
automation
automatic-convergence
preprocessing-hooks
service-discovery
indexing
search-and-index
architecture
cli
```
---