@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.
Files changed (58) hide show
  1. package/README.md +6 -3
  2. package/dist/{auth-FV2O77LC.js → auth-2N7CSZGJ.js} +5 -5
  3. package/dist/bin.js +8 -8
  4. package/dist/{chunk-YXJ5S67U.js → chunk-5BIXRCH7.js} +2 -2
  5. package/dist/{chunk-WDVDHEEN.js → chunk-FDRTJFCM.js} +2 -2
  6. package/dist/{chunk-PZKBPKJ2.js → chunk-FS3BGXCK.js} +2 -2
  7. package/dist/{chunk-PUQGDXIY.js → chunk-JNQKDAPN.js} +2 -2
  8. package/dist/{chunk-VMP2UL6Z.js → chunk-PDDX5RJS.js} +6 -6
  9. package/dist/{chunk-SSBZQMVX.js → chunk-QI3ZICHR.js} +5 -5
  10. package/dist/chunk-TCJSXIEG.js +233 -0
  11. package/dist/chunk-TCJSXIEG.js.map +6 -0
  12. package/dist/{chunk-PIPQ2TTK.js → chunk-TGBFPYAY.js} +4 -4
  13. package/dist/{chunk-R6WETL6J.js → chunk-TK2Y4XD6.js} +51 -41
  14. package/dist/chunk-TK2Y4XD6.js.map +6 -0
  15. package/dist/{chunk-HO4GCC6N.js → chunk-YFDVDTNX.js} +15 -15
  16. package/dist/cli.js +8 -8
  17. package/dist/{dev-command-UDO2T4OI.js → dev-command-OUTCMZOC.js} +27 -27
  18. package/dist/{git-credential-6CJWVNED.js → git-credential-NTAPSLZP.js} +6 -6
  19. package/dist/{local-execute-O7FXIINV.js → local-execute-6NSAVTAV.js} +12 -12
  20. package/dist/{local-package-graph-FEPI7JNQ.js → local-package-graph-UU3XHKIM.js} +2 -2
  21. package/dist/{local-package-run-42R3CP2A.js → local-package-run-RATCOPRD.js} +9 -9
  22. package/dist/{mock-dep-resolve-TTCQQEN2.js → mock-dep-resolve-FM5GKMKE.js} +6 -6
  23. package/dist/mock-fetch-gateway-TNK74HEP.js +1 -1
  24. package/dist/{mock-local-deps-Z6DBUQTP.js → mock-local-deps-6I7HSHXD.js} +4 -4
  25. package/dist/mock-server-CJQI6B3A.js +1 -1
  26. package/dist/{open-api-client-42L6TM2U.js → open-api-client-7TV5SPHT.js} +3 -3
  27. package/dist/{remote-execute-J35MQTUC.js → remote-execute-XLKI7JTI.js} +3 -3
  28. package/dist/{setup-git-IGLLNSLA.js → setup-git-LQVUW2D4.js} +4 -4
  29. package/dist/skill-7B2RL273.js +38 -0
  30. package/dist/skill-7B2RL273.js.map +6 -0
  31. package/dist/skill-refresh.d.ts +2 -0
  32. package/dist/skill-refresh.js +20 -0
  33. package/dist/skill-refresh.js.map +6 -0
  34. package/dist/skill.d.ts +53 -11
  35. package/package.json +2 -2
  36. package/skills/kody/SKILL.md +15 -129
  37. package/dist/chunk-R6WETL6J.js.map +0 -6
  38. package/dist/skill-D74XVI6T.js +0 -61
  39. package/dist/skill-D74XVI6T.js.map +0 -6
  40. /package/dist/{auth-FV2O77LC.js.map → auth-2N7CSZGJ.js.map} +0 -0
  41. /package/dist/{chunk-YXJ5S67U.js.map → chunk-5BIXRCH7.js.map} +0 -0
  42. /package/dist/{chunk-WDVDHEEN.js.map → chunk-FDRTJFCM.js.map} +0 -0
  43. /package/dist/{chunk-PZKBPKJ2.js.map → chunk-FS3BGXCK.js.map} +0 -0
  44. /package/dist/{chunk-PUQGDXIY.js.map → chunk-JNQKDAPN.js.map} +0 -0
  45. /package/dist/{chunk-VMP2UL6Z.js.map → chunk-PDDX5RJS.js.map} +0 -0
  46. /package/dist/{chunk-SSBZQMVX.js.map → chunk-QI3ZICHR.js.map} +0 -0
  47. /package/dist/{chunk-PIPQ2TTK.js.map → chunk-TGBFPYAY.js.map} +0 -0
  48. /package/dist/{chunk-HO4GCC6N.js.map → chunk-YFDVDTNX.js.map} +0 -0
  49. /package/dist/{dev-command-UDO2T4OI.js.map → dev-command-OUTCMZOC.js.map} +0 -0
  50. /package/dist/{git-credential-6CJWVNED.js.map → git-credential-NTAPSLZP.js.map} +0 -0
  51. /package/dist/{local-execute-O7FXIINV.js.map → local-execute-6NSAVTAV.js.map} +0 -0
  52. /package/dist/{local-package-graph-FEPI7JNQ.js.map → local-package-graph-UU3XHKIM.js.map} +0 -0
  53. /package/dist/{local-package-run-42R3CP2A.js.map → local-package-run-RATCOPRD.js.map} +0 -0
  54. /package/dist/{mock-dep-resolve-TTCQQEN2.js.map → mock-dep-resolve-FM5GKMKE.js.map} +0 -0
  55. /package/dist/{mock-local-deps-Z6DBUQTP.js.map → mock-local-deps-6I7HSHXD.js.map} +0 -0
  56. /package/dist/{open-api-client-42L6TM2U.js.map → open-api-client-7TV5SPHT.js.map} +0 -0
  57. /package/dist/{remote-execute-J35MQTUC.js.map → remote-execute-XLKI7JTI.js.map} +0 -0
  58. /package/dist/{setup-git-IGLLNSLA.js.map → setup-git-LQVUW2D4.js.map} +0 -0
