viepilot 2.23.0 → 2.45.2

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 (52) hide show
  1. package/CHANGELOG.md +288 -0
  2. package/README.md +6 -6
  3. package/bin/viepilot.cjs +140 -1
  4. package/bin/vp-tools.cjs +204 -0
  5. package/docs/brainstorm/session-2026-04-20.md +261 -0
  6. package/docs/brainstorm/session-2026-04-24.md +131 -0
  7. package/docs/brainstorm/session-2026-04-25.md +109 -0
  8. package/docs/skills-reference.md +22 -0
  9. package/docs/user/features/adapters.md +2 -2
  10. package/docs/user/features/scaffold-first.md +62 -0
  11. package/docs/user/features/skill-registry.md +125 -0
  12. package/lib/adapters/antigravity.cjs +5 -4
  13. package/lib/domain-packs/ai-product.json +33 -0
  14. package/lib/domain-packs/data-science.json +33 -0
  15. package/lib/domain-packs/devops.json +33 -0
  16. package/lib/domain-packs/mobile.json +33 -0
  17. package/lib/domain-packs/web-saas.json +33 -0
  18. package/lib/skill-installer.cjs +274 -0
  19. package/lib/skill-registry.cjs +212 -0
  20. package/lib/viepilot-calibrate.cjs +279 -0
  21. package/lib/viepilot-persona.cjs +446 -0
  22. package/lib/viepilot-update.cjs +113 -0
  23. package/package.json +1 -1
  24. package/skills/vp-audit/SKILL.md +67 -9
  25. package/skills/vp-auto/SKILL.md +54 -0
  26. package/skills/vp-brainstorm/SKILL.md +124 -2
  27. package/skills/vp-crystallize/SKILL.md +82 -0
  28. package/skills/vp-debug/SKILL.md +37 -0
  29. package/skills/vp-design/SKILL.md +219 -0
  30. package/skills/vp-docs/SKILL.md +37 -0
  31. package/skills/vp-evolve/SKILL.md +69 -6
  32. package/skills/vp-info/SKILL.md +37 -0
  33. package/skills/vp-pause/SKILL.md +37 -0
  34. package/skills/vp-persona/SKILL.md +207 -0
  35. package/skills/vp-proposal/SKILL.md +37 -0
  36. package/skills/vp-request/SKILL.md +62 -6
  37. package/skills/vp-resume/SKILL.md +37 -0
  38. package/skills/vp-rollback/SKILL.md +61 -1
  39. package/skills/vp-skills/SKILL.md +311 -0
  40. package/skills/vp-status/SKILL.md +37 -0
  41. package/skills/vp-task/SKILL.md +37 -0
  42. package/skills/vp-ui-components/SKILL.md +37 -0
  43. package/skills/vp-update/SKILL.md +37 -0
  44. package/templates/phase/TASK.md +7 -0
  45. package/templates/project/PROJECT-CONTEXT.md +76 -0
  46. package/workflows/audit.md +131 -0
  47. package/workflows/autonomous.md +199 -0
  48. package/workflows/brainstorm.md +1172 -9
  49. package/workflows/crystallize.md +639 -3
  50. package/workflows/design.md +601 -0
  51. package/workflows/evolve.md +9 -0
  52. package/workflows/rollback.md +79 -10
