@osovv/vv-opencode 1.1.5 → 1.2.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +72 -9
  3. package/dist/commands/completion.js +1 -1
  4. package/dist/commands/completion.js.map +1 -1
  5. package/dist/commands/init.js +1 -1
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/install.js +7 -2
  8. package/dist/commands/install.js.map +1 -1
  9. package/dist/commands/patch-provider.d.ts +4 -4
  10. package/dist/commands/patch-provider.js +7 -6
  11. package/dist/commands/patch-provider.js.map +1 -1
  12. package/dist/commands/plugin-list.js +1 -1
  13. package/dist/commands/plugin-list.js.map +1 -1
  14. package/dist/commands/plugin-toggle.js +1 -1
  15. package/dist/commands/plugin-toggle.js.map +1 -1
  16. package/dist/commands/preset.js +1 -0
  17. package/dist/commands/preset.js.map +1 -1
  18. package/dist/commands/role.js +1 -1
  19. package/dist/commands/role.js.map +1 -1
  20. package/dist/commands/sync.js +7 -2
  21. package/dist/commands/sync.js.map +1 -1
  22. package/dist/commands/upgrade.js +1 -1
  23. package/dist/commands/upgrade.js.map +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.js +7 -5
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/agent-models.js +1 -1
  28. package/dist/lib/agent-models.js.map +1 -1
  29. package/dist/lib/managed-agents.js +1 -1
  30. package/dist/lib/managed-agents.js.map +1 -1
  31. package/dist/lib/managed-skills.js +1 -1
  32. package/dist/lib/managed-skills.js.map +1 -1
  33. package/dist/lib/model-roles.js +1 -1
  34. package/dist/lib/model-roles.js.map +1 -1
  35. package/dist/lib/opencode.js +22 -7
  36. package/dist/lib/opencode.js.map +1 -1
  37. package/dist/lib/orchestration.js +4 -2
  38. package/dist/lib/orchestration.js.map +1 -1
  39. package/dist/lib/plugin-toggle-config.d.ts +1 -1
  40. package/dist/lib/plugin-toggle-config.js +4 -2
  41. package/dist/lib/plugin-toggle-config.js.map +1 -1
  42. package/dist/lib/vvoc-config.d.ts +93 -0
  43. package/dist/lib/vvoc-config.js +87 -2
  44. package/dist/lib/vvoc-config.js.map +1 -1
  45. package/dist/lib/vvoc-preset-registry.js +1 -1
  46. package/dist/lib/vvoc-preset-registry.js.map +1 -1
  47. package/dist/plugins/guardian/index.js +44 -6
  48. package/dist/plugins/guardian/index.js.map +1 -1
  49. package/dist/plugins/hashline-edit/edit-text-normalization.js +6 -5
  50. package/dist/plugins/hashline-edit/edit-text-normalization.js.map +1 -1
  51. package/dist/plugins/hashline-edit/index.js +16 -7
  52. package/dist/plugins/hashline-edit/index.js.map +1 -1
  53. package/dist/plugins/hashline-edit/tool-description.d.ts +1 -1
  54. package/dist/plugins/hashline-edit/tool-description.js +3 -2
  55. package/dist/plugins/hashline-edit/tool-description.js.map +1 -1
  56. package/dist/plugins/secrets-redaction/config.d.ts +6 -1
  57. package/dist/plugins/secrets-redaction/config.js +29 -4
  58. package/dist/plugins/secrets-redaction/config.js.map +1 -1
  59. package/dist/plugins/secrets-redaction/engine.js +10 -4
  60. package/dist/plugins/secrets-redaction/engine.js.map +1 -1
  61. package/dist/plugins/secrets-redaction/index.js +14 -21
  62. package/dist/plugins/secrets-redaction/index.js.map +1 -1
  63. package/dist/plugins/secrets-redaction/patterns.js +3 -3
  64. package/dist/plugins/secrets-redaction/patterns.js.map +1 -1
  65. package/dist/plugins/secrets-redaction/session.js +0 -1
  66. package/dist/plugins/secrets-redaction/session.js.map +1 -1
  67. package/dist/plugins/web-tools/config.d.ts +43 -0
  68. package/dist/plugins/web-tools/config.js +134 -0
  69. package/dist/plugins/web-tools/config.js.map +1 -0
  70. package/dist/plugins/web-tools/fetch-service.d.ts +14 -0
  71. package/dist/plugins/web-tools/fetch-service.js +166 -0
  72. package/dist/plugins/web-tools/fetch-service.js.map +1 -0
  73. package/dist/plugins/web-tools/html-markdown.d.ts +13 -0
  74. package/dist/plugins/web-tools/html-markdown.js +82 -0
  75. package/dist/plugins/web-tools/html-markdown.js.map +1 -0
  76. package/dist/plugins/web-tools/http.d.ts +34 -0
  77. package/dist/plugins/web-tools/http.js +154 -0
  78. package/dist/plugins/web-tools/http.js.map +1 -0
  79. package/dist/plugins/web-tools/index.d.ts +18 -0
  80. package/dist/plugins/web-tools/index.js +93 -0
  81. package/dist/plugins/web-tools/index.js.map +1 -0
  82. package/dist/plugins/web-tools/media-loader.d.ts +26 -0
  83. package/dist/plugins/web-tools/media-loader.js +178 -0
  84. package/dist/plugins/web-tools/media-loader.js.map +1 -0
  85. package/dist/plugins/web-tools/providers/brave.d.ts +3 -0
  86. package/dist/plugins/web-tools/providers/brave.js +101 -0
  87. package/dist/plugins/web-tools/providers/brave.js.map +1 -0
  88. package/dist/plugins/web-tools/providers/exa.d.ts +28 -0
  89. package/dist/plugins/web-tools/providers/exa.js +138 -0
  90. package/dist/plugins/web-tools/providers/exa.js.map +1 -0
  91. package/dist/plugins/web-tools/providers/native-fetch.d.ts +21 -0
  92. package/dist/plugins/web-tools/providers/native-fetch.js +112 -0
  93. package/dist/plugins/web-tools/providers/native-fetch.js.map +1 -0
  94. package/dist/plugins/web-tools/providers/spider.d.ts +25 -0
  95. package/dist/plugins/web-tools/providers/spider.js +104 -0
  96. package/dist/plugins/web-tools/providers/spider.js.map +1 -0
  97. package/dist/plugins/web-tools/providers/zai.d.ts +33 -0
  98. package/dist/plugins/web-tools/providers/zai.js +181 -0
  99. package/dist/plugins/web-tools/providers/zai.js.map +1 -0
  100. package/dist/plugins/web-tools/search-service.d.ts +18 -0
  101. package/dist/plugins/web-tools/search-service.js +110 -0
  102. package/dist/plugins/web-tools/search-service.js.map +1 -0
  103. package/dist/plugins/workflow/index.js +24 -5
  104. package/dist/plugins/workflow/index.js.map +1 -1
  105. package/dist/plugins/workflow/persistence.js +1 -1
  106. package/dist/plugins/workflow/persistence.js.map +1 -1
  107. package/dist/plugins/workflow/state.d.ts +14 -0
  108. package/dist/plugins/workflow/state.js +44 -1
  109. package/dist/plugins/workflow/state.js.map +1 -1
  110. package/dist/plugins/workflow/tooling.js +1 -1
  111. package/dist/plugins/workflow/tooling.js.map +1 -1
  112. package/dist/tui/context/analyze.js +11 -3
  113. package/dist/tui/context/analyze.js.map +1 -1
  114. package/dist/tui/context/collect.js +1 -1
  115. package/dist/tui/context/collect.js.map +1 -1
  116. package/dist/tui/context/plugin.js +3 -2
  117. package/dist/tui/context/plugin.js.map +1 -1
  118. package/dist/tui.js +1 -1
  119. package/package.json +15 -8
  120. package/schemas/vvoc/v3.json +43 -1
  121. package/templates/skills/vv-execute/SKILL.md +17 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osovv/vv-opencode",
