@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
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: graphify-research
3
+ description: Code knowledge graph for research-side roles (task-researcher, se-system-architecture-reviewer) when the opt-in graphify pack is enabled. Routes impact ("who calls X"), path ("how does A reach B"), architecture and onboarding questions to the graphify MCP tools (query_graph, get_node, get_neighbors, shortest_path, get_pr_impact) and keeps locate/edit questions on vesper_search / vesper_symbols. Covers qualified node names, the EXTRACTED / INFERRED / AMBIGUOUS edge tags, why GRAPH_REPORT.md is never read whole, MCP tools over the CLI, and the fallback when the server or graph is absent.
4
+ ---
5
+
6
+ # graphify research
7
+
8
+ The `graphify` pack gives the **research-side roles** a code knowledge graph built by
9
+ [graphify](https://github.com/Graphify-Labs/graphify) (an external tool; PyPI `graphifyy`, CLI
10
+ `graphify`). It complements vesper-indexing, it does not replace it: `vesper_search` /
11
+ `vesper_symbols` remain the default codebase tool for every role, and developers, testers and
12
+ reviewers keep using them unchanged. This skill is loaded only by `task-researcher` and
13
+ `se-system-architecture-reviewer`, and only when the Team Roster lists it (the pack is enabled).
14
+
15
+ ## When the graph beats the index (measured 2026-10-01, ~25k-LOC repo)
16
+
17
+ | Question shape | Use | Why |
18
+ | :-- | :-- | :-- |
19
+ | **Locate** — "where is `decideHostAction` defined", "which file holds the gitignore writer" | `vesper_search` / `vesper_symbols` | Tie with the graph; the index is already loaded and returns the snippet you edit |
20
+ | **Edit** — anything that ends in a code change | `vesper_search` / `vesper_symbols` | The developer roles never use the graph |
21
+ | **Impact** — "who calls `decideHostAction`", "what breaks if `packs.js` changes" | graphify `get_neighbors` / `get_pr_impact` | ~40% fewer tokens AND complete — FTS missed callers inside test callbacks |
22
+ | **Path** — "how does `utils/packs.js` reach `opencode-overlay.js`" | graphify `shortest_path` | 10–25× fewer tokens than reading files along the way |
23
+ | **Architecture / onboarding** — "what are the modules and how do they cluster", "what is central here" | graphify `query_graph` (communities, god nodes) | One query instead of a directory traversal |
24
+
25
+ Rule of thumb: a question whose answer is a **set of relationships** goes to the graph; a question
26
+ whose answer is **a location or a snippet** goes to the index. When unsure, ask the index first
27
+ (cheap, always present) and escalate to the graph for the relationship part.
28
+
29
+ ## Always pass QUALIFIED node names
30
+
31
+ graphify's name matching is **fuzzy**: an unqualified `packs.js` resolved to `packs.test.js`.
32
+ Every tool call names nodes by their **path-qualified** form:
33
+
34
+ - a file: `src/cli/utils/packs.js` (never `packs.js`);
35
+ - a symbol: `src/cli/utils/packs.js#enablePack` (file `#` symbol), or the `source_file` +
36
+ `label` pair `get_node` returns.
37
+
38
+ Resolve the qualified name once with `get_node` (or with `vesper_symbols`) before an impact or path
39
+ query, and quote it back in your report so the reader can repeat the query.
40
+
41
+ ## Use the MCP server, not the CLI
42
+
43
+ The `graphify` CLI reloads `graphify-out/graph.json` (tens of MB) on every call (~2 s each). The
44
+ pack registers the MCP server `graphify` (`vespercli mcp serve graphify`, which runs
45
+ `python -m graphify.serve graphify-out/graph.json` under the interpreter graphify recorded in
46
+ `graphify-out/.graphify_python`), which keeps the graph resident — its tools are the ones to call:
47
+
48
+ | Tool | Use |
49
+ | :-- | :-- |
50
+ | `query_graph` | free-form question over the graph (communities, central nodes, "how does X relate to Y") |
51
+ | `get_node` | one node's attributes (`label`, `source_file`, `source_location`, `community`) — the name resolver |
52
+ | `get_neighbors` | the edges around a node: callers, callees, imports — the impact tool |
53
+ | `shortest_path` | the chain from A to B — the path tool |
54
+ | `get_pr_impact` | the nodes a change set touches and what depends on them |
55
+
56
+ Never shell out to `graphify query` / `graphify path` from an agent when the server is available.
57
+ The one CLI command you may name (never run yourself unless asked) is `graphify update .`, which
58
+ builds or refreshes the graph.
59
+
60
+ ## Read the edge tags
61
+
62
+ Every edge carries a confidence tag. Weight your conclusions by it and say which tag backs each
63
+ claim:
64
+
65
+ - **EXTRACTED** — from the code via tree-sitter. Trust it.
66
+ - **INFERRED** — LLM-derived. Verify before acting on it: confirm with `get_node` on both ends or
67
+ a `vesper_search` for the relationship.
68
+ - **AMBIGUOUS** — an unresolved name (several candidates). Confirm with `vesper_search` /
69
+ `vesper_symbols` which candidate the code really means before you report it.
70
+
71
+ ## Never read GRAPH_REPORT.md whole
72
+
73
+ `graphify-out/GRAPH_REPORT.md` can be hundreds of KB. Query the specific node or section you need
74
+ (`get_node`, `get_community`, or a targeted `vesper_search` over the report for one heading) —
75
+ never load the file into context.
76
+
77
+ ## Cost and data flow
78
+
79
+ - Code never leaves the machine: a code-only `graphify update .` is tree-sitter extraction, **0
80
+ tokens**, ~35 s on a ~25k-LOC repo (tens of thousands of nodes/edges, graph.json ~56 MB).
81
+ - Doc/PDF extraction and community **labels** call an LLM. `--no-label` skips the labels; a
82
+ code-only run calls nothing.
83
+ - `graphify-out/graph.json` is **committed and shared** (`vespercli packs enable graphify` writes
84
+ the `.gitignore` block that ignores the rest of `graphify-out/`); the Vesper post-checkout hook
85
+ runs `graphify update .` after a branch checkout when the tool is on PATH, so the graph follows
86
+ the branch. `vespercli doctor` reports a graph built from a commit other than HEAD
87
+ (`graphify-stale`).
88
+
89
+ ## When the server or the graph is absent
90
+
91
+ If the `graphify` MCP tools are unavailable, or a call reports that `graphify-out/graph.json` does
92
+ not exist or is stale:
93
+
94
+ 1. **Fall back to `vesper_search` / `vesper_symbols`** for the whole question — answer it the way
95
+ the roles always have; do not stop, do not ask the user to install anything mid-task.
96
+ 2. In your report, add one line: "graphify graph unavailable — answered from vesper-indexing; run
97
+ `graphify update .` (tool: `uv tool install graphifyy`, or `pipx install graphifyy`, or
98
+ `python3 -m pip install --user graphifyy`) to build the graph", and, for an impact
99
+ question, note that FTS may miss callers inside callbacks.
100
+ 3. Never run `graphify update .`, `graphify install` or any graphify LLM path yourself unless the
101
+ user asks for exactly that.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vesper-integrations",
3
3
  "displayName": "Vesper integrations pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "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; UPSTREAM.json beside each). 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-playwright",
