@wemuda/launchrail 1.5.0 → 1.7.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/README.md +11 -30
- package/assets/ralph.workflow.js +27 -10
- package/dist/commands/add.js +3 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/lib/seeds.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
**An updatable development system for taking a software idea from product intent to a verified release.**
|
|
10
10
|
|
|
11
11
|
[](https://github.com/wemuda/launchrail/actions/workflows/ci.yml)
|
|
12
|
-
[](https://github.com/wemuda/launchrail/releases)
|
|
13
13
|
[](https://github.com/wemuda/launchrail/blob/master/package.json)
|
|
14
14
|
[](https://github.com/wemuda/launchrail/blob/master/pnpm-workspace.yaml)
|
|
15
15
|
[](https://github.com/wemuda/launchrail/blob/master/docs/adr/0002-conventional-commits.md)
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
[Using it](#using-it-in-your-project) ·
|
|
21
21
|
[Ownership model](#the-ownership-model) ·
|
|
22
22
|
[Repository layout](#repository-layout) ·
|
|
23
|
-
[Roadmap](https://github.com/wemuda/launchrail/blob/master/ROADMAP.md) ·
|
|
24
23
|
[Contributing](#contributing) ·
|
|
25
24
|
[Credits](#credits)
|
|
26
25
|
|
|
@@ -28,35 +27,15 @@
|
|
|
28
27
|
|
|
29
28
|
---
|
|
30
29
|
|
|
31
|
-
> **Status:** Pre-release. All six roadmap phases are implemented; nothing is published to npm yet.
|
|
32
|
-
|
|
33
30
|
This repository is the Launchrail **toolchain**: the CLI, Claude Code plugin, templates, and migrations that initialize other repositories and keep them current. It is not an application framework and it does not replace Claude Code, Claude Design, [Matt Pocock's skills](https://github.com/mattpocock/skills), GitHub, Playwright, or a project's chosen stack. It is the shared rail that connects them.
|
|
34
31
|
|
|
35
32
|
## How it works
|
|
36
33
|
|
|
37
|
-
Launchrail structures development as two movements. The **foundation** runs once per project: it turns an idea into hard constraints and recorded decisions. Then the **delivery loop** takes over —
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
direction TB
|
|
43
|
-
V(["Vision"]) --> X["Visual exploration"]
|
|
44
|
-
X --> G["Complexity grill"]
|
|
45
|
-
G --> R["Technical research"]
|
|
46
|
-
R --> A["Architecture decisions"]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
A --> S
|
|
50
|
-
|
|
51
|
-
subgraph loop ["Delivery loop — once per slice"]
|
|
52
|
-
direction TB
|
|
53
|
-
S["MVP specification"] --> D["Design validation"]
|
|
54
|
-
D --> T["Tickets"]
|
|
55
|
-
T --> I["Bounded implementation — Ralph campaign"]
|
|
56
|
-
I --> VF["Verification — launchrail verify + browser smoke"]
|
|
57
|
-
VF -.->|"next slice"| S
|
|
58
|
-
end
|
|
59
|
-
```
|
|
34
|
+
Launchrail structures development as two movements. The **foundation** runs once per project: it turns an idea into hard constraints and recorded decisions. Then the **delivery loop** takes over — once per feature: size the work and plan it only as deeply as it needs (a small change goes straight from a grill to tickets; a larger one adds `wayfinder`, a spec, and design validation first), then hand the tickets to the **Ralph loop** to implement and verify before going around again for the next feature. Every stage leaves a committed artifact behind, and the next stage starts from that artifact, not from chat memory. The `launch` skill is the single entry point: it reads the committed artifacts, detects where the project is, and routes to the stage's owner.
|
|
35
|
+
|
|
36
|
+
<p align="center">
|
|
37
|
+
<img src="https://github.com/wemuda/launchrail/raw/master/assets/how-launchrail-works.png" alt="How Launchrail works — the foundation runs once per project (Vision → Visual exploration → Complexity grill → Technical research → Architecture decisions); the delivery loop then repeats once per slice (Specify features into tickets → Ralph loop → Verification) before looping back for the next slice." width="880" />
|
|
38
|
+
</p>
|
|
60
39
|
|
|
61
40
|
Several stages run directly on [Matt Pocock's skills](https://github.com/mattpocock/skills) — see [Credits](#credits). The full stage contract — inputs, artifacts, composition rules, and per-mode rigor — lives in [the workflow doc](https://github.com/wemuda/launchrail/blob/master/plugins/launchrail/docs/workflow.md).
|
|
62
41
|
|
|
@@ -70,6 +49,8 @@ One command sets the rails:
|
|
|
70
49
|
npx @wemuda/launchrail init
|
|
71
50
|
```
|
|
72
51
|
|
|
52
|
+
_Not on npm yet — until the first publish, run the CLI from a checkout; see [getting started](https://github.com/wemuda/launchrail/blob/master/docs/getting-started.md#installing)._
|
|
53
|
+
|
|
73
54
|
`init` interviews you (or takes `--yes`), runs `git init` if the directory isn't a repository yet, seeds `AGENTS.md` and ADR conventions without touching existing content, subscribes the repository to the workflow's Claude Code plugins through `.claude/settings.json` — so every collaborator who opens the project in Claude Code gets the same skills — and, when the `claude` CLI is on your PATH, installs those plugins for you on the spot — Launchrail's own and Matt Pocock's skills ([ADR-0011](https://github.com/wemuda/launchrail/blob/master/docs/adr/0011-init-installs-plugin-via-claude-cli.md)). Adopting an existing project is a first-class path: your files are kept, and a `CLAUDE.md` you already have is additively wired to the workflow imports rather than replaced ([ADR-0012](https://github.com/wemuda/launchrail/blob/master/docs/adr/0012-init-wires-imports-into-existing-claude-md.md)). The interview asks whether the project is new or existing and records it as the manifest's `origin`; for an existing project, `launch` takes an **alignment on-ramp** — inferring a draft vision from the code, interviewing only the gaps, and inventorying your existing design system — instead of starting from a blank vision ([ADR-0013](https://github.com/wemuda/launchrail/blob/master/docs/adr/0013-existing-project-alignment.md)).
|
|
74
55
|
|
|
75
56
|
From there, the day-to-day driver is not the CLI — it's the **`launch` skill** inside Claude Code: open the project and run `/launchrail:launch`. Invoke it (or just ask "what's next?") and it reads your committed artifacts, works out where the project is — no vision yet, mid-grill, spec validated, tickets ready — and runs or routes to the next stage's owner. Give it a stage name (`launch design-validation`) to jump straight there. The plugin carries the rest of the workflow too:
|
|
@@ -77,7 +58,7 @@ From there, the day-to-day driver is not the CLI — it's the **`launch` skill**
|
|
|
77
58
|
- **`project-alignment`** — the on-ramp for an existing codebase: infer a vision from the code, interview only the gaps, inventory the design system, then join the loop
|
|
78
59
|
- **`vision-creation`** and **`design-validation`** — the Launchrail-owned stages of the pipeline
|
|
79
60
|
- **`browser-smoke`** — drives a real browser journey and leaves a traceable evidence bundle (with the browser-testing module)
|
|
80
|
-
- **`ralph`**, **`ralph-implement`**, **`resolving-merge-conflicts`** — the verification-gated implementation
|
|
61
|
+
- **`ralph`**, **`ralph-implement`**, **`resolving-merge-conflicts`** — the verification-gated implementation loop (with the ralph module)
|
|
81
62
|
|
|
82
63
|
The CLI is the maintenance surface you return to between sessions:
|
|
83
64
|
|
|
@@ -138,9 +119,9 @@ pnpm build
|
|
|
138
119
|
pnpm --filter @wemuda/launchrail exec launchrail --help
|
|
139
120
|
```
|
|
140
121
|
|
|
141
|
-
##
|
|
122
|
+
## Status
|
|
142
123
|
|
|
143
|
-
|
|
124
|
+
The toolchain is stable and versioned. The full surface — `init`/`doctor`, the workflow plugin, browser testing, the Ralph loop, and the sync engine — is covered by 164 tests, including integration tests against real temporary Git repositories. Releases are automated: Conventional Commits drive release-please, the CLI and plugin version in lockstep, and the changelog is generated from the commit history ([ADR-0008](https://github.com/wemuda/launchrail/blob/master/docs/adr/0008-release-automation.md), [docs/releasing.md](https://github.com/wemuda/launchrail/blob/master/docs/releasing.md)). The npm publish flips on with the first release token. Shipped history lives in [CHANGELOG.md](https://github.com/wemuda/launchrail/blob/master/CHANGELOG.md).
|
|
144
125
|
|
|
145
126
|
## Contributing
|
|
146
127
|
|
package/assets/ralph.workflow.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// Managed by Launchrail. Do not hand-edit — `launchrail sync` may replace this file.
|
|
2
2
|
// Override policy per run via args instead, e.g. { width: 1, only: [9, 10] }.
|
|
3
3
|
//
|
|
4
|
-
// The Ralph
|
|
4
|
+
// The Ralph loop as a deterministic workflow: the plan, the frontier bookkeeping,
|
|
5
5
|
// and every intermediate report live in script variables — not in any context window —
|
|
6
6
|
// so long or wide runs cannot compact away their own state. The watchable, checkpointed
|
|
7
7
|
// variant of the same loop is the launchrail:ralph skill; the two share one policy block,
|
|
8
8
|
// and a policy change belongs in both places (ADR-0005, field-revised by ADR-0010).
|
|
9
9
|
export const meta = {
|
|
10
10
|
name: 'ralph',
|
|
11
|
-
description: 'Autonomous Ralph
|
|
11
|
+
description: 'Autonomous Ralph loop: implement ready tickets with fresh-context subagents, verification-gated',
|
|
12
12
|
whenToUse:
|
|
13
|
-
'Run
|
|
13
|
+
'Run the Ralph implementation loop over the ticket backlog when the dependency graph is wide or the run is long. Scope a run via args: { only: [9, 10], width: 2 } or just [9, 10]. For a watchable, checkpointed run (or when something is already going wrong), use the launchrail:ralph skill instead.',
|
|
14
14
|
phases: [
|
|
15
15
|
{ title: 'Preflight', detail: 'read project config, sync the base, run the verification gate' },
|
|
16
16
|
{ title: 'Graph', detail: 'list ready tickets and their blocking edges, verbatim' },
|
|
@@ -48,7 +48,7 @@ const POLICY = {
|
|
|
48
48
|
only: A.only ?? [],
|
|
49
49
|
// Parallel implementers. Width also caps local build concurrency — several implementers
|
|
50
50
|
// share one machine, and fanning out test runs buys backpressure, not speed. Use 1 until
|
|
51
|
-
// a
|
|
51
|
+
// a run has landed tickets cleanly on this project.
|
|
52
52
|
width: A.width ?? 3,
|
|
53
53
|
// Tries per ticket: 1 attempt + 1 retry with a fresh context, then park. Deferrals
|
|
54
54
|
// (a declared blocker had not landed yet) hand their attempt back, capped separately.
|
|
@@ -125,6 +125,12 @@ const GRAPH_SCHEMA = {
|
|
|
125
125
|
},
|
|
126
126
|
},
|
|
127
127
|
},
|
|
128
|
+
notTickets: {
|
|
129
|
+
type: 'array',
|
|
130
|
+
items: { type: 'integer' },
|
|
131
|
+
description:
|
|
132
|
+
'Issue numbers wearing ready-for-agent that are plainly not implementable tickets (a published spec, research notes, an epic) — a labeling error to surface, not work to dispatch.',
|
|
133
|
+
},
|
|
128
134
|
},
|
|
129
135
|
}
|
|
130
136
|
|
|
@@ -229,12 +235,21 @@ Check, against the remote: (1) the PR exists and is merged; (2) its merge commit
|
|
|
229
235
|
Report merged: true only when (1) and (2) both hold. A PR description or comment is NOT evidence — only API state counts. Do not run local git, do not use a shell. Fix nothing, close nothing; report only.`
|
|
230
236
|
}
|
|
231
237
|
|
|
232
|
-
const graphPrompt = (pre) => `List the open, ready tickets for a Ralph
|
|
238
|
+
const graphPrompt = (pre) => `List the open, ready tickets for a Ralph loop run. Change nothing on the tracker.
|
|
233
239
|
Tracker access: ${pre.trackerAccess}
|
|
234
240
|
Include every open ticket labeled ready-for-agent, excluding any labeled needs-info.
|
|
241
|
+
An open issue wearing ready-for-agent that is plainly not an implementable ticket — a published spec, research notes, an epic — is a labeling error: leave it out of tickets and report its number in notTickets instead. When in doubt, include it as a ticket.
|
|
235
242
|
For each, report its number, its exact title, and its "Blocked by" line copied VERBATIM (the whole line, e.g. "**Blocked by:** #11, #9"), or "" when it has none. If the tracker records blocking through native relations instead of a body line, render those relations as one "Blocked by: #n, #m" line and nothing else.
|
|
236
243
|
Do NOT interpret, resolve, or filter the edges — copy the characters and let the caller parse the #n. Getting a blocker wrong dispatches a ticket before its dependency lands.`
|
|
237
244
|
|
|
245
|
+
// A non-ticket wearing ready-for-agent (a published spec, research notes) is excluded from
|
|
246
|
+
// the frontier but never silently: the label is the bug, and the supervisor should fix it.
|
|
247
|
+
function warnNotTickets(graph) {
|
|
248
|
+
for (const n of graph?.notTickets ?? []) {
|
|
249
|
+
log(`#${n} wears ready-for-agent but is not an implementable ticket — excluded from the frontier; relabel it (e.g. spec)`)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
238
253
|
// Blocking edges are parsed here, deterministically, from the verbatim line — never by a
|
|
239
254
|
// model. A single misread edge silently builds a ticket on a dependency that hasn't landed.
|
|
240
255
|
function parseGraph(graph) {
|
|
@@ -344,7 +359,7 @@ function frontier(tickets, closedBefore) {
|
|
|
344
359
|
// ---------------------------------------------------------------------------
|
|
345
360
|
phase('Preflight')
|
|
346
361
|
const pre = await agent(
|
|
347
|
-
`Preflight for a Ralph
|
|
362
|
+
`Preflight for a Ralph loop run in this repository. Fix nothing; report actual state.
|
|
348
363
|
1. Read .launchrail.yml (issueTracker, testing commands, modules) and AGENTS.md (verbatim commands).
|
|
349
364
|
2. Identify the repo (git remote) and the default/base branch; sync it fresh (clean tree). If the base branch does not exist on the remote, report not green and say the base is missing — do not guess another branch.
|
|
350
365
|
3. Determine how the tracker is reachable from THIS environment: check whether the CLI the project docs assume (e.g. gh) is installed; if not, name the concrete substitute available here (e.g. GitHub MCP tools) as an instruction future agents can follow.
|
|
@@ -354,7 +369,7 @@ green means: base synced AND the verification gate exited 0.`,
|
|
|
354
369
|
)
|
|
355
370
|
if (!pre) throw new Error('preflight agent died — refusing to start')
|
|
356
371
|
if (!pre.green) {
|
|
357
|
-
// A broken base poisons every implementer after it; a
|
|
372
|
+
// A broken base poisons every implementer after it; a run that starts red
|
|
358
373
|
// can only end with unverifiable results.
|
|
359
374
|
return { refused: true, reason: 'preflight not green', failures: pre.failures }
|
|
360
375
|
}
|
|
@@ -372,6 +387,7 @@ log(
|
|
|
372
387
|
)
|
|
373
388
|
let graph = await agent(graphPrompt(pre), { label: 'read-graph', phase: 'Graph', schema: GRAPH_SCHEMA, model: 'haiku', effort: 'low' })
|
|
374
389
|
if (!graph) throw new Error('graph agent died — refusing to start')
|
|
390
|
+
warnNotTickets(graph)
|
|
375
391
|
let tickets = parseGraph(graph)
|
|
376
392
|
log(`${tickets.length} ready ticket(s) on the tracker`)
|
|
377
393
|
|
|
@@ -399,7 +415,7 @@ while (rounds < POLICY.maxRounds) {
|
|
|
399
415
|
log(`#${r.ticket.number} deferred (blocker not landed yet): ${r.why}`)
|
|
400
416
|
}
|
|
401
417
|
if (results.every((r) => !r || r.dead)) {
|
|
402
|
-
log('every agent in the round died — infrastructure, not tickets; stopping the
|
|
418
|
+
log('every agent in the round died — infrastructure, not tickets; stopping the run')
|
|
403
419
|
break
|
|
404
420
|
}
|
|
405
421
|
for (const t of batch) {
|
|
@@ -410,6 +426,7 @@ while (rounds < POLICY.maxRounds) {
|
|
|
410
426
|
if (POLICY.refreshGraph && frontier(tickets, closedBefore).length > 0) {
|
|
411
427
|
graph = await agent(graphPrompt(pre), { label: `read-graph:r${rounds}`, phase: 'Graph', schema: GRAPH_SCHEMA, model: 'haiku', effort: 'low' })
|
|
412
428
|
if (graph) {
|
|
429
|
+
warnNotTickets(graph)
|
|
413
430
|
const fresh = parseGraph(graph)
|
|
414
431
|
for (const t of fresh) {
|
|
415
432
|
if (!tickets.some((x) => x.number === t.number)) tickets.push(t)
|
|
@@ -445,11 +462,11 @@ ${parked.map((s) => `#${s.ticket.number} (${s.ticket.title}): ${s.failures.join(
|
|
|
445
462
|
)
|
|
446
463
|
}
|
|
447
464
|
|
|
448
|
-
// The completion contract: the
|
|
465
|
+
// The completion contract: the loop cannot declare success while required
|
|
449
466
|
// verification fails on the final, post-merge base.
|
|
450
467
|
phase('Release')
|
|
451
468
|
const release = await agent(
|
|
452
|
-
`Release verification for a finished Ralph
|
|
469
|
+
`Release verification for a finished Ralph loop run. Fix nothing.
|
|
453
470
|
1. Sync a fresh ${pre.base} and record its head sha.
|
|
454
471
|
2. Run the verification gate: npx @wemuda/launchrail verify. Report the actual exit code.
|
|
455
472
|
${
|
package/dist/commands/add.js
CHANGED
|
@@ -96,8 +96,8 @@ function planRalph(parsed) {
|
|
|
96
96
|
notes,
|
|
97
97
|
nextSteps: [
|
|
98
98
|
"Create the tracker labels Ralph uses: ready-for-agent, ralph:building, needs-info.",
|
|
99
|
-
"Produce tickets with explicit `Blocked by: #n` edges and the ready-for-agent label (Matt Pocock's to-tickets, stage
|
|
100
|
-
"Run
|
|
99
|
+
"Produce tickets with explicit `Blocked by: #n` edges and the ready-for-agent label (Matt Pocock's to-tickets, stage 9 of the workflow).",
|
|
100
|
+
"Run the loop: the launchrail:ralph skill (watchable) or the `ralph` workflow (wide or long runs; scope with args, e.g. { width: 1 }).",
|
|
101
101
|
"Start with width 1 until a few tickets have landed cleanly, then widen.",
|
|
102
102
|
],
|
|
103
103
|
};
|
|
@@ -182,7 +182,7 @@ export async function runAdd(opts) {
|
|
|
182
182
|
console.log("\nNext steps:");
|
|
183
183
|
plan.nextSteps.forEach((step, i) => console.log(` ${i + 1}. ${step}`));
|
|
184
184
|
if (opts.module === RALPH_MODULE) {
|
|
185
|
-
console.log(`\nThe
|
|
185
|
+
console.log(`\nThe Ralph loop workflow lives at ${RALPH_WORKFLOW_PATH} (managed — do not hand-edit).`);
|
|
186
186
|
}
|
|
187
187
|
return { code: 0, actions };
|
|
188
188
|
}
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAsB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAiB,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAkC,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAqC,MAAM,kBAAkB,CAAC;AAC1G,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAcxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;AASxE,SAAS,cAAc,CAAC,QAAkB,EAAE,SAAwB;IAClE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,IAAI,KAAK,CAAC;IAC7C,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,uBAAuB;QAC1D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI,qBAAqB;QAChE,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,wBAAwB;KACxE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAA+B;IACtD,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAC3B;QACE,MAAM,EAAE,GAAG,EAAE,CACX,CAAC,CAAC,IAAI,CAAC;YACL,OAAO,EAAE,mCAAmC;YAC5C,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B,CAAC;QACJ,UAAU,EAAE,GAAG,EAAE,CACf,CAAC,CAAC,IAAI,CAAC;YACL,OAAO,EAAE,sDAAsD;YAC/D,YAAY,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;YACvC,WAAW,EAAE,eAAe;SAC7B,CAAC;QACJ,UAAU,EAAE,GAAG,EAAE,CACf,CAAC,CAAC,IAAI,CAAC;YACL,OAAO,EAAE,oCAAoC;YAC7C,YAAY,EAAE,QAAQ,CAAC,UAAU;SAClC,CAAC;QACJ,YAAY,EAAE,GAAG,EAAE,CACjB,CAAC,CAAC,IAAI,CAAC;YACL,OAAO,EAAE,qBAAqB;YAC9B,YAAY,EAAE,QAAQ,CAAC,YAAY;SACpC,CAAC;KACL,EACD;QACE,QAAQ,EAAE,GAAG,EAAE;YACb,CAAC,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;KACF,CACF,CAAC;IACF,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM;QAChD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QAC/E,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,UAAU;QAC5D,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,YAAY;KACnE,CAAC;AACJ,CAAC;AAcD,SAAS,kBAAkB,CACzB,MAAgB,EAChB,SAAwB,EACxB,OAA8B;IAE9B,MAAM,QAAQ,GAAa;QACzB,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;QAC1C,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE;KAC/D,CAAC;IACF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,CAAC,oBAAoB,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,oBAAoB,4DAA4D,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,gFAAgF,CAAC,CAAC;IACrG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,IAAI,CAAC,oGAAoG,CAAC,CAAC;IACvH,CAAC;IACD,SAAS,CAAC,IAAI,CACZ,qHAAqH,EACrH,yLAAyL,EACzL,8FAA8F,CAC/F,CAAC;IACF,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE;QACvB,KAAK,EAAE,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACnD,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE;QACzB,KAAK;QACL,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAgB;IACjC,MAAM,QAAQ,GAAa;QACzB,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE;KACrD,CAAC;IACF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,oIAAoI,CACrI,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CACR,qIAAqI,CACtI,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,UAAU,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,KAAK;QACL,SAAS,EAAE;YACT,oFAAoF;YACpF,yIAAyI;YACzI,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/seeds.js
CHANGED
|
@@ -67,7 +67,7 @@ function claudeGeneratedMd(ctx) {
|
|
|
67
67
|
: "";
|
|
68
68
|
const ralph = ctx.manifest.modules.ralph
|
|
69
69
|
? `
|
|
70
|
-
## Ralph
|
|
70
|
+
## The Ralph loop
|
|
71
71
|
|
|
72
72
|
- Bounded implementation runs through the Ralph loop: the \`launchrail:ralph\` skill (watchable, checkpointed) or the \`ralph\` workflow in \`.claude/workflows/ralph.js\` (wide or long runs). Both are only ever started explicitly by the user.
|
|
73
73
|
- Tickets enter the loop with the \`ready-for-agent\` label and explicit \`Blocked by: #n\` edges; parked tickets carry \`needs-info\` plus their failure history.
|
|
@@ -79,7 +79,7 @@ function claudeGeneratedMd(ctx) {
|
|
|
79
79
|
|
|
80
80
|
# Launchrail workflow instructions
|
|
81
81
|
|
|
82
|
-
- This project follows the Launchrail development loop: vision → design exploration → grill/research → ADRs → spec → visual validation → tickets → bounded implementation → verification → release.
|
|
82
|
+
- This project follows the Launchrail development loop: vision → design exploration → discovery → grill/research → ADRs → spec → visual validation → tickets → bounded implementation → verification → release.
|
|
83
83
|
- Product knowledge (vision, specs, ADRs, designs, tickets, code) is project-owned; Launchrail never overwrites it.
|
|
84
84
|
- \`.launchrail.yml\` is project configuration; \`.launchrail-lock.json\` is machine-managed — do not hand-edit it.
|
|
85
85
|
- Before claiming completion, run the project's deterministic checks. Completion requires evidence, not assertion.
|
package/package.json
CHANGED