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 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.0** — 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.0`; npm prerelease dùng dist-tag `next`, còn `latest` tiếp tục giữ V11 cho đến khi V13 được promote stable.
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
  [![npm version](https://img.shields.io/npm/v/opencode-agent-skill.svg)](https://www.npmjs.com/package/opencode-agent-skill)
7
7
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](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 hiện tại
52
+ ### V13 beta validation baseline
53
53
 
54
- Bản đóng gói hiện tại đã được kiểm tra local trên Windows 10 với OpenCode V2.0.15:
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.0
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.0 version --registry=https://registry.npmjs.org/
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`.
@@ -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.0.tgz --allow-scripts=opencode-agent-skill
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.0 version --registry=https://registry.npmjs.org/
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.0 version
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.0
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.0` 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.
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
 
@@ -1,6 +1,6 @@
1
1
  # V13 Parallel Weak-Model Runtime
2
2
 
3
- Status: beta prerelease (`13.0.0-beta.0`).
3
+ Status: beta prerelease (`13.0.0-beta.1`).
4
4
 
5
5
  ## Goal
6
6
 
@@ -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 = String(text || "")
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", promptText], projectRoot)
1570
+ policy = runOcskillJSON(["task-policy", policyInput.text], projectRoot)
1559
1571
  } catch {}
1560
- const intent = classifyIntent(promptText, routingFacts)
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(promptText, policy, effectiveMaxSkills, routingFacts), ...policySkills(policy)]) {
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
@@ -340,6 +340,7 @@ export async function installResources(options = {}) {
340
340
  stateError: `State belongs to another package: ${previous.package}`,
341
341
  skills: [],
342
342
  commands: [],
343
+ promptAliases: [],
343
344
  agents: [],
344
345
  plugins: [],
345
346
  warnings,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-agent-skill",
3
- "version": "13.0.0-beta.0",
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": {