@kisev/skills-opencode 2.0.4 → 2.0.5

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [Русский](README.ru.md)
4
4
 
5
- `@kisev/skills-opencode@2.0.4` is the optional OpenCode-specific layer. Portable
5
+ `@kisev/skills-opencode@2.0.5` is the optional OpenCode-specific layer. Portable
6
6
  skills have a separate lifecycle and must be installed independently through the
7
7
  [root portable flow](../../README.md).
8
8
 
@@ -30,7 +30,7 @@ Install in the repository's npm project and run the CLI from that project root:
30
30
 
31
31
  ```shell
32
32
  cd /path/to/project
33
- npm install --save-exact @kisev/skills-opencode@2.0.4
33
+ npm install --save-exact @kisev/skills-opencode@2.0.5
34
34
  npm exec -- skills-opencode install --scope project --dry-run
35
35
  ```
36
36
 
@@ -45,7 +45,7 @@ Use `~/.config/opencode` as the persistent npm project:
45
45
  mkdir -p "$HOME/.config/opencode"
46
46
  cd "$HOME/.config/opencode"
47
47
  test -f package.json || npm init --yes
48
- npm install --save-exact @kisev/skills-opencode@2.0.4
48
+ npm install --save-exact @kisev/skills-opencode@2.0.5
49
49
  npm exec -- skills-opencode install --scope global --dry-run
50
50
  ```
51
51
 
@@ -149,7 +149,7 @@ version, preview and confirm `install` with the same scope and desired selection
149
149
  then restart OpenCode:
150
150
 
151
151
  ```shell
152
- npm install --save-exact @kisev/skills-opencode@2.0.4
152
+ npm install --save-exact @kisev/skills-opencode@2.0.5
153
153
  npm exec -- skills-opencode install --scope project --dry-run
154
154
  ```
155
155
 
package/README.ru.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | [Русский](README.ru.md)
4
4
 
5
- `@kisev/skills-opencode@2.0.4` - optional OpenCode-specific слой. У portable
5
+ `@kisev/skills-opencode@2.0.5` - optional OpenCode-specific слой. У portable
6
6
  skills отдельный lifecycle: их нужно установить независимо через
7
7
  [корневую инструкцию](../../README.ru.md).
8
8
 
@@ -30,7 +30,7 @@ assets или portable skills и не меняют OpenCode configuration.
30
30
 
31
31
  ```shell
32
32
  cd /path/to/project
33
- npm install --save-exact @kisev/skills-opencode@2.0.4
33
+ npm install --save-exact @kisev/skills-opencode@2.0.5
34
34
  npm exec -- skills-opencode install --scope project --dry-run
35
35
  ```
36
36
 
@@ -45,7 +45,7 @@ Package остаётся в project `node_modules`, confirmed assets разме
45
45
  mkdir -p "$HOME/.config/opencode"
46
46
  cd "$HOME/.config/opencode"
47
47
  test -f package.json || npm init --yes
48
- npm install --save-exact @kisev/skills-opencode@2.0.4
48
+ npm install --save-exact @kisev/skills-opencode@2.0.5
49
49
  npm exec -- skills-opencode install --scope global --dry-run
50
50
  ```
51
51
 
@@ -149,7 +149,7 @@ incomplete probe failure.
149
149
  перезапустите OpenCode:
150
150
 
151
151
  ```shell
152
- npm install --save-exact @kisev/skills-opencode@2.0.4
152
+ npm install --save-exact @kisev/skills-opencode@2.0.5
153
153
  npm exec -- skills-opencode install --scope project --dry-run
154
154
  ```
155
155
 
