viepilot 2.49.0 → 3.7.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 (49) hide show
  1. package/CHANGELOG.md +234 -0
  2. package/README.md +1 -1
  3. package/bin/viepilot.cjs +1 -0
  4. package/bin/vp-tools.cjs +123 -1
  5. package/docs/brainstorm/session-2026-05-22.md +472 -0
  6. package/docs/dev/agents.md +51 -41
  7. package/lib/adapter-context.cjs +294 -0
  8. package/lib/adapters/antigravity.cjs +8 -2
  9. package/lib/adapters/claude-code.cjs +4 -0
  10. package/lib/audit/browser-runner.cjs +102 -0
  11. package/lib/intake/adapters/browser.cjs +58 -0
  12. package/lib/intake/adapters/excel-m365.cjs +114 -29
  13. package/lib/intake/auto-intake.cjs +194 -0
  14. package/lib/intake/channels.cjs +44 -3
  15. package/lib/intake/classifier.cjs +22 -4
  16. package/lib/intake/manifest.cjs +81 -0
  17. package/lib/intake/setup-wizard.cjs +215 -0
  18. package/lib/intake/triage-ux.cjs +10 -2
  19. package/lib/intake/validator.cjs +97 -0
  20. package/lib/intake/writeback.cjs +169 -3
  21. package/lib/request/url-enricher.cjs +69 -0
  22. package/lib/viepilot-install.cjs +15 -0
  23. package/package.json +1 -1
  24. package/skills/vp-audit/SKILL.md +99 -3
  25. package/skills/vp-auto/SKILL.md +54 -4
  26. package/skills/vp-brainstorm/SKILL.md +69 -3
  27. package/skills/vp-crystallize/SKILL.md +52 -3
  28. package/skills/vp-debug/SKILL.md +52 -3
  29. package/skills/vp-design/SKILL.md +52 -3
  30. package/skills/vp-docs/SKILL.md +52 -3
  31. package/skills/vp-evolve/SKILL.md +52 -3
  32. package/skills/vp-info/SKILL.md +52 -3
  33. package/skills/vp-intake/SKILL.md +349 -14
  34. package/skills/vp-pause/SKILL.md +52 -3
  35. package/skills/vp-persona/SKILL.md +52 -3
  36. package/skills/vp-proposal/SKILL.md +52 -3
  37. package/skills/vp-request/SKILL.md +72 -3
  38. package/skills/vp-resume/SKILL.md +52 -3
  39. package/skills/vp-rollback/SKILL.md +52 -3
  40. package/skills/vp-skills/SKILL.md +52 -3
  41. package/skills/vp-status/SKILL.md +52 -3
  42. package/skills/vp-task/SKILL.md +52 -3
  43. package/skills/vp-ui-components/SKILL.md +52 -3
  44. package/skills/vp-update/SKILL.md +52 -3
  45. package/workflows/autonomous.md +268 -18
  46. package/workflows/brainstorm.md +222 -7
  47. package/workflows/crystallize.md +124 -6
  48. package/workflows/design.md +62 -1
  49. package/workflows/request.md +54 -8