@@ -7,23 +7,23 @@ import {
7
7
  gitCredentialHostFromMcpUrl,
8
8
  resolveCliTokenLifetime,
9
9
  setupGitDefaultScopes
10
- } from "./chunk-PUQGDXIY.js";
10
+ } from "./chunk-JNQKDAPN.js";
11
11
  import "./chunk-6ZYUGXVW.js";
12
12
  import {
13
13
  ensureOpenApiCredentials
14
- } from "./chunk-SSBZQMVX.js";
14
+ } from "./chunk-QI3ZICHR.js";
15
15
  import "./chunk-CASGRYOF.js";
16
16
  import "./chunk-GVSGNTG6.js";
17
+ import "./chunk-CWWHR4FH.js";
17
18
  import {
18
19
  callOpenApiOperation
19
- } from "./chunk-PIPQ2TTK.js";
20
+ } from "./chunk-TGBFPYAY.js";
20
21
  import "./chunk-46IJPEID.js";
21
- import "./chunk-BML3W5CO.js";
22
22
  import {
23
23
  loadStoredApiToken
24
24
  } from "./chunk-CCRCEU7S.js";
25
+ import "./chunk-BML3W5CO.js";
25
26
  import "./chunk-NHRYNRXG.js";
26
- import "./chunk-CWWHR4FH.js";
27
27
  import {
28
28
  loadCredentials
29
29
  } from "./chunk-3H72XY5R.js";
@@ -167,4 +167,4 @@ export {
167
167
  parseGitCredentialInput,
168
168
  readGitCredentialStdin
169
169
  };
170
- //# sourceMappingURL=git-credential-6CJWVNED.js.map
170
+ //# sourceMappingURL=git-credential-NTAPSLZP.js.map
@@ -4,15 +4,10 @@ import {
4
4
  forwardLocalGatewayFetchStream,
5
5
  installMockFetchShimModules,
6
6
  startLocalRuntimeBridge
7
- } from "./chunk-WDVDHEEN.js";
8
- import {
9
- resolveMockFetchGateway,
10
- tryHandleMockGatewayFetchCall
11
- } from "./chunk-DCQ57UXY.js";
7
+ } from "./chunk-FDRTJFCM.js";
12
8
  import {
13
9
  bundleLocalUserModule
14
10
  } from "./chunk-7RLOLQIT.js";
15
- import "./chunk-XV6D6HSG.js";
16
11
  import {
17
12
  createLocalEntrySource,
18
13
  createLocalRuntimeModuleSource,
@@ -27,7 +22,13 @@ import {
27
22
  runSecretEnvVar,
28
23
  runSecretHeader,
29
24
  writePackageModuleFiles
30
- } from "./chunk-YXJ5S67U.js";
25
+ } from "./chunk-5BIXRCH7.js";
26
+ import {
27
+ resolveMockFetchGateway,
28
+ tryHandleMockGatewayFetchCall
29
+ } from "./chunk-DCQ57UXY.js";
30
+ import "./chunk-XV6D6HSG.js";
31
+ import "./chunk-EJXEVGWF.js";
31
32
  import {
32
33
  assertLocalExecuteNodeEngine
33
34
  } from "./chunk-2XPH7L2P.js";