@@ -667,7 +667,7 @@ export async function applyAgentProfileChange(request, scope, confirmationDigest
667
667
  if (stable(receipt.request) !== stable(request))
668
668
  throw new AgentProfileError("confirmation_unknown", "Saved confirmation belongs to a different request");
669
669
  const built = await buildAgentProfilePlan(request, scope, cwd, home);
670
- if (built.plan.digest !== receipt.plan_digest)
670
+ if (built.plan.digest !== (receipt.plan_digest ?? receipt.digest))
671
671
  throw new AgentProfileError("stale_plan", "Agent inventory changed after preview");
672
672
  if (built.plan.operations.some((item) => item.operation === "conflict" && item.reason.includes("collision")))
673
673
  throw new AgentProfileError("collision", "Exact-name user-owned collision blocks apply");
package/dist/catalog.d.ts CHANGED
@@ -4,5 +4,5 @@ export declare const CATALOG: {
4
4
  readonly agents: readonly ["manager", "architect", "mapper", "worker", "review", "critic"];
5
5
  readonly package_commands: readonly ["capabilities", "doctor", "reconcile", "agent-profiles"];
6
6
  readonly tools: readonly ["capabilities", "route", "doctor", "agent_profiles", "reconcile"];
7
- readonly version: "2.0.4";
7
+ readonly version: "2.0.5";
8
8
  };
package/dist/catalog.js CHANGED
@@ -34,5 +34,5 @@ export const CATALOG = {
34
34
  agents: ["manager", "architect", "mapper", "worker", "review", "critic"],
35
35
  package_commands: ["capabilities", "doctor", "reconcile", "agent-profiles"],
36
36
  tools: ["capabilities", "route", "doctor", "agent_profiles", "reconcile"],
37
- version: "2.0.4",
37
+ version: "2.0.5",
38
38
  };
package/dist/installer.js CHANGED
@@ -448,7 +448,9 @@ export async function apply(action, scope, confirmationDigest, cwd = process.cwd
448
448
  throw new InstallerError("recovered_transaction", "Recovered an interrupted transaction; request a fresh plan");
449
449
  const receipt = (await consumeReceipt(stateRoot, { digest: confirmationDigest, kind: `installer:${action}`, scope, root }));
450
450
  const built = await build(action, scope, cwd, home, selection);
451
- if (built.plan.digest !== receipt.plan_digest)
451
+ const savedPlanDigest = receipt.plan_digest ??
452
+ receipt.digest;
453
+ if (built.plan.digest !== savedPlanDigest)
452
454
  throw new InstallerError("stale_plan", "Installer plan changed after preview");
453
455
  if (built.plan.operations.some((item) => item.operation === "conflict" && (item.reason === "unmanaged_file" || item.reason === "v1.0.0_agent_ownership_mismatch" || item.reason?.includes("collision")))) {
454
456
  throw new InstallerError("conflict", "Installer plan contains an exact-name ownership conflict");
package/dist/lifecycle.js CHANGED
@@ -296,6 +296,65 @@ function parseReceipt(raw) {
296
296
  throw new LifecycleError("invalid_receipt", "Receipt is not valid JSON");
297
297
  }
298
298
  const receipt = value;
299
+ if (receipt &&
300
+ receipt.schema_version === 1 &&
301
+ typeof receipt.digest === "string" &&
302
+ /^[a-f0-9]{64}$/.test(receipt.digest) &&
303
+ typeof receipt.nonce === "string" &&
304
+ typeof receipt.expires_at === "string" &&
305
+ typeof receipt.consumed === "boolean" &&
306
+ typeof receipt.kind === "string" &&
307
+ (receipt.scope === "global" || receipt.scope === "project") &&
308
+ typeof receipt.root === "string" &&
309
+ typeof receipt.integrity === "string" &&
310
+ receipt.plan_digest === undefined) {
311
+ const legacyDocument = {
312
+ schema_version: 1,
313
+ digest: receipt.digest,
314
+ nonce: receipt.nonce,
315
+ expires_at: receipt.expires_at,
316
+ consumed: receipt.consumed,
317
+ kind: receipt.kind,
318
+ scope: receipt.scope,
319
+ root: receipt.root,
320
+ payload: receipt.payload,
321
+ integrity: receipt.integrity,
322
+ };
323
+ if (receipt.digest !==
324
+ digest({
325
+ schema_version: 1,
326
+ kind: receipt.kind,
327
+ scope: receipt.scope,
328
+ root: receipt.root,
329
+ payload: receipt.payload,
330
+ }) ||
331
+ receipt.integrity !==
332
+ digest({
333
+ schema_version: 1,
334
+ digest: receipt.digest,
335
+ nonce: receipt.nonce,
336
+ expires_at: receipt.expires_at,
337
+ consumed: receipt.consumed,
338
+ kind: receipt.kind,
339
+ scope: receipt.scope,
340
+ root: receipt.root,
341
+ payload: receipt.payload,
342
+ })) {
343
+ throw new LifecycleError("invalid_receipt", "Receipt integrity check failed");
344
+ }
345
+ const payloadRecord = receipt.payload;
346
+ const planDigest = payloadRecord &&
347
+ typeof payloadRecord === "object" &&
348
+ typeof payloadRecord.digest === "string" &&
349
+ /^[a-f0-9]{64}$/.test(payloadRecord.digest)
350
+ ? payloadRecord.digest
351
+ : digest(receipt.payload);
352
+ return {
353
+ ...legacyDocument,
354
+ plan_digest: planDigest,
355
+ created_at: new Date(Date.parse(receipt.expires_at) - RECEIPT_TTL_MS).toISOString(),
356
+ };
357
+ }
299
358
  if (!receipt ||
300
359
  receipt.schema_version !== 1 ||
301
360
  typeof receipt.digest !== "string" ||
package/dist/reconcile.js CHANGED
@@ -497,7 +497,7 @@ export async function applyReconcile(scope, confirmationDigest, cwd = process.cw
497
497
  root,
498
498
  }));
499
499
  const built = await build(scope, cwd, home);
500
- if (built.plan.plan_digest !== payload.plan_digest)
500
+ if (built.plan.plan_digest !== (payload.plan_digest ?? payload.digest))
501
501
  throw new ReconcileError("stale_plan", "Reconcile inventory changed after preview");
502
502
  if (built.plan.conflicts.length || built.plan.modified_managed.length)
503
503
  throw new ReconcileError("conflict", "Reconcile contains unsafe ownership conflicts");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kisev/skills-opencode",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "OpenCode integration and opt-in installer for portable Agent Skills.",
5
5
  "license": "MIT",
6
6
  "repository": {