package/CHANGELOG.md CHANGED
@@ -7,6 +7,240 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ---
11
+
12
+ ## [3.7.2] - 2026-05-23
13
+
14
+ ### Added — ENH-097: vp-auto Full Orchestrator Delegation (Phase 142)
15
+ - **agents/claude-code/vp-git-agent.md** — new agent for phase-level git ops: create-tag, push-branch, push-tags, push-all, git-status; orchestrator spawns instead of running git inline
16
+ - **agents/claude-code/tracker-agent.md** — new ops: `update-handoff` (HANDOFF.json patch), `update-roadmap-phase` (ROADMAP.md phase status update); Write tool added
17
+
18
+ ### Changed — ENH-097
19
+ - **workflows/autonomous.md** — ENH-096 whitelist tightened: orchestrator Bash = read-only git checks only; all state writes and git ops now go through tracker-agent / vp-git-agent / changelog-agent
20
+ - **workflows/autonomous.md** — §4 Update State: full tracker-agent spawn patterns for task-status, handoff, roadmap sync
21
+ - **workflows/autonomous.md** — §5 Phase Complete: git tagging and push delegated to vp-git-agent; TRACKER.md sync to tracker-agent
22
+
23
+ ---
24
+
25
+ ## [3.7.1] - 2026-05-23
26
+
27
+ ### Changed — ENH-096: vp-auto Orchestrator Enforcement (Phase 141)
28
+ - **workflows/autonomous.md** — ⛔ hard stop block: explicit prohibition on inline implementation in orchestrator context; lists forbidden ops (Edit/Write on lib/bin/tests/agents/skills); enforces delegation even for single-task phases
29
+ - **workflows/autonomous.md** — orchestrator-only whitelist: Read (state files), Bash (git/vp-tools), Agent (spawn workers), Edit/Write (.viepilot/ state only)
30
+ - **workflows/autonomous.md** — concrete `Agent(vp-task-executor)` spawn template with exact prompt text and all placeholder fields ({task_path}, {phase_dir}, {cwd}, {projectPrefix})
31
+
32
+ ---
33
+
34
+ ## [3.7.0] - 2026-05-23
35
+
36
+ ### Added — ENH-095: AI-Driven Intake Intelligence — Manifest + Post-task Write-back (Phase 140)
37
+ - **lib/intake/manifest.cjs** — new manifest module: `saveManifest`, `loadManifest`, `isManifestFresh` (TTL-based), `getColumnMap`, `getWriteBackConfig`, `manifestPath`, `slugify`; manifest stored at `.viepilot/intake/{channel_id}-manifest.json`
38
+ - **agents/claude-code/excel-intake-agent.md** — new `Op: analyze_structure` section: AI reads all sheets, determines purpose/header rows/column semantics/write_back config, outputs structured JSON manifest; no hardcoded IDs
39
+ - **agents/claude-code/sheets-intake-agent.md** — matching `Op: analyze_structure` parity section
40
+ - **skills/vp-intake/SKILL.md** — manifest lifecycle workflow (check TTL → `--analyze` op → save manifest → use `getColumnMap`); new `## Intake Source` block embedded in accepted-ticket request files for post-task traceability
41
+ - **lib/intake/writeback.cjs** — new `writebackIntakeResponse(channel, sourceRow, response, projectRoot, sheetName, responseCol)`: writes status back to source row after PASS; `sharing_url` = read-only skip; `workbook_id` = Graph API PATCH; CSV/browser = silent skip
42
+ - **workflows/autonomous.md** — Post-PASS Intake Write-back hook (ENH-095): reads `## Intake Source` block from task.md, loads manifest, calls `writebackIntakeResponse`; non-fatal on failure
43
+
44
+ ---
45
+
46
+ ## [3.6.2] - 2026-05-23
47
+
48
+ ### Fixed
49
+ - **BUG-030** `lib/intake/adapters/excel-m365.cjs` — `parseRowsWithColumnMap` now handles missing `column_map` gracefully: auto-detects columns from header row using Vietnamese/English aliases (`HEADER_ALIASES`), warns to stderr with detected mapping, falls back to empty map instead of crashing with `TypeError`
50
+ - **BUG-030** Export `autoDetectColumnMap` + `HEADER_ALIASES` for testing and external use
51
+ - **ENH-094** `lib/intake/adapters/browser.cjs` — add `sharepoint-xlsx` pattern (`/sharepoint\.com\/:[a-z]:\/r\//`) to `URL_PATTERNS`; SharePoint xlsx sharing URLs now detected correctly instead of falling through as `generic-table`
52
+ - **ENH-094** `skills/vp-intake/SKILL.md` — browser channel dispatch now routes `sharepoint-xlsx` URLs to `excel-intake-agent` (sharing_url mode) instead of `browser-intake-agent`
53
+
54
+ ---
55
+
56
+ ## [3.6.0] - 2026-05-23
57
+
58
+ ### Added
59
+ - **ENH-090** `browser-intake-agent` (agents/claude-code/) — reads publicly shared URLs (Google Sheets, GitHub Issues, Jira, Trello, Notion) for vp-intake via `vercel-labs/agent-browser`
60
+ - **ENH-090** `lib/intake/adapters/browser.cjs` — URL type detector + browser channel dispatcher; supports google-sheets / github-issues / jira / trello / notion / generic
61
+ - **ENH-090** `skills/vp-intake/SKILL.md` — new `browser` channel type with `url` field; fallback chain: agent-browser → WebFetch → manual
62
+ - **ENH-091** `browser-audit-agent` (agents/claude-code/) — visual + functional dev server audit ops: audit_routes, visual_check, accessibility_check
63
+ - **ENH-091** `lib/audit/browser-runner.cjs` — browser audit orchestrator; writes `.viepilot/audit/visual-report-{timestamp}.md`; baseline save/compare
64
+ - **ENH-091** `skills/vp-audit/SKILL.md` — `--visual` / `--browser <url>` flags for runtime browser audit
65
+ - **ENH-092** `agents/claude-code/research-agent.md` upgraded — new ops: `browse_url`, `compare_products`, `extract_pricing` for JS-rendered competitor/doc research
66
+ - **ENH-092** `workflows/brainstorm.md` Step 3 — URL research block: dispatch research-agent with browse_url when reference URL provided
67
+ - **ENH-093** `lib/request/url-enricher.cjs` — URL auto-enricher; routes GitHub/Linear/Jira/Trello/Notion URLs to browser-intake-agent for pre-fill extraction
68
+ - **ENH-093** `workflows/request.md` — URL detection pre-step before Step 1; shows extracted fields with confirm/edit prompt
69
+ - **ENH-093** `skills/vp-request/SKILL.md` — URL auto-enrichment documentation with examples for all 5 tracker sources
70
+
71
+ ---
72
+
73
+ ## [3.5.0] - 2026-05-23
74
+
75
+ ### Added — ENH-088: `--schedule`/`--unschedule` flags + `--auto` headless intake mode (Phase 138)
76
+ ### Added — lib/intake/auto-intake.cjs: `runAutoIntake`, `createSchedule`, `deleteSchedule`, `appendPendingReview`
77
+ ### Added — vp-intake SKILL.md: pending-review queue check at manual run start
78
+ ### Changed — lib/intake/classifier.cjs: returns `{ classified, confidence: 0.0–1.0 }` (was plain string)
79
+
80
+ ---
81
+
82
+ ## [3.4.0] - 2026-05-23
83
+
84
+ ### Added — ENH-087: parallel codebase validation (Step 4.5) before triage in vp-intake (Phase 137)
85
+ ### Added — lib/intake/validator.cjs: `validateTickets`, `extractKeywords`, `validateTicket` (fan-out + duplicate detection)
86
+ ### Changed — triage-ux.cjs: `_validation` badge shown per ticket in AUQ display
87
+
88
+ ---
89
+
90
+ ## [3.3.0] - 2026-05-23
91
+
92
+ ### Added — ENH-089: `excel-intake-agent` + `sheets-intake-agent` native CC agents (Phase 136)
93
+ ### Fixed — BUG-029: Excel M365 write-back stub replaced with Graph API PATCH implementation
94
+ ### Changed — vp-intake SKILL.md: Excel/Sheets dispatch via native agents on CC adapter (Step 4 + Step 6)
95
+
96
+ ---
97
+
98
+ ## [3.2.0] - 2026-05-22
99
+
100
+ ### Added — ENH-086: 6 workflow agents promoted to native Claude Code agents (Phase 135)
101
+ - `agents/claude-code/changelog-agent.md`, `tracker-agent.md`, `research-agent.md`,
102
+ `file-scanner-agent.md`, `test-generator-agent.md`, `doc-sync-agent.md` — all 6 now
103
+ installed to `~/.claude/agents/` and visible in Claude Code's `/agents` dialog
104
+ - `research-agent` uses `claude-sonnet-4-6`; other 5 use `claude-haiku-4-5`
105
+ - 11 new tests: `tests/unit/phase135-enh086-native-agents.test.js`
106
+
107
+ ### Fixed — BUG-028: test-generator-agent + file-scanner-agent wired (Phase 135)
108
+ - `workflows/autonomous.md`: `test-generator-agent` invocation block added before
109
+ git-persistence gate, triggered on last task of phase when `## Acceptance Criteria` present
110
+ - `skills/vp-audit/SKILL.md`: Tier 1 + Tier 2 scan steps invoke `file-scanner-agent`
111
+ (subagent_type) for repo-wide Glob+Grep; non-Claude-Code fallback retained
112
+
113
+ ### Changed
114
+ - `workflows/autonomous.md`: tracker-agent, changelog-agent, doc-sync-agent invocations
115
+ use `subagent_type: "X-agent"` directly (no prompt-injection "Load agents/X.md" preamble)
116
+ - `workflows/request.md`: research-agent feasibility gate uses `subagent_type: "research-agent"`
117
+ - `docs/dev/agents.md`: architecture diagram updated to show all 9 native agents in
118
+ `~/.claude/agents/`; adapter table updated; invocation pattern updated
119
+
120
+ ### Fixed — BUG-027 tracking (Phase 135)
121
+ - TRACKER.md and ROADMAP.md updated to reflect BUG-027 as done (code fix shipped in v3.1.1)
122
+
123
+ ---
124
+
125
+ ## [3.1.1] - 2026-05-22
126
+
127
+ ### Fixed — BUG-027: claudeAgentsDir wired into install plan (Phase 134)
128
+ - `lib/viepilot-install.cjs`: `buildInstallPlan` now reads `adapter.claudeAgentsSrc` +
129
+ `adapter.claudeAgentsDir` and adds copy steps for each `.md` in `agents/claude-code/`
130
+ to `~/.claude/agents/` (native Claude Code agents directory)
131
+ - After install: `~/.claude/agents/vp-task-executor.md`, `vp-phase-planner.md`,
132
+ `vp-quality-gate.md` are present and the fan-out orchestration in `autonomous.md` works
133
+ - 5 new tests: `tests/unit/phase134-bug027-claude-agents-install.test.js`
134
+
135
+ ---
136
+
137
+ ## [3.1.0] - 2026-05-22
138
+
139
+ ### v3.1.0 — vp-auto Orchestration Refactor (FEAT-021 Phase 133)
140
+
141
+ #### Phase 133 — vp-auto Orchestration Refactor ✅
142
+ - `autonomous.md`: orchestration mode selection — `ADAPTER_PARALLEL` flag gates fan-out vs sequential
143
+ - `autonomous.md`: dependency resolution via `vp-phase-planner` agent → `clusters` JSON (can_parallel, sequential_fallback)
144
+ - `autonomous.md`: fan-out dispatch — parallel `Agent(vp-task-executor)` calls per cluster; simultaneous execution
145
+ - `autonomous.md`: model tiering — Haiku workers for routine file edits, Sonnet for planner + quality gate
146
+ - `autonomous.md`: Agent Teams mode for large phases (task count ≥ 8 + `orchestration.teams == true`)
147
+ - `autonomous.md`: sequential fallback for Cursor/Antigravity/Codex/Copilot (`orchestration.parallel == false`)
148
+ - `autonomous.md`: quality gate after each cluster via `Agent(vp-quality-gate)` — PASS/FAIL/PARTIAL routing
149
+ - 13 new tests: `tests/unit/phase133-feat021-vp-auto-orchestration.test.js`
150
+
151
+ ---
152
+
153
+ ## [3.0.0] - 2026-05-22
154
+
155
+ ### v3.0.0 — Per-Adapter Intelligence Refactor (FEAT-021)
156
+
157
+ **Milestone**: v3.0 — Phases 127–132 → v3.0.0, Phase 133 → v3.1.0
158
+ **Breaking changes**: `cursor_skill_adapter` removed from all SKILL.md; new `<adapter id="...">` 5-block standard
159
+
160
+ #### Phase 127 — Adapter Detection + ADAPTER_CONTEXT + Validate ✅
161
+ - `vp-tools detect-adapter`: heuristic adapter detection at session start (env vars + process parent)
162
+ - `lib/adapter-context.cjs`: ADAPTER_CONTEXT schema with tools{}, interactive, subagent, orchestration{} per adapter (5 adapters)
163
+ - `vp-tools validate --adapter <id>`: checks tool availability, warns on limitations
164
+ - ADAPTER_CONTEXT injection at session start in autonomous.md
165
+
166
+ #### Phase 128 — SKILL.md 5-Block Adapter Standard ✅
167
+ - Replace `<cursor_skill_adapter>` with `<adapter id="claude-code|cursor-agent|antigravity|codex|copilot">` in all 21 SKILL.md files
168
+ - Claude Code now has correct tool names: `Bash` (not Shell), `Read` (not ReadFile), `Grep` (not rg), `Edit`/`Write` (not ApplyPatch), `Agent` (not Subagent)
169
+ - Documented in `docs/dev/adapter-blocks.md`
170
+
171
+ #### Phase 129 — Workflow Adapter-Aware Execution Paths ✅
172
+ - All 4 core workflows (autonomous, brainstorm, crystallize, design) read ADAPTER_CONTEXT
173
+ - Unified fallback chains: AUQ → text list → defaults (interactive); Bash/run_terminal_cmd/shell/container.exec (shell)
174
+ - No more per-workflow inline compat tables
175
+
176
+ #### Phase 130 — Claude Code Agent Definitions + Hooks ✅
177
+ - `.claude/agents/vp-task-executor.md`: Haiku model worker (Read/Edit/Write/Bash/Glob/Grep, maxTurns=30)
178
+ - `.claude/agents/vp-phase-planner.md`: Sonnet dependency resolver
179
+ - `.claude/agents/vp-quality-gate.md`: Sonnet test runner + output checker
180
+ - PreToolUse/PostToolUse hooks as workflow gates via `vp-tools hooks install --adapter claude-code`
181
+
182
+ #### Phase 131 — Antigravity Path Fix + Deprecation Notice ✅
183
+ - Antigravity adapter adds `projectSkillsDir: '.agents/skills'` for project-level skill installs alongside global `~/.gemini/antigravity/skills/`
184
+ - `vp-tools install --target antigravity` shows Gemini CLI deprecation notice (Gemini CLI deprecated June 18, 2026; successor: Antigravity CLI)
185
+ - `isAvailable()` now also detects `.agents/` directory in cwd for project-scoped setups
186
+ - Deprecation notice links to both project (`.agents/skills/`) and global (`~/.gemini/antigravity/skills/`) skill paths
187
+ - 8 new tests: `tests/unit/phase131-feat021-antigravity-path-fix.test.js`
188
+
189
+ #### Phase 132 — Tests + CHANGELOG + v3.0.0 Bump ✅
190
+ - 25 new integration + contract tests covering: ADAPTER_CONTEXT completeness, adapter tool mappings, 5-block standard across all SKILL.md, workflow adapter-aware paths, claude-code agent definitions, antigravity Phase 131 additions
191
+ - `tests/unit/phase132-feat021-integration.test.js`: 13 integration tests (adapter detection, ADAPTER_CONTEXT schema, detect-adapter --json, validate --adapter)
192
+ - `tests/unit/phase132-feat021-contracts.test.js`: 12 contract tests (5-block standard, workflow adapter refs, adapter property contracts)
193
+ - Version bump: 2.51.0 → 3.0.0; CHANGELOG [3.0.0] finalized
194
+
195
+ #### Phase 133 — vp-auto Orchestration Refactor (planned → v3.1.0)
196
+ - autonomous.md: task dependency graph + runnable cluster identification
197
+ - Fan-out dispatch: parallel `Agent` tool calls for independent tasks within a cluster
198
+ - Agent Teams mode for large homogeneous phases (task count ≥8 + ADAPTER_CONTEXT.orchestration.teams)
199
+ - Model tiering: Haiku workers for routine file edits, Sonnet for orchestrator + quality gate
200
+ - Adapter fallback: sequential mode when `orchestration.parallel == false` (Cursor/Copilot/Antigravity/Codex)
201
+ - Target: ≥60% token reduction vs. single-agent for typical 7-task phase
202
+
203
+ ## [2.51.0] - 2026-05-22
204
+
205
+ ### Added — ENH-085: Mobile UI Direction Breakdown Quality (Phase 126)
206
+ - `design.md` schema: `screens` breakpoints (mobile/tablet/desktop/wide) + `strategy` field + `## Responsive Components` table; `--sync` maps screens → Tailwind `theme.extend.screens`
207
+ - Brainstorm: **Mobile Design Direction sub-phase** — AUQ 1 (viewport strategy: mobile-first/desktop-first/mobile-only/desktop-only) + AUQ 2 multi-select device scope (phone/tablet/desktop/wide), fires when mobile/responsive/breakpoint/viewport/touch keywords detected
208
+ - Brainstorm: Per-breakpoint `<details>` sections in `pages/*.html` — Phone/Tablet/Desktop layout + navigation strategy (lookup table by page type), CSS block for `.responsive-breakdown`
209
+ - Brainstorm: **Component Responsive Map** table auto-generated in `notes.md` (≥7 rows: Nav/Grid/Table/Modal/Forms/Buttons/Images + Navigation Pattern Detail + Tailwind utility reference); guard against duplicate generation
210
+ - Sub-scan A (crystallize): Extracts `theme.screens` / `theme.extend.screens` from `tailwind.config.js` (fallback to Tailwind defaults); scans JSX/TSX/Vue/Svelte for `sm:/md:/lg:/xl:/2xl:` patterns; infers mobile-first vs. desktop-first strategy; emits RESPONSIVE SUMMARY block
211
+ - Crystallize: **Step 1A-iv** — consumes responsive metadata from 4 sources (notes.md Component Responsive Map, session context, pages/*.html breakpoint sections, Sub-scan A); emits `## Responsive Implementation Notes` in ARCHITECTURE.md with per-page responsive target table and high-priority component list
212
+ - 27 tests in `tests/unit/phase126-enh085-mobile-ui-direction.test.js`
213
+
214
+ ## [2.50.1] - 2026-05-17
215
+
216
+ ### Fixed
217
+ - **BUG** SharePoint sharing link download: forward FedAuth session cookies from WOPI page
218
+ redirect chain to the `download.aspx` download request — without these cookies the download
219
+ returned HTTP 401 or an HTML error page even though incognito browser worked fine.
220
+ `httpsGetRaw` now accumulates `Set-Cookie` headers across all hops; `downloadXlsx` retries
221
+ with cookies when the initial response is not a valid xlsx binary.
222
+
223
+ ## [2.50.0] - 2026-05-17
224
+
225
+ ### Added
226
+ - **ENH-084** `vp-intake` Setup Wizard — AUQ-driven channel configuration (Phase 125):
227
+ - **Auto-trigger**: wizard runs automatically when `channels.json` has no real channels
228
+ (only scaffold stubs with `-example` IDs or `REPLACE_WITH_*` values)
229
+ - **`--setup` / `--config` flags**: force wizard even when channels already exist
230
+ - **4-type wizard** via `lib/intake/setup-wizard.cjs`: CSV/TSV, Google Sheets, Excel M365
231
+ (Graph API), SharePoint Sharing Link — collects all required fields via AUQ + free-text
232
+ - **Credentials guide**: for Google Sheets and M365, wizard prints step-by-step setup
233
+ instructions before asking for config values (no live validation)
234
+ - **Preview + confirm**: shows JSON preview of channel config before writing
235
+ - **`appendChannel()`**: strips scaffold stubs, preserves non-stub channels, appends new
236
+ - **`isStubChannel()` / `hasRealChannels()`**: stub detection helpers in `channels.cjs`
237
+ - **Auto-select after wizard**: if exactly 1 channel created → skips channel selection AUQ
238
+ - **`validateChannel` fix**: accepts `sharing_url` as valid alternative to `workbook_id`
239
+ for `excel_m365` channels (ENH-083 compatibility)
240
+ - **18 new tests** (1915 total): stub detection (5), hasRealChannels (5), appendChannel (2),
241
+ slugify (3), extractSpreadsheetId (3)
242
+ - `vp-intake` skill version bumped to **v1.1.0**
243
+
10
244
  ## [2.49.0] - 2026-05-17
11
245
 
12
246
  ### Added
package/README.md CHANGED
@@ -2,7 +2,7 @@
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.31.0-blue.svg)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-3.1.1-blue.svg)](CHANGELOG.md)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
7
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)
package/bin/viepilot.cjs CHANGED
@@ -383,6 +383,7 @@ async function installCommand(rawArgs) {
383
383
  const a = adapterMap[target];
384
384
  if (a && !seenAdapters.has(a.id)) {
385
385
  seenAdapters.add(a.id);
386
+ if (a.deprecationNotice) console.log(`\n${a.deprecationNotice}`);
386
387
  console.log(`- ${a.name}: ${a.postInstallHint || 'run /vp-status'}`);
387
388
  }
388
389
  }
package/bin/vp-tools.cjs CHANGED
@@ -1303,6 +1303,126 @@ ${colors.cyan}Examples:${colors.reset}
1303
1303
  console.log('\nEdit .viepilot/intake/channels.json to configure your ticket channels.');
1304
1304
  },
1305
1305
 
1306
+ /**
1307
+ * Detect active adapter from environment heuristics (FEAT-021 Phase 127)
1308
+ * Usage: vp-tools detect-adapter [--json]
1309
+ */
1310
+ 'detect-adapter': (args) => {
1311
+ const { detectAdapter, getAdapterContext } = require('../lib/adapter-context.cjs');
1312
+ const jsonMode = args.includes('--json');
1313
+ const adapterId = detectAdapter();
1314
+ const ctx = getAdapterContext(adapterId);
1315
+
1316
+ if (jsonMode) {
1317
+ const output = {
1318
+ adapter: adapterId,
1319
+ name: ctx.name,
1320
+ interactive_mode: ctx.interactive,
1321
+ subagent: ctx.subagent,
1322
+ orchestration: ctx.orchestration,
1323
+ hooks_count: ctx.hooks.count,
1324
+ mcp: ctx.mcp,
1325
+ capabilities: Object.entries(ctx.tools)
1326
+ .filter(([, v]) => v !== null)
1327
+ .map(([k]) => k),
1328
+ };
1329
+ console.log(JSON.stringify(output, null, 2));
1330
+ return;
1331
+ }
1332
+
1333
+ console.log(`\n${colors.bold}Active Adapter:${colors.reset} ${ctx.name} (${adapterId})`);
1334
+ console.log(`\n${colors.cyan}Interactive:${colors.reset} ${ctx.interactive}`);
1335
+ console.log(`${colors.cyan}Subagent:${colors.reset} ${ctx.subagent}`);
1336
+ console.log(`${colors.cyan}Parallel exec:${colors.reset} ${ctx.orchestration.parallel}`);
1337
+ console.log(`${colors.cyan}Agent Teams:${colors.reset} ${ctx.orchestration.teams}`);
1338
+ console.log(`${colors.cyan}Hooks:${colors.reset} ${ctx.hooks.count} events`);
1339
+ console.log(`${colors.cyan}MCP limit:${colors.reset} ${ctx.mcp.tool_limit !== null ? ctx.mcp.tool_limit + ' tools' : 'none'}`);
1340
+ console.log(`\n${colors.cyan}Tool names:${colors.reset}`);
1341
+ Object.entries(ctx.tools)
1342
+ .filter(([, v]) => v !== null)
1343
+ .forEach(([k, v]) => console.log(` ${k.padEnd(14)} → ${v}`));
1344
+ console.log();
1345
+ },
1346
+
1347
+ /**
1348
+ * Validate adapter capability requirements (FEAT-021 Phase 127)
1349
+ * Usage: vp-tools validate --adapter <id>
1350
+ */
1351
+ validate: (args) => {
1352
+ const { getAdapterContext, listAdapterIds } = require('../lib/adapter-context.cjs');
1353
+ const adapterIdx = args.indexOf('--adapter');
1354
+ const adapterId = adapterIdx !== -1 ? args[adapterIdx + 1] : null;
1355
+
1356
+ if (!adapterId) {
1357
+ console.error(formatError('--adapter <id> is required', `Known adapters: ${listAdapterIds().join(', ')}`));
1358
+ process.exitCode = 1;
1359
+ return;
1360
+ }
1361
+
1362
+ let ctx;
1363
+ try {
1364
+ ctx = getAdapterContext(adapterId);
1365
+ } catch (e) {
1366
+ console.error(formatError(e.message));
1367
+ process.exitCode = 1;
1368
+ return;
1369
+ }
1370
+
1371
+ const warnings = [];
1372
+ const errors = [];
1373
+
1374
+ // Critical tool checks
1375
+ if (!ctx.tools.shell) errors.push('No shell/command execution tool — vp-auto cannot run bash commands');
1376
+ if (!ctx.tools.read && !ctx.tools.write) errors.push('No file read or write tool — skill execution will be severely limited');
1377
+ if (!ctx.tools.edit && !ctx.tools.write) errors.push('No file edit/write tool — cannot implement code changes');
1378
+
1379
+ // AUQ interactive check
1380
+ if (ctx.interactive === 'none') {
1381
+ warnings.push('No interactive prompts (AUQ/AskQuestion) — all prompts will be skipped or use defaults');
1382
+ } else if (ctx.interactive === 'text-plan-only' || ctx.interactive === 'text') {
1383
+ warnings.push(`Interactive mode is "${ctx.interactive}" — AUQ not available; text list fallback will be used`);
1384
+ }
1385
+
1386
+ // Orchestration
1387
+ if (!ctx.orchestration.parallel) {
1388
+ warnings.push('Parallel task execution not supported — vp-auto will run in sequential mode (higher token usage)');
1389
+ }
1390
+
1391
+ // MCP limit
1392
+ if (ctx.mcp.tool_limit !== null) {
1393
+ warnings.push(`MCP tool limit: ${ctx.mcp.tool_limit} tools — verify your MCP server count stays within limit`);
1394
+ }
1395
+
1396
+ // Hooks
1397
+ if (ctx.hooks.count === 0) {
1398
+ warnings.push('No hook events supported — PreToolUse/PostToolUse gates will not fire');
1399
+ }
1400
+
1401
+ // Antigravity deprecation
1402
+ if (ctx.deprecation_notice) {
1403
+ warnings.push(`DEPRECATION: ${ctx.deprecation_notice}`);
1404
+ }
1405
+
1406
+ // Output
1407
+ console.log(`\n${colors.bold}ViePilot Capability Validation${colors.reset}`);
1408
+ console.log(`${colors.cyan}Adapter:${colors.reset} ${ctx.name} (${adapterId})\n`);
1409
+
1410
+ if (errors.length === 0 && warnings.length === 0) {
1411
+ console.log(formatSuccess('All capability checks passed — adapter fully supported'));
1412
+ return;
1413
+ }
1414
+
1415
+ errors.forEach(e => console.log(formatError(`CRITICAL: ${e}`)));
1416
+ warnings.forEach(w => console.log(formatWarning(`WARN: ${w}`)));
1417
+
1418
+ if (errors.length > 0) {
1419
+ console.log(`\n${colors.red}${errors.length} critical gap(s) detected. Some ViePilot features will not work on this adapter.${colors.reset}`);
1420
+ process.exitCode = 1;
1421
+ } else {
1422
+ console.log(`\n${colors.yellow}${warnings.length} warning(s). ViePilot will work with limitations on this adapter.${colors.reset}`);
1423
+ }
1424
+ },
1425
+
1306
1426
  /**
1307
1427
  * Help
1308
1428
  */
@@ -1501,6 +1621,8 @@ ${colors.cyan}Commands:${colors.reset}
1501
1621
  ${colors.bold}scan-skills${colors.reset} Scan installed skills → ~/.viepilot/skill-registry.json
1502
1622
  ${colors.bold}check-update${colors.reset} [--silent] Check for latest ViePilot version on npm (24h cached)
1503
1623
  ${colors.bold}persona${colors.reset} <op> Manage user personas (get|infer|list|set|auto-switch|context)
1624
+ ${colors.bold}detect-adapter${colors.reset} [--json] Detect active adapter (claude-code/cursor/antigravity/codex/copilot)
1625
+ ${colors.bold}validate${colors.reset} --adapter <id> Validate adapter capability requirements; exits 1 on critical gaps
1504
1626
  ${colors.bold}help${colors.reset} [command] Show help (optionally for specific command)
1505
1627
 
1506
1628
  ${colors.cyan}Examples:${colors.reset}
@@ -1517,7 +1639,7 @@ ${colors.gray}Run 'vp-tools help <command>' for detailed help on a specific comm
1517
1639
 
1518
1640
  // Helper function for progress bars
1519
1641
  function createProgressBar(percent, width = 10) {
1520
- const filled = Math.round(percent / (100 / width));
1642
+ const filled = Math.min(Math.round(percent / (100 / width)), width);
1521
1643
  const empty = width - filled;
1522
1644
  return `[${colors.green}${'█'.repeat(filled)}${colors.gray}${'░'.repeat(empty)}${colors.reset}]`;
1523
1645
  }