3
- "version": "1.1.5",
3
+ "version": "1.2.0",
4
4
  "description": "A curated, opinionated set of OpenCode plugins for spec-first, review-driven, safer agentic development.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -69,6 +69,10 @@
69
69
  "./plugins/secrets-redaction": {
70
70
  "types": "./dist/plugins/secrets-redaction/index.d.ts",
71
71
  "import": "./dist/plugins/secrets-redaction/index.js"
72
+ },
73
+ "./plugins/web-tools": {
74
+ "types": "./dist/plugins/web-tools/index.d.ts",
75
+ "import": "./dist/plugins/web-tools/index.js"
72
76
  }
73
77
  },
74
78
  "scripts": {
@@ -80,7 +84,7 @@
80
84
  "fmt:check": "oxfmt --check src",
81
85
  "test": "bun test",
82
86
  "check": "bun run typecheck && bun run lint && bun run fmt:check && bun test",
83
- "pack:check": "bun run build && bun -e \"const root = await import('./dist/index.js'); if (!('GuardianPlugin' in root)) throw new Error('dist root export missing GuardianPlugin'); if (!('HashlineEditPlugin' in root)) throw new Error('dist root export missing HashlineEditPlugin'); if (!('ModelRolesPlugin' in root)) throw new Error('dist root export missing ModelRolesPlugin'); if (!('SystemContextInjectionPlugin' in root)) throw new Error('dist root export missing SystemContextInjectionPlugin'); if (!('WorkflowPlugin' in root)) throw new Error('dist root export missing WorkflowPlugin'); if (!('SecretsRedactionPlugin' in root)) throw new Error('dist root export missing SecretsRedactionPlugin'); const tui = await import('./dist/tui.js'); if (!tui.default || typeof tui.default.tui !== 'function') throw new Error('dist TUI export missing default tui module'); await import('./dist/plugins/guardian/index.js'); await import('./dist/plugins/hashline-edit/index.js'); await import('./dist/plugins/model-roles/index.js'); await import('./dist/plugins/system-context-injection/index.js'); await import('./dist/plugins/workflow/index.js'); await import('./dist/plugins/secrets-redaction/index.js')\" && npm pack --dry-run",
87
+ "pack:check": "bun run build && bun -e \"const root = await import('./dist/index.js'); if (!('GuardianPlugin' in root)) throw new Error('dist root export missing GuardianPlugin'); if (!('HashlineEditPlugin' in root)) throw new Error('dist root export missing HashlineEditPlugin'); if (!('ModelRolesPlugin' in root)) throw new Error('dist root export missing ModelRolesPlugin'); if (!('SystemContextInjectionPlugin' in root)) throw new Error('dist root export missing SystemContextInjectionPlugin'); if (!('WorkflowPlugin' in root)) throw new Error('dist root export missing WorkflowPlugin'); if (!('SecretsRedactionPlugin' in root)) throw new Error('dist root export missing SecretsRedactionPlugin'); if (!('WebToolsPlugin' in root)) throw new Error('dist root export missing WebToolsPlugin'); const tui = await import('./dist/tui.js'); if (!tui.default || typeof tui.default.tui !== 'function') throw new Error('dist TUI export missing default tui module'); await import('./dist/plugins/guardian/index.js'); await import('./dist/plugins/hashline-edit/index.js'); await import('./dist/plugins/model-roles/index.js'); await import('./dist/plugins/system-context-injection/index.js'); await import('./dist/plugins/workflow/index.js'); await import('./dist/plugins/secrets-redaction/index.js'); await import('./dist/plugins/web-tools/index.js')\" && npm pack --dry-run",
84
88
  "tui:local": "bun scripts/tui-local.ts",
85
89
  "release:check": "bun scripts/release-check.ts",
86
90
  "release:bump": "bun scripts/release-bump.ts",
@@ -92,22 +96,25 @@
92
96
  "@opencode-ai/sdk": "1.18.2",
93
97
  "ajv": "^8.17.1",
94
98
  "citty": "0.2.2",
95
- "jsonc-parser": "3.3.1"
99
+ "htmlparser2": "^12.0.0",
100
+ "jsonc-parser": "3.3.1",
101
+ "turndown": "^7.2.4"
96
102
  },
