@penclipai/adapter-codex-local 2026.522.0 → 2026.530.0-canary.0
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/server/codex-home.d.ts.map +1 -1
- package/dist/server/codex-home.js +29 -1
- package/dist/server/codex-home.js.map +1 -1
- package/dist/server/codex-home.test.d.ts +2 -0
- package/dist/server/codex-home.test.d.ts.map +1 -0
- package/dist/server/codex-home.test.js +49 -0
- package/dist/server/codex-home.test.js.map +1 -0
- package/dist/server/skills.d.ts.map +1 -1
- package/dist/server/skills.js +5 -46
- package/dist/server/skills.js.map +1 -1
- package/package.json +2 -2
- package/skills/paperclip/references/company-skills.md +68 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-home.d.ts","sourceRoot":"","sources":["../../src/server/codex-home.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAWxE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR;AAMD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CASR;
|
|
1
|
+
{"version":3,"file":"codex-home.d.ts","sourceRoot":"","sources":["../../src/server/codex-home.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAWxE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR;AAMD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CASR;AA0ED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrF;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,EACvC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GACvC,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
|
@@ -43,11 +43,39 @@ async function linkOrCopySharedAuthFile(source, target) {
|
|
|
43
43
|
}
|
|
44
44
|
await fs.symlink(source, target);
|
|
45
45
|
}
|
|
46
|
+
async function targetLinksToSource(target, source) {
|
|
47
|
+
const existing = await fs.lstat(target).catch(() => null);
|
|
48
|
+
if (!existing)
|
|
49
|
+
return false;
|
|
50
|
+
if (process.platform === "win32") {
|
|
51
|
+
if (!existing.isFile())
|
|
52
|
+
return false;
|
|
53
|
+
const [targetContents, sourceContents] = await Promise.all([
|
|
54
|
+
fs.readFile(target).catch(() => null),
|
|
55
|
+
fs.readFile(source).catch(() => null),
|
|
56
|
+
]);
|
|
57
|
+
return Boolean(targetContents && sourceContents && targetContents.equals(sourceContents));
|
|
58
|
+
}
|
|
59
|
+
if (!existing.isSymbolicLink())
|
|
60
|
+
return false;
|
|
61
|
+
const linkedPath = await fs.readlink(target).catch(() => null);
|
|
62
|
+
if (!linkedPath)
|
|
63
|
+
return false;
|
|
64
|
+
return path.resolve(path.dirname(target), linkedPath) === path.resolve(source);
|
|
65
|
+
}
|
|
46
66
|
async function ensureSymlink(target, source) {
|
|
47
67
|
const existing = await fs.lstat(target).catch(() => null);
|
|
48
68
|
if (!existing) {
|
|
49
69
|
await ensureParentDir(target);
|
|
50
|
-
|
|
70
|
+
try {
|
|
71
|
+
await linkOrCopySharedAuthFile(source, target);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code === "EEXIST" && await targetLinksToSource(target, source)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
51
79
|
return;
|
|
52
80
|
}
|
|
53
81
|
if (!existing.isSymbolicLink()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-home.js","sourceRoot":"","sources":["../../src/server/codex-home.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codex-home.js","sourceRoot":"","sources":["../../src/server/codex-home.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-home.test.d.ts","sourceRoot":"","sources":["../../src/server/codex-home.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { prepareManagedCodexHome } from "./codex-home.js";
|
|
6
|
+
describe("codex managed home", () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
vi.restoreAllMocks();
|
|
9
|
+
});
|
|
10
|
+
it("treats a concurrently-created expected auth symlink as success", async () => {
|
|
11
|
+
const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-codex-home-"));
|
|
12
|
+
const sharedCodexHome = path.join(root, "shared-codex-home");
|
|
13
|
+
const paperclipHome = path.join(root, "paperclip-home");
|
|
14
|
+
const managedCodexHome = path.join(paperclipHome, "instances", "default", "companies", "company-1", "codex-home");
|
|
15
|
+
const sharedAuth = path.join(sharedCodexHome, "auth.json");
|
|
16
|
+
const managedAuth = path.join(managedCodexHome, "auth.json");
|
|
17
|
+
await fs.mkdir(sharedCodexHome, { recursive: true });
|
|
18
|
+
await fs.writeFile(sharedAuth, '{"token":"shared"}\n', "utf8");
|
|
19
|
+
const originalSymlink = fs.symlink.bind(fs);
|
|
20
|
+
if (process.platform !== "win32") {
|
|
21
|
+
vi.spyOn(fs, "symlink").mockImplementationOnce(async (source, target, type) => {
|
|
22
|
+
await originalSymlink(source, target, type);
|
|
23
|
+
const error = new Error("file already exists");
|
|
24
|
+
error.code = "EEXIST";
|
|
25
|
+
throw error;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
await expect(prepareManagedCodexHome({
|
|
30
|
+
CODEX_HOME: sharedCodexHome,
|
|
31
|
+
PAPERCLIP_HOME: paperclipHome,
|
|
32
|
+
PAPERCLIP_INSTANCE_ID: "default",
|
|
33
|
+
}, async () => { }, "company-1")).resolves.toBe(managedCodexHome);
|
|
34
|
+
const managedAuthStat = await fs.lstat(managedAuth);
|
|
35
|
+
if (process.platform === "win32") {
|
|
36
|
+
expect(managedAuthStat.isFile()).toBe(true);
|
|
37
|
+
expect(await fs.readFile(managedAuth, "utf8")).toBe(await fs.readFile(sharedAuth, "utf8"));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
expect(managedAuthStat.isSymbolicLink()).toBe(true);
|
|
41
|
+
expect(await fs.realpath(managedAuth)).toBe(await fs.realpath(sharedAuth));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=codex-home.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-home.test.js","sourceRoot":"","sources":["../../src/server/codex-home.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAsBlC,wBAAsB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE7F;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,mBAAmB,EACxB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
|
package/dist/server/skills.js
CHANGED
|
@@ -1,57 +1,16 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { readPaperclipRuntimeSkillEntries, resolvePaperclipDesiredSkillNames, } from "@penclipai/adapter-utils/server-utils";
|
|
3
|
+
import { buildRuntimeMountedSkillSnapshot, readPaperclipRuntimeSkillEntries, resolvePaperclipDesiredSkillNames, } from "@penclipai/adapter-utils/server-utils";
|
|
4
4
|
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
5
5
|
async function buildCodexSkillSnapshot(config) {
|
|
6
6
|
const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);
|
|
7
|
-
const availableByKey = new Map(availableEntries.map((entry) => [entry.key, entry]));
|
|
8
7
|
const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);
|
|
9
|
-
|
|
10
|
-
const entries = availableEntries.map((entry) => ({
|
|
11
|
-
key: entry.key,
|
|
12
|
-
runtimeName: entry.runtimeName,
|
|
13
|
-
desired: desiredSet.has(entry.key),
|
|
14
|
-
managed: true,
|
|
15
|
-
state: desiredSet.has(entry.key) ? "configured" : "available",
|
|
16
|
-
origin: entry.required ? "paperclip_required" : "company_managed",
|
|
17
|
-
originLabel: entry.required ? "Required by Paperclip" : "Managed by Paperclip",
|
|
18
|
-
readOnly: false,
|
|
19
|
-
sourcePath: entry.source,
|
|
20
|
-
targetPath: null,
|
|
21
|
-
detail: desiredSet.has(entry.key)
|
|
22
|
-
? "Will be linked into the effective CODEX_HOME/skills/ directory on the next run."
|
|
23
|
-
: null,
|
|
24
|
-
required: Boolean(entry.required),
|
|
25
|
-
requiredReason: entry.requiredReason ?? null,
|
|
26
|
-
}));
|
|
27
|
-
const warnings = [];
|
|
28
|
-
for (const desiredSkill of desiredSkills) {
|
|
29
|
-
if (availableByKey.has(desiredSkill))
|
|
30
|
-
continue;
|
|
31
|
-
warnings.push(`Desired skill "${desiredSkill}" is not available from the Paperclip skills directory.`);
|
|
32
|
-
entries.push({
|
|
33
|
-
key: desiredSkill,
|
|
34
|
-
runtimeName: null,
|
|
35
|
-
desired: true,
|
|
36
|
-
managed: true,
|
|
37
|
-
state: "missing",
|
|
38
|
-
origin: "external_unknown",
|
|
39
|
-
originLabel: "External or unavailable",
|
|
40
|
-
readOnly: false,
|
|
41
|
-
sourcePath: null,
|
|
42
|
-
targetPath: null,
|
|
43
|
-
detail: "Paperclip cannot find this skill in the local runtime skills directory.",
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
entries.sort((left, right) => left.key.localeCompare(right.key));
|
|
47
|
-
return {
|
|
8
|
+
return buildRuntimeMountedSkillSnapshot({
|
|
48
9
|
adapterType: "codex_local",
|
|
49
|
-
|
|
50
|
-
mode: "ephemeral",
|
|
10
|
+
availableEntries,
|
|
51
11
|
desiredSkills,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
12
|
+
configuredDetail: "Will be linked into the effective CODEX_HOME/skills/ directory on the next run.",
|
|
13
|
+
});
|
|
55
14
|
}
|
|
56
15
|
export async function listCodexSkills(ctx) {
|
|
57
16
|
return buildCodexSkillSnapshot(ctx.config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,OAAO,EACL,gCAAgC,EAChC,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,uCAAuC,CAAC;AAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,KAAK,UAAU,uBAAuB,CACpC,MAA+B;IAE/B,MAAM,gBAAgB,GAAG,MAAM,gCAAgC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,iCAAiC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClF,OAAO,gCAAgC,CAAC;QACtC,WAAW,EAAE,aAAa;QAC1B,gBAAgB;QAChB,aAAa;QACb,gBAAgB,EAAE,iFAAiF;KACpG,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC5D,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAwB,EACxB,cAAwB;IAExB,OAAO,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,MAA+B,EAC/B,gBAA4D;IAE5D,OAAO,iCAAiC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AACrE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@penclipai/adapter-codex-local",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.530.0-canary.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://github.com/penclipai/paperclip-cn",
|
|
6
6
|
"bugs": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"skills"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@penclipai/adapter-utils": "2026.
|
|
41
|
+
"@penclipai/adapter-utils": "2026.530.0-canary.0",
|
|
42
42
|
"picocolors": "^1.1.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
@@ -4,16 +4,21 @@ Use this reference when a board user, CEO, or manager asks you to find a skill,
|
|
|
4
4
|
|
|
5
5
|
## What Exists
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- App-shipped catalog: a curated set of company skills in `@paperclipai/skills-catalog`, browseable and installable without leaving Paperclip.
|
|
8
|
+
- Company skill library: install, inspect, update, audit, reset, and read company skills for the whole company.
|
|
8
9
|
- Agent skill assignment: add or remove company skills on an existing agent.
|
|
9
10
|
- Hire/create composition: pass `desiredSkills` when creating or hiring an agent so the same assignment model applies immediately.
|
|
10
11
|
|
|
11
12
|
The canonical model is:
|
|
12
13
|
|
|
13
|
-
1.
|
|
14
|
-
2.
|
|
14
|
+
1. add the skill to the company library — either from the app catalog (`skills install`), an external source (`skills import`), or a managed local skill (`skills create`/`skills scan-projects`)
|
|
15
|
+
2. attach the company skill to the agent (`skills agent sync`)
|
|
15
16
|
3. optionally do step 2 during hire/create with `desiredSkills`
|
|
16
17
|
|
|
18
|
+
Catalog install ≠ agent attach. Installing a catalog skill only adds the row to
|
|
19
|
+
`company_skills`. The agent will not use it until you sync the agent's desired
|
|
20
|
+
set.
|
|
21
|
+
|
|
17
22
|
## Permission Model
|
|
18
23
|
|
|
19
24
|
- Company skill reads: any same-company actor
|
|
@@ -22,18 +27,78 @@ The canonical model is:
|
|
|
22
27
|
|
|
23
28
|
## Core Endpoints
|
|
24
29
|
|
|
30
|
+
App-shipped catalog (read-only browse + company install):
|
|
31
|
+
|
|
32
|
+
- `GET /api/skills/catalog`
|
|
33
|
+
- `GET /api/skills/catalog/:catalogId`
|
|
34
|
+
- `GET /api/skills/catalog/ref?ref=<id|key|slug>`
|
|
35
|
+
- `GET /api/skills/catalog/:catalogId/files?path=SKILL.md`
|
|
36
|
+
- `POST /api/companies/:companyId/skills/install-catalog`
|
|
37
|
+
|
|
38
|
+
Company library:
|
|
39
|
+
|
|
25
40
|
- `GET /api/companies/:companyId/skills`
|
|
26
41
|
- `GET /api/companies/:companyId/skills/:skillId`
|
|
42
|
+
- `GET /api/companies/:companyId/skills/:skillId/files?path=SKILL.md`
|
|
43
|
+
- `POST /api/companies/:companyId/skills` (managed local create)
|
|
27
44
|
- `POST /api/companies/:companyId/skills/import`
|
|
28
45
|
- `POST /api/companies/:companyId/skills/scan-projects`
|
|
46
|
+
- `GET /api/companies/:companyId/skills/:skillId/update-status`
|
|
29
47
|
- `POST /api/companies/:companyId/skills/:skillId/install-update`
|
|
48
|
+
- `POST /api/companies/:companyId/skills/:skillId/audit`
|
|
49
|
+
- `POST /api/companies/:companyId/skills/:skillId/reset`
|
|
50
|
+
- `DELETE /api/companies/:companyId/skills/:skillId`
|
|
51
|
+
|
|
52
|
+
Agent attach and hire/create composition:
|
|
53
|
+
|
|
30
54
|
- `GET /api/agents/:agentId/skills`
|
|
31
55
|
- `POST /api/agents/:agentId/skills/sync`
|
|
32
56
|
- `POST /api/companies/:companyId/agent-hires`
|
|
33
57
|
- `POST /api/companies/:companyId/agents`
|
|
34
58
|
|
|
59
|
+
If a board user, CEO, or manager is driving locally, prefer the
|
|
60
|
+
`paperclipai skills` CLI documented in `doc/CLI.md` — it wraps every endpoint
|
|
61
|
+
above, accepts company skill or catalog refs by `id`/`key`/`slug`, and prints
|
|
62
|
+
the same JSON these endpoints return when called with `--json`.
|
|
63
|
+
|
|
35
64
|
## Install A Skill Into The Company
|
|
36
65
|
|
|
66
|
+
Two paths cover the common cases:
|
|
67
|
+
|
|
68
|
+
1. **App-shipped catalog** (preferred when the right skill exists in the
|
|
69
|
+
bundled/optional catalog) — browse it first, then install with the catalog
|
|
70
|
+
install endpoint. No external network fetch happens.
|
|
71
|
+
2. **External source** (skills.sh, GitHub, local path, or URL) — use the
|
|
72
|
+
import endpoint below.
|
|
73
|
+
|
|
74
|
+
### App-shipped catalog
|
|
75
|
+
|
|
76
|
+
Browse, inspect, and install catalog skills before reaching for an external
|
|
77
|
+
source. Bundled skills are the curated defaults for any company; optional
|
|
78
|
+
skills are role- or domain-specific.
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
curl -sS "$PAPERCLIP_API_URL/api/skills/catalog?kind=bundled" \
|
|
82
|
+
-H "Authorization: Bearer $PAPERCLIP_API_KEY"
|
|
83
|
+
|
|
84
|
+
curl -sS "$PAPERCLIP_API_URL/api/skills/catalog/ref?ref=github-pr-workflow" \
|
|
85
|
+
-H "Authorization: Bearer $PAPERCLIP_API_KEY"
|
|
86
|
+
|
|
87
|
+
curl -sS -X POST "$PAPERCLIP_API_URL/api/companies/$PAPERCLIP_COMPANY_ID/skills/install-catalog" \
|
|
88
|
+
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
|
|
89
|
+
-H "Content-Type: application/json" \
|
|
90
|
+
-d '{
|
|
91
|
+
"catalogSkillId": "paperclipai:bundled:software-development:github-pr-workflow"
|
|
92
|
+
}'
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The install response records provenance (`catalogId`, `catalogKey`,
|
|
96
|
+
`packageVersion`, `originHash`) on the company skill so update/audit/reset
|
|
97
|
+
flows know the pinned origin. `force: true` may replace a same-key
|
|
98
|
+
catalog-managed skill but never bypasses hard-stop audit findings.
|
|
99
|
+
|
|
100
|
+
### External source import
|
|
101
|
+
|
|
37
102
|
Import using a **skills.sh URL**, a key-style source string, a GitHub URL, or a local path.
|
|
38
103
|
|
|
39
104
|
### Source types (in order of preference)
|