mountlet 0.2.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 (37) hide show
  1. mountlet-0.2.0/CHANGELOG.md +30 -0
  2. mountlet-0.2.0/LICENSE +21 -0
  3. mountlet-0.2.0/MANIFEST.in +4 -0
  4. mountlet-0.2.0/PKG-INFO +231 -0
  5. mountlet-0.2.0/README.md +200 -0
  6. mountlet-0.2.0/SECURITY.md +26 -0
  7. mountlet-0.2.0/docs/README.md +91 -0
  8. mountlet-0.2.0/docs/RELEASE.md +83 -0
  9. mountlet-0.2.0/examples/rclone.conf.sample +7 -0
  10. mountlet-0.2.0/pyproject.toml +52 -0
  11. mountlet-0.2.0/setup.cfg +4 -0
  12. mountlet-0.2.0/src/mountlet/__init__.py +5 -0
  13. mountlet-0.2.0/src/mountlet/cli.py +116 -0
  14. mountlet-0.2.0/src/mountlet/config_tools/export_config.py +98 -0
  15. mountlet-0.2.0/src/mountlet/config_tools/import_config.py +164 -0
  16. mountlet-0.2.0/src/mountlet/config_tools/path_config.py +69 -0
  17. mountlet-0.2.0/src/mountlet/config_tools/reconnect_config.py +66 -0
  18. mountlet-0.2.0/src/mountlet/config_tools/setup_wizard.py +225 -0
  19. mountlet-0.2.0/src/mountlet/config_tools/shared.py +289 -0
  20. mountlet-0.2.0/src/mountlet/config_tools/verify_config.py +91 -0
  21. mountlet-0.2.0/src/mountlet/core.py +532 -0
  22. mountlet-0.2.0/src/mountlet/settings.py +237 -0
  23. mountlet-0.2.0/src/mountlet/tray.py +732 -0
  24. mountlet-0.2.0/src/mountlet/tui.py +200 -0
  25. mountlet-0.2.0/src/mountlet.egg-info/PKG-INFO +231 -0
  26. mountlet-0.2.0/src/mountlet.egg-info/SOURCES.txt +35 -0
  27. mountlet-0.2.0/src/mountlet.egg-info/dependency_links.txt +1 -0
  28. mountlet-0.2.0/src/mountlet.egg-info/entry_points.txt +2 -0
  29. mountlet-0.2.0/src/mountlet.egg-info/requires.txt +9 -0
  30. mountlet-0.2.0/src/mountlet.egg-info/top_level.txt +1 -0
  31. mountlet-0.2.0/tests/test_cli.py +82 -0
  32. mountlet-0.2.0/tests/test_config_tools.py +95 -0
  33. mountlet-0.2.0/tests/test_core.py +163 -0
  34. mountlet-0.2.0/tests/test_settings.py +103 -0
  35. mountlet-0.2.0/tests/test_setup_wizard.py +125 -0
  36. mountlet-0.2.0/tests/test_tray.py +579 -0
  37. mountlet-0.2.0/tests/test_tui.py +39 -0
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ - Renamed the project, import package, installed command, and user config directory to Mountlet.
6
+ - Added an optional PySide6 desktop tray preview with mount, unmount, restart-mount, and open-folder actions.
7
+ - Split tray interactions between hover status, left-click remote actions, and right-click app actions.
8
+ - Added app-level and per-remote Mountlet config files.
9
+ - Open-folder actions can use current-desktop Dolphin windows on X11 when available, with fallback open strategies elsewhere.
10
+
11
+ ## 0.1.1 - 2026-05-31
12
+
13
+ - Improved setup guidance when `rclone` is not installed yet.
14
+ - Honored `RCLONE_CONFIG` consistently in setup and config helper commands.
15
+
16
+ ## 0.1.0 - 2026-05-31
17
+
18
+ Initial public CLI release.
19
+
20
+ - Single public command: `mountlet`.
21
+ - Fast readiness check before opening the menu.
22
+ - Guided setup flow with `mountlet setup`.
23
+ - Optional rclone connection flow with `mountlet setup --configure-rclone`.
24
+ - Interactive menu for mounting, unmounting, refreshing, and verifying remotes.
25
+ - Subcommands for setup, path inspection, verification, reconnect, import, and export.
26
+ - User-specific app directories for config, state, and cache.
27
+ - Import/export helpers for rclone configuration bundles.
28
+ - `--version` / `-V` version output.
29
+ - CI workflow for tests and package build.
30
+ - Exported bundles are documented as sensitive credential backups.
mountlet-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Holt
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,4 @@
1
+ include CHANGELOG.md
2
+ include SECURITY.md
3
+ recursive-include docs *.md
4
+ recursive-include examples *.sample
@@ -0,0 +1,231 @@
1
+ Metadata-Version: 2.4
2
+ Name: mountlet
3
+ Version: 0.2.0
4
+ Summary: CLI and tray tools for mounting rclone remotes
5
+ Author: Eric Holt
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/eric-holt/mountlet
8
+ Project-URL: Issues, https://github.com/eric-holt/mountlet/issues
9
+ Keywords: rclone,mount,cloud-storage,tui,fuse
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: Operating System :: POSIX :: Linux
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: System :: Filesystems
19
+ Classifier: Topic :: Utilities
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Provides-Extra: tray
24
+ Requires-Dist: PySide6>=6.7; extra == "tray"
25
+ Provides-Extra: dev
26
+ Requires-Dist: build>=1.2; extra == "dev"
27
+ Requires-Dist: pytest>=8; extra == "dev"
28
+ Requires-Dist: ruff>=0.4; extra == "dev"
29
+ Requires-Dist: twine>=6; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ # Mountlet
33
+
34
+ Mountlet is a terminal app for mounting and unmounting `rclone`
35
+ remotes from a simple menu. It uses your existing `rclone` configuration and
36
+ does not store cloud credentials inside the application install directory.
37
+
38
+ ## How It Works
39
+
40
+ Mountlet is a friendly control panel for two standard tools:
41
+
42
+ - `rclone` connects to cloud storage providers such as Google Drive, Dropbox,
43
+ S3-compatible storage, and WebDAV.
44
+ - FUSE lets Linux show a cloud remote as if it were a normal folder on your
45
+ computer.
46
+
47
+ This app reads your `rclone` remotes, creates local mount folders, and starts or
48
+ stops `rclone mount` for you.
49
+
50
+ ## Requirements
51
+
52
+ - Python 3.10 or newer.
53
+ - `rclone`, which connects to your cloud storage.
54
+ - FUSE, which lets Linux show mounted cloud storage as folders.
55
+
56
+ On Ubuntu, install the system tools with:
57
+
58
+ ```bash
59
+ sudo apt install rclone fuse3
60
+ ```
61
+
62
+ ## Install
63
+
64
+ For isolated CLI use:
65
+
66
+ ```bash
67
+ pipx install mountlet
68
+ ```
69
+
70
+ For the desktop tray preview:
71
+
72
+ ```bash
73
+ pipx install "mountlet[tray]"
74
+ ```
75
+
76
+ For a local checkout:
77
+
78
+ ```bash
79
+ python -m pip install .
80
+ ```
81
+
82
+ ## Use
83
+
84
+ Open Mountlet:
85
+
86
+ ```bash
87
+ mountlet
88
+ ```
89
+
90
+ The app checks whether your computer is ready before it opens the menu. If
91
+ something is missing, it prints the next step instead of dropping you into an
92
+ empty screen.
93
+
94
+ For a guided setup check:
95
+
96
+ ```bash
97
+ mountlet setup
98
+ ```
99
+
100
+ If you have not added any cloud storage to `rclone` yet, let setup open
101
+ `rclone`'s connection flow:
102
+
103
+ ```bash
104
+ mountlet setup --configure-rclone
105
+ ```
106
+
107
+ Normal use is:
108
+
109
+ ```bash
110
+ mountlet
111
+ ```
112
+
113
+ Quitting the menu leaves mounted remotes connected. Use `u` in the menu to
114
+ unmount everything.
115
+
116
+ ## Desktop Tray Preview
117
+
118
+ The tray app is optional and uses PySide6. Start it with:
119
+
120
+ ```bash
121
+ mountlet tray
122
+ ```
123
+
124
+ If you installed the CLI without tray support, add PySide6 with:
125
+
126
+ ```bash
127
+ pipx inject mountlet PySide6
128
+ ```
129
+
130
+ The tray app uses the tray icon this way:
131
+
132
+ - Hover shows a short mounted/unmounted summary.
133
+ - Left-click shows each remote with mount, unmount, restart-mount, and open-folder actions.
134
+ - Right-click shows app-level actions such as mount all, unmount all, update status, and quit.
135
+
136
+ If your desktop session does not expose a system tray, use the terminal menu
137
+ instead.
138
+
139
+ ## Extra Commands
140
+
141
+ These are useful for backup, troubleshooting, or moving to another computer:
142
+
143
+ ```bash
144
+ mountlet path
145
+ mountlet verify
146
+ mountlet verify --auto-reconnect
147
+ mountlet reconnect --remote MyRemote
148
+ mountlet export ~/mountlet-backup
149
+ mountlet import --config ~/mountlet-backup/rclone.conf
150
+ ```
151
+
152
+ ## File Locations
153
+
154
+ Mountlet keeps application data in user-specific locations and leaves
155
+ `rclone` credentials in the standard `rclone` location.
156
+
157
+ On Linux:
158
+
159
+ - `~/.config/rclone/rclone.conf`: rclone remotes and credentials.
160
+ - `~/.config/mountlet/config.toml`: Mountlet preferences.
161
+ - `~/.config/mountlet/mounts.toml`: per-remote mount preferences.
162
+ - `~/.local/state/mountlet/`: runtime state.
163
+ - `~/.cache/mountlet/`: cache files.
164
+ - `~/cloud_mounts/`: default mount root.
165
+
166
+ Print the paths for your system:
167
+
168
+ ```bash
169
+ mountlet path
170
+ ```
171
+
172
+ Create the Mountlet user folders:
173
+
174
+ ```bash
175
+ mountlet path --ensure
176
+ ```
177
+
178
+ That command also creates starter `config.toml` and `mounts.toml` files if they
179
+ do not exist yet.
180
+
181
+ Override the mount root for a shell session:
182
+
183
+ ```bash
184
+ export MOUNTLET_MOUNT_BASE=/path/to/mounts
185
+ ```
186
+
187
+ ### App Settings
188
+
189
+ Use `config.toml` for app-wide behavior:
190
+
191
+ ```toml
192
+ [app]
193
+ mount_base = ""
194
+ auto_mount = false
195
+ auto_mount_delay = 2.0
196
+
197
+ [tray]
198
+ open_folder_behavior = "current_desktop"
199
+ focus_file_manager = true
200
+ ```
201
+
202
+ Use `mounts.toml` for per-remote behavior. Remote names must match the names in
203
+ `rclone`.
204
+
205
+ ```toml
206
+ [remotes."Work__Drive"]
207
+ auto_mount = true
208
+ mount_path = "~/cloud_mounts/drive/Work"
209
+ mount_flags = "--read-only --dir-cache-time 10m"
210
+ ```
211
+
212
+ Keep cloud account details in `rclone.conf`; use these files only for Mountlet
213
+ behavior.
214
+
215
+ ## Credentials
216
+
217
+ `rclone.conf` can contain OAuth tokens and provider credentials. Treat exported
218
+ bundles as sensitive files.
219
+
220
+ - Do not share real `rclone.conf` files.
221
+ - Do not share `client_secret*.json` files.
222
+ - Store backups outside application install directories.
223
+ - Review exported bundles before copying them to another machine.
224
+
225
+ ## Status
226
+
227
+ The current public target is Linux CLI use. The desktop tray is an early preview
228
+ for the next product layer.
229
+
230
+ See the [changelog](https://github.com/eric-holt/mountlet/blob/main/CHANGELOG.md)
231
+ for version history.
@@ -0,0 +1,200 @@
1
+ # Mountlet
2
+
3
+ Mountlet is a terminal app for mounting and unmounting `rclone`
4
+ remotes from a simple menu. It uses your existing `rclone` configuration and
5
+ does not store cloud credentials inside the application install directory.
6
+
7
+ ## How It Works
8
+
9
+ Mountlet is a friendly control panel for two standard tools:
10
+
11
+ - `rclone` connects to cloud storage providers such as Google Drive, Dropbox,
12
+ S3-compatible storage, and WebDAV.
13
+ - FUSE lets Linux show a cloud remote as if it were a normal folder on your
14
+ computer.
15
+
16
+ This app reads your `rclone` remotes, creates local mount folders, and starts or
17
+ stops `rclone mount` for you.
18
+
19
+ ## Requirements
20
+
21
+ - Python 3.10 or newer.
22
+ - `rclone`, which connects to your cloud storage.
23
+ - FUSE, which lets Linux show mounted cloud storage as folders.
24
+
25
+ On Ubuntu, install the system tools with:
26
+
27
+ ```bash
28
+ sudo apt install rclone fuse3
29
+ ```
30
+
31
+ ## Install
32
+
33
+ For isolated CLI use:
34
+
35
+ ```bash
36
+ pipx install mountlet
37
+ ```
38
+
39
+ For the desktop tray preview:
40
+
41
+ ```bash
42
+ pipx install "mountlet[tray]"
43
+ ```
44
+
45
+ For a local checkout:
46
+
47
+ ```bash
48
+ python -m pip install .
49
+ ```
50
+
51
+ ## Use
52
+
53
+ Open Mountlet:
54
+
55
+ ```bash
56
+ mountlet
57
+ ```
58
+
59
+ The app checks whether your computer is ready before it opens the menu. If
60
+ something is missing, it prints the next step instead of dropping you into an
61
+ empty screen.
62
+
63
+ For a guided setup check:
64
+
65
+ ```bash
66
+ mountlet setup
67
+ ```
68
+
69
+ If you have not added any cloud storage to `rclone` yet, let setup open
70
+ `rclone`'s connection flow:
71
+
72
+ ```bash
73
+ mountlet setup --configure-rclone
74
+ ```
75
+
76
+ Normal use is:
77
+
78
+ ```bash
79
+ mountlet
80
+ ```
81
+
82
+ Quitting the menu leaves mounted remotes connected. Use `u` in the menu to
83
+ unmount everything.
84
+
85
+ ## Desktop Tray Preview
86
+
87
+ The tray app is optional and uses PySide6. Start it with:
88
+
89
+ ```bash
90
+ mountlet tray
91
+ ```
92
+
93
+ If you installed the CLI without tray support, add PySide6 with:
94
+
95
+ ```bash
96
+ pipx inject mountlet PySide6
97
+ ```
98
+
99
+ The tray app uses the tray icon this way:
100
+
101
+ - Hover shows a short mounted/unmounted summary.
102
+ - Left-click shows each remote with mount, unmount, restart-mount, and open-folder actions.
103
+ - Right-click shows app-level actions such as mount all, unmount all, update status, and quit.
104
+
105
+ If your desktop session does not expose a system tray, use the terminal menu
106
+ instead.
107
+
108
+ ## Extra Commands
109
+
110
+ These are useful for backup, troubleshooting, or moving to another computer:
111
+
112
+ ```bash
113
+ mountlet path
114
+ mountlet verify
115
+ mountlet verify --auto-reconnect
116
+ mountlet reconnect --remote MyRemote
117
+ mountlet export ~/mountlet-backup
118
+ mountlet import --config ~/mountlet-backup/rclone.conf
119
+ ```
120
+
121
+ ## File Locations
122
+
123
+ Mountlet keeps application data in user-specific locations and leaves
124
+ `rclone` credentials in the standard `rclone` location.
125
+
126
+ On Linux:
127
+
128
+ - `~/.config/rclone/rclone.conf`: rclone remotes and credentials.
129
+ - `~/.config/mountlet/config.toml`: Mountlet preferences.
130
+ - `~/.config/mountlet/mounts.toml`: per-remote mount preferences.
131
+ - `~/.local/state/mountlet/`: runtime state.
132
+ - `~/.cache/mountlet/`: cache files.
133
+ - `~/cloud_mounts/`: default mount root.
134
+
135
+ Print the paths for your system:
136
+
137
+ ```bash
138
+ mountlet path
139
+ ```
140
+
141
+ Create the Mountlet user folders:
142
+
143
+ ```bash
144
+ mountlet path --ensure
145
+ ```
146
+
147
+ That command also creates starter `config.toml` and `mounts.toml` files if they
148
+ do not exist yet.
149
+
150
+ Override the mount root for a shell session:
151
+
152
+ ```bash
153
+ export MOUNTLET_MOUNT_BASE=/path/to/mounts
154
+ ```
155
+
156
+ ### App Settings
157
+
158
+ Use `config.toml` for app-wide behavior:
159
+
160
+ ```toml
161
+ [app]
162
+ mount_base = ""
163
+ auto_mount = false
164
+ auto_mount_delay = 2.0
165
+
166
+ [tray]
167
+ open_folder_behavior = "current_desktop"
168
+ focus_file_manager = true
169
+ ```
170
+
171
+ Use `mounts.toml` for per-remote behavior. Remote names must match the names in
172
+ `rclone`.
173
+
174
+ ```toml
175
+ [remotes."Work__Drive"]
176
+ auto_mount = true
177
+ mount_path = "~/cloud_mounts/drive/Work"
178
+ mount_flags = "--read-only --dir-cache-time 10m"
179
+ ```
180
+
181
+ Keep cloud account details in `rclone.conf`; use these files only for Mountlet
182
+ behavior.
183
+
184
+ ## Credentials
185
+
186
+ `rclone.conf` can contain OAuth tokens and provider credentials. Treat exported
187
+ bundles as sensitive files.
188
+
189
+ - Do not share real `rclone.conf` files.
190
+ - Do not share `client_secret*.json` files.
191
+ - Store backups outside application install directories.
192
+ - Review exported bundles before copying them to another machine.
193
+
194
+ ## Status
195
+
196
+ The current public target is Linux CLI use. The desktop tray is an early preview
197
+ for the next product layer.
198
+
199
+ See the [changelog](https://github.com/eric-holt/mountlet/blob/main/CHANGELOG.md)
200
+ for version history.
@@ -0,0 +1,26 @@
1
+ # Security
2
+
3
+ Mountlet works with `rclone` configuration files. Those files may
4
+ contain OAuth tokens, refresh tokens, client secrets, provider credentials, and
5
+ remote paths that identify private infrastructure.
6
+
7
+ ## Reporting Issues
8
+
9
+ This repository does not have a public security contact configured yet. Before
10
+ public release, enable GitHub private vulnerability reporting or add a dedicated
11
+ security contact.
12
+
13
+ ## Handling Local Secrets
14
+
15
+ - Keep real `rclone.conf` files out of version control.
16
+ - Keep `client_secret*.json` files out of version control.
17
+ - Treat exported bundles as credentials.
18
+ - Prefer private backup locations outside this repository and outside package
19
+ install directories.
20
+ - Keep installed-user configuration in user config directories such as
21
+ `~/.config/rclone/` and `~/.config/mountlet/`.
22
+ - Rotate provider credentials if a real config bundle is shared accidentally.
23
+
24
+ ## Supported Versions
25
+
26
+ No public stable version is supported yet.
@@ -0,0 +1,91 @@
1
+ # Development Notes
2
+
3
+ This directory contains maintainer-facing notes. The root `README.md` is the
4
+ user-facing document used for package publication.
5
+
6
+ ## Development
7
+
8
+ Install from a local checkout:
9
+
10
+ ```bash
11
+ python -m pip install -e .
12
+ ```
13
+
14
+ Run the stdlib test suite:
15
+
16
+ ```bash
17
+ python -m unittest discover -s tests
18
+ ```
19
+
20
+ Run a syntax check:
21
+
22
+ ```bash
23
+ python -m compileall -q src tests
24
+ ```
25
+
26
+ Optional development tools are declared in the `dev` extra:
27
+
28
+ ```bash
29
+ python -m pip install -e ".[dev]"
30
+ python -m pytest
31
+ python -m build
32
+ ```
33
+
34
+ Install the optional tray dependencies when working on the desktop preview:
35
+
36
+ ```bash
37
+ python -m pip install -e ".[dev,tray]"
38
+ mountlet tray
39
+ ```
40
+
41
+ The repository-level `secrets/` directory is for local development only. It is
42
+ ignored by git and must not be part of the installed-user workflow.
43
+
44
+ ## Release Checklist
45
+
46
+ - Confirm support contact.
47
+ - Add screenshots or terminal recordings for the package page.
48
+ - Publish PyPI/pipx CLI installation instructions.
49
+ - Publish `.deb` installation instructions for the later desktop package.
50
+ - Run CI on every pull request.
51
+ - Build a wheel and install it in a clean virtual environment.
52
+ - Test on a fresh Ubuntu installation with `rclone` and `fuse3`.
53
+ - Verify import/export flows with non-sensitive sample configs.
54
+ - Confirm the built wheel and source distribution do not include local secrets.
55
+ - Follow [RELEASE.md](RELEASE.md) when merging `wip` to `main`, tagging, and publishing.
56
+
57
+ ## Release Strategy
58
+
59
+ - Keep the CLI/TUI core MIT licensed.
60
+ - Publish CLI builds to PyPI for lightweight `pipx` installation.
61
+ - Publish the first user-facing desktop package as a native Ubuntu `.deb` from
62
+ GitHub Releases.
63
+ - Build the desktop tray app as the first commercial product layer.
64
+ - Keep Snap and AppImage as later distribution options after the mount and tray
65
+ flows are proven in the `.deb`.
66
+
67
+ ## Monetization Direction
68
+
69
+ The free package should remain useful as a local CLI/TUI. Paid value should be
70
+ centered on reliability, convenience, support, and managed configuration.
71
+
72
+ The first paid product direction is a desktop tray app.
73
+
74
+ Initial desktop tray scope:
75
+
76
+ - Basic mount, unmount, restart-mount, and open-folder actions.
77
+ - Auto-mount at login.
78
+ - Remote health checks and notifications.
79
+ - One-click credential reconnect flows.
80
+ - Per-remote mount policies.
81
+ - Commercial support.
82
+
83
+ Later paid candidates:
84
+
85
+ - Encrypted local config vault.
86
+ - Team configuration templates.
87
+
88
+ Open questions:
89
+
90
+ - What support channel should paid users receive?
91
+ - What platforms are included in the first paid release?
@@ -0,0 +1,83 @@
1
+ # Release Process
2
+
3
+ This project uses `wip` for active work and `main` for release-ready code.
4
+ Released versions are marked with git tags, not long-lived version branches.
5
+
6
+ ## Branches
7
+
8
+ - `wip`: active development and automatic pushes.
9
+ - `main`: stable branch used for public releases.
10
+ - `vX.Y.Z` tags: immutable release points.
11
+
12
+ Create release branches only if a maintained older line needs fixes while
13
+ `main` has moved ahead. That is not expected for `0.1.x`.
14
+
15
+ ## Release Checklist
16
+
17
+ Run these from `wip` first:
18
+
19
+ ```bash
20
+ VERSION=0.2.0
21
+ python -m unittest discover -s tests
22
+ python -m compileall -q src tests
23
+ python -m pip wheel . -w /tmp/mountlet-release --no-deps --no-build-isolation
24
+ ```
25
+
26
+ Confirm:
27
+
28
+ - `README.md` describes the user flow.
29
+ - `CHANGELOG.md` has a section for the version being released.
30
+ - `pyproject.toml` and `src/mountlet/__init__.py` have the same version.
31
+ - `SECURITY.md` has an active security reporting path or GitHub private vulnerability reporting is enabled.
32
+ - Built distributions do not include `secrets/`, `rclone.conf`, or `client_secret*.json`.
33
+ - The package exposes only the `mountlet` console command.
34
+
35
+ ## Merge To Main
36
+
37
+ ```bash
38
+ git checkout main
39
+ git pull origin main
40
+ git merge --squash wip
41
+ git commit -m "Release v$VERSION"
42
+ python -m unittest discover -s tests
43
+ python -m compileall -q src tests
44
+ ```
45
+
46
+ Build from `main`:
47
+
48
+ ```bash
49
+ python -m build
50
+ python -m twine check dist/*
51
+ ```
52
+
53
+ ## Tag
54
+
55
+ After the final release commit is on `main`:
56
+
57
+ ```bash
58
+ git tag -a "v$VERSION" -m "Release v$VERSION"
59
+ git push origin main --tags
60
+ ```
61
+
62
+ ## Publish
63
+
64
+ Publish from the tagged `main` commit, not from `wip`.
65
+
66
+ Publishing is handled by GitHub Actions through PyPI trusted publishing.
67
+ The PyPI publisher must match:
68
+
69
+ - Repository: `eric-holt/mountlet`
70
+ - Workflow: `python-publish.yml`
71
+ - Environment: `pypi`
72
+
73
+ Pushing a release tag starts the publish workflow:
74
+
75
+ ```bash
76
+ git push origin main --tags
77
+ ```
78
+
79
+ Manual PyPI uploads are only a fallback:
80
+
81
+ ```bash
82
+ python -m twine upload dist/*
83
+ ```
@@ -0,0 +1,7 @@
1
+ # Example rclone.conf snippet (do not commit real credentials)
2
+ #
3
+ # [MyRemote__Drive]
4
+ # type = drive
5
+ # client_id = your-client-id.apps.googleusercontent.com
6
+ # client_secret = your-client-secret
7
+ # token = {"access_token":"..."}