@myclaude-cli/cli 0.3.0-alpha
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/bin/dev.js +5 -0
- package/bin/myclaude.js +20 -0
- package/dist/commands/help.d.ts +11 -0
- package/dist/commands/help.js +221 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/info.d.ts +12 -0
- package/dist/commands/info.js +87 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/install.d.ts +14 -0
- package/dist/commands/install.js +113 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.js +41 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.js +83 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +9 -0
- package/dist/commands/logout.js +25 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/publish.d.ts +10 -0
- package/dist/commands/publish.js +229 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/search.d.ts +18 -0
- package/dist/commands/search.js +108 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.js +84 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +14 -0
- package/dist/commands/uninstall.js +98 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.js +144 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +52 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/api.d.ts +18 -0
- package/dist/core/api.js +135 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/auth.d.ts +30 -0
- package/dist/core/auth.js +71 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/browser-auth.d.ts +24 -0
- package/dist/core/browser-auth.js +155 -0
- package/dist/core/browser-auth.js.map +1 -0
- package/dist/core/install.d.ts +24 -0
- package/dist/core/install.js +191 -0
- package/dist/core/install.js.map +1 -0
- package/dist/core/lockfile.d.ts +18 -0
- package/dist/core/lockfile.js +41 -0
- package/dist/core/lockfile.js.map +1 -0
- package/dist/core/manifest.d.ts +41 -0
- package/dist/core/manifest.js +203 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/packer.d.ts +25 -0
- package/dist/core/packer.js +169 -0
- package/dist/core/packer.js.map +1 -0
- package/dist/core/paths.d.ts +2 -0
- package/dist/core/paths.js +50 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/secret-scan.d.ts +17 -0
- package/dist/core/secret-scan.js +73 -0
- package/dist/core/secret-scan.js.map +1 -0
- package/dist/ui/exit-codes.d.ts +91 -0
- package/dist/ui/exit-codes.js +51 -0
- package/dist/ui/exit-codes.js.map +1 -0
- package/dist/ui/format.d.ts +12 -0
- package/dist/ui/format.js +44 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/index.d.ts +13 -0
- package/dist/ui/index.js +11 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/layout.d.ts +28 -0
- package/dist/ui/layout.js +161 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/table.d.ts +10 -0
- package/dist/ui/table.js +42 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +46 -0
- package/dist/ui/theme.js +180 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/config.d.ts +11 -0
- package/dist/utils/config.js +44 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/keychain.d.ts +3 -0
- package/dist/utils/keychain.js +53 -0
- package/dist/utils/keychain.js.map +1 -0
- package/package.json +63 -0
package/bin/dev.js
ADDED
package/bin/myclaude.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Filter oclif's cosmetic ESM warning without removing other listeners.
|
|
4
|
+
// Only suppresses ModuleLoadError (Symbol(SINGLE_COMMAND_CLI) resolution).
|
|
5
|
+
const _origEmitWarning = process.emitWarning
|
|
6
|
+
process.emitWarning = function (warning, ...args) {
|
|
7
|
+
if (typeof warning === 'string' && warning.includes('ModuleLoadError')) return
|
|
8
|
+
if (warning instanceof Error && warning.name === 'ModuleLoadError') return
|
|
9
|
+
return _origEmitWarning.call(this, warning, ...args)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
import {execute} from '@oclif/core'
|
|
13
|
+
|
|
14
|
+
// Default to 'status' when no command is provided
|
|
15
|
+
const args = process.argv.slice(2)
|
|
16
|
+
if (args.length === 0 || (args.length === 1 && args[0] === '--json')) {
|
|
17
|
+
process.argv.splice(2, 0, 'status')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
await execute({type: 'esm', dir: import.meta.url})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Help extends Command {
|
|
3
|
+
static args: {
|
|
4
|
+
command: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static flags: {
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { CLI_VERSION } from '../constants.js';
|
|
3
|
+
import { color, mascotWithWordmark, separator, } from '../ui/index.js';
|
|
4
|
+
/** Command groups for logical display — synced with status.ts */
|
|
5
|
+
const GROUPS = [
|
|
6
|
+
{
|
|
7
|
+
name: 'discover',
|
|
8
|
+
commands: [
|
|
9
|
+
{ cmd: 'search [query]', desc: 'Search the marketplace' },
|
|
10
|
+
{ cmd: 'info <slug>', desc: 'Show product details' },
|
|
11
|
+
],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'manage',
|
|
15
|
+
commands: [
|
|
16
|
+
{ cmd: 'install <slug>', desc: 'Install a product' },
|
|
17
|
+
{ cmd: 'uninstall <slug>', desc: 'Remove a product' },
|
|
18
|
+
{ cmd: 'list', desc: 'List installed products' },
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'publish',
|
|
23
|
+
commands: [
|
|
24
|
+
{ cmd: 'validate', desc: 'Check product before publishing' },
|
|
25
|
+
{ cmd: 'publish', desc: 'Publish to marketplace' },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'account',
|
|
30
|
+
commands: [
|
|
31
|
+
{ cmd: 'login', desc: 'Authenticate via browser' },
|
|
32
|
+
{ cmd: 'logout', desc: 'Clear stored credentials' },
|
|
33
|
+
{ cmd: 'whoami', desc: 'Show current user' },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
function cmdRow(cmd, desc, colWidth = 28) {
|
|
38
|
+
const pad = Math.max(1, colWidth - cmd.length);
|
|
39
|
+
return ` ${color.bold(cmd)}${' '.repeat(pad)}${color.muted(desc)}`;
|
|
40
|
+
}
|
|
41
|
+
const COMMAND_HELP = {
|
|
42
|
+
search: [
|
|
43
|
+
`${color.bold('myclaude search')} [query] [flags]`,
|
|
44
|
+
'',
|
|
45
|
+
'Search the myClaude marketplace for products.',
|
|
46
|
+
'',
|
|
47
|
+
color.muted('FLAGS:'),
|
|
48
|
+
` --category <type> ${color.muted('Filter: skills, agents, squads, workflows, design-systems, claude-md, prompts, applications, systems')}`,
|
|
49
|
+
` --author <user> ${color.muted('Filter by author username')}`,
|
|
50
|
+
` --free ${color.muted('Show only free products')}`,
|
|
51
|
+
` --sort <order> ${color.muted('relevance, downloads, rating, newest, price-asc, price-desc')}`,
|
|
52
|
+
` --limit <n> ${color.muted('Results per page (1-50, default 20)')}`,
|
|
53
|
+
` --page <n> ${color.muted('Page number')}`,
|
|
54
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
55
|
+
'',
|
|
56
|
+
color.muted('EXAMPLES:'),
|
|
57
|
+
` ${color.primary('myclaude search "auth middleware"')}`,
|
|
58
|
+
` ${color.primary('myclaude search --category skills --free')}`,
|
|
59
|
+
` ${color.primary('myclaude search --author secdev --json')}`,
|
|
60
|
+
],
|
|
61
|
+
info: [
|
|
62
|
+
`${color.bold('myclaude info')} <slug>`,
|
|
63
|
+
'',
|
|
64
|
+
'Show detailed information about a product.',
|
|
65
|
+
'',
|
|
66
|
+
color.muted('FLAGS:'),
|
|
67
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
68
|
+
'',
|
|
69
|
+
color.muted('EXAMPLES:'),
|
|
70
|
+
` ${color.primary('myclaude info auth-guard-skill')}`,
|
|
71
|
+
],
|
|
72
|
+
install: [
|
|
73
|
+
`${color.bold('myclaude install')} <slug> [flags]`,
|
|
74
|
+
'',
|
|
75
|
+
'Install a product from the marketplace. Requires authentication.',
|
|
76
|
+
'',
|
|
77
|
+
color.muted('FLAGS:'),
|
|
78
|
+
` --global ${color.muted('Install to ~/.claude/ instead of ./.claude/')}`,
|
|
79
|
+
` --force ${color.muted('Reinstall even if already installed')}`,
|
|
80
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
81
|
+
'',
|
|
82
|
+
color.muted('EXAMPLES:'),
|
|
83
|
+
` ${color.primary('myclaude install auth-guard-skill')}`,
|
|
84
|
+
` ${color.primary('myclaude install auth-guard-skill --global')}`,
|
|
85
|
+
],
|
|
86
|
+
uninstall: [
|
|
87
|
+
`${color.bold('myclaude uninstall')} <slug>`,
|
|
88
|
+
'',
|
|
89
|
+
'Remove an installed product.',
|
|
90
|
+
'',
|
|
91
|
+
color.muted('FLAGS:'),
|
|
92
|
+
` -y, --yes ${color.muted('Skip confirmation')}`,
|
|
93
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
94
|
+
],
|
|
95
|
+
list: [
|
|
96
|
+
`${color.bold('myclaude list')}`,
|
|
97
|
+
'',
|
|
98
|
+
'List all installed products.',
|
|
99
|
+
'',
|
|
100
|
+
color.muted('FLAGS:'),
|
|
101
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
102
|
+
],
|
|
103
|
+
validate: [
|
|
104
|
+
`${color.bold('myclaude validate')}`,
|
|
105
|
+
'',
|
|
106
|
+
'Validate a product before publishing. Checks vault.yaml, entry file,',
|
|
107
|
+
'file sizes, secret scan, license, and frontmatter.',
|
|
108
|
+
'',
|
|
109
|
+
'Run this in a directory containing a vault.yaml manifest.',
|
|
110
|
+
'',
|
|
111
|
+
color.muted('CHECKS:'),
|
|
112
|
+
` vault.yaml ${color.muted('exists and valid YAML with required fields')}`,
|
|
113
|
+
` entry file ${color.muted('referenced file exists')}`,
|
|
114
|
+
` file size ${color.muted('50MB total, 10MB per file')}`,
|
|
115
|
+
` secret scan ${color.muted('AWS, Stripe, Firebase, GitHub tokens')}`,
|
|
116
|
+
` license ${color.muted('valid SPDX identifier')}`,
|
|
117
|
+
` frontmatter ${color.muted('SKILL.md has YAML frontmatter (skill types)')}`,
|
|
118
|
+
'',
|
|
119
|
+
color.muted('FLAGS:'),
|
|
120
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
121
|
+
'',
|
|
122
|
+
color.muted('EXIT CODES:'),
|
|
123
|
+
` 0 ${color.muted('all checks passed')}`,
|
|
124
|
+
` 4 ${color.muted('validation failed (blocker detected)')}`,
|
|
125
|
+
],
|
|
126
|
+
publish: [
|
|
127
|
+
`${color.bold('myclaude publish')} [flags]`,
|
|
128
|
+
'',
|
|
129
|
+
'Publish a product to the myClaude marketplace.',
|
|
130
|
+
'Requires authentication and a valid vault.yaml in the current directory.',
|
|
131
|
+
'',
|
|
132
|
+
color.muted('FLOW:'),
|
|
133
|
+
` 1. ${color.muted('verify auth')}`,
|
|
134
|
+
` 2. ${color.muted('validate (vault.yaml + secret scan)')}`,
|
|
135
|
+
` 3. ${color.muted('pack files (respecting .vaultignore)')}`,
|
|
136
|
+
` 4. ${color.muted('upload to secure storage')}`,
|
|
137
|
+
` 5. ${color.muted('server-side content scan')}`,
|
|
138
|
+
` 6. ${color.muted('create product (status: pending_review)')}`,
|
|
139
|
+
'',
|
|
140
|
+
color.muted('FLAGS:'),
|
|
141
|
+
` -y, --yes ${color.muted('Skip confirmation for re-publish')}`,
|
|
142
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
143
|
+
'',
|
|
144
|
+
color.muted('EXIT CODES:'),
|
|
145
|
+
` 0 ${color.muted('published successfully')}`,
|
|
146
|
+
` 2 ${color.muted('authentication required')}`,
|
|
147
|
+
` 4 ${color.muted('validation / content scan failed')}`,
|
|
148
|
+
` 5 ${color.muted('slug conflict (taken by another author)')}`,
|
|
149
|
+
],
|
|
150
|
+
login: [
|
|
151
|
+
`${color.bold('myclaude login')}`,
|
|
152
|
+
'',
|
|
153
|
+
'Authenticate with myClaude via browser. Opens a browser window',
|
|
154
|
+
'for sign-in and waits for completion (5 minute timeout).',
|
|
155
|
+
],
|
|
156
|
+
logout: [
|
|
157
|
+
`${color.bold('myclaude logout')}`,
|
|
158
|
+
'',
|
|
159
|
+
'Clear stored credentials and tokens.',
|
|
160
|
+
],
|
|
161
|
+
whoami: [
|
|
162
|
+
`${color.bold('myclaude whoami')}`,
|
|
163
|
+
'',
|
|
164
|
+
'Show the currently authenticated user.',
|
|
165
|
+
'',
|
|
166
|
+
color.muted('FLAGS:'),
|
|
167
|
+
` --json ${color.muted('Machine-readable output')}`,
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
export default class Help extends Command {
|
|
171
|
+
static args = {
|
|
172
|
+
command: Args.string({ description: 'Command to get help for', required: false }),
|
|
173
|
+
};
|
|
174
|
+
static description = 'Show help for myClaude commands';
|
|
175
|
+
static flags = {
|
|
176
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
177
|
+
};
|
|
178
|
+
async run() {
|
|
179
|
+
const { args, flags } = await this.parse(Help);
|
|
180
|
+
if (flags.json) {
|
|
181
|
+
const { CLI_MANIFEST } = await import('../ui/exit-codes.js');
|
|
182
|
+
this.log(JSON.stringify(CLI_MANIFEST));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Command-specific help
|
|
186
|
+
if (args.command) {
|
|
187
|
+
const help = COMMAND_HELP[args.command];
|
|
188
|
+
if (!help) {
|
|
189
|
+
this.log(` ${color.error('✗')} unknown command: ${args.command}`);
|
|
190
|
+
this.log(` ${color.muted('→')} ${color.muted('myclaude help for available commands')}`);
|
|
191
|
+
this.exit(3);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
this.log('');
|
|
195
|
+
for (const line of help) {
|
|
196
|
+
this.log(` ${line}`);
|
|
197
|
+
}
|
|
198
|
+
this.log('');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// General help
|
|
202
|
+
this.log('');
|
|
203
|
+
this.log(mascotWithWordmark());
|
|
204
|
+
this.log('');
|
|
205
|
+
this.log(separator(48));
|
|
206
|
+
this.log('');
|
|
207
|
+
for (const group of GROUPS) {
|
|
208
|
+
this.log(` ${color.muted(group.name.toUpperCase())}`);
|
|
209
|
+
for (const { cmd, desc } of group.commands) {
|
|
210
|
+
this.log(cmdRow(cmd, desc));
|
|
211
|
+
}
|
|
212
|
+
this.log('');
|
|
213
|
+
}
|
|
214
|
+
this.log(` ${color.muted('GLOBAL FLAGS')}`);
|
|
215
|
+
this.log(` ${color.bold('--json')}${' '.repeat(22)}${color.muted('Machine-readable output (all commands)')}`);
|
|
216
|
+
this.log('');
|
|
217
|
+
this.log(` ${color.muted(`v${CLI_VERSION}`)} ${color.muted('·')} ${color.muted('https://myclaude.sh')}`);
|
|
218
|
+
this.log('');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Info extends Command {
|
|
3
|
+
static args: {
|
|
4
|
+
slug: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { apiGet } from '../core/api.js';
|
|
3
|
+
import { EXIT, action, card, categoryLabel, color, formatAuthor, formatDate, formatNumber, formatPrice, formatRating, formatVersion, icon, } from '../ui/index.js';
|
|
4
|
+
export default class Info extends Command {
|
|
5
|
+
static args = {
|
|
6
|
+
slug: Args.string({ description: 'Product slug', required: true }),
|
|
7
|
+
};
|
|
8
|
+
static description = 'Show detailed product information';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> info auth-guard-skill',
|
|
11
|
+
'<%= config.bin %> info auth-guard-skill --json',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
const { args, flags } = await this.parse(Info);
|
|
18
|
+
let spinner;
|
|
19
|
+
if (!flags.json) {
|
|
20
|
+
const { default: ora } = await import('ora');
|
|
21
|
+
spinner = ora({ text: `resolving ${args.slug}...`, color: 'yellow' }).start();
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const res = await apiGet('/api/cli/products/search', { limit: '1', slug: args.slug }, { auth: false });
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
throw new Error(`Failed to fetch product: ${res.status}`);
|
|
27
|
+
}
|
|
28
|
+
const data = await res.json();
|
|
29
|
+
if (data.products.length === 0) {
|
|
30
|
+
throw new Error(`Product not found: ${args.slug}`);
|
|
31
|
+
}
|
|
32
|
+
const p = data.products[0];
|
|
33
|
+
spinner?.stop();
|
|
34
|
+
if (flags.json) {
|
|
35
|
+
this.log(JSON.stringify(p));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const ver = p.version ? ` ${formatVersion(p.version)}` : '';
|
|
39
|
+
const license = p.license ? ` ${color.muted('·')} ${color.muted(p.license)}` : '';
|
|
40
|
+
const cardLines = [
|
|
41
|
+
'',
|
|
42
|
+
`${color.bold(p.title.toUpperCase())}${ver}`,
|
|
43
|
+
`${formatAuthor(p.authorUsername)} ${color.muted('·')} ${categoryLabel(p.category)}${license}`,
|
|
44
|
+
'',
|
|
45
|
+
p.description,
|
|
46
|
+
'',
|
|
47
|
+
`${color.muted('price')} ${formatPrice(p.price)}`,
|
|
48
|
+
`${color.muted('dl')} ${formatNumber(p.stats.downloads)}`,
|
|
49
|
+
`${color.muted('rating')} ${formatRating(p.stats.rating, p.stats.reviewsCount)}`,
|
|
50
|
+
`${color.muted('published')} ${formatDate(p.createdAt)}`,
|
|
51
|
+
`${color.muted('updated')} ${formatDate(p.updatedAt)}`,
|
|
52
|
+
];
|
|
53
|
+
if (p.tags?.length > 0) {
|
|
54
|
+
cardLines.push('');
|
|
55
|
+
cardLines.push(p.tags.map((t) => color.muted(t)).join(color.muted(', ')));
|
|
56
|
+
}
|
|
57
|
+
cardLines.push('');
|
|
58
|
+
this.log('');
|
|
59
|
+
this.log(card(cardLines));
|
|
60
|
+
this.log('');
|
|
61
|
+
if (p.price === 0) {
|
|
62
|
+
this.log(action(`myclaude install ${p.slug}`));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.log(action(`myclaude install ${p.slug}`) + color.muted(` ($${p.price.toFixed(2)})`));
|
|
66
|
+
}
|
|
67
|
+
this.log('');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const msg = error.message;
|
|
71
|
+
const isNotFound = msg.includes('not found');
|
|
72
|
+
if (flags.json) {
|
|
73
|
+
if (spinner)
|
|
74
|
+
spinner.stop();
|
|
75
|
+
this.log(JSON.stringify({ error: msg }));
|
|
76
|
+
}
|
|
77
|
+
else if (spinner) {
|
|
78
|
+
spinner.fail(msg);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.log(` ${icon.error} ${msg}`);
|
|
82
|
+
}
|
|
83
|
+
process.exitCode = isNotFound ? EXIT.NOT_FOUND : EXIT.ERROR;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Install extends Command {
|
|
3
|
+
static args: {
|
|
4
|
+
slug: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
static flags: {
|
|
9
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { apiGet, requireAuth } from '../core/api.js';
|
|
3
|
+
import { installProduct, validateSlug } from '../core/install.js';
|
|
4
|
+
import { isInstalled } from '../core/lockfile.js';
|
|
5
|
+
import { getPostInstallHint } from '../core/paths.js';
|
|
6
|
+
import { EXIT, action, color, hint, icon } from '../ui/index.js';
|
|
7
|
+
export default class Install extends Command {
|
|
8
|
+
static args = {
|
|
9
|
+
slug: Args.string({ description: 'Product slug to install', required: true }),
|
|
10
|
+
};
|
|
11
|
+
static description = 'Install a product from the myClaude marketplace';
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> install auth-guard-skill',
|
|
14
|
+
'<%= config.bin %> install auth-guard-skill --global',
|
|
15
|
+
'<%= config.bin %> install auth-guard-skill --force',
|
|
16
|
+
];
|
|
17
|
+
static flags = {
|
|
18
|
+
force: Flags.boolean({ default: false, description: 'Reinstall even if already installed' }),
|
|
19
|
+
global: Flags.boolean({ default: false, description: 'Install to ~/.claude/ instead of ./.claude/' }),
|
|
20
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { args, flags } = await this.parse(Install);
|
|
24
|
+
try {
|
|
25
|
+
validateSlug(args.slug);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (flags.json) {
|
|
29
|
+
this.log(JSON.stringify({ error: error.message, installed: false }));
|
|
30
|
+
this.exit(EXIT.VALIDATION);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.error(error.message, { exit: EXIT.VALIDATION });
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await requireAuth();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
if (flags.json) {
|
|
42
|
+
this.log(JSON.stringify({ error: 'Authentication required. Run: myclaude login', installed: false }));
|
|
43
|
+
this.exit(EXIT.AUTH);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.log(` ${icon.warning} authentication required`);
|
|
47
|
+
this.log(action('myclaude login'));
|
|
48
|
+
this.exit(EXIT.AUTH);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!flags.force) {
|
|
53
|
+
const existing = isInstalled(args.slug);
|
|
54
|
+
if (existing) {
|
|
55
|
+
if (flags.json) {
|
|
56
|
+
this.log(JSON.stringify({
|
|
57
|
+
alreadyInstalled: true,
|
|
58
|
+
installed: false,
|
|
59
|
+
location: existing.location,
|
|
60
|
+
version: existing.version,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.log(` ${icon.info} ${color.bold(args.slug)} already installed (v${existing.version})`);
|
|
65
|
+
this.log(hint('use --force to reinstall'));
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let spinner;
|
|
71
|
+
if (!flags.json) {
|
|
72
|
+
const { default: ora } = await import('ora');
|
|
73
|
+
spinner = ora({ text: `resolving ${args.slug}...`, color: 'yellow' }).start();
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const res = await apiGet('/api/cli/products/search', { limit: '1', slug: args.slug }, { auth: false });
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
throw new Error(`Failed to resolve product: ${res.status}`);
|
|
79
|
+
}
|
|
80
|
+
const data = await res.json();
|
|
81
|
+
if (data.products.length === 0) {
|
|
82
|
+
throw new Error(`Product not found: ${args.slug}`);
|
|
83
|
+
}
|
|
84
|
+
const product = data.products[0];
|
|
85
|
+
if (product.price > 0) {
|
|
86
|
+
throw new Error(`${product.slug} costs $${product.price.toFixed(2)} — paid install coming soon`);
|
|
87
|
+
}
|
|
88
|
+
if (spinner)
|
|
89
|
+
spinner.text = `downloading ${product.slug}...`;
|
|
90
|
+
const result = await installProduct(product.id, product.slug, product.category, product.price, { force: flags.force, global: flags.global });
|
|
91
|
+
if (flags.json) {
|
|
92
|
+
this.log(JSON.stringify({ installed: true, ...result }));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const postHint = getPostInstallHint(result.slug, result.type, result.location);
|
|
96
|
+
spinner?.succeed(`${color.success(result.slug)}@${color.muted(result.version)} ${color.muted('→')} ${color.muted(result.location)}`);
|
|
97
|
+
this.log(` ${color.muted(postHint)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const msg = error.message;
|
|
102
|
+
if (flags.json) {
|
|
103
|
+
this.log(JSON.stringify({ error: msg, installed: false }));
|
|
104
|
+
this.exit(EXIT.ERROR);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
spinner?.fail(msg);
|
|
108
|
+
this.exit(EXIT.ERROR);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { readLockfile } from '../core/lockfile.js';
|
|
3
|
+
import { color, formatDate, header, hint, icon, table } from '../ui/index.js';
|
|
4
|
+
export default class List extends Command {
|
|
5
|
+
static description = 'List installed products';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> list',
|
|
8
|
+
'<%= config.bin %> list --json',
|
|
9
|
+
];
|
|
10
|
+
static flags = {
|
|
11
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
const { flags } = await this.parse(List);
|
|
15
|
+
const lockfile = readLockfile();
|
|
16
|
+
const entries = Object.entries(lockfile.installed);
|
|
17
|
+
if (flags.json) {
|
|
18
|
+
this.log(JSON.stringify(lockfile));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.log('');
|
|
22
|
+
this.log(header('installed', `${entries.length} product${entries.length === 1 ? '' : 's'}`));
|
|
23
|
+
this.log('');
|
|
24
|
+
if (entries.length === 0) {
|
|
25
|
+
this.log(` ${icon.info} nothing installed yet`);
|
|
26
|
+
this.log(hint('myclaude search to find products'));
|
|
27
|
+
this.log('');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const rows = entries.map(([slug, entry]) => [
|
|
31
|
+
color.bold(slug),
|
|
32
|
+
color.muted(entry.version),
|
|
33
|
+
entry.type,
|
|
34
|
+
color.muted(entry.location),
|
|
35
|
+
formatDate(entry.installedAt),
|
|
36
|
+
]);
|
|
37
|
+
this.log(table(['name', 'version', 'type', 'location', 'installed'], rows));
|
|
38
|
+
this.log('');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAA;AAE3E,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAU,WAAW,GAAG,yBAAyB,CAAA;IAEvD,MAAM,CAAU,QAAQ,GAAG;QACzB,wBAAwB;QACxB,+BAA+B;KAChC,CAAA;IAED,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,WAAW,EAAE,gBAAgB,EAAC,CAAC;KACrD,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEtC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAElD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;YAClC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC5F,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAA;YAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACZ,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YAC1B,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3B,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;SAC9B,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EACpD,IAAI,CACL,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACd,CAAC"}
|