@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.
- package/README.md +36 -20
- package/assets/agents-docs/domain.md +59 -0
- package/assets/agents-docs/issue-tracker-github.md +51 -0
- package/assets/agents-docs/issue-tracker-gitlab.md +52 -0
- package/assets/agents-docs/issue-tracker-linear.md +52 -0
- package/assets/agents-docs/issue-tracker-local.md +45 -0
- package/assets/ralph.permission-guard.py +90 -0
- package/assets/ralph.workflow.js +129 -30
- package/assets/skills/NOTICE.md +41 -0
- package/assets/skills/launchrail/launch/SKILL.md +67 -0
- package/assets/skills/launchrail/launch/workflow.md +77 -0
- package/assets/skills/launchrail/launch-browser-smoke/SKILL.md +49 -0
- package/assets/skills/launchrail/launch-code-review/SKILL.md +89 -0
- package/assets/skills/launchrail/launch-design-validation/SKILL.md +44 -0
- package/assets/skills/launchrail/launch-discovery/SKILL.md +33 -0
- package/assets/skills/launchrail/launch-grill/CONTEXT-FORMAT.md +62 -0
- package/assets/skills/launchrail/launch-grill/SKILL.md +48 -0
- package/assets/skills/launchrail/launch-grill/domain-modeling.md +45 -0
- package/assets/skills/launchrail/launch-implement/SKILL.md +49 -0
- package/assets/skills/launchrail/launch-project-alignment/SKILL.md +48 -0
- package/assets/skills/launchrail/launch-ralph/SKILL.md +115 -0
- package/assets/skills/launchrail/launch-ralph-implement/SKILL.md +17 -0
- package/assets/skills/launchrail/launch-research/SKILL.md +16 -0
- package/assets/skills/launchrail/launch-resolving-merge-conflicts/SKILL.md +15 -0
- package/assets/skills/launchrail/launch-spec/SKILL.md +77 -0
- package/assets/skills/launchrail/launch-tickets/SKILL.md +107 -0
- package/assets/skills/launchrail/launch-vision-creation/SKILL.md +60 -0
- package/assets/skills/launchrail/launch-wayfinder/SKILL.md +130 -0
- package/dist/commands/add.js +21 -4
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/doctor.js +42 -32
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +3 -7
- package/dist/commands/init.js +62 -85
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.js +11 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/agentsDocs.d.ts +4 -0
- package/dist/lib/agentsDocs.js +32 -0
- package/dist/lib/agentsDocs.js.map +1 -0
- package/dist/lib/claudeSettings.d.ts +74 -11
- package/dist/lib/claudeSettings.js +185 -17
- package/dist/lib/claudeSettings.js.map +1 -1
- package/dist/lib/detect.d.ts +0 -2
- package/dist/lib/detect.js +0 -1
- package/dist/lib/detect.js.map +1 -1
- package/dist/lib/manifest.d.ts +14 -1
- package/dist/lib/manifest.js +18 -1
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/migrations.js +202 -1
- package/dist/lib/migrations.js.map +1 -1
- package/dist/lib/project.js +9 -1
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/ralph.d.ts +16 -5
- package/dist/lib/ralph.js +32 -9
- package/dist/lib/ralph.js.map +1 -1
- package/dist/lib/seeds.js +4 -1
- package/dist/lib/seeds.js.map +1 -1
- package/dist/lib/skills.d.ts +12 -0
- package/dist/lib/skills.js +57 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/upstream.d.ts +6 -6
- package/dist/lib/upstream.js +1 -1
- package/dist/lib/upstream.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/claudeCli.d.ts +0 -51
- package/dist/lib/claudeCli.js +0 -71
- package/dist/lib/claudeCli.js.map +0 -1
package/dist/lib/migrations.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
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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"}
|
package/dist/lib/project.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
package/dist/lib/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAiB,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAiB,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ralph.d.ts
CHANGED
|
@@ -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.
|
|
7
|
-
*
|
|
8
|
-
* never by editing the file), so Launchrail may replace
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
|
|
5
|
-
//
|
|
6
|
-
// (
|
|
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.
|
|
13
|
-
*
|
|
14
|
-
* never by editing the file), so Launchrail may replace
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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 [
|
|
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
|
package/dist/lib/ralph.js.map
CHANGED
|
@@ -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;
|
|
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
|
-
-
|
|
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}`;
|
package/dist/lib/seeds.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/lib/upstream.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Upstream dependency compatibility tracking (ADR-0006).
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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). */
|
package/dist/lib/upstream.js
CHANGED
|
@@ -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
|
|
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) {
|
package/dist/lib/upstream.js.map
CHANGED
|
@@ -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,
|
|
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
package/dist/lib/claudeCli.d.ts
DELETED
|
@@ -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;
|