@mthanh/vespercli 1.7.1 → 1.8.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 (27) hide show
  1. package/README.md +38 -0
  2. package/assets/claude/agents/clickup-agent.md +1 -1
  3. package/assets/claude/agents/context7.md +1 -1
  4. package/assets/claude/agents/modernization.md +1 -0
  5. package/assets/claude/skills/java/SKILL.md +1 -1
  6. package/assets/claude/skills/nextjs-tailwind/SKILL.md +1 -1
  7. package/assets/claude/skills/reactjs/SKILL.md +1 -1
  8. package/assets/claude/skills/self-explanatory-code-commenting/SKILL.md +1 -1
  9. package/assets/claude/skills/tailwind-v4-vite/SKILL.md +1 -1
  10. package/assets/claude/skills/task-implementation/SKILL.md +1 -1
  11. package/assets/claude/skills/vesper-catalog-editing-safety/SKILL.md +2 -1
  12. package/assets/claude/vesper-orchestrator.md +2 -0
  13. package/assets/instructions/flutter/dart-n-flutter.instructions.md +447 -0
  14. package/assets/instructions/self-explanatory-code-commenting/self-explanatory-code-commenting.instructions.md +1 -1
  15. package/assets/skills/vesper-catalog-editing-safety/SKILL.md +2 -1
  16. package/assets/vendor/i-have-adhd/LICENSE +21 -0
  17. package/assets/vendor/i-have-adhd/SKILL.md +142 -0
  18. package/assets/vendor/i-have-adhd/VENDOR.md +56 -0
  19. package/assets/vendor/ponytail/LICENSE +21 -0
  20. package/assets/vendor/ponytail/SKILL.md +120 -0
  21. package/assets/vendor/ponytail/VENDOR.md +115 -0
  22. package/dist/cli.min.js +62 -26
  23. package/package.json +1 -1
  24. package/scripts/generate-claude-assets.js +273 -20
  25. package/scripts/generate-claude-assets.test.js +228 -0
  26. package/src/mcp/vesper-indexing/package-lock.json +2 -2
  27. package/src/mcp/vesper-indexing/package.json +1 -1
