@spoolway/win32-x64 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +311 -0
- package/bin/spoolway.exe +0 -0
- package/package.json +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marvin Gygas
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/logo/lockup-a-mark-left-invert.png">
|
|
4
|
+
<img src="docs/logo/lockup-a-mark-left.png" alt="spoolway" width="350">
|
|
5
|
+
</picture>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
Minimalistic command line state machine for turning coding agents into a pipeline you can actually reason about. No dependencies, terminal native. Runs headless or controls supported multiplexers. Worktree management and built-in support for GitHub's stacked pull requests.
|
|
9
|
+
|
|
10
|
+
Supported providers:
|
|
11
|
+
|
|
12
|
+
- **`claude`**
|
|
13
|
+
- **`codex`**
|
|
14
|
+
- **`pi`**
|
|
15
|
+
|
|
16
|
+
Supported multiplexers:
|
|
17
|
+
|
|
18
|
+
- **`tmux`**
|
|
19
|
+
- **`herdr`**
|
|
20
|
+
|
|
21
|
+
## Why
|
|
22
|
+
|
|
23
|
+
Running one coding agent is easy. Running five is tab-juggling: which one is done, which
|
|
24
|
+
one is stuck, and which one is quietly rewriting a file another one needs. The order lives
|
|
25
|
+
in your head, and it stops the moment you look away.
|
|
26
|
+
|
|
27
|
+
It replaces the orchestrating agent that is supposed to keep everything together — and
|
|
28
|
+
sometimes does. spoolway won't surprise you with a bill or an opinion.
|
|
29
|
+
|
|
30
|
+
## Features
|
|
31
|
+
|
|
32
|
+
- **A dispatcher with no model in it.** Every scheduling decision is mechanical — a
|
|
33
|
+
counter, a timestamp, a position in the pipeline file. It never drifts, costs nothing,
|
|
34
|
+
and is safe to interrupt at any point.
|
|
35
|
+
- **Any mix of agents.** Each step names its own agent and model: a local model for
|
|
36
|
+
implementation, a cloud model for review, a shell command for the test suite.
|
|
37
|
+
- **A worktree per task.** Every task builds on its own branch in its own checkout, so
|
|
38
|
+
parallel tasks never step on each other.
|
|
39
|
+
- **Stacked pull requests.** A dependent task's branch is cut from its dependency's
|
|
40
|
+
branch, so a chain of tasks arrives as one ordered stack of PRs. Nothing merges itself;
|
|
41
|
+
you land the stack. Optional, and driven by **`spoolway stack`**.
|
|
42
|
+
- **Session reuse.** A step can resume its prompt's earlier conversation instead of
|
|
43
|
+
paying to rebuild context, bounded by how full the model's window already is.
|
|
44
|
+
- **Unattended runs.** Overnight, nothing parks for a person: blocked work is resumed by
|
|
45
|
+
an unblocker prompt, with an output-token ceiling as the brake.
|
|
46
|
+
- **Trials.** Fork one task into an arm per pipeline and queue them together, then read the
|
|
47
|
+
arms side by side in eval.
|
|
48
|
+
- **Routines.** Keep the tasks you run over and over in `.spoolway/routines/`.
|
|
49
|
+
- **Eval built in.** Every lane's spend and outcome land in a ledger, so you can see what
|
|
50
|
+
your last pipeline edit did to pass rate and price.
|
|
51
|
+
|
|
52
|
+
## Install
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
npm install -g spoolway
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
A prebuilt binary, not a Node program — the package is a thin wrapper that runs it. Linux
|
|
59
|
+
(x64, arm64, musl), macOS (Apple Silicon, Intel) and Windows (x64, experimental).
|
|
60
|
+
|
|
61
|
+
From source instead, in a clone of this repository:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
cargo install --path .
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Platform notes and requirements in full: **[Installation and setup](docs/installation.md)**.
|
|
68
|
+
|
|
69
|
+
## Quick start
|
|
70
|
+
|
|
71
|
+
### 1. Set up inside the project repo
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
spoolway init
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`spoolway doctor` checks that everything the configured pipeline needs is actually
|
|
78
|
+
present, any time you want to confirm the project would run.
|
|
79
|
+
|
|
80
|
+
### 2. Plan, or create queueable spoolway tasks directly
|
|
81
|
+
|
|
82
|
+
Tell the `/spoolway-plan` skill what you want built. It argues the shape with you until
|
|
83
|
+
every question is settled, and writes the result as one plan page. Approve the page and it
|
|
84
|
+
cuts the plan into tasks.
|
|
85
|
+
|
|
86
|
+
<img src="docs/screenshots/plan.png" alt="a plan page written by /spoolway-plan">
|
|
87
|
+
|
|
88
|
+
Already know the shape you want? `/spoolway-tasks` skips the argument and cuts the task
|
|
89
|
+
documents straight away.
|
|
90
|
+
|
|
91
|
+
**Both skills are optional.** A task is only a Markdown file in
|
|
92
|
+
`~/.spoolway/<project>/pending/`, so anything that writes Markdown can produce one — an
|
|
93
|
+
issue exporter, a script, or a model you already talk to. The following command prints
|
|
94
|
+
the frontmatter a task document must carry:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
spoolway task contract
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 3. Queue
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
spoolway queue
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
<img src="docs/screenshots/queue.png" alt="the queue screen">
|
|
107
|
+
|
|
108
|
+
*The queue screen lists the groups on the left and previews the selected group's tasks on the
|
|
109
|
+
right — `enter` queues what is checked and offers to start dispatching on the spot. `g` gates
|
|
110
|
+
a task on the fly, `p` forks one across several pipelines as a trial, and `r` opens the
|
|
111
|
+
repeatable tasks you keep in `.spoolway/routines/`.*
|
|
112
|
+
|
|
113
|
+
### 4. Dispatch
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
spoolway dispatch # watch the board, and step in only where you are needed
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
<img src="docs/screenshots/dispatch.png" alt="the dispatcher board">
|
|
120
|
+
|
|
121
|
+
*One row per task, grouped by `group:`. The board says what each lane is spending as it
|
|
122
|
+
spends it, what every queued task is waiting on, and which tasks are waiting on you — the
|
|
123
|
+
paused one above passed a gated step. Tasks can be paused and resumed from the board.*
|
|
124
|
+
|
|
125
|
+
Every task on the board is in one of a few states:
|
|
126
|
+
|
|
127
|
+
| State | Meaning |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `queued` | Waiting for its dependencies and a free slot. |
|
|
130
|
+
| `running` | An agent is working the task's current step right now. |
|
|
131
|
+
| `waiting on you` | A lane ended its turn on a question; answering it is what moves the task. |
|
|
132
|
+
| `paused` | Passed a gated step; you decide whether it goes on. |
|
|
133
|
+
| `blocked` | Something needs a person. |
|
|
134
|
+
| `unreachable` | A task it depends on is blocked, so it cannot start until you clear that one. |
|
|
135
|
+
| `done` | Finished: the branch is handed over, the worktree removed, the task archived. |
|
|
136
|
+
|
|
137
|
+
### 5. Calibrate
|
|
138
|
+
|
|
139
|
+
The `/spoolway-calibrate` skill reads your archived tasks and the spend ledger over them, and
|
|
140
|
+
works out what actually cost you loops and money — a prompt that keeps sending work back, a
|
|
141
|
+
step running on a model far bigger than it needs.
|
|
142
|
+
|
|
143
|
+
It walks each finding with you, with the arithmetic behind it. The ones you keep are cut
|
|
144
|
+
into tasks of their own, so the fix to your pipeline goes through the same line as
|
|
145
|
+
everything else. This is how a pipeline that blocks constantly turns into one that runs
|
|
146
|
+
unattended.
|
|
147
|
+
|
|
148
|
+
## A task is what travels the line, and you define it
|
|
149
|
+
|
|
150
|
+
```markdown
|
|
151
|
+
---
|
|
152
|
+
id: sessions
|
|
153
|
+
title: feat(auth): add session tokens on top of login
|
|
154
|
+
group: auth
|
|
155
|
+
touches:
|
|
156
|
+
- src/auth/**
|
|
157
|
+
depends_on:
|
|
158
|
+
- login
|
|
159
|
+
---
|
|
160
|
+
## Context
|
|
161
|
+
## Goal
|
|
162
|
+
## Non-goals
|
|
163
|
+
## Acceptance criteria
|
|
164
|
+
## References
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**The frontmatter is spoolway's, the body is yours.** spoolway never reads the body; it is
|
|
168
|
+
what the agent works from, written from a skeleton you own.
|
|
169
|
+
|
|
170
|
+
## The pipeline is a file
|
|
171
|
+
|
|
172
|
+
- Mix agents and commands
|
|
173
|
+
- Set model and effort levels per step
|
|
174
|
+
- Create loops and inject skills
|
|
175
|
+
- Re-use previous sessions until the context threshold is met
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
# .spoolway/pipelines/default.yml
|
|
179
|
+
steps:
|
|
180
|
+
- id: implement
|
|
181
|
+
description: Write the code to satisfy the task's acceptance criteria.
|
|
182
|
+
agent: pi
|
|
183
|
+
prompt: implementer
|
|
184
|
+
model: qwen3-coder-30b
|
|
185
|
+
session: true
|
|
186
|
+
on_pass: review
|
|
187
|
+
on_fail: blocked
|
|
188
|
+
|
|
189
|
+
- id: review
|
|
190
|
+
description: Check the diff against the acceptance criteria and project standards.
|
|
191
|
+
agent: claude
|
|
192
|
+
prompt: reviewer
|
|
193
|
+
model: claude-opus-5
|
|
194
|
+
effort: high
|
|
195
|
+
session: true
|
|
196
|
+
loop:
|
|
197
|
+
implement: 2
|
|
198
|
+
on_pass: document
|
|
199
|
+
on_fail: implement
|
|
200
|
+
|
|
201
|
+
- id: document
|
|
202
|
+
description: Bring the domain documents in line with what this task changed.
|
|
203
|
+
agent: pi
|
|
204
|
+
prompt: archivist
|
|
205
|
+
model: qwen3-coder-30b
|
|
206
|
+
on_pass: handover
|
|
207
|
+
on_fail: blocked
|
|
208
|
+
|
|
209
|
+
- id: handover
|
|
210
|
+
description: Commit, squash, push and open this task's pull request — no model,
|
|
211
|
+
no rebase. Nothing is merged here; a person lands it.
|
|
212
|
+
run: spoolway stack
|
|
213
|
+
on_pass: checks
|
|
214
|
+
on_fail: blocked
|
|
215
|
+
|
|
216
|
+
- id: checks
|
|
217
|
+
description: Wait for the pull request's checks, and fail if they are red.
|
|
218
|
+
run: gh pr checks --watch --fail-fast
|
|
219
|
+
timeout: 45m
|
|
220
|
+
on_pass: done
|
|
221
|
+
on_fail: blocked
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**You do not have to write one by hand.** The `/spoolway-pipeline` skill writes a pipeline
|
|
225
|
+
for you, and edits the one you already have.
|
|
226
|
+
|
|
227
|
+
## Configurable per project
|
|
228
|
+
|
|
229
|
+
- Unattended mode delegates **`blocked`** tasks to a prompt you define. It clears
|
|
230
|
+
obstacles on its own and keeps your pipeline running while nobody is watching.
|
|
231
|
+
- Set specific models for generating pipelines or pull request summaries.
|
|
232
|
+
|
|
233
|
+
```toml
|
|
234
|
+
skills = ["spoolway-plan"] # which skills `spoolway eval` gives a block of their own
|
|
235
|
+
|
|
236
|
+
[dispatch]
|
|
237
|
+
backend = "herdr" # herdr, tmux, or headless
|
|
238
|
+
herdr_mode = "split" # "split": a workspace per task; "grouped": one shared tab, a pane per task
|
|
239
|
+
interval = "10s"
|
|
240
|
+
lane_quiet = "15m" # silence before a lane is reminded to report
|
|
241
|
+
default_pipeline = "default" # which pipeline a task runs when it names none
|
|
242
|
+
auto_commit = true
|
|
243
|
+
|
|
244
|
+
[unattended]
|
|
245
|
+
enabled = true # the overnight switch
|
|
246
|
+
max_output_tokens = 0 # spend ceiling for a run with nobody watching; 0 is none
|
|
247
|
+
skip_blocked_lane = true # a cleared block carries the task past the step it blocked on
|
|
248
|
+
blocked_agent = "claude" # who staffs `blocked` when nobody is at the keyboard
|
|
249
|
+
blocked_model = "claude-opus-5"
|
|
250
|
+
blocked_effort = "medium"
|
|
251
|
+
blocked_prompt = "unblocker"
|
|
252
|
+
|
|
253
|
+
[pipeline_gen]
|
|
254
|
+
pipeline_agent = "claude" # who `spoolway pipeline gen` opens its session as
|
|
255
|
+
pipeline_model = "claude-opus-5"
|
|
256
|
+
pipeline_effort = "medium"
|
|
257
|
+
pipeline_auto = false # false asks before writing the pipeline
|
|
258
|
+
pipeline_local_models = false
|
|
259
|
+
|
|
260
|
+
[update]
|
|
261
|
+
check = true # tell a person at a keyboard that a newer release is out
|
|
262
|
+
|
|
263
|
+
[calibrate]
|
|
264
|
+
window = "14d" # how far back `/spoolway-calibrate` reads
|
|
265
|
+
|
|
266
|
+
[stack.summary]
|
|
267
|
+
agent = "claude" # writes each PR's title and summary
|
|
268
|
+
model = "claude-haiku-4-5" # blank: the task file itself is the PR body
|
|
269
|
+
prompt = "summariser"
|
|
270
|
+
|
|
271
|
+
[agents.pi]
|
|
272
|
+
kind = "pi"
|
|
273
|
+
session_reuse_ctx = 50 # % of the window before a carried session restarts fresh
|
|
274
|
+
|
|
275
|
+
[agents.claude]
|
|
276
|
+
kind = "claude"
|
|
277
|
+
concurrency = 3
|
|
278
|
+
session_reuse_ctx = 50
|
|
279
|
+
permission_mode = "auto"
|
|
280
|
+
|
|
281
|
+
[models."*qwen3-coder-30b*"]
|
|
282
|
+
context_window = 100096
|
|
283
|
+
slots = 3 # parallel lanes the local server can actually hold
|
|
284
|
+
exclusive = true # never alongside another exclusive model
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
See **[Configuration](docs/configuration.md)**.
|
|
288
|
+
|
|
289
|
+
## Eval every run
|
|
290
|
+
|
|
291
|
+
Every lane's transcript is read when it settles and banked to a ledger: tokens, cost, wall
|
|
292
|
+
time, and what the lane reported. Every edit to your pipelines, prompts or config mints a
|
|
293
|
+
new version, so you can see what your last change did to pass rate and price.
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
spoolway eval
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
<img src="docs/screenshots/eval.png" alt="the eval screen">
|
|
300
|
+
|
|
301
|
+
*The eval screen on its runs view, one row per attempt at a task — `tab` cycles the four
|
|
302
|
+
views: the version comparisons per pipeline and per step, this one, and what your skills
|
|
303
|
+
came to. `f` filters, `e` exports CSV.*
|
|
304
|
+
|
|
305
|
+
## Documentation
|
|
306
|
+
|
|
307
|
+
See **[Documentation index](DOCS.md)**.
|
|
308
|
+
|
|
309
|
+
## License
|
|
310
|
+
|
|
311
|
+
MIT. See [LICENSE](LICENSE).
|
package/bin/spoolway.exe
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@spoolway/win32-x64",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "spoolway binary for win32 x64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Marvin Gygas",
|
|
7
|
+
"os": [
|
|
8
|
+
"win32"
|
|
9
|
+
],
|
|
10
|
+
"cpu": [
|
|
11
|
+
"x64"
|
|
12
|
+
],
|
|
13
|
+
"files": [
|
|
14
|
+
"bin"
|
|
15
|
+
],
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/marvingygas/spoolway.git"
|
|
19
|
+
}
|
|
20
|
+
}
|