plugnz 0.0.26 → 0.0.27
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/dist/plugnz.mjs +88 -20
- package/package.json +1 -1
package/dist/plugnz.mjs
CHANGED
|
@@ -7852,7 +7852,12 @@ function homeRoot() {
|
|
|
7852
7852
|
return process.env["HOME"] ?? ".";
|
|
7853
7853
|
}
|
|
7854
7854
|
function claudeCodeRoot() {
|
|
7855
|
-
|
|
7855
|
+
const explicitRoot = process.env["OPEN_PLUGIN_CLAUDE_CODE_ROOT"];
|
|
7856
|
+
if (explicitRoot !== undefined)
|
|
7857
|
+
return explicitRoot;
|
|
7858
|
+
if (process.env["OPEN_PLUGIN_HOME"])
|
|
7859
|
+
return join(homeRoot(), ".claude");
|
|
7860
|
+
return process.env["CLAUDE_CONFIG_DIR"] || join(homeRoot(), ".claude");
|
|
7856
7861
|
}
|
|
7857
7862
|
function codexHome() {
|
|
7858
7863
|
return process.env["OPEN_PLUGIN_CODEX_HOME"] ?? join(homeRoot(), ".codex");
|
|
@@ -14532,7 +14537,7 @@ function parseComponentDefinition(absolute, path, kind, dialect, filenameIdentit
|
|
|
14532
14537
|
declarations
|
|
14533
14538
|
};
|
|
14534
14539
|
return {
|
|
14535
|
-
definition: { kind, dialect, identity, path },
|
|
14540
|
+
definition: { kind, dialect, identity, path, ...kind === "agent" ? { metadataKeys: Object.keys(record).sort() } : {} },
|
|
14536
14541
|
policy,
|
|
14537
14542
|
hasPermissionsPreprocessing: hasAny(record, PERMISSION_FIELDS) || /!`[\s\S]*?`/u.test(body)
|
|
14538
14543
|
};
|
|
@@ -14689,9 +14694,11 @@ function admitPackageSemanticsFromProfiles(request, profiles) {
|
|
|
14689
14694
|
const version = normalizedDetectedVersion(request.detectedVersion);
|
|
14690
14695
|
const candidates = version === undefined ? [] : profiles.filter((candidate) => candidate.host === request.host && candidate.detectedVersion === version && candidate.sourceTypes.includes(request.sourceType) && candidate.operations.includes(request.operation) && candidate.route === request.route);
|
|
14691
14696
|
const portable = (request.operation === "install" || request.operation === "update") && request.inventory.hookDeclarations.some((declaration) => declaration.form === "portable-hooks");
|
|
14692
|
-
const
|
|
14697
|
+
const claudeNative = (request.operation === "install" || request.operation === "update") && !portable && request.inventory.hookDeclarations.some((declaration) => declaration.form !== "portable-hooks");
|
|
14698
|
+
const portableSpecialized = candidates.filter((candidate) => candidate.packageFormat === "portable-hooks");
|
|
14699
|
+
const claudeNativeSpecialized = candidates.filter((candidate) => candidate.packageFormat === "claude-native-hooks");
|
|
14693
14700
|
const ordinary = candidates.filter((candidate) => candidate.packageFormat === undefined);
|
|
14694
|
-
const matching = portable &&
|
|
14701
|
+
const matching = portable && portableSpecialized.length > 0 ? portableSpecialized : claudeNative && claudeNativeSpecialized.length > 0 ? claudeNativeSpecialized : request.operation === "install" || request.operation === "update" ? ordinary : ordinary.length > 0 ? ordinary : portableSpecialized.length > 0 ? portableSpecialized : claudeNativeSpecialized;
|
|
14695
14702
|
if (matching.length > 1) {
|
|
14696
14703
|
throw new Error(`ambiguous capability evidence for ${request.host} ${version} ${request.sourceType} ${request.route} ${request.operation}`);
|
|
14697
14704
|
}
|
|
@@ -14717,7 +14724,7 @@ function admitPackageSemanticsFromProfiles(request, profiles) {
|
|
|
14717
14724
|
}
|
|
14718
14725
|
const gaps = requirements.flatMap((semantic) => {
|
|
14719
14726
|
const sourceOperation = request.operation === "install" || request.operation === "update";
|
|
14720
|
-
const hookProblem = semantic === "hooks" && sourceOperation ? unsupportedHookDeclaration(request.inventory, profile.hookPolicy) : semantic === "auto-update-control" && sourceOperation && profile.packageFormat === "portable-hooks" && request.inventory.autoUpdate.length > 0 ? unsupportedHookProblem("portable hook installation does not project authored native auto-update directives") : null;
|
|
14727
|
+
const hookProblem = semantic === "agents" && sourceOperation && profile.agentPolicy === "prompt-resources" ? unsupportedPromptPersona(request.inventory) : semantic === "hooks" && sourceOperation ? unsupportedHookDeclaration(request.inventory, profile.hookPolicy) : semantic === "auto-update-control" && sourceOperation && profile.packageFormat === "portable-hooks" && request.inventory.autoUpdate.length > 0 ? unsupportedHookProblem("portable hook installation does not project authored native auto-update directives") : null;
|
|
14721
14728
|
const status = profile.semantics[semantic] === "supported" && hookProblem !== null ? hookProblem.status : profile.semantics[semantic];
|
|
14722
14729
|
return status === "supported" ? [] : [capabilityReason(status, semantic, profile, profile.semantics[semantic] === "supported" && hookProblem !== null ? hookProblem.diagnostic : `target '${request.host}' ${profile.detectedVersion} ${profile.route} ${request.operation} is ${status} for ${semantic}`)];
|
|
14723
14730
|
});
|
|
@@ -14768,6 +14775,7 @@ function createCapabilityEvidenceProfile(input) {
|
|
|
14768
14775
|
operationStatus: input.operationStatus,
|
|
14769
14776
|
semantics: PACKAGE_SEMANTICS.map((semantic) => [semantic, input.semantics[semantic]]),
|
|
14770
14777
|
hookPolicy,
|
|
14778
|
+
...input.agentPolicy === undefined ? {} : { agentPolicy: input.agentPolicy },
|
|
14771
14779
|
evidence
|
|
14772
14780
|
};
|
|
14773
14781
|
const hash = new CryptoHasher("sha256");
|
|
@@ -14785,9 +14793,25 @@ function createCapabilityEvidenceProfile(input) {
|
|
|
14785
14793
|
operationStatus: input.operationStatus,
|
|
14786
14794
|
semantics: Object.freeze({ ...input.semantics }),
|
|
14787
14795
|
hookPolicy,
|
|
14796
|
+
...input.agentPolicy === undefined ? {} : { agentPolicy: input.agentPolicy },
|
|
14788
14797
|
evidence: Object.freeze(evidence)
|
|
14789
14798
|
});
|
|
14790
14799
|
}
|
|
14800
|
+
function unsupportedPromptPersona(inventory) {
|
|
14801
|
+
for (const path of inventory.components.agents) {
|
|
14802
|
+
const agent = inventory.componentDefinitions.find((item) => item.kind === "agent" && item.path === path);
|
|
14803
|
+
if (agent?.root !== "agents" || agent.dialect !== "markdown" || agent.metadataKeys === undefined) {
|
|
14804
|
+
return unsupportedHookProblem(`prompt-resource agent adaptation cannot prove '${path}' as a canonical Markdown persona`);
|
|
14805
|
+
}
|
|
14806
|
+
const field = agent.metadataKeys.find((key) => key !== "name" && key !== "description");
|
|
14807
|
+
if (field !== undefined)
|
|
14808
|
+
return unsupportedHookProblem(`prompt-resource agent adaptation cannot preserve '${path}' metadata '${field}'; native agent registration is unsupported`);
|
|
14809
|
+
}
|
|
14810
|
+
if (inventory.components.agents.length > 0 && inventory.components.commands.length === 0) {
|
|
14811
|
+
return unsupportedHookProblem("prompt-resource agent adaptation requires a projected command with persona loading instructions");
|
|
14812
|
+
}
|
|
14813
|
+
return null;
|
|
14814
|
+
}
|
|
14791
14815
|
function unsupportedHookDeclaration(inventory, policy) {
|
|
14792
14816
|
if (policy === null)
|
|
14793
14817
|
return unverifiedHookProblem("target profile has no evidence for authored hook declaration dialects");
|
|
@@ -15868,7 +15892,7 @@ function writeCommandSkill(stage, command, namespace, commandNames) {
|
|
|
15868
15892
|
`;
|
|
15869
15893
|
const preface = `Use the user's text after the skill invocation as command arguments; no text means empty arguments. Load referenced skills from sibling directories (../<skill>/SKILL.md). Plugin personas live at ../../agents/<persona>.md and shared references at ../../references/, relative to this file.
|
|
15870
15894
|
|
|
15871
|
-
For persona work, read the persona file and use the current harness's available delegation facility with those instructions. Persona names are not assumed to be registered tools or agent types. If delegation is unavailable, perform the passes sequentially and report that limitation.
|
|
15895
|
+
For persona work, read the persona file and use the current harness's available delegation facility with those instructions. Persona names are not assumed to be registered tools or agent types. These adaptation instructions override any native-agent registration assumptions in the command body below. If delegation is unavailable, perform the passes sequentially and report that limitation.
|
|
15872
15896
|
|
|
15873
15897
|
`;
|
|
15874
15898
|
mkdirSync5(join25(skillDir, "agents"), { recursive: true });
|
|
@@ -16471,7 +16495,7 @@ function selectLifecycleRoute(adapterId, profiles, request) {
|
|
|
16471
16495
|
return selectedDecision(adapterId, target, request, detectedVersion, "managed", managedAdmission);
|
|
16472
16496
|
}
|
|
16473
16497
|
const versionDiagnostic = request.version.kind === "detected" ? undefined : request.version.diagnostic;
|
|
16474
|
-
const gaps = dedupeGaps([...nativeGaps, ...managedAdmission.gaps].map((gap) => versionDiagnostic === undefined ? gap : { ...gap, diagnostic: `${gap.diagnostic}. ${versionDiagnostic}` }));
|
|
16498
|
+
const gaps = dedupeGaps([...nativeGaps, ...managedAdmission.gaps].map((gap) => versionDiagnostic === undefined ? gap : { ...gap, diagnostic: `${gap.diagnostic}. ${versionDiagnostic}` })).sort((left, right) => Number(left.capabilityId === "profile") - Number(right.capabilityId === "profile"));
|
|
16475
16499
|
if (gaps.length === 0)
|
|
16476
16500
|
invariant("a refused route decision must retain at least one capability gap");
|
|
16477
16501
|
return deepFreeze({
|
|
@@ -18668,12 +18692,51 @@ function claudeReflectionHookProfile() {
|
|
|
18668
18692
|
evidence: [...hooks.evidence, "docs/evidence/claude-code-2.1.285-reflection-20261016.json"]
|
|
18669
18693
|
});
|
|
18670
18694
|
}
|
|
18695
|
+
function claudeAdvisorCandidateHookProfile() {
|
|
18696
|
+
return createCapabilityEvidenceProfile({
|
|
18697
|
+
host: "claude-code",
|
|
18698
|
+
detectedVersion: "2.1.285",
|
|
18699
|
+
packageFormat: "claude-native-hooks",
|
|
18700
|
+
sourceTypes: ["local", "git"],
|
|
18701
|
+
operations: ["install", "update", "retire"],
|
|
18702
|
+
route: "managed",
|
|
18703
|
+
operationStatus: "supported",
|
|
18704
|
+
semantics: Object.fromEntries(PACKAGE_SEMANTICS.map((semantic) => [
|
|
18705
|
+
semantic,
|
|
18706
|
+
["hooks", "auto-update-control", "readback", "rollback", "activation-reload", "retirement", "retention-safety"].includes(semantic) ? "supported" : "unsupported"
|
|
18707
|
+
])),
|
|
18708
|
+
hookPolicy: {
|
|
18709
|
+
manifestPrecedence: [".claude-plugin/plugin.json", "plugin.json"],
|
|
18710
|
+
supportedForms: ["manifest-file"],
|
|
18711
|
+
supportedEvents: ["UserPromptSubmit", "PostToolUse", "PostToolUseFailure", "Stop"],
|
|
18712
|
+
supportedHandlerTypes: ["command"],
|
|
18713
|
+
matcherlessEvents: ["UserPromptSubmit", "Stop", "PostToolUse", "PostToolUseFailure"],
|
|
18714
|
+
supportedMatcherKinds: ["all"],
|
|
18715
|
+
unsupportedHandlerFacets: [
|
|
18716
|
+
"async-enabled",
|
|
18717
|
+
"async-non-boolean",
|
|
18718
|
+
"argv-invalid",
|
|
18719
|
+
"timeout-invalid",
|
|
18720
|
+
"status-message-invalid"
|
|
18721
|
+
]
|
|
18722
|
+
},
|
|
18723
|
+
evidence: [
|
|
18724
|
+
"docs/hosts/claude-code.md",
|
|
18725
|
+
"docs/research/native-plugin-update-capabilities-2026-10-09.md",
|
|
18726
|
+
"docs/evidence/claude-code-2.1.285-advisor-candidate-20261019.json"
|
|
18727
|
+
]
|
|
18728
|
+
});
|
|
18729
|
+
}
|
|
18671
18730
|
function claudeCodeLifecycleDefinition(contracts) {
|
|
18672
18731
|
const version = claudeVersionObservation(observeClaudeCodeVersion());
|
|
18673
18732
|
const detectedVersion = version.kind === "detected" ? version.version : undefined;
|
|
18674
18733
|
return {
|
|
18675
18734
|
id: "claude-code",
|
|
18676
|
-
evidenceProfiles: [
|
|
18735
|
+
evidenceProfiles: [
|
|
18736
|
+
...claudeEvidenceProfiles(detectedVersion, contracts),
|
|
18737
|
+
claudeReflectionHookProfile(),
|
|
18738
|
+
...detectedVersion === "2.1.285" ? [claudeAdvisorCandidateHookProfile()] : []
|
|
18739
|
+
],
|
|
18677
18740
|
probeVersion: async () => version,
|
|
18678
18741
|
observeTarget: async (target) => ({ target, installations: observeClaudeInstallations(target, detectedVersion) }),
|
|
18679
18742
|
observeNativeMutationScope: async (request) => ({
|
|
@@ -19693,7 +19756,7 @@ function disableMarketplaceAutoUpdate(nativeId) {
|
|
|
19693
19756
|
|
|
19694
19757
|
// src/hosts/codex-writer.ts
|
|
19695
19758
|
init_codex_hooks();
|
|
19696
|
-
import { chmodSync, cpSync as cpSync6, existsSync as existsSync22, lstatSync as lstatSync15, mkdirSync as mkdirSync7, mkdtempSync as mkdtempSync6, readFileSync as readFileSync23, readdirSync as readdirSync14, renameSync as renameSync4, rmSync as rmSync7, statSync as statSync10, writeFileSync as writeFileSync7 } from "node:fs";
|
|
19759
|
+
import { chmodSync, cpSync as cpSync6, existsSync as existsSync22, lstatSync as lstatSync15, mkdirSync as mkdirSync7, mkdtempSync as mkdtempSync6, readFileSync as readFileSync23, readdirSync as readdirSync14, readlinkSync as readlinkSync2, renameSync as renameSync4, rmSync as rmSync7, statSync as statSync10, writeFileSync as writeFileSync7 } from "node:fs";
|
|
19697
19760
|
import { dirname as dirname9, join as join29, resolve as resolve16 } from "node:path";
|
|
19698
19761
|
import { tmpdir as tmpdir3 } from "node:os";
|
|
19699
19762
|
|
|
@@ -20215,13 +20278,14 @@ function nativeUpgradeTimeout() {
|
|
|
20215
20278
|
}
|
|
20216
20279
|
var RELOAD_EFFECTIVE = { requirement: "reload", status: "effective" };
|
|
20217
20280
|
var UPDATE_SEMANTICS = ["ordinary-skills", "resources", "auto-update-control", "readback", "rollback", "activation-reload"];
|
|
20218
|
-
var MANAGED_SEMANTICS = [...UPDATE_SEMANTICS, "retirement", "retention-safety", "model-invocation-control", "commands", "mcp"];
|
|
20281
|
+
var MANAGED_SEMANTICS = [...UPDATE_SEMANTICS, "retirement", "retention-safety", "model-invocation-control", "commands", "mcp", "agents"];
|
|
20219
20282
|
var OH_MY_AI_INSTALL_SEMANTICS2 = ["ordinary-skills", "mcp", "resources", "auto-update-control", "readback", "rollback", "activation-reload"];
|
|
20220
20283
|
var codexEvidenceProfiles = [
|
|
20221
20284
|
portableHookProfile(hookAdapter2, "managed", ["install", "update", "retire"]),
|
|
20222
20285
|
codexRouteProfile(CODEX_NATIVE_ROUTE_VERSION, "native", ["update"], UPDATE_SEMANTICS, ["docs/research/native-plugin-update-capabilities-2026-10-09.md", "docs/evidence/codex-native-released-20261011.md"]),
|
|
20223
|
-
...CODEX_MANAGED_ROUTE_VERSIONS.map((version) => codexRouteProfile(version, "managed", ["install", "update", "retire"], version === "0.161.0" ? [...OH_MY_AI_INSTALL_SEMANTICS2, "retirement", "retention-safety"] : MANAGED_SEMANTICS, [
|
|
20286
|
+
...CODEX_MANAGED_ROUTE_VERSIONS.map((version) => codexRouteProfile(version, "managed", ["install", "update", "retire"], version === "0.161.0" ? [...OH_MY_AI_INSTALL_SEMANTICS2, "retirement", "retention-safety", "commands", "model-invocation-control", "agents"] : MANAGED_SEMANTICS, [
|
|
20224
20287
|
"docs/hosts/codex.md",
|
|
20288
|
+
...["0.161.0", "0.162.0"].includes(version) ? ["docs/evidence/codex-addy-20261019.json"] : [],
|
|
20225
20289
|
"docs/adr/0004-retain-plugin-state-on-removal.md",
|
|
20226
20290
|
"docs/evidence/codex-policy-mcp-20261013.json",
|
|
20227
20291
|
"docs/evidence/codex-native-released-20261011.md",
|
|
@@ -20272,6 +20336,8 @@ function codexRouteProfile(detectedVersion, route, operations, supportedSemantic
|
|
|
20272
20336
|
throw new Error("codex marketplace checkout rollback must stay unverified");
|
|
20273
20337
|
}
|
|
20274
20338
|
const supported = new Set(supportedSemantics);
|
|
20339
|
+
if (!["0.161.0", "0.162.0"].includes(detectedVersion))
|
|
20340
|
+
supported.delete("agents");
|
|
20275
20341
|
const semantics = {};
|
|
20276
20342
|
for (const semantic of PACKAGE_SEMANTICS)
|
|
20277
20343
|
semantics[semantic] = supported.has(semantic) ? "supported" : "unsupported";
|
|
@@ -20283,6 +20349,7 @@ function codexRouteProfile(detectedVersion, route, operations, supportedSemantic
|
|
|
20283
20349
|
route,
|
|
20284
20350
|
operationStatus: "supported",
|
|
20285
20351
|
semantics,
|
|
20352
|
+
...supported.has("agents") ? { agentPolicy: "prompt-resources" } : {},
|
|
20286
20353
|
evidence
|
|
20287
20354
|
});
|
|
20288
20355
|
}
|
|
@@ -21190,7 +21257,8 @@ function parseRollbackVersions(value) {
|
|
|
21190
21257
|
return value;
|
|
21191
21258
|
}
|
|
21192
21259
|
function installationRecord(plugin) {
|
|
21193
|
-
const
|
|
21260
|
+
const linked = plugin.path !== undefined && lstatSync15(plugin.path).isSymbolicLink();
|
|
21261
|
+
const owned = plugin.path === undefined || linked ? null : readOwnership2(plugin.path);
|
|
21194
21262
|
const ownership = owned?.pluginId === plugin.id ? { kind: "owned", proof: "created", scopeId: owned.scopeId ?? `codex:${plugin.id}`, proofId: `marker:${plugin.id}` } : { kind: "unmanaged" };
|
|
21195
21263
|
if (plugin.path === undefined) {
|
|
21196
21264
|
return {
|
|
@@ -21206,7 +21274,7 @@ function installationRecord(plugin) {
|
|
|
21206
21274
|
contentRoots: []
|
|
21207
21275
|
};
|
|
21208
21276
|
}
|
|
21209
|
-
const installedFingerprint = fingerprintTree(plugin.path);
|
|
21277
|
+
const installedFingerprint = linked ? new CryptoHasher("sha256").update(`codex-unmanaged-symlink\x00${readlinkSync2(plugin.path)}`).digest("hex") : fingerprintTree(plugin.path);
|
|
21210
21278
|
return {
|
|
21211
21279
|
nativeId: plugin.id,
|
|
21212
21280
|
packageName: plugin.name,
|
|
@@ -23500,7 +23568,7 @@ function receipt(kind, handle) {
|
|
|
23500
23568
|
|
|
23501
23569
|
// src/hosts/omp-writer.ts
|
|
23502
23570
|
init_omp_hooks();
|
|
23503
|
-
import { cpSync as cpSync9, existsSync as existsSync25, lstatSync as lstatSync19, mkdirSync as mkdirSync10, mkdtempSync as mkdtempSync9, readFileSync as readFileSync27, readdirSync as readdirSync18, readlinkSync as
|
|
23571
|
+
import { cpSync as cpSync9, existsSync as existsSync25, lstatSync as lstatSync19, mkdirSync as mkdirSync10, mkdtempSync as mkdtempSync9, readFileSync as readFileSync27, readdirSync as readdirSync18, readlinkSync as readlinkSync3, renameSync as renameSync7, rmSync as rmSync10, symlinkSync, writeFileSync as writeFileSync10 } from "node:fs";
|
|
23504
23572
|
import { dirname as dirname12, join as join33, resolve as resolve20 } from "node:path";
|
|
23505
23573
|
import { tmpdir as tmpdir6 } from "node:os";
|
|
23506
23574
|
var MARKER6 = ".plgnz-install.json";
|
|
@@ -23716,7 +23784,7 @@ function lstatExists(path) {
|
|
|
23716
23784
|
}
|
|
23717
23785
|
function linkPointsTo(path, target) {
|
|
23718
23786
|
try {
|
|
23719
|
-
return lstatSync19(path).isSymbolicLink() && resolve20(dirname12(path),
|
|
23787
|
+
return lstatSync19(path).isSymbolicLink() && resolve20(dirname12(path), readlinkSync3(path)) === resolve20(target);
|
|
23720
23788
|
} catch {
|
|
23721
23789
|
return false;
|
|
23722
23790
|
}
|
|
@@ -24287,7 +24355,7 @@ function restoreLockRow(saved) {
|
|
|
24287
24355
|
}
|
|
24288
24356
|
function currentLinkTarget(path) {
|
|
24289
24357
|
try {
|
|
24290
|
-
return lstatSync19(path).isSymbolicLink() ? resolve20(dirname12(path),
|
|
24358
|
+
return lstatSync19(path).isSymbolicLink() ? resolve20(dirname12(path), readlinkSync3(path)) : null;
|
|
24291
24359
|
} catch {
|
|
24292
24360
|
return null;
|
|
24293
24361
|
}
|
|
@@ -26275,7 +26343,7 @@ var opencodeHookWriter = createNativeHookWriter({
|
|
|
26275
26343
|
|
|
26276
26344
|
// src/hosts/grok-writer.ts
|
|
26277
26345
|
import { spawnSync as spawnSync6 } from "node:child_process";
|
|
26278
|
-
import { cpSync as cpSync13, existsSync as existsSync30, lstatSync as lstatSync24, mkdirSync as mkdirSync15, mkdtempSync as mkdtempSync14, readFileSync as readFileSync32, readdirSync as readdirSync22, readlinkSync as
|
|
26346
|
+
import { cpSync as cpSync13, existsSync as existsSync30, lstatSync as lstatSync24, mkdirSync as mkdirSync15, mkdtempSync as mkdtempSync14, readFileSync as readFileSync32, readdirSync as readdirSync22, readlinkSync as readlinkSync4, renameSync as renameSync12, rmSync as rmSync15, symlinkSync as symlinkSync2, writeFileSync as writeFileSync15 } from "node:fs";
|
|
26279
26347
|
import { dirname as dirname17, join as join38, resolve as resolve24 } from "node:path";
|
|
26280
26348
|
import { tmpdir as tmpdir11 } from "node:os";
|
|
26281
26349
|
var stableId = (plugin) => plugin.marketplace === undefined ? plugin.name : `${plugin.name}@${plugin.marketplace}`;
|
|
@@ -26703,7 +26771,7 @@ function legacyCandidate(plugin, adopt, prior) {
|
|
|
26703
26771
|
throw new Error(`Grok ${plugin.name}: legacy source, version, and native bytes must match before adoption`);
|
|
26704
26772
|
const link = join38(grokRoot(), "plugins", plugin.name);
|
|
26705
26773
|
if (existsSync30(link) || lstatExists2(link)) {
|
|
26706
|
-
if (!lstatSync24(link).isSymbolicLink() || canonical(resolve24(dirname17(link),
|
|
26774
|
+
if (!lstatSync24(link).isSymbolicLink() || canonical(resolve24(dirname17(link), readlinkSync4(link))) !== installed)
|
|
26707
26775
|
throw new Error(`Grok ${plugin.name}: unmanaged same-name plugin link blocks adoption`);
|
|
26708
26776
|
}
|
|
26709
26777
|
return { source, fingerprint: fingerprintTree(installed), ...lstatExists2(link) ? { link } : {} };
|
|
@@ -27084,7 +27152,7 @@ function captureHostSnapshot(directory, nativeId, packageName, attemptId, operat
|
|
|
27084
27152
|
writeFileSync15(join38(directory, "registry-repo.json"), JSON.stringify(matched === undefined ? { key: null } : { key: matched[0], repo: matched[1] }));
|
|
27085
27153
|
const link = join38(grokRoot(), "plugins", packageName);
|
|
27086
27154
|
if (lstatExists2(link) && lstatSync24(link).isSymbolicLink())
|
|
27087
|
-
writeFileSync15(join38(directory, "link.txt"),
|
|
27155
|
+
writeFileSync15(join38(directory, "link.txt"), readlinkSync4(link));
|
|
27088
27156
|
}
|
|
27089
27157
|
function freshNativePaths(directory, marketplacePath) {
|
|
27090
27158
|
const paths = new Set;
|
|
@@ -34178,7 +34246,7 @@ function legacyCommandAction(command) {
|
|
|
34178
34246
|
// package.json
|
|
34179
34247
|
var package_default = {
|
|
34180
34248
|
name: "plugnz",
|
|
34181
|
-
version: "0.0.
|
|
34249
|
+
version: "0.0.27",
|
|
34182
34250
|
description: "Install, diagnose and update agent plugins (Agent Plugins spec) and MCP configs across Claude Code, Codex, Cursor, Kimi and more",
|
|
34183
34251
|
license: "MIT",
|
|
34184
34252
|
type: "module",
|
package/package.json
CHANGED