agentic-threat-hunting-framework 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. {agentic_threat_hunting_framework-0.2.2.dist-info → agentic_threat_hunting_framework-0.2.4.dist-info}/METADATA +1 -1
  2. agentic_threat_hunting_framework-0.2.4.dist-info/RECORD +47 -0
  3. athf/__version__.py +1 -1
  4. athf/cli.py +1 -1
  5. athf/commands/context.py +29 -15
  6. athf/commands/hunt.py +1 -3
  7. athf/commands/init.py +45 -0
  8. athf/commands/similar.py +2 -2
  9. athf/core/hunt_manager.py +7 -0
  10. athf/data/__init__.py +14 -0
  11. athf/data/docs/CHANGELOG.md +147 -0
  12. athf/data/docs/CLI_REFERENCE.md +1797 -0
  13. athf/data/docs/INSTALL.md +594 -0
  14. athf/data/docs/README.md +31 -0
  15. athf/data/docs/environment.md +256 -0
  16. athf/data/docs/getting-started.md +419 -0
  17. athf/data/docs/level4-agentic-workflows.md +480 -0
  18. athf/data/docs/lock-pattern.md +149 -0
  19. athf/data/docs/maturity-model.md +400 -0
  20. athf/data/docs/why-athf.md +44 -0
  21. athf/data/hunts/FORMAT_GUIDELINES.md +507 -0
  22. athf/data/hunts/H-0001.md +453 -0
  23. athf/data/hunts/H-0002.md +436 -0
  24. athf/data/hunts/H-0003.md +546 -0
  25. athf/data/hunts/README.md +231 -0
  26. athf/data/integrations/MCP_CATALOG.md +45 -0
  27. athf/data/integrations/README.md +129 -0
  28. athf/data/integrations/quickstart/splunk.md +162 -0
  29. athf/data/knowledge/hunting-knowledge.md +2375 -0
  30. athf/data/prompts/README.md +172 -0
  31. athf/data/prompts/ai-workflow.md +581 -0
  32. athf/data/prompts/basic-prompts.md +316 -0
  33. athf/data/templates/HUNT_LOCK.md +228 -0
  34. agentic_threat_hunting_framework-0.2.2.dist-info/RECORD +0 -23
  35. {agentic_threat_hunting_framework-0.2.2.dist-info → agentic_threat_hunting_framework-0.2.4.dist-info}/WHEEL +0 -0
  36. {agentic_threat_hunting_framework-0.2.2.dist-info → agentic_threat_hunting_framework-0.2.4.dist-info}/entry_points.txt +0 -0
  37. {agentic_threat_hunting_framework-0.2.2.dist-info → agentic_threat_hunting_framework-0.2.4.dist-info}/licenses/LICENSE +0 -0
  38. {agentic_threat_hunting_framework-0.2.2.dist-info → agentic_threat_hunting_framework-0.2.4.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-threat-hunting-framework
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Agentic Threat Hunting Framework - Memory and AI for threat hunters
5
5
  Author-email: Sydney Marrone <athf@nebulock.io>
6
6
  Maintainer-email: Sydney Marrone <athf@nebulock.io>
@@ -0,0 +1,47 @@
1
+ agentic_threat_hunting_framework-0.2.4.dist-info/licenses/LICENSE,sha256=_KObErRfiKoolznt-DF0nJnr3U9Rdh7Z4Ba7G5qqckk,1071
2
+ athf/__init__.py,sha256=OrjZe8P97_BTEkscapnwSsqKSjwXNP9d8-HtGr19Ni0,241
3
+ athf/__version__.py,sha256=Cl7hGHiamJWMCcDKQ8Lcm6Vlc50BZ6GasydpyAoWkg8,59
4
+ athf/cli.py,sha256=LSOazv6E_RChZFqoyMcdfDPH1hIJeZc1s95fssjDLZs,4515
5
+ athf/commands/__init__.py,sha256=uDyr0bz-agpGO8fraXQl24wuQCxqbeCevZsJ2bDK29s,25
6
+ athf/commands/context.py,sha256=WvOf0OuttAsEk_h4QDtdfqYI4CulDg2UCtq_5r5iJAA,12686
7
+ athf/commands/env.py,sha256=AisRllJXbyCjK_2ii21qBBmCz9raxhBUemwM7BxqIYg,11859
8
+ athf/commands/hunt.py,sha256=9ZEI11y8DUixUqw8-yR01K4hVz2JSJJokRwWk8tnNn4,22969
9
+ athf/commands/init.py,sha256=Qn0iETNyuQvM-ySqCeoDz-pPemeuzROX_karQF5yN_o,12685
10
+ athf/commands/investigate.py,sha256=mK_id5vjfN_ukqB_-fyia0FNa0pBmtn0Xv6CKHQI1Qo,24663
11
+ athf/commands/similar.py,sha256=lniOkSOn--ZIztsfTZS-afioJpqJEJQjmqfxsDy6xZQ,11790
12
+ athf/core/__init__.py,sha256=yG7C8ljx3UW4QZoYvDjUxsWHlbS8M-GLGB7Je7rRfqo,31
13
+ athf/core/attack_matrix.py,sha256=QZKKmxckQ6-U7lqVdGUJoj2jEAhP3Juvr3sqaNx2oTw,3238
14
+ athf/core/hunt_manager.py,sha256=PFsg8Ecg94NCpuFZpApo82lyORkgK5IfOIih-7-XsmM,11580
15
+ athf/core/hunt_parser.py,sha256=FUj0yyBIcZnaS9aItMImeBDhegQwpkewIwUMNXW_ZWU,5122
16
+ athf/core/investigation_parser.py,sha256=wbfjnq4gFgIc0a4bHIAnidVNPhbHDpIXWY1SGLk0Xls,6804
17
+ athf/core/template_engine.py,sha256=vNTVhlxIXZpxU7VmQyrqCSt6ORS0IVjAV54TOmUDMTE,5636
18
+ athf/data/__init__.py,sha256=eC5AiaYPQ7oYR3ktxTvRhUHVd_RB1zhQgcVPD3o-9Vw,364
19
+ athf/data/docs/CHANGELOG.md,sha256=1dAondeKsQnGOn9esy9oZ29uG_oGgRuHxmkcmGQ1Cwo,5950
20
+ athf/data/docs/CLI_REFERENCE.md,sha256=zqUp-tu8OAcqzpOwx3XvzEq7UV6woDraUOcWasZI0a8,43748
21
+ athf/data/docs/INSTALL.md,sha256=JOWxk6q2-rdpgCnWdSPb3-Cp8rX1y4nQm7ObKz2G0uM,13117
22
+ athf/data/docs/README.md,sha256=rp-XQZeqteXJz7M2qKX3sl6o0AVfhGmz8GcNNKAt8pM,1061
23
+ athf/data/docs/environment.md,sha256=K88NBWZM2bI1Jztd0ORa6AYaMgPVjVB-K2fJl8S5-g8,8306
24
+ athf/data/docs/getting-started.md,sha256=j4SAXe-Rm1RhYBDvWaNpV8XS0rc_mZ2Ew0yPCxE4_wQ,14156
25
+ athf/data/docs/level4-agentic-workflows.md,sha256=DX54qu8LbJysjDfQLGSEPSO_Q6BUACLpa-XCsR6xUp4,13439
26
+ athf/data/docs/lock-pattern.md,sha256=eICjNh5SAgIhkOYBDhHg1tgw4A29xgnRDWC9vH1wLEQ,4863
27
+ athf/data/docs/maturity-model.md,sha256=S2m8JSQDe9R5ROBWS4Gy0-sRF5I7mo-CI3cUnmNpxmk,16347
28
+ athf/data/docs/why-athf.md,sha256=rIoUb7iqdZKbuWNyRlGxhZrRkLx7gWAGS-kurEZDt04,2148
29
+ athf/data/hunts/FORMAT_GUIDELINES.md,sha256=lMyBekmOzhtO1olO1P-M0Gi_n5oY60k7qkRZE63sTgw,15010
30
+ athf/data/hunts/H-0001.md,sha256=rdUIpQ_uN8bx7XS1ED85rW5aRKxFOpMg0X7PANY7eCY,23220
31
+ athf/data/hunts/H-0002.md,sha256=yF5ZEfl7NAJJMjuVf9ZitafwDfWMTzyU5fgkrAQ4U6I,20405
32
+ athf/data/hunts/H-0003.md,sha256=w0iAaplcM0kFWRmVhQsX53LVIWaRDJsB3TWalI1zz_o,27436
33
+ athf/data/hunts/README.md,sha256=WMj871_NTsMjYBriQ3xezOBktUs3KT7MTKVJSo0iwXA,5812
34
+ athf/data/integrations/MCP_CATALOG.md,sha256=hJ_cyHijEjWdkFiX7WEyBtJqlLtKuRzZCKlqrhbSLrU,1782
35
+ athf/data/integrations/README.md,sha256=jkiK0u5pNjodmFuNKKMR0G40Soq8pqBRVsaP89wP70w,4336
36
+ athf/data/integrations/quickstart/splunk.md,sha256=6REsD05zQOPcT6ezxyeysOtTRsSp7JO6vK_epd7GCJU,4897
37
+ athf/data/knowledge/hunting-knowledge.md,sha256=djublWCzFexl5ssssL6KfMm4RnUI0ANoWMY9zLSQDd0,91107
38
+ athf/data/prompts/README.md,sha256=5Jtz38Csh-rWjgX_zN46e3DxJoOfeeVQLDcIpcVExJ0,5029
39
+ athf/data/prompts/ai-workflow.md,sha256=rZtOcGuAEi35qx7182TwHJEORdz1-RxkZMBVkg611Rs,17087
40
+ athf/data/prompts/basic-prompts.md,sha256=2bunpO35RoBdJWYthXVi40RNl2UWrfwOaFthBLHF5sU,8463
41
+ athf/data/templates/HUNT_LOCK.md,sha256=zXxHaKMWbRDLewLTegYJMbXRM72s9gFFvjdwFfGNeJE,7386
42
+ athf/utils/__init__.py,sha256=aEAPI1xnAsowOtc036cCb9ZOek5nrrfevu8PElhbNgk,30
43
+ agentic_threat_hunting_framework-0.2.4.dist-info/METADATA,sha256=gcqEWImt2gBOrH2q5VUhafR5OiG_xIoCdpfbtEy1mt0,15472
44
+ agentic_threat_hunting_framework-0.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
45
+ agentic_threat_hunting_framework-0.2.4.dist-info/entry_points.txt,sha256=GopR2iTiBs-yNMWiUZ2DaFIFglXxWJx1XPjTa3ePtfE,39
46
+ agentic_threat_hunting_framework-0.2.4.dist-info/top_level.txt,sha256=Cxxg6SMLfawDJWBITsciRzq27XV8fiaAor23o9Byoes,5
47
+ agentic_threat_hunting_framework-0.2.4.dist-info/RECORD,,
athf/__version__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Version information for ATHF."""
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.4"
athf/cli.py CHANGED
@@ -40,7 +40,7 @@ Getting Started:
40
40
  Documentation:
41
41
  • Full docs: https://github.com/Nebulock-Inc/agentic-threat-hunting-framework
42
42
  • CLI reference: docs/CLI_REFERENCE.md
43
- • AI workflows: prompts/ai-workflow.md
43
+ • AI workflows: Run 'athf init' to get prompts/ai-workflow.md
44
44
 
45
45
  \b
46
46
  Need help? Run 'athf COMMAND --help' for command-specific help.
athf/commands/context.py CHANGED
@@ -22,6 +22,9 @@ Examples:
22
22
  # Export context for macOS platform hunts
23
23
  athf context --platform macos
24
24
 
25
+ # Combine filters: persistence hunts on Linux
26
+ athf context --tactic persistence --platform linux
27
+
25
28
  # Export full repository context (large output)
26
29
  athf context --full
27
30
 
@@ -86,18 +89,20 @@ def context(
86
89
  • With context: 1 command, ~1,000 tokens
87
90
  • Savings: ~2,000 tokens per hunt (~$0.03 per hunt)
88
91
  """
89
- # Validate mutually exclusive options
90
- exclusive_options = sum([bool(hunt), bool(tactic), bool(platform), full])
91
- if exclusive_options == 0:
92
- console.print("[red]Error: Must specify one of: --hunt, --tactic, --platform, or --full[/red]")
92
+ # Validate that at least one filter is provided
93
+ has_filter = any([hunt, tactic, platform, full])
94
+ if not has_filter:
95
+ console.print("[red]Error: Must specify at least one of: --hunt, --tactic, --platform, or --full[/red]")
93
96
  console.print("\n[dim]Examples:[/dim]")
94
97
  console.print(" athf context --hunt H-0013")
95
98
  console.print(" athf context --tactic credential-access")
96
99
  console.print(" athf context --platform macos")
100
+ console.print(" athf context --tactic persistence --platform linux")
97
101
  raise click.Abort()
98
102
 
99
- if exclusive_options > 1:
100
- console.print("[red]Error: Only one filter option allowed at a time[/red]")
103
+ # --full flag is mutually exclusive with other filters
104
+ if full and (hunt or tactic or platform):
105
+ console.print("[red]Error: --full cannot be combined with other filters[/red]")
101
106
  raise click.Abort()
102
107
 
103
108
  # Build context bundle
@@ -158,17 +163,26 @@ def _build_context(
158
163
  if index_path.exists():
159
164
  context["hunt_index"] = _read_and_optimize(index_path)
160
165
 
161
- # Load hunts based on filter
162
- if hunt:
163
- hunt_files = [Path(f"hunts/{hunt}.md")]
164
- elif tactic:
165
- hunt_files = _find_hunts_by_tactic(tactic)
166
- elif platform:
167
- hunt_files = _find_hunts_by_platform(platform)
168
- elif full:
166
+ # Load hunts based on filters (can be combined)
167
+ if full:
168
+ # Full export: include all hunts
169
169
  hunt_files = list(Path("hunts").glob("H-*.md"))
170
+ elif hunt:
171
+ # Specific hunt: only load that one
172
+ hunt_files = [Path(f"hunts/{hunt}.md")]
170
173
  else:
171
- hunt_files = []
174
+ # Combine tactic and platform filters
175
+ if tactic and platform:
176
+ # Both filters: find hunts matching both criteria
177
+ tactic_hunts = set(_find_hunts_by_tactic(tactic))
178
+ platform_hunts = set(_find_hunts_by_platform(platform))
179
+ hunt_files = list(tactic_hunts & platform_hunts) # Intersection
180
+ elif tactic:
181
+ hunt_files = _find_hunts_by_tactic(tactic)
182
+ elif platform:
183
+ hunt_files = _find_hunts_by_platform(platform)
184
+ else:
185
+ hunt_files = []
172
186
 
173
187
  # Load hunt content
174
188
  for hunt_file in hunt_files:
athf/commands/hunt.py CHANGED
@@ -448,9 +448,7 @@ def stats() -> None:
448
448
  # Easter egg: First True Positive milestone
449
449
  if stats["true_positives"] == 1 and stats["completed_hunts"] > 0:
450
450
  console.print("[bold yellow]🎯 First True Positive Detected![/bold yellow]\n")
451
- console.print("[italic]Every expert threat hunter started here.")
452
- console.print("This confirms your hypothesis was testable, your data was sufficient,")
453
- console.print("and your analytical instincts were sound. Document what worked.[/italic]\n")
451
+ console.print("[italic]Every expert threat hunter started here. This confirms your hypothesis was testable, your data was sufficient, and your analytical instincts were sound. Document what worked.[/italic]\n")
454
452
 
455
453
 
456
454
  @hunt.command()
athf/commands/init.py CHANGED
@@ -1,5 +1,6 @@
1
1
  """Initialize ATHF directory structure."""
2
2
 
3
+ import shutil
3
4
  from pathlib import Path
4
5
 
5
6
  import click
@@ -7,6 +8,8 @@ import yaml
7
8
  from rich.console import Console
8
9
  from rich.prompt import Confirm, Prompt
9
10
 
11
+ from athf.data import get_data_path
12
+
10
13
  console = Console()
11
14
 
12
15
 
@@ -107,6 +110,9 @@ def init(path: str, non_interactive: bool) -> None:
107
110
  _create_hunt_template(templates_path / "HUNT_LOCK.md")
108
111
  console.print(" ✓ Created [cyan]templates/HUNT_LOCK.md[/cyan]")
109
112
 
113
+ # Copy reference files from package data
114
+ _copy_reference_files(base_path)
115
+
110
116
  console.print("\n[bold green]✅ ATHF initialized successfully![/bold green]")
111
117
  console.print("\n[bold]Next steps:[/bold]")
112
118
  console.print(" 1. Customize [cyan]AGENTS.md[/cyan] with your environment details")
@@ -409,3 +415,42 @@ tags: []
409
415
 
410
416
  with open(path, "w", encoding="utf-8") as f:
411
417
  f.write(content)
418
+
419
+
420
+ def _copy_reference_files(base_path: Path) -> None:
421
+ """Copy reference files from package data to workspace.
422
+
423
+ Copies knowledge base, prompts, example hunts, docs, and integrations
424
+ from the installed package to the user's workspace.
425
+ """
426
+ try:
427
+ data_path = get_data_path()
428
+ except Exception:
429
+ # Package data not available (e.g., development mode)
430
+ console.print(" [dim]Skipping reference file copy (package data not available)[/dim]")
431
+ return
432
+
433
+ # Directories to copy from package to workspace
434
+ copy_dirs = ["knowledge", "prompts", "hunts", "docs", "integrations"]
435
+
436
+ for dir_name in copy_dirs:
437
+ src_dir = data_path / dir_name
438
+ dst_dir = base_path / dir_name
439
+
440
+ if src_dir.exists() and src_dir.is_dir():
441
+ try:
442
+ # Copy files, don't overwrite existing
443
+ for src_file in src_dir.rglob("*"):
444
+ if src_file.is_file():
445
+ # Calculate relative path and destination
446
+ rel_path = src_file.relative_to(src_dir)
447
+ dst_file = dst_dir / rel_path
448
+
449
+ # Only copy if destination doesn't exist
450
+ if not dst_file.exists():
451
+ dst_file.parent.mkdir(parents=True, exist_ok=True)
452
+ shutil.copy2(src_file, dst_file)
453
+
454
+ console.print(f" ✓ Copied reference files to [cyan]{dir_name}/[/cyan]")
455
+ except Exception as e:
456
+ console.print(f" [yellow]Warning: Could not copy {dir_name}/: {e}[/yellow]")
athf/commands/similar.py CHANGED
@@ -144,7 +144,7 @@ def _find_similar_hunts(
144
144
  hunt_files = list(hunts_dir.glob("H-*.md"))
145
145
 
146
146
  if not hunt_files:
147
- console.print("[yellow]No hunts found in hunts/ directory[/yellow]")
147
+ # Don't print warning - let the output format handle empty results
148
148
  return []
149
149
 
150
150
  # Extract hunt content and metadata
@@ -172,7 +172,7 @@ def _find_similar_hunts(
172
172
  )
173
173
 
174
174
  if not hunt_data:
175
- console.print("[yellow]No hunts available for comparison[/yellow]")
175
+ # Don't print warning - let the output format handle empty results
176
176
  return []
177
177
 
178
178
  # Build TF-IDF vectors using searchable text (weighted semantic sections)
athf/core/hunt_manager.py CHANGED
@@ -154,7 +154,14 @@ class HuntManager:
154
154
  results = []
155
155
  query_lower = query.lower()
156
156
 
157
+ # Exclude documentation files
158
+ exclude_files = {"README.md", "FORMAT_GUIDELINES.md"}
159
+
157
160
  for hunt_file in self.hunts_dir.glob("*.md"):
161
+ # Skip documentation files
162
+ if hunt_file.name in exclude_files:
163
+ continue
164
+
158
165
  try:
159
166
  with open(hunt_file, "r", encoding="utf-8") as f:
160
167
  content = f.read()
athf/data/__init__.py ADDED
@@ -0,0 +1,14 @@
1
+ """ATHF reference data and templates."""
2
+
3
+ from importlib.resources import files
4
+ from pathlib import Path
5
+
6
+
7
+ def get_data_path() -> Path:
8
+ """Get the path to ATHF data directory.
9
+
10
+ Returns:
11
+ Path to the athf/data directory containing templates, knowledge,
12
+ prompts, hunts, docs, and integrations.
13
+ """
14
+ return Path(str(files("athf.data")))
@@ -0,0 +1,147 @@
1
+ # Changelog
2
+
3
+ All notable changes to the Agentic Threat Hunting Framework (ATHF) will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - None
12
+
13
+ ### Changed
14
+ - None
15
+
16
+ ### Deprecated
17
+ - None
18
+
19
+ ### Removed
20
+ - None
21
+
22
+ ### Fixed
23
+ - None
24
+
25
+ ### Security
26
+ - None
27
+
28
+ ## [0.2.2] - 2024-12-17
29
+
30
+ ### Fixed
31
+ - Type errors in `athf/core/attack_matrix.py` (added TypedDict for proper mypy checking)
32
+ - Python 3.8 compatibility: `list[str]` → `List[str]` in `athf/core/attack_matrix.py`
33
+ - Python 3.8 compatibility: `tuple[...]` → `Tuple[...]` in `athf/core/investigation_parser.py`
34
+ - Python 3.8 compatibility: `tuple[...]`, `list[str]` → `Tuple[...]`, `List[str]` in `athf/commands/investigate.py`
35
+ - Python 3.8 compatibility: `set[str]` → `Set[str]` in `athf/core/hunt_manager.py`
36
+ - Python 3.8 compatibility: `int | str` → `Union[int, str]` in `athf/commands/env.py`
37
+ - Windows UTF-8 encoding errors in `athf/commands/context.py` (3 instances) and `athf/commands/similar.py` (2 instances)
38
+ - Test assertion errors in `tests/commands/test_env.py` for env info and activate commands
39
+ - Mypy unused-ignore errors in `athf/commands/similar.py` (sklearn imports handled by --ignore-missing-imports flag)
40
+ - CI/CD pipeline errors blocking builds on Python 3.8-3.12 across all platforms
41
+
42
+ ## [0.2.1] - 2024-12-17
43
+
44
+ ### Fixed
45
+ - Type errors in `athf/core/attack_matrix.py` (added TypedDict for proper mypy checking)
46
+ - Python 3.8 compatibility: `list[str]` → `List[str]` in `athf/core/attack_matrix.py`
47
+ - Python 3.8 compatibility: `tuple[...]` → `Tuple[...]` in `athf/core/investigation_parser.py`
48
+ - Python 3.8 compatibility: `tuple[...]`, `list[str]` → `Tuple[...]`, `List[str]` in `athf/commands/investigate.py`
49
+ - Python 3.8 compatibility: `set[str]` → `Set[str]` in `athf/core/hunt_manager.py`
50
+ - Python 3.8 compatibility: `int | str` → `Union[int, str]` in `athf/commands/env.py`
51
+ - Windows UTF-8 encoding errors in `athf/commands/context.py` (3 instances) and `athf/commands/similar.py` (2 instances)
52
+ - Test assertion errors in `tests/commands/test_env.py` for env info and activate commands
53
+ - Mypy unused-ignore errors in `athf/commands/similar.py` (sklearn imports handled by --ignore-missing-imports flag)
54
+ - CI/CD pipeline errors blocking builds on Python 3.8-3.12 across all platforms
55
+
56
+ ## [0.2.0] - 2024-12-17
57
+
58
+ ### Added
59
+ - **CLI Commands**
60
+ - `athf context` - AI-optimized context loading (replaces ~5 Read operations, 75% token savings)
61
+ - `athf env` - Environment setup and management (setup, info, activate, clean)
62
+ - `athf investigate` - Investigation workflow for exploratory work (separate from hunt metrics)
63
+ - `athf similar` - Semantic search for similar hunts using scikit-learn embeddings
64
+ - **Core Modules**
65
+ - `athf/core/attack_matrix.py` - MITRE ATT&CK coverage tracking and analysis
66
+ - `athf/core/investigation_parser.py` - Parser for I-XXXX investigation files
67
+ - **Testing Infrastructure**
68
+ - Comprehensive test suite for all new commands (tests/commands/)
69
+ - Command-specific test modules (test_context.py, test_env.py, test_similar.py)
70
+ - Integration tests for multi-command workflows
71
+ - **Rich Content CLI Flags**
72
+ - `--hypothesis`, `--threat-context`, `--actor`, `--behavior`, `--location`, `--evidence`
73
+ - Enable fully-populated hunt files via single CLI command
74
+ - AI-friendly one-liner hunt creation without manual editing
75
+
76
+ ### Changed
77
+ - Enhanced `athf hunt` command with investigation integration
78
+ - Updated CLI help system with improved command descriptions
79
+ - Improved context bundling for AI workflows (structured JSON/YAML output)
80
+ - Updated documentation to reflect new commands and workflows
81
+
82
+ ### Fixed
83
+ - Python 3.8 compatibility issues
84
+ - Testing framework stability improvements
85
+
86
+ ## [0.1.0] - 2024-12-10
87
+
88
+ ### Added
89
+ - Initial ATHF framework documentation
90
+ - LOCK pattern (Learn, Observe, Check, Keep)
91
+ - 5-level maturity model
92
+ - USING_ATHF.md adoption guide
93
+ - INSTALL.md installation guide
94
+ - Example hunt implementations
95
+ - H-0001: macOS Data Collection via AppleScript Detection
96
+ - H-0002: Linux Crontab Persistence Detection
97
+ - H-0003: AWS Lambda Persistence Detection
98
+ - Templates
99
+ - HUNT_LOCK.md template
100
+ - Query templates for Splunk, KQL, Elastic
101
+ - Documentation
102
+ - README.md with visual enhancements
103
+ - SHOWCASE.md with real results
104
+ - docs/CLI_REFERENCE.md (planned for CLI implementation)
105
+ - Knowledge base
106
+ - hunting-knowledge.md expert hunting frameworks
107
+ - AGENTS.md AI assistant instructions
108
+ - environment.md template
109
+ - Integration guides
110
+ - MCP_CATALOG.md for tool integrations
111
+ - SIEM integration examples
112
+ - EDR integration examples
113
+
114
+ ### Philosophy
115
+ - Framework-first approach: "Structure over software, adapt to your environment"
116
+ - Document-first methodology: Works with markdown, git, and AI assistants
117
+ - Optional tooling: CLI enhances but doesn't replace core workflow
118
+ - Progression-minded: Start simple, scale when complexity demands it
119
+
120
+ ---
121
+
122
+ ## Version History
123
+
124
+ **Legend:**
125
+ - `[Unreleased]` - Changes in development
126
+ - `[X.Y.Z]` - Released versions
127
+
128
+ **Version Format:**
129
+ - `X` - Major version (breaking changes)
130
+ - `Y` - Minor version (new features, backward compatible)
131
+ - `Z` - Patch version (bug fixes, backward compatible)
132
+
133
+ **Change Categories:**
134
+ - `Added` - New features
135
+ - `Changed` - Changes to existing functionality
136
+ - `Deprecated` - Soon-to-be removed features
137
+ - `Removed` - Removed features
138
+ - `Fixed` - Bug fixes
139
+ - `Security` - Security improvements
140
+
141
+ ---
142
+
143
+ ## Contribution Notes
144
+
145
+ ATHF is a framework to internalize, not a platform to extend. However, if you've adapted ATHF in interesting ways or have feedback, we'd love to hear about it in [GitHub Discussions](https://github.com/Nebulock-Inc/agentic-threat-hunting-framework/discussions).
146
+
147
+ For more on the philosophy, see [USING_ATHF.md](../../../USING_ATHF.md).