@generacy-ai/generacy 0.3.4 → 0.4.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 +153 -0
- package/dist/cli/commands/cluster/scaffolder.d.ts.map +1 -1
- package/dist/cli/commands/cluster/scaffolder.js +2 -0
- package/dist/cli/commands/cluster/scaffolder.js.map +1 -1
- package/dist/cli/commands/cockpit/advance.d.ts +42 -0
- package/dist/cli/commands/cockpit/advance.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/advance.js +136 -0
- package/dist/cli/commands/cockpit/advance.js.map +1 -0
- package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts +13 -0
- package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/clarification-comment-finder.js +31 -0
- package/dist/cli/commands/cockpit/clarification-comment-finder.js.map +1 -0
- package/dist/cli/commands/cockpit/code-references.d.ts +27 -0
- package/dist/cli/commands/cockpit/code-references.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/code-references.js +48 -0
- package/dist/cli/commands/cockpit/code-references.js.map +1 -0
- package/dist/cli/commands/cockpit/context.d.ts +90 -0
- package/dist/cli/commands/cockpit/context.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/context.js +280 -0
- package/dist/cli/commands/cockpit/context.js.map +1 -0
- package/dist/cli/commands/cockpit/exit.d.ts +12 -0
- package/dist/cli/commands/cockpit/exit.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/exit.js +18 -0
- package/dist/cli/commands/cockpit/exit.js.map +1 -0
- package/dist/cli/commands/cockpit/gate-vocabulary.d.ts +48 -0
- package/dist/cli/commands/cockpit/gate-vocabulary.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/gate-vocabulary.js +96 -0
- package/dist/cli/commands/cockpit/gate-vocabulary.js.map +1 -0
- package/dist/cli/commands/cockpit/index.d.ts +20 -0
- package/dist/cli/commands/cockpit/index.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/index.js +40 -0
- package/dist/cli/commands/cockpit/index.js.map +1 -0
- package/dist/cli/commands/cockpit/manual-advance-marker.d.ts +18 -0
- package/dist/cli/commands/cockpit/manual-advance-marker.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/manual-advance-marker.js +43 -0
- package/dist/cli/commands/cockpit/manual-advance-marker.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/errors.d.ts +54 -0
- package/dist/cli/commands/cockpit/mcp/errors.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/errors.js +190 -0
- package/dist/cli/commands/cockpit/mcp/errors.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts +59 -0
- package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/event-bus-registry.js +305 -0
- package/dist/cli/commands/cockpit/mcp/event-bus-registry.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/event-bus.d.ts +82 -0
- package/dist/cli/commands/cockpit/mcp/event-bus.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/event-bus.js +230 -0
- package/dist/cli/commands/cockpit/mcp/event-bus.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/index.d.ts +17 -0
- package/dist/cli/commands/cockpit/mcp/index.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/index.js +37 -0
- package/dist/cli/commands/cockpit/mcp/index.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/ref-input.d.ts +52 -0
- package/dist/cli/commands/cockpit/mcp/ref-input.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/ref-input.js +132 -0
- package/dist/cli/commands/cockpit/mcp/ref-input.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/schemas.d.ts +287 -0
- package/dist/cli/commands/cockpit/mcp/schemas.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/schemas.js +84 -0
- package/dist/cli/commands/cockpit/mcp/schemas.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/server.d.ts +17 -0
- package/dist/cli/commands/cockpit/mcp/server.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/server.js +62 -0
- package/dist/cli/commands/cockpit/mcp/server.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts +42 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js +73 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts +34 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js +115 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts +21 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js +35 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts +43 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js +99 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts +43 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js +68 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts +38 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js +79 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts +21 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js +59 -0
- package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js.map +1 -0
- package/dist/cli/commands/cockpit/merge.d.ts +42 -0
- package/dist/cli/commands/cockpit/merge.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/merge.js +360 -0
- package/dist/cli/commands/cockpit/merge.js.map +1 -0
- package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts +30 -0
- package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/plan-dependency-extractor.js +135 -0
- package/dist/cli/commands/cockpit/plan-dependency-extractor.js.map +1 -0
- package/dist/cli/commands/cockpit/queue.d.ts +85 -0
- package/dist/cli/commands/cockpit/queue.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/queue.js +438 -0
- package/dist/cli/commands/cockpit/queue.js.map +1 -0
- package/dist/cli/commands/cockpit/resolver.d.ts +70 -0
- package/dist/cli/commands/cockpit/resolver.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/resolver.js +117 -0
- package/dist/cli/commands/cockpit/resolver.js.map +1 -0
- package/dist/cli/commands/cockpit/resume.d.ts +38 -0
- package/dist/cli/commands/cockpit/resume.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/resume.js +167 -0
- package/dist/cli/commands/cockpit/resume.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/classify-issue.d.ts +12 -0
- package/dist/cli/commands/cockpit/shared/classify-issue.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/classify-issue.js +10 -0
- package/dist/cli/commands/cockpit/shared/classify-issue.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts +53 -0
- package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/failing-check-json.js +170 -0
- package/dist/cli/commands/cockpit/shared/failing-check-json.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/identity.d.ts +54 -0
- package/dist/cli/commands/cockpit/shared/identity.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/identity.js +65 -0
- package/dist/cli/commands/cockpit/shared/identity.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts +16 -0
- package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/is-done-snapshot.js +17 -0
- package/dist/cli/commands/cockpit/shared/is-done-snapshot.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/pagination.d.ts +17 -0
- package/dist/cli/commands/cockpit/shared/pagination.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/pagination.js +50 -0
- package/dist/cli/commands/cockpit/shared/pagination.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/pr-link.d.ts +8 -0
- package/dist/cli/commands/cockpit/shared/pr-link.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/pr-link.js +15 -0
- package/dist/cli/commands/cockpit/shared/pr-link.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/required-checks.d.ts +17 -0
- package/dist/cli/commands/cockpit/shared/required-checks.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/required-checks.js +38 -0
- package/dist/cli/commands/cockpit/shared/required-checks.js.map +1 -0
- package/dist/cli/commands/cockpit/shared/review-context-json.d.ts +29 -0
- package/dist/cli/commands/cockpit/shared/review-context-json.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/shared/review-context-json.js +28 -0
- package/dist/cli/commands/cockpit/shared/review-context-json.js.map +1 -0
- package/dist/cli/commands/cockpit/status/color.d.ts +11 -0
- package/dist/cli/commands/cockpit/status/color.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/status/color.js +33 -0
- package/dist/cli/commands/cockpit/status/color.js.map +1 -0
- package/dist/cli/commands/cockpit/status/group.d.ts +8 -0
- package/dist/cli/commands/cockpit/status/group.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/status/group.js +35 -0
- package/dist/cli/commands/cockpit/status/group.js.map +1 -0
- package/dist/cli/commands/cockpit/status/render-table.d.ts +24 -0
- package/dist/cli/commands/cockpit/status/render-table.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/status/render-table.js +71 -0
- package/dist/cli/commands/cockpit/status/render-table.js.map +1 -0
- package/dist/cli/commands/cockpit/status/row.d.ts +18 -0
- package/dist/cli/commands/cockpit/status/row.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/status/row.js +17 -0
- package/dist/cli/commands/cockpit/status/row.js.map +1 -0
- package/dist/cli/commands/cockpit/status.d.ts +18 -0
- package/dist/cli/commands/cockpit/status.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/status.js +138 -0
- package/dist/cli/commands/cockpit/status.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/actionable.d.ts +15 -0
- package/dist/cli/commands/cockpit/watch/actionable.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/actionable.js +32 -0
- package/dist/cli/commands/cockpit/watch/actionable.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts +107 -0
- package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/aggregate-emit.js +41 -0
- package/dist/cli/commands/cockpit/watch/aggregate-emit.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/aggregate.d.ts +25 -0
- package/dist/cli/commands/cockpit/watch/aggregate.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/aggregate.js +67 -0
- package/dist/cli/commands/cockpit/watch/aggregate.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/check-rollup.d.ts +9 -0
- package/dist/cli/commands/cockpit/watch/check-rollup.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/check-rollup.js +22 -0
- package/dist/cli/commands/cockpit/watch/check-rollup.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/diff.d.ts +29 -0
- package/dist/cli/commands/cockpit/watch/diff.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/diff.js +85 -0
- package/dist/cli/commands/cockpit/watch/diff.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/emit.d.ts +58 -0
- package/dist/cli/commands/cockpit/watch/emit.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/emit.js +30 -0
- package/dist/cli/commands/cockpit/watch/emit.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/poll-loop.d.ts +29 -0
- package/dist/cli/commands/cockpit/watch/poll-loop.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/poll-loop.js +81 -0
- package/dist/cli/commands/cockpit/watch/poll-loop.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/pr-state.d.ts +17 -0
- package/dist/cli/commands/cockpit/watch/pr-state.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/pr-state.js +33 -0
- package/dist/cli/commands/cockpit/watch/pr-state.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/snapshot.d.ts +33 -0
- package/dist/cli/commands/cockpit/watch/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/snapshot.js +30 -0
- package/dist/cli/commands/cockpit/watch/snapshot.js.map +1 -0
- package/dist/cli/commands/cockpit/watch/stream-event.d.ts +82 -0
- package/dist/cli/commands/cockpit/watch/stream-event.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch/stream-event.js +9 -0
- package/dist/cli/commands/cockpit/watch/stream-event.js.map +1 -0
- package/dist/cli/commands/cockpit/watch.d.ts +22 -0
- package/dist/cli/commands/cockpit/watch.d.ts.map +1 -0
- package/dist/cli/commands/cockpit/watch.js +186 -0
- package/dist/cli/commands/cockpit/watch.js.map +1 -0
- package/dist/cli/commands/setup/build.d.ts.map +1 -1
- package/dist/cli/commands/setup/build.js +59 -0
- package/dist/cli/commands/setup/build.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +11 -5
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the `@modelcontextprotocol/sdk` MCP server exposing the seven cockpit
|
|
3
|
+
* tools over stdio. Tools call the same internal `run<Verb>()` functions the
|
|
4
|
+
* CLI uses (spec § Design invariant #1).
|
|
5
|
+
*
|
|
6
|
+
* Each handler returns `ToolResult<T>` — either `{status:"ok", data}` or
|
|
7
|
+
* `{status:"error", class, detail}`. That envelope is serialized as
|
|
8
|
+
* `structuredContent` so callers can dispatch on `status` without parsing
|
|
9
|
+
* text.
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { cockpitStatus } from './tools/cockpit_status.js';
|
|
13
|
+
import { cockpitContext } from './tools/cockpit_context.js';
|
|
14
|
+
import { cockpitAdvance } from './tools/cockpit_advance.js';
|
|
15
|
+
import { cockpitResume } from './tools/cockpit_resume.js';
|
|
16
|
+
import { cockpitQueue } from './tools/cockpit_queue.js';
|
|
17
|
+
import { cockpitMerge } from './tools/cockpit_merge.js';
|
|
18
|
+
import { cockpitAwaitEvents } from './tools/cockpit_await_events.js';
|
|
19
|
+
import { CockpitStatusInputSchema, CockpitContextInputSchema, CockpitAdvanceInputSchema, CockpitResumeInputSchema, CockpitQueueInputSchema, CockpitMergeInputSchema, AwaitEventsInputSchema, } from './schemas.js';
|
|
20
|
+
function toCallToolResult(result) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
23
|
+
structuredContent: result,
|
|
24
|
+
isError: result.status === 'error',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function buildMcpServer(deps = {}) {
|
|
28
|
+
const server = new McpServer({
|
|
29
|
+
name: 'cockpit',
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
});
|
|
32
|
+
server.registerTool('cockpit_status', {
|
|
33
|
+
description: "Print a one-shot snapshot of every ref in the epic body's phases. Read-only.",
|
|
34
|
+
inputSchema: CockpitStatusInputSchema,
|
|
35
|
+
}, async (args) => toCallToolResult(await cockpitStatus(args, deps)));
|
|
36
|
+
server.registerTool('cockpit_context', {
|
|
37
|
+
description: 'Classify the current waiting-for:* gate for one issue and emit its bundle.',
|
|
38
|
+
inputSchema: CockpitContextInputSchema,
|
|
39
|
+
}, async (args) => toCallToolResult(await cockpitContext(args, deps)));
|
|
40
|
+
server.registerTool('cockpit_advance', {
|
|
41
|
+
description: 'Manually flip waiting-for:<gate> → completed:<gate> on one issue. Posts an audit comment.',
|
|
42
|
+
inputSchema: CockpitAdvanceInputSchema,
|
|
43
|
+
}, async (args) => toCallToolResult(await cockpitAdvance(args, deps)));
|
|
44
|
+
server.registerTool('cockpit_resume', {
|
|
45
|
+
description: 'Re-arm a failed phase in place: clears failed:<phase>/agent:error, applies waiting-for/completed pair for the preceding gate.',
|
|
46
|
+
inputSchema: CockpitResumeInputSchema,
|
|
47
|
+
}, async (args) => toCallToolResult(await cockpitResume(args, deps)));
|
|
48
|
+
server.registerTool('cockpit_queue', {
|
|
49
|
+
description: 'Enqueue eligible refs under a phase heading to the cluster pipeline (unconfirmed — no interactive prompt).',
|
|
50
|
+
inputSchema: CockpitQueueInputSchema,
|
|
51
|
+
}, async (args) => toCallToolResult(await cockpitQueue(args, deps)));
|
|
52
|
+
server.registerTool('cockpit_merge', {
|
|
53
|
+
description: 'Merge a PR once its required checks are green. Never merges on red.',
|
|
54
|
+
inputSchema: CockpitMergeInputSchema,
|
|
55
|
+
}, async (args) => toCallToolResult(await cockpitMerge(args, deps)));
|
|
56
|
+
server.registerTool('cockpit_await_events', {
|
|
57
|
+
description: 'Long-poll for cockpit stream events (label changes, phase transitions, epic-complete). Returns a coalesced batch; caller re-arms with the returned cursor.',
|
|
58
|
+
inputSchema: AwaitEventsInputSchema,
|
|
59
|
+
}, async (args) => toCallToolResult(await cockpitAwaitEvents(args, deps)));
|
|
60
|
+
return server;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cockpit_advance` MCP tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `runAdvance` (which throws `CockpitExit` on refusal / parse error /
|
|
5
|
+
* transport failure). `wrapToolBoundary` maps thrown `CockpitExit` to a
|
|
6
|
+
* typed `ToolErrorResult` via the exit-code table.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent no-op (advance.ts:122-127): when `completed:<gate>` already
|
|
9
|
+
* present, `runAdvance` returns without throwing but writes a stdout line
|
|
10
|
+
* that starts with "already advanced". Represent this as
|
|
11
|
+
* `{status: "ok", data: {..., noop: true, action: "already-advanced"}}`.
|
|
12
|
+
*/
|
|
13
|
+
import type { CommandRunner, GhWrapper } from '@generacy-ai/cockpit';
|
|
14
|
+
import { type AdvanceCommandDeps } from '../../advance.js';
|
|
15
|
+
import { type ToolResult } from '../errors.js';
|
|
16
|
+
import { type IssueRefInput, type GateNameInput } from '../schemas.js';
|
|
17
|
+
export interface CockpitAdvanceInput {
|
|
18
|
+
issue: IssueRefInput;
|
|
19
|
+
gate: GateNameInput;
|
|
20
|
+
}
|
|
21
|
+
export interface CockpitAdvanceData {
|
|
22
|
+
ref: {
|
|
23
|
+
owner: string;
|
|
24
|
+
repo: string;
|
|
25
|
+
number: number;
|
|
26
|
+
nwo: string;
|
|
27
|
+
};
|
|
28
|
+
gate: string;
|
|
29
|
+
action: 'advanced' | 'already-advanced';
|
|
30
|
+
completedLabel: string;
|
|
31
|
+
commentUrl?: string;
|
|
32
|
+
noop?: true;
|
|
33
|
+
}
|
|
34
|
+
export interface CockpitAdvanceDeps {
|
|
35
|
+
runner?: CommandRunner;
|
|
36
|
+
gh?: GhWrapper;
|
|
37
|
+
loadConfig?: AdvanceCommandDeps['loadConfig'];
|
|
38
|
+
env?: NodeJS.ProcessEnv;
|
|
39
|
+
now?: () => Date;
|
|
40
|
+
}
|
|
41
|
+
export declare function cockpitAdvance(input: CockpitAdvanceInput, deps?: CockpitAdvanceDeps): Promise<ToolResult<CockpitAdvanceData>>;
|
|
42
|
+
//# sourceMappingURL=cockpit_advance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_advance.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_advance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,UAAU,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,EAC1B,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CA0EzC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { runAdvance } from '../../advance.js';
|
|
2
|
+
import { normalizeIssueRef } from '../ref-input.js';
|
|
3
|
+
import { GATES } from '../../gate-vocabulary.js';
|
|
4
|
+
import { wrapToolBoundary } from '../errors.js';
|
|
5
|
+
import { CockpitAdvanceInputSchema, } from '../schemas.js';
|
|
6
|
+
export function cockpitAdvance(input, deps = {}) {
|
|
7
|
+
return wrapToolBoundary(async () => {
|
|
8
|
+
const parsed = CockpitAdvanceInputSchema.safeParse(input);
|
|
9
|
+
if (!parsed.success) {
|
|
10
|
+
const detail = parsed.error.issues.map((i) => i.message).join('; ');
|
|
11
|
+
const cls = /Invalid enum value|invalid_enum_value/i.test(detail)
|
|
12
|
+
? 'unknown-gate'
|
|
13
|
+
: 'invalid-args';
|
|
14
|
+
return { status: 'error', class: cls, detail };
|
|
15
|
+
}
|
|
16
|
+
const normalized = await normalizeIssueRef(parsed.data.issue, {
|
|
17
|
+
expects: 'issue',
|
|
18
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
19
|
+
...(deps.gh != null ? { gh: deps.gh } : {}),
|
|
20
|
+
});
|
|
21
|
+
if (!normalized.ok)
|
|
22
|
+
return normalized.error;
|
|
23
|
+
const gateDef = GATES.get(parsed.data.gate);
|
|
24
|
+
if (!gateDef) {
|
|
25
|
+
return {
|
|
26
|
+
status: 'error',
|
|
27
|
+
class: 'unknown-gate',
|
|
28
|
+
detail: `unknown gate "${parsed.data.gate}"`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const captured = [];
|
|
32
|
+
const stderrLines = [];
|
|
33
|
+
const advanceDeps = {
|
|
34
|
+
gh: deps.gh ?? normalized.value.gh,
|
|
35
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
36
|
+
...(deps.loadConfig != null ? { loadConfig: deps.loadConfig } : {}),
|
|
37
|
+
...(deps.env != null ? { env: deps.env } : {}),
|
|
38
|
+
...(deps.now != null ? { now: deps.now } : {}),
|
|
39
|
+
stdout: (line) => captured.push(line),
|
|
40
|
+
stderr: (line) => stderrLines.push(line),
|
|
41
|
+
};
|
|
42
|
+
const issueArg = `${normalized.value.ref.nwo}#${normalized.value.ref.number}`;
|
|
43
|
+
await runAdvance(issueArg, { gate: parsed.data.gate }, advanceDeps);
|
|
44
|
+
const noop = captured.some((l) => l.startsWith('already advanced'));
|
|
45
|
+
if (noop) {
|
|
46
|
+
return {
|
|
47
|
+
status: 'ok',
|
|
48
|
+
data: {
|
|
49
|
+
ref: normalized.value.ref,
|
|
50
|
+
gate: gateDef.name,
|
|
51
|
+
action: 'already-advanced',
|
|
52
|
+
completedLabel: gateDef.completedLabel,
|
|
53
|
+
noop: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const commentMatch = captured
|
|
58
|
+
.map((l) => /\(comment: (https?:\/\/[^)]+)\)/.exec(l))
|
|
59
|
+
.find((m) => m != null);
|
|
60
|
+
const commentUrl = commentMatch ? commentMatch[1] : undefined;
|
|
61
|
+
return {
|
|
62
|
+
status: 'ok',
|
|
63
|
+
data: {
|
|
64
|
+
ref: normalized.value.ref,
|
|
65
|
+
gate: gateDef.name,
|
|
66
|
+
action: 'advanced',
|
|
67
|
+
completedLabel: gateDef.completedLabel,
|
|
68
|
+
...(commentUrl ? { commentUrl } : {}),
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=cockpit_advance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_advance.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_advance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cockpit_await_events` MCP tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Long-poll for cockpit stream events for a given epic. Cursor-based;
|
|
5
|
+
* coalesces bursts within `coalesceWindowMs`; soft-cap at `maxBatchSize`
|
|
6
|
+
* (returned cursor is the continuation).
|
|
7
|
+
*
|
|
8
|
+
* Cursor classes:
|
|
9
|
+
* - malformed / never-issued / wrong-epic → typed `invalid-cursor` error
|
|
10
|
+
* - expired → silent reset to head with `resetFrom: "expired"`
|
|
11
|
+
* - discarded → silent reset to head with `resetFrom: "discarded"`
|
|
12
|
+
* (nonce missing, cross-instance, or bus evicted)
|
|
13
|
+
* - valid → normal path
|
|
14
|
+
*/
|
|
15
|
+
import type { CommandRunner } from '@generacy-ai/cockpit';
|
|
16
|
+
import type { CockpitStreamEvent } from '../../watch/stream-event.js';
|
|
17
|
+
import { type ToolResult } from '../errors.js';
|
|
18
|
+
import { type Acquired } from '../event-bus-registry.js';
|
|
19
|
+
export interface CockpitAwaitEventsData {
|
|
20
|
+
events: CockpitStreamEvent[];
|
|
21
|
+
cursor: string;
|
|
22
|
+
resetFrom?: 'expired' | 'discarded';
|
|
23
|
+
}
|
|
24
|
+
export interface CockpitAwaitEventsDeps {
|
|
25
|
+
runner?: CommandRunner;
|
|
26
|
+
/**
|
|
27
|
+
* Test seam: provide a pre-built acquired bus. Bypasses the registry
|
|
28
|
+
* (poll loop not started). Handler will NOT call `release` on it.
|
|
29
|
+
*/
|
|
30
|
+
acquired?: Acquired;
|
|
31
|
+
intervalMs?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function cockpitAwaitEvents(input: unknown, deps?: CockpitAwaitEventsDeps): Promise<ToolResult<CockpitAwaitEventsData>>;
|
|
34
|
+
//# sourceMappingURL=cockpit_await_events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_await_events.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_await_events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGzE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAsC7C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { normalizeIssueRef } from '../ref-input.js';
|
|
2
|
+
import { wrapToolBoundary } from '../errors.js';
|
|
3
|
+
import { AwaitEventsInputSchema } from '../schemas.js';
|
|
4
|
+
import { acquireEpicBus } from '../event-bus-registry.js';
|
|
5
|
+
import { encodeCursor, INSTANCE_NONCE } from '../event-bus.js';
|
|
6
|
+
export function cockpitAwaitEvents(input, deps = {}) {
|
|
7
|
+
return wrapToolBoundary(async () => {
|
|
8
|
+
const parsed = AwaitEventsInputSchema.safeParse(input);
|
|
9
|
+
if (!parsed.success) {
|
|
10
|
+
return {
|
|
11
|
+
status: 'error',
|
|
12
|
+
class: 'invalid-args',
|
|
13
|
+
detail: parsed.error.issues.map((i) => i.message).join('; '),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const args = parsed.data;
|
|
17
|
+
let acquired;
|
|
18
|
+
let releaseAfter = true;
|
|
19
|
+
if (deps.acquired != null) {
|
|
20
|
+
acquired = deps.acquired;
|
|
21
|
+
releaseAfter = false;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const normalized = await normalizeIssueRef(args.epic, {
|
|
25
|
+
expects: 'issue',
|
|
26
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
27
|
+
});
|
|
28
|
+
if (!normalized.ok)
|
|
29
|
+
return normalized.error;
|
|
30
|
+
const epicRef = `${normalized.value.ref.nwo}#${normalized.value.ref.number}`;
|
|
31
|
+
acquired = await acquireEpicBus({
|
|
32
|
+
epicRef,
|
|
33
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
34
|
+
gh: normalized.value.gh,
|
|
35
|
+
...(deps.intervalMs != null ? { intervalMs: deps.intervalMs } : {}),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return await drainOrWait(acquired.bus, args);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
if (releaseAfter)
|
|
43
|
+
acquired.release();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function drainOrWait(bus, args) {
|
|
48
|
+
const parseResult = bus.parseCursor(args.cursor);
|
|
49
|
+
let resetFrom;
|
|
50
|
+
let sinceCursor;
|
|
51
|
+
switch (parseResult.kind) {
|
|
52
|
+
case 'malformed':
|
|
53
|
+
return {
|
|
54
|
+
status: 'error',
|
|
55
|
+
class: 'invalid-cursor',
|
|
56
|
+
detail: 'cursor is malformed (expected base64-encoded position)',
|
|
57
|
+
hint: 'cursor tokens are opaque; pass verbatim from a prior await_events result',
|
|
58
|
+
};
|
|
59
|
+
case 'never-issued':
|
|
60
|
+
return {
|
|
61
|
+
status: 'error',
|
|
62
|
+
class: 'invalid-cursor',
|
|
63
|
+
detail: `cursor position was never issued for epic ${bus.epic}`,
|
|
64
|
+
hint: 'start with cursor=undefined for a fresh subscription',
|
|
65
|
+
};
|
|
66
|
+
case 'wrong-epic':
|
|
67
|
+
return {
|
|
68
|
+
status: 'error',
|
|
69
|
+
class: 'invalid-cursor',
|
|
70
|
+
detail: `cursor was issued for epic ${parseResult.requestedEpic}, not ${parseResult.boundEpic}`,
|
|
71
|
+
};
|
|
72
|
+
case 'expired':
|
|
73
|
+
resetFrom = 'expired';
|
|
74
|
+
sinceCursor = 0;
|
|
75
|
+
break;
|
|
76
|
+
case 'discarded':
|
|
77
|
+
resetFrom = 'discarded';
|
|
78
|
+
sinceCursor = 0;
|
|
79
|
+
break;
|
|
80
|
+
case 'valid':
|
|
81
|
+
sinceCursor = parseResult.position;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
const result = await bus.waitFor({
|
|
85
|
+
sinceCursor,
|
|
86
|
+
maxWaitMs: args.maxWaitMs,
|
|
87
|
+
coalesceWindowMs: args.coalesceWindowMs,
|
|
88
|
+
maxBatchSize: args.maxBatchSize,
|
|
89
|
+
});
|
|
90
|
+
if (result.entries.length === 0) {
|
|
91
|
+
// When we reset (expired/discarded), always issue a fresh nonce-carrying
|
|
92
|
+
// cursor rather than echoing the caller's invalid token.
|
|
93
|
+
const cursorStr = resetFrom == null && args.cursor != null
|
|
94
|
+
? args.cursor
|
|
95
|
+
: encodeCursor(bus.epic, sinceCursor, INSTANCE_NONCE, bus.busNonce);
|
|
96
|
+
return {
|
|
97
|
+
status: 'ok',
|
|
98
|
+
data: {
|
|
99
|
+
events: [],
|
|
100
|
+
cursor: cursorStr,
|
|
101
|
+
...(resetFrom != null ? { resetFrom } : {}),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const last = result.entries[result.entries.length - 1];
|
|
106
|
+
return {
|
|
107
|
+
status: 'ok',
|
|
108
|
+
data: {
|
|
109
|
+
events: result.entries.map((e) => e.event),
|
|
110
|
+
cursor: encodeCursor(bus.epic, last.cursor, INSTANCE_NONCE, bus.busNonce),
|
|
111
|
+
...(resetFrom != null ? { resetFrom } : {}),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=cockpit_await_events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_await_events.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_await_events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cockpit_context` MCP tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `runContext` — the internal function already returns the bundle
|
|
5
|
+
* object directly (in addition to writing the JSON line to stdout). We
|
|
6
|
+
* capture stdout to keep it off the MCP transport but use the return value
|
|
7
|
+
* as `data`.
|
|
8
|
+
*/
|
|
9
|
+
import type { CommandRunner, GhWrapper } from '@generacy-ai/cockpit';
|
|
10
|
+
import { type ContextBundle } from '../../context.js';
|
|
11
|
+
import { type ToolResult } from '../errors.js';
|
|
12
|
+
import { type IssueRefInput } from '../schemas.js';
|
|
13
|
+
export interface CockpitContextInput {
|
|
14
|
+
issue: IssueRefInput;
|
|
15
|
+
}
|
|
16
|
+
export interface CockpitContextDeps {
|
|
17
|
+
runner?: CommandRunner;
|
|
18
|
+
gh?: GhWrapper;
|
|
19
|
+
}
|
|
20
|
+
export declare function cockpitContext(input: CockpitContextInput, deps?: CockpitContextDeps): Promise<ToolResult<ContextBundle>>;
|
|
21
|
+
//# sourceMappingURL=cockpit_context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_context.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,EAC1B,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CA+BpC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { runContext } from '../../context.js';
|
|
2
|
+
import { normalizeIssueRef } from '../ref-input.js';
|
|
3
|
+
import { wrapToolBoundary } from '../errors.js';
|
|
4
|
+
import { CockpitContextInputSchema, } from '../schemas.js';
|
|
5
|
+
export function cockpitContext(input, deps = {}) {
|
|
6
|
+
return wrapToolBoundary(async () => {
|
|
7
|
+
const parsed = CockpitContextInputSchema.safeParse(input);
|
|
8
|
+
if (!parsed.success) {
|
|
9
|
+
return {
|
|
10
|
+
status: 'error',
|
|
11
|
+
class: 'invalid-args',
|
|
12
|
+
detail: parsed.error.issues.map((i) => i.message).join('; '),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const normalized = await normalizeIssueRef(parsed.data.issue, {
|
|
16
|
+
expects: 'issue',
|
|
17
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
18
|
+
...(deps.gh != null ? { gh: deps.gh } : {}),
|
|
19
|
+
});
|
|
20
|
+
if (!normalized.ok)
|
|
21
|
+
return normalized.error;
|
|
22
|
+
const captured = [];
|
|
23
|
+
const stderrLines = [];
|
|
24
|
+
const contextDeps = {
|
|
25
|
+
gh: deps.gh ?? normalized.value.gh,
|
|
26
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
27
|
+
stdout: (line) => captured.push(line),
|
|
28
|
+
stderr: (line) => stderrLines.push(line),
|
|
29
|
+
};
|
|
30
|
+
const issueArg = `${normalized.value.ref.nwo}#${normalized.value.ref.number}`;
|
|
31
|
+
const bundle = await runContext(issueArg, contextDeps);
|
|
32
|
+
return { status: 'ok', data: bundle };
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cockpit_context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_context.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_context.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAA+C,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,cAAc,CAAC;AACjE,OAAO,EACL,yBAAyB,GAE1B,MAAM,eAAe,CAAC;AAWvB,MAAM,UAAU,cAAc,CAC5B,KAA0B,EAC1B,OAA2B,EAAE;IAE7B,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7D,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;YAC5D,OAAO,EAAE,OAAO;YAChB,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,EAAE;YAAE,OAAO,UAAU,CAAC,KAAK,CAAC;QAE5C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAuB;YACtC,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;YAClC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7C,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;SACjD,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cockpit_merge` MCP tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `runMerge` (or `runMergeWithExplicitPr` when `pr` is supplied). Takes
|
|
5
|
+
* an issue ref, resolves it to a linked PR, and squash-merges IFF the PR is
|
|
6
|
+
* green and the issue carries `completed:validate`. Fully symmetric with the
|
|
7
|
+
* CLI verb `cockpit merge <issue>` — the same contract on both transports.
|
|
8
|
+
*
|
|
9
|
+
* If the caller's `issue` resolves to a *PR* node (rather than an issue), the
|
|
10
|
+
* resolver returns `{ kind: 'pr-number' }` and the CLI emits exit-2 with
|
|
11
|
+
* `reason: 'pr-number'`. `toMcpResult` maps that to `class: 'wrong-kind'`
|
|
12
|
+
* with the guidance hint carried over verbatim.
|
|
13
|
+
*
|
|
14
|
+
* Optional `pr: <number>` mirrors the CLI's `--pr <number>` escape hatch:
|
|
15
|
+
* skips resolution but keeps every safety precondition (linkage verification,
|
|
16
|
+
* completed:validate, checks green). Never a resolution bypass of safety.
|
|
17
|
+
*/
|
|
18
|
+
import type { CommandRunner, GhWrapper } from '@generacy-ai/cockpit';
|
|
19
|
+
import { type ToolResult } from '../errors.js';
|
|
20
|
+
import { type IssueRefInput } from '../schemas.js';
|
|
21
|
+
export interface CockpitMergeInput {
|
|
22
|
+
issue: IssueRefInput;
|
|
23
|
+
pr?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface CockpitMergeData {
|
|
26
|
+
pr: {
|
|
27
|
+
owner: string;
|
|
28
|
+
repo: string;
|
|
29
|
+
number: number;
|
|
30
|
+
url: string;
|
|
31
|
+
};
|
|
32
|
+
action: 'merged' | 'blocked';
|
|
33
|
+
checksState: 'success' | 'failure' | 'pending' | 'none';
|
|
34
|
+
mergeCommitSha?: string;
|
|
35
|
+
reason?: string;
|
|
36
|
+
raw?: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface CockpitMergeDeps {
|
|
39
|
+
runner?: CommandRunner;
|
|
40
|
+
gh?: GhWrapper;
|
|
41
|
+
}
|
|
42
|
+
export declare function cockpitMerge(input: CockpitMergeInput, deps?: CockpitMergeDeps): Promise<ToolResult<CockpitMergeData>>;
|
|
43
|
+
//# sourceMappingURL=cockpit_merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_merge.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIrE,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAmFvC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { runMerge, runMergeWithExplicitPr } from '../../merge.js';
|
|
2
|
+
import { assertQualifiedString, normalizeIssueRef } from '../ref-input.js';
|
|
3
|
+
import { getLogger } from '../../../../utils/logger.js';
|
|
4
|
+
import { toMcpResult, wrapToolBoundary } from '../errors.js';
|
|
5
|
+
import { CockpitMergeInputSchema } from '../schemas.js';
|
|
6
|
+
export function cockpitMerge(input, deps = {}) {
|
|
7
|
+
return wrapToolBoundary(async () => {
|
|
8
|
+
const parsed = CockpitMergeInputSchema.safeParse(input);
|
|
9
|
+
if (!parsed.success) {
|
|
10
|
+
// Q5 → B: preserve the old-field-name redirection. If the caller sent
|
|
11
|
+
// a `pr` key whose value is NOT a positive integer (i.e. they meant
|
|
12
|
+
// the pre-#928 shape where `pr` carried the issue ref), surface the
|
|
13
|
+
// renamed-field guidance instead of Zod's raw unknown-key diagnosis.
|
|
14
|
+
if (isPrLikelyOldFieldName(input)) {
|
|
15
|
+
return {
|
|
16
|
+
status: 'error',
|
|
17
|
+
class: 'invalid-args',
|
|
18
|
+
detail: "the 'pr' field was renamed to 'issue'; pass the issue ref, not the PR number",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
status: 'error',
|
|
23
|
+
class: 'invalid-args',
|
|
24
|
+
detail: parsed.error.issues.map((i) => i.message).join('; '),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Q1 → A: bare strings on the MCP transport must be qualified refs.
|
|
28
|
+
if (typeof parsed.data.issue === 'string') {
|
|
29
|
+
const qualified = assertQualifiedString(parsed.data.issue);
|
|
30
|
+
if (!qualified.ok) {
|
|
31
|
+
return { status: 'error', class: 'invalid-args', detail: qualified.error };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const normalized = await normalizeIssueRef(parsed.data.issue, {
|
|
35
|
+
expects: 'issue',
|
|
36
|
+
...(deps.runner != null ? { runner: deps.runner } : {}),
|
|
37
|
+
...(deps.gh != null ? { gh: deps.gh } : {}),
|
|
38
|
+
});
|
|
39
|
+
if (!normalized.ok)
|
|
40
|
+
return normalized.error;
|
|
41
|
+
const logger = getLogger();
|
|
42
|
+
const nwo = normalized.value.ref.nwo;
|
|
43
|
+
const issueNumber = normalized.value.ref.number;
|
|
44
|
+
const gh = deps.gh ?? normalized.value.gh;
|
|
45
|
+
const result = parsed.data.pr != null
|
|
46
|
+
? await runMergeWithExplicitPr({
|
|
47
|
+
gh,
|
|
48
|
+
issue: issueNumber,
|
|
49
|
+
repo: nwo,
|
|
50
|
+
prNumber: parsed.data.pr,
|
|
51
|
+
logger,
|
|
52
|
+
})
|
|
53
|
+
: await runMerge({
|
|
54
|
+
gh,
|
|
55
|
+
issue: issueNumber,
|
|
56
|
+
repo: nwo,
|
|
57
|
+
logger,
|
|
58
|
+
});
|
|
59
|
+
// Successful merge → synthesize a MCP payload. The CLI emits either an
|
|
60
|
+
// empty stdout (no notes) or a note followed by a branch-deletion suffix
|
|
61
|
+
// on success — neither is JSON. `result.prNumber` carries the resolved
|
|
62
|
+
// PR (or the caller's explicit `--pr <n>`).
|
|
63
|
+
if (result.exitCode === 0) {
|
|
64
|
+
const prNumber = result.prNumber ?? parsed.data.pr ?? issueNumber;
|
|
65
|
+
const url = `https://github.com/${nwo}/pull/${prNumber}`;
|
|
66
|
+
return {
|
|
67
|
+
status: 'ok',
|
|
68
|
+
data: {
|
|
69
|
+
pr: {
|
|
70
|
+
owner: normalized.value.ref.owner,
|
|
71
|
+
repo: normalized.value.ref.repo,
|
|
72
|
+
number: prNumber,
|
|
73
|
+
url,
|
|
74
|
+
},
|
|
75
|
+
action: 'merged',
|
|
76
|
+
checksState: 'success',
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return toMcpResult(result.stdout, result.exitCode);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Detects the pre-#928 field shape: a `pr` key whose value is NOT a positive
|
|
85
|
+
* integer (i.e. either a string, object, or non-integer number). Used to
|
|
86
|
+
* emit the renamed-field guidance instead of Zod's default error.
|
|
87
|
+
*/
|
|
88
|
+
function isPrLikelyOldFieldName(raw) {
|
|
89
|
+
if (raw == null || typeof raw !== 'object')
|
|
90
|
+
return false;
|
|
91
|
+
const r = raw;
|
|
92
|
+
if (!('pr' in r))
|
|
93
|
+
return false;
|
|
94
|
+
const pr = r.pr;
|
|
95
|
+
if (typeof pr === 'number' && Number.isInteger(pr) && pr > 0)
|
|
96
|
+
return false;
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=cockpit_merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_merge.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cockpit_queue` MCP tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `runQueue` with the confirmation prompt short-circuited to `true`
|
|
5
|
+
* (agents don't type "y" — the whole point of the MCP transport is to
|
|
6
|
+
* eliminate that class of round). Returns the structured `queued`/`skipped`
|
|
7
|
+
* arrays derived from `QueueResult.rows`.
|
|
8
|
+
*/
|
|
9
|
+
import type { CommandRunner, GhWrapper } from '@generacy-ai/cockpit';
|
|
10
|
+
import { type QueueCommandDeps } from '../../queue.js';
|
|
11
|
+
import { type ToolResult } from '../errors.js';
|
|
12
|
+
import { type EpicRefInput } from '../schemas.js';
|
|
13
|
+
export interface CockpitQueueInput {
|
|
14
|
+
epic: EpicRefInput;
|
|
15
|
+
phase: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CockpitQueueData {
|
|
18
|
+
epic: {
|
|
19
|
+
owner: string;
|
|
20
|
+
repo: string;
|
|
21
|
+
number: number;
|
|
22
|
+
};
|
|
23
|
+
phase: string;
|
|
24
|
+
queued: Array<{
|
|
25
|
+
repo: string;
|
|
26
|
+
number: number;
|
|
27
|
+
url: string;
|
|
28
|
+
}>;
|
|
29
|
+
skipped: Array<{
|
|
30
|
+
repo: string;
|
|
31
|
+
number: number;
|
|
32
|
+
reason: string;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
export interface CockpitQueueDeps {
|
|
36
|
+
runner?: CommandRunner;
|
|
37
|
+
gh?: GhWrapper;
|
|
38
|
+
cockpitGh?: GhWrapper;
|
|
39
|
+
loadConfig?: QueueCommandDeps['loadConfig'];
|
|
40
|
+
fetchPlan?: QueueCommandDeps['fetchPlan'];
|
|
41
|
+
}
|
|
42
|
+
export declare function cockpitQueue(input: CockpitQueueInput, deps?: CockpitQueueDeps): Promise<ToolResult<CockpitQueueData>>;
|
|
43
|
+
//# sourceMappingURL=cockpit_queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit_queue.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAY,KAAK,gBAAgB,EAAoB,MAAM,gBAAgB,CAAC;AAEnF,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;CAC3C;AAkCD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAkDvC"}
|