@viraatdas/rudder 2.10.8 → 2.10.9
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/package.json +3 -2
- package/dist/hooks.d.ts +0 -6
- package/dist/hooks.js +0 -203
- package/dist/hooks.js.map +0 -1
- package/dist/recipes.d.ts +0 -11
- package/dist/recipes.js +0 -212
- package/dist/recipes.js.map +0 -1
- package/dist/repl.d.ts +0 -7
- package/dist/repl.js +0 -241
- package/dist/repl.js.map +0 -1
- package/dist/routines.d.ts +0 -9
- package/dist/routines.js +0 -153
- package/dist/routines.js.map +0 -1
- package/dist/tmux-dashboard.d.ts +0 -10
- package/dist/tmux-dashboard.js +0 -890
- package/dist/tmux-dashboard.js.map +0 -1
- package/dist/tmux-state.d.ts +0 -18
- package/dist/tmux-state.js +0 -23
- package/dist/tmux-state.js.map +0 -1
- package/dist/tmux.d.ts +0 -39
- package/dist/tmux.js +0 -193
- package/dist/tmux.js.map +0 -1
- package/dist/tui.d.ts +0 -9
- package/dist/tui.js +0 -1443
- package/dist/tui.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraatdas/rudder",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.9",
|
|
4
4
|
"description": "A Claude Code-style terminal app for running coding agents with worktree-isolated runs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://rudder.viraat.dev",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"rudder": "dist/index.js"
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
-
"
|
|
16
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
17
|
+
"build": "npm run clean && tsc -p tsconfig.json && npm run build-board && npm run build-native && npm run copy-native",
|
|
17
18
|
"build-board": "esbuild src/board/ui/index.tsx --bundle --minify --format=esm --jsx=automatic --jsx-import-source=preact --outfile=dist/board/board.js && esbuild src/board/ui/board.css --bundle --minify --outfile=dist/board/board.css",
|
|
18
19
|
"build-native": "cargo build --release --manifest-path native/Cargo.toml",
|
|
19
20
|
"check": "tsc -p tsconfig.json --noEmit",
|
package/dist/hooks.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { HookConfig, HookInvocation, HookResult, RudderEvent } from "./types.js";
|
|
2
|
-
export declare function hooksConfigPath(repoRoot: string): string;
|
|
3
|
-
export declare function loadHookConfig(repoRoot: string): Promise<HookConfig>;
|
|
4
|
-
export declare function runHooks(invocation: HookInvocation, emit?: (event: RudderEvent) => Promise<void> | void): Promise<HookResult[]>;
|
|
5
|
-
export declare function firstBlockingHook(results: HookResult[]): HookResult | undefined;
|
|
6
|
-
export declare function initHookTemplates(repoRoot: string): Promise<string>;
|
package/dist/hooks.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { projectStateDir, loadConfig } from "./state.js";
|
|
4
|
-
import { nowIso, readJson, writeJson } from "./util.js";
|
|
5
|
-
export function hooksConfigPath(repoRoot) {
|
|
6
|
-
return path.join(projectStateDir(repoRoot), "hooks.json");
|
|
7
|
-
}
|
|
8
|
-
export async function loadHookConfig(repoRoot) {
|
|
9
|
-
const config = await loadConfig();
|
|
10
|
-
if (config.hooks?.enabled === false) {
|
|
11
|
-
return { version: 1, hooks: [] };
|
|
12
|
-
}
|
|
13
|
-
const configured = config.hooks?.configPath
|
|
14
|
-
? path.resolve(repoRoot, config.hooks.configPath)
|
|
15
|
-
: hooksConfigPath(repoRoot);
|
|
16
|
-
const raw = await readJson(configured);
|
|
17
|
-
if (!raw || raw.version !== 1 || !Array.isArray(raw.hooks)) {
|
|
18
|
-
return { version: 1, hooks: [] };
|
|
19
|
-
}
|
|
20
|
-
return {
|
|
21
|
-
version: 1,
|
|
22
|
-
hooks: raw.hooks.filter(isHookDefinition),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
export async function runHooks(invocation, emit) {
|
|
26
|
-
const config = await loadHookConfig(invocation.repoRoot);
|
|
27
|
-
const hooks = config.hooks.filter((hook) => hook.event === invocation.event && hookMatches(hook, invocation));
|
|
28
|
-
const results = [];
|
|
29
|
-
for (const hook of hooks) {
|
|
30
|
-
await emit?.({
|
|
31
|
-
ts: nowIso(),
|
|
32
|
-
runId: invocation.runId ?? "hooks",
|
|
33
|
-
nodeId: invocation.nodeId,
|
|
34
|
-
type: "hook.started",
|
|
35
|
-
message: `hook ${hook.name ?? hook.command} on ${invocation.event}`,
|
|
36
|
-
data: hookData(hook),
|
|
37
|
-
});
|
|
38
|
-
const result = await runHookCommand(hook, invocation);
|
|
39
|
-
results.push(result);
|
|
40
|
-
if (result.status === "blocked") {
|
|
41
|
-
await emit?.({
|
|
42
|
-
ts: nowIso(),
|
|
43
|
-
runId: invocation.runId ?? "hooks",
|
|
44
|
-
nodeId: invocation.nodeId,
|
|
45
|
-
type: "hook.blocked",
|
|
46
|
-
message: result.reason ?? result.stderr ?? `hook blocked ${invocation.event}`,
|
|
47
|
-
data: hookData(hook),
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
else if (result.status === "failed" || result.status === "timeout") {
|
|
51
|
-
await emit?.({
|
|
52
|
-
ts: nowIso(),
|
|
53
|
-
runId: invocation.runId ?? "hooks",
|
|
54
|
-
nodeId: invocation.nodeId,
|
|
55
|
-
type: "hook.failed",
|
|
56
|
-
message: result.reason ?? result.stderr ?? `hook failed ${invocation.event}`,
|
|
57
|
-
data: hookData(hook),
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
if (isBlockingEvent(invocation.event) && result.status === "blocked") {
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return results;
|
|
65
|
-
}
|
|
66
|
-
export function firstBlockingHook(results) {
|
|
67
|
-
return results.find((result) => result.status === "blocked");
|
|
68
|
-
}
|
|
69
|
-
export async function initHookTemplates(repoRoot) {
|
|
70
|
-
const target = hooksConfigPath(repoRoot);
|
|
71
|
-
const initial = {
|
|
72
|
-
version: 1,
|
|
73
|
-
hooks: [
|
|
74
|
-
{
|
|
75
|
-
event: "PromptSubmit",
|
|
76
|
-
name: "secret-prompt-warning",
|
|
77
|
-
command: "node -e \"let s='';process.stdin.on('data',d=>s+=d);process.stdin.on('end',()=>{const j=JSON.parse(s); if(/(sk-|ghp_|github_pat_|api[_-]?key=)/i.test(j.message||'')){console.error('prompt appears to contain a secret; use rudder share instead'); process.exit(2)}})\"",
|
|
78
|
-
timeoutMs: 5000,
|
|
79
|
-
},
|
|
80
|
-
],
|
|
81
|
-
};
|
|
82
|
-
await writeJson(target, initial, { mode: 0o600 });
|
|
83
|
-
return target;
|
|
84
|
-
}
|
|
85
|
-
function runHookCommand(hook, invocation) {
|
|
86
|
-
const timeoutMs = hook.timeoutMs ?? defaultTimeout(invocation.event);
|
|
87
|
-
const input = JSON.stringify(invocation);
|
|
88
|
-
return new Promise((resolve) => {
|
|
89
|
-
const child = spawn(hook.command, {
|
|
90
|
-
cwd: invocation.repoRoot,
|
|
91
|
-
shell: true,
|
|
92
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
93
|
-
env: {
|
|
94
|
-
...process.env,
|
|
95
|
-
RUDDER_REPO: invocation.repoRoot,
|
|
96
|
-
RUDDER_EVENT: invocation.event,
|
|
97
|
-
...(invocation.runId ? { RUDDER_RUN_ID: invocation.runId } : {}),
|
|
98
|
-
...(invocation.nodeId ? { RUDDER_NODE_ID: invocation.nodeId } : {}),
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
let stdout = "";
|
|
102
|
-
let stderr = "";
|
|
103
|
-
let settled = false;
|
|
104
|
-
const timer = setTimeout(() => {
|
|
105
|
-
if (settled) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
settled = true;
|
|
109
|
-
child.kill("SIGTERM");
|
|
110
|
-
resolve({ hook, status: "timeout", stdout, stderr, reason: `hook timed out after ${timeoutMs}ms` });
|
|
111
|
-
}, timeoutMs);
|
|
112
|
-
timer.unref?.();
|
|
113
|
-
child.stdout?.on("data", (chunk) => {
|
|
114
|
-
stdout += String(chunk);
|
|
115
|
-
});
|
|
116
|
-
child.stderr?.on("data", (chunk) => {
|
|
117
|
-
stderr += String(chunk);
|
|
118
|
-
});
|
|
119
|
-
child.on("error", (error) => {
|
|
120
|
-
if (settled) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
settled = true;
|
|
124
|
-
clearTimeout(timer);
|
|
125
|
-
resolve({ hook, status: "failed", stdout, stderr, reason: error.message });
|
|
126
|
-
});
|
|
127
|
-
child.on("exit", (code) => {
|
|
128
|
-
if (settled) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
settled = true;
|
|
132
|
-
clearTimeout(timer);
|
|
133
|
-
const parsed = parseHookJson(stdout);
|
|
134
|
-
const blocked = code === 2 || parsed?.decision === "block";
|
|
135
|
-
resolve({
|
|
136
|
-
hook,
|
|
137
|
-
status: blocked ? "blocked" : code === 0 ? "allowed" : "failed",
|
|
138
|
-
stdout,
|
|
139
|
-
stderr,
|
|
140
|
-
...(blocked ? { reason: parsed?.reason ?? firstLine(stderr) ?? "blocked by hook" } : {}),
|
|
141
|
-
...(code !== 0 && !blocked ? { reason: firstLine(stderr) ?? `hook exited ${code}` } : {}),
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
child.stdin?.end(input);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
function hookMatches(hook, invocation) {
|
|
148
|
-
if (!hook.matcher) {
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
const haystack = `${invocation.message ?? ""}\n${JSON.stringify(invocation.data ?? {})}`;
|
|
152
|
-
try {
|
|
153
|
-
return new RegExp(hook.matcher).test(haystack);
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
return haystack.includes(hook.matcher);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function isHookDefinition(value) {
|
|
160
|
-
const hook = value;
|
|
161
|
-
return Boolean(hook && isHookEvent(hook.event) && typeof hook.command === "string" && hook.command.trim());
|
|
162
|
-
}
|
|
163
|
-
function isHookEvent(value) {
|
|
164
|
-
return (value === "PromptSubmit" ||
|
|
165
|
-
value === "RunStart" ||
|
|
166
|
-
value === "RunComplete" ||
|
|
167
|
-
value === "NodeReview" ||
|
|
168
|
-
value === "NodeMerged" ||
|
|
169
|
-
value === "MergeConflict" ||
|
|
170
|
-
value === "BudgetExceeded" ||
|
|
171
|
-
value === "WorktreeCreate" ||
|
|
172
|
-
value === "SessionEnd");
|
|
173
|
-
}
|
|
174
|
-
function isBlockingEvent(event) {
|
|
175
|
-
return event === "PromptSubmit" || event === "RunStart" || event === "WorktreeCreate";
|
|
176
|
-
}
|
|
177
|
-
function defaultTimeout(event) {
|
|
178
|
-
return event === "PromptSubmit" ? 30_000 : 600_000;
|
|
179
|
-
}
|
|
180
|
-
function parseHookJson(stdout) {
|
|
181
|
-
const trimmed = stdout.trim();
|
|
182
|
-
if (!trimmed.startsWith("{")) {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
return JSON.parse(trimmed);
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
function firstLine(value) {
|
|
193
|
-
return value.split(/\r?\n/).map((line) => line.trim()).find(Boolean);
|
|
194
|
-
}
|
|
195
|
-
function hookData(hook) {
|
|
196
|
-
return {
|
|
197
|
-
event: hook.event,
|
|
198
|
-
command: hook.command,
|
|
199
|
-
...(hook.name ? { name: hook.name } : {}),
|
|
200
|
-
...(hook.matcher ? { matcher: hook.matcher } : {}),
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
//# sourceMappingURL=hooks.js.map
|
package/dist/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/recipes.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { RecipeDefinition } from "./types.js";
|
|
2
|
-
export declare function recipesDir(repoRoot: string): string;
|
|
3
|
-
export declare function listRecipes(repoRoot?: string): Promise<RecipeDefinition[]>;
|
|
4
|
-
export declare function findRecipe(name: string, repoRoot?: string): Promise<RecipeDefinition | null>;
|
|
5
|
-
export declare function readRecipe(filePath: string): Promise<RecipeDefinition>;
|
|
6
|
-
export declare function renderRecipePrompt(recipe: RecipeDefinition, args: Record<string, string>): string;
|
|
7
|
-
export declare function runRecipe(name: string, args?: Record<string, string>, opts?: {
|
|
8
|
-
repoRoot?: string;
|
|
9
|
-
json?: boolean;
|
|
10
|
-
}): Promise<void>;
|
|
11
|
-
export declare function initRecipeTemplates(repoRoot?: string): Promise<string[]>;
|
package/dist/recipes.js
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import fsp from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { buildFanoutDag, planTask, scaffoldPlan } from "./planner.js";
|
|
4
|
-
import { currentBranch, findRepoRoot } from "./git.js";
|
|
5
|
-
import { ensureColocated, ensureJj } from "./jj.js";
|
|
6
|
-
import { startRun } from "./run-manager.js";
|
|
7
|
-
import { projectStateDir } from "./state.js";
|
|
8
|
-
import { pathExists } from "./util.js";
|
|
9
|
-
export function recipesDir(repoRoot) {
|
|
10
|
-
return path.join(projectStateDir(repoRoot), "recipes");
|
|
11
|
-
}
|
|
12
|
-
export async function listRecipes(repoRoot = findRepoRoot()) {
|
|
13
|
-
const dirs = [recipesDir(repoRoot)];
|
|
14
|
-
const recipes = [];
|
|
15
|
-
for (const dir of dirs) {
|
|
16
|
-
const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
17
|
-
for (const entry of entries) {
|
|
18
|
-
if (!entry.isFile() || !entry.name.endsWith(".md")) {
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
const recipe = await readRecipe(path.join(dir, entry.name)).catch(() => null);
|
|
22
|
-
if (recipe) {
|
|
23
|
-
recipes.push(recipe);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return recipes.sort((a, b) => a.name.localeCompare(b.name));
|
|
28
|
-
}
|
|
29
|
-
export async function findRecipe(name, repoRoot = findRepoRoot()) {
|
|
30
|
-
const normalized = name.trim();
|
|
31
|
-
if (!normalized) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
for (const recipe of await listRecipes(repoRoot)) {
|
|
35
|
-
if (recipe.name === normalized || path.basename(recipe.sourcePath, ".md") === normalized) {
|
|
36
|
-
return recipe;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
export async function readRecipe(filePath) {
|
|
42
|
-
const text = await fsp.readFile(filePath, "utf8");
|
|
43
|
-
const { meta, body } = parseFrontmatter(text);
|
|
44
|
-
const fallbackName = path.basename(filePath, ".md");
|
|
45
|
-
const name = (meta.name || fallbackName).trim();
|
|
46
|
-
const mode = parseMode(meta.mode);
|
|
47
|
-
const backend = parseBackend(meta.backend);
|
|
48
|
-
const effort = parseEffort(meta.effort);
|
|
49
|
-
const prompt = (meta.prompt || body).trim();
|
|
50
|
-
if (!name) {
|
|
51
|
-
throw new Error(`${filePath}: recipe name cannot be empty`);
|
|
52
|
-
}
|
|
53
|
-
if (!prompt) {
|
|
54
|
-
throw new Error(`${filePath}: recipe prompt/body cannot be empty`);
|
|
55
|
-
}
|
|
56
|
-
return {
|
|
57
|
-
name,
|
|
58
|
-
...(meta.description ? { description: meta.description } : {}),
|
|
59
|
-
mode,
|
|
60
|
-
prompt,
|
|
61
|
-
...(backend ? { backend } : {}),
|
|
62
|
-
...(meta.model ? { model: meta.model } : {}),
|
|
63
|
-
...(effort ? { effort } : {}),
|
|
64
|
-
...(meta.requiresApproval ? { requiresApproval: parseBoolean(meta.requiresApproval) } : {}),
|
|
65
|
-
...(meta.reviewGate === "auto" || meta.reviewGate === "manual" ? { reviewGate: meta.reviewGate } : {}),
|
|
66
|
-
sourcePath: filePath,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
export function renderRecipePrompt(recipe, args) {
|
|
70
|
-
return recipe.prompt.replace(/\{\{\s*([A-Za-z0-9_.-]+)\s*\}\}/g, (_match, key) => args[key] ?? "");
|
|
71
|
-
}
|
|
72
|
-
export async function runRecipe(name, args = {}, opts = {}) {
|
|
73
|
-
const repoRoot = opts.repoRoot ?? findRepoRoot();
|
|
74
|
-
const previousCwd = process.cwd();
|
|
75
|
-
process.chdir(repoRoot);
|
|
76
|
-
try {
|
|
77
|
-
const recipe = await findRecipe(name, repoRoot);
|
|
78
|
-
if (!recipe) {
|
|
79
|
-
throw new Error(`Recipe not found: ${name}`);
|
|
80
|
-
}
|
|
81
|
-
const prompt = renderRecipePrompt(recipe, args);
|
|
82
|
-
switch (recipe.mode) {
|
|
83
|
-
case "run":
|
|
84
|
-
case "ask":
|
|
85
|
-
case "inject":
|
|
86
|
-
await startRun({
|
|
87
|
-
task: prompt,
|
|
88
|
-
backend: recipe.backend,
|
|
89
|
-
model: recipe.model,
|
|
90
|
-
detach: true,
|
|
91
|
-
worktree: recipe.mode !== "ask",
|
|
92
|
-
queue: false,
|
|
93
|
-
json: opts.json,
|
|
94
|
-
view: "shell",
|
|
95
|
-
origin: { kind: "recipe", id: recipe.name, source: recipe.sourcePath },
|
|
96
|
-
});
|
|
97
|
-
return;
|
|
98
|
-
case "plan":
|
|
99
|
-
ensureJj();
|
|
100
|
-
await ensureColocated(repoRoot);
|
|
101
|
-
await scaffoldPlan(repoRoot, await planTask(prompt, {
|
|
102
|
-
root: repoRoot,
|
|
103
|
-
branch: await currentBranch(repoRoot).catch(() => "main"),
|
|
104
|
-
...(recipe.backend ? { backend: recipe.backend } : {}),
|
|
105
|
-
}));
|
|
106
|
-
if (!opts.json) {
|
|
107
|
-
console.log(`planned recipe ${recipe.name}`);
|
|
108
|
-
}
|
|
109
|
-
return;
|
|
110
|
-
case "fanout": {
|
|
111
|
-
ensureJj();
|
|
112
|
-
await ensureColocated(repoRoot);
|
|
113
|
-
const dag = buildFanoutDag(prompt, 3, recipe.backend ? { backend: recipe.backend } : {});
|
|
114
|
-
await scaffoldPlan(repoRoot, dag);
|
|
115
|
-
if (!opts.json) {
|
|
116
|
-
console.log(`fanout recipe ${recipe.name}: ${dag.nodes.length} node(s)`);
|
|
117
|
-
}
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
process.chdir(previousCwd);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
export async function initRecipeTemplates(repoRoot = findRepoRoot()) {
|
|
127
|
-
const dir = recipesDir(repoRoot);
|
|
128
|
-
await fsp.mkdir(dir, { recursive: true });
|
|
129
|
-
const templates = [
|
|
130
|
-
{
|
|
131
|
-
name: "review-plan.md",
|
|
132
|
-
content: [
|
|
133
|
-
"---",
|
|
134
|
-
"name: review-plan",
|
|
135
|
-
"description: Review the active plan or implementation direction before code changes",
|
|
136
|
-
"mode: plan",
|
|
137
|
-
"backend: claude",
|
|
138
|
-
"---",
|
|
139
|
-
"",
|
|
140
|
-
"Review this repository and produce a concise implementation plan for: {{task}}",
|
|
141
|
-
"Call out risks, interfaces, and tests before any worker starts.",
|
|
142
|
-
"",
|
|
143
|
-
].join("\n"),
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
name: "validate-changes.md",
|
|
147
|
-
content: [
|
|
148
|
-
"---",
|
|
149
|
-
"name: validate-changes",
|
|
150
|
-
"description: Validate current changes with tests and code review",
|
|
151
|
-
"mode: run",
|
|
152
|
-
"backend: claude",
|
|
153
|
-
"---",
|
|
154
|
-
"",
|
|
155
|
-
"Review the current worktree changes, run the smallest relevant checks, and report concrete issues.",
|
|
156
|
-
"Do not make broad refactors. Fix only clear validation failures.",
|
|
157
|
-
"",
|
|
158
|
-
].join("\n"),
|
|
159
|
-
},
|
|
160
|
-
];
|
|
161
|
-
const written = [];
|
|
162
|
-
for (const template of templates) {
|
|
163
|
-
const target = path.join(dir, template.name);
|
|
164
|
-
if (!(await pathExists(target))) {
|
|
165
|
-
await fsp.writeFile(target, template.content, "utf8");
|
|
166
|
-
written.push(target);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return written;
|
|
170
|
-
}
|
|
171
|
-
function parseFrontmatter(text) {
|
|
172
|
-
if (!text.startsWith("---\n")) {
|
|
173
|
-
return { meta: {}, body: text };
|
|
174
|
-
}
|
|
175
|
-
const end = text.indexOf("\n---", 4);
|
|
176
|
-
if (end < 0) {
|
|
177
|
-
return { meta: {}, body: text };
|
|
178
|
-
}
|
|
179
|
-
const raw = text.slice(4, end).trim();
|
|
180
|
-
const body = text.slice(end + 4).replace(/^\r?\n/, "");
|
|
181
|
-
const meta = {};
|
|
182
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
183
|
-
const idx = line.indexOf(":");
|
|
184
|
-
if (idx <= 0) {
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
const key = line.slice(0, idx).trim();
|
|
188
|
-
const value = line.slice(idx + 1).trim().replace(/^["']|["']$/g, "");
|
|
189
|
-
if (key) {
|
|
190
|
-
meta[key] = value;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return { meta, body };
|
|
194
|
-
}
|
|
195
|
-
function parseMode(value) {
|
|
196
|
-
if (value === "plan" || value === "fanout" || value === "ask" || value === "inject") {
|
|
197
|
-
return value;
|
|
198
|
-
}
|
|
199
|
-
return "run";
|
|
200
|
-
}
|
|
201
|
-
function parseBackend(value) {
|
|
202
|
-
return value === "claude" || value === "codex" || value === "acpx" ? value : undefined;
|
|
203
|
-
}
|
|
204
|
-
function parseEffort(value) {
|
|
205
|
-
return value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max"
|
|
206
|
-
? value
|
|
207
|
-
: undefined;
|
|
208
|
-
}
|
|
209
|
-
function parseBoolean(value) {
|
|
210
|
-
return value === "true" || value === "1" || value === "yes";
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=recipes.js.map
|
package/dist/recipes.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recipes.js","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAIvC,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAQ,GAAG,YAAY,EAAE;IACzD,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9E,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,QAAQ,GAAG,YAAY,EAAE;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,UAAU,EAAE,CAAC;YACzF,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,+BAA+B,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,sCAAsC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI;QACJ,MAAM;QACN,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,UAAU,EAAE,QAAQ;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB,EAAE,IAA4B;IACvF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAA+B,EAAE,EACjC,OAA8C,EAAE;IAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,QAAQ;gBACX,MAAM,QAAQ,CAAC;oBACb,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,KAAK;oBAC/B,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE;iBACvE,CAAC,CAAC;gBACH,OAAO;YACT,KAAK,MAAM;gBACT,QAAQ,EAAE,CAAC;gBACX,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAChC,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE;oBAClD,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;oBACzD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD,CAAC,CAAC,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBACD,OAAO;YACT,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,QAAQ,EAAE,CAAC;gBACX,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAChC,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzF,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAQ,GAAG,YAAY,EAAE;IACjE,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAA6C;QAC1D;YACE,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE;gBACP,KAAK;gBACL,mBAAmB;gBACnB,qFAAqF;gBACrF,YAAY;gBACZ,iBAAiB;gBACjB,KAAK;gBACL,EAAE;gBACF,gFAAgF;gBAChF,iEAAiE;gBACjE,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE;gBACP,KAAK;gBACL,wBAAwB;gBACxB,kEAAkE;gBAClE,WAAW;gBACX,iBAAiB;gBACjB,KAAK;gBACL,EAAE;gBACF,oGAAoG;gBACpG,kEAAkE;gBAClE,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;KACF,CAAC;IACF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC5C,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK;QACtG,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC;AAC9D,CAAC"}
|