@cairnkeep/cli 2.15.3 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/CONTRIBUTING.md +12 -0
  3. package/README.md +84 -589
  4. package/docs/README.md +79 -0
  5. package/docs/agents.md +173 -0
  6. package/docs/ecosystem.md +23 -0
  7. package/docs/harness-compatibility.md +4 -3
  8. package/docs/learning/CURRICULUM-MAP.md +2 -2
  9. package/docs/learning/FEATURE-GUIDE.md +6 -6
  10. package/docs/learning/README.md +3 -0
  11. package/docs/learning/lessons/L00-why-cairnkeep.md +3 -1
  12. package/docs/learning/lessons/L01-safe-trial.md +3 -3
  13. package/docs/learning/lessons/L02-installation.md +2 -2
  14. package/docs/learning/lessons/L03-first-project.md +9 -10
  15. package/docs/learning/lessons/L19-validated-skill-improvement.md +1 -1
  16. package/docs/learning/lessons/L20-mcp-tool-profiles.md +1 -1
  17. package/docs/learning/lessons/L21-context-packs.md +1 -1
  18. package/docs/learning/lessons/L22-native-windows.md +2 -2
  19. package/docs/learning/lessons/L23-guided-setup.md +18 -5
  20. package/docs/learning/lessons/L24-okf-exchange.md +1 -1
  21. package/docs/learning/lessons/L25-playbooks.md +2 -2
  22. package/docs/learning/video-scripts/V25-playbooks.md +1 -1
  23. package/docs/native-windows.md +5 -0
  24. package/docs/operating.md +24 -5
  25. package/docs/quickstart.md +15 -6
  26. package/docs/releasing.md +27 -19
  27. package/examples/eval/bundled-fake.json +1 -1
  28. package/mcp-memory-server/dist/playbook-cli.js +12 -5
  29. package/package.json +1 -1
  30. package/scripts/cairn-cli.mjs +1 -0
  31. package/scripts/setup.mjs +92 -13
  32. package/scripts/terminal-prompts.mjs +172 -0
  33. package/scripts/test-cli-dispatch.sh +4 -0
  34. package/scripts/test-docs-navigation.sh +63 -0
  35. package/scripts/test-learning-docs.sh +1 -1
  36. package/scripts/test-package-install.sh +1 -1
  37. package/scripts/test-phase17-artifact-lifecycle.sh +1 -1
  38. package/scripts/test-playbook-instructions.sh +4 -2
  39. package/scripts/test-release-sbom.sh +41 -16
  40. package/scripts/test-setup-preflight.mjs +130 -0
  41. package/scripts/test-windows-native.mjs +1 -1
  42. package/scripts/verify-docs-parity.sh +28 -28
  43. package/templates/playbook-agent-instructions.md.template +5 -4