3
3
  "displayName": "Vesper playwright pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper playwright pack — Playwright end-to-end testing 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-polyglot",
3
3
  "displayName": "Vesper polyglot pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "Vesper polyglot pack — Java, Flutter and Google ADK (Python) 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-styles",
3
3
  "displayName": "Vesper styles pack",
4
- "version": "2.1.0",
4
+ "version": "2.2.1",
5
5
  "description": "opt-in output styles: i-have-adhd, ponytail. Third-party skills (MIT) shipped as pack content, never written into a project; `vespercli packs enable styles` is the consent and writes the always-on pointer rule that applies them.",
6
6
  "author": {
7
7
  "name": "Vesper Maintainers"
@@ -179,7 +179,7 @@ off your own inference about the host.
179
179
  - Because of direct collaboration, a `NEED_HELP` you receive means the subagent genuinely couldn't resolve it — its `Agent` tool was missing, the depth budget was spent, or the need is a full pipeline step (which is yours to route, never theirs to run). Route it per the roster and re-delegate with the answer.
180
180
  - Multiple `Agent` calls can run in parallel in a single turn — use this for independent tracks (see Orchestration Loop below). Nested spawns by your delegates count toward overall load: when delegating to agents likely to collaborate (planner, TPM, feature-wrap), keep your own parallel fan-out modest (≤ 3).
181
181
 
182
- **Codebase context**: Subagents MUST use `vesper-indexing` MCP tools (`mcp__vesper-indexing__vesper_search`, `mcp__vesper-indexing__vesper_symbols`) for codebase queries. If MCP is unavailable, STOP and ask the user — do NOT silently fall back. Avoid full directory traversals. If the index is empty or stale, delegate to `workspace-learner` to reindex.
182
+ **Codebase context**: Subagents MUST use `vesper-indexing` MCP tools (`mcp__vesper-indexing__vesper_search`, `mcp__vesper-indexing__vesper_symbols`) for codebase queries. If MCP is unavailable, STOP and ask the user — do NOT silently fall back. Avoid full directory traversals. If the index is empty or stale, delegate to `workspace-learner` to reindex. When the `graphify` pack is enabled, research-side roles additionally use the graphify MCP tools (`graphify-research` skill) for impact, path and architecture questions.
183
183
 
184
184
  **Delegation prompt framing**: When referencing codebase artifacts in delegation prompts, describe **what to investigate** (concepts, patterns, behaviors), not **which files to read**. Subagents own their own discovery workflow via vesper-indexing. File paths may appear as hints, never as read commands.
185
185
 
@@ -276,7 +276,7 @@ Before assuming any subagent is available, check whether `~/.vesper/skills/vespe
276
276
 
277
277
  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.
278
278
 
279
- **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 `<name>`; a packed skill is `<name>`. You never enable a pack yourself — the orchestrator runs `vespercli packs sync` after you hand off (final step below).
279
+ **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 `<name>`; a packed skill is `<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.
280
280
 
281
281
  #### Step 2 — Match Team Composition to Catalog
282
282
 
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: graphify-research
3
+ description: Code knowledge graph for research-side roles (task-researcher, se-system-architecture-reviewer) when the opt-in graphify pack is enabled. Routes impact ("who calls X"), path ("how does A reach B"), architecture and onboarding questions to the graphify MCP tools (query_graph, get_node, get_neighbors, shortest_path, get_pr_impact) and keeps locate/edit questions on vesper_search / vesper_symbols. Covers qualified node names, the EXTRACTED / INFERRED / AMBIGUOUS edge tags, why GRAPH_REPORT.md is never read whole, MCP tools over the CLI, and the fallback when the server or graph is absent.
4
+ ---
5
+
6
+ # graphify research
7
+
8
+ The `graphify` pack gives the **research-side roles** a code knowledge graph built by
9
+ [graphify](https://github.com/Graphify-Labs/graphify) (an external tool; PyPI `graphifyy`, CLI
10
+ `graphify`). It complements vesper-indexing, it does not replace it: `vesper_search` /
11
+ `vesper_symbols` remain the default codebase tool for every role, and developers, testers and
12
+ reviewers keep using them unchanged. This skill is loaded only by `task-researcher` and
13
+ `se-system-architecture-reviewer`, and only when the Team Roster lists it (the pack is enabled).
14
+
15
+ ## When the graph beats the index (measured 2026-10-01, ~25k-LOC repo)
16
+
17
+ | Question shape | Use | Why |
18
+ | :-- | :-- | :-- |
19
+ | **Locate** — "where is `decideHostAction` defined", "which file holds the gitignore writer" | `vesper_search` / `vesper_symbols` | Tie with the graph; the index is already loaded and returns the snippet you edit |
20
+ | **Edit** — anything that ends in a code change | `vesper_search` / `vesper_symbols` | The developer roles never use the graph |
21
+ | **Impact** — "who calls `decideHostAction`", "what breaks if `packs.js` changes" | graphify `get_neighbors` / `get_pr_impact` | ~40% fewer tokens AND complete — FTS missed callers inside test callbacks |
22
+ | **Path** — "how does `utils/packs.js` reach `opencode-overlay.js`" | graphify `shortest_path` | 10–25× fewer tokens than reading files along the way |
23
+ | **Architecture / onboarding** — "what are the modules and how do they cluster", "what is central here" | graphify `query_graph` (communities, god nodes) | One query instead of a directory traversal |
24
+
25
+ Rule of thumb: a question whose answer is a **set of relationships** goes to the graph; a question
26
+ whose answer is **a location or a snippet** goes to the index. When unsure, ask the index first
27
+ (cheap, always present) and escalate to the graph for the relationship part.
28
+
29
+ ## Always pass QUALIFIED node names
30
+
31
+ graphify's name matching is **fuzzy**: an unqualified `packs.js` resolved to `packs.test.js`.
32
+ Every tool call names nodes by their **path-qualified** form:
33
+
34
+ - a file: `src/cli/utils/packs.js` (never `packs.js`);
35
+ - a symbol: `src/cli/utils/packs.js#enablePack` (file `#` symbol), or the `source_file` +
36
+ `label` pair `get_node` returns.
37
+
38
+ Resolve the qualified name once with `get_node` (or with `vesper_symbols`) before an impact or path
39
+ query, and quote it back in your report so the reader can repeat the query.
40
+
41
+ ## Use the MCP server, not the CLI
42
+
43
+ The `graphify` CLI reloads `graphify-out/graph.json` (tens of MB) on every call (~2 s each). The
44
+ pack registers the MCP server `graphify` (`vespercli mcp serve graphify`, which runs
45
+ `python -m graphify.serve graphify-out/graph.json` under the interpreter graphify recorded in
46
+ `graphify-out/.graphify_python`), which keeps the graph resident — its tools are the ones to call:
47
+
48
+ | Tool | Use |
49
+ | :-- | :-- |
50
+ | `query_graph` | free-form question over the graph (communities, central nodes, "how does X relate to Y") |
51
+ | `get_node` | one node's attributes (`label`, `source_file`, `source_location`, `community`) — the name resolver |
52
+ | `get_neighbors` | the edges around a node: callers, callees, imports — the impact tool |
53
+ | `shortest_path` | the chain from A to B — the path tool |
54
+ | `get_pr_impact` | the nodes a change set touches and what depends on them |
55
+
56
+ Never shell out to `graphify query` / `graphify path` from an agent when the server is available.
57
+ The one CLI command you may name (never run yourself unless asked) is `graphify update .`, which
58
+ builds or refreshes the graph.
59
+
60
+ ## Read the edge tags
61
+
62
+ Every edge carries a confidence tag. Weight your conclusions by it and say which tag backs each
63
+ claim:
64
+
65
+ - **EXTRACTED** — from the code via tree-sitter. Trust it.
66
+ - **INFERRED** — LLM-derived. Verify before acting on it: confirm with `get_node` on both ends or
67
+ a `vesper_search` for the relationship.
68
+ - **AMBIGUOUS** — an unresolved name (several candidates). Confirm with `vesper_search` /
69
+ `vesper_symbols` which candidate the code really means before you report it.
70
+
71
+ ## Never read GRAPH_REPORT.md whole
72
+
73
+ `graphify-out/GRAPH_REPORT.md` can be hundreds of KB. Query the specific node or section you need
74
+ (`get_node`, `get_community`, or a targeted `vesper_search` over the report for one heading) —
75
+ never load the file into context.
76
+
77
+ ## Cost and data flow
78
+
79
+ - Code never leaves the machine: a code-only `graphify update .` is tree-sitter extraction, **0
80
+ tokens**, ~35 s on a ~25k-LOC repo (tens of thousands of nodes/edges, graph.json ~56 MB).
81
+ - Doc/PDF extraction and community **labels** call an LLM. `--no-label` skips the labels; a
82
+ code-only run calls nothing.
83
+ - `graphify-out/graph.json` is **committed and shared** (`vespercli packs enable graphify` writes
84
+ the `.gitignore` block that ignores the rest of `graphify-out/`); the Vesper post-checkout hook
85
+ runs `graphify update .` after a branch checkout when the tool is on PATH, so the graph follows
86
+ the branch. `vespercli doctor` reports a graph built from a commit other than HEAD
87
+ (`graphify-stale`).
88
+
89
+ ## When the server or the graph is absent
90
+
91
+ If the `graphify` MCP tools are unavailable, or a call reports that `graphify-out/graph.json` does
92
+ not exist or is stale:
93
+
94
+ 1. **Fall back to `vesper_search` / `vesper_symbols`** for the whole question — answer it the way
95
+ the roles always have; do not stop, do not ask the user to install anything mid-task.
96
+ 2. In your report, add one line: "graphify graph unavailable — answered from vesper-indexing; run
97
+ `graphify update .` (tool: `uv tool install graphifyy`, or `pipx install graphifyy`, or
98
+ `python3 -m pip install --user graphifyy`) to build the graph", and, for an impact
99
+ question, note that FTS may miss callers inside callbacks.
100
+ 3. Never run `graphify update .`, `graphify install` or any graphify LLM path yourself unless the
101
+ user asks for exactly that.
@@ -5,6 +5,7 @@
5
5
  "backend",
6
6
  "docs",
7
7
  "frontend",
8
+ "graphify",
8
9
  "integrations",
9
10
  "playwright",
10
11
  "polyglot",
@@ -82,6 +83,7 @@
82
83
  "gitlab-ci-skill",
83
84
  "gitlab-guardrails",
84
85
  "google-adk-python",
86
+ "graphify-research",
85
87
  "i-have-adhd",
86
88
  "java",
87
89
  "mcp-builder",
@@ -170,6 +172,7 @@
170
172
  "gitlab-ci-skill": "integrations",
171
173
  "gitlab-guardrails": "integrations",
172
174
  "google-adk-python": "polyglot",
175
+ "graphify-research": "graphify",
173
176
  "i-have-adhd": "styles",
174
177
  "java": "polyglot",
175
178
  "mcp-builder": "core",