@wemuda/launchrail 1.11.0 → 1.12.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.
@@ -74,6 +74,17 @@ Run `gh issue view <number> --comments`.
74
74
 
75
75
  The stage-7 spec ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)) is itself an issue here — created by `launch-spec`, labelled **`spec`**, never `ready-for-agent`. There is no `docs/specs/` file; the issue is the canonical spec. When `launch-tickets` breaks it down, each ticket is a **GitHub sub-issue of the spec** (`gh api` on the sub-issues endpoint), or carries `Part of #<spec>` at the top of its body where sub-issues aren't enabled. Design validation revises the spec issue in place (its `## Design validation` section lives in the issue body).
76
76
 
77
+ ## The spec's milestone (rollup view)
78
+
79
+ The spec issue and its tickets are also bundled under a **GitHub milestone** named for the feature, so the tracker shows one progress rollup — the milestone's bar fills as tickets close. The milestone is a **rollup, not the spec's home**: the `spec`-labelled issue stays canonical ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)), and the milestone's description holds only a one-line goal and a link back to that issue.
80
+
81
+ - **Create it** (`launch-spec`, once per spec): `gh api --method POST repos/{owner}/{repo}/milestones -f title='<feature>' -f description='<one-line goal> — spec: <spec-issue-url>'`. The response's `number` is the milestone id.
82
+ - **Put an issue in it**: pass `--milestone '<feature>'` to `gh issue create`, or `gh issue edit <n> --milestone '<feature>'` after the fact. `launch-spec` adds the spec issue; `launch-tickets` adds every ticket to the same milestone.
83
+ - **Find the milestone a spec already carries** (`launch-tickets`): `gh issue view <spec> --json milestone --jq .milestone.title`.
84
+ - **Progress** is computed by GitHub from closed-vs-open issues — no upkeep.
85
+
86
+ An issue belongs to at most one milestone, so each ticket rolls up to exactly one spec. Milestones carry no labels and take no part in the implementation loop's frontier — they are purely the human-facing rollup, never a substitute for the `spec` issue or the native sub-issue links.
87
+
77
88
  ## Wayfinding operations
78
89
 
79
90
  Used by `launch-wayfinder`. The **map** is a single issue with **child** issues as tickets.
@@ -44,6 +44,17 @@ Run `glab issue view <number> --comments`.
44
44
 
45
45
  The stage-7 spec ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)) is itself an issue here — created by `launch-spec`, labelled **`spec`**, never `ready-for-agent`. There is no `docs/specs/` file; the issue is the canonical spec. When `launch-tickets` breaks it down, each ticket carries `Part of #<spec>` at the top of its description (on tiers with native epics, the spec may be an epic holding the tickets instead). Design validation revises the spec issue in place (its `## Design validation` section lives in the issue description).
46
46
 
47
+ ## The spec's milestone (rollup view)
48
+
49
+ The spec issue and its tickets are also bundled under a **GitLab milestone** named for the feature, so the tracker shows one progress rollup as tickets close. The milestone is a **rollup, not the spec's home**: the `spec`-labelled issue stays canonical ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)), and the milestone description holds only a one-line goal and a link back to that issue.
50
+
51
+ - **Create it** (`launch-spec`, once per spec): a project milestone — `glab api --method POST "projects/:id/milestones" -f title='<feature>' -f description='<one-line goal> — spec: <spec-issue-url>'` (or make it in the GitLab UI). A group-level milestone works too where the feature spans projects.
52
+ - **Put an issue in it**: pass `--milestone '<feature>'` to `glab issue create`, or `glab issue update <n> --milestone '<feature>'` after the fact. `launch-spec` adds the spec issue; `launch-tickets` adds every ticket to the same milestone.
53
+ - **Find the milestone a spec already carries** (`launch-tickets`): `glab issue view <spec> -F json` and read its `milestone`.
54
+ - **Progress** is computed by GitLab from closed-vs-open issues — no upkeep.
55
+
56
+ An issue belongs to at most one milestone, so each ticket rolls up to exactly one spec. Milestones carry no labels and take no part in the implementation loop's frontier — they are purely the human-facing rollup, never a substitute for the `spec` issue.
57
+
47
58
  ## Wayfinding operations
48
59
 
49
60
  Used by `launch-wayfinder`. The **map** is a single issue with **child** issues as tickets.
@@ -44,6 +44,16 @@ Fetch the issue by its identifier (`ENG-123`) including comments.
44
44
 
45
45
  The stage-7 spec ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)) is itself an issue here — created by `launch-spec`, labelled **`spec`**, never `ready-for-agent`. There is no `docs/specs/` file; the issue is the canonical spec. When `launch-tickets` breaks it down, each ticket is a **sub-issue of the spec** (Linear's native parent/child). Design validation revises the spec issue in place (its `## Design validation` section lives in the issue description).
46
46
 
47
+ ## The spec's rollup (milestone)
48
+
49
+ Linear's analog of a milestone is a **project milestone** inside a project — or, if the feature is big enough to stand alone, a **project** of its own. Either way it bundles the spec issue with its tickets so Linear shows one progress rollup for the feature. It is a **rollup, not the spec's home**: the `spec`-labelled issue stays canonical ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)).
50
+
51
+ - **Create it** (`launch-spec`): `save_milestone` for a project milestone named for the feature under the configured project (create the project with `save_project` first if the feature warrants its own).
52
+ - **Attach issues**: set each issue's project / project-milestone via `save_issue` — `launch-spec` for the spec issue, `launch-tickets` for every ticket.
53
+ - **Find the rollup a spec already carries** (`launch-tickets`): read the spec issue's project milestone via `get_issue`.
54
+
55
+ Linear computes the rollup's progress from its issues' states. If no project is configured (the field above is blank), skip the milestone — a bare Linear issue has nowhere to hang one.
56
+
47
57
  ## Wayfinding operations
