This is a polish and bug-fix release focused on improving the DCSServerBot plugin user experience.
All Discord commands have been simplified to use only interactive mode:
Before (v2.0.0):
/foothold-checkpoint save server:VEAF campaign:afghanistan name:backup comment:test
/foothold-checkpoint restore server:VEAF checkpoint:file.zip campaign:afghanistan auto_backup:true
/foothold-checkpoint list campaign:afghanistan
/foothold-checkpoint delete checkpoint:file.zip campaign:afghanistan
After (v2.1.0):
/foothold-checkpoint save server:VEAF
/foothold-checkpoint restore server:VEAF
/foothold-checkpoint list
/foothold-checkpoint delete
Benefits:
- ✅ Simpler syntax: Only required parameters (server for save/restore)
- ✅ Consistent UX: All commands use the same interactive workflow
- ✅ No confusion: One way to do things (no dual mode)
- ✅ Better discovery: Users see all available options via dropdowns
- ✅ Safer defaults: Auto-backup always enabled for restore operations
Interactive Features:
- 📋 Campaign selection dropdown (shows only detected campaigns)
- 📝 Optional metadata modal for custom name and comment
- ✅ Confirmation dialogs with full checkpoint details
- 🔄 Single updating message (no message spam)
Restore command now uses a single updating message:
- Before: 3 separate messages remained visible (selection + confirmation + result)
- After: 1 message that updates through selection → confirmation → result
- Result: Much cleaner Discord interface with less visual clutter
Restore success message now always shows backup status:
✅ Checkpoint Restored
📄 Restored From: germany_modern_2026-02-17_11-05-18.zip
🖥️ Server: VEAF (www.veaf.org) [fr] - Private Foothold 2
💾 Auto-Backup Created: auto-backup-germany_modern-20260217-114405.zip
⚠️ Server restart may be required for changes to take effect
- 📦 Shows backup filename when available
- ✅ Shows confirmation when backup created but filename not returned
- 🛡️ Ensures users know a safety backup was created
- Issue: "No schema files found for plugin foothold-checkpoint" warning at startup
- Fix: Added proper YAML schema file (
schemas/foothold-checkpoint_schema.yaml) - Format: Uses pykwalify YAML format (DCSServerBot standard)
- Result: No more warnings, proper configuration validation
- Issue: Schema validation error when using numeric Discord channel IDs
- Error:
Value '1339713555024580731' is not of type 'str' - Fix: Changed
notifications.channelfromstrtointin all config files - Updated: Schema, Pydantic model, examples, and documentation
- Result: Numeric channel IDs now work correctly
- Issue: Schema YAML files were not included in plugin ZIP
- Fix: Build script now includes all file types from
schemas/directory - Result: Plugin ZIP contains validation schema for proper operation
- ✅ Updated README.md with simplified command syntax
- ✅ Updated all examples to use channel ID (integer) instead of channel name
- ✅ Clarified that interactive mode is the only supported workflow
- ✅ Removed references to removed optional parameters
No breaking changes! This is a backward-compatible release.
If you're using the DCSServerBot plugin:
- Update plugin: Extract new
foothold-checkpoint-plugin-v2.1.0.zip - Update config: Change
notifications.channelto use numeric ID (if using string):# Before notifications: channel: mission-logs # After (get ID: Right-click channel → Copy Channel ID) notifications: channel: 1234567890123456789
- Restart bot: The plugin will load with schema validation
Command usage changes:
- All optional parameters have been removed
- Simply omit them - the interactive workflow handles everything
- Example:
/foothold-checkpoint save server:VEAF(that's it!)
No changes required for CLI tool users.
- Plugin:
foothold-checkpoint-plugin-v2.1.0.zip - CLI Tool: Install via
pip install foothold-checkpoint==2.1.0
This is a major release with breaking changes. Your configuration file requires migration.
See MIGRATION_v1.1.0.md for detailed upgrade instructions.
Major new feature: Full integration as a DCSServerBot plugin with Discord UI!
- 📦 Plugin package ready for deployment (
foothold-checkpoint-plugin-v2.0.0.zip) - 🏗️ Plugin architecture using DCSServerBot's
Pluginbase class - 🔌 Event listener integration for DCS events
- ⚙️ Auto-configuration via
self.localsandself.get_config(server) - 📢 Notification system with per-server channels and toggles
- 🎮 Discord commands with interactive UI dropdowns and buttons
- 📚 Comprehensive documentation in English and French
Plugin Features:
/foothold-checkpoint save- Create checkpoints from Discord/foothold-checkpoint restore- Restore with interactive selection/foothold-checkpoint list- View checkpoints with filtering/foothold-checkpoint delete- Delete with confirmation dialogs- Auto-backup protection before restores (enabled by default)
- Visual separator between manual checkpoints and auto-backups
- Server and campaign selection via dropdowns
- Permission controls (administrator-only by default)
Share campaign definitions between CLI and plugin:
# config.yaml
campaigns_file: campaigns.yaml- ✅ DRY principle: Single source of truth for campaign configuration
- ✅ Shared config: Used by both CLI tool and DCSServerBot plugin
- ✅ Backward compatible: Inline campaigns still supported
- ✅ Validation: Clear errors if configuration is invalid
The most significant change in v1.1.0 is the new structured file list configuration format, replacing regex-based pattern matching:
Before (v1.0.x):
campaigns:
Afghanistan: ["afghanistan"]
Caucasus: ["CA"]After (v1.1.0):
campaigns:
afghanistan:
display_name: "Afghanistan"
files:
persistence:
- "FootHold_afghanistan.lua"
ctld_save:
- "FootHold_afghanistan_CTLD_Save.csv"
storage:
files:
- "foothold_afghanistan_storage.csv"
optional: trueBenefits:
- ✅ Explicit control: Define exactly which files belong to each campaign
- ✅ Optional files: Mark storage/CTLD files as optional (no warnings if missing)
- ✅ Better errors: See exactly what's configured vs. what's found
- ✅ File renaming support: Handle campaign name evolution transparently
- ✅ No false positives: No more regex guessing errors
Automatic detection and helpful error messages for unconfigured campaign files:
Error: Found 2 files that don't match any configured campaign:
- FootHold_new_campaign.lua
- FootHold_new_campaign_storage.csv
Suggested configuration:
────────────────────────────────────────
new_campaign:
display_name: "New Campaign"
files:
persistence:
- "FootHold_new_campaign.lua"
storage:
files:
- "FootHold_new_campaign_storage.csv"
optional: true
────────────────────────────────────────
- 📋 Lists all unknown files found
- 💡 Generates ready-to-use YAML configuration snippets
- 🛡️ Prevents accidental data loss from untracked files
Protects your data with automatic backups before any restore operation:
# Enabled by default
foothold-checkpoint restore checkpoint.zip --server prod-1
# Creates: afghanistan_backup_2026-02-15_14-30-00.zip- 🔄 Automatic backup creation with
--auto-backupflag (default: enabled) - 📝 Backup filename includes full campaign name and timestamp
- ⚙️ Can be disabled with
--no-auto-backupif needed - 🛡️ Protects against accidental overwrites
Transparent handling of campaign name evolution:
- 🏷️ Files automatically renamed to canonical names from configuration
- 📦 Preserves compatibility with old checkpoints
- ✨ No user intervention needed
- 🔀 Example:
FootHold_GCW_Modern.lua→FootHold_germany_modern.lua
The first name in your file list becomes the canonical name used during restore.
New --details flag to inspect checkpoint contents:
foothold-checkpoint list --detailsOutput:
Checkpoint: afghanistan_2026-02-15_10-30-00.zip
Server: production-1
Campaign: afghanistan
Files:
- FootHold_afghanistan.lua
- FootHold_afghanistan_CTLD_Save.csv
- foothold_afghanistan_storage.csv
- Foothold_Ranks.lua
- 📁 Shows all files contained in each checkpoint
- 🔍 Helps verify checkpoint contents before restore
- 🎨 Formatted output with proper indentation
Improved organization of checkpoint lists for better user experience:
- 📑 Manual checkpoints listed first, auto-backups listed last
- ➖ Visual separator ("AUTO-BACKUPS") in both CLI and Discord UI
- 📅 Chronological sorting within each group (oldest first, newest last)
- 🎯 Easier selection in dropdown menus (most recent at bottom)
Example output:
Checkpoints for Afghanistan:
1. campaign_save_morning.zip (2024-02-10) 2.1 MB
2. weekend_snapshot.zip (2024-02-14) 2.2 MB
────────────── AUTO-BACKUPS ──────────────
3. auto-backup-20240216-201000.zip (2024-02-16) 2.3 MB
4. auto-backup-20240216-221045.zip (2024-02-16) 2.3 MB
More helpful and actionable error messages throughout:
- 🔧 Unknown file errors include YAML configuration snippets
- 📍 Campaign/server not found errors list available options
- ✅ Config validation errors show specific field locations
- 🎯 Clearer guidance on how to fix issues
- ✅ 304 tests passing (comprehensive test coverage)
- ✅ 95% code coverage on core modules
- ✅ Type-safe: Full mypy compliance
- ✅ Cross-platform: Windows, Linux, macOS support
- ✅ Code quality: Black formatting, Ruff linting
No changes to installation process:
# From source
git clone https://github.com/VEAF/VEAF-foothold-checkpoint-tool.git
cd VEAF-foothold-checkpoint-tool
poetry installRequired: Update your config.yaml file to the new format.
See MIGRATION_v1.1.0.md for:
- Step-by-step migration instructions
- Configuration examples for each campaign
- Automated migration helper tool
- Common pitfalls and solutions
- Migration Guide: v1.0.x → v1.1.0 upgrade instructions
- User Guide: Updated with new features
- Changelog: Complete version history
- Config Example: New configuration format
- VEAF Team: Testing and feedback on the new configuration format
- Contributors: Bug reports and feature suggestions
- Community: Patience during the breaking change
Patch release - Cross-platform compatibility fixes.
- Campaign name mapping: Fixed
map_campaign_name()to correctly return the last (current) name from the campaign names list, ensuring files are restored with correct naming - Linux/WSL compatibility:
- Marked Windows-specific tests appropriately
- Fixed path handling for Unix systems
- Code quality: Fixed ruff linting error in campaign mapping
git clone https://github.com/VEAF/VEAF-foothold-checkpoint-tool.git
cd VEAF-foothold-checkpoint-tool
git checkout v1.0.1
poetry install- ✅ 350 tests passing (3 skipped on Windows as expected)
- ✅ 83% code coverage
- ✅ All quality checks pass
Initial stable release of the VEAF Foothold Checkpoint Tool.
- Save: Create timestamped, verified backups of your Foothold campaigns
- Restore: Restore checkpoints with automatic integrity verification
- List: Browse checkpoints with beautiful table formatting
- Delete: Safely remove old checkpoints with confirmation
- Import: Convert existing manual backups to checkpoint format
- SHA-256 Integrity Verification: Every file is checksummed to ensure data integrity
- Campaign Evolution Tracking: Automatically handles campaign name changes (e.g., GCW → Germany_Modern)
- Cross-Server Support: Move checkpoints between different DCS servers seamlessly
- Shared File Management: Intelligently handles Foothold_Ranks.lua
- Interactive Mode: Beautiful terminal UI with colors, progress bars, and tables
- Quiet Mode: Perfect for automation and scripting
- Numeric Selection: Use
restore 1instead of typing long filenames - Multiple Selection: Restore or delete multiple checkpoints at once (e.g.,
1,3,5or1-3) - Case-Insensitive: No more case sensitivity issues with server/campaign names
- Smart Prompts: Interactive menus when you leave out required options
- 347 tests passing: 86% code coverage
- Type-safe: Full mypy compliance
- Well-documented: Complete user and developer guides
- Professional code: Black formatting, Ruff linting