package/README.md CHANGED
@@ -153,6 +153,44 @@ A single project can have both targets installed at once — `.vesper/` (code in
153
153
 
154
154
  </details>
155
155
 
156
+ <details>
157
+ <summary><b>Optional: <code>i-have-adhd</code> output-style skill</b> — opt-in, off by default</summary>
158
+
159
+ Vesper can install a **reviewed, pinned snapshot** of the third-party MIT-licensed [`i-have-adhd`](https://github.com/ayghri/i-have-adhd) skill (Copyright (c) 2026 Ayoub Ghriss) into a Claude Code project. It reshapes response *format* only — lead with the next concrete action, keep it brief and scannable — and explicitly defers to the harness system prompt and preserves safety confirmations. It's vendored once, verbatim, at a pinned commit SHA; it is never fetched at runtime and never auto-refreshed (re-vendoring is a deliberate, reviewed pull request).
160
+
161
+ **How you're asked**: on `vespercli init` (and re-init) for the Claude target, Vesper asks once — `Install the third-party i-have-adhd output-style skill? (MIT, reviewed snapshot, added to this repo)` — defaulting to **Yes** (a quick Enter accepts). Your answer is remembered in your user-level `~/.vesperrc` (`vendored.adhd.optIn`, a boolean-only setting — no secrets), so you're **only prompted once per machine**; later inits honor the stored answer without asking again.
162
+
163
+ Change or preset the answer any time:
164
+
165
+ - `vespercli init --adhd` — install and remember Yes; `vespercli init --no-adhd` — skip and remember No. Both overwrite the remembered answer non-interactively.
166
+ - Pre-set `~/.vesperrc` to `{ "vendored": { "adhd": { "optIn": true } } }` (or `false`) before your first init to answer ahead of time and suppress the prompt. (A pre-1.8 `{ "adhd": { "optIn": … } }` key is still honored.)
167
+
168
+ **Headless safety**: in a non-interactive run (`-y`/`--force-default` or no TTY) with no remembered answer and no flag, the skill is **skipped** — Vesper never lets the default-Yes flow into an unattended third-party install. A stored `true` installs; a stored `false` skips.
169
+
170
+ The gate is **per-user** (your answer lives once in `~/.vesperrc`), but whether the asset is actually present is tracked **per-project** (recorded in that project's `.vesperrc` once installed). This split matters for scope:
171
+
172
+ - `vespercli init` / re-init are the **only** commands that can *introduce* the asset into a project — they check the opt-in gate and, if enabled, install `.claude/skills/i-have-adhd/SKILL.md`, `.claude/rules/i-have-adhd.md`, and a marker-scoped `@import` in `CLAUDE.md` (outside the Vesper guard block), then record the per-project install.
173
+ - `vespercli update` and `vespercli worktree bootstrap` only **maintain** an already-recorded install (content-compared re-write, no churn on unchanged files) — they never introduce it, even if the opt-in gate is on. On a fresh worktree or clone, the git-tracked artifacts are already there but the local per-worktree record isn't (it isn't git-tracked), so maintain is a no-op there until the project runs `init`/re-init again with the gate enabled.
174
+ - `vespercli reset` fully removes it — the skill directory, the rule file, and the `CLAUDE.md` import region — and clears the per-project record.
175
+
176
+ </details>
177
+
178
+ <details>
179
+ <summary><b>Optional: <code>ponytail</code> decision-ladder skill</b> — opt-in, off by default</summary>
180
+
181
+ Vesper can install a **reviewed, pinned snapshot** of the third-party MIT-licensed [`ponytail`](https://github.com/DietrichGebert/ponytail) skill (Copyright (c) 2026 DietrichGebert) into a Claude Code project. It nudges coding work toward the **laziest solution that actually works** — a YAGNI/minimalism decision ladder (does this need to exist? → reuse what's here → stdlib → native feature → existing dependency → one line → minimum code) — while never simplifying away understanding, correctness, validation, or security. **Rule-text only**: only the decision-ladder markdown is vendored. The upstream repo's auto-executing hooks, scripts, other-editor variants, and auxiliary skills are **excluded** — no executable code is vendored, and nothing is ever fetched or run at install time (see `assets/vendor/ponytail/VENDOR.md`). It's vendored once, verbatim, at a pinned commit SHA; re-vendoring is a deliberate, reviewed pull request.
182
+
183
+ **How you're asked**: a second one-time prompt on `vespercli init`/re-init — `Install the third-party ponytail decision-ladder skill? (MIT, reviewed snapshot, rule-text only, added to this repo)` — defaulting to **Yes**. It's **independent** of the i-have-adhd prompt: you can accept one and decline the other. Your answer is remembered in `~/.vesperrc` (`vendored.ponytail.optIn`), so you're only prompted once per machine.
184
+
185
+ Change or preset the answer any time:
186
+
187
+ - `vespercli init --ponytail` — install and remember Yes; `vespercli init --no-ponytail` — skip and remember No.
188
+ - Pre-set `~/.vesperrc` to `{ "vendored": { "ponytail": { "optIn": true } } }` (or `false`) before your first init.
189
+
190
+ **Headless safety** and the **introduce (init/reinit only) vs. maintain (update/bootstrap) vs. reset (full teardown)** scoping are identical to the i-have-adhd asset above — this is the same registry-driven vendored-asset engine. When enabled, init installs `.claude/skills/ponytail/SKILL.md`, a minimal always-on `.claude/rules/ponytail.md` pointer, and a marker-scoped `@import` in `CLAUDE.md`.
191
+
192
+ </details>
193
+
156
194
  <details>
157
195
  <summary><b>Local overrides</b> — customize specific assets</summary>
158
196
 
@@ -2,7 +2,7 @@
2
2
  name: clickup-agent
3
3
  description: ClickUp specialist that handles all ClickUp API operations with proper multi-level fetching
4
4
  model: claude-haiku-4-5-20251001
5
- tools: Grep, Glob, Read, mcp__vesper-indexing__vesper_search, mcp__vesper-indexing__vesper_symbols, mcp__vesper-indexing__vesper_status, mcp__vesper-indexing__vesper_reindex, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes
5
+ tools: Grep, Glob, Read, mcp__clickup__clickup_add_tag_to_task, mcp__clickup__clickup_add_time_entry, mcp__clickup__clickup_attach_task_file, mcp__clickup__clickup_create_document, mcp__clickup__clickup_create_document_page, mcp__clickup__clickup_create_folder, mcp__clickup__clickup_create_list, mcp__clickup__clickup_create_list_in_folder, mcp__clickup__clickup_create_task, mcp__clickup__clickup_create_task_comment, mcp__clickup__clickup_find_member_by_name, mcp__clickup__clickup_get_chat_channels, mcp__clickup__clickup_get_current_time_entry, mcp__clickup__clickup_get_document_pages, mcp__clickup__clickup_get_folder, mcp__clickup__clickup_get_list, mcp__clickup__clickup_get_task, mcp__clickup__clickup_get_task_comments, mcp__clickup__clickup_get_task_time_entries, mcp__clickup__clickup_get_workspace_hierarchy, mcp__clickup__clickup_get_workspace_members, mcp__clickup__clickup_list_document_pages, mcp__clickup__clickup_remove_tag_from_task, mcp__clickup__clickup_resolve_assignees, mcp__clickup__clickup_search, mcp__clickup__clickup_send_chat_message, mcp__clickup__clickup_start_time_tracking, mcp__clickup__clickup_stop_time_tracking, mcp__clickup__clickup_update_document_page, mcp__clickup__clickup_update_folder, mcp__clickup__clickup_update_list, mcp__clickup__clickup_update_task, mcp__vesper-indexing__vesper_search, mcp__vesper-indexing__vesper_symbols, mcp__vesper-indexing__vesper_status, mcp__vesper-indexing__vesper_reindex, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes
6
6
  skills: [agent-fundamentals]
7
7
  ---
8
8
 
@@ -2,7 +2,7 @@
2
2
  name: context7
3
3
  description: Expert in latest library versions, best practices, and correct syntax using up-to-date documentation
4
4
  model: claude-haiku-4-5-20251001
5
- tools: Read, Grep, Glob, WebFetch, WebSearch, mcp__context7__resolve-library-id, mcp__context7__get-library-docs, mcp__vesper-indexing__vesper_search, mcp__vesper-indexing__vesper_symbols, mcp__vesper-indexing__vesper_status, mcp__vesper-indexing__vesper_reindex, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes
5
+ tools: Read, Grep, Glob, WebFetch, WebSearch, Agent, mcp__context7__resolve-library-id, mcp__context7__get-library-docs, mcp__vesper-indexing__vesper_search, mcp__vesper-indexing__vesper_symbols, mcp__vesper-indexing__vesper_status, mcp__vesper-indexing__vesper_reindex, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes
6
6
  skills: [agent-fundamentals]
7
7
  ---
8
8
 
@@ -2,6 +2,7 @@
2
2
  name: modernization
3
3
  description: Human-in-the-loop modernization assistant for analyzing, documenting, and planning complete project modernization with architectural recommendations.
4
4
  model: claude-opus-4-8
5
+ tools: Grep, Glob, Read, Edit, Write, Bash, Agent, TodoWrite, WebFetch, mcp__vesper-indexing__vesper_search, mcp__vesper-indexing__vesper_symbols, mcp__vesper-indexing__vesper_status, mcp__vesper-indexing__vesper_reindex, mcp__memory__create_entities, mcp__memory__create_relations, mcp__memory__add_observations, mcp__memory__search_nodes, mcp__memory__open_nodes
5
6
  skills: [agent-fundamentals]
6
7
  ---
7
8
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: java
3
- description: Guidelines for building Java base applications Use when working with files matching: **/*.java.
3
+ description: Guidelines for building Java base applications. Use when working with Java files.
4
4
  ---
5
5
 
6
6
  # Java Development
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: nextjs-tailwind
3
- description: Next.js + Tailwind development standards and instructions Use when working with files matching: **/*.tsx, **/*.ts, **/*.jsx, **/*.js, **/*.css.
3
+ description: Next.js + Tailwind development standards and instructions. Use when working with TSX, TypeScript, JSX, JavaScript, or CSS files.
4
4
  ---
5
5
 
6
6
  # Next.js + Tailwind Development Instructions
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: reactjs
3
- description: ReactJS development standards and best practices Use when working with files matching: **/*.jsx, **/*.tsx, **/*.js, **/*.ts, **/*.css, **/*.scss.
3
+ description: ReactJS development standards and best practices. Use when working with JSX, TSX, JavaScript, TypeScript, CSS, or SCSS files.
4
4
  ---
5
5
 
6
6
  # ReactJS Development Instructions
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: self-explanatory-code-commenting
3
- description: Guidelines for GitHub Copilot to write comments to achieve self-explanatory code with less comments. Examples are in JavaScript but it should work on any language that has comments. Use when working with files matching: **/*.py, **/*.js, **/*.ts, **/*.java, **/*.cs, **/*.cpp, **/*.go, **/*.rb.
3
+ description: Conventions for writing and reviewing code comments: prefer self-explanatory code, comment WHY not WHAT, and avoid obvious, redundant, outdated, dead-code, or decorative comments. Language-agnostic (examples in JavaScript). Use when working with Python, JavaScript, TypeScript, Java, C#, C++, Go, or Ruby files.
4
4
  ---
5
5
 
6
6
  # Self-explanatory Code Commenting Instructions
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: tailwind-v4-vite
3
- description: Tailwind CSS v4+ installation and configuration for Vite projects using the official @tailwindcss/vite plugin Use when working with files matching: vite.config.ts, vite.config.js, **/*.css, **/*.tsx, **/*.ts, **/*.jsx, **/*.js.
3
+ description: Tailwind CSS v4+ installation and configuration for Vite projects using the official @tailwindcss/vite plugin. Use when working with TypeScript, JavaScript, CSS, TSX, or JSX files.
4
4
  ---
5
5
 
6
6
  # Tailwind CSS v4+ Installation with Vite
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: task-implementation
3
- description: Instructions for implementing task plans with progressive tracking and change record - Brought to you by microsoft/edge-ai Use when working with files matching: **/.vesper/.tracking/changes/*.md.
3
+ description: Instructions for implementing task plans with progressive tracking and change record - Brought to you by microsoft/edge-ai. Use when working with task change-record files under .vesper/.tracking/changes/.
4
4
  ---
5
5
 
6
6
  # Task Plan Implementation Instructions
@@ -50,7 +50,7 @@ Most edits hit exactly one checklist. If unsure, read Checklist D first — it's
50
50
  | `assets/skills/<name>/` | `assets/claude/skills/<name>/` (near-verbatim) |
51
51
  | `assets/instructions/<name>/<name>.instructions.md` | `assets/claude/skills/<name>/SKILL.md` (new skill) |
52
52
 
53
- **That table is the entire remit.** `assets/core/` is never read by this script, at all — by design, not by omission (the script's own comment: *"the 12 core agents + the orchestrator playbook are hand-authored separately in assets/claude/ and are never touched by this script"*).
53
+ **That table is the entire remit.** `assets/core/` is never read by this script, at all — by design, not by omission (the script's own comment: *"the 12 core agents + the orchestrator playbook are hand-authored separately in assets/claude/ and are never touched by this script"*). Neither is `assets/vendor/` — reviewed, pinned third-party snapshots (e.g. `assets/vendor/i-have-adhd/`, `assets/vendor/ponytail/`) live outside the four scan roots and the three write targets on purpose. A vendored asset is edited only by re-vendoring (a reviewed PR bumping its pinned SHA), never through the generator; do not move it under `assets/skills/` or `assets/claude/` to "make the generator pick it up."
54
54
 
55
55
  - [ ] Is the file under `assets/core/`?
56
56
  - **Yes** → There is no generator step for you. Hand-edit **both** the Copilot source (`assets/core/{agents,skills,instructions,prompts}/...`) **and** its `assets/claude/` twin. Before editing the twin, check it for **Claude-only content that doesn't exist in the Copilot source** and preserve it — e.g. `assets/claude/skills/agent-fundamentals/SKILL.md`'s `## Direct Collaboration (Nested Delegation)` section has no Copilot-side counterpart. Never diff the two sides expecting them to match; they're allowed to diverge by design.
@@ -130,6 +130,7 @@ If your edit changes *where* either target looks, or *what* gets written into th
130
130
 
131
131
  - `assets/` — the Copilot-format source catalog (`core/` hand-authored default install; `agents/`, `skills/`, `instructions/`, `prompts/` extended/opt-in)
132
132
  - `assets/claude/` — generated Claude-target twin of the extended tree, plus hand-maintained Claude-only twins of `assets/core/`
133
+ - `assets/vendor/` — reviewed, pinned snapshots of third-party assets (e.g. `assets/vendor/i-have-adhd/`, `assets/vendor/ponytail/`); a generator-excluded category, installed project-level at init time, never scanned/written by the generator and never a scan root
133
134
  - `scripts/generate-claude-assets.js` — the extended-tree generator; never touches `assets/core/`
134
135
  - `src/cli/utils/settings.js` — `VSCODE_SETTINGS_MAP`, `getCoreAssetEntries()`, `VESPER_GIT_PATHS`
135
136
  - `src/cli/utils/claude-target.js` — `getClaudePluginDir()`, `installClaudePluginCatalog()`, `ensureClaudeMdGuardBlock()`, `VESPER_REINJECT_COMMAND`
@@ -110,6 +110,8 @@ All workspace-related actions live here: initialization, re-initialization, team
110
110
 
111
111
  > **Exception — externally-synced GitLab skills (closed list).** Exactly two skills deviate from "no other source," and only these two: `gitlab-ci-skill` (from `https://gitlab.com/gitlab-org/ci-cd/gitlab-ci-skill.git`) and `github-actions-to-gitlab-ci` (from `https://gitlab.com/gitlab-org/ci-cd/github-actions-to-gitlab-ci.git`). **Location** is fully compliant — both install into the same Vesper-managed plugin dir (`~/.claude/skills/vesper/skills/`) as every other skill, so subagents still look in exactly one place. **Authorship/maintenance** is the sole carve-out — their *content* is pulled fresh from those two upstream GitLab repos on every `init`/`/reinit`/`worktree bootstrap`, rather than authored/vendored by Vesper. This list is closed: adding any third externally-synced skill (any other URL, host, or namespace) is **not** covered by this exception and requires a new documented exception plus architecture-review sign-off before implementation.
112
112
 
113
+ > **Vendored (externally-sourced-once) assets — a distinct category, NOT part of the closed list above.** Separately from the externally-*synced* skills, Vesper may carry **vendored** third-party assets: a one-time reviewed snapshot **pinned to a commit SHA**, committed into `assets/vendor/` and installed project-level at init time, **never fetched at runtime** and with the upstream install instructions **never executed**. Each snapshot passes a **per-snapshot human content-review** (prompt-injection / behavioral-override / tool-permission-escalation / data-exfiltration / destructive-instruction scan) with the reviewer recorded in the asset's `VENDOR.md`, ships the upstream **LICENSE verbatim + attribution** (e.g. `i-have-adhd` — MIT, Copyright (c) 2026 Ayoub Ghriss), and is re-vendored **only by a deliberate reviewed PR, never automatically**. This category is *distinct from* the externally-synced closed list and does **not** expand it — the closed list stays literally closed at two.
114
+
113
115
  ### State Check (before any work)
114
116
 
115
117
  **Check**: Does `.claude/vesper/orchestration.md` exist with a **Team Roster** section?
@@ -0,0 +1,447 @@
1
+ ---
2
+ description: 'Instructions for writing Dart and Flutter code following the official recommendations.'
3
+ applyTo: '**/*.dart'
4
+ ---
5
+
6
+ # Dart and Flutter
7
+
8
+ Best practices recommended by the Dart and Flutter teams. These instructions were taken from [Effective Dart](https://dart.dev/effective-dart) and [Architecture Recommendations](https://docs.flutter.dev/app-architecture/recommendations).
9
+
10
+ ## Effective Dart
11
+
12
+ Over the past several years, we've written a ton of Dart code and learned a lot about what works well and what doesn't. We're sharing this with you so you can write consistent, robust, fast code too. There are two overarching themes:
13
+
14
+ 1. **Be consistent.** When it comes to things like formatting, and casing, arguments about which is better are subjective and impossible to resolve. What we do know is that being *consistent* is objectively helpful.
15
+
16
+ If two pieces of code look different it should be because they *are* different in some meaningful way. When a bit of code stands out and catches your eye, it should do so for a useful reason.
17
+
18
+ 2. **Be brief.** Dart was designed to be familiar, so it inherits many of the same statements and expressions as C, Java, JavaScript and other languages. But we created Dart because there is a lot of room to improve on what those languages offer. We added a bunch of features, from string interpolation to initializing formals, to help you express your intent more simply and easily.
19
+
20
+ If there are multiple ways to say something, you should generally pick the most concise one. This is not to say you should `code golf` yourself into cramming a whole program into a single line. The goal is code that is *economical*, not *dense*.
21
+
22
+ ### The topics
23
+
24
+ We split the guidelines into a few separate topics for easy digestion:
25
+
26
+ * **Style** – This defines the rules for laying out and organizing code, or at least the parts that `dart format` doesn't handle for you. The style topic also specifies how identifiers are formatted: `camelCase`, `using_underscores`, etc.
27
+
28
+ * **Documentation** – This tells you everything you need to know about what goes inside comments. Both doc comments and regular, run-of-the-mill code comments.
29
+
30
+ * **Usage** – This teaches you how to make the best use of language features to implement behavior. If it's in a statement or expression, it's covered here.
31
+
32
+ * **Design** – This is the softest topic, but the one with the widest scope. It covers what we've learned about designing consistent, usable APIs for libraries. If it's in a type signature or declaration, this goes over it.
33
+
34
+ ### How to read the topics
35
+
36
+ Each topic is broken into a few sections. Sections contain a list of guidelines. Each guideline starts with one of these words:
37
+
38
+ * **DO** guidelines describe practices that should always be followed. There will almost never be a valid reason to stray from them.
39
+
40
+ * **DON'T** guidelines are the converse: things that are almost never a good idea. Hopefully, we don't have as many of these as other languages do because we have less historical baggage.
41
+
42
+ * **PREFER** guidelines are practices that you *should* follow. However, there may be circumstances where it makes sense to do otherwise. Just make sure you understand the full implications of ignoring the guideline when you do.
43
+
44
+ * **AVOID** guidelines are the dual to "prefer": stuff you shouldn't do but where there may be good reasons to on rare occasions.
45
+
46
+ * **CONSIDER** guidelines are practices that you might or might not want to follow, depending on circumstances, precedents, and your own preference.
47
+
48
+ Some guidelines describe an **exception** where the rule does *not* apply. When listed, the exceptions may not be exhaustive—you might still need to use your judgement on other cases.
49
+
50
+ This sounds like the police are going to beat down your door if you don't have your laces tied correctly. Things aren't that bad. Most of the guidelines here are common sense and we're all reasonable people. The goal, as always, is nice, readable and maintainable code.
51
+
52
+ ### Rules
53
+
54
+ #### Style
55
+
56
+ ##### Identifiers
57
+
58
+ * DO name types using `UpperCamelCase`.
59
+ * DO name extensions using `UpperCamelCase`.
60
+ * DO name packages, directories, and source files using `lowercase_with_underscores`.
61
+ * DO name import prefixes using `lowercase_with_underscores`.
62
+ * DO name other identifiers using `lowerCamelCase`.
63
+ * PREFER using `lowerCamelCase` for constant names.
64
+ * DO capitalize acronyms and abbreviations longer than two letters like words.
65
+ * PREFER using wildcards for unused callback parameters.
66
+ * DON'T use a leading underscore for identifiers that aren't private.
67
+ * DON'T use prefix letters.
68
+ * DON'T explicitly name libraries.
69
+
70
+ ##### Ordering
71
+
72
+ * DO place `dart:` imports before other imports.
73
+ * DO place `package:` imports before relative imports.
74
+ * DO specify exports in a separate section after all imports.
75
+ * DO sort sections alphabetically.
76
+
77
+ ##### Formatting
78
+
79
+ * DO format your code using `dart format`.
80
+ * CONSIDER changing your code to make it more formatter-friendly.
81
+ * PREFER lines 80 characters or fewer.
82
+ * DO use curly braces for all flow control statements.
83
+
84
+ #### Documentation
85
+
86
+ ##### Comments
87
+
88
+ * DO format comments like sentences.
89
+ * DON'T use block comments for documentation.
90
+
91
+ ##### Doc comments
92
+
93
+ * DO use `///` doc comments to document members and types.
94
+ * PREFER writing doc comments for public APIs.
95
+ * CONSIDER writing a library-level doc comment.
96
+ * CONSIDER writing doc comments for private APIs.
97
+ * DO start doc comments with a single-sentence summary.
98
+ * DO separate the first sentence of a doc comment into its own paragraph.
99
+ * AVOID redundancy with the surrounding context.
100
+ * PREFER starting comments of a function or method with third-person verbs if its main purpose is a side effect.
101
+ * PREFER starting a non-boolean variable or property comment with a noun phrase.
102
+ * PREFER starting a boolean variable or property comment with "Whether" followed by a noun or gerund phrase.
103
+ * PREFER a noun phrase or non-imperative verb phrase for a function or method if returning a value is its primary purpose.
104
+ * DON'T write documentation for both the getter and setter of a property.
105
+ * PREFER starting library or type comments with noun phrases.
106
+ * CONSIDER including code samples in doc comments.
107
+ * DO use square brackets in doc comments to refer to in-scope identifiers.
108
+ * DO use prose to explain parameters, return values, and exceptions.
109
+ * DO put doc comments before metadata annotations.
110
+
111
+ ##### Markdown
112
+
113
+ * AVOID using markdown excessively.
114
+ * AVOID using HTML for formatting.
115
+ * PREFER backtick fences for code blocks.
116
+
117
+ ##### Writing
118
+
119
+ * PREFER brevity.
120
+ * AVOID abbreviations and acronyms unless they are obvious.
121
+ * PREFER using "this" instead of "the" to refer to a member's instance.
122
+
123
+ #### Usage
124
+
125
+ ##### Libraries
126
+
127
+ * DO use strings in `part of` directives.
128
+ * DON'T import libraries that are inside the `src` directory of another package.
129
+ * DON'T allow an import path to reach into or out of `lib`.
130
+ * PREFER relative import paths.
131
+
132
+ ##### Null
133
+
134
+ * DON'T explicitly initialize variables to `null`.
135
+ * DON'T use an explicit default value of `null`.
136
+ * DON'T use `true` or `false` in equality operations.
137
+ * AVOID `late` variables if you need to check whether they are initialized.
138
+ * CONSIDER type promotion or null-check patterns for using nullable types.
139
+
140
+ ##### Strings
141
+
142
+ * DO use adjacent strings to concatenate string literals.
143
+ * PREFER using interpolation to compose strings and values.
144
+ * AVOID using curly braces in interpolation when not needed.
145
+
146
+ ##### Collections
147
+
148
+ * DO use collection literals when possible.
149
+ * DON'T use `.length` to see if a collection is empty.
150
+ * AVOID using `Iterable.forEach()` with a function literal.
151
+ * DON'T use `List.from()` unless you intend to change the type of the result.
152
+ * DO use `whereType()` to filter a collection by type.
153
+ * DON'T use `cast()` when a nearby operation will do.
154
+ * AVOID using `cast()`.
155
+
156
+ ##### Functions
157
+
158
+ * DO use a function declaration to bind a function to a name.
159
+ * DON'T create a lambda when a tear-off will do.
160
+
161
+ ##### Variables
162
+
163
+ * DO follow a consistent rule for `var` and `final` on local variables.
164
+ * AVOID storing what you can calculate.
165
+
166
+ ##### Members
167
+
168
+ * DON'T wrap a field in a getter and setter unnecessarily.
169
+ * PREFER using a `final` field to make a read-only property.
170
+ * CONSIDER using `=>` for simple members.
171
+ * DON'T use `this.` except to redirect to a named constructor or to avoid shadowing.
172
+ * DO initialize fields at their declaration when possible.
173
+
174
+ ##### Constructors
175
+
176
+ * DO use initializing formals when possible.
177
+ * DON'T use `late` when a constructor initializer list will do.
178
+ * DO use `;` instead of `{}` for empty constructor bodies.
179
+ * DON'T use `new`.
180
+ * DON'T use `const` redundantly.
181
+
182
+ ##### Error handling
183
+
184
+ * AVOID catches without `on` clauses.
185
+ * DON'T discard errors from catches without `on` clauses.
186
+ * DO throw objects that implement `Error` only for programmatic errors.
187
+ * DON'T explicitly catch `Error` or types that implement it.
188
+ * DO use `rethrow` to rethrow a caught exception.
189
+
190
+ ##### Asynchrony
191
+
192
+ * PREFER async/await over using raw futures.
193
+ * DON'T use `async` when it has no useful effect.
194
+ * CONSIDER using higher-order methods to transform a stream.
195
+ * AVOID using Completer directly.
196
+ * DO test for `Future<T>` when disambiguating a `FutureOr<T>` whose type argument could be `Object`.
197
+
198
+ #### Design
199
+
200
+ ##### Names
201
+
202
+ * DO use terms consistently.
203
+ * AVOID abbreviations.
204
+ * PREFER putting the most descriptive noun last.
205
+ * CONSIDER making the code read like a sentence.
206
+ * PREFER a noun phrase for a non-boolean property or variable.
207
+ * PREFER a non-imperative verb phrase for a boolean property or variable.
208
+ * CONSIDER omitting the verb for a named boolean parameter.
209
+ * PREFER the "positive" name for a boolean property or variable.
210
+ * PREFER an imperative verb phrase for a function or method whose main purpose is a side effect.
211
+ * PREFER a noun phrase or non-imperative verb phrase for a function or method if returning a value is its primary purpose.
212
+ * CONSIDER an imperative verb phrase for a function or method if you want to draw attention to the work it performs.
213
+ * AVOID starting a method name with `get`.
214
+ * PREFER naming a method `to...()` if it copies the object's state to a new object.
215
+ * PREFER naming a method `as...()` if it returns a different representation backed by the original object.
216
+ * AVOID describing the parameters in the function's or method's name.
217
+ * DO follow existing mnemonic conventions when naming type parameters.
218
+
219
+ ##### Libraries
220
+
221
+ * PREFER making declarations private.
222
+ * CONSIDER declaring multiple classes in the same library.
223
+
224
+ ##### Classes and mixins
225
+
226
+ * AVOID defining a one-member abstract class when a simple function will do.
227
+ * AVOID defining a class that contains only static members.
228
+ * AVOID extending a class that isn't intended to be subclassed.
229
+ * DO use class modifiers to control if your class can be extended.
230
+ * AVOID implementing a class that isn't intended to be an interface.
231
+ * DO use class modifiers to control if your class can be an interface.
232
+ * PREFER defining a pure `mixin` or pure `class` to a `mixin class`.
233
+
234
+ ##### Constructors
235
+
236
+ * CONSIDER making your constructor `const` if the class supports it.
237
+
238
+ ##### Members
239
+
240
+ * PREFER making fields and top-level variables `final`.
241
+ * DO use getters for operations that conceptually access properties.
242
+ * DO use setters for operations that conceptually change properties.
243
+ * DON'T define a setter without a corresponding getter.
244
+ * AVOID using runtime type tests to fake overloading.
245
+ * AVOID public `late final` fields without initializers.
246
+ * AVOID returning nullable `Future`, `Stream`, and collection types.
247
+ * AVOID returning `this` from methods just to enable a fluent interface.
248
+
249
+ ##### Types
250
+
251
+ * DO type annotate variables without initializers.
252
+ * DO type annotate fields and top-level variables if the type isn't obvious.
253
+ * DON'T redundantly type annotate initialized local variables.
254
+ * DO annotate return types on function declarations.
255
+ * DO annotate parameter types on function declarations.
256
+ * DON'T annotate inferred parameter types on function expressions.
257
+ * DON'T type annotate initializing formals.
258
+ * DO write type arguments on generic invocations that aren't inferred.
259
+ * DON'T write type arguments on generic invocations that are inferred.
260
+ * AVOID writing incomplete generic types.
261
+ * DO annotate with `dynamic` instead of letting inference fail.
262
+ * PREFER signatures in function type annotations.
263
+ * DON'T specify a return type for a setter.
264
+ * DON'T use the legacy typedef syntax.
265
+ * PREFER inline function types over typedefs.
266
+ * PREFER using function type syntax for parameters.
267
+ * AVOID using `dynamic` unless you want to disable static checking.
268
+ * DO use `Future<void>` as the return type of asynchronous members that do not produce values.
269
+ * AVOID using `FutureOr<T>` as a return type.
270
+
271
+ ##### Parameters
272
+
273
+ * AVOID positional boolean parameters.
274
+ * AVOID optional positional parameters if the user may want to omit earlier parameters.
275
+ * AVOID mandatory parameters that accept a special "no argument" value.
276
+ * DO use inclusive start and exclusive end parameters to accept a range.
277
+
278
+ ##### Equality
279
+
280
+ * DO override `hashCode` if you override `==`.
281
+ * DO make your `==` operator obey the mathematical rules of equality.
282
+ * AVOID defining custom equality for mutable classes.
283
+ * DON'T make the parameter to `==` nullable.
284
+
285
+ ---
286
+
287
+ ## Flutter Architecture Recommendations
288
+
289
+ This page presents architecture best practices, why they matter, and
290
+ whether we recommend them for your Flutter application.
291
+ You should treat these recommendations as recommendations,
292
+ and not steadfast rules, and you should
293
+ adapt them to your app's unique requirements.
294
+
295
+ The best practices on this page have a priority,
296
+ which reflects how strongly the Flutter team recommends it.
297
+
298
+ * **Strongly recommend:** You should always implement this recommendation if
299
+ you're starting to build a new application. You should strongly consider
300
+ refactoring an existing app to implement this practice unless doing so would
301
+ fundamentally clash with your current approach.
302
+ * **Recommend**: This practice will likely improve your app.
303
+ * **Conditional**: This practice can improve your app in certain circumstances.
304
+
305
+ ### Separation of concerns
306
+
307
+ You should separate your app into a UI layer and a data layer. Within those layers, you should further separate logic into classes by responsibility.
308
+
309
+ #### Use clearly defined data and UI layers.
310
+ **Strongly recommend**
311
+
312
+ Separation of concerns is the most important architectural principle.
313
+ The data layer exposes application data to the rest of the app, and contains most of the business logic in your application.
314
+ The UI layer displays application data and listens for user events from users. The UI layer contains separate classes for UI logic and widgets.
315
+
316
+ #### Use the repository pattern in the data layer.
317
+ **Strongly recommend**
318
+
319
+ The repository pattern is a software design pattern that isolates the data access logic from the rest of the application.
320
+ It creates an abstraction layer between the application's business logic and the underlying data storage mechanisms (databases, APIs, file systems, etc.).
321
+ In practice, this means creating Repository classes and Service classes.
322
+
323
+ #### Use ViewModels and Views in the UI layer. (MVVM)
324
+ **Strongly recommend**
325
+
326
+ Separation of concerns is the most important architectural principle.
327
+ This particular separation makes your code much less error prone because your widgets remain "dumb".
328
+
329
+ #### Use `ChangeNotifiers` and `Listenables` to handle widget updates.
330
+ **Conditional**
331
+
332
+ > There are many options to handle state-management, and ultimately the decision comes down to personal preference.
333
+
334
+ The `ChangeNotifier` API is part of the Flutter SDK, and is a convenient way to have your widgets observe changes in your ViewModels.
335
+
336
+ #### Do not put logic in widgets.
337
+ **Strongly recommend**
338
+
339
+ Logic should be encapsulated in methods on the ViewModel. The only logic a view should contain is:
340
+ * Simple if-statements to show and hide widgets based on a flag or nullable field in the ViewModel
341
+ * Animation logic that relies on the widget to calculate
342
+ * Layout logic based on device information, like screen size or orientation.
343
+ * Simple routing logic
344
+
345
+ #### Use a domain layer.
346
+ **Conditional**
347
+
348
+ > Use in apps with complex logic requirements.
349
+
350
+ A domain layer is only needed if your application has exceeding complex logic that crowds your ViewModels,
351
+ or if you find yourself repeating logic in ViewModels.
352
+ In very large apps, use-cases are useful, but in most apps they add unnecessary overhead.
353
+
354
+ ### Handling data
355
+
356
+ Handling data with care makes your code easier to understand, less error prone, and
357
+ prevents malformed or unexpected data from being created.
358
+
359
+ #### Use unidirectional data flow.
360
+ **Strongly recommend**
361
+
362
+ Data updates should only flow from the data layer to the UI layer.
363
+ Interactions in the UI layer are sent to the data layer where they're processed.
364
+
365
+ #### Use `Commands` to handle events from user interaction.
366
+ **Recommend**
367
+
368
+ Commands prevent rendering errors in your app, and standardize how the UI layer sends events to the data layer.
369
+
370
+ #### Use immutable data models.
371
+ **Strongly recommend**
372
+
373
+ Immutable data is crucial in ensuring that any necessary changes occur only in the proper place, usually the data or domain layer.
374
+ Because immutable objects can't be modified after creation, you must create a new instance to reflect changes.
375
+ This process prevents accidental updates in the UI layer and supports a clear, unidirectional data flow.
376
+
377
+ #### Use freezed or built_value to generate immutable data models.
378
+ **Recommend**
379
+
380
+ You can use packages to help generate useful functionality in your data models, `freezed` or `built_value`.
381
+ These can generate common model methods like JSON ser/des, deep equality checking and copy methods.
382
+ These code generation packages can add significant build time to your applications if you have a lot of models.
383
+
384
+ #### Create separate API models and domain models.
385
+ **Conditional**
386
+
387
+ > Use in large apps.
388
+
389
+ Using separate models adds verbosity, but prevents complexity in ViewModels and use-cases.
390
+
391
+ ### App structure
392
+
393
+ Well organized code benefits both the health of the app itself, and the team working on the code.
394
+
395
+ #### Use dependency injection.
396
+ **Strongly recommend**
397
+
398
+ Dependency injection prevents your app from having globally accessible objects, which makes your code less error prone.
399
+ We recommend you use the `provider` package to handle dependency injection.
400
+
401
+ #### Use `go_router` for navigation.
402
+ **Recommend**
403
+
404
+ Go_router is the preferred way to write 90% of Flutter applications.
405
+ There are some specific use-cases that go_router doesn't solve,
406
+ in which case you can use the `Flutter Navigator API` directly or try other packages found on `pub.dev`.
407
+
408
+ #### Use standardized naming conventions for classes, files and directories.
409
+ **Recommend**
410
+
411
+ We recommend naming classes for the architectural component they represent.
412
+ For example, you may have the following classes:
413
+
414
+ * HomeViewModel
415
+ * HomeScreen
416
+ * UserRepository
417
+ * ClientApiService
418
+
419
+ For clarity, we do not recommend using names that can be confused with objects from the Flutter SDK.
420
+ For example, you should put your shared widgets in a directory called `ui/core/`,
421
+ rather than a directory called `/widgets`.
422
+
423
+ #### Use abstract repository classes
424
+ **Strongly recommend**
425
+
426
+ Repository classes are the sources of truth for all data in your app,
427
+ and facilitate communication with external APIs.
428
+ Creating abstract repository classes allows you to create different implementations,
429
+ which can be used for different app environments, such as "development" and "staging".
430
+
431
+ ### Testing
432
+
433
+ Good testing practices makes your app flexible.
434
+ It also makes it straightforward and low risk to add new logic and new UI.
435
+
436
+ #### Test architectural components separately, and together.
437
+ **Strongly recommend**
438
+
439
+ * Write unit tests for every service, repository and ViewModel class. These tests should test the logic of every method individually.
440
+ * Write widget tests for views. Testing routing and dependency injection are particularly important.
441
+
442
+ #### Make fakes for testing (and write code that takes advantage of fakes.)
443
+ **Strongly recommend**
444
+
445
+ Fakes aren't concerned with the inner workings of any given method as much
446
+ as they're concerned with inputs and outputs. If you have this in mind while writing application code,
447
+ you're forced to write modular, lightweight functions and classes with well defined inputs and outputs.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 'Guidelines for GitHub Copilot to write comments to achieve self-explanatory code with less comments. Examples are in JavaScript but it should work on any language that has comments.'
2
+ description: 'Conventions for writing and reviewing code comments: prefer self-explanatory code, comment WHY not WHAT, and avoid obvious, redundant, outdated, dead-code, or decorative comments. Language-agnostic (examples in JavaScript).'
3
3
  applyTo: '**/*.py, **/*.js, **/*.ts, **/*.java, **/*.cs, **/*.cpp, **/*.go, **/*.rb'
4
4
  ---
5
5
 
@@ -50,7 +50,7 @@ Most edits hit exactly one checklist. If unsure, read Checklist D first — it's
50
50
  | `assets/skills/<name>/` | `assets/claude/skills/<name>/` (near-verbatim) |
51
51
  | `assets/instructions/<name>/<name>.instructions.md` | `assets/claude/skills/<name>/SKILL.md` (new skill) |
52
52
 
53
- **That table is the entire remit.** `assets/core/` is never read by this script, at all — by design, not by omission (the script's own comment: *"the 12 core agents + the orchestrator playbook are hand-authored separately in assets/claude/ and are never touched by this script"*).
53
+ **That table is the entire remit.** `assets/core/` is never read by this script, at all — by design, not by omission (the script's own comment: *"the 12 core agents + the orchestrator playbook are hand-authored separately in assets/claude/ and are never touched by this script"*). Neither is `assets/vendor/` — reviewed, pinned third-party snapshots (e.g. `assets/vendor/i-have-adhd/`, `assets/vendor/ponytail/`) live outside the four scan roots and the three write targets on purpose. A vendored asset is edited only by re-vendoring (a reviewed PR bumping its pinned SHA), never through the generator; do not move it under `assets/skills/` or `assets/claude/` to "make the generator pick it up."
54
54
 
55
55
  - [ ] Is the file under `assets/core/`?
56
56
  - **Yes** → There is no generator step for you. Hand-edit **both** the Copilot source (`assets/core/{agents,skills,instructions,prompts}/...`) **and** its `assets/claude/` twin. Before editing the twin, check it for **Claude-only content that doesn't exist in the Copilot source** and preserve it — e.g. `assets/claude/skills/agent-fundamentals/SKILL.md`'s `## Direct Collaboration (Nested Delegation)` section has no Copilot-side counterpart. Never diff the two sides expecting them to match; they're allowed to diverge by design.
@@ -130,6 +130,7 @@ If your edit changes *where* either target looks, or *what* gets written into th
130
130
 
131
131
  - `assets/` — the Copilot-format source catalog (`core/` hand-authored default install; `agents/`, `skills/`, `instructions/`, `prompts/` extended/opt-in)
132
132
  - `assets/claude/` — generated Claude-target twin of the extended tree, plus hand-maintained Claude-only twins of `assets/core/`
133
+ - `assets/vendor/` — reviewed, pinned snapshots of third-party assets (e.g. `assets/vendor/i-have-adhd/`, `assets/vendor/ponytail/`); a generator-excluded category, installed project-level at init time, never scanned/written by the generator and never a scan root
133
134
  - `scripts/generate-claude-assets.js` — the extended-tree generator; never touches `assets/core/`
134
135
  - `src/cli/utils/settings.js` — `VSCODE_SETTINGS_MAP`, `getCoreAssetEntries()`, `VESPER_GIT_PATHS`
135
136
  - `src/cli/utils/claude-target.js` — `getClaudePluginDir()`, `installClaudePluginCatalog()`, `ensureClaudeMdGuardBlock()`, `VESPER_REINJECT_COMMAND`