viepilot 2.45.4 → 2.45.6
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 +22 -0
- package/bin/viepilot.cjs +35 -2
- package/lib/viepilot-install.cjs +7 -5
- package/package.json +1 -1
- package/skills/vp-brainstorm/SKILL.md +17 -4
- package/workflows/brainstorm.md +30 -9
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.45.6] - 2026-04-27
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **BUG-026**: `vp-brainstorm` internal session sub-commands (`/save`, `/research-ui`,
|
|
14
|
+
`/review-arch`, `/sync-ui`) conflicted with Claude Code's `/` command prefix —
|
|
15
|
+
typed as slash commands they were intercepted as unknown skill invocations.
|
|
16
|
+
Fix: removed all slash sub-command documentation; replaced with proactive AUQ
|
|
17
|
+
triggers that fire on intent detection (multi-language save signals: "save",
|
|
18
|
+
"done", "xong", "lưu"; UI walkthrough offered on research intent; arch review
|
|
19
|
+
offered on review intent). Consistent behavior across ALL adapters — no
|
|
20
|
+
adapter-specific typing rules (BUG-026)
|
|
21
|
+
|
|
22
|
+
## [2.45.5] - 2026-04-27
|
|
23
|
+
|
|
24
|
+
### Enhanced
|
|
25
|
+
- **ENH-078**: `npx viepilot install` now prompts users to select their preferred
|
|
26
|
+
communication language (the language ViePilot uses for banners and AI prompts)
|
|
27
|
+
via keyboard selector or numbered-list fallback; chosen language written to
|
|
28
|
+
`~/.viepilot/config.json → language.communication`; supports 10 languages
|
|
29
|
+
(en, vi, fr, ja, de, es, zh, ko, pt, id); `--yes` mode skips prompt and
|
|
30
|
+
defaults to `en` (ENH-078)
|
|
31
|
+
|
|
10
32
|
## [2.45.4] - 2026-04-27
|
|
11
33
|
|
|
12
34
|
### Fixed
|
package/bin/viepilot.cjs
CHANGED
|
@@ -17,6 +17,19 @@ const { buildInstallPlan, applyInstallPlan, resolveViepilotPackageRoot } = requi
|
|
|
17
17
|
const { adapters: adapterMap } = require(path.join(__dirname, '..', 'lib', 'adapters', 'index.cjs'));
|
|
18
18
|
|
|
19
19
|
// UI target list — keep cursor-agent and cursor-ide as distinct choices for users.
|
|
20
|
+
const LANGUAGES = [
|
|
21
|
+
{ id: 'en', label: 'English (en)' },
|
|
22
|
+
{ id: 'vi', label: 'Vietnamese — Tiếng Việt (vi)' },
|
|
23
|
+
{ id: 'fr', label: 'French — Français (fr)' },
|
|
24
|
+
{ id: 'ja', label: 'Japanese — 日本語 (ja)' },
|
|
25
|
+
{ id: 'de', label: 'German — Deutsch (de)' },
|
|
26
|
+
{ id: 'es', label: 'Spanish — Español (es)' },
|
|
27
|
+
{ id: 'zh', label: 'Chinese Simplified — 中文 (zh)' },
|
|
28
|
+
{ id: 'ko', label: 'Korean — 한국어 (ko)' },
|
|
29
|
+
{ id: 'pt', label: 'Portuguese — Português (pt)' },
|
|
30
|
+
{ id: 'id', label: 'Indonesian — Bahasa Indonesia (id)' },
|
|
31
|
+
];
|
|
32
|
+
|
|
20
33
|
const TARGETS = [
|
|
21
34
|
{ id: 'claude-code', label: adapterMap['claude-code'].name + ' (default)' },
|
|
22
35
|
{ id: 'cursor-agent', label: 'Cursor Agent' },
|
|
@@ -235,6 +248,19 @@ function ask(question) {
|
|
|
235
248
|
});
|
|
236
249
|
}
|
|
237
250
|
|
|
251
|
+
async function interactiveLanguageSelection() {
|
|
252
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
253
|
+
console.log('\nSelect communication language (ViePilot banners and prompts):');
|
|
254
|
+
LANGUAGES.forEach((l, idx) => console.log(` ${idx + 1}. ${l.label}`));
|
|
255
|
+
const answer = await ask('Language [1 = English]: ');
|
|
256
|
+
const idx = parseInt(answer, 10);
|
|
257
|
+
const lang = LANGUAGES[Number.isInteger(idx) && idx >= 1 && idx <= LANGUAGES.length ? idx - 1 : 0];
|
|
258
|
+
return lang.id;
|
|
259
|
+
}
|
|
260
|
+
const selected = await runKeyboardSelector(LANGUAGES, 'single', 'Select communication language');
|
|
261
|
+
return (selected && selected[0]) || 'en';
|
|
262
|
+
}
|
|
263
|
+
|
|
238
264
|
async function interactiveTargetSelection() {
|
|
239
265
|
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
240
266
|
console.log('\nSelect install targets (comma-separated numbers):');
|
|
@@ -261,7 +287,7 @@ async function interactiveTargetSelection() {
|
|
|
261
287
|
* @param {boolean} dryRun
|
|
262
288
|
* @returns {{ ok: boolean, code: number }}
|
|
263
289
|
*/
|
|
264
|
-
function runInstallViaNode(selectedTargets, dryRun) {
|
|
290
|
+
function runInstallViaNode(selectedTargets, dryRun, communicationLang = 'en') {
|
|
265
291
|
const fallbackRoot = path.join(__dirname, '..');
|
|
266
292
|
const pkgRoot = resolveViepilotPackageRoot(fallbackRoot) || fallbackRoot;
|
|
267
293
|
const profile = selectedTargets[0] || 'claude-code';
|
|
@@ -269,6 +295,7 @@ function runInstallViaNode(selectedTargets, dryRun) {
|
|
|
269
295
|
...process.env,
|
|
270
296
|
VIEPILOT_AUTO_YES: '1',
|
|
271
297
|
VIEPILOT_INSTALL_PROFILE: profile,
|
|
298
|
+
VIEPILOT_COMM_LANG: communicationLang,
|
|
272
299
|
};
|
|
273
300
|
const wantPathShim = env.VIEPILOT_ADD_PATH === '1';
|
|
274
301
|
|
|
@@ -328,8 +355,14 @@ async function installCommand(rawArgs) {
|
|
|
328
355
|
}
|
|
329
356
|
}
|
|
330
357
|
|
|
358
|
+
let communicationLang = 'en';
|
|
359
|
+
if (!options.yes) {
|
|
360
|
+
communicationLang = await interactiveLanguageSelection();
|
|
361
|
+
}
|
|
362
|
+
|
|
331
363
|
console.log(`\nSelected targets: ${selectedTargets.join(', ')}`);
|
|
332
|
-
|
|
364
|
+
console.log(`Communication language: ${communicationLang}`);
|
|
365
|
+
const run = runInstallViaNode(selectedTargets, options.dryRun, communicationLang);
|
|
333
366
|
const results = selectedTargets.map((target) => ({
|
|
334
367
|
ok: run.ok,
|
|
335
368
|
target,
|
package/lib/viepilot-install.cjs
CHANGED
|
@@ -29,6 +29,7 @@ function normalizeInstallEnv(envSource = process.env) {
|
|
|
29
29
|
profile: envSource.VIEPILOT_INSTALL_PROFILE || 'claude-code',
|
|
30
30
|
addPath: envSource.VIEPILOT_ADD_PATH === '1',
|
|
31
31
|
symlinkSkills: envSource.VIEPILOT_SYMLINK_SKILLS === '1',
|
|
32
|
+
communicationLang: envSource.VIEPILOT_COMM_LANG || 'en',
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -241,9 +242,10 @@ function buildInstallPlan(packageRoot, envSource = process.env, opts = {}) {
|
|
|
241
242
|
});
|
|
242
243
|
}
|
|
243
244
|
|
|
244
|
-
// ENH-032:
|
|
245
|
+
// ENH-032 / ENH-078: write selected communication language; lang chosen interactively in CLI
|
|
245
246
|
steps.push({
|
|
246
247
|
kind: 'language_config_prompt',
|
|
248
|
+
communicationLang: env.communicationLang,
|
|
247
249
|
autoYes: env.autoYes,
|
|
248
250
|
home,
|
|
249
251
|
});
|
|
@@ -519,13 +521,13 @@ function applyInstallPlan(plan, options = {}) {
|
|
|
519
521
|
break;
|
|
520
522
|
}
|
|
521
523
|
case 'language_config_prompt': {
|
|
524
|
+
const commLang = step.communicationLang ?? 'en';
|
|
522
525
|
if (dryRun) {
|
|
523
|
-
logs.push(`[dry-run] language_config_prompt: would write ~/.viepilot/config.json with communication
|
|
526
|
+
logs.push(`[dry-run] language_config_prompt: would write ~/.viepilot/config.json with communication=${commLang}, document=en`);
|
|
524
527
|
break;
|
|
525
528
|
}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
logs.push(`language_config_prompt: wrote ${step.home}/.viepilot/config.json (communication=en, document=en)`);
|
|
529
|
+
writeConfig({ language: { communication: commLang, document: 'en' } }, step.home);
|
|
530
|
+
logs.push(`language_config_prompt: wrote ${step.home}/.viepilot/config.json (communication=${commLang}, document=en)`);
|
|
529
531
|
break;
|
|
530
532
|
}
|
|
531
533
|
default:
|
package/package.json
CHANGED
|
@@ -63,6 +63,19 @@ Prompt user conversationally with numbered list options.
|
|
|
63
63
|
|
|
64
64
|
## C. Tool Usage
|
|
65
65
|
Use Cursor tools: `Shell`, `ReadFile`, `Glob`, `rg`, `ApplyPatch`, `WebSearch`, `WebFetch`, `Subagent`
|
|
66
|
+
|
|
67
|
+
## D. Session Actions — Proactive AUQ Triggers (BUG-026)
|
|
68
|
+
**No slash sub-commands.** All session actions are triggered proactively by the AI via
|
|
69
|
+
`AskUserQuestion` at the right moment — no user typing required.
|
|
70
|
+
|
|
71
|
+
| Action | Trigger condition | AUQ prompt |
|
|
72
|
+
|--------|-------------------|------------|
|
|
73
|
+
| **Save + crystallize handoff** | User signals done: "save", "done", "xong", "lưu", "finished", "ready", "crystallize", or equivalent intent | "Save session and prepare for /vp-crystallize?" |
|
|
74
|
+
| **UX walkthrough** | In UI session AND user mentions "research", "test", "UX", "walkthrough" — OR ≥1 UI signals accumulated | "Run UX walkthrough (3-phase simulate + research + update HTML)?" |
|
|
75
|
+
| **Architecture review** | User asks "review decisions", "check arch", "summarize choices", or equivalent intent | "Generate architecture review summary table?" |
|
|
76
|
+
| **Sync UI → Arch** | After arch update when UI workspace also active | "Sync architecture changes to UI Direction workspace?" |
|
|
77
|
+
|
|
78
|
+
**Why:** In Claude Code terminal, any `/command` is intercepted by the shell as a skill invocation. Using proactive AUQ triggers works identically on ALL adapters — no adapter-specific typing rules needed.
|
|
66
79
|
</cursor_skill_adapter>
|
|
67
80
|
<scope_policy>
|
|
68
81
|
## ViePilot Namespace Guard (BUG-004)
|
|
@@ -90,15 +103,15 @@ Supports:
|
|
|
90
103
|
- UI Direction mode: create/update HTML prototype + notes under `.viepilot/ui-direction/{session-id}/` — supports **multi-page** (`pages/{slug}.html` + hub `index.html`) and the **`## Pages inventory`** hook in `notes.md` when `pages/` exists (FEAT-007)
|
|
91
104
|
- **Phase assignment (ENH-030):** in every session, features/capabilities are assigned directly to Phase 1, Phase 2, Phase 3... — no MVP/Post-MVP/Future tiers. Session file stores assignments in the `## Phases` section.
|
|
92
105
|
- **Project meta intake (FEAT-009):** after **scope locked**, **before** `Completed` / `/end`, if `.viepilot/META.md` (`viepilot_profile_id`) is missing — run **sequential** Q&A with proposals; read/write `~/.viepilot/profile-map.md`; create `~/.viepilot/profiles/<slug>.md` + binding per **`docs/dev/global-profiles.md`**. If a profile is already bound — skip intake by default (ask if change needed).
|
|
93
|
-
- **UX walkthrough (FEAT-010 + ENH-019 + ENH-020):** in **`--ui`** mode,
|
|
94
|
-
- **Background UI extraction (ENH-026 + ENH-060):** automatically detects UI signal keywords in every brainstorm session (no `--ui` flag required). **Auto-suggests itself (ENH-060):** if the initial message contains ≥1 UI keyword, shows a proactive 🎨 banner immediately — mirrors Architect Design Mode's 🏗️ proactive activation. Accumulation starts at ≥1 signal (was ≥3); surfaces for confirmation when topic ends,
|
|
95
|
-
- **Idea → Architecture breakdown loop (ENH-061):** structured 8-step flow from free idea collection → scope lock → **Feature → Coverage mapping** (maps each Phase 1 feature to an architect page + UI screen, outputs `## Coverage` matrix in `notes.md`) → Architect Design → **`arch_to_ui_sync`** reverse sync (surfaces UI implications of architectural decisions;
|
|
106
|
+
- **UX walkthrough (FEAT-010 + ENH-019 + ENH-020):** in **`--ui`** mode, proactively offered via AUQ when user mentions "research", "test UX", "walkthrough" — or when ≥1 UI signals accumulated. Runs 3 phases: simulates **end-user** (with **content stress pass** + **stress recipes by archetype** → **Stress findings**) → **UX designer + web research** → update `index.html` / `pages/*.html` / `style.css` and write **`## UX walkthrough log`** in `notes.md` (sync hub + **Pages inventory** for multi-page).
|
|
107
|
+
- **Background UI extraction (ENH-026 + ENH-060):** automatically detects UI signal keywords in every brainstorm session (no `--ui` flag required). **Auto-suggests itself (ENH-060):** if the initial message contains ≥1 UI keyword, shows a proactive 🎨 banner immediately — mirrors Architect Design Mode's 🏗️ proactive activation. Accumulation starts at ≥1 signal (was ≥3); surfaces for confirmation when topic ends, user signals done, or **≥2 unique signals** accumulated (was ≥5) — does not interrupt the main conversation.
|
|
108
|
+
- **Idea → Architecture breakdown loop (ENH-061):** structured 8-step flow from free idea collection → scope lock → **Feature → Coverage mapping** (maps each Phase 1 feature to an architect page + UI screen, outputs `## Coverage` matrix in `notes.md`) → Architect Design → **`arch_to_ui_sync`** reverse sync (surfaces UI implications of architectural decisions; proactively offered via AUQ after arch updates) → UI Direction → **completeness gate** (CHECK 4: warns if any Phase 1 feature has no coverage in either mode, non-blocking). See `Recommended Breakdown Ordering` section in `workflows/brainstorm.md`.
|
|
96
109
|
- **Unified workspace mode selection (BUG-018):** after scope lock, before any design workspace is created, an AUQ prompt offers: Both / Architect only / UI Direction only / Neither. Architect auto-activate heuristic is deferred until after this selection; suppressed if user selects "Neither" or "UI Direction only".
|
|
97
110
|
- **Admin & Governance coverage (ENH-063):** Topic 6 in brainstorm template; proactive 🔐 heuristic fires on admin/governance keywords; admin coverage gate before /save for multi-user/SaaS/compliance projects; `admin.html` added to Architect workspace when applicable; `notes.md ## admin` YAML exported via crystallize.
|
|
98
111
|
- **Content Management coverage (ENH-065):** Topic 7 in brainstorm template; proactive 🗂️ heuristic fires on content-type/media/SEO keywords; content coverage gate before /save for projects with content layer; `content.html` added to Architect workspace; `notes.md ## content` YAML exported via crystallize.
|
|
99
112
|
- **Admin Entity Management coverage (ENH-068):** Topic 7 in brainstorm template; proactive 🗄️ heuristic fires on CRUD/entity/admin panel keywords; entity management coverage gate before /save for projects with DB entities (cross-references ERD); `entity-mgmt.html` added to Architect workspace; `notes.md ## entity_mgmt` YAML exported via crystallize.
|
|
100
113
|
- **User Data Management coverage (ENH-066):** Topic 9 in brainstorm template; proactive 👤 heuristic fires on user-account/privacy/auth keywords; user data coverage gate before /save for B2C/SaaS/GDPR projects; `user-data.html` added to Architect workspace; `notes.md ## user_data` YAML exported via crystallize.
|
|
101
|
-
- **Architect Design Mode (FEAT-011):** `/vp-brainstorm --architect` or auto-activate when ≥3 components/services detected; generate HTML workspace (architecture, data-flow, decisions, tech-stack, tech-notes, feature-map) with Mermaid diagrams; incremental update per decision;
|
|
114
|
+
- **Architect Design Mode (FEAT-011):** `/vp-brainstorm --architect` or auto-activate when ≥3 components/services detected; generate HTML workspace (architecture, data-flow, decisions, tech-stack, tech-notes, feature-map) with Mermaid diagrams; incremental update per decision; architecture review offered via AUQ when user asks to review decisions; machine-readable `notes.md` YAML schema.
|
|
102
115
|
- **ERD page (ENH-027):** Architect workspace includes `erd.html` — Mermaid `erDiagram`, entity list table, relationship summary; triggered by DB/entity/table/relationship keywords; notes.md `## erd` YAML section exported to ARCHITECTURE.md `## Database Schema` via crystallize Step 1D.
|
|
103
116
|
- **User Use Cases page (ENH-028):** Architect workspace includes `user-use-cases.html` — actor/use-case diagram (Mermaid flowchart), use case table; triggered by user/role/actor/story keywords; notes.md `## use_cases` YAML section exported to PROJECT-CONTEXT.md `## User Stories & Use Cases` via crystallize Step 1D.
|
|
104
117
|
- **C4Context/Sequence/Deployment/APIs pages (ENH-029, 12-page workspace):** Architect workspace expanded to 12 pages — `sequence-diagram.html` (per-scenario sequenceDiagram), `deployment.html` (infra graph + environments + CI/CD pipeline), `apis.html` (endpoint tables with HTTP method badges); page boundary rules table; trigger keywords for sequence/deploy/API; notes.md `## apis` YAML section; deployment+APIs exported to ARCHITECTURE.md via crystallize Step 1D (sequence excluded — scenario docs are not architecture artifacts).
|
package/workflows/brainstorm.md
CHANGED
|
@@ -1178,7 +1178,7 @@ When the user mentions: `user story`, `use case`, `actor`, `persona`, `as a user
|
|
|
1178
1178
|
|
|
1179
1179
|
1. After each **major decision** (tech stack, service boundary, data model) → update the related HTML section + update `notes.md`.
|
|
1180
1180
|
2. When the user **changes a decision** → **incremental update**: only edit the related section; keep all other sections unchanged. Add `data-updated="true"` attribute + class `.updated` CSS highlight (yellow left border + "updated" badge) to the changed element.
|
|
1181
|
-
3.
|
|
1181
|
+
3. **Architecture review trigger** — when user asks to review decisions ("review", "check architecture", "summarize choices", "what did we decide", or equivalent intent): ViePilot proactively outputs a summary table of all `decisions` (from `notes.md`) + list of `open_questions` with status, then asks the user to confirm before continuing. **Claude Code (terminal) — REQUIRED:** use `AskUserQuestion` to offer the review; text fallback on other adapters.
|
|
1182
1182
|
|
|
1183
1183
|
#### Incremental update rule
|
|
1184
1184
|
|
|
@@ -1457,8 +1457,8 @@ This mirrors **Architect Design Mode** which proactively banners when system arc
|
|
|
1457
1457
|
|
|
1458
1458
|
#### Surface triggers (when to ask the user)
|
|
1459
1459
|
Display a confirmation dialogue when any of the following conditions occur:
|
|
1460
|
-
- (a) **Topic ends** — user
|
|
1461
|
-
- (b) **User
|
|
1460
|
+
- (a) **Topic ends** — user says "next", "next topic", or switches subject
|
|
1461
|
+
- (b) **User signals session end** — says "save", "done", "xong", "finished", "ready", "crystallize", "ready for crystallize", or equivalent intent in any language
|
|
1462
1462
|
- (c) **≥2 unique signals accumulated** in the buffer
|
|
1463
1463
|
|
|
1464
1464
|
#### Confirmation dialogue template
|
|
@@ -1490,12 +1490,16 @@ mkdir -p .viepilot/ui-direction/{session-id}
|
|
|
1490
1490
|
|
|
1491
1491
|
### UI Direction — UX walkthrough & upgrade (FEAT-010)
|
|
1492
1492
|
|
|
1493
|
-
When inside **`/vp-brainstorm --ui`** or a `.viepilot/ui-direction/{session-id}/` already exists for the current session, the
|
|
1493
|
+
When inside **`/vp-brainstorm --ui`** or a `.viepilot/ui-direction/{session-id}/` already exists for the current session, the UX walkthrough pipeline is **proactively triggered via AUQ** (BUG-026) when:
|
|
1494
|
+
- User mentions "research", "test", "UX review", "walkthrough", "simulate user", or equivalent intent
|
|
1495
|
+
- OR: ≥1 UI signal accumulated AND user signals topic end
|
|
1494
1496
|
|
|
1495
|
-
|
|
1496
|
-
-
|
|
1497
|
+
**Claude Code (terminal) — REQUIRED:** Call `AskUserQuestion`:
|
|
1498
|
+
- question: "Run UX walkthrough? (3-phase: simulate user → UX research → update HTML)"
|
|
1499
|
+
- header: "UX Walkthrough"
|
|
1500
|
+
- options: [{ label: "Yes — run full walkthrough (Recommended)", description: "Simulate end-user + content stress + research + update prototype" }, { label: "Skip for now", description: "Continue brainstorm; offer again at session end" }]
|
|
1497
1501
|
|
|
1498
|
-
The user can include one line of context (e.g., product name
|
|
1502
|
+
The user can include one line of context (e.g., product name, persona, priority flow) — in the same message or as a follow-up after selecting "Yes".
|
|
1499
1503
|
|
|
1500
1504
|
Apply **the phases sequentially** (assistant does not skip a phase unless the user explicitly says “phase 1 only”):
|
|
1501
1505
|
|
|
@@ -1623,6 +1627,23 @@ After intake is **completed** or a **valid skip** (META already has profile) →
|
|
|
1623
1627
|
<step name="save_session">
|
|
1624
1628
|
## 6. Save Session
|
|
1625
1629
|
|
|
1630
|
+
### Save Trigger (BUG-026)
|
|
1631
|
+
|
|
1632
|
+
The save step fires when the AI detects session-end intent — **no slash command required**.
|
|
1633
|
+
|
|
1634
|
+
**Save intent signals** (any language):
|
|
1635
|
+
- "save", "done", "finished", "ready", "crystallize", "ready for crystallize", "let's save", "that's it", "wrap up"
|
|
1636
|
+
- Equivalent phrases in the session language (e.g. "xong", "luu", or any clear session-end signal)
|
|
1637
|
+
- Or: conversation reaches natural end (all topics covered, no new questions)
|
|
1638
|
+
|
|
1639
|
+
**Claude Code (terminal) — REQUIRED:** Call `AskUserQuestion`:
|
|
1640
|
+
- question: "Save session and prepare for /vp-crystallize?"
|
|
1641
|
+
- header: "Save Session"
|
|
1642
|
+
- options: [{ label: "Save + prepare for crystallize (Recommended)", description: "Write session file, then offer /vp-crystallize handoff" }, { label: "Continue brainstorming", description: "Not done yet — keep going" }]
|
|
1643
|
+
|
|
1644
|
+
On "Save + prepare": proceed to Pre-Save validation below, then write file, then offer crystallize handoff.
|
|
1645
|
+
On "Continue brainstorming": resume conversation.
|
|
1646
|
+
|
|
1626
1647
|
### Pre-Save Phase Assignment Validation (ENH-052)
|
|
1627
1648
|
|
|
1628
1649
|
Before writing the session file, validate phase assignment completeness:
|
|
@@ -1648,7 +1669,7 @@ CHECK 4 (ENH-061): If both Architect workspace AND UI Direction workspace are ac
|
|
|
1648
1669
|
1. Assign all features to phases (## Phases section)
|
|
1649
1670
|
2. Ensure Phase 1 has at least one feature
|
|
1650
1671
|
|
|
1651
|
-
Return to the conversation to assign phases, then
|
|
1672
|
+
Return to the conversation to assign phases, then signal done when ready (e.g. "save" or "xong").
|
|
1652
1673
|
```
|
|
1653
1674
|
- If scope is **not** locked (exploratory session — no feature assignments):
|
|
1654
1675
|
→ **Allow save** with `Status: In Progress` and add advisory note to session file:
|
|
@@ -1660,7 +1681,7 @@ CHECK 4 (ENH-061): If both Architect workspace AND UI Direction workspace are ac
|
|
|
1660
1681
|
```
|
|
1661
1682
|
⚠️ Coverage gap detected — these Phase 1 features have no Architect or UI coverage:
|
|
1662
1683
|
- {feature name}
|
|
1663
|
-
Consider
|
|
1684
|
+
Consider asking to sync UI or adding these features to a workspace before /vp-crystallize.
|
|
1664
1685
|
Proceed with save? (yes / skip coverage for now)
|
|
1665
1686
|
```
|
|
1666
1687
|
- If brownfield stub session (`IS_BROWNFIELD=true`): **skip this gate** — brownfield stubs intentionally have no phases.
|