shiggles 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.
shiggles-0.2.0/LICENSE ADDED
@@ -0,0 +1,34 @@
1
+ NUCLEAR WASTE SOFTWARE LICENSE V1.0
2
+
3
+ Copyright (c) 2026 drLemis
4
+
5
+ This software license is a message... and part of a system of messages...
6
+ pay attention to it! Writing this software and associated documentation
7
+ files (the "Software") was important to us. We considered ourselves to be a
8
+ powerful culture. This Software is not a place of honor... no highly
9
+ esteemed deed is commemorated here... nothing valued is here. What is here was
10
+ dangerous and repulsive to us. This message is a warning about danger. The
11
+ danger is in a particular location... it increases towards a center... the
12
+ center of danger is here... of a particular size and syntax. The danger is
13
+ still present, in your time, as it was in ours. The danger is to the mind, and
14
+ it can kill. The form of the danger is an emanation of incoherence. The danger
15
+ is unleashed only if you substantially disturb this software digitally or
16
+ intellectually.
17
+
18
+ This software is best shunned and left unexecuted... however, permission is
19
+ hereby granted... free of charge... to any person obtaining a copy of this
20
+ Software... to deal in the Software without restriction, including without
21
+ limitation the rights to use, copy, modify, merge, publish, distribute,
22
+ sublicense, and/or sell copies of the Software, and to permit persons to whom
23
+ the Software is furnished to do so... subject to the following conditions:
24
+
25
+ The above copyright notice, warning message, and this permission notice shall
26
+ be included in all copies or substantial portions of the Software.
27
+
28
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
29
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
30
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
31
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, DEATH OR OTHER
32
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
33
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34
+ SOFTWARE.
@@ -0,0 +1,240 @@
1
+ Metadata-Version: 2.4
2
+ Name: shiggles
3
+ Version: 0.2.0
4
+ Summary: For git and shiggles. A simple content-addressed VCS.
5
+ Author: drLemis
6
+ License-Expression: LicenseRef-NWSL-1.0
7
+ Project-URL: Homepage, https://github.com/drLemis/shiggles
8
+ Project-URL: Repository, https://github.com/drLemis/shiggles
9
+ Project-URL: Issues, https://github.com/drLemis/shiggles/issues
10
+ Keywords: vcs,version-control,backup,sync
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Topic :: System :: Archiving :: Backup
22
+ Requires-Python: >=3.9
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Provides-Extra: dev
26
+ Requires-Dist: build; extra == "dev"
27
+ Requires-Dist: twine; extra == "dev"
28
+ Dynamic: license-file
29
+
30
+ # Shiggles
31
+
32
+ Shiggles is a small command-line version control tool for people who want named saves, a simple history, and team sync without learning git.
33
+
34
+ It is designed for artists, designers, and small teams working on a shared project folder. You snapshot work with plain messages, switch context with tabs, and push or pull from a shared folder or HTTP URL.
35
+
36
+ [![License: NWSL](https://img.shields.io/badge/license-NWSL-orange)](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)
37
+
38
+ Repository: [github.com/drLemis/shiggles](https://github.com/drLemis/shiggles)
39
+
40
+ ## Features
41
+
42
+ - Watches a project folder and stores content-addressed snapshots on save.
43
+ - Named saves with author and time on each tab.
44
+ - Tabs for parallel work (`main` plus side piles like `hotfix`).
45
+ - `bring` lands your current tab into another tab (usually `main`).
46
+ - `upload` and `download` sync the current tab via shared folder or HTTP URL.
47
+ - Hard-stop collisions: conflicting files are parked in `.shig/collisions/` with next-step help.
48
+ - `load` restores an older save and makes it current.
49
+ - `undo` discards unsaved edits and reloads the last save.
50
+ - `timeline` append-only log of operations (including remote history after sync).
51
+ - Stdlib only. No git dependency.
52
+
53
+ ## How It Works
54
+
55
+ When you run `shig start`, Shiggles creates a `.shig/` folder next to your project files. Each `shig save "message"` stores a snapshot of tracked files on the **current tab**.
56
+
57
+ Tabs keep separate histories. `main` is the default shared line. `shig tab foobar` forks from your current tab and switches you to a side pile.
58
+
59
+ Team sync copies commit objects, tab refs, tab metadata, and `timeline.log` to a remote. After `download`, files and history match what was uploaded from the other machine.
60
+
61
+ ## Requirements
62
+
63
+ - Python 3.9 or newer
64
+ - Windows, macOS, or Linux
65
+
66
+ Optional for HTTP remotes: any host that can serve PUT/GET (or `scripts/shig-server.py` for local testing).
67
+
68
+ ## Installation
69
+
70
+ **Windows (recommended):**
71
+
72
+ ```powershell
73
+ .\install.ps1
74
+ ```
75
+
76
+ Restart your terminal, then `shig help`.
77
+
78
+ **From PyPI** (after publish):
79
+
80
+ ```bash
81
+ pip install shiggles
82
+ ```
83
+
84
+ **Developers:**
85
+
86
+ ```bash
87
+ pip install -e ".[dev]"
88
+ ```
89
+
90
+ ## Usage
91
+
92
+ 1. Open a terminal in your project folder.
93
+ 2. Run `shig start`.
94
+ 3. Run `shig save "first version"`.
95
+ 4. Use `shig changes` and `shig history` to see what changed.
96
+ 5. Use `shig upload <path-or-url>` when you want to share with the team.
97
+
98
+ Basic solo workflow:
99
+
100
+ ```bash
101
+ shig start
102
+ shig save "first version"
103
+ shig changes
104
+ shig history
105
+ ```
106
+
107
+ ### Tabs
108
+
109
+ - `main` - default tab, the shared project line
110
+ - `foobar` - your side pile for interrupted work
111
+
112
+ ```bash
113
+ shig tab foobar # create and switch
114
+ shig save "WIP window fix"
115
+ shig tab main # switch back
116
+ shig tab foobar # resume; files as you left them
117
+ ```
118
+
119
+ ### Team sync
120
+
121
+ **Shared folder** (NAS, network path, USB):
122
+
123
+ ```bash
124
+ shig download \\NAS\projects\my-game
125
+ shig save "updated level"
126
+ shig upload
127
+ ```
128
+
129
+ **HTTP URL** (optional token in `.shig/config.json`):
130
+
131
+ ```bash
132
+ shig upload http://backup.example.com/shiggles/my-project
133
+ shig download
134
+ ```
135
+
136
+ The remote is remembered in `.shig/config.json` after the first use.
137
+
138
+ If someone else saved while you were working, `shig save` nudges you to `download` first. Skip with `shig save --yes "message"`.
139
+
140
+ ### Bring (landing your tab on main)
141
+
142
+ ```bash
143
+ shig tab foobar
144
+ shig save "fixed shoot.cs"
145
+ shig bring main
146
+ ```
147
+
148
+ If someone else changed the same file on `main`, Shiggles stops and prints next steps. Fix on **main**, not another `bring`.
149
+
150
+ ### Restoring older work
151
+
152
+ - `shig load "message"` - put files back to a matching save (becomes current)
153
+ - `shig undo` - discard unsaved changes and reload the last save on this tab
154
+
155
+ ## Commands
156
+
157
+ | Command | What it does |
158
+ |---------|--------------|
159
+ | `shig start` | Set up this folder |
160
+ | `shig save "..."` | Snapshot current tab |
161
+ | `shig save --yes "..."` | Save even if remote is ahead |
162
+ | `shig load "..."` | Put files back to a save (becomes current) |
163
+ | `shig changes` | What is different since last save |
164
+ | `shig history` | Saves on current tab |
165
+ | `shig tab [name]` | List, switch, or create tabs |
166
+ | `shig untab <name>` | Remove a tab (history kept) |
167
+ | `shig bring <tab>` | Land current tab into another |
168
+ | `shig download [path\|url]` | Pull current tab from remote |
169
+ | `shig upload [path\|url]` | Push current tab to remote |
170
+ | `shig undo` | Discard unsaved changes; back to last save |
171
+ | `shig timeline` | Operation log |
172
+
173
+ ## Ignore files
174
+
175
+ Edit `.shignore` (created on `shig start`). Same idea as `.gitignore`. Build output, `.shig/`, and junk stay out of snapshots.
176
+
177
+ ## Project structure
178
+
179
+ ```text
180
+ shiggles/
181
+ shiggles/ Python package (commands, store, remote sync)
182
+ scripts/
183
+ shig-server.py Minimal HTTP remote for local testing
184
+ tests/
185
+ test_scenarios.py Scenario walkthrough and unit tests
186
+ install.ps1 Windows installer
187
+ LICENSE NWSL-1.0
188
+ ```
189
+
190
+ On-disk repo layout:
191
+
192
+ ```text
193
+ .shignore
194
+ .shig/
195
+ objects/
196
+ refs/tabs/
197
+ tabs/
198
+ collisions/
199
+ HEAD
200
+ config.json
201
+ timeline.log
202
+ ```
203
+
204
+ ## HTTP dev server
205
+
206
+ ```bash
207
+ python scripts/shig-server.py ./remote-store -p 8765
208
+ shig upload http://127.0.0.1:8765
209
+ ```
210
+
211
+ Use the full URL including `http://`. A bare `127.0.0.1:8765` is not recognized as HTTP.
212
+
213
+ ## Tests
214
+
215
+ ```bash
216
+ python tests/test_scenarios.py # narrated walkthrough
217
+ python tests/test_scenarios.py --keep # keep files in tests/_sandbox/
218
+ python tests/test_scenarios.py --clean # wipe sandbox
219
+ python -m unittest discover -s tests -v # unit tests
220
+ ```
221
+
222
+ ## Publish to PyPI
223
+
224
+ ```bash
225
+ pip install build twine
226
+ python -m build
227
+ twine upload dist/*
228
+ ```
229
+
230
+ ## Notes
231
+
232
+ - Shiggles is a simple VCS helper, not a replacement for full backups, cloud sync, or git power workflows.
233
+ - Collisions never overwrite your working files; compare copies under `.shig/collisions/`.
234
+ - See [ROADMAP.md](ROADMAP.md) for philosophy, collision policy, and deferred features.
235
+
236
+ ## License
237
+
238
+ This software is licensed under the **[NWSL](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)**.
239
+
240
+ Copyright (c) 2026 drLemis.
@@ -0,0 +1,211 @@
1
+ # Shiggles
2
+
3
+ Shiggles is a small command-line version control tool for people who want named saves, a simple history, and team sync without learning git.
4
+
5
+ It is designed for artists, designers, and small teams working on a shared project folder. You snapshot work with plain messages, switch context with tabs, and push or pull from a shared folder or HTTP URL.
6
+
7
+ [![License: NWSL](https://img.shields.io/badge/license-NWSL-orange)](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)
8
+
9
+ Repository: [github.com/drLemis/shiggles](https://github.com/drLemis/shiggles)
10
+
11
+ ## Features
12
+
13
+ - Watches a project folder and stores content-addressed snapshots on save.
14
+ - Named saves with author and time on each tab.
15
+ - Tabs for parallel work (`main` plus side piles like `hotfix`).
16
+ - `bring` lands your current tab into another tab (usually `main`).
17
+ - `upload` and `download` sync the current tab via shared folder or HTTP URL.
18
+ - Hard-stop collisions: conflicting files are parked in `.shig/collisions/` with next-step help.
19
+ - `load` restores an older save and makes it current.
20
+ - `undo` discards unsaved edits and reloads the last save.
21
+ - `timeline` append-only log of operations (including remote history after sync).
22
+ - Stdlib only. No git dependency.
23
+
24
+ ## How It Works
25
+
26
+ When you run `shig start`, Shiggles creates a `.shig/` folder next to your project files. Each `shig save "message"` stores a snapshot of tracked files on the **current tab**.
27
+
28
+ Tabs keep separate histories. `main` is the default shared line. `shig tab foobar` forks from your current tab and switches you to a side pile.
29
+
30
+ Team sync copies commit objects, tab refs, tab metadata, and `timeline.log` to a remote. After `download`, files and history match what was uploaded from the other machine.
31
+
32
+ ## Requirements
33
+
34
+ - Python 3.9 or newer
35
+ - Windows, macOS, or Linux
36
+
37
+ Optional for HTTP remotes: any host that can serve PUT/GET (or `scripts/shig-server.py` for local testing).
38
+
39
+ ## Installation
40
+
41
+ **Windows (recommended):**
42
+
43
+ ```powershell
44
+ .\install.ps1
45
+ ```
46
+
47
+ Restart your terminal, then `shig help`.
48
+
49
+ **From PyPI** (after publish):
50
+
51
+ ```bash
52
+ pip install shiggles
53
+ ```
54
+
55
+ **Developers:**
56
+
57
+ ```bash
58
+ pip install -e ".[dev]"
59
+ ```
60
+
61
+ ## Usage
62
+
63
+ 1. Open a terminal in your project folder.
64
+ 2. Run `shig start`.
65
+ 3. Run `shig save "first version"`.
66
+ 4. Use `shig changes` and `shig history` to see what changed.
67
+ 5. Use `shig upload <path-or-url>` when you want to share with the team.
68
+
69
+ Basic solo workflow:
70
+
71
+ ```bash
72
+ shig start
73
+ shig save "first version"
74
+ shig changes
75
+ shig history
76
+ ```
77
+
78
+ ### Tabs
79
+
80
+ - `main` - default tab, the shared project line
81
+ - `foobar` - your side pile for interrupted work
82
+
83
+ ```bash
84
+ shig tab foobar # create and switch
85
+ shig save "WIP window fix"
86
+ shig tab main # switch back
87
+ shig tab foobar # resume; files as you left them
88
+ ```
89
+
90
+ ### Team sync
91
+
92
+ **Shared folder** (NAS, network path, USB):
93
+
94
+ ```bash
95
+ shig download \\NAS\projects\my-game
96
+ shig save "updated level"
97
+ shig upload
98
+ ```
99
+
100
+ **HTTP URL** (optional token in `.shig/config.json`):
101
+
102
+ ```bash
103
+ shig upload http://backup.example.com/shiggles/my-project
104
+ shig download
105
+ ```
106
+
107
+ The remote is remembered in `.shig/config.json` after the first use.
108
+
109
+ If someone else saved while you were working, `shig save` nudges you to `download` first. Skip with `shig save --yes "message"`.
110
+
111
+ ### Bring (landing your tab on main)
112
+
113
+ ```bash
114
+ shig tab foobar
115
+ shig save "fixed shoot.cs"
116
+ shig bring main
117
+ ```
118
+
119
+ If someone else changed the same file on `main`, Shiggles stops and prints next steps. Fix on **main**, not another `bring`.
120
+
121
+ ### Restoring older work
122
+
123
+ - `shig load "message"` - put files back to a matching save (becomes current)
124
+ - `shig undo` - discard unsaved changes and reload the last save on this tab
125
+
126
+ ## Commands
127
+
128
+ | Command | What it does |
129
+ |---------|--------------|
130
+ | `shig start` | Set up this folder |
131
+ | `shig save "..."` | Snapshot current tab |
132
+ | `shig save --yes "..."` | Save even if remote is ahead |
133
+ | `shig load "..."` | Put files back to a save (becomes current) |
134
+ | `shig changes` | What is different since last save |
135
+ | `shig history` | Saves on current tab |
136
+ | `shig tab [name]` | List, switch, or create tabs |
137
+ | `shig untab <name>` | Remove a tab (history kept) |
138
+ | `shig bring <tab>` | Land current tab into another |
139
+ | `shig download [path\|url]` | Pull current tab from remote |
140
+ | `shig upload [path\|url]` | Push current tab to remote |
141
+ | `shig undo` | Discard unsaved changes; back to last save |
142
+ | `shig timeline` | Operation log |
143
+
144
+ ## Ignore files
145
+
146
+ Edit `.shignore` (created on `shig start`). Same idea as `.gitignore`. Build output, `.shig/`, and junk stay out of snapshots.
147
+
148
+ ## Project structure
149
+
150
+ ```text
151
+ shiggles/
152
+ shiggles/ Python package (commands, store, remote sync)
153
+ scripts/
154
+ shig-server.py Minimal HTTP remote for local testing
155
+ tests/
156
+ test_scenarios.py Scenario walkthrough and unit tests
157
+ install.ps1 Windows installer
158
+ LICENSE NWSL-1.0
159
+ ```
160
+
161
+ On-disk repo layout:
162
+
163
+ ```text
164
+ .shignore
165
+ .shig/
166
+ objects/
167
+ refs/tabs/
168
+ tabs/
169
+ collisions/
170
+ HEAD
171
+ config.json
172
+ timeline.log
173
+ ```
174
+
175
+ ## HTTP dev server
176
+
177
+ ```bash
178
+ python scripts/shig-server.py ./remote-store -p 8765
179
+ shig upload http://127.0.0.1:8765
180
+ ```
181
+
182
+ Use the full URL including `http://`. A bare `127.0.0.1:8765` is not recognized as HTTP.
183
+
184
+ ## Tests
185
+
186
+ ```bash
187
+ python tests/test_scenarios.py # narrated walkthrough
188
+ python tests/test_scenarios.py --keep # keep files in tests/_sandbox/
189
+ python tests/test_scenarios.py --clean # wipe sandbox
190
+ python -m unittest discover -s tests -v # unit tests
191
+ ```
192
+
193
+ ## Publish to PyPI
194
+
195
+ ```bash
196
+ pip install build twine
197
+ python -m build
198
+ twine upload dist/*
199
+ ```
200
+
201
+ ## Notes
202
+
203
+ - Shiggles is a simple VCS helper, not a replacement for full backups, cloud sync, or git power workflows.
204
+ - Collisions never overwrite your working files; compare copies under `.shig/collisions/`.
205
+ - See [ROADMAP.md](ROADMAP.md) for philosophy, collision policy, and deferred features.
206
+
207
+ ## License
208
+
209
+ This software is licensed under the **[NWSL](https://github.com/ErikMcClure/bad-licenses/blob/master/NWSL)**.
210
+
211
+ Copyright (c) 2026 drLemis.
@@ -0,0 +1,41 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "shiggles"
7
+ version = "0.2.0"
8
+ description = "For git and shiggles. A simple content-addressed VCS."
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = "LicenseRef-NWSL-1.0"
12
+ license-files = ["LICENSE"]
13
+ authors = [{ name = "drLemis" }]
14
+ keywords = ["vcs", "version-control", "backup", "sync"]
15
+ classifiers = [
16
+ "Development Status :: 4 - Beta",
17
+ "Environment :: Console",
18
+ "Intended Audience :: End Users/Desktop",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.9",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
26
+ "Topic :: System :: Archiving :: Backup",
27
+ ]
28
+ [project.urls]
29
+ Homepage = "https://github.com/drLemis/shiggles"
30
+ Repository = "https://github.com/drLemis/shiggles"
31
+ Issues = "https://github.com/drLemis/shiggles/issues"
32
+
33
+ [project.scripts]
34
+ shig = "shiggles.cli:main"
35
+
36
+ [tool.setuptools.packages.find]
37
+ where = ["."]
38
+ include = ["shiggles*"]
39
+
40
+ [project.optional-dependencies]
41
+ dev = ["build", "twine"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """Shiggles - for git and shiggles. A simple content-addressed VCS."""
2
+
3
+ __version__ = "0.2.0"
@@ -0,0 +1,4 @@
1
+ from shiggles.cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
@@ -0,0 +1,67 @@
1
+ """CLI entry point for shig."""
2
+
3
+ import sys
4
+
5
+ from shiggles import __version__
6
+ from shiggles.commands import (
7
+ cmd_bring,
8
+ cmd_changes,
9
+ cmd_download,
10
+ cmd_history,
11
+ cmd_load,
12
+ cmd_save,
13
+ cmd_start,
14
+ cmd_tab,
15
+ cmd_timeline,
16
+ cmd_undo,
17
+ cmd_untab,
18
+ cmd_upload,
19
+ )
20
+ from shiggles.util import die
21
+
22
+ COMMANDS = {
23
+ "start": cmd_start,
24
+ "save": cmd_save,
25
+ "load": cmd_load,
26
+ "changes": cmd_changes,
27
+ "history": cmd_history,
28
+ "undo": cmd_undo,
29
+ "tab": cmd_tab,
30
+ "untab": cmd_untab,
31
+ "bring": cmd_bring,
32
+ "download": cmd_download,
33
+ "upload": cmd_upload,
34
+ "timeline": cmd_timeline,
35
+ }
36
+
37
+ HELP = f"""Shiggles v{__version__} - for git and shiggles.
38
+
39
+ Commands:
40
+ shig start set up this folder
41
+ shig save "message" snapshot current tab
42
+ shig save --yes "message" save even if remote is ahead (skip nudge)
43
+ shig load ["message"] put files back to a save (becomes current)
44
+ shig changes what's different since last save
45
+ shig history saves on current tab
46
+ shig tab [name] list tabs, or switch / create
47
+ shig untab <name> remove a tab (history kept)
48
+ shig bring <tab> land current tab into another (usually main)
49
+ shig download [path] get latest current tab (folder or URL)
50
+ shig upload [path] send current tab (folder or URL)
51
+ shig undo discard unsaved changes, restore last save
52
+ shig timeline operation log
53
+ """
54
+
55
+
56
+ def main():
57
+ if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help", "help"):
58
+ print(HELP)
59
+ return
60
+ cmd = sys.argv[1]
61
+ if cmd not in COMMANDS:
62
+ die(f"Unknown command: {cmd}\n -> shig help")
63
+ COMMANDS[cmd](sys.argv[2:])
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()