vgxness 1.9.8 → 1.10.1
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/README.md +5 -4
- package/dist/cli/cli-flags.js +15 -2
- package/dist/cli/cli-help.js +13 -13
- package/dist/cli/commands/mcp-dispatcher.js +8 -4
- package/dist/cli/commands/setup-dispatcher.js +4 -4
- package/dist/cli/doctor-renderer.js +1 -1
- package/dist/cli/setup-plan-renderer.js +2 -2
- package/dist/cli/setup-status-renderer.js +2 -2
- package/dist/cli/tui/main-menu/main-menu-read-model.js +28 -28
- package/dist/cli/tui/main-menu/main-menu-render-shape.js +5 -1
- package/dist/cli/tui/opentui/main-menu/view.js +1 -1
- package/dist/cli/tui/setup/setup-tui-read-model.js +23 -23
- package/dist/cli/tui/setup/setup-tui-render-shape.js +15 -12
- package/dist/cli/tui/setup/setup-tui-state.js +1 -3
- package/dist/cli/tui/setup/setup-tui-view-helpers.js +18 -2
- package/dist/mcp/claude-code-config.js +2 -0
- package/dist/mcp/claude-code-scope.js +1 -0
- package/dist/mcp/claude-code-user-config.js +2 -0
- package/dist/mcp/client-install-claude-code-contract.js +15 -72
- package/dist/mcp/client-install-claude-code.js +4 -6
- package/dist/mcp/client-install-opencode-contract.js +5 -79
- package/dist/mcp/opencode-visibility.js +4 -3
- package/dist/mcp/provider-change-plan.js +17 -14
- package/dist/mcp/provider-doctor.js +38 -20
- package/dist/mcp/provider-health-types.js +19 -0
- package/dist/mcp/provider-status.js +29 -18
- package/dist/mcp/schema.js +5 -4
- package/dist/mcp/validation.js +11 -1
- package/dist/setup/backup-rollback-service.js +33 -2
- package/dist/setup/providers/claude-setup-adapter.js +13 -15
- package/dist/setup/providers/opencode-setup-adapter.js +12 -12
- package/dist/setup/setup-defaults.js +1 -0
- package/dist/setup/setup-plan.js +6 -6
- package/docs/architecture.md +3 -3
- package/docs/cli.md +29 -33
- package/docs/glossary.md +2 -2
- package/docs/mcp.md +1 -1
- package/docs/prd.md +3 -3
- package/docs/providers.md +14 -15
- package/docs/roadmap.md +1 -1
- package/docs/safety.md +1 -1
- package/docs/storage.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ VGXNESS is an installable CLI, MCP control plane, and native code runtime for gu
|
|
|
6
6
|
|
|
7
7
|
This package is proprietary software. The npm package ships inspectable JavaScript (`dist/`) so Node can run it, but it is **not open-source licensed** and may not be redistributed unless you have written permission. See [LICENSE](./LICENSE).
|
|
8
8
|
|
|
9
|
-
OpenCode is the primary supported provider.
|
|
9
|
+
OpenCode is the primary supported provider. Claude setup support is secondary. VGX-managed OpenCode and Claude provider configuration is user-global only; provider config writes require explicit CLI confirmation.
|
|
10
10
|
|
|
11
11
|
VGXNESS v1.9.1 has a canonical project health audit with validated evidence: 38 MCP tools, 106 test files, and the official Bun validation path passing, including package evidence with `releaseReadiness: pass`. Current unreleased builds expose 41 MCP tools after adding read-only SDD/run recovery parity. See [Project health audit v1.9.1](./docs/project-health-audit-v1.9.1.md) for the versioned matrix and safety taxonomy.
|
|
12
12
|
|
|
@@ -150,7 +150,7 @@ vgxness sdd continue --project <project> --change <change>
|
|
|
150
150
|
vgxness code sdd <change> <phase> --project <project> --save-artifact
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
Stable defaults are: package `vgxness`, provider `opencode`, global user data DB, user
|
|
153
|
+
Stable defaults are: package `vgxness`, provider `opencode`, global user data DB, user-global OpenCode config (`$HOME/.config/opencode/opencode.json`), and `mcp-plus-agents` mode. VGX-managed OpenCode and Claude provider configuration is user-global only; runtime VGXNESS state remains project-aware through `--project`, `--change`, workspace, and database context. Existing project-local provider files such as `.opencode/`, `opencode.json`, `.mcp.json`, `.claude/`, and `CLAUDE.md` remain untouched by VGXNESS setup. They may still affect OpenCode or Claude behavior externally, but VGXNESS treats them as external/manual diagnostics and will not repair, write, back up, or delete them. The generated MCP command for the global DB default is:
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
156
|
vgxness mcp start
|
|
@@ -182,7 +182,8 @@ Edits, shell, network, git mutations, SDD persistence, and memory saves route th
|
|
|
182
182
|
## Safety model
|
|
183
183
|
|
|
184
184
|
- Preview, status, and plan commands do not write provider config; local VGXNESS store initialization may occur where the command needs SQLite-backed state.
|
|
185
|
-
-
|
|
185
|
+
- VGX-managed OpenCode and Claude provider config writes are user-global only and require explicit `--yes` confirmation.
|
|
186
|
+
- Runtime VGXNESS state remains project-aware; project-local provider files are read-only external/manual diagnostics and may still affect provider behavior outside VGXNESS.
|
|
186
187
|
- Setup/status TUI surfaces are read-only setup, diagnostics, recovery, and fallback surfaces; daily SDD progression stays in OpenCode with VGXNESS MCP.
|
|
187
188
|
- SDD artifacts are SQLite-backed through VGXNESS services. Do not create or write `openspec/`.
|
|
188
189
|
- `vgxness sdd accept-artifact` records explicit human-only acceptance; saving a draft never implies acceptance.
|
|
@@ -260,7 +261,7 @@ Do not publish from CI. Publication or registry dry-run checks require separate
|
|
|
260
261
|
npm uninstall -g vgxness
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
Remove any OpenCode config entries and local/global VGXNESS data manually if you no longer need them.
|
|
264
|
+
Remove any user-global OpenCode/Claude config entries and local/global VGXNESS data manually if you no longer need them. Project-local provider files are external/manual and are not created, repaired, or deleted by VGXNESS setup.
|
|
264
265
|
|
|
265
266
|
## More docs
|
|
266
267
|
|
package/dist/cli/cli-flags.js
CHANGED
|
@@ -112,9 +112,22 @@ function optionalScopeFlag(flags, name) {
|
|
|
112
112
|
return { ok: true, value: undefined };
|
|
113
113
|
return value === 'project' || value === 'personal' ? { ok: true, value } : validationFailure(`--${name} must be project or personal`);
|
|
114
114
|
}
|
|
115
|
+
const providerUserGlobalOnlyMigrationMessage = 'VGX-managed provider configuration is user-global only for OpenCode and Claude. Project/local provider files are treated as external/manual diagnostics and will not be written by VGXNESS. Re-run without the project/local install scope.';
|
|
115
116
|
function opencodeInstallScopeFlag(flags, name) {
|
|
116
117
|
const value = optionalStringFlag(flags, name) ?? vgxnessSetupDefaults.defaultOpenCodeScope;
|
|
117
|
-
|
|
118
|
+
if (value === 'user' || value === 'global' || value === 'personal')
|
|
119
|
+
return { ok: true, value: 'user' };
|
|
120
|
+
if (value === 'project' || value === 'local')
|
|
121
|
+
return validationFailure(providerUserGlobalOnlyMigrationMessage);
|
|
122
|
+
return validationFailure(`--${name} must be user, global, or personal`);
|
|
123
|
+
}
|
|
124
|
+
function opencodeDiagnosticScopeFlag(flags, name) {
|
|
125
|
+
const value = optionalStringFlag(flags, name) ?? vgxnessSetupDefaults.defaultOpenCodeScope;
|
|
126
|
+
if (value === 'user' || value === 'global' || value === 'personal')
|
|
127
|
+
return { ok: true, value: 'user' };
|
|
128
|
+
if (value === 'project')
|
|
129
|
+
return { ok: true, value };
|
|
130
|
+
return validationFailure(`--${name} must be user, global, personal, or project`);
|
|
118
131
|
}
|
|
119
132
|
function optionalModeFlag(flags, name) {
|
|
120
133
|
const value = optionalStringFlag(flags, name);
|
|
@@ -325,4 +338,4 @@ function setupInstallModeFlag(flags) {
|
|
|
325
338
|
return { ok: true, value: 'mcp-only' };
|
|
326
339
|
return { ok: true, value: vgxnessSetupDefaults.defaultInstallMode };
|
|
327
340
|
}
|
|
328
|
-
export { acceptedAtFlag, codeApprovalPolicyFlag, codeMemoryPolicyFlag, codeTranscriptModeFlag, codeVerificationModeFlag, csvFlag, databasePathFor, databasePathSelectionFor, finalRunStatusFlag, instructionKindFlag, isRunStatus, isSkillEvaluationResultStatus, isSkillTargetType, jsonFlag, opencodeInstallScopeFlag, optionalJsonFlag, optionalModeFlag, optionalNumberFlag, optionalRunStatusFlag, optionalScopeFlag, optionalSkillEvaluationResultStatusFlag, optionalSkillImprovementProposalStatusFlag, optionalSkillResolutionUsageFlag, optionalSkillTargetTypeFlag, optionalSkillVersionStatusFlag, optionalStringFlag, optionalTrimmedFlag, parseArgs, permissionCategoryFlag, requiredFlag, requiredTrimmedFlag, retryPolicyFlag, runOutcomeFlag, scopeFlag, setupDatabaseFlags, setupInstallModeFlag, setupProviderFlag, skillEvaluationResultStatusFlag, skillSourceFromFlags, skillSourceKindFlag, skillTargetTypeFlag, skillUsageOutcomeFlag, };
|
|
341
|
+
export { acceptedAtFlag, codeApprovalPolicyFlag, codeMemoryPolicyFlag, codeTranscriptModeFlag, codeVerificationModeFlag, csvFlag, databasePathFor, databasePathSelectionFor, finalRunStatusFlag, instructionKindFlag, isRunStatus, isSkillEvaluationResultStatus, isSkillTargetType, jsonFlag, providerUserGlobalOnlyMigrationMessage, opencodeDiagnosticScopeFlag, opencodeInstallScopeFlag, optionalJsonFlag, optionalModeFlag, optionalNumberFlag, optionalRunStatusFlag, optionalScopeFlag, optionalSkillEvaluationResultStatusFlag, optionalSkillImprovementProposalStatusFlag, optionalSkillResolutionUsageFlag, optionalSkillTargetTypeFlag, optionalSkillVersionStatusFlag, optionalStringFlag, optionalTrimmedFlag, parseArgs, permissionCategoryFlag, requiredFlag, requiredTrimmedFlag, retryPolicyFlag, runOutcomeFlag, scopeFlag, setupDatabaseFlags, setupInstallModeFlag, setupProviderFlag, skillEvaluationResultStatusFlag, skillSourceFromFlags, skillSourceKindFlag, skillTargetTypeFlag, skillUsageOutcomeFlag, };
|
package/dist/cli/cli-help.js
CHANGED
|
@@ -9,9 +9,9 @@ Areas:
|
|
|
9
9
|
status [--project <name>] [--change <id>] [--db <path>] [--json]
|
|
10
10
|
next [--project <name>] [--change <id>] [--db <path>] [--json]
|
|
11
11
|
resume [--project <name>] [--run-id <id>] [--db <path>] [--json]
|
|
12
|
-
init [--project <name>] [--provider opencode|claude|none] [--scope user|
|
|
13
|
-
setup plan [--project <name>] [--provider opencode|claude|none] [--scope user|
|
|
14
|
-
setup apply --yes [--project <name>] [--provider opencode|claude|none] [--scope user|
|
|
12
|
+
init [--project <name>] [--provider opencode|claude|none] [--scope user|global|personal] [--db global|project-local|custom|<path>] [--db-path <path>] [--mode mcp-only|mcp-plus-agents] [--json]
|
|
13
|
+
setup plan [--project <name>] [--provider opencode|claude|none] [--scope user|global|personal] [--db global|project-local|custom|<path>] [--db-path <path>] [--mode mcp-only|mcp-plus-agents] [--json]
|
|
14
|
+
setup apply --yes [--project <name>] [--provider opencode|claude|none] [--scope user|global|personal] [--db global|project-local|custom|<path>] [--db-path <path>] [--mode mcp-only|mcp-plus-agents]
|
|
15
15
|
setup backup list --provider opencode [--scope project|user|global] [--target <path>] [--json]
|
|
16
16
|
setup rollback --backup <path> [--preview|--yes] [--json]
|
|
17
17
|
setup status [--project <name>] [--scope project|personal] [--db <path>] [--json]
|
|
@@ -23,7 +23,7 @@ Areas:
|
|
|
23
23
|
Next answers "what should I do now?" with a shorter next-action view.
|
|
24
24
|
Resume answers "how do I continue interrupted work?" with run inspection guidance.
|
|
25
25
|
Without --change or --run-id they stay orientation-only and do not open local memory; with --change or --run-id they read SQLite read-only. Pass --json for automation.
|
|
26
|
-
Setup plan/init default to human-readable read-only output; pass --json for automation.
|
|
26
|
+
Setup plan/init default to human-readable read-only output; pass --json for automation. VGX-managed provider configuration is user-global only for OpenCode and Claude; setup apply writes provider config only with --yes and uses the global user DB plus mcp-plus-agents by default.
|
|
27
27
|
Setup status defaults to human-readable read-only output; pass --json for automation. It never writes provider config or executes providers.
|
|
28
28
|
Doctor defaults to human-readable output; pass --json for automation.
|
|
29
29
|
Verification plans are read-only recommendations only; they never execute commands, write provider config, persist results, mutate SDD artifacts, or infer acceptance.
|
|
@@ -64,19 +64,19 @@ Areas:
|
|
|
64
64
|
Approval commands resolve explicit run/preflight approval records; they do not change agent seed permissions or globally allow shell/provider access.
|
|
65
65
|
|
|
66
66
|
mcp setup --preview --provider opencode|claude [--db <path>]
|
|
67
|
-
mcp install opencode --plan [--scope user|
|
|
68
|
-
mcp install opencode --yes [--scope user|
|
|
69
|
-
mcp install claude --plan [--scope
|
|
70
|
-
mcp install claude --yes --run-id <id> [--scope
|
|
67
|
+
mcp install opencode --plan [--scope user|global|personal] [--db <path>] [--mcp-only|--no-agents] [--overwrite-vgxness|--reinstall]
|
|
68
|
+
mcp install opencode --yes [--scope user|global|personal] [--db <path>] [--mcp-only|--no-agents] [--overwrite-vgxness|--reinstall]
|
|
69
|
+
mcp install claude --plan [--scope user|global|personal] [--db <path>] [--overwrite-vgxness|--reinstall]
|
|
70
|
+
mcp install claude --yes --run-id <id> [--scope user|global|personal] [--db <path>] [--phase <phase>] [--agent-id <id>] [--overwrite-vgxness|--reinstall]
|
|
71
71
|
mcp doctor opencode [--scope user|project] [--project-root <path>]
|
|
72
72
|
mcp doctor [--db <path>] [--project <name>] [--change <id>] [--timeout-ms <ms>]
|
|
73
73
|
MCP setup preview is read-only; it does not install or write .opencode/, .claude/, or provider config.
|
|
74
74
|
Without --db, MCP install and setup commands use the vgxness global default database; pass --db .vgx/memory.sqlite for project-local compatibility.
|
|
75
|
-
OpenCode install defaults to user
|
|
75
|
+
OpenCode install defaults to user-global scope and installs mcp.vgxness plus top-level permission.bash=ask, vgxness-manager with bash=allow, and hidden vgxness-sdd-* agents with explicit permissions; use --mcp-only for legacy MCP-only config.
|
|
76
76
|
Use --overwrite-vgxness (alias --reinstall) to reinstall only VGXNESS-managed OpenCode entries while preserving unrelated config; --yes is still required to write.
|
|
77
|
-
It writes only after --yes.
|
|
78
|
-
Project
|
|
79
|
-
Claude support is first-class for guarded MCP setup. Claude
|
|
77
|
+
It writes only after --yes. VGX-managed provider configuration is user-global only for OpenCode and Claude; the OpenCode target is $HOME/.config/opencode/opencode.json.
|
|
78
|
+
Project/local provider files are external/manual diagnostics and will not be written by VGXNESS. Plans are read-only; applies refuse unsafe existing user-global config and create backups before merge.
|
|
79
|
+
Claude support is first-class for guarded MCP setup. Claude user/global/personal scopes all target user-global managed config. Confirmed Claude writes narrowly merge mcpServers.vgxness in ~/.claude.json, write ~/.claude/agents/*.md, and manage only the VGXNESS block in ~/.claude/CLAUDE.md. Confirmed Claude writes/CLI execution require VGXNESS run preflight metadata (--run-id, with optional --phase/--agent-id). Status/doctor/change-plan are read-only and do not execute Claude Code.
|
|
80
80
|
|
|
81
81
|
skills register --project <name> --name <name> --description <text>
|
|
82
82
|
skills list [--project <name>] [--scope project|personal]
|
|
@@ -105,7 +105,7 @@ Areas:
|
|
|
105
105
|
No args in an interactive TTY opens the OpenTUI main menu.
|
|
106
106
|
No args without a TTY prints static safe setup guidance and exits 0 without opening project state.
|
|
107
107
|
Setup TUI may launch without --project; Installation remains available and project-scoped checks are deferred while project screens render project-required recovery states.
|
|
108
|
-
Provider setup support: OpenCode first-class supported default guided install; Claude first-class supported guarded install
|
|
108
|
+
Provider setup support: OpenCode first-class supported default guided install; Claude first-class supported guarded user-global install; project/local provider files are diagnostics only; Antigravity placeholder; Custom/future extension point.
|
|
109
109
|
Provider config writes/install/apply are external-only and require explicit confirmation.
|
|
110
110
|
|
|
111
111
|
sdd status --project <name> --change <id> [--json]
|
|
@@ -9,7 +9,7 @@ import { resolveClaudeCodeScope } from '../../mcp/claude-code-scope.js';
|
|
|
9
9
|
import { computeEffectiveManagerInstructions } from '../../agents/manager-profile-overlay-service.js';
|
|
10
10
|
import { RunService } from '../../runs/run-service.js';
|
|
11
11
|
import { isTerminalRunStatus } from '../../runs/schema.js';
|
|
12
|
-
import { databasePathFor, databasePathSelectionFor, opencodeInstallScopeFlag, optionalNumberFlag, optionalStringFlag } from '../cli-flags.js';
|
|
12
|
+
import { databasePathFor, databasePathSelectionFor, opencodeDiagnosticScopeFlag, opencodeInstallScopeFlag, optionalNumberFlag, optionalStringFlag, providerUserGlobalOnlyMigrationMessage, } from '../cli-flags.js';
|
|
13
13
|
import { usageFailure, validationFailure } from '../cli-help.js';
|
|
14
14
|
import { jsonResult, openCliDatabase, resultFailure } from '../cli-helpers.js';
|
|
15
15
|
import { renderDoctorReport } from '../doctor-renderer.js';
|
|
@@ -129,8 +129,12 @@ export function runMcpInstallCommand(parsed, environment) {
|
|
|
129
129
|
}
|
|
130
130
|
function claudeInstallScopeFlag(flags) {
|
|
131
131
|
const value = optionalStringFlag(flags, 'scope');
|
|
132
|
-
const resolved = resolveClaudeCodeScope(value);
|
|
133
|
-
|
|
132
|
+
const resolved = resolveClaudeCodeScope(value, 'user');
|
|
133
|
+
if (!resolved.ok)
|
|
134
|
+
return validationFailure(resolved.error.message);
|
|
135
|
+
if (resolved.value.canonical === 'project' || resolved.value.canonical === 'local')
|
|
136
|
+
return validationFailure(providerUserGlobalOnlyMigrationMessage);
|
|
137
|
+
return { ok: true, value: resolved.value.canonical };
|
|
134
138
|
}
|
|
135
139
|
function createClaudeCodeInstallPreflight(parsed, database, environment) {
|
|
136
140
|
return (request) => {
|
|
@@ -211,7 +215,7 @@ export function runMcpDoctorCommand(parsed, environment, output = 'json') {
|
|
|
211
215
|
})();
|
|
212
216
|
}
|
|
213
217
|
export function runMcpDoctorOpenCodeCommand(parsed, environment) {
|
|
214
|
-
const scope =
|
|
218
|
+
const scope = opencodeDiagnosticScopeFlag(parsed.flags, 'scope');
|
|
215
219
|
if (!scope.ok)
|
|
216
220
|
return resultFailure(scope);
|
|
217
221
|
const projectRoot = optionalStringFlag(parsed.flags, 'project-root');
|
|
@@ -9,7 +9,7 @@ import { applyRollbackConfigBackup, listProviderConfigBackups, previewRollbackCo
|
|
|
9
9
|
import { vgxnessSetupDefaults } from '../../setup/setup-defaults.js';
|
|
10
10
|
import { SetupLifecycleService } from '../../setup/setup-lifecycle-service.js';
|
|
11
11
|
import { createSetupPlan } from '../../setup/setup-plan.js';
|
|
12
|
-
import { databasePathFor, databasePathSelectionFor, opencodeInstallScopeFlag, optionalStringFlag, scopeFlag, setupDatabaseFlags, setupInstallModeFlag, setupProviderFlag, } from '../cli-flags.js';
|
|
12
|
+
import { databasePathFor, databasePathSelectionFor, opencodeInstallScopeFlag, optionalStringFlag, providerUserGlobalOnlyMigrationMessage, scopeFlag, setupDatabaseFlags, setupInstallModeFlag, setupProviderFlag, } from '../cli-flags.js';
|
|
13
13
|
import { okText, usageFailure, validationFailure } from '../cli-help.js';
|
|
14
14
|
import { jsonResult, openCliDatabase, resultFailure } from '../cli-helpers.js';
|
|
15
15
|
import { renderSetupPlan } from '../setup-plan-renderer.js';
|
|
@@ -121,7 +121,7 @@ export function runSetupBackupCommand(parsed, environment) {
|
|
|
121
121
|
}
|
|
122
122
|
export async function runSetupApplyCommand(parsed, environment) {
|
|
123
123
|
if (parsed.flags.yes !== true)
|
|
124
|
-
return usageFailure('setup apply writes provider config and requires --yes');
|
|
124
|
+
return usageFailure('setup apply writes provider config and requires explicit confirmation with --yes. No provider config was written.');
|
|
125
125
|
const input = setupPlanInputFromFlags(parsed, environment);
|
|
126
126
|
if (!input.ok)
|
|
127
127
|
return resultFailure(input);
|
|
@@ -141,7 +141,7 @@ export async function applySetupPlanInput(input, environment) {
|
|
|
141
141
|
ok: true,
|
|
142
142
|
value: {
|
|
143
143
|
status: 'manual-required',
|
|
144
|
-
message:
|
|
144
|
+
message: `Claude setup apply is intentionally non-mutating here; use vgxness mcp install claude --yes --run-id <id> for guarded user-global Claude writes. ${providerUserGlobalOnlyMigrationMessage}`,
|
|
145
145
|
plan: plan.value,
|
|
146
146
|
},
|
|
147
147
|
};
|
|
@@ -365,7 +365,7 @@ export async function runInitCommandWithSetupTui(parsed, environment, setupTui)
|
|
|
365
365
|
}
|
|
366
366
|
export async function runSetupTuiCommand(environment, input) {
|
|
367
367
|
if (!canRunInteractiveTui(environment.stdin, environment.stdout))
|
|
368
|
-
return okText('Setup TUI requires an interactive TTY
|
|
368
|
+
return okText('Setup TUI requires an interactive TTY. [read-only] No provider config was written. Run `vgxness init --plan` or `vgxness setup plan` for read-only preview output; apply later with `vgxness setup apply --yes` only after review.\n');
|
|
369
369
|
const selectedDatabasePath = databasePathSelectionFor({}, environment);
|
|
370
370
|
if (!selectedDatabasePath.ok)
|
|
371
371
|
return resultFailure(selectedDatabasePath);
|
|
@@ -21,6 +21,6 @@ export function renderDoctorReport(input) {
|
|
|
21
21
|
if (check.status !== 'pass' && check.remediation !== undefined)
|
|
22
22
|
lines.push(` Fix: ${check.remediation}`);
|
|
23
23
|
}
|
|
24
|
-
lines.push('', 'Safety: read-only
|
|
24
|
+
lines.push('', 'Safety: [read-only] No provider config was written. This diagnostic does not install or repair provider config.', `Next: ${next}`);
|
|
25
25
|
return `${lines.join('\n')}\n`;
|
|
26
26
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export function renderSetupPlan(plan) {
|
|
2
2
|
return [
|
|
3
|
-
'Setup Plan',
|
|
3
|
+
'Setup Plan [read-only] [preview]',
|
|
4
4
|
`Project: ${plan.project}`,
|
|
5
5
|
`Workspace root: ${plan.workspaceRoot}`,
|
|
6
6
|
`Database: ${plan.db.mode} — ${plan.db.path} (source: ${plan.db.source})`,
|
|
@@ -10,7 +10,7 @@ export function renderSetupPlan(plan) {
|
|
|
10
10
|
...renderBackups(plan),
|
|
11
11
|
...renderConflicts(plan),
|
|
12
12
|
...renderNextCommands(plan),
|
|
13
|
-
'Safety: read-only
|
|
13
|
+
'Safety: [read-only] preview only. No provider config was written. Explicit confirmation is required before writing provider config; apply with --yes only after review.',
|
|
14
14
|
].join('\n');
|
|
15
15
|
}
|
|
16
16
|
function renderOpenCode(plan) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export function renderSetupStatus(status) {
|
|
2
2
|
return [
|
|
3
|
-
'Setup Status',
|
|
3
|
+
'Setup Status [read-only]',
|
|
4
4
|
`- Environment: ${status.environment.status} — ${status.environment.summary}`,
|
|
5
5
|
`- Project: ${status.projectState.status} — ${status.projectState.summary}`,
|
|
6
6
|
`- Store: ${status.store.status}${status.store.path === '' ? '' : ` — ${status.store.path}`}${status.store.blocker === undefined ? '' : ` (${status.store.blocker})`}`,
|
|
@@ -10,7 +10,7 @@ export function renderSetupStatus(status) {
|
|
|
10
10
|
`- Verification: ${status.verification.status} — ${status.verification.summary}`,
|
|
11
11
|
`- Next setup action: ${status.nextAction.command} — ${status.nextAction.reason}`,
|
|
12
12
|
`- Provider writes: ${status.safety.writesProviderConfig} · provider execution: ${status.safety.executesProvider}`,
|
|
13
|
-
'Safety: read-only status
|
|
13
|
+
'Safety: [read-only] status only. No provider config was written; providers were not executed. Mutating setup commands require explicit confirmation.',
|
|
14
14
|
].join('\n');
|
|
15
15
|
}
|
|
16
16
|
export function setupNeedsAction(status) {
|
|
@@ -8,7 +8,7 @@ const dashboardHero = {
|
|
|
8
8
|
badges: [tuiBadges.readOnly, tuiBadges.noProviderWrites],
|
|
9
9
|
};
|
|
10
10
|
const statCards = [
|
|
11
|
-
{ label: '
|
|
11
|
+
{ label: 'routes', value: '5', badge: '', description: 'setup diagnostics preview manual exit' },
|
|
12
12
|
{ label: 'provider', value: '1', badge: '', description: 'OpenCode' },
|
|
13
13
|
{ label: 'writes', value: '0', badge: '', description: 'dashboard render' },
|
|
14
14
|
{ label: 'SDD', value: 'OpenCode', badge: '', description: 'daily surface' },
|
|
@@ -19,39 +19,39 @@ const statusSnapshotLines = [
|
|
|
19
19
|
];
|
|
20
20
|
const optionCopy = {
|
|
21
21
|
setup: {
|
|
22
|
-
label: 'Setup OpenCode',
|
|
23
|
-
description: 'guided
|
|
24
|
-
badges: [
|
|
25
|
-
detailTitle: 'Setup OpenCode',
|
|
26
|
-
detailLines: ['
|
|
22
|
+
label: 'Setup / install OpenCode',
|
|
23
|
+
description: 'guided setup; writes only after final confirmation',
|
|
24
|
+
badges: ['[confirm required]'],
|
|
25
|
+
detailTitle: 'Setup / install OpenCode',
|
|
26
|
+
detailLines: ['Opens the guided setup flow. Provider config writes require final confirmation; review screens stay preview-only.'],
|
|
27
27
|
},
|
|
28
28
|
doctor: {
|
|
29
|
-
label: '
|
|
30
|
-
description: '
|
|
31
|
-
badges: [
|
|
32
|
-
detailTitle: '
|
|
33
|
-
detailLines: ['Shows status and recovery guidance only
|
|
29
|
+
label: 'Diagnostics / doctor',
|
|
30
|
+
description: 'status and recovery guidance only',
|
|
31
|
+
badges: ['[read-only]'],
|
|
32
|
+
detailTitle: 'Diagnostics / doctor',
|
|
33
|
+
detailLines: ['Shows status and recovery guidance only. This route does not install, repair, or call providers.'],
|
|
34
34
|
},
|
|
35
35
|
sdd: {
|
|
36
|
-
label: '
|
|
37
|
-
description: '
|
|
38
|
-
badges: [
|
|
39
|
-
detailTitle: '
|
|
40
|
-
detailLines: ['Use
|
|
36
|
+
label: 'Provider plan / preview',
|
|
37
|
+
description: 'read-only setup plan and SDD guidance',
|
|
38
|
+
badges: ['[preview]', '[read-only]'],
|
|
39
|
+
detailTitle: 'Provider plan / preview',
|
|
40
|
+
detailLines: ['Use preview/status commands to inspect provider setup. Daily SDD progression remains in OpenCode with VGXNESS MCP; this menu does not write provider config.'],
|
|
41
41
|
},
|
|
42
42
|
'advanced-cli': {
|
|
43
|
-
label: 'Advanced CLI',
|
|
44
|
-
description: 'fallback
|
|
45
|
-
badges: [
|
|
43
|
+
label: 'Advanced / manual CLI',
|
|
44
|
+
description: 'manual fallback commands and scripts',
|
|
45
|
+
badges: ['[manual]', '[read-only]'],
|
|
46
46
|
detailTitle: 'Advanced CLI',
|
|
47
47
|
detailLines: ['Prints explicit diagnostic, recovery, fallback, and scripting command references; no provider config is written.'],
|
|
48
48
|
},
|
|
49
49
|
exit: {
|
|
50
|
-
label: '
|
|
51
|
-
description: 'leave cleanly',
|
|
52
|
-
badges: [
|
|
53
|
-
detailTitle: '
|
|
54
|
-
detailLines: ['Close the dashboard; no provider config was written.'],
|
|
50
|
+
label: 'Exit / cancel',
|
|
51
|
+
description: 'leave cleanly without writes',
|
|
52
|
+
badges: ['[manual]', tuiBadges.noProviderWrites],
|
|
53
|
+
detailTitle: 'Exit / cancel',
|
|
54
|
+
detailLines: ['Close the dashboard or cancel navigation; no provider config was written.'],
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
export function buildMainMenuViewModel(state) {
|
|
@@ -62,14 +62,14 @@ export function buildMainMenuViewModel(state) {
|
|
|
62
62
|
subtitle: dashboardHero.subtitle,
|
|
63
63
|
hero: dashboardHero,
|
|
64
64
|
statCards,
|
|
65
|
-
contextLines: ['Pick a route. Dashboard render stays passive/read-only
|
|
65
|
+
contextLines: ['Pick a route: setup, diagnostics, provider preview, advanced/manual, or exit. Dashboard render stays passive/read-only.'],
|
|
66
66
|
options,
|
|
67
67
|
detail: { title: focused.detailTitle, lines: focused.detailLines, badges: focused.badges },
|
|
68
68
|
statusSnapshot: { title: 'Signal', lines: statusSnapshotLines, badges: [tuiBadges.readOnly] },
|
|
69
|
-
safetyLines: ['read-only •
|
|
69
|
+
safetyLines: ['[read-only] dashboard • [preview] plans • [confirm required] provider writes • [manual] advanced/exit'],
|
|
70
70
|
helpLines: state.helpVisible
|
|
71
|
-
? ['Keys: ↑/↓ or j/k move, Enter open, ?/h help, q/Esc
|
|
71
|
+
? ['Keys: ↑/↓ or j/k move, Enter open, b/back cancel, ?/h help, q/Esc exit.', 'Diagnostics and previews are read-only; setup writes still require final confirmation.']
|
|
72
72
|
: [],
|
|
73
|
-
footer: state.viewport.mode === 'narrow' ? '
|
|
73
|
+
footer: state.viewport.mode === 'narrow' ? 'enter open • q/Esc exit • [confirm required]' : 'j/k move • enter open • b back • q/Esc exit • no provider writes without confirmation',
|
|
74
74
|
};
|
|
75
75
|
}
|
|
@@ -34,6 +34,10 @@ function clampLine(line, width) {
|
|
|
34
34
|
'read-only',
|
|
35
35
|
'quit without writes',
|
|
36
36
|
'provider config writes',
|
|
37
|
+
'[confirm required]',
|
|
38
|
+
'[read-only]',
|
|
39
|
+
'[preview]',
|
|
40
|
+
'[manual]',
|
|
37
41
|
];
|
|
38
42
|
const phrase = protectedPhrases.find((candidate) => line.includes(candidate));
|
|
39
43
|
if (phrase !== undefined)
|
|
@@ -41,6 +45,6 @@ function clampLine(line, width) {
|
|
|
41
45
|
return `${line.slice(0, Math.max(0, width - 1)).trim()}…`;
|
|
42
46
|
}
|
|
43
47
|
function choiceLine(choice) {
|
|
44
|
-
const badges = formatBadges(choice.focused === true ? [tuiBadges.focused] : []);
|
|
48
|
+
const badges = formatBadges([...(choice.focused === true ? [tuiBadges.focused] : []), ...choice.badges]);
|
|
45
49
|
return `${choice.focused === true ? '›' : ' '} ${choice.label}${badges.length === 0 ? '' : ` ${badges}`} — ${choice.description}`;
|
|
46
50
|
}
|
|
@@ -3,6 +3,6 @@ export function formatMainMenuOptions(options) {
|
|
|
3
3
|
return options.map(formatMainMenuOption).join('\n');
|
|
4
4
|
}
|
|
5
5
|
function formatMainMenuOption(option) {
|
|
6
|
-
const badges = formatBadges(option.focused ? [tuiBadges.focused] : []);
|
|
6
|
+
const badges = formatBadges([...(option.focused ? [tuiBadges.focused] : []), ...option.badges]);
|
|
7
7
|
return `${option.focused ? '›' : ' '} ${option.label}${badges.length === 0 ? '' : ` ${badges}`} — ${option.description}`;
|
|
8
8
|
}
|
|
@@ -21,10 +21,10 @@ export function setupTuiViewModelFromPlan(plan, status, state) {
|
|
|
21
21
|
const warnings = plan?.conflicts.filter((conflict) => conflict.severity === 'warning').map((conflict) => conflict.message) ?? [];
|
|
22
22
|
const backups = plan?.backupsPlanned.map((backup) => `${backup.targetPath} (${backup.reason})`) ?? [];
|
|
23
23
|
const previewLabel = state?.previewRefresh === 'refreshing'
|
|
24
|
-
?
|
|
24
|
+
? `Preview: refreshing plan from current choices ${badgeLabels.preview} ${badgeLabels.readOnly} ${badgeLabels.noFilesWritten}`
|
|
25
25
|
: state?.previewRefresh === 'failed'
|
|
26
|
-
?
|
|
27
|
-
:
|
|
26
|
+
? `Preview: refresh failed ${badgeLabels.warning} ${badgeLabels.noFilesWritten}`
|
|
27
|
+
: `Preview: current choices are reflected in the read-only plan ${badgeLabels.preview} ${badgeLabels.readOnly} ${badgeLabels.noFilesWritten}`;
|
|
28
28
|
return {
|
|
29
29
|
title: 'VGXNESS Setup Assistant',
|
|
30
30
|
projectLabel: project,
|
|
@@ -35,20 +35,20 @@ export function setupTuiViewModelFromPlan(plan, status, state) {
|
|
|
35
35
|
databaseLabel: plan === undefined ? 'pending' : plan.db.mode,
|
|
36
36
|
databasePathLabel: compactPath(databasePath, 72),
|
|
37
37
|
databaseSourceLabel: String(databaseSource),
|
|
38
|
-
scopeLabel: isOpenCode ?
|
|
38
|
+
scopeLabel: isOpenCode ? 'user-global provider config' : isClaude ? 'User-global Claude config only; project-local files are diagnostics' : 'Manual / none (OpenCode controls disabled)',
|
|
39
39
|
installModeLabel: isOpenCode
|
|
40
40
|
? opencode?.installsAgents === false
|
|
41
41
|
? 'mcp-only'
|
|
42
42
|
: (selections?.installMode ?? 'mcp-plus-agents')
|
|
43
43
|
: isClaude
|
|
44
|
-
? 'Claude guarded apply outside guided OpenCode install'
|
|
44
|
+
? 'Claude guarded user-global apply outside guided OpenCode install'
|
|
45
45
|
: 'Manual / none (no OpenCode install)',
|
|
46
|
-
targetPathLabel: isOpenCode && opencode?.targetPath !== undefined ? compactPath(opencode.targetPath, 72) : isClaude ? 'Claude targets: .
|
|
47
|
-
opencodeActionLabel: isOpenCode ? opencodeActionLabel(opencode?.action) : isClaude ? 'No guided setup write; use guarded Claude install with run preflight.' : 'No automatic provider write; use manual setup guidance.',
|
|
46
|
+
targetPathLabel: isOpenCode && opencode?.targetPath !== undefined ? compactPath(opencode.targetPath, 72) : isClaude ? 'Claude targets: user-global ~/.claude.json, ~/.claude/agents/*.md, ~/.claude/CLAUDE.md via guarded apply' : 'No provider config target; manual/no-provider-write mode',
|
|
47
|
+
opencodeActionLabel: isOpenCode ? opencodeActionLabel(opencode?.action) : isClaude ? 'No guided setup write; use guarded user-global Claude install with run preflight.' : 'No automatic provider write; use manual setup guidance.',
|
|
48
48
|
memoryPathExplanation: memoryExplanation,
|
|
49
49
|
providerInstallabilityLabel: isOpenCode
|
|
50
|
-
? 'OpenCode is the default guided install provider. Claude is first-class supported via guarded mcp install claude --
|
|
51
|
-
: 'Manual / none is read-only guidance. Claude remains supported through explicit guarded apply outside this guided OpenCode flow.',
|
|
50
|
+
? 'OpenCode is the default guided install provider. VGXNESS will manage user-global provider configuration. Claude is first-class supported via guarded mcp install claude --yes --run-id <id>. Project-local provider files are external/manual diagnostics and will not be modified.'
|
|
51
|
+
: 'Manual / none is read-only guidance. Claude remains supported through explicit guarded user-global apply outside this guided OpenCode flow.',
|
|
52
52
|
agentReadinessLabel: agentReadiness.label,
|
|
53
53
|
agentReadinessDetail: agentReadiness.detail,
|
|
54
54
|
plannedActions: plan?.actions.map((action) => ({
|
|
@@ -63,29 +63,28 @@ export function setupTuiViewModelFromPlan(plan, status, state) {
|
|
|
63
63
|
nextCommands: plan?.nextCommands ?? ['vgxness setup plan'],
|
|
64
64
|
canAutoApply: plan?.provider === 'opencode' && plan.status === 'ready' && state?.selections.provider !== 'none' && plan.opencode !== undefined,
|
|
65
65
|
safetyWarning: isOpenCode && (selections?.overwriteVgxness === true || opencode?.overwriteVgxness === true)
|
|
66
|
-
?
|
|
67
|
-
:
|
|
66
|
+
? `${badgeLabels.confirmRequired} Final confirmation remains required. Explicit confirmation is required before writing provider config. Reinstall is enabled: user-global VGXNESS OpenCode entries will be overwritten after a managed backup when the target exists; unrelated config is preserved. Project-local provider files are external/manual diagnostics and will not be modified.`
|
|
67
|
+
: `${badgeLabels.confirmRequired} Final confirmation remains required. Explicit confirmation is required before writing provider config. VGXNESS will manage user-global provider configuration. Project-local provider files are external/manual diagnostics and will not be modified.`,
|
|
68
68
|
frameLabel: 'VGXNESS Setup Assistant workspace',
|
|
69
69
|
progressLabel: progressLabel(state?.screen),
|
|
70
70
|
previewLabel,
|
|
71
71
|
previewDetailLines: previewDetailLines({ plan, provider, databasePath, databaseSource, blockers, warnings, backups, isOpenCode }),
|
|
72
72
|
helpVisible: state?.helpVisible ?? false,
|
|
73
73
|
helpLines: helpLines(state?.screen),
|
|
74
|
-
footerSafetyLabel:
|
|
74
|
+
footerSafetyLabel: `Safety: plan review is ${badgeLabels.readOnly} ${badgeLabels.noFilesWritten}; final confirmation is ${badgeLabels.confirmRequired} and is the first write-capable screen.`,
|
|
75
75
|
databaseChoices: [
|
|
76
76
|
choice('database:global', 'Global database', 'Use the OS-level VGXNESS database. Recommended for normal local use.', selections?.databaseMode === 'global' || (selections === undefined && plan?.db.mode === 'global'), state?.focusedChoiceId, [badgeLabels.recommended]),
|
|
77
77
|
choice('database:project-local', 'Project-local database', 'Preview a workspace-scoped database path. No file is created here.', selections?.databaseMode === 'project-local' || (selections === undefined && plan?.db.mode === 'project-local'), state?.focusedChoiceId, [badgeLabels.readOnly]),
|
|
78
78
|
choice('database:custom', 'Custom database path', 'Deferred/read-only in the TUI unless already supplied by flags or environment.', selections?.databaseMode === 'custom' || (selections === undefined && plan?.db.mode === 'custom'), state?.focusedChoiceId, [badgeLabels.deferred, badgeLabels.readOnly]),
|
|
79
79
|
],
|
|
80
80
|
providerChoices: [
|
|
81
|
-
choice('provider:opencode', 'OpenCode', 'Default guided install provider
|
|
82
|
-
choice('provider:claude-supported', 'Claude (first-class supported)', 'Claude CLI MCP registration and
|
|
81
|
+
choice('provider:opencode', 'OpenCode', 'Default guided install provider. VGXNESS will manage user-global provider configuration.', (selections?.provider ?? plan?.provider ?? 'opencode') === 'opencode', state?.focusedChoiceId, [badgeLabels.recommended]),
|
|
82
|
+
choice('provider:claude-supported', 'Claude (first-class supported)', 'Claude user-global CLI MCP registration and config apply only via guarded mcp install claude --yes --run-id <id>; project-local files are diagnostics only.', (selections?.provider ?? plan?.provider) === 'claude', state?.focusedChoiceId, ['[supported]', badgeLabels.readOnly]),
|
|
83
83
|
choice('provider:none', 'Manual / none', 'No automatic provider config write; follow manual setup guidance.', (selections?.provider ?? plan?.provider) === 'none', state?.focusedChoiceId, [badgeLabels.manual, badgeLabels.readOnly]),
|
|
84
84
|
],
|
|
85
85
|
scopeChoices: isOpenCode
|
|
86
86
|
? [
|
|
87
|
-
choice('scope:user', 'User
|
|
88
|
-
choice('scope:project', 'Project scope', 'Opt in to writing project OpenCode config only after final confirmation.', (selections?.scope ?? opencode?.scope) === 'project', state?.focusedChoiceId, [badgeLabels.writeAfterConfirm]),
|
|
87
|
+
choice('scope:user', 'User-global provider config', 'VGXNESS will manage user-global provider configuration. Project-local provider files are external/manual diagnostics and will not be modified.', true, state?.focusedChoiceId, [badgeLabels.recommended, badgeLabels.writeAfterConfirm]),
|
|
89
88
|
]
|
|
90
89
|
: [],
|
|
91
90
|
installModeChoices: isOpenCode
|
|
@@ -96,7 +95,7 @@ export function setupTuiViewModelFromPlan(plan, status, state) {
|
|
|
96
95
|
: [],
|
|
97
96
|
overwriteChoices: isOpenCode
|
|
98
97
|
? [
|
|
99
|
-
choice('overwrite:vgxness', 'Reinstall VGXNESS entries', 'Default off. When enabled, final confirmation overwrites existing VGXNESS OpenCode entries and preserves unrelated OpenCode config.', selections?.overwriteVgxness ?? opencode?.overwriteVgxness ?? false, state?.focusedChoiceId, [badgeLabels.warning, badgeLabels.writeAfterConfirm]),
|
|
98
|
+
choice('overwrite:vgxness', 'Reinstall VGXNESS entries', 'Default off. When enabled, final confirmation overwrites existing user-global VGXNESS OpenCode entries and preserves unrelated OpenCode config.', selections?.overwriteVgxness ?? opencode?.overwriteVgxness ?? false, state?.focusedChoiceId, [badgeLabels.warning, badgeLabels.writeAfterConfirm]),
|
|
100
99
|
]
|
|
101
100
|
: [],
|
|
102
101
|
};
|
|
@@ -109,13 +108,13 @@ function previewDetailLines(input) {
|
|
|
109
108
|
`Provider: ${input.provider === 'opencode' ? 'OpenCode [recommended default]' : input.provider === 'claude' ? 'Claude [first-class supported] [guarded explicit apply]' : 'Manual / none [manual] [read-only]'}`,
|
|
110
109
|
`Memory path: ${plan?.db.mode ?? 'pending'} at ${compactPath(input.databasePath, 72)} (source: ${String(input.databaseSource)})`,
|
|
111
110
|
`Memory guidance: ${memoryPathExplanation(plan, input.databasePath, input.databaseSource)}`,
|
|
112
|
-
`Scope: ${input.isOpenCode ?
|
|
111
|
+
`Scope: ${input.isOpenCode ? 'user-global provider config' : 'disabled for manual/none provider'}`,
|
|
113
112
|
`Install mode: ${input.isOpenCode ? (opencode?.installsAgents === false ? 'mcp-only' : 'mcp-plus-agents') : 'disabled for manual/none provider'}`,
|
|
114
113
|
`Reinstall VGXNESS entries: ${input.isOpenCode ? String(opencode?.overwriteVgxness ?? false) : 'disabled for manual/none provider'}`,
|
|
115
|
-
`Provider installability: ${input.isOpenCode ? 'OpenCode installable after final confirmation
|
|
114
|
+
`Provider installability: ${input.isOpenCode ? 'OpenCode installable after final confirmation. VGXNESS will manage user-global provider configuration. Claude first-class support requires guarded mcp install claude --yes --run-id <id>. Project-local provider files are external/manual diagnostics and will not be modified.' : 'No guided provider install from this selection; Claude uses guarded explicit user-global apply.'}`,
|
|
116
115
|
`Agent readiness: ${agentReadinessFromPlan(plan)}`,
|
|
117
116
|
`Target config: ${input.isOpenCode && opencode?.targetPath !== undefined ? compactPath(opencode.targetPath, 72) : 'none; no provider config will be written'}`,
|
|
118
|
-
`Safety: ${input.isOpenCode ?
|
|
117
|
+
`Safety: ${input.isOpenCode ? `${badgeLabels.confirmRequired} only on final confirmation; ${badgeLabels.noFilesWritten} during preview` : `${badgeLabels.readOnly} ${badgeLabels.noFilesWritten} manual/no-provider-write mode`}`,
|
|
119
118
|
...actions,
|
|
120
119
|
input.backups.length === 0 ? 'Backups: none planned' : `Backups: ${input.backups.join('; ')}`,
|
|
121
120
|
...(input.warnings.length === 0 ? ['Warnings: none'] : input.warnings.map((warning) => `Warning: ${warning}`)),
|
|
@@ -132,7 +131,8 @@ function helpLines(screen) {
|
|
|
132
131
|
'Next/back: Tab continues; Shift+Tab goes back. Enter continues on review and confirms only on final confirmation.',
|
|
133
132
|
'Cancel/close: q or Esc cancels setup; when help is open, ?/h toggles it closed.',
|
|
134
133
|
reviewLine,
|
|
135
|
-
'Provider support: OpenCode is the default guided install provider; Claude is first-class supported for guarded explicit apply via mcp install claude --
|
|
134
|
+
'Provider support: OpenCode is the default guided install provider; Claude is first-class supported for guarded explicit user-global apply via mcp install claude --yes --run-id <id>; Manual / none writes no provider config.',
|
|
135
|
+
'Provider config: VGXNESS will manage user-global provider configuration. Project-local provider files are external/manual diagnostics and will not be modified.',
|
|
136
136
|
'Agent readiness: the preview checks vgxness-manager/SDD readiness guidance; preview screens never seed agents.',
|
|
137
137
|
'No-write guarantee: no provider config is written before explicit final confirmation.',
|
|
138
138
|
];
|
|
@@ -177,7 +177,7 @@ function progressLabel(screen) {
|
|
|
177
177
|
if (screen === 'provider')
|
|
178
178
|
return 'Step 3/6 Provider: choose OpenCode or manual/none';
|
|
179
179
|
if (screen === 'opencode-details')
|
|
180
|
-
return 'Step 4/6 OpenCode:
|
|
180
|
+
return 'Step 4/6 OpenCode: user-global target and install mode';
|
|
181
181
|
if (screen === 'plan-review')
|
|
182
182
|
return 'Step 5/6 Review: read-only plan review';
|
|
183
183
|
if (screen === 'final-confirmation')
|
|
@@ -201,7 +201,7 @@ function readinessBadge(status) {
|
|
|
201
201
|
if (status === 'manual-required')
|
|
202
202
|
return badgeLabels.warning;
|
|
203
203
|
if (status === 'conflict' || status === 'blocked')
|
|
204
|
-
return badgeLabels.
|
|
204
|
+
return badgeLabels.blocked;
|
|
205
205
|
return badgeLabels.warning;
|
|
206
206
|
}
|
|
207
207
|
function opencodeActionLabel(action) {
|