@acidicsoil/portable-capabilities 0.1.8 → 0.1.9

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.
@@ -3541,9 +3541,9 @@ function normalizeDigestValue(value) {
3541
3541
  function stableManifestDigest(value) {
3542
3542
  return digestBytes(new TextEncoder().encode(JSON.stringify(normalizeDigestValue(value))));
3543
3543
  }
3544
- function packageEntriesDigest(entries2, packageIdentities = []) {
3544
+ function packageEntriesDigest(entries, packageIdentities = []) {
3545
3545
  return stableManifestDigest({
3546
- entries: [...entries2].sort((left, right) => left.path.localeCompare(right.path)).map((entry) => ({ path: entry.path, digest: entry.digest, mode: entry.mode })),
3546
+ entries: [...entries].sort((left, right) => left.path.localeCompare(right.path)).map((entry) => ({ path: entry.path, digest: entry.digest, mode: entry.mode })),
3547
3547
  packageIdentities: [...packageIdentities].sort(
3548
3548
  (left, right) => left.lockPath.localeCompare(right.lockPath)
3549
3549
  )
@@ -3792,9 +3792,9 @@ async function copyAtomically(source3, target, mode) {
3792
3792
  await rename2(temporary, target);
3793
3793
  }
3794
3794
  async function desiredEntries(sourceRoot, files) {
3795
- const entries2 = [];
3796
- for (const file of files) entries2.push(await entryFor(join3(sourceRoot, file), file));
3797
- return entries2;
3795
+ const entries = [];
3796
+ for (const file of files) entries.push(await entryFor(join3(sourceRoot, file), file));
3797
+ return entries;
3798
3798
  }
3799
3799
  async function selectedPackageFiles(options) {
3800
3800
  const files = await listPackageFiles(options.sourceRoot);
@@ -3860,9 +3860,9 @@ async function unselectedPackageRoots(options) {
3860
3860
  }
3861
3861
  return Object.freeze(roots);
3862
3862
  }
3863
- async function installedPackageIdentities(sourceRoot, entries2) {
3863
+ async function installedPackageIdentities(sourceRoot, entries) {
3864
3864
  const identities = [];
3865
- for (const entry of entries2.filter((item) => item.path.endsWith("/capability.lock.json"))) {
3865
+ for (const entry of entries.filter((item) => item.path.endsWith("/capability.lock.json"))) {
3866
3866
  const lock = JSON.parse(await readFile2(join3(sourceRoot, entry.path), "utf8"));
3867
3867
  if (lock.schemaVersion !== "2.0.0" || !lock.integrity?.package?.digest || lock.generatedDigest !== lock.integrity.package.digest) {
3868
3868
  throw new Error(`Invalid capability package identity: ${entry.path}`);
@@ -4338,12 +4338,12 @@ async function removeInstallation(targetRoot, faultInjector, capabilityIds) {
4338
4338
  const removes = manifest.entries.filter((entry) => unchanged.has(entry.path)).map((entry) => entry.path);
4339
4339
  const preserved = manifest.entries.filter((entry) => !unchanged.has(entry.path));
4340
4340
  const nextManifest = preserved.length ? (() => {
4341
- const entries2 = Object.freeze(preserved);
4342
- const preservedPaths = new Set(entries2.map((entry) => entry.path));
4341
+ const entries = Object.freeze(preserved);
4342
+ const preservedPaths = new Set(entries.map((entry) => entry.path));
4343
4343
  const packageIdentities = Object.freeze(
4344
4344
  manifest.packageIdentities.filter((identity3) => preservedPaths.has(identity3.lockPath))
4345
4345
  );
4346
- const packageDigest = packageEntriesDigest(entries2, packageIdentities);
4346
+ const packageDigest = packageEntriesDigest(entries, packageIdentities);
4347
4347
  const base = {
4348
4348
  runtimeId: manifest.runtimeId,
4349
4349
  packageVersion: manifest.packageVersion,
@@ -4351,7 +4351,7 @@ async function removeInstallation(targetRoot, faultInjector, capabilityIds) {
4351
4351
  journalVersion: manifest.journalVersion,
4352
4352
  lifecycleState: "modified",
4353
4353
  packageIdentities,
4354
- entries: entries2
4354
+ entries
4355
4355
  };
4356
4356
  return {
4357
4357
  ...manifest,
@@ -11762,8 +11762,8 @@ async function assertNoSymlinks(current) {
11762
11762
  async function treeDigest(root) {
11763
11763
  const hash = createHash3("sha256");
11764
11764
  async function visit(current, relative5 = "") {
11765
- const entries2 = await readdir2(current, { withFileTypes: true });
11766
- for (const entry of entries2.sort((left, right) => left.name.localeCompare(right.name))) {
11765
+ const entries = await readdir2(current, { withFileTypes: true });
11766
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
11767
11767
  if ([".git", "node_modules", ".turbo"].includes(entry.name)) continue;
11768
11768
  const path9 = join4(current, entry.name);
11769
11769
  const child = relative5 ? `${relative5}/${entry.name}` : entry.name;
@@ -12051,10 +12051,81 @@ import { parse } from "yaml";
12051
12051
  import { parseDocument } from "yaml";
12052
12052
 
12053
12053
  // packages/compiler/src/evidence/runtime-claims.ts
12054
+ function parseVersion(value) {
12055
+ const match = value.match(/(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/u);
12056
+ if (!match) return void 0;
12057
+ return {
12058
+ major: Number(match[1]),
12059
+ minor: Number(match[2]),
12060
+ patch: Number(match[3]),
12061
+ prerelease: match[4] ? match[4].split(".").map((part) => /^\d+$/u.test(part) ? Number(part) : part) : []
12062
+ };
12063
+ }
12064
+ function compareVersions(left, right) {
12065
+ for (const key of ["major", "minor", "patch"]) {
12066
+ if (left[key] !== right[key]) return left[key] > right[key] ? 1 : -1;
12067
+ }
12068
+ if (left.prerelease.length === 0 && right.prerelease.length === 0) return 0;
12069
+ if (left.prerelease.length === 0) return 1;
12070
+ if (right.prerelease.length === 0) return -1;
12071
+ for (let index = 0; index < Math.max(left.prerelease.length, right.prerelease.length); index += 1) {
12072
+ const leftPart = left.prerelease[index];
12073
+ const rightPart = right.prerelease[index];
12074
+ if (leftPart === void 0) return -1;
12075
+ if (rightPart === void 0) return 1;
12076
+ if (leftPart === rightPart) continue;
12077
+ if (typeof leftPart === "number" && typeof rightPart === "string") return -1;
12078
+ if (typeof leftPart === "string" && typeof rightPart === "number") return 1;
12079
+ return leftPart > rightPart ? 1 : -1;
12080
+ }
12081
+ return 0;
12082
+ }
12083
+ function caretUpperBound(version) {
12084
+ if (version.major > 0) return { major: version.major + 1, minor: 0, patch: 0, prerelease: [] };
12085
+ if (version.minor > 0) return { major: 0, minor: version.minor + 1, patch: 0, prerelease: [] };
12086
+ return { major: 0, minor: 0, patch: version.patch + 1, prerelease: [] };
12087
+ }
12088
+ function tildeUpperBound(version) {
12089
+ return { major: version.major, minor: version.minor + 1, patch: 0, prerelease: [] };
12090
+ }
12091
+ function matchesConstraint(actual, operator, expected) {
12092
+ if (actual.prerelease.length > 0 && expected.prerelease.length === 0) return false;
12093
+ const comparison = compareVersions(actual, expected);
12094
+ switch (operator ?? "=") {
12095
+ case ">=":
12096
+ return comparison >= 0;
12097
+ case "<=":
12098
+ return comparison <= 0;
12099
+ case ">":
12100
+ return comparison > 0;
12101
+ case "<":
12102
+ return comparison < 0;
12103
+ case "^":
12104
+ return comparison >= 0 && compareVersions(actual, caretUpperBound(expected)) < 0;
12105
+ case "~":
12106
+ return comparison >= 0 && compareVersions(actual, tildeUpperBound(expected)) < 0;
12107
+ default:
12108
+ return comparison === 0;
12109
+ }
12110
+ }
12111
+ function isRuntimeVersionInRange(range, runtimeVersion) {
12112
+ const normalizedRange = range.trim();
12113
+ if (normalizedRange === "*") return true;
12114
+ const actual = parseVersion(runtimeVersion);
12115
+ if (!actual) return false;
12116
+ const expression = normalizedRange.includes(";") ? normalizedRange.slice(normalizedRange.lastIndexOf(";") + 1).trim() : normalizedRange;
12117
+ const constraints = expression.split(/\s+/u).map((token) => {
12118
+ const match = token.match(/^(>=|<=|>|<|=|\^|~)?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$/u);
12119
+ if (!match || !match[2]) return void 0;
12120
+ const version = parseVersion(match[2]);
12121
+ return version ? { operator: match[1], version } : void 0;
12122
+ });
12123
+ return constraints.length > 0 && constraints.every(
12124
+ (constraint) => constraint?.version && matchesConstraint(actual, constraint.operator, constraint.version)
12125
+ );
12126
+ }
12054
12127
  function resolveRuntimeEvidence(claim4, runtimeVersion) {
12055
- const rangeMajor = claim4.versionRange.match(/\d+/)?.[0];
12056
- const runtimeMajor = runtimeVersion.match(/^\d+/)?.[0];
12057
- const applicable = claim4.versionRange === "*" || rangeMajor !== void 0 && rangeMajor === runtimeMajor;
12128
+ const applicable = isRuntimeVersionInRange(claim4.versionRange, runtimeVersion);
12058
12129
  const sufficientState = ["documented", "source-observed", "runtime-observed"].includes(
12059
12130
  claim4.state
12060
12131
  );
@@ -12072,85 +12143,26 @@ function resolveRuntimeEvidence(claim4, runtimeVersion) {
12072
12143
  }
12073
12144
 
12074
12145
  // packages/compiler/src/negotiation/adapter-registry.ts
12075
- var entries = [
12076
- {
12077
- id: "materialize-markdown",
12078
- operationKinds: ["MaterializeArtifact"],
12079
- purityClass: "pure",
12080
- effectClass: "filesystem",
12081
- requiredEvidenceCategories: ["location", "discovery"]
12082
- },
12083
- {
12084
- id: "patch-structured-config",
12085
- operationKinds: ["PatchStructuredConfig"],
12086
- purityClass: "planned-effect",
12087
- effectClass: "configuration",
12088
- requiredEvidenceCategories: ["configuration"]
12089
- },
12090
- {
12091
- id: "pi-extension-registration",
12092
- operationKinds: ["InstallExtension"],
12093
- purityClass: "planned-effect",
12094
- effectClass: "registration",
12095
- requiredEvidenceCategories: ["configuration"]
12096
- },
12097
- {
12098
- id: "oh-my-pi-code-as-hooks",
12099
- operationKinds: ["InstallExtension"],
12100
- purityClass: "planned-effect",
12101
- effectClass: "registration",
12102
- requiredEvidenceCategories: ["hooks", "configuration"]
12103
- },
12104
- {
12105
- id: "antigravity-plugin-registration",
12106
- operationKinds: ["RegisterPlugin"],
12107
- purityClass: "planned-effect",
12108
- effectClass: "registration",
12109
- requiredEvidenceCategories: ["plugin", "location"]
12110
- },
12111
- {
12112
- id: "antigravity-hook-registration",
12113
- operationKinds: ["RegisterHook"],
12114
- purityClass: "planned-effect",
12115
- effectClass: "registration",
12116
- requiredEvidenceCategories: ["hooks", "location"]
12117
- },
12118
- {
12119
- id: "antigravity-mcp-registration",
12120
- operationKinds: ["RegisterMcpServer"],
12121
- purityClass: "planned-effect",
12122
- effectClass: "registration",
12123
- requiredEvidenceCategories: ["mcp", "location"]
12124
- },
12125
- {
12126
- id: "opencode-custom-tool",
12127
- operationKinds: ["InstallExtension"],
12128
- purityClass: "planned-effect",
12129
- effectClass: "registration",
12130
- requiredEvidenceCategories: ["location", "discovery"]
12131
- },
12132
- {
12133
- id: "opencode-plugin",
12134
- operationKinds: ["RegisterPlugin"],
12135
- purityClass: "planned-effect",
12136
- effectClass: "registration",
12137
- requiredEvidenceCategories: ["plugin", "discovery"]
12138
- }
12139
- ];
12140
- var adapterRegistry = new Map(
12141
- entries.map((x) => [x.id, x])
12142
- );
12146
+ var adapterIds = Object.freeze([
12147
+ "materialize-markdown",
12148
+ "patch-structured-config",
12149
+ "pi-extension-registration",
12150
+ "oh-my-pi-code-as-hooks",
12151
+ "antigravity-plugin-registration",
12152
+ "antigravity-hook-registration",
12153
+ "antigravity-mcp-registration",
12154
+ "opencode-custom-tool",
12155
+ "opencode-plugin"
12156
+ ]);
12143
12157
  function requireAdapter(id) {
12144
- const item = adapterRegistry.get(id);
12145
- if (!item) throw new Error(`Unknown adapter ID: ${id}`);
12146
- return item;
12158
+ if (!adapterIds.includes(id)) throw new Error(`Unknown adapter ID: ${id}`);
12147
12159
  }
12148
12160
 
12149
12161
  // packages/compiler/src/negotiation/negotiate-capability.ts
12150
12162
  function negotiateCapability(artifact, descriptor, claims, version) {
12151
12163
  return artifact.invocationIntents.map((intent) => {
12152
12164
  const surface = descriptor.surfaces.find(
12153
- (x) => x.semanticKind === intent && x.evidenceClaimIds.some((claimId) => {
12165
+ (x) => x.semanticKind === intent && (x.versionRange === void 0 || isRuntimeVersionInRange(x.versionRange, version)) && x.evidenceClaimIds.some((claimId) => {
12154
12166
  const claim4 = claims.find((candidate) => candidate.id === claimId);
12155
12167
  return claim4 !== void 0 && resolveRuntimeEvidence(claim4, version).reason !== "version-inapplicable";
12156
12168
  })
@@ -12206,8 +12218,8 @@ var operationalSectionNames = Object.freeze([
12206
12218
  ]);
12207
12219
  function validateOperationalSkillContract(contract) {
12208
12220
  for (const section of operationalSectionNames) {
12209
- const entries2 = contract[section];
12210
- if (!Array.isArray(entries2) || entries2.length === 0 || entries2.some((entry) => !entry.trim())) {
12221
+ const entries = contract[section];
12222
+ if (!Array.isArray(entries) || entries.length === 0 || entries.some((entry) => !entry.trim())) {
12211
12223
  throw new Error(`Missing operational section: ${section}`);
12212
12224
  }
12213
12225
  }
@@ -12227,13 +12239,26 @@ var headings = {
12227
12239
  function renderOperationalSkillContract(contract) {
12228
12240
  validateOperationalSkillContract(contract);
12229
12241
  return operationalSectionNames.map((section) => {
12230
- const entries2 = contract[section].map((entry, index) => `${index + 1}. ${entry}`).join("\n");
12242
+ const entries = contract[section].map((entry, index) => `${index + 1}. ${entry}`).join("\n");
12231
12243
  return `## ${headings[section]}
12232
12244
 
12233
- ${entries2}`;
12245
+ ${entries}`;
12234
12246
  }).join("\n\n");
12235
12247
  }
12236
12248
 
12249
+ // packages/contracts/src/skill-document.ts
12250
+ function renderSkillDocument(input) {
12251
+ const description = input.description.replace(/[\r\n\t]+/gu, " ").replace(/\s{2,}/gu, " ").trim();
12252
+ if (!description) throw new Error(`Skill ${input.name} requires a non-empty description`);
12253
+ return `---
12254
+ name: ${JSON.stringify(input.name)}
12255
+ description: ${JSON.stringify(description)}
12256
+ ---
12257
+ ${input.marker}
12258
+ ${input.content}
12259
+ `;
12260
+ }
12261
+
12237
12262
  // packages/contracts/src/structured-config.ts
12238
12263
  import { existsSync, readFileSync as readFileSync4 } from "node:fs";
12239
12264
  import { parse as parse2, stringify } from "yaml";
@@ -12266,6 +12291,7 @@ function planProjection(artifact, runtimeId, scope, negotiations) {
12266
12291
  id: `materialize:${n4.intent}`,
12267
12292
  artifactId: artifact.id,
12268
12293
  logicalDestination: `${n4.intent}/${artifact.id}`,
12294
+ description: artifact.title,
12269
12295
  content: artifact.operationalContract ? renderOperationalSkillContract(artifact.operationalContract) : artifact.title
12270
12296
  });
12271
12297
  for (const resource2 of artifact.resourceFiles ?? [])
@@ -12301,14 +12327,14 @@ function planProjection(artifact, runtimeId, scope, negotiations) {
12301
12327
 
12302
12328
  // packages/compiler/src/planning/plan-installation.ts
12303
12329
  import { createHash as createHash6 } from "node:crypto";
12304
- function planInstallation(plan, descriptor) {
12330
+ function planInstallation(plan, descriptor, runtimeVersion) {
12305
12331
  const operations = [];
12306
12332
  for (const op of plan.operations) {
12307
12333
  if (op.kind === "MaterializeArtifact") {
12308
12334
  const location = descriptor.locations.find(
12309
- (x) => x.scope === plan.scope && (x.artifactKind === "skill" || x.artifactKind === op.logicalDestination.split("/")[0])
12335
+ (x) => x.scope === plan.scope && (x.artifactKind === "skill" || x.artifactKind === op.logicalDestination.split("/")[0]) && (!x.versionRange || isRuntimeVersionInRange(x.versionRange, runtimeVersion))
12310
12336
  );
12311
- if (!location || !location.pathTemplate || location.installation === "manual") {
12337
+ if (!location?.pathTemplate || location.installation === "manual") {
12312
12338
  operations.push({
12313
12339
  kind: "EmitManualStep",
12314
12340
  id: `manual:${op.id}`,
@@ -12336,14 +12362,15 @@ function planInstallation(plan, descriptor) {
12336
12362
  uninstall: "remove-owned-only",
12337
12363
  ownershipIntent: "own",
12338
12364
  destination: `${location.pathTemplate}/${op.logicalDestination}`,
12365
+ description: op.description,
12339
12366
  content: op.content
12340
12367
  });
12341
12368
  }
12342
12369
  if (op.kind === "IncludeResource") {
12343
12370
  const location = descriptor.locations.find(
12344
- (candidate) => candidate.scope === plan.scope && candidate.artifactKind === "skill"
12371
+ (candidate) => candidate.scope === plan.scope && candidate.artifactKind === "skill" && (!candidate.versionRange || isRuntimeVersionInRange(candidate.versionRange, runtimeVersion))
12345
12372
  );
12346
- if (!location || !location.pathTemplate || location.installation === "manual") {
12373
+ if (!location?.pathTemplate || location.installation === "manual") {
12347
12374
  operations.push({
12348
12375
  kind: "EmitManualStep",
12349
12376
  id: `manual:${op.id}`,
@@ -12415,7 +12442,7 @@ function planSetup(request, artifact, descriptor, claims, ownershipManifest) {
12415
12442
  request.runtimeVersion
12416
12443
  );
12417
12444
  const projectionPlan = planProjection(artifact, descriptor.id, request.scope, negotiations);
12418
- const baseInstallationPlan = planInstallation(projectionPlan, descriptor);
12445
+ const baseInstallationPlan = planInstallation(projectionPlan, descriptor, request.runtimeVersion);
12419
12446
  const mutatingIntent = request.intent === "setup" || request.intent === "update";
12420
12447
  let installationPlan = mutatingIntent ? baseInstallationPlan : { ...baseInstallationPlan, operations: [] };
12421
12448
  if (request.intent === "remove") {
@@ -12486,7 +12513,7 @@ function planSetup(request, artifact, descriptor, claims, ownershipManifest) {
12486
12513
  approvals: request.approvalPolicy === "preapproved" ? [] : approvals,
12487
12514
  manualSteps: installationPlan.operations.filter((operation) => operation.kind === "EmitManualStep").map((operation) => operation.id),
12488
12515
  verificationExpectations: projectionPlan.operations.filter((operation) => operation.kind === "ExpectVerification").map((operation) => operation.expectation),
12489
- nativeUsageInputs: negotiations.filter((outcome) => outcome.surfaceId).map((outcome) => outcome.surfaceId)
12516
+ nativeUsageInputs: negotiations.flatMap(({ surfaceId }) => surfaceId ? [surfaceId] : [])
12490
12517
  };
12491
12518
  }
12492
12519
 
@@ -12601,9 +12628,9 @@ async function resolveVerifiedCapabilityEntrypoint(options) {
12601
12628
  }
12602
12629
 
12603
12630
  // packages/cli/src/release.ts
12604
- var cliVersion = true ? "0.1.8" : createRequire(import.meta.url)("../../../package.json").version;
12631
+ var cliVersion = true ? "0.1.9" : createRequire(import.meta.url)("../../../package.json").version;
12605
12632
 
12606
- // packages/adapters/antigravity/src/materialize.ts
12633
+ // packages/adapters/src/antigravity/materialize.ts
12607
12634
  import { resolve as resolve4 } from "node:path";
12608
12635
  var marker = "<!-- portable-capabilities:owned antigravity -->";
12609
12636
  function destination(value) {
@@ -12634,15 +12661,15 @@ function diagnostic(operation, kind, message) {
12634
12661
  }
12635
12662
  function render(operation) {
12636
12663
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
12637
- if (!skill) return `${marker}
12664
+ const name = skill?.[1];
12665
+ if (!name) return `${marker}
12638
12666
  ${operation.content}`;
12639
- return `---
12640
- name: ${skill[1]}
12641
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
12642
- ---
12643
- ${marker}
12644
- ${operation.content}
12645
- `;
12667
+ return renderSkillDocument({
12668
+ name,
12669
+ description: operation.description,
12670
+ marker,
12671
+ content: operation.content
12672
+ });
12646
12673
  }
12647
12674
  function registration(operation) {
12648
12675
  return `${JSON.stringify({ adapterId: operation.adapterId, kind: operation.kind, target: operation.target }, null, 2)}
@@ -12751,7 +12778,7 @@ function prepareAntigravityMaterialization(plan, root) {
12751
12778
  });
12752
12779
  }
12753
12780
 
12754
- // packages/adapters/antigravity/src/runtime-descriptor.ts
12781
+ // packages/adapters/src/antigravity/runtime-descriptor.ts
12755
12782
  var markdown = "materialize-markdown";
12756
12783
  var plugin = "antigravity-plugin-registration";
12757
12784
  var hook = "antigravity-hook-registration";
@@ -12944,7 +12971,7 @@ var antigravityRuntimeDescriptor = {
12944
12971
  ]
12945
12972
  };
12946
12973
 
12947
- // packages/adapters/antigravity/src/runtime-evidence.ts
12974
+ // packages/adapters/src/antigravity/runtime-evidence.ts
12948
12975
  import { createHash as createHash9 } from "node:crypto";
12949
12976
  var digest2 = (value) => createHash9("sha256").update(value).digest("hex");
12950
12977
  var retrievedAt = "2026-08-10T00:00:00.000Z";
@@ -13092,7 +13119,7 @@ var antigravityRuntimeEvidence = [
13092
13119
  )
13093
13120
  ];
13094
13121
 
13095
- // packages/adapters/claude-code/src/materialize.ts
13122
+ // packages/adapters/src/claude-code/materialize.ts
13096
13123
  import { resolve as resolve5 } from "node:path";
13097
13124
  var marker2 = "<!-- portable-capabilities:owned claude-code -->";
13098
13125
  function destination2(value) {
@@ -13127,15 +13154,15 @@ function diagnostic2(operation, kind, message) {
13127
13154
  }
13128
13155
  function render2(operation) {
13129
13156
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
13130
- if (!skill) return `${marker2}
13157
+ const name = skill?.[1];
13158
+ if (!name) return `${marker2}
13131
13159
  ${operation.content}`;
13132
- return `---
13133
- name: ${skill[1]}
13134
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
13135
- ---
13136
- ${marker2}
13137
- ${operation.content}
13138
- `;
13160
+ return renderSkillDocument({
13161
+ name,
13162
+ description: operation.description,
13163
+ marker: marker2,
13164
+ content: operation.content
13165
+ });
13139
13166
  }
13140
13167
  function config(operation, root, path9) {
13141
13168
  if (operation.format !== "json")
@@ -13249,7 +13276,7 @@ function prepareClaudeCodeMaterialization(plan, root) {
13249
13276
  });
13250
13277
  }
13251
13278
 
13252
- // packages/adapters/claude-code/src/runtime-descriptor.ts
13279
+ // packages/adapters/src/claude-code/runtime-descriptor.ts
13253
13280
  var markdown2 = "materialize-markdown";
13254
13281
  var claudeCodeRuntimeDescriptor = {
13255
13282
  schemaVersion: "1.0",
@@ -13451,7 +13478,7 @@ var claudeCodeRuntimeDescriptor = {
13451
13478
  ]
13452
13479
  };
13453
13480
 
13454
- // packages/adapters/claude-code/src/runtime-evidence.ts
13481
+ // packages/adapters/src/claude-code/runtime-evidence.ts
13455
13482
  import { createHash as createHash10 } from "node:crypto";
13456
13483
  var digest3 = (value) => createHash10("sha256").update(value).digest("hex");
13457
13484
  var retrievedAt2 = "2026-08-10T00:00:00.000Z";
@@ -13622,18 +13649,20 @@ var claudeCodeRuntimeEvidence = Object.freeze([
13622
13649
  }))
13623
13650
  ]);
13624
13651
 
13625
- // packages/adapters/codex/src/materialize.ts
13652
+ // packages/adapters/src/codex/materialize.ts
13626
13653
  import { resolve as resolve6 } from "node:path";
13627
13654
  var marker3 = "<!-- portable-capabilities:owned codex -->";
13628
13655
  function destination3(value) {
13629
13656
  const project = value.match(/^\.codex\/skills\/skill\/(.+)$/);
13630
13657
  if (project) return `.codex/skills/${project[1]}/SKILL.md`;
13658
+ const currentProject = value.match(/^\.agents\/skills\/skill\/(.+)$/);
13659
+ if (currentProject) return `.agents/skills/${currentProject[1]}/SKILL.md`;
13631
13660
  const user = value.match(/^\$CODEX_HOME\/skills\/skill\/(.+)$/);
13632
13661
  if (user) return `.codex-user/skills/${user[1]}/SKILL.md`;
13633
13662
  return value.replace(/^\$CODEX_HOME\//, ".codex-user/");
13634
13663
  }
13635
13664
  function resourceDestination3(value) {
13636
- return value.replace(/^\.codex\/skills\/skill\//u, ".codex/skills/").replace(/^\$CODEX_HOME\/skills\/skill\//u, ".codex-user/skills/");
13665
+ return value.replace(/^\.codex\/skills\/skill\//u, ".codex/skills/").replace(/^\.agents\/skills\/skill\//u, ".agents/skills/").replace(/^\$CODEX_HOME\/skills\/skill\//u, ".codex-user/skills/");
13637
13666
  }
13638
13667
  function confined3(root, path9) {
13639
13668
  const target = resolve6(root, path9);
@@ -13643,15 +13672,15 @@ function confined3(root, path9) {
13643
13672
  }
13644
13673
  function render3(operation) {
13645
13674
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
13646
- if (!skill) return `${marker3}
13675
+ const name = skill?.[1];
13676
+ if (!name) return `${marker3}
13647
13677
  ${operation.content}`;
13648
- return `---
13649
- name: ${skill[1]}
13650
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
13651
- ---
13652
- ${marker3}
13653
- ${operation.content}
13654
- `;
13678
+ return renderSkillDocument({
13679
+ name,
13680
+ description: operation.description,
13681
+ marker: marker3,
13682
+ content: operation.content
13683
+ });
13655
13684
  }
13656
13685
  function transform(operation) {
13657
13686
  if (operation.format !== "json")
@@ -13715,25 +13744,48 @@ function prepareCodexMaterialization(plan, root, ..._options) {
13715
13744
  });
13716
13745
  }
13717
13746
 
13718
- // packages/adapters/codex/src/runtime-descriptor.ts
13747
+ // packages/adapters/src/codex/runtime-descriptor.ts
13719
13748
  var codexRuntimeDescriptor = {
13720
13749
  schemaVersion: "1.0",
13721
13750
  id: "codex",
13722
13751
  aliases: ["codex-cli"],
13723
- supportedVersions: [">=0.146.0"],
13752
+ supportedVersions: ["=0.146.0", ">=0.147.0 <0.148.0"],
13724
13753
  locations: [
13725
13754
  {
13726
- id: "codex-project-skills",
13755
+ id: "codex-project-skills-0146",
13727
13756
  artifactKind: "skill",
13728
13757
  scope: "project",
13729
13758
  pathTemplate: ".codex/skills",
13730
13759
  evidenceClaimIds: ["codex.location.project-skills"],
13760
+ versionRange: "=0.146.0",
13731
13761
  installation: "automatic",
13732
13762
  registration: "discovery",
13733
13763
  uninstall: "automatic"
13734
13764
  },
13735
13765
  {
13736
- id: "codex-user-skills",
13766
+ id: "codex-project-skills-0147",
13767
+ artifactKind: "skill",
13768
+ scope: "project",
13769
+ pathTemplate: ".agents/skills",
13770
+ evidenceClaimIds: ["codex.location.project-skills-agents"],
13771
+ versionRange: ">=0.147.0 <0.148.0",
13772
+ installation: "automatic",
13773
+ registration: "discovery",
13774
+ uninstall: "automatic"
13775
+ },
13776
+ {
13777
+ id: "codex-user-skills-0147",
13778
+ artifactKind: "skill",
13779
+ scope: "user",
13780
+ pathTemplate: ".agents/skills",
13781
+ evidenceClaimIds: ["codex.location.user-skills-agents"],
13782
+ versionRange: ">=0.147.0 <0.148.0",
13783
+ installation: "automatic",
13784
+ registration: "discovery",
13785
+ uninstall: "automatic"
13786
+ },
13787
+ {
13788
+ id: "codex-user-skills-0146",
13737
13789
  artifactKind: "skill",
13738
13790
  scope: "user",
13739
13791
  pathTemplate: "$CODEX_HOME/skills",
@@ -13746,16 +13798,30 @@ var codexRuntimeDescriptor = {
13746
13798
  ],
13747
13799
  surfaces: [
13748
13800
  {
13749
- id: "codex-direct-skill",
13801
+ id: "codex-direct-skill-0146",
13750
13802
  semanticKind: "skill",
13751
13803
  integrationMode: "declarative",
13752
13804
  adapterId: "materialize-markdown",
13753
- discovery: "Codex discovers project and user skills from its native skills roots.",
13754
- invocation: "Invoke the installed skill through Codex's native skill mechanism.",
13805
+ discovery: "Codex 0.146.x discovers project skills from .codex/skills.",
13806
+ invocation: "Invoke the installed skill through Codex 0.146.x native skill selection.",
13755
13807
  precedence: ["project", "user"],
13756
13808
  evidenceClaimIds: ["codex.discovery.skills", "codex.invocation.skills"],
13757
- stability: "stable",
13809
+ versionRange: "=0.146.0",
13810
+ stability: "version-gated",
13758
13811
  evidenceState: "runtime-observed"
13812
+ },
13813
+ {
13814
+ id: "codex-direct-skill-0147",
13815
+ semanticKind: "skill",
13816
+ integrationMode: "declarative",
13817
+ adapterId: "materialize-markdown",
13818
+ discovery: "Codex 0.147.x discovers project skills from .agents/skills.",
13819
+ invocation: "Invoke the installed skill through Codex 0.147.x native skill selection.",
13820
+ precedence: ["project", "user"],
13821
+ evidenceClaimIds: ["codex.discovery.skills-0147", "codex.invocation.skills-0147"],
13822
+ versionRange: ">=0.147.0 <0.148.0",
13823
+ stability: "version-gated",
13824
+ evidenceState: "source-observed"
13759
13825
  }
13760
13826
  ],
13761
13827
  configuration: [],
@@ -13765,10 +13831,37 @@ var codexRuntimeDescriptor = {
13765
13831
  degradation: []
13766
13832
  };
13767
13833
 
13768
- // packages/adapters/codex/src/runtime-evidence.ts
13834
+ // packages/adapters/src/codex/runtime-evidence.ts
13769
13835
  import { createHash as createHash11 } from "node:crypto";
13770
13836
  var digest4 = (value) => createHash11("sha256").update(value).digest("hex");
13771
13837
  var observedAt = "2026-08-08T00:00:00.000Z";
13838
+ var sourceObservedAt = "2026-08-15T00:00:00.000Z";
13839
+ var codexSource = "https://github.com/openai/codex";
13840
+ var codexSkillRootsSource = "https://github.com/openai/codex/blob/53f3fa749659498fa24c81da8fde5440fa7bba7f/codex-rs/ext/skills/src/host_roots.rs";
13841
+ var codexCurrentRange = ">=0.147.0 <0.148.0";
13842
+ var projectSkillRootExcerpt = 'const AGENTS_DIR_NAME: &str = ".agents";\nconst SKILLS_DIR_NAME: &str = "skills";';
13843
+ var userSkillRootExcerpt = "home_dir.join(AGENTS_DIR_NAME).join(SKILLS_DIR_NAME), SkillScope::User";
13844
+ var discoveryExcerpt = "let agents_skills = directory.join(AGENTS_DIR_NAME).join(SKILLS_DIR_NAME);";
13845
+ var invocationExcerpt = 'UserInput::Skill {\n name: "demo".to_string(),';
13846
+ var sourceClaim2 = (id, subject, assertion, sourceLocator, sourceExcerpt) => ({
13847
+ schemaVersion: "1.0",
13848
+ id,
13849
+ runtimeId: "codex",
13850
+ category: id.includes("location") ? "location" : id.includes("discovery") ? "discovery" : "invocation",
13851
+ subject,
13852
+ assertion,
13853
+ versionRange: codexCurrentRange,
13854
+ sourceType: "official-source",
13855
+ source: codexSource,
13856
+ sourceLocator,
13857
+ sourceExcerpt,
13858
+ sourceDigest: digest4(sourceExcerpt),
13859
+ state: "source-observed",
13860
+ confidence: "high",
13861
+ verificationStatus: "verified",
13862
+ stability: "version-gated",
13863
+ verifiedAt: sourceObservedAt
13864
+ });
13772
13865
  var codexRuntimeEvidence = Object.freeze([
13773
13866
  {
13774
13867
  schemaVersion: "1.0",
@@ -13776,54 +13869,82 @@ var codexRuntimeEvidence = Object.freeze([
13776
13869
  runtimeId: "codex",
13777
13870
  category: "location",
13778
13871
  subject: "project skill root",
13779
- assertion: "Codex project skills are materialized beneath .codex/skills.",
13780
- versionRange: ">=0.146.0",
13872
+ assertion: "Codex 0.146.x project skills are materialized beneath .codex/skills.",
13873
+ versionRange: "=0.146.0",
13781
13874
  sourceType: "runtime-probe",
13782
13875
  source: "codex-cli",
13783
- sourceLocator: "native vertical tracer",
13876
+ sourceLocator: "packages/conformance/src/tracer/codex-native-evidence.json",
13784
13877
  sourceExcerpt: ".codex/skills",
13785
- sourceDigest: digest4("codex project skills .codex/skills"),
13878
+ sourceDigest: digest4("codex 0.146 project skills .codex/skills"),
13786
13879
  state: "runtime-observed",
13787
13880
  confidence: "high",
13788
13881
  verificationStatus: "verified",
13789
- stability: "stable",
13882
+ stability: "version-gated",
13790
13883
  verifiedAt: observedAt
13791
13884
  },
13885
+ sourceClaim2(
13886
+ "codex.location.project-skills-agents",
13887
+ "project skill root",
13888
+ "Codex 0.147.x project skills are discovered beneath .agents/skills.",
13889
+ `${codexSkillRootsSource}#L92-L101`,
13890
+ projectSkillRootExcerpt
13891
+ ),
13892
+ sourceClaim2(
13893
+ "codex.location.user-skills-agents",
13894
+ "user skill root",
13895
+ "Codex 0.147.x user skills are discovered beneath ~/.agents/skills.",
13896
+ `${codexSkillRootsSource}#L107-L119`,
13897
+ userSkillRootExcerpt
13898
+ ),
13792
13899
  {
13793
13900
  schemaVersion: "1.0",
13794
13901
  id: "codex.location.user-skills",
13795
13902
  runtimeId: "codex",
13796
13903
  category: "location",
13797
13904
  subject: "user skill root",
13798
- assertion: "Codex user skills are materialized beneath CODEX_HOME/skills.",
13799
- versionRange: ">=0.146.0",
13905
+ assertion: "Codex 0.146.x user skills are materialized beneath CODEX_HOME/skills.",
13906
+ versionRange: "=0.146.0",
13800
13907
  sourceType: "runtime-probe",
13801
13908
  source: "codex-cli",
13802
13909
  sourceLocator: "native vertical tracer",
13803
13910
  sourceExcerpt: "CODEX_HOME/skills",
13804
- sourceDigest: digest4("codex user skills CODEX_HOME/skills"),
13911
+ sourceDigest: digest4("codex 0.146 user skills CODEX_HOME/skills"),
13805
13912
  state: "runtime-observed",
13806
13913
  confidence: "high",
13807
13914
  verificationStatus: "verified",
13808
- stability: "stable",
13915
+ stability: "version-gated",
13809
13916
  verifiedAt: observedAt
13810
13917
  },
13918
+ sourceClaim2(
13919
+ "codex.discovery.skills-0147",
13920
+ "native skill discovery",
13921
+ "Codex 0.147.x discovers Agent Skills from .agents/skills.",
13922
+ `${codexSkillRootsSource}#L139-L161`,
13923
+ discoveryExcerpt
13924
+ ),
13925
+ sourceClaim2(
13926
+ "codex.invocation.skills-0147",
13927
+ "native skill invocation",
13928
+ "Codex 0.147.x invokes a discovered Agent Skill through its native skill selection.",
13929
+ "https://github.com/openai/codex/blob/53f3fa749659498fa24c81da8fde5440fa7bba7f/codex-rs/core/tests/suite/skills.rs",
13930
+ invocationExcerpt
13931
+ ),
13811
13932
  {
13812
13933
  schemaVersion: "1.0",
13813
13934
  id: "codex.discovery.skills",
13814
13935
  runtimeId: "codex",
13815
13936
  category: "discovery",
13816
13937
  subject: "native skill discovery",
13817
- assertion: "Codex natively discovers a skill installed in its project skill root.",
13818
- versionRange: ">=0.146.0",
13938
+ assertion: "Codex 0.146.x natively discovers a skill installed in its project skill root.",
13939
+ versionRange: "=0.146.0",
13819
13940
  sourceType: "runtime-probe",
13820
13941
  source: "codex-cli",
13821
13942
  sourceLocator: "packages/conformance/src/tracer/codex-native-evidence.json",
13822
- sourceDigest: digest4("codex native discovery"),
13943
+ sourceDigest: digest4("codex 0.146 native discovery"),
13823
13944
  state: "runtime-observed",
13824
13945
  confidence: "high",
13825
13946
  verificationStatus: "verified",
13826
- stability: "stable",
13947
+ stability: "version-gated",
13827
13948
  verifiedAt: observedAt
13828
13949
  },
13829
13950
  {
@@ -13832,21 +13953,21 @@ var codexRuntimeEvidence = Object.freeze([
13832
13953
  runtimeId: "codex",
13833
13954
  category: "invocation",
13834
13955
  subject: "native skill invocation",
13835
- assertion: "Codex can invoke an installed skill through the native client.",
13836
- versionRange: ">=0.146.0",
13956
+ assertion: "Codex 0.146.x can invoke an installed skill through the native client.",
13957
+ versionRange: "=0.146.0",
13837
13958
  sourceType: "runtime-probe",
13838
13959
  source: "codex-cli",
13839
13960
  sourceLocator: "packages/conformance/src/tracer/codex-native-evidence.json",
13840
- sourceDigest: digest4("codex native invocation"),
13961
+ sourceDigest: digest4("codex 0.146 native invocation"),
13841
13962
  state: "runtime-observed",
13842
13963
  confidence: "high",
13843
13964
  verificationStatus: "verified",
13844
- stability: "stable",
13965
+ stability: "version-gated",
13845
13966
  verifiedAt: observedAt
13846
13967
  }
13847
13968
  ]);
13848
13969
 
13849
- // packages/adapters/dcode/src/materialize.ts
13970
+ // packages/adapters/src/dcode/materialize.ts
13850
13971
  import { resolve as resolve7 } from "node:path";
13851
13972
  var marker4 = "<!-- portable-capabilities:owned dcode -->";
13852
13973
  function destination4(value) {
@@ -13878,15 +13999,15 @@ function diagnostic3(operation, kind, message) {
13878
13999
  }
13879
14000
  function render4(operation) {
13880
14001
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
13881
- if (!skill) return `${marker4}
14002
+ const name = skill?.[1];
14003
+ if (!name) return `${marker4}
13882
14004
  ${operation.content}`;
13883
- return `---
13884
- name: ${skill[1]}
13885
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
13886
- ---
13887
- ${marker4}
13888
- ${operation.content}
13889
- `;
14005
+ return renderSkillDocument({
14006
+ name,
14007
+ description: operation.description,
14008
+ marker: marker4,
14009
+ content: operation.content
14010
+ });
13890
14011
  }
13891
14012
  function registration3(operation) {
13892
14013
  return `${JSON.stringify({ adapterId: operation.adapterId, kind: operation.kind, target: operation.target }, null, 2)}
@@ -14025,7 +14146,7 @@ ${content}
14025
14146
  });
14026
14147
  }
14027
14148
 
14028
- // packages/adapters/dcode/src/runtime-descriptor.ts
14149
+ // packages/adapters/src/dcode/runtime-descriptor.ts
14029
14150
  var markdown3 = "materialize-markdown";
14030
14151
  var source2 = "source-observed";
14031
14152
  var dcodeRuntimeDescriptor = {
@@ -14230,7 +14351,7 @@ var dcodeRuntimeDescriptor = {
14230
14351
  ]
14231
14352
  };
14232
14353
 
14233
- // packages/adapters/dcode/src/runtime-evidence.ts
14354
+ // packages/adapters/src/dcode/runtime-evidence.ts
14234
14355
  import { createHash as createHash12 } from "node:crypto";
14235
14356
  var digest5 = (value) => createHash12("sha256").update(value).digest("hex");
14236
14357
  var verifiedAt = "2026-08-10T00:00:00.000Z";
@@ -14413,7 +14534,7 @@ var dcodeRuntimeEvidence = Object.freeze([
14413
14534
  })
14414
14535
  ]);
14415
14536
 
14416
- // packages/adapters/oh-my-pi/src/materialize.ts
14537
+ // packages/adapters/src/oh-my-pi/materialize.ts
14417
14538
  import { resolve as resolve8 } from "node:path";
14418
14539
  var marker5 = "<!-- portable-capabilities:owned oh-my-pi -->";
14419
14540
  function resolveOhMyPiProfile(input) {
@@ -14471,13 +14592,13 @@ function diagnostic4(operation, kind, message) {
14471
14592
  }
14472
14593
  function render5(operation) {
14473
14594
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
14474
- return skill ? `---
14475
- name: ${skill[1]}
14476
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
14477
- ---
14478
- ${marker5}
14479
- ${operation.content}
14480
- ` : `${marker5}
14595
+ const name = skill?.[1];
14596
+ return name ? renderSkillDocument({
14597
+ name,
14598
+ description: operation.description,
14599
+ marker: marker5,
14600
+ content: operation.content
14601
+ }) : `${marker5}
14481
14602
  ${operation.content}`;
14482
14603
  }
14483
14604
  function registration4(operation) {
@@ -14586,7 +14707,7 @@ async function prepareOhMyPiMaterialization(plan, root, profile = { home: root }
14586
14707
  });
14587
14708
  }
14588
14709
 
14589
- // packages/adapters/oh-my-pi/src/runtime-descriptor.ts
14710
+ // packages/adapters/src/oh-my-pi/runtime-descriptor.ts
14590
14711
  var markdown4 = "materialize-markdown";
14591
14712
  var hooks = "oh-my-pi-code-as-hooks";
14592
14713
  var config2 = "patch-structured-config";
@@ -14834,7 +14955,7 @@ var ohMyPiRuntimeDescriptor = {
14834
14955
  ]
14835
14956
  };
14836
14957
 
14837
- // packages/adapters/oh-my-pi/src/runtime-evidence.ts
14958
+ // packages/adapters/src/oh-my-pi/runtime-evidence.ts
14838
14959
  import { createHash as createHash13 } from "node:crypto";
14839
14960
  var digest6 = (value) => createHash13("sha256").update(value).digest("hex");
14840
14961
  var verifiedAt2 = "2026-08-10T00:00:00.000Z";
@@ -14984,7 +15105,7 @@ var ohMyPiRuntimeEvidence = [
14984
15105
  }
14985
15106
  ];
14986
15107
 
14987
- // packages/adapters/opencode/src/materialize.ts
15108
+ // packages/adapters/src/opencode/materialize.ts
14988
15109
  import { resolve as resolve9 } from "node:path";
14989
15110
  var marker6 = "<!-- portable-capabilities:owned opencode -->";
14990
15111
  function destination5(value) {
@@ -15021,15 +15142,15 @@ function diagnostic5(operation, kind, message) {
15021
15142
  }
15022
15143
  function render6(operation) {
15023
15144
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
15024
- if (!skill) return `${marker6}
15145
+ const name = skill?.[1];
15146
+ if (!name) return `${marker6}
15025
15147
  ${operation.content}`;
15026
- return `---
15027
- name: ${skill[1]}
15028
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
15029
- ---
15030
- ${marker6}
15031
- ${operation.content}
15032
- `;
15148
+ return renderSkillDocument({
15149
+ name,
15150
+ description: operation.description,
15151
+ marker: marker6,
15152
+ content: operation.content
15153
+ });
15033
15154
  }
15034
15155
  function config3(operation, root, path9) {
15035
15156
  if (operation.format !== "json")
@@ -15137,7 +15258,7 @@ async function prepareOpencodeMaterialization(plan, root) {
15137
15258
  });
15138
15259
  }
15139
15260
 
15140
- // packages/adapters/opencode/src/runtime-descriptor.ts
15261
+ // packages/adapters/src/opencode/runtime-descriptor.ts
15141
15262
  var native = "opencode.stable";
15142
15263
  var beta = "opencode.v2-beta";
15143
15264
  var opencodeRuntimeDescriptor = {
@@ -15419,7 +15540,7 @@ var opencodeRuntimeDescriptor = {
15419
15540
  ]
15420
15541
  };
15421
15542
 
15422
- // packages/adapters/opencode/src/runtime-evidence.ts
15543
+ // packages/adapters/src/opencode/runtime-evidence.ts
15423
15544
  import { createHash as createHash14 } from "node:crypto";
15424
15545
  var retrievedAt3 = "2026-08-10T00:00:00.000Z";
15425
15546
  var docs2 = "docs/RFC/runtime-capability-profiles-revised.md";
@@ -15503,14 +15624,14 @@ var sourceClaims = [
15503
15624
  "discovery",
15504
15625
  "stable skill discovery",
15505
15626
  "OpenCode discovers native project and user skills.",
15506
- "runtime-observed"
15627
+ "source-observed"
15507
15628
  ],
15508
15629
  [
15509
15630
  "invocation.skills",
15510
15631
  "invocation",
15511
15632
  "stable skill invocation",
15512
15633
  "OpenCode invokes a discovered skill through its native skill tool.",
15513
- "runtime-observed"
15634
+ "source-observed"
15514
15635
  ],
15515
15636
  [
15516
15637
  "discovery.agents",
@@ -15648,7 +15769,7 @@ var opencodeRuntimeEvidence = Object.freeze([
15648
15769
  ...betaClaims
15649
15770
  ]);
15650
15771
 
15651
- // packages/adapters/pi/src/materialize.ts
15772
+ // packages/adapters/src/pi/materialize.ts
15652
15773
  import { resolve as resolve10 } from "node:path";
15653
15774
  var marker7 = "<!-- portable-capabilities:owned pi -->";
15654
15775
  function destination6(value) {
@@ -15669,15 +15790,15 @@ function confined7(root, path9) {
15669
15790
  }
15670
15791
  function render7(operation) {
15671
15792
  const skill = operation.destination.match(/skills\/skill\/([^/]+)$/);
15672
- if (!skill) return `${marker7}
15793
+ const name = skill?.[1];
15794
+ if (!name) return `${marker7}
15673
15795
  ${operation.content}`;
15674
- return `---
15675
- name: ${skill[1]}
15676
- description: ${operation.content.replace(/[\r\n]+/g, " ").trim()}
15677
- ---
15678
- ${marker7}
15679
- ${operation.content}
15680
- `;
15796
+ return renderSkillDocument({
15797
+ name,
15798
+ description: operation.description,
15799
+ marker: marker7,
15800
+ content: operation.content
15801
+ });
15681
15802
  }
15682
15803
  function transform2(operation) {
15683
15804
  if (operation.format !== "json")
@@ -15741,7 +15862,7 @@ function preparePiMaterialization(plan, root, ..._options) {
15741
15862
  });
15742
15863
  }
15743
15864
 
15744
- // packages/adapters/pi/src/runtime-descriptor.ts
15865
+ // packages/adapters/src/pi/runtime-descriptor.ts
15745
15866
  var piRuntimeDescriptor = {
15746
15867
  schemaVersion: "1.0",
15747
15868
  id: "pi",
@@ -15819,7 +15940,7 @@ var piRuntimeDescriptor = {
15819
15940
  ]
15820
15941
  };
15821
15942
 
15822
- // packages/adapters/pi/src/runtime-evidence.ts
15943
+ // packages/adapters/src/pi/runtime-evidence.ts
15823
15944
  import { createHash as createHash15 } from "node:crypto";
15824
15945
  var digest8 = (value) => createHash15("sha256").update(value).digest("hex");
15825
15946
  var observedAt2 = "2026-08-08T04:24:00-05:00";
@@ -15885,7 +16006,7 @@ var piRuntimeEvidence = [
15885
16006
  category: "discovery",
15886
16007
  subject: "native skill discovery",
15887
16008
  assertion: "Pi natively discovers a project skill with extensions disabled.",
15888
- versionRange: ">=0.64.0",
16009
+ versionRange: "=0.64.0",
15889
16010
  sourceType: "runtime-probe",
15890
16011
  source: "pi",
15891
16012
  sourceLocator: "packages/conformance/src/tracer/pi-native-evidence.json",
@@ -15903,7 +16024,7 @@ var piRuntimeEvidence = [
15903
16024
  category: "invocation",
15904
16025
  subject: "native skill invocation",
15905
16026
  assertion: "Pi invokes a discovered project skill with extensions disabled.",
15906
- versionRange: ">=0.64.0",
16027
+ versionRange: "=0.64.0",
15907
16028
  sourceType: "runtime-probe",
15908
16029
  source: "pi",
15909
16030
  sourceLocator: "packages/conformance/src/tracer/pi-native-evidence.json",