viepilot 2.23.0 → 2.41.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 (38) hide show
  1. package/CHANGELOG.md +195 -0
  2. package/README.md +6 -6
  3. package/bin/viepilot.cjs +108 -1
  4. package/bin/vp-tools.cjs +109 -0
  5. package/docs/brainstorm/session-2026-04-20.md +261 -0
  6. package/docs/skills-reference.md +22 -0
  7. package/docs/user/features/adapters.md +2 -2
  8. package/docs/user/features/scaffold-first.md +62 -0
  9. package/docs/user/features/skill-registry.md +125 -0
  10. package/lib/adapters/antigravity.cjs +5 -4
  11. package/lib/skill-installer.cjs +274 -0
  12. package/lib/skill-registry.cjs +212 -0
  13. package/lib/viepilot-update.cjs +113 -0
  14. package/package.json +1 -1
  15. package/skills/vp-audit/SKILL.md +57 -9
  16. package/skills/vp-auto/SKILL.md +44 -0
  17. package/skills/vp-brainstorm/SKILL.md +108 -1
  18. package/skills/vp-crystallize/SKILL.md +72 -0
  19. package/skills/vp-debug/SKILL.md +27 -0
  20. package/skills/vp-docs/SKILL.md +27 -0
  21. package/skills/vp-evolve/SKILL.md +59 -6
  22. package/skills/vp-info/SKILL.md +27 -0
  23. package/skills/vp-pause/SKILL.md +27 -0
  24. package/skills/vp-proposal/SKILL.md +27 -0
  25. package/skills/vp-request/SKILL.md +52 -6
  26. package/skills/vp-resume/SKILL.md +27 -0
  27. package/skills/vp-rollback/SKILL.md +27 -0
  28. package/skills/vp-skills/SKILL.md +301 -0
  29. package/skills/vp-status/SKILL.md +27 -0
  30. package/skills/vp-task/SKILL.md +27 -0
  31. package/skills/vp-ui-components/SKILL.md +27 -0
  32. package/skills/vp-update/SKILL.md +27 -0
  33. package/templates/phase/TASK.md +7 -0
  34. package/templates/project/PROJECT-CONTEXT.md +76 -0
  35. package/workflows/audit.md +131 -0
  36. package/workflows/autonomous.md +140 -0
  37. package/workflows/brainstorm.md +1025 -9
  38. package/workflows/crystallize.md +528 -3
