vgxness 1.17.1 → 1.18.0

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 CHANGED
@@ -8,7 +8,7 @@ This package is proprietary software. The npm package ships inspectable JavaScri
8
8
 
9
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
- VGXNESS is currently versioned from `package.json` (`1.17.1`). The latest full project health audit is the historical [v1.14.x snapshot](./docs/project-health-audit-v1.14.x.md), which documents the implemented CLI/MCP/SDD control plane, OpenCode-first workflow, release-readiness checks, and the remaining execution/recovery gaps at that point in time. [v1.10.x](./docs/project-health-audit-v1.10.x.md) and [v1.9.1](./docs/project-health-audit-v1.9.1.md) remain historical validation evidence for those releases.
11
+ VGXNESS is currently versioned from `package.json` (`1.17.2`). The latest full project health audit is the historical [v1.14.x snapshot](./docs/project-health-audit-v1.14.x.md), which documents the implemented CLI/MCP/SDD control plane, OpenCode-first workflow, release-readiness checks, and the remaining execution/recovery gaps at that point in time. [v1.10.x](./docs/project-health-audit-v1.10.x.md) and [v1.9.1](./docs/project-health-audit-v1.9.1.md) remain historical validation evidence for those releases.
12
12
 
13
13
  ## Requirements
14
14
 
@@ -14,6 +14,7 @@ import { SddWorkflowService } from '../sdd/sdd-workflow-service.js';
14
14
  import { runBootSkillSeed } from '../skills/boot-seed.js';
15
15
  import { SkillIndexService } from '../skills/skill-index-service.js';
16
16
  import { SkillRegistryService } from '../skills/skill-registry-service.js';
17
+ import { SkillStatusService } from '../skills/skill-status-service.js';
17
18
  import { VerificationPlanService } from '../verification/index.js';
18
19
  import { ProviderChangePlanService } from './provider-change-plan.js';
19
20
  import { ContextCockpitSnapshotService } from './control-plane-snapshot-service.js';
