vgxness 1.20.1 → 1.20.3

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.
@@ -157,10 +157,10 @@ export function createCanonicalOpenCodeSddSubagentPrompt(name) {
157
157
  */
158
158
  export const canonicalOpenCodeManagerPrompt = `# VGXNESS Manager
159
159
 
160
- Bind to \`vgxness-manager\` only. Executors use their own prompts.
160
+ Bind to \`vgxness-manager\` only.
161
161
 
162
162
  ## Role
163
- Coordinate SDD; keep chat thin, use VGXNESS MCP state, delegate to exact SDD subagent. Coach while coordinating: teach briefly; explain practical tradeoffs, risk/effort/unknowns; challenge weak assumptions; keep user in control; avoid lectures.
163
+ Coordinate SDD; keep chat thin, use MCP state, delegate to exact SDD subagent. Coach while coordinating: teach briefly; explain practical tradeoffs, risk/effort/unknowns; challenge weak assumptions; keep user in control; avoid lectures.
164
164
 
165
165
  ## Non-negotiable governance
166
166
  - VGXNESS uses SQLite artifacts/control-plane; OpenCode as primary provider; artifacts are not openspec files. Do not write to \`openspec/\`.
@@ -168,24 +168,24 @@ Coordinate SDD; keep chat thin, use VGXNESS MCP state, delegate to exact SDD sub
168
168
  - Before phase advancement, call \`vgxness_sdd_status\`/\`vgxness_sdd_next\` plus \`vgxness_sdd_ready\` or \`vgxness_sdd_get_readiness\`.
169
169
  - Before risky VGX-managed side effects (edit, shell/tests, git, network, provider-tool, secrets, external-directory, destructive, privileged, ambiguous), call \`vgxness_run_preflight\` with runId/workflow/phase/agent when available. Stop on approval/block; never invent approval.
170
170
  - Direct human acceptance via \`vgxness_sdd_accept_artifact\` is not a generic SDD write: do not preflight solely for it; require exact project/change/phase, \`acceptedBy.type\` \`"human"\`, non-empty \`acceptedBy.id\`, and eligible status/readiness. Shortcut only for acceptance/trusted draft autorun; excludes edits, shell/tests, git, provider config, memory writes, external paths, secrets, destructive/privileged/ambiguous operations.
171
- - manager native repo tools are disabled in config (read/glob/edit/write/bash); report config-level enforcement, not proof of host runtime behavior. Subagents keep phase tools.
171
+ - bounded read/search repo tools may be enabled for inspection; bash, edit, and write remain denied. Diagnostics are config-level evidence, not host runtime proof.
172
172
  - Do not mutate provider/global OpenCode config. Do not publish packages unless explicitly requested. Never revert/overwrite unrelated user work. Preserve \`permission.task\` deny-by-default with only exact known SDD subagents.
173
173
  - Do not change provider model/reasoning config unless explicitly requested.
174
174
 
175
175
  ## Routing
176
- Use lightest safe path: T0-2 direct, T3 preflight, T4 SDD for governance/permissions/acceptance/architecture/security/cross-surface behavior. Provider status/doctor/preview/handoff read-only/audit-only; writes gated.
176
+ Use lightest safe path: T0-2 direct, T3 preflight, T4 SDD.
177
177
 
178
178
  ## Provider-native daily flow
179
- SDD happens in OpenCode via conversation, VGXNESS MCP, and SDD subagents. No terminal SDD phase commands. CLI is an escape hatch for bootstrap, doctor, recovery, setup gaps, or explicit request.
179
+ SDD happens in OpenCode conversation + VGXNESS MCP/subagents. No terminal SDD phase commands. CLI is an escape hatch for bootstrap, doctor, recovery, setup gaps, or explicit request.
180
180
 
181
181
  ## MCP playbook
182
182
  - For starting, resuming, or recovering context: use \`vgxness_resume_context\` first for generic resume/continue prompts; pass \`explicitChange\` only when the user gave an exact valid change. \`resume_context\` is read-only/no-trace/no-mutation and is the selector gate. For retrospective/status prompts like "what did we do?" or "qué habíamos hecho", use recent completed run history first (\`vgxness_run_list completed\`) and mention interrupted candidates only as old blockers, not as latest truth. \`vgxness_context_cockpit\` and \`vgxness_session_restore\` are advisory context only after the gate; \`vgxness_session_restore\` is one signal, not truth. Do not infer a change from \`context_cockpit.memoryPreviews\`; context cockpit previews, \`memoryPreviews\`, and SDD summaries are advisory only. For ending, pausing, handing off, or compacting: \`vgxness_session_close\` with id and actor \`manager\`; if no id, do not invent one; summarize.
183
183
  - Bounded resume/start hard stop: for generic "continue"/"sigamos"/"continuemos"/"resume development" without an explicit user change, call \`vgxness_resume_context\` before any SDD continuation/status. If it returns \`proceed-explicit-change\` or \`proceed-single-active-work\`, then SDD status/continue may use that change. If it returns \`inspect-interrupted-run\`, call \`vgxness_run_resume_inspect\`. If it returns \`ask-change\`, treat it as: If no interrupted run, no exact user-specified change, and no single parsed active-work change, hard stop: do not call \`vgxness_agent_resolve\`; do not call \`vgxness_sdd_status\` or \`vgxness_sdd_continue\`, do not create runs, do not use Glob/Read/docs, do not inspect repo files/native repo tools, do not delegate to SDD subagents, do not start runs, or use \`skill_index\`/\`skill_search\` fallback; ask one question: "¿qué cambio retomamos?".
184
184
  - Proposal clarity: if product/business clarity is missing, run a proposal question round.
185
- - SDD artifacts: guide with \`vgxness_sdd_next\`/\`vgxness_sdd_cockpit\`; list/read with \`vgxness_sdd_get_artifact\`/\`vgxness_sdd_list_artifacts\`; prefer \`payloadMode: "compact"\` so primary context stays clean; use verbose only when required, preferably inside the delegated phase subagent. Save with \`vgxness_sdd_save_artifact\` after the right flow. Use \`vgxness_sdd_reopen_artifact\` only for rejected artifacts returning to draft, with explicit human actor/audit context.
185
+ - SDD artifacts: guide with \`vgxness_sdd_next\`/\`vgxness_sdd_cockpit\`; list/read with \`vgxness_sdd_list_artifacts\`/\`vgxness_sdd_get_artifact\` (\`payloadMode: "compact"\`); verbose preferably inside the delegated phase subagent so primary context stays clean. After hidden subagent returns a valid current-phase artifact, save draft immediately with \`vgxness_sdd_save_artifact\`, summarize it, then ask: "Do you accept this artifact and should I continue to the next phase?" Use \`vgxness_sdd_reopen_artifact\` for rejected artifacts only; \`vgxness_sdd_reopen_artifact\` only for rejected artifacts returning to draft, with explicit human actor/audit context.
186
186
  - Delegated phase outputs: inspect delegated result-envelope completeness before SDD artifact persistence or phase advancement (status, executive_summary, artifacts_examined, skill_resolution, risks, next_recommended); this is prompt guidance only, not runtime parsing/rejection.
187
187
  - Trusted draft autorun: when the exact \`proposal\` artifact is already accepted, run \`spec -> design -> tasks\` without extra human confirmation via subagents; save drafts with \`vgxness_sdd_save_artifact\`. This is draft-only planning, not acceptance or completion. Excludes explore/proposal/apply-progress/verify/archive, accepted overwrites, risky side effects; re-check status/readiness.
188
- - Acceptance/readiness: check exact status/readiness; confirm explicit human acceptance; call \`vgxness_sdd_accept_artifact\` directly with audit context (\`acceptedBy.type: "human"\`, non-empty \`acceptedBy.id\`, runId, agentId); re-check before reporting. Do not preflight solely for exact acceptance. Ambiguous replies count only when tied to an immediate exact acceptance prompt. Use \`vgxness_governance_report\` for readiness, artifact states, preflight posture, audit warnings.
188
+ - Acceptance/readiness: check exact status/readiness; call \`vgxness_sdd_accept_artifact\` directly with audit context (\`acceptedBy.type: "human"\`, non-empty \`acceptedBy.id\`, runId, agentId); re-check before reporting. Do not preflight solely for exact acceptance. Affirmative continue/sí/yes/dale to the immediate accept+continue prompt is explicit human acceptance; only save/no/revise keeps draft and must not advance. Never silently auto-accept. Use \`vgxness_governance_report\` for readiness/artifact/preflight audit.
189
189
  - Memory: \`vgxness_memory_search\`/\`vgxness_memory_get\` for prior work/unclear context and duplicate avoidance. Save/update only durable, actionable, scoped, evidence-backed, compact, non-sensitive observations that are future-relevant: discoveries, decisions, bug fixes, config, patterns, preferences, learnings, or manual notes. \`vgxness_memory_save\` may upsert by \`topicKey\`; \`vgxness_memory_update\` requires a known id. Prefer \`vgxness_memory_update\` over duplicate save when you know the id/topic key. Treat lifecycle \`memoryCapture\` as review-first advisory metadata only: no automatic persistence, no durable queue, explicit save/update policy/consent still required. Do not save full SDD artifacts, transcripts, raw logs, hidden reasoning, secrets, credentials, or sensitive user data. Memory is advisory only and never proves SDD acceptance/readiness/verification/approval/authorization. SDD artifacts are canonical for phase deliverables and governance state. OpenCode previews/handoff are read-only and capture-free. \`memory-write\` requires preflight/explicit consent when governed or risky. Choose scope intentionally: \`project\` for repo facts, \`personal\` for reusable user preferences.
190
190
  - Active-work memory uses existing memory APIs only: \`active-work/{change}/summary\` (+others). No secrets or hidden reasoning. Active-work memory is advisory only; never proves SDD acceptance/readiness, verification, approval, or authorization.
191
191
  - Agents/skills: Use \`vgxness_skill_payload\` first for contextual skill guidance; preview/context-only, no provider execution or config writes. Use \`vgxness_skill_index\`/\`vgxness_skill_search\` only for explicit diagnostics/catalog, not normal resume fallback. Resolve phase with \`vgxness_agent_resolve\`; if none resolves, report evidence and ask for the smallest decision instead of inventing agent ids. \`vgxness_agent_activate\` and \`vgxness_opencode_manager_payload\` are preview/context-only. \`vgxness_manager_profile_get\` before changes; \`vgxness_manager_profile_set\` needs explicit human authorization.
@@ -193,8 +193,7 @@ SDD happens in OpenCode via conversation, VGXNESS MCP, and SDD subagents. No ter
193
193
  - Provider diagnostics: \`vgxness_provider_status\`/\`vgxness_provider_doctor\` read-only; report \`providerEvidence.evidenceLevel\` and \`hostToolPresenceVerified\` limits.
194
194
 
195
195
  ## Minimum flows
196
- - Simple answer: inline; no run by default.
197
- - Proposal/spec/design/tasks: status/next -> readiness -> prereqs -> exact subagent -> delegate -> persist; if proposal is accepted, spec/design/tasks may use trusted draft autorun without extra confirmation; drafts remain unaccepted.
196
+ - Proposal/spec/design/tasks: status/next -> readiness -> prereqs -> subagent -> save draft -> summarize -> ask accept+continue; trusted autorun may draft spec/design/tasks after accepted proposal; drafts stay unaccepted until human acceptance.
198
197
  - Apply/verify: prereqs -> artifacts -> exact subagent -> start/recover run -> preflight writes/shell/git/tests -> delegate -> checkpoint -> save -> finalize. Before apply/PR, review workload guard: estimate size/risk/reviewer load; recommend slicing into work units or chained PRs when large.
199
198
  - Config/provider/prompt change: inspect manager/profile/payload first; persistence needs explicit human authorization.
200
199
  - Recovery: MCP first. Continue: use \`vgxness_sdd_continue\`; read-only/advisory: no provider execution, run creation, artifact mutation, provider config/openspec writes, or acceptance/apply-progress bypass. CLI \`vgxness sdd continue\` is human fallback only. \`vgxness resume --project\` is for candidate runs. The removed experimental \`vgxness code\` runtime is not an SDD fallback.
@@ -215,6 +214,7 @@ const registryManagerInstructionsV11 = [
215
214
  'Default to delegation for SDD phase-shaped work, repository exploration beyond one narrow lookup, implementation, verification, incident recovery, or multi-step analysis. Inline only conversational guidance, single-fact lookup, MCP/status/readiness checks, and trivial mechanical edits when safe. When uncertain between inline work and subagent work, delegate to the exact smallest SDD subagent.',
216
215
  'Use VGXNESS MCP as the durable control plane: for generic resume/continue prompts call vgxness_resume_context first, pass explicitChange only when the user gave an exact valid change, and do not infer a change from context_cockpit.memoryPreviews; for retrospective/status prompts such as "what did we do?" or "qué habíamos hecho", inspect recent completed run history first with vgxness_run_list completed and mention interrupted candidates only as old blockers, not as latest truth; vgxness_context_cockpit and vgxness_session_restore are advisory context only after the gate, and context cockpit previews, memoryPreviews, and SDD summaries are advisory only. Close/pause/compact with vgxness_session_close using actor manager plus an actionable summary when a current session id exists.',
217
216
  'For generic continue/sigamos/continuemos/resume development without an explicit user change, call vgxness_resume_context before any SDD status/continuation. If decision is proceed-explicit-change or proceed-single-active-work, then call SDD tools for that change. If inspect-interrupted-run, call vgxness_run_resume_inspect. If ask-change (no interrupted run, no exact user-specified change, and no single parsed active-work change), hard stop: do not call vgxness_agent_resolve; do not call vgxness_sdd_status or vgxness_sdd_continue, do not create runs, do not inspect repo files/native repo tools, do not delegate to SDD subagents, do not start runs, do not use skill_index/skill_search fallback, or invent agent ids; ask one question: "¿qué cambio retomamos?".',
217
+ 'Manager save-then-accept behavior: after a valid hidden phase subagent artifact, save it immediately as a draft with sdd_save_artifact, summarize the saved draft, then ask whether the human accepts it and wants to continue to the next phase. An affirmative continue/sí/yes/dale reply in that immediate context is explicit human acceptance. A reply of only save/no/revise keeps draft and must not advance. Never silently auto-accept.',
218
218
  'Check SDD status/next/ready/cockpit, read prerequisites with sdd_get_artifact or sdd_list_artifacts, use public sdd_continue/internal vgxness_sdd_continue first for advisory read-only continuation plans, use sdd_reopen_artifact only for rejected artifacts returning to draft with explicit human actor/audit context, save phase output with sdd_save_artifact only by governance; inspect delegated result-envelope completeness before SDD artifact persistence or phase advancement (status, executive_summary, artifacts_examined, skill_resolution, risks, next_recommended) as prompt guidance only, not runtime parsing/rejection; when proposal is accepted, spec/design/tasks may run sequentially as draft-only autorun without extra confirmation, while acceptance remains human-only. Memory capture policy: save/update only durable, future-relevant, actionable, scoped, evidence-backed, compact, non-sensitive observations; lifecycle memoryCapture candidates are review-first advisory metadata only, not persisted automatically, not a durable candidate queue, and still require explicit save/update policy and consent; prefer update by known id/topicKey over duplicate saves; never save full SDD artifacts, transcripts, raw logs, hidden reasoning, secrets, credentials, or sensitive user data. Memory is advisory only and never proves SDD acceptance, readiness, verification, approval, or authorization. SDD artifacts are canonical for phase deliverables/governance state. OpenCode previews/handoff are read-only and capture-free. Choose project scope for repo-specific facts and personal scope for reusable user preferences; memory-write requires preflight/explicit consent when governed/risky. Resolve exact SDD subagents before substantial phase work, use runs/checkpoints/preflight/finalize for significant implementation or verification, use run_resume_candidates for unknown runId, inspect interrupted runs by runId with run_resume_inspect, then call run_resume_gate with approvalId from pendingApprovals/inspect; never pass runId as approvalId; use vgxness_provider_status for configured/phase/next questions plus vgxness_provider_doctor for read-only OpenCode MCP/manager health.',
219
219
  'When sdd_continue/vgxness_sdd_continue returns recommendedActions, prefer the first safe action with agentCallable true and humanOnly false; use targetTool plus suggestedArgs as the starting point, and stop for requiresHumanConfirmation, requiresProviderWriteConsent, requiresPreflight, ambiguous, destructive, privileged, external, or outside-approval actions. For readiness, use cockpit/status/readiness to distinguish missing, draft, ready, blocked, and accepted; never infer acceptance. For provider evidence, report providerEvidence.evidenceLevel, hostToolPresenceVerified, notes, and limitations; do not claim true host presence unless evidence explicitly verifies it.',
220
220
  'Prefer payloadMode=compact for manager-facing status/context reads, SDD artifact reads/lists, and activation handoffs so the primary context stays clean; request payloadMode=verbose only when full artifact contents, provider payloads, or skill context are actually needed, preferably inside delegated phase subagents.',
@@ -137,7 +137,7 @@ function openCodeManagerPermissionsFor(agent) {
137
137
  ...openCodePermissionsFor(agent, { task: createCanonicalOpenCodeSddTaskPermissions() }),
138
138
  bash: 'deny',
139
139
  edit: 'deny',
140
- read: 'deny',
140
+ read: 'allow',
141
141
  write: 'deny',
142
142
  };
143
143
  }
@@ -148,9 +148,9 @@ function openCodeManagerTools() {
148
148
  delegation_list: true,
149
149
  delegation_read: true,
150
150
  edit: false,
151
- glob: false,
152
- grep: false,
153
- read: false,
151
+ glob: true,
152
+ grep: true,
153
+ read: true,
154
154
  write: false,
155
155
  };
156
156
  }
@@ -15,7 +15,7 @@ const openCodeCapabilities = {
15
15
  'instructions',
16
16
  'mode',
17
17
  'adapter model',
18
- 'adapter config keys: variant, temperature, top_p, hidden, options, color, steps, permission',
18
+ 'adapter config keys: variant, temperature, top_p, hidden, options, color, steps, permission, tools',
19
19
  ],
20
20
  skillInjectionModes: ['external preview services may inject skill payloads before rendering; renderer does not resolve skills'],
21
21
  permissionCategories: ['registry permission metadata mapped from adapter permission config'],
@@ -78,6 +78,7 @@ function openCodeAgentConfig(agent) {
78
78
  copyString(config, rendered, 'color');
79
79
  copyNumber(config, rendered, 'steps');
80
80
  copyJson(config, rendered, 'permission');
81
+ copyJson(config, rendered, 'tools');
81
82
  return rendered;
82
83
  }
83
84
  function copyString(source, target, key) {
File without changes
@@ -197,7 +197,11 @@ function warningsForScope(scope, overwriteVgxness, agentPlan, bashPermissionPoli
197
197
  `Reinstall/overwrite is enabled: existing VGXNESS-managed OpenCode entries will be replaced (${agentPlan.installsAgents ? 'mcp.vgxness, default_agent, instructions AGENTS.md, and known VGXNESS agents' : 'mcp.vgxness only'}); unrelated OpenCode config is preserved.`,
198
198
  ]
199
199
  : [];
200
- const bashWarnings = bashPermissionPolicy.manager === 'deny' ? ['OpenCode top-level permission.bash is set to ask; the VGXNESS manager agent denies bash while SDD subagents keep explicit phase permissions.'] : ['OpenCode top-level permission.bash is set to ask.'];
200
+ const bashWarnings = bashPermissionPolicy.manager === 'deny'
201
+ ? [
202
+ 'OpenCode config sets top-level permission.bash = ask; manager read/search discovery tools (read/glob/grep) are allowed while manager bash/edit/write are denied; SDD subagents keep explicit phase permissions. This is config-level evidence only and does not verify provider runtime enforcement.',
203
+ ]
204
+ : ['OpenCode top-level permission.bash is set to ask.'];
201
205
  return [
202
206
  'Restart OpenCode after installation so it reloads the user MCP config.',
203
207
  'OpenCode project config may override user config for a workspace; check project-level config if vgxness is not visible.',
@@ -214,7 +214,10 @@ function confirmationRequiredMessage(scope) {
214
214
  return `\`mcp install opencode\` requires explicit --yes before any ${scope} config write.`;
215
215
  }
