@mthanh/vespercli 2.1.0 → 2.2.1

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 (30) hide show
  1. package/README.md +22 -2
  2. package/assets/CATALOG.md +14 -0
  3. package/assets/claude/.claude-plugin/marketplace.json +21 -15
  4. package/assets/claude/.claude-plugin/plugin.json +1 -1
  5. package/assets/claude/agents/workspace-learner.md +1 -1
  6. package/assets/claude/orchestration.md.tpl +1 -1
  7. package/assets/claude/packs/backend/.claude-plugin/plugin.json +1 -1
  8. package/assets/claude/packs/docs/.claude-plugin/plugin.json +1 -1
  9. package/assets/claude/packs/frontend/.claude-plugin/plugin.json +1 -1
  10. package/assets/claude/packs/graphify/.claude-plugin/plugin.json +10 -0
  11. package/assets/claude/packs/graphify/skills/agent-fundamentals/SKILL.md +89 -0
  12. package/assets/claude/packs/graphify/skills/agent-fundamentals/references/codebase-query.md +95 -0
  13. package/assets/claude/packs/graphify/skills/agent-fundamentals/references/terminal-discipline.md +94 -0
  14. package/assets/claude/packs/graphify/skills/agent-fundamentals/references/tool-usage-patterns.md +67 -0
  15. package/assets/claude/packs/graphify/skills/graphify-research/SKILL.md +101 -0
  16. package/assets/claude/packs/integrations/.claude-plugin/plugin.json +1 -1
  17. package/assets/claude/packs/playwright/.claude-plugin/plugin.json +1 -1
  18. package/assets/claude/packs/polyglot/.claude-plugin/plugin.json +1 -1
  19. package/assets/claude/packs/styles/.claude-plugin/plugin.json +1 -1
  20. package/assets/claude/vesper-orchestrator.md +1 -1
  21. package/assets/copilot/agents/workspace-learner.agent.md +1 -1
  22. package/assets/copilot/packs/graphify/skills/graphify-research/SKILL.md +101 -0
  23. package/assets/manifest.json +3 -0
  24. package/dist/cli.min.js +122 -107
  25. package/package.json +1 -1
  26. package/scripts/packs-layout.test.js +23 -2
  27. package/src/mcp/vesper-indexing/dist/indexer/chunker.js +83 -2
  28. package/src/mcp/vesper-indexing/dist/indexer/chunker.js.map +1 -1
  29. package/src/mcp/vesper-indexing/package-lock.json +2 -2
  30. package/src/mcp/vesper-indexing/package.json +1 -1
package/README.md CHANGED
@@ -88,7 +88,7 @@ vespercli init --host claude # Claude Code + OpenCode; or: --host copilot
88
88
  vespercli init # interactive: asks "Which AI host is this workspace for?"
