@iamramo/zanat-cli 0.12.4 → 0.12.5

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/cli.js CHANGED
@@ -1,5 +1,4 @@
1
- import { Command as CommanderCommand, Help } from 'commander';
2
- import { Display } from '@iamramo/zanat-core';
1
+ import { Display, Command } from '@iamramo/zanat-core';
3
2
  import packageJson from '../package.json' with { type: 'json' };
4
3
  import { initCommand } from './commands/init.js';
5
4
  import { pullCommand } from './commands/pull.js';
@@ -9,34 +8,180 @@ import { updateCommand } from './commands/update.js';
9
8
  import { listCommand } from './commands/list.js';
10
9
  import { searchCommand } from './commands/search.js';
11
10
  import { statusCommand } from './commands/status.js';
12
- const program = new CommanderCommand();
11
+ const program = Command.create();
13
12
  program.name('zanat').description('Your personal skill library from any Git repository').version(packageJson.version);
14
13
  program.helpCommand(false);
15
14
  program.configureHelp({
16
15
  formatHelp: (cmd) => {
17
- const originalHelp = new Help().formatHelp(cmd, program.createHelp());
18
- return Display.getAsciiBanner() + '\n' + originalHelp;
16
+ const originalHelp = new Command.help().formatHelp(cmd, program.createHelp());
17
+ // Only show banner for main help, not command-specific help
18
+ if (cmd.name() === 'zanat' && !cmd.parent) {
19
+ return Display.getAsciiBanner() + '\n' + originalHelp;
20
+ }
21
+ return originalHelp;
19
22
  },
20
23
  });
21
24
  program
22
25
  .command('init')
23
26
  .description('Initialize zanat configuration and clone the hub')
27
+ .addHelpText('after', `
28
+ Examples:
29
+ $ zanat init
30
+ Interactive setup for first-time use
31
+
32
+ $ zanat init
33
+ (when already initialized)
34
+ Prompts to reinitialize or keep existing setup
35
+
36
+ Interactive Prompts:
37
+ • Hub repository URL - Git URL of your skills repository
38
+ • Hub branch - Branch to track (default: main)
39
+ • Hub directory - Local path to clone repository
40
+
41
+ Note:
42
+ Reinitializing removes the hub directory but keeps added skills safe.
43
+ You'll need to re-add skills to re-pin them to the new hub branch.
44
+ `)
24
45
  .action(initCommand);
25
- program.command('pull').description('Pull latest changes from hub repository').action(pullCommand);
46
+ program
47
+ .command('pull')
48
+ .description('Pull latest changes from hub repository')
49
+ .addHelpText('after', `
50
+ Examples:
51
+ $ zanat pull
52
+ Pull hub branch and fetch all skill refs
53
+
54
+ Behavior:
55
+ • Pulls the configured hub branch (fast-forward)
56
+ • Fetches all unique refs used by pinned skills
57
+ • Reports successfully fetched refs
58
+ • Warns about refs that could not be fetched (may be deleted)
59
+ • Shows which skills are affected by failed fetches
60
+ • Always updates the lastPull timestamp
61
+
62
+ Note:
63
+ This command fetches refs for all skills to ensure 'zanat update' works correctly,
64
+ even for skills pinned to branches other than the hub branch.
65
+ `)
66
+ .action(pullCommand);
26
67
  program
27
68
  .command('add <skill>')
28
69
  .description('Add a skill (format: namespace.skill-name or namespace.sub.skill-name)')
70
+ .option('-p, --pin <ref>', 'Pin to a specific ref (branch, tag, or commit SHA). Requires a value (e.g., --pin=main, --pin=v1.0.0, --pin=abc123).')
71
+ .addHelpText('after', `
72
+ Examples:
73
+ $ zanat add vercel.react-patterns
74
+ Add a skill and track the hub branch (auto-updates)
75
+
76
+ $ zanat add vercel.react-patterns --pin=main
77
+ Pin to 'main' branch (follows branch updates, not hub branch)
78
+
79
+ $ zanat add vercel.react-patterns --pin=develop
80
+ Pin to 'develop' branch (follows branch updates)
81
+
82
+ $ zanat add vercel.react-patterns --pin=v1.2.0
83
+ Pin to tag v1.2.0 (never auto-updates)
84
+
85
+ $ zanat add vercel.react-patterns --pin=abc1234
86
+ Pin to specific commit (never auto-updates)
87
+
88
+ $ zanat add vercel.react-patterns --pin
89
+ Error: --pin requires a value
90
+
91
+ Notes:
92
+ • Without --pin, the skill tracks the hub branch and updates with 'zanat update'
93
+ • With --pin, the skill is locked to that ref and never auto-updates
94
+ • Use --pin when you need stability or want to follow a specific branch/tag
95
+ • Re-add a skill without --pin to switch it back to tracking the hub branch
96
+ `)
29
97
  .action(addCommand);
30
98
  program
31
99
  .command('rm <skill>')
32
100
  .description('Remove a skill (format: namespace.skill-name or namespace.sub.skill-name)')
101
+ .addHelpText('after', `
102
+ Examples:
103
+ $ zanat rm vercel.react-patterns
104
+ Remove a skill from local storage
105
+
106
+ Note:
107
+ Removes the skill files from ~/.agents/skills/ and removes the lock file entry.
108
+ The skill can be re-added at any time with 'zanat add'.
109
+ `)
33
110
  .action(removeCommand);
34
111
  program
35
112
  .command('update [skill]')
36
113
  .description('Update skill(s) from hub (updates all if no skill specified)')
114
+ .addHelpText('after', `
115
+ Examples:
116
+ $ zanat update
117
+ Update all skills to their latest versions (interactive)
118
+
119
+ $ zanat update vercel.react-patterns
120
+ Update a specific skill
121
+
122
+ Behavior:
123
+ • Shows orphaned skills (ref deleted but commit preserved)
124
+ • Shows broken skills (neither ref nor commit exist)
125
+ • Only updates skills with 'ok' status
126
+ • Preserves commits for orphaned skills
127
+ • Re-pins skills when you explicitly re-add them
128
+ `)
37
129
  .action(updateCommand);
38
- program.command('list').description('List added skills').action(listCommand);
39
- program.command('search [query]').description('Search for skills in the hub').action(searchCommand);
40
- program.command('status').description('Show hub and skills status').action(statusCommand);
130
+ program
131
+ .command('list')
132
+ .description('List added skills')
133
+ .addHelpText('after', `
134
+ Examples:
135
+ $ zanat list
136
+ List all added skills with their versions
137
+
138
+ Output Format:
139
+ • skill-name abc1234 (main) - Tracking hub branch
140
+ • skill-name abc1234 (v1.2.0) - Pinned to tag
141
+ • skill-name abc1234 (orphaned) - Ref deleted, commit preserved
142
+ • skill-name abc1234 (broken) - Neither ref nor commit exist
143
+
144
+ Note:
145
+ Shows the short commit SHA and the requested ref in parentheses.
146
+ Use 'zanat status' for more detailed information.
147
+ `)
148
+ .action(listCommand);
149
+ program
150
+ .command('search [query]')
151
+ .description('Search for skills in the hub')
152
+ .addHelpText('after', `
153
+ Examples:
154
+ $ zanat search
155
+ List all available skills
156
+
157
+ $ zanat search react
158
+ Search for skills matching "react"
159
+
160
+ Note:
161
+ Search matches against skill names and descriptions.
162
+ Results show skill names with truncated descriptions.
163
+ `)
164
+ .action(searchCommand);
165
+ program
166
+ .command('status')
167
+ .description('Show hub and skills status')
168
+ .addHelpText('after', `
169
+ Examples:
170
+ $ zanat status
171
+ Show hub configuration and all skill statuses
172
+
173
+ Output:
174
+ • Hub URL and branch configuration
175
+ • Last pull timestamp
176
+ • Commits behind remote (if any)
177
+ • List of all skills with their resolved commit and ref status
178
+
179
+ Status Indicators:
180
+ • "abc1234 (main)" - Tracking hub branch, up to date
181
+ • "abc1234 (v1.2.0)" - Pinned to tag v1.2.0
182
+ • "abc1234 (orphaned)" - Ref deleted but commit preserved
183
+ • "abc1234 (broken)" - Neither ref nor commit exist
184
+ `)
185
+ .action(statusCommand);
41
186
  program.parse();
42
187
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACvC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACtH,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAE3B,OAAO,CAAC,aAAa,CAAC;IACpB,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;QAClB,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,GAAG,YAAY,CAAC;IACxD,CAAC;CACF,CAAC,CAAC;AAEH,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,yCAAyC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEnG,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE7E,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEpG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAE1F,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,6 @@
1
- export declare const addCommand: (fullSkillName: string) => Promise<void>;
1
+ interface AddOptions {
2
+ pin?: string;
3
+ }
4
+ export declare const addCommand: (fullSkillName: string, options: AddOptions) => Promise<void>;
5
+ export {};
2
6
  //# sourceMappingURL=add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,GAAU,eAAe,MAAM,KAAG,OAAO,CAAC,IAAI,CAoCpE,CAAC"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAmBA,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,UAAU,GAAU,eAAe,MAAM,EAAE,SAAS,UAAU,KAAG,OAAO,CAAC,IAAI,CA8EzF,CAAC"}
@@ -1,9 +1,18 @@
1
- import { Log, Prompt, LockFile, Skill, Path, Config, Zod } from '@iamramo/zanat-core';
2
- export const addCommand = async (fullSkillName) => {
1
+ import { Log, Prompt, LockFile, Skill, Path, Config, Git, Display, Fs, Zod, } from '@iamramo/zanat-core';
2
+ import { z } from 'zod';
3
+ const PinOptionSchema = z.union([
4
+ z.string().min(1, '--pin requires a ref value (branch, tag, or commit)'),
5
+ z.undefined(),
6
+ ]);
7
+ export const addCommand = async (fullSkillName, options) => {
3
8
  try {
9
+ // Step 1: Validate and parse inputs
4
10
  await Config.validate();
5
- Zod.skill.FullNameSchema.parse(fullSkillName);
11
+ await Config.ensureCorrectBranch();
12
+ Zod.skill.FullSchema.shape.fullName.parse(fullSkillName);
13
+ const pinOption = PinOptionSchema.parse(options.pin);
6
14
  const { namespace, skillName } = Path.toSkillParts(fullSkillName);
15
+ // Step 2: Handle existing skill or prepare to add new one
7
16
  const exists = await LockFile.find(fullSkillName);
8
17
  if (exists) {
9
18
  const shouldUpdate = await Prompt.confirm({
@@ -18,10 +27,43 @@ export const addCommand = async (fullSkillName) => {
18
27
  Log.green(`Updated ${fullSkillName}`, { prefix: '✓' });
19
28
  return;
20
29
  }
30
+ // Step 3: Determine requested ref and resolve commit
31
+ const config = await Config.get();
32
+ let requestedRef;
33
+ let resolvedCommit;
34
+ if (pinOption !== undefined) {
35
+ requestedRef = pinOption;
36
+ try {
37
+ resolvedCommit = await Git.resolveCommit(requestedRef);
38
+ Log.blue(`Pinning to '${requestedRef}' (${Display.getShortSha(resolvedCommit)})`);
39
+ }
40
+ catch (error) {
41
+ Log.red(`Invalid ref: '${requestedRef}' does not exist in the hub repository.`, {
42
+ prefix: '✗',
43
+ });
44
+ Log.debug(error);
45
+ process.exit(1);
46
+ }
47
+ }
48
+ else {
49
+ requestedRef = config.hubBranch;
50
+ resolvedCommit = await Git.resolveCommit(config.hubBranch);
51
+ Log.blue(`Tracking ${config.hubBranch} branch`);
52
+ }
53
+ // Step 4: Check if skill exists in hub (only check filesystem when not using --pin)
21
54
  const sourcePath = await Path.getSkillHubDir(namespace, skillName);
22
- const targetPath = Path.getSkillTargetDir(fullSkillName);
23
55
  const skillFile = Path.getSkillFile(sourcePath);
24
- await Skill.add(namespace, skillName, skillFile, targetPath);
56
+ if (pinOption === undefined) {
57
+ const skillExistsInHub = await Fs.exists(skillFile);
58
+ if (!skillExistsInHub) {
59
+ Log.red('Skill not found in hub.', { prefix: '✗' });
60
+ Log.gray(`If the skill exists on a different branch, use: zanat add ${fullSkillName} --pin=<branch>`);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ // Step 5: Add skill to local storage
65
+ const targetPath = Path.getSkillTargetDir(fullSkillName);
66
+ await Skill.add(namespace, skillName, skillFile, targetPath, requestedRef, resolvedCommit);
25
67
  Log.green(`Added ${fullSkillName}`);
26
68
  }
27
69
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEtF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,aAAqB,EAAiB,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE9C,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBACxC,OAAO,EAAE,SAAS,aAAa,qCAAqC;gBACpE,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,KAAK,CAAC,WAAW,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEhD,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAyFhD,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAyGhD,CAAC"}
@@ -1,8 +1,10 @@
1
+ import path from 'node:path';
1
2
  import { Path, Config, Fs, Git, LockFile, Log, Format, Prompt, Zod } from '@iamramo/zanat-core';
2
3
  export const initCommand = async () => {
3
4
  Log.blue('Initializing Zanat...');
4
5
  Log.blank();
5
6
  try {
7
+ // Step 1: Check for existing configuration and handle reinitialization
6
8
  const hasConfig = await Config.exists();
7
9
  if (hasConfig) {
8
10
  Log.blue('Zanat is already initialized.');
@@ -26,6 +28,7 @@ export const initCommand = async () => {
26
28
  Log.green('Removed existing hub', { prefix: '✓' });
27
29
  Log.blank();
28
30
  }
31
+ // Step 2: Collect configuration from user
29
32
  const hubUrl = await Prompt.input({
30
33
  message: 'Hub repository URL:',
31
34
  required: true,
@@ -34,13 +37,28 @@ export const initCommand = async () => {
34
37
  const hubBranch = await Prompt.input({
35
38
  message: 'Hub branch:',
36
39
  default: 'main',
37
- validate: Prompt.validate(Zod.config.ConfigSchema.shape.hubBranch),
40
+ validate: async (value) => {
41
+ // Validate format
42
+ const formatResult = Prompt.validate(Zod.config.ConfigSchema.shape.hubBranch)(value);
43
+ if (formatResult !== true) {
44
+ return formatResult;
45
+ }
46
+ // Validate branch existence on remote
47
+ try {
48
+ await Git.lsRemote(hubUrl, value);
49
+ }
50
+ catch {
51
+ return `Branch '${value}' does not exist in the repository`;
52
+ }
53
+ return true;
54
+ },
38
55
  });
39
56
  const hubDir = await Prompt.input({
40
57
  message: 'Hub directory path:',
41
- default: `${Path.ZANAT_DIR}/hub`,
58
+ default: path.join(Path.ZANAT_DIR, 'hub'),
42
59
  validate: Prompt.validate(Zod.config.ConfigSchema.shape.hubDir),
43
60
  });
61
+ // Step 3: Create directories and config files
44
62
  Log.blank();
45
63
  Log.blue('Setting up directories...');
46
64
  await Fs.ensureDir(Path.ZANAT_DIR);
@@ -57,6 +75,7 @@ export const initCommand = async () => {
57
75
  }));
58
76
  Log.green(`Created ${Path.CONFIG_FILE}`, { prefix: '✓' });
59
77
  Log.blank();
78
+ // Step 4: Clone repository
60
79
  Log.blue('Cloning hub repository...');
61
80
  await Git.clone(hubUrl, hubBranch, hubDir);
62
81
  Log.green(`Cloned hub from branch ${hubBranch} to "${hubDir}"`, { prefix: '✓' });
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA8BhD,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA+BhD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { LockFile, Display, Log, Config } from '@iamramo/zanat-core';
2
2
  export const listCommand = async () => {
3
3
  try {
4
+ // Step 1: Load and check skills
4
5
  await Config.validate();
5
6
  const skills = await LockFile.findAll();
6
7
  const skillNames = Object.keys(skills);
@@ -9,14 +10,15 @@ export const listCommand = async () => {
9
10
  Log.gray('Run `zanat search` to find skills or `zanat add <skill>` to add one.');
10
11
  return;
11
12
  }
13
+ // Step 2: Display skills with versions
12
14
  Log.blue('Added skills:');
13
15
  Log.blank();
14
- skillNames.forEach((skillName) => {
15
- const skill = skills[skillName];
16
- Log.green(`${skillName} ${Display.getDisplayVersion(skill?.version ?? 'latest')}`, {
16
+ for (const skillName of skillNames) {
17
+ const displayVersion = await Display.getDisplayVersion(skillName);
18
+ Log.green(`${skillName} ${displayVersion}`, {
17
19
  prefix: '•',
18
20
  });
19
- });
21
+ }
20
22
  Log.blank();
21
23
  Log.gray(`Total: ${skillNames.length} skill${skillNames.length === 1 ? '' : 's'}`);
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1B,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,UAAU,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE,EAAE;gBACjF,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,MAAM,SAAS,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1B,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAClE,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,cAAc,EAAE,EAAE;gBAC1C,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,MAAM,SAAS,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAkBhD,CAAC"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA8DhD,CAAC"}
@@ -1,13 +1,52 @@
1
- import { Git, Config, Log } from '@iamramo/zanat-core';
1
+ import { Git, Config, LockFile, Log } from '@iamramo/zanat-core';
2
2
  export const pullCommand = async () => {
3
3
  try {
4
4
  await Config.validate();
5
- Log.blue('Pulling latest changes from hub...');
5
+ await Config.ensureCorrectBranch();
6
6
  const config = await Config.get();
7
- await Git.pull(config.hubDir);
7
+ // Step 1: Pull hubBranch
8
+ Log.blue('Pulling latest changes...');
9
+ await Git.pull();
10
+ Log.green(`Pulled ${config.hubBranch}`, { prefix: '✓' });
11
+ // Step 2: Get unique refs and fetch each
12
+ const allRefs = await LockFile.findUniqueRefs();
13
+ const additionalRefs = allRefs.filter((r) => r !== config.hubBranch);
14
+ const fetchedRefs = [];
15
+ const failedRefs = [];
16
+ for (const ref of additionalRefs) {
17
+ try {
18
+ await Git.fetch([ref]);
19
+ fetchedRefs.push(ref);
20
+ }
21
+ catch {
22
+ // Find skills using this ref for user guidance
23
+ const affectedSkills = await LockFile.findSkillsByRef(ref);
24
+ failedRefs.push({ ref, skills: affectedSkills });
25
+ }
26
+ }
27
+ // Step 3: Report results
28
+ if (fetchedRefs.length > 0) {
29
+ Log.green(`Fetched ${fetchedRefs.length} additional ref(s):`, { prefix: '✓' });
30
+ fetchedRefs.forEach((ref) => Log.green(ref, { spacing: 2 }));
31
+ }
32
+ if (failedRefs.length > 0) {
33
+ Log.blank();
34
+ Log.yellow(`Warning: Could not fetch ${failedRefs.length} ref(s):`, { prefix: '⚠' });
35
+ failedRefs.forEach(({ ref, skills }) => {
36
+ Log.yellow(ref, { spacing: 2 });
37
+ if (skills.length > 0) {
38
+ Log.gray(`Affects: ${skills.join(', ')}`, { spacing: 4 });
39
+ }
40
+ });
41
+ Log.blank();
42
+ Log.gray('These refs may have been deleted from the remote.');
43
+ Log.gray(`To fix affected skills, run: zanat add <skill-name> (re-pins to ${config.hubBranch})`);
44
+ }
45
+ // Step 4: Always update timestamp
8
46
  config.lastPull = new Date().toISOString();
9
47
  await Config.update(config);
10
- Log.green('Hub updated successfully', { prefix: '✓' });
48
+ Log.blank();
49
+ Log.green('Pull complete', { prefix: '✓' });
11
50
  }
12
51
  catch (error) {
13
52
  Log.red('Failed to pull', { prefix: '✗' });
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE5B,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,16 @@ import { Skill, Fs, Path, Log, Config, Zod } from '@iamramo/zanat-core';
2
2
  import path from 'node:path';
3
3
  export const removeCommand = async (fullSkillName) => {
4
4
  try {
5
+ // Step 1: Validate and check skill exists
5
6
  await Config.validate();
6
- Zod.skill.FullNameSchema.parse(fullSkillName);
7
- const { namespace, skillName } = Path.toSkillParts(fullSkillName);
7
+ Zod.skill.FullSchema.shape.fullName.parse(fullSkillName);
8
8
  const skillPath = path.join(Path.AGENTS_SKILLS_DIR, fullSkillName);
9
9
  const exists = await Fs.exists(skillPath);
10
10
  if (!exists) {
11
11
  Log.red('Skill not found.', { prefix: '✗' });
12
- return;
12
+ process.exit(1);
13
13
  }
14
+ // Step 2: Remove skill from storage
14
15
  await Skill.remove(skillPath);
15
16
  Log.green(`Removed ${fullSkillName}`, { prefix: '✓' });
16
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,aAAqB,EAAiB,EAAE;IAC1E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE9C,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE9B,GAAG,CAAC,KAAK,CAAC,WAAW,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,aAAqB,EAAiB,EAAE;IAC1E,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oCAAoC;QACpC,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,WAAW,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CA6BhE,CAAC"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CA+BhE,CAAC"}
@@ -1,20 +1,24 @@
1
1
  import { Skill, Log, Display, Config } from '@iamramo/zanat-core';
2
2
  export const searchCommand = async (query) => {
3
3
  try {
4
+ // Step 1: Search for skills
4
5
  await Config.validate();
5
6
  query ? Log.blue(`Searching for: "${query}"...`) : Log.blue('Available skills:');
6
7
  Log.blank();
7
8
  const results = query ? await Skill.search(query) : await Skill.findAll();
9
+ // Step 2: Display results
8
10
  if (results.length === 0) {
9
11
  Log.gray('No skills found.');
10
12
  return;
11
13
  }
12
- results.forEach((skill) => {
13
- Log.green(skill.fullName, { prefix: '•' });
14
- const truncatedDesc = Display.truncate(skill.description);
15
- Log.gray(truncatedDesc, { spacing: 2 });
16
- Log.blank();
17
- });
14
+ else {
15
+ results.forEach((skill) => {
16
+ Log.green(skill.fullName, { prefix: '•' });
17
+ const truncatedDesc = Display.truncate(skill.description);
18
+ Log.gray(truncatedDesc, { spacing: 2 });
19
+ Log.blank();
20
+ });
21
+ }
18
22
  Log.gray(`Found ${results.length} skill(s)`);
19
23
  Log.blank();
20
24
  Log.gray('Add a skill with: zanat add <skill>');
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjF,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAE1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;IACnE,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjF,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAE1E,0BAA0B;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC1D,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxC,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAgDlD,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAkDlD,CAAC"}
@@ -1,10 +1,12 @@
1
- import { Fs, Git, LockFile, Display, Config, Log } from '@iamramo/zanat-core';
1
+ import { Git, LockFile, Display, Config, Log } from '@iamramo/zanat-core';
2
2
  export const statusCommand = async () => {
3
3
  try {
4
+ // Step 1: Load configuration and skills
4
5
  await Config.validate();
5
6
  const skills = await LockFile.findAll();
6
7
  const skillNames = Object.keys(skills);
7
8
  const config = await Config.get();
9
+ // Step 2: Display hub status
8
10
  Log.blue('Hub Status:');
9
11
  Log.blank();
10
12
  Log.green(`Initialized: ${Log.bold('yes')}`, { prefix: '•', spacing: 2 });
@@ -14,24 +16,25 @@ export const statusCommand = async () => {
14
16
  prefix: '•',
15
17
  spacing: 2,
16
18
  });
17
- const behind = await Git.behind(config.hubDir, config.hubBranch);
18
- if (behind > 0) {
19
- Log.yellow(`Behind: ${behind} commit(s)`, { prefix: '•', spacing: 2 });
19
+ const behind = await Git.behind(config.hubBranch);
20
+ if (behind === 0) {
21
+ Log.green(`Behind: ${Log.bold('up-to-date')}`, { prefix: '•', spacing: 2 });
20
22
  }
21
23
  else {
22
- Log.green(`Behind: ${Log.bold('up-to-date')}`, { prefix: '•', spacing: 2 });
24
+ Log.yellow(`Behind: ${behind} commit(s)`, { prefix: '•', spacing: 2 });
23
25
  }
26
+ // Step 3: Display skills status
24
27
  Log.blank();
25
28
  Log.blue('Skills:');
26
29
  Log.blank();
27
30
  if (skillNames.length > 0) {
28
- skillNames.forEach((skillName) => {
29
- const skill = skills[skillName];
30
- Log.green(`${skillName} ${Display.getDisplayVersion(skill?.version ?? 'latest')}`, {
31
+ for (const skillName of skillNames) {
32
+ const displayVersion = await Display.getDisplayVersion(skillName);
33
+ Log.green(`${skillName} ${displayVersion}`, {
31
34
  prefix: '•',
32
35
  spacing: 2,
33
36
  });
34
- });
37
+ }
35
38
  }
36
39
  else {
37
40
  Log.gray('No skills added.', { spacing: 2 });
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QAElC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxB,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE;YACrE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,WAAW,MAAM,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpB,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;gBAEhC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE,EAAE;oBACjF,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAU,eAAe,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,IAAI,CA0CnF,CAAC"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAU,eAAe,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,IAAI,CAuHnF,CAAC"}
@@ -1,32 +1,99 @@
1
1
  import { Log, Prompt, LockFile, Path, Skill, Config, Zod } from '@iamramo/zanat-core';
2
2
  export const updateCommand = async (fullSkillName) => {
3
3
  try {
4
+ // Step 1: Validate configuration
4
5
  await Config.validate();
5
6
  // Update one skill
6
7
  if (fullSkillName) {
7
- Zod.skill.FullNameSchema.parse(fullSkillName);
8
+ // Step 2a: Parse skill name and check ref status
9
+ Zod.skill.FullSchema.shape.fullName.parse(fullSkillName);
8
10
  const { namespace, skillName } = Path.toSkillParts(fullSkillName);
11
+ const skill = await LockFile.find(fullSkillName);
12
+ if (!skill) {
13
+ Log.red(`Error: ${fullSkillName} was not found`, { prefix: '✗' });
14
+ process.exit(1);
15
+ }
16
+ const refStatus = await LockFile.getRefStatus(skill);
17
+ if (refStatus === 'orphaned') {
18
+ Log.yellow(`Warning: ${fullSkillName} is orphaned - Branch '${skill.requestedRef}' no longer exists, but commit is preserved`, {
19
+ prefix: '⚠',
20
+ });
21
+ const shouldContinue = await Prompt.confirm({
22
+ message: 'Update anyway? (will preserve current commit)',
23
+ default: true,
24
+ });
25
+ if (!shouldContinue) {
26
+ Log.blue('Update cancelled');
27
+ return;
28
+ }
29
+ }
30
+ else if (refStatus === 'broken') {
31
+ Log.red(`Error: ${fullSkillName} is broken - Neither ref nor commit exist`, {
32
+ prefix: '✗',
33
+ });
34
+ process.exit(1);
35
+ }
36
+ // Step 3a: Update the single skill
9
37
  await Skill.update(namespace, skillName);
10
38
  Log.green(`Updated ${fullSkillName}`, { prefix: '✓' });
11
39
  return;
12
40
  }
13
- // Update all skill
41
+ // Update all skills
42
+ // Step 2b: Load all skills and categorize by status
14
43
  const skills = await LockFile.findAll();
15
- const addedSkills = Object.keys(skills);
16
- if (addedSkills.length === 0) {
44
+ const skillEntries = Object.entries(skills);
45
+ if (skillEntries.length === 0) {
17
46
  Log.blue('No skills to update');
18
47
  return;
19
48
  }
49
+ const orphanedSkills = [];
50
+ const brokenSkills = [];
51
+ const updatableSkills = [];
52
+ for (const [name, skill] of skillEntries) {
53
+ if (!skill)
54
+ continue;
55
+ const status = await LockFile.getRefStatus(skill);
56
+ if (status === 'orphaned') {
57
+ orphanedSkills.push(`${name} (orphaned from ${skill.requestedRef})`);
58
+ }
59
+ else if (status === 'broken') {
60
+ brokenSkills.push(`${name} (broken)`);
61
+ }
62
+ else {
63
+ updatableSkills.push({ name, namespace: skill.namespace, skillName: skill.skillName });
64
+ }
65
+ }
66
+ // Step 3b: Show summary of skill statuses
67
+ if (orphanedSkills.length > 0) {
68
+ Log.blank();
69
+ Log.yellow(`Orphaned skills (will preserve current commits):`, { prefix: '⚠' });
70
+ orphanedSkills.forEach((s) => Log.yellow(s, { spacing: 2 }));
71
+ }
72
+ if (brokenSkills.length > 0) {
73
+ Log.blank();
74
+ Log.red(`Broken skills (cannot update):`, { prefix: '✗' });
75
+ brokenSkills.forEach((s) => Log.red(s, { spacing: 2 }));
76
+ }
77
+ if (updatableSkills.length === 0) {
78
+ Log.blank();
79
+ Log.blue('No updatable skills.');
80
+ return;
81
+ }
82
+ // Step 4: Prompt user and update all updatable skills
83
+ Log.blank();
20
84
  const shouldUpdate = await Prompt.confirm({
21
- message: `This will update ${addedSkills.length} skill(s). Continue?`,
85
+ message: `Update ${updatableSkills.length} skill(s)?`,
22
86
  default: true,
23
87
  });
24
88
  if (!shouldUpdate) {
25
89
  Log.blue('Update cancelled');
26
90
  return;
27
91
  }
28
- Log.blue(`Updating ${addedSkills.length} skill(s)...`);
29
- await Skill.updateAll();
92
+ Log.blank();
93
+ Log.blue(`Updating ${updatableSkills.length} skill(s)...`);
94
+ for (const { namespace, skillName } of updatableSkills) {
95
+ await Skill.update(namespace, skillName);
96
+ }
30
97
  Log.green('Updated all skills', { prefix: '✓' });
31
98
  }
32
99
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEtF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,aAAiC,EAAiB,EAAE;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,mBAAmB;QACnB,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE9C,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAElE,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,KAAK,CAAC,WAAW,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,oBAAoB,WAAW,CAAC,MAAM,sBAAsB;YACrE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,MAAM,cAAc,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamramo/zanat-cli",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "CLI for zanat - a skill hub for AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
@@ -27,7 +27,7 @@
27
27
  "typecheck": "tsc --noEmit"
28
28
  },
29
29
  "dependencies": {
30
- "@iamramo/zanat-core": "^0.12.4"
30
+ "@iamramo/zanat-core": "^0.12.5"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^25.5.0",