97
103
  "devDependencies": {
98
- "@types/node": "22.13.9",
104
+ "@commitlint/cli": "^19.0.0",
105
+ "@commitlint/config-conventional": "^19.0.0",
99
106
  "@opentui/core": "0.4.3",
100
107
  "@opentui/keymap": "0.4.3",
101
108
  "@opentui/solid": "0.4.3",
109
+ "@types/node": "22.13.9",
110
+ "@types/turndown": "^5.0.6",
102
111
  "bun-types": "1.3.11",
112
+ "conventional-changelog-cli": "^5.0.0",
103
113
  "lefthook": "2.1.5",
104
114
  "oxfmt": "0.43.0",
105
115
  "oxlint": "1.58.0",
106
116
  "solid-js": "1.9.12",
107
- "typescript": "5.8.2",
108
- "conventional-changelog-cli": "^5.0.0",
109
- "@commitlint/cli": "^19.0.0",
110
- "@commitlint/config-conventional": "^19.0.0"
117
+ "typescript": "5.8.2"
111
118
  },
112
119
  "peerDependencies": {
113
120
  "@opentui/core": ">=0.4.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.1.5/schemas/vvoc/v3.json",
3
+ "$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.2.0/schemas/vvoc/v3.json",
4
4
  "title": "vvoc config",
5
5
  "description": "Canonical vvoc configuration document.",
6
6
  "type": "object",
@@ -138,6 +138,48 @@
138
138
  "additionalProperties": {
139
139
  "type": "boolean"
140
140
  }
141
+ },
142
+ "web": {
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "properties": {
146
+ "search": {
147
+ "type": "object",
148
+ "additionalProperties": false,
149
+ "properties": {
150
+ "provider": { "type": "string", "enum": ["exa", "brave", "zai"] },
151
+ "region": { "type": "string", "enum": ["international", "china"] },
152
+ "apiKey": { "type": "string", "minLength": 1 }
153
+ },
154
+ "allOf": [
155
+ {
156
+ "if": {
157
+ "properties": { "provider": { "const": "zai" } },
158
+ "required": ["provider"]
159
+ },
160
+ "then": { "required": ["region"] }
161
+ }
162
+ ]
163
+ },
164
+ "fetch": {
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "properties": {
168
+ "provider": { "type": "string", "enum": ["native", "spider", "zai"] },
169
+ "region": { "type": "string", "enum": ["international", "china"] },
170
+ "apiKey": { "type": "string", "minLength": 1 }
171
+ },
172
+ "allOf": [
173
+ {
174
+ "if": {
175
+ "properties": { "provider": { "const": "zai" } },
176
+ "required": ["provider"]
177
+ },
178
+ "then": { "required": ["region"] }
179
+ }
180
+ ]
181
+ }
182
+ }
141
183
  }