@@ -35,9 +36,6 @@ import {
35
36
  redact
36
37
  } from "./chunk-CASGRYOF.js";
37
38
  import "./chunk-46IJPEID.js";
38
- import {
39
- ensureWorkerdBinary
40
- } from "./chunk-BML3W5CO.js";
41
39
  import {
42
40
  assertTokenSafeApiUrl,
43
41
  callCapabilityProxy,
@@ -46,8 +44,10 @@ import {
46
44
  openCapabilityProxySession,
47
45
  sessionSupportsCredentialCallMap
48
46
  } from "./chunk-CCRCEU7S.js";
47
+ import {
48
+ ensureWorkerdBinary
49
+ } from "./chunk-BML3W5CO.js";
49
50
  import "./chunk-NHRYNRXG.js";
50
- import "./chunk-EJXEVGWF.js";
51
51
  import "./chunk-3H72XY5R.js";
52
52
  import {
53
53
  apiTokenEnvVar
@@ -396,4 +396,4 @@ export {
396
396
  runLocalExecute,
397
397
  savedPackageImportLocalResolveStatus
398
398
  };
399
- //# sourceMappingURL=local-execute-O7FXIINV.js.map
399
+ //# sourceMappingURL=local-execute-6NSAVTAV.js.map
@@ -30,7 +30,7 @@ import {
30
30
  rewriteLocalModulesToPackageFacades,
31
31
  synthesizePackageGraphEntry,
32
32
  writePackageModuleFiles
33
- } from "./chunk-YXJ5S67U.js";
33
+ } from "./chunk-5BIXRCH7.js";
34
34
  import "./chunk-CCRCEU7S.js";
35
35
  import "./chunk-NHRYNRXG.js";
36
36
  import "./chunk-3H72XY5R.js";
@@ -68,4 +68,4 @@ export {
68
68
  synthesizePackageGraphEntry,
69
69
  writePackageModuleFiles
70
70
  };
71
- //# sourceMappingURL=local-package-graph-FEPI7JNQ.js.map
71
+ //# sourceMappingURL=local-package-graph-UU3XHKIM.js.map
@@ -4,21 +4,21 @@ import {
4
4
  packageIdMatchesLocalPackage,
5
5
  resolveLocalPackageBinding,
6
6
  runLocalPackageModule
7
- } from "./chunk-HO4GCC6N.js";
8
- import "./chunk-WDVDHEEN.js";
9
- import "./chunk-DCQ57UXY.js";
10
- import "./chunk-VMP2UL6Z.js";
7
+ } from "./chunk-YFDVDTNX.js";
8
+ import "./chunk-PDDX5RJS.js";
9
+ import "./chunk-FDRTJFCM.js";
11
10
  import "./chunk-7RLOLQIT.js";
11
+ import "./chunk-5BIXRCH7.js";
12
+ import "./chunk-DCQ57UXY.js";
12
13
  import "./chunk-RAZBIC6O.js";
13
14
  import "./chunk-XV6D6HSG.js";
14
- import "./chunk-YXJ5S67U.js";
15
+ import "./chunk-EJXEVGWF.js";
15
16
  import "./chunk-CASGRYOF.js";
16
- import "./chunk-PIPQ2TTK.js";
17
+ import "./chunk-TGBFPYAY.js";
17
18
  import "./chunk-46IJPEID.js";
18
- import "./chunk-BML3W5CO.js";
19
19
  import "./chunk-CCRCEU7S.js";
20
+ import "./chunk-BML3W5CO.js";
20
21
  import "./chunk-NHRYNRXG.js";
21
- import "./chunk-EJXEVGWF.js";
22
22
  import "./chunk-3H72XY5R.js";
23
23
  import "./chunk-BTL3PJ2H.js";
24
24
  import "./chunk-UW6AWLXX.js";
@@ -28,4 +28,4 @@ export {
28
28
  resolveLocalPackageBinding,
29
29
  runLocalPackageModule
30
30
  };
31
- //# sourceMappingURL=local-package-run-42R3CP2A.js.map
31
+ //# sourceMappingURL=local-package-run-RATCOPRD.js.map
@@ -1,18 +1,18 @@
1
1
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
2
  import {
3
3
  resolveLocalExecuteBearer
4
- } from "./chunk-PZKBPKJ2.js";
5
- import "./chunk-SSBZQMVX.js";
4
+ } from "./chunk-FS3BGXCK.js";
5
+ import "./chunk-QI3ZICHR.js";
6
6
  import "./chunk-CASGRYOF.js";
7
7
  import "./chunk-GVSGNTG6.js";
