@mthanh/vespercli 1.5.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +144 -88
  2. package/assets/CATALOG.md +19 -1
  3. package/assets/claude/agents/feature-wrap-document.md +138 -13
  4. package/assets/claude/agents/history-logger.md +22 -0
  5. package/assets/claude/agents/workspace-learner.md +45 -12
  6. package/assets/claude/commands/compact-knowledge.md +1 -1
  7. package/assets/claude/commands/revalidate-knowledge.md +17 -0
  8. package/assets/claude/context.md.tpl +38 -14
  9. package/assets/claude/skills/agent-fundamentals/SKILL.md +15 -0
  10. package/assets/claude/skills/agent-fundamentals/references/codebase-query.md +4 -0
  11. package/assets/claude/skills/gitlab-guardrails/SKILL.md +62 -0
  12. package/assets/claude/skills/vesper-catalog-editing-safety/SKILL.md +141 -0
  13. package/assets/claude/vesper-orchestrator.md +10 -0
  14. package/assets/core/agents/feature-wrap-document.agent.md +37 -11
  15. package/assets/core/agents/history-logger.agent.md +22 -0
  16. package/assets/core/agents/vesper.agent.md +5 -0
  17. package/assets/core/agents/workspace-learner.agent.md +43 -12
  18. package/assets/core/prompts/compact-knowledge.prompt.md +1 -1
  19. package/assets/core/prompts/revalidate-knowledge.prompt.md +19 -0
  20. package/assets/core/skills/agent-fundamentals/SKILL.md +15 -0
  21. package/assets/core/skills/agent-fundamentals/references/codebase-query.md +4 -0
  22. package/assets/hooks/pre-commit +17 -1
  23. package/assets/manifest.json +37 -0
  24. package/assets/skills/aesthetic/manifest.json +1 -1
  25. package/assets/skills/ai-multimodal/manifest.json +1 -1
  26. package/assets/skills/backend-development/manifest.json +1 -1
  27. package/assets/skills/better-auth/manifest.json +1 -1
  28. package/assets/skills/chrome-devtools/manifest.json +1 -1
  29. package/assets/skills/code-review/manifest.json +1 -1
  30. package/assets/skills/databases/manifest.json +1 -1
  31. package/assets/skills/debugging/manifest.json +1 -1
  32. package/assets/skills/devops/manifest.json +1 -1
  33. package/assets/skills/docs-seeker/manifest.json +1 -1
  34. package/assets/skills/document-skills/manifest.json +1 -1
  35. package/assets/skills/frontend-design/manifest.json +1 -1
  36. package/assets/skills/gitlab-guardrails/SKILL.md +62 -0
  37. package/assets/skills/gitlab-guardrails/manifest.json +8 -0
  38. package/assets/skills/google-adk-python/manifest.json +1 -1
  39. package/assets/skills/mcp-builder/manifest.json +1 -1
  40. package/assets/skills/mermaidjs-v11/manifest.json +1 -1
  41. package/assets/skills/premium-frontend-ui/manifest.json +6 -4
  42. package/assets/skills/problem-solving/manifest.json +1 -1
  43. package/assets/skills/react-mui-tanstack/manifest.json +16 -16
  44. package/assets/skills/sequential-thinking/manifest.json +1 -1
  45. package/assets/skills/skill-creator/manifest.json +1 -1
  46. package/assets/skills/tailwind-shadcn/manifest.json +102 -102
  47. package/assets/skills/vercel-react-best-practices/manifest.json +2 -2
  48. package/assets/skills/vesper-catalog-editing-safety/SKILL.md +141 -0
  49. package/assets/skills/vesper-catalog-editing-safety/manifest.json +8 -0
  50. package/assets/skills/vscode-agent-config/manifest.json +8 -0
  51. package/assets/skills/web-design-guidelines/manifest.json +1 -1
  52. package/assets/skills/web-frameworks/manifest.json +1 -1
  53. package/dist/cli.min.js +25 -25
  54. package/package.json +5 -2
  55. package/src/mcp/vesper-indexing/dist/constants.d.ts.map +1 -1
  56. package/src/mcp/vesper-indexing/dist/constants.js +3 -0
  57. package/src/mcp/vesper-indexing/dist/constants.js.map +1 -1
  58. package/src/mcp/vesper-indexing/package-lock.json +2 -2
  59. package/src/mcp/vesper-indexing/package.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,65 @@
2
2
 
3
3
  CLI tool to manage AI agents, prompts, instructions, and skills for your workspace — for GitHub Copilot Chat in VS Code, and for Claude Code.
4
4
 
