opencode-agent-skill 13.0.0-beta.0 → 13.0.0-beta.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 +11 -0
- package/README.md +6 -6
- package/docs/NPM-PUBLISH.md +5 -5
- package/docs/V13-PARALLEL-WEAK-MODEL-RUNTIME.md +1 -1
- package/global-config/plugins/ues-router/command-runtime.js +33 -1
- package/global-config/plugins/ues-router/index.js +21 -4
- package/lib/installer.mjs +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,17 @@ The project follows Semantic Versioning.
|
|
|
12
12
|
- Fixed OpenCode V2 local router loading on clean global configs by removing the unnecessary bare `@opencode/plugin` runtime import; `ues-router` now exports the plain `{ id, setup }` definition accepted by the V2 loader.
|
|
13
13
|
- Prevented OpenCode V2 UES router subprocesses (`where`, `ocskill`, Node shim execution and Git probes) from flashing transient CMD windows on Windows by routing them through a hidden-window spawn wrapper.
|
|
14
14
|
|
|
15
|
+
## [13.0.0-beta.1] - 2026-09-23
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Hardened V2 prompt aliases for ChatGPT-style pasted prompts: BOM/zero-width prefixes and whole-prompt markdown fences are normalized before alias detection.
|
|
19
|
+
- Bounded the text sent to `ocskill task-policy` so very large pasted prompts no longer risk Windows command-line length failures; the full user prompt still goes to the model while only a bounded head/tail classification view goes through the CLI.
|
|
20
|
+
- Routed skill classification from the actual user request instead of the expanded command template, reducing template-induced over-routing on long prompts.
|
|
21
|
+
- Kept installer result shape stable with `promptAliases: []` on foreign-state refusal.
|
|
22
|
+
|
|
23
|
+
### Regression coverage
|
|
24
|
+
- Added fenced-paste, BOM, 70k-character policy-input and oversized multiline `/ues-run` regression tests.
|
|
25
|
+
|
|
15
26
|
## [13.0.0-beta.0] - 2026-09-22
|
|
16
27
|
|
|
17
28
|
### Added
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# OpenCode Universal Engineering System (UES)
|
|
2
2
|
|
|
3
|
-
> **V13 beta: 13.0.0-beta.
|
|
4
|
-
> **Stable latest vẫn là V11: 11.0.0.** V13 được đóng gói dưới prerelease `13.0.0-beta.
|
|
3
|
+
> **V13 beta: 13.0.0-beta.1** — parallel weak-model runtime với same-model worker pool, event-driven DAG, transactional worktree integration và hardened CLI/Windows runtime.
|
|
4
|
+
> **Stable latest vẫn là V11: 11.0.0.** V13 được đóng gói dưới prerelease `13.0.0-beta.1`; npm prerelease dùng dist-tag `next`, còn `latest` tiếp tục giữ V11 cho đến khi V13 được promote stable.
|
|
5
5
|
|
|
6
6
|
[](https://www.npmjs.com/package/opencode-agent-skill)
|
|
7
7
|
[](LICENSE)
|
|
@@ -49,9 +49,9 @@ Parallel resume không còn yêu cầu root phải sạch tuyệt đối. Nếu
|
|
|
49
49
|
|
|
50
50
|
> **Compatibility:** V13 CLI/durable-state/verification hardening vẫn dùng được trên OpenCode 1.x. Native `ues.dispatch_task` / `ues.dispatch_parallel` cần router plugin và fresh-session APIs của OpenCode V2; nếu capability không đủ, runtime fail closed thay vì giả vờ chạy song song.
|
|
51
51
|
|
|
52
|
-
### V13 beta validation
|
|
52
|
+
### V13 beta validation baseline
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
Baseline beta.0 đã được kiểm tra local trên Windows 10 với OpenCode V2.0.15; beta.1 phải chạy lại full gate trước khi publish:
|
|
55
55
|
|
|
56
56
|
- `npm run evals:v13`: **36/36 PASS**;
|
|
57
57
|
- `npm test`: **298 tests**, **296 pass**, **0 fail**, **2 platform-specific skip**;
|
|
@@ -819,7 +819,7 @@ npm install -g opencode-agent-skill
|
|
|
819
819
|
Phiên bản hiện tại:
|
|
820
820
|
|
|
821
821
|
```text
|
|
822
|
-
13.0.0-beta.
|
|
822
|
+
13.0.0-beta.1
|
|
823
823
|
```
|
|
824
824
|
|
|
825
825
|
V13 beta dùng npm dist-tag `next`; `latest` tiếp tục trỏ tới V11 stable cho đến khi các release gate V13 hoàn tất.
|
|
@@ -835,7 +835,7 @@ npm pack
|
|
|
835
835
|
Trước khi publish, kiểm tra version chưa tồn tại trên registry:
|
|
836
836
|
|
|
837
837
|
```cmd
|
|
838
|
-
npm view opencode-agent-skill@13.0.0-beta.
|
|
838
|
+
npm view opencode-agent-skill@13.0.0-beta.1 version --registry=https://registry.npmjs.org/
|
|
839
839
|
```
|
|
840
840
|
|
|
841
841
|
Nếu version chưa tồn tại, prerelease được publish với dist-tag `next`.
|
package/docs/NPM-PUBLISH.md
CHANGED
|
@@ -27,7 +27,7 @@ Use:
|
|
|
27
27
|
|
|
28
28
|
```cmd
|
|
29
29
|
npm pack
|
|
30
|
-
npm install -g .\opencode-agent-skill-13.0.0-beta.
|
|
30
|
+
npm install -g .\opencode-agent-skill-13.0.0-beta.1.tgz --allow-scripts=opencode-agent-skill
|
|
31
31
|
ocskill install
|
|
32
32
|
ocskill status
|
|
33
33
|
ocskill doctor
|
|
@@ -42,7 +42,7 @@ For routine development, the automated `smoke:pack` test uses an isolated npm pr
|
|
|
42
42
|
Before publishing, verify the exact prerelease version is not already present:
|
|
43
43
|
|
|
44
44
|
```cmd
|
|
45
|
-
npm view opencode-agent-skill@13.0.0-beta.
|
|
45
|
+
npm view opencode-agent-skill@13.0.0-beta.1 version --registry=https://registry.npmjs.org/
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
If it is not present, a manual prerelease publish uses `next`, not `latest`:
|
|
@@ -58,7 +58,7 @@ After publication verify:
|
|
|
58
58
|
|
|
59
59
|
```cmd
|
|
60
60
|
npm view opencode-agent-skill versions --json
|
|
61
|
-
npm view opencode-agent-skill@13.0.0-beta.
|
|
61
|
+
npm view opencode-agent-skill@13.0.0-beta.1 version
|
|
62
62
|
npm dist-tag ls opencode-agent-skill
|
|
63
63
|
```
|
|
64
64
|
|
|
@@ -66,7 +66,7 @@ For V13 beta the expected dist-tags are:
|
|
|
66
66
|
|
|
67
67
|
```text
|
|
68
68
|
latest: 11.0.0
|
|
69
|
-
next: 13.0.0-beta.
|
|
69
|
+
next: 13.0.0-beta.1
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
Do not move `latest` to V13 until the prerelease is intentionally promoted stable.
|
|
@@ -85,7 +85,7 @@ Workflow: publish.yml
|
|
|
85
85
|
|
|
86
86
|
Then the GitHub-hosted workflow can authenticate through OIDC instead of a long-lived npm publish token. npm Trusted Publishing requires the corresponding publisher relationship to be configured on npm; repository code alone cannot create that account-side trust relationship.
|
|
87
87
|
|
|
88
|
-
The current `publish.yml` is tag-only. A matching prerelease tag such as `v13.0.0-beta.
|
|
88
|
+
The current `publish.yml` is tag-only. A matching prerelease tag such as `v13.0.0-beta.1` runs the full package gate and publishes with npm dist-tag `next`; a stable version publishes to `latest`. The workflow first checks whether that exact version already exists and skips duplicate publication.
|
|
89
89
|
|
|
90
90
|
## Release checklist
|
|
91
91
|
|
|
@@ -17,6 +17,38 @@ export const UES_PROMPT_ALIASES = Object.freeze([
|
|
|
17
17
|
|
|
18
18
|
const ALIAS_SET = new Set(UES_PROMPT_ALIASES)
|
|
19
19
|
|
|
20
|
+
export function normalizeUesPromptPaste(text) {
|
|
21
|
+
let value = String(text || "")
|
|
22
|
+
.replace(/^\uFEFF/, "")
|
|
23
|
+
.replace(/^[\u200B-\u200D]+/, "")
|
|
24
|
+
|
|
25
|
+
const trimmed = value.trim()
|
|
26
|
+
const fenced = trimmed.match(/^\`\`\`(?:text|txt|md|markdown|prompt|plaintext)?[ \t]*\r?\n([\s\S]*?)\r?\n\`\`\`\s*$/i)
|
|
27
|
+
if (fenced) value = fenced[1]
|
|
28
|
+
|
|
29
|
+
return value
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function policyPromptForCli(text, maxChars = 12_000) {
|
|
33
|
+
const raw = normalizeUesPromptPaste(text).trim()
|
|
34
|
+
const limit = Math.max(2_000, Number(maxChars) || 12_000)
|
|
35
|
+
if (raw.length <= limit) {
|
|
36
|
+
return { text: raw, truncated: false, originalChars: raw.length, cliChars: raw.length }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const marker = "\n\n[UES_POLICY_INPUT_TRUNCATED_FOR_CLI]\n\n"
|
|
40
|
+
const usable = Math.max(1, limit - marker.length)
|
|
41
|
+
const headChars = Math.floor(usable * 0.72)
|
|
42
|
+
const tailChars = usable - headChars
|
|
43
|
+
const bounded = raw.slice(0, headChars) + marker + raw.slice(-tailChars)
|
|
44
|
+
return {
|
|
45
|
+
text: bounded,
|
|
46
|
+
truncated: true,
|
|
47
|
+
originalChars: raw.length,
|
|
48
|
+
cliChars: bounded.length,
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
20
52
|
function parseFrontmatter(source) {
|
|
21
53
|
const text = String(source || "")
|
|
22
54
|
if (!text.startsWith("---")) return { metadata: {}, body: text }
|
|
@@ -44,7 +76,7 @@ function splitArgs(input) {
|
|
|
44
76
|
}
|
|
45
77
|
|
|
46
78
|
export function expandUesPromptAlias(text, templateDir) {
|
|
47
|
-
const raw =
|
|
79
|
+
const raw = normalizeUesPromptPaste(text)
|
|
48
80
|
const match = raw.match(/^\s*\/(ues-[a-z0-9]+(?:-[a-z0-9]+)*)(?:\s+([\s\S]*?))?\s*$/i)
|
|
49
81
|
if (!match) return null
|
|
50
82
|
|
|
@@ -8,7 +8,7 @@ import { runtimeCapabilities } from "./capabilities.js"
|
|
|
8
8
|
import { parallelRootBaseline, runEventDrivenDAG } from "./parallel-runtime.js"
|
|
9
9
|
import { readProjectJson, readProjectText } from "./text-runtime.js"
|
|
10
10
|
import { extractVerifierVerdict } from "./verifier-runtime.js"
|
|
11
|
-
import { expandUesPromptAlias } from "./command-runtime.js"
|
|
11
|
+
import { expandUesPromptAlias, policyPromptForCli } from "./command-runtime.js"
|
|
12
12
|
import {
|
|
13
13
|
budgetToolResult,
|
|
14
14
|
classifyProviderFailure,
|
|
@@ -1553,17 +1553,29 @@ export default {
|
|
|
1553
1553
|
}
|
|
1554
1554
|
|
|
1555
1555
|
const promptText = String(event.prompt?.text || "")
|
|
1556
|
+
const routingText = promptAlias
|
|
1557
|
+
? (promptAlias.arguments || `/${promptAlias.alias}`)
|
|
1558
|
+
: promptText
|
|
1559
|
+
const policySource = promptAlias
|
|
1560
|
+
? [
|
|
1561
|
+
["ues-run", "ues-resume"].includes(promptAlias.alias)
|
|
1562
|
+
? "Explicit long-horizon engineering request."
|
|
1563
|
+
: `UES command /${promptAlias.alias}.`,
|
|
1564
|
+
promptAlias.arguments,
|
|
1565
|
+
].filter(Boolean).join("\n")
|
|
1566
|
+
: routingText
|
|
1567
|
+
const policyInput = policyPromptForCli(policySource)
|
|
1556
1568
|
let policy = null
|
|
1557
1569
|
try {
|
|
1558
|
-
policy = runOcskillJSON(["task-policy",
|
|
1570
|
+
policy = runOcskillJSON(["task-policy", policyInput.text], projectRoot)
|
|
1559
1571
|
} catch {}
|
|
1560
|
-
const intent = classifyIntent(
|
|
1572
|
+
const intent = classifyIntent(routingText, routingFacts)
|
|
1561
1573
|
const effectiveMaxSkills = Math.max(
|
|
1562
1574
|
1,
|
|
1563
1575
|
Math.min(config.maxSkills, Number(policy?.maxSkills || config.maxSkills)),
|
|
1564
1576
|
)
|
|
1565
1577
|
const selected = []
|
|
1566
|
-
for (const id of [...routeSkillsForPolicy(
|
|
1578
|
+
for (const id of [...routeSkillsForPolicy(routingText, policy, effectiveMaxSkills, routingFacts), ...policySkills(policy)]) {
|
|
1567
1579
|
if (!selected.includes(id)) selected.push(id)
|
|
1568
1580
|
if (selected.length >= effectiveMaxSkills) break
|
|
1569
1581
|
}
|
|
@@ -1587,6 +1599,11 @@ export default {
|
|
|
1587
1599
|
feedbackDomains: routingFacts.feedbackDomains,
|
|
1588
1600
|
acceptedLearningCount: routingFacts.acceptedLearningCount,
|
|
1589
1601
|
},
|
|
1602
|
+
policyInput: {
|
|
1603
|
+
originalChars: policyInput.originalChars,
|
|
1604
|
+
cliChars: policyInput.cliChars,
|
|
1605
|
+
truncated: policyInput.truncated,
|
|
1606
|
+
},
|
|
1590
1607
|
version: 13,
|
|
1591
1608
|
effectiveMaxSkills,
|
|
1592
1609
|
},
|
package/lib/installer.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-agent-skill",
|
|
3
|
-
"version": "13.0.0-beta.
|
|
3
|
+
"version": "13.0.0-beta.1",
|
|
4
4
|
"description": "Parallel weak-model engineering runtime with isolated same-model workers, event-driven DAG execution, transactional integration, adaptive context and evidence-gated verification for OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|