opencode-agent-skill 10.0.0 → 11.0.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 (52) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +49 -3
  3. package/bin/ocskill.mjs +330 -5
  4. package/docs/V11-PERCEPTION-ADAPTIVE-EXECUTION.md +75 -0
  5. package/docs/V11-PERCEPTION-ADAPTIVE.md +220 -0
  6. package/evals/router-triggers.json +82 -0
  7. package/evals/routing.json +76 -0
  8. package/evals/v11/tasks.json +122 -0
  9. package/global-config/agents/merge-arbiter.md +12 -0
  10. package/global-config/agents/visual-verifier.md +12 -0
  11. package/global-config/plugins/ues-router/index.js +272 -2
  12. package/global-config/plugins/ues-router/router.js +27 -3
  13. package/global-config/skills/browser-qa/SKILL.md +14 -0
  14. package/global-config/skills/browser-qa/references/workflow.md +11 -0
  15. package/global-config/skills/browser-security/SKILL.md +12 -0
  16. package/global-config/skills/component-visual-testing/SKILL.md +10 -0
  17. package/global-config/skills/design-source/SKILL.md +10 -0
  18. package/global-config/skills/design-source/references/workflow.md +12 -0
  19. package/global-config/skills/dynamic-workflow/SKILL.md +18 -0
  20. package/global-config/skills/dynamic-workflow/references/workflow.md +19 -0
  21. package/global-config/skills/responsive-verification/SKILL.md +10 -0
  22. package/global-config/skills/skill-authoring/SKILL.md +12 -0
  23. package/global-config/skills/skill-evaluation/SKILL.md +17 -0
  24. package/global-config/skills/visual-fidelity/SKILL.md +14 -0
  25. package/global-config/skills/visual-fidelity/references/workflow.md +14 -0
  26. package/lib/browser-adapter.mjs +82 -0
  27. package/lib/browser-runtime.mjs +193 -0
  28. package/lib/capability-registry.mjs +109 -0
  29. package/lib/context-engine-v11.mjs +146 -0
  30. package/lib/context-manifest.mjs +16 -3
  31. package/lib/control-center.mjs +12 -2
  32. package/lib/dynamic-workflow.mjs +179 -0
  33. package/lib/eval-ablation.mjs +43 -1
  34. package/lib/eval-report.mjs +72 -0
  35. package/lib/eval-telemetry.mjs +61 -0
  36. package/lib/evidence-budget.mjs +84 -0
  37. package/lib/evidence-store.mjs +178 -0
  38. package/lib/hermes-bridge.mjs +45 -1
  39. package/lib/model-config.mjs +9 -1
  40. package/lib/model-policy.mjs +52 -1
  41. package/lib/orchestrator-policy.mjs +1 -1
  42. package/lib/png-diff.mjs +229 -0
  43. package/lib/prompt-cache.mjs +60 -0
  44. package/lib/skill-quality.mjs +72 -0
  45. package/lib/task-engine.mjs +78 -4
  46. package/lib/ui-inspector.mjs +152 -0
  47. package/lib/v11-metrics.mjs +64 -0
  48. package/lib/visual-spec.mjs +159 -0
  49. package/package.json +10 -5
  50. package/scripts/eval-ablation.mjs +4 -1
  51. package/scripts/validate-v11-suite.mjs +58 -0
  52. package/scripts/validate.mjs +16 -4
@@ -0,0 +1,58 @@
1
+ import { existsSync } from "node:fs"
2
+ import { readFile } from "node:fs/promises"
3
+ import path from "node:path"
4
+ import { fileURLToPath } from "node:url"
5
+
6
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..")
7
+ const file = path.join(root, "evals", "v11", "tasks.json")
8
+ const suite = JSON.parse(await readFile(file, "utf8"))
9
+ const errors = []
10
+
11
+ const REQUIRED_V11_FILES = [
12
+ "lib/context-engine-v11.mjs",
13
+ "lib/evidence-store.mjs",
14
+ "lib/evidence-budget.mjs",
15
+ "lib/prompt-cache.mjs",
16
+ "lib/capability-registry.mjs",
17
+ "lib/browser-adapter.mjs",
18
+ "lib/browser-runtime.mjs",
19
+ "lib/png-diff.mjs",
20
+ "lib/visual-spec.mjs",
21
+ "lib/dynamic-workflow.mjs",
22
+ "lib/skill-quality.mjs",
23
+ "lib/ui-inspector.mjs",
24
+ "lib/v11-metrics.mjs",
25
+ "global-config/agents/visual-verifier.md",
26
+ "global-config/agents/merge-arbiter.md",
27
+ ]
28
+ for (const relative of REQUIRED_V11_FILES) {
29
+ if (!existsSync(path.join(root, relative))) errors.push("missing V11 runtime file: " + relative)
30
+ }
31
+ const ids = new Set()
32
+ const categories = new Set()
33
+
34
+ if (!Array.isArray(suite.tasks) || suite.tasks.length < 10) errors.push("V11 suite must contain at least 10 tasks")
35
+
36
+ for (const task of suite.tasks || []) {
37
+ if (!task.id || ids.has(task.id)) errors.push("missing/duplicate id: " + (task.id || "<missing>"))
38
+ ids.add(task.id)
39
+ if (!task.category) errors.push((task.id || "<missing>") + ": missing category")
40
+ categories.add(task.category)
41
+ if (!task.objective || task.objective.length < 30) errors.push((task.id || "<missing>") + ": objective is too weak")
42
+ if (!Array.isArray(task.requiredFiles) || !task.requiredFiles.length) errors.push((task.id || "<missing>") + ": requiredFiles missing")
43
+ for (const relative of task.requiredFiles || []) {
44
+ if (!existsSync(path.join(root, relative))) errors.push((task.id || "<missing>") + ": missing required file " + relative)
45
+ }
46
+ }
47
+
48
+ for (const category of ["context","routing","visual","browser","workflow","sidecar"]) {
49
+ if (!categories.has(category)) errors.push("V11 suite missing category: " + category)
50
+ }
51
+
52
+ if (errors.length) {
53
+ console.error("V11 suite validation failed:")
54
+ for (const error of errors) console.error("- " + error)
55
+ process.exit(1)
56
+ }
57
+
58
+ console.log("Validated " + suite.tasks.length + " V11 contract tasks across " + categories.size + " categories and " + REQUIRED_V11_FILES.length + " required runtime files.")
@@ -87,9 +87,12 @@ for (const entry of await readdir(agentsRoot, { withFileTypes: true })) {
87
87
  if (!/mode:\s*subagent/.test(source)) errors.push(`${entry.name}: agent must use mode: subagent`)
88
88
  }
