geneseed 3.12.0 → 3.14.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.
- package/CHANGELOG.md +160 -0
- package/README.md +2 -2
- package/SHIPPED.md +1 -1
- package/adapters/bob/README.md +1 -1
- package/adapters/claude-code/README.md +1 -1
- package/adapters/openclaude/README.md +1 -1
- package/adapters/opencode/README.md +3 -3
- package/adapters/opencode/plugins/geneseed-learn.js +10 -1
- package/bin/geneseed-cli.mjs +10 -14
- package/bin/geneseed-hook.mjs +22 -15
- package/docs/README.md +41 -22
- package/docs/concepts/agents.md +3 -1
- package/docs/concepts/collaboration.md +3 -1
- package/docs/concepts/exclusions.md +4 -2
- package/docs/concepts/footprint.md +3 -1
- package/docs/concepts/foreman-mode.md +3 -1
- package/docs/concepts/hook-gates.md +61 -0
- package/docs/concepts/hooks.md +8 -56
- package/docs/concepts/host-matrix.md +38 -0
- package/docs/concepts/hosts.md +6 -32
- package/docs/concepts/loop-branch.md +66 -0
- package/docs/concepts/loop-bricks.md +48 -0
- package/docs/concepts/loop-contracts.md +33 -0
- package/docs/concepts/loop-gates.md +30 -0
- package/docs/concepts/loop-notes.md +43 -0
- package/docs/concepts/loop-risk.md +36 -0
- package/docs/concepts/loop-templates.md +50 -0
- package/docs/concepts/loops.md +24 -116
- package/docs/concepts/lsp.md +2 -0
- package/docs/concepts/memory.md +3 -1
- package/docs/concepts/notebook.md +3 -1
- package/docs/concepts/rules.md +4 -2
- package/docs/concepts/skills.md +3 -1
- package/docs/concepts/themes.md +3 -1
- package/docs/extending.md +28 -13
- package/docs/guides/autostart.md +3 -1
- package/docs/guides/choose-your-setup.md +5 -80
- package/docs/guides/headless.md +5 -3
- package/docs/guides/install-agent-md.md +37 -0
- package/docs/guides/install-bob.md +20 -0
- package/docs/guides/install-claude-code.md +22 -0
- package/docs/guides/install-clone.md +34 -0
- package/docs/guides/install-openclaude.md +25 -0
- package/docs/guides/install-opencode.md +35 -0
- package/docs/guides/install-scripted.md +21 -0
- package/docs/guides/install.md +9 -118
- package/docs/guides/loop-finish.md +54 -0
- package/docs/guides/loop-running.md +66 -0
- package/docs/guides/loop-which-template.md +35 -0
- package/docs/guides/mcp-filesystem.md +41 -0
- package/docs/guides/mcp-gitlab.md +66 -0
- package/docs/guides/mcp-markitdown.md +36 -0
- package/docs/guides/mcp.md +8 -137
- package/docs/guides/migrate.md +3 -1
- package/docs/guides/project-context.md +4 -2
- package/docs/guides/read-non-markdown.md +17 -0
- package/docs/guides/run-a-loop.md +64 -0
- package/docs/guides/run-anywhere.md +2 -0
- package/docs/guides/setup-doctrines.md +55 -0
- package/docs/guides/setup-footprint.md +48 -0
- package/docs/guides/uninstall.md +3 -1
- package/docs/guides/upgrade.md +3 -1
- package/docs/guides/verify.md +3 -1
- package/docs/guides/wiki.md +3 -1
- package/docs/guides/worktree.md +3 -1
- package/docs/reference/about.md +3 -1
- package/docs/reference/cli.md +2 -0
- package/docs/reference/env-context.md +40 -0
- package/docs/reference/environment.md +10 -59
- package/docs/reference/glossary.md +3 -1
- package/docs/reference/loop-actions.md +20 -0
- package/docs/reference/opencode-plugins.md +14 -118
- package/docs/reference/plugin-activity.md +20 -0
- package/docs/reference/plugin-context.md +27 -0
- package/docs/reference/plugin-guard.md +27 -0
- package/docs/reference/plugin-learn.md +27 -0
- package/docs/reference/plugin-notify.md +20 -0
- package/docs/reference/plugin-ponytail.md +19 -0
- package/docs/reference/plugin-workflow.md +25 -0
- package/docs/reference/troubleshoot-doctor.md +50 -0
- package/docs/reference/troubleshoot-hooks.md +99 -0
- package/docs/reference/troubleshoot-install.md +108 -0
- package/docs/reference/troubleshoot-tools.md +56 -0
- package/docs/reference/troubleshoot-update.md +23 -0
- package/docs/reference/troubleshoot-web.md +66 -0
- package/docs/reference/troubleshooting.md +13 -337
- package/docs/understand/a-day.md +3 -1
- package/docs/understand/enforced-vs-asked.md +3 -1
- package/docs/understand/harness.md +2 -0
- package/docs/understand/machine-bob.md +17 -0
- package/docs/understand/machine-claude.md +35 -0
- package/docs/understand/machine-opencode.md +36 -0
- package/docs/understand/on-your-machine.md +12 -55
- package/docs/understand/take-it-out.md +13 -0
- package/docs/web-ui.md +35 -15
- package/harness.config.json +1 -1
- package/js/README.md +30 -13
- package/js/build/args.mjs +374 -0
- package/js/build/driver.mjs +137 -553
- package/js/build/emit-claude.mjs +2 -4
- package/js/build/generate.mjs +6 -3
- package/js/build/render.mjs +5 -9
- package/js/build/source.mjs +3 -11
- package/js/cli-table.json +27 -1
- package/js/hosts/hooks-context.mjs +431 -0
- package/js/hosts/hooks-learn.mjs +275 -0
- package/js/hosts/hooks-prims.mjs +108 -0
- package/js/hosts/hooks.mjs +50 -977
- package/js/hosts/hosts.mjs +12 -4
- package/js/hosts/installs.mjs +5 -6
- package/js/hosts/mcp.mjs +13 -49
- package/js/hosts/memory-files.mjs +181 -0
- package/js/hosts/native.mjs +43 -5
- package/js/hosts/settings.mjs +135 -414
- package/js/hosts/shim.mjs +373 -0
- package/js/inspect/checks-authoring.mjs +21 -828
- package/js/inspect/checks-build.mjs +32 -4
- package/js/inspect/checks-constitution.mjs +493 -0
- package/js/inspect/checks-counts.mjs +242 -0
- package/js/inspect/checks-repo.mjs +17 -8
- package/js/inspect/diff.mjs +4 -1
- package/js/inspect/doctor.mjs +2 -2
- package/js/inspect/inventory.mjs +4 -4
- package/js/inspect/scan.mjs +1 -1
- package/js/inspect/status.mjs +1 -1
- package/js/inspect/validate.mjs +48 -35
- package/js/loop/catalog.mjs +17 -4
- package/js/loop/cli.mjs +52 -16
- package/js/loop/graph.mjs +19 -1
- package/js/loop/registry.mjs +191 -0
- package/js/loop/score.mjs +46 -7
- package/js/loop/state.mjs +157 -19
- package/js/maintain/memory.mjs +1 -1
- package/js/maintain/migrate.mjs +18 -30
- package/js/maintain/setup.mjs +1 -1
- package/js/maintain/uninstall.mjs +47 -88
- package/js/ui/cli.mjs +12 -12
- package/js/web/actions.mjs +39 -4
- package/js/web/api.mjs +34 -21
- package/js/web/docs.mjs +87 -78
- package/js/web/routes.mjs +5 -1
- package/package.json +1 -1
- package/src/agents/explorer.md +2 -2
- package/src/agents/researcher.md +3 -3
- package/src/bricks/README.md +3 -1
- package/src/bricks/adr-challenge.md +20 -0
- package/src/bricks/adr-draft.md +15 -0
- package/src/bricks/characterize.md +17 -0
- package/src/bricks/ci-fix.md +2 -1
- package/src/bricks/ci-triage.md +20 -0
- package/src/bricks/compat-check.md +16 -0
- package/src/bricks/done-check.md +16 -0
- package/src/bricks/fitness-define.md +22 -0
- package/src/bricks/flake-check.md +17 -0
- package/src/bricks/flake-repro.md +18 -0
- package/src/bricks/identify.md +6 -3
- package/src/bricks/migration-plan.md +21 -0
- package/src/bricks/mutation-check.md +18 -0
- package/src/bricks/plan.md +6 -6
- package/src/bricks/red-test.md +16 -0
- package/src/bricks/review.md +5 -3
- package/src/bricks/spec.md +18 -0
- package/src/bricks/upgrade-scout.md +16 -0
- package/src/loops/api-endpoint.json +31 -0
- package/src/loops/architecture-decision.json +22 -0
- package/src/loops/bugfix.json +1 -0
- package/src/loops/ci-repair.json +19 -0
- package/src/loops/deps-upgrade.json +29 -0
- package/src/loops/enforce-architecture-rule.json +28 -0
- package/src/loops/feature.json +8 -5
- package/src/loops/fix-flaky-tests.json +30 -0
- package/src/loops/legacy-refactor.json +26 -0
- package/src/loops/legacy-tests.json +29 -0
- package/src/loops/refactor.json +5 -1
- package/src/loops/remove-dead-code.json +30 -0
- package/src/loops/spec-first-feature.json +29 -0
- package/src/loops/tdd.json +25 -0
- package/src/loops/update-contract.json +33 -0
- package/src/skills/brick-forge.md +3 -1
- package/src/skills/bruno-collection-generator.md +3 -3
- package/src/skills/bruno-test-writer.md +3 -3
- package/src/skills/ci-fix.md +3 -3
- package/src/skills/consolidate-memory.md +4 -4
- package/src/skills/council.md +1 -1
- package/src/skills/fresh-eyes.md +1 -1
- package/src/skills/git-archaeology.md +1 -1
- package/src/skills/git-rescue.md +4 -3
- package/src/skills/handoff.md +1 -1
- package/src/skills/herdr.md +1 -1
- package/src/skills/learn-mode.md +2 -2
- package/src/skills/loop.md +22 -10
- package/src/skills/opencode-theme.md +3 -3
- package/src/skills/ponytail.md +1 -1
- package/src/skills/profile.md +3 -4
- package/src/skills/prose.md +2 -3
- package/src/skills/quiz.md +1 -1
- package/src/skills/react-view-transitions/SKILL.md +1 -1
- package/src/skills/react-view-transitions/VENDOR.md +8 -3
- package/src/skills/research.md +3 -3
- package/src/skills/review-response.md +2 -2
- package/src/skills/rule.md +3 -3
- package/src/skills/security-audit.md +4 -4
- package/src/skills/teach.md +1 -1
- package/src/skills/wiki.md +3 -3
- package/src/skills/workflow.md +4 -4
- package/src/skills/worktree.md +2 -2
- package/web/dist/assets/Activity-CjRqZnr-.js +1 -0
- package/web/dist/assets/ActivityDetail-OQTxKBj2.js +1 -0
- package/web/dist/assets/Dashboard-J-xCe_Gk.js +2 -0
- package/web/dist/assets/Docs-CvOZ8akL.js +5 -0
- package/web/dist/assets/{GreenhouseView-C6ibc8IE.js → GreenhouseView-6KDjX8da.js} +1 -1
- package/web/dist/assets/{Installs-DRYjYnxs.js → Installs-MWuhNjSm.js} +2 -2
- package/web/dist/assets/JournalView-C8MrOz2c.js +1 -0
- package/web/dist/assets/Laws-Du0-Zyp2.js +3 -0
- package/web/dist/assets/Library-DOkO0TtB.js +1 -0
- package/web/dist/assets/Loops-Dv_aLByJ.js +2 -0
- package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-X2a3qvOh.js} +14 -14
- package/web/dist/assets/{OperatorHudView-Bs7paWmh.js → OperatorHudView-BPP1dtLz.js} +1 -1
- package/web/dist/assets/{Personal-BY5n4gTw.js → Personal-26VPYkK0.js} +1 -1
- package/web/dist/assets/Tabs-BzKuFskD.js +1 -0
- package/web/dist/assets/{usePoll-O0sJEw1Y.js → activity-Dr7ZMBI3.js} +1 -1
- package/web/dist/assets/{api-CyMRbU2x.js → api-D_ixdyEY.js} +1 -1
- package/web/dist/assets/drawable-zVVDbsyw.js +1 -0
- package/web/dist/assets/index-Ctp-4poP.css +1 -0
- package/web/dist/assets/index-KHt3wE_K.js +2 -0
- package/web/dist/assets/usePoll-DD8VjtSg.js +1 -0
- package/web/dist/index.html +3 -3
- package/web/src/pages/Laws.jsx +0 -1
- package/web/dist/assets/Activity-GaaZWXTY.js +0 -1
- package/web/dist/assets/ActivityDetail-4t7d45Du.js +0 -1
- package/web/dist/assets/Dashboard-CYn7Tp16.js +0 -2
- package/web/dist/assets/Docs-BeFKLg2T.js +0 -5
- package/web/dist/assets/JournalView-1HbU1mfg.js +0 -1
- package/web/dist/assets/Laws-DFoG8JWB.js +0 -3
- package/web/dist/assets/Library-DDjgNwz_.js +0 -1
- package/web/dist/assets/Loops-D9VEoO0F.js +0 -1
- package/web/dist/assets/Tabs-ho-EYD8i.js +0 -1
- package/web/dist/assets/drawable-CLS9drMb.js +0 -1
- package/web/dist/assets/index-CX_hXMi5.css +0 -1
- package/web/dist/assets/index-Cjr7XCA3.js +0 -2
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 3
|
|
4
|
+
title: "Install for OpenCode"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Install"
|
|
7
|
+
description: "The OpenCode install, global (recommended) or per repo."
|
|
8
|
+
---
|
|
9
|
+
The setup wizard runs this for you (see [Install](install.md)). Use the commands directly when you script an install, or when you want a scope the wizard did not offer you.
|
|
10
|
+
|
|
11
|
+
## Global (recommended)
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
geneseed build --emit opencode-global
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This writes into OpenCode's config directory: `$OPENCODE_CONFIG_DIR`, else `$XDG_CONFIG_HOME/opencode`, else `~/.config/opencode` (on Windows too: `C:\Users\<you>\.config\opencode`). The install contains `AGENT.md`, `agents/`, `skills/`, the plugins, the `memory/` store, and a merged `opencode.json` whose `instructions` key points at `AGENT.md`. Every repo you open in OpenCode inherits it. You do not need a per-repo file, because the context plugin finds each repo's docs by itself (see [Project context](project-context.md)).
|
|
18
|
+
|
|
19
|
+
The install is non-destructive. A manifest (`.geneseed-manifest.json`) records the files Geneseed owns. A rebuild replaces and prunes only those files, and never touches your own agents, skills, plugins or memory.
|
|
20
|
+
|
|
21
|
+
## Per repo
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
geneseed build --emit opencode --out /path/to/repo --root /path/to/repo
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This writes the bundle (`AGENT.md`, `agents/`, `skills/`, `memory/`, `notebook/`) and OpenCode's own layer (`opencode.json` and `.opencode/`) into one repository. You can commit them or not. To keep the bundle in a subfolder, point `--out` at the subfolder and keep `--root` on the repo, so instruction paths resolve from the project root:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
geneseed build --emit opencode --out /path/to/repo/Harness --root /path/to/repo
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
**Next:** [Verify it works](verify.md) · [Choose your setup](choose-your-setup.md) · [What lands on your machine](../understand/on-your-machine.md)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 8
|
|
4
|
+
title: "Install without the wizard"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Install"
|
|
7
|
+
description: "The build command to run in a script, a CI job, or a shell with no terminal."
|
|
8
|
+
---
|
|
9
|
+
`setup` needs an interactive terminal. In a script, a CI job, or any shell without one, it stops with exit code 1 and prints the build command to run instead:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
geneseed build --emit opencode-global --theme neutral
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`geneseed build` takes the same flags as the generator `geneseed-build`. `--emit` picks the host and its scope: `files`, `opencode`, `opencode-global`, `claude`, `claude-global`, `bob`, `bob-global`, `openclaude` or `openclaude-global`. A `-global` emit writes into the tool's own config directory. A project emit writes into the repo you name with `--out <repo> --root <repo>`. All the other flags (`--theme`, `--footprint`, `--posture`, `--mode`, `--trust`, `--doctrines`, `--exclude-rules`) are covered in [Choose your setup](choose-your-setup.md) and the two pages after it.
|
|
16
|
+
|
|
17
|
+
To test a build before writing anything, use `geneseed validate` with the same flags. See [Verify](verify.md).
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
**Next:** [Choose your setup](choose-your-setup.md) · [Install](install.md)
|
package/docs/guides/install.md
CHANGED
|
@@ -3,6 +3,8 @@ group: guides
|
|
|
3
3
|
order: 1
|
|
4
4
|
title: "Install"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Install"
|
|
7
|
+
description: "The one-command install, what it needs, and the page for each host."
|
|
6
8
|
---
|
|
7
9
|
Geneseed builds a harness (the rules, agents, skills and hooks your AI coding tool loads; see [What a harness is](../understand/harness.md)) and installs it into the tool you already use. Most people need one command.
|
|
8
10
|
|
|
@@ -26,135 +28,24 @@ This puts three commands on your `PATH`: `geneseed` (the CLI you type), `genesee
|
|
|
26
28
|
|
|
27
29
|
Next: [Verify it works](verify.md). To see what the install just wrote, read [What lands on your machine](../understand/on-your-machine.md).
|
|
28
30
|
|
|
29
|
-
## From a clone
|
|
30
|
-
|
|
31
|
-
Clone the repository when npm is out of reach (for example, a corporate network with no registry access), or when you want to change the harness rather than just use it. A clone needs **git** as well as Node 22.3 or newer. git is what updates the clone.
|
|
32
|
-
|
|
33
|
-
Each OS has a one-step installer at the root of the clone. It checks for Node and git. If one is missing, it names what to install and where to get it, then stops. **It never installs anything itself.** When the checks pass, it runs the setup wizard and offers to open the web console.
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
git clone https://github.com/Arylmera/Geneseed.git
|
|
37
|
-
cd Geneseed
|
|
38
|
-
./install # macOS, Linux, or a POSIX shell on Windows
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
- **macOS**: you can also double-click `install.command` in the Finder. It opens in Terminal.
|
|
42
|
-
- **Windows**: double-click `install.cmd` in Explorer, or run it from cmd or PowerShell. It needs no bash, WSL or PowerShell script.
|
|
43
|
-
|
|
44
|
-
```powershell
|
|
45
|
-
git clone https://github.com/Arylmera/Geneseed.git
|
|
46
|
-
cd Geneseed
|
|
47
|
-
.\install.cmd
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Later, run the launcher in the clone: `./geneseed setup` (Windows: `.\geneseed.cmd setup`) re-runs the wizard, and bare `./geneseed` opens the web console. Both launchers need `node` on `PATH`. If it is not there (some version managers only patch interactive shells), set `GENESEED_NODE` to the absolute path of the Node binary.
|
|
51
|
-
|
|
52
|
-
From a clone, every `geneseed …` command on these pages is `./geneseed …` (Windows: `.\geneseed.cmd …`). To drop the `./`, see [Run geneseed from anywhere](run-anywhere.md).
|
|
53
|
-
|
|
54
31
|
## Prerequisites
|
|
55
32
|
|
|
56
33
|
- **Node 22.3 or newer.** This is the only hard requirement. Geneseed has zero runtime dependencies, and nothing it installs needs a second interpreter.
|
|
57
34
|
- **Your agent tool**: OpenCode (recommended), Claude Code, IBM Bob, OpenClaude, or any tool that reads a root instructions file.
|
|
58
35
|
- **git**, for a clone only. A clone updates itself with `git pull`.
|
|
59
|
-
- *Optional:* a document converter (MarkItDown, Pandoc or Docling) if you want the agent to read PDFs and Office files. See [
|
|
60
|
-
|
|
61
|
-
## Without the wizard
|
|
62
|
-
|
|
63
|
-
`setup` needs an interactive terminal. In a script, a CI job, or any shell without one, it stops with exit code 1 and prints the build command to run instead:
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
geneseed build --emit opencode-global --theme neutral
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
`geneseed build` takes the same flags as the generator `geneseed-build`. `--emit` picks the host and its scope: `files`, `opencode`, `opencode-global`, `claude`, `claude-global`, `bob`, `bob-global`, `openclaude` or `openclaude-global`. A `-global` emit writes into the tool's own config directory. A project emit writes into the repo you name with `--out <repo> --root <repo>`. All the other flags (`--theme`, `--footprint`, `--posture`, `--mode`, `--trust`, `--doctrines`, `--exclude-rules`) are covered in [Choose your setup](choose-your-setup.md).
|
|
70
|
-
|
|
71
|
-
To test a build before writing anything, use `geneseed validate` with the same flags. See [Verify](verify.md).
|
|
36
|
+
- *Optional:* a document converter (MarkItDown, Pandoc or Docling) if you want the agent to read PDFs and Office files. See [Reading non-markdown docs](read-non-markdown.md).
|
|
72
37
|
|
|
73
38
|
## Install paths, one per host
|
|
74
39
|
|
|
75
40
|
The wizard runs one of these for you. Use them directly when you script an install, or when you want a scope the wizard did not offer you.
|
|
76
41
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
This writes into OpenCode's config directory: `$OPENCODE_CONFIG_DIR`, else `$XDG_CONFIG_HOME/opencode`, else `~/.config/opencode` (on Windows too: `C:\Users\<you>\.config\opencode`). The install contains `AGENT.md`, `agents/`, `skills/`, the plugins, the `memory/` store, and a merged `opencode.json` whose `instructions` key points at `AGENT.md`. Every repo you open in OpenCode inherits it. You do not need a per-repo file, because the context plugin finds each repo's docs by itself (see [Project context](project-context.md)).
|
|
84
|
-
|
|
85
|
-
The install is non-destructive. A manifest (`.geneseed-manifest.json`) records the files Geneseed owns. A rebuild replaces and prunes only those files, and never touches your own agents, skills, plugins or memory.
|
|
86
|
-
|
|
87
|
-
### OpenCode, per repo
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
geneseed build --emit opencode --out /path/to/repo --root /path/to/repo
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
This writes the bundle (`AGENT.md`, `agents/`, `skills/`, `memory/`, `notebook/`) and OpenCode's own layer (`opencode.json` and `.opencode/`) into one repository. You can commit them or not. To keep the bundle in a subfolder, point `--out` at the subfolder and keep `--root` on the repo, so instruction paths resolve from the project root:
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
geneseed build --emit opencode --out /path/to/repo/Harness --root /path/to/repo
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Claude Code
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
geneseed build --emit claude-global # ~/.claude, every repo
|
|
103
|
-
geneseed build --emit claude --out /path/to/repo --root /path/to/repo # one repo
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
The install writes `CLAUDE.md`, `agents/`, `skills/`, `memory/` and `notebook/`, plus hooks in Claude Code's `settings.json`. Hooks are commands Claude Code runs around each tool call. They gate risky actions and load project context (see [Hooks](../concepts/hooks.md)). For a project install the hooks go into `.claude/settings.local.json`, which stays out of git because it names a path on your machine.
|
|
107
|
-
|
|
108
|
-
Every hook calls `geneseed-hook <verb>` through one stable file, the **hook shim** at `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim knows where Node and Geneseed live. If you move or replace Geneseed, one rebuild rewrites the shim and every install works again. `GENESEED_HOME` moves the shim's folder.
|
|
109
|
-
|
|
110
|
-
### OpenClaude
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
geneseed build --emit openclaude-global # ~/.openclaude
|
|
114
|
-
geneseed build --emit openclaude --out /path/to/repo --root /path/to/repo # one repo
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
[OpenClaude](https://openclaude.gitlawb.com/) is a fork of Claude Code that can drive any model. You get the same agents, skills and hooks as Claude Code, under a different config directory. OpenClaude never reads `~/.claude` or a project `.claude/`, so the two installs can sit side by side. The differences:
|
|
118
|
-
|
|
119
|
-
- Per repo, the preamble is written to `.openclaude/CLAUDE.md` rather than a root file, and the hooks go into `.openclaude/settings.local.json`.
|
|
120
|
-
- `$OPENCLAUDE_CONFIG_DIR` moves the global directory (default `~/.openclaude`).
|
|
121
|
-
|
|
122
|
-
OpenClaude support has not yet been verified against a live install.
|
|
123
|
-
|
|
124
|
-
### IBM Bob
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
geneseed build --emit bob-global # ~/.bob
|
|
128
|
-
geneseed build --emit bob --out /path/to/repo --root /path/to/repo # one repo
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
Bob is shaped like Claude Code, so it gets the same agents and skills. Per repo, the preamble goes into a root `AGENTS.md` and the rest into `.bob/`. Globally, everything goes under `~/.bob` (`$BOB_CONFIG_DIR` moves it), and the preamble rides `rules/geneseed.md`, because Bob does not auto-load a global `AGENTS.md`. Bob's hooks refuse an action with exit code 2, and Bob has no `SubagentStop` or `PreCompact` events. Bob support has not yet been verified against a live install.
|
|
132
|
-
|
|
133
|
-
### Any AGENT.md tool
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
geneseed build # renders the plain bundle into ./Harness
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Point your tool's instructions or rules setting at `Harness/AGENT.md`. If the tool only loads one specific filename, rename or symlink the file (`AGENT.md` to `AGENTS.md` or `CLAUDE.md`). The rules then rest on the agent's own discipline, because these tools have no hooks or plugins to enforce anything (see [Enforced vs. asked](../understand/enforced-vs-asked.md)).
|
|
140
|
-
|
|
141
|
-
Some of these tools also load skills. Their own docs list where:
|
|
142
|
-
|
|
143
|
-
- **Codex CLI** loads a root `AGENTS.md` and `~/.codex/AGENTS.md`, and skills from `~/.codex/skills` or `.agents/skills`.
|
|
144
|
-
- **Cursor** loads `AGENTS.md`, and skills from `.cursor/skills`, `.agents/skills` or `.claude/skills`.
|
|
145
|
-
- **Gemini CLI** reads `GEMINI.md` by default. Set `context.fileName` in its `settings.json` to include `AGENTS.md`. Skills load from `.gemini/skills` or `.agents/skills`.
|
|
146
|
-
|
|
147
|
-
Copy or symlink the bundle's `skills/` to `.agents/skills/` and all three of them see it.
|
|
148
|
-
|
|
149
|
-
### No runtime on the target machine
|
|
150
|
-
|
|
151
|
-
If the machine that will use the harness cannot run Node, run this once on a machine that can:
|
|
152
|
-
|
|
153
|
-
```
|
|
154
|
-
npx geneseed prompt --theme neutral > install-geneseed.md
|
|
155
|
-
```
|
|
42
|
+
- [OpenCode](install-opencode.md): global (recommended) or per repo.
|
|
43
|
+
- [Claude Code](install-claude-code.md): global or per repo, with hooks.
|
|
44
|
+
- [OpenClaude](install-openclaude.md): Claude Code's pieces under OpenClaude's own folder.
|
|
45
|
+
- [IBM Bob](install-bob.md): global or per repo.
|
|
46
|
+
- [Any AGENT.md tool](install-agent-md.md): the plain bundle, or a machine with no runtime.
|
|
156
47
|
|
|
157
|
-
|
|
48
|
+
No npm? Install [from a clone](install-clone.md). Scripting it? See [Install without the wizard](install-scripted.md).
|
|
158
49
|
|
|
159
50
|
---
|
|
160
51
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 24
|
|
4
|
+
title: "Finish a loop"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Loops"
|
|
7
|
+
description: "How a loop ends and gets merged, how to drive one by hand, and fixes for what goes wrong."
|
|
8
|
+
---
|
|
9
|
+
How a loop ends, how to drive the engine by hand, and what to do when a loop misbehaves. To start one, see [Run a loop](run-a-loop.md).
|
|
10
|
+
|
|
11
|
+
## The end: you merge
|
|
12
|
+
|
|
13
|
+
On `$close` the agent removes `LOOP.md` in one last commit. That commit is outside the loop's exemption, so the git gate asks you: saying yes is how you close the loop. The agent then reports the iteration count, the soft iterations to review, the notes, and the branch.
|
|
14
|
+
|
|
15
|
+
**The loop never merges.** Open a pull request from `loop/<slug>`, or review the branch, and merge it yourself. Merging a loop branch always asks, with no exception. Remove the worktree when you are done (`git worktree remove ../<repo>-loop-<slug>`).
|
|
16
|
+
|
|
17
|
+
## Running one by hand (advanced)
|
|
18
|
+
|
|
19
|
+
You can drive the engine without the agent, which helps when you debug a template. Work from a worktree on a `loop/*` branch:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
geneseed loop check --graph my-loop.json # validate a graph file (keep it outside the worktree)
|
|
23
|
+
geneseed loop init --title "Rate limit /orders" \
|
|
24
|
+
--requirement "429 after 100 requests a minute per key" \
|
|
25
|
+
--graph tdd --preset prudent --contracts 'api/openapi.yaml'
|
|
26
|
+
geneseed loop next # what to do now, as one JSON object
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Then repeat `geneseed loop next` and act on what it prints:
|
|
30
|
+
|
|
31
|
+
| `next` prints | You run |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `{node, validate: true}` | `geneseed loop score --declared` (or, for a setup brick, `--actions … --write-set '…' --intent …`) |
|
|
34
|
+
| `{node}` | the brick's prompt, then `git status --porcelain \| geneseed loop record --outcome <outcome>` (the iteration head adds `--card '<json>'` when it reports `more`) |
|
|
35
|
+
| `{verify, run}` | exactly the printed `run` command, which pipes the staged numstat into `geneseed loop score --diff` |
|
|
36
|
+
| `{awaiting}` | `geneseed loop decide --verdict ok\|no\|amend --note "…"` |
|
|
37
|
+
| `{commit: true, message_file}` | `git add -A && git commit -F <message_file> && git push -u origin HEAD:loop/<slug>` |
|
|
38
|
+
| `{terminal}` | nothing more: `$close` or `$stop` |
|
|
39
|
+
|
|
40
|
+
Every flag is in `geneseed loop --help`. The full cycle, including discards and notes, is in [Loops](../concepts/loops.md).
|
|
41
|
+
|
|
42
|
+
## Troubleshooting
|
|
43
|
+
|
|
44
|
+
| Symptom | Cause and fix |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| It stopped as blocking on a small change | The diff touched a file outside the iteration's declared write set, which raises the score to at least the API weight. Check the reasons it shows. Answer ok if the file belongs to the change, or amend with a note to keep it out. |
|
|
47
|
+
| The git gate asks on every iteration's commit | Only one exact shape is exempt. A `cd …` prefix, `git -C`, a quoted refspec (`"HEAD:loop/x"`), `git commit -m` or a message-file path with a space all fall back to asking. Make sure the session works from the worktree itself. |
|
|
48
|
+
| The final `close` commit asks | Expected. The loop is over, and that ask is your consent to close it. |
|
|
49
|
+
| `mutation-check` reported `unavailable` | No mutation tool is configured. The loop continues and records the gap in `LOOP.md`'s notes. Add PIT, Stryker, mutmut or cargo-mutants to make it bite. |
|
|
50
|
+
| `ci-repair` closed at once with "CI does not run for <sha>" | CI has no run for the pushed commit. Enable your pipeline on `loop/*` branches and check that `gh` is logged in. |
|
|
51
|
+
| `geneseed loop init` says `LOOP.md already exists` | A loop is already running in this worktree. Resume it with `geneseed loop next`, or start the new one in another worktree. |
|
|
52
|
+
| `init` prints `problems` | The graph fails `loop check`, for example a cycle not declared as a loop, or a brick that is missing or unavailable. Fix the graph, or pick a shipped template. |
|
|
53
|
+
| A loop is missing from **Loops › Active** | Only loops started with `geneseed loop init` from a version with the registry appear there. Look in the worktree's `LOOP.md` instead. |
|
|
54
|
+
| The agent does not know about loops | The install predates the `loop` skill. Run `geneseed rebuild-all`, then start a new session. |
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 23
|
|
4
|
+
title: "While a loop runs"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Loops"
|
|
7
|
+
description: "What a running loop commits, when it stops to ask you, where to watch it, and how to stop or resume it."
|
|
8
|
+
---
|
|
9
|
+
A loop started with [Run a loop](run-a-loop.md) works on its own `loop/<slug>` branch. This is what you see while it runs, and how to step in.
|
|
10
|
+
|
|
11
|
+
Each iteration is one commit on `loop/<slug>`, pushed as it lands. Work done before the first iteration, such as reproducing a bug, is its own commit, numbered iteration 0. Every change ends at one of three levels:
|
|
12
|
+
|
|
13
|
+
| Level | What you see |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| **silent** | Only the commit and its trailers. |
|
|
16
|
+
| **soft** | The commit lands, and the final report lists it under "to review". |
|
|
17
|
+
| **blocking** | The agent stops and asks you before anything is committed. |
|
|
18
|
+
|
|
19
|
+
## When it asks you
|
|
20
|
+
|
|
21
|
+
The agent ends its turn and shows you what it is waiting on:
|
|
22
|
+
|
|
23
|
+
- **A blocking score**: the change it plans (before it runs) or the staged diff (after), with the reasons for the score. One file outside the declared write set, more than 20 deleted lines, or a file that matches the loop's `contracts` is enough.
|
|
24
|
+
- **A human gate**: some bricks always stop for you, whatever the preset. An ADR that survived its skeptic (`adr-challenge`), an architecture rule and its allowlist (`fitness-define`), a contract migration plan (`migration-plan`) and a feature spec (`spec`) are all gated.
|
|
25
|
+
- **Launch**, under `prudent`: the graph it is about to run.
|
|
26
|
+
|
|
27
|
+
Answer in the agent's session, in your own words:
|
|
28
|
+
|
|
29
|
+
| You say | What happens |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| ok / go ahead | It continues. On a gate held on a failure, ok follows that failure's edge, which usually stops the loop. |
|
|
32
|
+
| no | The loop stops at that node. |
|
|
33
|
+
| amend, with a note ("keep the old field until v3") | The same brick runs again with your note added to `LOOP.md`. A gate can be amended three times per iteration; a fourth amend stops the loop. |
|
|
34
|
+
| amend, at the `prudent` launch prompt | The loop stops ("graph to amend") with your note: nothing has run yet, so ask again for the loop you want. |
|
|
35
|
+
|
|
36
|
+
The agent passes your answer on as `geneseed loop decide --verdict ok|no|amend --note "<your words>"`. The console never answers for you.
|
|
37
|
+
|
|
38
|
+
## Where to watch
|
|
39
|
+
|
|
40
|
+
- **Console: Loops › Active.** Every registered loop, awaiting ones first: the branch, `iteration N / max`, the current node on its ring, what an awaiting loop waits on, and the iteration history.
|
|
41
|
+
- **`LOOP.md`** at the worktree root: the title, the requirement, the preset, the contracts, the notes the bricks left, and the engine's state.
|
|
42
|
+
- **The commits.** Each one carries the iteration, the bricks it ran, its declared and actual risk, the decision and the test state:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
git log --format='%h %s%n%(trailers)' loop/<slug>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
While a loop runs on its `loop/*` branch, the git gate lets exactly one commit-and-push shape through without asking, the one the agent uses to close each iteration. Any other git command still asks, as usual. Bob has no ask prompt, so there the commit and push gate logs a warning instead of asking.
|
|
49
|
+
|
|
50
|
+
## Stop, resume, and what ends a loop
|
|
51
|
+
|
|
52
|
+
- **Stop.** Interrupt the agent whenever you like. The state is `LOOP.md` plus the branch, so nothing is lost.
|
|
53
|
+
- **Resume.** Ask "resume the loop" in a session opened in the worktree, or run `geneseed loop next` there. The same goes after you answered a question in a new session.
|
|
54
|
+
|
|
55
|
+
A loop ends one of two ways:
|
|
56
|
+
|
|
57
|
+
| End | When |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `$close` | The iteration head reports nothing left to do. Some templates first run an independent `done-check`. |
|
|
60
|
+
| `$stop` | A brick reported an outcome wired to stop (a red baseline in `baseline-green`, say), you answered no, a gate was amended a fourth time, two iterations in a row produced no diff, an inner retry ring ran out twice in one iteration, a read-only brick changed files, or the iteration ceiling was reached (the template's `max`, never above 20). |
|
|
61
|
+
|
|
62
|
+
On `$stop` the agent reports the reason and leaves the branch as it is.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
**Next:** [Finish a loop](loop-finish.md)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 22
|
|
4
|
+
title: "Which loop template"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Loops"
|
|
7
|
+
description: "Pick a loop template by what you want to do."
|
|
8
|
+
---
|
|
9
|
+
[Run a loop](run-a-loop.md) takes a template by name, or lets the agent compose a graph from the bricks. Pick one by what you want to do:
|
|
10
|
+
|
|
11
|
+
| I want to… | Template | Category |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Record a design decision as an ADR before any code changes | `architecture-decision` | architecture |
|
|
14
|
+
| Make a rule hold everywhere (a test with an allowlist, then one violation fixed per iteration) | `enforce-architecture-rule` | architecture |
|
|
15
|
+
| Change an API, schema or event that has live consumers, without breaking them | `update-contract` | architecture |
|
|
16
|
+
| Pin untested legacy behaviour with characterization tests, production code untouched | `legacy-tests` | tests |
|
|
17
|
+
| Write each failing test before the code that passes it | `tdd` | tests |
|
|
18
|
+
| Fix a test that fails only sometimes, at its root cause | `fix-flaky-tests` | tests |
|
|
19
|
+
| Fix a reported bug, starting from a failing reproduction | `bugfix` | development |
|
|
20
|
+
| Build a feature in planned iterations | `feature` | development |
|
|
21
|
+
| Pin the acceptance criteria in a spec you review first, then build it | `spec-first-feature` | development |
|
|
22
|
+
| Add or change HTTP endpoints, each with a Bruno request and a security pass | `api-endpoint` | development |
|
|
23
|
+
| Restructure code that the tests already cover | `refactor` | refactoring |
|
|
24
|
+
| Refactor code that has no tests yet | `legacy-refactor` | refactoring |
|
|
25
|
+
| Delete unused code, one coherent group per iteration | `remove-dead-code` | refactoring |
|
|
26
|
+
| Upgrade dependencies one package or group at a time | `deps-upgrade` | day-to-day |
|
|
27
|
+
| Turn a red CI run green on a `loop/*` branch | `ci-repair` | day-to-day |
|
|
28
|
+
|
|
29
|
+
The console's **Loops › Templates** shows each one as a ring, with its bricks and which of them stop for you.
|
|
30
|
+
|
|
31
|
+
What each template's bricks do: [Loop templates](../concepts/loop-templates.md).
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
**Next:** [While a loop runs](loop-running.md)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 19
|
|
4
|
+
title: "Filesystem (MCP)"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Set up"
|
|
7
|
+
description: "File access limited to the folders you list, and the placeholder path to replace."
|
|
8
|
+
---
|
|
9
|
+
One of the [MCP server](mcp.md) presets. Where each host keeps the config, and how to check the server connected, are on that page.
|
|
10
|
+
|
|
11
|
+
[`@modelcontextprotocol/server-filesystem`](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem) gives the agent file access limited to the folders you list, through `npx`. **The allowed folders are command-line arguments.** The server refuses any path outside them, so grant the narrowest set that works, not `$HOME` or `/`.
|
|
12
|
+
|
|
13
|
+
<!--harness:opencode-->
|
|
14
|
+
*(OpenCode only)*
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"mcp": {
|
|
19
|
+
"filesystem": {
|
|
20
|
+
"type": "local",
|
|
21
|
+
"command": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"],
|
|
22
|
+
"enabled": true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
<!--/harness-->
|
|
28
|
+
|
|
29
|
+
<!--harness:claude-->
|
|
30
|
+
*(Claude Code only)*
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"] } } }
|
|
34
|
+
```
|
|
35
|
+
<!--/harness-->
|
|
36
|
+
|
|
37
|
+
> **Replace the placeholder.** The preset ships with the literal path `/path/to/allowed/dir`. If you enable the server without changing it, the server runs but can reach nothing. This is the classic "the filesystem MCP sees nothing" problem.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
**Next:** [Check the servers connected](mcp.md)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 18
|
|
4
|
+
title: "GitLab (MCP)"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Set up"
|
|
7
|
+
description: "Merge requests, issues and CI from the agent: token scopes, the config block, a second instance."
|
|
8
|
+
---
|
|
9
|
+
One of the [MCP server](mcp.md) presets. Where each host keeps the config, and how to check the server connected, are on that page.
|
|
10
|
+
|
|
11
|
+
> **Never commit a real token.** The presets ship with an empty `GITLAB_PERSONAL_ACCESS_TOKEN` and a sample filesystem path. Fill them in your own config, never in a tracked file.
|
|
12
|
+
|
|
13
|
+
[`@zereight/mcp-gitlab`](https://github.com/zereight/gitlab-mcp) provides repository, merge request, issue and CI tools over the GitLab API. It runs through `npx`, so nothing is installed globally. The same command serves gitlab.com and any self-hosted instance.
|
|
14
|
+
|
|
15
|
+
**1. Create a personal access token** on the instance (User Settings → Access Tokens) with the scopes `api` and `read_repository`. Treat it like a password.
|
|
16
|
+
|
|
17
|
+
**2. Register the server.**
|
|
18
|
+
|
|
19
|
+
<!--harness:opencode-->
|
|
20
|
+
*(OpenCode only)*
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"mcp": {
|
|
25
|
+
"gitlab": {
|
|
26
|
+
"type": "local",
|
|
27
|
+
"command": ["npx", "-y", "@zereight/mcp-gitlab"],
|
|
28
|
+
"environment": {
|
|
29
|
+
"GITLAB_PERSONAL_ACCESS_TOKEN": "glpat-…",
|
|
30
|
+
"GITLAB_API_URL": "https://gitlab.com/api/v4"
|
|
31
|
+
},
|
|
32
|
+
"enabled": true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
<!--/harness-->
|
|
38
|
+
|
|
39
|
+
<!--harness:claude-->
|
|
40
|
+
*(Claude Code only)*
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"gitlab": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@zereight/mcp-gitlab"],
|
|
48
|
+
"env": {
|
|
49
|
+
"GITLAB_PERSONAL_ACCESS_TOKEN": "glpat-…",
|
|
50
|
+
"GITLAB_API_URL": "https://gitlab.com/api/v4"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
You can also register it with `claude mcp add`.
|
|
58
|
+
<!--/harness-->
|
|
59
|
+
|
|
60
|
+
Keep the `/api/v4` suffix on the URL.
|
|
61
|
+
|
|
62
|
+
**A second instance** (gitlab.com plus a self-hosted server, for example) is a copy of the same block under a new name, such as `gitlab-acme`, with its own `GITLAB_API_URL` and token. The preset covers the first instance only. You add the copy by hand.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
**Next:** [Filesystem (MCP)](mcp-filesystem.md)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 17
|
|
4
|
+
title: "MarkItDown (MCP)"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Set up"
|
|
7
|
+
description: "Convert PDF and Office files to markdown: uvx or pipx, OCR extras, corporate TLS."
|
|
8
|
+
---
|
|
9
|
+
One of the [MCP server](mcp.md) presets. Where each host keeps the config, and how to check the server connected, are on that page.
|
|
10
|
+
|
|
11
|
+
[MarkItDown](https://github.com/microsoft/markitdown) (Microsoft) converts PDF, Word, Excel, PowerPoint and HTML to markdown. It exposes one tool, `convert_to_markdown(uri)`, which accepts `file:`, `http:`, `https:` and `data:` URIs.
|
|
12
|
+
|
|
13
|
+
**1. Make the command resolve.**
|
|
14
|
+
|
|
15
|
+
- **`uvx` (recommended, nothing to install).** If you have [uv](https://docs.astral.sh/uv/), `uvx markitdown-mcp` fetches and caches the server on first use. This is the command the preset uses.
|
|
16
|
+
- **`pipx`.** Without uv, run `pipx install markitdown-mcp`, then use `markitdown-mcp` alone as the command (OpenCode: `["markitdown-mcp"]`; Claude: `"command": "markitdown-mcp"`, no args).
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
uvx markitdown-mcp --help # uv route: confirm it resolves
|
|
20
|
+
pipx install markitdown-mcp && markitdown-mcp --help # pipx route
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
For scanned or image-only PDFs, which otherwise come back empty, add the OCR extras: `uvx --with "markitdown[all]" markitdown-mcp`, or `pipx inject markitdown-mcp "markitdown[all]"`.
|
|
24
|
+
|
|
25
|
+
**2. Corporate TLS (only behind an SSL-inspecting proxy).** uv ships its own root certificates and ignores the OS trust store, so a proxy's internal certificate fails with `invalid peer certificate: UnknownIssuer`. Point uv at the OS store rather than turning verification off:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
export UV_SYSTEM_CERTS=true # older uv: UV_NATIVE_TLS=true
|
|
29
|
+
# fallback: export SSL_CERT_FILE=/path/to/corporate-root-ca.pem
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**3. Register it**, with the console toggle or one of the blocks in [MCP servers](mcp.md). Then restart your agent.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
**Next:** [Reading non-markdown docs](read-non-markdown.md)
|