@wemuda/launchrail 1.6.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 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
  [![CI](https://github.com/wemuda/launchrail/actions/workflows/ci.yml/badge.svg)](https://github.com/wemuda/launchrail/actions/workflows/ci.yml)
12
- [![Status: pre-release](https://img.shields.io/badge/status-pre--release-orange)](https://github.com/wemuda/launchrail/blob/master/ROADMAP.md)
12
+ [![Release](https://img.shields.io/github/v/release/wemuda/launchrail?label=release&color=2088FF)](https://github.com/wemuda/launchrail/releases)
13
13
  [![Node >= 22](https://img.shields.io/badge/node-%E2%89%A522-339933?logo=node.js&logoColor=white)](https://github.com/wemuda/launchrail/blob/master/package.json)
14
14
  [![pnpm workspace](https://img.shields.io/badge/pnpm-workspace-F69220?logo=pnpm&logoColor=white)](https://github.com/wemuda/launchrail/blob/master/pnpm-workspace.yaml)
15
15
  [![Conventional Commits](https://img.shields.io/badge/commits-conventional-FE5196?logo=conventionalcommits&logoColor=white)](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,8 +27,6 @@
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
@@ -52,6 +49,8 @@ One command sets the rails:
52
49
  npx @wemuda/launchrail init
53
50
  ```
54
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
+
55
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)).
56
55
 
57
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:
@@ -120,9 +119,9 @@ pnpm build
120
119
  pnpm --filter @wemuda/launchrail exec launchrail --help
121
120
  ```
122
121
 
123
- ## Roadmap
122
+ ## Status
124
123
 
125
- See [ROADMAP.md](https://github.com/wemuda/launchrail/blob/master/ROADMAP.md), a living checklist of what exists, what's in progress, and what's missing. All six phases — `init` + `doctor`, the core workflow plugin, browser testing, Ralph orchestration, the sync engine, and open-source readiness — are implemented and covered by 164 tests. The Ralph loop has run for real against a Wemuda project, and its lessons are folded back into the toolchain (ADR-0010). What stands between here and a first release: the dogfood case study on a real project and flipping on the npm publish.
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).
126
125
 
127
126
  ## Contributing
128
127
 
@@ -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
 
@@ -232,9 +238,18 @@ Report merged: true only when (1) and (2) both hold. A PR description or comment
232
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) {
@@ -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
 
@@ -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)
@@ -96,7 +96,7 @@ 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 8 of the workflow).",
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
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
  ],
package/dist/lib/seeds.js CHANGED
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wemuda/launchrail",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "Launchrail — initialize, inspect, update, and validate repositories using the Launchrail development system.",
5
5
  "license": "MIT",
6
6
  "type": "module",