package/CHANGELOG.md CHANGED
@@ -7,6 +7,201 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.41.0] - 2026-04-24
11
+
12
+ ### Added
13
+ - **ENH-072** — vp-* skill invocation version update check
14
+ - `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)
15
+ - `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
16
+ - 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
17
+
18
+ ## [2.40.0] - 2026-04-23
19
+
20
+ ### Added
21
+ - **ENH-071** — vp-brainstorm Embedded Domain Mode (10 gaps addressed)
22
+ - Auto-activates when ≥2 embedded trigger keywords detected (MCU families + firmware concepts); `--domain embedded` flag for manual activation
23
+ - `workflows/brainstorm.md`: `detect_embedded_domain` step (Step 0B) with MCU/concept keyword lists, activation banner, and domain flag
24
+ - 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)
25
+ - 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`
26
+ - 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
27
+ - `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
28
+ - `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
29
+ - `skills/vp-brainstorm/SKILL.md`: Embedded Domain Mode section with all 6 pages table, topic probes summary, suppression behavior, crystallize exports summary
30
+
31
+ ## [2.39.1] - 2026-04-23
32
+
33
+ ### Fixed
34
+ - **BUG-021** — Antigravity adapter install path updated for Google Gemini ecosystem rebrand
35
+ - `lib/adapters/antigravity.cjs`: `skillsDir` → `~/.gemini/antigravity/skills/`
36
+ - `lib/adapters/antigravity.cjs`: `viepilotDir` → `~/.gemini/antigravity/viepilot/`
37
+ - `lib/adapters/antigravity.cjs`: `executionContextBase` → `.gemini/antigravity/viepilot`
38
+ - `lib/adapters/antigravity.cjs`: `isAvailable` checks `.gemini/antigravity/` with `.antigravity/` fallback for pre-update installs
39
+ - `bin/viepilot.cjs`: uninstall help text updated to `~/.gemini/antigravity/skills/vp-*`
40
+ - `docs/user/features/adapters.md`: Antigravity row paths updated
41
+ - `docs/user/features/skill-registry.md`: Antigravity row path updated
42
+
43
+ ## [2.39.0] - 2026-04-22
44
+
45
+ ### Added
46
+ - **ENH-070** — vp-audit auto-log gaps as requests + direct vp-evolve routing
47
+ - `workflows/audit.md`: Auto-Log Gate fires after all tiers; each ⚠️/⛔ finding auto-creates `.viepilot/requests/{TYPE}-{N}.md`
48
+ - Duplicate detection: existing open requests with matching title/files are updated (re-detected) instead of creating duplicates
49
+ - TRACKER.md backlog updated automatically after audit
50
+ - Post-audit routing banner shows logged request IDs + recommends `/vp-evolve` as next action
51
+ - AUQ prompt: "Plan fix phase → /vp-evolve" as Recommended option
52
+ - `--no-autolog` flag disables auto-logging for report-only mode
53
+ - `skills/vp-audit/SKILL.md`: documents Auto-Log Behavior + `--no-autolog`
54
+
55
+ ## [2.38.0] - 2026-04-22
56
+
57
+ ### Added
58
+ - **ENH-069** — crystallize UI→Task binding: 10-gap fix closing the chain where prototype pages remain stubs after all phases complete
59
+ - Gap 1: crystallize Step 1A emits `## UI Pages → Component Map` table binding each pages/*.html to a target component
60
+ - Gap 2: crystallize Step 7 cross-checks generated ROADMAP vs component map; auto-adds missing tasks
61
+ - Gap 3: `templates/phase/TASK.md` and `autonomous.md` populate `## UI Prototype Reference` for frontend component tasks
62
+ - Gap 4: `autonomous.md` phase completion UI Coverage Gate — warns on stub components before phase PASS
63
+ - Gap 5: crystallize Step 1D converts `arch_to_ui_sync` entries with `status: noted` into component map rows
64
+ - Gap 6: crystallize Step 1F makes coverage[] gaps blocking for scoped features (not just warnings)
65
+ - Gap 7: crystallize Step 1D requires explicit resolution of feature-map.html discrepancies before Step 7
66
+ - Gap 8: crystallize emits "design staleness" warning when arch decisions are not reflected in pages/*.html
67
+ - Gap 9: crystallize Step 1A processes `## UX walkthrough log` P0/P1 pain items → UX-fix tasks
68
+ - Gap 10: crystallize Step 1A surfaces `## Background extracted ideas` with resolution gate before Step 7
69
+
70
+ ## [2.37.0] - 2026-04-22
71
+
72
+ ### Fixed
73
+ - **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.
74
+
75
+ ### Added
76
+ - `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
77
+ - `docs/user/features/scaffold-first.md` — scaffold-first convention documentation and stack configuration guide
78
+ - `## 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
79
+
80
+ ## [2.36.1] - 2026-04-22
81
+
82
+ ### Fixed
83
+ - **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`.
84
+
85
+ ## [2.36.0] - 2026-04-22
86
+
87
+ ### Added (ENH-068)
88
+ - `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
89
+ - `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)
90
+ - `templates/project/PROJECT-CONTEXT.md`: `## Admin Entity Management` section + Import/Export placeholder sub-tables
91
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-068 documented
92
+ - `tests/unit/vp-enh031-language-standardization.test.js`: exemption for entity_mgmt keyword blockquote (`CRUD` pattern)
93
+
94
+ ## [2.35.0] - 2026-04-22
95
+
96
+ ### Added (ENH-067)
97
+ - `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`
98
+ - `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`
99
+ - `skills/vp-brainstorm/SKILL.md`: Workflow version stamps + Upgrade gap detection bullets (ENH-067)
100
+ - `skills/vp-crystallize/SKILL.md`: Crystallize version stamps + Upgrade re-scan mode bullets (ENH-067)
101
+
102
+ ## [2.34.0] - 2026-04-21
103
+
104
+ ### Added (ENH-066)
105
+ - `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
106
+ - `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
107
+ - `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)
108
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-066 documented
109
+
110
+ ## [2.33.0] - 2026-04-21
111
+
112
+ ### Added (ENH-065)
113
+ - `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
114
+ - `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
115
+ - `templates/project/PROJECT-CONTEXT.md`: `## Content Management` section with Content Type, Media & Storage, and Localization placeholder tables
116
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-065 documented
117
+
118
+ ## [2.32.0] - 2026-04-21
119
+
120
+ ### Fixed (BUG-018)
121
+ - `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"
122
+ - `skills/vp-brainstorm/SKILL.md`: objective updated with BUG-018 mode selection reference
123
+
124
+ ### Added (ENH-063)
125
+ - `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
126
+ - `workflows/crystallize.md`: Step 1D extended — exports `notes.md ## admin` → `## Admin & Governance` table (capabilities + personas) in `PROJECT-CONTEXT.md`
127
+ - `templates/project/PROJECT-CONTEXT.md`: `## Admin & Governance` section with placeholder table
128
+ - `skills/vp-brainstorm/SKILL.md`, `skills/vp-crystallize/SKILL.md`: ENH-063 documented
129
+
130
+ ### Added (ENH-064)
131
+ - `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`
132
+ - `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
133
+ - `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
134
+ - `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
135
+ - `skills/vp-crystallize/SKILL.md`: mandatory workspace read gates documented
136
+
137
+ ## [2.31.0] - 2026-04-21
138
+
139
+ ### Added (ENH-062)
140
+ - `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`)
141
+ - `bin/vp-tools.cjs`: new `get-registry [--id <id>]` subcommand — outputs registry JSON to stdout; enables workflow shell integration
142
+
143
+ ### Fixed (BUG-016)
144
+ - `workflows/autonomous.md`: replaced non-executable `Call loadRegistry()` with `node ~/.claude/viepilot/bin/vp-tools.cjs get-registry --id {id}` shell command
145
+ - `workflows/brainstorm.md`: replaced `Call loadRegistry()` with `node ~/.claude/viepilot/bin/vp-tools.cjs get-registry` shell command + cat fallback
146
+
147
+ ### Fixed (BUG-017)
148
+ - `skills/vp-evolve/SKILL.md`: added explicit AUQ call in Step 5 `<process>` body — workflow continuation prompt (Execute /vp-auto / Create request / Done)
149
+ - `skills/vp-request/SKILL.md`: added explicit AUQ call in Step 6 `<process>` body — workflow continuation prompt (Plan /vp-evolve / Create request / Done)
150
+
151
+ ## [2.30.0] - 2026-04-20
152
+
153
+ ### Changed (FEAT-020 Phase 5 — complete)
154
+ - `workflows/autonomous.md`: Added **Skill Context Load** step at init — reads `PROJECT-CONTEXT.md ## Skills`, builds `SKILL_CONTEXT_MAP`; absent section → silent no-op
155
+ - `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
156
+ - `skills/vp-auto/SKILL.md`: FEAT-020 silent skill execution docs
157
+ - **FEAT-020 fully complete** (Phases 90–94): Skill Registry System — scanner + installer + brainstorm integration + crystallize gate + vp-auto execution
158
+
159
+ ## [2.29.0] - 2026-04-20
160
+
161
+ ### Changed (FEAT-020 Phase 4)
162
+ - `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
163
+ - `templates/project/PROJECT-CONTEXT.md`: Added `## Skills` template section
164
+ - `skills/vp-crystallize/SKILL.md`: FEAT-020 skill gate docs — AUQ flow, lock semantics, cross-references
165
+
166
+ ## [2.28.0] - 2026-04-20
167
+
168
+ ### Changed (FEAT-020 Phase 3)
169
+ - `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`
170
+ - `skills/vp-brainstorm/SKILL.md`: FEAT-020 skill integration docs — silent apply, crystallize lock reference
171
+
172
+ ## [2.27.0] - 2026-04-20
173
+
174
+ ### Added (FEAT-020 Phase 2 — Skill Installer)
175
+ - `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()`
176
+ - `bin/viepilot.cjs`: new `install-skill`, `uninstall-skill`, `update-skill` subcommands
177
+
178
+ ## [2.26.0] - 2026-04-20
179
+
180
+ ### Added (FEAT-020 Phase 1 — Skill Registry Foundation)
181
+ - `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`
182
+ - `lib/skill-registry.cjs`: new `loadRegistry(home?)` — reads and returns registry JSON (null if absent)
183
+ - `bin/viepilot.cjs`: new `scan-skills` subcommand — runs scanner, prints per-adapter summary + total unique skills
184
+ - `bin/viepilot.cjs`: new `list-skills` subcommand — displays indexed skills table from registry
185
+ - `docs/user/features/skill-registry.md`: extended SKILL.md format spec (`## Capabilities`, `## Tags`, `## Best Practices`), scanner behavior, registry JSON schema, commands table
186
+ - Extended SKILL.md format: optional metadata sections — backward compatible (legacy SKILL.md without sections indexed with `[]` fields)
187
+
188
+ ## [2.25.0] - 2026-04-18
189
+
190
+ ### Changed (ENH-061)
191
+ - `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)
192
+ - `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)
193
+ - `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`
194
+ - `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
195
+ - `skills/vp-brainstorm/SKILL.md`: Breakdown loop documented (coverage matrix, `arch_to_ui_sync` reverse sync, completeness gate, recommended ordering)
196
+
197
+ ## [2.24.0] - 2026-04-18
198
+
199
+ ### Changed (ENH-060)
200
+ - **`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
201
+ - **`workflows/brainstorm.md`**: Lowered accumulation threshold from ≥3 to ≥1 signal; surface threshold lowered from ≥5 to ≥2 unique signals
202
+ - **`workflows/brainstorm.md`**: Confirmation dialogue updated with 🎨 banner (was plain 💡), wording mirrors the Architect 🏗️ banner style
203
+ - **`skills/vp-brainstorm/SKILL.md`**: Updated Background UI extraction docs — auto-suggestion, lower thresholds, 🎨 banner reference, ENH-060 tagged
204
+
10
205
  ## [2.23.0] - 2026-04-18
11
206
 
12
207
  ### 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,108 @@ 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
+
463
570
  if (command !== 'install' && command !== 'uninstall') {
464
571
  console.error(`Unknown command: ${command}`);
465
572
  printHelp();
package/bin/vp-tools.cjs CHANGED
@@ -1137,6 +1137,83 @@ ${colors.cyan}Examples:${colors.reset}
1137
1137
  process.exit(1);
1138
1138
  },
1139
1139
 
1140
+ /**
1141
+ * Output global skill registry as JSON (BUG-016 fix — shell-executable alternative to loadRegistry())
1142
+ */
1143
+ 'get-registry': (args) => {
1144
+ const { loadRegistry } = require('../lib/skill-registry.cjs');
1145
+ const registry = loadRegistry();
1146
+ if (!registry) {
1147
+ process.stdout.write('null\n');
1148
+ process.exit(0);
1149
+ }
1150
+ const idFilter = args[0] === '--id' ? args[1] : null;
1151
+ if (idFilter) {
1152
+ const skill = (registry.skills || []).find(s => s.id === idFilter) || null;
1153
+ process.stdout.write(JSON.stringify(skill) + '\n');
1154
+ } else {
1155
+ process.stdout.write(JSON.stringify(registry) + '\n');
1156
+ }
1157
+ process.exit(0);
1158
+ },
1159
+
1160
+ /**
1161
+ * ENH-072: Check npm registry for newer ViePilot version (24h cached).
1162
+ * --silent exit 0 if up-to-date (no output); exit 1 + print latest if update available
1163
+ * --json print { installed, latest, has_update }; always exit 0
1164
+ * --force bypass 24h cache
1165
+ */
1166
+ 'check-update': (args) => {
1167
+ const silent = args.includes('--silent');
1168
+ const json = args.includes('--json');
1169
+ const force = args.includes('--force');
1170
+ const { checkLatestVersion } = require('../lib/viepilot-update.cjs');
1171
+
1172
+ checkLatestVersion({ force })
1173
+ .then(({ upToDate, installed, latest }) => {
1174
+ const has_update = !upToDate;
1175
+ if (json) {
1176
+ process.stdout.write(JSON.stringify({ installed, latest, has_update }) + '\n');
1177
+ process.exit(0);
1178
+ }
1179
+ if (silent) {
1180
+ if (has_update) {
1181
+ process.stdout.write(latest + '\n');
1182
+ process.exit(1);
1183
+ } else {
1184
+ process.exit(0);
1185
+ }
1186
+ }
1187
+ // default human-readable output
1188
+ if (has_update) {
1189
+ process.stdout.write(
1190
+ `\n┌──────────────────────────────────────────────────────────────────┐\n` +
1191
+ `│ ✨ ViePilot v${latest} available (installed: v${installed})`.padEnd(69) + '│\n' +
1192
+ `│ npm i -g viepilot && vp-tools install`.padEnd(69) + '│\n' +
1193
+ `└──────────────────────────────────────────────────────────────────┘\n`
1194
+ );
1195
+ process.exit(1);
1196
+ } else {
1197
+ process.stdout.write(`ViePilot ${installed} is up to date.\n`);
1198
+ process.exit(0);
1199
+ }
1200
+ })
1201
+ .catch(() => {
1202
+ process.exit(0);
1203
+ });
1204
+ },
1205
+
1206
+ /**
1207
+ * Scan installed skills and rebuild ~/.viepilot/skill-registry.json (BUG-019)
1208
+ */
1209
+ 'scan-skills': (_args) => {
1210
+ const { scanSkills } = require('../lib/skill-registry.cjs');
1211
+ const result = scanSkills();
1212
+ const count = (result && result.skills) ? result.skills.length : 0;
1213
+ process.stdout.write(`✔ Scanned ${count} skill${count !== 1 ? 's' : ''} → ~/.viepilot/skill-registry.json\n`);
1214
+ process.exit(0);
1215
+ },
1216
+
1140
1217
  /**
1141
1218
  * Help
1142
1219
  */