48
58
 
49
59
  Used by `launch-wayfinder`. The **map** is a single issue with **child** issues as tickets.
@@ -15,6 +15,7 @@ Issues and specs for this repo live as markdown files in `.scratch/`.
15
15
  - Implementation issues are one file per ticket at `.scratch/<feature-slug>/issues/<NN>-<slug>.md`, numbered from `01` — never a single combined tickets file
16
16
  - Ticket state is recorded as a `Status:` line near the top of each issue file, using the label vocabulary below
17
17
  - Comments and conversation history append to the bottom of the file under a `## Comments` heading
18
+ - No milestones: the `.scratch/<feature-slug>/` directory is itself the feature's bundle (spec at `docs/specs/<feature-slug>.md`, tickets alongside), and progress is just how many of its issue files are closed — there is nothing to create when a skill mentions the spec's milestone
18
19
 
19
20
  ## Labels
20
21
 
@@ -21,6 +21,8 @@ This skill takes the current conversation context and codebase understanding and
21
21
  - **A real tracker (GitHub, GitLab, Linear)** → publish the spec as an issue labeled **`spec`**. That issue is stage 7's canonical artifact — do not also commit a `docs/specs/` file. Never label it `ready-for-agent`: that label marks implementable tickets, the implementation loop computes its frontier from it, and it cannot tell prose from work.
22
22
  - **Local mode (`local`, or no tracker)** → commit the spec under `docs/specs/` (`<feature-slug>.md`). There is no external store, so the committed file is the canonical artifact. It is project-owned.
23
23
 
24
+ On a real tracker, also bundle the spec under a **milestone** named for the feature: create the milestone, put the spec issue in it, and set its description to a one-line goal plus a link back to the spec issue. That milestone is the rollup `launch-tickets` hangs every ticket on, so the whole feature reads as one progress bar — a *view*, not the spec's home; the `spec`-labelled issue stays canonical. See `docs/agents/issue-tracker.md` for the exact per-tracker commands; local mode has no milestone (the feature's files are its bundle).
25
+
24
26
  The spec then flows on: design validation (stage 8) revises it in place, and `launch-tickets` (stage 9) breaks it into tickets that reference it.
25
27
 
26
28
  <spec-template>
@@ -62,7 +62,7 @@ Iterate until the user approves the breakdown.
62
62
  Publish the approved tickets. **How** depends on the tracker configured in `docs/agents/issue-tracker.md` — the tickets are the same either way, only the shape of the blocking edges changes:
63
63
 
64
64
  - **Local files** → write one file per ticket under `.scratch/<feature-slug>/issues/<NN>-<slug>.md`, numbered from `01` in dependency order (blockers first). Each file's "Blocked by" lists the numbers/titles it depends on. Use the per-ticket file template below — one ticket per file, never a single combined file.
65
- - **A real issue tracker (GitHub, GitLab, Linear, …)** → publish one issue per ticket in dependency order (blockers first) so each ticket's edges reference real identifiers. Wire every blocking edge and any parent as the tracker's **native relationship** — GitHub/GitLab issue dependencies and sub-issues, Linear's blocked-by and sub-issue relations — the canonical, UI-visible form the implementation loop's frontier reads. The body's `Parent` / `Blocked by` lines then only mirror it, becoming the gate itself only on a tracker that lacks the native relationship. When the spec is itself a `spec`-labeled issue on the tracker ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)), it **is** the parent — link each ticket to it through that same native sub-issue relation. `docs/agents/issue-tracker.md` carries the exact per-tracker API. Apply the **`ready-for-agent`** label unless instructed otherwise — the tickets are agent-grabbable by construction. Only tickets wear that label: the spec issue keeps its `spec` label, or the loop will dispatch the document as work.
65
+ - **A real issue tracker (GitHub, GitLab, Linear, …)** → publish one issue per ticket in dependency order (blockers first) so each ticket's edges reference real identifiers. Wire every blocking edge and any parent as the tracker's **native relationship** — GitHub/GitLab issue dependencies and sub-issues, Linear's blocked-by and sub-issue relations — the canonical, UI-visible form the implementation loop's frontier reads. The body's `Parent` / `Blocked by` lines then only mirror it, becoming the gate itself only on a tracker that lacks the native relationship. When the spec is itself a `spec`-labeled issue on the tracker ([ADR-0025](https://github.com/wemuda/launchrail/blob/master/docs/adr/0025-spec-home-follows-tracker.md)), it **is** the parent — link each ticket to it through that same native sub-issue relation. `docs/agents/issue-tracker.md` carries the exact per-tracker API. Apply the **`ready-for-agent`** label unless instructed otherwise — the tickets are agent-grabbable by construction. Only tickets wear that label: the spec issue keeps its `spec` label, or the loop will dispatch the document as work. Assign every ticket to the **same milestone the spec issue carries** — read it off the spec issue (`docs/agents/issue-tracker.md` has the per-tracker command) — so the feature rolls up as one progress bar; a tracker without milestones (local) has nothing to assign.
66
66
 
67
67
  Work the **frontier**: any ticket whose blockers are all done. For a purely linear chain that means top to bottom.
68
68
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wemuda/launchrail",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "Launchrail — initialize, inspect, update, and validate repositories using the Launchrail development system.",
5
5
  "license": "MIT",
6
6
  "type": "module",