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.
Files changed (150) hide show
  1. dotman_git-1.0.0/CHANGELOG.md +110 -0
  2. dotman_git-1.0.0/CONTRIBUTING.md +193 -0
  3. dotman_git-1.0.0/LICENSE +21 -0
  4. dotman_git-1.0.0/MANIFEST.in +5 -0
  5. dotman_git-1.0.0/PKG-INFO +678 -0
  6. dotman_git-1.0.0/README.md +626 -0
  7. dotman_git-1.0.0/dot_man/__init__.py +4 -0
  8. dotman_git-1.0.0/dot_man/backups.py +211 -0
  9. dotman_git-1.0.0/dot_man/branch_ops.py +347 -0
  10. dotman_git-1.0.0/dot_man/cli/__init__.py +113 -0
  11. dotman_git-1.0.0/dot_man/cli/add_cmd.py +167 -0
  12. dotman_git-1.0.0/dot_man/cli/audit_cmd.py +141 -0
  13. dotman_git-1.0.0/dot_man/cli/backup_cmd.py +105 -0
  14. dotman_git-1.0.0/dot_man/cli/branch_cmd.py +103 -0
  15. dotman_git-1.0.0/dot_man/cli/clean_cmd.py +97 -0
  16. dotman_git-1.0.0/dot_man/cli/common.py +548 -0
  17. dotman_git-1.0.0/dot_man/cli/completions_cmd.py +127 -0
  18. dotman_git-1.0.0/dot_man/cli/config_cmd.py +979 -0
  19. dotman_git-1.0.0/dot_man/cli/deploy_cmd.py +169 -0
  20. dotman_git-1.0.0/dot_man/cli/discover_cmd.py +105 -0
  21. dotman_git-1.0.0/dot_man/cli/doctor_cmd.py +229 -0
  22. dotman_git-1.0.0/dot_man/cli/edit_cmd.py +177 -0
  23. dotman_git-1.0.0/dot_man/cli/encrypt_cmd.py +205 -0
  24. dotman_git-1.0.0/dot_man/cli/export_cmd.py +146 -0
  25. dotman_git-1.0.0/dot_man/cli/import_cmd.py +315 -0
  26. dotman_git-1.0.0/dot_man/cli/init_cmd.py +532 -0
  27. dotman_git-1.0.0/dot_man/cli/interface.py +56 -0
  28. dotman_git-1.0.0/dot_man/cli/log_cmd.py +339 -0
  29. dotman_git-1.0.0/dot_man/cli/main.py +36 -0
  30. dotman_git-1.0.0/dot_man/cli/navigate_cmd.py +903 -0
  31. dotman_git-1.0.0/dot_man/cli/onboarding.py +546 -0
  32. dotman_git-1.0.0/dot_man/cli/profile_cmd.py +313 -0
  33. dotman_git-1.0.0/dot_man/cli/remote_cmd.py +454 -0
  34. dotman_git-1.0.0/dot_man/cli/restore_cmd.py +82 -0
  35. dotman_git-1.0.0/dot_man/cli/revert_cmd.py +86 -0
  36. dotman_git-1.0.0/dot_man/cli/show_cmd.py +29 -0
  37. dotman_git-1.0.0/dot_man/cli/status_cmd.py +185 -0
  38. dotman_git-1.0.0/dot_man/cli/switch_cmd.py +387 -0
  39. dotman_git-1.0.0/dot_man/cli/tag_cmd.py +164 -0
  40. dotman_git-1.0.0/dot_man/cli/template_cmd.py +244 -0
  41. dotman_git-1.0.0/dot_man/cli/tui_cmd.py +44 -0
  42. dotman_git-1.0.0/dot_man/cli/verify_cmd.py +156 -0
  43. dotman_git-1.0.0/dot_man/completions/_dot-man.zsh +28 -0
  44. dotman_git-1.0.0/dot_man/completions/dot-man.bash +15 -0
  45. dotman_git-1.0.0/dot_man/completions/dot-man.fish +58 -0
  46. dotman_git-1.0.0/dot_man/completions/install.sh +26 -0
  47. dotman_git-1.0.0/dot_man/config.py +23 -0
  48. dotman_git-1.0.0/dot_man/config_detector.py +426 -0
  49. dotman_git-1.0.0/dot_man/constants.py +109 -0
  50. dotman_git-1.0.0/dot_man/core.py +614 -0
  51. dotman_git-1.0.0/dot_man/dotman_config.py +516 -0
  52. dotman_git-1.0.0/dot_man/encryption.py +173 -0
  53. dotman_git-1.0.0/dot_man/exceptions.py +255 -0
  54. dotman_git-1.0.0/dot_man/files.py +443 -0
  55. dotman_git-1.0.0/dot_man/global_config.py +305 -0
  56. dotman_git-1.0.0/dot_man/hooks.py +232 -0
  57. dotman_git-1.0.0/dot_man/interactive.py +460 -0
  58. dotman_git-1.0.0/dot_man/lock.py +64 -0
  59. dotman_git-1.0.0/dot_man/merge.py +440 -0
  60. dotman_git-1.0.0/dot_man/operations.py +212 -0
  61. dotman_git-1.0.0/dot_man/py.typed +1 -0
  62. dotman_git-1.0.0/dot_man/save_deploy_ops.py +466 -0
  63. dotman_git-1.0.0/dot_man/secrets.py +473 -0
  64. dotman_git-1.0.0/dot_man/section.py +207 -0
  65. dotman_git-1.0.0/dot_man/status_ops.py +229 -0
  66. dotman_git-1.0.0/dot_man/tui_log.py +91 -0
  67. dotman_git-1.0.0/dot_man/ui.py +127 -0
  68. dotman_git-1.0.0/dot_man/utils.py +132 -0
  69. dotman_git-1.0.0/dot_man/vault.py +317 -0
  70. dotman_git-1.0.0/dotman_git.egg-info/PKG-INFO +678 -0
  71. dotman_git-1.0.0/dotman_git.egg-info/SOURCES.txt +148 -0
  72. dotman_git-1.0.0/dotman_git.egg-info/dependency_links.txt +1 -0
  73. dotman_git-1.0.0/dotman_git.egg-info/entry_points.txt +3 -0
  74. dotman_git-1.0.0/dotman_git.egg-info/requires.txt +24 -0
  75. dotman_git-1.0.0/dotman_git.egg-info/top_level.txt +1 -0
  76. dotman_git-1.0.0/pyproject.toml +128 -0
  77. dotman_git-1.0.0/setup.cfg +4 -0
  78. dotman_git-1.0.0/tests/test_add_cmd.py +144 -0
  79. dotman_git-1.0.0/tests/test_audit_cmd.py +81 -0
  80. dotman_git-1.0.0/tests/test_backup_cmd.py +136 -0
  81. dotman_git-1.0.0/tests/test_backups.py +154 -0
  82. dotman_git-1.0.0/tests/test_branch_cmd.py +107 -0
  83. dotman_git-1.0.0/tests/test_clean.py +126 -0
  84. dotman_git-1.0.0/tests/test_cli_commands.py +578 -0
  85. dotman_git-1.0.0/tests/test_cli_extra.py +118 -0
  86. dotman_git-1.0.0/tests/test_cli_help.py +108 -0
  87. dotman_git-1.0.0/tests/test_cli_revert.py +137 -0
  88. dotman_git-1.0.0/tests/test_cli_v1.py +139 -0
  89. dotman_git-1.0.0/tests/test_common_v1.py +151 -0
  90. dotman_git-1.0.0/tests/test_completion.py +51 -0
  91. dotman_git-1.0.0/tests/test_comprehensive.py +197 -0
  92. dotman_git-1.0.0/tests/test_config.py +345 -0
  93. dotman_git-1.0.0/tests/test_config_cmd.py +116 -0
  94. dotman_git-1.0.0/tests/test_config_cmd_v1.py +91 -0
  95. dotman_git-1.0.0/tests/test_config_ops_v1.py +277 -0
  96. dotman_git-1.0.0/tests/test_config_section.py +169 -0
  97. dotman_git-1.0.0/tests/test_core.py +341 -0
  98. dotman_git-1.0.0/tests/test_core_v1.py +194 -0
  99. dotman_git-1.0.0/tests/test_deploy_cmd.py +112 -0
  100. dotman_git-1.0.0/tests/test_discover_cmd.py +33 -0
  101. dotman_git-1.0.0/tests/test_doctor_cmd.py +90 -0
  102. dotman_git-1.0.0/tests/test_dotman_config.py +78 -0
  103. dotman_git-1.0.0/tests/test_edit_cmd.py +50 -0
  104. dotman_git-1.0.0/tests/test_encrypt_cmd.py +114 -0
  105. dotman_git-1.0.0/tests/test_encryption.py +96 -0
  106. dotman_git-1.0.0/tests/test_exceptions.py +123 -0
  107. dotman_git-1.0.0/tests/test_export_cmd.py +94 -0
  108. dotman_git-1.0.0/tests/test_files_atomic.py +135 -0
  109. dotman_git-1.0.0/tests/test_files_extended.py +66 -0
  110. dotman_git-1.0.0/tests/test_final_push.py +576 -0
  111. dotman_git-1.0.0/tests/test_fixtures.py +171 -0
  112. dotman_git-1.0.0/tests/test_git_manager.py +256 -0
  113. dotman_git-1.0.0/tests/test_git_manager_extended.py +251 -0
  114. dotman_git-1.0.0/tests/test_global_config.py +215 -0
  115. dotman_git-1.0.0/tests/test_hooks.py +164 -0
  116. dotman_git-1.0.0/tests/test_hooks_new.py +180 -0
  117. dotman_git-1.0.0/tests/test_import_cmd.py +83 -0
  118. dotman_git-1.0.0/tests/test_init_cmd.py +541 -0
  119. dotman_git-1.0.0/tests/test_integration.py +356 -0
  120. dotman_git-1.0.0/tests/test_interactive.py +188 -0
  121. dotman_git-1.0.0/tests/test_lock.py +45 -0
  122. dotman_git-1.0.0/tests/test_log_checkout_tag.py +71 -0
  123. dotman_git-1.0.0/tests/test_log_cmd.py +123 -0
  124. dotman_git-1.0.0/tests/test_log_cmd_v1.py +71 -0
  125. dotman_git-1.0.0/tests/test_merge.py +248 -0
  126. dotman_git-1.0.0/tests/test_more_integration.py +388 -0
  127. dotman_git-1.0.0/tests/test_navigate_cmd.py +217 -0
  128. dotman_git-1.0.0/tests/test_navigate_switch_v1.py +71 -0
  129. dotman_git-1.0.0/tests/test_onboarding.py +119 -0
  130. dotman_git-1.0.0/tests/test_operations.py +75 -0
  131. dotman_git-1.0.0/tests/test_ops_v1.py +74 -0
  132. dotman_git-1.0.0/tests/test_performance_logic.py +114 -0
  133. dotman_git-1.0.0/tests/test_profile_cmd.py +169 -0
  134. dotman_git-1.0.0/tests/test_profile_cmd_v1.py +142 -0
  135. dotman_git-1.0.0/tests/test_profile_extra.py +29 -0
  136. dotman_git-1.0.0/tests/test_remote_cmd.py +161 -0
  137. dotman_git-1.0.0/tests/test_restore_cmd.py +62 -0
  138. dotman_git-1.0.0/tests/test_secrets.py +95 -0
  139. dotman_git-1.0.0/tests/test_section.py +66 -0
  140. dotman_git-1.0.0/tests/test_show_cmd.py +43 -0
  141. dotman_git-1.0.0/tests/test_switch_cmd.py +83 -0
  142. dotman_git-1.0.0/tests/test_switch_enhancements.py +208 -0
  143. dotman_git-1.0.0/tests/test_tag_cmd.py +105 -0
  144. dotman_git-1.0.0/tests/test_template_cmd.py +185 -0
  145. dotman_git-1.0.0/tests/test_template_cmd_v1.py +131 -0
  146. dotman_git-1.0.0/tests/test_template_extra.py +47 -0
  147. dotman_git-1.0.0/tests/test_ui.py +59 -0
  148. dotman_git-1.0.0/tests/test_utils.py +124 -0
  149. dotman_git-1.0.0/tests/test_vault.py +148 -0
  150. 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
@@ -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.
@@ -0,0 +1,5 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include CONTRIBUTING.md
5
+ recursive-include dot_man py.typed