8
- import "./chunk-PIPQ2TTK.js";
8
+ import "./chunk-CWWHR4FH.js";
9
+ import "./chunk-TGBFPYAY.js";
9
10
  import "./chunk-46IJPEID.js";
10
- import "./chunk-BML3W5CO.js";
11
11
  import {
12
12
  resolveScopedApiToken
13
13
  } from "./chunk-CCRCEU7S.js";
14
+ import "./chunk-BML3W5CO.js";
14
15
  import "./chunk-NHRYNRXG.js";
15
- import "./chunk-CWWHR4FH.js";
16
16
  import "./chunk-3H72XY5R.js";
17
17
  import {
18
18
  defaultApiUrl,
@@ -57,4 +57,4 @@ async function tryResolveMockDepResolve(input) {
57
57
  export {
58
58
  tryResolveMockDepResolve
59
59
  };
60
- //# sourceMappingURL=mock-dep-resolve-TTCQQEN2.js.map
60
+ //# sourceMappingURL=mock-dep-resolve-FM5GKMKE.js.map
@@ -14,9 +14,9 @@ import {
14
14
  unmockedRequestError
15
15
  } from "./chunk-DCQ57UXY.js";
16
16
  import "./chunk-XV6D6HSG.js";
17
+ import "./chunk-EJXEVGWF.js";
17
18
  import "./chunk-BML3W5CO.js";
18
19
  import "./chunk-NHRYNRXG.js";
19
- import "./chunk-EJXEVGWF.js";
20
20
  import "./chunk-UW6AWLXX.js";
21
21
  export {
22
22
  assertOutboundAllowed,
@@ -7,14 +7,14 @@ import {
7
7
  parseKodyPackageSpecifier,
8
8
  resolveLocalPackageModules,
9
9
  tryLoadSelfManifest
10
- } from "./chunk-VMP2UL6Z.js";
10
+ } from "./chunk-PDDX5RJS.js";
11
11
  import "./chunk-7RLOLQIT.js";
12
+ import "./chunk-5BIXRCH7.js";
12
13
  import "./chunk-RAZBIC6O.js";
13
14
  import "./chunk-XV6D6HSG.js";
14
- import "./chunk-YXJ5S67U.js";
15
+ import "./chunk-EJXEVGWF.js";
15
16
  import "./chunk-CCRCEU7S.js";
16
17
  import "./chunk-NHRYNRXG.js";
17
- import "./chunk-EJXEVGWF.js";
18
18
  import "./chunk-3H72XY5R.js";
19
19
  import "./chunk-BTL3PJ2H.js";
20
20
  import "./chunk-UW6AWLXX.js";
@@ -27,4 +27,4 @@ export {
27
27
  resolveLocalPackageModules,
28
28
  tryLoadSelfManifest
29
29
  };
30
- //# sourceMappingURL=mock-local-deps-Z6DBUQTP.js.map
30
+ //# sourceMappingURL=mock-local-deps-6I7HSHXD.js.map
@@ -8,9 +8,9 @@ import {
8
8
  } from "./chunk-5X563FYY.js";
9
9
  import "./chunk-DCQ57UXY.js";
10
10
  import "./chunk-XV6D6HSG.js";
11
+ import "./chunk-EJXEVGWF.js";
11
12
  import "./chunk-BML3W5CO.js";
12
13
  import "./chunk-NHRYNRXG.js";
13
- import "./chunk-EJXEVGWF.js";
14
14
  import "./chunk-UW6AWLXX.js";
15
15
  export {
16
16
  ensureMockTarget,
@@ -17,10 +17,10 @@ import {
17
17
  searchWithApiToken,
18
18
  toolResultFromHttpBody,
19
19
  whoamiWithApiToken
20
- } from "./chunk-PIPQ2TTK.js";
20
+ } from "./chunk-TGBFPYAY.js";
21
21
  import "./chunk-46IJPEID.js";
22
- import "./chunk-BML3W5CO.js";
23
22
  import "./chunk-CCRCEU7S.js";
23
+ import "./chunk-BML3W5CO.js";
24
24
  import "./chunk-NHRYNRXG.js";
25
25
  import "./chunk-3H72XY5R.js";
26
26
  import "./chunk-BTL3PJ2H.js";
@@ -44,4 +44,4 @@ export {
44
44
  toolResultFromHttpBody,
45
45
  whoamiWithApiToken
46
46
  };
47
- //# sourceMappingURL=open-api-client-42L6TM2U.js.map
47
+ //# sourceMappingURL=open-api-client-7TV5SPHT.js.map
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-SLNAWWQK.js";
5
5
  import {
6
6
  openApiRequest
7
- } from "./chunk-PIPQ2TTK.js";
7
+ } from "./chunk-TGBFPYAY.js";
8
8
  import "./chunk-46IJPEID.js";
9
- import "./chunk-BML3W5CO.js";
10
9
  import {
11
10
  assertTokenSafeApiUrl
12
11
  } from "./chunk-CCRCEU7S.js";
12
+ import "./chunk-BML3W5CO.js";
13
13
  import "./chunk-NHRYNRXG.js";
14
14
  import "./chunk-3H72XY5R.js";
15
15
  import "./chunk-BTL3PJ2H.js";
@@ -122,4 +122,4 @@ export {
122
122
  resolveRemoteExecuteCode,
123
123
  runRemoteExecuteWithToken
124
124
  };
125
- //# sourceMappingURL=remote-execute-J35MQTUC.js.map
125
+ //# sourceMappingURL=remote-execute-XLKI7JTI.js.map
@@ -37,12 +37,12 @@ import {
37
37
  setupGitConfigScopes,
38
38
  setupGitDefaultScopes,
39
39
  setupGitRequiredScopes
40
- } from "./chunk-PUQGDXIY.js";
40
+ } from "./chunk-JNQKDAPN.js";
41
41
  import "./chunk-6ZYUGXVW.js";
