skillpkg-cli 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/deps.d.ts +17 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +234 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +77 -107
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +272 -148
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +47 -17
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/migrate.d.ts +10 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +122 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/search.d.ts +0 -3
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +38 -44
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +180 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +105 -127
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +56 -12
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/index.js +0 -0
- package/package.json +8 -8
package/dist/commands/sync.js
CHANGED
|
@@ -1,162 +1,140 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* sync command - Sync skills to platforms
|
|
3
|
+
*
|
|
4
|
+
* v2.0: Uses new Syncer module from core
|
|
3
5
|
*/
|
|
4
|
-
import { createLocalStore, createAdapterManager, parse, } from 'skillpkg-core';
|
|
5
|
-
import { readFile } from 'fs/promises';
|
|
6
6
|
import { join } from 'path';
|
|
7
|
+
import { createSyncer, createConfigManager, loadSkillsFromDirectory, getTargetConfig, getImplementedTargets, } from 'skillpkg-core';
|
|
7
8
|
import { logger, colors, withSpinner } from '../ui/index.js';
|
|
8
9
|
/**
|
|
9
10
|
* sync command handler
|
|
10
11
|
*/
|
|
11
12
|
export async function syncCommand(skillName, options) {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const configManager = createConfigManager();
|
|
15
|
+
const syncer = createSyncer();
|
|
16
|
+
// Load project config
|
|
17
|
+
const config = await configManager.loadProjectConfig(cwd);
|
|
18
|
+
// Get skills directory
|
|
19
|
+
const skillsDir = join(cwd, '.skillpkg', 'skills');
|
|
20
|
+
// Load skills from store (returns Map<string, SkillContent>)
|
|
21
|
+
let skills = await loadSkillsFromDirectory(skillsDir);
|
|
22
|
+
if (skills.size === 0) {
|
|
16
23
|
logger.error('No skills installed');
|
|
17
24
|
logger.log(`Run ${colors.cyan('skillpkg install <skill>')} first`);
|
|
18
25
|
process.exit(1);
|
|
19
26
|
}
|
|
20
|
-
// Get skills metadata
|
|
21
|
-
const skillsMeta = await store.listSkills();
|
|
22
|
-
if (skillsMeta.length === 0) {
|
|
23
|
-
logger.info('No skills to sync');
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
27
|
// Filter by name if provided
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
logger.error(`Skill ${colors.cyan(skillName || '')} not found`);
|
|
32
|
-
process.exit(1);
|
|
33
|
-
}
|
|
34
|
-
// Load full skill data
|
|
35
|
-
const skills = [];
|
|
36
|
-
for (const meta of targetSkillsMeta) {
|
|
37
|
-
const skill = await loadSkillContent(meta.name);
|
|
38
|
-
if (skill) {
|
|
39
|
-
skills.push(skill);
|
|
28
|
+
if (skillName) {
|
|
29
|
+
if (!skills.has(skillName)) {
|
|
30
|
+
logger.error(`Skill ${colors.cyan(skillName)} not found`);
|
|
31
|
+
process.exit(1);
|
|
40
32
|
}
|
|
33
|
+
const skill = skills.get(skillName);
|
|
34
|
+
skills = new Map([[skillName, skill]]);
|
|
41
35
|
}
|
|
42
|
-
// Parse target platforms
|
|
43
|
-
const platforms = options.target
|
|
44
|
-
? options.target.split(',').map((p) => p.trim())
|
|
45
|
-
: undefined; // undefined = all platforms
|
|
46
36
|
logger.header('Sync Skills to Platforms');
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
37
|
+
// Determine targets
|
|
38
|
+
let targetConfigs;
|
|
39
|
+
// Get implemented targets (TargetConfig[])
|
|
40
|
+
const implementedTargets = getImplementedTargets();
|
|
41
|
+
const implementedIds = implementedTargets.map((t) => t.id);
|
|
42
|
+
if (options.target) {
|
|
43
|
+
// User specified targets
|
|
44
|
+
const requestedTargets = options.target.split(',').map((t) => t.trim());
|
|
45
|
+
// Validate target names
|
|
46
|
+
const invalidTargets = requestedTargets.filter((t) => !implementedIds.includes(t));
|
|
47
|
+
if (invalidTargets.length > 0) {
|
|
48
|
+
logger.error(`Unknown or unimplemented targets: ${invalidTargets.join(', ')}`);
|
|
49
|
+
logger.blank();
|
|
50
|
+
logger.log('Available targets:');
|
|
51
|
+
for (const tc of implementedTargets) {
|
|
52
|
+
logger.item(`${colors.cyan(tc.id)} - ${tc.description}`);
|
|
53
|
+
}
|
|
54
|
+
process.exit(1);
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
logger.item(`${colors.dim('.claude/')} for Claude Code`);
|
|
60
|
-
logger.item(`${colors.dim('.codex/')} or ${colors.dim('AGENTS.md')} for Codex`);
|
|
61
|
-
logger.item(`${colors.dim('.github/')} for GitHub Copilot`);
|
|
62
|
-
logger.item(`${colors.dim('.cline/')} for VS Code Cline`);
|
|
63
|
-
logger.blank();
|
|
64
|
-
return;
|
|
56
|
+
// Get target configs for valid targets
|
|
57
|
+
targetConfigs = requestedTargets.map((t) => getTargetConfig(t));
|
|
65
58
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
else if (config?.sync_targets) {
|
|
60
|
+
// Use targets from config
|
|
61
|
+
const enabledTargets = Object.entries(config.sync_targets)
|
|
62
|
+
.filter(([_, enabled]) => enabled)
|
|
63
|
+
.map(([name]) => name);
|
|
64
|
+
if (enabledTargets.length === 0) {
|
|
65
|
+
logger.warn('No sync targets enabled in skillpkg.json');
|
|
66
|
+
logger.log(`Add targets to ${colors.cyan('sync_targets')} in skillpkg.json`);
|
|
67
|
+
logger.blank();
|
|
68
|
+
logger.log('Available targets:');
|
|
69
|
+
for (const tc of implementedTargets) {
|
|
70
|
+
logger.item(`${colors.cyan(tc.id)} - ${tc.description}`);
|
|
71
|
+
}
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
// Filter to only implemented targets
|
|
75
|
+
const validTargets = enabledTargets.filter((t) => implementedIds.includes(t));
|
|
76
|
+
targetConfigs = validTargets.map((t) => getTargetConfig(t));
|
|
69
77
|
}
|
|
78
|
+
else {
|
|
79
|
+
// Default to claude-code
|
|
80
|
+
targetConfigs = [getTargetConfig('claude-code')];
|
|
81
|
+
logger.warn('No skillpkg.json found, using default target: claude-code');
|
|
82
|
+
}
|
|
83
|
+
logger.log(`Skills to sync: ${colors.cyan(String(skills.size))}`);
|
|
84
|
+
logger.log(`Targets: ${colors.cyan(targetConfigs.map((t) => t.id).join(', '))}`);
|
|
70
85
|
logger.blank();
|
|
71
86
|
if (options.dryRun) {
|
|
72
87
|
logger.warn('Dry run mode - no changes will be made');
|
|
73
88
|
logger.blank();
|
|
74
89
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
// Sync to each target
|
|
91
|
+
const results = [];
|
|
92
|
+
for (const targetConfig of targetConfigs) {
|
|
93
|
+
const result = await withSpinner(`Syncing to ${targetConfig.displayName}`, async () => {
|
|
94
|
+
return syncer.syncToTarget(cwd, skills, targetConfig, {
|
|
95
|
+
dryRun: options.dryRun,
|
|
96
|
+
});
|
|
97
|
+
}, {
|
|
98
|
+
successText: `Synced to ${targetConfig.displayName}`,
|
|
99
|
+
failText: `Failed to sync to ${targetConfig.displayName}`,
|
|
100
|
+
});
|
|
101
|
+
results.push(result);
|
|
102
|
+
}
|
|
86
103
|
logger.blank();
|
|
87
104
|
// Show results
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
105
|
+
let totalSynced = 0;
|
|
106
|
+
let totalSkipped = 0;
|
|
107
|
+
let totalErrors = 0;
|
|
108
|
+
for (const result of results) {
|
|
109
|
+
// Count synced files
|
|
110
|
+
const synced = result.files.filter((f) => f.action === 'created' || f.action === 'updated');
|
|
111
|
+
const skipped = result.files.filter((f) => f.action === 'skipped' || f.action === 'unchanged');
|
|
112
|
+
const deleted = result.files.filter((f) => f.action === 'deleted');
|
|
113
|
+
totalSynced += synced.length;
|
|
114
|
+
totalSkipped += skipped.length;
|
|
115
|
+
totalErrors += result.errors?.length || 0;
|
|
116
|
+
if (synced.length > 0) {
|
|
117
|
+
logger.success(`${result.target} (${synced.length} files):`);
|
|
118
|
+
for (const file of synced) {
|
|
119
|
+
const action = file.action === 'created' ? colors.green('+') : colors.yellow('~');
|
|
120
|
+
logger.log(` ${action} ${colors.dim(file.path)}`);
|
|
121
|
+
}
|
|
93
122
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (result.skipped.length > 0) {
|
|
97
|
-
logger.warn('Skipped:');
|
|
98
|
-
for (const item of result.skipped) {
|
|
99
|
-
logger.item(`${colors.cyan(item.skill)} → ${colors.yellow(item.platform)}: ${item.reason}`);
|
|
123
|
+
if (deleted.length > 0) {
|
|
124
|
+
logger.log(`${result.target} cleaned ${deleted.length} orphan(s)`);
|
|
100
125
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
logger.item(`${colors.cyan(item.skill)} → ${colors.red(item.platform)}: ${item.error}`);
|
|
126
|
+
if (result.errors && result.errors.length > 0) {
|
|
127
|
+
logger.error(`${result.target} errors:`);
|
|
128
|
+
for (const error of result.errors) {
|
|
129
|
+
logger.log(` ${colors.red('×')} ${error}`);
|
|
130
|
+
}
|
|
107
131
|
}
|
|
108
|
-
logger.blank();
|
|
109
|
-
}
|
|
110
|
-
// Update registry with synced platforms
|
|
111
|
-
if (!options.dryRun && result.synced.length > 0) {
|
|
112
|
-
await updateSyncedPlatformsInRegistry(store, result.synced);
|
|
113
132
|
}
|
|
133
|
+
logger.blank();
|
|
114
134
|
// Summary
|
|
115
|
-
logger.log(`Summary: ${colors.green(String(
|
|
116
|
-
`${colors.yellow(String(
|
|
117
|
-
`${colors.red(String(
|
|
135
|
+
logger.log(`Summary: ${colors.green(String(totalSynced))} synced, ` +
|
|
136
|
+
`${colors.yellow(String(totalSkipped))} unchanged, ` +
|
|
137
|
+
`${colors.red(String(totalErrors))} errors`);
|
|
118
138
|
logger.blank();
|
|
119
139
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Load skill content from store
|
|
122
|
-
*/
|
|
123
|
-
async function loadSkillContent(skillName) {
|
|
124
|
-
const skillDir = join(process.cwd(), '.skillpkg', 'skills', skillName);
|
|
125
|
-
const yamlPath = join(skillDir, 'skill.yaml');
|
|
126
|
-
try {
|
|
127
|
-
const content = await readFile(yamlPath, 'utf-8');
|
|
128
|
-
const result = parse(content);
|
|
129
|
-
return result.success && result.data ? result.data : null;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Update synced platforms in registry
|
|
137
|
-
*/
|
|
138
|
-
async function updateSyncedPlatformsInRegistry(store, synced) {
|
|
139
|
-
// Group by skill
|
|
140
|
-
const bySkill = new Map();
|
|
141
|
-
for (const item of synced) {
|
|
142
|
-
if (!bySkill.has(item.skill)) {
|
|
143
|
-
bySkill.set(item.skill, []);
|
|
144
|
-
}
|
|
145
|
-
bySkill.get(item.skill).push(item.platform);
|
|
146
|
-
}
|
|
147
|
-
// Update each skill's synced platforms
|
|
148
|
-
for (const [skillName, platforms] of bySkill) {
|
|
149
|
-
// Get existing entry to merge platforms
|
|
150
|
-
const entry = await store.getSkillEntry(skillName);
|
|
151
|
-
if (entry) {
|
|
152
|
-
// Merge with existing platforms
|
|
153
|
-
const existingPlatforms = new Set(entry.syncedPlatforms || []);
|
|
154
|
-
for (const p of platforms) {
|
|
155
|
-
existingPlatforms.add(p);
|
|
156
|
-
}
|
|
157
|
-
// Update using store method
|
|
158
|
-
await store.updateSyncedPlatforms(skillName, Array.from(existingPlatforms));
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
140
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAgBA,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAsGf"}
|
|
@@ -1,47 +1,91 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* uninstall command - Remove a skill
|
|
2
|
+
* uninstall command - Remove a skill with dependency checking
|
|
3
|
+
*
|
|
4
|
+
* v2.0: Uses new Installer module with dependency awareness
|
|
3
5
|
*/
|
|
4
|
-
import { createGlobalStore, createLocalStore, createAdapterManager } from 'skillpkg-core';
|
|
6
|
+
import { createGlobalStore, createLocalStore, createStateManager, createConfigManager, createInstaller, createAdapterManager, } from 'skillpkg-core';
|
|
5
7
|
import { logger, colors, withSpinner } from '../ui/index.js';
|
|
6
8
|
/**
|
|
7
9
|
* uninstall command handler
|
|
8
10
|
*/
|
|
9
11
|
export async function uninstallCommand(skillName, options) {
|
|
10
|
-
const
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const storeManager = options.global ? createGlobalStore() : createLocalStore();
|
|
14
|
+
const stateManager = createStateManager();
|
|
15
|
+
const configManager = createConfigManager();
|
|
11
16
|
// Check if store is initialized
|
|
12
|
-
if (!(await
|
|
17
|
+
if (!(await storeManager.isInitialized())) {
|
|
13
18
|
logger.error('No skills installed');
|
|
14
19
|
process.exit(1);
|
|
15
20
|
}
|
|
16
21
|
// Check if skill exists
|
|
17
|
-
if (!(await
|
|
22
|
+
if (!(await storeManager.hasSkill(skillName))) {
|
|
18
23
|
logger.error(`Skill ${colors.cyan(skillName)} is not installed`);
|
|
19
24
|
process.exit(1);
|
|
20
25
|
}
|
|
21
26
|
// Get skill info before removal
|
|
22
|
-
const skill = await
|
|
27
|
+
const skill = await storeManager.getSkill(skillName);
|
|
23
28
|
const version = skill?.version || 'unknown';
|
|
24
|
-
//
|
|
25
|
-
const
|
|
29
|
+
// Create installer (with minimal fetcher since we're uninstalling)
|
|
30
|
+
const fetcher = {
|
|
31
|
+
async fetchMetadata() {
|
|
32
|
+
return null;
|
|
33
|
+
},
|
|
34
|
+
async fetchSkill() {
|
|
35
|
+
return null;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const installer = createInstaller(stateManager, configManager, storeManager, fetcher);
|
|
39
|
+
// Check for dependents (unless --force)
|
|
40
|
+
if (!options.force) {
|
|
41
|
+
const check = await installer.canUninstall(cwd, skillName);
|
|
42
|
+
if (!check.canUninstall) {
|
|
43
|
+
logger.error(`Cannot uninstall ${colors.cyan(skillName)}`);
|
|
44
|
+
logger.blank();
|
|
45
|
+
logger.log('The following skills depend on it:');
|
|
46
|
+
for (const dep of check.dependents) {
|
|
47
|
+
logger.item(colors.cyan(dep));
|
|
48
|
+
}
|
|
49
|
+
logger.blank();
|
|
50
|
+
logger.log(`Use ${colors.cyan('--force')} to uninstall anyway`);
|
|
51
|
+
logger.warn('Warning: This may break the dependent skills!');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Perform uninstall
|
|
56
|
+
const result = await withSpinner(`Uninstalling ${colors.cyan(skillName)}@${version}`, () => installer.uninstall(cwd, skillName, {
|
|
57
|
+
force: options.force,
|
|
58
|
+
removeOrphans: true,
|
|
59
|
+
}), {
|
|
26
60
|
successText: `Uninstalled ${colors.cyan(skillName)}@${version}`,
|
|
27
61
|
failText: `Failed to uninstall ${skillName}`,
|
|
28
62
|
});
|
|
29
|
-
if (!
|
|
30
|
-
logger.error(
|
|
63
|
+
if (!result.success) {
|
|
64
|
+
logger.error('Uninstall failed:');
|
|
65
|
+
for (const error of result.errors) {
|
|
66
|
+
logger.log(` ${colors.red('×')} ${error}`);
|
|
67
|
+
}
|
|
31
68
|
process.exit(1);
|
|
32
69
|
}
|
|
33
70
|
// Clean synced platform files if --clean flag is set
|
|
34
71
|
if (options.clean) {
|
|
35
72
|
const adapterManager = createAdapterManager();
|
|
36
|
-
await withSpinner(`Cleaning synced files from platforms`, () => adapterManager.removeFromAllPlatforms(skillName,
|
|
73
|
+
await withSpinner(`Cleaning synced files from platforms`, () => adapterManager.removeFromAllPlatforms(skillName, cwd), {
|
|
37
74
|
successText: `Cleaned synced files`,
|
|
38
75
|
failText: `Failed to clean some platform files`,
|
|
39
76
|
});
|
|
40
77
|
}
|
|
41
78
|
logger.blank();
|
|
42
79
|
logger.success(`Removed ${colors.cyan(skillName)}`);
|
|
80
|
+
// Show removed orphans
|
|
81
|
+
if (result.orphansRemoved.length > 0) {
|
|
82
|
+
logger.log(`Also removed ${result.orphansRemoved.length} orphan dependency(s):`);
|
|
83
|
+
for (const orphan of result.orphansRemoved) {
|
|
84
|
+
logger.item(colors.dim(orphan));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
43
87
|
if (options.clean) {
|
|
44
|
-
logger.log(
|
|
88
|
+
logger.log(colors.dim('Also removed synced files from all platforms'));
|
|
45
89
|
}
|
|
46
90
|
logger.blank();
|
|
47
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,GAErB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQ7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,OAAyB;IAEzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC/E,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAE5C,gCAAgC;IAChC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;IAE5C,mEAAmE;IACnE,MAAM,OAAO,GAAwB;QACnC,KAAK,CAAC,aAAa;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEtF,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,gBAAgB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,EACnD,GAAG,EAAE,CACH,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,IAAI;KACpB,CAAC,EACJ;QACE,WAAW,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE;QAC/D,QAAQ,EAAE,uBAAuB,SAAS,EAAE;KAC7C,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;QAC9C,MAAM,WAAW,CACf,sCAAsC,EACtC,GAAG,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,EAC3D;YACE,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,qCAAqC;SAChD,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEpD,uBAAuB;IACvB,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,cAAc,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACjF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillpkg-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "CLI for skillpkg - Agent Skills Package Manager. Install once, use everywhere.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,11 +15,6 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"dev": "tsc --watch",
|
|
21
|
-
"start": "node dist/index.js"
|
|
22
|
-
},
|
|
23
18
|
"keywords": [
|
|
24
19
|
"cli",
|
|
25
20
|
"skillpkg",
|
|
@@ -50,12 +45,12 @@
|
|
|
50
45
|
"node": ">=18.0.0"
|
|
51
46
|
},
|
|
52
47
|
"dependencies": {
|
|
53
|
-
"skillpkg-core": "^0.1.0",
|
|
54
48
|
"chalk": "^5.3.0",
|
|
55
49
|
"cli-table3": "^0.6.3",
|
|
56
50
|
"commander": "^12.0.0",
|
|
57
51
|
"inquirer": "^9.2.0",
|
|
58
52
|
"ora": "^8.0.0",
|
|
53
|
+
"skillpkg-core": "^0.3.0",
|
|
59
54
|
"tar-stream": "^3.1.7"
|
|
60
55
|
},
|
|
61
56
|
"devDependencies": {
|
|
@@ -63,5 +58,10 @@
|
|
|
63
58
|
"@types/node": "^20.10.0",
|
|
64
59
|
"@types/tar-stream": "^3.1.4",
|
|
65
60
|
"typescript": "^5.3.0"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc",
|
|
64
|
+
"dev": "tsc --watch",
|
|
65
|
+
"start": "node dist/index.js"
|
|
66
66
|
}
|
|
67
|
-
}
|
|
67
|
+
}
|