@osovv/vv-opencode 1.1.6 → 1.2.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/CHANGELOG.md +33 -0
- package/README.md +59 -2
- package/dist/commands/completion.js +1 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +7 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/patch-provider.d.ts +4 -4
- package/dist/commands/patch-provider.js +7 -6
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/commands/plugin-list.js +1 -1
- package/dist/commands/plugin-list.js.map +1 -1
- package/dist/commands/plugin-toggle.js +1 -1
- package/dist/commands/plugin-toggle.js.map +1 -1
- package/dist/commands/preset.js +1 -0
- package/dist/commands/preset.js.map +1 -1
- package/dist/commands/role.js +1 -1
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/sync.js +7 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/upgrade.js +1 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-models.js +1 -1
- package/dist/lib/agent-models.js.map +1 -1
- package/dist/lib/managed-agents.js +1 -1
- package/dist/lib/managed-agents.js.map +1 -1
- package/dist/lib/managed-skills.js +1 -1
- package/dist/lib/managed-skills.js.map +1 -1
- package/dist/lib/model-roles.js +1 -1
- package/dist/lib/model-roles.js.map +1 -1
- package/dist/lib/opencode.js +22 -7
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/orchestration.js +4 -2
- package/dist/lib/orchestration.js.map +1 -1
- package/dist/lib/plugin-toggle-config.d.ts +1 -1
- package/dist/lib/plugin-toggle-config.js +4 -2
- package/dist/lib/plugin-toggle-config.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +93 -0
- package/dist/lib/vvoc-config.js +87 -2
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/lib/vvoc-paths.js +2 -3
- package/dist/lib/vvoc-paths.js.map +1 -1
- package/dist/lib/vvoc-preset-registry.js +1 -1
- package/dist/lib/vvoc-preset-registry.js.map +1 -1
- package/dist/plugins/guardian/index.js +44 -6
- package/dist/plugins/guardian/index.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-text-normalization.js +6 -5
- package/dist/plugins/hashline-edit/edit-text-normalization.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js +16 -7
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/hashline-edit/tool-description.d.ts +1 -1
- package/dist/plugins/hashline-edit/tool-description.js +3 -2
- package/dist/plugins/hashline-edit/tool-description.js.map +1 -1
- package/dist/plugins/secrets-redaction/config.d.ts +6 -1
- package/dist/plugins/secrets-redaction/config.js +30 -5
- package/dist/plugins/secrets-redaction/config.js.map +1 -1
- package/dist/plugins/secrets-redaction/deep.js +1 -1
- package/dist/plugins/secrets-redaction/deep.js.map +1 -1
- package/dist/plugins/secrets-redaction/engine.js +10 -4
- package/dist/plugins/secrets-redaction/engine.js.map +1 -1
- package/dist/plugins/secrets-redaction/index.js +14 -21
- package/dist/plugins/secrets-redaction/index.js.map +1 -1
- package/dist/plugins/secrets-redaction/patterns.js +4 -4
- package/dist/plugins/secrets-redaction/patterns.js.map +1 -1
- package/dist/plugins/secrets-redaction/restore.js +1 -1
- package/dist/plugins/secrets-redaction/restore.js.map +1 -1
- package/dist/plugins/secrets-redaction/session.js +1 -2
- package/dist/plugins/secrets-redaction/session.js.map +1 -1
- package/dist/plugins/web-tools/config.d.ts +43 -0
- package/dist/plugins/web-tools/config.js +134 -0
- package/dist/plugins/web-tools/config.js.map +1 -0
- package/dist/plugins/web-tools/fetch-service.d.ts +14 -0
- package/dist/plugins/web-tools/fetch-service.js +169 -0
- package/dist/plugins/web-tools/fetch-service.js.map +1 -0
- package/dist/plugins/web-tools/html-markdown.d.ts +13 -0
- package/dist/plugins/web-tools/html-markdown.js +82 -0
- package/dist/plugins/web-tools/html-markdown.js.map +1 -0
- package/dist/plugins/web-tools/http.d.ts +34 -0
- package/dist/plugins/web-tools/http.js +154 -0
- package/dist/plugins/web-tools/http.js.map +1 -0
- package/dist/plugins/web-tools/index.d.ts +18 -0
- package/dist/plugins/web-tools/index.js +93 -0
- package/dist/plugins/web-tools/index.js.map +1 -0
- package/dist/plugins/web-tools/media-loader.d.ts +26 -0
- package/dist/plugins/web-tools/media-loader.js +178 -0
- package/dist/plugins/web-tools/media-loader.js.map +1 -0
- package/dist/plugins/web-tools/providers/brave.d.ts +3 -0
- package/dist/plugins/web-tools/providers/brave.js +101 -0
- package/dist/plugins/web-tools/providers/brave.js.map +1 -0
- package/dist/plugins/web-tools/providers/exa.d.ts +28 -0
- package/dist/plugins/web-tools/providers/exa.js +138 -0
- package/dist/plugins/web-tools/providers/exa.js.map +1 -0
- package/dist/plugins/web-tools/providers/native-fetch.d.ts +21 -0
- package/dist/plugins/web-tools/providers/native-fetch.js +112 -0
- package/dist/plugins/web-tools/providers/native-fetch.js.map +1 -0
- package/dist/plugins/web-tools/providers/spider.d.ts +25 -0
- package/dist/plugins/web-tools/providers/spider.js +104 -0
- package/dist/plugins/web-tools/providers/spider.js.map +1 -0
- package/dist/plugins/web-tools/providers/zai.d.ts +33 -0
- package/dist/plugins/web-tools/providers/zai.js +181 -0
- package/dist/plugins/web-tools/providers/zai.js.map +1 -0
- package/dist/plugins/web-tools/search-service.d.ts +18 -0
- package/dist/plugins/web-tools/search-service.js +110 -0
- package/dist/plugins/web-tools/search-service.js.map +1 -0
- package/dist/plugins/workflow/index.js +24 -5
- package/dist/plugins/workflow/index.js.map +1 -1
- package/dist/plugins/workflow/persistence.js +1 -1
- package/dist/plugins/workflow/persistence.js.map +1 -1
- package/dist/plugins/workflow/state.d.ts +14 -0
- package/dist/plugins/workflow/state.js +44 -1
- package/dist/plugins/workflow/state.js.map +1 -1
- package/dist/plugins/workflow/tooling.js +1 -1
- package/dist/plugins/workflow/tooling.js.map +1 -1
- package/dist/tui/context/analyze.js +11 -3
- package/dist/tui/context/analyze.js.map +1 -1
- package/dist/tui/context/collect.js +1 -1
- package/dist/tui/context/collect.js.map +1 -1
- package/dist/tui/context/plugin.js +3 -2
- package/dist/tui/context/plugin.js.map +1 -1
- package/dist/tui.js +1 -1
- package/package.json +15 -8
- package/schemas/vvoc/v3.json +43 -1
- 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
|
|
3
|
+
"version": "1.2.1",
|
|
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
|
-
"
|
|
99
|
+
"htmlparser2": "^12.0.0",
|
|
100
|
+
"jsonc-parser": "3.3.1",
|
|
101
|
+
"turndown": "^7.2.4"
|
|
96
102
|
},
|
|
97
103
|
"devDependencies": {
|
|
98
|
-
"@
|
|
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",
|
package/schemas/vvoc/v3.json
CHANGED
|
@@ -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
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.2.1/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
|
-
|
|
186
|
-
If verification
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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>
|