@wemuda/launchrail 1.7.0 → 1.9.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.
Files changed (70) hide show
  1. package/README.md +36 -20
  2. package/assets/agents-docs/domain.md +59 -0
  3. package/assets/agents-docs/issue-tracker-github.md +51 -0
  4. package/assets/agents-docs/issue-tracker-gitlab.md +52 -0
  5. package/assets/agents-docs/issue-tracker-linear.md +52 -0
  6. package/assets/agents-docs/issue-tracker-local.md +45 -0
  7. package/assets/ralph.permission-guard.py +90 -0
  8. package/assets/ralph.workflow.js +129 -30
  9. package/assets/skills/NOTICE.md +41 -0
  10. package/assets/skills/launchrail/launch/SKILL.md +67 -0
  11. package/assets/skills/launchrail/launch/workflow.md +77 -0
  12. package/assets/skills/launchrail/launch-browser-smoke/SKILL.md +49 -0
  13. package/assets/skills/launchrail/launch-code-review/SKILL.md +89 -0
  14. package/assets/skills/launchrail/launch-design-validation/SKILL.md +44 -0
  15. package/assets/skills/launchrail/launch-discovery/SKILL.md +33 -0
  16. package/assets/skills/launchrail/launch-grill/CONTEXT-FORMAT.md +62 -0
  17. package/assets/skills/launchrail/launch-grill/SKILL.md +48 -0
  18. package/assets/skills/launchrail/launch-grill/domain-modeling.md +45 -0
  19. package/assets/skills/launchrail/launch-implement/SKILL.md +49 -0
  20. package/assets/skills/launchrail/launch-project-alignment/SKILL.md +48 -0
  21. package/assets/skills/launchrail/launch-ralph/SKILL.md +115 -0
  22. package/assets/skills/launchrail/launch-ralph-implement/SKILL.md +17 -0
  23. package/assets/skills/launchrail/launch-research/SKILL.md +16 -0
  24. package/assets/skills/launchrail/launch-resolving-merge-conflicts/SKILL.md +15 -0
  25. package/assets/skills/launchrail/launch-spec/SKILL.md +77 -0
  26. package/assets/skills/launchrail/launch-tickets/SKILL.md +107 -0
  27. package/assets/skills/launchrail/launch-vision-creation/SKILL.md +60 -0
  28. package/assets/skills/launchrail/launch-wayfinder/SKILL.md +130 -0
  29. package/dist/commands/add.js +21 -4
  30. package/dist/commands/add.js.map +1 -1
  31. package/dist/commands/doctor.js +42 -32
  32. package/dist/commands/doctor.js.map +1 -1
  33. package/dist/commands/init.d.ts +3 -7
  34. package/dist/commands/init.js +62 -85
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/sync.js +11 -0
  37. package/dist/commands/sync.js.map +1 -1
  38. package/dist/index.js +0 -5
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/agentsDocs.d.ts +4 -0
  41. package/dist/lib/agentsDocs.js +32 -0
  42. package/dist/lib/agentsDocs.js.map +1 -0
  43. package/dist/lib/claudeSettings.d.ts +74 -11
  44. package/dist/lib/claudeSettings.js +185 -17
  45. package/dist/lib/claudeSettings.js.map +1 -1
  46. package/dist/lib/detect.d.ts +0 -2
  47. package/dist/lib/detect.js +0 -1
  48. package/dist/lib/detect.js.map +1 -1
  49. package/dist/lib/manifest.d.ts +14 -1
  50. package/dist/lib/manifest.js +18 -1
  51. package/dist/lib/manifest.js.map +1 -1
  52. package/dist/lib/migrations.js +202 -1
  53. package/dist/lib/migrations.js.map +1 -1
  54. package/dist/lib/project.js +9 -1
  55. package/dist/lib/project.js.map +1 -1
  56. package/dist/lib/ralph.d.ts +16 -5
  57. package/dist/lib/ralph.js +32 -9
  58. package/dist/lib/ralph.js.map +1 -1
  59. package/dist/lib/seeds.js +4 -1
  60. package/dist/lib/seeds.js.map +1 -1
  61. package/dist/lib/skills.d.ts +12 -0
  62. package/dist/lib/skills.js +57 -0
  63. package/dist/lib/skills.js.map +1 -0
  64. package/dist/lib/upstream.d.ts +6 -6
  65. package/dist/lib/upstream.js +1 -1
  66. package/dist/lib/upstream.js.map +1 -1
  67. package/package.json +1 -1
  68. package/dist/lib/claudeCli.d.ts +0 -51
  69. package/dist/lib/claudeCli.js +0 -71
  70. package/dist/lib/claudeCli.js.map +0 -1
