sk8r 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 (47) hide show
  1. sk8r-1.0.0/LICENSE +21 -0
  2. sk8r-1.0.0/PKG-INFO +438 -0
  3. sk8r-1.0.0/README.md +407 -0
  4. sk8r-1.0.0/pyproject.toml +91 -0
  5. sk8r-1.0.0/pyproject.toml.orig +67 -0
  6. sk8r-1.0.0/src/sk8r/__init__.py +8 -0
  7. sk8r-1.0.0/src/sk8r/__main__.py +5 -0
  8. sk8r-1.0.0/src/sk8r/appenv.py +164 -0
  9. sk8r-1.0.0/src/sk8r/cli.py +779 -0
  10. sk8r-1.0.0/src/sk8r/config.py +682 -0
  11. sk8r-1.0.0/src/sk8r/defaults.py +336 -0
  12. sk8r-1.0.0/src/sk8r/doctor.py +543 -0
  13. sk8r-1.0.0/src/sk8r/git.py +69 -0
  14. sk8r-1.0.0/src/sk8r/guide.md +25 -0
  15. sk8r-1.0.0/src/sk8r/guide.py +34 -0
  16. sk8r-1.0.0/src/sk8r/hooks.py +158 -0
  17. sk8r-1.0.0/src/sk8r/init.py +213 -0
  18. sk8r-1.0.0/src/sk8r/journal.py +257 -0
  19. sk8r-1.0.0/src/sk8r/launchers.py +171 -0
  20. sk8r-1.0.0/src/sk8r/pack.py +334 -0
  21. sk8r-1.0.0/src/sk8r/packinit.py +369 -0
  22. sk8r-1.0.0/src/sk8r/paths.py +55 -0
  23. sk8r-1.0.0/src/sk8r/plan.py +183 -0
  24. sk8r-1.0.0/src/sk8r/presets/django-expo.toml +140 -0
  25. sk8r-1.0.0/src/sk8r/presets/django-vite.toml +138 -0
  26. sk8r-1.0.0/src/sk8r/presets/django.toml +82 -0
  27. sk8r-1.0.0/src/sk8r/presets/fastapi-vite.toml +118 -0
  28. sk8r-1.0.0/src/sk8r/presets/node-next.toml +68 -0
  29. sk8r-1.0.0/src/sk8r/presets/python-server.toml +65 -0
  30. sk8r-1.0.0/src/sk8r/presets.py +765 -0
  31. sk8r-1.0.0/src/sk8r/programs.py +71 -0
  32. sk8r-1.0.0/src/sk8r/records.py +35 -0
  33. sk8r-1.0.0/src/sk8r/run.py +494 -0
  34. sk8r-1.0.0/src/sk8r/safewrite.py +76 -0
  35. sk8r-1.0.0/src/sk8r/setup.py +139 -0
  36. sk8r-1.0.0/src/sk8r/setup_records.py +65 -0
  37. sk8r-1.0.0/src/sk8r/shortcuts.py +21 -0
  38. sk8r-1.0.0/src/sk8r/start.py +197 -0
  39. sk8r-1.0.0/src/sk8r/status.py +226 -0
  40. sk8r-1.0.0/src/sk8r/t3.py +120 -0
  41. sk8r-1.0.0/src/sk8r/t3settings.py +109 -0
  42. sk8r-1.0.0/src/sk8r/templates/claude-settings.json +1 -0
  43. sk8r-1.0.0/src/sk8r/templates/context-pack.md +29 -0
  44. sk8r-1.0.0/src/sk8r/templates/pre-commit.sh +7 -0
  45. sk8r-1.0.0/src/sk8r/tomlwriter.py +159 -0
  46. sk8r-1.0.0/src/sk8r/trust.py +280 -0
  47. sk8r-1.0.0/src/sk8r/verify.py +178 -0
