dotman-git 1.0.0__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.
- dotman_git-1.0.0/CHANGELOG.md +110 -0
- dotman_git-1.0.0/CONTRIBUTING.md +193 -0
- dotman_git-1.0.0/LICENSE +21 -0
- dotman_git-1.0.0/MANIFEST.in +5 -0
- dotman_git-1.0.0/PKG-INFO +678 -0
- dotman_git-1.0.0/README.md +626 -0
- dotman_git-1.0.0/dot_man/__init__.py +4 -0
- dotman_git-1.0.0/dot_man/backups.py +211 -0
- dotman_git-1.0.0/dot_man/branch_ops.py +347 -0
- dotman_git-1.0.0/dot_man/cli/__init__.py +113 -0
- dotman_git-1.0.0/dot_man/cli/add_cmd.py +167 -0
- dotman_git-1.0.0/dot_man/cli/audit_cmd.py +141 -0
- dotman_git-1.0.0/dot_man/cli/backup_cmd.py +105 -0
- dotman_git-1.0.0/dot_man/cli/branch_cmd.py +103 -0
- dotman_git-1.0.0/dot_man/cli/clean_cmd.py +97 -0
- dotman_git-1.0.0/dot_man/cli/common.py +548 -0
- dotman_git-1.0.0/dot_man/cli/completions_cmd.py +127 -0
- dotman_git-1.0.0/dot_man/cli/config_cmd.py +979 -0
- dotman_git-1.0.0/dot_man/cli/deploy_cmd.py +169 -0
- dotman_git-1.0.0/dot_man/cli/discover_cmd.py +105 -0
- dotman_git-1.0.0/dot_man/cli/doctor_cmd.py +229 -0
- dotman_git-1.0.0/dot_man/cli/edit_cmd.py +177 -0
- dotman_git-1.0.0/dot_man/cli/encrypt_cmd.py +205 -0
- dotman_git-1.0.0/dot_man/cli/export_cmd.py +146 -0
- dotman_git-1.0.0/dot_man/cli/import_cmd.py +315 -0
- dotman_git-1.0.0/dot_man/cli/init_cmd.py +532 -0
- dotman_git-1.0.0/dot_man/cli/interface.py +56 -0
- dotman_git-1.0.0/dot_man/cli/log_cmd.py +339 -0
- dotman_git-1.0.0/dot_man/cli/main.py +36 -0
- dotman_git-1.0.0/dot_man/cli/navigate_cmd.py +903 -0
- dotman_git-1.0.0/dot_man/cli/onboarding.py +546 -0
- dotman_git-1.0.0/dot_man/cli/profile_cmd.py +313 -0
- dotman_git-1.0.0/dot_man/cli/remote_cmd.py +454 -0
- dotman_git-1.0.0/dot_man/cli/restore_cmd.py +82 -0
- dotman_git-1.0.0/dot_man/cli/revert_cmd.py +86 -0
- dotman_git-1.0.0/dot_man/cli/show_cmd.py +29 -0
- dotman_git-1.0.0/dot_man/cli/status_cmd.py +185 -0
- dotman_git-1.0.0/dot_man/cli/switch_cmd.py +387 -0
- dotman_git-1.0.0/dot_man/cli/tag_cmd.py +164 -0
- dotman_git-1.0.0/dot_man/cli/template_cmd.py +244 -0
- dotman_git-1.0.0/dot_man/cli/tui_cmd.py +44 -0
- dotman_git-1.0.0/dot_man/cli/verify_cmd.py +156 -0
- dotman_git-1.0.0/dot_man/completions/_dot-man.zsh +28 -0
- dotman_git-1.0.0/dot_man/completions/dot-man.bash +15 -0
- dotman_git-1.0.0/dot_man/completions/dot-man.fish +58 -0
- dotman_git-1.0.0/dot_man/completions/install.sh +26 -0
- dotman_git-1.0.0/dot_man/config.py +23 -0
- dotman_git-1.0.0/dot_man/config_detector.py +426 -0
- dotman_git-1.0.0/dot_man/constants.py +109 -0
- dotman_git-1.0.0/dot_man/core.py +614 -0
- dotman_git-1.0.0/dot_man/dotman_config.py +516 -0
- dotman_git-1.0.0/dot_man/encryption.py +173 -0
- dotman_git-1.0.0/dot_man/exceptions.py +255 -0
- dotman_git-1.0.0/dot_man/files.py +443 -0
- dotman_git-1.0.0/dot_man/global_config.py +305 -0
- dotman_git-1.0.0/dot_man/hooks.py +232 -0
- dotman_git-1.0.0/dot_man/interactive.py +460 -0
- dotman_git-1.0.0/dot_man/lock.py +64 -0
- dotman_git-1.0.0/dot_man/merge.py +440 -0
- dotman_git-1.0.0/dot_man/operations.py +212 -0
- dotman_git-1.0.0/dot_man/py.typed +1 -0
- dotman_git-1.0.0/dot_man/save_deploy_ops.py +466 -0
- dotman_git-1.0.0/dot_man/secrets.py +473 -0
- dotman_git-1.0.0/dot_man/section.py +207 -0
- dotman_git-1.0.0/dot_man/status_ops.py +229 -0
- dotman_git-1.0.0/dot_man/tui_log.py +91 -0
- dotman_git-1.0.0/dot_man/ui.py +127 -0
- dotman_git-1.0.0/dot_man/utils.py +132 -0
- dotman_git-1.0.0/dot_man/vault.py +317 -0
- dotman_git-1.0.0/dotman_git.egg-info/PKG-INFO +678 -0
- dotman_git-1.0.0/dotman_git.egg-info/SOURCES.txt +148 -0
- dotman_git-1.0.0/dotman_git.egg-info/dependency_links.txt +1 -0
- dotman_git-1.0.0/dotman_git.egg-info/entry_points.txt +3 -0
- dotman_git-1.0.0/dotman_git.egg-info/requires.txt +24 -0
- dotman_git-1.0.0/dotman_git.egg-info/top_level.txt +1 -0
- dotman_git-1.0.0/pyproject.toml +128 -0
- dotman_git-1.0.0/setup.cfg +4 -0
- dotman_git-1.0.0/tests/test_add_cmd.py +144 -0
- dotman_git-1.0.0/tests/test_audit_cmd.py +81 -0
- dotman_git-1.0.0/tests/test_backup_cmd.py +136 -0
- dotman_git-1.0.0/tests/test_backups.py +154 -0
- dotman_git-1.0.0/tests/test_branch_cmd.py +107 -0
- dotman_git-1.0.0/tests/test_clean.py +126 -0
- dotman_git-1.0.0/tests/test_cli_commands.py +578 -0
- dotman_git-1.0.0/tests/test_cli_extra.py +118 -0
- dotman_git-1.0.0/tests/test_cli_help.py +108 -0
- dotman_git-1.0.0/tests/test_cli_revert.py +137 -0
- dotman_git-1.0.0/tests/test_cli_v1.py +139 -0
- dotman_git-1.0.0/tests/test_common_v1.py +151 -0
- dotman_git-1.0.0/tests/test_completion.py +51 -0
- dotman_git-1.0.0/tests/test_comprehensive.py +197 -0
- dotman_git-1.0.0/tests/test_config.py +345 -0
- dotman_git-1.0.0/tests/test_config_cmd.py +116 -0
- dotman_git-1.0.0/tests/test_config_cmd_v1.py +91 -0
- dotman_git-1.0.0/tests/test_config_ops_v1.py +277 -0
- dotman_git-1.0.0/tests/test_config_section.py +169 -0
- dotman_git-1.0.0/tests/test_core.py +341 -0
- dotman_git-1.0.0/tests/test_core_v1.py +194 -0
- dotman_git-1.0.0/tests/test_deploy_cmd.py +112 -0
- dotman_git-1.0.0/tests/test_discover_cmd.py +33 -0
- dotman_git-1.0.0/tests/test_doctor_cmd.py +90 -0
- dotman_git-1.0.0/tests/test_dotman_config.py +78 -0
- dotman_git-1.0.0/tests/test_edit_cmd.py +50 -0
- dotman_git-1.0.0/tests/test_encrypt_cmd.py +114 -0
- dotman_git-1.0.0/tests/test_encryption.py +96 -0
- dotman_git-1.0.0/tests/test_exceptions.py +123 -0
- dotman_git-1.0.0/tests/test_export_cmd.py +94 -0
- dotman_git-1.0.0/tests/test_files_atomic.py +135 -0
- dotman_git-1.0.0/tests/test_files_extended.py +66 -0
- dotman_git-1.0.0/tests/test_final_push.py +576 -0
- dotman_git-1.0.0/tests/test_fixtures.py +171 -0
- dotman_git-1.0.0/tests/test_git_manager.py +256 -0
- dotman_git-1.0.0/tests/test_git_manager_extended.py +251 -0
- dotman_git-1.0.0/tests/test_global_config.py +215 -0
- dotman_git-1.0.0/tests/test_hooks.py +164 -0
- dotman_git-1.0.0/tests/test_hooks_new.py +180 -0
- dotman_git-1.0.0/tests/test_import_cmd.py +83 -0
- dotman_git-1.0.0/tests/test_init_cmd.py +541 -0
- dotman_git-1.0.0/tests/test_integration.py +356 -0
- dotman_git-1.0.0/tests/test_interactive.py +188 -0
- dotman_git-1.0.0/tests/test_lock.py +45 -0
- dotman_git-1.0.0/tests/test_log_checkout_tag.py +71 -0
- dotman_git-1.0.0/tests/test_log_cmd.py +123 -0
- dotman_git-1.0.0/tests/test_log_cmd_v1.py +71 -0
- dotman_git-1.0.0/tests/test_merge.py +248 -0
- dotman_git-1.0.0/tests/test_more_integration.py +388 -0
- dotman_git-1.0.0/tests/test_navigate_cmd.py +217 -0
- dotman_git-1.0.0/tests/test_navigate_switch_v1.py +71 -0
- dotman_git-1.0.0/tests/test_onboarding.py +119 -0
- dotman_git-1.0.0/tests/test_operations.py +75 -0
- dotman_git-1.0.0/tests/test_ops_v1.py +74 -0
- dotman_git-1.0.0/tests/test_performance_logic.py +114 -0
- dotman_git-1.0.0/tests/test_profile_cmd.py +169 -0
- dotman_git-1.0.0/tests/test_profile_cmd_v1.py +142 -0
- dotman_git-1.0.0/tests/test_profile_extra.py +29 -0
- dotman_git-1.0.0/tests/test_remote_cmd.py +161 -0
- dotman_git-1.0.0/tests/test_restore_cmd.py +62 -0
- dotman_git-1.0.0/tests/test_secrets.py +95 -0
- dotman_git-1.0.0/tests/test_section.py +66 -0
- dotman_git-1.0.0/tests/test_show_cmd.py +43 -0
- dotman_git-1.0.0/tests/test_switch_cmd.py +83 -0
- dotman_git-1.0.0/tests/test_switch_enhancements.py +208 -0
- dotman_git-1.0.0/tests/test_tag_cmd.py +105 -0
- dotman_git-1.0.0/tests/test_template_cmd.py +185 -0
- dotman_git-1.0.0/tests/test_template_cmd_v1.py +131 -0
- dotman_git-1.0.0/tests/test_template_extra.py +47 -0
- dotman_git-1.0.0/tests/test_ui.py +59 -0
- dotman_git-1.0.0/tests/test_utils.py +124 -0
- dotman_git-1.0.0/tests/test_vault.py +148 -0
- dotman_git-1.0.0/tests/test_verify_cmd.py +93 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to dot-man 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
|
+
## [1.0.0] - 2026-05-17
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Production Release** - Official v1.0.0 stable release
|
|
12
|
+
- **YAML configuration support** - Config files now support `.yaml` and `.yml` formats alongside TOML:
|
|
13
|
+
- Automatic format detection
|
|
14
|
+
- Warning when multiple config files exist (TOML takes priority)
|
|
15
|
+
- Environment variable expansion in paths (`$HOME`, `$USER`, `$WORK_DIR`, etc.)
|
|
16
|
+
- **`dot-man import`** - Import dotfiles from other dotfile managers:
|
|
17
|
+
- `dot-man import chezmoi` - Import from chezmoi
|
|
18
|
+
- `dot-man import yadm` - Import from yadm
|
|
19
|
+
- `dot-man import stow` - Import from GNU Stow packages
|
|
20
|
+
- `dot-man import all` - Auto-detect and import from any source
|
|
21
|
+
- `--dry-run` to preview what would be imported
|
|
22
|
+
- **`dot-man export`** - Export dotfiles to portable formats:
|
|
23
|
+
- `dot-man export tar backup.tar.gz` - Tar archive
|
|
24
|
+
- `dot-man export zip dots.zip` - Zip archive
|
|
25
|
+
- `dot-man export json manifest.json` - JSON manifest
|
|
26
|
+
- `--branch` to export specific branch
|
|
27
|
+
- **`dot-man discover`** - Auto-detect existing dotfiles:
|
|
28
|
+
- Scans 30+ common dotfile locations (shells, WMs, terminals, editors)
|
|
29
|
+
- `--add` to automatically add to dot-man.toml
|
|
30
|
+
- `--include-extended/--no-extended` for VS Code, Sublime, etc.
|
|
31
|
+
- **`dot-man encrypt`** - Encrypt/decrypt sensitive files:
|
|
32
|
+
- GPG and AGE encryption support
|
|
33
|
+
- `encrypt status` - Show encryption status
|
|
34
|
+
- `encrypt encrypt <section>` - Encrypt section files
|
|
35
|
+
- `encrypt decrypt <section>` - Decrypt section files
|
|
36
|
+
- **`dot-man diff --rich`** - Syntax-highlighted diffs using rich library:
|
|
37
|
+
- Monokai theme with line numbers
|
|
38
|
+
- `--no-rich` to use plain git diff (default: enabled)
|
|
39
|
+
- **PyPI packaging** - Ready for `pip install dot-man`
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- **Version bump to 1.0.0** - Production stable release
|
|
43
|
+
- **Removed legacy code**:
|
|
44
|
+
- Removed INI migration (TOML/YAML only)
|
|
45
|
+
- Removed unused `LegacyConfigLoader` class
|
|
46
|
+
- Consolidated `LOCK_FILE` to constants.py
|
|
47
|
+
- Removed `GLOBAL_CONF` and `DOT_MAN_INI` constants
|
|
48
|
+
- **Config file priority**: TOML (.toml) > YAML (.yaml/.yml)
|
|
49
|
+
- **`switch` command** - Marked as DEPRECATED, shows warning and points to `navigate`
|
|
50
|
+
- **`checkout` command** - Marked as DEPRECATED, shows warning and points to `navigate`
|
|
51
|
+
|
|
52
|
+
### Deprecated
|
|
53
|
+
- `switch` → Use `navigate` instead
|
|
54
|
+
- `checkout` → Use `navigate` instead
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
- Type annotations for shell completion
|
|
58
|
+
- Import assertions for type safety
|
|
59
|
+
- Various lint and type checking issues
|
|
60
|
+
|
|
61
|
+
## [0.10.0] - 2026-05-17
|
|
62
|
+
|
|
63
|
+
### Added
|
|
64
|
+
- **YAML configuration support** - Config files now support `.yaml` and `.yml` formats alongside TOML:
|
|
65
|
+
- Automatic format detection
|
|
66
|
+
- Warning when multiple config files exist (TOML takes priority)
|
|
67
|
+
- Environment variable expansion in paths (`$HOME`, `$USER`, `$WORK_DIR`, etc.)
|
|
68
|
+
- **`dot-man import`** - Import dotfiles from other dotfile managers:
|
|
69
|
+
- `dot-man import chezmoi` - Import from chezmoi
|
|
70
|
+
- `dot-man import yadm` - Import from yadm
|
|
71
|
+
- `dot-man import stow` - Import from GNU Stow packages
|
|
72
|
+
- `dot-man import all` - Auto-detect and import from any source
|
|
73
|
+
- `--dry-run` to preview what would be imported
|
|
74
|
+
- **`dot-man export`** - Export dotfiles to portable formats:
|
|
75
|
+
- `dot-man export tar backup.tar.gz` - Tar archive
|
|
76
|
+
- `dot-man export zip dots.zip` - Zip archive
|
|
77
|
+
- `dot-man export json manifest.json` - JSON manifest
|
|
78
|
+
- `--branch` to export specific branch
|
|
79
|
+
- **`dot-man discover`** - Auto-detect existing dotfiles:
|
|
80
|
+
- Scans 30+ common dotfile locations (shells, WMs, terminals, editors)
|
|
81
|
+
- `--add` to automatically add to dot-man.toml
|
|
82
|
+
- `--include-extended/--no-extended` for VS Code, Sublime, etc.
|
|
83
|
+
- **`dot-man encrypt`** - Encrypt/decrypt sensitive files:
|
|
84
|
+
- GPG and AGE encryption support
|
|
85
|
+
- `encrypt status` - Show encryption status
|
|
86
|
+
- `encrypt encrypt <section>` - Encrypt section files
|
|
87
|
+
- `encrypt decrypt <section>` - Decrypt section files
|
|
88
|
+
- **`dot-man diff --rich`** - Syntax-highlighted diffs using rich library:
|
|
89
|
+
- Monokai theme with line numbers
|
|
90
|
+
- `--no-rich` to use plain git diff (default: enabled)
|
|
91
|
+
|
|
92
|
+
### Changed
|
|
93
|
+
- **Removed legacy code**:
|
|
94
|
+
- Removed INI migration (TOML/YAML only)
|
|
95
|
+
- Removed unused `LegacyConfigLoader` class
|
|
96
|
+
- Consolidated `LOCK_FILE` to constants.py
|
|
97
|
+
- Removed `GLOBAL_CONF` and `DOT_MAN_INI` constants
|
|
98
|
+
- **Config file priority**: TOML (.toml) > YAML (.yaml/.yml)
|
|
99
|
+
- **`switch` command** - Marked as DEPRECATED, shows warning and points to `navigate`
|
|
100
|
+
- **`checkout` command** - Marked as DEPRECATED, shows warning and points to `navigate`
|
|
101
|
+
|
|
102
|
+
### Deprecated
|
|
103
|
+
- `switch` → Use `navigate` instead
|
|
104
|
+
- `checkout` → Use `navigate` instead
|
|
105
|
+
- `tag switch` → Use `navigate` instead
|
|
106
|
+
|
|
107
|
+
## [Unreleased]
|
|
108
|
+
|
|
109
|
+
### Added
|
|
110
|
+
- (No new changes in unreleased)
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Contributing to dot-man
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! This document provides guidelines and information for contributors.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Clone the repository
|
|
9
|
+
git clone https://github.com/BeshoyEhab/dot-man.git
|
|
10
|
+
cd dot-man
|
|
11
|
+
|
|
12
|
+
# Create virtual environment
|
|
13
|
+
python -m venv .venv
|
|
14
|
+
source .venv/bin/activate # or: source .venv/bin/activate.fish
|
|
15
|
+
|
|
16
|
+
# Install in development mode with dev dependencies
|
|
17
|
+
pip install -e ".[dev]"
|
|
18
|
+
|
|
19
|
+
# Verify installation
|
|
20
|
+
dot-man --version
|
|
21
|
+
pytest tests/ -v
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Project Structure
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
dot-man/
|
|
28
|
+
├── dot_man/ # Main package (20 modules)
|
|
29
|
+
│ ├── __init__.py # Package version
|
|
30
|
+
│ ├── cli/ # CLI commands (Click-based, 24 files)
|
|
31
|
+
│ │ ├── main.py # Entry point: calls cli()
|
|
32
|
+
│ │ ├── interface.py # Click group definition (DotManGroup)
|
|
33
|
+
│ │ ├── common.py # Shared utilities: require_init, completions,
|
|
34
|
+
│ │ │ # get_secret_handler, parse_branch_arg
|
|
35
|
+
│ │ ├── __init__.py # Imports all *_cmd modules (registration trigger)
|
|
36
|
+
│ │ └── *_cmd.py # 21 individual command modules
|
|
37
|
+
│ ├── operations.py # DotManOperations singleton + iter_section_paths
|
|
38
|
+
│ ├── save_deploy_ops.py # SaveDeployMixin: save_all, deploy_all (two-phase)
|
|
39
|
+
│ ├── branch_ops.py # BranchMixin: switch_branch, revert_file
|
|
40
|
+
│ ├── status_ops.py # StatusMixin: get_status, audit, orphans
|
|
41
|
+
│ ├── core.py # GitManager (wraps GitPython)
|
|
42
|
+
│ ├── config.py # Re-export shim only (backward compat)
|
|
43
|
+
│ ├── global_config.py # GlobalConfig: reads/writes global.toml
|
|
44
|
+
│ ├── dotman_config.py # DotManConfig: reads/writes dot-man.toml
|
|
45
|
+
│ ├── section.py # Section dataclass + hook alias resolution
|
|
46
|
+
│ ├── files.py # File I/O: atomic copy, compare, cache
|
|
47
|
+
│ ├── secrets.py # Secret detection patterns + filter_secrets()
|
|
48
|
+
│ ├── vault.py # SecretVault: Fernet encrypt/decrypt
|
|
49
|
+
│ ├── lock.py # FileLock: fcntl advisory locking (Linux/macOS)
|
|
50
|
+
│ ├── backups.py # BackupManager: timestamped archives
|
|
51
|
+
│ ├── interactive.py # Interactive wizards (init, global config)
|
|
52
|
+
│ ├── ui.py # Rich console wrappers
|
|
53
|
+
│ ├── utils.py # Misc helpers
|
|
54
|
+
│ ├── constants.py # All paths, defaults, HOOK_ALIASES
|
|
55
|
+
│ └── exceptions.py # Custom exception hierarchy + ErrorDiagnostic
|
|
56
|
+
├── tests/ # Test suite
|
|
57
|
+
│ ├── conftest.py # Pytest fixtures
|
|
58
|
+
│ └── test_*.py # Test modules
|
|
59
|
+
├── docs/ # Documentation
|
|
60
|
+
│ ├── ARCHITECTURE.md # System architecture
|
|
61
|
+
│ ├── DEVELOPMENT_GUIDE_MANUAL.md # In-depth system explanation
|
|
62
|
+
│ ├── roadmap.md # Development roadmap
|
|
63
|
+
│ └── specs/ # Detailed specifications
|
|
64
|
+
│ ├── commands.md # Command specifications
|
|
65
|
+
│ └── security.md # Security specifications
|
|
66
|
+
├── install.sh # Installation script
|
|
67
|
+
├── uninstall.sh # Uninstallation script
|
|
68
|
+
├── pyproject.toml # Project configuration
|
|
69
|
+
└── README.md # User documentation
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Running Tests
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Run all tests
|
|
76
|
+
pytest tests/ -v
|
|
77
|
+
|
|
78
|
+
# Run with coverage
|
|
79
|
+
pytest tests/ --cov=dot_man --cov-report=term-missing
|
|
80
|
+
|
|
81
|
+
# Run specific test
|
|
82
|
+
pytest tests/test_core.py -v
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Code Style
|
|
86
|
+
|
|
87
|
+
This project uses:
|
|
88
|
+
|
|
89
|
+
- **Black** for formatting (line length: 88)
|
|
90
|
+
- **Ruff** for linting
|
|
91
|
+
- **mypy** for type checking
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Format code
|
|
95
|
+
black dot_man/ tests/
|
|
96
|
+
|
|
97
|
+
# Lint code
|
|
98
|
+
ruff check dot_man/ tests/
|
|
99
|
+
|
|
100
|
+
# Check types
|
|
101
|
+
mypy dot_man/ --ignore-missing-imports
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Adding a New Command
|
|
105
|
+
|
|
106
|
+
1. Create `dot_man/cli/mycommand_cmd.py`
|
|
107
|
+
2. Define your Click command decorating with `@cli.command()`
|
|
108
|
+
3. Import it in `dot_man/cli/__init__.py` (this triggers registration)
|
|
109
|
+
4. Add shell completion in `dot_man/cli/common.py` if needed
|
|
110
|
+
5. Add business logic to the appropriate operations mixin (`save_deploy_ops.py`, `branch_ops.py`, or `status_ops.py`)
|
|
111
|
+
6. Add tests to `tests/test_mycommand_cmd.py`
|
|
112
|
+
7. Update `README.md` command table and `CHANGELOG.md`
|
|
113
|
+
|
|
114
|
+
Example command file (`dot_man/cli/mycommand_cmd.py`):
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
import click
|
|
118
|
+
from .common import require_init, success, error
|
|
119
|
+
from .interface import cli
|
|
120
|
+
|
|
121
|
+
@cli.command()
|
|
122
|
+
@click.option("--verbose", "-v", is_flag=True)
|
|
123
|
+
@require_init
|
|
124
|
+
def mycommand(verbose: bool):
|
|
125
|
+
"""Short description for help text.
|
|
126
|
+
|
|
127
|
+
Longer description with examples.
|
|
128
|
+
"""
|
|
129
|
+
# Business logic goes in operations mixins
|
|
130
|
+
from ..operations import get_operations
|
|
131
|
+
ops = get_operations()
|
|
132
|
+
# ... implementation
|
|
133
|
+
success("Done!")
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> **Important:** Commands are registered via import side effects. The `@cli.command()` decorator must run at import time. Adding the import to `cli/__init__.py` is what makes the command available. Without that import, the command will not appear in `dot-man --help`.
|
|
137
|
+
|
|
138
|
+
## Architecture Overview
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
CLI (cli/) or TUI (interactive.py)
|
|
142
|
+
│
|
|
143
|
+
└──→ DotManOperations (operations.py, singleton via get_operations())
|
|
144
|
+
│
|
|
145
|
+
├──→ SaveDeployMixin (save_deploy_ops.py)
|
|
146
|
+
│ ├──→ files.py (copy, compare, atomic_write)
|
|
147
|
+
│ └──→ vault.py (stash/restore secrets)
|
|
148
|
+
├──→ BranchMixin (branch_ops.py)
|
|
149
|
+
│ └──→ core.py (GitManager)
|
|
150
|
+
└──→ StatusMixin (status_ops.py)
|
|
151
|
+
└──→ files.py (get_file_status)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Key rule:** `config.py` is a re-export shim only. Import config classes directly from their actual modules:
|
|
155
|
+
```python
|
|
156
|
+
from dot_man.global_config import GlobalConfig
|
|
157
|
+
from dot_man.dotman_config import DotManConfig
|
|
158
|
+
from dot_man.section import Section
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Adding Secret Patterns
|
|
162
|
+
|
|
163
|
+
Edit `dot_man/secrets.py`:
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
DEFAULT_PATTERNS: list[SecretPattern] = [
|
|
167
|
+
# Add new pattern
|
|
168
|
+
SecretPattern(
|
|
169
|
+
name="My Pattern",
|
|
170
|
+
pattern=re.compile(r"pattern_here"),
|
|
171
|
+
severity=Severity.HIGH,
|
|
172
|
+
description="Description of what this detects",
|
|
173
|
+
),
|
|
174
|
+
# ... existing patterns
|
|
175
|
+
]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Pull Request Process
|
|
179
|
+
|
|
180
|
+
1. Fork the repository
|
|
181
|
+
2. Create a feature branch (`git checkout -b feature/my-feature`)
|
|
182
|
+
3. Make your changes following the pre-push checklist in `AGENTS.md`
|
|
183
|
+
4. Add tests for new functionality (see test guidelines in `AGENTS.md`)
|
|
184
|
+
5. Ensure all checks pass: `black`, `ruff`, `mypy`, `pytest`
|
|
185
|
+
6. Submit a pull request
|
|
186
|
+
|
|
187
|
+
## Questions?
|
|
188
|
+
|
|
189
|
+
Open an issue for:
|
|
190
|
+
|
|
191
|
+
- Bug reports
|
|
192
|
+
- Feature requests
|
|
193
|
+
- Questions about the codebase
|
dotman_git-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 BeshoyEhab
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|