opencode-agent-skill 10.0.0 → 12.0.0-beta.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/CHANGELOG.md +85 -0
- package/README.md +60 -8
- package/bin/ocskill.mjs +354 -6
- package/docs/DETERMINISTIC-TOOLS.md +1 -1
- package/docs/ENGINEERING-DESIGN.md +4 -4
- package/docs/EVALS.md +3 -3
- package/docs/GITHUB-RULESET.md +50 -0
- package/docs/NPM-PUBLISH.md +4 -4
- package/docs/OPENCODE-COMPAT.md +3 -3
- package/docs/TRACE-SCHEMA.md +1 -1
- package/docs/V11-PERCEPTION-ADAPTIVE-EXECUTION.md +75 -0
- package/docs/V11-PERCEPTION-ADAPTIVE.md +220 -0
- package/docs/V12-WEAK-MODEL-INTELLIGENCE.md +27 -0
- package/evals/repo-scale/tasks.json +62 -0
- package/evals/router-triggers.json +82 -0
- package/evals/routing.json +76 -0
- package/evals/v11/tasks.json +122 -0
- package/global-config/agents/merge-arbiter.md +12 -0
- package/global-config/agents/visual-verifier.md +12 -0
- package/global-config/plugins/ues-router/index.js +272 -2
- package/global-config/plugins/ues-router/router.js +27 -3
- package/global-config/skills/browser-qa/SKILL.md +14 -0
- package/global-config/skills/browser-qa/references/workflow.md +11 -0
- package/global-config/skills/browser-security/SKILL.md +12 -0
- package/global-config/skills/component-visual-testing/SKILL.md +10 -0
- package/global-config/skills/design-source/SKILL.md +10 -0
- package/global-config/skills/design-source/references/workflow.md +12 -0
- package/global-config/skills/dynamic-workflow/SKILL.md +18 -0
- package/global-config/skills/dynamic-workflow/references/workflow.md +19 -0
- package/global-config/skills/responsive-verification/SKILL.md +10 -0
- package/global-config/skills/skill-authoring/SKILL.md +12 -0
- package/global-config/skills/skill-evaluation/SKILL.md +17 -0
- package/global-config/skills/visual-fidelity/SKILL.md +14 -0
- package/global-config/skills/visual-fidelity/references/workflow.md +14 -0
- package/lib/browser-adapter.mjs +82 -0
- package/lib/browser-runtime.mjs +193 -0
- package/lib/capability-registry.mjs +109 -0
- package/lib/context-engine-v11.mjs +150 -0
- package/lib/context-manifest.mjs +16 -3
- package/lib/context-quality.mjs +59 -0
- package/lib/control-center.mjs +12 -2
- package/lib/decision-policy.mjs +23 -0
- package/lib/dynamic-workflow.mjs +179 -0
- package/lib/eval-ablation.mjs +43 -1
- package/lib/eval-report.mjs +72 -0
- package/lib/eval-telemetry.mjs +61 -0
- package/lib/evidence-budget.mjs +84 -0
- package/lib/evidence-store.mjs +178 -0
- package/lib/hermes-bridge.mjs +45 -1
- package/lib/model-config.mjs +21 -1
- package/lib/model-performance.mjs +113 -0
- package/lib/model-policy.mjs +59 -1
- package/lib/orchestrator-policy.mjs +1 -1
- package/lib/png-diff.mjs +229 -0
- package/lib/prompt-cache.mjs +60 -0
- package/lib/repo-scale-fixture.mjs +45 -0
- package/lib/skill-quality.mjs +72 -0
- package/lib/task-engine.mjs +95 -7
- package/lib/ui-inspector.mjs +152 -0
- package/lib/v11-metrics.mjs +64 -0
- package/lib/visual-spec.mjs +159 -0
- package/lib/work-plan-scope.mjs +49 -0
- package/package.json +13 -5
- package/scripts/check-release-consistency.mjs +228 -0
- package/scripts/eval-ablation.mjs +4 -1
- package/scripts/validate-repo-scale-suite.mjs +27 -0
- package/scripts/validate-v11-suite.mjs +58 -0
- package/scripts/validate-v12-foundation.mjs +24 -0
- package/scripts/validate.mjs +16 -4
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,91 @@ The project follows Semantic Versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [12.0.0-beta.0] - 2026-09-22
|
|
10
|
+
|
|
11
|
+
### Beta
|
|
12
|
+
- Added empirical per-task-class model performance history and capability-preserving reranking with a minimum evidence threshold before reranking.
|
|
13
|
+
- Added context quality receipts for required-file recall and irrelevant-context ratio.
|
|
14
|
+
- Added hash-keyed plan snapshots with active-plan execution fencing.
|
|
15
|
+
- Added bounded decision policy for reversible local rulings versus human-gated destructive/external actions.
|
|
16
|
+
- Added deterministic repo-scale benchmark fixture generation and V12/repo-scale validation gates.
|
|
17
|
+
- Hardened release consistency checks to derive eval counts and validate aggregate workflow structure.
|
|
18
|
+
- Fixed missing empirical-history handling so models without benchmark history safely fall back to static capability routing.
|
|
19
|
+
|
|
20
|
+
### Verified locally on Windows
|
|
21
|
+
- 255 tests total: 253 passed, 0 failed, 2 platform-specific skips.
|
|
22
|
+
- Syntax, catalog validation, docs consistency, routing, V11/V12/repo-scale/live/long/polyglot validation: PASS.
|
|
23
|
+
- npm pack, packed-install smoke and plain one-command install/resource auto-sync smoke: PASS.
|
|
24
|
+
- Published prerelease intent: npm dist-tag `next`; V11 remains `latest` until V12 stable release gates are satisfied.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## [11.0.0] - 2026-09-22
|
|
28
|
+
|
|
29
|
+
### Released
|
|
30
|
+
- Promoted V11 perception-aware adaptive execution to stable after the full local CI gate passed on Windows with 234 tests total, 232 passed, 0 failed and 2 platform-specific skips.
|
|
31
|
+
- Stable npm installs use the default `latest` dist-tag, so users install with `npm install -g opencode-agent-skill`.
|
|
32
|
+
- Includes content-addressed Evidence Store, adaptive EvidenceBudget/context externalization, stable-prefix prompt telemetry, capability-aware model routing, visual geometry receipts, deterministic PNG diff/crop, responsive/design-token inspection, optional Playwright browser inspection, cost-aware dynamic workflow scheduling, 48 focused skills and 12 subagents.
|
|
33
|
+
|
|
34
|
+
### Verified
|
|
35
|
+
- Syntax: 178 JavaScript modules.
|
|
36
|
+
- Catalog: 48 skills, 11 commands and 12 subagents.
|
|
37
|
+
- Router: 129 cases, 294/294 required routes and 61/61 negative guards.
|
|
38
|
+
- V11 contracts: 13 tasks across 6 categories and 15 required runtime files.
|
|
39
|
+
- Live/long/polyglot fixture validation: 20 / 5 / 8 tasks.
|
|
40
|
+
- npm pack dry-run, packed-install smoke and plain one-command install/resource auto-sync smoke: PASS.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- Package version is 11.0.0.
|
|
44
|
+
- V11 becomes the stable npm release line; V10 remains in Git history as the previous stable release.
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### V11 dev.2
|
|
48
|
+
- Added project-local, fail-closed Playwright browser inspection that returns bounded semantic elements, bounding boxes, computed visual properties and a screenshot path while treating page content as untrusted evidence.
|
|
49
|
+
- Exposed browser inspection through CLI and the OpenCode V2 router without making Playwright a required package dependency.
|
|
50
|
+
- Fixed duplicate `ui_layout` router tool registration and aligned durable context packs with V11 context schema version 6.
|
|
51
|
+
- Extended V11 validation and regression coverage for the browser runtime.
|
|
52
|
+
- Package development version is 11.0.0-dev.2.
|
|
53
|
+
|
|
54
|
+
## [11.0.0-dev.1] - 2026-09-22
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
- Adaptive context engine that externalizes oversized source/test/reference excerpts into content-addressed evidence pointers while keeping bounded inline previews.
|
|
58
|
+
- Deterministic UI layout and design-token tools exposed to the OpenCode V2 runtime.
|
|
59
|
+
- Cost- and modality-aware workflow scheduling with inline thresholds, deterministic-first waves, independent LLM/vision concurrency and bounded wave cost.
|
|
60
|
+
- Repeated-stable prompt ratio telemetry and an optional fail-closed ablation gate for repeated input efficiency.
|
|
61
|
+
- Stronger V11 contract coverage for adaptive context, UI inspection and evidence externalization.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
- V11 router metadata now reports version 11.
|
|
65
|
+
- Task context packs transport large contextual evidence through `evidence:sha256` pointers and report externalized byte/ref counts.
|
|
66
|
+
- Capability-aware model routing fails closed when an enabled configured model set cannot satisfy required capabilities such as vision/browser.
|
|
67
|
+
- Package development version is 11.0.0-dev.1.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
- V11 eval-report regression tests now account for expanded adaptive telemetry coverage instead of using the old V10-only telemetry shape.
|
|
71
|
+
|
|
72
|
+
## [11.0.0-dev.0] - 2026-09-22
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
- Content-addressed Evidence Store with bounded retrieval, deduplication and garbage collection.
|
|
76
|
+
- Adaptive Evidence Budget planning and context-manifest integration for evidence-efficient execution.
|
|
77
|
+
- Prompt stable-prefix/cache telemetry for repeated-input measurement.
|
|
78
|
+
- Capability registry and capability-aware model selection for coding, reasoning, tools, vision, browser, filesystem and long-context needs.
|
|
79
|
+
- Visual specification, geometry receipts, responsive viewport matrix, dependency-free PNG decode/diff/crop and bounded visual repair planning.
|
|
80
|
+
- Browser QA adapter with CLI-first verification planning, targeted semantic evidence and explicit untrusted-page security boundaries.
|
|
81
|
+
- Cost-aware dynamic workflow scheduler separating deterministic work from LLM/vision work.
|
|
82
|
+
- Skill-quality linting for entrypoint size, metadata and routing-description collision detection.
|
|
83
|
+
- Nine V11 skills: visual-fidelity, browser-qa, design-source, responsive-verification, component-visual-testing, browser-security, skill-authoring, skill-evaluation and dynamic-workflow.
|
|
84
|
+
- Two V11 subagents: visual-verifier and merge-arbiter.
|
|
85
|
+
- Optional Hermes sidecar workflow contract with evidence-pointer transport.
|
|
86
|
+
- V11 Control Center evidence-store/runtime telemetry and V11-specific tests/eval routing cases.
|
|
87
|
+
|
|
88
|
+
### Changed
|
|
89
|
+
- Model policy schema supports per-model capability metadata plus cost, latency and quality hints.
|
|
90
|
+
- Adaptive model resolution can select configured models by required task capabilities.
|
|
91
|
+
- OpenCode V2 router recognizes visual/browser/design/skill-workflow intents and keeps FAST routing selective.
|
|
92
|
+
- Package version is 11.0.0-dev.0 while npm latest remains V10 stable until V11 release gates pass.
|
|
93
|
+
|
|
9
94
|
## [10.0.0] - 2026-09-22
|
|
10
95
|
|
|
11
96
|
### Released
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# OpenCode Universal Engineering System (UES)
|
|
2
2
|
|
|
3
|
-
> **
|
|
4
|
-
>
|
|
3
|
+
> **V12 beta: 12.0.0-beta.0** — weak-model intelligence foundation với empirical routing, context-quality metrics, plan-scoped execution và repo-scale validation.
|
|
4
|
+
> **Stable latest vẫn là V11: 11.0.0.** Dùng `npm install -g opencode-agent-skill@next` để thử V12 beta.
|
|
5
5
|
|
|
6
6
|
[](https://www.npmjs.com/package/opencode-agent-skill)
|
|
7
7
|
[](LICENSE)
|
|
@@ -80,6 +80,49 @@ ocskill dashboard . --serve
|
|
|
80
80
|
|
|
81
81
|
---
|
|
82
82
|
|
|
83
|
+
## V11 có gì?
|
|
84
|
+
|
|
85
|
+
V11 chuyển UES từ một reliability harness thành **perception-aware adaptive execution engine**. Mục tiêu là model yếu chỉ nhận đúng bằng chứng cần thiết, dùng đúng capability/model/tool và có thể kiểm chứng UI bằng semantic structure + geometry + pixels thay vì đoán từ screenshot.
|
|
86
|
+
|
|
87
|
+
- content-addressed Evidence Store dưới `.ues-cache/evidence-v1/`; output lớn được lưu theo SHA-256 và context nhận bounded excerpt + `evidence:sha256:...` pointer;
|
|
88
|
+
- adaptive EvidenceBudget chia context cho instructions/task/source/tests/references/history/tools theo rủi ro và loại task thay vì luôn tiêu hết FAST/STANDARD/DEEP budget;
|
|
89
|
+
- prompt-envelope telemetry tách stable prefix và dynamic tail để đo cacheable ratio/repeated stable input;
|
|
90
|
+
- capability-aware model routing bổ sung `vision`, `browser`, `reasoning`, `toolCalling`, `filesystem`, `longContext` nhưng vẫn giữ light/standard/heavy để tương thích;
|
|
91
|
+
- `VISUAL_SPEC.json` + geometry receipt kiểm tra vị trí/kích thước element có tolerance rõ ràng;
|
|
92
|
+
- zero-dependency PNG diff/crop định vị vùng pixel sai rồi chỉ đưa crop cần thiết cho vision model;
|
|
93
|
+
- browser QA dùng targeted semantic/accessibility evidence + bounding boxes + screenshots; webpage content luôn được xem là untrusted;
|
|
94
|
+
- responsive viewport matrix và component visual testing/Storybook routing;
|
|
95
|
+
- dynamic workflow scheduler tách deterministic task khỏi LLM/vision fan-out, serialize overlapping writers và giới hạn concurrency;
|
|
96
|
+
- skill linter đo entrypoint size và description collisions; catalog tăng từ 39 lên **48 skills** nhưng router chỉ load skill có tín hiệu hẹp;
|
|
97
|
+
- hai subagent mới: `ues-visual-verifier` và `ues-merge-arbiter`, tổng **12 subagents**;
|
|
98
|
+
- Hermes được nâng thành optional sidecar: UES vẫn sở hữu durable state/evidence/safety, Hermes chỉ nhận bounded schedule/context khi được dùng;
|
|
99
|
+
- Control Center hiển thị Evidence Store và V11 runtime efficiency state.
|
|
100
|
+
|
|
101
|
+
Các CLI V11 chính:
|
|
102
|
+
|
|
103
|
+
```cmd
|
|
104
|
+
ocskill store status .
|
|
105
|
+
ocskill store get evidence:sha256:<hash> . --max 12000
|
|
106
|
+
ocskill capabilities "match this screenshot in the browser"
|
|
107
|
+
ocskill visual spec VISUAL_SPEC.json
|
|
108
|
+
ocskill visual geometry VISUAL_SPEC.json actual-boxes.json
|
|
109
|
+
ocskill visual compare expected.png actual.png --threshold 16
|
|
110
|
+
ocskill visual crop actual.png failed-region.png --x 10 --y 20 --width 300 --height 120
|
|
111
|
+
ocskill visual viewports
|
|
112
|
+
ocskill browser capability .
|
|
113
|
+
ocskill browser plan http://localhost:3000 --target Checkout
|
|
114
|
+
ocskill browser inspect http://localhost:3000 . --selector "button" --width 1440 --height 900
|
|
115
|
+
ocskill ui tokens src/styles.css
|
|
116
|
+
ocskill ui layout boxes.json --width 390 --height 844
|
|
117
|
+
ocskill workflow-plan PLAN.json --max-concurrent 4
|
|
118
|
+
ocskill skills lint .
|
|
119
|
+
ocskill models capability provider/model --vision on --browser on --quality 0.9
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
V11 stable được promote sau full local CI trên Windows PASS: 234 tests, 232 pass, 0 fail, 2 platform-specific skips; router/contract/package/install smoke đều PASS. Stable npm install dùng `npm install -g opencode-agent-skill`.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
83
126
|
## V10 có gì?
|
|
84
127
|
|
|
85
128
|
V10 tập trung vào **minimum context necessary for maximum task success**: giảm context luôn nạp nhưng không cắt các lớp correctness, verification hay recovery.
|
|
@@ -281,6 +324,8 @@ Child session không được tự động merge, push, publish hoặc deploy.
|
|
|
281
324
|
| `ues-critic` | Tìm giả định sai, counterexample và điểm yếu trong phương án |
|
|
282
325
|
| `ues-verifier` | Xác minh độc lập theo acceptance criteria |
|
|
283
326
|
| `ues-integration-verifier` | Kiểm tra tích hợp giữa nhiều task và luồng end-to-end |
|
|
327
|
+
| `ues-visual-verifier` | Xác minh độc lập screenshot/geometry/responsive/interaction mà không sửa code |
|
|
328
|
+
| `ues-merge-arbiter` | Hòa giải conflict giữa các task đã verify theo intent/evidence, không push/publish/deploy |
|
|
284
329
|
|
|
285
330
|
`ues-executor` là subagent chính có quyền sửa code theo scope được giao. Các agent còn lại chủ yếu phục vụ phân tích, review và xác minh.
|
|
286
331
|
|
|
@@ -386,7 +431,7 @@ ocskill work status checkout .
|
|
|
386
431
|
|
|
387
432
|
## Skills
|
|
388
433
|
|
|
389
|
-
|
|
434
|
+
V11 stable hiện có **48 skills**; V10 stable có 39. Router vẫn chỉ chọn tập skill phù hợp thay vì nạp toàn bộ catalog vào mỗi task.
|
|
390
435
|
|
|
391
436
|
Một số process skill quan trọng:
|
|
392
437
|
|
|
@@ -491,7 +536,7 @@ Proposal có `shadowRequired` chỉ được đưa trở lại context sau khi v
|
|
|
491
536
|
|
|
492
537
|
## Hermes adapter
|
|
493
538
|
|
|
494
|
-
|
|
539
|
+
V11 giữ Hermes theo dạng **optional sidecar**, không nhúng Hermes runtime vào core. UES vẫn sở hữu durable state, evidence và safety boundaries:
|
|
495
540
|
|
|
496
541
|
```cmd
|
|
497
542
|
ocskill hermes status
|
|
@@ -547,10 +592,11 @@ Integration sẽ từ chối ghi đè lên file đang dirty ở root. Safe-wave
|
|
|
547
592
|
|
|
548
593
|
## Evaluation
|
|
549
594
|
|
|
550
|
-
|
|
595
|
+
V11 hiện có:
|
|
551
596
|
|
|
552
|
-
- **
|
|
553
|
-
- **
|
|
597
|
+
- **43 static skill-routing scenarios** phủ 48 skills;
|
|
598
|
+
- **129 V2 router cases** với required routes và negative guards;
|
|
599
|
+
- **13 V11 contract tasks** across 6 categories;
|
|
554
600
|
- **20 standard live tasks**;
|
|
555
601
|
- **5 long-horizon tasks**;
|
|
556
602
|
- **8 polyglot tasks** cho Python, Java, .NET, Next.js, React Native, SQL migration, monorepo và generated contract;
|
|
@@ -580,6 +626,7 @@ Kiểm tra long-horizon và polyglot suite:
|
|
|
580
626
|
```cmd
|
|
581
627
|
npm run evals:long:validate
|
|
582
628
|
npm run evals:polyglot:validate
|
|
629
|
+
npm run evals:v11:validate
|
|
583
630
|
```
|
|
584
631
|
|
|
585
632
|
Chạy benchmark với model thật:
|
|
@@ -621,11 +668,13 @@ Pipeline hiện kiểm tra:
|
|
|
621
668
|
```text
|
|
622
669
|
syntax
|
|
623
670
|
→ resource validation
|
|
671
|
+
→ docs:check
|
|
624
672
|
→ static skill routing
|
|
625
673
|
→ V2 router matrix
|
|
626
674
|
→ standard hidden-grader integrity
|
|
627
675
|
→ long hidden-grader integrity
|
|
628
676
|
→ polyglot hidden-grader integrity
|
|
677
|
+
→ V11 contract validation
|
|
629
678
|
→ Node tests
|
|
630
679
|
→ npm pack --dry-run
|
|
631
680
|
→ packed global-install smoke
|
|
@@ -666,6 +715,7 @@ UES chỉ quản lý resource có namespace/marker của chính nó và cố g
|
|
|
666
715
|
- [V7 Intelligence Runtime](docs/V7-INTELLIGENCE-RUNTIME.md)
|
|
667
716
|
- [V8 Intelligence & Reliability](docs/V8-INTELLIGENCE-RELIABILITY.md)
|
|
668
717
|
- [V9 Speed & Intelligence](docs/V9-SPEED-INTELLIGENCE.md)
|
|
718
|
+
- [V12 Weak-Model Intelligence (beta)](docs/V12-WEAK-MODEL-INTELLIGENCE.md)
|
|
669
719
|
|
|
670
720
|
---
|
|
671
721
|
|
|
@@ -686,9 +736,11 @@ npm install -g opencode-agent-skill
|
|
|
686
736
|
Phiên bản hiện tại:
|
|
687
737
|
|
|
688
738
|
```text
|
|
689
|
-
|
|
739
|
+
12.0.0-beta.0
|
|
690
740
|
```
|
|
691
741
|
|
|
742
|
+
V12 beta dùng npm dist-tag `next`; `latest` tiếp tục trỏ tới V11 stable cho đến khi các release gate V12 hoàn tất.
|
|
743
|
+
|
|
692
744
|
---
|
|
693
745
|
|
|
694
746
|
## License
|
package/bin/ocskill.mjs
CHANGED
|
@@ -59,13 +59,23 @@ import {
|
|
|
59
59
|
} from "../lib/task-engine.mjs"
|
|
60
60
|
import { reviewScope } from "../lib/review-scope.mjs"
|
|
61
61
|
import { buildVerificationPlan } from "../lib/verification-plan.mjs"
|
|
62
|
-
import { resolveAdaptiveModel, resolveModel } from "../lib/model-policy.mjs"
|
|
62
|
+
import { resolveAdaptiveModel, resolveCapabilityModel, resolveModel } from "../lib/model-policy.mjs"
|
|
63
63
|
import { createVerificationReceipt } from "../lib/evidence-receipt.mjs"
|
|
64
64
|
import { classifyEngineeringTask } from "../lib/orchestrator-policy.mjs"
|
|
65
65
|
import { createTaskSandbox, integrateTaskSandbox, listTaskSandboxes, removeTaskSandbox } from "../lib/worktree-sandbox.mjs"
|
|
66
66
|
import { analyzeEvalTraces, saveLearningAnalysis, readLearningState, acceptLearning, promoteLearning } from "../lib/learning-engine.mjs"
|
|
67
|
-
import { hermesStatus, buildHermesDelegationPrompt, hermesOneShotArgs } from "../lib/hermes-bridge.mjs"
|
|
68
|
-
import { readModelPolicy, validateModelID, writeModelPolicy } from "../lib/model-config.mjs"
|
|
67
|
+
import { hermesStatus, buildHermesDelegationPrompt, buildHermesWorkflowPrompt, hermesOneShotArgs, hermesSidecarPlan } from "../lib/hermes-bridge.mjs"
|
|
68
|
+
import { readModelPolicy, recordModelPerformance, validateModelID, writeModelPolicy } from "../lib/model-config.mjs"
|
|
69
|
+
import { evidenceStoreStatus, gcEvidenceStore, getEvidence, putEvidence } from "../lib/evidence-store.mjs"
|
|
70
|
+
import { inferTaskCapabilities } from "../lib/capability-registry.mjs"
|
|
71
|
+
import { MODEL_TASK_CLASSES } from "../lib/model-performance.mjs"
|
|
72
|
+
import { browserCapability, buildBrowserVerificationPlan } from "../lib/browser-adapter.mjs"
|
|
73
|
+
import { inspectBrowserPage, summarizeBrowserInspection } from "../lib/browser-runtime.mjs"
|
|
74
|
+
import { comparePngFiles, cropPngFile } from "../lib/png-diff.mjs"
|
|
75
|
+
import { createGeometryReceipt, responsiveViewportMatrix, validateVisualSpec } from "../lib/visual-spec.mjs"
|
|
76
|
+
import { planDynamicWorkflow } from "../lib/dynamic-workflow.mjs"
|
|
77
|
+
import { lintSkillCatalog } from "../lib/skill-quality.mjs"
|
|
78
|
+
import { designTokenEvidence, extractDesignTokens, inspectResponsiveLayout } from "../lib/ui-inspector.mjs"
|
|
69
79
|
import {
|
|
70
80
|
clipOutput,
|
|
71
81
|
errorMessage,
|
|
@@ -117,7 +127,14 @@ Usage:
|
|
|
117
127
|
ocskill sandbox <action> ... Create, integrate and clean isolated Git worktree sandboxes
|
|
118
128
|
Also supports capability/exec for fail-closed container verification
|
|
119
129
|
ocskill learn <action> ... Analyze eval traces and promote benchmark-validated lessons
|
|
120
|
-
ocskill hermes <action> ... Optional Hermes
|
|
130
|
+
ocskill hermes <action> ... Optional Hermes sidecar/status/task/workflow planning
|
|
131
|
+
ocskill store <status|put|get|gc> ... Content-addressed evidence storage and bounded retrieval
|
|
132
|
+
ocskill capabilities <text> Infer required execution/model capabilities
|
|
133
|
+
ocskill visual <action> ... Geometry receipts, PNG diff/crop and viewport matrix
|
|
134
|
+
ocskill browser <action> ... Browser capability, plan and bounded Playwright inspection
|
|
135
|
+
ocskill ui <tokens|layout> ... Extract design tokens or verify responsive geometry
|
|
136
|
+
ocskill workflow-plan <plan> Cost-aware deterministic/LLM/vision wave schedule
|
|
137
|
+
ocskill skills lint [dir] Lint skill size, metadata and routing-description collisions
|
|
121
138
|
ocskill dashboard [dir] [--serve] [--port N]
|
|
122
139
|
Generate/serve the local UES Control Center
|
|
123
140
|
ocskill models <status|on|off|set|role> ...
|
|
@@ -154,6 +171,8 @@ Usage:
|
|
|
154
171
|
ocskill models on|off
|
|
155
172
|
ocskill models set <light|standard|heavy> <provider/model[#variant]>
|
|
156
173
|
ocskill models role <role> <light|standard|heavy>
|
|
174
|
+
ocskill models capability <provider/model> [--vision on|off] [--browser on|off] [--reasoning on|off] [--long-context on|off] [--cost low|medium|high] [--latency fast|medium|slow] [--quality 0..1]
|
|
175
|
+
ocskill models observe <provider/model> --task-class <class> --passed on|off [--retries N] [--tokens N] [--latency-ms N]
|
|
157
176
|
|
|
158
177
|
--force backs up and replaces/removes state owned by another package.
|
|
159
178
|
`)
|
|
@@ -741,7 +760,8 @@ async function modelPolicy() {
|
|
|
741
760
|
const normalizedAttempt = Number.isInteger(attempt) && attempt > 0 ? attempt : 1
|
|
742
761
|
const taskText = optionValue(args, "--text")
|
|
743
762
|
if (taskText) {
|
|
744
|
-
|
|
763
|
+
const taskPolicy = classifyEngineeringTask(taskText)
|
|
764
|
+
printJson(resolveCapabilityModel(role, normalizedAttempt, taskText, taskPolicy, policy))
|
|
745
765
|
return
|
|
746
766
|
}
|
|
747
767
|
printJson(resolveModel(role, normalizedAttempt, policy))
|
|
@@ -794,6 +814,69 @@ async function modelsControl() {
|
|
|
794
814
|
return
|
|
795
815
|
}
|
|
796
816
|
|
|
817
|
+
if (action === "observe") {
|
|
818
|
+
const model = args[2]
|
|
819
|
+
if (!validateModelID(model)) {
|
|
820
|
+
console.error("Usage: ocskill models observe <provider/model> --task-class <class> --passed on|off")
|
|
821
|
+
process.exitCode = 2
|
|
822
|
+
return
|
|
823
|
+
}
|
|
824
|
+
const taskClass = optionValue(args, "--task-class") || "general"
|
|
825
|
+
if (!MODEL_TASK_CLASSES.includes(taskClass)) throw new Error("--task-class must be one of: " + MODEL_TASK_CLASSES.join(", "))
|
|
826
|
+
const passedRaw = String(optionValue(args, "--passed") || "").toLowerCase()
|
|
827
|
+
if (!["on","off","true","false","pass","fail"].includes(passedRaw)) throw new Error("--passed must be on/off, true/false, or pass/fail")
|
|
828
|
+
policy = await recordModelPerformance(getConfigDir(), {
|
|
829
|
+
model, taskClass, passed: ["on","true","pass"].includes(passedRaw),
|
|
830
|
+
retries: optionInt(args, "--retries", 0) || 0,
|
|
831
|
+
tokens: optionInt(args, "--tokens", 0) || 0,
|
|
832
|
+
latencyMs: optionInt(args, "--latency-ms", 0) || 0,
|
|
833
|
+
})
|
|
834
|
+
printJson({ model, taskClass, recorded: true, performance: policy.performance?.[model]?.[taskClass] || null })
|
|
835
|
+
return
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
if (action === "capability") {
|
|
839
|
+
const model = args[2]
|
|
840
|
+
if (!validateModelID(model)) {
|
|
841
|
+
console.error("Usage: ocskill models capability <provider/model> [capability flags]")
|
|
842
|
+
process.exitCode = 2
|
|
843
|
+
return
|
|
844
|
+
}
|
|
845
|
+
const current = policy.capabilities?.[model] || {}
|
|
846
|
+
const boolFlag = (name, prior) => {
|
|
847
|
+
const value = optionValue(args, name)
|
|
848
|
+
if (value == null) return prior
|
|
849
|
+
if (!["on", "off", "true", "false"].includes(String(value).toLowerCase())) throw new Error(name + " must be on/off")
|
|
850
|
+
return ["on", "true"].includes(String(value).toLowerCase())
|
|
851
|
+
}
|
|
852
|
+
const qualityRaw = optionValue(args, "--quality")
|
|
853
|
+
const quality = qualityRaw == null ? current.quality : Number(qualityRaw)
|
|
854
|
+
if (qualityRaw != null && (!Number.isFinite(quality) || quality < 0 || quality > 1)) throw new Error("--quality must be from 0 to 1")
|
|
855
|
+
const cost = optionValue(args, "--cost") || current.costClass
|
|
856
|
+
const latency = optionValue(args, "--latency") || current.latencyClass
|
|
857
|
+
if (cost && !["low", "medium", "high"].includes(cost)) throw new Error("--cost must be low|medium|high")
|
|
858
|
+
if (latency && !["fast", "medium", "slow"].includes(latency)) throw new Error("--latency must be fast|medium|slow")
|
|
859
|
+
policy = await writeModelPolicy(getConfigDir(), {
|
|
860
|
+
capabilities: {
|
|
861
|
+
[model]: {
|
|
862
|
+
...current,
|
|
863
|
+
coding: boolFlag("--coding", current.coding),
|
|
864
|
+
reasoning: boolFlag("--reasoning", current.reasoning),
|
|
865
|
+
toolCalling: boolFlag("--tool-calling", current.toolCalling),
|
|
866
|
+
vision: boolFlag("--vision", current.vision),
|
|
867
|
+
browser: boolFlag("--browser", current.browser),
|
|
868
|
+
filesystem: boolFlag("--filesystem", current.filesystem),
|
|
869
|
+
longContext: boolFlag("--long-context", current.longContext),
|
|
870
|
+
...(cost ? { costClass: cost } : {}),
|
|
871
|
+
...(latency ? { latencyClass: latency } : {}),
|
|
872
|
+
...(quality != null ? { quality } : {}),
|
|
873
|
+
},
|
|
874
|
+
},
|
|
875
|
+
})
|
|
876
|
+
printJson(policy)
|
|
877
|
+
return
|
|
878
|
+
}
|
|
879
|
+
|
|
797
880
|
console.error("Usage: ocskill models <status|on|off|set|role> ...")
|
|
798
881
|
process.exitCode = 2
|
|
799
882
|
}
|
|
@@ -956,6 +1039,40 @@ async function hermesControl() {
|
|
|
956
1039
|
printJson(hermesStatus())
|
|
957
1040
|
return
|
|
958
1041
|
}
|
|
1042
|
+
if (action === "workflow" || action === "exec-workflow") {
|
|
1043
|
+
const slug = args[2]
|
|
1044
|
+
const root = positionalArg(args, 3) || process.cwd()
|
|
1045
|
+
if (!slug) {
|
|
1046
|
+
console.error("Usage: ocskill hermes <workflow|exec-workflow> <slug> [dir] [--max-concurrent N]")
|
|
1047
|
+
process.exitCode = 2
|
|
1048
|
+
return
|
|
1049
|
+
}
|
|
1050
|
+
const planFile = path.join(path.resolve(root), ".ues-work", slug, "PLAN.json")
|
|
1051
|
+
const plan = readJsonFile(planFile)
|
|
1052
|
+
const schedule = planDynamicWorkflow(plan.tasks || [], {
|
|
1053
|
+
maxConcurrent: optionInt(args, "--max-concurrent", 4),
|
|
1054
|
+
})
|
|
1055
|
+
const sidecar = hermesSidecarPlan({ mode: "dynamic-workflow", maxConcurrent: schedule.maxConcurrent })
|
|
1056
|
+
const prompt = buildHermesWorkflowPrompt({ slug, goal: plan.goal || null, plan }, schedule)
|
|
1057
|
+
if (action === "workflow") {
|
|
1058
|
+
printJson({ sidecar, schedule, prompt })
|
|
1059
|
+
return
|
|
1060
|
+
}
|
|
1061
|
+
const status = hermesStatus()
|
|
1062
|
+
if (!status.available) {
|
|
1063
|
+
console.error(status.error || "Hermes CLI is unavailable")
|
|
1064
|
+
process.exitCode = 1
|
|
1065
|
+
return
|
|
1066
|
+
}
|
|
1067
|
+
const result = runCapture("hermes", hermesOneShotArgs(prompt), {
|
|
1068
|
+
cwd: path.resolve(root),
|
|
1069
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
1070
|
+
})
|
|
1071
|
+
if (result.stdout) process.stdout.write(result.stdout)
|
|
1072
|
+
if (result.stderr) process.stderr.write(result.stderr)
|
|
1073
|
+
if ((result.status ?? 1) !== 0) process.exitCode = result.status ?? 1
|
|
1074
|
+
return
|
|
1075
|
+
}
|
|
959
1076
|
if (action === "prompt" || action === "exec") {
|
|
960
1077
|
const slug = args[2]
|
|
961
1078
|
const taskID = args[3]
|
|
@@ -986,10 +1103,220 @@ async function hermesControl() {
|
|
|
986
1103
|
if ((result.status ?? 1) !== 0) process.exitCode = result.status ?? 1
|
|
987
1104
|
return
|
|
988
1105
|
}
|
|
989
|
-
console.error("Usage: ocskill hermes <status|prompt|exec> ...")
|
|
1106
|
+
console.error("Usage: ocskill hermes <status|prompt|exec|workflow|exec-workflow> ...")
|
|
990
1107
|
process.exitCode = 2
|
|
991
1108
|
}
|
|
992
1109
|
|
|
1110
|
+
async function evidenceStoreControl() {
|
|
1111
|
+
const action = args[1] || "status"
|
|
1112
|
+
try {
|
|
1113
|
+
if (action === "status") {
|
|
1114
|
+
printJson(await evidenceStoreStatus(positionalArg(args, 2) || process.cwd()))
|
|
1115
|
+
return
|
|
1116
|
+
}
|
|
1117
|
+
if (action === "put") {
|
|
1118
|
+
const file = args[2]
|
|
1119
|
+
const root = positionalArg(args, 3) || process.cwd()
|
|
1120
|
+
if (!file) throw new Error("Usage: ocskill store put <file> [dir] [--kind <kind>] [--summary <text>]")
|
|
1121
|
+
const content = readTextFile(file)
|
|
1122
|
+
printJson(await putEvidence(root, content, {
|
|
1123
|
+
kind: optionValue(args, "--kind") || "file",
|
|
1124
|
+
source: path.resolve(file),
|
|
1125
|
+
summary: optionValue(args, "--summary"),
|
|
1126
|
+
}))
|
|
1127
|
+
return
|
|
1128
|
+
}
|
|
1129
|
+
if (action === "get") {
|
|
1130
|
+
const ref = args[2]
|
|
1131
|
+
const root = positionalArg(args, 3) || process.cwd()
|
|
1132
|
+
if (!ref) throw new Error("Usage: ocskill store get <evidence-ref> [dir] [--max N] [--start N]")
|
|
1133
|
+
printJson(await getEvidence(root, ref, {
|
|
1134
|
+
maxChars: optionInt(args, "--max", 24_000),
|
|
1135
|
+
start: optionInt(args, "--start", 0),
|
|
1136
|
+
}))
|
|
1137
|
+
return
|
|
1138
|
+
}
|
|
1139
|
+
if (action === "gc") {
|
|
1140
|
+
const root = positionalArg(args, 2) || process.cwd()
|
|
1141
|
+
printJson(await gcEvidenceStore(root, {
|
|
1142
|
+
maxEntries: optionInt(args, "--max-entries", 2000),
|
|
1143
|
+
maxAgeDays: optionInt(args, "--max-age-days", 30),
|
|
1144
|
+
}))
|
|
1145
|
+
return
|
|
1146
|
+
}
|
|
1147
|
+
throw new Error("Usage: ocskill store <status|put|get|gc> ...")
|
|
1148
|
+
} catch (error) {
|
|
1149
|
+
console.error(errorMessage(error))
|
|
1150
|
+
process.exitCode = 1
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
async function capabilityControl() {
|
|
1155
|
+
const text = args.slice(1).join(" ").trim()
|
|
1156
|
+
if (!text) {
|
|
1157
|
+
console.error("Usage: ocskill capabilities <task text>")
|
|
1158
|
+
process.exitCode = 2
|
|
1159
|
+
return
|
|
1160
|
+
}
|
|
1161
|
+
printJson(inferTaskCapabilities(text))
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
async function visualControl() {
|
|
1165
|
+
const action = args[1]
|
|
1166
|
+
try {
|
|
1167
|
+
if (action === "spec") {
|
|
1168
|
+
const file = args[2]
|
|
1169
|
+
if (!file) throw new Error("Usage: ocskill visual spec <VISUAL_SPEC.json>")
|
|
1170
|
+
printJson(validateVisualSpec(readJsonFile(file)))
|
|
1171
|
+
return
|
|
1172
|
+
}
|
|
1173
|
+
if (action === "geometry") {
|
|
1174
|
+
const specFile = args[2]
|
|
1175
|
+
const actualFile = args[3]
|
|
1176
|
+
if (!specFile || !actualFile) throw new Error("Usage: ocskill visual geometry <VISUAL_SPEC.json> <actual-boxes.json>")
|
|
1177
|
+
printJson(createGeometryReceipt(readJsonFile(specFile), readJsonFile(actualFile)))
|
|
1178
|
+
return
|
|
1179
|
+
}
|
|
1180
|
+
if (action === "compare") {
|
|
1181
|
+
const expected = args[2]
|
|
1182
|
+
const actual = args[3]
|
|
1183
|
+
if (!expected || !actual) throw new Error("Usage: ocskill visual compare <expected.png> <actual.png> [--threshold N] [--max-diff-ratio N]")
|
|
1184
|
+
const threshold = Number(optionValue(args, "--threshold") ?? 16)
|
|
1185
|
+
const maxDiffRatio = Number(optionValue(args, "--max-diff-ratio") ?? 0)
|
|
1186
|
+
printJson(await comparePngFiles(expected, actual, { threshold, maxDiffRatio }))
|
|
1187
|
+
return
|
|
1188
|
+
}
|
|
1189
|
+
if (action === "crop") {
|
|
1190
|
+
const input = args[2]
|
|
1191
|
+
const output = args[3]
|
|
1192
|
+
if (!input || !output) throw new Error("Usage: ocskill visual crop <input.png> <output.png> --x N --y N --width N --height N")
|
|
1193
|
+
printJson(await cropPngFile(input, output, {
|
|
1194
|
+
x: optionInt(args, "--x", 0),
|
|
1195
|
+
y: optionInt(args, "--y", 0),
|
|
1196
|
+
width: optionInt(args, "--width", 1),
|
|
1197
|
+
height: optionInt(args, "--height", 1),
|
|
1198
|
+
}))
|
|
1199
|
+
return
|
|
1200
|
+
}
|
|
1201
|
+
if (action === "viewports") {
|
|
1202
|
+
printJson(responsiveViewportMatrix())
|
|
1203
|
+
return
|
|
1204
|
+
}
|
|
1205
|
+
throw new Error("Usage: ocskill visual <spec|geometry|compare|crop|viewports> ...")
|
|
1206
|
+
} catch (error) {
|
|
1207
|
+
console.error(errorMessage(error))
|
|
1208
|
+
process.exitCode = 1
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
async function browserControl() {
|
|
1213
|
+
const action = args[1] || "capability"
|
|
1214
|
+
try {
|
|
1215
|
+
if (action === "capability") {
|
|
1216
|
+
printJson(await browserCapability(positionalArg(args, 2) || process.cwd()))
|
|
1217
|
+
return
|
|
1218
|
+
}
|
|
1219
|
+
if (action === "plan") {
|
|
1220
|
+
const url = args[2] || null
|
|
1221
|
+
printJson(buildBrowserVerificationPlan({
|
|
1222
|
+
url,
|
|
1223
|
+
target: optionValue(args, "--target"),
|
|
1224
|
+
}))
|
|
1225
|
+
return
|
|
1226
|
+
}
|
|
1227
|
+
if (action === "inspect") {
|
|
1228
|
+
const url = args[2]
|
|
1229
|
+
if (!url) throw new Error("Usage: ocskill browser inspect <url> [dir] [--selector <css>] [--screenshot <path>] [--width N] [--height N] [--max-elements N]")
|
|
1230
|
+
const root = positionalArg(args, 3) || process.cwd()
|
|
1231
|
+
const report = await inspectBrowserPage(root, url, {
|
|
1232
|
+
selector: optionValue(args, "--selector"),
|
|
1233
|
+
screenshot: optionValue(args, "--screenshot"),
|
|
1234
|
+
width: optionInt(args, "--width", 1440),
|
|
1235
|
+
height: optionInt(args, "--height", 900),
|
|
1236
|
+
maxElements: optionInt(args, "--max-elements", 80),
|
|
1237
|
+
timeoutMs: optionInt(args, "--timeout-ms", 30000),
|
|
1238
|
+
waitMs: optionInt(args, "--wait-ms", 0),
|
|
1239
|
+
fullPage: !args.includes("--viewport-only"),
|
|
1240
|
+
})
|
|
1241
|
+
printJson(args.includes("--full") ? report : summarizeBrowserInspection(report, { limit: optionInt(args, "--limit", 20) }))
|
|
1242
|
+
return
|
|
1243
|
+
}
|
|
1244
|
+
throw new Error("Usage: ocskill browser <capability|plan|inspect> ...")
|
|
1245
|
+
} catch (error) {
|
|
1246
|
+
console.error(errorMessage(error))
|
|
1247
|
+
process.exitCode = 1
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
async function uiControl() {
|
|
1252
|
+
const action = args[1]
|
|
1253
|
+
try {
|
|
1254
|
+
if (action === "tokens") {
|
|
1255
|
+
const file = args[2]
|
|
1256
|
+
if (!file) throw new Error("Usage: ocskill ui tokens <styles.css>")
|
|
1257
|
+
const tokens = extractDesignTokens(readTextFile(file))
|
|
1258
|
+
printJson({ tokens, evidence: designTokenEvidence(tokens) })
|
|
1259
|
+
return
|
|
1260
|
+
}
|
|
1261
|
+
if (action === "layout") {
|
|
1262
|
+
const file = args[2]
|
|
1263
|
+
if (!file) throw new Error("Usage: ocskill ui layout <boxes.json> --width N --height N [--min-touch N] [--overlap-ratio N]")
|
|
1264
|
+
const payload = readJsonFile(file)
|
|
1265
|
+
const items = Array.isArray(payload) ? payload : payload.elements || payload.boxes || []
|
|
1266
|
+
printJson(inspectResponsiveLayout(items, {
|
|
1267
|
+
width: optionInt(args, "--width", Number(payload.viewport?.width || 0)),
|
|
1268
|
+
height: optionInt(args, "--height", Number(payload.viewport?.height || 0)),
|
|
1269
|
+
}, {
|
|
1270
|
+
minTouchTarget: optionInt(args, "--min-touch", 44),
|
|
1271
|
+
overlapRatio: Number(optionValue(args, "--overlap-ratio") ?? 0.15),
|
|
1272
|
+
}))
|
|
1273
|
+
return
|
|
1274
|
+
}
|
|
1275
|
+
throw new Error("Usage: ocskill ui <tokens|layout> ...")
|
|
1276
|
+
} catch (error) {
|
|
1277
|
+
console.error(errorMessage(error))
|
|
1278
|
+
process.exitCode = 1
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
async function workflowPlanControl() {
|
|
1283
|
+
const file = args[1]
|
|
1284
|
+
if (!file) {
|
|
1285
|
+
console.error("Usage: ocskill workflow-plan <PLAN.json> [--max-concurrent N]")
|
|
1286
|
+
process.exitCode = 2
|
|
1287
|
+
return
|
|
1288
|
+
}
|
|
1289
|
+
try {
|
|
1290
|
+
const plan = readJsonFile(file)
|
|
1291
|
+
printJson(planDynamicWorkflow(plan.tasks || [], {
|
|
1292
|
+
maxConcurrent: optionInt(args, "--max-concurrent", 4),
|
|
1293
|
+
maxLLMConcurrent: optionInt(args, "--max-llm-concurrent", optionInt(args, "--max-concurrent", 4)),
|
|
1294
|
+
maxVisionConcurrent: optionInt(args, "--max-vision-concurrent", 2),
|
|
1295
|
+
maxWaveCost: optionInt(args, "--max-wave-cost", 24),
|
|
1296
|
+
minAgentCost: optionInt(args, "--min-agent-cost", 5),
|
|
1297
|
+
minVisionAgentCost: optionInt(args, "--min-vision-agent-cost", 4),
|
|
1298
|
+
}))
|
|
1299
|
+
} catch (error) {
|
|
1300
|
+
console.error(errorMessage(error))
|
|
1301
|
+
process.exitCode = 1
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
async function skillsControl() {
|
|
1306
|
+
const action = args[1] || "lint"
|
|
1307
|
+
if (action !== "lint") {
|
|
1308
|
+
console.error("Usage: ocskill skills lint [dir]")
|
|
1309
|
+
process.exitCode = 2
|
|
1310
|
+
return
|
|
1311
|
+
}
|
|
1312
|
+
try {
|
|
1313
|
+
printJson(await lintSkillCatalog(positionalArg(args, 2) || packageRoot))
|
|
1314
|
+
} catch (error) {
|
|
1315
|
+
console.error(errorMessage(error))
|
|
1316
|
+
process.exitCode = 1
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
|
|
993
1320
|
async function dashboardControl() {
|
|
994
1321
|
const forwarded = args.slice(1)
|
|
995
1322
|
const code = run(process.execPath, [path.join(packageRoot, "scripts", "control-center.mjs"), ...forwarded])
|
|
@@ -1162,6 +1489,27 @@ switch (command) {
|
|
|
1162
1489
|
case "hermes":
|
|
1163
1490
|
await hermesControl()
|
|
1164
1491
|
break
|
|
1492
|
+
case "store":
|
|
1493
|
+
await evidenceStoreControl()
|
|
1494
|
+
break
|
|
1495
|
+
case "capabilities":
|
|
1496
|
+
await capabilityControl()
|
|
1497
|
+
break
|
|
1498
|
+
case "visual":
|
|
1499
|
+
await visualControl()
|
|
1500
|
+
break
|
|
1501
|
+
case "browser":
|
|
1502
|
+
await browserControl()
|
|
1503
|
+
break
|
|
1504
|
+
case "workflow-plan":
|
|
1505
|
+
await workflowPlanControl()
|
|
1506
|
+
break
|
|
1507
|
+
case "ui":
|
|
1508
|
+
await uiControl()
|
|
1509
|
+
break
|
|
1510
|
+
case "skills":
|
|
1511
|
+
await skillsControl()
|
|
1512
|
+
break
|
|
1165
1513
|
case "dashboard":
|
|
1166
1514
|
await dashboardControl()
|
|
1167
1515
|
break
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Deterministic evidence and execution tools
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
V11 uses dependency-light Node helpers for work that should not rely on a model guessing or remembering it.
|
|
4
4
|
|
|
5
5
|
## Repository evidence
|
|
6
6
|
|