@iamramo/zanat-cli 0.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/bin/zanat.js +2 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +20 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/init.d.ts +2 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +33 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/install.d.ts +2 -0
  13. package/dist/commands/install.d.ts.map +1 -0
  14. package/dist/commands/install.js +33 -0
  15. package/dist/commands/install.js.map +1 -0
  16. package/dist/commands/list.d.ts +2 -0
  17. package/dist/commands/list.d.ts.map +1 -0
  18. package/dist/commands/list.js +24 -0
  19. package/dist/commands/list.js.map +1 -0
  20. package/dist/commands/search.d.ts +2 -0
  21. package/dist/commands/search.d.ts.map +1 -0
  22. package/dist/commands/search.js +36 -0
  23. package/dist/commands/search.js.map +1 -0
  24. package/dist/commands/sync.d.ts +2 -0
  25. package/dist/commands/sync.d.ts.map +1 -0
  26. package/dist/commands/sync.js +24 -0
  27. package/dist/commands/sync.js.map +1 -0
  28. package/dist/schemas/common.d.ts +5 -0
  29. package/dist/schemas/common.d.ts.map +1 -0
  30. package/dist/schemas/common.js +5 -0
  31. package/dist/schemas/common.js.map +1 -0
  32. package/dist/schemas/index.d.ts +5 -0
  33. package/dist/schemas/index.d.ts.map +1 -0
  34. package/dist/schemas/index.js +5 -0
  35. package/dist/schemas/index.js.map +1 -0
  36. package/dist/schemas/skill-arg.d.ts +10 -0
  37. package/dist/schemas/skill-arg.d.ts.map +1 -0
  38. package/dist/schemas/skill-arg.js +17 -0
  39. package/dist/schemas/skill-arg.js.map +1 -0
  40. package/dist/schemas/skill-name.d.ts +4 -0
  41. package/dist/schemas/skill-name.d.ts.map +1 -0
  42. package/dist/schemas/skill-name.js +9 -0
  43. package/dist/schemas/skill-name.js.map +1 -0
  44. package/dist/schemas/source-name.d.ts +4 -0
  45. package/dist/schemas/source-name.d.ts.map +1 -0
  46. package/dist/schemas/source-name.js +9 -0
  47. package/dist/schemas/source-name.js.map +1 -0
  48. package/package.json +66 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yurchi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # Zanat