sk8r-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Akash Damle
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.
sk8r-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,438 @@
1
+ Metadata-Version: 2.4
2
+ Name: sk8r
3
+ Version: 1.0.0
4
+ Summary: Set a project up so it runs: identify it, install it, fill local settings, add editor run buttons and verify it starts, after one approval.
5
+ Keywords: developer-tools,project-setup,ai-agents,dev-environment,django,t3code,cli
6
+ Author: Akash Damle
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: Microsoft :: Windows
13
+ Classifier: Operating System :: MacOS
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
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: Programming Language :: Python :: 3.15
22
+ Classifier: Topic :: Software Development
23
+ Classifier: Topic :: Software Development :: Build Tools
24
+ Classifier: Topic :: Utilities
25
+ Requires-Python: >=3.11
26
+ Project-URL: Homepage, https://github.com/code-kasha/sk8r
27
+ Project-URL: Repository, https://github.com/code-kasha/sk8r
28
+ Project-URL: Issues, https://github.com/code-kasha/sk8r/issues
29
+ Project-URL: Changelog, https://github.com/code-kasha/sk8r/blob/main/CHANGELOG.md
30
+ Description-Content-Type: text/markdown
31
+
32
+ <p align="center">
33
+ <picture>
34
+ <source media="(prefers-color-scheme: dark)" srcset="assets/brand/logo-light.png">
35
+ <img alt="sk8r" src="assets/brand/logo.png" width="420">
36
+ </picture>
37
+ </p>
38
+
39
+ # sk8r
40
+
41
+ **Keep your momentum.** sk8r sets a project up so it actually runs: it works out what the project
42
+ is, installs its dependencies, fills in local settings, adds run buttons to your editor, and checks
43
+ that the app really starts — after one approval. Then it keeps a short, always-current briefing so
44
+ the next AI session picks up where the last one stopped.
45
+
46
+ Pronounced *skat-r*. Python 3.11+, standard library only at runtime. Linux, macOS and Windows.
47
+
48
+ [![CI](https://github.com/code-kasha/sk8r/actions/workflows/ci.yml/badge.svg)](https://github.com/code-kasha/sk8r/actions/workflows/ci.yml)
49
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
50
+ ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)
51
+
52
+ [Quick start](#quick-start) · [Features](#features) · [How it works](#how-it-works) ·
53
+ [Commands](#commands) · [Results](results/README.md) · [Reference](docs/reference.md) ·
54
+ [Contributing](CONTRIBUTING.md)
55
+
56
+ ---
57
+
58
+ ## Contents
59
+
60
+ - [Why](#why)
61
+ - [Quick start](#quick-start)
62
+ - [Features](#features)
63
+ - [Ready](#ready)
64
+ - [Upcoming](#upcoming)
65
+ - [How it works](#how-it-works)
66
+ - [Safety](#safety)
67
+ - [Commands](#commands)
68
+ - [Configuration files](#configuration-files)
69
+ - [Platforms](#platforms)
70
+ - [Status](#status)
71
+ - [Contributing](#contributing)
72
+ - [License](#license)
73
+
74
+ ## Why
75
+
76
+ Cloning a project is easy. Getting it to *run* is where momentum dies: which Python, which
77
+ package manager, which virtual environment, the `.env` nobody committed, the database URL, the
78
+ command that starts the server, and whether it really started. AI coding assistants make this
79
+ worse and better at once: they can do all of it, but they guess, and "it should work now" is not
80
+ the same as a server answering.
81
+
82
+ Momentum also dies between sessions. A new AI session starts cold: it doesn't know what is done,
83
+ what is next or which rules the project follows, so it re-reads everything or, worse, guesses.
84
+
85
+ sk8r turns both into predictable steps an assistant (or you) can run, preview and undo:
86
+
87
+ ```text
88
+ You: Set this project up with sk8r; follow `sk8r guide`.
89
+ Agent: Here is the plan:
90
+ 1. Write sk8r.toml (preset django, python=uv inferred from uv.lock)
91
+ 2. Write 3 run buttons into T3 Code (backup first)
92
+ 3. Setup: uv sync
93
+ 4. Add app settings to .env: SECRET_KEY, ALLOWED_HOSTS, DATABASE_URL, DEBUG (names only)
94
+ 5. Start check: wait for http://127.0.0.1:8000/admin/login/, then stop
95
+ Approve?
96
+ You: approve it
97
+ Agent: configured ✓ dependencies installed ✓ dry-run verified ✓ launched ✓ (HTTP 200)
98
+ ```
99
+
100
+ That exchange is a real run on a real Django project, from approval to a verified HTTP 200 in about
101
+ 11 seconds. See [results](results/README.md) for it and for the less flattering runs that shaped
102
+ sk8r.
103
+
104
+ ## Quick start
105
+
106
+ ```bash
107
+ uv tool install sk8r # from PyPI
108
+ uv tool update-shell # puts sk8r on PATH if it isn't yet
109
+ sk8r --version
110
+ ```
111
+
112
+ **With an AI assistant in [T3 Code](https://github.com/pingdotgg/t3code):** open your project and
113
+ say *"Set this project up with sk8r; follow `sk8r guide`."* Review the plan, approve once, and the
114
+ new run buttons appear in T3 (press **Ctrl+R** if they don't).
115
+
116
+ **On your own, in a terminal:**
117
+
118
+ ```bash
119
+ cd your-project
120
+ sk8r run --dry-run # see the whole plan; nothing is written or run
121
+ sk8r run # do it, after one yes
122
+ sk8r start dev # launch the profile's processes, one terminal tab each
123
+ sk8r undo # changed your mind? reverse everything sk8r did here
124
+ ```
125
+
126
+ **Keep AI sessions in context:**
127
+
128
+ ```bash
129
+ sk8r pack init --dry-run --hook --remind claude # preview adopting the briefing workflow
130
+ sk8r pack init --yes --hook --remind claude # adopt it: pack, task list, AGENTS.md pointer, hook
131
+ sk8r status # progress, next tasks, warnings
132
+ ```
133
+
134
+ ## Features
135
+
136
+ **Ready** features ship in the current version and are covered by the test suite.
137
+ **Upcoming** features are planned on the roadmap; their shape may change before they ship.
138
+
139
+ ### Ready
140
+
141
+ #### 1. One-approval project setup — `sk8r run`
142
+
143
+ - **One plan, one yes.** Identification, configuration, run buttons, dependency setup, app
144
+ settings and start checks are shown as a single numbered plan and carried out after one
145
+ approval.
146
+ - **Preview everything first.** `sk8r run --dry-run` writes and runs nothing; `--json` returns one
147
+ result object for an AI assistant.
148
+ - **Leave parts out.** `--no-setup`, `--no-env` and `--no-verify` drop steps from the plan;
149
+ `--pack` adds context-pack adoption to it.
150
+ - **Four honest states,** reported separately because they are different claims:
151
+ *configured* (`sk8r.toml` written), *dependencies installed* (setup recorded),
152
+ *dry-run verified* (programs and paths exist) and *launched* (the app actually answered).
153
+ - **Never rewrites your configuration.** An existing `sk8r.toml` with profiles is left as it is.
154
+
155
+ #### 2. Stack detection and presets — `sk8r presets`, `sk8r init`
156
+
157
+ - **Six presets:** `django`, `django-vite`, `django-expo`, `fastapi-vite`, `node-next` and
158
+ `python-server` ([catalogue](docs/presets.md)).
159
+ - **Choices inferred from your files,** with the source shown in the preview: `uv.lock` → uv,
160
+ `poetry.lock` → Poetry, `requirements.txt` → a project `.venv`, `pyproject.toml` alone → uv;
161
+ `pnpm-lock.yaml`, `yarn.lock` or `package-lock.json` pick the Node tool.
162
+ - **Safe automatic choice.** Only a single full preset match is picked automatically; half matches
163
+ ask you to choose with `--preset`.
164
+ - **Python options:** `uv`, `poetry`, `venv` (creates `.venv` and installs requirements; commands
165
+ use the venv's Python directly, no activation) and `plain`. **Node options:** `pnpm`, `npm`, `yarn`.
166
+ - **Parameters with validation** (`--set port=8001`, `--set backend_dir=api`): paths, ports, text
167
+ and choices are checked before anything is written.
168
+ - **Presets are data, not code.** `sk8r init --preset <name>` copies the profiles into
169
+ `sk8r.toml`, appending after a comment that records your options, keeping your newline style and
170
+ encoding, and writing atomically. Name clashes stop with a list; `--rename old=new` resolves them.
171
+ - **Browse and inspect:** `sk8r presets list`, `presets show <name>` (the exact TOML) and
172
+ `presets detect` (read-only).
173
+ - **Repair a generated profile:** `sk8r init --replace <profile> --dry-run` shows a diff and
174
+ replaces only a profile that `init` generated and nobody edited.
175
+
176
+ #### 3. Launching — `sk8r start`
177
+
178
+ - **One terminal tab per process:** Windows Terminal (a PowerShell 7 tab each), a detached tmux
179
+ session on Linux (and on macOS with tmux), or Terminal.app windows on macOS.
180
+ - **Fallback that still helps:** when no terminal is available, sk8r prints the exact commands.
181
+ - **Profiles and variants,** for example `sk8r start dev lan` or `sk8r start dev phone`.
182
+ - **Exact plans:** `--dry-run` prints every tab, folder and command; `--tab <t> --here` runs one tab
183
+ in the current terminal (what each editor button runs).
184
+ - **Checked before launch.** The profile's readiness checks run first; nothing starts while one
185
+ blocks (`--no-check` skips them). Tabs whose setup is incomplete are refused.
186
+ - **Shell shortcut:** `sk8r shortcut powershell|bash|zsh` prints an opt-in `start` function;
187
+ nothing edits your shell profile.
188
+
189
+ #### 4. Dependency setup — `sk8r setup`
190
+
191
+ - **Declared, shown, confirmed.** Each profile's setup (`uv sync`, `poetry install`,
192
+ `pnpm install`, venv creation…) is printed with its folder and runs only after a yes.
193
+ - **Recorded completion.** Successful setup is recorded with the hashes of its inputs (lock or
194
+ requirements files), so an empty or outdated `.venv` never counts as ready.
195
+ - **Independent entries.** A failed `pnpm install` doesn't stop the Python environment.
196
+ - **Plain warnings.** Choosing `plain` beside a requirements file warns that dependencies are
197
+ unmanaged.
198
+
199
+ #### 5. App settings — `.env` defaults
200
+
201
+ - **Fills only what is missing.** Required keys come from `.env.example` and the preset; a key is
202
+ added only when it is missing or empty.
203
+ - **Local-development defaults** for Django: a SQLite `DATABASE_URL`, a generated `SECRET_KEY`,
204
+ `DEBUG=True` and `ALLOWED_HOSTS=localhost,127.0.0.1`. Add your own with `sk8r defaults`.
205
+ - **Names only.** Values are never printed, logged or stored by sk8r, and values you set are never
206
+ changed.
207
+ - **Gated start.** Until required keys are filled, doctor reports `env-missing` and `start` waits.
208
+
209
+ #### 6. Start check — `sk8r verify`
210
+
211
+ - **A real HTTP answer,** not a guess: sk8r starts the tab in the background, waits for any HTTP
212
+ response at its `check_url` (Django: `/admin/login/`, Vite: port 5173), then stops it.
213
+ - **Cleans up after itself.** It stops only its own process tree and confirms the port is free
214
+ again.
215
+ - **Refuses busy ports** and never touches processes it didn't start.
216
+ - **Useful failures.** When the app doesn't answer, the last log lines are shown and kept under
217
+ `.git/sk8r/verify/`.
218
+ - **A "check" button per tab** in T3 Code.
219
+
220
+ #### 7. Editor run buttons — T3 Code
221
+
222
+ - **Buttons written for you.** One button per tab and one per setup, written straight into T3's
223
+ project settings (with a timestamped backup first) and/or a shared `t3.json`
224
+ (`--t3 file|settings|both|off`).
225
+ - **Only sk8r's entries.** Existing scripts are kept; only entries whose id starts with `sk8r-` are
226
+ replaced.
227
+ - **Project defaults for T3:** the model and thread mode (local or worktree) you prefer, applied to
228
+ every project you set up; different existing values are kept unless you override them.
229
+ - **Import path** for any setup without direct settings access: import `t3.json` in T3's project
230
+ settings.
231
+
232
+ #### 8. Readiness check — `sk8r doctor`
233
+
234
+ - **Read-only.** Changes nothing and runs no project commands.
235
+ - **Checks in order:** Python, sk8r on `PATH`, Git; the repository, `sk8r.toml`, records branch,
236
+ plan and pack; the terminal launcher; each profile's folders, required paths, programs, setup
237
+ and app settings; `t3.json` freshness.
238
+ - **Every finding has a fix,** a stable code (`program-missing`, `setup-needed`, `env-missing`…)
239
+ and a level (`ok`, `warn`, `block`). `--json` gives one machine-readable object.
240
+
241
+ #### 9. Undo — `sk8r undo`
242
+
243
+ - **Everything journalled.** `sk8r.toml`, `t3.json`, T3 buttons and project defaults, setup
244
+ records, created files and folders, `.env` additions, and context-pack adoption (pack, task list,
245
+ `AGENTS.md` block, hook and reminder).
246
+ - **Reversible in one command.** `sk8r undo --dry-run` lists changes newest first; `--yes`
247
+ reverses them byte for byte, restoring editor buttons sk8r replaced.
248
+ - **Your edits win.** Anything changed since sk8r wrote it is reported and left alone.
249
+
250
+ #### 10. Your defaults — `sk8r defaults`
251
+
252
+ - **One file for your preferences:** preferred tools and ports, terminal launcher, start-check
253
+ timeout, where buttons go, T3 model and thread mode, and extra `.env` defaults.
254
+ - **Edit safely:** `defaults init`, `defaults set run.launcher tmux` and `defaults unset …` edit one
255
+ setting atomically, keeping comments and line endings.
256
+ - **Clear precedence,** shown with each value's source: what you type wins over the project's
257
+ files, your defaults and preset defaults.
258
+
259
+ #### 11. AI assistant guide — `sk8r guide`
260
+
261
+ - **Versioned instructions** an assistant follows to set a project up in T3 Code, centred on
262
+ `sk8r run`'s one-approval plan; `--json` gives the same as data.
263
+ - **No model inside.** sk8r itself never calls a model; the assistant runs sk8r's commands and you
264
+ approve.
265
+
266
+ #### 12. Context pack for AI sessions — `sk8r pack`, `sk8r pack init`
267
+
268
+ - **A short briefing** (`docs/context-pack.md`) a new AI session reads first: agent rules, the next
269
+ task, open questions, and a generated block of current facts, kept under 10 KB by trimming rules.
270
+ - **One-command adoption:** `sk8r pack init` creates the pack from a template, finds your task list
271
+ (`TODO.md` or `todo.md`, exact spelling kept) or creates a starter one, sets the plan, pack and
272
+ records branch in `sk8r.toml`, adds a marked start-here block to `AGENTS.md`, and fills the block —
273
+ as one numbered plan in plain words, after one yes, and fully undoable.
274
+ - **Safe refresh.** `sk8r pack` rewrites only the generated block between its markers, on the
275
+ records branch only, and changes no other byte; `--check` exits 3 when the pack is stale.
276
+ - **Stable by design.** The block changes only when the plan's facts change, so a committed pack
277
+ stays current (an optional recent-commits list is off by default).
278
+
279
+ #### 13. Project status — `sk8r status`
280
+
281
+ - **The facts in one place:** current branch or detached HEAD, uncommitted changes, progress per
282
+ phase, the current phase, next tasks per teammate, branch locks and plan warnings.
283
+ - **Read from the records branch** without switching branches; `--json` gives one versioned object.
284
+ It never writes.
285
+
286
+ #### 14. Commit hook and agent reminders — `--hook`, `sk8r hook`, `sk8r remind`
287
+
288
+ - **Optional pre-commit hook** that refreshes and stages only the pack when you commit plan
289
+ changes. It respects `core.hooksPath`, keeps an existing hook's lines (inserting its stanza
290
+ before the final `exit`), and always exits 0, so it never blocks a commit.
291
+ - **Installed only when asked** (`sk8r pack init --hook`) or by hand from `sk8r hook show`.
292
+ - **Claude Code reminder** (`--remind claude`) merges a post-commit reminder into
293
+ `.claude/settings.json`, keeping your other settings; it tells the model when the pack is stale
294
+ and never refreshes anything itself.
295
+ - **Portable routine** for other assistants: `sk8r pack --check` after a commit
296
+ ([details](docs/hooks.md)).
297
+
298
+ #### 15. Configuration check — `sk8r config check`
299
+
300
+ - Validates `sk8r.toml` (versioned schema, unknown keys rejected, repository-relative paths
301
+ only) without running anything.
302
+
303
+ #### 16. Repository trust — `sk8r trust`
304
+
305
+ - **You approve a project's commands once.** Before `sk8r start` (and the editor's run buttons),
306
+ `sk8r setup` and `sk8r verify` run anything a project's `sk8r.toml` declares, sk8r shows every
307
+ command with the full path of the program it runs, and asks.
308
+ - **Any change asks again,** with the added and removed lines, so a `git pull` can't slip in new
309
+ commands.
310
+ - **Approvals live on your machine,** outside every repository, so a cloned or copied project
311
+ never arrives pre-approved. `sk8r trust --revoke` removes one.
312
+ - **One plan, still one yes.** `sk8r run` lists the commands in its plan when they are new or
313
+ changed; configuration sk8r writes itself is approved automatically.
314
+ - **Programs are what they say.** Bare names like `git` are found only on `PATH`, never in the
315
+ project or current folder, and the start check only connects to this machine.
316
+
317
+ ### Upcoming
318
+
319
+ Planned, in roughly this order. None of these ship yet.
320
+
321
+ - **More presets.** More stacks, mostly from contributors; each is a small data file plus a test.
322
+ - **Verification profiles and portable handoffs.** Richer, declared checks beyond "the server
323
+ answers", and handoffs that move between machines and assistants.
324
+ - **Backup and move — the backup tool.** Move a project between machines: Git history and
325
+ uncommitted work, folders that live outside the repository, optional data, and project-filtered
326
+ AI chat history, with an archive manifest, ownership filters, upload to a committed backend and
327
+ restore validation.
328
+ - **Agents kit.** A reusable setup for teams of AI agents: a shared agreement, teammate
329
+ permissions, task briefs, record and claim rules, and a helper for working one step at a time.
330
+ - **Workflow playbook.** A `WORKFLOW.md` written from the tested routines: approval, pauses, tests,
331
+ commits, the pack, status and handoff.
332
+ - **Docs export (optional).** Export project records to Word and Excel.
333
+ - **Browser kit.** Isolated browser environments, sign-in, pinned time and screenshot helpers for
334
+ checking web apps, while the core stays standard-library only.
335
+
336
+ ## How it works
337
+
338
+ 1. **Identify.** sk8r matches the project against [presets](docs/presets.md) and infers the
339
+ choices from the files that are there. It writes one small file, `sk8r.toml`.
340
+ 2. **Check.** `sk8r doctor` explains what is missing and how to fix it, without changing anything.
341
+ 3. **Install.** Declared setup runs only after your yes: create the venv, install requirements,
342
+ `pnpm install`. Completion is recorded, so an empty or outdated `.venv` never counts as ready.
343
+ 4. **Configure.** Missing local-development settings are added to `.env`. Values you set are never
344
+ changed, and values are never printed.
345
+ 5. **Buttons.** Run buttons go into your editor's project settings (T3 Code today) and a shared
346
+ `t3.json`, with a backup first.
347
+ 6. **Verify.** sk8r starts each server in the background, waits for a real HTTP answer, stops it,
348
+ and confirms the port is free. It refuses ports already in use and never touches your servers.
349
+ 7. **Brief.** Optionally, `sk8r pack init` adds a context pack that the next AI session reads first,
350
+ kept current by `sk8r pack` and an optional commit hook.
351
+
352
+ Your preferences live in one file (`sk8r defaults`). A project's own files and anything you type
353
+ always win.
354
+
355
+ ## Safety
356
+
357
+ - **Nothing changes without a yes.** Every write and install is shown first; without a terminal
358
+ and without `--yes`, sk8r refuses.
359
+ - **Everything can be undone.** sk8r journals each change in the project and `sk8r undo` reverses
360
+ it, restoring editor buttons it replaced; anything you changed since is left alone.
361
+ - **Secrets stay secret.** `.env` values are never printed, logged or stored by sk8r.
362
+ - **Your processes are yours.** sk8r never kills, reuses or frees a port it did not open.
363
+ - **A project's commands run only after you approve them,** once per version, with the full
364
+ path of every program shown (`sk8r trust`).
365
+ - **Your hooks are yours.** Nothing is installed implicitly; an existing hook is extended, never
366
+ overwritten, and sk8r's hook never blocks a commit.
367
+ - **Atomic writes.** Files are written through a temporary file and one replace; links and
368
+ non-regular files are refused.
369
+ - **No internet, no model.** sk8r itself calls no online service and no AI model (the start check
370
+ only talks to your own app on `127.0.0.1`); package managers it runs on your behalf do go online.
371
+
372
+ ## Commands
373
+
374
+ | Command | What it does |
375
+ |---|---|
376
+ | `sk8r run` | Identify, install, configure, add buttons and verify, after one approval |
377
+ | `sk8r start <profile> [variant]` | Launch a profile's processes in terminal tabs (Windows Terminal, tmux, Terminal.app) |
378
+ | `sk8r setup <profile>` | Run a profile's declared setup, after confirmation |
379
+ | `sk8r verify <profile> --tab <t>` | Start one tab, wait for an HTTP answer, stop it |
380
+ | `sk8r doctor [profile]` | Read-only readiness check with fixes (`--json` for tools) |
381
+ | `sk8r undo` | Reverse every change sk8r made in this project |
382
+ | `sk8r trust` | Show, approve (`--yes`) or revoke the commands a project may run |
383
+ | `sk8r presets list\|show\|detect` | The preset catalogue, a preset's exact profiles, matching presets |
384
+ | `sk8r init --preset <name>` | Add a preset's profiles to `sk8r.toml` (append-only, atomic) |
385
+ | `sk8r config check` | Validate `sk8r.toml` without running anything |
386
+ | `sk8r defaults` | Your preferences in one file: tools, ports, launcher, T3 model and thread mode |
387
+ | `sk8r guide` | The instructions an AI assistant follows to set a project up |
388
+ | `sk8r status` | Plan progress, next tasks, locks and warnings, read from the records branch |
389
+ | `sk8r pack init` | Adopt the context-pack workflow in one approved, undoable step |
390
+ | `sk8r pack` | Refresh the context pack's generated block (`--check`, `--dry-run`) |
391
+ | `sk8r hook show` | The optional pre-commit hook and how to integrate it by hand |
392
+ | `sk8r remind claude` | The optional Claude Code post-commit reminder |
393
+ | `sk8r shortcut <shell>` | Print an opt-in `start` shell function |
394
+
395
+ Commands that write offer `--dry-run`; those that report offer `--json`. Every command and setting is in the
396
+ [reference](docs/reference.md); `sk8r run` in depth is in [docs/run.md](docs/run.md).
397
+
398
+ ## Configuration files
399
+
400
+ | File | Where | What it holds |
401
+ |---|---|---|
402
+ | `sk8r.toml` | Repository root, committed | Project name, records branch, plan and pack paths, run profiles, setup and app-settings rules |
403
+ | `t3.json` | Repository root, committed | Shared T3 Code run buttons (only `sk8r-` entries are sk8r's) |
404
+ | `docs/context-pack.md` | Repository, committed | The AI briefing; sk8r owns only its generated block |
405
+ | `defaults.toml` | `%APPDATA%\sk8r\` on Windows, `~/.config/sk8r/` elsewhere | Your personal preferences |
406
+ | Journal, setup records, verify logs | Under Git's own folder (`.git/sk8r/`) | Undo history and local state; never committed |
407
+
408
+ ## Platforms
409
+
410
+ | Platform | Status |
411
+ |---|---|
412
+ | Windows | Tested in CI and by hand; Windows Terminal launcher |
413
+ | Linux | Tested in CI and by hand, including a real tmux launch |
414
+ | macOS | Tested in CI; **not yet tried on a real Mac** — your report is welcome |
415
+
416
+ **Have a Mac? Please try sk8r and tell us how it went.** The test suite passes on macOS in CI,
417
+ but nobody has run it on a real Mac yet, so the Terminal.app and tmux launchers, `sk8r run` and the
418
+ start check are unconfirmed there. A [platform report](https://github.com/code-kasha/sk8r/issues/new?template=platform_report.yml) takes a few minutes, and
419
+ problems you hit become fixes.
420
+
421
+ Windows limit: npm-style `.cmd` shims such as `pnpm.cmd` go through batch-file parsing, so quotes
422
+ and `%` inside their arguments can't be passed reliably; ordinary arguments are fine.
423
+
424
+ ## Status
425
+
426
+ sk8r 1.0 is out on [PyPI](https://pypi.org/project/sk8r/). The test suite (444 tests) runs in CI on Linux, macOS and Windows with
427
+ Python 3.11 and 3.15. Field results from real projects are in [results](results/README.md).
428
+ Changes are listed in the [changelog](CHANGELOG.md).
429
+
430
+ ## Contributing
431
+
432
+ The easiest first contribution is a [preset](docs/contributing-presets.md) for a stack you use:
433
+ it is a small data file plus a test. See [CONTRIBUTING.md](CONTRIBUTING.md) for the development
434
+ setup and the checks every change passes.
435
+
436
+ ## License
437
+
438
+ [MIT](LICENSE) © 2026 Akash Damle