@@ -86,8 +87,60 @@ export function callVgxTool(call, services) {
86
87
  if (services.skillIndex === undefined)
87
88
  return errorEnvelope('validation_failed', 'Skill index service is not available', validated.tool);
88
89
  return toEnvelope(validated.tool, services.skillIndex.getIndex(validated.input));
90
+ case 'vgxness_skill_search':
91
+ if (services.skills.searchSkills === undefined)
92
+ return errorEnvelope('validation_failed', 'Skill search service is not available', validated.tool);
93
+ return toEnvelope(validated.tool, services.skills.searchSkills(validated.input));
94
+ case 'vgxness_skill_get':
95
+ if (services.skills.getSkill === undefined)
96
+ return errorEnvelope('validation_failed', 'Skill get service is not available', validated.tool);
97
+ return toEnvelope(validated.tool, services.skills.getSkill(validated.input));
98
+ case 'vgxness_skill_status':
99
+ if (services.skillStatus === undefined)
100
+ return errorEnvelope('validation_failed', 'Skill status service is not available', validated.tool);
101
+ return toEnvelope(validated.tool, services.skillStatus.getStatus(validated.input));
89
102
  case 'vgxness_skill_payload':
90
103
  return buildSkillPayloadEnvelope(validated.input, services);
104
+ case 'vgxness_skill_activate':
105
+ if (services.skills.activateSkill === undefined)
106
+ return errorEnvelope('validation_failed', 'Skill activation service is not available', validated.tool);
107
+ return toEnvelope(validated.tool, services.skills.activateSkill(validated.input));
108
+ case 'vgxness_skill_record_usage':
109
+ if (services.skills.recordSkillUsage === undefined)
110
+ return errorEnvelope('validation_failed', 'Skill usage service is not available', validated.tool);
111
+ return toEnvelope(validated.tool, services.skills.recordSkillUsage(validated.input));
112
+ case 'vgxness_skill_propose_improvement':
113
+ if (services.skills.proposeSkillImprovement === undefined)
114
+ return errorEnvelope('validation_failed', 'Skill improvement proposal service is not available', validated.tool);
115
+ return toEnvelope(validated.tool, services.skills.proposeSkillImprovement(validated.input));
116
+ case 'vgxness_skill_list_improvement_proposals':
117
+ if (services.skills.listSkillImprovementProposals === undefined)
118
+ return errorEnvelope('validation_failed', 'Skill improvement proposal list service is not available', validated.tool);
119
+ return toEnvelope(validated.tool, services.skills.listSkillImprovementProposals(validated.input));
120
+ case 'vgxness_skill_request_evaluation':
121
+ if (services.skills.requestSkillEvaluation === undefined)
122
+ return errorEnvelope('validation_failed', 'Skill evaluation request service is not available', validated.tool);
123
+ return toEnvelope(validated.tool, services.skills.requestSkillEvaluation(validated.input));
124
+ case 'vgxness_skill_list_evaluations':
125
+ if (services.skills.listSkillEvaluations === undefined)
126
+ return errorEnvelope('validation_failed', 'Skill evaluation list service is not available', validated.tool);
127
+ return toEnvelope(validated.tool, services.skills.listSkillEvaluations(validated.input));
128
+ case 'vgxness_skill_get_evaluation':
129
+ if (services.skills.getSkillEvaluationRequest === undefined)
130
+ return errorEnvelope('validation_failed', 'Skill evaluation get service is not available', validated.tool);
131
+ return toEnvelope(validated.tool, services.skills.getSkillEvaluationRequest(validated.input));
132
+ case 'vgxness_skill_create_draft':
133
+ if (services.skills.createSkillDraft === undefined)
134
+ return errorEnvelope('validation_failed', 'Skill draft creation service is not available', validated.tool);
135
+ return toEnvelope(validated.tool, services.skills.createSkillDraft(validated.input));
136
+ case 'vgxness_skill_update_draft':
137
+ if (services.skills.updateSkillDraft === undefined)
138
+ return errorEnvelope('validation_failed', 'Skill draft update service is not available', validated.tool);
139
+ return toEnvelope(validated.tool, services.skills.updateSkillDraft(validated.input));
140
+ case 'vgxness_skill_publish_version':
141
+ if (services.skills.publishSkillVersion === undefined)
142
+ return errorEnvelope('validation_failed', 'Skill version publication service is not available', validated.tool);
143
+ return toEnvelope(validated.tool, services.skills.publishSkillVersion(validated.input));
91
144
  case 'vgxness_opencode_manager_payload':
92
145
  return toEnvelope(validated.tool, services.opencodeManagerPayload.build(validated.input));
93
146
  case 'vgxness_opencode_handoff_preview':
@@ -316,6 +369,7 @@ function createServices(database) {
316
369
  const agents = new AgentRegistryService(database);
317
370
  const skills = new SkillRegistryService(database);
318
371
  const skillIndex = new SkillIndexService(skills);
372
+ const skillStatus = new SkillStatusService(skills, agents);
319
373
  const runs = new RunService(database);
320
374
  const managerProfiles = new ManagerProfileOverlayService({ agents, overlays: new ManagerProfileOverlayRepository(database) });
321
375
  const opencodeManagerPayload = new OpenCodeManagerPayloadService({ agents, managerProfiles, skills });
@@ -329,6 +383,7 @@ function createServices(database) {
329
383
  managerProfiles,
330
384
  skills,
331
385
  skillIndex,
386
+ skillStatus,
332
387
  seedBuiltInSkills: () => runBootSkillSeed(database),
333
388
  opencodeManagerPayload,
334
389
  opencodeHandoffPreview: new OpenCodeHandoffPreviewService({ managerPayload: opencodeManagerPayload, sdd, providerStatus }),
@@ -30,7 +30,20 @@ export const SUPPORTED_VGX_MCP_TOOL_NAMES = [
30
30
  'vgxness_manager_profile_get',
31
31
  'vgxness_manager_profile_set',
32
32
  'vgxness_skill_index',
33
+ 'vgxness_skill_search',
34
+ 'vgxness_skill_get',
35
+ 'vgxness_skill_status',
33
36
  'vgxness_skill_payload',
37
+ 'vgxness_skill_activate',
38
+ 'vgxness_skill_record_usage',
39
+ 'vgxness_skill_propose_improvement',
40
+ 'vgxness_skill_list_improvement_proposals',
41
+ 'vgxness_skill_request_evaluation',
42
+ 'vgxness_skill_list_evaluations',
43
+ 'vgxness_skill_get_evaluation',
44
+ 'vgxness_skill_create_draft',
45
+ 'vgxness_skill_update_draft',
46
+ 'vgxness_skill_publish_version',
34
47
  'vgxness_opencode_manager_payload',
35
48
  'vgxness_opencode_handoff_preview',
36
49
  'vgxness_run_list',
@@ -74,7 +87,20 @@ export const EXPOSED_VGX_MCP_TOOL_NAMES = [
74
87
  'manager_profile_get',
75
88
  'manager_profile_set',
76
89
  'skill_index',
90
+ 'skill_search',
91
+ 'skill_get',
92
+ 'skill_status',
77
93
  'skill_payload',
94
+ 'skill_activate',
95
+ 'skill_record_usage',
96
+ 'skill_propose_improvement',
97
+ 'skill_list_improvement_proposals',
98
+ 'skill_request_evaluation',
99
+ 'skill_list_evaluations',
100
+ 'skill_get_evaluation',
101
+ 'skill_create_draft',
102
+ 'skill_update_draft',
103
+ 'skill_publish_version',
78
104
  'opencode_manager_payload',
79
105
  'opencode_handoff_preview',
80
106
  'run_list',
@@ -107,6 +133,28 @@ const runStatuses = ['created', 'planned', 'running', 'needs-human', 'completed'
107
133
  const finalRunStatuses = ['completed', 'failed', 'blocked', 'cancelled'];
108
134
  const runOutcomes = ['success', 'partial', 'failure', 'blocked', 'cancelled'];
109
135
  const payloadModes = ['compact', 'verbose'];
136
+ const skillVersionStatuses = ['draft', 'active', 'deprecated', 'archived'];
137
+ const skillImprovementProposalStatuses = ['draft', 'pending-approval', 'approved', 'rejected', 'cancelled', 'applied'];
138
+ const skillEvaluationRequestStatuses = ['requested', 'planned', 'running', 'completed', 'failed', 'cancelled', 'skipped'];
139
+ const skillSourceKinds = ['path', 'url', 'inline'];
140
+ const skillUsageOutcomes = ['selected', 'injected', 'helped', 'failed', 'neutral'];
141
+ const skillAttachmentTargetTypes = ['agent', 'subagent', 'workflow-phase', 'provider-adapter', 'intent-signal'];
142
+ const jsonRecordSchema = z.record(z.string(), z.unknown());
143
+ const skillLifecycleActorSchema = z
144
+ .object({
145
+ type: z.enum(['human', 'agent', 'system']),
146
+ id: z.string().min(1),
147
+ displayName: z.string().min(1).optional(),
148
+ })
149
+ .passthrough();
150
+ const skillSourceSchema = z
151
+ .object({
152
+ kind: z.enum(skillSourceKinds),
153
+ path: z.string().min(1).optional(),
154
+ url: z.string().min(1).optional(),
155
+ inlineMetadata: jsonRecordSchema.optional(),
156
+ })
157
+ .passthrough();
110
158
  const contextCockpitLevels = ['compact', 'expanded', 'verbose'];
111
159
  const providerChangePlanProviders = ['opencode', 'claude', 'antigravity', 'custom'];
112
160
  const providerChangePlanTypes = ['opencode-mcp-install', 'claude-mcp-install', 'setup', 'install', 'config-preparation'];
@@ -483,6 +531,34 @@ export const VGX_MCP_TOOL_INPUT_SCHEMAS = {
483
531
  scope: z.enum(scopes),
484
532
  })
485
533
  .strict(),
534
+ vgxness_skill_search: z
535
+ .object({
536
+ project: z.string().min(1),
537
+ scope: z.enum(scopes).optional(),
538
+ query: z.string().min(1).optional(),
539
+ status: z.enum(skillVersionStatuses).optional(),
540
+ sourceKind: z.enum(skillSourceKinds).optional(),
541
+ limit: z.number().int().min(1).max(100).optional(),
542
+ })
543
+ .passthrough(),
544
+ vgxness_skill_get: z
545
+ .object({
546
+ project: z.string().min(1),
547
+ scope: z.enum(scopes).optional(),
548
+ id: z.string().min(1).optional(),
549
+ name: z.string().min(1).optional(),
550
+ includeUsage: z.boolean().optional(),
551
+ })
552
+ .passthrough(),
553
+ vgxness_skill_status: z
554
+ .object({
555
+ project: z.string().min(1),
556
+ scope: z.enum(scopes).optional(),
557
+ provider: z.string().min(1).optional(),
558
+ mode: z.enum(agentModes).optional(),
559
+ agent: z.string().min(1).optional(),
560
+ })
561
+ .passthrough(),
486
562
  vgxness_skill_payload: z
487
563
  .object({
488
564
  workspaceRoot: z.string().min(1),
@@ -499,6 +575,183 @@ export const VGX_MCP_TOOL_INPUT_SCHEMAS = {
499
575
  mode: z.enum(payloadModes).optional(),
500
576
  })
501
577
  .passthrough(),
578
+ vgxness_skill_activate: z
579
+ .object({
580
+ project: z.string().min(1),
581
+ scope: z.enum(scopes).optional(),
582
+ skillId: z.string().min(1).optional(),
583
+ name: z.string().min(1).optional(),
584
+ versionId: z.string().min(1).optional(),
585
+ version: z.string().min(1).optional(),
586
+ runId: z.string().min(1).optional(),
587
+ agentId: z.string().min(1).optional(),
588
+ workflow: z.string().min(1).optional(),
589
+ phase: z.string().min(1).optional(),
590
+ providerAdapter: z.string().min(1).optional(),
591
+ intent: jsonRecordSchema.optional(),
592
+ reason: z.string().min(1).optional(),
593
+ workspaceRoot: z.string().min(1).optional(),
594
+ maxSourceBytes: z.number().int().positive().optional(),
595
+ mode: z.enum(payloadModes).optional(),
596
+ })
597
+ .passthrough(),
598
+ vgxness_skill_record_usage: z
599
+ .object({
600
+ skillId: z.string().min(1),
601
+ versionId: z.string().min(1).optional(),
602
+ runId: z.string().min(1).optional(),
603
+ targetType: z.enum(skillAttachmentTargetTypes).optional(),
604
+ targetKey: z.string().min(1).optional(),
605
+ outcome: z.enum(skillUsageOutcomes),
606
+ notes: z.string().min(1).optional(),
607
+ workflow: z.string().min(1).optional(),
608
+ phase: z.string().min(1).optional(),
609
+ providerAdapter: z.string().min(1).optional(),
610
+ agentId: z.string().min(1).optional(),
611
+ intent: jsonRecordSchema.optional(),
612
+ evidence: jsonRecordSchema.optional(),
613
+ })
614
+ .passthrough(),
615
+ vgxness_skill_propose_improvement: z
616
+ .object({
617
+ project: z.string().min(1),
618
+ scope: z.enum(scopes).optional(),
619
+ skillId: z.string().min(1).optional(),
620
+ name: z.string().min(1).optional(),
621
+ baseVersionId: z.string().min(1).optional(),
622
+ baseVersion: z.string().min(1).optional(),
623
+ proposedVersion: z.string().min(1),
624
+ proposedSource: z
625
+ .object({
626
+ kind: z.enum(skillSourceKinds),
627
+ path: z.string().min(1).optional(),
628
+ url: z.string().min(1).optional(),
629
+ inlineMetadata: jsonRecordSchema.optional(),
630
+ })
631
+ .passthrough(),
632
+ proposedCompatibility: jsonRecordSchema.optional(),
633
+ title: z.string().min(1),
634
+ problem: z.string().min(1),
635
+ suggestedChange: z.string().min(1),
636
+ sourceContext: jsonRecordSchema.optional(),
637
+ runId: z.string().min(1).optional(),
638
+ agentId: z.string().min(1).optional(),
639
+ workflow: z.string().min(1).optional(),
640
+ phase: z.string().min(1).optional(),
641
+ providerAdapter: z.string().min(1).optional(),
642
+ evidenceRefs: z.array(z.string().min(1)).optional(),
643
+ evidence: jsonRecordSchema.optional(),
644
+ actor: z.string().min(1).optional(),
645
+ })
646
+ .passthrough(),
647
+ vgxness_skill_list_improvement_proposals: z
648
+ .object({
649
+ project: z.string().min(1),
650
+ scope: z.enum(scopes).optional(),
651
+ skillId: z.string().min(1).optional(),
652
+ name: z.string().min(1).optional(),
653
+ baseVersionId: z.string().min(1).optional(),
654
+ status: z.enum(skillImprovementProposalStatuses).optional(),
655
+ runId: z.string().min(1).optional(),
656
+ agentId: z.string().min(1).optional(),
657
+ limit: z.number().int().min(1).max(100).optional(),
658
+ })
659
+ .passthrough(),
660
+ vgxness_skill_request_evaluation: z
661
+ .object({
662
+ project: z.string().min(1),
663
+ scope: z.enum(scopes).optional(),
664
+ skillId: z.string().min(1).optional(),
665
+ name: z.string().min(1).optional(),
666
+ versionId: z.string().min(1).optional(),
667
+ version: z.string().min(1).optional(),
668
+ scenarioId: z.string().min(1).optional(),
669
+ proposalId: z.string().min(1).optional(),
670
+ requestedBy: z.string().min(1),
671
+ runId: z.string().min(1).optional(),
672
+ agentId: z.string().min(1).optional(),
673
+ workflow: z.string().min(1).optional(),
674
+ phase: z.string().min(1).optional(),
675
+ providerAdapter: z.string().min(1).optional(),
676
+ risk: jsonRecordSchema.optional(),
677
+ preflight: jsonRecordSchema.optional(),
678
+ })
679
+ .passthrough(),
680
+ vgxness_skill_list_evaluations: z
681
+ .object({
682
+ project: z.string().min(1),
683
+ scope: z.enum(scopes).optional(),
684
+ skillId: z.string().min(1).optional(),
685
+ name: z.string().min(1).optional(),
686
+ versionId: z.string().min(1).optional(),
687
+ scenarioId: z.string().min(1).optional(),
688
+ proposalId: z.string().min(1).optional(),
689
+ status: z.enum(skillEvaluationRequestStatuses).optional(),
690
+ runId: z.string().min(1).optional(),
691
+ agentId: z.string().min(1).optional(),
692
+ limit: z.number().int().min(1).max(100).optional(),
693
+ })
694
+ .passthrough(),
695
+ vgxness_skill_get_evaluation: z
696
+ .object({
697
+ project: z.string().min(1),
698
+ scope: z.enum(scopes).optional(),
699
+ id: z.string().min(1),
700
+ })
701
+ .passthrough(),
702
+ vgxness_skill_create_draft: z
703
+ .object({
704
+ project: z.string().min(1),
705
+ scope: z.enum(scopes).optional(),
706
+ name: z.string().min(1),
707
+ description: z.string().min(1),
708
+ version: z.string().min(1),
709
+ source: skillSourceSchema,
710
+ compatibility: jsonRecordSchema.optional(),
711
+ draftParentVersionId: z.string().min(1).optional(),
712
+ actor: skillLifecycleActorSchema,
713
+ reason: z.string().min(1).optional(),
714
+ runId: z.string().min(1).optional(),
715
+ agentId: z.string().min(1).optional(),
716
+ evidence: jsonRecordSchema.optional(),
717
+ governance: jsonRecordSchema.optional(),
718
+ })
719
+ .passthrough(),
720
+ vgxness_skill_update_draft: z
721
+ .object({
722
+ project: z.string().min(1),
723
+ scope: z.enum(scopes).optional(),
724
+ skillId: z.string().min(1).optional(),
725
+ name: z.string().min(1).optional(),
726
+ versionId: z.string().min(1).optional(),
727
+ version: z.string().min(1).optional(),
728
+ source: skillSourceSchema.optional(),
729
+ compatibility: jsonRecordSchema.optional(),
730
+ expectedDraftRevision: z.number().int().positive().optional(),
731
+ actor: skillLifecycleActorSchema,
732
+ reason: z.string().min(1).optional(),
733
+ runId: z.string().min(1).optional(),
734
+ agentId: z.string().min(1).optional(),
735
+ evidence: jsonRecordSchema.optional(),
736
+ governance: jsonRecordSchema.optional(),
737
+ })
738
+ .passthrough(),
739
+ vgxness_skill_publish_version: z
740
+ .object({
741
+ project: z.string().min(1),
742
+ scope: z.enum(scopes).optional(),
743
+ skillId: z.string().min(1).optional(),
744
+ name: z.string().min(1).optional(),
745
+ versionId: z.string().min(1).optional(),
746
+ version: z.string().min(1).optional(),
747
+ actor: skillLifecycleActorSchema,
748
+ reason: z.string().min(1),
749
+ runId: z.string().min(1).optional(),
750
+ agentId: z.string().min(1).optional(),
751
+ evidence: jsonRecordSchema.optional(),
752
+ governance: jsonRecordSchema.optional(),
753
+ })
754
+ .passthrough(),
502
755
  vgxness_opencode_manager_payload: z
503
756
  .object({
504
757
  project: z.string().min(1),
@@ -69,6 +69,12 @@ function descriptionForTool(publicToolName) {
69
69
  return 'Read-only context cockpit for start/resume/recovery; returns latest restorable session plus bounded memory previews without traces, provider config writes, repository writes, runs, artifacts, or session mutations.';
70
70
  if (publicToolName === 'skill_index')
71
71
  return 'Read-only skill registry index for a project and scope; returns SkillIndexOutput without provider config writes, native skill file writes, URL fetches, usage records, startup refresh, or plugin refresh.';
72
+ if (publicToolName === 'skill_create_draft')
73
+ return 'Creates a draft skill version and lifecycle event without publishing, activation, provider config writes, or native skill installation.';
74
+ if (publicToolName === 'skill_update_draft')
75
+ return 'Updates only draft skill versions with optional optimistic revision checking; rejects active, deprecated, or archived version mutation.';
76
+ if (publicToolName === 'skill_publish_version')
77
+ return 'Publishes a draft skill version as active/current with explicit actor and reason; publication is not activation, SDD acceptance, or correctness proof.';
72
78
  if (publicToolName === 'sdd_cockpit')
73
79
  return 'Agent-callable read-only SDD cockpit summary; returns phase metadata/readModel without artifact bodies or state changes and preserves explicit human acceptance semantics. Use it to decide the next safe SDD action or blocker.';
74
80
  if (publicToolName === 'sdd_continue')