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.
- package/CHANGELOG.md +288 -0
- package/README.md +6 -6
- package/bin/viepilot.cjs +140 -1
- package/bin/vp-tools.cjs +204 -0
- package/docs/brainstorm/session-2026-04-20.md +261 -0
- package/docs/brainstorm/session-2026-04-24.md +131 -0
- package/docs/brainstorm/session-2026-04-25.md +109 -0
- package/docs/skills-reference.md +22 -0
- package/docs/user/features/adapters.md +2 -2
- package/docs/user/features/scaffold-first.md +62 -0
- package/docs/user/features/skill-registry.md +125 -0
- package/lib/adapters/antigravity.cjs +5 -4
- package/lib/domain-packs/ai-product.json +33 -0
- package/lib/domain-packs/data-science.json +33 -0
- package/lib/domain-packs/devops.json +33 -0
- package/lib/domain-packs/mobile.json +33 -0
- package/lib/domain-packs/web-saas.json +33 -0
- package/lib/skill-installer.cjs +274 -0
- package/lib/skill-registry.cjs +212 -0
- package/lib/viepilot-calibrate.cjs +279 -0
- package/lib/viepilot-persona.cjs +446 -0
- package/lib/viepilot-update.cjs +113 -0
- package/package.json +1 -1
- package/skills/vp-audit/SKILL.md +67 -9
- package/skills/vp-auto/SKILL.md +54 -0
- package/skills/vp-brainstorm/SKILL.md +124 -2
- package/skills/vp-crystallize/SKILL.md +82 -0
- package/skills/vp-debug/SKILL.md +37 -0
- package/skills/vp-design/SKILL.md +219 -0
- package/skills/vp-docs/SKILL.md +37 -0
- package/skills/vp-evolve/SKILL.md +69 -6
- package/skills/vp-info/SKILL.md +37 -0
- package/skills/vp-pause/SKILL.md +37 -0
- package/skills/vp-persona/SKILL.md +207 -0
- package/skills/vp-proposal/SKILL.md +37 -0
- package/skills/vp-request/SKILL.md +62 -6
- package/skills/vp-resume/SKILL.md +37 -0
- package/skills/vp-rollback/SKILL.md +61 -1
- package/skills/vp-skills/SKILL.md +311 -0
- package/skills/vp-status/SKILL.md +37 -0
- package/skills/vp-task/SKILL.md +37 -0
- package/skills/vp-ui-components/SKILL.md +37 -0
- package/skills/vp-update/SKILL.md +37 -0
- package/templates/phase/TASK.md +7 -0
- package/templates/project/PROJECT-CONTEXT.md +76 -0
- package/workflows/audit.md +131 -0
- package/workflows/autonomous.md +199 -0
- package/workflows/brainstorm.md +1172 -9
- package/workflows/crystallize.md +639 -3
- package/workflows/design.md +601 -0
- package/workflows/evolve.md +9 -0
- 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
|
-
[](CHANGELOG.md)
|
|
6
6
|
[](LICENSE)
|
|
7
|
-
[](#skills-reference)
|
|
8
8
|
[](#workflows)
|
|
9
9
|
[](#templates)
|
|
10
|
-
[](tests/)
|
|
11
11
|
[](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 | **
|
|
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 (
|
|
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/ #
|
|
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();
|