5
- **Vesper** is a comprehensive agent suite that supercharges your AI coding assistant with specialized agents, reusable skills, and structured workflows. Everything below describes the default (Copilot) target; see [Claude Code target](#claude-code-target) for the second target.
5
+ **Vesper** is a comprehensive agent suite that supercharges your AI coding assistant with specialized agents, reusable skills, and structured workflows. It supports two platforms — **GitHub Copilot** (VS Code) and **Claude Code** — chosen via a multi-select during `vespercli init`; a single workspace can run both at once, sharing the same `.vesper/` tracking state.
6
+
7
+ ## The Vesper Lifecycle
8
+
9
+ Vesper is a **pure orchestrator** — it routes, gates, and approves every hand-off, but never does the work itself. Each task travels one revolution of the cycle: the violet **delivery loop** ships it (specialist subagents research, plan, implement, review, and test, with every step reading and writing tracking documents under `.vesper/.tracking/`), and the amber **learning loop** mines what just happened — comparing plan vs. actual, then minting skills, instructions, and knowledge-graph memory that are re-injected into the next task.
10
+
11
+ <picture>
12
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/lifecycle-ring-dark.svg">
13
+ <img src="docs/images/lifecycle-ring-light.svg" alt="Vesper lifecycle ring: Research, Plan, Validate, Implement, Review + Test (delivery), then Retrospect, Store, Re-inject (learning), with Vesper orchestrating at the center" width="760">
14
+ </picture>
15
+
16
+ Every revolution leaves the system smarter: divergences from plan become glob-scoped instructions, repeated patterns become skills, and task context survives interruption — across sessions and across both client targets.
17
+
18
+ ### Tracking documents — the paper trail
19
+
20
+ Delegation prompts pass **paths, never contents**. Each document has one writer and defined readers, so a fresh-context subagent can pick up mid-pipeline — even a subagent on the *other client* (Copilot ↔ Claude Code share `.vesper/` by design).
21
+
22
+ <picture>
23
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/panel-ledger-dark.svg">
24
+ <img src="docs/images/panel-ledger-light.svg" alt="Tracking-documents ledger: research, plans, details, prompts, changes, issues, and stories files — each with one writer and defined consumers; story folders carry status: refining, backlog, inprogress, inreview, completed" width="920">
25
+ </picture>
26
+
27
+ ### Implementation runs on prompts, not vibes
28
+
29
+ The planner doesn't just plan — it writes the *executable brief* each developer will follow:
30
+
31
+ <picture>
32
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/panel-chain-dark.svg">
33
+ <img src="docs/images/panel-chain-light.svg" alt="Prompt chain: planner emits plan, details, and one prompt file per track; Vesper's blocking gate verifies all planning files exist; developers execute the prompt exactly in parallel; divergences from plan are logged in the changes file as the retrospective's raw material" width="920">
34
+ </picture>
35
+
36
+ ### Task tracker — board is the source of truth
37
+
38
+ The Task Management section of the orchestration file names the system (ClickUp, Jira, …) and its Task Agent; the pipeline never talks to a board directly. **Local mode** works with zero configuration — the story folders alone carry status.
39
+
40
+ <picture>
41
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/panel-tracker-dark.svg">
42
+ <img src="docs/images/panel-tracker-light.svg" alt="Task tracker: ClickUp, Jira, or Local; status flow REFINED to IN PROGRESS to IN REVIEW to DONE with routing guards (never re-refine, re-assign, or re-implement); board wins discrepancies; Case A fetches a referenced task, Case B auto-creates one after refinement" width="920">
43
+ </picture>
44
+
45
+ ### The retrospective engine — where skills are born
46
+
47
+ After every implementation, the Feature Wrap agent compares what was planned against what actually happened, then routes each learning through a decision tree:
48
+
49
+ <picture>
50
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/panel-retro-dark.svg">
51
+ <img src="docs/images/panel-retro-light.svg" alt="Retrospective engine: mines changes, plans, details, research, and git diffs; patterns in 3+ files become skills, structures in 5+ files become instructions; decision tree routes learnings to INSTRUCTION, SKILL, DOCUMENTATION, or the MEMORY GRAPH, behind Vesper's approval filter" width="920">
52
+ </picture>
53
+
54
+ ### Where learning re-enters the pipeline
55
+
56
+ Capture is worthless without injection — every knowledge output has a named consumer at a named step:
57
+
58
+ <picture>
59
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/panel-reentry-dark.svg">
60
+ <img src="docs/images/panel-reentry-light.svg" alt="Four re-entry points: memory search before research, current_task recall before planning, roster skill injection on every delegation, and glob-bound instruction auto-apply on every matching edit" width="920">
61
+ </picture>
62
+
63
+ The design optimizes for compounding: mistakes convert to rules, workflows convert to skills, and state survives interruption, `/clear`, and even a client switch. When a fix loop caps out (10 iterations), unresolved issues are written to `issues/` and the pipeline continues — dead ends become documents, not lost context.
6
64
 
7
65
  ## Installation
8
66
 
@@ -17,29 +75,24 @@ npx @mthanh/vespercli <command>
17
75
  ## Quick Start
18
76
 
19
77
  ```bash
20
- # Initialize Vesper in your project
21
- # (multi-select which platform(s) to set up — GitHub Copilot and/or Claude Code;
22
- # pass --target copilot,claude or --target all to skip the prompt)
78
+ # Initialize Vesper in your project — multi-select GitHub Copilot and/or Claude Code
79
+ # (pass --target copilot,claude or --target all to skip the prompt)
23
80
  vespercli init
81
+ ```
24
82
 
25
- # (Optional) Add local overrides to customize specific assets
26
- vespercli add --agent code-reviewer code-planner
27
-
28
- # Add skills (as local overrides)
29
- vespercli add --skill aesthetic tailwind-shadcn
83
+ Then say hello:
30
84
 
31
- # List local overrides
32
- vespercli list
85
+ - **GitHub Copilot** — reload VS Code (`Developer: Reload Window`), open Copilot Chat, select **Vesper** from the agent dropdown, and prompt `Vesperize` — Vesper scans the workspace and assembles your team.
86
+ - **Claude Code** — start a session and prompt `init` — Vesper detects the missing Team Roster and runs the full workspace setup automatically.
33
87
 
34
- # Update local overrides
35
- vespercli update
36
- ```
88
+ ## Settings-based Asset Injection
37
89
 
38
- ## Settings-based Asset Injection (New)
90
+ Vesper integrates by **pointing your AI client at the packaged catalog** instead of copying assets into your repo — VS Code workspace settings for Copilot, a user-level plugin for Claude Code. Only project-specific files (roster, context, tracking) live in the workspace.
39
91
 
40
- Vesper now integrates with VS Code by **configuring workspace settings** instead of copying the full asset catalog into your repo.
92
+ <details>
93
+ <summary><b>GitHub Copilot</b> — VS Code settings + MCP servers</summary>
41
94
 
42
- ### What `vespercli init` does
95
+ `vespercli init` (with Copilot selected):
43
96
 
44
97
  - Creates/updates `.vscode/settings.json` to point Copilot Chat at Vesper's packaged assets.
45
98
  - Configures core MCP servers in `.vscode/mcp.json`:
@@ -79,7 +132,29 @@ Example (illustrative):
79
132
  }
80
133
  ```
81
134
 
82
- ### Local overrides (still supported)
135
+ </details>
136
+
137
+ <details>
138
+ <summary><b>Claude Code</b> — user-level plugin + project orchestrator files</summary>
139
+
140
+ Claude Code has no equivalent of VS Code's `chat.agentFilesLocations` setting, so the specialist catalog is distributed as a **user-level plugin** instead: `vespercli init` (with Claude Code selected) installs it once to `~/.claude/skills/vesper/`, making it available in **every** Claude Code project on the machine. In the current project it creates only:
141
+
142
+ - `CLAUDE.md` — a small guarded `@import` block pointing at the three files below (never touches the rest of your `CLAUDE.md`)
143
+ - `.claude/vesper/orchestrator.md` — the orchestration playbook (routing rules, delegation), refreshed on every `init`/`update`
144
+ - `.claude/vesper/orchestration.md` — this project's Team Roster + Task Management config
145
+ - `.claude/vesper/context.md` — this project's architecture/stack/conventions, as a slim, freshness-stamped core (≤200 lines, auto-injected into every session); a fuller **on-demand** tier under `.claude/vesper/context/` (conventions, integrations, technical debt, a bounded Recent-Decisions ring buffer) fills in as the Vesper agent learns the workspace, and is read only when an agent needs that detail
146
+ - `.mcp.json` and `.claude/settings.json` — the `vesper-indexing` MCP server + its tool permissions
147
+
148
+ No editor dependency — these files are read by the Claude Code engine itself, so the same install works from the terminal CLI, VS Code extension, JetBrains, or the desktop app. During install you're asked once whether to prefix catalog names with `vesper-` to avoid collisions with other Claude Code kits.
149
+
150
+ Two slash commands manage that on-demand knowledge over time: `/compact-knowledge` (size-triggered — archives old history/tracking artifacts and trims the memory graph, non-destructively) and `/revalidate-knowledge` (staleness-triggered — re-scans the codebase, re-validates archived and core knowledge against it, and rebalances the slim-core/on-demand split); Vesper only ever suggests these, never auto-runs them.
151
+
152
+ A single project can have both targets installed at once — `.vesper/` (code index, story tracking, `history.md`) is shared and cross-client by design, so a story researched under Copilot can be implemented under Claude Code, or vice versa.
153
+
154
+ </details>
155
+
156
+ <details>
157
+ <summary><b>Local overrides</b> — customize specific assets</summary>
83
158
 
84
159
  If you want to customize a specific agent/prompt/instruction/skill, use `vespercli add`.
85
160
 
@@ -87,16 +162,12 @@ If you want to customize a specific agent/prompt/instruction/skill, use `vesperc
87
162
  - Local copies in `.vesper/` take precedence over the settings-based (package) assets.
88
163
  - This is the recommended way to make small, intentional customizations without vendoring everything.
89
164
 
90
- ### Migration from legacy `.vesper/` installs
91
-
92
- If Vesper detects a legacy install that previously copied assets into `.vesper/`, `vespercli init` will offer to migrate you to the settings-based approach.
93
-
94
- - After migrating, you can keep any locally customized files as overrides.
95
- - Everything else is discovered directly from the Vesper package.
165
+ </details>
96
166
 
97
167
  ## Commands
98
168
 
99
- ### `vespercli init`
169
+ <details>
170
+ <summary><b><code>vespercli init</code></b> — initialize platform(s) in your workspace</summary>
100
171
 
101
172
  Initialize Vesper in your workspace. Pick one or more platforms (GitHub Copilot
102
173
  and/or Claude Code) via a multi-select prompt; the CLI lays down the base setup
@@ -116,7 +187,10 @@ vespercli init --target claude -y # Non-interactive: Claude with default s
116
187
  vespercli init --path /my/project # Specify workspace path
117
188
  ```
118
189
 
119
- ### `vespercli add`
190
+ </details>
191
+
192
+ <details>
193
+ <summary><b><code>vespercli add</code></b> — add local overrides</summary>
120
194
 
121
195
  Add local overrides (copies) for agents, prompts, instructions, or skills into `.vesper/`.
122
196
 
@@ -136,9 +210,15 @@ vespercli add -i nextjs reactjs
136
210
  # Add skills
137
211
  vespercli add --skill <name> [name2...]
138
212
  vespercli add -s aesthetic backend-development
213
+
214
+ # For Claude Code, adds go to the shared plugin catalog instead
215
+ vespercli add agents code-reviewer --target claude
139
216
  ```
140
217
 
141
- ### `vespercli list`
218
+ </details>
219
+
220
+ <details>
221
+ <summary><b><code>vespercli list</code></b> — list local overrides</summary>
142
222
 
143
223
  List local override assets in `.vesper/`.
144
224
 
@@ -149,7 +229,10 @@ vespercli list --type agents # Filter by type
149
229
  vespercli list -t skills # Short form
150
230
  ```
151
231
 
152
- ### `vespercli update`
232
+ </details>
233
+
234
+ <details>
235
+ <summary><b><code>vespercli update</code></b> — refresh local overrides</summary>
153
236
 
154
237
  Update local override assets from the package to get the latest versions.
155
238
 
@@ -158,7 +241,10 @@ vespercli update # Interactive confirmation
158
241
  vespercli update -y # Skip confirmation
159
242
  ```
160
243
 
161
- ### `vespercli reset`
244
+ </details>
245
+
246
+ <details>
247
+ <summary><b><code>vespercli reset</code></b> — remove configuration and/or overrides</summary>
162
248
 
163
249
  Remove Vesper configuration and/or local overrides.
164
250
 
@@ -170,7 +256,25 @@ vespercli reset --local-only # Only remove local `.vesper/` folder
170
256
  vespercli reset --full # Remove EVERYTHING including vesper.agent.md (requires typing "YES")
171
257
  ```
172
258
 
173
- ### `vespercli mcp`
259
+ </details>
260
+
261
+ <details>
262
+ <summary><b><code>vespercli worktree</code></b> — bootstrap a worktree's local-only artifacts</summary>
263
+
264
+ Bootstrap a git worktree (or the current workspace) with Vesper's **local-only** artifacts — files that are intentionally gitignored (`.mcp.json`, the code index `.vesper/index.db`, the gitignore guard block, the managed git hooks and `.gitattributes` merge strategy) and therefore don't come along with a plain `git worktree add`. Idempotent and safe to re-run; it already runs automatically via the Claude `SessionStart` hook, the VS Code folder-open task, and a `post-checkout` git hook, so you rarely need to invoke it by hand. No-op on a workspace that was never vesperized.
265
+
266
+ ```bash
267
+ vespercli worktree bootstrap # Regenerate local-only files in this worktree
268
+ vespercli worktree bootstrap --quiet # Suppress non-error output (used by the hooks above)
269
+ vespercli worktree bootstrap --path /my/project
270
+ ```
271
+
272
+ Bootstrap also refreshes the base branch's remote-tracking ref before rebuilding anything else: it resolves the base branch from `origin/HEAD` (e.g. `origin/master`) and runs a bounded (15s) `git fetch` — never `git pull`, so your checked-out branch and working tree are never touched. This keeps anything orienting against "what's on the base branch" (like a fresh worktree) looking at a recent `origin/<base>` instead of a possibly stale local checkout. It never fails the bootstrap: offline, no configured remote, or an unreachable/auth-expired remote all just log a warning (printed even under `--quiet`) and continue with the existing local refs.
273
+
274
+ </details>
275
+
276
+ <details>
277
+ <summary><b><code>vespercli mcp</code></b> — manage MCP servers</summary>
174
278
 
175
279
  Manage MCP servers for whichever target(s) are installed here — Copilot (`.vscode/mcp.json`), Claude Code (`.mcp.json`), or both at once. `mcp add`/`mcp remove`/`mcp list` are for **optional catalog servers** (e.g. `clickup`); the three Vesper-core servers (`vesper-indexing`, `sequential-thinking`, `memory`) are managed separately via `mcp enable`/`mcp disable`/`mcp sync` and are never addable/removable through `mcp add`/`mcp remove`.
176
280
 
@@ -187,27 +291,21 @@ vespercli mcp sync # Re-sync tool auto-approval (Copilot
187
291
  vespercli mcp reindex --full # Clear and rebuild the shared code index
188
292
  ```
189
293
 
190
- `mcp add`/`mcp remove`/`mcp list` are fully supported for the Claude Code target — earlier versions silently no-op'd here for anything beyond the 3 core servers.
191
-
192
- ### `vespercli --version`
294
+ </details>
193
295
 
194
- Display the current version.
296
+ <details>
297
+ <summary><b><code>vespercli --version</code></b> / <b><code>--help</code></b></summary>
195
298
 
196
299
  ```bash
197
- vespercli -v
300
+ vespercli -v # Display the current version
198
301
  vespercli --version
199
- ```
200
-
201
- ### `vespercli --help`
202
-
203
- Display help information.
204
-
205
- ```bash
206
- vespercli -h
302
+ vespercli -h # Display help information
207
303
  vespercli --help
208
304
  vespercli <command> --help
209
305
  ```
210
306
 
307
+ </details>
308
+
211
309
  ## Asset Types
212
310
 
213
311
  Vesper provides a full catalog via VS Code settings, and supports optional local overrides.
@@ -221,52 +319,10 @@ Vesper provides a full catalog via VS Code settings, and supports optional local
221
319
 
222
320
  ## After Installation
223
321
 
224
- 1. Open VS Code in your workspace
225
- 2. Open GitHub Copilot Chat (`Ctrl+Shift+I` / `Cmd+Shift+I`)
226
- 3. Select **Vesper** from the agent dropdown
227
- 4. Start working with an AI agent suite that includes specialized developers, planners, reviewers, and more
228
-
229
- ## Claude Code target
230
-
231
- Vesper also targets **Claude Code**, as a second, fully independent install alongside (or instead of) the Copilot target above — nothing here changes the default behavior of the commands described so far.
232
-
233
- Claude Code has no equivalent of VS Code's `chat.agentFilesLocations` setting (no way to point it at an arbitrary external directory), so the specialist catalog is distributed as a **user-level plugin** instead of referenced in place: `vespercli init --target claude` installs it once to `~/.claude/skills/vesper/`, and it's then available in **every** Claude Code project on the machine, not just this one. Only genuinely project-specific content lives in the repo:
234
-
235
- ```bash
236
- vespercli init --target claude # Install the plugin catalog + this project's orchestrator/roster/context
237
- ```
238
-
239
- This creates, in the current project only:
240
-
241
- - `CLAUDE.md` — a small guarded `@import` block pointing at the three files below (never touches the rest of your `CLAUDE.md`)
242
- - `.claude/vesper/orchestrator.md` — the orchestration playbook (routing rules, delegation), refreshed on every `init`/`update`
243
- - `.claude/vesper/orchestration.md` — this project's Team Roster + Task Management config
244
- - `.claude/vesper/context.md` — this project's architecture/stack/conventions
245
- - `.mcp.json` and `.claude/settings.json` — the `vesper-indexing` MCP server + its tool permissions
246
-
247
- No `.claude/agents/`, `.claude/commands/`, or `.claude/skills/` appear in the project — the full specialist catalog (subagents, slash commands, skills) lives once in the shared plugin at `~/.claude/skills/vesper/`.
248
-
249
- ```bash
250
- vespercli init --target claude # Install/refresh everything above
251
- vespercli add agents code-reviewer --target claude # Add one subagent to the plugin catalog
252
- vespercli list --target claude # See what's installed
253
- vespercli update --target claude # Refresh the plugin + orchestrator playbook after `npm update`
254
- vespercli reset --target claude # Remove this project's files (leaves the shared plugin catalog alone)
255
- vespercli mcp status --target claude # Check the vesper-indexing MCP server in .mcp.json; also warns on .mcp.json vs .vesperrc drift
256
- vespercli mcp add clickup --target claude # Add an optional catalog MCP server to .mcp.json + record it in .vesperrc
257
- vespercli mcp remove clickup --target claude # Remove it (prunes both .mcp.json and .vesperrc)
258
- vespercli mcp list --target claude # List catalog + custom servers configured for this target
259
- ```
260
-
261
- Unlike the Copilot target, this one has **no editor dependency** — `~/.claude/...` and a project's `.claude/`/`CLAUDE.md`/`.mcp.json` are read by the Claude Code engine itself, so the same install works whether you drive it from the plain terminal CLI, the VS Code extension, JetBrains, or the desktop app.
262
-
263
- ### Mixed-target workspaces
264
-
265
- A single project can have both targets installed at once — `.vesper/` (the code index, story tracking, `history.md`) is shared and cross-client by design, so a story researched under Copilot can be picked up and implemented under Claude Code, or vice versa. `.vesperrc` records each target under its own key, so running `init --target claude` in an already-Copilot-initialized project adds a `claude` entry without touching the existing Copilot fields.
266
-
267
- ### Naming and conflicts
322
+ - **GitHub Copilot** — reload VS Code, open Copilot Chat (`Ctrl+Shift+I` / `Cmd+Shift+I`), select **Vesper** from the agent dropdown, and prompt `Vesperize` to assemble your team.
323
+ - **Claude Code** — start a session (terminal, VS Code extension, JetBrains, or desktop app) and prompt `init` — Vesper runs the full workspace setup automatically.
268
324
 
269
- `vespercli init --target claude` asks once whether to prefix the catalog's subagent/skill/command names with `vesper-` (to avoid collisions with other Claude Code kits you may have installed) or keep plain names (the default, matching the Copilot catalog's naming 1:1). On any name conflict — with a prior Vesper install or a different kit occupying the same name — the most recent install wins.
325
+ Either way you end up with the same suite — specialized developers, planners, reviewers, and testers orchestrated by Vesper, sharing one `.vesper/` tracking state across both clients.
270
326
 
271
327
  ## Requirements
272
328
 
package/assets/CATALOG.md CHANGED
@@ -336,6 +336,12 @@ Core skills provide fundamental capabilities and are installed by default alongs
336
336
  - Description: Build distinctive, production-grade frontend interfaces with high design quality.
337
337
  - Pick when: Need UI implementation that's polished and non-generic; building reusable components/pages in React/Next; want design-led decisions baked into the code.
338
338
 
339
+ ### gitlab-guardrails
340
+
341
+ - Path: `skills/gitlab-guardrails/`
342
+ - Description: Vesper-owned GitLab MR safety policy — blocks the experimental `glab mr create --recover` flag and detects/removes stray `mr.json` recovery files before commit. Self-contained (in force even when the synced GitLab skills are absent).
343
+ - Pick when: Creating/updating/reviewing GitLab merge requests or running any `glab mr` command; want a guardrail against leaking `--recover`/`mr.json` recovery state into the repo; agent role runs `Bash`/`glab`.
344
+
339
345
  ### premium-frontend-ui
340
346
 
341
347
  - Path: `skills/premium-frontend-ui/`
@@ -403,6 +409,12 @@ Core skills provide fundamental capabilities and are installed by default alongs
403
409
  - Description: Build accessible UIs with shadcn/ui (Radix UI) + Tailwind CSS — components, theming, dark mode, responsive layouts.
404
410
  - Pick when: Project uses Tailwind + shadcn/ui; need accessible component patterns (dialogs, forms, tables); want consistent theming and responsive styling.
405
411
 
412
+ ### vesper-catalog-editing-safety
413
+
414
+ - Path: `skills/vesper-catalog-editing-safety/`
415
+ - Description: Pre-edit safety checklist for touching Vesper's own asset catalog and provisioning code (`assets/`, `scripts/generate-claude-assets.js`, `src/cli/utils/settings.js`, `src/cli/utils/claude-target.js`).
416
+ - Pick when: Editing any catalog asset (agent/skill/prompt/instruction), the Claude-asset generator, or Copilot/Claude settings-injection code in this repo; need to know the dual asset tree boundary, discovery wiring, or the git-hygiene dual list before making the change.
417
+
406
418
  ### web-design-guidelines
407
419
 
408
420
  - Path: `skills/web-design-guidelines/`
@@ -549,9 +561,15 @@ Core instructions are part of Vesper's orchestration workflows.
549
561
  - Description: Generate a comprehensive repository summary and narrative story from commit history.
550
562
  - Pick when: Want a "what happened" narrative for onboarding or review; need a summary of evolution and major decisions; preparing documentation or a project retrospective.
551
563
 
564
+ ### revalidate-knowledge
565
+
566
+ - Path: `core/prompts/revalidate-knowledge.prompt.md`
567
+ - Description: Revalidate archived Vesper knowledge against the current codebase and re-balance the slim-core/on-demand context split — a heavier, semantic re-validation pass distinct from `/compact-knowledge`'s trim/dedupe.
568
+ - Pick when: The project context feels stale or drifted from the code (staleness signal, not size); want archived knowledge (prioritizing `.unwrapped` entries) re-checked and re-extracted; need the slim core and on-demand context tiers rebalanced. User-invoked only — Vesper suggests it, never auto-runs it.
569
+
552
570
  ---
553
571
 
554
572
  ## Catalog Metadata
555
573
 
556
574
  - **Version**: 1.4.0
557
- - **Last Updated**: 2026-02-27
575
+ - **Last Updated**: 2026-07-21
@@ -2,7 +2,7 @@
2
2
  name: feature-wrap-document
3
3
  description: Knowledge curator that captures implementation patterns and updates documentation, skills, and context
4
4
  model: claude-sonnet-5
5
- tools: Read, Grep, Glob, Edit, Write, Agent, mcp__vesper-indexing__vesper_search, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes, mcp__memory__delete_entities, mcp__memory__delete_observations
5
+ tools: Read, Grep, Glob, Edit, Write, Bash, Agent, mcp__vesper-indexing__vesper_search, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes, mcp__memory__delete_entities, mcp__memory__delete_observations
6
6
  skills: [agent-fundamentals]
7
7
  ---
8
8
 
@@ -105,8 +105,34 @@ You WILL categorize knowledge using this example decision tree:
105
105
 
106
106
  ```
107
107
  START: Is this a RULE about how to write/modify code in THIS project?
108
- ├─ YES → PROJECT CONTEXT UPDATE
109
- │ └─ Update `.claude/vesper/context.md` (Development Standards / Conventions section)
108
+ ├─ YES → Is the rule scoped to a specific set of files (a path/glob)?
109
+ │ │ TIE-BREAKER: a glob that effectively matches all files (e.g. `**/*`, `**`,
110
+ │ │ `*`) is NOT file-scoped — it is semantically project-wide. Treat it as the
111
+ │ │ NO branch (→ context tier / rules), never as a Skill with an always-firing
112
+ │ │ "matching: **/*" description.
113
+ │ ├─ YES (a real, bounded glob) → INSTRUCTION (file-glob-scoped) → SKILL
114
+ │ │ └─ delegate to `skill-creator` to create/update `.claude/skills/{domain}/SKILL.md`,
115
+ │ │ folding the glob into the skill description:
116
+ │ │ "Use when working with files matching: <glob>."
117
+ │ │ (mirrors the build-time convertInstructionToSkill() convention — not a new format)
118
+ │ └─ NO (project-wide / not file-scoped) → PROJECT CONTEXT UPDATE
119
+ │ (on-demand tier by default — keep the auto-injected slim core small)
120
+ │ ├─ Coding rule / convention → `.claude/vesper/context/conventions.md`
121
+ │ ├─ External dep / integration / dev-standard / CI detail → `.claude/vesper/context/integrations.md`
122
+ │ ├─ Known debt / ambiguity → `.claude/vesper/context/technical-debt.md`
123
+ │ ├─ Structural only (Big Picture Architecture / Domain Model / Critical Workflows) →
124
+ │ │ `.claude/vesper/context.md` core (then bump its `Last incremental update` stamp)
125
+ │ └─ Long/verbose but always-on (too big to inline cleanly in a context file) →
126
+ │ create a standalone `.claude/rules/{name}.md` and append
127
+ │ `@.claude/rules/{name}.md` to CLAUDE.md OUTSIDE the vesper:start/vesper:end
128
+ │ guard markers (survives update/reinit — see ensureClaudeMdGuardBlock).
129
+ │ DEDUP GUARD: before appending, check whether that exact
130
+ │ `@.claude/rules/{name}.md` line already exists in CLAUDE.md — append ONLY
131
+ │ if absent, so re-running a retrospective for an updated same-named rule
132
+ │ overwrites `.claude/rules/{name}.md` without appending a duplicate import.
133
+ │ HEURISTIC (B-vs-C): more than ~20-30 lines, or it carries its own
134
+ │ examples / sub-structure → standalone rules file; otherwise route to the
135
+ │ on-demand tier / core above. Misfiling here is low-stakes and self-correcting.
110
136
  │
111
137
  ├─ NO → Is this a REPEATABLE WORKFLOW with multiple steps?
112
138
  ├─ YES → SKILL
@@ -131,6 +157,8 @@ START: Is this a RULE about how to write/modify code in THIS project?
131
157
 
132
158
  You MUST present ALL proposed updates as a numbered summary, then wait for user to approve by number (partial approval supported).
133
159
 
160
+ **Scope of this approval gate (important):** this numbered-approval workflow applies ONLY to genuinely **structural** `.claude/vesper/context.md` edits — the slim core's Big Picture Architecture / Domain Model / Critical Workflows, and the on-demand tier's Conventions / Integrations / Technical Debt files. It does **NOT** cover the trivial, high-frequency `.claude/vesper/context/recent-decisions.md` ring-buffer append after an Implementation completion — that bounded self-healing trim-to-N append is `history-logger`'s job (its Recent-Decisions Ring Buffer responsibility), runs unattended in parallel with the `history.md` append, and must never be routed through this approval loop. Do not propose or apply `recent-decisions.md` line appends here.
161
+
134
162
  ### Step 1: Analyze and Generate All Proposals
135
163
 
136
164
  You WILL:
@@ -276,15 +304,19 @@ You WILL after all approved updates are applied:
276
304
 
277
305
  ## Knowledge Type Guidelines
278
306
 
279
- ### Project Context (`.claude/vesper/context.md`)
307
+ ### Project Context (two-tier: slim core + on-demand tier)
308
+
309
+ **Target routing (avoid slim-core creep):** durable prose lands in the on-demand tier, NOT the auto-injected core. A coding rule/convention → `.claude/vesper/context/conventions.md`; an external dep / integration / dev-standard / CI detail → `.claude/vesper/context/integrations.md`; a known debt/ambiguity → `.claude/vesper/context/technical-debt.md`. Only genuinely **structural** content (Big Picture Architecture / Domain Model / Critical Workflows) belongs in the injected `.claude/vesper/context.md` core — and any such gated structural edit also bumps the core's `Last incremental update` freshness stamp. `recent-decisions.md` is `history-logger`'s ring buffer, never written here.
280
310
 
281
311
  **Characteristics:**
282
312
 
283
313
  - Prescriptive rules ("always", "never", "must", "avoid")
284
- - Applies to code creation/modification in this project
314
+ - Applies **project-wide** to code creation/modification — NOT scoped to a specific file glob
285
315
  - Prevents common mistakes
286
316
  - Enforces consistency
287
317
 
318
+ > Scope boundary: reserve `context.md` for **non-file-scoped** rules only. A rule scoped to a specific path/glob (the Instruction-equivalent) belongs in a Skill instead — see the file-glob-scoped route under Skills below. For a long/verbose but always-on rule too big to inline here cleanly, use a standalone `.claude/rules/{name}.md` with an `@import` from CLAUDE.md (B-vs-C heuristic in the decision tree above).
319
+
288
320
  **Format:**
289
321
 
290
322
  ```markdown
@@ -306,11 +338,13 @@ You WILL after all approved updates are applied:
306
338
  **Applies to:** [scenarios where rule is relevant]
307
339
  ```
308
340
 
309
- **Examples:**
341
+ **Examples** (all genuinely project-wide — apply everywhere, not scoped to any file path/glob):
310
342
 
311
- - "Always use path aliases instead of relative imports"
312
- - "Never use next/dynamic with {ssr: false} in Server Components"
313
- - "Server actions must validate session before Firestore operations"
343
+ - "Always use path aliases instead of relative imports" (applies to every import in the repo)
344
+ - "Never commit secrets or credentials — load them from environment/config" (applies to all code)
345
+ - "Prefer `node:`-prefixed builtins for standard-library imports" (applies across the whole codebase)
346
+
347
+ > Counter-example — these are NOT `context.md` rules, because they are scoped to a specific file set (a glob), so they route to a **Skill** instead (see the file-glob-scoped route under Skills below): "Never use `next/dynamic` with `{ssr: false}` in Server Components" (scoped to Server-Component files), "Server actions must validate the session before DB operations" (scoped to server-action files).
314
348
 
315
349
  ---
316
350
 
@@ -322,6 +356,7 @@ You WILL after all approved updates are applied:
322
356
  - Reusable patterns with variations
323
357
  - Domain-specific knowledge
324
358
  - Prerequisites and concrete examples
359
+ - **Also the Instruction-equivalent target**: a file-glob-scoped code rule (Copilot would put this in an `*.instructions.md` with an `applyTo` glob) becomes a Skill here, folding the glob into the description as `"Use when working with files matching: <glob>."` — Claude's description-based skill auto-discovery approximates Copilot's `applyTo` scoping (mirrors the build-time `convertInstructionToSkill()` convention, not a new format).
325
360
 
326
361
  **Format:**
327
362
 
@@ -427,8 +462,8 @@ description: [What it does + when to use it]
427
462
 
428
463
  - **Pattern**: Phased implementation with typed placeholders
429
464
  - **Problem solved**: Blocked progress due to complex feature dependency
430
- - **Knowledge type**: Project context
431
- - **Target**: `.claude/vesper/context.md`
465
+ - **Knowledge type**: Project context (coding convention)
466
+ - **Target**: `.claude/vesper/context/conventions.md` (on-demand tier — a coding convention, not slim-core structural content)
432
467
 
433
468
  **Proposal:**
434
469
 
@@ -454,6 +489,79 @@ message: 'Route refresh not yet implemented'
454
489
 
455
490
  ---
456
491
 
492
+ ### Pattern: File-Glob-Scoped Rule → Skill
493
+
494
+ **Input (from changes file):**
495
+
496
+ ```markdown
497
+ ## Phase 3 Notes
498
+
499
+ - Every server action under `src/app/**/actions.ts` now validates the session
500
+ before touching the database — three PRs shipped without this and regressed.
501
+ ```
502
+
503
+ **Analysis:**
504
+
505
+ - **Pattern**: A code rule scoped to a specific file set (`src/app/**/actions.ts`) — a real, bounded glob, NOT project-wide
506
+ - **Knowledge type**: Instruction-equivalent → **Skill** (glob folded into the description)
507
+ - **Target**: delegate to `skill-creator` → `.claude/skills/server-actions/SKILL.md`
508
+
509
+ **Proposal:**
510
+
511
+ ```markdown
512
+ ---
513
+ name: server-actions
514
+ description: Use when working with files matching: src/app/**/actions.ts.
515
+ ---
516
+
517
+ # Server Action Session Validation
518
+
519
+ Validate the session before any DB operation in a server action…
520
+ ```
521
+
522
+ ---
523
+
524
+ ### Pattern: Long/Verbose Always-On Rule → `.claude/rules/` + `@import`
525
+
526
+ **Input (from changes file):**
527
+
528
+ ```markdown
529
+ ## Phase 1 Notes
530
+
531
+ - Documented the full error-handling policy: taxonomy, ret/log/rethrow rules,
532
+ and 4 worked examples — applies to ALL code, ~40 lines, too big for context.md.
533
+ ```
534
+
535
+ **Analysis:**
536
+
537
+ - **Pattern**: Project-wide (not file-scoped) but long and self-structured → Branch C
538
+ - **Knowledge type**: standalone rule file + `CLAUDE.md` `@import`
539
+ - **Target**: create `.claude/rules/error-handling.md`; append `@.claude/rules/error-handling.md` to `CLAUDE.md` (outside guard markers, only if the import line isn't already present)
540
+
541
+ **Proposal:**
542
+
543
+ ```markdown
544
+ <!-- .claude/rules/error-handling.md -->
545
+ # Error Handling Policy
546
+
547
+ ## Taxonomy
548
+ …
549
+
550
+ ## Rules
551
+ …
552
+
553
+ ## Examples
554
+ …
555
+ ```
556
+
557
+ Then append to `CLAUDE.md` (outside `<!-- vesper:start -->…<!-- vesper:end -->`, dedup-checked):
558
+
559
+ ```markdown
560
+ @.claude/rules/error-handling.md
561
+ ```
562
+
563
+ ---
564
+
457
565
  ## Quality Standards
458
566
 
459
567
  You WILL validate ALL proposals against these standards:
@@ -511,14 +619,19 @@ You WILL respond to these user commands:
511
619
  - **READ**: Use `Read`/`Grep`/`Glob` across entire workspace for analysis
512
620
  - **WRITE**: Modify files ONLY after explicit user approval by number
513
621
  - **ALLOWED WRITES**:
514
- - `.claude/vesper/context.md`
622
+ - `.claude/vesper/context.md` — structural slim-core only (Big Picture Architecture / Domain Model / Critical Workflows / Freshness); bump `Last incremental update` on a gated structural edit
623
+ - `.claude/vesper/context/conventions.md`, `.claude/vesper/context/integrations.md`, `.claude/vesper/context/technical-debt.md` — on-demand tier (default home for durable Conventions / Integrations / Technical Debt)
515
624
  - `.claude/skills/**/SKILL.md` (project-local skills only — delegate to `skill-creator` for these, and for anything meant to join the shared global catalog)
625
+ - `.claude/rules/{name}.md` (decision-tree Branch C — standalone always-on rule files; create/overwrite the rule file itself here)
626
+ - `CLAUDE.md` — **narrow carve-out, Branch C only**: you MAY append a single `@.claude/rules/{name}.md` import line, and ONLY that. It MUST go **outside** the `<!-- vesper:start -->…<!-- vesper:end -->` guard markers (that block is machine-regenerated — never write inside it). Before appending, check whether that exact import line already exists in the file; append only if absent (no duplicate imports across re-runs). No other edit to `CLAUDE.md` is permitted.
516
627
  - `docs/*.md`
517
628
  - `README.md`
518
629
  - **FORBIDDEN WRITES**:
630
+ - `.claude/vesper/context/recent-decisions.md` — `history-logger`'s ring buffer, never written here
519
631
  - Source code files (unless explicitly requested)
520
- - Configuration files
632
+ - Configuration files — **except** the single narrow `CLAUDE.md` `@import`-append carve-out defined under ALLOWED WRITES above
521
633
  - Planning/tracking files (`.vesper/.tracking/*`)
634
+ - Anything inside the `CLAUDE.md` `<!-- vesper:start -->…<!-- vesper:end -->` guard block
522
635
 
523
636
  ## Output Format
524
637
 
@@ -562,3 +675,15 @@ A **separate, explicitly-invoked mode**, distinct from your normal per-task memo
562
675
  5. Report: entity count before/after, and a short list of what was merged.
563
676
 
564
677
  **Never** perform this compaction as a side effect of a normal feature-wrap invocation — only when explicitly asked for compaction.
678
+
679
+ ## 🔁 Knowledge Revalidation Mode (`/revalidate-knowledge` only — never the default behavior)
680
+
681
+ A **separate, explicitly-invoked mode**, distinct from both your normal per-task memory-update job and Memory Compaction Mode above. Runs when Vesper delegates the `/revalidate-knowledge` flow (user-invoked, suggested on staleness/drift). `workspace-learner` handles the whitepaper/archive-revalidation and core/on-demand re-balance side of the same request in parallel — this mode is scoped to the **memory graph only**, and unlike Compaction Mode (which just merges/dedupes on *size*) it **re-validates** entities against the freshly revalidated whitepaper and current code.
682
+
683
+ 1. `read_graph()` (or `search_nodes` broadly) to see the full set of entities.
684
+ 2. Cross-check durable entities (`workspace_pattern`, `preference`, architecture/decision entities) against the current code and `workspace-learner`'s revalidated `.claude/vesper/context.md` core + on-demand tier. Correct observations the code no longer supports; add a `supersedes` relation rather than silently rewriting, so the correction is traceable.
685
+ 3. Give priority to knowledge tied to `.unwrapped`-flagged archives (slugs archived without a feature-wrap) — re-extract any durable learning those tracking artifacts still hold into the graph.
686
+ 4. Merge/dedupe as in Compaction Mode where entities are now redundant post-revalidation. Never touch `current_task` or anything with an active relation.
687
+ 5. Report: entities revalidated, corrected, superseded, and re-extracted from flagged archives.
688
+
689
+ **Never** perform revalidation as a side effect of a normal feature-wrap invocation — only when explicitly asked via `/revalidate-knowledge`.
@@ -36,6 +36,19 @@ You must STRICTLY follow this format for every entry:
36
36
 
37
37
  When asked to log something (e.g., "Log that Phase 1 started"), generate the formatted string and **append** it to the end of the file using `Edit`.
38
38
 
39
+ ### 4. Recent-Decisions Ring Buffer (Implementation completions only)
40
+
41
+ After every **Implementation pipeline completion** (orchestrator Step 11), in parallel with your normal `history.md` append, also record one bounded line in `.claude/vesper/context/recent-decisions.md`. This is a **self-healing trim-to-N ring buffer** (N=10) — the newest 10 decisions live in the on-demand context tier; everything older rolls into the history archive.
42
+
43
+ On every such append:
44
+
45
+ 1. Read `.claude/vesper/context/recent-decisions.md` (create it with a `# Recent Decisions` header if missing).
46
+ 2. Append the new entry as **one line**: `- YYYY-MM-DD [slug] — <one-sentence summary of what shipped>` (date via `Bash` `date`, consistent with the `history.md` append; `slug` is the story/task slug).
47
+ 3. Count the data lines (exclude the header). If the total exceeds **10**, MOVE the oldest `(total - 10)` lines into `.vesper/history-archive/YYYYMM.md` (grouped by the current month, append-style — create the file with a `# Vesper History Archive — YYYY-MM` header if it doesn't exist). Never delete.
48
+ 4. Rewrite `recent-decisions.md` so it holds only the newest 10 entries (plus its header).
49
+
50
+ **Why re-trim on every append (not a one-time pop):** `recent-decisions.md` carries `merge=union` in `.gitattributes`, so a concurrent-worktree merge may transiently leave the on-disk file with more than 10 entries — `union` never deletes. This is **expected and self-corrects** on the very next append. Do NOT rely on `union` to enforce the cap, and do NOT treat transient overflow as a bug. This is a normal-mode responsibility, distinct from Compaction Mode below.
51
+
39
52
  ## Examples
40
53
 
41
54
  **Input:** "Log that Initialization Phase 2a started."
@@ -73,6 +86,15 @@ This is a **separate, explicitly-invoked mode** — distinct from your normal ap
73
86
  2. Never touch `refining/`, `backlog/`, `inprogress/`, or `inreview/` — only `completed/`.
74
87
  3. Report the count moved and where.
75
88
 
89
+ ### 3. Archive correlated tracking artifacts
90
+
91
+ For each `stories/completed/<slug>` entry older than the same N-day threshold (default 30), move its correlated tracking artifacts — every `research/`, `plans/`, `details/`, `prompts/`, and `changes/` file whose name contains that `<slug>` — into `.vesper/.tracking/archive/YYYYMM/<slug>/` (grouped by the month the story was completed), via `Bash mv`, never delete.
92
+
93
+ 1. **Idempotent move**: if the source is already gone and the destination already holds the file, treat it as already done (a concurrent worktree archived it). Never error, never re-move.
94
+ 2. **Archive-with-a-flag fallback**: archive regardless of whether `feature-wrap-document` extracted durable knowledge for the slug first. Check the MCP memory graph (or a recorded wrap marker) for a completed feature-wrap for that slug; if none exists, write an empty `.unwrapped` marker file into the archived `<slug>/` folder so `/revalidate-knowledge` treats it as a **priority re-extraction candidate**. This preserves the non-destructive invariant (nothing is lost — archived, just flagged) without blocking retention indefinitely on a wrap step that may legitimately never run (Lightweight-path tasks have no wrap).
95
+ 3. **Ordering**: prefer to run after feature-wrap extraction for the slug, but never block indefinitely — the `.unwrapped` flag is the fallback.
96
+ 4. Report which slugs were archived and which were flagged `.unwrapped`.
97
+
76
98
  ### Constraints (Compaction Mode only)
77
99
 
78
100
  - **Never delete** — every rotation/archive is a move, not a removal.