42
- import "./chunk-PIPQ2TTK.js";
42
+ import "./chunk-TGBFPYAY.js";
43
43
  import "./chunk-46IJPEID.js";
44
- import "./chunk-BML3W5CO.js";
45
44
  import "./chunk-CCRCEU7S.js";
45
+ import "./chunk-BML3W5CO.js";
46
46
  import "./chunk-NHRYNRXG.js";
47
47
  import "./chunk-3H72XY5R.js";
48
48
  import "./chunk-BTL3PJ2H.js";
@@ -86,4 +86,4 @@ export {
86
86
  setupGitDefaultScopes,
87
87
  setupGitRequiredScopes
88
88
  };
89
- //# sourceMappingURL=setup-git-IGLLNSLA.js.map
89
+ //# sourceMappingURL=setup-git-LQVUW2D4.js.map
@@ -0,0 +1,38 @@
1
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
+ import {
3
+ agentSkillsOriginFromMcpUrl,
4
+ bundledSkillPath,
5
+ extractSkillBodyForDigest,
6
+ fetchHostedKodyCliSkill,
7
+ hostedAgentSkillsIndexPath,
8
+ hostedSkillFetchTimeoutMs,
9
+ installSkill,
10
+ projectSkillTargets,
11
+ refreshInstalledSkills,
12
+ scheduleDetachedSkillRefresh,
13
+ sha256Digest,
14
+ skillRefreshEntryPath,
15
+ userSkillTargets,
16
+ wrapHostedSkillBody,
17
+ writeFileAtomic
18
+ } from "./chunk-TCJSXIEG.js";
19
+ import "./chunk-BTL3PJ2H.js";
20
+ import "./chunk-UW6AWLXX.js";
21
+ export {
22
+ agentSkillsOriginFromMcpUrl,
23
+ bundledSkillPath,
24
+ extractSkillBodyForDigest,
25
+ fetchHostedKodyCliSkill,
26
+ hostedAgentSkillsIndexPath,
27
+ hostedSkillFetchTimeoutMs,
28
+ installSkill,
29
+ projectSkillTargets,
30
+ refreshInstalledSkills,
31
+ scheduleDetachedSkillRefresh,
32
+ sha256Digest,
33
+ skillRefreshEntryPath,
34
+ userSkillTargets,
35
+ wrapHostedSkillBody,
36
+ writeFileAtomic
37
+ };
38
+ //# sourceMappingURL=skill-7B2RL273.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "mappings": "",
5
+ "names": []
6
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
3
+ import {
4
+ refreshInstalledSkills
5
+ } from "./chunk-TCJSXIEG.js";
6
+ import "./chunk-BTL3PJ2H.js";
7
+ import "./chunk-UW6AWLXX.js";
8
+
9
+ // src/skill-refresh.ts
10
+ function readOrigin(argv) {
11
+ const index = argv.indexOf("--origin");
12
+ if (index < 0) return void 0;
13
+ const value = argv[index + 1];
14
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : void 0;
15
+ }
16
+ await refreshInstalledSkills({
17
+ origin: readOrigin(process.argv.slice(2))
18
+ }).catch(() => {
19
+ });
20
+ //# sourceMappingURL=skill-refresh.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/skill-refresh.ts"],
4
+ "mappings": ";;;;;;;;;AAOA,SAAS,WAAW,MAAyC;AAC5D,QAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,MAAI,QAAQ,EAAG,QAAO;AACtB,QAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAClD,MAAM,KAAK,IACX;AACJ;AAEA,MAAM,uBAAuB;AAAA,EAC5B,QAAQ,WAAW,QAAQ,KAAK,MAAM,CAAC,CAAC;AACzC,CAAC,EAAE,MAAM,MAAM;AAEf,CAAC;",
5
+ "names": []
6
+ }
package/dist/skill.d.ts CHANGED
@@ -1,18 +1,60 @@
1
- export declare function bundledSkillPath(): string;
2
- export declare function userSkillTargets(home?: string): Array<{
3
- host: string;
4
- path: string;
5
- }>;
6
- export declare function projectSkillTargets(cwd?: string): Array<{
1
+ import { type SpawnOptions } from 'node:child_process';
2
+ export declare const hostedAgentSkillsIndexPath = "/.well-known/agent-skills/index.json";
3
+ export type SkillTarget = {
7
4
  host: string;
8
5
  path: string;
9
- }>;
6
+ };
7
+ export declare function bundledSkillPath(): string;
8
+ export declare function agentSkillsOriginFromMcpUrl(mcpUrl?: string): string;
9
+ export declare function userSkillTargets(home?: string): Array<SkillTarget>;
10
+ export declare function projectSkillTargets(cwd?: string): Array<SkillTarget>;
11
+ export declare function sha256Digest(body: string): string;
12
+ export declare function wrapHostedSkillBody(body: string): string;
13
+ /** Body bytes that should match the hosted index digest (no local frontmatter). */
14
+ export declare function extractSkillBodyForDigest(fileContents: string): string;
15
+ /** Bound hosted skill fetches so install/refresh can fall back offline. */
16
+ export declare const hostedSkillFetchTimeoutMs = 5000;
17
+ export declare function fetchHostedKodyCliSkill(input: {
18
+ origin?: string;
19
+ fetchImpl?: typeof fetch;
20
+ timeoutMs?: number;
21
+ }): Promise<{
22
+ body: string;
23
+ digest: string;
24
+ url: string;
25
+ } | null>;
10
26
  export declare function installSkill(input: {
11
27
  project?: boolean;
12
28
  cwd?: string;
13
29
  home?: string;
14
30
  sourcePath?: string;
15
- }): Promise<Array<{
16
- host: string;
17
- path: string;
18
- }>>;
31
+ origin?: string;
32
+ fetchImpl?: typeof fetch;
33
+ }): Promise<Array<SkillTarget>>;
34
+ /**
35
+ * Refresh user-level installed skill copies when the hosted digest changed.
36
+ * Best-effort: missing files and network failures are ignored. Project copies
37
+ * are left alone so a repo that ships or commits its own skill is not rewritten
38
+ * by an unrelated CLI command.
39
+ */
40
+ export declare function refreshInstalledSkills(input?: {
41
+ home?: string;
42
+ origin?: string;
43
+ fetchImpl?: typeof fetch;
44
+ }): Promise<Array<SkillTarget>>;
45
+ /** Write then rename so concurrent readers never see a partial skill file. */
46
+ export declare function writeFileAtomic(path: string, body: string): Promise<void>;
47
+ export declare function skillRefreshEntryPath(): string;
48
+ /**
49
+ * Spawn a detached child to refresh hosted skills so the parent CLI can exit
50
+ * without waiting on network I/O. Best-effort; spawn failures are ignored.
51
+ */
52
+ type SkillRefreshChild = {
53
+ unref: () => void;
54
+ on?: (event: string, listener: (...args: Array<unknown>) => void) => unknown;
55
+ };
56
+ export declare function scheduleDetachedSkillRefresh(input?: {
57
+ origin?: string;
58
+ spawnImpl?: (command: string, args: Array<string>, options: SpawnOptions) => SkillRefreshChild;
59
+ }): void;
60
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodycodes/cli",
3
- "version": "3.0.5",
3
+ "version": "3.1.0",
4
4
  "description": "Official Kody CLI: login, secure token storage, search, and execute over the OpenAPI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,7 +23,7 @@
