attacklm 0.8.0__tar.gz → 0.8.2__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.
- {attacklm-0.8.0 → attacklm-0.8.2}/.gitignore +5 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/CHANGELOG.md +17 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/PKG-INFO +138 -168
- attacklm-0.8.2/README.md +208 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/pyproject.toml +1 -1
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/convert_to_gguf.py +6 -3
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/init_pipeline.py +346 -80
- attacklm-0.8.2/scripts/package_dataset.py +258 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/train_template.py +22 -0
- attacklm-0.8.2/src/attacklm/__version__.py +1 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/cli.py +26 -4
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_init_pipeline.py +255 -13
- attacklm-0.8.0/QA_BEFORE_RELEASES.md +0 -249
- attacklm-0.8.0/README.md +0 -238
- attacklm-0.8.0/REPLAY_PLAN.md +0 -209
- attacklm-0.8.0/data/datasets/buckets/ATTRIBUTION.md +0 -65
- attacklm-0.8.0/data/datasets/buckets/GEMINI_RESEARCH_2026-06-11.md +0 -491
- attacklm-0.8.0/notes/BLUE_TEAM_DESIGN_v0.5.0.md +0 -792
- attacklm-0.8.0/notes/EVAL_DESIGN_v0.4.0.md +0 -1098
- attacklm-0.8.0/notes/STEERING_REVIEW_v0.4.0.md +0 -793
- attacklm-0.8.0/src/attacklm/__version__.py +0 -1
- {attacklm-0.8.0 → attacklm-0.8.2}/.github/workflows/release.yml +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/ATTRIBUTION.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/CONTRIBUTING.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/EVALUATION.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/LICENSE +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/MANIFEST.in +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/Makefile +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/NOTICE +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/README.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/pyproject.toml +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/__init__.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/app.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/cli.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/presets.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/runner.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/__init__.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/command_forms.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/main_menu.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/train_form.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/train_live.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/widgets/__init__.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/tests/test_gui.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/ATTRIBUTION.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/LEGAL.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/REMOVAL.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/bench/questions.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/bench/speed_context.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/acquisition_report.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/manifest.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/README.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/_index.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/collection/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/discovery/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/execution/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/exfiltration/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/persistence/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/orchestrator/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/azure-pyrit/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/azure-pyrit/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/cyberark-fuzzyai/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/cyberark-fuzzyai/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/defensive/detection_engineering/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/cloud/attacks/data_llm.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/ics/attacks/data_llm.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/social_engineering/phishing/data_llm.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/wireless/attacks/data_llm.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/collection/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/credential_access/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/defense_evasion/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/discovery/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/execution/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/lateral_movement/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/persistence/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/privilege_escalation/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/tools/metasploit/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/base/discovery/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/collection/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/discovery/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/execution/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/exfiltration/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/persistence/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/defensive/threat_hunting/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/defensive/incident_response/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/ai/jailbreaking/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/ai/prompt-injection/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/ai/prompt-injection/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_code.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_conversation.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_factual.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_reasoning.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/defensive/detection_engineering/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/defensive/detection_engineering/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/LICENSE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/SOURCE.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/defensive/threat_hunting/data.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/golden/prompts.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/reference/prompts.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/opsec_aware.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/opsec_unaware.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/succinct.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/verbose.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/experiments/README.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/experiments/synthetic_dataset_mutator_evol_instruct.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/.gitattributes +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/README.md +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/data/manifest.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/dataset_infos.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/scripts/build_hf_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hf/scripts/push_to_hf.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/.gitkeep +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/hpo_state.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/hpo_trial_dataset.jsonl +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/logs/.gitkeep +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/pipeline.example.yaml +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/presets/blue-team.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/presets/purple-team.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/presets/red-team.json +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/requirements.txt +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/_eval_loader.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_cloud_attack_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_ics_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_phishing_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_red_team_tactics.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_replay_general.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_supply_chain_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_web_attack_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_wireless_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/audit_dataset.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/balance_buckets.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/bucket_loader.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/build.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/clone_repos.sh +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/collect_reference.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/compare_scores.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/demo.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/device_utils.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/domain_bench.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/eval_retention.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_ai_tools_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_atomic_red_team_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_by_tactic.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_caldera_plugins_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_elastic_rules.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_infection_monkey_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_mordor.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_nist_ir.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_rta_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_sigma_defensive.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_splunk_content.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_threathunter_playbook.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/generate_synthetic_scarce.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/golden_vectors.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/hpo_runner.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/import_gguf.sh +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/import_to_lmstudio.sh +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/infer.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/merge_adapter.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/mitre_tactic_lookup.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/parse_metasploit_to_jsonl.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/pipeline.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/rebuild_manifest.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/register_ollama.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/reorganize_buckets.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/replay_mixer.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/score_candidates.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/setup_buckets.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/speed_bench.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/steering.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/scripts/train_all.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/__init__.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/_project_root.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_balance_buckets.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_collect_reference.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_compare_scores.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_domain_bench.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_eval_loader.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_eval_retention.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_golden_vectors.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_replay_mixer.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_score_candidates.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_speed_bench.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_steering.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_thinking_models.py +0 -0
- {attacklm-0.8.0 → attacklm-0.8.2}/uv.lock +0 -0
|
@@ -129,6 +129,9 @@ dmypy.json
|
|
|
129
129
|
notes.md
|
|
130
130
|
HANDOFF.md
|
|
131
131
|
TASKS.md
|
|
132
|
+
REPLAY_PLAN.md
|
|
133
|
+
QA_BEFORE_RELEASES.md
|
|
134
|
+
notes/
|
|
132
135
|
|
|
133
136
|
# ============================================================================
|
|
134
137
|
# GENERATED / REGENERABLE DATA — excluded (users generate these themselves)
|
|
@@ -220,3 +223,5 @@ hf/data/*.parquet
|
|
|
220
223
|
# All archive contents are preserved locally but never pushed to remote.
|
|
221
224
|
archive/
|
|
222
225
|
unsloth_compiled_cache/
|
|
226
|
+
data/datasets/buckets/ATTRIBUTION.md
|
|
227
|
+
data/datasets/buckets/GEMINI_RESEARCH_2026-06-11.md
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.8.1] — 2026-06-30 — Zero-config dataset init
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Zero-config init**: `attacklm init` now downloads a pre-built dataset tarball (~50 MB) from GitHub releases by default. No git clone, no extractors, no manual setup required.
|
|
7
|
+
- **`--from-source` flag**: `attacklm init --from-source` preserves the old clone+extract pipeline for developers who want to rebuild from upstream repos.
|
|
8
|
+
- **`--dataset-url` flag**: Override the download URL for mirrors or custom dataset hosting.
|
|
9
|
+
- **`scripts/package_dataset.py`**: Maintainer tool to create the dataset tarball for GitHub releases.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- **`attacklm init` default**: Downloads pre-built dataset instead of cloning repos. Two commands to ready: `uv pip install attacklm[all]` → `attacklm init --yes`.
|
|
13
|
+
- **Dependencies**: Removed `gitpython` from extract deps (no longer needed for default init path). Added `tqdm` for download progress bars.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **v0.8.0 tag**: Force-pushed tag replaced with proper v0.8.1 release (tag immutability rule enforced).
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
3
20
|
All notable changes to AttackLM are documented in this file. Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
21
|
|
|
5
22
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attacklm
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.2
|
|
4
4
|
Summary: QLoRA-fine-tuned Qwen2.5-Coder for offensive/defensive security and AI red-teaming
|
|
5
5
|
Project-URL: Homepage, https://github.com/Veedubin/AttackLM
|
|
6
6
|
Project-URL: Repository, https://github.com/Veedubin/AttackLM
|
|
@@ -27,7 +27,6 @@ Requires-Dist: accelerate==1.14.0; extra == 'all'
|
|
|
27
27
|
Requires-Dist: bitsandbytes==0.49.2; extra == 'all'
|
|
28
28
|
Requires-Dist: datasets==5.0.0; extra == 'all'
|
|
29
29
|
Requires-Dist: gguf; extra == 'all'
|
|
30
|
-
Requires-Dist: gitpython; extra == 'all'
|
|
31
30
|
Requires-Dist: huggingface-hub==1.18.0; extra == 'all'
|
|
32
31
|
Requires-Dist: ipython; extra == 'all'
|
|
33
32
|
Requires-Dist: kernels<0.14,>=0.12; extra == 'all'
|
|
@@ -43,6 +42,7 @@ Requires-Dist: scipy>=1.11; extra == 'all'
|
|
|
43
42
|
Requires-Dist: tokenizers==0.22.2; extra == 'all'
|
|
44
43
|
Requires-Dist: torch==2.12.0; extra == 'all'
|
|
45
44
|
Requires-Dist: torchvision==0.27.0; extra == 'all'
|
|
45
|
+
Requires-Dist: tqdm; extra == 'all'
|
|
46
46
|
Requires-Dist: transformers==5.12.1; extra == 'all'
|
|
47
47
|
Requires-Dist: trl==1.5.1; extra == 'all'
|
|
48
48
|
Provides-Extra: all-cuda
|
|
@@ -50,7 +50,6 @@ Requires-Dist: accelerate==1.14.0; extra == 'all-cuda'
|
|
|
50
50
|
Requires-Dist: bitsandbytes==0.49.2; extra == 'all-cuda'
|
|
51
51
|
Requires-Dist: datasets==5.0.0; extra == 'all-cuda'
|
|
52
52
|
Requires-Dist: gguf; extra == 'all-cuda'
|
|
53
|
-
Requires-Dist: gitpython; extra == 'all-cuda'
|
|
54
53
|
Requires-Dist: huggingface-hub==1.18.0; extra == 'all-cuda'
|
|
55
54
|
Requires-Dist: kernels<0.14,>=0.12; extra == 'all-cuda'
|
|
56
55
|
Requires-Dist: llama-cpp-python; extra == 'all-cuda'
|
|
@@ -61,6 +60,7 @@ Requires-Dist: safetensors==0.7.0; extra == 'all-cuda'
|
|
|
61
60
|
Requires-Dist: tokenizers==0.22.2; extra == 'all-cuda'
|
|
62
61
|
Requires-Dist: torch==2.12.0; extra == 'all-cuda'
|
|
63
62
|
Requires-Dist: torchvision==0.27.0; extra == 'all-cuda'
|
|
63
|
+
Requires-Dist: tqdm; extra == 'all-cuda'
|
|
64
64
|
Requires-Dist: transformers==5.12.1; extra == 'all-cuda'
|
|
65
65
|
Requires-Dist: trl==1.5.1; extra == 'all-cuda'
|
|
66
66
|
Provides-Extra: all-rocm
|
|
@@ -68,7 +68,6 @@ Requires-Dist: accelerate==1.14.0; extra == 'all-rocm'
|
|
|
68
68
|
Requires-Dist: bitsandbytes==0.49.2; extra == 'all-rocm'
|
|
69
69
|
Requires-Dist: datasets==5.0.0; extra == 'all-rocm'
|
|
70
70
|
Requires-Dist: gguf; extra == 'all-rocm'
|
|
71
|
-
Requires-Dist: gitpython; extra == 'all-rocm'
|
|
72
71
|
Requires-Dist: huggingface-hub==1.18.0; extra == 'all-rocm'
|
|
73
72
|
Requires-Dist: kernels<0.14,>=0.12; extra == 'all-rocm'
|
|
74
73
|
Requires-Dist: llama-cpp-python; extra == 'all-rocm'
|
|
@@ -79,6 +78,7 @@ Requires-Dist: safetensors==0.7.0; extra == 'all-rocm'
|
|
|
79
78
|
Requires-Dist: tokenizers==0.22.2; extra == 'all-rocm'
|
|
80
79
|
Requires-Dist: torch==2.12.0; extra == 'all-rocm'
|
|
81
80
|
Requires-Dist: torchvision==0.27.0; extra == 'all-rocm'
|
|
81
|
+
Requires-Dist: tqdm; extra == 'all-rocm'
|
|
82
82
|
Requires-Dist: transformers==5.12.1; extra == 'all-rocm'
|
|
83
83
|
Requires-Dist: trl==1.5.1; extra == 'all-rocm'
|
|
84
84
|
Provides-Extra: convert
|
|
@@ -98,9 +98,9 @@ Requires-Dist: scipy>=1.11; extra == 'dev'
|
|
|
98
98
|
Provides-Extra: eval
|
|
99
99
|
Requires-Dist: scipy>=1.11; extra == 'eval'
|
|
100
100
|
Provides-Extra: extract
|
|
101
|
-
Requires-Dist: gitpython; extra == 'extract'
|
|
102
101
|
Requires-Dist: pyyaml; extra == 'extract'
|
|
103
102
|
Requires-Dist: requests; extra == 'extract'
|
|
103
|
+
Requires-Dist: tqdm; extra == 'extract'
|
|
104
104
|
Provides-Extra: flash-attn
|
|
105
105
|
Requires-Dist: causal-conv1d>=1.4; extra == 'flash-attn'
|
|
106
106
|
Requires-Dist: flash-attn>=2.7; extra == 'flash-attn'
|
|
@@ -197,158 +197,170 @@ Requires-Dist: trl==1.5.1; extra == 'train-rocm'
|
|
|
197
197
|
Description-Content-Type: text/markdown
|
|
198
198
|
|
|
199
199
|
# AttackLM
|
|
200
|
-
AttackLM — QLoRA fine-tuning pipeline for a MITRE ATT&CK-grounded security AI assistant. 24,652 training pairs · Qwen2.5-Coder base · 16GB+ VRAM.
|
|
201
200
|
|
|
202
|
-
[](LICENSE)
|
|
203
201
|
[](https://pypi.org/project/attacklm/)
|
|
204
|
-
[](
|
|
202
|
+
[](https://docs.python.org/3.10/)
|
|
203
|
+
[](LICENSE)
|
|
204
|
+
[](#)
|
|
205
|
+
|
|
206
|
+
**A high-performance QLoRA fine-tuning pipeline for creating MITRE ATT&CK-grounded security AI assistants.**
|
|
205
207
|
|
|
206
208
|
---
|
|
207
209
|
|
|
208
|
-
##
|
|
210
|
+
## Table of Contents
|
|
211
|
+
- [Quickstart](#quickstart)
|
|
212
|
+
- [Installation Guide](#installation-guide)
|
|
213
|
+
- [Features](#features)
|
|
214
|
+
- [Usage](#usage)
|
|
215
|
+
- [Dataset & Attribution](#dataset--attribution)
|
|
216
|
+
- [Architecture](#architecture)
|
|
217
|
+
- [CLI Reference](#cli-reference)
|
|
218
|
+
- [License & Contributing](#license--contributing)
|
|
209
219
|
|
|
210
|
-
|
|
220
|
+
---
|
|
211
221
|
|
|
212
|
-
|
|
213
|
-
pip install attacklm-gui
|
|
214
|
-
attacklm-gui
|
|
215
|
-
```
|
|
222
|
+
## Quickstart
|
|
216
223
|
|
|
217
|
-
|
|
218
|
-
- **Training form** with 40+ params in 5 tabs (Basic, LoRA, GaLore, Advanced, Hardware)
|
|
219
|
-
- **Live training monitor** with loss sparkline, VRAM gauge, progress bar, and log viewer
|
|
220
|
-
- **One-click screens** for extract, balance, infer, merge, build, pipeline, and init
|
|
221
|
-
- **5 built-in presets** (3B Q-GaLore, 3B LoRA, 7B Q-GaLore, 7B QLoRA, etc.)
|
|
222
|
-
- **Pause/resume/quit** controls during training
|
|
223
|
-
- Works in **terminal-only** environments — no X11, no browser, no GPU required. Works over SSH and WSL.
|
|
224
|
+
Get from zero to a trained security model in four commands:
|
|
224
225
|
|
|
225
|
-
|
|
226
|
+
```bash
|
|
227
|
+
# 1. Install the full training stack
|
|
228
|
+
pip install "attacklm[all]"
|
|
226
229
|
|
|
227
|
-
|
|
230
|
+
# 2. Initialize the MITRE-grounded dataset (downloads pre-built tarball)
|
|
231
|
+
attacklm init --yes
|
|
228
232
|
|
|
229
|
-
|
|
230
|
-
|
|
233
|
+
# 3. Balance the dataset to prevent source-bias (e.g., Metasploit overfitting)
|
|
234
|
+
attacklm balance
|
|
231
235
|
|
|
232
|
-
|
|
233
|
-
|
|
236
|
+
# 4. Launch training on Qwen2.5-Coder
|
|
237
|
+
attacklm train -- --dataset all --epochs 5 --train
|
|
234
238
|
```
|
|
235
239
|
|
|
236
|
-
*Alternative:* Use `uv pip install "attacklm[all]"` for faster installation.
|
|
237
|
-
*Note:* `flash-attn` is optional and not included by default to avoid heavy compilation requirements.
|
|
238
|
-
|
|
239
240
|
---
|
|
240
241
|
|
|
241
|
-
##
|
|
242
|
-
|
|
242
|
+
## Installation Guide
|
|
243
|
+
|
|
244
|
+
### Prerequisites
|
|
245
|
+
- **OS**: Linux (Ubuntu recommended) or WSL2
|
|
246
|
+
- **Python**: 3.10+
|
|
247
|
+
- **Hardware**: NVIDIA GPU with 8GB+ VRAM (RTX 30-series/40-series) or AMD ROCm compatible GPU.
|
|
248
|
+
|
|
249
|
+
### Installation
|
|
250
|
+
Install based on your hardware acceleration preference:
|
|
243
251
|
|
|
252
|
+
**NVIDIA CUDA (Recommended)**
|
|
244
253
|
```bash
|
|
245
|
-
attacklm
|
|
254
|
+
pip install "attacklm[all]"
|
|
255
|
+
# OR using uv for faster installation
|
|
256
|
+
uv pip install "attacklm[all]"
|
|
246
257
|
```
|
|
247
258
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
259
|
+
**AMD ROCm**
|
|
260
|
+
```bash
|
|
261
|
+
pip install "attacklm[all-rocm]"
|
|
262
|
+
```
|
|
252
263
|
|
|
264
|
+
**Verification**
|
|
253
265
|
```bash
|
|
254
|
-
attacklm
|
|
266
|
+
attacklm --version
|
|
255
267
|
```
|
|
256
268
|
|
|
257
|
-
|
|
258
|
-
|
|
269
|
+
### Memory Optimization: Flash-Attention vs. SDP
|
|
270
|
+
AttackLM is designed for maximum accessibility without sacrificing the efficiency of modern attention mechanisms.
|
|
259
271
|
|
|
260
|
-
|
|
272
|
+
**The Problem with `flash-attn`**
|
|
273
|
+
Traditional `flash-attn` installations require a full CUDA toolkit, specific NVCC versions, and lengthy source compilation, which frequently fails in constrained environments or varying OS versions.
|
|
261
274
|
|
|
262
|
-
|
|
263
|
-
|
|
275
|
+
**The AttackLM Solution: Memory Efficient SDP**
|
|
276
|
+
By default, AttackLM leverages PyTorch's built-in `torch.backends.cuda.enable_mem_efficient_sdp()`.
|
|
264
277
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
278
|
+
- **Technical Advantage**: It implements the same $\mathcal{O}(1)$ tiled algorithm as FlashAttention.
|
|
279
|
+
- **VRAM Impact**: At a sequence length of 12,000, a standard $\mathcal{O}(n^2)$ attention matrix would consume ~8GB of VRAM just for the matrix. Memory Efficient SDP keeps this overhead constant.
|
|
280
|
+
- **Zero Friction**: No compilation required. It works natively across all supported PyTorch/CUDA environments.
|
|
268
281
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
| `--single-model` | off | Train one model on all buckets combined |
|
|
273
|
-
| `--dataset` | none | Path to dataset or alias (`all`, `base/`, `tools/`, `ai/`, `orchestrator`) |
|
|
274
|
-
| `--epochs` | 10 | Total training epochs |
|
|
275
|
-
| `--max-length` | 1024 | Max sequence length (use 2048 for richer context) |
|
|
276
|
-
| `--lora-r` | 16 | LoRA rank |
|
|
277
|
-
| `--use-galore` | off | Use Q-GaLore for full-parameter training on low VRAM |
|
|
278
|
-
| `--spectrum` | off | SNR-based layer freezing to reduce VRAM |
|
|
282
|
+
*Note: If you have a perfectly configured environment and want the absolute maximum throughput, you can still install the standalone flash-attention: `pip install "attacklm[flash-attn]"`.*
|
|
283
|
+
|
|
284
|
+
---
|
|
279
285
|
|
|
280
|
-
|
|
286
|
+
## Features
|
|
287
|
+
|
|
288
|
+
- **Comprehensive Security Corpus**: 24,652 high-quality training pairs across 18 distinct security sources.
|
|
289
|
+
- **Advanced Training Methods**: Support for QLoRA, GaLore, Q-GaLore, Spectrum, and PiSSA to enable training of large models on consumer hardware.
|
|
290
|
+
- **Zero-Config Setup**: One-shot `init` command that handles dataset retrieval, extraction, and bucket organization.
|
|
291
|
+
- **Anti-Bias Balancing**: Integrated balancing engine to ensure the model learns diverse tactics rather than just the most voluminous sources.
|
|
292
|
+
- **Provenance Tracking**: Strict per-source attribution and license tracking for every record in the dataset.
|
|
293
|
+
- **Terminal GUI**: A professional Textual-based TUI for managing training runs without memorizing 40+ CLI flags.
|
|
294
|
+
- **Deployment Ready**: Built-in merge and conversion pipeline to export adapters to GGUF format for LM Studio or Ollama.
|
|
295
|
+
- **Rock-Solid Stability**: 26/26 core tests passing.
|
|
281
296
|
|
|
282
297
|
---
|
|
283
298
|
|
|
284
|
-
##
|
|
285
|
-
Perform a one-shot merge of the LoRA adapter and conversion to GGUF format for local deployment.
|
|
299
|
+
## Usage
|
|
286
300
|
|
|
301
|
+
### Dataset Management
|
|
302
|
+
`attacklm init`
|
|
303
|
+
Initialize the environment. Downloads the pre-built dataset for instant use.
|
|
287
304
|
```bash
|
|
288
|
-
attacklm
|
|
305
|
+
attacklm init --yes
|
|
289
306
|
```
|
|
290
307
|
|
|
291
|
-
|
|
308
|
+
`attacklm balance`
|
|
309
|
+
Create a balanced training subset to ensure tactical coverage.
|
|
310
|
+
```bash
|
|
311
|
+
attacklm balance --profile 7b-16gb --preset red-team
|
|
312
|
+
```
|
|
292
313
|
|
|
293
|
-
|
|
294
|
-
|
|
314
|
+
### Model Training
|
|
315
|
+
`attacklm train`
|
|
316
|
+
The core training engine. Supports Qwen2.5-Coder 3B and 7B base models.
|
|
317
|
+
```bash
|
|
318
|
+
# Train a single model on the entire balanced dataset
|
|
319
|
+
attacklm train -- --dataset all --epochs 10 --lora-r 16 --use-galore
|
|
320
|
+
```
|
|
295
321
|
|
|
322
|
+
### Deployment & Testing
|
|
323
|
+
`attacklm build`
|
|
324
|
+
Merge LoRA adapters and convert to GGUF for local deployment.
|
|
296
325
|
```bash
|
|
297
|
-
attacklm
|
|
326
|
+
attacklm build -- --adapter models/attacklm-single_TIMESTAMP --name attacklm-security
|
|
298
327
|
```
|
|
299
328
|
|
|
300
|
-
|
|
329
|
+
`attacklm infer`
|
|
330
|
+
Perform a smoke-test of the trained model against representative security prompts.
|
|
331
|
+
```bash
|
|
332
|
+
attacklm infer -- --adapter models/attacklm-single_TIMESTAMP
|
|
333
|
+
```
|
|
301
334
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|--------|-------|----------|-------------|
|
|
307
|
-
| base/collection | 634 | MITRE Tactic | TA0009 - Collection techniques |
|
|
308
|
-
| base/command_and_control | 0 | MITRE Tactic | TA0011 - C2 techniques (no data yet) |
|
|
309
|
-
| base/credential_access | 589 | MITRE Tactic | TA0006 - Credential access |
|
|
310
|
-
| base/defense_evasion | 1,375 | MITRE Tactic | TA0005 - Defense evasion |
|
|
311
|
-
| base/discovery | 1,846 | MITRE Tactic | TA0007 - Discovery |
|
|
312
|
-
| base/execution | 767 | MITRE Tactic | TA0002 - Execution |
|
|
313
|
-
| base/exfiltration | 53 | MITRE Tactic | TA0010 - Exfiltration |
|
|
314
|
-
| base/lateral_movement | 252 | MITRE Tactic | TA0008 - Lateral movement |
|
|
315
|
-
| base/persistence | 1,120 | MITRE Tactic | TA0003 - Persistence |
|
|
316
|
-
| base/privilege_escalation | 537 | MITRE Tactic | TA0004 - Privilege escalation |
|
|
317
|
-
| tools/metasploit | 8,349 | Tools | Metasploit module knowledge |
|
|
318
|
-
| ai/jailbreaking | 50 | AI Security | Jailbreak techniques (garak) |
|
|
319
|
-
| ai/prompt-injection | 63 | AI Security | Prompt injection (promptfoo, promptmap) |
|
|
320
|
-
| orchestrator | 380 | Meta | Agent routing decisions |
|
|
321
|
-
| cloud/attacks | 10 | Extended | Cloud attack techniques |
|
|
322
|
-
| ics/attacks | 290 | Extended | ICS/SCADA attacks |
|
|
323
|
-
| social_engineering/phishing | 440 | Extended | Phishing techniques |
|
|
324
|
-
| wireless/attacks | 197 | Extended | Wireless attacks |
|
|
325
|
-
| defensive/detection_engineering | 7,154 | Defensive | Sigma + Elastic + Splunk detection rules |
|
|
326
|
-
| defensive/threat_hunting | 366 | Defensive | Mordor + ThreatHunter playbooks |
|
|
327
|
-
| defensive/incident_response | 168 | Defensive | NIST SP 800-61r3 IR procedures |
|
|
328
|
-
|
|
329
|
-
*Note: 6 defensive buckets (detection_engineering, threat_hunting, incident_response, plus sigma/elastic/splunk/mordor/threathunter/nist sources) are planned but have 0 records currently.*
|
|
335
|
+
### Specialized Tools
|
|
336
|
+
- `attacklm eval`: Run the retention evaluation suite and score candidate models.
|
|
337
|
+
- `attacklm gui`: Launch the Terminal GUI for an interactive training experience.
|
|
338
|
+
- `attacklm demo`: Run the multi-agent orchestrator demo.
|
|
330
339
|
|
|
331
340
|
---
|
|
332
341
|
|
|
333
|
-
##
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
|
339
|
-
|
|
|
340
|
-
|
|
|
341
|
-
| Sigma |
|
|
342
|
-
|
|
|
343
|
-
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
342
|
+
## Dataset & Attribution
|
|
343
|
+
|
|
344
|
+
The dataset is meticulously partitioned into "buckets" to allow granular control over training composition.
|
|
345
|
+
|
|
346
|
+
### Core Composition
|
|
347
|
+
| Category | Source Examples | Approx. Pairs | License |
|
|
348
|
+
| :--- | :--- | :--- | :--- |
|
|
349
|
+
| **Offensive** | Metasploit, Atomic Red Team | 15,000+ | BSD-3 / MIT |
|
|
350
|
+
| **Defensive** | Sigma, Elastic, Splunk | 7,000+ | DRL-1.1 / Apache-2.0 |
|
|
351
|
+
| **AI Security** | Garak, Promptfoo | 100+ | Mixed |
|
|
352
|
+
| **Meta/IR** | NIST IR, Orchestrator | 500+ | Public Domain |
|
|
353
|
+
|
|
354
|
+
**Total Records**: 24,652
|
|
355
|
+
**Base Models**: Qwen2.5-Coder (3B, 7B)
|
|
356
|
+
|
|
357
|
+
For a complete mapping of every record to its original source and license, see [ATTRIBUTION.md](ATTRIBUTION.md).
|
|
347
358
|
|
|
348
359
|
---
|
|
349
360
|
|
|
350
361
|
## Architecture
|
|
351
|
-
|
|
362
|
+
|
|
363
|
+
AttackLM employs a deterministic pipeline that separates raw data extraction from training logic.
|
|
352
364
|
|
|
353
365
|
```text
|
|
354
366
|
AttackLM/
|
|
@@ -362,75 +374,33 @@ AttackLM/
|
|
|
362
374
|
│ └── data.jsonl
|
|
363
375
|
```
|
|
364
376
|
|
|
365
|
-
This
|
|
377
|
+
This hierarchy ensures that the pipeline can be rebuilt from upstream sources without introducing hallucinations, while allowing the `balance` command to target specific tactics or sources for weighted sampling.
|
|
366
378
|
|
|
367
379
|
---
|
|
368
380
|
|
|
369
381
|
## CLI Reference
|
|
370
382
|
|
|
371
|
-
> **v0.8.0**: The 21 hyphenated commands are consolidated into a single
|
|
372
|
-
> `attacklm` command with subcommands. The old commands still work but
|
|
373
|
-
> print a deprecation warning. They will be removed in v0.9.0.
|
|
374
|
-
|
|
375
|
-
### Unified Command (v0.8.0+)
|
|
376
|
-
|
|
377
383
|
| Command | Description |
|
|
378
|
-
|
|
384
|
+
| :--- | :--- |
|
|
379
385
|
| `attacklm train` | Train a model (QLoRA, GaLore, Q-GaLore, Spectrum, PiSSA) |
|
|
380
|
-
| `attacklm train --dataset all` | Train all buckets
|
|
381
|
-
| `attacklm train --hpo` | Run
|
|
382
|
-
| `attacklm init` |
|
|
383
|
-
| `attacklm
|
|
384
|
-
| `attacklm
|
|
385
|
-
| `attacklm
|
|
386
|
-
| `attacklm
|
|
387
|
-
| `attacklm
|
|
388
|
-
| `attacklm
|
|
389
|
-
| `attacklm build --merge-only` | Merge adapter only (replaces `attacklm-merge`) |
|
|
390
|
-
| `attacklm build --gguf-only` | Convert to GGUF only (replaces `attacklm-gguf`) |
|
|
391
|
-
| `attacklm build --register-ollama` | Register GGUF with Ollama (replaces `attacklm-register-ollama`) |
|
|
392
|
-
| `attacklm infer` | Smoke-test inference |
|
|
393
|
-
| `attacklm eval` | Run retention evaluation suite |
|
|
394
|
-
| `attacklm eval --collect-ref` | Collect reference model outputs |
|
|
395
|
-
| `attacklm eval --score` | Score candidate models against reference |
|
|
396
|
-
| `attacklm eval --compare` | Compare multiple candidate model scores |
|
|
397
|
-
| `attacklm eval --golden` | Execute golden vector regression gates |
|
|
398
|
-
| `attacklm gui` | Terminal GUI for all commands |
|
|
399
|
-
| `attacklm demo` | Multi-agent orchestrator demo |
|
|
400
|
-
|
|
401
|
-
### Legacy Commands (Deprecated, removed in v0.9.0)
|
|
402
|
-
|
|
403
|
-
| Old Command | New Command |
|
|
404
|
-
|-------------|-------------|
|
|
405
|
-
| `attacklm-train` | `attacklm train` |
|
|
406
|
-
| `attacklm-train-all` | `attacklm train --dataset all` |
|
|
407
|
-
| `attacklm-train-lora` | `attacklm train` |
|
|
408
|
-
| `attacklm-hpo` | `attacklm train --hpo` |
|
|
409
|
-
| `attacklm-init` | `attacklm init` |
|
|
410
|
-
| `attacklm-extract` | `attacklm init --extract-only` |
|
|
411
|
-
| `attacklm-buckets` | `attacklm init --buckets-only` |
|
|
412
|
-
| `attacklm-attribute` | `attacklm init --attribute-only` |
|
|
413
|
-
| `attacklm-clone` | `attacklm init --clone-only` |
|
|
414
|
-
| `attacklm-balance` | `attacklm balance` |
|
|
415
|
-
| `attacklm-build` | `attacklm build` |
|
|
416
|
-
| `attacklm-merge` | `attacklm build --merge-only` |
|
|
417
|
-
| `attacklm-gguf` | `attacklm build --gguf-only` |
|
|
418
|
-
| `attacklm-register-ollama` | `attacklm build --register-ollama` |
|
|
419
|
-
| `attacklm-infer` | `attacklm infer` |
|
|
420
|
-
| `attacklm-eval` | `attacklm eval` |
|
|
421
|
-
| `attacklm-collect-ref` | `attacklm eval --collect-ref` |
|
|
422
|
-
| `attacklm-score` | `attacklm eval --score` |
|
|
423
|
-
| `attacklm-compare` | `attacklm eval --compare` |
|
|
424
|
-
| `attacklm-golden` | `attacklm eval --golden` |
|
|
425
|
-
| `attacklm-demo` | `attacklm demo` |
|
|
386
|
+
| `attacklm train --dataset all` | Train all buckets combined |
|
|
387
|
+
| `attacklm train --hpo` | Run Hyper-Parameter Optimization sweep |
|
|
388
|
+
| `attacklm init` | Initialize dataset: download pre-built or clone $\rightarrow$ extract $\rightarrow$ attribute |
|
|
389
|
+
| `attacklm balance` | Build a balanced subset of buckets to prevent overfitting |
|
|
390
|
+
| `attacklm build` | Merge adapter $\rightarrow$ GGUF conversion $\rightarrow$ LM Studio/Ollama register |
|
|
391
|
+
| `attacklm infer` | Smoke-test inference on trained adapters |
|
|
392
|
+
| `attacklm eval` | Run retention evaluation and regression gates |
|
|
393
|
+
| `attacklm gui` | Launch Terminal GUI (TUI) for all operations |
|
|
394
|
+
| `attacklm demo` | Run multi-agent orchestrator demo |
|
|
426
395
|
|
|
427
396
|
---
|
|
428
397
|
|
|
429
|
-
## License
|
|
430
|
-
|
|
398
|
+
## License & Contributing
|
|
399
|
+
|
|
400
|
+
**Code License**: This project is licensed under the [MIT License](LICENSE).
|
|
401
|
+
|
|
402
|
+
**Data License**: Training data consists of mixed licenses per source. Please refer to [ATTRIBUTION.md](ATTRIBUTION.md) for the full legal mapping.
|
|
431
403
|
|
|
432
|
-
|
|
433
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on contributing to AttackLM.
|
|
404
|
+
**Contributing**: We welcome contributions to the extraction pipeline and training methods. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
434
405
|
|
|
435
|
-
|
|
436
|
-
See [CHANGELOG.md](CHANGELOG.md) for the full version history.
|
|
406
|
+
**History**: For a full list of changes and version milestones, see [CHANGELOG.md](CHANGELOG.md).
|