@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/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* myClaude CLI — Color Theme
|
|
3
|
+
*
|
|
4
|
+
* Terracotta palette matching the web DS.
|
|
5
|
+
* Cascade: truecolor (#d97757) → 256-color (166) → basic ANSI (yellow) → no color
|
|
6
|
+
*/
|
|
7
|
+
// --- Brand colors (RGB) -------------------------------------------------- //
|
|
8
|
+
const BRAND = {
|
|
9
|
+
primary: [217, 119, 87], // #d97757 — terracotta
|
|
10
|
+
muted: [168, 162, 150], // #a8a296 — warm gray
|
|
11
|
+
success: [108, 158, 108], // #6c9e6c — sage green
|
|
12
|
+
error: [204, 94, 94], // #cc5e5e — warm red
|
|
13
|
+
warning: [214, 170, 82], // #d6aa52 — amber
|
|
14
|
+
info: [130, 160, 200], // #82a0c8 — soft blue
|
|
15
|
+
surface: [36, 35, 33], // #242321 — dark warm bg
|
|
16
|
+
};
|
|
17
|
+
let _cachedLevel = null;
|
|
18
|
+
export function detectColorLevel() {
|
|
19
|
+
if (_cachedLevel)
|
|
20
|
+
return _cachedLevel;
|
|
21
|
+
if (process.env.NO_COLOR || process.env.MYCLAUDE_NO_COLOR) {
|
|
22
|
+
_cachedLevel = 'none';
|
|
23
|
+
return 'none';
|
|
24
|
+
}
|
|
25
|
+
if (!process.stdout.isTTY && !process.env.MYCLAUDE_FORCE_COLOR) {
|
|
26
|
+
_cachedLevel = 'none';
|
|
27
|
+
return 'none';
|
|
28
|
+
}
|
|
29
|
+
// Force color level via env
|
|
30
|
+
const force = process.env.MYCLAUDE_COLOR_LEVEL;
|
|
31
|
+
if (force === 'truecolor' || force === '256' || force === 'basic' || force === 'none') {
|
|
32
|
+
_cachedLevel = force;
|
|
33
|
+
return force;
|
|
34
|
+
}
|
|
35
|
+
const colorterm = process.env.COLORTERM || '';
|
|
36
|
+
if (colorterm === 'truecolor' || colorterm === '24bit') {
|
|
37
|
+
_cachedLevel = 'truecolor';
|
|
38
|
+
return 'truecolor';
|
|
39
|
+
}
|
|
40
|
+
// Windows Terminal, VS Code, iTerm2 all support truecolor
|
|
41
|
+
const term = process.env.TERM_PROGRAM || '';
|
|
42
|
+
if (term === 'vscode' || term === 'iTerm.app' || process.env.WT_SESSION) {
|
|
43
|
+
_cachedLevel = 'truecolor';
|
|
44
|
+
return 'truecolor';
|
|
45
|
+
}
|
|
46
|
+
const termEnv = process.env.TERM || '';
|
|
47
|
+
if (termEnv.includes('256color')) {
|
|
48
|
+
_cachedLevel = '256';
|
|
49
|
+
return '256';
|
|
50
|
+
}
|
|
51
|
+
if (process.stdout.isTTY) {
|
|
52
|
+
_cachedLevel = 'basic';
|
|
53
|
+
return 'basic';
|
|
54
|
+
}
|
|
55
|
+
_cachedLevel = 'none';
|
|
56
|
+
return 'none';
|
|
57
|
+
}
|
|
58
|
+
// --- ANSI escape builders ------------------------------------------------- //
|
|
59
|
+
function rgb(r, g, b) {
|
|
60
|
+
return `\x1b[38;2;${r};${g};${b}m`;
|
|
61
|
+
}
|
|
62
|
+
function rgbBg(r, g, b) {
|
|
63
|
+
return `\x1b[48;2;${r};${g};${b}m`;
|
|
64
|
+
}
|
|
65
|
+
function ansi256(code) {
|
|
66
|
+
return `\x1b[38;5;${code}m`;
|
|
67
|
+
}
|
|
68
|
+
const RST = '\x1b[0m';
|
|
69
|
+
const BOLD = '\x1b[1m';
|
|
70
|
+
const DIM = '\x1b[2m';
|
|
71
|
+
const ITALIC = '\x1b[3m';
|
|
72
|
+
const UNDERLINE = '\x1b[4m';
|
|
73
|
+
// Basic ANSI fallbacks
|
|
74
|
+
const BASIC = {
|
|
75
|
+
primary: '\x1b[33m', // yellow (closest to terracotta)
|
|
76
|
+
muted: '\x1b[90m', // bright black (gray)
|
|
77
|
+
success: '\x1b[32m', // green
|
|
78
|
+
error: '\x1b[31m', // red
|
|
79
|
+
warning: '\x1b[33m', // yellow
|
|
80
|
+
info: '\x1b[36m', // cyan
|
|
81
|
+
};
|
|
82
|
+
// 256-color fallbacks
|
|
83
|
+
const C256 = {
|
|
84
|
+
primary: ansi256(166), // dark orange
|
|
85
|
+
muted: ansi256(245), // gray
|
|
86
|
+
success: ansi256(108), // dark sea green
|
|
87
|
+
error: ansi256(167), // indian red
|
|
88
|
+
warning: ansi256(214), // orange
|
|
89
|
+
info: ansi256(110), // light steel blue
|
|
90
|
+
};
|
|
91
|
+
// --- Public color functions ----------------------------------------------- //
|
|
92
|
+
function colorize(text, role) {
|
|
93
|
+
const level = detectColorLevel();
|
|
94
|
+
if (level === 'none')
|
|
95
|
+
return text;
|
|
96
|
+
let code;
|
|
97
|
+
if (level === 'truecolor') {
|
|
98
|
+
const [r, g, b] = BRAND[role];
|
|
99
|
+
code = rgb(r, g, b);
|
|
100
|
+
}
|
|
101
|
+
else if (level === '256') {
|
|
102
|
+
code = C256[role] || C256.primary;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
code = BASIC[role] || BASIC.primary;
|
|
106
|
+
}
|
|
107
|
+
return `${code}${text}${RST}`;
|
|
108
|
+
}
|
|
109
|
+
export const color = {
|
|
110
|
+
primary: (t) => colorize(t, 'primary'),
|
|
111
|
+
muted: (t) => colorize(t, 'muted'),
|
|
112
|
+
success: (t) => colorize(t, 'success'),
|
|
113
|
+
error: (t) => colorize(t, 'error'),
|
|
114
|
+
warning: (t) => colorize(t, 'warning'),
|
|
115
|
+
info: (t) => colorize(t, 'info'),
|
|
116
|
+
bold: (t) => detectColorLevel() === 'none' ? t : `${BOLD}${t}${RST}`,
|
|
117
|
+
dim: (t) => detectColorLevel() === 'none' ? t : `${DIM}${t}${RST}`,
|
|
118
|
+
italic: (t) => detectColorLevel() === 'none' ? t : `${ITALIC}${t}${RST}`,
|
|
119
|
+
underline: (t) => detectColorLevel() === 'none' ? t : `${UNDERLINE}${t}${RST}`,
|
|
120
|
+
// Composites
|
|
121
|
+
brandBold: (t) => {
|
|
122
|
+
const level = detectColorLevel();
|
|
123
|
+
if (level === 'none')
|
|
124
|
+
return t;
|
|
125
|
+
const [r, g, b] = BRAND.primary;
|
|
126
|
+
const code = level === 'truecolor' ? rgb(r, g, b)
|
|
127
|
+
: level === '256' ? C256.primary
|
|
128
|
+
: BASIC.primary;
|
|
129
|
+
return `${BOLD}${code}${t}${RST}`;
|
|
130
|
+
},
|
|
131
|
+
// Background (for special moments only)
|
|
132
|
+
primaryBg: (t) => {
|
|
133
|
+
const level = detectColorLevel();
|
|
134
|
+
if (level !== 'truecolor')
|
|
135
|
+
return t;
|
|
136
|
+
const [r, g, b] = BRAND.primary;
|
|
137
|
+
return `${rgbBg(r, g, b)}\x1b[38;2;255;255;255m${BOLD} ${t} ${RST}`;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Safe color composition — applies multiple styles without RST conflicts.
|
|
142
|
+
* Usage: color.compose('hello', color.primary, color.bold)
|
|
143
|
+
* Each style fn is called to extract its ANSI code, then all codes are
|
|
144
|
+
* applied together with a single RST at the end.
|
|
145
|
+
*/
|
|
146
|
+
function _getCode(role) {
|
|
147
|
+
const level = detectColorLevel();
|
|
148
|
+
if (level === 'none')
|
|
149
|
+
return '';
|
|
150
|
+
if (level === 'truecolor') {
|
|
151
|
+
const [r, g, b] = BRAND[role];
|
|
152
|
+
return rgb(r, g, b);
|
|
153
|
+
}
|
|
154
|
+
if (level === '256')
|
|
155
|
+
return C256[role] || C256.primary;
|
|
156
|
+
return BASIC[role] || BASIC.primary;
|
|
157
|
+
}
|
|
158
|
+
// Extend color with compose
|
|
159
|
+
Object.assign(color, {
|
|
160
|
+
compose: (text, ...codes) => {
|
|
161
|
+
if (detectColorLevel() === 'none')
|
|
162
|
+
return text;
|
|
163
|
+
return codes.join('') + text + RST;
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
// Type-safe code constants for compose()
|
|
167
|
+
export const codes = {
|
|
168
|
+
primary: () => _getCode('primary'),
|
|
169
|
+
muted: () => _getCode('muted'),
|
|
170
|
+
success: () => _getCode('success'),
|
|
171
|
+
error: () => _getCode('error'),
|
|
172
|
+
warning: () => _getCode('warning'),
|
|
173
|
+
info: () => _getCode('info'),
|
|
174
|
+
bold: BOLD,
|
|
175
|
+
dim: DIM,
|
|
176
|
+
italic: ITALIC,
|
|
177
|
+
};
|
|
178
|
+
// Re-export for programmatic access
|
|
179
|
+
export { BRAND, RST, BOLD, DIM };
|
|
180
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface UserConfig {
|
|
2
|
+
uid: string;
|
|
3
|
+
email: string;
|
|
4
|
+
username: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
}
|
|
7
|
+
/** Ensure ~/.myclaude/ directory exists. Exported for keychain to reuse. */
|
|
8
|
+
export declare function ensureDir(): void;
|
|
9
|
+
export declare function readConfig(): UserConfig | null;
|
|
10
|
+
export declare function writeConfig(config: UserConfig): void;
|
|
11
|
+
export declare function deleteConfig(): void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const MYCLAUDE_DIR = join(homedir(), '.myclaude');
|
|
5
|
+
const CONFIG_FILE = join(MYCLAUDE_DIR, 'config.json');
|
|
6
|
+
/** Ensure ~/.myclaude/ directory exists. Exported for keychain to reuse. */
|
|
7
|
+
export function ensureDir() {
|
|
8
|
+
if (!existsSync(MYCLAUDE_DIR)) {
|
|
9
|
+
mkdirSync(MYCLAUDE_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function readConfig() {
|
|
13
|
+
try {
|
|
14
|
+
if (!existsSync(CONFIG_FILE))
|
|
15
|
+
return null;
|
|
16
|
+
const raw = readFileSync(CONFIG_FILE, 'utf-8');
|
|
17
|
+
const data = JSON.parse(raw);
|
|
18
|
+
// Runtime shape validation — don't trust file contents blindly
|
|
19
|
+
if (typeof data !== 'object' || data === null ||
|
|
20
|
+
typeof data.uid !== 'string' ||
|
|
21
|
+
typeof data.email !== 'string' ||
|
|
22
|
+
typeof data.username !== 'string') {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function writeConfig(config) {
|
|
32
|
+
ensureDir();
|
|
33
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
34
|
+
}
|
|
35
|
+
export function deleteConfig() {
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(CONFIG_FILE))
|
|
38
|
+
unlinkSync(CONFIG_FILE);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore errors during cleanup
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,SAAS,CAAA;AACtF,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAS9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;AAErD,4EAA4E;AAC5E,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,YAAY,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAA;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,+DAA+D;QAC/D,IACE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YACzC,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ;YAC5B,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAC9B,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EACjC,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAkB,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAkB;IAC5C,SAAS,EAAE,CAAA;IACX,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC;YAAE,UAAU,CAAC,WAAW,CAAC,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { ensureDir } from './config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Keychain abstraction for storing the refresh token.
|
|
7
|
+
*
|
|
8
|
+
* Alpha: file-based storage with chmod 600.
|
|
9
|
+
* Beta: native OS keychain via keyring-node.
|
|
10
|
+
*
|
|
11
|
+
* The refresh token is the ONLY secret stored on disk.
|
|
12
|
+
* The idToken is NEVER persisted — only held in memory (DC20).
|
|
13
|
+
*
|
|
14
|
+
* NOTE: chmod 600 is a no-op on Windows. For Alpha this is accepted.
|
|
15
|
+
* Beta will use Windows Credential Manager via keyring-node.
|
|
16
|
+
*/
|
|
17
|
+
const SERVICE = 'myclaude';
|
|
18
|
+
const CREDENTIALS_FILE = join(homedir(), '.myclaude', 'credentials');
|
|
19
|
+
export async function storeToken(account, token) {
|
|
20
|
+
ensureDir(); // FIX C1: ensure ~/.myclaude/ exists before writing
|
|
21
|
+
const data = JSON.stringify({ service: SERVICE, account, token });
|
|
22
|
+
writeFileSync(CREDENTIALS_FILE, data, { mode: 0o600 });
|
|
23
|
+
}
|
|
24
|
+
export async function getToken(account) {
|
|
25
|
+
try {
|
|
26
|
+
if (!existsSync(CREDENTIALS_FILE))
|
|
27
|
+
return null;
|
|
28
|
+
const raw = readFileSync(CREDENTIALS_FILE, 'utf-8');
|
|
29
|
+
const data = JSON.parse(raw);
|
|
30
|
+
// Runtime shape validation — corrupted credentials should fail safely
|
|
31
|
+
if (typeof data !== 'object' || data === null ||
|
|
32
|
+
typeof data.token !== 'string' ||
|
|
33
|
+
typeof data.account !== 'string' ||
|
|
34
|
+
data.service !== SERVICE ||
|
|
35
|
+
data.account !== account) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return data.token;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function deleteToken() {
|
|
45
|
+
try {
|
|
46
|
+
if (existsSync(CREDENTIALS_FILE))
|
|
47
|
+
unlinkSync(CREDENTIALS_FILE);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Ignore errors during cleanup
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/utils/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,SAAS,CAAA;AAC3E,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAE9B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAA;AAErC;;;;;;;;;;;GAWG;AAEH,MAAM,OAAO,GAAG,UAAU,CAAA;AAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa;IAC7D,SAAS,EAAE,CAAA,CAAC,oDAAoD;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC,CAAA;IAC/D,aAAa,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAA;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,sEAAsE;QACtE,IACE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YACzC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAC9B,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAChC,IAAI,CAAC,OAAO,KAAK,OAAO;YACxB,IAAI,CAAC,OAAO,KAAK,OAAO,EACxB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,gBAAgB,CAAC;YAAE,UAAU,CAAC,gBAAgB,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@myclaude-cli/cli",
|
|
3
|
+
"version": "0.3.0-alpha",
|
|
4
|
+
"description": "MyClaude CLI — Search, install, and manage marketplace products from the terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://myclaude.sh",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/darwimmusic/vault-marketplace.git",
|
|
11
|
+
"directory": "packages/cli"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/darwimmusic/vault-marketplace/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"myclaude",
|
|
18
|
+
"claude-code",
|
|
19
|
+
"skills",
|
|
20
|
+
"agents",
|
|
21
|
+
"marketplace",
|
|
22
|
+
"cli"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"myclaude": "bin/myclaude.js"
|
|
26
|
+
},
|
|
27
|
+
"main": "dist/index.js",
|
|
28
|
+
"files": [
|
|
29
|
+
"bin",
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"oclif": {
|
|
33
|
+
"bin": "myclaude",
|
|
34
|
+
"dirname": "myclaude",
|
|
35
|
+
"commands": "./dist/commands",
|
|
36
|
+
"plugins": [],
|
|
37
|
+
"topicSeparator": " "
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc",
|
|
41
|
+
"clean": "rm -rf dist",
|
|
42
|
+
"dev": "tsx bin/dev.js",
|
|
43
|
+
"prepack": "npm run clean && npm run build",
|
|
44
|
+
"prepublishOnly": "npm run build && bash scripts/prepublish-scan.sh",
|
|
45
|
+
"test": "vitest"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@oclif/core": "^4",
|
|
49
|
+
"js-yaml": "^4.1.1",
|
|
50
|
+
"jszip": "^3.10.1",
|
|
51
|
+
"ora": "^8"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/js-yaml": "^4.0.9",
|
|
55
|
+
"oclif": "^4",
|
|
56
|
+
"tsx": "^4",
|
|
57
|
+
"typescript": "^5",
|
|
58
|
+
"vitest": "^4.1.1"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=20"
|
|
62
|
+
}
|
|
63
|
+
}
|