package/CHANGELOG.md CHANGED
@@ -7,6 +7,294 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.45.2] - 2026-04-25
11
+
12
+ ### Enhanced
13
+ - **ENH-077**: crystallize Step 1D.14 now offers AUQ post-export handoff —
14
+ after design.md exports to project root, prompts "Sync tokens to stylesheets via
15
+ /vp-design --sync?" with Run now / Skip options; silent skip when no stylesheet
16
+ target detected (tailwind.config.js / .css / .scss absent) (ENH-077)
17
+
18
+ ## [2.45.1] - 2026-04-25
19
+
20
+ ### Enhanced
21
+ - **ENH-076.5**: Architect workspace adds `design.html` page when design.md or design tokens
22
+ are present — visual color swatches grid, typography scale table, spacing grid, border-radius
23
+ samples, component token table; bidirectional sync with notes.md `## design_tokens`;
24
+ hub nav link added to `index.html` (ENH-076)
25
+
26
+ ## [2.45.0] - 2026-04-25
27
+
28
+ ### Added
29
+ - **ENH-076.4**: New skill `vp-design` — manage Design.MD design system files:
30
+ `--init` (Q&A from scratch or awesome-design-md import from 55+ brands),
31
+ `--sync` (tokens → Tailwind / CSS custom properties / SCSS auto-detected),
32
+ `--audit` (compliance report with ❌/⚠️/✅ severity levels),
33
+ `--import [brand]` (community template picker with Apply/Customize/Reference modes) (ENH-076)
34
+
35
+ ## [2.44.1] - 2026-04-25
36
+
37
+ ### Enhanced
38
+ - **ENH-076.3**: vp-auto Preflight 5.5 — Design.MD TOKEN_MAP injection for UI tasks:
39
+ Level 1 silent context injection, Level 2 checklist items (UI ACs), Level 3 post-task
40
+ audit with auto-fix; backend-only tasks skip injection; monorepo nearest-file rule (ENH-076)
41
+
42
+ ## [2.44.0] - 2026-04-25
43
+
44
+ ### Enhanced
45
+ - **ENH-076.1**: vp-brainstorm `--ui` mode now auto-extracts design tokens → generates
46
+ `design.md` (Design.MD v1 spec) in session directory alongside `index.html`; `notes.md`
47
+ gets `## design_tokens` YAML section with `design_md_path` pointer (ENH-076)
48
+ - **ENH-076.2**: vp-crystallize Step 1D.14 — mandatory-acknowledge gate for design.md:
49
+ export to project root + `ARCHITECTURE.md ## Design System` + `PROJECT-CONTEXT.md` flag;
50
+ idempotent skip writes `design_md_status: skipped`; conflict handling: Override/Merge/Keep/Diff (ENH-076)
51
+
52
+ ## [2.43.2] - 2026-04-25
53
+
54
+ ### Fixed
55
+ - **BUG-023**: vp-brainstorm session-transition/next-steps prompt ("What would you like to
56
+ do next?" — crystallize / update UI artifacts / continue discussing) now uses
57
+ `AskUserQuestion` on Claude Code terminal; `workflows/brainstorm.md` +
58
+ `skills/vp-brainstorm/SKILL.md` updated (distinct from BUG-022 Q&A content choices)
59
+
60
+ ## [2.43.1] - 2026-04-24
61
+
62
+ ### Fixed
63
+ - **vp-brainstorm**: mid-session structured decision questions now use `AskUserQuestion`
64
+ on Claude Code terminal when ≥2 discrete named options are available; free-form
65
+ open questions remain conversational plain text; SKILL.md "Prompts using AUQ" list
66
+ updated (BUG-022)
67
+
68
+ ## [2.43.0] - 2026-04-24
69
+
70
+ ### Enhanced
71
+ - **vp-rollback**: AUQ checkpoint selection with pagination — structured `AskUserQuestion`
72
+ prompt replaces plain-text table; "Show N more →" option pages through older checkpoints;
73
+ `--limit N` flag controls page size (default: 10); `--list` flag unchanged; ENH-059
74
+ ToolSearch preload applied; text fallback on non-Claude Code adapters (ENH-075)
75
+
76
+ ## [2.42.0] - 2026-04-24
77
+
78
+ ### Added
79
+ - **ENH-073**: vp-persona — fully automated cross-project persona system (no wizard)
80
+ - `lib/viepilot-persona.cjs`: `inferPersona()` detects domain from project files + git shortlog (no setup required)
81
+ - Auto-switch persona on `$PWD` change; auto-merge when 2+ domain signals detected in same project
82
+ - `team_size` inferred from `git shortlog -sn`; `output_style` defaults lean, self-learned from calibration traces
83
+ - 3-layer resolution: project-override > context-map > global active persona
84
+ - `lib/viepilot-calibrate.cjs`: always-on adaptive calibration via Reflexion pattern
85
+ - Session traces written async to `~/.viepilot/traces/` after every session
86
+ - 🟢 low-risk changes (topic_skip, stack_add) auto-applied silently
87
+ - 🟡 medium-risk changes (output_style, phase_default) auto-applied + logged to `pending-review.md`
88
+ - 🔴 high-risk changes blocked (caller decides to prompt, max once per session)
89
+ - `guardrail_journal` prevents re-proposing rejected patterns
90
+ - JSON Patch RFC 6902 workflow overlays — base workflows never modified
91
+ - 5 built-in domain packs: `web-saas`, `data-science`, `mobile`, `devops`, `ai-product`
92
+ - Each: `topic_priority`, `extra_topics` with Q&A, `phase_template`, `architect_pages`, `stacks_hint`
93
+ - `vp-tools persona` subcommand: `get`/`infer`/`list`/`set`/`auto-switch`/`context`
94
+ - `skills/vp-persona/SKILL.md`: new skill for persona inspection and optional correction (`--refine`)
95
+ - `<persona_context>` block injected into all 19 `vp-*` SKILL.md files (including vp-persona itself)
96
+ - `workflows/brainstorm.md`: domain pack topic injection (Step 0B)
97
+ - `workflows/autonomous.md`: persona context injected per task
98
+ - `workflows/crystallize.md`: `output_style` adaptation (lean/balanced/enterprise)
99
+ - `workflows/evolve.md`: `phase_template` suggestion from domain pack
100
+ - `bin/viepilot.cjs`: `install-domain <pack-name>` subcommand for community packs
101
+ - 35 unit tests (phase108); full suite: 1618 tests pass
102
+
103
+ ## [2.41.0] - 2026-04-24
104
+
105
+ ### Added
106
+ - **ENH-072** — vp-* skill invocation version update check
107
+ - `lib/viepilot-update.cjs`: `checkLatestVersion()` — fetches latest version from npm registry (`https://registry.npmjs.org/viepilot/latest`) with 3s timeout; caches result 24h in `~/.viepilot/update-cache.json`; silent on all failures (network error, timeout, parse error, unreadable cache)
108
+ - `bin/vp-tools.cjs`: `check-update` subcommand — `--silent` exits 1 + prints latest when update available (exits 0 when up-to-date); `--json` prints `{ installed, latest, has_update }`; `--force` bypasses 24h cache
109
+ - All 18 `skills/vp-*/SKILL.md` files: `<version_check>` block inserted after `<greeting>` — runs `vp-tools check-update --silent` after the greeting banner; shows notice banner if exit=1; suppressed by `--no-update-check` flag or `config.json update.check: false`; shown at most once per session via `update_check_done` guard
110
+
111
+ ## [2.40.0] - 2026-04-23
112
+
113
+ ### Added
114
+ - **ENH-071** — vp-brainstorm Embedded Domain Mode (10 gaps addressed)
115
+ - Auto-activates when ≥2 embedded trigger keywords detected (MCU families + firmware concepts); `--domain embedded` flag for manual activation
116
+ - `workflows/brainstorm.md`: `detect_embedded_domain` step (Step 0B) with MCU/concept keyword lists, activation banner, and domain flag
117
+ - Embedded topic probes injected when domain active: MCU/Toolchain (Gap 2), RTOS/Scheduling (Gap 3), Power Budget (Gap 7), Safety/Compliance (Gap 10), Firmware Phase Template (Gap 9)
118
+ - 6 new Architect workspace pages: `hw-topology.html`, `pin-map.html`, `memory-layout.html`, `protocol-matrix.html`, `rtos-scheduler.html`, `power-budget.html` (Gaps 1, 4, 5, 8); linked under Embedded nav section in `index.html`
119
+ - UI Direction false-positive suppression (Gap 6): hardware display keywords (LCD/OLED/TFT) routed to `hw_topology_buffer` instead of `ui_idea_buffer`; `🎨` banner suppressed when all signals have hardware context
120
+ - `workflows/crystallize.md`: Step 1D item 13 — exports 8 embedded YAML sections (`hw_topology`, `pin_map`, `memory_layout`, `protocols`, `rtos_config`, `embedded_toolchain`, `power_budget`, `safety_config`) to ARCHITECTURE.md hardware sections; `## Embedded Domain` written to PROJECT-CONTEXT.md; hardware sections READ-ONLY for vp-auto
121
+ - `workflows/crystallize.md`: Step 7 embedded path — skips UI Coverage Gate; applies Hardware Coverage Check (driver-task completeness warning, non-blocking) + Board Bring-Up Phase 1 auto-add
122
+ - `skills/vp-brainstorm/SKILL.md`: Embedded Domain Mode section with all 6 pages table, topic probes summary, suppression behavior, crystallize exports summary
123
+
124
+ ## [2.39.1] - 2026-04-23
125
+
126
+ ### Fixed
127
+ - **BUG-021** — Antigravity adapter install path updated for Google Gemini ecosystem rebrand
128
+ - `lib/adapters/antigravity.cjs`: `skillsDir` → `~/.gemini/antigravity/skills/`
129
+ - `lib/adapters/antigravity.cjs`: `viepilotDir` → `~/.gemini/antigravity/viepilot/`
130
+ - `lib/adapters/antigravity.cjs`: `executionContextBase` → `.gemini/antigravity/viepilot`
131
+ - `lib/adapters/antigravity.cjs`: `isAvailable` checks `.gemini/antigravity/` with `.antigravity/` fallback for pre-update installs
132
+ - `bin/viepilot.cjs`: uninstall help text updated to `~/.gemini/antigravity/skills/vp-*`
133
+ - `docs/user/features/adapters.md`: Antigravity row paths updated
134
+ - `docs/user/features/skill-registry.md`: Antigravity row path updated
135
+
136
+ ## [2.39.0] - 2026-04-22
137
+
138
+ ### Added
139
+ - **ENH-070** — vp-audit auto-log gaps as requests + direct vp-evolve routing
140
+ - `workflows/audit.md`: Auto-Log Gate fires after all tiers; each ⚠️/⛔ finding auto-creates `.viepilot/requests/{TYPE}-{N}.md`
141
+ - Duplicate detection: existing open requests with matching title/files are updated (re-detected) instead of creating duplicates
142
+ - TRACKER.md backlog updated automatically after audit
143
+ - Post-audit routing banner shows logged request IDs + recommends `/vp-evolve` as next action
144
+ - AUQ prompt: "Plan fix phase → /vp-evolve" as Recommended option
145
+ - `--no-autolog` flag disables auto-logging for report-only mode
146
+ - `skills/vp-audit/SKILL.md`: documents Auto-Log Behavior + `--no-autolog`
147
+
148
+ ## [2.38.0] - 2026-04-22
149
+
150
+ ### Added
151
+ - **ENH-069** — crystallize UI→Task binding: 10-gap fix closing the chain where prototype pages remain stubs after all phases complete
152
+ - Gap 1: crystallize Step 1A emits `## UI Pages → Component Map` table binding each pages/*.html to a target component
153
+ - Gap 2: crystallize Step 7 cross-checks generated ROADMAP vs component map; auto-adds missing tasks
154
+ - Gap 3: `templates/phase/TASK.md` and `autonomous.md` populate `## UI Prototype Reference` for frontend component tasks
155
+ - Gap 4: `autonomous.md` phase completion UI Coverage Gate — warns on stub components before phase PASS
156
+ - Gap 5: crystallize Step 1D converts `arch_to_ui_sync` entries with `status: noted` into component map rows
157
+ - Gap 6: crystallize Step 1F makes coverage[] gaps blocking for scoped features (not just warnings)
158
+ - Gap 7: crystallize Step 1D requires explicit resolution of feature-map.html discrepancies before Step 7
159
+ - Gap 8: crystallize emits "design staleness" warning when arch decisions are not reflected in pages/*.html
160
+ - Gap 9: crystallize Step 1A processes `## UX walkthrough log` P0/P1 pain items → UX-fix tasks
161
+ - Gap 10: crystallize Step 1A surfaces `## Background extracted ideas` with resolution gate before Step 7
162
+
163
+ ## [2.37.0] - 2026-04-22
164
+
165
+ ### Fixed
166
+ - **BUG-020** — `vp-auto` scaffold-first gate: when a project setup task is detected for a framework stack (Laravel, Next.js, NestJS, Rails, Django, Spring Boot, Nuxt, React, Electron), vp-auto now MUST run the canonical scaffold command (e.g. `composer create-project laravel/laravel`, `npx create-next-app@latest`) before creating any files. A never-handcraft block list prevents manual creation of framework-native files (`artisan`, `manage.py`, `next.config.*`, `nest-cli.json`, `pom.xml`, `config/application.rb`, etc.) without prior scaffold. Stack `SUMMARY.md` files support an optional `## Scaffold` section with `init_command:` and `marker_file:` fields for override.
167
+
168
+ ### Added
169
+ - `workflows/autonomous.md`: `#### Scaffold-First Gate (BUG-020)` section — framework marker detection table, built-in scaffold command heuristic table (10 stacks), never-handcraft block list, waiver/bypass prompt
170
+ - `docs/user/features/scaffold-first.md` — scaffold-first convention documentation and stack configuration guide
171
+ - `## Scaffold` sections (with `init_command:` + `marker_file:`) added to 6 installed framework stack SUMMARY.md files: laravel, nextjs, nextjs-tailwind-shadcn-threejs, nestjs, spring-boot, spring-boot-3.4
172
+
173
+ ## [2.36.1] - 2026-04-22
174
+
175
+ ### Fixed
176
+ - **BUG-019** — `vp-tools scan-skills` subcommand now implemented; previously threw "Unknown command: scan-skills" even though `lib/skill-registry.cjs` already contained `scanSkills()` from FEAT-020. Wired CLI handler, `help scan-skills` entry, and usage summary line in `bin/vp-tools.cjs`.
177
+
178
+ ## [2.36.0] - 2026-04-22
179
+
180
+ ### Added (ENH-068)
181
+ - `workflows/brainstorm.md`: Topic 7 "Admin Entity Management" (10 sub-questions: which entities need admin CRUD, list view columns/filter/pagination, bulk ops, create/edit forms, delete semantics hard vs. soft, import/export CSV, audit trail per entity, multi-tenant scoping, read-only vs. editable); proactive 🗄️ heuristic (CRUD/entity/admin panel keywords); entity management coverage gate before /save (cross-references ERD presence); `entity-mgmt.html` Architect page; `notes.md ## entity_mgmt` YAML schema; Content Management → 8, User Data Management → 9, Phase assignment → 10
182
+ - `workflows/crystallize.md`: Step 1D item 10 entity_mgmt export → `## Admin Entity Management` table + Import/Export sub-table in `PROJECT-CONTEXT.md`; `entity-mgmt.html` added to MANDATORY READ GATE as item 15; items 10→11 (feature-map), 11→12 (working notes)
183
+ - `templates/project/PROJECT-CONTEXT.md`: `## Admin Entity Management` section + Import/Export placeholder sub-tables
184
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-068 documented
185
+ - `tests/unit/vp-enh031-language-standardization.test.js`: exemption for entity_mgmt keyword blockquote (`CRUD` pattern)
186
+
187
+ ## [2.35.0] - 2026-04-22
188
+
189
+ ### Added (ENH-067)
190
+ - `workflows/brainstorm.md`: Session template adds `workflow_version` + `upgrade_supplement_version` fields to `## Session Info`; **Step 3B: Upgrade Gap Detection** — on `--continue`, compares session `workflow_version` vs. current Topics Template using version threshold table (ENH-063 v2.32, ENH-065 v2.33, ENH-066 v2.34) with false-positive cross-check; shows 🔄 upgrade banner (AUQ: discuss now / remind at /save / skip); runs inline Q&A for missing topics; appends `## Upgrade supplement (vX → vY)` section; stamps `upgrade_supplement_version` for idempotency; suggests `/vp-crystallize --upgrade`
191
+ - `workflows/crystallize.md`: **Step 0-B: Upgrade Re-scan Mode** (`--upgrade` flag + auto-detect from `crystallize_version` stamp); delta computation from version threshold table; AUQ menu — **Patch** (non-destructive: reads architect YAML → appends missing sections, re-stamps version) / **Full re-generate** (backup `.viepilot/backup-pre-regen-{ts}/` → pre-fill Step 0 → overwrite artifacts) / **Skip**; brainstorm supplement integration (folds `## Upgrade supplement` content automatically); soft warn when architect `notes.md` YAML missing; Step 5 writes `<!-- crystallize_version: {semver} -->` as first line of `PROJECT-CONTEXT.md`; `HANDOFF.json` records `crystallize_version` + `crystallized_at`
192
+ - `skills/vp-brainstorm/SKILL.md`: Workflow version stamps + Upgrade gap detection bullets (ENH-067)
193
+ - `skills/vp-crystallize/SKILL.md`: Crystallize version stamps + Upgrade re-scan mode bullets (ENH-067)
194
+
195
+ ## [2.34.0] - 2026-04-21
196
+
197
+ ### Added (ENH-066)
198
+ - `workflows/brainstorm.md`: Topic 8 "User Data Management" in brainstorm Topics Template (10 sub-questions: profile management, notification preferences, privacy/GDPR controls, activity history, connected OAuth accounts, session/device management, 2FA, consent management, data retention); proactive 👤 heuristic (≥1 user-data keyword at session start, ≥2 during session); user data coverage gate before /save for B2C/SaaS/GDPR projects; `user-data.html` page in Architect workspace; `notes.md ## user_data` YAML schema; Phase assignment renumbered to Topic 9
199
+ - `workflows/crystallize.md`: Step 1D extended — exports `notes.md ## user_data` → `## User Data Management` capabilities table in `PROJECT-CONTEXT.md`; `user-data.html` added to MANDATORY READ GATE list as item 14
200
+ - `templates/project/PROJECT-CONTEXT.md`: `## User Data Management` section with placeholder capability table (8 rows: profile editing, notification prefs, privacy settings, data export, right to erasure, connected accounts, session management, 2FA)
201
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-066 documented
202
+
203
+ ## [2.33.0] - 2026-04-21
204
+
205
+ ### Added (ENH-065)
206
+ - `workflows/brainstorm.md`: Topic 7 "Content Management" in brainstorm Topics Template (10 sub-questions: content types, lifecycle, WYSIWYG/markdown, media, taxonomy, localization, search, versioning, SEO); proactive 🗂️ heuristic (≥1 content keyword at session start, ≥2 during session); content coverage gate before /save; `content.html` page in Architect workspace + Page Boundary Rules; `notes.md ## content` YAML schema; Phase assignment renumbered to Topic 8
207
+ - `workflows/crystallize.md`: Step 1D extended — exports `notes.md ## content` → `## Content Management` table (content types, media/storage, localization) in `PROJECT-CONTEXT.md`; `content.html` added to MANDATORY READ GATE list
208
+ - `templates/project/PROJECT-CONTEXT.md`: `## Content Management` section with Content Type, Media & Storage, and Localization placeholder tables
209
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-065 documented
210
+
211
+ ## [2.32.0] - 2026-04-21
212
+
213
+ ### Fixed (BUG-018)
214
+ - `workflows/brainstorm.md`: added unified workspace mode-selection AUQ prompt (Step 2B) after scope lock — user now chooses Both / Architect only / UI Direction only / Neither; Architect auto-activate heuristic deferred until after this selection; suppressed when user selects "Neither" or "UI Direction only"
215
+ - `skills/vp-brainstorm/SKILL.md`: objective updated with BUG-018 mode selection reference
216
+
217
+ ### Added (ENH-063)
218
+ - `workflows/brainstorm.md`: Topic 6 "Admin & Governance" in brainstorm Topics Template; proactive 🔐 heuristic (≥1 admin keyword at session start, ≥2 during session); admin coverage gate before /save for multi-user/SaaS/compliance projects; `admin.html` page in Architect workspace; `notes.md ## admin` YAML schema
219
+ - `workflows/crystallize.md`: Step 1D extended — exports `notes.md ## admin` → `## Admin & Governance` table (capabilities + personas) in `PROJECT-CONTEXT.md`
220
+ - `templates/project/PROJECT-CONTEXT.md`: `## Admin & Governance` section with placeholder table
221
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-063 documented
222
+
223
+ ### Added (ENH-064)
224
+ - `workflows/brainstorm.md`: cross-workspace HUB links — Architect `index.html` ↔ UI Direction `index.html` when both workspaces active in same session; triggered by arch_to_ui_sync, BUG-018 "Both" selection, or `/sync-links`
225
+ - `workflows/crystallize.md`: Step 1D MANDATORY READ GATE — if architect workspace exists, reads ALL 12 pages front-to-back before extraction; `architect_read_complete: true` required; `notes.md` missing → STOP
226
+ - `workflows/crystallize.md`: Step 1A strengthened — if ui-direction exists, reads ALL pages/*.html + ALL notes.md sections; `ui_direction_read_complete: true` required; pages inventory mismatch → STOP
227
+ - `workflows/crystallize.md`: Step 1F Cross-Reference Gate — validates `## Coverage` matrix when both workspaces present; warns on Phase 1 features with no architect OR UI coverage
228
+ - `skills/vp-crystallize/SKILL.md`: mandatory workspace read gates documented
229
+
230
+ ## [2.31.0] - 2026-04-21
231
+
232
+ ### Added (ENH-062)
233
+ - `skills/vp-skills/SKILL.md`: new `/vp-skills` slash command — agent-native global skill registry management from any project; commands: scan, list, install, uninstall, update, info; uses installed vp-tools path (`~/.claude/viepilot/bin/vp-tools.cjs`)
234
+ - `bin/vp-tools.cjs`: new `get-registry [--id <id>]` subcommand — outputs registry JSON to stdout; enables workflow shell integration
235
+
236
+ ### Fixed (BUG-016)
237
+ - `workflows/autonomous.md`: replaced non-executable `Call loadRegistry()` with `node ~/.claude/viepilot/bin/vp-tools.cjs get-registry --id {id}` shell command
238
+ - `workflows/brainstorm.md`: replaced `Call loadRegistry()` with `node ~/.claude/viepilot/bin/vp-tools.cjs get-registry` shell command + cat fallback
239
+
240
+ ### Fixed (BUG-017)
241
+ - `skills/vp-evolve/SKILL.md`: added explicit AUQ call in Step 5 `<process>` body — workflow continuation prompt (Execute /vp-auto / Create request / Done)
242
+ - `skills/vp-request/SKILL.md`: added explicit AUQ call in Step 6 `<process>` body — workflow continuation prompt (Plan /vp-evolve / Create request / Done)
243
+
244
+ ## [2.30.0] - 2026-04-20
245
+
246
+ ### Changed (FEAT-020 Phase 5 — complete)
247
+ - `workflows/autonomous.md`: Added **Skill Context Load** step at init — reads `PROJECT-CONTEXT.md ## Skills`, builds `SKILL_CONTEXT_MAP`; absent section → silent no-op
248
+ - `workflows/autonomous.md`: Added **Skill Context Injection** per-task rule — required skills whose phases match are prepended silently to execution context; records `skills_applied` in task output; never prompts user
249
+ - `skills/vp-auto/SKILL.md`: FEAT-020 silent skill execution docs
250
+ - **FEAT-020 fully complete** (Phases 90–94): Skill Registry System — scanner + installer + brainstorm integration + crystallize gate + vp-auto execution
251
+
252
+ ## [2.29.0] - 2026-04-20
253
+
254
+ ### Changed (FEAT-020 Phase 4)
255
+ - `workflows/crystallize.md`: Added **Step 1E — Skill Decision Gate** — reads `## skills_used` from brainstorm notes.md; AUQ confirm required/optional/exclude; writes `## Skills` to PROJECT-CONTEXT.md; silently skipped when no skills_used present
256
+ - `templates/project/PROJECT-CONTEXT.md`: Added `## Skills` template section
257
+ - `skills/vp-crystallize/SKILL.md`: FEAT-020 skill gate docs — AUQ flow, lock semantics, cross-references
258
+
259
+ ## [2.28.0] - 2026-04-20
260
+
261
+ ### Changed (FEAT-020 Phase 3)
262
+ - `workflows/brainstorm.md`: Added **Skill Registry Integration** step in UI Direction Mode — when active, loads `~/.viepilot/skill-registry.json`, matches skills by `capabilities` to UI signals, silently applies `best_practices` to HTML generation, records matched skills in `notes.md ## skills_used`
263
+ - `skills/vp-brainstorm/SKILL.md`: FEAT-020 skill integration docs — silent apply, crystallize lock reference
264
+
265
+ ## [2.27.0] - 2026-04-20
266
+
267
+ ### Added (FEAT-020 Phase 2 — Skill Installer)
268
+ - `lib/skill-installer.cjs`: new `installSkill(source, home?)`, `uninstallSkill(id, home?)`, `updateSkill(id, home?)` — multi-channel installer (npm / GitHub / local); writes `skill-meta.json` post-install; auto-runs `scanSkills()`
269
+ - `bin/viepilot.cjs`: new `install-skill`, `uninstall-skill`, `update-skill` subcommands
270
+
271
+ ## [2.26.0] - 2026-04-20
272
+
273
+ ### Added (FEAT-020 Phase 1 — Skill Registry Foundation)
274
+ - `lib/skill-registry.cjs`: new `scanSkills(home?)` — traverses all adapter `skillsDir` paths, parses SKILL.md (extended + legacy), deduplicates by id, writes `~/.viepilot/skill-registry.json`
275
+ - `lib/skill-registry.cjs`: new `loadRegistry(home?)` — reads and returns registry JSON (null if absent)
276
+ - `bin/viepilot.cjs`: new `scan-skills` subcommand — runs scanner, prints per-adapter summary + total unique skills
277
+ - `bin/viepilot.cjs`: new `list-skills` subcommand — displays indexed skills table from registry
278
+ - `docs/user/features/skill-registry.md`: extended SKILL.md format spec (`## Capabilities`, `## Tags`, `## Best Practices`), scanner behavior, registry JSON schema, commands table
279
+ - Extended SKILL.md format: optional metadata sections — backward compatible (legacy SKILL.md without sections indexed with `[]` fields)
280
+
281
+ ## [2.25.0] - 2026-04-18
282
+
283
+ ### Changed (ENH-061)
284
+ - `workflows/brainstorm.md`: Added **Recommended Breakdown Ordering** — 8-step idea→architect+UI flow (free collection → scope lock → coverage mapping → architect design → arch→UI sync → UI direction → completeness gate → save)
285
+ - `workflows/brainstorm.md`: Added **Feature → Coverage Mapping** step — after scope lock, maps each Phase 1 feature to an architect page + UI screen; outputs `## Coverage` matrix in `notes.md`; warns on features with no coverage in either mode (non-blocking)
286
+ - `workflows/brainstorm.md`: Added **Section 6C — Architect → UI Direction Sync** (`arch_to_ui_sync`) — reverse sync from Architect workspace to UI Direction; surfaces UI implications of architectural decisions (async flows, auth roles, error codes, constraints); `/sync-ui` command; records `## arch_to_ui_sync` in `notes.md`
287
+ - `workflows/brainstorm.md`: Expanded pre-save completeness gate with **CHECK 4** — non-blocking warning when both workspaces are active but Phase 1 features have no coverage in either mode
288
+ - `skills/vp-brainstorm/SKILL.md`: Breakdown loop documented (coverage matrix, `arch_to_ui_sync` reverse sync, completeness gate, recommended ordering)
289
+
290
+ ## [2.24.0] - 2026-04-18
291
+
292
+ ### Changed (ENH-060)
293
+ - **`workflows/brainstorm.md`**: UI Direction Mode now proactively suggests itself when ≥1 UI keyword is found in the initial message (early-session detection), matching Architect Design Mode behavior — shows a 🎨 banner before topic selection
294
+ - **`workflows/brainstorm.md`**: Lowered accumulation threshold from ≥3 to ≥1 signal; surface threshold lowered from ≥5 to ≥2 unique signals
295
+ - **`workflows/brainstorm.md`**: Confirmation dialogue updated with 🎨 banner (was plain 💡), wording mirrors the Architect 🏗️ banner style
296
+ - **`skills/vp-brainstorm/SKILL.md`**: Updated Background UI extraction docs — auto-suggestion, lower thresholds, 🎨 banner reference, ENH-060 tagged
297
+
10
298
  ## [2.23.0] - 2026-04-18
11
299
 
12
300
  ### Added
package/README.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  **Autonomous Vibe Coding Framework / Bộ khung phát triển tự động có kiểm soát**
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.23.0-blue.svg)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.31.0-blue.svg)](CHANGELOG.md)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
7
- [![Skills](https://img.shields.io/badge/skills-17-purple.svg)](#skills-reference)
7
+ [![Skills](https://img.shields.io/badge/skills-18-purple.svg)](#skills-reference)
8
8
  [![Workflows](https://img.shields.io/badge/workflows-13-orange.svg)](#workflows)
9
9
  [![Templates](https://img.shields.io/badge/templates-17-cyan.svg)](#templates)
10
- [![Tests](https://img.shields.io/badge/tests-1140%20passing-brightgreen.svg)](tests/)
10
+ [![Tests](https://img.shields.io/badge/tests-1324%20passing-brightgreen.svg)](tests/)
11
11
  [![GitHub](https://img.shields.io/github/stars/0-CODE/viepilot?style=social)](https://github.com/0-CODE/viepilot)
12
12
 
13
13
  **Versioning:** Shield **2.19.0** is the **ViePilot framework SemVer** tracked in `.viepilot/TRACKER.md` and `CHANGELOG.md`. The npm `package.json` field `version` (**2.19.0**) is the Node package identifier for this repo; use the framework version for milestone releases and docs.
@@ -29,7 +29,7 @@ Nếu ViePilot giúp ích cho bạn, bạn có thể ủng hộ một ly cafe:
29
29
  | Chỉ số / Metric | Giá trị / Value |
30
30
  |-----------------|-----------------|
31
31
  | Total LOC | **~51,713+** (`.md`, `.js`, `.cjs`, `.yml`, `.json`, `.sh`; không gồm `node_modules`) |
32
- | Skills | **17** |
32
+ | Skills | **18** |
33
33
  | Workflows | **12** |
34
34
  | Templates | **17** (Project: 12, Phase: 5) |
35
35
  | CLI Commands | **18** (`vp-tools` 17 subcommands + `viepilot` installer) |
@@ -60,7 +60,7 @@ Tổng thể / Overall: ██████████████████
60
60
 
61
61
  | Lĩnh vực / Area | Trạng thái | Chi tiết |
62
62
  |-----------------|------------|----------|
63
- | Core Skills (17) | ✅ Hoàn thiện | brainstorm, crystallize, auto, pause, resume, status, info, request, evolve, docs, update, task, debug, rollback, audit, ui-components, **proposal** |
63
+ | Core Skills (18) | ✅ Hoàn thiện | brainstorm, crystallize, auto, pause, resume, status, info, request, evolve, docs, update, task, debug, rollback, audit, ui-components, proposal, **skills** |
64
64
  | Workflows (13) | ✅ Hoàn thiện | Full step-by-step guides với success criteria |
65
65
  | Project Templates (12) | ✅ Hoàn thiện | Placeholders cho customization (+ `VIEPILOT-META` FEAT-009) |
66
66
  | Phase Templates (5) | ✅ Hoàn thiện | Task tracking, verification, summary |
@@ -339,7 +339,7 @@ Full guide: `docs/dev/deployment.md`.
339
339
 
340
340
  ```
341
341
  viepilot/
342
- ├── skills/ # 17 Skill definitions
342
+ ├── skills/ # 18 Skill definitions
343
343
  │ ├── vp-brainstorm/ # Thu thập ý tưởng
344
344
  │ │ └── SKILL.md
345
345
  │ ├── vp-crystallize/ # Tạo artifacts
package/bin/viepilot.cjs CHANGED
@@ -33,6 +33,11 @@ ViePilot CLI
33
33
  Usage:
34
34
  viepilot install [options]
35
35
  viepilot uninstall [options]
36
+ viepilot scan-skills Scan all adapter skill dirs and build skill registry
37
+ viepilot list-skills List all indexed skills from registry
38
+ viepilot install-skill <source> Install a third-party skill (npm:pkg, github:org/repo, ./path)
39
+ viepilot uninstall-skill <id> Remove a skill from all adapter dirs
40
+ viepilot update-skill <id> Re-install skill from its original source
36
41
  viepilot --help
37
42
  viepilot --list-targets
38
43
 
@@ -44,7 +49,7 @@ Install options:
44
49
  --help Show help
45
50
 
46
51
  Uninstall options:
47
- --target <id|id,id|all> Remove assets (claude-code: ~/.claude/skills/vp-*; cursor-*: ~/.cursor/skills/vp-*; antigravity: ~/.antigravity/skills/vp-*; codex: ~/.codex/skills/vp-*; copilot: ~/.config/gh-copilot/skills/vp-*)
52
+ --target <id|id,id|all> Remove assets (claude-code: ~/.claude/skills/vp-*; cursor-*: ~/.cursor/skills/vp-*; antigravity: ~/.gemini/antigravity/skills/vp-*; codex: ~/.codex/skills/vp-*; copilot: ~/.config/gh-copilot/skills/vp-*)
48
53
  --yes Non-interactive mode (skip confirmations)
49
54
  --dry-run Print actions only, do not remove files
50
55
  `);
@@ -460,6 +465,140 @@ async function main() {
460
465
  printTargets();
461
466
  process.exit(0);
462
467
  }
468
+ if (command === 'scan-skills') {
469
+ const { scanSkills } = require('../lib/skill-registry.cjs');
470
+ const result = scanSkills();
471
+ const byAdapter = {};
472
+ for (const skill of result.skills) {
473
+ for (const adapter of skill.adapters) {
474
+ byAdapter[adapter] = (byAdapter[adapter] || 0) + 1;
475
+ }
476
+ }
477
+ console.log('Scanning skill directories...');
478
+ for (const p of result.scan_paths) {
479
+ const adapterName = Object.keys(byAdapter).find(a => p.includes(`.${a.replace('claude-code', 'claude')}`)) || '';
480
+ const count = byAdapter[adapterName];
481
+ const prefix = count != null ? ' ✓' : ' -';
482
+ console.log(`${prefix} ${p}${count != null ? ` — ${count} skill${count !== 1 ? 's' : ''} found` : ' — not installed (skipped)'}`);
483
+ }
484
+ const uniqueMulti = result.skills.filter(s => s.adapters.length > 1).length;
485
+ console.log(`\nRegistry written: ~/.viepilot/skill-registry.json`);
486
+ console.log(`Total: ${result.skills.length} unique skill${result.skills.length !== 1 ? 's' : ''}${uniqueMulti > 0 ? ` (${uniqueMulti} in multiple adapters)` : ''}`);
487
+ process.exit(0);
488
+ }
489
+
490
+ if (command === 'list-skills') {
491
+ const { loadRegistry } = require('../lib/skill-registry.cjs');
492
+ const registry = loadRegistry();
493
+ if (!registry) {
494
+ console.log('No registry found. Run vp-tools scan-skills first.');
495
+ process.exit(0);
496
+ }
497
+ console.log(`\nInstalled skills (from ~/.viepilot/skill-registry.json):`);
498
+ console.log(`Last scan: ${registry.last_scan}\n`);
499
+ if (registry.skills.length === 0) {
500
+ console.log('No skills indexed.');
501
+ } else {
502
+ const idW = Math.max(4, ...registry.skills.map(s => s.id.length));
503
+ const adW = Math.max(8, ...registry.skills.map(s => s.adapters.join(', ').length));
504
+ const capW = 30;
505
+ const header = ` ${'ID'.padEnd(idW)} ${'Adapters'.padEnd(adW)} Capabilities`;
506
+ const sep = ` ${'─'.repeat(idW)} ${'─'.repeat(adW)} ${'─'.repeat(capW)}`;
507
+ console.log(header);
508
+ console.log(sep);
509
+ for (const skill of registry.skills) {
510
+ const caps = skill.capabilities.length > 0 ? skill.capabilities.join(', ') : '(legacy — no capabilities)';
511
+ console.log(` ${skill.id.padEnd(idW)} ${skill.adapters.join(', ').padEnd(adW)} ${caps}`);
512
+ }
513
+ }
514
+ console.log('\nRun `vp-tools scan-skills` to refresh.');
515
+ process.exit(0);
516
+ }
517
+
518
+ if (command === 'install-skill') {
519
+ const source = rest[0];
520
+ if (!source) { console.error('Usage: vp-tools install-skill <source>'); process.exit(1); }
521
+ const { installSkill } = require('../lib/skill-installer.cjs');
522
+ const channel = source.startsWith('github:') ? 'github' : source.startsWith('./') || source.startsWith('/') ? 'local' : 'npm';
523
+ console.log(`Installing skill: ${source} (${channel})...`);
524
+ const result = await installSkill(source);
525
+ if (result.ok) {
526
+ for (const p of result.installedPaths) console.log(` ✓ ${p} — installed`);
527
+ console.log(`Done. Skill "${result.id}" is ready.`);
528
+ process.exit(0);
529
+ } else {
530
+ console.error(`Error: ${result.error}`);
531
+ process.exit(1);
532
+ }
533
+ }
534
+
535
+ if (command === 'uninstall-skill') {
536
+ const id = rest[0];
537
+ if (!id) { console.error('Usage: vp-tools uninstall-skill <id>'); process.exit(1); }
538
+ const { uninstallSkill } = require('../lib/skill-installer.cjs');
539
+ console.log(`Removing skill: ${id}...`);
540
+ const result = uninstallSkill(id);
541
+ if (result.ok) {
542
+ if (result.removedPaths.length === 0) {
543
+ console.log(`Skill "${id}" not found in any adapter dir.`);
544
+ } else {
545
+ for (const p of result.removedPaths) console.log(` ✓ ${p} — removed`);
546
+ }
547
+ process.exit(0);
548
+ } else {
549
+ console.error(`Error: ${result.error}`);
550
+ process.exit(1);
551
+ }
552
+ }
553
+
554
+ if (command === 'update-skill') {
555
+ const id = rest[0];
556
+ if (!id) { console.error('Usage: vp-tools update-skill <id>'); process.exit(1); }
557
+ const { updateSkill } = require('../lib/skill-installer.cjs');
558
+ console.log(`Updating skill: ${id}...`);
559
+ const result = await updateSkill(id);
560
+ if (result.ok) {
561
+ for (const p of result.installedPaths) console.log(` ✓ ${p} — updated`);
562
+ console.log(`Done. Skill "${result.id}" updated.`);
563
+ process.exit(0);
564
+ } else {
565
+ console.error(`Error: ${result.error}`);
566
+ process.exit(1);
567
+ }
568
+ }
569
+
570
+ if (command === 'install-domain') {
571
+ const packName = rest[0];
572
+ if (!packName) {
573
+ console.error('Usage: viepilot install-domain <pack-name>');
574
+ console.error('Example: viepilot install-domain fintech');
575
+ process.exit(1);
576
+ }
577
+ const npmPkg = `viepilot-domain-${packName}`;
578
+ const { execSync } = require('child_process');
579
+ const path = require('path');
580
+ const fs = require('fs');
581
+ try {
582
+ console.log(`Installing ${npmPkg}...`);
583
+ execSync(`npm install ${npmPkg}`, { stdio: 'inherit' });
584
+ // Copy domain-pack.json from installed package to lib/domain-packs/
585
+ const pkgRoot = path.dirname(require.resolve(`${npmPkg}/package.json`));
586
+ const packFile = path.join(pkgRoot, 'domain-pack.json');
587
+ if (fs.existsSync(packFile)) {
588
+ const dest = path.join(__dirname, '..', 'lib', 'domain-packs', `${packName}.json`);
589
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
590
+ fs.copyFileSync(packFile, dest);
591
+ console.log(`Domain pack '${packName}' installed → lib/domain-packs/${packName}.json`);
592
+ } else {
593
+ console.warn(`Installed ${npmPkg} but no domain-pack.json found.`);
594
+ }
595
+ process.exit(0);
596
+ } catch (err) {
597
+ console.error(`Failed to install ${npmPkg}: ${err.message}`);
598
+ process.exit(1);
599
+ }
600
+ }
601
+
463
602
  if (command !== 'install' && command !== 'uninstall') {
464
603
  console.error(`Unknown command: ${command}`);
465
604
  printHelp();