@@ -1,4 +1,11 @@
1
- import { applyPluginDeclaration, CLAUDE_SETTINGS_PATH, planPluginDeclaration } from "./claudeSettings.js";
1
+ import { existsSync, readFileSync, rmdirSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { sha256 } from "./checksum.js";
4
+ import { applyPluginDeclaration, applyRalphGuardHook, applyRemovePluginDeclaration, CLAUDE_SETTINGS_PATH, planPluginDeclaration, planRalphGuardHook, planRemovePluginDeclaration, RETIRED_SUPERPOWERS_DECLARATION, } from "./claudeSettings.js";
5
+ import { MANIFEST_FILENAME, parseManifest, removeManifestKey, setModuleEnabled } from "./manifest.js";
6
+ import { RALPH_MODULE, RALPH_WORKFLOW_PATH, ralphFiles } from "./ralph.js";
7
+ import { SKILLS_DEST_PREFIX, skillFiles } from "./skills.js";
8
+ import { applyPlan, planWrites } from "./writer.js";
2
9
  /**
3
10
  * Every structural change ever shipped, in order. Entries must be idempotent —
4
11
  * planning against an already-migrated repository yields no changes — and every
@@ -21,6 +28,39 @@ export const MIGRATIONS = [
21
28
  };
22
29
  },
23
30
  },
31
+ {
32
+ // Newest migration, but order-independent, so it sits at its lexicographic
33
+ // position to keep the registry date-ordered rather than at the end.
34
+ id: "2026-08-ralph-permission-guard",
35
+ description: `register Ralph's unattended-launch guard hook in ${CLAUDE_SETTINGS_PATH} (ADR-0021)`,
36
+ plan(ctx) {
37
+ // The guard hook *file* flows through the regular managed-file surface
38
+ // (sync regenerates ralphFiles() after migrations run); this migration only
39
+ // performs the structural change the writer can't express — the additive
40
+ // PreToolUse(Workflow) registration in the shared, project-owned
41
+ // settings.json. Post-ADR-0020 Ralph is the implementation loop, so every
42
+ // valid manifest is a Ralph project (mirroring the wire-default-loop
43
+ // migration below). This runs before that migration in id order, but the
44
+ // hook file it registers still lands in the same sync — whether wire or the
45
+ // managed-file pass writes it.
46
+ const none = { changes: [], apply: () => { } };
47
+ const manifestPath = join(ctx.cwd, MANIFEST_FILENAME);
48
+ if (!existsSync(manifestPath))
49
+ return none;
50
+ const parsed = parseManifest(readFileSync(manifestPath, "utf8"));
51
+ if (!parsed.manifest)
52
+ return none;
53
+ const hook = planRalphGuardHook(ctx.cwd);
54
+ if (hook.content === null)
55
+ return none;
56
+ return {
57
+ changes: [`${CLAUDE_SETTINGS_PATH} — ${hook.detail}`],
58
+ apply: () => {
59
+ applyRalphGuardHook(ctx.cwd, hook);
60
+ },
61
+ };
62
+ },
63
+ },
24
64
  {
25
65
  id: "2026-08-upstream-plugin-declarations",
26
66
  description: `declare the upstream workflow plugins (Matt Pocock's skills) in ${CLAUDE_SETTINGS_PATH} (ADR-0011)`,
@@ -38,6 +78,167 @@ export const MIGRATIONS = [
38
78
  };
39
79
  },
40
80
  },
81
+ {
82
+ id: "2026-08-vendor-workflow-skills",
83
+ description: `vendor the workflow skills as managed files under .claude/skills/ and remove the retired plugin declarations from ${CLAUDE_SETTINGS_PATH} (ADR-0019)`,
84
+ plan(ctx) {
85
+ // The skill files themselves flow through the regular managed-file surface
86
+ // (sync regenerates it after migrations run); this migration only performs
87
+ // the structural change the writer can't express — stripping the retired
88
+ // launchrail/mattpocock declarations from a consumer's settings.json.
89
+ const removal = planRemovePluginDeclaration(ctx.cwd);
90
+ if (removal.content === null)
91
+ return { changes: [], apply: () => { } };
92
+ return {
93
+ changes: [`${CLAUDE_SETTINGS_PATH} — ${removal.detail}`],
94
+ apply: () => {
95
+ applyRemovePluginDeclaration(ctx.cwd, removal);
96
+ },
97
+ };
98
+ },
99
+ },
100
+ {
101
+ id: "2026-08-wire-default-implementation-loop",
102
+ description: "install the built-in implementation loop's materials when the manifest selects ralph, so /launch-implement works without `launchrail add ralph` (ADR-0018)",
103
+ plan(ctx) {
104
+ const none = { changes: [], apply: () => { } };
105
+ const manifestPath = join(ctx.cwd, MANIFEST_FILENAME);
106
+ if (!existsSync(manifestPath))
107
+ return none;
108
+ const source = readFileSync(manifestPath, "utf8");
109
+ const parsed = parseManifest(source);
110
+ // An invalid manifest is sync's own precondition failure, not this
111
+ // migration's. Ralph is the implementation loop (ADR-0020), so every
112
+ // valid manifest gets its materials; before ADR-0020 this checked the
113
+ // manifest's `implementationLoop` selection.
114
+ if (!parsed.manifest)
115
+ return none;
116
+ const changes = [];
117
+ const manifestUpdate = setModuleEnabled(source, RALPH_MODULE, {});
118
+ if (manifestUpdate.changed)
119
+ changes.push(`${MANIFEST_FILENAME} — enable the ralph module`);
120
+ const actions = planWrites(ctx.cwd, ralphFiles(), ctx.lockfile);
121
+ for (const action of actions) {
122
+ if (action.kind === "create" || action.kind === "update") {
123
+ changes.push(`${action.spec.relPath} — ${action.detail}`);
124
+ }
125
+ if (action.kind === "conflict") {
126
+ changes.push(`${RALPH_WORKFLOW_PATH} — local modifications kept (eject or revert to receive updates)`);
127
+ }
128
+ }
129
+ if (changes.length === 0)
130
+ return none;
131
+ return {
132
+ changes,
133
+ apply: () => {
134
+ if (manifestUpdate.changed)
135
+ writeFileSync(manifestPath, manifestUpdate.source, "utf8");
136
+ applyPlan(ctx.cwd, actions, ctx.lockfile);
137
+ },
138
+ };
139
+ },
140
+ },
141
+ {
142
+ id: "2026-08-workflow-skills-independence",
143
+ description: "retire the vendored upstream skills in favor of Launchrail's own complete launch-* set, and drop the removed implementationLoop manifest field (ADR-0020)",
144
+ plan(ctx) {
145
+ const changes = [];
146
+ // 1. Skill files the surface no longer ships (the vendored bare-name
147
+ // snapshot and its NOTICE): delete each tracked file that is unmodified
148
+ // since Launchrail wrote it; a locally-modified copy is kept on disk and
149
+ // handed to the project. Either way the lockfile stops tracking the
150
+ // path. The absorbed launch-* skills arrive through the regular managed
151
+ // surface right after migrations run — this only clears what they
152
+ // replace.
153
+ const current = new Set(skillFiles().map((spec) => spec.relPath));
154
+ const removable = [];
155
+ const keptModified = [];
156
+ for (const [relPath, entry] of Object.entries(ctx.lockfile.files)) {
157
+ if (!relPath.startsWith(`${SKILLS_DEST_PREFIX}/`) || entry.class === "ejected" || current.has(relPath)) {
158
+ continue;
159
+ }
160
+ const abs = join(ctx.cwd, relPath);
161
+ if (existsSync(abs) && sha256(readFileSync(abs, "utf8")) !== entry.checksum) {
162
+ keptModified.push(relPath);
163
+ }
164
+ else {
165
+ removable.push(relPath);
166
+ }
167
+ }
168
+ if (removable.length > 0) {
169
+ changes.push(`${SKILLS_DEST_PREFIX} — remove ${removable.length} retired skill file(s)`);
170
+ }
171
+ for (const relPath of keptModified) {
172
+ changes.push(`${relPath} — locally modified; kept on disk, no longer managed`);
173
+ }
174
+ // 2. The manifest's implementationLoop field is retired — Ralph is the
175
+ // implementation loop, no field selects it.
176
+ const manifestPath = join(ctx.cwd, MANIFEST_FILENAME);
177
+ const manifestSource = existsSync(manifestPath) ? readFileSync(manifestPath, "utf8") : null;
178
+ const keyRemoval = manifestSource === null ? null : removeManifestKey(manifestSource, "implementationLoop");
179
+ if (keyRemoval?.changed) {
180
+ changes.push(`${MANIFEST_FILENAME} — remove the retired implementationLoop field`);
181
+ }
182
+ // 3. A project that had selected superpowers converges on Ralph: the
183
+ // plugin declaration Launchrail added for that loop is removed (only
184
+ // then — a declaration the user added themselves is never touched) and
185
+ // Ralph's materials install.
186
+ const wasSuperpowers = keyRemoval?.previous === "superpowers";
187
+ const settingsRemoval = wasSuperpowers
188
+ ? planRemovePluginDeclaration(ctx.cwd, [RETIRED_SUPERPOWERS_DECLARATION])
189
+ : null;
190
+ if (settingsRemoval !== null && settingsRemoval.content !== null) {
191
+ changes.push(`${CLAUDE_SETTINGS_PATH} — ${settingsRemoval.detail}`);
192
+ }
193
+ const ralphEnable = wasSuperpowers && keyRemoval ? setModuleEnabled(keyRemoval.source, RALPH_MODULE, {}) : null;
194
+ if (ralphEnable?.changed) {
195
+ changes.push(`${MANIFEST_FILENAME} — enable the ralph module (superpowers loop retired)`);
196
+ }
197
+ const ralphActions = wasSuperpowers ? planWrites(ctx.cwd, ralphFiles(), ctx.lockfile) : [];
198
+ for (const action of ralphActions) {
199
+ if (action.kind === "create" || action.kind === "update") {
200
+ changes.push(`${action.spec.relPath} — ${action.detail}`);
201
+ }
202
+ }
203
+ if (changes.length === 0)
204
+ return { changes: [], apply: () => { } };
205
+ const skillsRoot = join(ctx.cwd, SKILLS_DEST_PREFIX);
206
+ return {
207
+ changes,
208
+ apply: () => {
209
+ for (const relPath of removable) {
210
+ const abs = join(ctx.cwd, relPath);
211
+ if (existsSync(abs))
212
+ unlinkSync(abs);
213
+ delete ctx.lockfile.files[relPath];
214
+ }
215
+ for (const relPath of keptModified)
216
+ delete ctx.lockfile.files[relPath];
217
+ // Clear the skill directories the deletes emptied, deepest first;
218
+ // rmdir refuses a non-empty directory, which is exactly the guard.
219
+ const dirs = [...new Set(removable.map((relPath) => dirname(join(ctx.cwd, relPath))))].sort((a, b) => b.length - a.length);
220
+ for (const dir of dirs) {
221
+ for (let d = dir; d !== skillsRoot && d.startsWith(skillsRoot); d = dirname(d)) {
222
+ try {
223
+ rmdirSync(d);
224
+ }
225
+ catch {
226
+ break;
227
+ }
228
+ }
229
+ }
230
+ const manifestFinal = ralphEnable ?? keyRemoval;
231
+ if (manifestFinal && (keyRemoval?.changed || ralphEnable?.changed)) {
232
+ writeFileSync(manifestPath, manifestFinal.source, "utf8");
233
+ }
234
+ if (settingsRemoval !== null)
235
+ applyRemovePluginDeclaration(ctx.cwd, settingsRemoval);
236
+ if (ralphActions.length > 0)
237
+ applyPlan(ctx.cwd, ralphActions, ctx.lockfile);
238
+ },
239
+ };
240
+ },
241
+ },
41
242
  ];
42
243
  export function migrationIds(registry = MIGRATIONS) {
43
244
  return registry.map((migration) => migration.id);
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/lib/migrations.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import { agentsDocsFiles } from "./agentsDocs.js";
3
4
  import { BROWSER_TESTING_MODULE, browserTestingFiles } from "./browser-testing.js";
4
5
  import { detectRepo } from "./detect.js";
5
6
  import { LOCKFILE_FILENAME, readLockfile } from "./lockfile.js";
6
7
  import { MANIFEST_FILENAME, parseManifest } from "./manifest.js";
7
8
  import { RALPH_MODULE, ralphFiles } from "./ralph.js";
8
9
  import { seedFiles } from "./seeds.js";
10
+ import { skillFiles } from "./skills.js";
9
11
  import { VERSION } from "../version.js";
10
12
  /** Load manifest and lockfile — the precondition for status, diff, sync, and eject. */
11
13
  export function loadProject(cwd) {
@@ -32,7 +34,13 @@ export function moduleSpecs(state) {
32
34
  manifest: state.manifest,
33
35
  launchrailVersion: VERSION,
34
36
  };
35
- const modules = { core: seedFiles(ctx) };
37
+ // Skills ship as managed files on every project (ADR-0019/0020) — not
38
+ // module-gated, so they ship regardless of which modules are enabled. The
39
+ // docs/agents configuration seeds with core, derived from the manifest.
40
+ const modules = {
41
+ core: [...seedFiles(ctx), ...agentsDocsFiles(state.manifest)],
42
+ skills: skillFiles(),
43
+ };
36
44
  if (state.manifest.modules[BROWSER_TESTING_MODULE]) {
37
45
  modules[BROWSER_TESTING_MODULE] = browserTestingFiles({ manifest: state.manifest, detection: state.detection });
38
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,23 @@
1
1
  import type { FileSpec } from "./writer.js";
2
2
  export declare const RALPH_MODULE = "ralph";
3
3
  export declare const RALPH_WORKFLOW_PATH = ".claude/workflows/ralph.js";
4
+ export declare const RALPH_GUARD_HOOK_PATH = ".claude/hooks/ralph-permission-guard.py";
4
5
  export declare function ralphWorkflowContent(): string;
6
+ export declare function ralphGuardHookContent(): string;
5
7
  /**
6
- * Everything `launchrail add ralph` writes. The workflow script is managed-class —
7
- * it contains toolchain logic only (policy is overridden per run via workflow args,
8
- * never by editing the file), so Launchrail may replace it as the loop improves.
9
- * The skills half of Ralph (`ralph`, `ralph-implement`, `resolving-merge-conflicts`)
10
- * ships through the plugin and writes no files here.
8
+ * Everything `launchrail add ralph` writes. Both files are managed-class — they
9
+ * contain toolchain logic only (workflow policy is overridden per run via args,
10
+ * never by editing the file), so Launchrail may replace them as the loop improves.
11
+ *
12
+ * - the workflow script (`.claude/workflows/ralph.js`), read by the Workflow tool;
13
+ * - the unattended-launch guard hook, which warns when the loop is launched in an
14
+ * interactive permission mode (ADR-0021). The hook file rides here; its
15
+ * registration in the project-owned `.claude/settings.json` is an additive merge
16
+ * handled separately (see `planRalphGuardHook`), exactly like the plugin
17
+ * declaration, because that file is shared and never lockfile-tracked.
18
+ *
19
+ * The skills half of Ralph (`launch-ralph`, `launch-ralph-implement`,
20
+ * `launch-resolving-merge-conflicts`) is vendored as managed skill files
21
+ * (ADR-0019) and flows through `skillFiles()`, not here.
11
22
  */
12
23
  export declare function ralphFiles(): FileSpec[];
package/dist/lib/ralph.js CHANGED
@@ -1,21 +1,44 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  export const RALPH_MODULE = "ralph";
3
3
  export const RALPH_WORKFLOW_PATH = ".claude/workflows/ralph.js";
4
- // The workflow script ships as a real .js asset (readable, reviewable, syntax-checkable)
5
- // rather than an inline template string. It resolves from both src/ (tests) and dist/
6
- // (published CLI) because the two are sibling directories of assets/.
4
+ export const RALPH_GUARD_HOOK_PATH = ".claude/hooks/ralph-permission-guard.py";
5
+ // The workflow script and the permission-guard hook ship as real assets
6
+ // (readable, reviewable, syntax-checkable) rather than inline template strings.
7
+ // They resolve from both src/ (tests) and dist/ (published CLI) because the two
8
+ // are sibling directories of assets/.
7
9
  const WORKFLOW_ASSET_URL = new URL("../../assets/ralph.workflow.js", import.meta.url);
10
+ const GUARD_HOOK_ASSET_URL = new URL("../../assets/ralph.permission-guard.py", import.meta.url);
8
11
  export function ralphWorkflowContent() {
9
12
  return readFileSync(WORKFLOW_ASSET_URL, "utf8");
10
13
  }
14
+ export function ralphGuardHookContent() {
15
+ return readFileSync(GUARD_HOOK_ASSET_URL, "utf8");
16
+ }
11
17
  /**
12
- * Everything `launchrail add ralph` writes. The workflow script is managed-class —
13
- * it contains toolchain logic only (policy is overridden per run via workflow args,
14
- * never by editing the file), so Launchrail may replace it as the loop improves.
15
- * The skills half of Ralph (`ralph`, `ralph-implement`, `resolving-merge-conflicts`)
16
- * ships through the plugin and writes no files here.
18
+ * Everything `launchrail add ralph` writes. Both files are managed-class — they
19
+ * contain toolchain logic only (workflow policy is overridden per run via args,
20
+ * never by editing the file), so Launchrail may replace them as the loop improves.
21
+ *
22
+ * - the workflow script (`.claude/workflows/ralph.js`), read by the Workflow tool;
23
+ * - the unattended-launch guard hook, which warns when the loop is launched in an
24
+ * interactive permission mode (ADR-0021). The hook file rides here; its
25
+ * registration in the project-owned `.claude/settings.json` is an additive merge
26
+ * handled separately (see `planRalphGuardHook`), exactly like the plugin
27
+ * declaration, because that file is shared and never lockfile-tracked.
28
+ *
29
+ * The skills half of Ralph (`launch-ralph`, `launch-ralph-implement`,
30
+ * `launch-resolving-merge-conflicts`) is vendored as managed skill files
31
+ * (ADR-0019) and flows through `skillFiles()`, not here.
17
32
  */
18
33
  export function ralphFiles() {
19
- return [{ relPath: RALPH_WORKFLOW_PATH, content: ralphWorkflowContent(), ownership: "managed" }];
34
+ return [
35
+ { relPath: RALPH_WORKFLOW_PATH, content: ralphWorkflowContent(), ownership: "managed" },
36
+ {
37
+ relPath: RALPH_GUARD_HOOK_PATH,
38
+ content: ralphGuardHookContent(),
39
+ ownership: "managed",
40
+ executable: true,
41
+ },
42
+ ];
20
43
  }
21
44
  //# sourceMappingURL=ralph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ralph.js","sourceRoot":"","sources":["../../src/lib/ralph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAEhE,yFAAyF;AACzF,sFAAsF;AACtF,sEAAsE;AACtE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtF,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AACnG,CAAC"}
1
+ {"version":3,"file":"ralph.js","sourceRoot":"","sources":["../../src/lib/ralph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,yCAAyC,CAAC;AAE/E,wEAAwE;AACxE,gFAAgF;AAChF,gFAAgF;AAChF,sCAAsC;AACtC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,wCAAwC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhG,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;QACvF;YACE,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,qBAAqB,EAAE;YAChC,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;AACJ,CAAC"}
package/dist/lib/seeds.js CHANGED
@@ -69,10 +69,12 @@ function claudeGeneratedMd(ctx) {
69
69
  ? `
70
70
  ## The Ralph loop
71
71
 
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.
72
+ - Implementation starts with \`/launch-implement\` — all ready tickets, or one with \`/launch-implement <ticket>\`. Multi-ticket runs execute as the \`ralph\` workflow (\`.claude/workflows/ralph.js\`), supervised per the \`launch-ralph\` skill; single tickets build in-session. Only ever started explicitly by the user.
73
+ - Every run declares one integration target: the default branch (trunk — the default) or a named consolidation branch via the \`target\` workflow arg, which collects the campaign and ends by offering one release PR to the default branch. The run's recap states where the work lives and the single next step.
73
74
  - 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.
74
75
  - A ticket counts done only when its PR is merged on the remote, the issue is closed, and \`npx @wemuda/launchrail verify\` is green — agent reports are claims, not evidence.
75
76
  - \`.claude/workflows/ralph.js\` is managed by Launchrail: override policy per run via workflow args (e.g. \`{ width: 1 }\`), never by editing the file.
77
+ - Launch unattended runs in a non-prompting permission mode (bypass/autonomous); a guard hook (\`.claude/hooks/ralph-permission-guard.py\`) warns if the \`ralph\` workflow starts in an interactive mode, since one benign prompt can stall a walk-away run and lose the container mid-ticket.
76
78
  `
77
79
  : "";
78
80
  return `<!-- Managed by Launchrail v${ctx.launchrailVersion}. Do not edit: \`launchrail sync\` may replace this file. Project-specific instructions belong in CLAUDE.md. -->
@@ -82,6 +84,7 @@ function claudeGeneratedMd(ctx) {
82
84
  - This project follows the Launchrail development loop: vision → design exploration → discovery → grill/research → ADRs → spec → visual validation → tickets → bounded implementation → verification → release.
83
85
  - Product knowledge (vision, specs, ADRs, designs, tickets, code) is project-owned; Launchrail never overwrites it.
84
86
  - \`.launchrail.yml\` is project configuration; \`.launchrail-lock.json\` is machine-managed — do not hand-edit it.
87
+ - The issue-tracker workflow (labels included) and the domain-doc consumer rules live in \`docs/agents/\` — seeded from \`.launchrail.yml\`, yours to edit.
85
88
  - Before claiming completion, run the project's deterministic checks. Completion requires evidence, not assertion.
86
89
  - Run \`npx @wemuda/launchrail doctor\` when repository state seems inconsistent.
87
90
  ${browserTesting}${ralph}`;
@@ -1 +1 @@
1
- {"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/lib/seeds.ts"],"names":[],"mappings":"AASA,SAAS,QAAQ,CAAC,GAAgB;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC3C,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO;QACtD,CAAC,CAAC,qEAAqE,CAAC;IAE1E,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,mBAAmB;QAC5D,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,gCAAgC,GAAG,CAAC,WAAW;;;;;;;;;;;;;;;;EAgBtD,QAAQ;EACR,aAAa;;;;;;;;;;;6BAWc,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;;;;CAIxG,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAgB;IACzC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5D,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;QACtC,CAAC,CAAC;;;;;;;CAOL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,+BAA+B,GAAG,CAAC,iBAAiB;;;;;;;;;EAS3D,cAAc,GAAG,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,OAAO,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC/G,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO;QACL,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QAClE,EAAE,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrF,mBAAmB,CAAC,GAAG,CAAC;KACzB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/lib/seeds.ts"],"names":[],"mappings":"AASA,SAAS,QAAQ,CAAC,GAAgB;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC3C,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO;QACtD,CAAC,CAAC,qEAAqE,CAAC;IAE1E,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,mBAAmB;QAC5D,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,gCAAgC,GAAG,CAAC,WAAW;;;;;;;;;;;;;;;;EAgBtD,QAAQ;EACR,aAAa;;;;;;;;;;;6BAWc,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;;;;CAIxG,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAgB;IACzC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5D,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;QACtC,CAAC,CAAC;;;;;;;;;CASL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,+BAA+B,GAAG,CAAC,iBAAiB;;;;;;;;;;EAU3D,cAAc,GAAG,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,OAAO,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC/G,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO;QACL,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QAClE,EAAE,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrF,mBAAmB,CAAC,GAAG,CAAC;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { FileSpec } from "./writer.js";
2
+ /** Where the workflow skills land in a consuming repo. */
3
+ export declare const SKILLS_DEST_PREFIX = ".claude/skills";
4
+ /** Attribution file for the skills with upstream-derived text (MIT). */
5
+ export declare const SKILLS_NOTICE_PATH = ".claude/skills/NOTICE.md";
6
+ /**
7
+ * Every skill file Launchrail writes into a consuming repo, as managed specs,
8
+ * plus the attribution NOTICE beside them.
9
+ */
10
+ export declare function skillFiles(): FileSpec[];
11
+ /** Directory names of every skill written into the consumer, for reporting/verification. */
12
+ export declare function skillNames(): string[];
@@ -0,0 +1,57 @@
1
+ import { readdirSync, readFileSync } from "node:fs";
2
+ import { join, relative, sep } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * The workflow skills are Launchrail's own complete, `launch-`-prefixed set
6
+ * (ADR-0020), shipped as real files under assets/skills/launchrail/ and written
7
+ * into consuming repos as managed files (ADR-0019) — no plugin and no vendored
8
+ * upstream snapshot. Skills that absorb text from Matt Pocock's MIT-licensed
9
+ * skills carry a derivation note; the license travels as the NOTICE file. The
10
+ * asset dir resolves from both src/ (tests) and dist/ (published CLI); both are
11
+ * siblings of assets/, exactly like the Ralph workflow asset (see ralph.ts).
12
+ */
13
+ const SKILLS_ASSET_DIR = fileURLToPath(new URL("../../assets/skills/", import.meta.url));
14
+ /** Where the workflow skills land in a consuming repo. */
15
+ export const SKILLS_DEST_PREFIX = ".claude/skills";
16
+ /** Attribution file for the skills with upstream-derived text (MIT). */
17
+ export const SKILLS_NOTICE_PATH = `${SKILLS_DEST_PREFIX}/NOTICE.md`;
18
+ /** The single skill source root — Launchrail's own set. */
19
+ const SOURCE_ROOT = "launchrail";
20
+ /** Recursively list every file under `dir` (absolute paths). */
21
+ function walk(dir) {
22
+ const out = [];
23
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
24
+ const full = join(dir, entry.name);
25
+ if (entry.isDirectory())
26
+ out.push(...walk(full));
27
+ else if (entry.isFile())
28
+ out.push(full);
29
+ }
30
+ return out;
31
+ }
32
+ /**
33
+ * Every skill file Launchrail writes into a consuming repo, as managed specs,
34
+ * plus the attribution NOTICE beside them.
35
+ */
36
+ export function skillFiles() {
37
+ const rootDir = join(SKILLS_ASSET_DIR, SOURCE_ROOT);
38
+ const specs = walk(rootDir).map((file) => ({
39
+ relPath: `${SKILLS_DEST_PREFIX}/${relative(rootDir, file).split(sep).join("/")}`,
40
+ content: readFileSync(file, "utf8"),
41
+ ownership: "managed",
42
+ }));
43
+ specs.push({
44
+ relPath: SKILLS_NOTICE_PATH,
45
+ content: readFileSync(join(SKILLS_ASSET_DIR, "NOTICE.md"), "utf8"),
46
+ ownership: "managed",
47
+ });
48
+ return specs;
49
+ }
50
+ /** Directory names of every skill written into the consumer, for reporting/verification. */
51
+ export function skillNames() {
52
+ return readdirSync(join(SKILLS_ASSET_DIR, SOURCE_ROOT), { withFileTypes: true })
53
+ .filter((e) => e.isDirectory())
54
+ .map((e) => e.name)
55
+ .sort();
56
+ }
57
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,wEAAwE;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,kBAAkB,YAAY,CAAC;AAEpE,2DAA2D;AAC3D,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,gEAAgE;AAChE,SAAS,IAAI,CAAC,GAAW;IACvB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aAC5C,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,KAAK,GAAe,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,GAAG,kBAAkB,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAChF,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;QACnC,SAAS,EAAE,SAAkB;KAC9B,CAAC,CAAC,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC;QACT,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAClE,SAAS,EAAE,SAAS;KACrB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,EAAE,CAAC;AACZ,CAAC"}
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Upstream dependency compatibility tracking (ADR-0006). Launchrail composes
3
- * external capabilities — Matt Pocock's skills, Claude Design, the Ralph
4
- * plugin — whose names end up in project-owned docs. When an upstream rename
5
- * ships, an entry lands in this registry and `status` reports stale
6
- * references. Project-owned files are never edited automatically: advisories
7
- * only, the fix stays a human (or agent) decision.
2
+ * Upstream dependency compatibility tracking (ADR-0006). Names of the external
3
+ * tools Launchrail drives (Claude Design, Playwright) — and of its own skills
4
+ * and commands — end up in project-owned docs. When a rename ships, an entry
5
+ * lands in this registry and `status` reports stale references. Project-owned
6
+ * files are never edited automatically: advisories only, the fix stays a human
7
+ * (or agent) decision.
8
8
  */
9
9
  export interface UpstreamRename {
10
10
  /** The retired name, matched as a whole word (hyphens count as word characters). */
@@ -2,7 +2,7 @@ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  /** Known upstream renames. Empty until an upstream rename actually ships. */
4
4
  export const UPSTREAM_RENAMES = [];
5
- /** Project-owned docs worth scanning: agent contracts and Matt Pocock's setup output. */
5
+ /** Project-owned docs worth scanning: agent contracts and the seeded docs/agents configuration. */
6
6
  const SCAN_FILES = ["AGENTS.md", "CLAUDE.md", "docs/workflow.md"];
7
7
  const SCAN_DIRS = ["docs/agents"];
8
8
  function scanTargets(root) {
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../../src/lib/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAqB,EAAE,CAAC;AAErD,yFAAyF;AACzF,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC,CAAC;AAOlC,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAAE,SAAS;QAC3C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,UAA4B,gBAAgB;IAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,cAAc,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../../src/lib/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAqB,EAAE,CAAC;AAErD,mGAAmG;AACnG,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC,CAAC;AAOlC,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAAE,SAAS;QAC3C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,UAA4B,gBAAgB;IAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,cAAc,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wemuda/launchrail",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Launchrail — initialize, inspect, update, and validate repositories using the Launchrail development system.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,51 +0,0 @@
1
- /**
2
- * The committed declaration (ADR-0003) makes Claude Code offer the plugin when
3
- * a folder is trusted for the *first* time — a folder trusted before init ran
4
- * is never prompted, and upstream dependencies are not declared at all. When
5
- * the `claude` CLI is on PATH, init closes both gaps by installing every
6
- * plugin the workflow depends on directly (ADR-0011). These helpers wrap that
7
- * CLI.
8
- *
9
- * Setting LAUNCHRAIL_SKIP_CLAUDE_CLI=1 disables all `claude` invocations —
10
- * the environment twin of `init --skip-plugin-install`, and the seam the test
11
- * suite uses so running tests never touches a developer's real Claude setup.
12
- */
13
- export interface WorkflowPlugin {
14
- /** Marketplace source accepted by `claude plugin marketplace add` (owner/repo). */
15
- marketplace: string;
16
- /** Qualified id accepted by `claude plugin install` (plugin@marketplace). */
17
- id: string;
18
- /** Human-readable label for init/doctor messages. */
19
- label: string;
20
- }
21
- /** Every Claude Code plugin the Launchrail workflow depends on — one roster with the committed declaration. */
22
- export declare const WORKFLOW_PLUGINS: WorkflowPlugin[];
23
- /** The `claude` CLI version, or null when it is unavailable or opted out. */
24
- export declare function detectClaudeCli(cwd: string): string | null;
25
- export type PluginInstallOutcome = {
26
- state: "installed";
27
- detail: "installed" | "updated" | "up-to-date";
28
- versions?: string;
29
- } | {
30
- state: "failed";
31
- step: "marketplace-add" | "plugin-install" | "plugin-update";
32
- output: string;
33
- };
34
- /**
35
- * Register one plugin's marketplace and install it at user scope — or, when
36
- * it is already installed, update it to the marketplace's latest version, so
37
- * re-running init always leaves the roster current. Every underlying command
38
- * is idempotent (exit 0 on "already on disk" / "already installed" / "already
39
- * at the latest version"). Assumes the CLI is present — callers detect first.
40
- */
41
- export declare function installPlugin(cwd: string, plugin: WorkflowPlugin): PluginInstallOutcome;
42
- export type InstalledPluginIds = {
43
- state: "ok";
44
- ids: string[];
45
- } | {
46
- state: "no-cli";
47
- } | {
48
- state: "unreadable";
49
- };
50
- /** The ids of installed plugins, via `claude plugin list --json`. */
51
- export declare function listInstalledPluginIds(cwd: string): InstalledPluginIds;