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.
- sk8r-1.0.0/LICENSE +21 -0
- sk8r-1.0.0/PKG-INFO +438 -0
- sk8r-1.0.0/README.md +407 -0
- sk8r-1.0.0/pyproject.toml +91 -0
- sk8r-1.0.0/pyproject.toml.orig +67 -0
- sk8r-1.0.0/src/sk8r/__init__.py +8 -0
- sk8r-1.0.0/src/sk8r/__main__.py +5 -0
- sk8r-1.0.0/src/sk8r/appenv.py +164 -0
- sk8r-1.0.0/src/sk8r/cli.py +779 -0
- sk8r-1.0.0/src/sk8r/config.py +682 -0
- sk8r-1.0.0/src/sk8r/defaults.py +336 -0
- sk8r-1.0.0/src/sk8r/doctor.py +543 -0
- sk8r-1.0.0/src/sk8r/git.py +69 -0
- sk8r-1.0.0/src/sk8r/guide.md +25 -0
- sk8r-1.0.0/src/sk8r/guide.py +34 -0
- sk8r-1.0.0/src/sk8r/hooks.py +158 -0
- sk8r-1.0.0/src/sk8r/init.py +213 -0
- sk8r-1.0.0/src/sk8r/journal.py +257 -0
- sk8r-1.0.0/src/sk8r/launchers.py +171 -0
- sk8r-1.0.0/src/sk8r/pack.py +334 -0
- sk8r-1.0.0/src/sk8r/packinit.py +369 -0
- sk8r-1.0.0/src/sk8r/paths.py +55 -0
- sk8r-1.0.0/src/sk8r/plan.py +183 -0
- sk8r-1.0.0/src/sk8r/presets/django-expo.toml +140 -0
- sk8r-1.0.0/src/sk8r/presets/django-vite.toml +138 -0
- sk8r-1.0.0/src/sk8r/presets/django.toml +82 -0
- sk8r-1.0.0/src/sk8r/presets/fastapi-vite.toml +118 -0
- sk8r-1.0.0/src/sk8r/presets/node-next.toml +68 -0
- sk8r-1.0.0/src/sk8r/presets/python-server.toml +65 -0
- sk8r-1.0.0/src/sk8r/presets.py +765 -0
- sk8r-1.0.0/src/sk8r/programs.py +71 -0
- sk8r-1.0.0/src/sk8r/records.py +35 -0
- sk8r-1.0.0/src/sk8r/run.py +494 -0
- sk8r-1.0.0/src/sk8r/safewrite.py +76 -0
- sk8r-1.0.0/src/sk8r/setup.py +139 -0
- sk8r-1.0.0/src/sk8r/setup_records.py +65 -0
- sk8r-1.0.0/src/sk8r/shortcuts.py +21 -0
- sk8r-1.0.0/src/sk8r/start.py +197 -0
- sk8r-1.0.0/src/sk8r/status.py +226 -0
- sk8r-1.0.0/src/sk8r/t3.py +120 -0
- sk8r-1.0.0/src/sk8r/t3settings.py +109 -0
- sk8r-1.0.0/src/sk8r/templates/claude-settings.json +1 -0
- sk8r-1.0.0/src/sk8r/templates/context-pack.md +29 -0
- sk8r-1.0.0/src/sk8r/templates/pre-commit.sh +7 -0
- sk8r-1.0.0/src/sk8r/tomlwriter.py +159 -0
- sk8r-1.0.0/src/sk8r/trust.py +280 -0
- 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
|
+
[](https://github.com/code-kasha/sk8r/actions/workflows/ci.yml)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+

|
|
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
|