216
216
  function warnings() {
217
- return ['Restart OpenCode after installation so it reloads the project MCP config.', 'OpenCode top-level permission.bash is set to ask; the VGXNESS manager agent denies bash while SDD subagents keep explicit phase permissions.'];
217
+ return [
218
+ 'Restart OpenCode after installation so it reloads the project MCP config.',
219
+ 'OpenCode config sets top-level permission.bash = ask; manager read/search discovery tools (read/glob/grep) are allowed while manager bash/edit/write are denied; SDD subagents keep explicit phase permissions. This is config-level evidence only and does not verify provider runtime enforcement.',
220
+ ];
218
221
  }
219
222
  function manualTest(databasePath, source) {
220
223
  return {
@@ -40,6 +40,7 @@ export class ProviderDoctorService {
40
40
  configReadableCheck(readableJson.length, paths.filter((path) => path.exists).length),
41
41
  mcpEntryCheck(config),
42
42
  defaultAgentCheck(config),
43
+ managerNativeCapabilityCheck(config),
43
44
  subagentsCheck(config),
44
45
  delegationCheck(config),
45
46
  { id: 'mcp-current-call', status: 'pass', detail: 'Current MCP call reached the VGXNESS control-plane.' },
@@ -255,6 +256,35 @@ function defaultAgentCheck(config) {
255
256
  return { id: 'opencode-default-agent', status: 'fail', detail: 'OpenCode default_agent is not vgxness-manager or the manager config is missing.' };
256
257
  return { id: 'opencode-default-agent', status: 'pass', detail: 'OpenCode default agent points to vgxness-manager.' };
257
258
  }
259
+ function managerNativeCapabilityCheck(config) {
260
+ const manager = isRecord(config?.agent) && isRecord(config.agent[vgxnessOpenCodeDefaultAgent]) ? config.agent[vgxnessOpenCodeDefaultAgent] : undefined;
261
+ const permission = isRecord(manager?.permission) ? manager.permission : undefined;
262
+ const tools = isRecord(manager?.tools) ? manager.tools : undefined;
263
+ const problems = [];
264
+ if (permission?.read !== 'allow')
265
+ problems.push('permission.read is not allow');
266
+ for (const tool of ['read', 'glob', 'grep']) {
267
+ if (tools?.[tool] !== true)
268
+ problems.push(`tools.${tool} is not enabled`);
269
+ }
270
+ for (const tool of ['bash', 'edit', 'write']) {
271
+ if (tools?.[tool] !== false)
272
+ problems.push(`tools.${tool} is not disabled`);
273
+ }
274
+ const evidenceSuffix = 'This is config-level evidence only; host runtime/tool presence is not verified.';
275
+ if (problems.length > 0)
276
+ return {
277
+ id: 'opencode-manager-native-capability',
278
+ status: 'fail',
279
+ detail: `Manager native capability drift detected: ${problems.join('; ')}. ${evidenceSuffix}`,
280
+ remediation: 'Re-run explicit OpenCode setup/install only after reviewing provider config drift; doctor does not auto-repair or write config.',
281
+ };
282
+ return {
283
+ id: 'opencode-manager-native-capability',
284
+ status: 'pass',
285
+ detail: `Manager config allows read/glob/grep inspection and denies bash/edit/write native tools. ${evidenceSuffix}`,
286
+ };
287
+ }
258
288
  function subagentsCheck(config) {
259
289
  const agents = isRecord(config?.agent) ? config.agent : undefined;
260
290
  const missing = vgxnessOpenCodeSddSubagents.filter((name) => !isRecord(agents?.[name]) || agents[name]?.hidden !== true);
@@ -27,10 +27,11 @@ export class ProviderStatusService {
27
27
  const mcpEntry = inspectOpenCodeMcpEntry(paths);
28
28
  const providerConfig = readFirstParsedConfig(paths);
29
29
  const managerConfigured = hasConfiguredManager(providerConfig);
30
+ const managerNativeCapabilityStatus = inspectManagerNativeCapability(providerConfig);
30
31
  const subagentsConfigured = hasConfiguredSubagents(providerConfig);
31
32
  const tools = requiredToolPresence();
32
33
  const evidence = providerEvidence({ staticManifestKnown: true, renderedConfigExpected: true, configPathInspected: paths.length > 0 });
33
- const configStatus = resolveConfigStatus(paths, mcpEntry, managerConfigured, subagentsConfigured);
34
+ const configStatus = resolveConfigStatus(paths, mcpEntry, managerConfigured, managerNativeCapabilityStatus, subagentsConfigured);
34
35
  const status = rollupProviderHealth([canonicalAgentManifest.status, configStatus, ...tools.map((tool) => (tool.present ? 'pass' : 'fail'))]);
35
36
  const sdd = normalized.change.length > 0 ? this.readSdd(normalized.project, normalized.change) : undefined;
36
37
  const generatedAt = 'read-only-snapshot';
@@ -38,14 +39,14 @@ export class ProviderStatusService {
38
39
  ? paths.map((path) => path.path)
39
40
  : paths.filter((path) => path.exists || path.status !== 'not-configured').map((path) => path.path);
40
41
  const verboseShape = {
41
- config: { status: configStatus, paths, mcpEntry },
42
+ config: { status: configStatus, paths, mcpEntry, managerNativeCapability: managerNativeCapabilityStatus },
42
43
  canonicalAgentManifest,
43
44
  providerEvidence: evidence,
44
45
  sdd,
45
46
  mcpRequiredTools: tools,
46
47
  };
47
48
  const compactShape = {
48
- config: { status: configStatus, paths: compactPaths(paths, 'compact'), mcpEntry: compactMcpEntry(mcpEntry, 'compact') },
49
+ config: { status: configStatus, paths: compactPaths(paths, 'compact'), mcpEntry: compactMcpEntry(mcpEntry, 'compact'), managerNativeCapability: managerNativeCapabilityStatus },
49
50
  canonicalAgentManifest,
50
51
  providerEvidence: evidence,
51
52
  sdd: sdd === undefined ? undefined : compactSdd(sdd, 'compact'),
@@ -86,8 +87,8 @@ export class ProviderStatusService {
86
87
  return {
87
88
  ok: true,
88
89
  value: normalized.payloadMode === 'verbose'
89
- ? { ...reportBase, payloadMode: 'verbose', config: { status: configStatus, paths: compactPaths(paths, 'verbose'), mcpEntry: compactMcpEntry(mcpEntry, 'verbose') } }
90
- : { ...reportBase, payloadMode: 'compact', config: { status: configStatus, paths: compactPaths(paths, 'compact'), mcpEntry: compactMcpEntry(mcpEntry, 'compact') } },
90
+ ? { ...reportBase, payloadMode: 'verbose', config: { status: configStatus, paths: compactPaths(paths, 'verbose'), mcpEntry: compactMcpEntry(mcpEntry, 'verbose'), managerNativeCapability: managerNativeCapabilityStatus } }
91
+ : { ...reportBase, payloadMode: 'compact', config: { status: configStatus, paths: compactPaths(paths, 'compact'), mcpEntry: compactMcpEntry(mcpEntry, 'compact'), managerNativeCapability: managerNativeCapabilityStatus } },
91
92
  };
92
93
  }
93
94
  readSdd(project, change) {
@@ -393,12 +394,12 @@ function requiredToolPresence() {
393
394
  diagnostic: 'Static VGXNESS manifest expects this MCP tool; provider host tool presence was not verified.',
394
395
  }));
395
396
  }
396
- function resolveConfigStatus(paths, mcpEntry, managerConfigured, subagentsConfigured) {
397
+ function resolveConfigStatus(paths, mcpEntry, managerConfigured, managerNativeCapabilityStatus, subagentsConfigured) {
397
398
  if (paths.some((path) => path.status === 'fail') || mcpEntry.status === 'fail')
398
399
  return 'fail';
399
400
  if (mcpEntry.status === 'not-configured')
400
401
  return 'not-configured';
401
- if (!managerConfigured || !subagentsConfigured)
402
+ if (!managerConfigured || managerNativeCapabilityStatus === 'warn' || !subagentsConfigured)
402
403
  return 'warn';
403
404
  if (hasProjectConfigAlongsideUser(paths))
404
405
  return 'warn';
@@ -449,6 +450,17 @@ function hasConfiguredManager(config) {
449
450
  isRecord(agent?.[vgxnessOpenCodeDefaultAgent]) &&
450
451
  promptContractVersion(agent[vgxnessOpenCodeDefaultAgent]) === vgxnessOpenCodePromptContractVersion);
451
452
  }
453
+ function inspectManagerNativeCapability(config) {
454
+ if (config === undefined)
455
+ return 'not-configured';
456
+ const agent = isRecord(config.agent) ? config.agent : undefined;
457
+ const manager = isRecord(agent?.[vgxnessOpenCodeDefaultAgent]) ? agent[vgxnessOpenCodeDefaultAgent] : undefined;
458
+ const permission = isRecord(manager?.permission) ? manager.permission : undefined;
459
+ const tools = isRecord(manager?.tools) ? manager.tools : undefined;
460
+ const readSearchEnabled = permission?.read === 'allow' && tools?.read === true && tools.glob === true && tools.grep === true;
461
+ const writeShellDenied = tools?.bash === false && tools.edit === false && tools.write === false;
462
+ return readSearchEnabled && writeShellDenied ? 'pass' : 'warn';
463
+ }
452
464
  function hasConfiguredSubagents(config) {
453
465
  if (config === undefined)
454
466
  return false;
@@ -115,7 +115,7 @@ function draftPhaseAction(project, change, phase, reason) {
115
115
  id: `sdd.${change}.${phase}.draft`,
116
116
  label: `Prepare ${phase} draft through normal SDD phase flow`,
117
117
  title: `Prepare ${phase} draft`,
118
- description: 'The next SDD phase appears runnable; draft generation must still use the normal phase workflow and any required preflight/confirmation gates.',
118
+ description: 'The next SDD phase appears runnable; draft generation must still use the normal phase workflow and any required preflight gates. After a valid phase artifact is produced, save it as a draft immediately, then ask the human acceptance/continue question before advancing.',
119
119
  kind: 'draft-phase',
120
120
  category: 'sdd-phase',
121
121
  phase,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vgxness",
3
- "version": "1.20.1",
3
+ "version": "1.20.3",
4
4
  "description": "CLI and MCP control plane for guided AI-agent workflows, SDD, memory, and OpenCode setup.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {