@iamramo/zanat-cli 0.12.4 → 0.12.6
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 +154 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +5 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +47 -5
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +6 -4
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +43 -4
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/remove.js +4 -3
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +10 -6
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +12 -9
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +74 -7
- package/dist/commands/update.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
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 =
|
|
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
|
|
18
|
-
|
|
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
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import { Log, Prompt, LockFile, Skill, Path, Config, Zod } from '@iamramo/zanat-core';
|
|
2
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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":"
|
|
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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClC,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;
|
|
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,
|
|
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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -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
|
-
|
|
15
|
-
const
|
|
16
|
-
Log.green(`${skillName} ${
|
|
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;
|
|
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,
|
|
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"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -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
|
-
|
|
5
|
+
await Config.ensureCorrectBranch();
|
|
6
6
|
const config = await Config.get();
|
|
7
|
-
|
|
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.
|
|
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;
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/remove.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/commands/search.js
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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;
|
|
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,
|
|
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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
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.
|
|
18
|
-
if (behind
|
|
19
|
-
Log.
|
|
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.
|
|
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
|
-
|
|
29
|
-
const
|
|
30
|
-
Log.green(`${skillName} ${
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
41
|
+
// Update all skills
|
|
42
|
+
// Step 2b: Load all skills and categorize by status
|
|
14
43
|
const skills = await LockFile.findAll();
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
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: `
|
|
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.
|
|
29
|
-
|
|
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,
|
|
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,iCAAiC;QACjC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,mBAAmB;QACnB,IAAI,aAAa,EAAE,CAAC;YAClB,iDAAiD;YACjD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAElE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,GAAG,CAAC,GAAG,CAAC,UAAU,aAAa,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAErD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CACR,YAAY,aAAa,0BAA0B,KAAK,CAAC,YAAY,6CAA6C,EAClH;oBACE,MAAM,EAAE,GAAG;iBACZ,CACF,CAAC;gBACF,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;oBAC1C,OAAO,EAAE,+CAA+C;oBACxD,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,GAAG,CAAC,GAAG,CAAC,UAAU,aAAa,2CAA2C,EAAE;oBAC1E,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,mCAAmC;YACnC,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,oBAAoB;QACpB,oDAAoD;QACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,eAAe,GAA+D,EAAE,CAAC;QAEvF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,mBAAmB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,kDAAkD,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAChF,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3D,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,UAAU,eAAe,CAAC,MAAM,YAAY;YACrD,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,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,MAAM,cAAc,CAAC,CAAC;QAE3D,KAAK,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,eAAe,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iamramo/zanat-cli",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.6",
|
|
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.
|
|
30
|
+
"@iamramo/zanat-core": "^0.12.6"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^25.5.0",
|