23
23
  "build": "node scripts/build.mjs && tsc -p tsconfig.build.json",
24
24
  "bench": "node scripts/bench.mjs",
25
25
  "typecheck": "tsc --noEmit",
26
- "test": "tsx --test test/*.test.ts",
26
+ "test": "KODY_SKIP_SKILL_REFRESH=1 KODY_SKIP_GIT_HELPER_REFRESH=1 tsx --test test/*.test.ts",
27
27
  "validate": "npm run typecheck && npm run test && npm run build"
28
28
  },
29
29
  "engines": {
@@ -1,142 +1,28 @@
1
1
  ---
2
2
  name: kody
3
3
  description: >
4
- Install Kody as a remote MCP server, then use `search` / MCP tools and prefer
5
- `kody execute --local` when the CLI and Node are available. Use when the user
6
- mentions Kody, kody.codes, durable agent tasks, or wants to search/execute via
7
- Kody.
4
+ Install and bootstrap the Kody CLI, then prefer `execute --local` when Node
5
+ and a shell are available. Use when the person mentions Kody or wants local
6
+ execute instead of hosted Worker compute days.
8
7
  ---
9
8
 
10
- # Kody
9
+ # Kody CLI
11
10
 
12
- Kody is a remote MCP personal assistant. Install it as an MCP server in this
13
- agent for `search`, `api`, and discovery. Prefer local CLI execute when Node ≥22
14
- and `@kodycodes/cli` are available. Use MCP / hosted paths when the CLI or Node
15
- cannot run.
11
+ Always-current skill:
12
+ https://kody.codes/.well-known/agent-skills/kody-cli/SKILL.md
16
13
 
17
- `@kodycodes/cli` installs host MCP config and runs local execute against real
18
- secrets while keeping `kody:runtime` hops on CapabilityProxy.
14
+ Index (with digests): https://kody.codes/.well-known/agent-skills/index.json
19
15
 
20
- ## Install the MCP server (recommended)
16
+ ## Quick start
21
17
 
22
18
  ```bash
23
- npx @kodycodes/cli install
19
+ npx -y @kodycodes/cli@latest skill install
20
+ npx -y @kodycodes/cli@latest execute --local --code 'import { kody } from "kody:runtime"; export default async function main() { return await kody.metaGetCurrentUser({}) }'
24
21
  ```
25
22
 
26
- That command lists **running local** agents and writes each host's remote MCP
27
- entry for `https://kody.codes/mcp`. Host OAuth stays in that client — do not run
28
- `kody login` for the host connection.
23
+ If the CLI is not signed in and you already have Kody MCP: call `api` with
24
+ `cliCredentialBootstrap`, then run the returned `cli_command`. Interactive
25
+ humans: `npx -y @kodycodes/cli@latest login`.
29
26
 
30
- After install, use the Kody MCP tools in this agent for discovery and Open API:
31
-
32
- - `search` — discover capabilities, packages, and entity detail
33
- - `api` — call one Open API operation directly (no sandbox)
34
- - Prefer `search` before composing work
35
-
36
- For one-off modules, smoke tests, and composition: when Node ≥22 and the CLI are
37
- available, prefer `npx @kodycodes/cli execute --local` (see
38
- [Local CLI execute](https://kody.codes/docs/local-execute)). If `--local` cannot
39
- run, use Open API / MCP `api`, or fix the environment — do **not** use hosted
40
- MCP `execute` for agent work when a local or Open API path exists.
41
-
42
- For web-based clients (ChatGPT, Claude.ai, Grok), point the user at
43
- https://kody.codes/onboarding.
44
-
45
- To copy this skill into Claude Code / Cursor / Agents:
46
-
47
- ```bash
48
- npx @kodycodes/cli skill install
49
- ```
50
-
51
- ## CLI
52
-
53
- ```bash
54
- npm install -g @kodycodes/cli
55
- kody login
56
- kody login --org acme
57
- kody search "what can you do"
58
- kody search --domain email
59
- kody execute --local --code "import { kody } from 'kody:runtime'\nexport default async function main() { return await kody.search({ query: 'what can you do' }) }"
60
- kody execute --local --credential github=work --code "import { credential } from 'kody:runtime'\nexport default async function main() { const gh = await credential('github'); return { name: gh.name, hosts: gh.hosts } }"
61
- kody status
62
- kody whoami
63
- kody logout
64
- ```
65
-
66
- The CLI opens a browser for Kody OAuth (PKCE + Client ID Metadata Documents). If
67
- a browser cannot open, it prints the URL. Tokens (access + refresh) are stored
68
- in the OS keychain on macOS, Windows, and Linux (Secret Service). Linux without
69
- Secret Service — including headless machines that only have an in-memory kernel
70
- keyring — falls back to a `0600` file under `$XDG_CONFIG_HOME/kody`.
71
-
72
- Never ask the user to paste tokens into chat.
73
-
74
- Override the MCP URL with `--mcp-url` or `KODY_MCP_URL` for preview or local
75
- servers. Default: `https://kody.codes/mcp`.
76
-
77
- To run execute with a scoped API token and **no** `kody login`, set
78
- `KODY_API_TOKEN` (or `--token`). Cloud execute (no `--local`) goes through
79
- CapabilityProxy → `kody.execute`. Add `--local` to run the module on this
80
- machine instead (Node.js 22 or newer; older Node fails before workerd starts).
81
- Modules with static `kody:@…` imports keep `--local`: the CLI fetches stamped
82
- package modules via `POST /v1/local-execute/package-graph` and embeds them in
83
- local workerd (CapabilityProxy only for per-call `kody:runtime` hops — not a
84
- whole-module cloud defer). If that package-graph API is missing, `--local` fails
85
- clearly rather than silently billing a remote execute. `--file` entries are
86
- bundled (relative imports and npm packages; `kody:*` external) before workerd
87
- loads them, matching hosted execute / publish. `--code` and stdin are not
88
- rewritten.
89
-
90
- For `execute --local` auth: `--token` / `KODY_API_TOKEN` wins when set;
91
- otherwise a stored token from `kody auth bootstrap --code` (after MCP
92
- `cliCredentialBootstrap`); otherwise a valid `kody login` session (OAuth access
93
- token as Bearer only when the API and MCP URLs are paired — never print it,
94
- never mint via `tokenCreate` under the hood). The default pair is
95
- `https://api.kody.codes` and `https://kody.codes/mcp`; preview workers pair when
96
- the API worker name adds `-api`, and loopback hosts pair at any port. For
97
- another API origin, use `auth bootstrap --api-url <origin>` or set
98
- `KODY_API_TOKEN`. A PR preview's API host is
99
- `https://kody-pr-<n>-api.<subdomain>.workers.dev`, not the app origin
100
- `kody-pr-<n>` (which 404s `/v1/*` with HTML). Prefer bootstrap over
101
- `tokenCreate` for agents already on MCP so `kody_at_…` never appears in chat.
102
- Until the Open API accepts MCP OAuth on CapabilityProxy / package-graph
103
- (https://github.com/kody-hq/kody/issues/2812), use bootstrap or mint a scoped
104
- token with the MCP `api` tool `tokenCreate` — include `local-execute` plus the
105
- capability scopes the module calls — and pass `--token` or `KODY_API_TOKEN`. If
106
- none of those are available, the CLI error says that (bootstrap → login →
107
- tokenCreate for CI). `insufficient_scope` names the missing scope and prints the
108
- exact command to mint a token that adds it:
109
- `npx @kodycodes/cli auth bootstrap --lifetime short|long --scopes <list>` after
110
- `kody login`, or
111
- `cliCredentialBootstrap({ lifetime: "short"|"long", scopes: [...] })` from MCP
112
- (hints preserve the current token's lifetime class when known). Default
113
- bootstrap scopes stay least-privilege (no `package:write`), and `--scopes`
114
- replaces them, so list every scope you need. Publish a package after
115
- `packageGetGitRemote` clone/push with
116
- `kody package publish <@owner/leaf|package_id>` (thin
117
- `packagePublishExternalPush` wrapper; same auth as `kody api`). See and change
118
- who can use a package (teams and org members of the `--org` org) with
119
- `kody package collaborators <package>`,
120
- `kody package grant <package> --team <slug>|--user <username> --preset use|contribute|manage`,
121
- and
122
- `kody package revoke <package> --team <slug>|--user <username>|--grant <id>`.
123
- These need a token with `package:manage_access`. `feature_disabled` means the
124
- account `local-execute` flag is off. Never read MCP OAuth tokens from the host.
125
-
126
- ```bash
127
- # Agents on MCP:
128
- # cliCredentialBootstrap → { bootstrap_code, cli_command }
129
- npx @kodycodes/cli auth bootstrap --code 'kody_bc_…'
130
- npx @kodycodes/cli execute --local --file ./task.js --params '{"q":"email"}'
131
- # Opt in to private and local network access if needed:
132
- npx @kodycodes/cli execute --local --allow-private-network --file ./task.js
133
-
134
- Local execute is public-network-only by default. `--allow-private-network`
135
- opts into private and local addresses; the loopback CapabilityProxy bridge
136
- continues to work either way.
137
-
138
- npx @kodycodes/cli login
139
- npx @kodycodes/cli execute --local --file ./task.js --params '{"q":"email"}'
140
- # Or with an explicit scoped token (wins over login / bootstrap store):
141
- KODY_API_TOKEN=… npx @kodycodes/cli execute --local --file ./task.js --params '{"q":"email"}'
142
- ```
27
+ `kody skill install` copies this stub and refreshes the full hosted body when
28
+ reachable. Later CLI runs refresh local copies when the hosted digest changes.