2
+
3
+ A skill hub for AI agents - manage and distribute agent skills.
4
+
5
+ ## What is Zanat?
6
+
7
+ Zanat is a Git-backed skill registry that allows individuals, teams, and companies to manage AI agent skills together. It serves as a hub where skills can be discovered, installed, and versioned.
8
+
9
+ ## Quick Start
10
+
11
+ ```bash
12
+ # Install globally
13
+ npm install -g @iamramo/zanat-cli
14
+
15
+ # Initialize (creates ~/.zanat/)
16
+ zanat init
17
+
18
+ # Sync with the hub
19
+ zanat sync
20
+
21
+ # Install a skill
22
+ zanat install yurchi/code-review
23
+
24
+ # List installed skills
25
+ zanat list
26
+ ```
27
+
28
+ ## Configuration
29
+
30
+ Zanat can be configured using environment variables. Copy `.env.example` to `.env` and customize:
31
+
32
+ ```bash
33
+ cp .env.example .env
34
+ ```
35
+
36
+ ### Environment Variables
37
+
38
+ | Variable | Description | Default |
39
+ | ------------------ | ------------------------------------------------ | ------------------------------------------ |
40
+ | `ZANAT_HUB_URL` | URL of the zanat hub repository | `https://github.com/iamramo/zanat-hub.git` |
41
+ | `ZANAT_HUB_BRANCH` | Branch to use from the hub | `main` |
42
+ | `NODE_ENV` | Environment mode (`development` or `production`) | `development` |
43
+ | `DEBUG` | Enable debug logging | `false` |
44
+
45
+ ## License
46
+
47
+ MIT
package/bin/zanat.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/cli.js';
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,20 @@
1
+ import { program } from 'commander';
2
+ import { initCommand } from './commands/init.js';
3
+ import { syncCommand } from './commands/sync.js';
4
+ import { installCommand } from './commands/install.js';
5
+ import { listCommand } from './commands/list.js';
6
+ import { searchCommand } from './commands/search.js';
7
+ program.name('zanat').description('A skill hub for AI agents').version('0.1.0');
8
+ program
9
+ .command('init')
10
+ .description('Initialize zanat configuration and clone the hub')
11
+ .action(initCommand);
12
+ program.command('sync').description('Sync with the hub repository').action(syncCommand);
13
+ program
14
+ .command('install <skill>')
15
+ .description('Install a skill (format: source/skill-name)')
16
+ .action(installCommand);
17
+ program.command('list').description('List installed skills').action(listCommand);
18
+ program.command('search [query]').description('Search for skills in the hub').action(searchCommand);
19
+ program.parse();
20
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhF,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAExF,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEjF,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEpG,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const initCommand: () => Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA+BhD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { ZANAT_DIR, HUB_DIR, AGENTS_DIR, saveConfig, getDefaultConfig, cloneHub, isHubCloned, } from '@iamramo/zanat-core';
2
+ import fs from 'fs-extra';
3
+ import chalk from 'chalk';
4
+ export const initCommand = async () => {
5
+ console.log(chalk.blue('Initializing Zanat...'));
6
+ try {
7
+ await fs.ensureDir(ZANAT_DIR);
8
+ console.log(chalk.green(`✓ Created ${ZANAT_DIR}`));
9
+ const config = getDefaultConfig();
10
+ await saveConfig(config);
11
+ console.log(chalk.green(`✓ Created config`));
12
+ await fs.ensureDir(AGENTS_DIR);
13
+ const hubExists = await isHubCloned();
14
+ if (!hubExists) {
15
+ console.log(chalk.blue('Cloning hub repository...'));
16
+ await cloneHub(config.hubUrl, config.hubBranch);
17
+ console.log(chalk.green(`✓ Cloned hub to ${HUB_DIR}`));
18
+ }
19
+ else {
20
+ console.log(chalk.yellow('Hub already exists, skipping clone'));
21
+ }
22
+ console.log(chalk.green('\n✨ Zanat initialized successfully!'));
23
+ console.log(chalk.gray(`\nNext steps:`));
24
+ console.log(chalk.gray(` zanat sync - Update skills from hub`));
25
+ console.log(chalk.gray(` zanat search - Find available skills`));
26
+ console.log(chalk.gray(` zanat install - Install a skill`));
27
+ }
28
+ catch (error) {
29
+ console.error(chalk.red('Failed to initialize:'), error);
30
+ process.exit(1);
31
+ }
32
+ };
33
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAE/B,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const installCommand: (skillArg: string) => Promise<void>;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CA8BnE,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { installSkill, isHubCloned } from '@iamramo/zanat-core';
2
+ import { SkillArgSchema } from '../schemas/skill-arg.js';
3
+ import chalk from 'chalk';
4
+ export const installCommand = async (skillArg) => {
5
+ console.log(chalk.blue(`Installing skill: ${skillArg}...`));
6
+ try {
7
+ const hubExists = await isHubCloned();
8
+ if (!hubExists) {
9
+ console.error(chalk.red('Hub not found. Run `zanat init` first.'));
10
+ process.exit(1);
11
+ }
12
+ const result = SkillArgSchema.safeParse(skillArg);
13
+ if (!result.success) {
14
+ const errorMessage = result.error.issues[0]?.message ?? 'Invalid skill format';
15
+ console.error(chalk.red(errorMessage));
16
+ console.error(chalk.gray('Example: mycompany/hello-world'));
17
+ process.exit(1);
18
+ }
19
+ const { source, skillName } = result.data;
20
+ await installSkill(source, skillName);
21
+ console.log(chalk.green(`✓ Installed zanat.${source}.${skillName}`));
22
+ }
23
+ catch (error) {
24
+ if (error instanceof Error) {
25
+ console.error(chalk.red('Failed to install:'), error.message);
26
+ }
27
+ else {
28
+ console.error(chalk.red('Failed to install:'), error);
29
+ }
30
+ process.exit(1);
31
+ }
32
+ };
33
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,QAAQ,KAAK,CAAC,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,sBAAsB,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1C,MAAM,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const listCommand: () => Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAyBhD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { listInstalledSkills } from '@iamramo/zanat-core';
2
+ import chalk from 'chalk';
3
+ export const listCommand = async () => {
4
+ console.log(chalk.blue('Installed skills:'));
5
+ console.log();
6
+ try {
7
+ const skills = await listInstalledSkills();
8
+ if (skills.length === 0) {
9
+ console.log(chalk.gray('No skills installed.'));
10
+ console.log(chalk.gray('Run `zanat search` to find skills or `zanat install <skill>` to install one.'));
11
+ return;
12
+ }
13
+ skills.forEach((skill) => {
14
+ console.log(chalk.green('•'), skill);
15
+ });
16
+ console.log();
17
+ console.log(chalk.gray(`Total: ${skills.length} skill${skills.length === 1 ? '' : 's'}`));
18
+ }
19
+ catch (error) {
20
+ console.error(chalk.red('Failed to list skills:'), error);
21
+ process.exit(1);
22
+ }
23
+ };
24
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAC3F,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const searchCommand: (query?: string) => Promise<void>;
2
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAmChE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { searchSkills, isHubCloned } from '@iamramo/zanat-core';
2
+ import chalk from 'chalk';
3
+ export const searchCommand = async (query) => {
4
+ try {
5
+ const hubExists = await isHubCloned();
6
+ if (!hubExists) {
7
+ console.error(chalk.red('Hub not found. Run `zanat init` first.'));
8
+ process.exit(1);
9
+ }
10
+ if (query) {
11
+ console.log(chalk.blue(`Searching for: "${query}"...`));
12
+ }
13
+ else {
14
+ console.log(chalk.blue('Available skills:'));
15
+ }
16
+ console.log();
17
+ const results = await searchSkills(query);
18
+ if (results.length === 0) {
19
+ console.log(chalk.gray('No skills found.'));
20
+ return;
21
+ }
22
+ results.forEach((skill) => {
23
+ console.log(chalk.green('•'), `${skill.source}/${skill.name}`);
24
+ console.log(chalk.gray(` ${skill.description}`));
25
+ console.log();
26
+ });
27
+ console.log(chalk.gray(`Found ${results.length} skill${results.length === 1 ? '' : 's'}`));
28
+ console.log();
29
+ console.log(chalk.gray('Install a skill with: zanat install <source>/<skill-name>'));
30
+ }
31
+ catch (error) {
32
+ console.error(chalk.red('Failed to search:'), error);
33
+ process.exit(1);
34
+ }
35
+ };
36
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const syncCommand: () => Promise<void>;
2
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAuBhD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { pullHub, isHubCloned, saveConfig, loadConfig } from '@iamramo/zanat-core';
2
+ import chalk from 'chalk';
3
+ export const syncCommand = async () => {
4
+ console.log(chalk.blue('Syncing with hub...'));
5
+ try {
6
+ const hubExists = await isHubCloned();
7
+ if (!hubExists) {
8
+ console.error(chalk.red('Hub not found. Run `zanat init` first.'));
9
+ process.exit(1);
10
+ }
11
+ await pullHub();
12
+ const config = await loadConfig();
13
+ if (config) {
14
+ config.lastSync = new Date().toISOString();
15
+ await saveConfig(config);
16
+ }
17
+ console.log(chalk.green('✓ Hub synced successfully'));
18
+ }
19
+ catch (error) {
20
+ console.error(chalk.red('Failed to sync:'), error);
21
+ process.exit(1);
22
+ }
23
+ };
24
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,EAAE,CAAC;QAEhB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const STARTS_WITH_LOWERCASE: RegExp;
2
+ export declare const ALLOWED_CHARS_ONLY: RegExp;
3
+ export declare const MIN_LENGTH = 3;
4
+ export declare const MAX_LENGTH = 64;
5
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,QAAW,CAAC;AAC9C,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAClD,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,UAAU,KAAK,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const STARTS_WITH_LOWERCASE = /^[a-z]/;
2
+ export const ALLOWED_CHARS_ONLY = /^[a-z0-9_-]+$/;
3
+ export const MIN_LENGTH = 3;
4
+ export const MAX_LENGTH = 64;
5
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { SourceNameSchema, type SourceName } from './source-name.js';
2
+ export { SkillNameSchema, type SkillName } from './skill-name.js';
3
+ export { SkillArgSchema, type SkillArg } from './skill-arg.js';
4
+ export * from './common.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/D,cAAc,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { SourceNameSchema } from './source-name.js';
2
+ export { SkillNameSchema } from './skill-name.js';
3
+ export { SkillArgSchema } from './skill-arg.js';
4
+ export * from './common.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAC/D,cAAc,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const SkillArgSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<{
3
+ source: string | undefined;
4
+ skillName: string | undefined;
5
+ }, string>>, z.ZodObject<{
6
+ source: z.ZodString;
7
+ skillName: z.ZodString;
8
+ }, z.core.$strip>>;
9
+ export type SkillArg = z.infer<typeof SkillArgSchema>;
10
+ //# sourceMappingURL=skill-arg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-arg.d.ts","sourceRoot":"","sources":["../../src/schemas/skill-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;kBAcxB,CAAC;AAEJ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { SourceNameSchema } from './source-name.js';
3
+ import { SkillNameSchema } from './skill-name.js';
4
+ export const SkillArgSchema = z
5
+ .string()
6
+ .transform((val) => {
7
+ const parts = val.split('/');
8
+ if (parts.length !== 2) {
9
+ throw new Error('Invalid format. Use: source/skill-name (e.g., mycompany/hello-world)');
10
+ }
11
+ return { source: parts[0], skillName: parts[1] };
12
+ })
13
+ .pipe(z.object({
14
+ source: SourceNameSchema,
15
+ skillName: SkillNameSchema,
16
+ }));
17
+ //# sourceMappingURL=skill-arg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-arg.js","sourceRoot":"","sources":["../../src/schemas/skill-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,EAAE;KACR,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC,CAAC;KACD,IAAI,CACH,CAAC,CAAC,MAAM,CAAC;IACP,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,eAAe;CAC3B,CAAC,CACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ export declare const SkillNameSchema: z.ZodString;
3
+ export type SkillName = z.infer<typeof SkillNameSchema>;
4
+ //# sourceMappingURL=skill-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-name.d.ts","sourceRoot":"","sources":["../../src/schemas/skill-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe,aAQzB,CAAC;AAEJ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ import { STARTS_WITH_LOWERCASE, ALLOWED_CHARS_ONLY, MIN_LENGTH, MAX_LENGTH } from './common.js';
3
+ export const SkillNameSchema = z
4
+ .string()
5
+ .min(MIN_LENGTH, `Skill name must be at least ${MIN_LENGTH} characters`)
6
+ .max(MAX_LENGTH, `Skill name must be ${MAX_LENGTH} characters or less`)
7
+ .regex(STARTS_WITH_LOWERCASE, 'Skill name must start with a lowercase letter')
8
+ .regex(ALLOWED_CHARS_ONLY, 'Skill name can only contain lowercase letters, numbers, hyphens, and underscores');
9
+ //# sourceMappingURL=skill-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-name.js","sourceRoot":"","sources":["../../src/schemas/skill-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,GAAG,CAAC,UAAU,EAAE,+BAA+B,UAAU,aAAa,CAAC;KACvE,GAAG,CAAC,UAAU,EAAE,sBAAsB,UAAU,qBAAqB,CAAC;KACtE,KAAK,CAAC,qBAAqB,EAAE,+CAA+C,CAAC;KAC7E,KAAK,CACJ,kBAAkB,EAClB,kFAAkF,CACnF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ export declare const SourceNameSchema: z.ZodString;
3
+ export type SourceName = z.infer<typeof SourceNameSchema>;
4
+ //# sourceMappingURL=source-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-name.d.ts","sourceRoot":"","sources":["../../src/schemas/source-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB,aAQ1B,CAAC;AAEJ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ import { STARTS_WITH_LOWERCASE, ALLOWED_CHARS_ONLY, MIN_LENGTH, MAX_LENGTH } from './common.js';
3
+ export const SourceNameSchema = z
4
+ .string()
5
+ .min(MIN_LENGTH, `Source name must be at least ${MIN_LENGTH} characters`)
6
+ .max(MAX_LENGTH, `Source name must be ${MAX_LENGTH} characters or less`)
7
+ .regex(STARTS_WITH_LOWERCASE, 'Source name must start with a lowercase letter')
8
+ .regex(ALLOWED_CHARS_ONLY, 'Source name can only contain lowercase letters, numbers, hyphens, and underscores');
9
+ //# sourceMappingURL=source-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-name.js","sourceRoot":"","sources":["../../src/schemas/source-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,EAAE;KACR,GAAG,CAAC,UAAU,EAAE,gCAAgC,UAAU,aAAa,CAAC;KACxE,GAAG,CAAC,UAAU,EAAE,uBAAuB,UAAU,qBAAqB,CAAC;KACvE,KAAK,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;KAC9E,KAAK,CACJ,kBAAkB,EAClB,mFAAmF,CACpF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@iamramo/zanat-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for zanat - a skill hub for AI agents",
5
+ "type": "module",
6
+ "main": "dist/cli.js",
7
+ "types": "dist/cli.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/cli.d.ts",
11
+ "import": "./dist/cli.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "zanat": "./bin/zanat.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "bin",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "prebuild": "npm run build -w @iamramo/zanat-core",
25
+ "build": "tsc",
26
+ "dev": "tsx watch src/cli.ts",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "dependencies": {
30
+ "@iamramo/zanat-core": "workspace:*",
31
+ "chalk": "^4.1.2",
32
+ "commander": "^12.0.0",
33
+ "fs-extra": "^11.2.0",
34
+ "zod": "^4.3.6"
35
+ },
36
+ "devDependencies": {
37
+ "@types/fs-extra": "^11.0.4",
38
+ "@types/node": "^20.11.0",
39
+ "tsx": "^4.7.0",
40
+ "typescript": "^5.3.3"
41
+ },
42
+ "engines": {
43
+ "node": ">=22.0.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "keywords": [
49
+ "ai",
50
+ "agents",
51
+ "skills",
52
+ "mcp",
53
+ "cli"
54
+ ],
55
+ "author": "Yurchi",
56
+ "license": "MIT",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/iamramo/zanat.git",
60
+ "directory": "packages/cli"
61
+ },
62
+ "bugs": {
63
+ "url": "https://github.com/iamramo/zanat/issues"
64
+ },
65
+ "homepage": "https://github.com/iamramo/zanat#readme"
66
+ }