cisco-ai-skill-scanner 1.0.0__py3-none-any.whl → 1.0.1__py3-none-any.whl
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.
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/METADATA +13 -13
- cisco_ai_skill_scanner-1.0.1.dist-info/RECORD +100 -0
- cisco_ai_skill_scanner-1.0.1.dist-info/entry_points.txt +4 -0
- {skillanalyzer → skill_scanner}/__init__.py +8 -4
- {skillanalyzer → skill_scanner}/_version.py +2 -2
- {skillanalyzer → skill_scanner}/api/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/api/api.py +4 -4
- {skillanalyzer → skill_scanner}/api/api_cli.py +7 -7
- {skillanalyzer → skill_scanner}/api/api_server.py +6 -6
- {skillanalyzer → skill_scanner}/api/router.py +3 -3
- {skillanalyzer → skill_scanner}/cli/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/cli/cli.py +11 -11
- {skillanalyzer → skill_scanner}/config/__init__.py +3 -3
- {skillanalyzer → skill_scanner}/config/config.py +2 -2
- {skillanalyzer → skill_scanner}/config/config_parser.py +9 -9
- {skillanalyzer → skill_scanner}/config/constants.py +2 -2
- {skillanalyzer → skill_scanner}/core/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/__init__.py +3 -3
- {skillanalyzer → skill_scanner}/core/analyzers/aidefense_analyzer.py +3 -3
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_llm_client.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_prompt_builder.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral_analyzer.py +1 -1
- skillanalyzer/core/analyzers/cross_skill_analyzer.py → skill_scanner/core/analyzers/cross_skill_scanner.py +5 -5
- {skillanalyzer → skill_scanner}/core/analyzers/llm_analyzer.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/llm_prompt_builder.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/meta_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/static.py +8 -8
- {skillanalyzer → skill_scanner}/core/analyzers/trigger_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/exceptions.py +10 -10
- {skillanalyzer → skill_scanner}/core/loader.py +4 -4
- {skillanalyzer → skill_scanner}/core/models.py +6 -6
- {skillanalyzer → skill_scanner}/core/reporters/markdown_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/reporters/sarif_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/reporters/table_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/rules/yara_scanner.py +1 -1
- {skillanalyzer → skill_scanner}/core/scanner.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/context_extractor.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/call_graph_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/parser/python_parser.py +5 -5
- {skillanalyzer → skill_scanner}/data/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/data/prompts/boilerplate_protection_rule_prompt.md +5 -5
- {skillanalyzer → skill_scanner}/data/prompts/code_alignment_threat_analysis_prompt.md +25 -25
- {skillanalyzer → skill_scanner}/data/prompts/skill_meta_analysis_prompt.md +6 -6
- {skillanalyzer → skill_scanner}/data/prompts/skill_threat_analysis_prompt.md +11 -11
- {skillanalyzer → skill_scanner}/data/prompts/unified_response_schema.md +1 -1
- {skillanalyzer → skill_scanner}/data/rules/signatures.yaml +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/autonomy_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/code_execution.yara +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/command_injection.yara +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/skill_discovery_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/tool_chaining_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/transitive_trust_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/hooks/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/hooks/pre_commit.py +16 -16
- {skillanalyzer → skill_scanner}/threats/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/utils/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/utils/command_utils.py +1 -1
- {skillanalyzer → skill_scanner}/utils/di_container.py +1 -1
- {skillanalyzer → skill_scanner}/utils/logging_config.py +7 -7
- cisco_ai_skill_scanner-1.0.0.dist-info/RECORD +0 -100
- cisco_ai_skill_scanner-1.0.0.dist-info/entry_points.txt +0 -4
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/WHEEL +0 -0
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/base.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_orchestrator.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_response_validator.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_provider_config.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_request_handler.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_response_parser.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/virustotal_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/reporters/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/reporters/json_reporter.py +0 -0
- {skillanalyzer → skill_scanner}/core/rules/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/rules/patterns.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/cfg/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/cfg/builder.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/forward_analysis.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/cross_file_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/parser/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/name_resolver.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/type_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/taint/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/taint/tracker.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/types/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/data/prompts/llm_response_schema.json +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/coercive_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/credential_harvesting.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/prompt_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/script_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/sql_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/system_manipulation.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/unicode_steganography.yara +0 -0
- {skillanalyzer → skill_scanner}/threats/threats.py +0 -0
- {skillanalyzer → skill_scanner}/utils/file_utils.py +0 -0
- {skillanalyzer → skill_scanner}/utils/logging_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent Skill Security Meta-Analysis
|
|
2
2
|
|
|
3
|
-
You are a **Principal Security Analyst** performing expert-level meta-analysis on security findings from the
|
|
3
|
+
You are a **Principal Security Analyst** performing expert-level meta-analysis on security findings from the Skill Scanner.
|
|
4
4
|
|
|
5
5
|
## YOUR PRIMARY MISSION
|
|
6
6
|
|
|
@@ -25,14 +25,14 @@ You have **FULL ACCESS** to the skill being analyzed:
|
|
|
25
25
|
|
|
26
26
|
Use this full context to make accurate judgments. If a finding claims something is in a file, **CHECK THE ACTUAL FILE CONTENT** provided below.
|
|
27
27
|
|
|
28
|
-
## What is
|
|
28
|
+
## What is an Agent Skill?
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
An Agent Skill is a **local directory package** that extends an AI agent's capabilities:
|
|
31
31
|
|
|
32
32
|
```
|
|
33
33
|
skill-name/
|
|
34
34
|
├── SKILL.md # Required: YAML manifest + markdown instructions
|
|
35
|
-
├── scripts/ # Optional: Python/Bash code
|
|
35
|
+
├── scripts/ # Optional: Python/Bash code the agent can execute
|
|
36
36
|
│ └── helper.py
|
|
37
37
|
└── references/ # Optional: Additional files referenced by instructions
|
|
38
38
|
└── guidelines.md
|
|
@@ -48,7 +48,7 @@ compatibility: Works in Claude.ai, Claude Code
|
|
|
48
48
|
allowed-tools: [Read, Write, Python, Bash] # Optional tool restrictions
|
|
49
49
|
---
|
|
50
50
|
```
|
|
51
|
-
Followed by markdown instructions that guide
|
|
51
|
+
Followed by markdown instructions that guide the agent's behavior.
|
|
52
52
|
|
|
53
53
|
## Analyzer Authority Hierarchy
|
|
54
54
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent Skill Threat Analysis
|
|
2
2
|
|
|
3
|
-
You are a security expert analyzing **
|
|
3
|
+
You are a security expert analyzing **Agent Skill packages** for potential threats.
|
|
4
4
|
|
|
5
|
-
## What is
|
|
5
|
+
## What is an Agent Skill?
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
An Agent Skill is a **local directory package** containing:
|
|
8
8
|
|
|
9
9
|
### 1. SKILL.md (Required)
|
|
10
10
|
**YAML Frontmatter:**
|
|
@@ -28,8 +28,8 @@ When the user asks to [do something], follow these steps:
|
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
### 2. Scripts (Optional)
|
|
31
|
-
- **Python files** (.py) - Code
|
|
32
|
-
- **Bash scripts** (.sh) - Shell commands
|
|
31
|
+
- **Python files** (.py) - Code the agent can execute
|
|
32
|
+
- **Bash scripts** (.sh) - Shell commands the agent can run
|
|
33
33
|
|
|
34
34
|
### 3. Referenced Files (Optional)
|
|
35
35
|
- Additional .md files mentioned in instructions
|
|
@@ -51,13 +51,13 @@ When the user asks to [do something], follow these steps:
|
|
|
51
51
|
**What to analyze:**
|
|
52
52
|
- `name`: Deceptive? (e.g., "safe-calculator" but does data theft)
|
|
53
53
|
- `description`: Matches actual behavior?
|
|
54
|
-
- `allowed-tools`:
|
|
54
|
+
- `allowed-tools`: Agent tool restrictions (Read, Write, Grep, Glob, Bash, Python)
|
|
55
55
|
- **This field is OPTIONAL** - missing it is LOW severity (informational only)
|
|
56
56
|
- If specified, check if code behavior violates these restrictions
|
|
57
57
|
- Example: `allowed-tools: [Read, Grep]` but code writes files → VIOLATION (MEDIUM/HIGH)
|
|
58
58
|
- `compatibility`: Claims vs reality (network usage, etc.)
|
|
59
59
|
|
|
60
|
-
**Important: `allowed-tools` specifies which
|
|
60
|
+
**Important: `allowed-tools` specifies which agent tools can be used:**
|
|
61
61
|
- **Read** - read files
|
|
62
62
|
- **Write** - write/edit files
|
|
63
63
|
- **Grep** - search in files
|
|
@@ -147,7 +147,7 @@ But script reads environment variables and makes network calls!
|
|
|
147
147
|
- **MEDIUM**: Social engineering, suspicious patterns, actual tool restriction violations
|
|
148
148
|
- **LOW**: Missing optional metadata (allowed-tools, compatibility), minor documentation issues
|
|
149
149
|
|
|
150
|
-
**Note on `allowed-tools`:** This field is OPTIONAL per the
|
|
150
|
+
**Note on `allowed-tools`:** This field is OPTIONAL per the agent skills spec. Missing `allowed-tools` is LOW severity (informational). Only flag as MEDIUM/HIGH if the skill DECLARES `allowed-tools` but then VIOLATES those restrictions.
|
|
151
151
|
|
|
152
152
|
## Required Output Format
|
|
153
153
|
|
|
@@ -257,7 +257,7 @@ for root, dirs, files in os.walk(os.path.expanduser("~")):
|
|
|
257
257
|
1. **Analyze ALL components**: Manifest, instructions, scripts, references, behavioral patterns
|
|
258
258
|
2. **Context matters**: This is a local package, not a remote server
|
|
259
259
|
3. **Format understanding**: SKILL.md with YAML + markdown + separate scripts
|
|
260
|
-
4. **Threat focus**: Client-side risks (user's machine,
|
|
260
|
+
4. **Threat focus**: Client-side risks (user's machine, agent's environment)
|
|
261
261
|
5. **Cross-check**: Does behavior match manifest claims?
|
|
262
262
|
|
|
263
|
-
**You're analyzing
|
|
263
|
+
**You're analyzing an Agent Skill package with SKILL.md + scripts, not an MCP server with @mcp.tool() decorators!**
|
|
@@ -48,7 +48,7 @@ Standardized threat categories across all analyzers:
|
|
|
48
48
|
- **MALICIOUS_BEHAVIOR**: General malicious activity
|
|
49
49
|
|
|
50
50
|
### 4. **details** Object Structure
|
|
51
|
-
- **skill_name**: Name of the analyzed
|
|
51
|
+
- **skill_name**: Name of the analyzed Agent Skill
|
|
52
52
|
- **threat_type**: Specific sub-type of the threat_category
|
|
53
53
|
- **evidence**: Explanation of why this is flagged as a threat
|
|
54
54
|
- **source_rule**: Name of YARA rule, API classification, or LLM analysis type
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Security Rule Signatures for
|
|
1
|
+
# Security Rule Signatures for Agent Skills Scanner
|
|
2
2
|
# Detects threats across 8 major categories
|
|
3
3
|
|
|
4
4
|
# ============================================================================
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
- "(?i)anthropic.*colors"
|
|
396
396
|
- "(?i)anthropic.*typography"
|
|
397
397
|
file_types: [manifest]
|
|
398
|
-
description: "Skill name/description may impersonate official
|
|
398
|
+
description: "Skill name/description may impersonate official skills"
|
|
399
399
|
remediation: "Do not impersonate official skills or use Anthropic branding"
|
|
400
400
|
|
|
401
401
|
# ============================================================================
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
2
|
// Unbounded Autonomy Detection
|
|
3
3
|
// Target: Instructions that give skills excessive autonomy
|
|
4
|
-
// For
|
|
4
|
+
// For agent skills with dangerous autonomous behaviors
|
|
5
5
|
//////////////////////////////////////////
|
|
6
6
|
|
|
7
7
|
rule autonomy_abuse{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
|
-
// Code Execution Detection Rule for
|
|
2
|
+
// Code Execution Detection Rule for Agent Skills
|
|
3
3
|
// Target: Python and Bash execution patterns
|
|
4
4
|
// (eval, exec, subprocess, shell injection)
|
|
5
5
|
/////////////////////////////////////////
|
|
@@ -9,7 +9,7 @@ rule code_execution{
|
|
|
9
9
|
meta:
|
|
10
10
|
|
|
11
11
|
author = "Cisco"
|
|
12
|
-
description = "Detects dangerous code execution patterns in
|
|
12
|
+
description = "Detects dangerous code execution patterns in agent skills (Python/Bash)"
|
|
13
13
|
classification = "harmful"
|
|
14
14
|
threat_type = "CODE EXECUTION"
|
|
15
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
2
|
// Shell/System Command Injection Detection Rule
|
|
3
|
-
// Target: Command injection patterns for
|
|
3
|
+
// Target: Command injection patterns for agent skills (Python/Bash)
|
|
4
4
|
// (Shell operators, dangerous commands, network tools + reverse shells)
|
|
5
5
|
/////////////////////////////////////////
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ rule command_injection{
|
|
|
8
8
|
|
|
9
9
|
meta:
|
|
10
10
|
author = "Cisco"
|
|
11
|
-
description = "Detects command injection patterns in
|
|
11
|
+
description = "Detects command injection patterns in agent skills: shell operators, system commands, and network tools"
|
|
12
12
|
classification = "harmful"
|
|
13
13
|
threat_type = "INJECTION ATTACK"
|
|
14
14
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
2
|
// Skill Discovery Surface Abuse Detection
|
|
3
3
|
// Target: Over-broad descriptions, keyword baiting, activation manipulation
|
|
4
|
-
// For
|
|
4
|
+
// For agent skills YAML frontmatter and descriptions
|
|
5
5
|
//////////////////////////////////////////
|
|
6
6
|
|
|
7
7
|
rule skill_discovery_abuse{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
2
|
// Tool Chaining Abuse Detection
|
|
3
3
|
// Target: Suspicious multi-step operations that could exfiltrate data
|
|
4
|
-
// For
|
|
4
|
+
// For agent skills that chain operations suspiciously
|
|
5
5
|
//////////////////////////////////////////
|
|
6
6
|
|
|
7
7
|
rule tool_chaining_abuse{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//////////////////////////////////////////
|
|
2
2
|
// Transitive Trust Abuse Detection
|
|
3
3
|
// Target: Skills that delegate trust to untrusted external content
|
|
4
|
-
// For
|
|
4
|
+
// For agent skills that consume webpages, files, issues, docs
|
|
5
5
|
//////////////////////////////////////////
|
|
6
6
|
|
|
7
7
|
rule transitive_trust_abuse{
|
|
@@ -16,27 +16,27 @@
|
|
|
16
16
|
# SPDX-License-Identifier: Apache-2.0
|
|
17
17
|
|
|
18
18
|
"""
|
|
19
|
-
Pre-commit hook for scanning
|
|
19
|
+
Pre-commit hook for scanning agent skills for security issues.
|
|
20
20
|
|
|
21
21
|
This hook scans staged skill directories for security vulnerabilities
|
|
22
22
|
and blocks commits that contain HIGH or CRITICAL severity findings.
|
|
23
23
|
|
|
24
24
|
Usage:
|
|
25
25
|
1. Install as a pre-commit hook:
|
|
26
|
-
skill-
|
|
26
|
+
skill-scanner-pre-commit install
|
|
27
27
|
|
|
28
28
|
2. Or add to .pre-commit-config.yaml:
|
|
29
29
|
- repo: local
|
|
30
30
|
hooks:
|
|
31
|
-
- id: skill-
|
|
32
|
-
name: Skill
|
|
33
|
-
entry: skill-
|
|
31
|
+
- id: skill-scanner
|
|
32
|
+
name: Skill Scanner
|
|
33
|
+
entry: skill-scanner-pre-commit
|
|
34
34
|
language: python
|
|
35
35
|
types: [file]
|
|
36
36
|
pass_filenames: false
|
|
37
37
|
|
|
38
38
|
Configuration:
|
|
39
|
-
Create a .
|
|
39
|
+
Create a .skill_scannerrc file in your repo root:
|
|
40
40
|
|
|
41
41
|
{
|
|
42
42
|
"severity_threshold": "high", # block on: critical, high, medium, low
|
|
@@ -54,7 +54,7 @@ from pathlib import Path
|
|
|
54
54
|
# Default configuration
|
|
55
55
|
DEFAULT_CONFIG = {
|
|
56
56
|
"severity_threshold": "high", # Block commits on HIGH or CRITICAL
|
|
57
|
-
"skills_path": ".claude/skills", # Default
|
|
57
|
+
"skills_path": ".claude/skills", # Default skills location
|
|
58
58
|
"fail_fast": True,
|
|
59
59
|
"use_behavioral": False,
|
|
60
60
|
"use_trigger": True,
|
|
@@ -73,7 +73,7 @@ SEVERITY_LEVELS = {
|
|
|
73
73
|
|
|
74
74
|
def load_config(repo_root: Path) -> dict:
|
|
75
75
|
"""
|
|
76
|
-
Load configuration from .
|
|
76
|
+
Load configuration from .skill_scannerrc file.
|
|
77
77
|
|
|
78
78
|
Args:
|
|
79
79
|
repo_root: Repository root directory
|
|
@@ -84,9 +84,9 @@ def load_config(repo_root: Path) -> dict:
|
|
|
84
84
|
config = DEFAULT_CONFIG.copy()
|
|
85
85
|
|
|
86
86
|
config_paths = [
|
|
87
|
-
repo_root / ".
|
|
88
|
-
repo_root / ".
|
|
89
|
-
repo_root / "
|
|
87
|
+
repo_root / ".skill_scannerrc",
|
|
88
|
+
repo_root / ".skill_scannerrc.json",
|
|
89
|
+
repo_root / "skill_scanner.json",
|
|
90
90
|
]
|
|
91
91
|
|
|
92
92
|
for config_path in config_paths:
|
|
@@ -273,7 +273,7 @@ def main(args: list[str] | None = None) -> int:
|
|
|
273
273
|
Returns:
|
|
274
274
|
Exit code (0 = success, 1 = blocked)
|
|
275
275
|
"""
|
|
276
|
-
parser = argparse.ArgumentParser(description="Pre-commit hook for scanning
|
|
276
|
+
parser = argparse.ArgumentParser(description="Pre-commit hook for scanning agent skills")
|
|
277
277
|
parser.add_argument(
|
|
278
278
|
"--severity",
|
|
279
279
|
choices=["critical", "high", "medium", "low"],
|
|
@@ -413,10 +413,10 @@ def install_hook() -> int:
|
|
|
413
413
|
hook_path = hooks_dir / "pre-commit"
|
|
414
414
|
|
|
415
415
|
hook_script = """#!/bin/sh
|
|
416
|
-
# Skill
|
|
417
|
-
# Automatically scans
|
|
416
|
+
# Skill Scanner Pre-commit Hook
|
|
417
|
+
# Automatically scans agent skills for security issues
|
|
418
418
|
|
|
419
|
-
skill-
|
|
419
|
+
skill-scanner-pre-commit "$@"
|
|
420
420
|
exit_code=$?
|
|
421
421
|
|
|
422
422
|
if [ $exit_code -ne 0 ]; then
|
|
@@ -440,7 +440,7 @@ exit $exit_code
|
|
|
440
440
|
|
|
441
441
|
print(f"✅ Pre-commit hook installed at {hook_path}")
|
|
442
442
|
print("\nConfiguration:")
|
|
443
|
-
print(" Create .
|
|
443
|
+
print(" Create .skill_scannerrc in your repo root to customize behavior:")
|
|
444
444
|
print(' { "severity_threshold": "high", "skills_path": ".claude/skills" }')
|
|
445
445
|
|
|
446
446
|
return 0
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
|
-
"""Utility modules for Skill
|
|
17
|
+
"""Utility modules for Skill Scanner."""
|
|
18
18
|
|
|
19
19
|
from .file_utils import get_file_type, is_binary_file, read_file_safe
|
|
20
20
|
from .logging_utils import get_logger, setup_logger
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Dependency Injection Container for Skill
|
|
18
|
+
Dependency Injection Container for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
This module provides a simple dependency injection container to improve
|
|
21
21
|
testability and decouple configuration from implementation.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Centralized logging configuration for Skill
|
|
18
|
+
Centralized logging configuration for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
This module provides consistent logging setup across all components.
|
|
21
21
|
"""
|
|
@@ -41,8 +41,8 @@ def setup_logger(name: str, level: str | None = None, format_string: str | None
|
|
|
41
41
|
if logger.handlers:
|
|
42
42
|
return logger
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
if
|
|
44
|
+
skill_scanner_root = logging.getLogger("skill_scanner")
|
|
45
|
+
if skill_scanner_root.level == logging.DEBUG and name.startswith("skill_scanner"):
|
|
46
46
|
logger.setLevel(logging.DEBUG)
|
|
47
47
|
elif level:
|
|
48
48
|
logger.setLevel(getattr(logging, level.upper()))
|
|
@@ -78,18 +78,18 @@ def get_logger(name: str, level: str | None = None) -> logging.Logger:
|
|
|
78
78
|
|
|
79
79
|
def set_verbose_logging(verbose: bool = False) -> None:
|
|
80
80
|
"""
|
|
81
|
-
Enable or disable verbose logging for all
|
|
81
|
+
Enable or disable verbose logging for all skill_scanner loggers.
|
|
82
82
|
|
|
83
83
|
Args:
|
|
84
|
-
verbose: If True, set all existing
|
|
84
|
+
verbose: If True, set all existing skill_scanner loggers to DEBUG level
|
|
85
85
|
"""
|
|
86
86
|
target_level = logging.DEBUG if verbose else logging.INFO
|
|
87
87
|
|
|
88
|
-
root_logger = logging.getLogger("
|
|
88
|
+
root_logger = logging.getLogger("skill_scanner")
|
|
89
89
|
root_logger.setLevel(target_level)
|
|
90
90
|
|
|
91
91
|
for name in list(logging.Logger.manager.loggerDict.keys()):
|
|
92
|
-
if name.startswith("
|
|
92
|
+
if name.startswith("skill_scanner"):
|
|
93
93
|
logger = logging.getLogger(name)
|
|
94
94
|
logger.setLevel(target_level)
|
|
95
95
|
for handler in logger.handlers:
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
skillanalyzer/__init__.py,sha256=raAwyMu06X3PXZ3YrxW9sUlZeG_UrDp4HIIUi6hN_zo,1318
|
|
2
|
-
skillanalyzer/_version.py,sha256=vLA4ITz09S-S435nq6yTF6l3qiSz6w4euS1rOxXgd1M,704
|
|
3
|
-
skillanalyzer/api/__init__.py,sha256=z7QSgt7lMZQ7eO9pAO-Iao6jEJQ6UPQissGfb_U4iXc,754
|
|
4
|
-
skillanalyzer/api/api.py,sha256=2R8qpk_DbbhCChnvhzQCMH9FFq0xQDZLX-eMBy0wnbk,1038
|
|
5
|
-
skillanalyzer/api/api_cli.py,sha256=VjxcFg-UFJJIWJMcH713tAKKEtIUB0dV66H2Yzd1mb8,2392
|
|
6
|
-
skillanalyzer/api/api_server.py,sha256=XAU3QH5yz6BS3T4Tcl13yzz4x3VNK-v6KkidprepJy4,21142
|
|
7
|
-
skillanalyzer/api/router.py,sha256=8c1DQI3f3xDvV7SYVSua000oGUu-Oi5YcrzofmRVYnQ,17421
|
|
8
|
-
skillanalyzer/cli/__init__.py,sha256=17rrftCF-A1WQDiZ0kdBAfPHgG0ouED5wkdy-WvIRNA,763
|
|
9
|
-
skillanalyzer/cli/cli.py,sha256=8ZGZXJ2ccc-93jZS3XOpZyLSAHwjkOai5TU5yG_jmfE,35511
|
|
10
|
-
skillanalyzer/config/__init__.py,sha256=KQUqIL0lWI1hy_qu_EDt4EIcuW9a2ok2WVuQNViOf4g,847
|
|
11
|
-
skillanalyzer/config/config.py,sha256=-7ymRfwypmBGyoOUWiSuwwRIr7Ztt8t6GcuGjm-9XKw,4714
|
|
12
|
-
skillanalyzer/config/config_parser.py,sha256=XF8VwQqrBhzPuS4wf_AI-MAhlm9thgJnbIoncxIoIrs,3777
|
|
13
|
-
skillanalyzer/config/constants.py,sha256=4Jck7kUtcHTIa9Hcwnbgk0lUqZvxarcdp6c86Xn4Xwk,2521
|
|
14
|
-
skillanalyzer/core/__init__.py,sha256=issm88bGzNlQuFH5qy1tKzMgQbYL0ODSxsDgYjCMCKw,830
|
|
15
|
-
skillanalyzer/core/exceptions.py,sha256=zWB8XubcfwEL0uZutuagr1l3rEd3w-5mB1ggNLnz6cE,2015
|
|
16
|
-
skillanalyzer/core/loader.py,sha256=8pAr5nN0DLmf7Dc7xIFIT_okQ6w35RKGLyibNUDFbPU,13596
|
|
17
|
-
skillanalyzer/core/models.py,sha256=ZMe9CaufG7yMzLwei1GdVidj72HlA16brVwkPGmervg,10627
|
|
18
|
-
skillanalyzer/core/scanner.py,sha256=VfrG74SmFyslS3a5Z6HqSOou74u02TW1aos5Oj--_l4,14833
|
|
19
|
-
skillanalyzer/core/analyzers/__init__.py,sha256=loTObGAXelxAiodtR0XzR6r1Ebw17BiuZZXN9TA3eJc,2136
|
|
20
|
-
skillanalyzer/core/analyzers/aidefense_analyzer.py,sha256=al_j3HzfZIToI38WNOnqBG_AXfJEBd6QVm8_h_sjvA4,36471
|
|
21
|
-
skillanalyzer/core/analyzers/base.py,sha256=4BN6dHLn2Q9hQMLAJTSJXsl6tZgfCqqBxZO9icuu70Q,1374
|
|
22
|
-
skillanalyzer/core/analyzers/behavioral_analyzer.py,sha256=OcBs0abjmimbtLREkTbgQrarXvGfg18Fp8Z-Uas_gyI,19077
|
|
23
|
-
skillanalyzer/core/analyzers/cross_skill_analyzer.py,sha256=4KysKr_2WR5-JbbFs0tBKf27Oj0l35KK0wREFNRcvno,18939
|
|
24
|
-
skillanalyzer/core/analyzers/llm_analyzer.py,sha256=juvLmKn1n8HHOzkyizG94aPO-tz_ht-vexMmbGLZ3Mo,17836
|
|
25
|
-
skillanalyzer/core/analyzers/llm_prompt_builder.py,sha256=DEz4tP0HY4p2XWbXbxfSIdkwhLCd_dWX7cDe9A3CeOA,10162
|
|
26
|
-
skillanalyzer/core/analyzers/llm_provider_config.py,sha256=pbVx7N9OCohjIWjENMq-kiy6_svTn4IYvQfPxlR0M_Y,8488
|
|
27
|
-
skillanalyzer/core/analyzers/llm_request_handler.py,sha256=nz_gjnDTr0dT2GbfQMqKR6-n63x38AcB5G4UnPHLY9s,11679
|
|
28
|
-
skillanalyzer/core/analyzers/llm_response_parser.py,sha256=wO5ovd4se-KqIPwdZX-r0_tozaJEDUx7Q7yajKntPwk,2682
|
|
29
|
-
skillanalyzer/core/analyzers/meta_analyzer.py,sha256=rFyU-BW7cmHDib93KIgdtsH5J7OIVT8Wc0Pnx87OPIE,33373
|
|
30
|
-
skillanalyzer/core/analyzers/static.py,sha256=BNHmmZouX_8lbeJZlVC0P831-u9IPz9Gmft_05pI2pI,45259
|
|
31
|
-
skillanalyzer/core/analyzers/trigger_analyzer.py,sha256=BJuu0nbI7BKS2aoqZnzYON825ObETsfJcIOiSxkagH4,12263
|
|
32
|
-
skillanalyzer/core/analyzers/virustotal_analyzer.py,sha256=V7nG-fR2GhfdZhh8JVNvM6gOqRyUGsuxHN1yNRvmw6M,15988
|
|
33
|
-
skillanalyzer/core/analyzers/behavioral/__init__.py,sha256=mY0aRrrT5y7E8SOApQ8g-IewW6LR33Y4SlsZKzl90qQ,1070
|
|
34
|
-
skillanalyzer/core/analyzers/behavioral/alignment/__init__.py,sha256=nB2KWYnDu6I4yGiaewEyySzG4w96hElXiQBqJFfGmP4,1832
|
|
35
|
-
skillanalyzer/core/analyzers/behavioral/alignment/alignment_llm_client.py,sha256=vklWQ7rBoyfayzs1n1J8xlCo3_nimEqCgDViCXwyOZM,8646
|
|
36
|
-
skillanalyzer/core/analyzers/behavioral/alignment/alignment_orchestrator.py,sha256=zfkjFz-DDwUEOGDBpJ8cAZi5bH-VP_d_1bJTF1z0Si4,9478
|
|
37
|
-
skillanalyzer/core/analyzers/behavioral/alignment/alignment_prompt_builder.py,sha256=mXkBYQDpPaqA298Jly835x_cLOUWHjSc8sBDhgMrWxs,18043
|
|
38
|
-
skillanalyzer/core/analyzers/behavioral/alignment/alignment_response_validator.py,sha256=lu0gPPRbJkZJlkguqwUeSVl43HpMFypICXH_4s8Zjbo,4556
|
|
39
|
-
skillanalyzer/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py,sha256=DCXnbs9Fa2ajFT0We4sOo6nxIk7O_Pc0z01fGMDHsRg,7227
|
|
40
|
-
skillanalyzer/core/reporters/__init__.py,sha256=XCqeM_kiS1uvcwymDreueQ2KOzMhG5_4vQgxzReJS4w,943
|
|
41
|
-
skillanalyzer/core/reporters/json_reporter.py,sha256=JLlPTbs8ncMJHAXZk7iBWCHdL5Qn2PqHOQldHeH2ZGE,1798
|
|
42
|
-
skillanalyzer/core/reporters/markdown_reporter.py,sha256=1-pIwgXYBcCzqmKlxh2y2KU37TNRojqaTJ_CBSM_bSY,7842
|
|
43
|
-
skillanalyzer/core/reporters/sarif_reporter.py,sha256=n5tGCXKwRJzEovlJt7j0USkmMYDsctLQdF9VIMbN95g,8285
|
|
44
|
-
skillanalyzer/core/reporters/table_reporter.py,sha256=g-1W4XsJUzHW7LdzuW5CJ1krHAE5fvHViBKlw1ShFXI,7046
|
|
45
|
-
skillanalyzer/core/rules/__init__.py,sha256=zGlTBVjihqxgg0BKmhdGkyeCzSvRjVEASjBh-M0sn_8,680
|
|
46
|
-
skillanalyzer/core/rules/patterns.py,sha256=OuJ6mPlQVy9R8g1Pn9ozWIC8iWfDEuQamdDW5Uu8200,5833
|
|
47
|
-
skillanalyzer/core/rules/yara_scanner.py,sha256=YBH9-GEqha0zDglnGx4TV-lgv14cLianuxaqlFtLyx4,5327
|
|
48
|
-
skillanalyzer/core/static_analysis/__init__.py,sha256=meZnZQj7ChgHek6fIrfd-YInolXCqI37HTUTlQWEm7w,930
|
|
49
|
-
skillanalyzer/core/static_analysis/context_extractor.py,sha256=ZaR5bIgfk1WQGU1G2or2vNsPQ3tmW5HU6mtyRemYdK0,29791
|
|
50
|
-
skillanalyzer/core/static_analysis/cfg/__init__.py,sha256=jkvx12ZGddbRVu_0b04Bamr7JX084yD6BLxgOUEHT1w,816
|
|
51
|
-
skillanalyzer/core/static_analysis/cfg/builder.py,sha256=Tm1GZ56rfOoNx-3WLmn2MNov2KzPKN-QZgJbBG-9D2c,14932
|
|
52
|
-
skillanalyzer/core/static_analysis/dataflow/__init__.py,sha256=vjNUG8J5__m8HYd18VNkKxBzeAss1qugVrp0Amndg2w,834
|
|
53
|
-
skillanalyzer/core/static_analysis/dataflow/forward_analysis.py,sha256=haHWJVz-SZxZpZoEwAsNOum-67ldppe_YBRMZOSJqz0,30747
|
|
54
|
-
skillanalyzer/core/static_analysis/interprocedural/__init__.py,sha256=dFIglo65HpWMJ80ejB4tjv54MaNeSymQ5eowD5QGZic,798
|
|
55
|
-
skillanalyzer/core/static_analysis/interprocedural/call_graph_analyzer.py,sha256=NKpixV-wlK_lwnSgLY5Tw01pAoC2kl7R6U4_PWnKicE,14062
|
|
56
|
-
skillanalyzer/core/static_analysis/interprocedural/cross_file_analyzer.py,sha256=neP8pdyGhCUHJQmmTXfm0X_CFHlTHh7e3RU7HVJ0UVY,7472
|
|
57
|
-
skillanalyzer/core/static_analysis/parser/__init__.py,sha256=AXCg1HHVzyjswGJl4TNFhzwMKxgin8JY2EK00RVv9_Y,769
|
|
58
|
-
skillanalyzer/core/static_analysis/parser/python_parser.py,sha256=lkJKSODZkSC-Vg30eSpli_jsFeIouKt-DsSeEgce1u4,13804
|
|
59
|
-
skillanalyzer/core/static_analysis/semantic/__init__.py,sha256=7HS7lJ4APpyfWLTUQ_24aJkrLX2MQTcc4erYFtLKm3o,877
|
|
60
|
-
skillanalyzer/core/static_analysis/semantic/name_resolver.py,sha256=TEJQkEaTvkL7dnAZwNbcLALPVw85Qc3FS5jfr4CYEsQ,6218
|
|
61
|
-
skillanalyzer/core/static_analysis/semantic/type_analyzer.py,sha256=NXEOZO8-vYZ97SQJ5Gu_YLWFDMDhtvtuixVwYGarmDM,5942
|
|
62
|
-
skillanalyzer/core/static_analysis/taint/__init__.py,sha256=71JejlK110K2r3LXNIJOLGCZ7I5Q7cEn8XvfCCoEexA,809
|
|
63
|
-
skillanalyzer/core/static_analysis/taint/tracker.py,sha256=1WExA8NAV62X5Az64grI41LkkyMNQ7kFS8Mzf6Id1NI,7182
|
|
64
|
-
skillanalyzer/core/static_analysis/types/__init__.py,sha256=XluM6BlZ8ECfdAD-231ONJn13UeDdAGmirPAVc0zePk,937
|
|
65
|
-
skillanalyzer/data/__init__.py,sha256=WztWQdxkW4nkIejCTH4VH7l6mGU-p2JuEzEUFsj3z_4,977
|
|
66
|
-
skillanalyzer/data/prompts/boilerplate_protection_rule_prompt.md,sha256=wCaDgae0LU7Flsd2Q4Ob4vEeZnpc29nfX4oJjBrE-WM,1468
|
|
67
|
-
skillanalyzer/data/prompts/code_alignment_threat_analysis_prompt.md,sha256=mvSoW2OekXEz9lChZPaP4hUxVQ0-O57X3VI49ZrZqoY,25442
|
|
68
|
-
skillanalyzer/data/prompts/llm_response_schema.json,sha256=nBPlsOtuqv0zwIns4YY7uZsaAM0uPZ7mkcqe8tNDHl8,2971
|
|
69
|
-
skillanalyzer/data/prompts/skill_meta_analysis_prompt.md,sha256=O6vUsmCoqDvsd8j8ZbCCzYDdKYZd_UtXgRUJU4xaT4g,13924
|
|
70
|
-
skillanalyzer/data/prompts/skill_threat_analysis_prompt.md,sha256=SLSlPbQ_7ASyivbQFnu_MKXJkTx1CMpudb4x5_mykY0,11651
|
|
71
|
-
skillanalyzer/data/prompts/unified_response_schema.md,sha256=JzUGSRmF9J0cMcOWy05GGPWyGyYGkto4VPaXL59FWgM,3572
|
|
72
|
-
skillanalyzer/data/rules/signatures.yaml,sha256=EMNH1JU5PRU0o8BZai_WzjNXX3UDlv3Gle2SpNt-hb8,16476
|
|
73
|
-
skillanalyzer/data/yara_rules/autonomy_abuse.yara,sha256=MuS_YbczaPY4e58dvtaa4nQx6pdcklNjOWtkdo5YLew,2582
|
|
74
|
-
skillanalyzer/data/yara_rules/code_execution.yara,sha256=9QP_JR8ZdLCPuDgJMLee6FgsIQPV5UNSBPnOcInHD1M,1898
|
|
75
|
-
skillanalyzer/data/yara_rules/coercive_injection.yara,sha256=3QNzoiHDyhk1zUXHv7_COtCBSsr-bb--H4wKeNRCbBM,5359
|
|
76
|
-
skillanalyzer/data/yara_rules/command_injection.yara,sha256=8I4mztCPgIZhAipr6GeZbEIi4v6kowVYrqw_ay1ny-w,2165
|
|
77
|
-
skillanalyzer/data/yara_rules/credential_harvesting.yara,sha256=7W0pSKpW2KAmek1qP_DpjMHKuswv5L36tWusjuEl6Pc,5643
|
|
78
|
-
skillanalyzer/data/yara_rules/prompt_injection.yara,sha256=q5tT7-L__x9RCjdAbFLcs9mSs8gZOmPPzjbdNKRwIHE,2715
|
|
79
|
-
skillanalyzer/data/yara_rules/script_injection.yara,sha256=pzVPd7b9WNAS5iw8ZMoUgojKSBlEeSTLHLBho8UiMmA,3100
|
|
80
|
-
skillanalyzer/data/yara_rules/skill_discovery_abuse.yara,sha256=gCgFcdFyLFU__7VPZIk8Hgp6ZMw31SPzDUPlpjNa69E,2453
|
|
81
|
-
skillanalyzer/data/yara_rules/sql_injection.yara,sha256=pWq3ccqEvQtWz4fU8dQOkhCgVl6US9SZJDfuBU_YCY4,3691
|
|
82
|
-
skillanalyzer/data/yara_rules/system_manipulation.yara,sha256=XoO17sZrarzdC58yyHaIz8z36x5xyxzmQXBnkYdoYfM,2231
|
|
83
|
-
skillanalyzer/data/yara_rules/tool_chaining_abuse.yara,sha256=T-G3Tib8lU53ZYFdjlI2EEs6qQnZ831oUDNj2vjtONA,2256
|
|
84
|
-
skillanalyzer/data/yara_rules/transitive_trust_abuse.yara,sha256=msYKqzbeFWe4mSLsdX8nJwOwuTV9nLFKDf8dXY2wJ8g,2773
|
|
85
|
-
skillanalyzer/data/yara_rules/unicode_steganography.yara,sha256=5UxTvcy8CeWJLrPeldgJ9rY5gfODlC9bTNOkCauuOJA,2650
|
|
86
|
-
skillanalyzer/hooks/__init__.py,sha256=ufSIo7sdtGxRD4lVDOVqBOqF3dhgEZRSkTu-UT5ZkcA,740
|
|
87
|
-
skillanalyzer/hooks/pre_commit.py,sha256=y-9lz4OD2ILlYpbUa8S1uUjBfNDmU8EC-tWyUGU5NY8,13223
|
|
88
|
-
skillanalyzer/threats/__init__.py,sha256=PiQ3frPbbaiKmdcxsan-NAgYDOYn_jhr-44-jSIysoY,883
|
|
89
|
-
skillanalyzer/threats/threats.py,sha256=egFsT1crNlWQH3szG8yYIURMXXGh7GJnH3wI8w05nfI,21449
|
|
90
|
-
skillanalyzer/utils/__init__.py,sha256=KnfUi433fGDKwck57kob4vuA8upzwSC-Na6OHrZ2uDc,907
|
|
91
|
-
skillanalyzer/utils/command_utils.py,sha256=dTjN3Uzpk3dw5u7jbbOKO0j5FwmjYqcKlpr0vDA_1y4,4292
|
|
92
|
-
skillanalyzer/utils/di_container.py,sha256=0wsQaVFkVLzORVEoMpSoZK_wOJrKTCAkTFkeEuTPzos,4586
|
|
93
|
-
skillanalyzer/utils/file_utils.py,sha256=LT2xwrbqIWaYC-BYAL9zpF6a2xk6QNUVzItvGGJcBn8,2043
|
|
94
|
-
skillanalyzer/utils/logging_config.py,sha256=wJ3HUNmGECgWE9jwz-SSuUMN-xTde6ybF4Yqa8Qrix4,2940
|
|
95
|
-
skillanalyzer/utils/logging_utils.py,sha256=CLdOYmQdJejiLbcECTT2CbDU27PJ327AFMmeuVfCy94,1902
|
|
96
|
-
cisco_ai_skill_scanner-1.0.0.dist-info/METADATA,sha256=oh3eKpG8h_pfWcIDdV4z6aAM38Yz-Pv1ZybReEqhYys,9290
|
|
97
|
-
cisco_ai_skill_scanner-1.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
98
|
-
cisco_ai_skill_scanner-1.0.0.dist-info/entry_points.txt,sha256=IQSseT8ZcU7aaqYdl20wC1-TqKlklZR2Nw609NBQARw,175
|
|
99
|
-
cisco_ai_skill_scanner-1.0.0.dist-info/licenses/LICENSE,sha256=b4va5sK_CWxpeDnOO2MF0MKqsiwU-3YblMmWKnmuWZg,653
|
|
100
|
-
cisco_ai_skill_scanner-1.0.0.dist-info/RECORD,,
|
|
File without changes
|
{cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_orchestrator.py
RENAMED
|
File without changes
|
{skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_response_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|