@kisev/skills-opencode 2.0.4 → 2.0.6
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 +4 -4
- package/README.ru.md +4 -4
- package/dist/agent-profiles.js +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.js +1 -1
- package/dist/installer.js +3 -1
- package/dist/lifecycle.js +59 -0
- package/dist/reconcile.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[Русский](README.ru.md)
|
|
4
4
|
|
|
5
|
-
`@kisev/skills-opencode@2.0.
|
|
5
|
+
`@kisev/skills-opencode@2.0.6` 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.
|
|
33
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
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.
|
|
48
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
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.
|
|
152
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
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.
|
|
5
|
+
`@kisev/skills-opencode@2.0.6` - 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.
|
|
33
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
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.
|
|
48
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
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.
|
|
152
|
+
npm install --save-exact @kisev/skills-opencode@2.0.6
|
|
153
153
|
npm exec -- skills-opencode install --scope project --dry-run
|
|
154
154
|
```
|
|
155
155
|
|
package/dist/agent-profiles.js
CHANGED
|
@@ -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.
|
|
7
|
+
readonly version: "2.0.6";
|
|
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.
|
|
37
|
+
version: "2.0.6",
|
|
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
|
-
|
|
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");
|