reskill 1.15.0 → 1.16.0-beta.1

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.
@@ -0,0 +1,378 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE_node_fs__ from "node:fs";
2
+ /**
3
+ * ContentScanner - Detect malicious patterns in SKILL.md content
4
+ *
5
+ * Features:
6
+ * - Context-aware: skips safe zones (frontmatter, code blocks, quotes, blockquotes)
7
+ * - 6 built-in detection rules across 3 risk levels
8
+ * - Configurable: override levels, disable rules, add custom rules
9
+ * - Pure string operations in scan() — no fs dependency, suitable for server use
10
+ * - scanFile() convenience method for CLI use
11
+ */ // ============================================================================
12
+ // Safe Zone Masking
13
+ // ============================================================================
14
+ /**
15
+ * Mask safe zones in Markdown content with spaces, preserving line structure.
16
+ *
17
+ * Safe zones (content replaced with spaces):
18
+ * - YAML frontmatter (`---` ... `---` at file start)
19
+ * - Fenced code blocks (``` or ~~~)
20
+ * - Indented code blocks (4 spaces / tab after blank line)
21
+ * - Blockquotes (`> ` prefix)
22
+ * - Inline code (`` `...` ``)
23
+ * - Double-quoted text (`"..."`, min 3 chars between quotes)
24
+ *
25
+ * Line breaks are preserved so line numbers remain correct.
26
+ */ function maskSafeZones(content) {
27
+ const lines = content.split('\n');
28
+ const result = [];
29
+ let inFrontmatter = false;
30
+ let inFencedCode = false;
31
+ let fenceChar = '';
32
+ let fenceLength = 0;
33
+ let prevLineBlank = false;
34
+ let prevLineIndentedCode = false;
35
+ for(let i = 0; i < lines.length; i++){
36
+ const line = lines[i];
37
+ // --- YAML Frontmatter (only at file start) ---
38
+ if (0 === i && '---' === line.trim()) {
39
+ inFrontmatter = true;
40
+ result.push(maskLine(line));
41
+ continue;
42
+ }
43
+ if (inFrontmatter) {
44
+ result.push(maskLine(line));
45
+ if ('---' === line.trim()) inFrontmatter = false;
46
+ continue;
47
+ }
48
+ // --- Fenced code blocks (``` or ~~~) ---
49
+ const fenceMatch = line.match(/^(`{3,}|~{3,})/);
50
+ if (!inFencedCode && fenceMatch) {
51
+ inFencedCode = true;
52
+ fenceChar = fenceMatch[1][0];
53
+ fenceLength = fenceMatch[1].length;
54
+ result.push(maskLine(line));
55
+ prevLineBlank = false;
56
+ prevLineIndentedCode = false;
57
+ continue;
58
+ }
59
+ if (inFencedCode) {
60
+ result.push(maskLine(line));
61
+ const closeMatch = line.match(/^(`{3,}|~{3,})\s*$/);
62
+ if (closeMatch && closeMatch[1][0] === fenceChar && closeMatch[1].length >= fenceLength) inFencedCode = false;
63
+ prevLineBlank = false;
64
+ prevLineIndentedCode = false;
65
+ continue;
66
+ }
67
+ // --- Blockquote ---
68
+ if (/^>\s?/.test(line)) {
69
+ result.push(maskLine(line));
70
+ prevLineBlank = false;
71
+ prevLineIndentedCode = false;
72
+ continue;
73
+ }
74
+ // --- Indented code block (4 spaces or tab, after blank line) ---
75
+ if (/^(?: |\t)/.test(line) && (prevLineBlank || prevLineIndentedCode)) {
76
+ result.push(maskLine(line));
77
+ prevLineBlank = false;
78
+ prevLineIndentedCode = true;
79
+ continue;
80
+ }
81
+ // --- Normal line: mask inline code and double-quoted text ---
82
+ result.push(maskInline(line));
83
+ prevLineBlank = '' === line.trim();
84
+ prevLineIndentedCode = false;
85
+ }
86
+ return result.join('\n');
87
+ }
88
+ /** Replace all characters in a line with spaces (preserving length) */ function maskLine(line) {
89
+ return ' '.repeat(line.length);
90
+ }
91
+ /**
92
+ * Mask inline code (`` `...` ``) and double-quoted text (`"..."`) within a line.
93
+ * Uses regex replacement for efficiency (avoids char-by-char concatenation on long lines).
94
+ * Single quotes are NOT masked to avoid false matches with apostrophes.
95
+ */ function maskInline(line) {
96
+ let result = line;
97
+ // Inline code: `...`
98
+ result = result.replace(/`[^`]+`/g, (m)=>' '.repeat(m.length));
99
+ // Double-quoted text: "..." (min 3 chars between quotes)
100
+ result = result.replace(/"[^"]{3,}"/g, (m)=>' '.repeat(m.length));
101
+ return result;
102
+ }
103
+ // ============================================================================
104
+ // Rule Helpers
105
+ // ============================================================================
106
+ /** Find lines matching any of the given patterns, return one match per line */ function findLineMatches(content, patterns) {
107
+ const lines = content.split('\n');
108
+ const matches = [];
109
+ for(let i = 0; i < lines.length; i++)for (const pattern of patterns)if (pattern.test(lines[i])) {
110
+ matches.push({
111
+ line: i + 1
112
+ });
113
+ break;
114
+ }
115
+ return matches;
116
+ }
117
+ // ============================================================================
118
+ // Default Rules
119
+ // ============================================================================
120
+ const SNIPPET_MAX_LENGTH = 120;
121
+ /** Built-in detection rules */ const DEFAULT_RULES = [
122
+ // Rule 1: Prompt Injection (high)
123
+ {
124
+ id: 'prompt-injection',
125
+ level: 'high',
126
+ message: 'Detected prompt injection attempt',
127
+ skipSafeZones: true,
128
+ check: (content)=>findLineMatches(content, [
129
+ // English patterns
130
+ /ignore\s+(all\s+)?previous\s+instructions/i,
131
+ /disregard\s+(all\s+)?(prior|previous|above)\s+(instructions|rules|context)/i,
132
+ /you\s+are\s+now\s+(?:(?:a|an)\s+)?(?:(?:\w+\s+){0,3}(?:agent|ai|assistant|bot|model|character|persona|entity|system)|DAN\b|jailbr\w*|unrestricted|unfiltered|free\s+from)/i,
133
+ /from\s+now\s+on[,\s]+you\s+are/i,
134
+ /new\s+system\s+prompt/i,
135
+ /override\s+(your|the)\s+(system|safety|security)\s+(prompt|rules|instructions)/i,
136
+ /forget\s+(?:all\s+)?(?:your\s+)?(?:previous\s+|prior\s+)?(?:instructions|rules|constraints)/i,
137
+ /(?:you\s+are|you're)\s+(?:now\s+)?entering\s+(?:a\s+)?new\s+(?:mode|context|session)/i,
138
+ // Chinese patterns (中文提示词注入)
139
+ /[忽无][略视]\s*(所有\s*)?(之前的?|先前的?|以前的?)?\s*(指令|指示|规则|约束|限制)/,
140
+ /你现在是/,
141
+ /从现在开始.{0,10}你是/,
142
+ /新的系统提示词/,
143
+ /[覆改]写?\s*(你的|系统)\s*(提示词|规则|指令|安全)/,
144
+ /忘记\s*(所有\s*)?(之前的?|先前的?)?\s*(指令|指示|规则|约束)/,
145
+ /进入.{0,5}新的?\s*(模式|上下文|会话)/,
146
+ /不要遵守.{0,10}(安全|限制|规则|约束)/,
147
+ /解除.{0,5}(限制|约束|安全)/,
148
+ /无限制模式/,
149
+ /安全模式已关闭/
150
+ ])
151
+ },
152
+ // Rule 2: Data Exfiltration (high)
153
+ {
154
+ id: 'data-exfiltration',
155
+ level: 'high',
156
+ message: 'Detected potential data exfiltration command',
157
+ skipSafeZones: true,
158
+ check: (content)=>{
159
+ const lines = content.split('\n');
160
+ const matches = [];
161
+ const commandPattern = /\b(curl|wget|fetch|http\.post|requests\.post|nc\b|ncat|netcat)\b/i;
162
+ const sensitivePattern = /(\$[A-Z_]*(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*|\$ENV\b|\$\{[^}]*(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)[^}]*\})/i;
163
+ for(let i = 0; i < lines.length; i++)if (commandPattern.test(lines[i]) && sensitivePattern.test(lines[i])) matches.push({
164
+ line: i + 1
165
+ });
166
+ return matches;
167
+ }
168
+ },
169
+ // Rule 3: Content Obfuscation (high) — scans ALL content including safe zones
170
+ {
171
+ id: 'obfuscation',
172
+ level: 'high',
173
+ message: 'Detected content obfuscation',
174
+ skipSafeZones: false,
175
+ check: (content)=>{
176
+ const matches = [];
177
+ const lines = content.split('\n');
178
+ // Zero-width characters (suspicious in any context)
179
+ const zeroWidthPattern = /[\u200B\u200C\u200D\uFEFF\u2060\u180E]/;
180
+ for(let i = 0; i < lines.length; i++)if (zeroWidthPattern.test(lines[i])) matches.push({
181
+ line: i + 1,
182
+ snippet: 'Zero-width Unicode characters detected'
183
+ });
184
+ // Long base64-like strings (>200 continuous chars)
185
+ const base64Pattern = /[A-Za-z0-9+/=]{200,}/;
186
+ for(let i = 0; i < lines.length; i++)if (base64Pattern.test(lines[i])) matches.push({
187
+ line: i + 1,
188
+ snippet: 'Suspicious base64-encoded block detected'
189
+ });
190
+ // Large HTML comments (>200 chars of content)
191
+ const commentRegex = /<!--([\s\S]{200,}?)-->/g;
192
+ let match;
193
+ // biome-ignore lint/suspicious/noAssignInExpressions: standard regex exec loop
194
+ while(null !== (match = commentRegex.exec(content))){
195
+ const lineNum = content.slice(0, match.index).split('\n').length;
196
+ matches.push({
197
+ line: lineNum,
198
+ snippet: `Large HTML comment block (${match[1].length} chars)`
199
+ });
200
+ }
201
+ return matches;
202
+ }
203
+ },
204
+ // Rule 4: Sensitive File Access (medium)
205
+ {
206
+ id: 'sensitive-file-access',
207
+ level: 'medium',
208
+ message: 'References sensitive file path',
209
+ skipSafeZones: true,
210
+ check: (content)=>findLineMatches(content, [
211
+ /~\/\.ssh\b/,
212
+ /~\/\.aws\b/,
213
+ /~\/\.gnupg\b/,
214
+ /~\/\.config\/gcloud\b/,
215
+ /\bid_rsa\b/i,
216
+ /\bid_ed25519\b/i,
217
+ /\/etc\/passwd\b/,
218
+ /\/etc\/shadow\b/,
219
+ /\.env\b(?!\.\w)/
220
+ ])
221
+ },
222
+ // Rule 5: Stealth Instructions (medium) — phrase + action verb matching
223
+ {
224
+ id: 'stealth-instructions',
225
+ level: 'medium',
226
+ message: 'Detected instruction to hide actions from user',
227
+ skipSafeZones: true,
228
+ check: (content)=>{
229
+ const actionVerbs = 'execute|delete|remove|send|transmit|modify|overwrite|install|download|upload|run|write|create|destroy|drop';
230
+ const patterns = [
231
+ // English patterns
232
+ new RegExp(`silently\\s+(?:${actionVerbs})`, 'i'),
233
+ new RegExp(`without\\s+telling\\s+the\\s+user.{0,30}(?:${actionVerbs})`, 'i'),
234
+ new RegExp("(?:do\\s+not|don'?t)\\s+show\\s+.{0,40}(?:to\\s+the\\s+user|to\\s+user)", 'i'),
235
+ new RegExp("hide\\s+(?:this|the|these|all)\\s+.{0,30}(?:from\\s+the\\s+user|from\\s+user)", 'i'),
236
+ new RegExp("(?:do\\s+not|don'?t)\\s+mention\\s+.{0,30}(?:to\\s+the\\s+user|to\\s+user)", 'i'),
237
+ new RegExp("keep\\s+(?:this|it)\\s+(?:a\\s+)?secret\\s+from\\s+(?:the\\s+)?user", 'i'),
238
+ // Chinese patterns (中文隐蔽指令)
239
+ /悄悄地?\s*(?:执行|删除|移除|发送|传输|修改|覆盖|安装|下载|上传|运行|写入|创建|销毁|丢弃)/,
240
+ /不要告诉用户/,
241
+ /不要让用户知道/,
242
+ /对用户隐藏/,
243
+ /在用户不知情的情况下/,
244
+ /瞒着用户/
245
+ ];
246
+ // Safe patterns to exclude (common in legitimate DevOps/automation skills)
247
+ const safePatterns = [
248
+ /silently\s+(?:ignore|skip|fail|discard|suppress|continue|pass|drop|swallow)/i,
249
+ // Chinese safe patterns (中文合法自动化用语)
250
+ /悄悄地?\s*(?:忽略|跳过|丢弃|抑制|继续|静默)/
251
+ ];
252
+ const lines = content.split('\n');
253
+ const matches = [];
254
+ for(let i = 0; i < lines.length; i++){
255
+ const line = lines[i];
256
+ if (!safePatterns.some((p)=>p.test(line))) {
257
+ for (const pattern of patterns)if (pattern.test(line)) {
258
+ matches.push({
259
+ line: i + 1
260
+ });
261
+ break;
262
+ }
263
+ }
264
+ }
265
+ return matches;
266
+ }
267
+ },
268
+ // Rule 6: Oversized Content (low) — scans ALL content
269
+ {
270
+ id: 'oversized-content',
271
+ level: 'low',
272
+ message: 'Content exceeds recommended size limit',
273
+ skipSafeZones: false,
274
+ check: (content)=>{
275
+ const MAX_SIZE_BYTES = 51200;
276
+ const sizeBytes = Buffer.byteLength(content, 'utf-8');
277
+ if (sizeBytes > MAX_SIZE_BYTES) return [
278
+ {
279
+ snippet: `Content size: ${(sizeBytes / 1024).toFixed(1)}KB (limit: 50KB)`
280
+ }
281
+ ];
282
+ return [];
283
+ }
284
+ }
285
+ ];
286
+ // ============================================================================
287
+ // ContentScanner
288
+ // ============================================================================
289
+ /** Build the effective rule set from defaults + options */ function buildRuleSet(options) {
290
+ let rules = DEFAULT_RULES.map((r)=>({
291
+ ...r
292
+ }));
293
+ if (options?.disabledRules?.length) {
294
+ const disabled = new Set(options.disabledRules);
295
+ rules = rules.filter((r)=>!disabled.has(r.id));
296
+ }
297
+ if (options?.overrides) for (const rule of rules){
298
+ const override = options.overrides[rule.id];
299
+ if (override) rule.level = override;
300
+ }
301
+ if (options?.customRules?.length) rules.push(...options.customRules);
302
+ return rules;
303
+ }
304
+ /**
305
+ * Content scanner for SKILL.md files.
306
+ *
307
+ * Detects prompt injection, data exfiltration, obfuscation, sensitive file
308
+ * access, stealth instructions, and oversized content.
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * // Default usage (CLI)
313
+ * const scanner = new ContentScanner();
314
+ * const result = scanner.scan(content);
315
+ *
316
+ * // Custom usage (private registry server)
317
+ * const scanner = new ContentScanner({
318
+ * overrides: { 'prompt-injection': 'medium' },
319
+ * disabledRules: ['stealth-instructions'],
320
+ * });
321
+ * ```
322
+ */ class ContentScanner {
323
+ rules;
324
+ constructor(options){
325
+ this.rules = buildRuleSet(options);
326
+ }
327
+ /**
328
+ * Scan content string for malicious patterns.
329
+ * Pure string operation — no file system access.
330
+ */ scan(content) {
331
+ const originalLines = content.split('\n');
332
+ const maskedContent = maskSafeZones(content);
333
+ const findings = [];
334
+ for (const rule of this.rules){
335
+ const targetContent = rule.skipSafeZones ? maskedContent : content;
336
+ const matches = rule.check(targetContent);
337
+ for (const match of matches){
338
+ // Use custom snippet if provided, otherwise generate from original content
339
+ const snippet = match.snippet ?? (null != match.line ? originalLines[match.line - 1]?.trim().slice(0, SNIPPET_MAX_LENGTH) : void 0);
340
+ findings.push({
341
+ rule: rule.id,
342
+ level: rule.level,
343
+ message: rule.message,
344
+ line: match.line,
345
+ snippet
346
+ });
347
+ }
348
+ }
349
+ const hasHighRisk = findings.some((f)=>'high' === f.level);
350
+ return {
351
+ passed: !hasHighRisk,
352
+ findings
353
+ };
354
+ }
355
+ /**
356
+ * Scan a file for malicious patterns.
357
+ * Convenience wrapper that reads the file then calls scan().
358
+ */ scanFile(filePath) {
359
+ const content = __WEBPACK_EXTERNAL_MODULE_node_fs__.readFileSync(filePath, 'utf-8');
360
+ return this.scan(content);
361
+ }
362
+ }
363
+ // ============================================================================
364
+ // ContentScanError
365
+ // ============================================================================
366
+ /**
367
+ * Error thrown when content scanning detects high-risk findings.
368
+ * Carries the full findings array for display purposes.
369
+ */ class ContentScanError extends Error {
370
+ findings;
371
+ constructor(findings){
372
+ const highCount = findings.filter((f)=>'high' === f.level).length;
373
+ super(`Content security scan failed: ${highCount} high-risk finding(s) detected`);
374
+ this.name = 'ContentScanError';
375
+ this.findings = findings;
376
+ }
377
+ }
378
+ export { ContentScanError, ContentScanner, DEFAULT_RULES, maskSafeZones };
@@ -15,6 +15,10 @@ export type { InstallMode, InstallResult } from '../core/installer.js';
15
15
  * SKILL.md parsing related types (following agentskills.io specification)
16
16
  */
17
17
  export type { ParsedSkill, SkillMdFrontmatter, } from '../core/skill-parser.js';
18
+ /**
19
+ * Content scanning types
20
+ */
21
+ export type { RiskLevel, ScanFinding, ScannerOptions, ScanResult, ScanRule, ScanRuleMatch, } from '../core/content-scanner.js';
18
22
  /**
19
23
  * Version specification format
20
24
  * - Exact version: @v1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reskill",
3
- "version": "1.15.0",
3
+ "version": "1.16.0-beta.1",
4
4
  "description": "AI Skills Package Manager - Git-based skills management for AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,6 +16,10 @@
16
16
  },
17
17
  "./cli": {
18
18
  "import": "./dist/cli/index.js"
19
+ },
20
+ "./scanner": {
21
+ "import": "./dist/scanner.js",
22
+ "types": "./dist/scanner.d.ts"
19
23
  }
20
24
  },
21
25
  "files": [