89
89
 
90
- if (ids.size < 39) errors.push(`expected at least 39 skills, found ${ids.size}`)
90
+ const V11_REQUIRED_SKILLS = ["visual-fidelity","browser-qa","design-source","responsive-verification","component-visual-testing","browser-security","skill-authoring","skill-evaluation","dynamic-workflow"]
91
+ for (const id of V11_REQUIRED_SKILLS) if (!ids.has(id)) errors.push(`missing V11 skill ${id}`)
92
+
93
+ if (ids.size < 48) errors.push(`expected at least 48 skills for V11, found ${ids.size}`)
91
94
  if (commands < 11) errors.push(`expected at least 11 commands, found ${commands}`)
92
- if (agents < 10) errors.push(`expected at least 10 subagents, found ${agents}`)
95
+ if (agents < 12) errors.push(`expected at least 12 subagents for V11, found ${agents}`)
93
96
 
94
97
  const routerIndex = path.join(pluginsRoot, "ues-router", "index.js")
95
98
  const routerCore = path.join(pluginsRoot, "ues-router", "router.js")
@@ -115,6 +118,15 @@ if (existsSync(routerIndex)) {
115
118
  if (!source.includes('name: "task_policy"')) errors.push("v8 router plugin must expose adaptive task policy")
116
119
  if (!source.includes('name: "cancel_task"')) errors.push("v8 router plugin must expose executor cancellation")
117
120
  if (!source.includes('name: "recover_task"')) errors.push("v8 router plugin must expose task-scoped recovery")
121
+ if (!source.includes('name: "capability_requirements"')) errors.push("v11 router plugin must expose capability requirements")
122
+ if (!source.includes('name: "evidence_get"')) errors.push("v11 router plugin must expose bounded evidence retrieval")
123
+ if (!source.includes('name: "browser_plan"')) errors.push("v11 router plugin must expose browser verification planning")
124
+ if (!source.includes('name: "browser_inspect"')) errors.push("v11 router plugin must expose bounded browser inspection")
125
+ if (!source.includes('name: "visual_geometry"')) errors.push("v11 router plugin must expose visual geometry receipts")
126
+ if (!source.includes('name: "visual_compare"')) errors.push("v11 router plugin must expose deterministic PNG comparison")
127
+ if (!source.includes('name: "workflow_plan"')) errors.push("v11 router plugin must expose dynamic workflow planning")
128
+ if (!source.includes('name: "ui_tokens"')) errors.push("v11 router plugin must expose compact design-token extraction")
129
+ if (!source.includes('name: "ui_layout"')) errors.push("v11 router plugin must expose responsive UI layout verification")
118
130
  if (!source.includes("ctx.session.interrupt")) errors.push("v8 task dispatch must interrupt timed-out executors")
119
131
  if (!source.includes('"work", "heartbeat"')) errors.push("v8 task dispatch must refresh task leases")
120
132
  }
@@ -138,11 +150,11 @@ if (existsSync(plainInstallSmoke)) {
138
150
  }
139
151
  }
140
152
 
141
- for (const name of ["process-runner.mjs","evidence-receipt.mjs","gate-receipt.mjs","runtime-events.mjs","context-manifest.mjs","orchestrator-policy.mjs","worktree-sandbox.mjs","learning-engine.mjs","hermes-bridge.mjs","control-center.mjs"]) {
153
+ for (const name of ["process-runner.mjs","evidence-receipt.mjs","gate-receipt.mjs","runtime-events.mjs","context-manifest.mjs","orchestrator-policy.mjs","worktree-sandbox.mjs","learning-engine.mjs","hermes-bridge.mjs","control-center.mjs","evidence-store.mjs","evidence-budget.mjs","prompt-cache.mjs","capability-registry.mjs","visual-spec.mjs","png-diff.mjs","browser-adapter.mjs","browser-runtime.mjs","dynamic-workflow.mjs","skill-quality.mjs","ui-inspector.mjs","context-engine-v11.mjs","v11-metrics.mjs"]) {
142
154
  if (!existsSync(path.join(root, "lib", name))) errors.push(`missing V8 core module ${name}`)
143
155
  }
144
156
 
145
- for (const name of ["codebase-mapper.md","plan-checker.md","executor.md","integration-verifier.md"]) {
157
+ for (const name of ["codebase-mapper.md","plan-checker.md","executor.md","integration-verifier.md","visual-verifier.md","merge-arbiter.md"]) {
146
158
  if (!existsSync(path.join(agentsRoot, name))) errors.push(`missing V6 subagent ${name}`)
147
159
  }
148
160