package/README.md CHANGED
@@ -4,619 +4,114 @@
4
4
  [![npm](https://img.shields.io/npm/v/@cairnkeep/cli)](https://www.npmjs.com/package/@cairnkeep/cli)
5
5
  [![license](https://img.shields.io/npm/l/@cairnkeep/cli)](LICENSE)
6
6
 
7
- > A durable, harness-agnostic **memory + context layer** for coding agents.
8
-
9
- A *cairn* is a stack of stones left as a trail marker for whoever follows; a
10
- *keep* is where you store what matters. **Cairnkeep** is where coding agents
11
- stack durable memory — decisions, pitfalls, patterns — and follow the trail
12
- across sessions, projects, and harnesses (Claude Code, Codex CLI, OpenCode,
13
- Kimi Code, Qwen Code, Pi, and other MCP clients).
14
-
15
- ## Five-minute start
16
-
17
- For Codex CLI, Cairnkeep can install the complete project-local memory wiring
18
- in one command:
7
+ > Durable, local-first memory and context for coding agents.
8
+
9
+ Cairnkeep helps coding agents carry project context across sessions and
10
+ harnesses. It stores decisions, constraints, patterns, and lessons in
11
+ project-scoped memory, then gives agents a bounded protocol for finding and
12
+ verifying that context without turning memory into an authority or an
13
+ autonomous agent runtime.
14
+
15
+ ## Why Cairnkeep?
16
+
17
+ - **Continuity across sessions.** Recall project decisions and recurring
18
+ failures instead of rediscovering them from scratch.
19
+ - **Harness independence.** Use the same memory through Claude Code, OpenCode,
20
+ Codex CLI, Kimi Code, Qwen Code, Pi, or another MCP client.
21
+ - **Local by default.** The default stdio server stores data on your computer;
22
+ remote access, embeddings, capture, and external context are explicit
23
+ opt-ins.
24
+ - **Bounded agent guidance.** Managed `AGENTS.md` instructions and project
25
+ playbooks tell compatible agents when to retrieve context and which checks
26
+ apply, but never execute work or grant approval.
27
+ - **Least authority.** Complete MCP annotations, read-only/custom tool profiles,
28
+ capability gates, and immutable context packs keep observation separate from
29
+ action.
30
+
31
+ ## Quick start
32
+
33
+ Cairnkeep requires Node.js 22 or newer. In an interactive terminal, guided
34
+ setup presents selectable Git and memory choices plus checkboxes for every
35
+ supported coding harness:
19
36
 
20
37
  ```bash
21
38
  npm install --global @cairnkeep/cli
22
- cairn setup /path/to/project --git init --harness codex --memory local --yes
39
+ cairn setup /path/to/project
23
40
  cd /path/to/project
41
+ cairn doctor
24
42
  ./.ai/start-codex.sh # Windows: .\.ai\start-codex.cmd
25
43
  ```
26
44
 
27
- Review `.codex/config.toml` and accept Codex's project-trust prompt on first
28
- use. No separate MCP registration or machine-level asset sync is needed. See
29
- the **[quickstart](docs/quickstart.md)** for existing repositories, Claude Code,
30
- verification, and the first remember/recall cycle.
31
-
32
- ## Status
33
-
34
- Shipped: the memory server, the `cairn` CLI (`setup`, `bootstrap`, `memory-server`, `sync`, `sync-pi`, `sync-kimi`,
35
- `doctor`, `playbook`, `trajectory`, `artifact`, `evidence`, `mcp-tools`, `pack`, `notes`, `memory`, `eval`, `audit-timer`, `completion`, `uninstall`) installable via
36
- `npm i -g @cairnkeep/cli`, and the
37
- operating layer (commands,
38
- agents, hooks) installed on Claude Code and OpenCode, plus the native Pi
39
- trajectory extension and thin Pi/Kimi graph and playbook adapters. The generic launchers
40
- expose wrapper seams (`.ai/pre-launch.sh`/`.ai/pre-launch.ps1`,
41
- `CAIRN_EXTRA_SETTINGS`, `.ai/post-exit.sh`/`.ai/post-exit.ps1`) so an enterprise wrapper can add provider/credential setup
42
- without forking them. Also shipped: context exploration (`/context-explore`) and
43
- a thin routing seam (`route_check`), both of which delegate to
44
- [token-miser](https://github.com/cairnkeep/token-miser), a public
45
- cairnkeep-org sibling project.
46
-
47
- Version 2.12 adds a declarative harness registry, first-class Codex project
48
- setup, and a shorter path from installation to verified recall.
49
- Version 2.13 adds opt-in local Git-linked work evidence around generated harness
50
- launchers, including native Windows, without capturing prompts or replacing Git.
51
- Version 2.15 adds bounded project playbooks that help agents select existing
52
- recall, planning, verification, review, security, documentation, and learning
53
- steps without becoming an agent runtime or granting approval.
54
- Version 2.15.3 tightens the generic durable-context protocol so compatible
55
- agents derive one project-memory query before repository inventory or search,
56
- verify its repository provenance, and receive executable playbook receipt
57
- syntax with command-scoped help.
58
-
59
- ## Compatibility
60
-
61
- Node.js 22, 24, and 26 are supported. Cairnkeep 2.x requires Node.js 22 or
62
- newer; Cairnkeep 1.x remains available for older runtimes, although Node.js 18
63
- and 20 are end-of-life upstream.
64
-
65
- | Client or platform | Support level |
66
- |---|---|
67
- | Claude Code on Linux/macOS | Memory server plus commands, agents, hooks, and launchers |
68
- | OpenCode on Linux/macOS | Memory server plus commands, plugins, hooks, and launchers |
69
- | Kimi Code on Linux/macOS | Memory MCP server, project launcher, and opt-in `/graphify` Skill |
70
- | Qwen Code on Linux/macOS | Memory MCP server plus project launcher; no Cairnkeep operating-layer assets yet |
71
- | Pi on Linux/macOS | Memory MCP through a maintained local stdio extension; native opt-in trajectory extension, launcher, and `/graphify` prompt; Pi 0.84.1 minimum for the bridge |
72
- | Codex CLI on Linux/macOS | Project-scoped memory MCP configuration and launcher; no Cairnkeep-specific commands or hooks |
73
- | Other MCP clients | Memory plus optional domain-knowledge and context-pack MCP tools |
74
- | Native Windows x64 | Node-native CLI, guided setup, memory server, bootstrap compatibility, PowerShell/Command Prompt launchers, sync, hooks, doctor, storage lifecycle, Task Scheduler, completion, and uninstall |
75
- | Windows ARM64 | Supported through Windows x64 emulation only; a native database binding is not currently shipped |
76
- | WSL | Uses the normal Linux workflow; distinct from native Windows and Git Bash |
77
-
78
- The `cairn graph` CLI is harness-independent and can be run from a project
79
- shell used by Kimi Code, Pi, Qwen Code, Codex, or another client. Claude Code,
80
- OpenCode, Pi, and Kimi can receive thin `/graphify` adapters; those adapters do
81
- not imply equivalent hooks, agents, or MCP support.
82
-
83
- Linux, macOS, Bash 3.2 portability, native PowerShell on Windows x64, global npm
84
- installation, and clean Node 22/24/26 runtime checks are exercised in CI. See
85
- [Native Windows operation](docs/native-windows.md) for platform-specific setup,
86
- ACL, scheduling, process-tree, and recovery details.
87
-
88
- See [Harness compatibility](docs/harness-compatibility.md) for exact support
89
- levels, trust boundaries, and candidates that are not yet runtime-tested.
90
-
91
- ## Try with Podman
92
-
93
- The minimal OCI image runs the memory server as an unprivileged user and keeps
94
- all databases in a named volume:
95
-
96
- ```bash
97
- podman run --rm -i \
98
- --userns=keep-id:uid=10001,gid=10001 \
99
- --read-only --cap-drop=all --security-opt=no-new-privileges \
100
- --tmpfs=/tmp:rw,noexec,nosuid,size=64m,mode=1777 \
101
- --volume cairnkeep-data:/data:Z,U \
102
- ghcr.io/cairnkeep/cairnkeep:latest stdio
103
- ```
104
-
105
- For persistent authenticated HTTP, rootless Quadlet, isolated workspace mode,
106
- storage paths, secrets, and private derived images, see
107
- **[Containers](docs/containers.md)**.
108
-
109
- ## Components
110
-
111
- - **`mcp-memory-server/`** — an MCP server exposing durable, scoped memory
112
- (`memory_write`, `memory_search`, …) backed by AgentFS, with optional
113
- embedding-ranked search against any OpenAI-compatible endpoint.
114
- - **`bin/cairn`** — the CLI. `cairn setup [path]` guides or deterministically
115
- reconciles selected project assets; `cairn bootstrap [path]` preserves the
116
- established scripted scaffold contract; `cairn doctor` health-checks the configured pieces;
117
- `cairn trajectory list|show|prune` manages opt-in local session trajectories;
118
- `cairn artifact list|show|delete|prune` manages opt-in local artifacts;
119
- `cairn mcp-tools list|status|set|reset` applies least-authority discovery
120
- profiles; `cairn pack` validates, installs, pins, updates, and approves
121
- immutable external context;
122
- `cairn eval validate|run|ablate|report|prune|delete` coordinates explicit
123
- local two-pass and one-capability-at-a-time measurements;
124
- `cairn skill harvest|list|show|review|propose|evaluate|apply|rollback`
125
- turns recurring hindsight evidence into reviewed, measured, reversible
126
- skill-file improvements;
127
- `cairn graph build|query|status|diff|explain|path` owns the local Graphify
128
- workflow from any project shell without installing Graphify-owned harness
129
- assets; Claude Code, OpenCode, Pi, and Kimi add thin `/graphify` wrappers;
130
- `cairn notes distill|search-error|promote|doctor` compiles and searches
131
- default-off local hindsight notes outside the online agent path;
132
- `cairn memory export|import` relocates the durable store between machines
133
- (`export` requires the optional `sqlite3` CLI);
134
- `cairn audit-timer` installs the scheduled memory+wiki audit;
135
- `cairn completion bash|zsh|fish` generates shell completion definitions; and
136
- `cairn sync-pi` installs the native Pi memory and trajectory extensions plus graph prompt;
137
- `cairn sync-kimi` installs the Kimi graph Skill;
138
- `cairn uninstall` reverses the install (backup-first, revertible).
139
- - **`templates/`** — project scaffolding (generic launchers, env) plus the
140
- derived-knowledge layer (wiki, alignment, graph, security, planning).
141
- - **`scripts/`** — asset-sync and maintenance utilities.
142
-
143
- ## Related projects
144
-
145
- - **[token-miser](https://github.com/cairnkeep/token-miser)** — a public
146
- cairnkeep-org sibling that owns context exploration and request routing;
147
- cairnkeep's `context_explore` and `route_check` tools are thin delegates
148
- to it.
149
-
150
- ## Optional companion tools
151
-
152
- cairnkeep runs standalone — none of the tools below are required. Its memory
153
- server, `cairn bootstrap`, and derived-knowledge features work with none of
154
- them. These are the accelerators the author pairs cairnkeep with; each is opt-in.
45
+ Select Codex CLI in the harness checklist for this route. Review
46
+ `.codex/config.toml` and accept Codex's project-trust prompt on first use.
47
+ Automation can supply every choice explicitly; the quickstart documents that
48
+ deterministic form.
155
49
 
156
- | Tool | What it adds | How it plugs in |
157
- |------|--------------|-----------------|
158
- | [lean-ctx](https://github.com/yvgude/lean-ctx) | Compressed reads/searches/shell/dir-maps — large token savings on exploration | Register as an MCP server in your harness |
159
- | [token-miser](https://github.com/cairnkeep/token-miser) | Model routing (`route_check`) + codebase mapping (`context_explore`) | Already integrated, env-gated: `CAIRN_ROUTE_ENDPOINT` / `CAIRN_EXPLORE_BINARY` |
160
- | [rtk](https://github.com/rtk-ai/rtk) | "Rust Token Killer": token-reduced proxy for git/npm/cargo output | Shell-level, no wiring needed |
50
+ See the [quickstart](docs/quickstart.md) for Claude Code, the first
51
+ remember/recall cycle, recovery, and setup ownership. See
52
+ [harness compatibility](docs/harness-compatibility.md) for the exact surface
53
+ supported by each client.
161
54
 
162
- ## Setup
163
-
164
- A working workflow needs three things: the memory server registered, the
165
- operating layer installed into your harness, and a configured project. `cairn
166
- setup` is the recommended guided entry point; `cairn bootstrap` remains the
167
- deterministic compatibility primitive for established scripts. Project setup
168
- reports but never performs machine-level sync. The full ordered walkthrough is
169
- in **[the quickstart](docs/quickstart.md)**; the complete operator reference is
170
- in **[docs/operating.md](docs/operating.md)**.
171
-
172
- This setup is local by default: the registered stdio server stores memory on
173
- the user's computer. Cairnkeep never discovers or selects a remote host.
174
- Remote HTTP storage requires an explicit server deployment and client URL; see
175
- **[Memory storage and deployment](docs/storage.md)** before enabling it.
176
-
177
- The short version for Claude Code:
178
-
179
- ```bash
180
- # 1. Install cairnkeep and register the memory server (server name: cairn-memory)
181
- npm install -g @cairnkeep/cli
182
- claude mcp add cairn-memory -s user -- cairn memory-server
183
-
184
- # 2. Install the operating layer (commands, agents, hooks, scaffold templates)
185
- cairn sync --apply # add --live-root <proj>/.claude to scope it
186
-
187
- # 3. Configure a project deterministically
188
- cairn setup /path/to/project --git init --harness claude --memory local --yes
189
- cp /path/to/project/.ai/env.example /path/to/project/.ai/.env # then edit
190
-
191
- # 4. Launch (and, optionally, check the wiring first)
192
- cd /path/to/project && cairn doctor
193
- ./.ai/start-claude.sh
194
- ```
195
-
196
- After setup, the basic workflow is intentionally small:
197
-
198
- ```text
199
- > /remember Use transactional migrations for schema changes
200
- Stored as patterns/transactional-migrations.
201
-
202
- > /recall transactional migrations
203
- patterns/transactional-migrations: Use transactional migrations for schema changes
204
- ```
205
-
206
- The exact command rendering depends on the client. Any MCP client can call
55
+ The core loop is intentionally small: store a concise, verified project fact,
56
+ close the session, and retrieve it when a later task needs it. Claude Code and
57
+ OpenCode expose `/remember` and `/recall`; any compatible MCP client can use
207
58
  `memory_write` and `memory_search` directly.
208
59
 
209
- Setup also installs a balanced `.ai/playbooks.json` policy and an ownership-safe
210
- managed block in `AGENTS.md`. The block directs compatible agents to make one
211
- task-derived, project-scoped memory search for nontrivial work involving prior
212
- decisions, conventions, constraints, or failures. Results are locators, not
213
- authority; referenced repository sources must be verified, and memory is never
214
- promoted automatically. Agents can evaluate the playbook at task boundaries:
60
+ ## For coding agents
215
61
 
216
- ```bash
217
- cairn playbook check start --complexity standard --familiarity mixed
218
- cairn playbook check finish --changed src/example.ts --completed verify.tests --enforce
219
- ```
62
+ Setup installs a managed project instruction block with a deliberately small
63
+ protocol:
220
64
 
221
- The result selects only existing Cairnkeep actions. It never runs them, enables
222
- a disabled capability, grants approval, or promotes memory automatically. Use
223
- `cairn playbook status`, `set minimal|balanced|strict`, and `enable|disable` to
224
- inspect or customize the project policy.
65
+ 1. For a nontrivial task that may depend on prior project knowledge, make one
66
+ task-derived, project-scoped `memory_search` the first tool or command.
67
+ 2. Treat results as locators, not truth; verify the maintained repository
68
+ sources they reference.
69
+ 3. Continue with normal repository inspection if memory is unavailable or has
70
+ no relevant result.
71
+ 4. Never write, supersede, or approve durable memory unless the user or a
72
+ reviewed workflow explicitly requests it.
225
73
 
226
- For Codex CLI, `cairn setup --harness codex --memory local` writes the
227
- project-scoped `.codex/config.toml` entry and both POSIX and native Windows
228
- launchers. Review the configuration and trust the project before launching.
229
- Existing operator-owned `.codex/config.toml` files are never overwritten; a
230
- reported `skipped` file must be merged by the operator and checked with
231
- `cairn doctor`.
74
+ Cairnkeep playbooks can recommend or require existing review, verification,
75
+ security, documentation, and learning steps. They do not run those steps,
76
+ activate skills, enable capabilities, or authorize destructive work.
232
77
 
233
- For Kimi Code, bootstrap supplies a launcher and Kimi reads the repository's
234
- MCP configuration. A local stdio entry uses `cairn memory-server`. Remote Kimi
235
- configuration requires a literal URL and supports a token reference through
236
- `bearerTokenEnvVar`; it does not expand `${VAR}` in the URL. See
237
- [Harness compatibility](docs/harness-compatibility.md#kimi-code).
78
+ Read [Cairnkeep for coding agents](docs/agents.md) for the full contract,
79
+ authority model, harness behavior, and graceful fallback.
238
80
 
239
- Install Kimi's thin graph Skill separately with `cairn sync-kimi --apply`.
240
- It registers `/graphify` (also `/skill:graphify`) and delegates every supported
241
- operation exclusively to `cairn graph`.
81
+ ## Trust boundary
242
82
 
243
- For Qwen Code, use project `.qwen/settings.json`: local stdio launches
244
- `cairn memory-server`, while remote HTTP uses `httpUrl` and environment-expanded
245
- headers. Review and approve project MCP configuration with
246
- `qwen mcp approve cairn-memory`, then launch with `./.ai/start-qwen.sh`. See
247
- [Harness compatibility](docs/harness-compatibility.md#qwen-code).
83
+ Cairnkeep is not a hosted agent, telemetry service, or automatic remote
84
+ knowledge collector. Memory is durable context, not source-of-truth
85
+ documentation. Configured Claude Code and OpenCode hooks can derive local
86
+ memory candidates; durable promotion and every networked or sensitive capture
87
+ path remain separately controlled. Ordinary uninstall retains durable data
88
+ unless an explicit purge is requested.
248
89
 
249
- For Pi, select Pi during project setup, explicitly install/check its machine
250
- assets, run doctor, and use the generated launcher:
90
+ Start with [Privacy and data flow](docs/privacy-and-data-flow.md) and
91
+ [Memory storage and deployment](docs/storage.md) before enabling remote HTTP,
92
+ embeddings, trajectories, artifacts, work evidence, or context packs.
251
93
 
252
- ```bash
253
- cairn sync-pi --apply
254
- cairn sync-pi --check
255
- cairn setup /path/to/project --git init --harness pi --memory local --yes
256
- cd /path/to/project && cairn doctor && ./.ai/start-pi.sh
257
- ```
258
-
259
- This installs the maintained local stdio memory extension, trajectory capture,
260
- and the thin `/graphify` prompt. The memory extension discovers the effective
261
- server tool catalog and preserves annotations in trusted result details; Pi's
262
- public API has no native annotations field. It adds tools only—no prompt runs,
263
- skill activation, autonomous loop, or remote access. Pi 0.84.1 is the minimum
264
- validated version; v2.11 also passed the registry-current Pi release and the
265
- documented Node, Bash, and native Windows matrix.
266
-
267
- Preview removal before confirming it. Uninstall backs up every managed file it
268
- will change and prints the generated revert command; durable memory and context
269
- packs remain unless their explicit purge flags are supplied:
270
-
271
- ```bash
272
- cairn uninstall --dry-run /path/to/project
273
- cairn uninstall --yes /path/to/project
274
- ```
94
+ ## Documentation
275
95
 
276
- If setup-owned project assets drift, rerun the exact `cairn setup ... --yes`
277
- recovery command reported by `cairn doctor`. For Pi machine-asset drift, run
278
- `cairn sync-pi --apply`, then `cairn sync-pi --check` and `cairn doctor`.
96
+ The [documentation hub](docs/README.md) is the index for setup, agents,
97
+ operations, optional features, deployment, learning paths, and contributor
98
+ guides. In particular:
279
99
 
280
- Closed trajectories can be compiled into local hindsight notes without a model
281
- or embedding service. Capture and distillation are separate opt-ins:
282
-
283
- ```bash
284
- export CAIRN_TRAJECTORY_CAPTURE=1 # affects future closed sessions
285
- export CAIRN_NOTE_DISTILLATION=1
286
- cairn notes distill --project /path/to/project --json
287
- printf '%s\n' 'TypeError: example' | cairn notes search-error --project /path/to/project --json
288
- ```
289
-
290
- Notes keep deterministic failure, resolution, abandonment, and recurrence
291
- history under `~/.cairnkeep/notes/`. Shared promotion is never automatic: it
292
- requires compatible evidence from two distinct projects and an explicit
293
- `cairn notes promote NOTE-ID --with NOTE-ID --confirm`. See the
294
- [operating guide](docs/operating.md#hindsight-notes-opt-in) before enabling
295
- optional model enrichment.
296
-
297
- Prefer working from a clone? Build the server with `cd mcp-memory-server && npm
298
- install && npm run build`, then use `scripts/sync-claude-assets.sh` and
299
- `bin/cairn` in place of the installed `cairn`.
300
-
301
- Step 2 is easy to miss and load-bearing: without it the memory server is
302
- registered but none of the `/remember`, `/recall`, `/wiki-*`, `/security-audit`,
303
- or `/repo-review` commands (and no memory hooks) exist. OpenCode uses the
304
- `sync-opencode-*.sh` scripts instead — see the operating guide.
305
-
306
- The launchers load `.ai/.env` and start the harness in the repo root. They stay
307
- deliberately minimal — provider/profile specifics belong in your own wrapper,
308
- which plugs in through the launcher seams below.
309
-
310
- **Wrapper seams.** The generic launchers are no-ops beyond loading `.ai/.env`
311
- unless a wrapper opts in:
312
-
313
- - **`.ai/pre-launch.sh`** — sourced after `.env`, before the harness starts. May
314
- export env (e.g. a provider base URL) or abort the launch by returning
315
- non-zero. This is where credential refresh / connectivity setup lives.
316
- - **`CAIRN_EXTRA_SETTINGS`** — path to a settings file layered onto the harness
317
- (`--settings` for Claude Code, `OPENCODE_CONFIG` for OpenCode). Kimi, Qwen,
318
- and Pi do not interpret this variable in their generic launchers.
319
- Process env still wins, so an inline value beats the profile.
320
- - **`.ai/post-exit.sh`** — sourced after the harness exits, with
321
- `CAIRN_EXIT_STATUS` set to its exit code.
322
-
323
- **Contributor mode.** Working on a repo you don't own? `cairn bootstrap
324
- --untracked /path/to/project` additionally writes the scaffolded paths
325
- (`.ai/`, `.planning/`, `.agentfs/`) into the repo's `.git/info/exclude`, so the workflow
326
- files stay purely local: nothing to commit or push, invisible to every other
327
- contributor, and no edit to the shared `.gitignore`. The trade-off is that
328
- untracked planning state lives only on that clone — deleting the clone
329
- deletes it. To move the durable memory itself between machines, use
330
- `cairn memory export` / `cairn memory import`.
331
-
332
- ## Configuration
333
-
334
- The memory server and collaboration commands are configured entirely through
335
- `.ai/.env` (any OpenAI-compatible API for extraction and embedding-ranked
336
- search):
337
-
338
- | Variable | Purpose |
339
- |---|---|
340
- | `CAIRN_LLM_API_KEY` | API key for the extraction / embeddings endpoint |
341
- | `CAIRN_LLM_API_URL` | Base URL of the OpenAI-compatible endpoint |
342
- | `CAIRN_LLM_EXTRACTION_MODEL` | Chat model used for memory extraction |
343
- | `CAIRN_MEMORY_EMBEDDING_URL` | Embeddings endpoint (falls back to `CAIRN_LLM_API_URL`) |
344
- | `CAIRN_MEMORY_EMBEDDING_MODEL` | Embedding model name (required for semantic search) |
345
- | `CAIRN_MEMORY_EMBEDDING_TIMEOUT_MS` | Embedding request timeout before substring fallback (default `15000`) |
346
- | `CAIRN_AGENTFS_BASE_DIR` | Base dir for global memory scopes (default `~/.cairnkeep`) |
347
- | `CAIRN_MCP_TOOL_PROFILE` | Process override for MCP exposure: `full`, `read-only`, or `custom` |
348
- | `CAIRN_MCP_ALLOWED_TOOLS` | Comma-separated exact allowlist required by a custom process profile |
349
- | `CAIRN_CONTEXT_PACKS` | Opt in to local context-pack list/search/read/related tools (default off) |
350
- | `CAIRN_CONTEXT_PACK_HTTP` | Separately consent to context-pack tools over authenticated HTTP (default off) |
351
- | `CAIRN_PACK_BASE_DIR` | Immutable pack objects, source records, pointers, and retrieval cache (default `~/.cairnkeep/packs`) |
352
- | `CAIRN_PLAYBOOK_PROFILE` | Process-only playbook profile override: `minimal`, `balanced`, or `strict` (project default: `balanced`) |
353
- | `CAIRN_PLAYBOOK_ACTOR` | Optional local receipt label; caller-supplied and unauthenticated in v2.15 |
354
- | `CAIRN_PLAYBOOK_ACTOR_KIND` | Optional local actor kind: `user`, `agent`, or `service` |
355
- | `CAIRN_PLAYBOOK_SESSION` | Optional bounded session label used by playbook decisions and receipts |
356
- | `CAIRN_TRAJECTORY_CAPTURE` | Opt in to local structured session capture (`1`, `true`, `yes`, or `on`; default off) |
357
- | `CAIRN_TRAJECTORY_SESSION_MAX_BYTES` | Maximum serialized bytes per captured session (default `5242880`, 5 MiB) |
358
- | `CAIRN_TRAJECTORY_STORE_MAX_BYTES` | Maximum logical bytes across local trajectories (default `268435456`, 256 MiB) |
359
- | `CAIRN_TRAJECTORY_RETENTION_DAYS` | Retain captured sessions for this many days (default `30`) |
360
- | `CAIRN_TRAJECTORY_REDACTION_FILE` | Optional project-contained redaction config (default `.ai/trajectory-redaction.json` when present) |
361
- | `CAIRN_REDACTION_FILE` | Optional project-contained redaction config shared by trajectories and artifacts (falls back to `CAIRN_TRAJECTORY_REDACTION_FILE`) |
362
- | `CAIRN_WORK_EVIDENCE` | Capture bounded Git state around generated harness launches (off by default) |
363
- | `CAIRN_WORK_EVIDENCE_PATCH` | Request an optional redacted patch artifact (off by default; also requires `CAIRN_ARTIFACT_STORE`) |
364
- | `CAIRN_WORK_EVIDENCE_RETENTION_DAYS` | Work-evidence retention (default `30`; `0` disables age pruning) |
365
- | `CAIRN_WORK_EVIDENCE_STORE_MAX_BYTES` | Project-local work-evidence metadata budget (default `67108864`, 64 MiB) |
366
- | `CAIRN_WORK_EVIDENCE_MAX_TOUCHED_PATHS` | Maximum touched-path labels per record (default and hard maximum `4096`) |
367
- | `CAIRN_WORK_EVIDENCE_PATCH_MAX_BYTES` | Maximum optional patch bytes (default `1048576`, 1 MiB; the artifact cap can lower it) |
368
- | `CAIRN_COMPACTION_CAPTURE` | Opt in to local harness-produced compaction capture and fresh-session recovery (off by default) |
369
- | `CAIRN_ARTIFACT_STORE` | Expose four local stdio artifact tools (off by default; independent of compaction capture) |
370
- | `CAIRN_ARTIFACT_HTTP` | Separately consent to artifact tools over authenticated HTTP (off by default; also requires `CAIRN_ARTIFACT_STORE`) |
371
- | `CAIRN_ARTIFACT_MAX_BYTES` | Maximum stored bytes per artifact (default `1048576`, 1 MiB) |
372
- | `CAIRN_ARTIFACT_SESSION_MAX_BYTES` | Maximum logical bytes per artifact session (default `16777216`, 16 MiB) |
373
- | `CAIRN_ARTIFACT_STORE_MAX_BYTES` | Maximum logical bytes in one artifact store (default `268435456`, 256 MiB) |
374
- | `CAIRN_ARTIFACT_RETENTION_DAYS` | Artifact age retention (default `30`) |
375
- | `CAIRN_COMPACTION_MAX_REVISIONS` | Retained compaction revisions per session (default `8`) |
376
- | `CAIRN_ARTIFACT_GENERATED_FILE_SNAPSHOT_MAX_BYTES` | Generated-file inline snapshot cap (default `262144`, 256 KiB; lower if the artifact cap is lower) |
377
- | `CAIRN_NOTE_DISTILLATION` | Opt in to one-shot/scheduled local note distillation and lookup (default off) |
378
- | `CAIRN_NOTE_ENRICHMENT` | Separately opt in to remote/local prose enrichment; never implied by credentials (default off) |
379
- | `CAIRN_NOTE_ENRICHMENT_MODEL` | Explicit chat model for optional note enrichment (no default) |
380
- | `CAIRN_NOTE_ENRICHMENT_TIMEOUT_MS` | Optional enrichment timeout (default `15000`) |
381
- | `CAIRN_TYPED_MEMORY_NODES` | Opt in to typed metadata, filters, logical note address spaces, and `memory_import` (default off; restart the server after changing) |
382
- | `CAIRN_CAPABILITY_CONTRACT` | Opt in to the managed eight-capability contract (default off) |
383
- | `CAIRN_CAPABILITY_LOGGING` | Override payload-free local callback logging (`1`/`0`; default off) |
384
- | `CAIRN_CAPABILITY_MEMORY_WRITE` | Override `memory.write` for this process |
385
- | `CAIRN_CAPABILITY_MEMORY_SEARCH` | Override `memory.search` for this process |
386
- | `CAIRN_CAPABILITY_NOTES_DISTILL` | Override `notes.distill` for this process |
387
- | `CAIRN_CAPABILITY_WIKI` | Override `wiki` for this process |
388
- | `CAIRN_CAPABILITY_GRAPH` | Override `graph` for this process |
389
- | `CAIRN_CAPABILITY_SECURITY_AUDIT` | Override `security.audit` for this process |
390
- | `CAIRN_CAPABILITY_ROUTE_CHECK` | Override `route.check` for this process |
391
- | `CAIRN_CAPABILITY_CONTEXT_EXPLORE` | Override `context.explore` for this process |
392
- | `CAIRN_EVAL` | Opt in to the local evaluation coordinator (default off; does not select a harness, model, endpoint, credential, or network) |
393
- | `CAIRN_GIT_PROVIDER` | Git host for collaboration commands: `github`\|`gitlab`\|`codeberg`\|`forgejo`\|`none` ([docs/git-providers.md](docs/git-providers.md)) |
394
- | `CAIRN_ROUTE_ENDPOINT` | Base URL of an already-running token-miser routing/tiering proxy (unset → `route_check` is inert) |
395
- | `CAIRN_GRAPHIFY_BINARY` | Optional Graphify command/path override (default `graphify` from `PATH`; JavaScript helpers run through Node) |
396
- | `CAIRN_EXPLORE_BINARY` | Absolute path to the `token_miser` binary used by `context_explore` (unset → the tool throws) |
397
- | `CAIRN_EXPLORE_REPO_ROOT` | Default repo root for `context_explore` when no per-call `repo_root` is given |
398
- | `CAIRN_EXTRA_SETTINGS` | Optional settings/config file the launcher layers onto the harness (wrapper seam) |
399
- | `CAIRN_ANYTHINGLLM_SYNC_SCRIPT` | Override path to the domain-knowledge sync script (when the integration lives outside the repo) |
400
- | `CAIRN_ANYTHINGLLM_PROJECTS_FILE` | Override path to the bundled sync script's project configuration |
401
- | `CAIRN_ANYTHINGLLM_STATE_FILE` | Override path to the bundled sync script's incremental state |
402
-
403
- Without an API key, search degrades gracefully to substring matching.
404
- There is no Cairnkeep telemetry. Optional extraction, embeddings, document RAG,
405
- remote memory, and delegated exploration can send content to endpoints you
406
- configure. Review [Privacy and data flow](docs/privacy-and-data-flow.md) before
407
- enabling them.
408
-
409
- ### MCP authority and context packs
410
-
411
- Every tool publishes a stable title and all four MCP annotation hints. Use
412
- `cairn mcp-tools set read-only` for observation-only clients, or an exact custom
413
- allowlist when a workflow needs fewer tools. Process settings override the
414
- strict project file; the default remains `full`. Profiles only remove tools and
415
- cannot bypass capability or feature gates. See
416
- [MCP tool profiles](docs/mcp-tool-profiles.md).
417
-
418
- Context packs are immutable, digest-addressed local document/skill bundles.
419
- They are installed and project-pinned manually; no background Git sync occurs.
420
- With `CAIRN_CONTEXT_PACKS=1`, enabled documents are searchable and their local
421
- links traversable through four read-only MCP tools. Skills remain invisible until their exact file digest is
422
- approved, and are never copied or executed. See
423
- [Immutable context packs](docs/context-packs.md). OKF 0.1/0.2 import and
424
- privacy-reviewed OKF 0.2 export are documented in
425
- [Open Knowledge Format exchange](docs/open-knowledge-format.md).
426
-
427
- ### Managed capability contract (opt-in)
428
-
429
- `CAIRN_CAPABILITY_CONTRACT=1` enables one versioned, typed boundary around the
430
- existing capability owners. The master flag and callback logging are both off
431
- by default. With the master flag unset, MCP registration, installed
432
- Markdown/workflow bytes, commands, processes, configuration reads, logging,
433
- output, and performance remain on the legacy path.
434
-
435
- | Capability ID | Kind | Existing owner | Compatibility default | Process override |
436
- |---|---|---|---:|---|
437
- | `memory.write` | MCP tool | `memory_write` | on | `CAIRN_CAPABILITY_MEMORY_WRITE` |
438
- | `memory.search` | MCP tool | `memory_search` | on | `CAIRN_CAPABILITY_MEMORY_SEARCH` |
439
- | `notes.distill` | offline job | note distillation CLI/timer | off | `CAIRN_CAPABILITY_NOTES_DISTILL` |
440
- | `wiki` | operating workflow | installed wiki commands/workflows | on | `CAIRN_CAPABILITY_WIKI` |
441
- | `graph` | operating workflow | installed graph commands | inherited from `graphify.enabled`, otherwise off | `CAIRN_CAPABILITY_GRAPH` |
442
- | `security.audit` | operating workflow | installed security commands/workflows | on | `CAIRN_CAPABILITY_SECURITY_AUDIT` |
443
- | `route.check` | MCP tool | existing token-miser routing delegate | on | `CAIRN_CAPABILITY_ROUTE_CHECK` |
444
- | `context.explore` | MCP tool | existing token-miser exploration delegate | on | `CAIRN_CAPABILITY_CONTEXT_EXPLORE` |
445
-
446
- Manage project overrides in `.ai/capabilities.json` through the CLI rather than
447
- editing JSON:
448
-
449
- ```bash
450
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities list
451
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities status --json
452
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities disable context.explore
453
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities reset context.explore
454
- CAIRN_CAPABILITY_CONTRACT=1 cairn capabilities logging enable
455
- ```
456
-
457
- Process overrides take precedence over project values, which take precedence
458
- over compatibility defaults. `reset` removes an explicit override and restores
459
- the inherited state; it does not mean enabled. Changes to the four MCP
460
- capabilities (`memory.write`, `memory.search`, `route.check`, and
461
- `context.explore`) require a fresh memory-server start and disabled tools are
462
- omitted from `tools/list`. Offline and operating workflows resolve state at
463
- each invocation. Enabling the master does not enable `notes.distill` or graph
464
- when their compatibility inputs remain off.
465
-
466
- Callback records are local, payload-free operating evidence, not evaluation
467
- results or telemetry. They require the contract, callback logging, and local
468
- trajectory capture to be enabled together. Cairnkeep makes no capability gain,
469
- memory-quality, or efficiency claim from this instrumentation; Phase 19 must
470
- first create an explicit all-enabled baseline and measure one-disabled states.
471
- See the [operating guide](docs/operating.md#managed-capability-contract-opt-in),
472
- [storage contract](docs/storage.md#capability-callback-storage), and
473
- [privacy flow](docs/privacy-and-data-flow.md#capability-callback-flow).
474
-
475
- ### Evaluation harness (opt-in, measurement only)
476
-
477
- `CAIRN_EVAL=1` enables `cairn eval` for a committed schema-v1 task set and an
478
- explicit operator-owned adapter program. `validate` resolves immutable inputs,
479
- limits, commands, digests, output containment, and a deterministic serial
480
- schedule without invoking the adapter. `run` measures from-scratch Run 1 versus
481
- a fresh Run 2 that can see only its own task's immutable note snapshot.
482
- `ablate` measures an explicit all-eight-capabilities-on baseline against one
483
- exactly-one-disabled treatment, with both passes in both arms. Execution prints
484
- the invocation estimate and requires `--yes`; there is no retry, inference,
485
- provider, endpoint, credential, model, or network default.
486
-
487
- The canonical local JSON report records optional reported turns/tokens/cost,
488
- independently verified pass state, full and note-eligible populations,
489
- missingness, paired deltas, capability/notes/revision digests, and seeded
490
- bootstrap uncertainty. Turns compare only under exact matching turn-semantics
491
- compatibility IDs; token totals are never inferred and unknown verifier results
492
- are never counted as pass or fail. Reports describe estimates and
493
- inconclusive/small-sample conditions; they do not claim causality,
494
- significance, quality change, or efficiency change.
495
-
496
- The bundled fake task set and adapter are deterministic, offline framework
497
- fixtures. They cannot support a Cairnkeep performance statement. Any future
498
- efficiency statement requires a separate committed `live-evaluation` artifact
499
- whose source, task-set, report, schema, note-snapshot, missingness, runtime, and
500
- claim anchors all pass `scripts/verify-phase19-runtime-evidence.mjs`. No such
501
- live claim or evidence artifact is shipped here, and external paper calibration
502
- is neither a Cairnkeep result nor an acceptance target.
503
-
504
- Reports and note snapshots stay under
505
- `.agentfs/eval/experiments/<experiment-id>/`; default uninstall retains them,
506
- while explicit purge is backup-first and revertible. Cancellation retains an
507
- inspectable partial report. POSIX process-group cleanup and Windows descendant-
508
- tree cleanup through `taskkill.exe /T` are tested by their platform contracts. See the
509
- [operating guide](docs/operating.md#evaluation-harness-opt-in),
510
- [storage contract](docs/storage.md#evaluation-report-and-note-snapshot-storage),
511
- and [privacy flow](docs/privacy-and-data-flow.md#evaluation-adapter-and-report-flow).
512
-
513
- ### Validated skill improvement (opt-in)
514
-
515
- `cairn skill` promotes repeated, resolved hindsight evidence through a guarded
516
- lifecycle: local harvest, explicit evidence review, bounded proposal generation,
517
- separate exploration and confirmation evaluations, exact-digest application,
518
- and backup-first rollback. Cairnkeep never rewrites a live skill during proposal
519
- or evaluation, never sends evidence to the proposal adapter before approval,
520
- and never applies a candidate automatically.
521
-
522
- Proposal generation uses an explicit strict adapter configuration with an
523
- environment allowlist. Evaluation remains disabled unless `CAIRN_EVAL=1`, uses
524
- the existing isolated worktree runner and independent verifier, and requires
525
- disjoint committed task sets bound to one immutable source revision. A
526
- candidate is eligible only when both stages meet the configured improvement
527
- floor with no regression or unknown pair. See the
528
- [validated skill guide](docs/skill-improvement.md),
529
- [storage contract](docs/storage.md#validated-skill-storage), and
530
- [privacy flow](docs/privacy-and-data-flow.md#validated-skill-improvement-flow).
531
-
532
- ### Typed memory nodes and structured import (opt-in)
533
-
534
- `CAIRN_TYPED_MEMORY_NODES=1` adds schema-v1 `node_type`, canonical `tags`,
535
- `address_space`, hard list/search filters (`node_types`, `tags_all`,
536
- `tags_any`), and exactly one new MCP tool: `memory_import`. The flag is read
537
- when each server/session is created, so restart after changing it. Unset keeps
538
- the existing 14 tools, schemas, response roots, raw values, files, processes,
539
- network behavior, and output unchanged. It adds no read/edit/update/delete
540
- aliases; `memory_supersede` remains the sole edit operation.
541
-
542
- Core types are `memory`, `knowledge`, `hindsight`, `shared`, and `provenance`;
543
- extensions use a namespaced form such as `team:runbook`. Tags are ASCII
544
- lowercase, with whitespace and underscores normalized to hyphens, deduplicated,
545
- and sorted. Filters are applied before ranking. Exact key/tag/type hits precede
546
- semantic results; without a working configured embedding endpoint, search uses
547
- stable local substring matching.
548
-
549
- `memory_import` accepts one inline schema-v1 batch for one concrete scope and
550
- one `memory`, `project-notes`, or `shared-notes` address. It supports 1–256
551
- unique relative keys, values up to 256 KiB each and 5 MiB total, optional
552
- `import_id`, `dry_run`, and `conflict_policy: reject|supersede`. Results contain
553
- only digests, counts, keys, and actions—never supplied values. The default
554
- reject policy cannot overwrite; explicit supersede preserves typed history.
555
- Note addresses require `scope: project` and logical keys, never filesystem
556
- paths. See the [operating guide](docs/operating.md#typed-memory-nodes-and-note-address-spaces-opt-in).
557
-
558
- ### Git-linked work evidence (opt-in)
559
-
560
- `CAIRN_WORK_EVIDENCE=1` makes generated Claude Code, OpenCode, Pi, Kimi, Qwen
561
- and Codex launchers record bounded start/end Git state and links to exact local
562
- trajectories, artifacts and reviewed-memory writes. It records no prompts,
563
- keystrokes or reasoning, and harness launch remains fail-open when Git or
564
- capture is unavailable. Inspect it with `cairn evidence list|show|delete|prune|doctor`.
565
- Optional patch capture requires both `CAIRN_WORK_EVIDENCE_PATCH=1` and
566
- `CAIRN_ARTIFACT_STORE=1`; Cairnkeep never applies or restores a patch. See the
567
- [work-evidence guide](docs/work-evidence.md).
568
-
569
- ### Compaction continuity and artifacts (opt-in)
570
-
571
- `CAIRN_COMPACTION_CAPTURE=1` captures only harness-produced compaction summaries
572
- from the pinned Claude Code `PostCompact` 2.1.219 and 2.1.220 payloads and
573
- OpenCode `session.compacted` 1.17.20 seam. It stores redacted immutable revisions locally and injects the latest
574
- valid structured goals, decisions, TODOs, and critical errors when a session
575
- starts. A resumed session is preferred; a fresh session falls back to the
576
- newest valid project summary and marks stale context for validation. The raw
577
- redacted summary is available only through an explicit read. Cairnkeep never
578
- generates or triggers compaction.
579
-
580
- `CAIRN_ARTIFACT_STORE=1` independently exposes exactly four stdio MCP tools:
581
- `artifact_write`, `artifact_read`, `artifact_list`, and `artifact_delete`.
582
- The initial kinds are exactly `compaction_summary`, `diff`, `test_output`, and
583
- `generated_file`. Generated-file paths are labels only; the server never reads
584
- them. Operators can inspect retained local data whether or not MCP writes are
585
- currently enabled:
586
-
587
- ```bash
588
- cairn artifact list --kind compaction_summary --json
589
- cairn artifact show ARTIFACT-ID --json
590
- cairn artifact delete ARTIFACT-ID --dry-run --json
591
- cairn artifact prune --dry-run --include-protected --json
592
- ```
100
+ - [Quickstart](docs/quickstart.md)
101
+ - [For coding agents](docs/agents.md)
102
+ - [Operating guide](docs/operating.md)
103
+ - [Harness compatibility](docs/harness-compatibility.md)
104
+ - [Privacy and data flow](docs/privacy-and-data-flow.md)
105
+ - [Guided learning paths and video scripts](docs/learning/README.md)
593
106
 
594
- Both capabilities are default-off, local, and require no key, model, endpoint,
595
- telemetry, or network. Remote tools require double consent:
596
- `CAIRN_ARTIFACT_STORE=1` plus `CAIRN_ARTIFACT_HTTP=1`, as well as the existing
597
- bearer, `Host`, and validated `X-Cairn-Project` controls. Artifact HTTP never
598
- exposes trajectory data. See the [operating guide](docs/operating.md#compaction-continuity-and-artifacts-opt-in),
599
- [storage contract](docs/storage.md#artifact-storage), and
600
- [privacy flows](docs/privacy-and-data-flow.md#compaction-and-artifact-flows).
107
+ The repository supports Linux, macOS, native Windows x64, WSL, Node.js 22/24/26,
108
+ and real Bash 3.2 within the boundaries documented in the compatibility guides.
601
109
 
602
- ## More
110
+ ## Contributing and support
603
111
 
604
- - **Guided learning paths and video scripts** — [docs/learning/README.md](docs/learning/README.md)
605
- - **Optional document RAG** (`domain_knowledge_*` via AnythingLLM) — [docs/domain-knowledge.md](docs/domain-knowledge.md)
606
- - **Building a private overlay** (wrap cairnkeep for your org/provider) — [docs/building-an-overlay.md](docs/building-an-overlay.md)
607
- - **Managed overlay distributions** (wrapper CLI, policy lock, private registry, rollback) — [docs/overlay-distributions.md](docs/overlay-distributions.md)
608
- - **Full operating guide** — [docs/operating.md](docs/operating.md)
609
- - **Memory storage and deployment** — [docs/storage.md](docs/storage.md)
610
- - **Podman and OCI containers** — [docs/containers.md](docs/containers.md)
611
- - **Privacy and data flow** — [docs/privacy-and-data-flow.md](docs/privacy-and-data-flow.md)
612
- - **MCP tool profiles** — [docs/mcp-tool-profiles.md](docs/mcp-tool-profiles.md)
613
- - **Immutable context packs** — [docs/context-packs.md](docs/context-packs.md)
614
- - **Open Knowledge Format exchange** — [docs/open-knowledge-format.md](docs/open-knowledge-format.md)
615
- - **Validated skill improvement** — [docs/skill-improvement.md](docs/skill-improvement.md)
616
- - **Git providers** — [docs/git-providers.md](docs/git-providers.md)
617
- - **Support** — [SUPPORT.md](SUPPORT.md)
618
- - **Contributing** — [CONTRIBUTING.md](CONTRIBUTING.md)
619
- - **Security policy** — [SECURITY.md](SECURITY.md)
112
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development and pull-request
113
+ guidelines, [SUPPORT.md](SUPPORT.md) for help, and [SECURITY.md](SECURITY.md) for
114
+ private vulnerability reporting.
620
115
 
621
116
  ## License
622
117