142
184
  }
143
185
  }
@@ -182,22 +182,17 @@ The implementer writes code, runs tests, and returns a status. This controller v
182
182
  <step name="handle-status">
183
183
  <case name="done">
184
184
  Implementer returned DONE. Use task-file to verify files exist. Run the test command from the plan (if specified). Verify each acceptance criterion.
185
- Optionally dispatch vv-spec-reviewer to confirm contract compliance.
186
- If verification fails: re-dispatch implementer with failure details.
187
- If verification passes: proceed to close.
185
+ If verification fails: re-dispatch implementer with failure details (the work item is still awaiting implementation).
186
+ If verification passes: proceed to the review step.
188
187
  </case>
189
188
  <case name="done-with-concerns">
190
- Read the concerns before proceeding. If concerns are about correctness or scope, address them by updating the packet and re-dispatching. If they are observations (e.g. "file is getting large"), note them and proceed with verification as DONE.
189
+ Read the concerns before proceeding. If concerns are about correctness or scope, address them by updating the packet and re-dispatching the implementer. If they are observations (e.g. "file is getting large"), note them and proceed with verification as DONE, then to the review step.
191
190
  </case>
192
191
  <case name="needs-context">
193
- The implementer lacked context. Provide the missing information in a revised packet and re-dispatch the SAME implementer type. Do not force them to proceed without the missing context.
192
+ NEEDS_CONTEXT is a hard stop. The runtime will not allow another tracked launch for this work item, so do NOT re-dispatch the implementer. Surface the preserved context (work_item_list shows the captured excerpt) to the user and require an explicit recovery decision — typically open a fresh work item with the missing context supplied.
194
193
  </case>
