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.
Files changed (215) hide show
  1. {attacklm-0.8.0 → attacklm-0.8.2}/.gitignore +5 -0
  2. {attacklm-0.8.0 → attacklm-0.8.2}/CHANGELOG.md +17 -0
  3. {attacklm-0.8.0 → attacklm-0.8.2}/PKG-INFO +138 -168
  4. attacklm-0.8.2/README.md +208 -0
  5. {attacklm-0.8.0 → attacklm-0.8.2}/pyproject.toml +1 -1
  6. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/convert_to_gguf.py +6 -3
  7. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/init_pipeline.py +346 -80
  8. attacklm-0.8.2/scripts/package_dataset.py +258 -0
  9. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/train_template.py +22 -0
  10. attacklm-0.8.2/src/attacklm/__version__.py +1 -0
  11. {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/cli.py +26 -4
  12. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_init_pipeline.py +255 -13
  13. attacklm-0.8.0/QA_BEFORE_RELEASES.md +0 -249
  14. attacklm-0.8.0/README.md +0 -238
  15. attacklm-0.8.0/REPLAY_PLAN.md +0 -209
  16. attacklm-0.8.0/data/datasets/buckets/ATTRIBUTION.md +0 -65
  17. attacklm-0.8.0/data/datasets/buckets/GEMINI_RESEARCH_2026-06-11.md +0 -491
  18. attacklm-0.8.0/notes/BLUE_TEAM_DESIGN_v0.5.0.md +0 -792
  19. attacklm-0.8.0/notes/EVAL_DESIGN_v0.4.0.md +0 -1098
  20. attacklm-0.8.0/notes/STEERING_REVIEW_v0.4.0.md +0 -793
  21. attacklm-0.8.0/src/attacklm/__version__.py +0 -1
  22. {attacklm-0.8.0 → attacklm-0.8.2}/.github/workflows/release.yml +0 -0
  23. {attacklm-0.8.0 → attacklm-0.8.2}/ATTRIBUTION.md +0 -0
  24. {attacklm-0.8.0 → attacklm-0.8.2}/CONTRIBUTING.md +0 -0
  25. {attacklm-0.8.0 → attacklm-0.8.2}/EVALUATION.md +0 -0
  26. {attacklm-0.8.0 → attacklm-0.8.2}/LICENSE +0 -0
  27. {attacklm-0.8.0 → attacklm-0.8.2}/MANIFEST.in +0 -0
  28. {attacklm-0.8.0 → attacklm-0.8.2}/Makefile +0 -0
  29. {attacklm-0.8.0 → attacklm-0.8.2}/NOTICE +0 -0
  30. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/README.md +0 -0
  31. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/pyproject.toml +0 -0
  32. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/__init__.py +0 -0
  33. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/app.py +0 -0
  34. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/cli.py +0 -0
  35. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/presets.py +0 -0
  36. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/runner.py +0 -0
  37. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/__init__.py +0 -0
  38. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/command_forms.py +0 -0
  39. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/main_menu.py +0 -0
  40. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/train_form.py +0 -0
  41. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/screens/train_live.py +0 -0
  42. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/src/attacklm_gui/widgets/__init__.py +0 -0
  43. {attacklm-0.8.0 → attacklm-0.8.2}/attacklm-gui/tests/test_gui.py +0 -0
  44. {attacklm-0.8.0 → attacklm-0.8.2}/data/ATTRIBUTION.md +0 -0
  45. {attacklm-0.8.0 → attacklm-0.8.2}/data/LEGAL.md +0 -0
  46. {attacklm-0.8.0 → attacklm-0.8.2}/data/REMOVAL.md +0 -0
  47. {attacklm-0.8.0 → attacklm-0.8.2}/data/bench/questions.jsonl +0 -0
  48. {attacklm-0.8.0 → attacklm-0.8.2}/data/bench/speed_context.txt +0 -0
  49. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/acquisition_report.json +0 -0
  50. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/manifest.json +0 -0
  51. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/README.md +0 -0
  52. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/_index.json +0 -0
  53. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/LICENSE.md +0 -0
  54. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/SOURCE.md +0 -0
  55. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/collection/data.jsonl +0 -0
  56. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/discovery/data.jsonl +0 -0
  57. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/execution/data.jsonl +0 -0
  58. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/exfiltration/data.jsonl +0 -0
  59. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/atomic-red-team/base/persistence/data.jsonl +0 -0
  60. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/LICENSE.md +0 -0
  61. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/SOURCE.md +0 -0
  62. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/attacklm-synthetic/orchestrator/data.jsonl +0 -0
  63. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/azure-pyrit/LICENSE.md +0 -0
  64. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/azure-pyrit/SOURCE.md +0 -0
  65. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/cyberark-fuzzyai/LICENSE.md +0 -0
  66. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/cyberark-fuzzyai/SOURCE.md +0 -0
  67. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/LICENSE.md +0 -0
  68. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/SOURCE.md +0 -0
  69. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/elastic-rules/defensive/detection_engineering/data.jsonl +0 -0
  70. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/LICENSE.md +0 -0
  71. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/SOURCE.md +0 -0
  72. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/cloud/attacks/data_llm.jsonl +0 -0
  73. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/ics/attacks/data_llm.jsonl +0 -0
  74. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/social_engineering/phishing/data_llm.jsonl +0 -0
  75. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/llm-generated/wireless/attacks/data_llm.jsonl +0 -0
  76. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/LICENSE.md +0 -0
  77. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/SOURCE.md +0 -0
  78. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/collection/data.jsonl +0 -0
  79. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/credential_access/data.jsonl +0 -0
  80. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/defense_evasion/data.jsonl +0 -0
  81. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/discovery/data.jsonl +0 -0
  82. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/execution/data.jsonl +0 -0
  83. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/lateral_movement/data.jsonl +0 -0
  84. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/persistence/data.jsonl +0 -0
  85. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/base/privilege_escalation/data.jsonl +0 -0
  86. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/metasploit-framework/tools/metasploit/data.jsonl +0 -0
  87. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/LICENSE.md +0 -0
  88. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/SOURCE.md +0 -0
  89. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-atlas-arsenal/base/discovery/data.jsonl +0 -0
  90. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/LICENSE.md +0 -0
  91. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/SOURCE.md +0 -0
  92. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/collection/data.jsonl +0 -0
  93. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/discovery/data.jsonl +0 -0
  94. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/execution/data.jsonl +0 -0
  95. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/exfiltration/data.jsonl +0 -0
  96. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mitre-stockpile/base/persistence/data.jsonl +0 -0
  97. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/LICENSE.md +0 -0
  98. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/SOURCE.md +0 -0
  99. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/mordor/defensive/threat_hunting/data.jsonl +0 -0
  100. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/LICENSE.md +0 -0
  101. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/SOURCE.md +0 -0
  102. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nist-ir/defensive/incident_response/data.jsonl +0 -0
  103. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/LICENSE.md +0 -0
  104. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/SOURCE.md +0 -0
  105. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/nvidia-garak/ai/jailbreaking/data.jsonl +0 -0
  106. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/LICENSE.md +0 -0
  107. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/SOURCE.md +0 -0
  108. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptfoo/ai/prompt-injection/data.jsonl +0 -0
  109. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/LICENSE.md +0 -0
  110. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/SOURCE.md +0 -0
  111. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/promptmap/ai/prompt-injection/data.jsonl +0 -0
  112. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/LICENSE.md +0 -0
  113. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/SOURCE.md +0 -0
  114. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_code.jsonl +0 -0
  115. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_conversation.jsonl +0 -0
  116. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_factual.jsonl +0 -0
  117. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/replay-general/base/replay/data_reasoning.jsonl +0 -0
  118. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/LICENSE.md +0 -0
  119. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/SOURCE.md +0 -0
  120. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/sigma-hq/defensive/detection_engineering/data.jsonl +0 -0
  121. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/LICENSE.md +0 -0
  122. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/SOURCE.md +0 -0
  123. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/splunk-content/defensive/detection_engineering/data.jsonl +0 -0
  124. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/LICENSE.md +0 -0
  125. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/SOURCE.md +0 -0
  126. {attacklm-0.8.0 → attacklm-0.8.2}/data/datasets/buckets/sources/threathunter-playbook/defensive/threat_hunting/data.jsonl +0 -0
  127. {attacklm-0.8.0 → attacklm-0.8.2}/data/golden/prompts.jsonl +0 -0
  128. {attacklm-0.8.0 → attacklm-0.8.2}/data/reference/prompts.jsonl +0 -0
  129. {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/opsec_aware.txt +0 -0
  130. {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/opsec_unaware.txt +0 -0
  131. {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/succinct.txt +0 -0
  132. {attacklm-0.8.0 → attacklm-0.8.2}/data/steering/prompts/verbose.txt +0 -0
  133. {attacklm-0.8.0 → attacklm-0.8.2}/experiments/README.md +0 -0
  134. {attacklm-0.8.0 → attacklm-0.8.2}/experiments/synthetic_dataset_mutator_evol_instruct.py +0 -0
  135. {attacklm-0.8.0 → attacklm-0.8.2}/hf/.gitattributes +0 -0
  136. {attacklm-0.8.0 → attacklm-0.8.2}/hf/README.md +0 -0
  137. {attacklm-0.8.0 → attacklm-0.8.2}/hf/data/manifest.json +0 -0
  138. {attacklm-0.8.0 → attacklm-0.8.2}/hf/dataset_infos.json +0 -0
  139. {attacklm-0.8.0 → attacklm-0.8.2}/hf/scripts/build_hf_dataset.py +0 -0
  140. {attacklm-0.8.0 → attacklm-0.8.2}/hf/scripts/push_to_hf.py +0 -0
  141. {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/.gitkeep +0 -0
  142. {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/hpo_state.json +0 -0
  143. {attacklm-0.8.0 → attacklm-0.8.2}/hpo_runs/hpo_trial_dataset.jsonl +0 -0
  144. {attacklm-0.8.0 → attacklm-0.8.2}/logs/.gitkeep +0 -0
  145. {attacklm-0.8.0 → attacklm-0.8.2}/pipeline.example.yaml +0 -0
  146. {attacklm-0.8.0 → attacklm-0.8.2}/presets/blue-team.json +0 -0
  147. {attacklm-0.8.0 → attacklm-0.8.2}/presets/purple-team.json +0 -0
  148. {attacklm-0.8.0 → attacklm-0.8.2}/presets/red-team.json +0 -0
  149. {attacklm-0.8.0 → attacklm-0.8.2}/requirements.txt +0 -0
  150. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/_eval_loader.py +0 -0
  151. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_cloud_attack_dataset.py +0 -0
  152. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_ics_dataset.py +0 -0
  153. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_phishing_dataset.py +0 -0
  154. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_red_team_tactics.py +0 -0
  155. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_replay_general.py +0 -0
  156. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_supply_chain_dataset.py +0 -0
  157. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_web_attack_dataset.py +0 -0
  158. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/acquire_wireless_dataset.py +0 -0
  159. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/audit_dataset.py +0 -0
  160. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/balance_buckets.py +0 -0
  161. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/bucket_loader.py +0 -0
  162. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/build.py +0 -0
  163. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/clone_repos.sh +0 -0
  164. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/collect_reference.py +0 -0
  165. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/compare_scores.py +0 -0
  166. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/demo.py +0 -0
  167. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/device_utils.py +0 -0
  168. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/domain_bench.py +0 -0
  169. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/eval_retention.py +0 -0
  170. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_ai_tools_to_jsonl.py +0 -0
  171. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_atomic_red_team_to_jsonl.py +0 -0
  172. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_by_tactic.py +0 -0
  173. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_caldera_plugins_to_jsonl.py +0 -0
  174. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_elastic_rules.py +0 -0
  175. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_infection_monkey_to_jsonl.py +0 -0
  176. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_mordor.py +0 -0
  177. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_nist_ir.py +0 -0
  178. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_rta_to_jsonl.py +0 -0
  179. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_sigma_defensive.py +0 -0
  180. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_splunk_content.py +0 -0
  181. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/extract_threathunter_playbook.py +0 -0
  182. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/generate_synthetic_scarce.py +0 -0
  183. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/golden_vectors.py +0 -0
  184. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/hpo_runner.py +0 -0
  185. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/import_gguf.sh +0 -0
  186. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/import_to_lmstudio.sh +0 -0
  187. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/infer.py +0 -0
  188. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/merge_adapter.py +0 -0
  189. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/mitre_tactic_lookup.py +0 -0
  190. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/parse_metasploit_to_jsonl.py +0 -0
  191. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/pipeline.py +0 -0
  192. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/rebuild_manifest.py +0 -0
  193. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/register_ollama.py +0 -0
  194. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/reorganize_buckets.py +0 -0
  195. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/replay_mixer.py +0 -0
  196. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/score_candidates.py +0 -0
  197. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/setup_buckets.py +0 -0
  198. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/speed_bench.py +0 -0
  199. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/steering.py +0 -0
  200. {attacklm-0.8.0 → attacklm-0.8.2}/scripts/train_all.py +0 -0
  201. {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/__init__.py +0 -0
  202. {attacklm-0.8.0 → attacklm-0.8.2}/src/attacklm/_project_root.py +0 -0
  203. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_balance_buckets.py +0 -0
  204. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_collect_reference.py +0 -0
  205. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_compare_scores.py +0 -0
  206. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_domain_bench.py +0 -0
  207. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_eval_loader.py +0 -0
  208. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_eval_retention.py +0 -0
  209. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_golden_vectors.py +0 -0
  210. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_replay_mixer.py +0 -0
  211. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_score_candidates.py +0 -0
  212. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_speed_bench.py +0 -0
  213. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_steering.py +0 -0
  214. {attacklm-0.8.0 → attacklm-0.8.2}/tests/test_thinking_models.py +0 -0
  215. {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.0
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: MIT](https://img.shields.io/badge/code-MIT-blue.svg)](LICENSE)
203
201
  [![PyPI version](https://img.shields.io/pypi/v/attacklm.svg?label=version&color=blue)](https://pypi.org/project/attacklm/)
204
- [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](requirements.txt)
202
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://docs.python.org/3.10/)
203
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
204
+ [![Build Status](https://img.shields.io/badge/build-passing-brightgreen.svg)](#)
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
- ## GUI (New in v0.7.1)
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
- AttackLM now includes a terminal-based GUI for all commands. No more memorizing 40+ CLI flags.
220
+ ---
211
221
 
212
- ```bash
213
- pip install attacklm-gui
214
- attacklm-gui
215
- ```
222
+ ## Quickstart
216
223
 
217
- Features:
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
- The CLI still works exactly as before. The GUI is a thin wrapper that constructs and runs CLI commands.
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
- ## Install
230
- The recommended way to install the full CUDA training stack:
233
+ # 3. Balance the dataset to prevent source-bias (e.g., Metasploit overfitting)
234
+ attacklm balance
231
235
 
232
- ```bash
233
- pip install attacklm[all]
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
- ## Init
242
- Initialize the dataset by cloning upstream repositories, extracting data, adding attribution, and organizing into buckets:
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-init --yes
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
- ## Balance (Optional)
251
- Because Metasploit accounts for ~64% of the raw data, balancing is recommended to prevent overfitting and ensure broad tactical coverage.
259
+ **AMD ROCm**
260
+ ```bash
261
+ pip install "attacklm[all-rocm]"
262
+ ```
252
263
 
264
+ **Verification**
253
265
  ```bash
254
- attacklm-balance --profile 7b-16gb --output data/datasets/balanced/balanced.jsonl
266
+ attacklm --version
255
267
  ```
256
268
 
257
- * **Presets:** Use `--preset red-team`, `purple-team`, or `blue-team` to control the offensive/defensive mix.
258
- * **Profiles:** Use profiles like `3b-16gb` or `7b-16gb` to automatically set per-bucket caps based on your VRAM.
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
- ## Train
263
- Train the model using the orchestrated pipeline. The default base model is `Qwen/Qwen2.5-Coder-3B-Instruct`.
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
- ```bash
266
- attacklm-train-all --single-model --dataset all --epochs 5 --max-length 2048
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
- ### Key Training Flags
270
- | Flag | Default | Description |
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
- **Multi-round SFT:** AttackLM supports iterative training. You can train on tactics first, then tools, then a final general pass. Each round automatically backs up the previous state and uses the merged weights of the prior run as the new base.
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
- ## Build
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-build --adapter models/attacklm-single_TIMESTAMP --name 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
- ## Infer
294
- Smoke-test your trained adapter with a set of representative security prompts.
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-infer --adapter models/attacklm-single_TIMESTAMP
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
- ## Bucket Reference Table
303
- The dataset is split into buckets to allow for granular control over training composition.
304
-
305
- | Bucket | Pairs | Category | Description |
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
- ## Data Sources
334
- | Source | Pairs | License |
335
- |--------|-------|---------|
336
- | Metasploit Framework | 13,997 | BSD-3-Clause |
337
- | Atomic Red Team | 1,115 | MIT |
338
- | MITRE Caldera/Stockpile | 390 | Apache-2.0 |
339
- | LLM-generated | 937 | GPL-3.0 |
340
- | NVIDIA Garak / Promptfoo | 113 | Mixed MIT/Apache-2.0 |
341
- | Sigma | 3,132 | DRL-1.1 |
342
- | Elastic | 1,908 | Elastic-2.0 |
343
- | Splunk | 2,114 | Apache-2.0 |
344
- | Mordor | 339 | Apache-2.0 |
345
- | ThreatHunter | 27 | Apache-2.0 |
346
- | NIST IR | 168 | Public Domain |
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
- Data is organized in a per-source hierarchy to ensure provenance and attribution.
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 layout allows the pipeline to deterministically extract data from upstream sources without introducing hallucinations or API dependencies.
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 (replaces `attacklm-train-all`) |
381
- | `attacklm train --hpo` | Run HPO sweep (replaces `attacklm-hpo`) |
382
- | `attacklm init` | One-shot init: clone extract attribute → buckets |
383
- | `attacklm init --extract-only` | Extract data only (replaces `attacklm-extract`) |
384
- | `attacklm init --buckets-only` | Organize into buckets only (replaces `attacklm-buckets`) |
385
- | `attacklm init --attribute-only` | Add attribution only (replaces `attacklm-attribute`) |
386
- | `attacklm init --clone-only` | Clone repos only (replaces `attacklm-clone`) |
387
- | `attacklm balance` | Build a balanced subset of buckets |
388
- | `attacklm build` | One-shot merge GGUF → install to LM Studio |
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
- The code in this repository is licensed under the **MIT License**. Training data consists of mixed licenses per source; see [ATTRIBUTION.md](ATTRIBUTION.md) for the full mapping.
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
- ## Contributing
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
- ## Changelog
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).