@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,203 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import yaml from 'js-yaml';
4
+ /**
5
+ * vault.yaml manifest parser and validator.
6
+ * Source of truth for CLI publishing (DC11).
7
+ */
8
+ const VALID_TYPES = [
9
+ 'skill', 'agent', 'squad', 'workflow',
10
+ 'design-system', 'claude-md', 'prompt', 'application', 'system',
11
+ ];
12
+ /** Maps vault.yaml type → marketplace category */
13
+ const TYPE_TO_CATEGORY = {
14
+ 'skill': 'skills',
15
+ 'agent': 'agents',
16
+ 'squad': 'squads',
17
+ 'workflow': 'workflows',
18
+ 'design-system': 'design-systems',
19
+ 'claude-md': 'claude-md',
20
+ 'prompt': 'prompts',
21
+ 'application': 'applications',
22
+ 'system': 'systems',
23
+ };
24
+ const NAME_RE = /^[a-z0-9][a-z0-9_-]*[a-z0-9]$|^[a-z0-9]$/;
25
+ const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[a-z0-9.]+)?$/;
26
+ /** CE-D38: install target per product type */
27
+ const INSTALL_TARGET = {
28
+ 'skill': '.claude/skills/{slug}/',
29
+ 'agent': '.claude/skills/{slug}/',
30
+ 'squad': '.claude/skills/{slug}/',
31
+ 'workflow': '.claude/skills/{slug}/',
32
+ 'prompt': '.claude/skills/{slug}/',
33
+ 'system': '.claude/skills/{slug}/',
34
+ 'claude-md': '.claude/rules/{slug}.md',
35
+ 'design-system': 'myclaude-products/{slug}/',
36
+ 'application': 'myclaude-products/{slug}/',
37
+ };
38
+ export function readManifest(dir) {
39
+ const cwd = dir ?? process.cwd();
40
+ const manifestPath = join(cwd, 'vault.yaml');
41
+ const issues = [];
42
+ if (!existsSync(manifestPath)) {
43
+ issues.push({ field: 'vault.yaml', message: 'vault.yaml not found in current directory', blocker: true });
44
+ return { manifest: null, issues };
45
+ }
46
+ let raw;
47
+ try {
48
+ const content = readFileSync(manifestPath, 'utf-8');
49
+ raw = yaml.load(content);
50
+ if (!raw || typeof raw !== 'object') {
51
+ issues.push({ field: 'vault.yaml', message: 'vault.yaml is empty or invalid YAML', blocker: true });
52
+ return { manifest: null, issues };
53
+ }
54
+ }
55
+ catch {
56
+ issues.push({ field: 'vault.yaml', message: 'vault.yaml contains invalid YAML syntax', blocker: true });
57
+ return { manifest: null, issues };
58
+ }
59
+ // Required: name
60
+ const name = typeof raw.name === 'string' ? raw.name.trim() : '';
61
+ if (!name) {
62
+ issues.push({ field: 'name', message: 'Missing required field: name', blocker: true });
63
+ }
64
+ else if (name.length < 2 || name.length > 50) {
65
+ issues.push({ field: 'name', message: `Name must be 2-50 characters (got ${name.length})`, blocker: true });
66
+ }
67
+ else if (!NAME_RE.test(name)) {
68
+ issues.push({ field: 'name', message: 'Name must be lowercase alphanumeric with hyphens/underscores', blocker: true });
69
+ }
70
+ // Required: version
71
+ const version = typeof raw.version === 'string' ? raw.version.trim()
72
+ : typeof raw.version === 'number' ? String(raw.version) + '.0.0' : '';
73
+ if (!version) {
74
+ issues.push({ field: 'version', message: 'Missing required field: version', blocker: true });
75
+ }
76
+ else if (!SEMVER_RE.test(version)) {
77
+ issues.push({ field: 'version', message: `Invalid semver version: "${version}" (expected X.Y.Z)`, blocker: true });
78
+ }
79
+ // Required: type
80
+ const type = typeof raw.type === 'string' ? raw.type.trim() : '';
81
+ if (!type) {
82
+ issues.push({ field: 'type', message: 'Missing required field: type', blocker: true });
83
+ }
84
+ else if (!VALID_TYPES.includes(type)) {
85
+ issues.push({ field: 'type', message: `Invalid type: "${type}". Valid: ${VALID_TYPES.join(', ')}`, blocker: true });
86
+ }
87
+ // Required: description
88
+ const description = typeof raw.description === 'string' ? raw.description.trim() : '';
89
+ if (!description) {
90
+ issues.push({ field: 'description', message: 'Missing required field: description', blocker: true });
91
+ }
92
+ else if (description.length > 500) {
93
+ issues.push({ field: 'description', message: `Description too long (${description.length}/500)`, blocker: true });
94
+ }
95
+ // Optional: price (default 0)
96
+ const price = typeof raw.price === 'number' ? raw.price : 0;
97
+ if (price < 0) {
98
+ issues.push({ field: 'price', message: 'Price cannot be negative', blocker: true });
99
+ }
100
+ // Optional: license (default MIT)
101
+ const license = typeof raw.license === 'string' ? raw.license.trim() : 'MIT';
102
+ // Optional: tags (default [])
103
+ const tags = Array.isArray(raw.tags)
104
+ ? raw.tags.filter((t) => typeof t === 'string').map(t => t.trim()).filter(Boolean)
105
+ : [];
106
+ // Optional: entry (default based on type)
107
+ const defaultEntry = ['skill', 'agent', 'squad'].includes(type) ? 'SKILL.md' : 'index.ts';
108
+ const entry = typeof raw.entry === 'string' ? raw.entry.trim() : defaultEntry;
109
+ // Check entry file exists
110
+ const entryPath = resolve(cwd, entry);
111
+ if (!entryPath.startsWith(resolve(cwd))) {
112
+ issues.push({ field: 'entry', message: 'Entry file path traversal detected', blocker: true });
113
+ }
114
+ else if (!existsSync(entryPath)) {
115
+ issues.push({ field: 'entry', message: `Entry file not found: ${entry}`, blocker: true });
116
+ }
117
+ // Optional: readme (default README.md)
118
+ const readme = typeof raw.readme === 'string' ? raw.readme.trim() : 'README.md';
119
+ const readmePath = resolve(cwd, readme);
120
+ if (!readmePath.startsWith(resolve(cwd))) {
121
+ issues.push({ field: 'readme', message: 'Readme file path traversal detected', blocker: true });
122
+ }
123
+ else if (!existsSync(readmePath)) {
124
+ issues.push({ field: 'readme', message: `README not found: ${readme}`, blocker: false });
125
+ }
126
+ // --- Forward compatibility: manifest_version (WP-24, WP-26) ---
127
+ const manifestVersion = typeof raw.manifest_version === 'number' ? raw.manifest_version : 2;
128
+ if (manifestVersion > 2) {
129
+ issues.push({ field: 'manifest_version', message: `vault.yaml uses a newer format (v${manifestVersion}), some fields may be ignored`, blocker: false });
130
+ }
131
+ // --- Warnings for recommended fields (WP-4) ---
132
+ if (typeof raw.display_name !== 'string') {
133
+ issues.push({ field: 'display_name', message: 'Recommend adding display_name for better marketplace listing', blocker: false });
134
+ }
135
+ if (typeof raw.license !== 'string') {
136
+ issues.push({ field: 'license', message: 'No license specified, defaulting to MIT', blocker: false });
137
+ }
138
+ if (!Array.isArray(raw.tags) || raw.tags.length === 0) {
139
+ issues.push({ field: 'tags', message: 'Recommend adding tags for discoverability (3-5 tags)', blocker: false });
140
+ }
141
+ // --- Enrichment fields (all optional, sensible defaults — WP-3) ---
142
+ const displayName = typeof raw.display_name === 'string' ? raw.display_name.trim()
143
+ : name.split(/[-_]/).map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
144
+ const rawMcs = typeof raw.mcs_level === 'number' ? raw.mcs_level : 1;
145
+ const mcsLevel = [1, 2, 3].includes(rawMcs) ? rawMcs : 1;
146
+ const language = typeof raw.language === 'string' ? raw.language.trim() : 'en';
147
+ const longDescription = typeof raw.long_description === 'string'
148
+ ? raw.long_description.slice(0, 2000) : '';
149
+ const installTarget = typeof raw.install_target === 'string' ? raw.install_target.trim()
150
+ : (INSTALL_TARGET[type] || '.claude/skills/{slug}/').replace('{slug}', name);
151
+ const rawCompat = typeof raw.compatibility === 'object' && raw.compatibility
152
+ ? raw.compatibility : {};
153
+ const compatibility = {
154
+ claudeCode: typeof rawCompat.claude_code === 'string' ? rawCompat.claude_code : '>=1.0.0',
155
+ };
156
+ const rawDeps = typeof raw.dependencies === 'object' && raw.dependencies
157
+ ? raw.dependencies : {};
158
+ const dependencies = {
159
+ myclaude: Array.isArray(rawDeps.myclaude)
160
+ ? rawDeps.myclaude.filter((d) => typeof d === 'string')
161
+ : [],
162
+ };
163
+ const hasBlocker = issues.some(i => i.blocker);
164
+ if (hasBlocker) {
165
+ return { manifest: null, issues };
166
+ }
167
+ return {
168
+ issues,
169
+ manifest: {
170
+ name,
171
+ version,
172
+ type,
173
+ description,
174
+ price,
175
+ license,
176
+ tags,
177
+ entry,
178
+ readme,
179
+ category: TYPE_TO_CATEGORY[type] || type + 's',
180
+ displayName,
181
+ mcsLevel,
182
+ language,
183
+ longDescription,
184
+ installTarget,
185
+ compatibility,
186
+ dependencies,
187
+ },
188
+ };
189
+ }
190
+ /** Read README.md contents for marketplace listing */
191
+ export function readReadmeContents(dir, readmePath = 'README.md') {
192
+ const cwd = dir ?? process.cwd();
193
+ const fullPath = resolve(cwd, readmePath);
194
+ if (!fullPath.startsWith(resolve(cwd)))
195
+ return '';
196
+ try {
197
+ return readFileSync(fullPath, 'utf-8');
198
+ }
199
+ catch {
200
+ return '';
201
+ }
202
+ }
203
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface PackResult {
2
+ buffer: Buffer;
3
+ fileCount: number;
4
+ totalSize: number;
5
+ files: string[];
6
+ }
7
+ export interface PackIssue {
8
+ file: string;
9
+ message: string;
10
+ blocker: boolean;
11
+ }
12
+ /**
13
+ * Collect all files from directory respecting .vaultignore.
14
+ * Returns absolute paths.
15
+ */
16
+ export declare function collectFiles(dir: string): {
17
+ files: string[];
18
+ issues: PackIssue[];
19
+ };
20
+ /**
21
+ * Pack collected files into a zip buffer.
22
+ */
23
+ export declare function packFiles(files: string[], baseDir: string): Promise<PackResult>;
24
+ declare function formatBytes(bytes: number): string;
25
+ export { formatBytes };
@@ -0,0 +1,169 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, relative, resolve } from 'node:path';
3
+ /**
4
+ * File packer — collects files respecting .vaultignore, creates zip.
5
+ * Uses JSZip (already a dependency for install).
6
+ */
7
+ const MAX_TOTAL_BYTES = 50 * 1024 * 1024; // 50 MB
8
+ const MAX_FILE_BYTES = 10 * 1024 * 1024; // 10 MB per file
9
+ // Default ignores (always applied)
10
+ const DEFAULT_IGNORES = [
11
+ '.env', '.env.*',
12
+ 'node_modules/', '.git/',
13
+ '.DS_Store', 'Thumbs.db',
14
+ '*.log',
15
+ 'vault.yaml', // manifest is read separately, not packed
16
+ '.vaultignore',
17
+ ];
18
+ /**
19
+ * Collect all files from directory respecting .vaultignore.
20
+ * Returns absolute paths.
21
+ */
22
+ export function collectFiles(dir) {
23
+ const cwd = resolve(dir);
24
+ const issues = [];
25
+ const ignorePatterns = loadIgnorePatterns(cwd);
26
+ const files = [];
27
+ let totalSize = 0;
28
+ function walk(currentDir) {
29
+ let entries;
30
+ try {
31
+ entries = readdirSync(currentDir);
32
+ }
33
+ catch {
34
+ return;
35
+ }
36
+ for (const entry of entries) {
37
+ const fullPath = join(currentDir, entry);
38
+ const relPath = relative(cwd, fullPath).replace(/\\/g, '/');
39
+ if (isIgnored(relPath, ignorePatterns))
40
+ continue;
41
+ let stat;
42
+ try {
43
+ stat = statSync(fullPath);
44
+ }
45
+ catch {
46
+ continue;
47
+ }
48
+ if (stat.isDirectory()) {
49
+ if (isIgnored(relPath + '/', ignorePatterns))
50
+ continue;
51
+ walk(fullPath);
52
+ }
53
+ else if (stat.isFile()) {
54
+ if (stat.size > MAX_FILE_BYTES) {
55
+ issues.push({
56
+ blocker: true,
57
+ file: relPath,
58
+ message: `File too large: ${formatBytes(stat.size)} (max ${formatBytes(MAX_FILE_BYTES)})`,
59
+ });
60
+ continue;
61
+ }
62
+ totalSize += stat.size;
63
+ if (totalSize > MAX_TOTAL_BYTES) {
64
+ issues.push({
65
+ blocker: true,
66
+ file: relPath,
67
+ message: `Total package exceeds ${formatBytes(MAX_TOTAL_BYTES)}`,
68
+ });
69
+ return;
70
+ }
71
+ files.push(fullPath);
72
+ }
73
+ }
74
+ }
75
+ walk(cwd);
76
+ return { files, issues };
77
+ }
78
+ /**
79
+ * Pack collected files into a zip buffer.
80
+ */
81
+ export async function packFiles(files, baseDir) {
82
+ const { default: JSZip } = await import('jszip');
83
+ const zip = new JSZip();
84
+ const cwd = resolve(baseDir);
85
+ let totalSize = 0;
86
+ const relativePaths = [];
87
+ for (const file of files) {
88
+ const relPath = relative(cwd, file).replace(/\\/g, '/');
89
+ const content = readFileSync(file);
90
+ totalSize += content.length;
91
+ zip.file(relPath, content);
92
+ relativePaths.push(relPath);
93
+ }
94
+ const buffer = await zip.generateAsync({
95
+ compression: 'DEFLATE',
96
+ compressionOptions: { level: 6 },
97
+ type: 'nodebuffer',
98
+ });
99
+ return {
100
+ buffer,
101
+ fileCount: files.length,
102
+ files: relativePaths,
103
+ totalSize,
104
+ };
105
+ }
106
+ function loadIgnorePatterns(dir) {
107
+ const patterns = [...DEFAULT_IGNORES];
108
+ const ignorePath = join(dir, '.vaultignore');
109
+ if (existsSync(ignorePath)) {
110
+ try {
111
+ const content = readFileSync(ignorePath, 'utf-8');
112
+ for (const line of content.split('\n')) {
113
+ const trimmed = line.trim();
114
+ if (trimmed && !trimmed.startsWith('#')) {
115
+ patterns.push(trimmed);
116
+ }
117
+ }
118
+ }
119
+ catch {
120
+ // Ignore read errors
121
+ }
122
+ }
123
+ return patterns;
124
+ }
125
+ /**
126
+ * Simple .gitignore-style pattern matching.
127
+ * Supports: exact names, glob *, directory/ suffix, .env.* prefix.
128
+ */
129
+ function isIgnored(relPath, patterns) {
130
+ const name = relPath.split('/').pop() || relPath;
131
+ for (const pattern of patterns) {
132
+ // Directory pattern (trailing /)
133
+ if (pattern.endsWith('/')) {
134
+ const dirName = pattern.slice(0, -1);
135
+ if (relPath === dirName || relPath.startsWith(dirName + '/'))
136
+ return true;
137
+ if (name === dirName)
138
+ return true;
139
+ continue;
140
+ }
141
+ // Glob pattern with *
142
+ if (pattern.includes('*')) {
143
+ const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
144
+ if (regex.test(name) || regex.test(relPath))
145
+ return true;
146
+ continue;
147
+ }
148
+ // Prefix pattern (e.g., .env.)
149
+ if (pattern.endsWith('.*')) {
150
+ const prefix = pattern.slice(0, -2);
151
+ if (name === prefix || name.startsWith(prefix + '.'))
152
+ return true;
153
+ continue;
154
+ }
155
+ // Exact match
156
+ if (name === pattern || relPath === pattern)
157
+ return true;
158
+ }
159
+ return false;
160
+ }
161
+ function formatBytes(bytes) {
162
+ if (bytes < 1024)
163
+ return `${bytes} B`;
164
+ if (bytes < 1024 * 1024)
165
+ return `${(bytes / 1024).toFixed(1)} KB`;
166
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
167
+ }
168
+ export { formatBytes };
169
+ //# sourceMappingURL=packer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packer.js","sourceRoot":"","sources":["../../src/core/packer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getInstallPath(slug: string, type: string, global: boolean): string;
2
+ export declare function getPostInstallHint(slug: string, type: string, location: string): string;
@@ -0,0 +1,50 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Install target resolution based on product type (DC9/DC10).
5
+ *
6
+ * Skills, agents, squads, workflows, prompts, systems → .claude/skills/{slug}/
7
+ * claude-md → .claude/rules/{slug}.md
8
+ * design-system, application → ./myclaude-products/{slug}/
9
+ */
10
+ const SKILL_TYPES = new Set([
11
+ 'skills', 'skill',
12
+ 'agents', 'agent',
13
+ 'squads', 'squad',
14
+ 'workflows', 'workflow',
15
+ 'prompts', 'prompt',
16
+ 'systems', 'system',
17
+ ]);
18
+ const EXTERNAL_TYPES = new Set([
19
+ 'design-systems', 'design-system',
20
+ 'applications', 'application',
21
+ ]);
22
+ export function getInstallPath(slug, type, global) {
23
+ const base = global ? join(homedir(), '.claude') : '.claude';
24
+ // claude-md → single file in rules/
25
+ if (type === 'claude-md') {
26
+ return join(base, 'rules', `${slug}.md`);
27
+ }
28
+ // skill-like types → skills directory
29
+ if (SKILL_TYPES.has(type)) {
30
+ return join(base, 'skills', slug);
31
+ }
32
+ // design-system, application → myclaude-products/ in project root
33
+ if (EXTERNAL_TYPES.has(type)) {
34
+ return global
35
+ ? join(homedir(), 'myclaude-products', slug)
36
+ : join('myclaude-products', slug);
37
+ }
38
+ // Fallback: skills directory
39
+ return join(base, 'skills', slug);
40
+ }
41
+ export function getPostInstallHint(slug, type, location) {
42
+ if (type === 'claude-md') {
43
+ return 'Rules auto-loaded in Claude Code sessions';
44
+ }
45
+ if (SKILL_TYPES.has(type)) {
46
+ return `Use /${slug} in your Claude Code session`;
47
+ }
48
+ return `Files available at ${location}`;
49
+ }
50
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAE9B;;;;;;GAMG;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,WAAW,EAAE,UAAU;IACvB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,QAAQ;CACpB,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,gBAAgB,EAAE,eAAe;IACjC,cAAc,EAAE,aAAa;CAC9B,CAAC,CAAA;AAEF,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,MAAe;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE5D,oCAAoC;IACpC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,sCAAsC;IACtC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,kEAAkE;IAClE,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM;YACX,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,EAAE,IAAI,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;IACrC,CAAC;IAED,6BAA6B;IAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY,EAAE,QAAgB;IAC7E,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,2CAA2C,CAAA;IACpD,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,IAAI,8BAA8B,CAAA;IACnD,CAAC;IAED,OAAO,sBAAsB,QAAQ,EAAE,CAAA;AACzC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Secret scanner — detects leaked credentials before publishing.
3
+ * Blocker check per DC22: if patterns match, abort publish.
4
+ */
5
+ export interface SecretFinding {
6
+ file: string;
7
+ line: number;
8
+ pattern: string;
9
+ snippet: string;
10
+ }
11
+ /**
12
+ * Scan a list of files for secret patterns.
13
+ * Returns findings sorted by file then line.
14
+ */
15
+ export declare function scanForSecrets(files: string[], baseDir: string): SecretFinding[];
16
+ /** Check if a filename is a .env file (blocker) */
17
+ export declare function isEnvFile(filename: string): boolean;
@@ -0,0 +1,73 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const SECRET_PATTERNS = [
3
+ { name: 'AWS Access Key', re: /AKIA[0-9A-Z]{16}/ },
4
+ { name: 'AWS Secret Key', re: /(?:aws_secret|secret_access_key)\s*[=:]\s*["']?[A-Za-z0-9/+=]{40}/i },
5
+ { name: 'Stripe Secret Key', re: /sk_(?:live|test)_[a-zA-Z0-9]{20,}/ },
6
+ { name: 'Stripe Webhook Secret', re: /whsec_[a-zA-Z0-9]{20,}/ },
7
+ { name: 'Firebase Service Account', re: /"type"\s*:\s*"service_account"/ },
8
+ { name: 'Firebase Private Key', re: /-----BEGIN (?:RSA )?PRIVATE KEY-----/ },
9
+ { name: 'Generic Token Assignment', re: /(?:api_?key|api_?secret|auth_?token|access_?token|secret_?key)\s*[=:]\s*["'][a-zA-Z0-9_\-/.+=]{20,}["']/i },
10
+ { name: 'Generic Password', re: /(?:password|passwd|pwd)\s*[=:]\s*["'][^"']{8,}["']/i },
11
+ { name: 'npm Token', re: /\/\/registry\.npmjs\.org\/:_authToken=/ },
12
+ { name: 'GitHub Token', re: /gh[ps]_[A-Za-z0-9_]{36,}/ },
13
+ ];
14
+ // Binary file extensions to skip
15
+ const BINARY_EXTENSIONS = new Set([
16
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg', '.webp',
17
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
18
+ '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',
19
+ '.pdf', '.doc', '.docx',
20
+ '.mp3', '.mp4', '.wav', '.ogg',
21
+ '.exe', '.dll', '.so', '.dylib',
22
+ ]);
23
+ function isBinaryFile(path) {
24
+ const ext = path.slice(path.lastIndexOf('.')).toLowerCase();
25
+ return BINARY_EXTENSIONS.has(ext);
26
+ }
27
+ /**
28
+ * Scan a list of files for secret patterns.
29
+ * Returns findings sorted by file then line.
30
+ */
31
+ export function scanForSecrets(files, baseDir) {
32
+ const findings = [];
33
+ for (const file of files) {
34
+ if (isBinaryFile(file))
35
+ continue;
36
+ let content;
37
+ try {
38
+ content = readFileSync(file, 'utf-8');
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ const lines = content.split('\n');
44
+ for (let i = 0; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ for (const { name, re } of SECRET_PATTERNS) {
47
+ if (re.test(line)) {
48
+ // Truncate snippet to avoid leaking the full secret
49
+ const match = line.match(re);
50
+ const snippet = match
51
+ ? line.slice(Math.max(0, match.index - 10), match.index + 30).trim()
52
+ : line.slice(0, 60).trim();
53
+ const relativePath = file.startsWith(baseDir)
54
+ ? file.slice(baseDir.length + 1).replace(/\\/g, '/')
55
+ : file;
56
+ findings.push({
57
+ file: relativePath,
58
+ line: i + 1,
59
+ pattern: name,
60
+ snippet: snippet.length > 50 ? snippet.slice(0, 47) + '...' : snippet,
61
+ });
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return findings;
67
+ }
68
+ /** Check if a filename is a .env file (blocker) */
69
+ export function isEnvFile(filename) {
70
+ const base = filename.split('/').pop() || filename;
71
+ return base === '.env' || base.startsWith('.env.');
72
+ }
73
+ //# sourceMappingURL=secret-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.js","sourceRoot":"","sources":["../../src/core/secret-scan.ts"],"names":[],"mappings":"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"}