@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.
Files changed (93) hide show
  1. package/bin/dev.js +5 -0
  2. package/bin/myclaude.js +20 -0
  3. package/dist/commands/help.d.ts +11 -0
  4. package/dist/commands/help.js +221 -0
  5. package/dist/commands/help.js.map +1 -0
  6. package/dist/commands/info.d.ts +12 -0
  7. package/dist/commands/info.js +87 -0
  8. package/dist/commands/info.js.map +1 -0
  9. package/dist/commands/install.d.ts +14 -0
  10. package/dist/commands/install.js +113 -0
  11. package/dist/commands/install.js.map +1 -0
  12. package/dist/commands/list.d.ts +9 -0
  13. package/dist/commands/list.js +41 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/login.d.ts +9 -0
  16. package/dist/commands/login.js +83 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +9 -0
  19. package/dist/commands/logout.js +25 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/publish.d.ts +10 -0
  22. package/dist/commands/publish.js +229 -0
  23. package/dist/commands/publish.js.map +1 -0
  24. package/dist/commands/search.d.ts +18 -0
  25. package/dist/commands/search.js +108 -0
  26. package/dist/commands/search.js.map +1 -0
  27. package/dist/commands/status.d.ts +8 -0
  28. package/dist/commands/status.js +84 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/commands/uninstall.d.ts +14 -0
  31. package/dist/commands/uninstall.js +98 -0
  32. package/dist/commands/uninstall.js.map +1 -0
  33. package/dist/commands/validate.d.ts +9 -0
  34. package/dist/commands/validate.js +144 -0
  35. package/dist/commands/validate.js.map +1 -0
  36. package/dist/commands/whoami.d.ts +9 -0
  37. package/dist/commands/whoami.js +52 -0
  38. package/dist/commands/whoami.js.map +1 -0
  39. package/dist/constants.d.ts +9 -0
  40. package/dist/constants.js +10 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/core/api.d.ts +18 -0
  43. package/dist/core/api.js +135 -0
  44. package/dist/core/api.js.map +1 -0
  45. package/dist/core/auth.d.ts +30 -0
  46. package/dist/core/auth.js +71 -0
  47. package/dist/core/auth.js.map +1 -0
  48. package/dist/core/browser-auth.d.ts +24 -0
  49. package/dist/core/browser-auth.js +155 -0
  50. package/dist/core/browser-auth.js.map +1 -0
  51. package/dist/core/install.d.ts +24 -0
  52. package/dist/core/install.js +191 -0
  53. package/dist/core/install.js.map +1 -0
  54. package/dist/core/lockfile.d.ts +18 -0
  55. package/dist/core/lockfile.js +41 -0
  56. package/dist/core/lockfile.js.map +1 -0
  57. package/dist/core/manifest.d.ts +41 -0
  58. package/dist/core/manifest.js +203 -0
  59. package/dist/core/manifest.js.map +1 -0
  60. package/dist/core/packer.d.ts +25 -0
  61. package/dist/core/packer.js +169 -0
  62. package/dist/core/packer.js.map +1 -0
  63. package/dist/core/paths.d.ts +2 -0
  64. package/dist/core/paths.js +50 -0
  65. package/dist/core/paths.js.map +1 -0
  66. package/dist/core/secret-scan.d.ts +17 -0
  67. package/dist/core/secret-scan.js +73 -0
  68. package/dist/core/secret-scan.js.map +1 -0
  69. package/dist/ui/exit-codes.d.ts +91 -0
  70. package/dist/ui/exit-codes.js +51 -0
  71. package/dist/ui/exit-codes.js.map +1 -0
  72. package/dist/ui/format.d.ts +12 -0
  73. package/dist/ui/format.js +44 -0
  74. package/dist/ui/format.js.map +1 -0
  75. package/dist/ui/index.d.ts +13 -0
  76. package/dist/ui/index.js +11 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/layout.d.ts +28 -0
  79. package/dist/ui/layout.js +161 -0
  80. package/dist/ui/layout.js.map +1 -0
  81. package/dist/ui/table.d.ts +10 -0
  82. package/dist/ui/table.js +42 -0
  83. package/dist/ui/table.js.map +1 -0
  84. package/dist/ui/theme.d.ts +46 -0
  85. package/dist/ui/theme.js +180 -0
  86. package/dist/ui/theme.js.map +1 -0
  87. package/dist/utils/config.d.ts +11 -0
  88. package/dist/utils/config.js +44 -0
  89. package/dist/utils/config.js.map +1 -0
  90. package/dist/utils/keychain.d.ts +3 -0
  91. package/dist/utils/keychain.js +53 -0
  92. package/dist/utils/keychain.js.map +1 -0
  93. package/package.json +63 -0
@@ -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,3 @@
1
+ export declare function storeToken(account: string, token: string): Promise<void>;
2
+ export declare function getToken(account: string): Promise<string | null>;
3
+ export declare function deleteToken(): Promise<void>;
@@ -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
+ }