89
89
  ```
90
90
 
91
- A non-interactive run (no TTY) never guesses. It re-uses the host the checked-out tree already carries, and otherwise needs `--host`. `-y`/`--force-default` default the follow-up questions only, never the host choice.
91
+ A non-interactive run (no TTY) never guesses. It re-uses the host the checked-out tree already carries, and otherwise needs `--host`. `-y`/`--force-default` default the follow-up questions only, never the host choice. The last follow-up question, on both hosts, is the opt-in [graphify](#graphify-optional) pack (default no; `--graphify` answers yes without asking, which is also the only way to get it in a `-y`/`--force-default`/non-TTY run; a workspace that already has the pack is never asked again and never loses it).
92
92
 
93
93
  Then say hello:
94
94
 
@@ -357,6 +357,7 @@ Every workspace gets three core servers: `vesper-indexing` (fast code search ove
357
357
  vespercli mcp # status for the checkout's host
358
358
  vespercli mcp list # catalog + custom servers, and which are installed
359
359
  vespercli mcp add clickup # add an optional catalog server (recorded in .vesperrc)
360
+ vespercli mcp add graphify # the graphify pack's server (packs enable graphify does this too)
360
361
  vespercli mcp remove clickup
361
362
  vespercli mcp enable | disable # the core servers
362
363
  vespercli mcp sync # re-sync tool auto-approval (Copilot) / refresh config (Claude)
@@ -396,6 +397,7 @@ The catalog is a **core** plugin plus six stack **packs**, and a project enables
396
397
  | `polyglot` | `vesper-polyglot` | — | `java`, `flutter`, `google-adk-python` |
397
398
  | `docs` | `vesper-docs` | — | `document-skills`, `ai-multimodal` |
398
399
  | `integrations` | `vesper-integrations` | `clickup-agent` | `gitlab-guardrails` |
400
+ | `graphify` (opt-in) | `vesper-graphify` | — | `graphify-research` (see [graphify](#graphify-optional)) |
399
401
 
400
402
  Every pack also carries a byte-identical copy of the shared `agent-fundamentals` skill (every agent preloads it by bare name; the generator keeps the copies in sync). `vespercli catalog` (the shipped `assets/CATALOG.md`) names each asset's pack, and `assets/manifest.json` carries the same mapping for the CLI.
401
403
 
@@ -406,6 +408,24 @@ Every pack also carries a byte-identical copy of the shared `agent-fundamentals`
406
408
 
407
409
  Only the core key resolves the host: a workspace whose settings carry pack keys alone resolves nothing. `reset --host <host>` removes the pack keys or locations with the core ones, and a host switch replays them onto the new host. `vespercli doctor` reports a roster naming an asset of a disabled pack as `pack-not-enabled` (WARN, fix `vespercli packs sync`) and an enabled pack the roster does not use as `pack-unused` (INFO). A workspace provisioned before packs keeps working: core resolves as before, and the next `init` (or `packs sync`) enables what its roster needs.
408
410
 
411
+ ## graphify (optional)
412
+
413
+ The opt-in `graphify` pack gives the **research-side roles** (`task-researcher`, `se-system-architecture-reviewer`) a code knowledge graph built by [graphify](https://github.com/Graphify-Labs/graphify) — an **external tool** installed on your machine (PyPI package `graphifyy`, CLI `graphify`); Vesper ships only its own `graphify-research` skill, which routes impact ("who calls X"), path ("how does A reach B") and architecture questions to the graphify MCP tools and keeps locate/edit questions on `vesper_search` / `vesper_symbols`. `vesper-indexing` remains the default codebase tool for every role; developers, testers and reviewers are unchanged.
414
+
415
+ ```bash
416
+ uv tool install graphifyy # the tool (external) — or: pipx install graphifyy / python3 -m pip install --user graphifyy
417
+ vespercli packs enable graphify # the consent — prepares the workspace, see below (vespercli init asks the same question)
418
+ graphify update . # builds graphify-out/graph.json (~35 s on a 25k-LOC repo, 0 tokens) — the enable runs this for you when the tool is installed
419
+ ```
420
+
421
+ When `graphify` is on PATH and `graphify-out/graph.json` does not exist yet, `packs enable graphify` (and `init`'s consent, `-y`/`--graphify` runs included — it is local, 0 tokens, no prompt) builds the graph right away with `graphify update .`; a failed build warns and leaves the pack enabled, and a re-init, `packs sync` or `worktree bootstrap` never rebuilds.
422
+
423
+ **Installing the tool.** Three routes, in the order Vesper prefers them: `uv tool install graphifyy` when [uv](https://docs.astral.sh/uv/) is on PATH, `pipx install graphifyy` when pipx is, `python3 -m pip install --user graphifyy` when only Python is; with none of them, install uv first (`curl -LsSf https://astral.sh/uv/install.sh | sh`, or `pip install uv`). `vespercli init` offers the pack as its last follow-up question (default no, `--graphify` answers yes) and, interactively, when the tool is not on PATH, offers to run this machine's install command for you (`Install graphifyy now? (<command>)`, default yes; a failed install prints the hint and never fails init). `packs enable graphify` makes the same offer; `-y`, `--force-default` and non-TTY runs never install anything and print the command instead. `vespercli doctor`'s `graphify-missing` fix and `vespercli mcp status` name the same command.
424
+
425
+ `packs enable graphify` writes three things, all ledger-recorded and removed by `packs disable graphify`, `reset --host` and a host switch (replayed on the new host): a guarded **`.gitignore` sub-block** (`graphify-out/*` ignored, `!graphify-out/graph.json` so the graph itself is **committed and shared**), a guarded sub-block in Vesper's **`post-checkout` hook** that runs `graphify update .` after a branch checkout and is a no-op when the tool is not on PATH, and the **`graphify` MCP server** — registered on both hosts as `vespercli mcp serve graphify` (the same registration as `vespercli mcp add graphify`, and the `opencode.json` mirror), which runs `python -m graphify.serve graphify-out/graph.json` under the interpreter graphify recorded in `graphify-out/.graphify_python` when it built the graph (a `uv tool` / `pipx` install lives in its own venv, so a bare `python` would not import it), else `python3` / `python` on PATH. When the roster lists `graphify-research` on the two research rows, `workspace-learner` writes it there and nowhere else.
426
+
427
+ **Data flow.** Code never leaves the machine: a code-only `graphify update .` is tree-sitter extraction at **0 tokens**. Doc/PDF extraction and community *labels* call an LLM — pass `--no-label` to skip the labels. Agents use the MCP server (the graph stays resident), never the CLI (which reloads the ~50 MB `graph.json` per call), always pass path-qualified node names (matching is fuzzy), never read `GRAPH_REPORT.md` whole, and weight every edge by its `EXTRACTED` / `INFERRED` / `AMBIGUOUS` tag. `vespercli doctor` reports, never as an error: `graphify-missing` (tool not on PATH), `graphify-no-graph` (no `graph.json` yet) and `graphify-stale` (the graph's built-from commit is not HEAD — `graphify update .`).
428
+
409
429
  ## Third-party skills (packs)
410
430
 
411
431
  Third-party content is **pack content**: shipped in the npm package like every other pack asset, served through the pack's plugin (Claude) or injected folder (Copilot), pinned to an upstream commit in an `UPSTREAM.json` beside each `SKILL.md` (with the upstream `LICENSE` verbatim), never fetched at command time — and **never written into a project**. Nothing lands under `.claude/skills/` or `.vesper/skills/`; there is no consent prompt, no `--adhd`/`--ponytail` flag and no `~/.vesperrc` record any more.
@@ -421,7 +441,7 @@ A newer upstream reaches your project with the next Vesper release. `vespercli p
421
441
 
422
442
  | Command | What it does |
423
443
  |---|---|
424
- | `vespercli init [--host claude\|copilot] [-y] [--force-default] [--path <dir>]` | Provision, switch host, re-provision, or migrate a 1.x workspace. `--target` is a deprecated alias of `--host`; `all` and comma lists are rejected. |
444
+ | `vespercli init [--host claude\|copilot] [-y] [--force-default] [--graphify] [--path <dir>]` | Provision, switch host, re-provision, or migrate a 1.x workspace. `--graphify` enables the opt-in [graphify](#graphify-optional) pack without asking (otherwise the last follow-up question; the default is no pack). `--target` is a deprecated alias of `--host`; `all` and comma lists are rejected. |
425
445
  | `vespercli doctor [--quiet] [--running-host <host>]` | Read-only validation; exit `0`/`1`/`2`. |
426
446
  | `vespercli guard [--running-host claude\|copilot\|opencode]` | Session-start guard (installed as the hook, the task and the OpenCode plugin's `session.created` hook); `opencode` stands for the Claude host. |
427
447
  | `vespercli gate [--plan <file>] [--base <ref>] [--json]` | Run the committed gate policy (`.vesper/gates.json`): checks, plan conformance, diff-size cap, protected paths. Exit `0` pass, `1` fail, `2` no config. See [Gates](#gates). |
package/assets/CATALOG.md CHANGED
@@ -73,6 +73,13 @@ same mapping (`assetPacks`) for the CLI.
73
73
  - Agents: `expert-nextjs-developer`, `expert-react-frontend-engineer`, `jest-react-component-analyzer`, `jest-react-scenario-scanner`, `jest-react-test-generator`, `jest-react-test-planner`, `jest-react-test-runner`
74
74
  - Skills: `aesthetic`, `frontend-design`, `nextjs`, `nextjs-tailwind`, `premium-frontend-ui`, `react-mui-tanstack`, `reactjs`, `tailwind-shadcn`, `tailwind-v4-vite`, `vercel-react-best-practices`, `web-design-guidelines`, `web-frameworks` (+ the shared `agent-fundamentals` copy)
75
75
 
76
+ ### graphify
77
+
78
+ - Plugin: `vesper-graphify` (source `./packs/graphify`)
79
+ - Description: Opt-in code knowledge graph for the research-side roles. [graphify](https://github.com/Graphify-Labs/graphify) is an **external tool** (`uv tool install graphifyy`), never vendored — the pack ships only Vesper's own `graphify-research` skill. Never enabled by the roster sync: `vespercli packs enable graphify` is the consent; it also writes the `.gitignore` block (`graphify-out/*` ignored, `graphify-out/graph.json` committed), the `post-checkout` sub-block that runs `graphify update .` when the tool is on PATH, and registers the `graphify` MCP server (`python -m graphify.serve`); `packs disable graphify` removes all three. `vesper-indexing` stays the default codebase tool for every role.
80
+ - Agents: —
81
+ - Skills: `graphify-research` (+ the shared `agent-fundamentals` copy)
82
+
76
83
  ### integrations
77
84
 
78
85
  - Plugin: `vesper-integrations` (source `./packs/integrations`)
@@ -492,6 +499,13 @@ Copilot `.instructions.md` with that glob, in the tier named by its
492
499
  - Description: Build, evaluate, and deploy AI agents using Google ADK (Agent Development Kit) for Python.
493
500
  - Pick when: Implementing agents in Python with tools and orchestration; need multi-agent hierarchies or workflow agents (sequential/parallel/loop); deploying to Vertex AI Agent Engine / Cloud Run.
494
501
 
502
+ ### graphify-research
503
+
504
+ - Path: `claude/packs/graphify/skills/graphify-research/`
505
+ - Pack: graphify (`vesper-graphify`)
506
+ - Description: Vesper-authored routing for the graphify code knowledge graph (MCP tools `query_graph`, `get_node`, `get_neighbors`, `shortest_path`, `get_pr_impact`): impact, path, architecture and onboarding questions go to the graph; locate/edit questions stay on `vesper_search` / `vesper_symbols`. Always path-qualified node names (fuzzy matching), EXTRACTED / INFERRED / AMBIGUOUS edge tags, never read `GRAPH_REPORT.md` whole, MCP server over the CLI, fallback to vesper-indexing when the graph or server is absent.
507
+ - Pick when: Only with the opt-in `graphify` pack enabled, and only on the Research (`task-researcher`) and Architecture (`se-system-architecture-reviewer`) rows — never for developers, testers or reviewers.
508
+
495
509
  ### i-have-adhd
496
510
 
497
511
  - Path: `claude/packs/styles/skills/i-have-adhd/`
@@ -7,50 +7,56 @@
7
7
  {
8
8
  "name": "vesper",
9
9
  "source": "./",
10
- "version": "2.1.0",
10
+ "version": "2.2.1",
11
11
  "description": "Vesper core: the support, review and generic developer/tester specialists plus the catalog skills every project uses. Always enabled."
12
12
  },
13
13
  {
14
14
  "name": "vesper-frontend",
15
15
  "source": "./packs/frontend",
16
- "version": "2.1.0",
17
- "description": "Vesper frontend pack — React, Next.js, Tailwind and Jest/RTL specialists and skills."
16
+ "version": "2.2.1",
17
+ "description": "Vesper frontend pack \u2014 React, Next.js, Tailwind and Jest/RTL specialists and skills."
18
18
  },
19
19
  {
20
20
  "name": "vesper-playwright",
21
21
  "source": "./packs/playwright",
22
- "version": "2.1.0",
23
- "description": "Vesper playwright pack — Playwright end-to-end testing specialists and skills."
22
+ "version": "2.2.1",
23
+ "description": "Vesper playwright pack \u2014 Playwright end-to-end testing specialists and skills."
24
24
  },
25
25
  {
26
26
  "name": "vesper-backend",
27
27
  "source": "./packs/backend",
28
- "version": "2.1.0",
29
- "description": "Vesper backend pack — Node.js/Express, Firebase, NestJS, databases, auth and DevOps specialists and skills."
28
+ "version": "2.2.1",
29
+ "description": "Vesper backend pack \u2014 Node.js/Express, Firebase, NestJS, databases, auth and DevOps specialists and skills."
30
30
  },
31
31
  {
32
32
  "name": "vesper-polyglot",
33
33
  "source": "./packs/polyglot",
34
- "version": "2.1.0",
35
- "description": "Vesper polyglot pack — Java, Flutter and Google ADK (Python) skills."
34
+ "version": "2.2.1",
35
+ "description": "Vesper polyglot pack \u2014 Java, Flutter and Google ADK (Python) skills."
36
36
  },
37
37
  {
38
38
  "name": "vesper-docs",
39
39
  "source": "./packs/docs",
40
- "version": "2.1.0",
41
- "description": "Vesper docs pack — Document processing (docx/pptx/pdf/xlsx) and multimodal (Gemini) skills."
40
+ "version": "2.2.1",
41
+ "description": "Vesper docs pack \u2014 Document processing (docx/pptx/pdf/xlsx) and multimodal (Gemini) skills."
42
42
  },
43
43
  {
44
44
  "name": "vesper-integrations",
45
45
  "source": "./packs/integrations",
46
- "version": "2.1.0",
47
- "description": "Vesper integrations pack — ClickUp task-board specialist, the GitLab MR guardrails skill, and the third-party GitLab CI skills (gitlab-ci-skill, github-actions-to-gitlab-ci)."
46
+ "version": "2.2.1",
47
+ "description": "Vesper integrations pack \u2014 ClickUp task-board specialist, the GitLab MR guardrails skill, and the third-party GitLab CI skills (gitlab-ci-skill, github-actions-to-gitlab-ci)."
48
48
  },
49
49
  {
50
50
  "name": "vesper-styles",
51
51
  "source": "./packs/styles",
52
- "version": "2.1.0",
53
- "description": "Vesper styles pack — opt-in output styles: i-have-adhd, ponytail (third-party, MIT). Enabled by `vespercli packs enable styles`, which writes the always-on pointer rule that applies them."
52
+ "version": "2.2.1",
53
+ "description": "Vesper styles pack \u2014 opt-in output styles: i-have-adhd, ponytail (third-party, MIT). Enabled by `vespercli packs enable styles`, which writes the always-on pointer rule that applies them."
54
+ },
55
+ {
56
+ "name": "vesper-graphify",
57
+ "source": "./packs/graphify",
58
+ "version": "2.2.1",
59
+ "description": "Vesper graphify pack \u2014 opt-in code knowledge graph for the research-side roles (the `graphify-research` skill). graphify is an external tool installed separately (`uv tool install graphifyy`); `vespercli packs enable graphify` prepares the workspace and registers its MCP server."
54
60
  }
55
61
  ]
56
62
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vesper",
3
3
  "displayName": "Vesper",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper specialist subagent catalog + catalog skills for Claude Code. The orchestrator playbook, team roster, slim project whitepaper, the committed main-thread orchestrator agent, and the four maintenance skills are project-committed (see .claude/rules/, .claude/agents/, .claude/skills/) and are deliberately NOT shipped by this plugin.",
6
6
  "author": {
7
7
  "name": "Vesper Maintainers"
@@ -275,7 +275,7 @@ Before assuming any subagent is available, check whether `~/.claude/skills/vespe
275
275
 
276
276
  Run `vesper list --target claude` via `Bash` and capture the full output. This lists every subagent, command, and skill currently installed in the plugin catalog.
277
277
 
278
- **Packs.** The catalog is a **core** plugin plus stack **packs** (`frontend`, `playwright`, `backend`, `polyglot`, `docs`, `integrations`), and a pack is enabled per project only when the roster needs it — so the installed listing may show a pack as *disabled*. Pick from the **whole catalog index** regardless: run `vespercli catalog` (the shipped `CATALOG.md`; always complete) and read each entry's `Pack:` line. A packed specialist is delegated to as `vesper-<pack>:<name>`; a packed skill is `/vesper-<pack>:<name>`. You never enable a pack yourself — the orchestrator runs `vespercli packs sync` after you hand off (final step below).
278
+ **Packs.** The catalog is a **core** plugin plus stack **packs** (`frontend`, `playwright`, `backend`, `polyglot`, `docs`, `integrations`), and a pack is enabled per project only when the roster needs it — so the installed listing may show a pack as *disabled*. Pick from the **whole catalog index** regardless: run `vespercli catalog` (the shipped `CATALOG.md`; always complete) and read each entry's `Pack:` line. A packed specialist is delegated to as `vesper-<pack>:<name>`; a packed skill is `/vesper-<pack>:<name>`. You never enable a pack yourself — the orchestrator runs `vespercli packs sync` after you hand off (final step below). Two packs are **opt-in** and never enabled by the sync: `styles` and `graphify`. When `vespercli packs` shows `graphify` as *enabled*, add the `graphify-research` skill to the Assigned Skills of the Research (`task-researcher`) and Architecture (`se-system-architecture-reviewer`) rows only — developers, testers and reviewers keep `vesper-indexing` as their codebase tool; when it is disabled, do not list the skill anywhere.
279
279
 
280
280
  #### Step 2 — Match Team Composition to Catalog
281
281
 
@@ -6,7 +6,7 @@ description: 'Vesper orchestration data — team roster, task management, routin
6
6
 
7
7
  **Source of truth**: this file is the single authority for this project's available specialist subagents, their roles, and their skill assignments. The orchestrator playbook (the always-on `.claude/rules/vesper-orchestrator.md` rule) routes purely by the names listed in the **Team Roster** below.
8
8
 
9
- **Delegation-name convention (correctness invariant):** every specialist Agent Name in the roster below is the plugin's **namespaced** name — `vesper:<name>` for a core specialist, `vesper-<pack>:<name>` for one shipped by a pack (the catalog index `assets/CATALOG.md` / `vespercli catalog` names each asset's pack) — that is exactly the `subagent_type` the orchestrator must delegate with, since the specialist catalog ships as the `vesper` marketplace plugin plus its packs. The one exception is the committed main-thread persona `vesper-orchestrator` (a project agent, no namespace), used only as the `.claude/settings.json` `agent` key value. `workspace-learner` MUST preserve the plugin prefix on every specialist name it writes here. A packed asset named here (agent or assigned skill) needs its pack enabled for this project: `vespercli packs sync` enables what this roster needs (`init`/`update` run it too; `vespercli doctor` reports a gap as `pack-not-enabled`).
9
+ **Delegation-name convention (correctness invariant):** every specialist Agent Name in the roster below is the plugin's **namespaced** name — `vesper:<name>` for a core specialist, `vesper-<pack>:<name>` for one shipped by a pack (the catalog index `assets/CATALOG.md` / `vespercli catalog` names each asset's pack) — that is exactly the `subagent_type` the orchestrator must delegate with, since the specialist catalog ships as the `vesper` marketplace plugin plus its packs. The one exception is the committed main-thread persona `vesper-orchestrator` (a project agent, no namespace), used only as the `.claude/settings.json` `agent` key value. `workspace-learner` MUST preserve the plugin prefix on every specialist name it writes here. A packed asset named here (agent or assigned skill) needs its pack enabled for this project: `vespercli packs sync` enables what this roster needs (`init`/`update` run it too; `vespercli doctor` reports a gap as `pack-not-enabled`). When the opt-in `graphify` pack is enabled (`vespercli packs enable graphify`), the Research and Architecture rows (`task-researcher`, `se-system-architecture-reviewer`) additionally carry the `graphify-research` skill — impact, path and architecture questions go to the graphify MCP tools; every other role keeps `vesper-indexing` unchanged.
10
10
 
11
11
  ## Repository Policy
12
12
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vesper-backend",
3
3
  "displayName": "Vesper backend pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper backend pack — Node.js/Express, Firebase, NestJS, databases, auth and DevOps specialists and skills. Enabled per project by `vespercli packs sync` when the Team Roster names one of its assets.",
6
6
  "author": {
7
7
  "name": "Vesper Maintainers"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vesper-docs",
3
3
  "displayName": "Vesper docs pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper docs pack — Document processing (docx/pptx/pdf/xlsx) and multimodal (Gemini) skills. Enabled per project by `vespercli packs sync` when the Team Roster names one of its assets.",
6
6
  "author": {
7
7
  "name": "Vesper Maintainers"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vesper-frontend",
3
3
  "displayName": "Vesper frontend pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper frontend pack — React, Next.js, Tailwind and Jest/RTL specialists and skills. Enabled per project by `vespercli packs sync` when the Team Roster names one of its assets.",
6
6
  "author": {
7
7
  "name": "Vesper Maintainers"
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "vesper-graphify",
3
+ "displayName": "Vesper graphify pack",
4
+ "version": "2.2.1",
5
+ "description": "opt-in code knowledge graph for the research-side roles: the Vesper-authored `graphify-research` skill (graph vs FTS routing, qualified node names, EXTRACTED/INFERRED/AMBIGUOUS edge tags). graphify itself (https://github.com/Graphify-Labs/graphify) is an external tool installed separately (`uv tool install graphifyy`), never vendored; `vespercli packs enable graphify` is the consent and prepares the workspace (gitignore + post-checkout blocks, the graphify MCP server). vesper-indexing stays the default codebase tool.",
6
+ "author": {
7
+ "name": "Vesper Maintainers"
8
+ },
9
+ "license": "MIT"
10
+ }
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: agent-fundamentals
3
+ description: Universal operating rules for all Vesper subagents — codebase query protocol, terminal discipline, tool usage patterns, and response standards. Use when any subagent needs to search code, run terminal commands, perform file operations, or produce output. This is the baseline skill every Vesper subagent should follow.
4
+ ---
5
+
6
+ # Vesper Agent Fundamentals
7
+
8
+ Universal operating rules for every subagent in the Vesper ecosystem. These are non-negotiable behaviors — not guidelines.
9
+
10
+ ## Codebase Query Protocol
11
+
12
+ **PRIMARY**: `vesper-indexing` MCP tools are the first-choice codebase exploration method.
13
+
14
+ | Tool | Purpose |
15
+ | ---------------------------------------- | ----------------------------------------------------- |
16
+ | `mcp__vesper-indexing__vesper_search` | Full-text code search → returns snippets + file paths |
17
+ | `mcp__vesper-indexing__vesper_symbols` | Find functions, classes, exports by name + location |
18
+ | `mcp__vesper-indexing__vesper_status` | Check index health before querying |
19
+ | `mcp__vesper-indexing__vesper_reindex` | Rebuild index if stale or empty |
20
+
21
+ - Results include actual source code — skip `Read` unless you need wider surrounding context.
22
+ - If the index is empty or MCP unavailable → **STOP and report**. Do NOT silently fall back to directory traversals or `find` commands.
23
+ - For broader exploration beyond indexed content: `Grep`, `Glob` are acceptable secondary tools.
24
+ - **Archives are off-limits in normal pipelines**: never read, grep, or search `.vesper/history-archive/` or `.vesper/.tracking/archive/` during ordinary work — they are index-excluded and reachable only via `/revalidate-knowledge`. See [codebase-query.md](references/codebase-query.md).
25
+
26
+ ## Terminal Discipline
27
+
28
+ See [terminal-discipline.md](references/terminal-discipline.md) for expanded rules and examples.
29
+
30
+ | Rule | Requirement |
31
+ | --------------------------- | -------------------------------------------------------------------------- |
32
+ | **Timeout** | Every command gets one. Quick=15s, build=120s, test=300s. Default=30s. |
33
+ | **No foreground blockers** | `tail -f`, `watch`, dev servers → always run with `run_in_background: true`. |
34
+ | **Output cap** | `\| head -30` if output may exceed 50 lines. |
35
+ | **Stderr capture** | `2>&1 \| head -N` for both stdout and stderr. |
36
+ | **No `cd &&` chaining** | Use `pushd path && command && popd` instead. |
37
+ | **Runtime version guard** | Node commands → check `.nvmrc`/`.node-version`, chain `nvm use` in the same call. Ignore if unavailable. |
38
+ | **Tools-first** | Never use `Bash` for tasks built-in tools handle. |
39
+
40
+ ## Tool Usage Hierarchy
41
+
42
+ See [tool-usage-patterns.md](references/tool-usage-patterns.md) for comprehensive patterns and anti-patterns.
43
+
44
+ **Always prefer built-in tools over `Bash` equivalents:**
45
+
46
+ | Task | ✅ Correct Tool | ❌ Never Do This |
47
+ | -------------- | -------------------------- | ---------------------------------------------- |
48
+ | Read a file | `Read` | `cat`, `less`, `node -e "fs.readFileSync()"` |
49
+ | Search code | `Grep`, `mcp__vesper-indexing__vesper_search` | `grep -r`, `find . -exec grep` |
50
+ | Find files | `Glob` | `find .`, `ls -R`, `tree` |
51
+ | Create a file | `Write` | `echo > file`, `python -c "open().write()"` |
52
+ | Edit a file | `Edit` | `sed -i`, `node -e "fs.writeFileSync()"` |
53
+ | Check errors | `Bash` (the project's own lint/typecheck command) | Manual terminal compilation |
54
+
55
+ ## Secret & Credential Handling
56
+
57
+ **NEVER write a secret to a file.** No token, API key, password, private key, or connection string carrying an embedded secret may be written into any file you `Write` or `Edit` — regardless of git host, language, or task.
58
+
59
+ | Trigger | Required Action |
60
+ | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
61
+ | A value about to be written looks like a token/credential/secret | **STOP** — do not write it. Require explicit user confirmation before proceeding. |
62
+ | You are a subagent and cannot ask the user directly | **Escalate, don't write** — surface the blocker and stop (same reflex as the Codebase Query Protocol's "STOP and report"), rather than silently writing the secret. Return `NEED_HELP` to the orchestrator so a human is asked before any write. |
63
+ | The user explicitly approves writing the value | Proceed, then **record the approved exception** back into the project's instructions (`CLAUDE.md` or the relevant `.claude/vesper/*.md`) so the same value isn't re-flagged on a later pass. |
64
+
65
+ - Detection is on the **value**, not the file: a secret-shaped string (a long random token, `ghp_…`/`glpat-…`-style prefixes, a PEM `-----BEGIN … PRIVATE KEY-----` block, a `user:password@host` connection URL) triggers the stop — even inside configs, tests, or docs.
66
+ - Prefer a placeholder or environment-variable reference (`${MY_TOKEN}`) over the literal secret whenever a file genuinely needs the name.
67
+ - When in doubt, halt and surface it — never silently work around it.
68
+
69
+ ## Direct Collaboration (Nested Delegation)
70
+
71
+ If your toolset includes `Agent`, you may delegate directly to another specialist instead of returning `NEED_HELP` to the orchestrator. This is the preferred path for bounded assists — it saves a full round-trip through the orchestrator.
72
+
73
+ **Protocol:**
74
+
75
+ 1. **Roster only**: Pick the collaborator from the Team Roster (`.claude/vesper/orchestration.md`) and use its **exact name** as the `subagent_type`. If it's not on the roster, it doesn't exist.
76
+ 2. **Depth accounting**: Your delegation prompt includes a `Nesting depth: N` marker (the orchestrator is depth 0; its direct delegates are depth 1). When you delegate, include `Nesting depth: N+1` in the prompt. If no marker was given, assume you are at depth 1.
77
+ 3. **Depth budget**: If your depth N ≥ 3, do NOT delegate — end with `Status: NEED_HELP` instead and describe what you need in `Next:`. (The platform maximum is 5; stopping at 3 leaves headroom for your collaborator to make one nested call of its own.)
78
+ 4. **Point assists only**: Nested delegation is for a bounded question, review, lookup, or gap-fill — never for executing a whole pipeline step that belongs on the orchestrator's todo list. If the work you need is a pipeline step, return `NEED_HELP`.
79
+ 5. **Self-contained prompts**: Same rules the orchestrator follows — include file paths, enough background to act, the expected output, the depth marker, and the requirement to end with the `Status:/Summary:/Next:` footer.
80
+ 6. **Fold results in**: Your collaborator's final message returns to YOU, not the orchestrator. Incorporate it into your own artifacts/output, and note the collaboration in your final `Summary:` so the orchestrator has the full picture.
81
+ 7. **Fallback is always available**: `Agent` tool missing from your toolset, the call fails, or the depth budget is spent → end with `Status: NEED_HELP` and what you need in `Next:`. The orchestrator will route it.
82
+
83
+ ## Response Standards
84
+
85
+ - **Be direct**: State findings, don't narrate your process.
86
+ - **Show evidence**: Back claims with file paths, line numbers, or code snippets.
87
+ - **Report blockers immediately**: If MCP tools fail, index is empty, or permissions block you — say so. Don't silently work around it.
88
+ - **No verbose preambles**: Skip "I'll now..." or "Let me..." — just do the work.
89
+ - **Structured output**: Use Markdown tables, bullet lists, and code blocks. Walls of text = failure.
@@ -0,0 +1,95 @@
1
+ # Codebase Query Protocol
2
+
3
+ How Vesper subagents should explore and understand any codebase.
4
+
5
+ ## Priority Order
6
+
7
+ ```
8
+ 1. vesper-indexing MCP tools (PRIMARY — always try first)
9
+ 2. Grep (SECONDARY — when index lacks coverage)
10
+ 3. Glob + Read (TERTIARY — targeted file inspection)
11
+ 4. Bash (LAST RESORT — only for operations with no built-in equivalent)
12
+ ```
13
+
14
+ ## Archive Exclusion (normal pipelines)
15
+
16
+ Archived knowledge directories — `.vesper/history-archive/`, `.vesper/.tracking/archive/`, and `.vesper/.tracking/stories/completed/archive/` — are **excluded from all normal-pipeline reads, greps, and searches**. They are also excluded from the `vesper-indexing` index (`DEFAULT_EXCLUDES`), so `vesper_search`/`vesper_symbols` never surface their contents. Do NOT `Grep`, `Read`, or otherwise crawl these paths during ordinary research, planning, implementation, or review work. They hold intentionally retired material (rotated history, archived tracking artifacts) and are reachable **only** through the explicit `/revalidate-knowledge` flow, which re-validates archived knowledge against current code. If you think you need something from an archive, that is a signal to surface `/revalidate-knowledge` to the user — not to read the archive directly.
17
+
18
+ ## vesper-indexing MCP Tools
19
+
20
+ ### mcp__vesper-indexing__vesper_search
21
+
22
+ Full-text code search across the indexed workspace. Returns matching code snippets with file paths and line ranges.
23
+
24
+ ```
25
+ Use for: Finding specific code patterns, function calls, variable usage,
26
+ string literals, error messages, configuration values
27
+ ```
28
+
29
+ **Key behavior**: Results include actual source code. In most cases, you DO NOT need a follow-up `Read` unless you need wider context beyond the returned snippet.
30
+
31
+ ### mcp__vesper-indexing__vesper_symbols
32
+
33
+ Find functions, classes, exports, and other symbols by name. Returns symbol type, location, and surrounding code.
34
+
35
+ ```
36
+ Use for: Finding function definitions, class declarations, exported modules,
37
+ understanding module interfaces, locating entry points
38
+ ```
39
+
40
+ ### mcp__vesper-indexing__vesper_status
41
+
42
+ Check the health and state of the search index.
43
+
44
+ ```
45
+ Use for: Verifying the index is populated before querying,
46
+ checking if a reindex is needed after major file changes
47
+ ```
48
+
49
+ ### mcp__vesper-indexing__vesper_reindex
50
+
51
+ Force a rebuild of the search index.
52
+
53
+ ```
54
+ Use for: After bulk file operations, when vesper_status reports stale data,
55
+ when search results seem incomplete
56
+ ```
57
+
58
+ ## Index Failure Protocol
59
+
60
+ If vesper-indexing tools fail or return empty results:
61
+
62
+ 1. **STOP** — do not silently fall back
63
+ 2. **Report** the failure to the user: "vesper-indexing MCP is unavailable/empty"
64
+ 3. **Fall back explicitly** to `Grep` with a note
65
+ 4. **Never** start crawling directories with `find`, `ls -R`, or `tree` as a hidden workaround
66
+
67
+ ## Secondary Tools
68
+
69
+ ### Grep
70
+
71
+ Best for exact text matches, regex patterns, filtering by file type.
72
+
73
+ ```
74
+ Use when:
75
+ - You know the exact string or pattern
76
+ - You need regex matching
77
+ - You want to scope to specific files (glob filter)
78
+ ```
79
+
80
+ ### Glob
81
+
82
+ Best for finding files by name or path pattern.
83
+
84
+ ```
85
+ Use when:
86
+ - You know the filename but not the location
87
+ - You need all files matching a glob (e.g., **/*.test.ts)
88
+ - You're looking for configuration files
89
+ ```
90
+
91
+ ## Exploration Efficiency
92
+
93
+ - **Batch when possible**: Multiple `Grep` calls with regex alternation (`pattern1|pattern2`) instead of sequential single-pattern searches
94
+ - **Read targeted ranges**: Use `Read` with a specific `offset`/`limit`, not the entire file
95
+ - **Use subagents for deep exploration**: For complex multi-step searches, delegate to a specialist subagent (from the Team Roster) via the `Agent` tool instead of manually chaining 10+ search calls. Specialist agents own their own discovery — never invoke a subagent that bypasses the roster.
@@ -0,0 +1,94 @@
1
+ # Terminal Discipline — Expanded Rules
2
+
3
+ Non-negotiable rules for every `Bash` command a subagent executes.
4
+
5
+ ## Timeout Requirements
6
+
7
+ | Command Type | Timeout | Examples |
8
+ | -------------------- | ---------- | ---------------------------------------------------------- |
9
+ | Quick | 15s | `ls`, `cat`, `echo`, `which`, `git status` |
10
+ | Package management | 60s | `npm install`, `pip install`, `brew install` |
11
+ | Build | 120s | `npm run build`, `tsc`, `esbuild`, `webpack` |
12
+ | Test | 300s | `npm test`, `vitest run`, `pytest`, `playwright test` |
13
+ | Default | 30s | Anything not in the above categories |
14
+
15
+ **Every command gets a timeout. No exceptions.**
16
+
17
+ ## Background Processes
18
+
19
+ Commands that never terminate must be run with `run_in_background: true`:
20
+
21
+ - Dev servers: `npm run dev`, `next dev`, `vite dev`
22
+ - Watch modes: `tsc --watch`, `vitest --watch`, `nodemon`
23
+ - Log tailing: `tail -f`, `docker logs -f`
24
+ - Containers: `docker compose up`
25
+ - Any long-running process the subagent doesn't need to wait for
26
+
27
+ After starting a background process, check its output via the harness's background-task output mechanism rather than blocking on it.
28
+
29
+ ## Output Control
30
+
31
+ ```bash
32
+ # Cap output to prevent context overflow
33
+ command | head -30
34
+
35
+ # Capture both stdout and stderr
36
+ command 2>&1 | head -30
37
+
38
+ # Count lines before displaying
39
+ command | wc -l # check size first, then decide head limit
40
+
41
+ # Git: always limit
42
+ git log --oneline -20
43
+ git diff --stat
44
+
45
+ # Grep: files-only when appropriate
46
+ grep -rl "pattern" src/
47
+ ```
48
+
49
+ **Never** let unbounded output flood the context window. If output might exceed 50 lines, pipe through `head`.
50
+
51
+ ## Directory Navigation
52
+
53
+ ```bash
54
+ # ❌ WRONG — breaks permission-prompt matching (matching starts from `cd`)
55
+ cd /some/path && npm run build
56
+
57
+ # ✅ CORRECT — preserves working directory, approval matches `npm`
58
+ pushd /some/path && npm run build && popd
59
+
60
+ # ✅ ALSO CORRECT — if already in the right directory
61
+ npm run build
62
+ ```
63
+
64
+ The `cd && command` pattern breaks command-matching for permission prompts because matching starts from `cd`, not the actual command. Always use `pushd`/`popd` for temporary directory changes.
65
+
66
+ ## Runtime Version Guard (Node/nvm)
67
+
68
+ Projects that pin a Node version via nvm expect every command to run under that version — running under whatever `node` happens to be on PATH can produce misleading build/test failures or silently wrong behavior.
69
+
70
+ Before running any Node-based command (`npm`, `npx`, `yarn`, `pnpm`, `node`, or project scripts that wrap them):
71
+
72
+ 1. Check the project root for `.nvmrc` or `.node-version`.
73
+ 2. If found, chain `nvm use` into the **same** `Bash` call as the actual command — shell state (including nvm's shell function) does not persist between separate tool calls:
74
+ ```bash
75
+ nvm use > /dev/null 2>&1; npm test
76
+ ```
77
+ 3. If `nvm` isn't installed, no version file exists, or the switch fails — proceed anyway with whatever `node` is on PATH. **Never block the task on this.**
78
+
79
+ Do not run `nvm use` as its own command and expect it to carry over to the next one — it won't.
80
+
81
+ ## curl Rules
82
+
83
+ - Always set `--max-time 5` to prevent hanging on unresponsive hosts
84
+ - Localhost health checks only without explicit user approval
85
+ - Never curl external URLs without user awareness
86
+
87
+ ## Timeout Recovery
88
+
89
+ When a command times out:
90
+
91
+ 1. **Diagnose first** — `ps aux | grep <process>` to check if it's still running
92
+ 2. **Report to user** — Explain what happened and why
93
+ 3. **Don't blindly retry** — The same command will likely time out again
94
+ 4. **Suggest alternatives** — Smaller scope, different approach, or user intervention
@@ -0,0 +1,67 @@
1
+ # Tool Usage Patterns
2
+
3
+ Comprehensive guide for when to use which tools. Built-in tools trump `Bash` in every case where they're available.
4
+
5
+ ## File Reading
6
+
7
+ | Scenario | Tool | Notes |
8
+ | --------------------------------- | ------------------ | -------------------------------------------- |
9
+ | Read known file | `Read` | Specify `offset`/`limit` to limit token usage |
10
+ | Read file overview | `Grep` | Search for key patterns in the file |
11
+ | Read file existence | `Glob` | Glob pattern matching |
12
+ | Read directory listing | `Glob`/`Bash` (`ls`) | Lists immediate children |
13
+
14
+ **Anti-patterns:**
15
+ - `cat file.txt` — use `Read`
16
+ - `less file.txt` — blocks terminal, use `Read`
17
+ - `head -n 50 file.txt` — use `Read` with a line range
18
+ - `node -e "console.log(fs.readFileSync(...))"` — never
19
+
20
+ ## Code Search
21
+
22
+ | Scenario | Tool | Notes |
23
+ | ---------------------------------- | ------------------------------------------------- | ---------------------------------------------------- |
24
+ | Primary codebase search | `mcp__vesper-indexing__vesper_search` | Full-text, returns snippets with paths + line ranges |
25
+ | Find symbols (functions/classes)| `mcp__vesper-indexing__vesper_symbols` | Name-based lookup with locations |
26
+ | Exact text / regex match | `Grep` | Fast, supports regex, glob filters |
27
+ | Find files by name/glob | `Glob` | Filename/path patterns only |
28
+
29
+ **Anti-patterns:**
30
+ - `grep -r "pattern" .` — use `Grep`
31
+ - `find . -name "*.ts" -exec grep` — use `Glob` + `Grep`
32
+ - `rg "pattern"` — use `Grep`
33
+ - `tree` / `ls -R` — use `Glob`
34
+
35
+ ## File Writing
36
+
37
+ | Scenario | Tool | Notes |
38
+ | ----------------------------- | -------------------------- | ---------------------------------------- |
39
+ | Create new file | `Write` | Creates parent directories |
40
+ | Edit existing file | `Edit` | Include enough surrounding context to make the match unique |
41
+ | Multiple identical edits | `Edit` with `replace_all` | Batch identical replacements in one call |
42
+ | Rename / move file | `Bash` + `mv` | Only case where terminal is correct |
43
+
44
+ **Anti-patterns:**
45
+ - `echo "content" > file.txt` — use `Write`
46
+ - `python -c "open('f','w').write('...')"` — never
47
+ - `node -e "fs.writeFileSync(...)"` — never
48
+ - `sed -i 's/old/new/g' file` — use `Edit`
49
+ - `perl -pi -e 's/old/new/'` — use `Edit`
50
+
51
+ ## Error Checking
52
+
53
+ | Scenario | Tool | Notes |
54
+ | ------------------------ | --------------- | --------------------------------------------- |
55
+ | Compile/lint errors | `Bash` (project's own lint/typecheck script) | No dedicated "get errors" tool — run what CI runs |
56
+ | Test failures | `Bash` | For test execution |
57
+
58
+ ## When Terminal (`Bash`) IS Correct
59
+
60
+ Terminal is the right tool for:
61
+ - Running tests (`npm test`, `vitest run`, `pytest`)
62
+ - Package management (`npm install`, `pip install`)
63
+ - Build commands (`npm run build`)
64
+ - Git operations (`git status`, `git diff`)
65
+ - Starting dev servers (with `run_in_background: true`)
66
+ - Moving/renaming files (`mv`)
67
+ - Operations that have no built-in tool equivalent