@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
|
@@ -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":"AAAA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAA;AACvE,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAC,MAAM,WAAW,CAAA;AAEjD;;;GAGG;AAEH,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA,CAAE,QAAQ;AAClD,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA,CAAG,iBAAiB;AAE3D,mCAAmC;AACnC,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,QAAQ;IAChB,eAAe,EAAE,OAAO;IACxB,WAAW,EAAE,WAAW;IACxB,OAAO;IACP,YAAY,EAAQ,0CAA0C;IAC9D,cAAc;CACf,CAAA;AAeD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,MAAM,GAAgB,EAAE,CAAA;IAC9B,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,SAAS,IAAI,CAAC,UAAkB;QAC9B,IAAI,OAAiB,CAAA;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAM;QACR,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAE3D,IAAI,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;gBAAE,SAAQ;YAEhD,IAAI,IAAI,CAAA;YACR,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAQ;YACV,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,cAAc,CAAC;oBAAE,SAAQ;gBACtD,IAAI,CAAC,QAAQ,CAAC,CAAA;YAChB,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,mBAAmB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,cAAc,CAAC,GAAG;qBAC1F,CAAC,CAAA;oBACF,SAAQ;gBACV,CAAC;gBAED,SAAS,IAAI,IAAI,CAAC,IAAI,CAAA;gBACtB,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,yBAAyB,WAAW,CAAC,eAAe,CAAC,EAAE;qBACjE,CAAC,CAAA;oBACF,OAAM;gBACR,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,EAAC,KAAK,EAAE,MAAM,EAAC,CAAA;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAe,EAAE,OAAe;IAC9D,MAAM,EAAC,OAAO,EAAE,KAAK,EAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAA;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,MAAM,aAAa,GAAa,EAAE,CAAA;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAClC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAA;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1B,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;QACrC,WAAW,EAAE,SAAS;QACtB,kBAAkB,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC;QAC9B,IAAI,EAAE,YAAY;KACnB,CAAC,CAAA;IAEF,OAAO;QACL,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,KAAK,EAAE,aAAa;QACpB,SAAS;KACV,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,QAAQ,GAAG,CAAC,GAAG,eAAe,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IAE5C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YACjD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAe,EAAE,QAAkB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAA;IAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,iCAAiC;QACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACpC,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAA;YACzE,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAA;YACjC,SAAQ;QACV,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAC/D,CAAA;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;YACxD,SAAQ;QACV,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACnC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAA;YACjE,SAAQ;QACV,CAAC;QAED,cAAc;QACd,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,IAAI,CAAA;IAC1D,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAA;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AACnD,CAAC;AAED,OAAO,EAAC,WAAW,EAAC,CAAA"}
|
|
@@ -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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"}
|