loomrail 0.1.0-alpha.1 → 0.1.0-alpha.2
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/README.md +68 -211
- package/apps/cli/dist/index.js +1778 -4
- package/apps/cli/migrations/0015_project_constitutions.sql +149 -0
- package/apps/web/dist/assets/index-C2Qyqtd7.js +5 -0
- package/apps/web/dist/assets/index-C2Qyqtd7.js.map +1 -0
- package/apps/web/dist/assets/{index-Z88TqCIf.css → index-DDJ2hnYz.css} +1 -1
- package/apps/web/dist/assets/validation-vendor-gX26utNf.js +65 -0
- package/apps/web/dist/assets/validation-vendor-gX26utNf.js.map +1 -0
- package/apps/web/dist/index.html +3 -3
- package/package.json +1 -1
- package/apps/web/dist/assets/index-DjwvCSSY.js +0 -5
- package/apps/web/dist/assets/index-DjwvCSSY.js.map +0 -1
- package/apps/web/dist/assets/validation-vendor-CGrOSWd3.js +0 -65
- package/apps/web/dist/assets/validation-vendor-CGrOSWd3.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,244 +1,113 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<img src="docs/assets/brand/loomrail-wordmark.svg" alt="Loomrail" width="360" />
|
|
3
|
-
<p><strong>
|
|
3
|
+
<p><strong>AI agents work. You decide.</strong></p>
|
|
4
|
+
<p>
|
|
5
|
+
<a href="https://loomrail.github.io/loomrail/">Website</a> ·
|
|
6
|
+
<a href="docs/guides/GETTING-STARTED.md">Quick start</a> ·
|
|
7
|
+
<a href="docs/guides/GETTING-STARTED.ru.md">Быстрый старт</a> ·
|
|
8
|
+
<a href="docs/README.md">Documentation</a>
|
|
9
|
+
</p>
|
|
4
10
|
<p>
|
|
5
11
|
<a href="https://github.com/loomrail/loomrail/actions/workflows/ci.yml"><img src="https://github.com/loomrail/loomrail/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
6
|
-
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-
|
|
12
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-6173ff" alt="Apache 2.0 license" /></a>
|
|
7
13
|
<img src="https://img.shields.io/badge/status-pre--alpha-c58b20" alt="Pre-alpha status" />
|
|
8
14
|
<img src="https://img.shields.io/badge/Node.js-24.19-43853d" alt="Node.js 24.19" />
|
|
9
15
|
</p>
|
|
10
16
|
</div>
|
|
11
17
|
|
|
12
|
-
Loomrail is a local
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
> [!IMPORTANT]
|
|
17
|
-
> Loomrail is an early pre-alpha. The local kernel, authenticated browser session, SQLite state, audit log, and
|
|
18
|
-
> cross-platform CI are real. The Workbench now runs a restart-safe synthetic Discovery → Plan → Implement → Review
|
|
19
|
-
> → QA → Acceptance workflow with durable budgets, evidence, Human Requests, and owner Decisions in English and
|
|
20
|
-
> Russian. A live Codex session now runs inside a Git worktree cut for the task it works on, so all six stages can
|
|
21
|
-
> reach a real repository; the Claude Code adapter still serves DISCOVERY, PLAN and REVIEW only.
|
|
18
|
+
Loomrail is a local control plane for AI-assisted software work. It keeps the task brief, workflow state, Human
|
|
19
|
+
Requests, budgets, evidence, and final owner decision durable across agent sessions instead of treating chat history as
|
|
20
|
+
the source of truth.
|
|
22
21
|
|
|
23
22
|
<picture>
|
|
24
23
|
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/screenshots/workbench-dark.png" />
|
|
25
24
|
<source media="(prefers-color-scheme: light)" srcset="docs/assets/screenshots/workbench-light.png" />
|
|
26
|
-
<img src="docs/assets/screenshots/workbench-light.png" alt="Loomrail Workbench
|
|
25
|
+
<img src="docs/assets/screenshots/workbench-light.png" alt="Loomrail Workbench showing delivery state, a task contract, and owner activity" width="100%" />
|
|
27
26
|
</picture>
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- **Local by default.** The daemon binds to loopback, state lives in local SQLite, and the browser uses a one-time
|
|
34
|
-
authenticated bootstrap session.
|
|
35
|
-
- **Human control.** Questions, approvals, budgets, recovery decisions, and acceptance stay visible and explicit.
|
|
36
|
-
- **Auditable work.** Commands are idempotent and state changes are recorded as append-only events.
|
|
37
|
-
- **Cross-platform baseline.** macOS and Windows run the same blocking verification and browser smoke tests.
|
|
38
|
-
|
|
39
|
-
## Current checkpoint
|
|
40
|
-
|
|
41
|
-
| Area | Today | Next |
|
|
42
|
-
| ------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- |
|
|
43
|
-
| Local runtime | Loopback daemon, CLI launcher, one-time browser session, installable tarball | Published package and desktop installer |
|
|
44
|
-
| State | Tasks, runs, budgets, recovery, typed evidence, acceptance packages, Decisions, append-only Events | Retention and restore hardening |
|
|
45
|
-
| Workbench | Persisted board, workflow cockpit, command summary, evidence matrix, owner acceptance, EN/RU, light/dark | Full Attention Inbox and richer workflow views |
|
|
46
|
-
| Agents | Capability-checked provider contract, live Codex/Claude CLI adapters, per-task Git worktrees, and on-demand change diffs | The Claude Code adapter on the write path |
|
|
47
|
-
| Projects | Bundled demo repositories, plus any local Git repository registered by absolute path | Per-project guardrails and permissions |
|
|
48
|
-
| Platforms | macOS and Windows CI are green | Clean-machine acceptance and hardening |
|
|
49
|
-
|
|
50
|
-
## How it is intended to work
|
|
51
|
-
|
|
52
|
-
```mermaid
|
|
53
|
-
flowchart LR
|
|
54
|
-
Brief[Task brief] --> Plan[Delivery plan]
|
|
55
|
-
Plan --> Build[Implementation agents]
|
|
56
|
-
Build --> Review[Independent review]
|
|
57
|
-
Review --> QA[Browser QA and evidence]
|
|
58
|
-
QA --> Accept{Human acceptance}
|
|
59
|
-
Accept -->|Approved| Done[Done]
|
|
60
|
-
Accept -->|Changes requested| Plan
|
|
61
|
-
Guardrails[Rules · permissions · budgets] -. constrain .-> Plan
|
|
62
|
-
Guardrails -. constrain .-> Build
|
|
63
|
-
Guardrails -. constrain .-> Review
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Loomrail is the control plane around this route. It does not replace the coding agents; it gives their work a shared
|
|
67
|
-
model, clear permissions, recoverable state, and an inspectable history.
|
|
28
|
+
> [!IMPORTANT]
|
|
29
|
+
> Loomrail is public pre-alpha software. The recommended first run uses a deterministic mock: it starts no external
|
|
30
|
+
> agent and spends no provider quota. Live providers are opt-in. Loomrail never commits, pushes, merges, or deploys
|
|
31
|
+
> agent changes for you, and a task worktree is not an operating-system sandbox.
|
|
68
32
|
|
|
69
|
-
## Install
|
|
33
|
+
## Install and run safely
|
|
70
34
|
|
|
71
|
-
|
|
72
|
-
change review, restart, and state backup, use the [English user guide](docs/guides/USER-GUIDE.md) or the
|
|
73
|
-
[руководство на русском](docs/guides/USER-GUIDE.ru.md).
|
|
35
|
+
Requirements: Node.js `>=24.19 <25`, macOS or Windows, and a browser on the same machine. Linux is best effort.
|
|
74
36
|
|
|
75
|
-
|
|
76
|
-
fixture projects. Pre-alpha releases use the explicit `next` channel so they are never installed as a stable release:
|
|
37
|
+
Start in a new empty directory, not inside a repository you care about:
|
|
77
38
|
|
|
78
39
|
```bash
|
|
40
|
+
mkdir loomrail-evaluation
|
|
41
|
+
cd loomrail-evaluation
|
|
79
42
|
npm install loomrail@next
|
|
80
|
-
npx loomrail
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
To verify a source revision before it reaches the registry, build and install the exact release tarball instead:
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
pnpm pack:release
|
|
87
|
-
npm install ./dist-release/loomrail-0.1.0-alpha.1.tgz
|
|
88
|
-
npx loomrail --port 4176
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Install it globally with `npm install -g` instead if you want `loomrail` on your `PATH`. Either way the launcher
|
|
92
|
-
starts on loopback and opens a one-time authenticated URL; add `--no-open` and it prints that URL instead, so a
|
|
93
|
-
same-machine browser can still sign in without being opened automatically.
|
|
94
|
-
|
|
95
|
-
`pnpm test:release` performs exactly this install into an empty project using only the public registry, and runs on
|
|
96
|
-
macOS and Windows in CI. See the [release guide](docs/RELEASE.md) for the full procedure.
|
|
97
|
-
|
|
98
|
-
## Run from source
|
|
99
|
-
|
|
100
|
-
There is no desktop installer yet. To develop Loomrail, or to try the current checkpoint without building a package,
|
|
101
|
-
run the repository directly.
|
|
102
|
-
|
|
103
|
-
### Requirements
|
|
104
|
-
|
|
105
|
-
- Node.js as pinned in [`.nvmrc`](.nvmrc)
|
|
106
|
-
- Corepack
|
|
107
|
-
- macOS or Windows
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
git clone https://github.com/loomrail/loomrail.git
|
|
111
|
-
cd loomrail
|
|
112
|
-
nvm use # or: fnm use
|
|
113
|
-
corepack enable # installs the pnpm version pinned by packageManager
|
|
114
|
-
pnpm install --frozen-lockfile
|
|
115
|
-
pnpm dev
|
|
43
|
+
npx loomrail
|
|
116
44
|
```
|
|
117
45
|
|
|
118
|
-
|
|
119
|
-
|
|
46
|
+
The launcher binds to `127.0.0.1`, opens a one-time authenticated URL, and stores state in local SQLite. Keep the
|
|
47
|
+
terminal open and stop Loomrail with `Ctrl+C`.
|
|
120
48
|
|
|
121
|
-
|
|
49
|
+
If the browser must not open automatically:
|
|
122
50
|
|
|
123
51
|
```bash
|
|
124
|
-
|
|
125
|
-
pnpm start --port 4176
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Use `pnpm start --no-open --port 4176` when the browser should not open automatically; the launcher then prints the
|
|
129
|
-
one-time sign-in URL for a browser on the same machine. That URL signs in a single browser, expires after 60 seconds,
|
|
130
|
-
and is replaced on every restart. `LOOMRAIL_DATA_DIR` can point a development run at an isolated data directory.
|
|
131
|
-
|
|
132
|
-
| Platform | Default local state |
|
|
133
|
-
| -------- | ----------------------------------------------------- |
|
|
134
|
-
| macOS | `~/Library/Application Support/Loomrail/state.sqlite` |
|
|
135
|
-
| Windows | `%LOCALAPPDATA%\Loomrail\state.sqlite` |
|
|
136
|
-
|
|
137
|
-
## Repository
|
|
138
|
-
|
|
139
|
-
```text
|
|
140
|
-
apps/
|
|
141
|
-
cli/ # local launcher and authenticated browser bootstrap
|
|
142
|
-
daemon/ # loopback API, commands, events, and SQLite lifecycle
|
|
143
|
-
web/ # React Workbench
|
|
144
|
-
packages/
|
|
145
|
-
contracts/ # shared schemas and transport contracts
|
|
146
|
-
domain/ # deterministic WorkItem and workflow decisions
|
|
147
|
-
persistence-sqlite/ # SQLite repositories, queue, and migrations
|
|
148
|
-
context-assembly/ # what a provider session is told, and in what order
|
|
149
|
-
workspace/ # Git process boundary, repository inspection, worktrees
|
|
150
|
-
provider-core/ # provider lifecycle and capability boundary
|
|
151
|
-
provider-mock/ # deterministic synthetic provider scenarios
|
|
152
|
-
provider-codex/ # the real `codex` CLI as a child process
|
|
153
|
-
provider-claude-code/ # the real `claude` CLI as a child process
|
|
154
|
-
workflow-engine/ # versioned workflow template validation
|
|
155
|
-
ui/ # shared product primitives and patterns
|
|
156
|
-
docs/ # product, architecture, security, design, plans, and evidence
|
|
52
|
+
npx loomrail --no-open --port 4176
|
|
157
53
|
```
|
|
158
54
|
|
|
159
|
-
|
|
160
|
-
to an agent, a shell or Git directly: every one of those crossings goes through the daemon.
|
|
161
|
-
|
|
162
|
-
## Roadmap
|
|
163
|
-
|
|
164
|
-
- [x] **M0 — Foundation:** monorepo, contracts, CI, public-readiness rules
|
|
165
|
-
- [x] **M1 — Walking skeleton:** CLI → daemon → authenticated browser UI
|
|
166
|
-
- [x] **M2 — Local kernel:** SQLite state, idempotent commands, append-only events, macOS/Windows gate
|
|
167
|
-
- [x] **M3 — Real task cockpit:** authenticated API client, persisted projects/work items, editing, EN/RU, activity
|
|
168
|
-
replay and secure reconnect guidance
|
|
169
|
-
- [x] **M4 — Mock delivery workflow:** restart-safe dispatch queue, Human Request, Decision, and resumable task
|
|
170
|
-
pipeline
|
|
171
|
-
- [x] **M5 — Budgets and recovery:** explicit limits, pause/resume, crash recovery
|
|
172
|
-
- [x] **M6 — Acceptance:** typed Review/QA evidence, criterion matrix, owner-only final approval, audit surface
|
|
173
|
-
- [ ] **M7 — Public checkpoint:** packaged launcher and clean-install gate are in place; remaining work is hardening
|
|
174
|
-
and the first published release
|
|
55
|
+
Open the printed URL on the same machine within 60 seconds. `--no-open` does not enable remote access.
|
|
175
56
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
runs the CLI there — for every stage but your own acceptance decision, because a review reads the change it judges and a
|
|
179
|
-
plan is worth more when it can read the code it plans against — so **the Codex adapter now serves all six stages** under
|
|
180
|
-
`codex exec -s workspace-write`. The Claude Code
|
|
181
|
-
adapter still declares DISCOVERY, PLAN and REVIEW only: its write path has never been exercised against the real CLI
|
|
182
|
-
here, and one adapter's evidence is not taken as proof about the other. A stage an adapter does not declare is refused
|
|
183
|
-
to you as a blocking question rather than dispatched, and Loomrail never enables a permission-bypass flag on any code
|
|
184
|
-
path.
|
|
57
|
+
For a global launcher, use `npm install -g loomrail@next` and then `loomrail`. The project-local route above is
|
|
58
|
+
recommended for evaluation because it keeps the selected pre-alpha channel visible.
|
|
185
59
|
|
|
186
|
-
|
|
187
|
-
(`<data>/workspaces/<project>/<work item>`), the branch is deleted only while it still is the one Loomrail cut, and a
|
|
188
|
-
workspace whose directory has disappeared is reconciled at startup instead of being quietly reused.
|
|
60
|
+
## First run
|
|
189
61
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
62
|
+
1. Choose **Initialize demo workspace**.
|
|
63
|
+
2. Create a task with a concrete outcome and observable acceptance criteria.
|
|
64
|
+
3. Move it to **Ready** and start the workflow.
|
|
65
|
+
4. Answer the blocking Human Request and approve the explicit mock budget increase.
|
|
66
|
+
5. Inspect Review and QA evidence.
|
|
67
|
+
6. Accept the delivery or return it to work as the owner.
|
|
194
68
|
|
|
195
|
-
|
|
69
|
+
The task, request, budget, evidence, and decision survive page reloads and Loomrail restarts. The
|
|
70
|
+
[quick start](docs/guides/GETTING-STARTED.md) walks through the route in detail.
|
|
196
71
|
|
|
197
|
-
|
|
198
|
-
of a Git repository on this machine, and that repository becomes a Project you can create tasks against; the
|
|
199
|
-
directory's own name becomes the project name. The path has to be absolute — a relative one would resolve against
|
|
200
|
-
whatever directory the daemon happened to start in — and it has to be a repository's top level, because registering a
|
|
201
|
-
subdirectory would branch the repository enclosing it without you having chosen that.
|
|
72
|
+
## Your repository and live providers
|
|
202
73
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
and checked-out branch are untouched, and nothing is ever pushed. Loomrail does add the worktree's bookkeeping and
|
|
206
|
-
its own `loomrail/…` ref to your `.git`, and creates one commit — the carry-in snapshot that branch starts from —
|
|
207
|
-
but it never moves or deletes a ref you made. Be aware of what travels with it, though — everything you have not committed is carried
|
|
208
|
-
into the worktree, including untracked files the repository does not ignore, and the agent has network access in that
|
|
209
|
-
same tree. The [threat model](docs/security/THREAT-MODEL.md) records this as an accepted risk rather than a solved one.
|
|
74
|
+
After the mock route works, the owner guide explains repository registration, Project Constitution review, task
|
|
75
|
+
worktrees, change inspection, backup, and recovery:
|
|
210
76
|
|
|
211
|
-
|
|
212
|
-
|
|
77
|
+
- [Owner guide](docs/guides/USER-GUIDE.md)
|
|
78
|
+
- [Руководство владельца](docs/guides/USER-GUIDE.ru.md)
|
|
79
|
+
- [Reproducible full-route example](docs/examples/full-route/README.md)
|
|
80
|
+
- [Security and trust boundaries](docs/security/THREAT-MODEL.md)
|
|
213
81
|
|
|
214
|
-
|
|
82
|
+
Live providers are explicit. Install and authenticate the provider CLI yourself, then start the same Loomrail
|
|
83
|
+
installation with `LOOMRAIL_PROVIDER=CODEX` or `LOOMRAIL_PROVIDER=CLAUDE_CODE`. Read the owner guide and threat model
|
|
84
|
+
before exposing a repository to either CLI.
|
|
215
85
|
|
|
216
|
-
|
|
217
|
-
variable, read once at startup:
|
|
86
|
+
## Current boundary
|
|
218
87
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
| `CLAUDE_CODE` | The real `claude` CLI, as a child process. |
|
|
88
|
+
- Local browser UI, loopback daemon, and local SQLite state.
|
|
89
|
+
- Deterministic mock-first workflow with durable Human Requests, budgets, evidence, recovery, and owner Decisions.
|
|
90
|
+
- Local Git repository registration, per-task worktrees, change inspection, and owner-approved Project Constitution.
|
|
91
|
+
- No desktop installer, remote access, cloud sync, team accounts, automatic Git publishing, or complete OS sandbox.
|
|
224
92
|
|
|
225
|
-
The
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
did it. The launcher also says when a selected adapter's CLI is not installed on this machine.
|
|
93
|
+
The versioned product scope lives in [Product decisions](docs/product/PRODUCT-DECISIONS.ru.md) and the
|
|
94
|
+
[Master plan](docs/product/MASTER-PLAN.ru.md). Historical implementation plans remain under `docs/plans/`; they are
|
|
95
|
+
engineering records, not a public roadmap.
|
|
229
96
|
|
|
230
|
-
|
|
231
|
-
credentials.
|
|
232
|
-
|
|
233
|
-
The task card shows the files in that worktree that differ from its starting snapshot and reads one unified diff only
|
|
234
|
-
when you expand that file. This is inspection, not Git authority: Loomrail still does not commit, push, or merge those
|
|
235
|
-
changes.
|
|
97
|
+
## Develop from source
|
|
236
98
|
|
|
237
99
|
```bash
|
|
238
|
-
|
|
100
|
+
git clone https://github.com/loomrail/loomrail.git
|
|
101
|
+
cd loomrail
|
|
102
|
+
nvm use
|
|
103
|
+
corepack enable
|
|
104
|
+
pnpm install --frozen-lockfile
|
|
105
|
+
pnpm dev
|
|
239
106
|
```
|
|
240
107
|
|
|
241
|
-
|
|
108
|
+
`pnpm dev` builds the workspace, starts Loomrail on loopback, and opens a one-time authenticated browser session.
|
|
109
|
+
|
|
110
|
+
Before contributing:
|
|
242
111
|
|
|
243
112
|
```bash
|
|
244
113
|
pnpm verify
|
|
@@ -246,20 +115,8 @@ pnpm exec playwright install chromium
|
|
|
246
115
|
pnpm test:e2e
|
|
247
116
|
```
|
|
248
117
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
Start with [CONTRIBUTING.md](CONTRIBUTING.md). Product and engineering sources of truth:
|
|
253
|
-
|
|
254
|
-
- [Release guide](docs/RELEASE.md)
|
|
255
|
-
- [Master plan](docs/product/MASTER-PLAN.ru.md)
|
|
256
|
-
- [Product decisions](docs/product/PRODUCT-DECISIONS.ru.md)
|
|
257
|
-
- [Architecture overview](docs/architecture/OVERVIEW.md)
|
|
258
|
-
- [Phase 0 implementation plan](docs/plans/00-phase-0-implementation-plan.ru.md)
|
|
259
|
-
- [Threat model](docs/security/THREAT-MODEL.md)
|
|
260
|
-
- [Component system](docs/design/COMPONENT-SYSTEM.md)
|
|
261
|
-
- [Brand guide](docs/design/BRAND.md)
|
|
262
|
-
- [Localization contract](docs/design/LOCALIZATION.md)
|
|
118
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md), the [architecture overview](docs/architecture/OVERVIEW.md), and the
|
|
119
|
+
[release guide](docs/RELEASE.md).
|
|
263
120
|
|
|
264
121
|
## License
|
|
265
122
|
|