Releases: mitre/cis-bench
v0.5.0
v0.5.0 (2026-01-29)
Chores
-
Add CLAUDE.md to repo for project context (
c30dc50) -
Remove CLAUDE.md from .gitignore
-
Add CLAUDE.md with project overview, commands, architecture notes
Authored by: Aaron Lippoldlippold@gmail.com
- Gitignore beads runtime artifacts (
6cb78c8)
Add .beads/last-touched to gitignore - this is an auto-generated timestamp file that changes on every beads operation.
Note: .beads/issues.jsonl IS tracked (contains actual task data)
Authored by: Aaron Lippoldlippold@gmail.com
- Update uv.lock for v0.4.0 (
0078ab7)
Authored by: Aaron Lippoldlippold@gmail.com
Continuous Integration
- Add manual trigger to release workflow (
3b0bd50)
Allows re-running release via workflow_dispatch when automatic trigger fails due to race conditions.
Authored by: Aaron Lippoldlippold@gmail.com
- Fix release workflow to allow manual dispatch (
5f3bc09)
The if condition was blocking workflow_dispatch triggers.
Authored by: Aaron Lippoldlippold@gmail.com
Documentation
-
Update CLI documentation for simplified auth workflow (
2791e14) -
Remove --browser and --cookies flags from download/get command docs
-
Add --cookies option to auth login documentation
-
Add Windows troubleshooting for Chrome App-Bound Encryption
-
Update CI/CD example to use auth login with cookies
-
Update test count to 1,100+ and coverage to 96%
-
Update version to 0.4.0
-
Fix markdown list formatting in CHANGELOG
Auth is now centralized: use 'cis-bench auth login' for all authentication, then other commands use the saved session automatically.
Authored by: Aaron Lippoldlippold@gmail.com
Features
- feat: add batch export for multiple benchmarks
- Export multiple benchmark IDs in single command
- Add --output-dir option for batch exports
- Progress tracking with [1/N] prefix
- Continue on individual failures with summary
- 15 new TDD tests in test_batch_export.py
- Backward compatible with single ID exports
- Update commands-reference.md documentation
Authored by: Aaron Lippoldlippold@gmail.com
- docs: fix README links to point to GitHub Pages
- Update all relative doc links to use full GitHub Pages URLs
- Add prominent link to https://mitre.github.io/cis-bench/
- Add batch export to current features list
- Fix Quick Links section at bottom
Testing
- Achieve 95.96% test coverage with comprehensive unit tests (
8fe8425)
Add 356 new unit tests across 10 test files covering:
- cli/commands/catalog.py: 32% → 100% (53 tests)
- cli/commands/auth.py: 70% → 99% (67 tests)
- cli/commands/download.py: 75% → 99% (27 tests)
- cli/commands/get.py: 76% → 99% (included above)
- catalog/parser.py: 66% → 100% (78 tests)
- exporters/xccdf_unified_exporter.py: 56% → 98% (50 tests)
- config.py: 67% → 97% (41 tests)
- validators/disa_conventions.py: 70% → 100% (38 tests)
- utils/xml_utils.py: 70% → 95% (60 tests)
- utils/html_parser.py: 67% → 98% (included above)
Total: 1106 tests passing, overall coverage 95.96%
Authored by: Aaron Lippoldlippold@gmail.com
Detailed Changes: v0.4.0...v0.5.0
v0.4.0
v0.4.0 (2026-01-29)
Bug Fixes
- Include YAML config files in PyPI package distribution (
dbe533e)
Fixes Issue #6 - users installing from PyPI got 'cis is not one of .' error because YAML style configs were not included in the package.
Added [tool.setuptools.package-data] to include exporters/configs/**/*.yaml
Authored by: Aaron Lippoldlippold@gmail.com
Chores
- Fix semantic-release to use standard conventional commits (
191b96d)
Only feat/fix/perf now trigger releases:
- feat: minor release
- fix: patch release
- perf: patch release
- docs, chore, refactor, style, test, ci, build: no release
Authored by: Aaron Lippold lippold@gmail.com
- Update beads with recovery card (
9e28ac6)
Authored by: Aaron Lippoldlippold@gmail.com
-
Update project status and beads tasks (
07f6bf4) -
Update version to 0.3.3
-
Add semantic-release fix to completed work
-
Update open tasks list
-
Sync beads database
Authored by: Aaron Lippold lippold@gmail.com
Features
- Add Windows cookie extraction fallback and --cookies option (
84152cd)
Issue #3 improvements:
- Auto-fallback to Firefox when Chrome/Edge fails on Windows with permission error
- Add --cookies option to 'auth login' command for cookie file import
- Better error messages explaining Chrome App-Bound Encryption limitation
- Windows permission error detection (_is_windows_permission_error)
- Helpful workarounds in error messages (Firefox, close browser, cookie file)
Authored by: Aaron Lippoldlippold@gmail.com
Refactoring
- Remove auth flags from download and get commands (DRY) (
69ffbd1)
Simplify CLI structure - auth flags now only on 'auth login':
- Remove --browser, --cookies, --no-verify-ssl from download command
- Remove --browser from get command
- Users must run 'auth login' first, then other commands use saved session
- Better error messages directing users to auth login
This follows DRY principle and prevents user confusion (Issue #3 user tried --cookies on wrong command).
Authored by: Aaron Lippoldlippold@gmail.com
Testing
New test files (92 tests total):
- test_package_data.py: Verify YAML configs included in package (9 tests)
- test_auth_windows_fallback.py: Windows permission detection, Firefox fallback (13 tests)
- test_cli_structure.py: Verify auth flags only on auth login (15 tests)
- test_metadata_models.py: CIS Controls and Enhanced Metadata models (30 tests)
- test_xhtml_formatter.py: XHTML element creation and serialization (25 tests)
Updated existing tests for new CLI structure (removed --browser from download/get).
Coverage improved: 81.9% → 83.6%
Authored by: Aaron Lippoldlippold@gmail.com
Detailed Changes: v0.3.3...v0.4.0
v0.3.3
v0.3.3 (2025-12-19)
Chores
- Add beads task tracker for project management (
4e0f733)
Initialize beads (bd) for tracking completed, current, and future work:
- .beads/ directory with config and issue database
- AGENTS.md with session completion workflow
- .gitattributes with beads merge driver
Authored by: Aaron Lippold lippold@gmail.com
- Update beads task statuses (
c32c51d)
Documentation
- Add CURRENT_STATUS.md for project state tracking (
18b2a72)
Quick reference for resuming work after breaks:
- Project state and feature status
- Open tasks from beads
- Completed work summary
- Recovery prompt for new sessions
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.3.2...v0.3.3
v0.3.2
v0.3.2 (2025-12-19)
Documentation
-
Add Catalog System section to architecture (
5587850) -
Document SQLite database with SQLModel ORM
-
Document FTS5 full-text search implementation
-
Document schema with tables and relationships
-
Explain catalog metadata vs downloaded benchmarks distinction
-
Document Alembic migrations for schema versioning
-
Add platform inference patterns documentation
-
Update package structure to include catalog module
-
Update dependencies to include sqlmodel and alembic
-
Add catalog commands to Commands section
Authored by: Aaron Lippold lippold@gmail.com
- Reorganize design docs and fix documentation issues (
dff7974)
Session 29-30 documentation cleanup:
Design document reorganization: - Move ARCHITECTURE_PRINCIPLES.md → docs/design/design-principles.md - Move SYSTEM_ANALYSIS.md → docs/design/handler-reference.md - Move REFACTOR_PLAN.md → docs/design/xccdf-mapping-design.md - Move FINAL_PLAN.md → docs/design/architecture-decisions.md - Reduce total from 2,596 to 1,090 lines (58% reduction) - Add Design Documents section to mkdocs.yml navigation
Documentation fixes: - Fix Python version requirement: 3.8+ → 3.12+ (4 files) - Fix project version: 1.0.0 → 0.3.1 (3 files) - Fix 12 broken links (case sensitivity: UPPERCASE → lowercase) - Standardize navigation header indentation (8 files) - Add CHANGELOG.md and NOTICE.md symlinks to docs/ - Add Third-Party Notices to About nav section - Fix NOTICE.md link path in licensing.md - Fix 3 missing anchor links (catalog-commands, scenario-4, yaml) - Fix mermaid syntax error (Loop → FieldLoop reserved keyword)
File cleanup: - Delete obsolete setup.py and requirements.txt - Move fix_markdown_lists.py → scripts/ - Add redownload_samples.py to scripts/ - Move python-project-setup-guide.md to root (general reference) - Update .pre-commit-config.yaml for new script location - Add RECOVERY*.md to .gitignore
Build verified: mkdocs build --strict passes with no warnings
Authored by: Aaron Lippoldlippold@gmail.com
Detailed Changes: v0.3.1...v0.3.2
v0.3.1
v0.3.1 (2025-12-17)
Bug Fixes
- Add --all-extras to packaging test step (
bc5cf77)
Authored by: Aaron Lippold lippold@gmail.com
-
Correct CLI packaging for pipx/uv installation (
0a9a48b) -
Add main.py for
python -m cis_benchfallback -
Add pipx.run entry point for pipx compatibility
-
Fix hardcoded version (now reads from importlib.metadata)
-
Update author to MITRE SAF Team
-
Add packaging verification job to CI (tests pipx install)
-
Update docs to recommend pipx/uv over pip (per Python Packaging Authority)
-
Fix 14 broken doc links (wrong case)
-
Add CHANGELOG to mkdocs nav
-
Docs now deploy after CI passes (not just after Release)
Authored by: Aaron Lippold lippold@gmail.com
- Update version test to use dynamic version (
c1f307b)
Test was expecting hardcoded 1.0.0 instead of actual package version
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.3.0...v0.3.1
v0.3.0
v0.3.0 (2025-12-17)
Bug Fixes
- Preserve types in VariableSubstituter and fix empty element handling (
a91b42b)
VariableSubstituter changes:
- Preserve original type for single-variable templates ({item.ig1})
- Convert to string only for mixed templates (text + variable)
- Fixes boolean attributes (False → 'false' for XML)
Empty element handling:
- Allow elements with attributes but no content (DISA fix element)
- Skip only if no value AND no attributes
Fixes:
- CIS Controls ig1/ig2/ig3 now lowercase 'true'/'false'
- DISA fix elements now generated
Authored by: Aaron Lippold lippold@gmail.com
Chores
- Add OpenSCAP schema library for validation (
ef78dc0)
Add complete XCCDF/CPE/OVAL schema collection from OpenSCAP (551 XSD files).
Includes:
- XCCDF 1.1 and 1.2 validation schemas
- CPE 1.0, 2.0, 2.1, 2.3 schemas
- OVAL 5.x schemas (all versions)
- ARF (Asset Reporting Format) schemas
Updated XML catalog for proper schema resolution (local files, no network).
Enables NIST XCCDF schema validation without external dependencies.
Source: OpenSCAP/openscap (NIST certified SCAP 1.2 toolkit)
Authored by: Aaron Lippold lippold@gmail.com
Continuous Integration
- Install libxml2-utils for xmllint schema validation (
d6c7218)
The test_disa_export_validates_nist_schema test requires xmllint to validate XCCDF exports against the NIST schema.
Authored by: Aaron Lippold lippold@gmail.com
Documentation
- Complete Phase 5 - comprehensive documentation updates (
29faca9)
Updated ALL documentation files for generic structure refactor:
Core Docs Updated: - design-philosophy.md: DISA vs CIS export patterns - architecture.md: Generic handler architecture - mapping-engine-design.md: Handler specifications - mapping-engine-guide.md: Practical examples - how-to-add-xccdf-style.md: Zero-code extensibility - yaml-config-reference.md: Updated structure names
New Docs: - REFACTOR_SUMMARY.md: High-level overview - ARCHITECTURE_PRINCIPLES.md: Design enforcement - FINAL_PLAN.md: Implementation plan - SYSTEM_ANALYSIS.md: System review - adding-pci-dss.md: Framework extension guide
All references to deleted patterns removed: - official_cis_controls → metadata_from_config - enhanced_namespace → ident_from_list - custom_namespace → metadata_from_config - build_cis_controls → (deleted, now generic)
Documents DISA/CIS differences, generic patterns, extensibility.
Phase 5 complete.
Authored by: Aaron Lippold lippold@gmail.com
- Update documentation for generic structure handlers (
b847a0d)
Updates:
- design-philosophy.md: Document DISA vs CIS export differences
- REFACTOR_SUMMARY.md: High-level overview of changes
- developer-guide/adding-pci-dss.md: Framework extension example
Key changes documented:
- DISA uses idents only (no metadata) - fixes Vulcan errors
- CIS uses dual representation (ident + metadata for CIS Controls)
- MITRE now as idents (not in metadata - cleaner)
- Profiles at Benchmark level (proper XCCDF standard)
- Adding frameworks requires only YAML config
Phase 5 complete.
Authored by: Aaron Lippold lippold@gmail.com
Features
- Add fix element to DISA exports (
94f2858)
Add empty elements to match official DISA STIG structure.
Official DISA STIGs have fix elements as placeholders with ID attributes. Required for full DISA STIG compliance.
Authored by: Aaron Lippold lippold@gmail.com
- Add LibCST utility for safe code refactoring (
7ff8470)
Add scripts/remove_code.py with comprehensive test suite for safely removing functions, methods, and classes during refactoring.
- LibCST-based code removal (preserves formatting)
- 27 comprehensive tests (edge cases covered)
- Dry-run mode for safety
- Handles decorators, async, dataclass, nested functions
This tool enables safe cleanup during XCCDF refactoring.
Authored by: Aaron Lippold lippold@gmail.com
-
Config-driven STIG IDs and Vulcan compatibility (
40522b5) -
Add config-driven ID generation (V-/SV- for DISA, descriptive for CIS)
-
Add ref_to_stig_number() helper (3.1.1 → 030101)
-
Add strip_version_prefix transform (v4.0.0 → 4.0.0)
-
Restructure configs: base.yaml + styles/{disa,cis}.yaml
-
Fix duplicate CCI deduplication
-
Remove status from Rules (belongs at Benchmark level only)
-
Add 40+ new tests for ID formats and Vulcan compatibility
-
Move test_remove_code_script.py to tests/scripts/
Tested: 583 tests pass, validated with stig_parser and Vulcan 2.2.1
Authored by: Aaron Lippold lippold@gmail.com
- Implement generic config-driven structure handlers (
e46ef23)
Add three generic handlers for XCCDF generation:
-
generate_idents_from_config(): Generate ident elements from any list - Works for CCI, CIS Controls, MITRE, PCI-DSS, ISO 27001, etc. - Template-based (system, value, optional attributes)
-
generate_metadata_from_config(): Generate nested XML from config - Supports grouping (e.g., CIS Controls by version) - Recursive children with attributes and content - Requires post-processing flag for lxml injection
-
generate_profiles_from_rules(): Generate Benchmark-level Profiles - Builds Profile elements with select lists - Works for CIS Levels, DISA MAC, any applicability system
All handlers are fully config-driven (no hard-coded structures). Removes organization-specific methods (build_cis_controls, generate_cis_idents).
Tests: - 11 unit tests for metadata generation - 4 integration tests for profile generation - All passing
Authored by: Aaron Lippold lippold@gmail.com
Refactoring
- Update CIS export to use generic patterns (
058dacb)
CIS configuration changes:
- Use metadata_from_config for CIS Controls (with post-processing)
- Use ident_from_list for MITRE (not metadata - cleaner)
- Add profiles configuration
- Remove old enhanced_namespace and official_cis_controls patterns
Exporter changes:
- Implement generic _inject_metadata_from_config() method
- Remove hard-coded CIS-specific injection
- Metadata injection now config-driven (requires_post_processing flag)
Test updates:
- Update CIS tests for new architecture
- MITRE now as idents (not in enhanced metadata)
- Profiles now at Benchmark level (not in metadata)
CIS exports now use dual representation:
- CIS Controls in both ident and metadata (official pattern)
- MITRE in idents only (no namespace pollution)
Authored by: Aaron Lippold lippold@gmail.com
Testing
-
Fix all skipped tests and improve assertions (
5078775) -
Remove skip from NIST schema validation (schemas now available)
-
Remove skip from DISA conventions validation (works correctly)
-
Fix CIS ident/metadata count assertion (dual representation = 2x idents)
-
Fix boolean attribute test (now checks for lowercase)
-
Add mock PCI-DSS config to prove extensibility
-
Fix Pydantic validator for total_recommendations count
All 575 tests now passing (0 skipped, 0 failed).
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.2.3...v0.3.0
v0.2.3
v0.2.3 (2025-12-16)
Documentation
- Add comprehensive Python project setup guide (
d4b383f)
Reusable template for MITRE Python projects covering uv, ruff, semantic-release, CI/CD, testing, and community health files.
Also copied to repo-minder for organizational reuse.
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.2.2...v0.2.3
v0.2.2
v0.2.2 (2025-12-15)
Documentation
-
Add community health files and document gitflow workflow (
8b13420) -
Add SECURITY.md (vulnerability disclosure policy)
-
Add CODE_OF_CONDUCT.md (Contributor Covenant)
-
Rename LICENSE to LICENSE.md (standard naming)
-
Update contributing.md with gitflow workflow documentation
- Document branch-based development (required for semantic-release)
- Add conventional commit guidelines
- Update setup instructions to use uv
- Explain why we don't commit directly to main
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.2.1...v0.2.2
v0.2.1
v0.2.1 (2025-12-15)
Documentation
-
Add community health files and document gitflow workflow (
5de6095) -
Add SECURITY.md (vulnerability disclosure policy)
-
Add CODE_OF_CONDUCT.md (Contributor Covenant)
-
Rename LICENSE to LICENSE.md (standard naming)
-
Update contributing.md with gitflow workflow documentation
- Document branch-based development (required for semantic-release)
- Add conventional commit guidelines
- Update setup instructions to use uv
- Explain why we don't commit directly to main
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.2.0...v0.2.1
v0.2.0
v0.2.0 (2025-12-15)
Bug Fixes
-
Add --all-extras to all uv run commands in CI (
e9f5443) -
Ensures dev dependencies (pytest, ruff, etc.) are installed
-
Fixes 'pytest: command not found' errors
Authored by: Aaron Lippold lippold@gmail.com
-
Docs deploy only after successful release (
6393d9f) -
Change docs workflow to depend on Release success, not CI
-
Ensures documentation matches published PyPI version
-
Prevents docs updates for failed releases
-
Add PyPI version badge to README
-
Update Python version badge to 3.12+
-
Add CI status badge
-
Update installation to use PyPI package
Authored by: Aaron Lippold lippold@gmail.com
-
Use --frozen instead of --locked in CI workflows (
d7d3129) -
Change from --locked to --frozen for uv commands
-
--frozen allows metadata updates while using lock file
-
Fixes lockfile update errors in CI
-
Simplify security job to use uv run --with bandit
Authored by: Aaron Lippold lippold@gmail.com
Features
-
Complete migration to uv package manager (
fb30489) -
Update CI workflow to use setup-uv@v7 with caching
-
Use uv sync --locked for reproducible builds
-
Use uv run for all commands (pytest, ruff, bandit)
-
Remove ruff-action, use uv run ruff instead
-
Add uv.lock for dependency locking
-
Update README to recommend uv installation
-
Faster CI runs (10-100x faster than pip)
-
Consistent with modern Python ecosystem (2025)
Authored by: Aaron Lippold lippold@gmail.com
-
Migrate to uv for dependency management (
edfbb7c) -
Add uv.lock for reproducible builds
-
Update README to recommend uv for installation
-
Align local development with CI (already uses uv)
-
10-100x faster than pip
-
Better dependency resolution
Authored by: Aaron Lippold lippold@gmail.com
Detailed Changes: v0.1.0...v0.2.0