soliterm 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.
- soliterm-1.0.0/CHANGELOG.md +267 -0
- soliterm-1.0.0/LICENSE +21 -0
- soliterm-1.0.0/MANIFEST.in +12 -0
- soliterm-1.0.0/PKG-INFO +454 -0
- soliterm-1.0.0/README.md +418 -0
- soliterm-1.0.0/SECURITY.md +36 -0
- soliterm-1.0.0/docs/keybindings.md +198 -0
- soliterm-1.0.0/man/soliterm.6 +501 -0
- soliterm-1.0.0/pyproject.toml +157 -0
- soliterm-1.0.0/setup.cfg +4 -0
- soliterm-1.0.0/src/soliterm/__init__.py +24 -0
- soliterm-1.0.0/src/soliterm/__main__.py +8 -0
- soliterm-1.0.0/src/soliterm/aisleriot.py +398 -0
- soliterm-1.0.0/src/soliterm/camo.py +369 -0
- soliterm-1.0.0/src/soliterm/cli.py +492 -0
- soliterm-1.0.0/src/soliterm/deals.py +204 -0
- soliterm-1.0.0/src/soliterm/debuginfo.py +177 -0
- soliterm-1.0.0/src/soliterm/engine/__init__.py +71 -0
- soliterm-1.0.0/src/soliterm/engine/cards.py +54 -0
- soliterm-1.0.0/src/soliterm/engine/core.py +807 -0
- soliterm-1.0.0/src/soliterm/engine/gamedef.py +223 -0
- soliterm-1.0.0/src/soliterm/engine/games/__init__.py +111 -0
- soliterm-1.0.0/src/soliterm/engine/games/bakersdozen.py +99 -0
- soliterm-1.0.0/src/soliterm/engine/games/canfield.py +166 -0
- soliterm-1.0.0/src/soliterm/engine/games/eightoff.py +118 -0
- soliterm-1.0.0/src/soliterm/engine/games/fortythieves.py +154 -0
- soliterm-1.0.0/src/soliterm/engine/games/freecell.py +108 -0
- soliterm-1.0.0/src/soliterm/engine/games/golf.py +79 -0
- soliterm-1.0.0/src/soliterm/engine/games/klondike.py +185 -0
- soliterm-1.0.0/src/soliterm/engine/games/scorpion.py +109 -0
- soliterm-1.0.0/src/soliterm/engine/games/spider.py +212 -0
- soliterm-1.0.0/src/soliterm/engine/games/spiderette.py +29 -0
- soliterm-1.0.0/src/soliterm/engine/games/triplepeaks.py +120 -0
- soliterm-1.0.0/src/soliterm/engine/games/yukon.py +103 -0
- soliterm-1.0.0/src/soliterm/engine/rng.py +81 -0
- soliterm-1.0.0/src/soliterm/history.py +183 -0
- soliterm-1.0.0/src/soliterm/migrate.py +157 -0
- soliterm-1.0.0/src/soliterm/py.typed +0 -0
- soliterm-1.0.0/src/soliterm/saves.py +155 -0
- soliterm-1.0.0/src/soliterm/store.py +819 -0
- soliterm-1.0.0/src/soliterm/textmode.py +469 -0
- soliterm-1.0.0/src/soliterm/themes.py +229 -0
- soliterm-1.0.0/src/soliterm/tui/__init__.py +12 -0
- soliterm-1.0.0/src/soliterm/tui/__main__.py +11 -0
- soliterm-1.0.0/src/soliterm/tui/app.py +1817 -0
- soliterm-1.0.0/src/soliterm/tui/board.py +835 -0
- soliterm-1.0.0/src/soliterm/tui/cascade.py +111 -0
- soliterm-1.0.0/src/soliterm/tui/keys.py +150 -0
- soliterm-1.0.0/src/soliterm.egg-info/PKG-INFO +454 -0
- soliterm-1.0.0/src/soliterm.egg-info/SOURCES.txt +93 -0
- soliterm-1.0.0/src/soliterm.egg-info/dependency_links.txt +1 -0
- soliterm-1.0.0/src/soliterm.egg-info/entry_points.txt +2 -0
- soliterm-1.0.0/src/soliterm.egg-info/requires.txt +3 -0
- soliterm-1.0.0/src/soliterm.egg-info/top_level.txt +1 -0
- soliterm-1.0.0/tests/conftest.py +51 -0
- soliterm-1.0.0/tests/helpers.py +205 -0
- soliterm-1.0.0/tests/test_aisleriot_sync.py +696 -0
- soliterm-1.0.0/tests/test_build_pyz.py +93 -0
- soliterm-1.0.0/tests/test_camo.py +171 -0
- soliterm-1.0.0/tests/test_cascade.py +78 -0
- soliterm-1.0.0/tests/test_cli.py +1396 -0
- soliterm-1.0.0/tests/test_config.py +180 -0
- soliterm-1.0.0/tests/test_conformance.py +205 -0
- soliterm-1.0.0/tests/test_deals.py +213 -0
- soliterm-1.0.0/tests/test_debuginfo.py +321 -0
- soliterm-1.0.0/tests/test_engine.py +906 -0
- soliterm-1.0.0/tests/test_fortythieves.py +148 -0
- soliterm-1.0.0/tests/test_freecell.py +85 -0
- soliterm-1.0.0/tests/test_game_lists.py +99 -0
- soliterm-1.0.0/tests/test_hint.py +220 -0
- soliterm-1.0.0/tests/test_history.py +161 -0
- soliterm-1.0.0/tests/test_isolation.py +29 -0
- soliterm-1.0.0/tests/test_keybindings_doc.py +70 -0
- soliterm-1.0.0/tests/test_klondike.py +213 -0
- soliterm-1.0.0/tests/test_man_page.py +50 -0
- soliterm-1.0.0/tests/test_migrate.py +224 -0
- soliterm-1.0.0/tests/test_moves.py +300 -0
- soliterm-1.0.0/tests/test_readme.py +51 -0
- soliterm-1.0.0/tests/test_render.py +806 -0
- soliterm-1.0.0/tests/test_rng.py +121 -0
- soliterm-1.0.0/tests/test_saves.py +180 -0
- soliterm-1.0.0/tests/test_scorpion.py +176 -0
- soliterm-1.0.0/tests/test_screenshots_tool.py +206 -0
- soliterm-1.0.0/tests/test_spider.py +314 -0
- soliterm-1.0.0/tests/test_spiderette.py +105 -0
- soliterm-1.0.0/tests/test_store_files.py +252 -0
- soliterm-1.0.0/tests/test_textmode.py +743 -0
- soliterm-1.0.0/tests/test_themes.py +266 -0
- soliterm-1.0.0/tests/test_triplepeaks.py +185 -0
- soliterm-1.0.0/tests/test_tui_app.py +544 -0
- soliterm-1.0.0/tests/test_tui_keys.py +151 -0
- soliterm-1.0.0/tests/test_tui_play.py +2974 -0
- soliterm-1.0.0/tools/build_pyz.py +110 -0
- soliterm-1.0.0/tools/keybindings.py +337 -0
- soliterm-1.0.0/tools/screenshots.py +895 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Soliterm are written down here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and Soliterm follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
Soliterm grew out of aisle-cli, a private project of mine that played the
|
|
9
|
+
same kind of games in a terminal under the command `aisle`. Its one
|
|
10
|
+
release, aisle-cli 1.0.0 of 2026-06-29, stays at the bottom as history, and
|
|
11
|
+
Soliterm 1.0.0 lists the changes since.
|
|
12
|
+
|
|
13
|
+
## [Unreleased]
|
|
14
|
+
|
|
15
|
+
## [1.0.0] - 2026-09-25
|
|
16
|
+
|
|
17
|
+
Soliterm's first public release. It grew out of aisle-cli, a private
|
|
18
|
+
project of mine, and these are the changes since aisle-cli 1.0.0, which is
|
|
19
|
+
at the bottom of CHANGELOG.md.
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Three new games: Spiderette, Triple Peaks and Scorpion, for twelve in
|
|
24
|
+
all. Each shares its statistics with AisleRiot's own record of it, so
|
|
25
|
+
any games of them you've played in AisleRiot show up straight away, and
|
|
26
|
+
each has its page in `docs/games`. Triple Peaks has AisleRiot's
|
|
27
|
+
multiplier scoring as an option.
|
|
28
|
+
- Every deal has a number, shown on the board, at the end of a game and in
|
|
29
|
+
text mode. `--deal N` plays deal N, and `n` then deals the next one.
|
|
30
|
+
FreeCell deals are numbered as in Microsoft FreeCell.
|
|
31
|
+
- Share codes such as `klondike:d3:48213` name a deal with its options.
|
|
32
|
+
The end of a game shows its code, and `--deal` takes one, as do the `g`
|
|
33
|
+
key during a game and Play a deal on the menu.
|
|
34
|
+
- A daily deal for every game, from `--daily` or Daily deal on the menu:
|
|
35
|
+
the same cards for everyone that day, with the standard options. When
|
|
36
|
+
it ends there's a line to share that names no cards. It works offline.
|
|
37
|
+
- `--draw` and `--suits` set Klondike's draw or Spider's suits for one run
|
|
38
|
+
without saving them.
|
|
39
|
+
- A game you've started is kept for next time when you leave it with `q`,
|
|
40
|
+
`m` or Ctrl-C, or close the terminal on it, instead of counting as lost.
|
|
41
|
+
Its menu row reads `Resume your game: 0:42, 31 moves`, and picking it or
|
|
42
|
+
starting it with `--game` carries on where you left off, while a chosen
|
|
43
|
+
deal or option starts afresh and leaves it waiting. A daily is kept the
|
|
44
|
+
same way, its menu row says so, and that day's daily carries on with it.
|
|
45
|
+
Text mode keeps games too, when you're typing at a terminal. On the way
|
|
46
|
+
out a line says which game was kept and how to pick it up again.
|
|
47
|
+
- Every game played here goes in `history.jsonl`, one line each. The
|
|
48
|
+
statistics gain Streak and Longest columns, the win banner and text mode
|
|
49
|
+
name a run of two or more wins, and `--stats` lists the last ten games
|
|
50
|
+
and marks the dailies.
|
|
51
|
+
- `a` finishes the game once every card left can go up, safe or not, as
|
|
52
|
+
one move, and the message line says when that is. It does in text mode
|
|
53
|
+
too.
|
|
54
|
+
- `U` and `R` undo and redo every move at once, and text mode has
|
|
55
|
+
`undo all` and `redo all`. `U` used to be the same as `u`. It keeps the
|
|
56
|
+
clock and redo, where `N` deals the hand again as a new game.
|
|
57
|
+
- A kept game takes its newest 500 undo steps with it, and `U` on a
|
|
58
|
+
longer one says it stopped at the oldest move saved, as does text
|
|
59
|
+
mode's `undo all`.
|
|
60
|
+
- The finish sends the cards up one at a time, and a win bounces them off
|
|
61
|
+
the board. Any key skips either, the boss key still hides everything at
|
|
62
|
+
once, and `--no-animation` or `"animation": false` in config.json turns
|
|
63
|
+
them off.
|
|
64
|
+
- The win banner says when a win is your first of that game or a new best
|
|
65
|
+
time.
|
|
66
|
+
- Themes for the full-screen game: `classic` (the look it always had),
|
|
67
|
+
`dark`, `light` and `contrast`. `t` moves on to the next one and
|
|
68
|
+
remembers it, and `--theme NAME` picks one for a single run. A terminal
|
|
69
|
+
with too few colour pairs for a theme draws the ones it has no room for
|
|
70
|
+
in colours it does have. When `COLORFGBG` says the terminal's
|
|
71
|
+
background is light, `classic` and `contrast` swap the colours that
|
|
72
|
+
would vanish on it for ones that show.
|
|
73
|
+
- A four-colour deck with green clubs and orange diamonds (blue diamonds
|
|
74
|
+
on terminals without 256 colours). `4` turns it on and off, and it's
|
|
75
|
+
remembered too. A terminal without the colour pairs for it says so, and
|
|
76
|
+
the choice is kept for one that has them.
|
|
77
|
+
- The code skin colours its source's keywords, strings and numbers as an
|
|
78
|
+
editor would, in the theme's colours.
|
|
79
|
+
- `+` and `-` lift one card more or fewer while you hold a run, so the
|
|
80
|
+
keyboard can split a run the way a click mid-stack does.
|
|
81
|
+
- `--debug-info` prints what a bug report needs: the versions, the
|
|
82
|
+
terminal, curses and where Soliterm keeps its files. It only reads, and
|
|
83
|
+
leaves every file as it was.
|
|
84
|
+
- `--version`, and `--no-sync` (or `SOLITERM_NO_AISLERIOT=1`) to leave
|
|
85
|
+
AisleRiot's statistics alone for a run.
|
|
86
|
+
- Text mode puts a number on every slot, a hint is a command you can type
|
|
87
|
+
as it stands, a command that does nothing says why, and `N` starts the
|
|
88
|
+
deal over as it does in the full-screen game.
|
|
89
|
+
- Windows, through the windows-curses package, which pip installs there
|
|
90
|
+
by itself.
|
|
91
|
+
- A man page, `soliterm(6)`.
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- The command is `soliterm` now, and settings and statistics live in
|
|
96
|
+
`soliterm` folders under `~/.config` and `~/.local/share`. The first run
|
|
97
|
+
copies aisle-cli's `config.json` and `stats.json` across, once, and
|
|
98
|
+
leaves the old files where they are.
|
|
99
|
+
- Deals come from Soliterm's own shuffle, not Python's, so a number deals
|
|
100
|
+
the same cards on every Python. This means the numbers from aisle-cli
|
|
101
|
+
1.0.0 deal different cards now. `--seed` still works as another name for
|
|
102
|
+
`--deal`, though `--help` no longer lists it, and numbers run from 0 to
|
|
103
|
+
2147483647.
|
|
104
|
+
- In the full-screen game, `--deal 5` without `--game` goes straight into
|
|
105
|
+
the game played last instead of the menu, and only that first game is
|
|
106
|
+
deal 5, not every game picked from the menu.
|
|
107
|
+
- SIGHUP and SIGTERM leave the way Ctrl-C does, so the game is kept, and
|
|
108
|
+
the exit status is 130. One ignored already, as `nohup` ignores SIGHUP,
|
|
109
|
+
stays ignored.
|
|
110
|
+
- `--reset-stats` asks first (`--yes` skips the question) and keeps a
|
|
111
|
+
backup of what it clears. It clears the history as well, and every game,
|
|
112
|
+
in AisleRiot's keyfile too when sharing, but leaves saved games alone.
|
|
113
|
+
- Spider deals four suits by default, in AisleRiot's layout, and Golf
|
|
114
|
+
starts with the waste empty, as AisleRiot's does.
|
|
115
|
+
- Autoplay only sends up cards that are safe to send up.
|
|
116
|
+
- A hint can be a move that sets up the next one, and in Spider one that
|
|
117
|
+
fills an empty column so you can deal. When nothing gains, it names a
|
|
118
|
+
plain move that goes somewhere instead of saying no move helps. It
|
|
119
|
+
lights up the whole run it would move, not just the top card, in a
|
|
120
|
+
colour of its own that shows on any background.
|
|
121
|
+
- `o` shows the options before it gives up the game in play. Esc, or
|
|
122
|
+
leaving them as they were, keeps the game, a change mid-game asks
|
|
123
|
+
first, and new options deal the next number, the way `n` does. Where
|
|
124
|
+
Soliterm asks whether to give a game up, only `y` says yes, so an Enter
|
|
125
|
+
too many can't.
|
|
126
|
+
- A game counts from its first move, even if you undo every move. One
|
|
127
|
+
with no moves left offers Undo on its banner and counts as lost only when
|
|
128
|
+
you leave it for a new deal or the menu.
|
|
129
|
+
- The end-of-game banner shows each choice with its key, as in
|
|
130
|
+
`Replay this deal (s)`.
|
|
131
|
+
- In Golf and Triple Peaks, Enter or a click on a card that goes on the
|
|
132
|
+
waste plays it, as a click does in AisleRiot. One that doesn't go is
|
|
133
|
+
picked up as before.
|
|
134
|
+
- The clock ticks on the status line and stops while another screen hides
|
|
135
|
+
the board, and the banner shows the same time the statistics keep.
|
|
136
|
+
- A board that's short of room closes up before it loses anything. A long
|
|
137
|
+
column piles its face-down cards onto one row that counts them and
|
|
138
|
+
keeps every face-up rank in view, the columns beside it squeeze alike,
|
|
139
|
+
and a wide game closes up its fans and the gaps between its columns. A
|
|
140
|
+
board, the menu or a dialog that still doesn't fit says what size it
|
|
141
|
+
needs instead of drawing off the edge.
|
|
142
|
+
- Klondike drawing three fans out the last three cards of the waste, as
|
|
143
|
+
AisleRiot does, and the stock's count sits on the stock itself.
|
|
144
|
+
- The code skin stays on for the menu, the dialogs, the banners and the
|
|
145
|
+
too-small notice, which show as comments in the same file, and draws
|
|
146
|
+
its source in the terminal's own colours instead of a card's black on
|
|
147
|
+
white. Its board sits as high as the plain one, so it takes no rows
|
|
148
|
+
from the cards.
|
|
149
|
+
- When curses can't drive the terminal, or can't load at all, Soliterm
|
|
150
|
+
says why and plays in text mode.
|
|
151
|
+
- `--no-color` and `NO_COLOR` beat the colour saved with `v`, and `--ascii`
|
|
152
|
+
works in the full-screen game as well as in text mode.
|
|
153
|
+
|
|
154
|
+
### Removed
|
|
155
|
+
|
|
156
|
+
- The `aisle` command and the aisle-cli package. `soliterm` replaces them.
|
|
157
|
+
- Python 3.8. Soliterm needs Python 3.9 or newer.
|
|
158
|
+
|
|
159
|
+
### Fixed
|
|
160
|
+
|
|
161
|
+
- The menu gives each game a line short enough to show whole at 80
|
|
162
|
+
columns, where most were cut off mid-word, and `--list` uses the same
|
|
163
|
+
line, so it fits in 80 columns too. `--help` sends you to `--list` for
|
|
164
|
+
the game names instead of spelling them all out twice.
|
|
165
|
+
- The help screen no longer says every game builds its foundations up by
|
|
166
|
+
suit, which isn't true of them all.
|
|
167
|
+
- A text-mode game won in one move says `1 move`, not `1 moves`, and
|
|
168
|
+
Spider's status line says `1 deal`, not `1 deals`.
|
|
169
|
+
- Games played while not sharing statistics, for a game this version
|
|
170
|
+
doesn't have, are kept for the version that recorded them instead of
|
|
171
|
+
being dropped.
|
|
172
|
+
- AisleRiot's keyfile is read the way GLib reads it. Each statistic is
|
|
173
|
+
written over the keyfile as it is at that moment, so one AisleRiot saved
|
|
174
|
+
in the meantime isn't put back, and a keyfile that can't be read, or
|
|
175
|
+
isn't valid UTF-8, is left as it is. A game missing from it is rebuilt
|
|
176
|
+
from Soliterm's own record, games played while sharing was off are
|
|
177
|
+
shared once it's back on, and Soliterm says so when it can't write the
|
|
178
|
+
file.
|
|
179
|
+
- Settings and statistics are written whole, so a crash can't leave half a
|
|
180
|
+
file, and a damaged one is kept aside instead of being written over. A
|
|
181
|
+
hand-edited file is read a value at a time, so one bad value doesn't
|
|
182
|
+
lose the rest, and a bad game option falls back to its default.
|
|
183
|
+
- A game kept waiting while another copy of Soliterm finishes with the
|
|
184
|
+
statistics says so, instead of stopping without a word. If Ctrl-C,
|
|
185
|
+
SIGTERM or SIGHUP cuts leaving short while it waits, a note at exit says
|
|
186
|
+
the game was neither saved nor counted, and a deal you haven't touched
|
|
187
|
+
leaves without waiting at all.
|
|
188
|
+
- Rules that had drifted from AisleRiot's: Klondike drawing one no longer
|
|
189
|
+
redeals forever, FreeCell's foundation cards stay out of play, Aces
|
|
190
|
+
can't slide between foundations for points, Eight Off and Forty Thieves
|
|
191
|
+
move only as many cards at once as their free cells or empty columns
|
|
192
|
+
allow, and a Spider game with too few cards left to deal ends. Canfield
|
|
193
|
+
and Bakers Dozen let foundation cards come back down, Canfield counts
|
|
194
|
+
its base card in the score, and Forty Thieves is scored as AisleRiot
|
|
195
|
+
scores it, can send a whole run up in one move, and on a double-click
|
|
196
|
+
puts a card that can't go up onto a column.
|
|
197
|
+
- Statistics are only shared when AisleRiot is there, as its keyfile or
|
|
198
|
+
its `sol` program, and not just because there's a `gnome-games` folder,
|
|
199
|
+
which other GNOME games keep too. Until AisleRiot has run once, the
|
|
200
|
+
statistics screen says they'll be shared from then on.
|
|
201
|
+
- `--reset-stats` only says the statistics are shared with GNOME
|
|
202
|
+
AisleRiot when AisleRiot has a record of one of these games to clear,
|
|
203
|
+
and then says `1 game`, not `1 game(s)`.
|
|
204
|
+
- Double-clicking a foundation sends up every card that can go.
|
|
205
|
+
- In Golf, Triple Peaks and Scorpion, an `f` or a double-click that does
|
|
206
|
+
nothing says why, as those games have no foundations. Text mode's `f`
|
|
207
|
+
does too.
|
|
208
|
+
- The mouse: a slow click picks a card up instead of undoing itself, a
|
|
209
|
+
double-click at a normal speed counts, and a click straight after a
|
|
210
|
+
drag isn't taken for one. Moving the pointer doesn't move the cursor,
|
|
211
|
+
and letting go of a click doesn't move the menu's. A click on the menu
|
|
212
|
+
or a dialog doesn't turn up on the board afterwards, and the banner
|
|
213
|
+
only takes a left click on a choice.
|
|
214
|
+
- The keys: Esc acts at once, and Alt with a key is no longer read as Esc
|
|
215
|
+
and then the key. Help and statistics stay up until a key is pressed.
|
|
216
|
+
The boss key works on every screen, not just the board, and brings you
|
|
217
|
+
back to where you were. Boss mode stays up when the mouse moves or the
|
|
218
|
+
window is resized, and game keys do nothing while the terminal is too
|
|
219
|
+
small to show the board.
|
|
220
|
+
- Hints name cards as the board draws them and no longer tell you to deal
|
|
221
|
+
when you can't, the Spider summary no longer claims that builds must
|
|
222
|
+
follow suit, and the status line catches up after undo and redo.
|
|
223
|
+
- Picking up a run names its card as the board draws it and says
|
|
224
|
+
`2 cards`, not `2 card(s)`.
|
|
225
|
+
- A card dealt from the stock clears the line saying why the move before
|
|
226
|
+
it did nothing.
|
|
227
|
+
- `*** YOU WIN! ***` shows in full on an 80-column status line in every
|
|
228
|
+
game, code skin too, where a long status used to cut it off.
|
|
229
|
+
- The full-screen game starts on terminals that can't hide the cursor and
|
|
230
|
+
on colour terminals without default colours, draws plain cards when the
|
|
231
|
+
locale can't show the suit symbols, and keeps a ten inside its card at
|
|
232
|
+
the narrowest width and in the compact view.
|
|
233
|
+
- Text mode lines the cards up under their tags, times each deal on its
|
|
234
|
+
own clock, counts a game left unfinished from a pipe as lost, uses
|
|
235
|
+
letter suits when the output can't show the symbols, and leaves quietly
|
|
236
|
+
on Ctrl-C or when piped into `head`. Its boss screen hides the board
|
|
237
|
+
properly, with paths that fit the platform.
|
|
238
|
+
- Soliterm starts on Klondike when the game played last no longer exists.
|
|
239
|
+
|
|
240
|
+
## aisle-cli 1.0.0 - 2026-06-29
|
|
241
|
+
|
|
242
|
+
- Initial release. A dependency-free terminal Solitaire collection, a
|
|
243
|
+
command-line replica of GNOME AisleRiot (`/usr/games/sol`), pure Python 3
|
|
244
|
+
with no third-party packages.
|
|
245
|
+
- **Nine games**: Klondike, Spider (1/2/4 suit), FreeCell, Eight Off, Golf,
|
|
246
|
+
Yukon, Bakers Dozen, Forty Thieves, Canfield.
|
|
247
|
+
- **Curses TUI** with keyboard **and** mouse: arrow-key cursor, click to
|
|
248
|
+
pick up / drop, click mid-stack to split a run, double-click to a foundation
|
|
249
|
+
(or to deal on the stock).
|
|
250
|
+
- **Real overlapping card art**: top card full-size, covered cards peek with
|
|
251
|
+
their rank visible, with a one-key toggle (`x`) to the compact legacy view.
|
|
252
|
+
- **Progress-based hints** (`h`) that only ever suggest a move which advances
|
|
253
|
+
the game, and are provably loop-free.
|
|
254
|
+
- **AisleRiot statistics sharing**: reads from and writes to the installed
|
|
255
|
+
GNOME AisleRiot keyfile, so games played in either program are mirrored in
|
|
256
|
+
both (wins / total / percentage / best & worst time).
|
|
257
|
+
- Live toggles, all persisted: colour on/off (`v`), code-skin play mode (`c`),
|
|
258
|
+
and a boss key (`b` / F2) that hides the board behind fake build output.
|
|
259
|
+
- Restart-this-deal, undo/redo, autoplay, "no moves left" detection, and an
|
|
260
|
+
end-of-game banner with same-deal / new-deal / menu choices.
|
|
261
|
+
- Pipe-friendly text mode (`--text`) and three distribution forms: a zero
|
|
262
|
+
install single-file zipapp, a pip wheel + sdist, and a source archive.
|
|
263
|
+
- 17 test files covering the engine, all nine games' rules, scoring, undo/redo,
|
|
264
|
+
hints, statistics persistence, and the rendering modes.
|
|
265
|
+
|
|
266
|
+
[Unreleased]: https://github.com/bwenstar/soliterm/compare/v1.0.0...HEAD
|
|
267
|
+
[1.0.0]: https://github.com/bwenstar/soliterm/releases/tag/v1.0.0
|
soliterm-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Brendan Ta
|
|
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,12 @@
|
|
|
1
|
+
# Ship the whole test suite in the sdist, not just the test_*.py files
|
|
2
|
+
# setuptools picks up by default: conftest.py is what points every test at
|
|
3
|
+
# a throwaway home, so the tests must never travel without it.
|
|
4
|
+
include CHANGELOG.md
|
|
5
|
+
recursive-include tests *.py
|
|
6
|
+
include tools/build_pyz.py tools/keybindings.py tools/screenshots.py
|
|
7
|
+
# tests/test_keybindings_doc.py checks the key page against the code
|
|
8
|
+
include docs/keybindings.md
|
|
9
|
+
# the manual page, which tests/test_man_page.py checks against the code
|
|
10
|
+
include man/soliterm.6
|
|
11
|
+
# SECURITY.md, which tests/test_cli.py checks against --reset-stats
|
|
12
|
+
include SECURITY.md
|