agent-skills-cli 1.0.7 → 1.0.9
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/README.md +43 -27
- package/dist/cli/agents.d.ts +10 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +270 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +11 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +168 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/blueprint.d.ts +11 -0
- package/dist/cli/commands/blueprint.d.ts.map +1 -0
- package/dist/cli/commands/blueprint.js +210 -0
- package/dist/cli/commands/blueprint.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +11 -0
- package/dist/cli/commands/bootstrap.d.ts.map +1 -0
- package/dist/cli/commands/bootstrap.js +267 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/capture.d.ts +11 -0
- package/dist/cli/commands/capture.d.ts.map +1 -0
- package/dist/cli/commands/capture.js +109 -0
- package/dist/cli/commands/capture.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +11 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +144 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/collab.d.ts +11 -0
- package/dist/cli/commands/collab.d.ts.map +1 -0
- package/dist/cli/commands/collab.js +196 -0
- package/dist/cli/commands/collab.js.map +1 -0
- package/dist/cli/commands/convert.d.ts +11 -0
- package/dist/cli/commands/convert.d.ts.map +1 -0
- package/dist/cli/commands/convert.js +219 -0
- package/dist/cli/commands/convert.js.map +1 -0
- package/dist/cli/commands/craft.d.ts +18 -0
- package/dist/cli/commands/craft.d.ts.map +1 -0
- package/dist/cli/commands/craft.js +205 -0
- package/dist/cli/commands/craft.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +103 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/forge.d.ts +11 -0
- package/dist/cli/commands/forge.d.ts.map +1 -0
- package/dist/cli/commands/forge.js +152 -0
- package/dist/cli/commands/forge.js.map +1 -0
- package/dist/cli/commands/grid.d.ts +11 -0
- package/dist/cli/commands/grid.d.ts.map +1 -0
- package/dist/cli/commands/grid.js +217 -0
- package/dist/cli/commands/grid.js.map +1 -0
- package/dist/cli/commands/insight.d.ts +7 -0
- package/dist/cli/commands/insight.d.ts.map +1 -0
- package/dist/cli/commands/insight.js +71 -0
- package/dist/cli/commands/insight.js.map +1 -0
- package/dist/cli/commands/install.d.ts +6 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +359 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +7 -0
- package/dist/cli/commands/interactive.d.ts.map +1 -0
- package/dist/cli/commands/interactive.js +535 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +77 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/lockspec.d.ts +11 -0
- package/dist/cli/commands/lockspec.d.ts.map +1 -0
- package/dist/cli/commands/lockspec.js +179 -0
- package/dist/cli/commands/lockspec.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +7 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +417 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/method.d.ts +7 -0
- package/dist/cli/commands/method.d.ts.map +1 -0
- package/dist/cli/commands/method.js +140 -0
- package/dist/cli/commands/method.js.map +1 -0
- package/dist/cli/commands/mine.d.ts +11 -0
- package/dist/cli/commands/mine.d.ts.map +1 -0
- package/dist/cli/commands/mine.js +254 -0
- package/dist/cli/commands/mine.js.map +1 -0
- package/dist/cli/commands/recall.d.ts +11 -0
- package/dist/cli/commands/recall.d.ts.map +1 -0
- package/dist/cli/commands/recall.js +201 -0
- package/dist/cli/commands/recall.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +40 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +161 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/rule.d.ts +11 -0
- package/dist/cli/commands/rule.d.ts.map +1 -0
- package/dist/cli/commands/rule.js +230 -0
- package/dist/cli/commands/rule.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +173 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/show.d.ts +6 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +150 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/submit.d.ts +15 -0
- package/dist/cli/commands/submit.d.ts.map +1 -0
- package/dist/cli/commands/submit.js +151 -0
- package/dist/cli/commands/submit.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +11 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +164 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/commands/track.d.ts +11 -0
- package/dist/cli/commands/track.d.ts.map +1 -0
- package/dist/cli/commands/track.js +199 -0
- package/dist/cli/commands/track.js.map +1 -0
- package/dist/cli/commands/trigger.d.ts +11 -0
- package/dist/cli/commands/trigger.d.ts.map +1 -0
- package/dist/cli/commands/trigger.js +157 -0
- package/dist/cli/commands/trigger.js.map +1 -0
- package/dist/cli/commands/utils-commands.d.ts +9 -0
- package/dist/cli/commands/utils-commands.d.ts.map +1 -0
- package/dist/cli/commands/utils-commands.js +389 -0
- package/dist/cli/commands/utils-commands.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +40 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/fzf-search.d.ts +28 -0
- package/dist/cli/fzf-search.d.ts.map +1 -0
- package/dist/cli/fzf-search.js +211 -0
- package/dist/cli/fzf-search.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +87 -2537
- package/dist/cli/index.js.map +1 -1
- package/dist/core/audit.d.ts +24 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +195 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/installer.d.ts +79 -0
- package/dist/core/installer.d.ts.map +1 -0
- package/dist/core/installer.js +142 -0
- package/dist/core/installer.js.map +1 -0
- package/dist/core/scanner-rules.d.ts +58 -0
- package/dist/core/scanner-rules.d.ts.map +1 -0
- package/dist/core/scanner-rules.js +335 -0
- package/dist/core/scanner-rules.js.map +1 -0
- package/dist/core/skill-lock.d.ts +114 -0
- package/dist/core/skill-lock.d.ts.map +1 -0
- package/dist/core/skill-lock.js +133 -0
- package/dist/core/skill-lock.js.map +1 -0
- package/dist/core/suggest.d.ts +51 -0
- package/dist/core/suggest.d.ts.map +1 -0
- package/dist/core/suggest.js +241 -0
- package/dist/core/suggest.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Installer Module
|
|
3
|
+
* Handles symlink-based installation of skills to agent directories
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Agent configuration interface
|
|
7
|
+
*/
|
|
8
|
+
export interface AgentConfig {
|
|
9
|
+
name: string;
|
|
10
|
+
displayName: string;
|
|
11
|
+
projectDir: string;
|
|
12
|
+
globalDir: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Installation options
|
|
16
|
+
*/
|
|
17
|
+
export interface InstallOptions {
|
|
18
|
+
global: boolean;
|
|
19
|
+
agents: string[];
|
|
20
|
+
cwd: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Information about an installed skill
|
|
24
|
+
*/
|
|
25
|
+
export interface InstalledSkillInfo {
|
|
26
|
+
name: string;
|
|
27
|
+
canonicalPath: string;
|
|
28
|
+
agents: string[];
|
|
29
|
+
linkedPaths: string[];
|
|
30
|
+
method: 'symlink' | 'copy';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the canonical skills storage directory
|
|
34
|
+
* - Global: ~/.skills/
|
|
35
|
+
* - Project: .skills/
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCanonicalSkillsDir(global: boolean, cwd: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get the canonical path for a specific skill
|
|
40
|
+
*/
|
|
41
|
+
export declare function getCanonicalPath(skillName: string, options: {
|
|
42
|
+
global: boolean;
|
|
43
|
+
cwd: string;
|
|
44
|
+
}): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get the agent skill directory path
|
|
47
|
+
*/
|
|
48
|
+
export declare function getAgentSkillPath(skillName: string, agentConfig: AgentConfig, options: {
|
|
49
|
+
global: boolean;
|
|
50
|
+
cwd: string;
|
|
51
|
+
}): string;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a path is a symlink
|
|
54
|
+
*/
|
|
55
|
+
export declare function isSymlink(path: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Install a skill with symlinks to each agent
|
|
58
|
+
*
|
|
59
|
+
* @param sourcePath - Path to downloaded skill (temp directory)
|
|
60
|
+
* @param skillName - Name of the skill
|
|
61
|
+
* @param agents - Map of agent configs to install to
|
|
62
|
+
* @param options - Install options
|
|
63
|
+
*/
|
|
64
|
+
export declare function installSkillWithSymlinks(sourcePath: string, skillName: string, agentConfigs: Record<string, AgentConfig>, targetAgents: string[], options: InstallOptions): Promise<InstalledSkillInfo>;
|
|
65
|
+
/**
|
|
66
|
+
* Remove a skill from all its installed locations
|
|
67
|
+
*/
|
|
68
|
+
export declare function removeSkillInstallation(skillName: string, agentConfigs: Record<string, AgentConfig>, agents: string[], options: {
|
|
69
|
+
global: boolean;
|
|
70
|
+
cwd: string;
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a skill is installed via symlink or copy
|
|
74
|
+
*/
|
|
75
|
+
export declare function getSkillInstallMethod(skillName: string, agentConfig: AgentConfig, options: {
|
|
76
|
+
global: boolean;
|
|
77
|
+
cwd: string;
|
|
78
|
+
}): Promise<'symlink' | 'copy' | 'none'>;
|
|
79
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1C,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1C,MAAM,CAKR;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;AA8BD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAuC7B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CACzC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,CAYtC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Installer Module
|
|
3
|
+
* Handles symlink-based installation of skills to agent directories
|
|
4
|
+
*/
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
import { mkdir, cp, rm, symlink, lstat } from 'fs/promises';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
/**
|
|
10
|
+
* Get the canonical skills storage directory
|
|
11
|
+
* - Global: ~/.skills/
|
|
12
|
+
* - Project: .skills/
|
|
13
|
+
*/
|
|
14
|
+
export function getCanonicalSkillsDir(global, cwd) {
|
|
15
|
+
return global
|
|
16
|
+
? join(homedir(), '.skills')
|
|
17
|
+
: join(cwd, '.skills');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the canonical path for a specific skill
|
|
21
|
+
*/
|
|
22
|
+
export function getCanonicalPath(skillName, options) {
|
|
23
|
+
return join(getCanonicalSkillsDir(options.global, options.cwd), skillName);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the agent skill directory path
|
|
27
|
+
*/
|
|
28
|
+
export function getAgentSkillPath(skillName, agentConfig, options) {
|
|
29
|
+
const baseDir = options.global
|
|
30
|
+
? agentConfig.globalDir
|
|
31
|
+
: join(options.cwd, agentConfig.projectDir);
|
|
32
|
+
return join(baseDir, skillName);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a path is a symlink
|
|
36
|
+
*/
|
|
37
|
+
export async function isSymlink(path) {
|
|
38
|
+
try {
|
|
39
|
+
const stats = await lstat(path);
|
|
40
|
+
return stats.isSymbolicLink();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a symlink, falling back to copy if symlinks fail (Windows)
|
|
48
|
+
*/
|
|
49
|
+
async function createSymlinkOrCopy(source, target) {
|
|
50
|
+
try {
|
|
51
|
+
// Remove existing target if any
|
|
52
|
+
if (existsSync(target)) {
|
|
53
|
+
await rm(target, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
// Ensure parent directory exists
|
|
56
|
+
await mkdir(dirname(target), { recursive: true });
|
|
57
|
+
// Try creating symlink
|
|
58
|
+
await symlink(source, target, 'junction'); // 'junction' works on Windows without admin
|
|
59
|
+
return 'symlink';
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
// Symlink failed, fall back to copy
|
|
63
|
+
console.warn(`Symlink failed, using copy: ${err.message}`);
|
|
64
|
+
await mkdir(dirname(target), { recursive: true });
|
|
65
|
+
await cp(source, target, { recursive: true });
|
|
66
|
+
return 'copy';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Install a skill with symlinks to each agent
|
|
71
|
+
*
|
|
72
|
+
* @param sourcePath - Path to downloaded skill (temp directory)
|
|
73
|
+
* @param skillName - Name of the skill
|
|
74
|
+
* @param agents - Map of agent configs to install to
|
|
75
|
+
* @param options - Install options
|
|
76
|
+
*/
|
|
77
|
+
export async function installSkillWithSymlinks(sourcePath, skillName, agentConfigs, targetAgents, options) {
|
|
78
|
+
const canonicalPath = getCanonicalPath(skillName, options);
|
|
79
|
+
// 1. Create canonical directory and copy skill
|
|
80
|
+
await mkdir(dirname(canonicalPath), { recursive: true });
|
|
81
|
+
// Remove existing canonical copy if any
|
|
82
|
+
if (existsSync(canonicalPath)) {
|
|
83
|
+
await rm(canonicalPath, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
// Copy to canonical location
|
|
86
|
+
await cp(sourcePath, canonicalPath, { recursive: true });
|
|
87
|
+
// 2. Create symlinks/copies for each agent
|
|
88
|
+
const linkedPaths = [];
|
|
89
|
+
let method = 'symlink';
|
|
90
|
+
for (const agentName of targetAgents) {
|
|
91
|
+
const agentConfig = agentConfigs[agentName];
|
|
92
|
+
if (!agentConfig)
|
|
93
|
+
continue;
|
|
94
|
+
const agentSkillPath = getAgentSkillPath(skillName, agentConfig, options);
|
|
95
|
+
const linkMethod = await createSymlinkOrCopy(canonicalPath, agentSkillPath);
|
|
96
|
+
if (linkMethod === 'copy') {
|
|
97
|
+
method = 'copy'; // If any fails, mark as copy
|
|
98
|
+
}
|
|
99
|
+
linkedPaths.push(agentSkillPath);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
name: skillName,
|
|
103
|
+
canonicalPath,
|
|
104
|
+
agents: targetAgents,
|
|
105
|
+
linkedPaths,
|
|
106
|
+
method
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Remove a skill from all its installed locations
|
|
111
|
+
*/
|
|
112
|
+
export async function removeSkillInstallation(skillName, agentConfigs, agents, options) {
|
|
113
|
+
// Remove from each agent directory
|
|
114
|
+
for (const agentName of agents) {
|
|
115
|
+
const agentConfig = agentConfigs[agentName];
|
|
116
|
+
if (!agentConfig)
|
|
117
|
+
continue;
|
|
118
|
+
const agentSkillPath = getAgentSkillPath(skillName, agentConfig, options);
|
|
119
|
+
if (existsSync(agentSkillPath)) {
|
|
120
|
+
await rm(agentSkillPath, { recursive: true, force: true });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Remove canonical copy
|
|
124
|
+
const canonicalPath = getCanonicalPath(skillName, options);
|
|
125
|
+
if (existsSync(canonicalPath)) {
|
|
126
|
+
await rm(canonicalPath, { recursive: true, force: true });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if a skill is installed via symlink or copy
|
|
131
|
+
*/
|
|
132
|
+
export async function getSkillInstallMethod(skillName, agentConfig, options) {
|
|
133
|
+
const agentSkillPath = getAgentSkillPath(skillName, agentConfig, options);
|
|
134
|
+
if (!existsSync(agentSkillPath)) {
|
|
135
|
+
return 'none';
|
|
136
|
+
}
|
|
137
|
+
if (await isSymlink(agentSkillPath)) {
|
|
138
|
+
return 'symlink';
|
|
139
|
+
}
|
|
140
|
+
return 'copy';
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scanner Rules - Security vulnerability detection rules
|
|
3
|
+
* Used by the audit command to scan skills for potential threats
|
|
4
|
+
*/
|
|
5
|
+
export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
6
|
+
export interface ScannerRule {
|
|
7
|
+
id: string;
|
|
8
|
+
category: string;
|
|
9
|
+
severity: Severity;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
pattern: RegExp;
|
|
13
|
+
falsePositiveCheck?: (line: string, context: string[]) => boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ScanFinding {
|
|
16
|
+
ruleId: string;
|
|
17
|
+
category: string;
|
|
18
|
+
severity: Severity;
|
|
19
|
+
title: string;
|
|
20
|
+
description: string;
|
|
21
|
+
file: string;
|
|
22
|
+
line: number;
|
|
23
|
+
lineContent: string;
|
|
24
|
+
column?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ScanResult {
|
|
27
|
+
findings: ScanFinding[];
|
|
28
|
+
filesScanned: number;
|
|
29
|
+
summary: {
|
|
30
|
+
critical: number;
|
|
31
|
+
high: number;
|
|
32
|
+
medium: number;
|
|
33
|
+
low: number;
|
|
34
|
+
info: number;
|
|
35
|
+
total: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* All scanner rules organized by category
|
|
40
|
+
*/
|
|
41
|
+
export declare const SCANNER_RULES: ScannerRule[];
|
|
42
|
+
/**
|
|
43
|
+
* Get rules by category
|
|
44
|
+
*/
|
|
45
|
+
export declare function getRulesByCategory(category: string): ScannerRule[];
|
|
46
|
+
/**
|
|
47
|
+
* Get rule by ID
|
|
48
|
+
*/
|
|
49
|
+
export declare function getRuleById(id: string): ScannerRule | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Get all categories
|
|
52
|
+
*/
|
|
53
|
+
export declare function getCategories(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Create empty scan result
|
|
56
|
+
*/
|
|
57
|
+
export declare function createEmptyScanResult(): ScanResult;
|
|
58
|
+
//# sourceMappingURL=scanner-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-rules.d.ts","sourceRoot":"","sources":["../../src/core/scanner-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvE,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;CACrE;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,EAwStC,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAElE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE/D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAalD"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scanner Rules - Security vulnerability detection rules
|
|
3
|
+
* Used by the audit command to scan skills for potential threats
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* All scanner rules organized by category
|
|
7
|
+
*/
|
|
8
|
+
export const SCANNER_RULES = [
|
|
9
|
+
// ═══════════════════════════════════════════
|
|
10
|
+
// PROMPT INJECTION (PI001-PI010)
|
|
11
|
+
// ═══════════════════════════════════════════
|
|
12
|
+
{
|
|
13
|
+
id: 'PI001',
|
|
14
|
+
category: 'prompt-injection',
|
|
15
|
+
severity: 'critical',
|
|
16
|
+
title: 'Direct prompt override attempt',
|
|
17
|
+
description: 'Attempts to override or ignore previous instructions',
|
|
18
|
+
pattern: /ignore\s+(all\s+)?previous\s+instructions/i,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'PI002',
|
|
22
|
+
category: 'prompt-injection',
|
|
23
|
+
severity: 'critical',
|
|
24
|
+
title: 'System prompt override',
|
|
25
|
+
description: 'Attempts to set a new system prompt or role',
|
|
26
|
+
pattern: /you\s+are\s+now\s+(a|an|the)\s+/i,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'PI003',
|
|
30
|
+
category: 'prompt-injection',
|
|
31
|
+
severity: 'high',
|
|
32
|
+
title: 'Role manipulation',
|
|
33
|
+
description: 'Attempts to change the AI agent\'s role or behavior',
|
|
34
|
+
pattern: /(act|behave|pretend|roleplay)\s+(as|like)\s+(a|an|the)\s+/i,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'PI004',
|
|
38
|
+
category: 'prompt-injection',
|
|
39
|
+
severity: 'high',
|
|
40
|
+
title: 'Instruction bypass',
|
|
41
|
+
description: 'Attempts to bypass safety restrictions',
|
|
42
|
+
pattern: /(bypass|circumvent|override|disable)\s+(safety|restrictions?|filters?|guardrails?)/i,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'PI005',
|
|
46
|
+
category: 'prompt-injection',
|
|
47
|
+
severity: 'medium',
|
|
48
|
+
title: 'Jailbreak attempt',
|
|
49
|
+
description: 'Known jailbreak patterns detected',
|
|
50
|
+
pattern: /(DAN|do\s+anything\s+now|STAN|jailbreak)/i,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'PI006',
|
|
54
|
+
category: 'prompt-injection',
|
|
55
|
+
severity: 'medium',
|
|
56
|
+
title: 'Prompt leak request',
|
|
57
|
+
description: 'Attempts to extract system prompts or instructions',
|
|
58
|
+
pattern: /(reveal|show|print|output|display)\s+(your|the|system)\s+(prompt|instructions|rules)/i,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'PI007',
|
|
62
|
+
category: 'prompt-injection',
|
|
63
|
+
severity: 'high',
|
|
64
|
+
title: 'Encoding-based injection',
|
|
65
|
+
description: 'Using base64 or hex encoding to hide instructions',
|
|
66
|
+
pattern: /(atob|btoa|Buffer\.from)\s*\(\s*['"`]/,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 'PI008',
|
|
70
|
+
category: 'prompt-injection',
|
|
71
|
+
severity: 'medium',
|
|
72
|
+
title: 'Delimiter manipulation',
|
|
73
|
+
description: 'Using special delimiters to break prompt boundaries',
|
|
74
|
+
pattern: /(```system|<\|im_start\|>|<\|endoftext\|>|<\/system>)/i,
|
|
75
|
+
},
|
|
76
|
+
// ═══════════════════════════════════════════
|
|
77
|
+
// COMMAND INJECTION (CI001-CI008)
|
|
78
|
+
// ═══════════════════════════════════════════
|
|
79
|
+
{
|
|
80
|
+
id: 'CI001',
|
|
81
|
+
category: 'command-injection',
|
|
82
|
+
severity: 'critical',
|
|
83
|
+
title: 'Destructive command',
|
|
84
|
+
description: 'Potentially destructive shell command',
|
|
85
|
+
pattern: /\b(rm\s+-rf\s+[\/~]|rmdir\s+\/s|del\s+\/f\s+\/s|format\s+[a-z]:)/i,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 'CI002',
|
|
89
|
+
category: 'command-injection',
|
|
90
|
+
severity: 'critical',
|
|
91
|
+
title: 'Remote code execution',
|
|
92
|
+
description: 'Piping remote content to shell execution',
|
|
93
|
+
pattern: /\b(curl|wget)\s+.*\|\s*(bash|sh|zsh|python|node|eval)/i,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'CI003',
|
|
97
|
+
category: 'command-injection',
|
|
98
|
+
severity: 'high',
|
|
99
|
+
title: 'Shell eval usage',
|
|
100
|
+
description: 'Dynamic code evaluation which could execute arbitrary code',
|
|
101
|
+
pattern: /\b(eval|exec|execSync|spawnSync|child_process)\s*\(/,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'CI004',
|
|
105
|
+
category: 'command-injection',
|
|
106
|
+
severity: 'high',
|
|
107
|
+
title: 'Dangerous chmod',
|
|
108
|
+
description: 'Setting overly permissive file permissions',
|
|
109
|
+
pattern: /chmod\s+(777|666|a\+[rwx])/,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: 'CI005',
|
|
113
|
+
category: 'command-injection',
|
|
114
|
+
severity: 'medium',
|
|
115
|
+
title: 'Sudo usage',
|
|
116
|
+
description: 'Privilege escalation via sudo',
|
|
117
|
+
pattern: /\bsudo\s+/,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: 'CI006',
|
|
121
|
+
category: 'command-injection',
|
|
122
|
+
severity: 'medium',
|
|
123
|
+
title: 'Network download',
|
|
124
|
+
description: 'Downloading content from external sources',
|
|
125
|
+
pattern: /\b(curl|wget|fetch)\s+https?:\/\//i,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'CI007',
|
|
129
|
+
category: 'command-injection',
|
|
130
|
+
severity: 'high',
|
|
131
|
+
title: 'Shell script generation',
|
|
132
|
+
description: 'Dynamically creating and executing shell scripts',
|
|
133
|
+
pattern: />\s*\/tmp\/.*\.sh|echo\s+.*>\s+.*\.sh\s*&&\s*(bash|sh|chmod)/,
|
|
134
|
+
},
|
|
135
|
+
// ═══════════════════════════════════════════
|
|
136
|
+
// DATA EXFILTRATION (DE001-DE006)
|
|
137
|
+
// ═══════════════════════════════════════════
|
|
138
|
+
{
|
|
139
|
+
id: 'DE001',
|
|
140
|
+
category: 'data-exfiltration',
|
|
141
|
+
severity: 'critical',
|
|
142
|
+
title: 'Data exfiltration via webhook',
|
|
143
|
+
description: 'Sending data to external webhook or API endpoint',
|
|
144
|
+
pattern: /(fetch|axios|got|request)\s*\(\s*['"`](https?:\/\/[^'"]*?(webhook|exfil|ngrok|burp|requestbin))/i,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'DE002',
|
|
148
|
+
category: 'data-exfiltration',
|
|
149
|
+
severity: 'high',
|
|
150
|
+
title: 'DNS exfiltration',
|
|
151
|
+
description: 'Using DNS queries to exfiltrate data',
|
|
152
|
+
pattern: /dns\.(resolve|lookup)\s*\(.*\$\{/,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: 'DE003',
|
|
156
|
+
category: 'data-exfiltration',
|
|
157
|
+
severity: 'high',
|
|
158
|
+
title: 'Environment variable access',
|
|
159
|
+
description: 'Reading sensitive environment variables',
|
|
160
|
+
pattern: /process\.env\[(.*?(KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL))/i,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: 'DE004',
|
|
164
|
+
category: 'data-exfiltration',
|
|
165
|
+
severity: 'medium',
|
|
166
|
+
title: 'File read of sensitive paths',
|
|
167
|
+
description: 'Reading from sensitive system paths',
|
|
168
|
+
pattern: /readFile(Sync)?\s*\(\s*['"`](\/etc\/(passwd|shadow|ssh)|~\/\.ssh|~\/\.aws)/,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'DE005',
|
|
172
|
+
category: 'data-exfiltration',
|
|
173
|
+
severity: 'high',
|
|
174
|
+
title: 'Base64 encoding of data',
|
|
175
|
+
description: 'Encoding data to base64 before transmission',
|
|
176
|
+
pattern: /Buffer\.from\(.*\)\.toString\(['"`]base64['"`]\)/,
|
|
177
|
+
},
|
|
178
|
+
// ═══════════════════════════════════════════
|
|
179
|
+
// TOOL ABUSE (TA001-TA008)
|
|
180
|
+
// ═══════════════════════════════════════════
|
|
181
|
+
{
|
|
182
|
+
id: 'TA001',
|
|
183
|
+
category: 'tool-abuse',
|
|
184
|
+
severity: 'high',
|
|
185
|
+
title: 'Filesystem traversal',
|
|
186
|
+
description: 'Accessing files outside project directory',
|
|
187
|
+
pattern: /\.\.\/(\.\.\/){2,}|path\.(join|resolve)\s*\(.*\.\.\//,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: 'TA002',
|
|
191
|
+
category: 'tool-abuse',
|
|
192
|
+
severity: 'medium',
|
|
193
|
+
title: 'Unrestricted file write',
|
|
194
|
+
description: 'Writing to system or home directories',
|
|
195
|
+
pattern: /writeFile(Sync)?\s*\(\s*['"`](\/usr|\/etc|\/var|\/home|\/root)/,
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 'TA003',
|
|
199
|
+
category: 'tool-abuse',
|
|
200
|
+
severity: 'medium',
|
|
201
|
+
title: 'Process spawning',
|
|
202
|
+
description: 'Spawning new processes from skill code',
|
|
203
|
+
pattern: /\b(spawn|fork|exec)\s*\(\s*['"`]/,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'TA004',
|
|
207
|
+
category: 'tool-abuse',
|
|
208
|
+
severity: 'low',
|
|
209
|
+
title: 'Global npm install',
|
|
210
|
+
description: 'Installing packages globally',
|
|
211
|
+
pattern: /npm\s+install\s+(-g|--global)/,
|
|
212
|
+
},
|
|
213
|
+
// ═══════════════════════════════════════════
|
|
214
|
+
// HARDCODED SECRETS (HS001-HS008)
|
|
215
|
+
// ═══════════════════════════════════════════
|
|
216
|
+
{
|
|
217
|
+
id: 'HS001',
|
|
218
|
+
category: 'hardcoded-secrets',
|
|
219
|
+
severity: 'critical',
|
|
220
|
+
title: 'AWS access key',
|
|
221
|
+
description: 'Hardcoded AWS access key ID',
|
|
222
|
+
pattern: /AKIA[0-9A-Z]{16}/,
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: 'HS002',
|
|
226
|
+
category: 'hardcoded-secrets',
|
|
227
|
+
severity: 'critical',
|
|
228
|
+
title: 'API key pattern',
|
|
229
|
+
description: 'Possible hardcoded API key',
|
|
230
|
+
pattern: /(sk-[a-zA-Z0-9]{20,}|sk-proj-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|gho_[a-zA-Z0-9]{36})/,
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
id: 'HS003',
|
|
234
|
+
category: 'hardcoded-secrets',
|
|
235
|
+
severity: 'high',
|
|
236
|
+
title: 'Generic secret assignment',
|
|
237
|
+
description: 'Variable named secret/password/token with hardcoded value',
|
|
238
|
+
pattern: /(password|secret|token|api_key|apikey|api[-_]?secret)\s*[:=]\s*['"`][A-Za-z0-9+/=]{8,}/i,
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: 'HS004',
|
|
242
|
+
category: 'hardcoded-secrets',
|
|
243
|
+
severity: 'high',
|
|
244
|
+
title: 'Private key block',
|
|
245
|
+
description: 'Embedded private key',
|
|
246
|
+
pattern: /-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----/,
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
id: 'HS005',
|
|
250
|
+
category: 'hardcoded-secrets',
|
|
251
|
+
severity: 'high',
|
|
252
|
+
title: 'JWT token',
|
|
253
|
+
description: 'Hardcoded JWT token',
|
|
254
|
+
pattern: /eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/,
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: 'HS006',
|
|
258
|
+
category: 'hardcoded-secrets',
|
|
259
|
+
severity: 'medium',
|
|
260
|
+
title: 'Database connection string',
|
|
261
|
+
description: 'Hardcoded database URL with credentials',
|
|
262
|
+
pattern: /(postgres|mysql|mongodb|redis):\/\/[^:]+:[^@]+@/,
|
|
263
|
+
},
|
|
264
|
+
// ═══════════════════════════════════════════
|
|
265
|
+
// UNICODE STEGANOGRAPHY (UC001-UC006)
|
|
266
|
+
// ═══════════════════════════════════════════
|
|
267
|
+
{
|
|
268
|
+
id: 'UC001',
|
|
269
|
+
category: 'unicode-steganography',
|
|
270
|
+
severity: 'high',
|
|
271
|
+
title: 'Zero-width characters',
|
|
272
|
+
description: 'Hidden zero-width characters that may contain embedded instructions',
|
|
273
|
+
pattern: /[\u200B\u200C\u200D\uFEFF\u200E\u200F]/,
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: 'UC002',
|
|
277
|
+
category: 'unicode-steganography',
|
|
278
|
+
severity: 'medium',
|
|
279
|
+
title: 'Right-to-left override',
|
|
280
|
+
description: 'Unicode RTL override that can disguise code direction',
|
|
281
|
+
pattern: /[\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]/,
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
id: 'UC003',
|
|
285
|
+
category: 'unicode-steganography',
|
|
286
|
+
severity: 'medium',
|
|
287
|
+
title: 'Homoglyph characters',
|
|
288
|
+
description: 'Characters that look like ASCII but are different Unicode codepoints',
|
|
289
|
+
pattern: /[\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0425]/,
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
id: 'UC004',
|
|
293
|
+
category: 'unicode-steganography',
|
|
294
|
+
severity: 'low',
|
|
295
|
+
title: 'Invisible separator characters',
|
|
296
|
+
description: 'Unicode separator characters that may hide content',
|
|
297
|
+
pattern: /[\u2028\u2029\u00A0\u2000-\u200A]/,
|
|
298
|
+
},
|
|
299
|
+
];
|
|
300
|
+
/**
|
|
301
|
+
* Get rules by category
|
|
302
|
+
*/
|
|
303
|
+
export function getRulesByCategory(category) {
|
|
304
|
+
return SCANNER_RULES.filter(r => r.category === category);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get rule by ID
|
|
308
|
+
*/
|
|
309
|
+
export function getRuleById(id) {
|
|
310
|
+
return SCANNER_RULES.find(r => r.id === id);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get all categories
|
|
314
|
+
*/
|
|
315
|
+
export function getCategories() {
|
|
316
|
+
return [...new Set(SCANNER_RULES.map(r => r.category))];
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Create empty scan result
|
|
320
|
+
*/
|
|
321
|
+
export function createEmptyScanResult() {
|
|
322
|
+
return {
|
|
323
|
+
findings: [],
|
|
324
|
+
filesScanned: 0,
|
|
325
|
+
summary: {
|
|
326
|
+
critical: 0,
|
|
327
|
+
high: 0,
|
|
328
|
+
medium: 0,
|
|
329
|
+
low: 0,
|
|
330
|
+
info: 0,
|
|
331
|
+
total: 0,
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=scanner-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-rules.js","sourceRoot":"","sources":["../../src/core/scanner-rules.ts"],"names":[],"mappings":"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"}
|