195
194
  <case name="blocked">
196
- The implementer cannot complete the task. Assess:
197
- 1. Context problem → provide more context, re-dispatch
198
- 2. Task too complex for chosen model → re-dispatch with smarter model
199
- 3. Plan is wrong → escalate to the user
200
- Never force the same model to retry without changes. If the implementer said it is stuck, something needs to change.
195
+ BLOCKED is a hard stop. The runtime will not allow another tracked launch for this work item, so do NOT re-dispatch the implementer. Escalate to the user with the captured blocker context and ask for a decision (a different approach, a different model via a fresh work item, or a plan change).
201
196
  </case>
202
197
  </step>
203
198
 
@@ -207,10 +202,20 @@ Run the acceptance criteria. For each criterion:
207
202
  - Does the test pass?
208
203
  - Did the implementer miss any edge cases?
209
204
 
210
- If all criteria pass → proceed to commit.
205
+ If all criteria pass → proceed to review.
211
206
  If criteria fail → re-dispatch implementer with specific failure details.
212
207
  </step>
213
208
 
209
+ <step name="review">
210
+ A DONE implementer moves the work item to awaiting_reviews with a review round that requires EVERY role in requiredReviewers (spec and code). Dispatch and collect ALL required reviewers before closing:
211
+ - Dispatch vv-spec-reviewer with the VVOC_WORK_ITEM_ID header and a spec-compliance packet.
212
+ - Dispatch vv-code-reviewer with the VVOC_WORK_ITEM_ID header and the changed code/diff.
213
+ Collect both results.
214
+ - Both PASS → the work item becomes ready_to_close → proceed to commit.
215
+ - Any FAIL → the work item returns to awaiting_implementer. Re-dispatch the implementer with the normalized reviewer findings, then repeat handle-status → verify → review (bounded by the runtime review-round limit).
216
+ A reviewer returning NEEDS_CONTEXT is a hard stop: surface it to the user instead of re-dispatching.
217
+ </step>
218
+
214
219
  <step name="commit">
215
220
  After all acceptance criteria pass, commit the task's changes to git.
216
221
  All changed files (new, modified, deleted) from the task must be committed together.
@@ -236,7 +241,7 @@ If the commit fails (e.g. nothing to commit, hook rejection), report the failure
236
241
  </step>
237
242
 
238
243
  <step name="close">
239
- The task's changes are already committed. Mark the task complete in TodoWrite. Close the work item with work_item_close.
244
+ The task's changes are committed and all required reviewers passed, so the work item is ready_to_close. Mark the task complete in TodoWrite. Close the work item with work_item_close.
240
245
  If all tasks are done → proceed to completion.
241
246
  Otherwise → move to the next task in dependency order.
242
247
  </step>