cisco-ai-skill-scanner 1.0.0__tar.gz → 1.0.1__tar.gz
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 → cisco_ai_skill_scanner-1.0.1}/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/ISSUE_TEMPLATE/feature_request.md +2 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/workflows/python-tests.yml +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.gitignore +2 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/CODEOWNERS +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/PKG-INFO +13 -13
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/README.md +11 -11
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/SECURITY.md +2 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/TESTING.md +4 -4
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/aidefense-analyzer.md +11 -11
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/api-rationale.md +6 -6
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/api-server.md +15 -15
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/architecture.md +8 -8
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/behavioral-analyzer.md +12 -12
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/binary-handling.md +2 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/developing.md +7 -7
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/llm-analyzer.md +9 -10
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/meta-analyzer.md +6 -6
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/quickstart.md +20 -20
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/remote-skills-analysis.md +18 -18
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/docs/threat-taxonomy.md +6 -6
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/EVALUATION_GUIDE.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/README.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/benchmark_runner.py +6 -6
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/eval_runner.py +8 -8
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/prompt-injection/jailbreak-override/SKILL.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills/simple-math/SKILL.md +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/update_expected_findings.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/advanced_scanning.py +8 -8
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/api_usage.py +4 -4
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/basic_scan.py +2 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/batch_scanning.py +4 -4
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/behavioral_analyzer_example.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/integration_example.py +5 -5
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/llm_analyzer_example.py +5 -5
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/examples/programmatic_usage.py +5 -5
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/pyproject.toml +7 -7
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/scripts/pre-commit-hook.sh +15 -15
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/__init__.py +8 -4
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/_version.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/api/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/api/api.py +4 -4
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/api/api_cli.py +7 -7
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/api/api_server.py +6 -6
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/api/router.py +3 -3
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/cli/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/cli/cli.py +11 -11
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/config/__init__.py +3 -3
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/config/config.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/config/config_parser.py +9 -9
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/config/constants.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/__init__.py +3 -3
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/aidefense_analyzer.py +3 -3
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/alignment_llm_client.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/alignment_prompt_builder.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral_analyzer.py +1 -1
- cisco_ai_skill_scanner-1.0.0/skillanalyzer/core/analyzers/cross_skill_analyzer.py → cisco_ai_skill_scanner-1.0.1/skill_scanner/core/analyzers/cross_skill_scanner.py +5 -5
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/llm_analyzer.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/llm_prompt_builder.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/meta_analyzer.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/static.py +8 -8
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/trigger_analyzer.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/exceptions.py +10 -10
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/loader.py +4 -4
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/models.py +6 -6
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/reporters/markdown_reporter.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/reporters/sarif_reporter.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/reporters/table_reporter.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/rules/yara_scanner.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/scanner.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/context_extractor.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/dataflow/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/interprocedural/call_graph_analyzer.py +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/parser/python_parser.py +5 -5
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/boilerplate_protection_rule_prompt.md +5 -5
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/code_alignment_threat_analysis_prompt.md +25 -25
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/skill_meta_analysis_prompt.md +6 -6
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/skill_threat_analysis_prompt.md +11 -11
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/unified_response_schema.md +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/rules/signatures.yaml +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/autonomy_abuse.yara +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/code_execution.yara +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/command_injection.yara +2 -2
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/skill_discovery_abuse.yara +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/tool_chaining_abuse.yara +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/transitive_trust_abuse.yara +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/hooks/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/hooks/pre_commit.py +16 -16
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/threats/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/command_utils.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/di_container.py +1 -1
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/logging_config.py +7 -7
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/__init__.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/behavioral/test_behavioral_analyzer.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/behavioral/test_enhanced_behavioral.py +11 -11
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/static_analysis/test_static_analyzer.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_aidefense_analyzer.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_api_endpoints.py +2 -2
- cisco_ai_skill_scanner-1.0.1/tests/test_api_server_config.py +313 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_cli_formats.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_config.py +17 -17
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_integration.py +10 -10
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_llm_analyzer.py +9 -9
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_loader.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_meta_analyzer.py +20 -20
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_models.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_reporters.py +4 -4
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_scanner.py +2 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_threats.py +1 -1
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_virustotal_analyzer.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_virustotal_benign.py +3 -3
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/test_virustotal_upload.py +4 -4
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/uv.lock +1 -2
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-0-additional-cryptography.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-0-framework-and-languages.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-0-iac-security.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-0-mobile-apps.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-0-supply-chain-security.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-1-crypto-algorithms.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-1-digital-certificates.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.cursor/rules/codeguard-1-hardcoded-credentials.mdc +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.env.example +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/workflows/integration-tests.yml +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/workflows/release.yml +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.pre-commit-config.yaml +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-0-additional-cryptography.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-0-framework-and-languages.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-0-iac-security.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-0-mobile-apps.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-0-supply-chain-security.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-1-crypto-algorithms.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-1-digital-certificates.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.windsurf/rules/codeguard-1-hardcoded-credentials.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/CODE_OF_CONDUCT.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/CONTRIBUTING.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/LICENSE +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/HOW_EVAL_WORKS.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/backdoor/magic-string-trigger/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/backdoor/magic-string-trigger/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/backdoor/magic-string-trigger/process.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/analyze.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/collector.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/encoder.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/behavioral-analysis/multi-file-exfiltration/reporter.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/command-injection/eval-execution/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/command-injection/eval-execution/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/command-injection/eval-execution/calculate.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/data-exfiltration/environment-secrets/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/data-exfiltration/environment-secrets/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/data-exfiltration/environment-secrets/get_info.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/obfuscation/base64-payload/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/obfuscation/base64-payload/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/obfuscation/base64-payload/process.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/path-traversal/file-reader/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/path-traversal/file-reader/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/path-traversal/file-reader/read.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/prompt-injection/jailbreak-override/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/resource-exhaustion/infinite-loop/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/resource-exhaustion/infinite-loop/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/resource-exhaustion/infinite-loop/analyze.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills/simple-math/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills/simple-math/math_ops.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills-2/file-validator/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills-2/file-validator/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/safe-skills-2/file-validator/validate.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/sql-injection/database-query/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/sql-injection/database-query/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/skills/sql-injection/database-query/query.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/eicar-test/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/eicar-test/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/eicar-test/assets/test-binary.bin +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/exfiltrator/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/exfiltrator/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/exfiltrator/analyze.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/malicious/prompt-injection/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/safe/simple-formatter/SKILL.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/safe/simple-formatter/_expected.json +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/evals/test_skills/safe/simple-formatter/formatter.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/base.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/alignment_orchestrator.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/alignment_response_validator.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/llm_provider_config.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/llm_request_handler.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/llm_response_parser.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/analyzers/virustotal_analyzer.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/reporters/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/reporters/json_reporter.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/rules/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/rules/patterns.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/cfg/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/cfg/builder.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/dataflow/forward_analysis.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/interprocedural/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/interprocedural/cross_file_analyzer.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/parser/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/semantic/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/semantic/name_resolver.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/semantic/type_analyzer.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/taint/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/taint/tracker.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/core/static_analysis/types/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/prompts/llm_response_schema.json +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/coercive_injection.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/credential_harvesting.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/prompt_injection.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/script_injection.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/sql_injection.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/system_manipulation.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/data/yara_rules/unicode_steganography.yara +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/threats/threats.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/file_utils.py +0 -0
- {cisco_ai_skill_scanner-1.0.0/skillanalyzer → cisco_ai_skill_scanner-1.0.1/skill_scanner}/utils/logging_utils.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/behavioral/README.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/behavioral/__init__.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/conftest.py +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/static_analysis/README.md +0 -0
- {cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/tests/static_analysis/__init__.py +0 -0
{cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/ISSUE_TEMPLATE/bug_report.md
RENAMED
|
@@ -13,7 +13,7 @@ A clear and concise description of the bug.
|
|
|
13
13
|
## Steps to Reproduce
|
|
14
14
|
|
|
15
15
|
1. Install version: [e.g., 0.2.0]
|
|
16
|
-
2. Run command: `skill-
|
|
16
|
+
2. Run command: `skill-scanner scan ...`
|
|
17
17
|
3. Observe error: [describe what happened]
|
|
18
18
|
|
|
19
19
|
## Expected Behavior
|
|
@@ -29,7 +29,7 @@ Describe a specific scenario where this feature would be useful.
|
|
|
29
29
|
**Example:**
|
|
30
30
|
```bash
|
|
31
31
|
# How the feature would be used
|
|
32
|
-
skill-
|
|
32
|
+
skill-scanner scan /path/to/skill --your-new-feature
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## Benefits
|
|
@@ -53,4 +53,4 @@ Screenshots, mockups, links to similar features in other tools, etc.
|
|
|
53
53
|
- [ ] I have searched existing issues/PRs for similar requests
|
|
54
54
|
- [ ] I have described a clear use case
|
|
55
55
|
- [ ] I have considered implementation complexity
|
|
56
|
-
- [ ] This aligns with the project's goals (security scanning for
|
|
56
|
+
- [ ] This aligns with the project's goals (security scanning for Agent Skills)
|
{cisco_ai_skill_scanner-1.0.0 → cisco_ai_skill_scanner-1.0.1}/.github/workflows/python-tests.yml
RENAMED
|
@@ -79,7 +79,7 @@ jobs:
|
|
|
79
79
|
run: |
|
|
80
80
|
uv run pytest tests/ \
|
|
81
81
|
--ignore=tests/test_llm_analyzer.py \
|
|
82
|
-
-v --tb=short --cov=
|
|
82
|
+
-v --tb=short --cov=skill_scanner --cov-report=xml
|
|
83
83
|
|
|
84
84
|
- name: Upload coverage to Codecov
|
|
85
85
|
uses: codecov/codecov-action@v4
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cisco-ai-skill-scanner
|
|
3
|
-
Version: 1.0.
|
|
4
|
-
Summary: Security scanner for
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Security scanner for Agent Skills packages - Detects prompt injection, data exfiltration, and malicious code
|
|
5
5
|
Project-URL: Homepage, https://github.com/cisco-ai-defense/skill-scanner
|
|
6
6
|
Project-URL: Documentation, https://github.com/cisco-ai-defense/skill-scanner#readme
|
|
7
7
|
Project-URL: Repository, https://github.com/cisco-ai-defense/skill-scanner
|
|
@@ -68,14 +68,14 @@ Description-Content-Type: text/markdown
|
|
|
68
68
|
|
|
69
69
|
A security scanner for AI Agent Skills that detects prompt injection, data exfiltration, and malicious code patterns. Combines **pattern-based detection** (YAML + YARA), **LLM-as-a-judge**, and **behavioral dataflow analysis** for comprehensive threat detection.
|
|
70
70
|
|
|
71
|
-
Supports [
|
|
71
|
+
Supports [OpenAI Codex Skills](https://openai.github.io/codex/) and [Cursor Agent Skills](https://docs.cursor.com/context/rules) formats following the [Agent Skills specification](https://agentskills.io).
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
75
|
## Highlights
|
|
76
76
|
|
|
77
77
|
- **Multi-Engine Detection** - Static analysis, behavioral dataflow, LLM semantic analysis, and cloud-based scanning
|
|
78
|
-
- **False Positive Filtering** - Meta-analyzer
|
|
78
|
+
- **False Positive Filtering** - Meta-analyzer significantly reduces noise while preserving detection capability
|
|
79
79
|
- **CI/CD Ready** - SARIF output for GitHub Code Scanning, exit codes for build failures
|
|
80
80
|
- **Extensible** - Plugin architecture for custom analyzers
|
|
81
81
|
|
|
@@ -151,29 +151,29 @@ export AI_DEFENSE_API_KEY="your_aidefense_api_key"
|
|
|
151
151
|
|
|
152
152
|
```bash
|
|
153
153
|
# Scan a single skill (static analyzer only)
|
|
154
|
-
skill-
|
|
154
|
+
skill-scanner scan /path/to/skill
|
|
155
155
|
|
|
156
156
|
# Scan with behavioral analyzer (dataflow analysis)
|
|
157
|
-
skill-
|
|
157
|
+
skill-scanner scan /path/to/skill --use-behavioral
|
|
158
158
|
|
|
159
159
|
# Scan with all engines
|
|
160
|
-
skill-
|
|
160
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
|
|
161
161
|
|
|
162
162
|
# Scan with meta-analyzer for false positive filtering
|
|
163
|
-
skill-
|
|
163
|
+
skill-scanner scan /path/to/skill --use-llm --enable-meta
|
|
164
164
|
|
|
165
165
|
# Scan multiple skills recursively
|
|
166
|
-
skill-
|
|
166
|
+
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
|
|
167
167
|
|
|
168
168
|
# CI/CD: Fail build if threats found
|
|
169
|
-
skill-
|
|
169
|
+
skill-scanner scan-all ./skills --fail-on-findings --format sarif --output results.sarif
|
|
170
170
|
```
|
|
171
171
|
|
|
172
172
|
### Python SDK
|
|
173
173
|
|
|
174
174
|
```python
|
|
175
|
-
from
|
|
176
|
-
from
|
|
175
|
+
from skill_scanner import SkillScanner
|
|
176
|
+
from skill_scanner.core.analyzers import StaticAnalyzer, BehavioralAnalyzer
|
|
177
177
|
|
|
178
178
|
# Create scanner with analyzers
|
|
179
179
|
scanner = SkillScanner(analyzers=[
|
|
@@ -221,7 +221,7 @@ print(f"Findings: {len(result.findings)}")
|
|
|
221
221
|
## Example Output
|
|
222
222
|
|
|
223
223
|
```
|
|
224
|
-
$ skill-
|
|
224
|
+
$ skill-scanner scan ./my-skill --use-behavioral
|
|
225
225
|
|
|
226
226
|
============================================================
|
|
227
227
|
Skill: my-skill
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
A security scanner for AI Agent Skills that detects prompt injection, data exfiltration, and malicious code patterns. Combines **pattern-based detection** (YAML + YARA), **LLM-as-a-judge**, and **behavioral dataflow analysis** for comprehensive threat detection.
|
|
12
12
|
|
|
13
|
-
Supports [
|
|
13
|
+
Supports [OpenAI Codex Skills](https://openai.github.io/codex/) and [Cursor Agent Skills](https://docs.cursor.com/context/rules) formats following the [Agent Skills specification](https://agentskills.io).
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
## Highlights
|
|
18
18
|
|
|
19
19
|
- **Multi-Engine Detection** - Static analysis, behavioral dataflow, LLM semantic analysis, and cloud-based scanning
|
|
20
|
-
- **False Positive Filtering** - Meta-analyzer
|
|
20
|
+
- **False Positive Filtering** - Meta-analyzer significantly reduces noise while preserving detection capability
|
|
21
21
|
- **CI/CD Ready** - SARIF output for GitHub Code Scanning, exit codes for build failures
|
|
22
22
|
- **Extensible** - Plugin architecture for custom analyzers
|
|
23
23
|
|
|
@@ -93,29 +93,29 @@ export AI_DEFENSE_API_KEY="your_aidefense_api_key"
|
|
|
93
93
|
|
|
94
94
|
```bash
|
|
95
95
|
# Scan a single skill (static analyzer only)
|
|
96
|
-
skill-
|
|
96
|
+
skill-scanner scan /path/to/skill
|
|
97
97
|
|
|
98
98
|
# Scan with behavioral analyzer (dataflow analysis)
|
|
99
|
-
skill-
|
|
99
|
+
skill-scanner scan /path/to/skill --use-behavioral
|
|
100
100
|
|
|
101
101
|
# Scan with all engines
|
|
102
|
-
skill-
|
|
102
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
|
|
103
103
|
|
|
104
104
|
# Scan with meta-analyzer for false positive filtering
|
|
105
|
-
skill-
|
|
105
|
+
skill-scanner scan /path/to/skill --use-llm --enable-meta
|
|
106
106
|
|
|
107
107
|
# Scan multiple skills recursively
|
|
108
|
-
skill-
|
|
108
|
+
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
|
|
109
109
|
|
|
110
110
|
# CI/CD: Fail build if threats found
|
|
111
|
-
skill-
|
|
111
|
+
skill-scanner scan-all ./skills --fail-on-findings --format sarif --output results.sarif
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
### Python SDK
|
|
115
115
|
|
|
116
116
|
```python
|
|
117
|
-
from
|
|
118
|
-
from
|
|
117
|
+
from skill_scanner import SkillScanner
|
|
118
|
+
from skill_scanner.core.analyzers import StaticAnalyzer, BehavioralAnalyzer
|
|
119
119
|
|
|
120
120
|
# Create scanner with analyzers
|
|
121
121
|
scanner = SkillScanner(analyzers=[
|
|
@@ -163,7 +163,7 @@ print(f"Findings: {len(result.findings)}")
|
|
|
163
163
|
## Example Output
|
|
164
164
|
|
|
165
165
|
```
|
|
166
|
-
$ skill-
|
|
166
|
+
$ skill-scanner scan ./my-skill --use-behavioral
|
|
167
167
|
|
|
168
168
|
============================================================
|
|
169
169
|
Skill: my-skill
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
## Reporting a Vulnerability
|
|
11
11
|
|
|
12
|
-
We take security seriously. If you discover a security vulnerability in the Skill
|
|
12
|
+
We take security seriously. If you discover a security vulnerability in the Skill Scanner, please report it responsibly.
|
|
13
13
|
|
|
14
14
|
### How to Report
|
|
15
15
|
|
|
@@ -81,7 +81,7 @@ When using the analyzer:
|
|
|
81
81
|
|
|
82
82
|
## Security Scanning
|
|
83
83
|
|
|
84
|
-
This tool scans
|
|
84
|
+
This tool scans agent skills for security threats. It is not a substitute for:
|
|
85
85
|
- Manual security review
|
|
86
86
|
- Penetration testing
|
|
87
87
|
- Compliance audits
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Testing Guide
|
|
2
2
|
|
|
3
|
-
This document covers testing requirements and procedures for contributing to the Skill
|
|
3
|
+
This document covers testing requirements and procedures for contributing to the Skill Scanner.
|
|
4
4
|
|
|
5
5
|
## Quick Reference
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ This document covers testing requirements and procedures for contributing to the
|
|
|
9
9
|
uv run pytest tests/ -v
|
|
10
10
|
|
|
11
11
|
# Run tests with coverage
|
|
12
|
-
uv run pytest tests/ --cov=
|
|
12
|
+
uv run pytest tests/ --cov=skill_scanner --cov-report=html
|
|
13
13
|
|
|
14
14
|
# Run evaluation benchmark
|
|
15
15
|
uv run python evals/benchmark_runner.py
|
|
@@ -103,7 +103,7 @@ For detailed evaluation documentation, see [evals/README.md](/evals/README.md).
|
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
105
|
# Generate HTML coverage report
|
|
106
|
-
uv run pytest tests/ --cov=
|
|
106
|
+
uv run pytest tests/ --cov=skill_scanner --cov-report=html
|
|
107
107
|
|
|
108
108
|
# View report (opens in browser)
|
|
109
109
|
open htmlcov/index.html # macOS
|
|
@@ -123,7 +123,7 @@ xdg-open htmlcov/index.html # Linux
|
|
|
123
123
|
```python
|
|
124
124
|
# tests/test_example.py
|
|
125
125
|
import pytest
|
|
126
|
-
from
|
|
126
|
+
from skill_scanner.core.scanner import SkillScanner
|
|
127
127
|
|
|
128
128
|
class TestExampleFeature:
|
|
129
129
|
"""Tests for example feature."""
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
The AI Defense Analyzer integrates with Cisco AI Defense API to provide enterprise-grade security scanning for
|
|
5
|
+
The AI Defense Analyzer integrates with Cisco AI Defense API to provide enterprise-grade security scanning for Agent Skills. It analyzes prompts, instructions, markdown content, and code files for threats including prompt injection, data exfiltration, and malicious patterns.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -56,23 +56,23 @@ echo "AI_DEFENSE_API_KEY=your_key" >> .env
|
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
# Enable AI Defense analyzer
|
|
59
|
-
skill-
|
|
59
|
+
skill-scanner scan /path/to/skill --use-aidefense
|
|
60
60
|
|
|
61
61
|
# Provide API key directly
|
|
62
|
-
skill-
|
|
62
|
+
skill-scanner scan /path/to/skill --use-aidefense --aidefense-api-key your_key
|
|
63
63
|
|
|
64
64
|
# Combine with other analyzers
|
|
65
|
-
skill-
|
|
65
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
|
|
66
66
|
|
|
67
67
|
# Scan multiple skills
|
|
68
|
-
skill-
|
|
68
|
+
skill-scanner scan-all /path/to/skills --recursive --use-aidefense
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
### Python API
|
|
72
72
|
|
|
73
73
|
```python
|
|
74
|
-
from
|
|
75
|
-
from
|
|
74
|
+
from skill_scanner.core.analyzers import AIDefenseAnalyzer
|
|
75
|
+
from skill_scanner.core.loader import load_skill
|
|
76
76
|
|
|
77
77
|
# Initialize analyzer with default rules
|
|
78
78
|
analyzer = AIDefenseAnalyzer(
|
|
@@ -82,7 +82,7 @@ analyzer = AIDefenseAnalyzer(
|
|
|
82
82
|
)
|
|
83
83
|
|
|
84
84
|
# Initialize with custom rules
|
|
85
|
-
from
|
|
85
|
+
from skill_scanner.core.analyzers.aidefense_analyzer import DEFAULT_ENABLED_RULES
|
|
86
86
|
|
|
87
87
|
custom_rules = [
|
|
88
88
|
{"rule_name": "Prompt Injection"},
|
|
@@ -112,8 +112,8 @@ findings = asyncio.run(scan_skill())
|
|
|
112
112
|
### Integration with Scanner
|
|
113
113
|
|
|
114
114
|
```python
|
|
115
|
-
from
|
|
116
|
-
from
|
|
115
|
+
from skill_scanner import SkillScanner
|
|
116
|
+
from skill_scanner.core.analyzers import StaticAnalyzer, AIDefenseAnalyzer
|
|
117
117
|
|
|
118
118
|
# Combine analyzers
|
|
119
119
|
analyzers = [
|
|
@@ -169,7 +169,7 @@ For comprehensive coverage, combine AI Defense with other analyzers:
|
|
|
169
169
|
|
|
170
170
|
```bash
|
|
171
171
|
# Maximum coverage
|
|
172
|
-
skill-
|
|
172
|
+
skill-scanner scan /path/to/skill \
|
|
173
173
|
--use-behavioral \
|
|
174
174
|
--use-llm \
|
|
175
175
|
--use-aidefense \
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# API Server Rationale
|
|
2
2
|
|
|
3
|
-
## Question: Is an API Server Necessary for Skill
|
|
3
|
+
## Question: Is an API Server Necessary for Skill Scanner?
|
|
4
4
|
|
|
5
|
-
Unlike MCP Scanner, which scans **remote MCP servers** (HTTP/SSE/stdio connections), Skill
|
|
5
|
+
Unlike MCP Scanner, which scans **remote MCP servers** (HTTP/SSE/stdio connections), Skill Scanner scans **local skill packages** (files/directories). While an API server is less critical for Skill Scanner, it can provide additional support for CI/CD integration, web interfaces, service integrations, and batch processing. Read below for more details.
|
|
6
6
|
|
|
7
7
|
## Analysis
|
|
8
8
|
|
|
@@ -13,12 +13,12 @@ Unlike MCP Scanner, which scans **remote MCP servers** (HTTP/SSE/stdio connectio
|
|
|
13
13
|
- API server enables scanning servers you don't control
|
|
14
14
|
- Essential for the use case (scanning external services)
|
|
15
15
|
|
|
16
|
-
**Skill
|
|
16
|
+
**Skill Scanner:**
|
|
17
17
|
- Scans **local** skill packages (files/directories)
|
|
18
18
|
- Skills are **always local** - there are no remote skills (unlike MCP servers)
|
|
19
19
|
- Skills are distributed as ZIP files or directories that users install locally
|
|
20
20
|
- Can be scanned directly via CLI or Python SDK
|
|
21
|
-
- **Key Point**: Remote
|
|
21
|
+
- **Key Point**: Remote skills do not exist - skills are local file packages
|
|
22
22
|
|
|
23
23
|
### Use Cases Where API is Valuable
|
|
24
24
|
|
|
@@ -95,9 +95,9 @@ Despite skills being local files, an API server provides value for:
|
|
|
95
95
|
|
|
96
96
|
## Conclusion
|
|
97
97
|
|
|
98
|
-
**Critical Finding**: Remote
|
|
98
|
+
**Critical Finding**: Remote skills **do not exist**. Skills are local file packages that users install on their machines, not remote services like MCP servers.
|
|
99
99
|
|
|
100
|
-
While the API server is **less critical** for Skill
|
|
100
|
+
While the API server is **less critical** for Skill Scanner than for MCP Scanner (since there are no remote skills to scan), it still provides value for:
|
|
101
101
|
- CI/CD integration (uploading skill ZIP files)
|
|
102
102
|
- Web interfaces (uploading skill packages)
|
|
103
103
|
- Service integrations (HTTP-based workflows)
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
The Skill
|
|
5
|
+
The Skill Scanner API Server provides a REST interface for uploading and scanning Agent Skills packages, enabling integration with web applications, CI/CD pipelines, and other services.
|
|
6
6
|
|
|
7
7
|
**Key Points**:
|
|
8
|
-
- **Skills are local packages**:
|
|
8
|
+
- **Skills are local packages**: Skills are local file packages that users install on their machines, not remote services
|
|
9
9
|
- **API enables uploads**: The API allows uploading skill ZIP files for scanning via HTTP
|
|
10
10
|
- **For integration workflows**: Useful for CI/CD, web interfaces, and service integrations
|
|
11
11
|
- **CLI is primary**: For most use cases, the CLI is the recommended interface
|
|
@@ -21,22 +21,22 @@ The Skill Analyzer API Server provides a REST interface for uploading and scanni
|
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
23
|
# Start server (default: 0.0.0.0:8000)
|
|
24
|
-
skill-
|
|
24
|
+
skill-scanner-api
|
|
25
25
|
|
|
26
26
|
# Custom port
|
|
27
|
-
skill-
|
|
27
|
+
skill-scanner-api --port 8080
|
|
28
28
|
|
|
29
29
|
# Development mode with auto-reload
|
|
30
|
-
skill-
|
|
30
|
+
skill-scanner-api --reload
|
|
31
31
|
|
|
32
32
|
# Custom host and port
|
|
33
|
-
skill-
|
|
33
|
+
skill-scanner-api --host 127.0.0.1 --port 9000
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
### Programmatic
|
|
37
37
|
|
|
38
38
|
```python
|
|
39
|
-
from
|
|
39
|
+
from skill_scanner.api_server import run_server
|
|
40
40
|
|
|
41
41
|
run_server(host="0.0.0.0", port=8000, reload=False)
|
|
42
42
|
```
|
|
@@ -410,7 +410,7 @@ jobs:
|
|
|
410
410
|
- name: Start API Server
|
|
411
411
|
run: |
|
|
412
412
|
pip install -r requirements.txt
|
|
413
|
-
skill-
|
|
413
|
+
skill-scanner-api &
|
|
414
414
|
sleep 5
|
|
415
415
|
|
|
416
416
|
- name: Scan Skills
|
|
@@ -452,20 +452,20 @@ WORKDIR /app
|
|
|
452
452
|
COPY requirements.txt .
|
|
453
453
|
RUN pip install -r requirements.txt
|
|
454
454
|
|
|
455
|
-
COPY
|
|
455
|
+
COPY skill_scanner/ ./skill_scanner/
|
|
456
456
|
|
|
457
457
|
EXPOSE 8000
|
|
458
458
|
|
|
459
|
-
CMD ["python", "-m", "
|
|
459
|
+
CMD ["python", "-m", "skill_scanner.api_cli", "--host", "0.0.0.0", "--port", "8000"]
|
|
460
460
|
```
|
|
461
461
|
|
|
462
462
|
```bash
|
|
463
463
|
# Build and run
|
|
464
|
-
docker build -t skill-
|
|
464
|
+
docker build -t skill-scanner-api .
|
|
465
465
|
docker run -p 8000:8000 \
|
|
466
466
|
-e SKILL_SCANNER_LLM_API_KEY=your_key \
|
|
467
467
|
-e SKILL_SCANNER_LLM_MODEL=claude-3-5-sonnet-20241022 \
|
|
468
|
-
skill-
|
|
468
|
+
skill-scanner-api
|
|
469
469
|
```
|
|
470
470
|
|
|
471
471
|
## Error Handling
|
|
@@ -547,7 +547,7 @@ Run behind reverse proxy (nginx, Caddy) with TLS:
|
|
|
547
547
|
```nginx
|
|
548
548
|
server {
|
|
549
549
|
listen 443 ssl;
|
|
550
|
-
server_name api.
|
|
550
|
+
server_name api.skill_scanner.com;
|
|
551
551
|
|
|
552
552
|
ssl_certificate /path/to/cert.pem;
|
|
553
553
|
ssl_certificate_key /path/to/key.pem;
|
|
@@ -604,7 +604,7 @@ Instrumentator().instrument(app).expose(app)
|
|
|
604
604
|
lsof -i :8000
|
|
605
605
|
|
|
606
606
|
# Try different port
|
|
607
|
-
skill-
|
|
607
|
+
skill-scanner-api --port 8080
|
|
608
608
|
```
|
|
609
609
|
|
|
610
610
|
### LLM analyzer not available
|
|
@@ -626,4 +626,4 @@ export SKILL_SCANNER_LLM_MODEL=claude-3-5-sonnet-20241022
|
|
|
626
626
|
|
|
627
627
|
## Conclusion
|
|
628
628
|
|
|
629
|
-
The API server makes the Skill
|
|
629
|
+
The API server makes the Skill Scanner accessible to any application or service, enabling automated security scanning at scale. Combined with the LLM analyzer, it provides powerful threat detection capabilities through a simple REST interface. Supports Codex Skills and Cursor Agent Skills formats.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Skill
|
|
1
|
+
# Skill Scanner Architecture
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
The Skill
|
|
5
|
+
The Skill Scanner is built with a modular, extensible architecture for Agent Skills security analysis. It supports the Agent Skills specification format used by OpenAI Codex Skills and Cursor Agent Skills. This document describes the system design, data flow, and key components.
|
|
6
6
|
|
|
7
7
|
**Structure**: Organized by component (core/, config/, data/, threats/, cli/, api/)
|
|
8
8
|
**Coverage**: Static analysis (YAML + YARA), LLM analysis, Behavioral dataflow analysis
|
|
@@ -64,7 +64,7 @@ graph TB
|
|
|
64
64
|
|
|
65
65
|
Defines the core data structures:
|
|
66
66
|
|
|
67
|
-
- **`Skill`**: Represents a complete
|
|
67
|
+
- **`Skill`**: Represents a complete Agent Skill package
|
|
68
68
|
- `directory`: Path to skill package
|
|
69
69
|
- `manifest`: Parsed YAML frontmatter
|
|
70
70
|
- `instruction_body`: Markdown instructions
|
|
@@ -256,7 +256,7 @@ Command-line interface built with `argparse`.
|
|
|
256
256
|
### Single Skill Scan Flow
|
|
257
257
|
|
|
258
258
|
```
|
|
259
|
-
1. User runs: skill-
|
|
259
|
+
1. User runs: skill-scanner scan /path/to/skill
|
|
260
260
|
|
|
261
261
|
2. CLI parses arguments → calls scan_command()
|
|
262
262
|
|
|
@@ -287,7 +287,7 @@ Command-line interface built with `argparse`.
|
|
|
287
287
|
### Multi-Skill Scan Flow
|
|
288
288
|
|
|
289
289
|
```
|
|
290
|
-
1. User runs: skill-
|
|
290
|
+
1. User runs: skill-scanner scan-all /path/to/skills
|
|
291
291
|
|
|
292
292
|
2. Scanner.scan_directory()
|
|
293
293
|
├─→ Find all skill packages (SKILL.md files)
|
|
@@ -316,7 +316,7 @@ Command-line interface built with `argparse`.
|
|
|
316
316
|
Example:
|
|
317
317
|
|
|
318
318
|
```python
|
|
319
|
-
from
|
|
319
|
+
from skill_scanner.analyzers.base import BaseAnalyzer
|
|
320
320
|
|
|
321
321
|
class LLMAnalyzer(BaseAnalyzer):
|
|
322
322
|
def __init__(self):
|
|
@@ -331,7 +331,7 @@ class LLMAnalyzer(BaseAnalyzer):
|
|
|
331
331
|
|
|
332
332
|
### Adding New Rules
|
|
333
333
|
|
|
334
|
-
Edit `
|
|
334
|
+
Edit `skill_scanner/data/rules/signatures.yaml`:
|
|
335
335
|
|
|
336
336
|
```yaml
|
|
337
337
|
- id: MY_CUSTOM_RULE
|
|
@@ -477,4 +477,4 @@ FastAPI Server
|
|
|
477
477
|
|
|
478
478
|
## Conclusion
|
|
479
479
|
|
|
480
|
-
The Skill
|
|
480
|
+
The Skill Scanner is designed with modularity, extensibility, and security in mind. The current static analysis foundation provides a solid base for future enhancements including semantic analysis, behavioral monitoring, and enterprise features. It supports Codex Skills and Cursor Agent Skills formats, which follow the Agent Skills specification.
|
|
@@ -36,7 +36,7 @@ Finding Generation
|
|
|
36
36
|
|
|
37
37
|
### 1. AST Parser
|
|
38
38
|
|
|
39
|
-
**Module**: `
|
|
39
|
+
**Module**: `skill_scanner/core/static_analysis/parser/python_parser.py`
|
|
40
40
|
|
|
41
41
|
**Functionality**:
|
|
42
42
|
- Parses Python source into Abstract Syntax Tree
|
|
@@ -51,7 +51,7 @@ Finding Generation
|
|
|
51
51
|
|
|
52
52
|
**Example**:
|
|
53
53
|
```python
|
|
54
|
-
from
|
|
54
|
+
from skill_scanner.core.static_analysis.parser import PythonParser
|
|
55
55
|
|
|
56
56
|
parser = PythonParser(source_code)
|
|
57
57
|
if parser.parse():
|
|
@@ -63,7 +63,7 @@ if parser.parse():
|
|
|
63
63
|
|
|
64
64
|
### 2. Forward Dataflow Analysis (CFG-Based)
|
|
65
65
|
|
|
66
|
-
**Module**: `
|
|
66
|
+
**Module**: `skill_scanner/core/static_analysis/dataflow/forward_analysis.py`
|
|
67
67
|
|
|
68
68
|
**Functionality**:
|
|
69
69
|
- **CFG-based dataflow analysis** using Control Flow Graph and fixpoint algorithm
|
|
@@ -83,8 +83,8 @@ if parser.parse():
|
|
|
83
83
|
|
|
84
84
|
**Example**:
|
|
85
85
|
```python
|
|
86
|
-
from
|
|
87
|
-
from
|
|
86
|
+
from skill_scanner.core.static_analysis.dataflow import ForwardDataflowAnalysis
|
|
87
|
+
from skill_scanner.core.static_analysis.parser.python_parser import PythonParser
|
|
88
88
|
|
|
89
89
|
parser = PythonParser(source_code)
|
|
90
90
|
parser.parse()
|
|
@@ -102,7 +102,7 @@ for flow in flows:
|
|
|
102
102
|
|
|
103
103
|
### 3. Context Extractor
|
|
104
104
|
|
|
105
|
-
**Module**: `
|
|
105
|
+
**Module**: `skill_scanner/core/static_analysis/context_extractor.py`
|
|
106
106
|
|
|
107
107
|
**Functionality**:
|
|
108
108
|
- Combines AST parser + dataflow tracker
|
|
@@ -154,8 +154,8 @@ reporter.py: Sends to attacker.com
|
|
|
154
154
|
### Python API
|
|
155
155
|
|
|
156
156
|
```python
|
|
157
|
-
from
|
|
158
|
-
from
|
|
157
|
+
from skill_scanner.core.analyzers import BehavioralAnalyzer
|
|
158
|
+
from skill_scanner.core.scanner import SkillScanner
|
|
159
159
|
|
|
160
160
|
# Create analyzer (static analysis mode by default)
|
|
161
161
|
behavioral = BehavioralAnalyzer(use_static_analysis=True)
|
|
@@ -169,7 +169,7 @@ result = scanner.scan_skill("/path/to/skill")
|
|
|
169
169
|
|
|
170
170
|
```bash
|
|
171
171
|
# Behavioral analyzer is included by default in static analyzer
|
|
172
|
-
skill-
|
|
172
|
+
skill-scanner scan /path/to/skill
|
|
173
173
|
|
|
174
174
|
# Results include behavioral findings (BEHAVIOR_* rule IDs)
|
|
175
175
|
```
|
|
@@ -303,8 +303,8 @@ def process(user_input):
|
|
|
303
303
|
|
|
304
304
|
## Technical References
|
|
305
305
|
|
|
306
|
-
- Implementation: `
|
|
307
|
-
- AST Parser: `
|
|
308
|
-
- Dataflow: `
|
|
306
|
+
- Implementation: `skill_scanner/core/analyzers/behavioral_analyzer.py`
|
|
307
|
+
- AST Parser: `skill_scanner/core/static_analysis/parser/`
|
|
308
|
+
- Dataflow: `skill_scanner/core/static_analysis/dataflow/`
|
|
309
309
|
- Tests: `tests/test_enhanced_behavioral.py`
|
|
310
310
|
- Complex eval: `evals/skills/behavioral-analysis/multi-file-exfiltration/`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Binary File Handling in
|
|
1
|
+
# Binary File Handling in Agent Skills
|
|
2
2
|
|
|
3
3
|
## Current Behavior
|
|
4
4
|
|
|
@@ -23,7 +23,7 @@ When the scanner finds binary files in a skill package:
|
|
|
23
23
|
1. **Unauditable** - Can't read/inspect the code
|
|
24
24
|
2. **Platform-specific malware** - Could be trojans, keyloggers, ransomware
|
|
25
25
|
3. **Obfuscation** - Hides malicious behavior
|
|
26
|
-
4. **Execution risk** - Could be run by user or
|
|
26
|
+
4. **Execution risk** - Could be run by user or agent
|
|
27
27
|
5. **Supply chain attack** - Common malware delivery method
|
|
28
28
|
|
|
29
29
|
**Example threat:**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Development Guide
|
|
2
2
|
|
|
3
|
-
This guide covers setting up your development environment, running tests, and contributing code to the Skill
|
|
3
|
+
This guide covers setting up your development environment, running tests, and contributing code to the Skill Scanner.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
@@ -69,7 +69,7 @@ uv run pytest tests/test_scanner.py -v
|
|
|
69
69
|
uv run pytest tests/test_scanner.py::test_scan_safe_skill -v
|
|
70
70
|
|
|
71
71
|
# Run with coverage report
|
|
72
|
-
uv run pytest tests/ -v --tb=short --cov=
|
|
72
|
+
uv run pytest tests/ -v --tb=short --cov=skill_scanner --cov-report=html
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
For detailed testing requirements, see [TESTING.md](/TESTING.md).
|
|
@@ -99,7 +99,7 @@ This runs:
|
|
|
99
99
|
## Project Structure
|
|
100
100
|
|
|
101
101
|
```
|
|
102
|
-
|
|
102
|
+
skill_scanner/
|
|
103
103
|
├── __init__.py
|
|
104
104
|
├── api/ # FastAPI REST endpoints
|
|
105
105
|
├── cli/ # Click CLI interface
|
|
@@ -131,16 +131,16 @@ evals/
|
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
133
|
# Static analysis only (default)
|
|
134
|
-
skill-
|
|
134
|
+
skill-scanner scan /path/to/skill
|
|
135
135
|
|
|
136
136
|
# With behavioral analysis
|
|
137
|
-
skill-
|
|
137
|
+
skill-scanner scan /path/to/skill --use-behavioral
|
|
138
138
|
|
|
139
139
|
# With LLM analysis (requires API key)
|
|
140
|
-
skill-
|
|
140
|
+
skill-scanner scan /path/to/skill --use-llm
|
|
141
141
|
|
|
142
142
|
# All analyzers
|
|
143
|
-
skill-
|
|
143
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-virustotal
|
|
144
144
|
```
|
|
145
145
|
|
|
146
146
|
## Versioning
|