@kodycodes/cli 3.0.5 → 3.1.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/README.md +6 -3
- package/dist/{auth-FV2O77LC.js → auth-2N7CSZGJ.js} +5 -5
- package/dist/bin.js +8 -8
- package/dist/{chunk-YXJ5S67U.js → chunk-5BIXRCH7.js} +2 -2
- package/dist/{chunk-WDVDHEEN.js → chunk-FDRTJFCM.js} +2 -2
- package/dist/{chunk-PZKBPKJ2.js → chunk-FS3BGXCK.js} +2 -2
- package/dist/{chunk-PUQGDXIY.js → chunk-JNQKDAPN.js} +2 -2
- package/dist/{chunk-VMP2UL6Z.js → chunk-PDDX5RJS.js} +6 -6
- package/dist/{chunk-SSBZQMVX.js → chunk-QI3ZICHR.js} +5 -5
- package/dist/chunk-TCJSXIEG.js +233 -0
- package/dist/chunk-TCJSXIEG.js.map +6 -0
- package/dist/{chunk-PIPQ2TTK.js → chunk-TGBFPYAY.js} +4 -4
- package/dist/{chunk-R6WETL6J.js → chunk-TK2Y4XD6.js} +51 -41
- package/dist/chunk-TK2Y4XD6.js.map +6 -0
- package/dist/{chunk-HO4GCC6N.js → chunk-YFDVDTNX.js} +15 -15
- package/dist/cli.js +8 -8
- package/dist/{dev-command-UDO2T4OI.js → dev-command-OUTCMZOC.js} +27 -27
- package/dist/{git-credential-6CJWVNED.js → git-credential-NTAPSLZP.js} +6 -6
- package/dist/{local-execute-O7FXIINV.js → local-execute-6NSAVTAV.js} +12 -12
- package/dist/{local-package-graph-FEPI7JNQ.js → local-package-graph-UU3XHKIM.js} +2 -2
- package/dist/{local-package-run-42R3CP2A.js → local-package-run-RATCOPRD.js} +9 -9
- package/dist/{mock-dep-resolve-TTCQQEN2.js → mock-dep-resolve-FM5GKMKE.js} +6 -6
- package/dist/mock-fetch-gateway-TNK74HEP.js +1 -1
- package/dist/{mock-local-deps-Z6DBUQTP.js → mock-local-deps-6I7HSHXD.js} +4 -4
- package/dist/mock-server-CJQI6B3A.js +1 -1
- package/dist/{open-api-client-42L6TM2U.js → open-api-client-7TV5SPHT.js} +3 -3
- package/dist/{remote-execute-J35MQTUC.js → remote-execute-XLKI7JTI.js} +3 -3
- package/dist/{setup-git-IGLLNSLA.js → setup-git-LQVUW2D4.js} +4 -4
- package/dist/skill-7B2RL273.js +38 -0
- package/dist/skill-7B2RL273.js.map +6 -0
- package/dist/skill-refresh.d.ts +2 -0
- package/dist/skill-refresh.js +20 -0
- package/dist/skill-refresh.js.map +6 -0
- package/dist/skill.d.ts +53 -11
- package/package.json +2 -2
- package/skills/kody/SKILL.md +15 -129
- package/dist/chunk-R6WETL6J.js.map +0 -6
- package/dist/skill-D74XVI6T.js +0 -61
- package/dist/skill-D74XVI6T.js.map +0 -6
- /package/dist/{auth-FV2O77LC.js.map → auth-2N7CSZGJ.js.map} +0 -0
- /package/dist/{chunk-YXJ5S67U.js.map → chunk-5BIXRCH7.js.map} +0 -0
- /package/dist/{chunk-WDVDHEEN.js.map → chunk-FDRTJFCM.js.map} +0 -0
- /package/dist/{chunk-PZKBPKJ2.js.map → chunk-FS3BGXCK.js.map} +0 -0
- /package/dist/{chunk-PUQGDXIY.js.map → chunk-JNQKDAPN.js.map} +0 -0
- /package/dist/{chunk-VMP2UL6Z.js.map → chunk-PDDX5RJS.js.map} +0 -0
- /package/dist/{chunk-SSBZQMVX.js.map → chunk-QI3ZICHR.js.map} +0 -0
- /package/dist/{chunk-PIPQ2TTK.js.map → chunk-TGBFPYAY.js.map} +0 -0
- /package/dist/{chunk-HO4GCC6N.js.map → chunk-YFDVDTNX.js.map} +0 -0
- /package/dist/{dev-command-UDO2T4OI.js.map → dev-command-OUTCMZOC.js.map} +0 -0
- /package/dist/{git-credential-6CJWVNED.js.map → git-credential-NTAPSLZP.js.map} +0 -0
- /package/dist/{local-execute-O7FXIINV.js.map → local-execute-6NSAVTAV.js.map} +0 -0
- /package/dist/{local-package-graph-FEPI7JNQ.js.map → local-package-graph-UU3XHKIM.js.map} +0 -0
- /package/dist/{local-package-run-42R3CP2A.js.map → local-package-run-RATCOPRD.js.map} +0 -0
- /package/dist/{mock-dep-resolve-TTCQQEN2.js.map → mock-dep-resolve-FM5GKMKE.js.map} +0 -0
- /package/dist/{mock-local-deps-Z6DBUQTP.js.map → mock-local-deps-6I7HSHXD.js.map} +0 -0
- /package/dist/{open-api-client-42L6TM2U.js.map → open-api-client-7TV5SPHT.js.map} +0 -0
- /package/dist/{remote-execute-J35MQTUC.js.map → remote-execute-XLKI7JTI.js.map} +0 -0
- /package/dist/{setup-git-IGLLNSLA.js.map → setup-git-LQVUW2D4.js.map} +0 -0
package/README.md
CHANGED
|
@@ -37,8 +37,11 @@ for the CLI itself.
|
|
|
37
37
|
npx @kodycodes/cli skill install
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
installs the Kody CLI skill into Claude Code / Cursor / Codex / `.agents`
|
|
41
|
+
folders. It prefers the always-current hosted
|
|
42
|
+
`/.well-known/agent-skills/kody-cli/SKILL.md` (and refreshes stale local copies
|
|
43
|
+
on later CLI runs). That skill tells shell-capable agents to prefer
|
|
44
|
+
`execute --local`.
|
|
42
45
|
|
|
43
46
|
`--mcp-url` or `KODY_MCP_URL` overrides the default `https://kody.codes/mcp`.
|
|
44
47
|
|
|
@@ -72,7 +75,7 @@ multi-org store as the active org (no re-login).
|
|
|
72
75
|
| Command | Purpose |
|
|
73
76
|
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
74
77
|
| `kody install` | Detect running local MCP clients, write their config, and start host OAuth. **Recommended long-term path.** |
|
|
75
|
-
| `kody skill install` |
|
|
78
|
+
| `kody skill install` | Installs the hosted `kody-cli` skill (or the bundled stub offline) into Claude Code / Cursor / Codex / `.agents`. Later CLI runs refresh stale copies by digest. |
|
|
76
79
|
| `kody login` | Browser OAuth (CIMD + PKCE) for the CLI itself. Adds/replaces one org login (browser picker, or `kody login --org acme`) and keeps other org logins. |
|
|
77
80
|
| `kody org list` | Lists logged-in orgs and marks the active one. `--json` for agents. |
|
|
78
81
|
| `kody org use [<slug>]` | Switches the active org. With a slug (agents) switches directly; with no slug on a TTY opens a chooser; without a TTY pass a slug. |
|
|
@@ -7,15 +7,15 @@ import {
|
|
|
7
7
|
login,
|
|
8
8
|
refreshStoredCredentials,
|
|
9
9
|
resolvePendingOrgSlug
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-QI3ZICHR.js";
|
|
11
11
|
import "./chunk-CASGRYOF.js";
|
|
12
12
|
import "./chunk-GVSGNTG6.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-CWWHR4FH.js";
|
|
14
|
+
import "./chunk-TGBFPYAY.js";
|
|
14
15
|
import "./chunk-46IJPEID.js";
|
|
15
|
-
import "./chunk-BML3W5CO.js";
|
|
16
16
|
import "./chunk-CCRCEU7S.js";
|
|
17
|
+
import "./chunk-BML3W5CO.js";
|
|
17
18
|
import "./chunk-NHRYNRXG.js";
|
|
18
|
-
import "./chunk-CWWHR4FH.js";
|
|
19
19
|
import "./chunk-3H72XY5R.js";
|
|
20
20
|
import "./chunk-BTL3PJ2H.js";
|
|
21
21
|
import "./chunk-UW6AWLXX.js";
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
refreshStoredCredentials,
|
|
29
29
|
resolvePendingOrgSlug
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=auth-
|
|
31
|
+
//# sourceMappingURL=auth-2N7CSZGJ.js.map
|
package/dist/bin.js
CHANGED
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
runCli
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TK2Y4XD6.js";
|
|
6
6
|
import "./chunk-2XPH7L2P.js";
|
|
7
7
|
import "./chunk-SLNAWWQK.js";
|
|
8
8
|
import "./chunk-YDWTXEKQ.js";
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-7PRJ36I5.js";
|
|
10
|
+
import "./chunk-FS3BGXCK.js";
|
|
11
|
+
import "./chunk-JNQKDAPN.js";
|
|
11
12
|
import "./chunk-6ZYUGXVW.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-QI3ZICHR.js";
|
|
13
14
|
import "./chunk-CASGRYOF.js";
|
|
14
15
|
import "./chunk-GVSGNTG6.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-CWWHR4FH.js";
|
|
17
|
+
import "./chunk-TGBFPYAY.js";
|
|
16
18
|
import "./chunk-46IJPEID.js";
|
|
17
|
-
import "./chunk-BML3W5CO.js";
|
|
18
19
|
import "./chunk-CCRCEU7S.js";
|
|
20
|
+
import "./chunk-BML3W5CO.js";
|
|
19
21
|
import "./chunk-NHRYNRXG.js";
|
|
20
|
-
import "./chunk-7PRJ36I5.js";
|
|
21
|
-
import "./chunk-CWWHR4FH.js";
|
|
22
22
|
import "./chunk-3H72XY5R.js";
|
|
23
23
|
import "./chunk-BTL3PJ2H.js";
|
|
24
24
|
import "./chunk-UW6AWLXX.js";
|
|
@@ -1177,7 +1177,7 @@ async function resolveLocalPackageGraph(input) {
|
|
|
1177
1177
|
mergePackageGraphs,
|
|
1178
1178
|
resolveLocalPackageModules,
|
|
1179
1179
|
tryLoadSelfManifest
|
|
1180
|
-
} = await import("./mock-local-deps-
|
|
1180
|
+
} = await import("./mock-local-deps-6I7HSHXD.js");
|
|
1181
1181
|
if (imports.length > 0 && input.packageRoot) {
|
|
1182
1182
|
const selfManifest = await tryLoadSelfManifest(input.packageRoot);
|
|
1183
1183
|
const local = await resolveLocalPackageModules({
|
|
@@ -1594,4 +1594,4 @@ export {
|
|
|
1594
1594
|
createPackageBindingsLiteral,
|
|
1595
1595
|
fetchLocalPackageGraph
|
|
1596
1596
|
};
|
|
1597
|
-
//# sourceMappingURL=chunk-
|
|
1597
|
+
//# sourceMappingURL=chunk-5BIXRCH7.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
localExecuteGatewayFetchShimModuleName,
|
|
4
4
|
localWorkerModuleNames,
|
|
5
5
|
runSecretHeader
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5BIXRCH7.js";
|
|
7
7
|
import {
|
|
8
8
|
redact
|
|
9
9
|
} from "./chunk-CASGRYOF.js";
|
|
@@ -475,4 +475,4 @@ export {
|
|
|
475
475
|
assertLocalPackageScopedSecretWriteAllowed,
|
|
476
476
|
installMockFetchShimModules
|
|
477
477
|
};
|
|
478
|
-
//# sourceMappingURL=chunk-
|
|
478
|
+
//# sourceMappingURL=chunk-FDRTJFCM.js.map
|
|
@@ -30,7 +30,7 @@ async function resolveLocalExecuteBearer(input) {
|
|
|
30
30
|
`kody login credentials for ${mcpOrigin} are only sent to ${expectedPairedApiOrigin(mcpUrl)}. For ${apiOrigin}, run \`kody auth bootstrap --code \u2026 --api-url ${apiOrigin}\` or set KODY_API_TOKEN.`
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
|
-
const ensure = input.ensureCredentials ?? (await import("./auth-
|
|
33
|
+
const ensure = input.ensureCredentials ?? (await import("./auth-2N7CSZGJ.js")).ensureFreshCredentials;
|
|
34
34
|
try {
|
|
35
35
|
const credentials = await ensure({
|
|
36
36
|
mcpUrl: input.mcpUrl,
|
|
@@ -51,4 +51,4 @@ async function resolveLocalExecuteBearer(input) {
|
|
|
51
51
|
export {
|
|
52
52
|
resolveLocalExecuteBearer
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-FS3BGXCK.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
OpenApiError,
|
|
7
7
|
openApiGet,
|
|
8
8
|
openApiRequest
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-TGBFPYAY.js";
|
|
10
10
|
import {
|
|
11
11
|
assertTokenSafeApiUrl,
|
|
12
12
|
capabilityProxyUrl,
|
|
@@ -982,4 +982,4 @@ export {
|
|
|
982
982
|
authRemoveGit,
|
|
983
983
|
formatAuthRemoveGitReport
|
|
984
984
|
};
|
|
985
|
-
//# sourceMappingURL=chunk-
|
|
985
|
+
//# sourceMappingURL=chunk-JNQKDAPN.js.map
|
|
@@ -2,17 +2,17 @@ import { createRequire as __createRequire } from 'node:module'; const require =
|
|
|
2
2
|
import {
|
|
3
3
|
bundleLocalUserModule
|
|
4
4
|
} from "./chunk-7RLOLQIT.js";
|
|
5
|
-
import {
|
|
6
|
-
loadPackageManifest,
|
|
7
|
-
resolveExportModulePath
|
|
8
|
-
} from "./chunk-RAZBIC6O.js";
|
|
9
5
|
import {
|
|
10
6
|
LocalPackageGraphError,
|
|
11
7
|
absolutizeWorkerdPackageImports,
|
|
12
8
|
hasLiteralDynamicSavedPackageImports,
|
|
13
9
|
listSavedPackageImports,
|
|
14
10
|
rewriteBareKodyBuiltinImports
|
|
15
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5BIXRCH7.js";
|
|
12
|
+
import {
|
|
13
|
+
loadPackageManifest,
|
|
14
|
+
resolveExportModulePath
|
|
15
|
+
} from "./chunk-RAZBIC6O.js";
|
|
16
16
|
|
|
17
17
|
// src/mock-local-deps.ts
|
|
18
18
|
import { access, readFile } from "node:fs/promises";
|
|
@@ -199,4 +199,4 @@ export {
|
|
|
199
199
|
tryLoadSelfManifest,
|
|
200
200
|
packageRootOf
|
|
201
201
|
};
|
|
202
|
-
//# sourceMappingURL=chunk-
|
|
202
|
+
//# sourceMappingURL=chunk-PDDX5RJS.js.map
|
|
@@ -5,18 +5,18 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
openUrl
|
|
7
7
|
} from "./chunk-GVSGNTG6.js";
|
|
8
|
+
import {
|
|
9
|
+
orgSlugFromFlag
|
|
10
|
+
} from "./chunk-CWWHR4FH.js";
|
|
8
11
|
import {
|
|
9
12
|
OpenApiError,
|
|
10
13
|
openApiGet,
|
|
11
14
|
openApiRequest
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-TGBFPYAY.js";
|
|
13
16
|
import {
|
|
14
17
|
isScopedApiToken,
|
|
15
18
|
notAuthenticatedMessage
|
|
16
19
|
} from "./chunk-CCRCEU7S.js";
|
|
17
|
-
import {
|
|
18
|
-
orgSlugFromFlag
|
|
19
|
-
} from "./chunk-CWWHR4FH.js";
|
|
20
20
|
import {
|
|
21
21
|
fileStorePath,
|
|
22
22
|
loadCredentialStore,
|
|
@@ -2132,4 +2132,4 @@ export {
|
|
|
2132
2132
|
ensureOpenApiCredentials,
|
|
2133
2133
|
login
|
|
2134
2134
|
};
|
|
2135
|
-
//# sourceMappingURL=chunk-
|
|
2135
|
+
//# sourceMappingURL=chunk-QI3ZICHR.js.map
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
defaultMcpUrl
|
|
4
|
+
} from "./chunk-BTL3PJ2H.js";
|
|
5
|
+
|
|
6
|
+
// src/skill.ts
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
9
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
10
|
+
import { basename, dirname, join } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
var skillRelativePath = "skills/kody/SKILL.md";
|
|
14
|
+
var hostedSkillName = "kody-cli";
|
|
15
|
+
var skillFrontmatter = `---
|
|
16
|
+
name: kody
|
|
17
|
+
description: >
|
|
18
|
+
Install and bootstrap the Kody CLI, then prefer \`execute --local\` when Node
|
|
19
|
+
and a shell are available. Use when the person mentions Kody or wants local
|
|
20
|
+
execute instead of hosted Worker compute days.
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
`;
|
|
24
|
+
var hostedAgentSkillsIndexPath = "/.well-known/agent-skills/index.json";
|
|
25
|
+
function bundledSkillPath() {
|
|
26
|
+
return join(fileURLToPath(new URL("../", import.meta.url)), skillRelativePath);
|
|
27
|
+
}
|
|
28
|
+
function agentSkillsOriginFromMcpUrl(mcpUrl = defaultMcpUrl) {
|
|
29
|
+
return new URL(mcpUrl).origin;
|
|
30
|
+
}
|
|
31
|
+
function userSkillTargets(home = homedir()) {
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
host: "Claude Code",
|
|
35
|
+
path: join(home, ".claude", "skills", "kody", "SKILL.md")
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
host: "Cursor",
|
|
39
|
+
path: join(home, ".cursor", "skills", "kody", "SKILL.md")
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
host: "Codex",
|
|
43
|
+
path: join(home, ".codex", "skills", "kody", "SKILL.md")
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
host: "Agents",
|
|
47
|
+
path: join(home, ".agents", "skills", "kody", "SKILL.md")
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
function projectSkillTargets(cwd = process.cwd()) {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
host: "Agents",
|
|
55
|
+
path: join(cwd, ".agents", "skills", "kody", "SKILL.md")
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
host: "Cursor",
|
|
59
|
+
path: join(cwd, ".cursor", "skills", "kody", "SKILL.md")
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
host: "Codex",
|
|
63
|
+
path: join(cwd, ".codex", "skills", "kody", "SKILL.md")
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
host: "Claude Code",
|
|
67
|
+
path: join(cwd, ".claude", "skills", "kody", "SKILL.md")
|
|
68
|
+
}
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
function sha256Digest(body) {
|
|
72
|
+
return `sha256:${createHash("sha256").update(body, "utf8").digest("hex")}`;
|
|
73
|
+
}
|
|
74
|
+
function wrapHostedSkillBody(body) {
|
|
75
|
+
const trimmed = body.replace(/^\uFEFF/, "");
|
|
76
|
+
if (trimmed.startsWith("---\n") || trimmed.startsWith("---\r\n")) {
|
|
77
|
+
return trimmed.endsWith("\n") ? trimmed : `${trimmed}
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
const normalized = trimmed.endsWith("\n") ? trimmed : `${trimmed}
|
|
81
|
+
`;
|
|
82
|
+
return `${skillFrontmatter}${normalized}`;
|
|
83
|
+
}
|
|
84
|
+
function extractSkillBodyForDigest(fileContents) {
|
|
85
|
+
const trimmed = fileContents.replace(/^\uFEFF/, "");
|
|
86
|
+
if (!trimmed.startsWith("---")) {
|
|
87
|
+
return trimmed.endsWith("\n") ? trimmed : `${trimmed}
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
const end = trimmed.indexOf("\n---", 3);
|
|
91
|
+
if (end === -1) {
|
|
92
|
+
return trimmed.endsWith("\n") ? trimmed : `${trimmed}
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
const body = trimmed.slice(end + "\n---".length).replace(/^(?:\r?\n)+/, "");
|
|
96
|
+
return body.endsWith("\n") ? body : `${body}
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
var hostedSkillFetchTimeoutMs = 5e3;
|
|
100
|
+
async function fetchHostedKodyCliSkill(input) {
|
|
101
|
+
const origin = (input.origin ?? agentSkillsOriginFromMcpUrl()).replace(
|
|
102
|
+
/\/$/,
|
|
103
|
+
""
|
|
104
|
+
);
|
|
105
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
106
|
+
const timeoutMs = input.timeoutMs ?? hostedSkillFetchTimeoutMs;
|
|
107
|
+
try {
|
|
108
|
+
const indexResponse = await fetchImpl(
|
|
109
|
+
`${origin}${hostedAgentSkillsIndexPath}`,
|
|
110
|
+
{
|
|
111
|
+
headers: { accept: "application/json" },
|
|
112
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
if (!indexResponse.ok) return null;
|
|
116
|
+
const index = await indexResponse.json();
|
|
117
|
+
const entry = index.skills?.find((skill) => skill.name === hostedSkillName);
|
|
118
|
+
if (!entry?.url || !entry.digest) return null;
|
|
119
|
+
const skillResponse = await fetchImpl(entry.url, {
|
|
120
|
+
headers: { accept: "text/markdown, text/plain;q=0.9, */*;q=0.8" },
|
|
121
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
122
|
+
});
|
|
123
|
+
if (!skillResponse.ok) return null;
|
|
124
|
+
const rawBody = await skillResponse.text();
|
|
125
|
+
const body = rawBody.endsWith("\n") ? rawBody : `${rawBody}
|
|
126
|
+
`;
|
|
127
|
+
if (sha256Digest(body) !== entry.digest) return null;
|
|
128
|
+
return {
|
|
129
|
+
body,
|
|
130
|
+
digest: entry.digest,
|
|
131
|
+
url: entry.url
|
|
132
|
+
};
|
|
133
|
+
} catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function installSkill(input) {
|
|
138
|
+
const hosted = input.sourcePath ? null : await fetchHostedKodyCliSkill({
|
|
139
|
+
origin: input.origin,
|
|
140
|
+
fetchImpl: input.fetchImpl
|
|
141
|
+
});
|
|
142
|
+
const source = input.sourcePath ?? bundledSkillPath();
|
|
143
|
+
const body = hosted ? wrapHostedSkillBody(hosted.body) : await readFile(source, "utf8");
|
|
144
|
+
const targets = input.project ? projectSkillTargets(input.cwd) : userSkillTargets(input.home);
|
|
145
|
+
for (const target of targets) {
|
|
146
|
+
await mkdir(dirname(target.path), { recursive: true });
|
|
147
|
+
await writeFile(target.path, body, "utf8");
|
|
148
|
+
}
|
|
149
|
+
return targets;
|
|
150
|
+
}
|
|
151
|
+
async function refreshInstalledSkills(input = {}) {
|
|
152
|
+
const hosted = await fetchHostedKodyCliSkill({
|
|
153
|
+
origin: input.origin,
|
|
154
|
+
fetchImpl: input.fetchImpl
|
|
155
|
+
});
|
|
156
|
+
if (!hosted) return [];
|
|
157
|
+
const nextBody = wrapHostedSkillBody(hosted.body);
|
|
158
|
+
const refreshed = [];
|
|
159
|
+
const candidates = userSkillTargets(input.home);
|
|
160
|
+
for (const target of candidates) {
|
|
161
|
+
try {
|
|
162
|
+
const current = await readFile(target.path, "utf8");
|
|
163
|
+
const currentDigest = sha256Digest(extractSkillBodyForDigest(current));
|
|
164
|
+
if (currentDigest === hosted.digest) continue;
|
|
165
|
+
await writeFileAtomic(target.path, nextBody);
|
|
166
|
+
refreshed.push(target);
|
|
167
|
+
} catch {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return refreshed;
|
|
172
|
+
}
|
|
173
|
+
async function writeFileAtomic(path, body) {
|
|
174
|
+
const dir = dirname(path);
|
|
175
|
+
const temp = join(
|
|
176
|
+
dir,
|
|
177
|
+
`.${basename(path)}.${randomBytes(6).toString("hex")}.tmp`
|
|
178
|
+
);
|
|
179
|
+
try {
|
|
180
|
+
await writeFile(temp, body, "utf8");
|
|
181
|
+
await rename(temp, path);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
try {
|
|
184
|
+
await unlink(temp);
|
|
185
|
+
} catch {
|
|
186
|
+
}
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function skillRefreshEntryPath() {
|
|
191
|
+
return fileURLToPath(new URL("./skill-refresh.js", import.meta.url));
|
|
192
|
+
}
|
|
193
|
+
function scheduleDetachedSkillRefresh(input = {}) {
|
|
194
|
+
const spawnFn = input.spawnImpl ?? spawn;
|
|
195
|
+
const args = [skillRefreshEntryPath()];
|
|
196
|
+
if (input.origin) {
|
|
197
|
+
args.push("--origin", input.origin);
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const child = spawnFn(process.execPath, args, {
|
|
201
|
+
detached: true,
|
|
202
|
+
stdio: "ignore",
|
|
203
|
+
windowsHide: true,
|
|
204
|
+
env: {
|
|
205
|
+
...process.env,
|
|
206
|
+
KODY_SKIP_SKILL_REFRESH: "1"
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
child.on?.("error", () => {
|
|
210
|
+
});
|
|
211
|
+
child.unref();
|
|
212
|
+
} catch {
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export {
|
|
217
|
+
hostedAgentSkillsIndexPath,
|
|
218
|
+
bundledSkillPath,
|
|
219
|
+
agentSkillsOriginFromMcpUrl,
|
|
220
|
+
userSkillTargets,
|
|
221
|
+
projectSkillTargets,
|
|
222
|
+
sha256Digest,
|
|
223
|
+
wrapHostedSkillBody,
|
|
224
|
+
extractSkillBodyForDigest,
|
|
225
|
+
hostedSkillFetchTimeoutMs,
|
|
226
|
+
fetchHostedKodyCliSkill,
|
|
227
|
+
installSkill,
|
|
228
|
+
refreshInstalledSkills,
|
|
229
|
+
writeFileAtomic,
|
|
230
|
+
skillRefreshEntryPath,
|
|
231
|
+
scheduleDetachedSkillRefresh
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=chunk-TCJSXIEG.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/skill.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
userCacheDir
|
|
4
|
-
} from "./chunk-BML3W5CO.js";
|
|
5
2
|
import {
|
|
6
3
|
assertTokenSafeApiUrl,
|
|
7
4
|
capabilityProxyUrl,
|
|
@@ -11,6 +8,9 @@ import {
|
|
|
11
8
|
readPackageVersion,
|
|
12
9
|
rejectedApiTokenMessage
|
|
13
10
|
} from "./chunk-CCRCEU7S.js";
|
|
11
|
+
import {
|
|
12
|
+
userCacheDir
|
|
13
|
+
} from "./chunk-BML3W5CO.js";
|
|
14
14
|
import {
|
|
15
15
|
formatUnreachableApiMessage,
|
|
16
16
|
requestSentStatus
|
|
@@ -1663,4 +1663,4 @@ export {
|
|
|
1663
1663
|
toolResultFromHttpBody,
|
|
1664
1664
|
whoamiWithApiToken
|
|
1665
1665
|
};
|
|
1666
|
-
//# sourceMappingURL=chunk-
|
|
1666
|
+
//# sourceMappingURL=chunk-TGBFPYAY.js.map
|