ralph-mcp 1.0.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/dist/index.js ADDED
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { start, startInputSchema } from "./tools/start.js";
6
+ import { status, statusInputSchema } from "./tools/status.js";
7
+ import { get, getInputSchema } from "./tools/get.js";
8
+ import { update, updateInputSchema } from "./tools/update.js";
9
+ import { stop, stopInputSchema } from "./tools/stop.js";
10
+ import { merge, mergeInputSchema, mergeQueueAction, mergeQueueInputSchema } from "./tools/merge.js";
11
+ import { setAgentId, setAgentIdInputSchema } from "./tools/set-agent-id.js";
12
+ const server = new Server({
13
+ name: "ralph",
14
+ version: "1.0.0",
15
+ }, {
16
+ capabilities: {
17
+ tools: {},
18
+ },
19
+ });
20
+ // List available tools
21
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
22
+ return {
23
+ tools: [
24
+ {
25
+ name: "ralph_start",
26
+ description: "Start PRD execution. Parses PRD file, creates worktree, stores state, and returns agent prompt for auto-start.",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ prdPath: {
31
+ type: "string",
32
+ description: "Path to the PRD markdown file (e.g., tasks/prd-xxx.md)",
33
+ },
34
+ projectRoot: {
35
+ type: "string",
36
+ description: "Project root directory (defaults to cwd)",
37
+ },
38
+ worktree: {
39
+ type: "boolean",
40
+ description: "Create a worktree for isolation (default: true)",
41
+ default: true,
42
+ },
43
+ autoStart: {
44
+ type: "boolean",
45
+ description: "Generate agent prompt for auto-start (default: true)",
46
+ default: true,
47
+ },
48
+ autoMerge: {
49
+ type: "boolean",
50
+ description: "Auto add to merge queue when all stories pass (default: false)",
51
+ default: false,
52
+ },
53
+ notifyOnComplete: {
54
+ type: "boolean",
55
+ description: "Show Windows notification when all stories complete (default: true)",
56
+ default: true,
57
+ },
58
+ onConflict: {
59
+ type: "string",
60
+ enum: ["auto_theirs", "auto_ours", "notify", "agent"],
61
+ description: "Conflict resolution strategy for merge (default: agent)",
62
+ default: "agent",
63
+ },
64
+ },
65
+ required: ["prdPath"],
66
+ },
67
+ },
68
+ {
69
+ name: "ralph_status",
70
+ description: "View all PRD execution status. Replaces manual TaskOutput queries. Shows progress, status, and summary.",
71
+ inputSchema: {
72
+ type: "object",
73
+ properties: {
74
+ project: {
75
+ type: "string",
76
+ description: "Filter by project name",
77
+ },
78
+ status: {
79
+ type: "string",
80
+ enum: ["pending", "running", "completed", "failed", "stopped", "merging"],
81
+ description: "Filter by status",
82
+ },
83
+ },
84
+ },
85
+ },
86
+ {
87
+ name: "ralph_get",
88
+ description: "Get detailed status of a single PRD execution including all user stories.",
89
+ inputSchema: {
90
+ type: "object",
91
+ properties: {
92
+ branch: {
93
+ type: "string",
94
+ description: "Branch name (e.g., ralph/task1-agent)",
95
+ },
96
+ },
97
+ required: ["branch"],
98
+ },
99
+ },
100
+ {
101
+ name: "ralph_update",
102
+ description: "Update User Story status. Called by subagent after completing a story.",
103
+ inputSchema: {
104
+ type: "object",
105
+ properties: {
106
+ branch: {
107
+ type: "string",
108
+ description: "Branch name (e.g., ralph/task1-agent)",
109
+ },
110
+ storyId: {
111
+ type: "string",
112
+ description: "Story ID (e.g., US-001)",
113
+ },
114
+ passes: {
115
+ type: "boolean",
116
+ description: "Whether the story passes",
117
+ },
118
+ notes: {
119
+ type: "string",
120
+ description: "Implementation notes",
121
+ },
122
+ },
123
+ required: ["branch", "storyId", "passes"],
124
+ },
125
+ },
126
+ {
127
+ name: "ralph_stop",
128
+ description: "Stop PRD execution. Optionally clean up worktree.",
129
+ inputSchema: {
130
+ type: "object",
131
+ properties: {
132
+ branch: {
133
+ type: "string",
134
+ description: "Branch name to stop",
135
+ },
136
+ cleanup: {
137
+ type: "boolean",
138
+ description: "Also remove the worktree (default: false)",
139
+ default: false,
140
+ },
141
+ deleteRecord: {
142
+ type: "boolean",
143
+ description: "Delete the execution record from database (default: false)",
144
+ default: false,
145
+ },
146
+ },
147
+ required: ["branch"],
148
+ },
149
+ },
150
+ {
151
+ name: "ralph_merge",
152
+ description: "Merge completed PRD to main and clean up worktree. MCP executes directly without Claude context.",
153
+ inputSchema: {
154
+ type: "object",
155
+ properties: {
156
+ branch: {
157
+ type: "string",
158
+ description: "Branch name to merge",
159
+ },
160
+ force: {
161
+ type: "boolean",
162
+ description: "Skip verification checks (default: false)",
163
+ default: false,
164
+ },
165
+ onConflict: {
166
+ type: "string",
167
+ enum: ["auto_theirs", "auto_ours", "notify", "agent"],
168
+ description: "Override conflict resolution strategy",
169
+ },
170
+ },
171
+ required: ["branch"],
172
+ },
173
+ },
174
+ {
175
+ name: "ralph_merge_queue",
176
+ description: "Manage merge queue. Default serial merge to avoid conflicts.",
177
+ inputSchema: {
178
+ type: "object",
179
+ properties: {
180
+ action: {
181
+ type: "string",
182
+ enum: ["list", "add", "remove", "process"],
183
+ description: "Queue action (default: list)",
184
+ default: "list",
185
+ },
186
+ branch: {
187
+ type: "string",
188
+ description: "Branch for add/remove actions",
189
+ },
190
+ },
191
+ },
192
+ },
193
+ {
194
+ name: "ralph_set_agent_id",
195
+ description: "Record the Claude Task agent ID for an execution. Called after starting a Task agent.",
196
+ inputSchema: {
197
+ type: "object",
198
+ properties: {
199
+ branch: {
200
+ type: "string",
201
+ description: "Branch name",
202
+ },
203
+ agentTaskId: {
204
+ type: "string",
205
+ description: "Claude Task agent ID",
206
+ },
207
+ },
208
+ required: ["branch", "agentTaskId"],
209
+ },
210
+ },
211
+ ],
212
+ };
213
+ });
214
+ // Handle tool calls
215
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
216
+ const { name, arguments: args } = request.params;
217
+ try {
218
+ let result;
219
+ switch (name) {
220
+ case "ralph_start":
221
+ result = await start(startInputSchema.parse(args));
222
+ break;
223
+ case "ralph_status":
224
+ result = await status(statusInputSchema.parse(args || {}));
225
+ break;
226
+ case "ralph_get":
227
+ result = await get(getInputSchema.parse(args));
228
+ break;
229
+ case "ralph_update":
230
+ result = await update(updateInputSchema.parse(args));
231
+ break;
232
+ case "ralph_stop":
233
+ result = await stop(stopInputSchema.parse(args));
234
+ break;
235
+ case "ralph_merge":
236
+ result = await merge(mergeInputSchema.parse(args));
237
+ break;
238
+ case "ralph_merge_queue":
239
+ result = await mergeQueueAction(mergeQueueInputSchema.parse(args || {}));
240
+ break;
241
+ case "ralph_set_agent_id":
242
+ result = await setAgentId(setAgentIdInputSchema.parse(args));
243
+ break;
244
+ default:
245
+ throw new Error(`Unknown tool: ${name}`);
246
+ }
247
+ return {
248
+ content: [
249
+ {
250
+ type: "text",
251
+ text: JSON.stringify(result, null, 2),
252
+ },
253
+ ],
254
+ };
255
+ }
256
+ catch (error) {
257
+ const message = error instanceof Error ? error.message : String(error);
258
+ return {
259
+ content: [
260
+ {
261
+ type: "text",
262
+ text: JSON.stringify({ error: message }, null, 2),
263
+ },
264
+ ],
265
+ isError: true,
266
+ };
267
+ }
268
+ });
269
+ // Start server
270
+ async function main() {
271
+ const transport = new StdioServerTransport();
272
+ await server.connect(transport);
273
+ console.error("Ralph MCP Server started");
274
+ }
275
+ main().catch((error) => {
276
+ console.error("Fatal error:", error);
277
+ process.exit(1);
278
+ });
@@ -0,0 +1,55 @@
1
+ export declare const RALPH_DATA_DIR: string;
2
+ export type ExecutionStatus = "pending" | "running" | "completed" | "failed" | "stopped" | "merging";
3
+ export type ConflictStrategy = "auto_theirs" | "auto_ours" | "notify" | "agent";
4
+ export interface ExecutionRecord {
5
+ id: string;
6
+ project: string;
7
+ branch: string;
8
+ description: string;
9
+ prdPath: string;
10
+ projectRoot: string;
11
+ worktreePath: string | null;
12
+ status: ExecutionStatus;
13
+ agentTaskId: string | null;
14
+ onConflict: ConflictStrategy | null;
15
+ autoMerge: boolean;
16
+ notifyOnComplete: boolean;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+ export interface UserStoryRecord {
21
+ id: string;
22
+ executionId: string;
23
+ storyId: string;
24
+ title: string;
25
+ description: string;
26
+ acceptanceCriteria: string[];
27
+ priority: number;
28
+ passes: boolean;
29
+ notes: string;
30
+ }
31
+ export type MergeQueueStatus = "pending" | "merging" | "completed" | "failed";
32
+ export interface MergeQueueItem {
33
+ id: number;
34
+ executionId: string;
35
+ position: number;
36
+ status: MergeQueueStatus;
37
+ createdAt: Date;
38
+ }
39
+ export declare function listExecutions(): Promise<ExecutionRecord[]>;
40
+ export declare function findExecutionByBranch(branch: string): Promise<ExecutionRecord | null>;
41
+ export declare function findExecutionById(executionId: string): Promise<ExecutionRecord | null>;
42
+ export declare function insertExecution(execution: ExecutionRecord): Promise<void>;
43
+ export declare function updateExecution(executionId: string, patch: Partial<Omit<ExecutionRecord, "id" | "createdAt">> & {
44
+ updatedAt?: Date;
45
+ }): Promise<void>;
46
+ export declare function deleteExecution(executionId: string): Promise<void>;
47
+ export declare function listUserStoriesByExecutionId(executionId: string): Promise<UserStoryRecord[]>;
48
+ export declare function findUserStoryById(storyKey: string): Promise<UserStoryRecord | null>;
49
+ export declare function insertUserStories(stories: UserStoryRecord[]): Promise<void>;
50
+ export declare function updateUserStory(storyKey: string, patch: Partial<Omit<UserStoryRecord, "id" | "executionId" | "storyId">>): Promise<void>;
51
+ export declare function listMergeQueue(): Promise<MergeQueueItem[]>;
52
+ export declare function findMergeQueueItemByExecutionId(executionId: string): Promise<MergeQueueItem | null>;
53
+ export declare function insertMergeQueueItem(item: Omit<MergeQueueItem, "id">): Promise<MergeQueueItem>;
54
+ export declare function updateMergeQueueItem(id: number, patch: Partial<Omit<MergeQueueItem, "id" | "executionId" | "createdAt">>): Promise<void>;
55
+ export declare function deleteMergeQueueByExecutionId(executionId: string): Promise<void>;
@@ -0,0 +1,205 @@
1
+ import { existsSync, mkdirSync } from "fs";
2
+ import { readFile, writeFile } from "fs/promises";
3
+ import { homedir } from "os";
4
+ import { join } from "path";
5
+ export const RALPH_DATA_DIR = process.env.RALPH_DATA_DIR?.replace("~", homedir()) ||
6
+ join(homedir(), ".ralph");
7
+ const STATE_PATH = join(RALPH_DATA_DIR, "state.json");
8
+ if (!existsSync(RALPH_DATA_DIR)) {
9
+ mkdirSync(RALPH_DATA_DIR, { recursive: true });
10
+ }
11
+ function parseDate(value, fieldName) {
12
+ const date = new Date(value);
13
+ if (Number.isNaN(date.getTime())) {
14
+ throw new Error(`Invalid date in ${fieldName}: ${value}`);
15
+ }
16
+ return date;
17
+ }
18
+ function toIso(date) {
19
+ return date.toISOString();
20
+ }
21
+ function defaultState() {
22
+ return { executions: [], userStories: [], mergeQueue: [] };
23
+ }
24
+ function normalizeState(raw) {
25
+ const base = {
26
+ version: 1,
27
+ executions: [],
28
+ userStories: [],
29
+ mergeQueue: [],
30
+ };
31
+ if (!raw || typeof raw !== "object")
32
+ return base;
33
+ const obj = raw;
34
+ if (obj.version === 1)
35
+ base.version = 1;
36
+ if (Array.isArray(obj.executions))
37
+ base.executions = obj.executions;
38
+ if (Array.isArray(obj.userStories))
39
+ base.userStories = obj.userStories;
40
+ if (Array.isArray(obj.mergeQueue))
41
+ base.mergeQueue = obj.mergeQueue;
42
+ return base;
43
+ }
44
+ function deserializeState(file) {
45
+ return {
46
+ executions: file.executions.map((e) => ({
47
+ ...e,
48
+ createdAt: parseDate(e.createdAt, "executions.createdAt"),
49
+ updatedAt: parseDate(e.updatedAt, "executions.updatedAt"),
50
+ })),
51
+ userStories: file.userStories.map((s) => ({
52
+ ...s,
53
+ acceptanceCriteria: Array.isArray(s.acceptanceCriteria)
54
+ ? s.acceptanceCriteria
55
+ : [],
56
+ notes: typeof s.notes === "string" ? s.notes : "",
57
+ })),
58
+ mergeQueue: file.mergeQueue.map((q) => ({
59
+ ...q,
60
+ createdAt: parseDate(q.createdAt, "mergeQueue.createdAt"),
61
+ })),
62
+ };
63
+ }
64
+ function serializeState(state) {
65
+ return {
66
+ version: 1,
67
+ executions: state.executions.map((e) => ({
68
+ ...e,
69
+ createdAt: toIso(e.createdAt),
70
+ updatedAt: toIso(e.updatedAt),
71
+ })),
72
+ userStories: state.userStories,
73
+ mergeQueue: state.mergeQueue.map((q) => ({
74
+ ...q,
75
+ createdAt: toIso(q.createdAt),
76
+ })),
77
+ };
78
+ }
79
+ let lock = Promise.resolve();
80
+ async function withLock(fn) {
81
+ const previous = lock;
82
+ let release;
83
+ lock = new Promise((resolve) => {
84
+ release = resolve;
85
+ });
86
+ await previous;
87
+ try {
88
+ return await fn();
89
+ }
90
+ finally {
91
+ release();
92
+ }
93
+ }
94
+ async function readStateUnlocked() {
95
+ if (!existsSync(STATE_PATH))
96
+ return defaultState();
97
+ const rawText = await readFile(STATE_PATH, "utf-8");
98
+ const rawJson = JSON.parse(rawText);
99
+ const normalized = normalizeState(rawJson);
100
+ return deserializeState(normalized);
101
+ }
102
+ async function writeStateUnlocked(state) {
103
+ const file = serializeState(state);
104
+ await writeFile(STATE_PATH, JSON.stringify(file, null, 2) + "\n", "utf-8");
105
+ }
106
+ async function mutateState(mutator) {
107
+ return withLock(async () => {
108
+ const state = await readStateUnlocked();
109
+ const result = await mutator(state);
110
+ await writeStateUnlocked(state);
111
+ return result;
112
+ });
113
+ }
114
+ async function readState(reader) {
115
+ return withLock(async () => {
116
+ const state = await readStateUnlocked();
117
+ return await reader(state);
118
+ });
119
+ }
120
+ export async function listExecutions() {
121
+ return readState((s) => s.executions.slice());
122
+ }
123
+ export async function findExecutionByBranch(branch) {
124
+ return readState((s) => s.executions.find((e) => e.branch === branch) ?? null);
125
+ }
126
+ export async function findExecutionById(executionId) {
127
+ return readState((s) => s.executions.find((e) => e.id === executionId) ?? null);
128
+ }
129
+ export async function insertExecution(execution) {
130
+ return mutateState((s) => {
131
+ const existing = s.executions.find((e) => e.branch === execution.branch);
132
+ if (existing) {
133
+ throw new Error(`Execution already exists for branch ${execution.branch}`);
134
+ }
135
+ s.executions.push(execution);
136
+ });
137
+ }
138
+ export async function updateExecution(executionId, patch) {
139
+ return mutateState((s) => {
140
+ const exec = s.executions.find((e) => e.id === executionId);
141
+ if (!exec)
142
+ throw new Error(`No execution found with id: ${executionId}`);
143
+ Object.assign(exec, patch);
144
+ });
145
+ }
146
+ export async function deleteExecution(executionId) {
147
+ return mutateState((s) => {
148
+ s.executions = s.executions.filter((e) => e.id !== executionId);
149
+ s.userStories = s.userStories.filter((st) => st.executionId !== executionId);
150
+ s.mergeQueue = s.mergeQueue.filter((q) => q.executionId !== executionId);
151
+ });
152
+ }
153
+ export async function listUserStoriesByExecutionId(executionId) {
154
+ return readState((s) => s.userStories.filter((st) => st.executionId === executionId));
155
+ }
156
+ export async function findUserStoryById(storyKey) {
157
+ return readState((s) => s.userStories.find((st) => st.id === storyKey) ?? null);
158
+ }
159
+ export async function insertUserStories(stories) {
160
+ return mutateState((s) => {
161
+ for (const story of stories) {
162
+ const existingIndex = s.userStories.findIndex((st) => st.id === story.id);
163
+ if (existingIndex >= 0)
164
+ s.userStories.splice(existingIndex, 1);
165
+ s.userStories.push(story);
166
+ }
167
+ });
168
+ }
169
+ export async function updateUserStory(storyKey, patch) {
170
+ return mutateState((s) => {
171
+ const story = s.userStories.find((st) => st.id === storyKey);
172
+ if (!story)
173
+ throw new Error(`No story found with id: ${storyKey}`);
174
+ Object.assign(story, patch);
175
+ });
176
+ }
177
+ export async function listMergeQueue() {
178
+ return readState((s) => s.mergeQueue
179
+ .slice()
180
+ .sort((a, b) => a.position - b.position || a.id - b.id));
181
+ }
182
+ export async function findMergeQueueItemByExecutionId(executionId) {
183
+ return readState((s) => s.mergeQueue.find((q) => q.executionId === executionId) ?? null);
184
+ }
185
+ export async function insertMergeQueueItem(item) {
186
+ return mutateState((s) => {
187
+ const nextId = s.mergeQueue.reduce((maxId, q) => Math.max(maxId, q.id), 0) + 1;
188
+ const created = { ...item, id: nextId };
189
+ s.mergeQueue.push(created);
190
+ return created;
191
+ });
192
+ }
193
+ export async function updateMergeQueueItem(id, patch) {
194
+ return mutateState((s) => {
195
+ const item = s.mergeQueue.find((q) => q.id === id);
196
+ if (!item)
197
+ throw new Error(`No merge queue item found with id: ${id}`);
198
+ Object.assign(item, patch);
199
+ });
200
+ }
201
+ export async function deleteMergeQueueByExecutionId(executionId) {
202
+ return mutateState((s) => {
203
+ s.mergeQueue = s.mergeQueue.filter((q) => q.executionId !== executionId);
204
+ });
205
+ }
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ export declare const getInputSchema: z.ZodObject<{
3
+ branch: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ branch: string;
6
+ }, {
7
+ branch: string;
8
+ }>;
9
+ export type GetInput = z.infer<typeof getInputSchema>;
10
+ export interface GetResult {
11
+ execution: {
12
+ id: string;
13
+ project: string;
14
+ branch: string;
15
+ description: string;
16
+ prdPath: string;
17
+ projectRoot: string;
18
+ worktreePath: string | null;
19
+ status: string;
20
+ agentTaskId: string | null;
21
+ onConflict: string | null;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ };
25
+ stories: Array<{
26
+ storyId: string;
27
+ title: string;
28
+ description: string;
29
+ acceptanceCriteria: string[];
30
+ priority: number;
31
+ passes: boolean;
32
+ notes: string | null;
33
+ }>;
34
+ progress: {
35
+ completed: number;
36
+ total: number;
37
+ percentage: number;
38
+ };
39
+ }
40
+ export declare function get(input: GetInput): Promise<GetResult>;
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { findExecutionByBranch, listUserStoriesByExecutionId, } from "../store/state.js";
3
+ export const getInputSchema = z.object({
4
+ branch: z.string().describe("Branch name (e.g., ralph/task1-agent)"),
5
+ });
6
+ export async function get(input) {
7
+ // Find execution by branch
8
+ const exec = await findExecutionByBranch(input.branch);
9
+ if (!exec) {
10
+ throw new Error(`No execution found for branch: ${input.branch}`);
11
+ }
12
+ // Get stories
13
+ const stories = await listUserStoriesByExecutionId(exec.id);
14
+ // Sort by priority
15
+ stories.sort((a, b) => a.priority - b.priority);
16
+ const completed = stories.filter((s) => s.passes).length;
17
+ const total = stories.length;
18
+ return {
19
+ execution: {
20
+ id: exec.id,
21
+ project: exec.project,
22
+ branch: exec.branch,
23
+ description: exec.description,
24
+ prdPath: exec.prdPath,
25
+ projectRoot: exec.projectRoot,
26
+ worktreePath: exec.worktreePath,
27
+ status: exec.status,
28
+ agentTaskId: exec.agentTaskId,
29
+ onConflict: exec.onConflict,
30
+ createdAt: exec.createdAt.toISOString(),
31
+ updatedAt: exec.updatedAt.toISOString(),
32
+ },
33
+ stories: stories.map((s) => ({
34
+ storyId: s.storyId,
35
+ title: s.title,
36
+ description: s.description,
37
+ acceptanceCriteria: s.acceptanceCriteria,
38
+ priority: s.priority,
39
+ passes: s.passes,
40
+ notes: s.notes,
41
+ })),
42
+ progress: {
43
+ completed,
44
+ total,
45
+ percentage: total > 0 ? Math.round((completed / total) * 100) : 0,
46
+ },
47
+ };
48
+ }
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ export declare const mergeInputSchema: z.ZodObject<{
3
+ branch: z.ZodString;
4
+ force: z.ZodDefault<z.ZodBoolean>;
5
+ skipQualityChecks: z.ZodDefault<z.ZodBoolean>;
6
+ onConflict: z.ZodOptional<z.ZodEnum<["auto_theirs", "auto_ours", "notify", "agent"]>>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ branch: string;
9
+ force: boolean;
10
+ skipQualityChecks: boolean;
11
+ onConflict?: "auto_theirs" | "auto_ours" | "notify" | "agent" | undefined;
12
+ }, {
13
+ branch: string;
14
+ onConflict?: "auto_theirs" | "auto_ours" | "notify" | "agent" | undefined;
15
+ force?: boolean | undefined;
16
+ skipQualityChecks?: boolean | undefined;
17
+ }>;
18
+ export type MergeInput = z.infer<typeof mergeInputSchema>;
19
+ export interface MergeResult {
20
+ success: boolean;
21
+ branch: string;
22
+ commitHash?: string;
23
+ cleanedUp: boolean;
24
+ conflictResolution?: "auto" | "agent" | "pending";
25
+ qualityChecks?: {
26
+ typeCheck: boolean;
27
+ build: boolean;
28
+ };
29
+ docsUpdated?: string[];
30
+ mergedStories?: string[];
31
+ message: string;
32
+ }
33
+ export declare function merge(input: MergeInput): Promise<MergeResult>;
34
+ export declare const mergeQueueInputSchema: z.ZodObject<{
35
+ action: z.ZodDefault<z.ZodEnum<["list", "add", "remove", "process"]>>;
36
+ branch: z.ZodOptional<z.ZodString>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ action: "list" | "add" | "remove" | "process";
39
+ branch?: string | undefined;
40
+ }, {
41
+ branch?: string | undefined;
42
+ action?: "list" | "add" | "remove" | "process" | undefined;
43
+ }>;
44
+ export type MergeQueueInput = z.infer<typeof mergeQueueInputSchema>;
45
+ export interface MergeQueueResult {
46
+ queue: string[];
47
+ current?: string;
48
+ message: string;
49
+ }
50
+ export declare function mergeQueueAction(input: MergeQueueInput): Promise<MergeQueueResult>;