@@ -1224,6 +1301,35 @@ ${colors.cyan}Examples:${colors.reset}
1224
1301
  options: ['--json: Machine-readable JSON output'],
1225
1302
  examples: ['vp-tools info', 'vp-tools info --json'],
1226
1303
  },
1304
+ 'get-registry': {
1305
+ usage: 'vp-tools get-registry [--id <skill-id>]',
1306
+ description: 'Output global skill registry as JSON (enables workflow shell integration)',
1307
+ options: ['--id <id>: Output only the matching skill object (null if not found)'],
1308
+ examples: [
1309
+ 'vp-tools get-registry',
1310
+ 'vp-tools get-registry --id frontend-design',
1311
+ ],
1312
+ },
1313
+ 'scan-skills': {
1314
+ usage: 'vp-tools scan-skills',
1315
+ description: 'Scan installed skills and rebuild ~/.viepilot/skill-registry.json',
1316
+ options: [],
1317
+ examples: ['vp-tools scan-skills'],
1318
+ },
1319
+ 'check-update': {
1320
+ usage: 'vp-tools check-update [--silent] [--json] [--force]',
1321
+ description: 'Check for latest ViePilot version on npm registry (24h cached)',
1322
+ options: [
1323
+ '--silent Exit 0 if up-to-date (no output); exit 1 + print latest if update available',
1324
+ '--json Print { installed, latest, has_update }; always exit 0',
1325
+ '--force Bypass 24h cache and check now',
1326
+ ],
1327
+ examples: [
1328
+ 'vp-tools check-update --silent',
1329
+ 'vp-tools check-update --json',
1330
+ 'vp-tools check-update --force',
1331
+ ],
1332
+ },
1227
1333
  update: {
1228
1334
  usage: 'vp-tools update [--dry-run] [--yes] [--global]',
1229
1335
  description: 'Update viepilot to npm latest (local dependency, global install, or explicit --global)',
@@ -1282,6 +1388,9 @@ ${colors.cyan}Commands:${colors.reset}
1282
1388
  ${colors.bold}hooks${colors.reset} scaffold|install [--adapter] scaffold: print snippet; install: write to settings.json
1283
1389
  ${colors.bold}config${colors.reset} <get|set|reset> Read/write language config (~/.viepilot/config.json)
1284
1390
  ${colors.bold}save-state${colors.reset} Save current state for precise resume
1391
+ ${colors.bold}get-registry${colors.reset} [--id <id>] Output global skill registry as JSON
1392
+ ${colors.bold}scan-skills${colors.reset} Scan installed skills → ~/.viepilot/skill-registry.json
1393
+ ${colors.bold}check-update${colors.reset} [--silent] Check for latest ViePilot version on npm (24h cached)
1285
1394
  ${colors.bold}help${colors.reset} [command] Show help (optionally for specific command)
1286
1395
 
1287
1396
  ${colors.cyan}Examples:${colors.reset}