@openora/mcp 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/LICENSE +661 -0
- package/README.md +60 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +515 -0
- package/dist/main.js.map +1 -0
- package/docs/catalog.json +486 -0
- package/package.json +45 -0
package/dist/main.js
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { dirname, join, parse } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const NOT_FOUND_MESSAGE = 'catalog.json not found - run `pnpm regen` in the platform repo, or set OSS_CATALOG to its path.';
|
|
10
|
+
function catalogCandidates() {
|
|
11
|
+
const candidates = [];
|
|
12
|
+
const override = process.env['OSS_CATALOG'];
|
|
13
|
+
if (override)
|
|
14
|
+
candidates.push(override);
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
candidates.push(join(cwd, 'docs', 'catalog.json'));
|
|
17
|
+
candidates.push(join(cwd, 'node_modules', '@openora', 'mcp', 'docs', 'catalog.json'));
|
|
18
|
+
let dir = cwd;
|
|
19
|
+
for (;;) {
|
|
20
|
+
candidates.push(join(dir, 'docs', 'catalog.json'));
|
|
21
|
+
const parent = parse(dir).dir;
|
|
22
|
+
if (!parent || parent === dir)
|
|
23
|
+
break;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
candidates.push(join(here, '..', 'docs', 'catalog.json'));
|
|
27
|
+
return candidates;
|
|
28
|
+
}
|
|
29
|
+
function loadCatalog() {
|
|
30
|
+
for (const candidate of catalogCandidates()) {
|
|
31
|
+
if (!candidate || !existsSync(candidate))
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const catalog = JSON.parse(readFileSync(candidate, 'utf8'));
|
|
35
|
+
return { catalog, path: candidate };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// corrupt file - keep probing
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function withCatalog(fn) {
|
|
44
|
+
return async () => {
|
|
45
|
+
const loaded = loadCatalog();
|
|
46
|
+
if (!loaded) {
|
|
47
|
+
return { content: [{ type: 'text', text: NOT_FOUND_MESSAGE }] };
|
|
48
|
+
}
|
|
49
|
+
return { content: [{ type: 'text', text: fn(loaded.catalog) }] };
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const server = new McpServer({
|
|
53
|
+
name: 'oss',
|
|
54
|
+
version: '0.1.0',
|
|
55
|
+
});
|
|
56
|
+
server.registerTool('catalog-overview', {
|
|
57
|
+
description: 'START HERE. A concise "what can I extend" summary of the OSS igaming platform you are consuming: counts of modules/events/slots/schemas, the adapter swap-seam table (category/interface/token/status), and the igaming-config fields. Read this first to orient before drilling into the other tools.',
|
|
58
|
+
inputSchema: {},
|
|
59
|
+
}, withCatalog((c) => {
|
|
60
|
+
const lines = ['=== OSS igaming platform catalog ==='];
|
|
61
|
+
lines.push(`modules: ${c.modules.length} adapters: ${c.adapters.length} events: ${c.events.length} ` +
|
|
62
|
+
`uiSlots: ${c.uiSlots.length} schemas: ${c.schemas.length} ` +
|
|
63
|
+
`httpRoutes: ${c.httpRoutes.length}`);
|
|
64
|
+
lines.push('\n--- Adapter seams (implement an interface, bind to the token) ---');
|
|
65
|
+
for (const a of c.adapters) {
|
|
66
|
+
lines.push(`- ${a.category}: ${a.interface} -> ${a.token} [${a.status}]`);
|
|
67
|
+
}
|
|
68
|
+
lines.push(`\n--- Config (${c.config.token}) ---`);
|
|
69
|
+
for (const f of c.config.fields) {
|
|
70
|
+
lines.push(`- ${f.key}${f.note ? `: ${f.note}` : ''}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push('\nNext: list-adapters | list-routes | list-events | list-slots | describe-module <name> | schema-get <name> | get-config-schema');
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}));
|
|
75
|
+
server.registerTool('list-adapters', {
|
|
76
|
+
description: 'List the vendor adapter swap-seams (PSP/KYC/game/aggregator/geo-ip/notification). For each: the interface to implement, the DI token to bind it to, whether it is already wired or a stub awaiting an implementation, and where it is bound. Use this to find the integration point for a third-party vendor.',
|
|
77
|
+
inputSchema: {},
|
|
78
|
+
}, withCatalog((c) => {
|
|
79
|
+
if (c.adapters.length === 0)
|
|
80
|
+
return 'No adapters in the catalog.';
|
|
81
|
+
const lines = ['=== Adapter seams ==='];
|
|
82
|
+
for (const a of c.adapters) {
|
|
83
|
+
lines.push(`\n${a.category} [${a.status}]`);
|
|
84
|
+
lines.push(` interface: ${a.interface}`);
|
|
85
|
+
lines.push(` token: ${a.token}`);
|
|
86
|
+
if (a.boundIn.length > 0)
|
|
87
|
+
lines.push(` boundIn: ${a.boundIn.join(', ')}`);
|
|
88
|
+
else
|
|
89
|
+
lines.push(' boundIn: (none - stub; bind your implementation to the token)');
|
|
90
|
+
}
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}));
|
|
93
|
+
server.registerTool('list-routes', {
|
|
94
|
+
description: 'List oRPC route namespaces exposed by the platform modules. Pass `module` to scope to a single module. Includes top-level httpRoutes when present.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
module: z.string().optional().describe('Module id to filter by (e.g. "wallet")'),
|
|
97
|
+
},
|
|
98
|
+
}, async ({ module: mod }) => {
|
|
99
|
+
const loaded = loadCatalog();
|
|
100
|
+
if (!loaded)
|
|
101
|
+
return { content: [{ type: 'text', text: NOT_FOUND_MESSAGE }] };
|
|
102
|
+
const c = loaded.catalog;
|
|
103
|
+
const modules = mod ? c.modules.filter((m) => m.id === mod) : c.modules;
|
|
104
|
+
if (mod && modules.length === 0) {
|
|
105
|
+
return {
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: 'text',
|
|
109
|
+
text: `Module "${mod}" not found. Run catalog-overview to see module ids.`,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const lines = [];
|
|
115
|
+
for (const m of modules) {
|
|
116
|
+
if (m.routes.length > 0) {
|
|
117
|
+
lines.push(`${m.id}:\n${m.routes.map((r) => ` ${r}`).join('\n')}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!mod && c.httpRoutes.length > 0) {
|
|
121
|
+
lines.push(`httpRoutes:\n${c.httpRoutes.map((r) => ` ${r}`).join('\n')}`);
|
|
122
|
+
}
|
|
123
|
+
const text = lines.join('\n\n') || 'No routes defined in the catalog yet.';
|
|
124
|
+
return { content: [{ type: 'text', text }] };
|
|
125
|
+
});
|
|
126
|
+
server.registerTool('list-events', {
|
|
127
|
+
description: 'List the cross-module domain events you can subscribe to (via ctx.events.on in a plugin) or that signal platform activity. Use this to find the event to hook into for side effects.',
|
|
128
|
+
inputSchema: {},
|
|
129
|
+
}, withCatalog((c) => {
|
|
130
|
+
if (c.events.length === 0)
|
|
131
|
+
return 'No events in the catalog.';
|
|
132
|
+
return `=== Domain events (${c.events.length}) ===\n${c.events.map((e) => `- ${e}`).join('\n')}`;
|
|
133
|
+
}));
|
|
134
|
+
server.registerTool('list-slots', {
|
|
135
|
+
description: 'List the named UI slots you can fill from a client-side UI plugin (ctx.<slot>.add(...)) to extend the backoffice without forking: nav items, table columns, dashboard tiles, detail sections. Includes each slot description and subject type.',
|
|
136
|
+
inputSchema: {},
|
|
137
|
+
}, withCatalog((c) => {
|
|
138
|
+
if (c.uiSlots.length === 0)
|
|
139
|
+
return 'No UI slots in the catalog.';
|
|
140
|
+
const lines = ['=== UI slots ==='];
|
|
141
|
+
for (const s of c.uiSlots) {
|
|
142
|
+
lines.push(`- ${s.name}${s.description ? ` # ${s.description}` : ''}`);
|
|
143
|
+
}
|
|
144
|
+
return lines.join('\n');
|
|
145
|
+
}));
|
|
146
|
+
server.registerTool('describe-module', {
|
|
147
|
+
description: "Describe one platform module from the catalog: its group (player/backoffice/platform), Drizzle tables, and oRPC routes. Use this to understand a module's surface before extending or integrating with it.",
|
|
148
|
+
inputSchema: { name: z.string().describe('Module id (e.g. "wallet", "gaming")') },
|
|
149
|
+
}, async ({ name }) => {
|
|
150
|
+
const loaded = loadCatalog();
|
|
151
|
+
if (!loaded)
|
|
152
|
+
return { content: [{ type: 'text', text: NOT_FOUND_MESSAGE }] };
|
|
153
|
+
const c = loaded.catalog;
|
|
154
|
+
const m = c.modules.find((x) => x.id === name);
|
|
155
|
+
if (!m) {
|
|
156
|
+
const ids = c.modules.map((x) => x.id).join(', ');
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: 'text',
|
|
161
|
+
text: `Module "${name}" not found.\n\nAvailable modules: ${ids}`,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const lines = [`=== Module: ${m.id} (${m.group}) ===`];
|
|
167
|
+
lines.push(`\n--- Tables ---\n${m.tables.length > 0 ? m.tables.map((t) => `- ${t}`).join('\n') : '(none)'}`);
|
|
168
|
+
lines.push(`\n--- Routes ---\n${m.routes.length > 0 ? m.routes.map((r) => `- ${r}`).join('\n') : '(none)'}`);
|
|
169
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
170
|
+
});
|
|
171
|
+
server.registerTool('schema-get', {
|
|
172
|
+
description: 'Locate a Zod contract schema by name and return the file that defines it. The actual shape is read from the package types you have installed; this tells you WHERE the schema lives so you can import it.',
|
|
173
|
+
inputSchema: {
|
|
174
|
+
name: z.string().describe('Schema name, e.g. "WalletBalance" or "WalletBalanceSchema"'),
|
|
175
|
+
},
|
|
176
|
+
}, async ({ name }) => {
|
|
177
|
+
const loaded = loadCatalog();
|
|
178
|
+
if (!loaded)
|
|
179
|
+
return { content: [{ type: 'text', text: NOT_FOUND_MESSAGE }] };
|
|
180
|
+
const c = loaded.catalog;
|
|
181
|
+
const candidates = name.endsWith('Schema') ? [name] : [`${name}Schema`, name];
|
|
182
|
+
const hit = c.schemas.find((s) => candidates.includes(s.name));
|
|
183
|
+
if (hit) {
|
|
184
|
+
return { content: [{ type: 'text', text: `${hit.name}\n${hit.file}` }] };
|
|
185
|
+
}
|
|
186
|
+
const list = c.schemas
|
|
187
|
+
.map((s) => s.name)
|
|
188
|
+
.sort()
|
|
189
|
+
.join(', ');
|
|
190
|
+
return {
|
|
191
|
+
content: [
|
|
192
|
+
{
|
|
193
|
+
type: 'text',
|
|
194
|
+
text: `Schema "${name}" not found.\n\nAvailable schemas:\n${list}`,
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
server.registerTool('get-config-schema', {
|
|
200
|
+
description: 'Return the igaming-config surface: the DI token, the source file that defines it, and each configurable field with its note. Use this to learn what a consumer can configure (branding, currencies, jurisdictions, enabled modules, limits, ...).',
|
|
201
|
+
inputSchema: {},
|
|
202
|
+
}, withCatalog((c) => {
|
|
203
|
+
const lines = ['=== Igaming config ==='];
|
|
204
|
+
lines.push(`token: ${c.config.token}`);
|
|
205
|
+
lines.push(`source: ${c.config.source}`);
|
|
206
|
+
lines.push('\n--- Fields ---');
|
|
207
|
+
for (const f of c.config.fields) {
|
|
208
|
+
lines.push(`- ${f.key}${f.note ? `: ${f.note}` : ''}`);
|
|
209
|
+
}
|
|
210
|
+
return lines.join('\n');
|
|
211
|
+
}));
|
|
212
|
+
function classifyIntent(ask) {
|
|
213
|
+
const a = ` ${ask.toLowerCase()} `;
|
|
214
|
+
const has = (re) => re.test(a);
|
|
215
|
+
if (has(/\b(payment|psp|stripe|adyen|kyc|onfido|sms|email|notification|vendor|adapter|gateway)\b/))
|
|
216
|
+
return 'adapter';
|
|
217
|
+
if (has(/\b(page|screen|dashboard|view|frontend|admin panel|backoffice page|player page)\b/))
|
|
218
|
+
return 'ui-page';
|
|
219
|
+
if (has(/\b(endpoint|route|procedure|api method|rpc)\b/))
|
|
220
|
+
return 'route';
|
|
221
|
+
if (has(/\b(feature|module|tournament|leaderboard|jackpot|loyalty|bonus|cashback|mission|reward)\b/))
|
|
222
|
+
return 'feature';
|
|
223
|
+
return 'unsure';
|
|
224
|
+
}
|
|
225
|
+
function buildConsumerPlaybook(kind, ctx) {
|
|
226
|
+
const moduleList = ctx.modules.length
|
|
227
|
+
? ctx.modules.map((m) => `- ${m}`).join('\n')
|
|
228
|
+
: '- (none yet)';
|
|
229
|
+
switch (kind) {
|
|
230
|
+
case 'feature':
|
|
231
|
+
return [
|
|
232
|
+
'## Where it goes',
|
|
233
|
+
'New behavior in a consumer repo -> an overlay plugin (`pnpm gen plugin`). It can add routes, subscribe to events, rebind adapters, and fill UI slots without touching OSS core.',
|
|
234
|
+
'If this is a new business domain that should be in the OSS platform itself, open an issue on the OSS repo instead.',
|
|
235
|
+
'',
|
|
236
|
+
'## Existing platform modules you can hook into',
|
|
237
|
+
moduleList,
|
|
238
|
+
'',
|
|
239
|
+
'## Playbook',
|
|
240
|
+
'1. Spawn the `expert` agent (Task tool) to turn this ask into requirements + acceptance criteria (player journey, jurisdiction rules, edge cases). Skip only for a trivial change.',
|
|
241
|
+
'2. Spawn the `builder` agent to implement: `pnpm gen plugin`, then in `register(ctx)` add routes (`ctx.routers.add`), subscribe to events (`ctx.events.on`), fill slots (`ctx.slots.fill`).',
|
|
242
|
+
'3. Register the plugin in `extensions.config.ts` at the repo root.',
|
|
243
|
+
'4. Spawn the `qa` agent to write/run a Playwright E2E test for the acceptance criteria.',
|
|
244
|
+
'5. Run `pnpm typecheck && pnpm lint`.',
|
|
245
|
+
'',
|
|
246
|
+
'## Agents',
|
|
247
|
+
'- `expert` - requirements + AC (advisory, no code)',
|
|
248
|
+
'- `builder` - implements the overlay',
|
|
249
|
+
'- `qa` - E2E test + bug triage (OSS-core vs overlay)',
|
|
250
|
+
].join('\n');
|
|
251
|
+
case 'adapter':
|
|
252
|
+
return [
|
|
253
|
+
'## Where it goes',
|
|
254
|
+
'Swap a vendor implementation by implementing the adapter interface and binding it to the DI token.',
|
|
255
|
+
'',
|
|
256
|
+
'## Available adapter tokens',
|
|
257
|
+
ctx.tokens.length
|
|
258
|
+
? ctx.tokens.map((t) => `- ${t}`).join('\n')
|
|
259
|
+
: '- (run list-adapters for details)',
|
|
260
|
+
'',
|
|
261
|
+
'## Playbook',
|
|
262
|
+
'1. If the adapter is compliance-sensitive (KYC/AML, PSP, geo), spawn the `expert` agent first to confirm jurisdiction requirements.',
|
|
263
|
+
'2. Spawn the `builder` agent to implement: `pnpm gen adapter` (prompts for name + token), implement the interface, bind it in the generated plugin.',
|
|
264
|
+
'3. Ensure the plugin is listed AFTER the module that owns the default binding in `extensions.config.ts` (last registration wins).',
|
|
265
|
+
'4. Run `pnpm typecheck && pnpm lint`.',
|
|
266
|
+
'',
|
|
267
|
+
'## Agents',
|
|
268
|
+
'- `expert` - jurisdiction/compliance requirements (advisory)',
|
|
269
|
+
'- `builder` - implements + binds the adapter',
|
|
270
|
+
].join('\n');
|
|
271
|
+
case 'ui-page':
|
|
272
|
+
return [
|
|
273
|
+
'## Where it goes',
|
|
274
|
+
'The platform is headless - pages live in your own frontend repo and consume the api via `@openora/core/react`. Fill named UI slots from a client-side UI plugin.',
|
|
275
|
+
'',
|
|
276
|
+
'## Named UI slots you can fill (via defineUIPlugin)',
|
|
277
|
+
ctx.slots.length
|
|
278
|
+
? ctx.slots.map((s) => `- ${s}`).join('\n')
|
|
279
|
+
: '- (run list-slots for details)',
|
|
280
|
+
'',
|
|
281
|
+
'## Playbook',
|
|
282
|
+
'1. Spawn the `builder` agent to implement the page in your frontend repo, or extend an existing surface via `defineUIPlugin` into a slot above.',
|
|
283
|
+
'2. Spawn the `qa` agent to verify the page renders and behaves in a browser.',
|
|
284
|
+
'3. Run `pnpm typecheck`.',
|
|
285
|
+
'',
|
|
286
|
+
'## Agents',
|
|
287
|
+
'- `builder` - mounts/extends the page',
|
|
288
|
+
'- `qa` - browser verification',
|
|
289
|
+
].join('\n');
|
|
290
|
+
case 'route':
|
|
291
|
+
return [
|
|
292
|
+
'## Where it goes',
|
|
293
|
+
'Add a route inside an overlay plugin - create one with `pnpm gen plugin`, then add the oRPC procedure in `register(ctx)` via `ctx.routers.add`.',
|
|
294
|
+
'',
|
|
295
|
+
'## Existing modules with routes',
|
|
296
|
+
moduleList,
|
|
297
|
+
'',
|
|
298
|
+
'## Playbook',
|
|
299
|
+
'1. Spawn the `builder` agent to implement: `pnpm gen plugin` if no overlay exists, then add the oRPC route in `register(ctx)`. Admin routes must assert AdminGuard first.',
|
|
300
|
+
'2. Run `pnpm typecheck && pnpm lint`.',
|
|
301
|
+
'',
|
|
302
|
+
'## Agents',
|
|
303
|
+
'- `builder` - implements the route',
|
|
304
|
+
].join('\n');
|
|
305
|
+
default:
|
|
306
|
+
return [
|
|
307
|
+
'## Not sure yet',
|
|
308
|
+
'Spawn the `expert` agent to frame the ask in domain terms, or ask one clarifying question to map it to: feature (overlay plugin), adapter (vendor swap), ui-page, or route. Then re-call `enhance-intent` with the chosen kind.',
|
|
309
|
+
'',
|
|
310
|
+
'## Platform surface',
|
|
311
|
+
`Modules: ${ctx.modules.join(', ') || '(none)'}`,
|
|
312
|
+
`Adapter tokens: ${ctx.tokens.join(', ') || '(none)'}`,
|
|
313
|
+
'',
|
|
314
|
+
'## Agents available in this repo',
|
|
315
|
+
'- `expert` - domain/product requirements (advisory)',
|
|
316
|
+
'- `builder` - fullstack implementation',
|
|
317
|
+
'- `qa` - E2E testing',
|
|
318
|
+
].join('\n');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
function runShell(cmd) {
|
|
322
|
+
try {
|
|
323
|
+
const output = execSync(cmd, { encoding: 'utf8', stdio: 'pipe', timeout: 120_000 });
|
|
324
|
+
return { ok: true, output };
|
|
325
|
+
}
|
|
326
|
+
catch (e) {
|
|
327
|
+
const err = e;
|
|
328
|
+
return {
|
|
329
|
+
ok: false,
|
|
330
|
+
output: (err.stdout?.toString() ?? '') + (err.stderr?.toString() ?? '') + err.message,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const REQUIREMENTS_INTERVIEW = [
|
|
335
|
+
'Interview the user with AskUserQuestion in small batches (2-4 questions at a time). Adapt to their answers, dig into anything vague, and keep going until you could hand a stranger a spec they could build from. Cover what applies - skip what does not:',
|
|
336
|
+
'',
|
|
337
|
+
'- Goal: what player or operator problem does this solve? what is the desired outcome?',
|
|
338
|
+
'- Actors: who uses it - players, backoffice admins, affiliates, support?',
|
|
339
|
+
'- Trigger: when/how does it start - user action, schedule, event, deposit, game round?',
|
|
340
|
+
'- Data: what does it track? what entities/records/fields?',
|
|
341
|
+
'- Value flow: does it move money, bonus credits, points, or free spins? which currency? get the exact amounts/rates.',
|
|
342
|
+
'- Rules: eligibility, limits, caps, wagering requirements, cooldowns, expiry?',
|
|
343
|
+
'- Lifecycle: what states does the entity move through (eg pending -> active -> settled -> expired)?',
|
|
344
|
+
'- Compliance: any regulatory or responsible-gaming angle? which jurisdictions/markets?',
|
|
345
|
+
'- UI: player-facing, backoffice, or both? what does each audience see and do?',
|
|
346
|
+
'- Edge cases: failure, partial completion, concurrency, refunds/reversals, abuse?',
|
|
347
|
+
'- Success criteria: how will the user know it works? what must be true?',
|
|
348
|
+
'- Out of scope: what is explicitly NOT part of this?',
|
|
349
|
+
'',
|
|
350
|
+
'Then summarize the requirements back to the user as a short structured list and get an explicit yes before any building starts.',
|
|
351
|
+
].join('\n');
|
|
352
|
+
server.registerTool('enhance-intent', {
|
|
353
|
+
description: 'Turn a fuzzy "I want to build X" ask into a grounded, consumer-context brief. Uses the platform catalog (live module/adapter/slot list) to return a classified intent, a requirements checklist to collect from the user, a step-by-step playbook using the consumer pnpm gen commands, and an acceptance-criteria stub.',
|
|
354
|
+
inputSchema: {
|
|
355
|
+
ask: z
|
|
356
|
+
.string()
|
|
357
|
+
.describe("The user's raw request, eg 'add a VIP loyalty tier with point tracking'"),
|
|
358
|
+
kind: z
|
|
359
|
+
.enum(['feature', 'adapter', 'ui-page', 'route', 'unsure'])
|
|
360
|
+
.optional()
|
|
361
|
+
.describe('Override auto-classification if you already know the kind.'),
|
|
362
|
+
},
|
|
363
|
+
}, async ({ ask, kind }) => {
|
|
364
|
+
const loaded = loadCatalog();
|
|
365
|
+
const catalog = loaded?.catalog;
|
|
366
|
+
const resolved = kind && kind !== 'unsure' ? kind : classifyIntent(ask);
|
|
367
|
+
const ctx = {
|
|
368
|
+
modules: catalog?.modules.map((m) => `${m.group}/${m.id}`) ?? [],
|
|
369
|
+
tokens: catalog?.adapters.map((a) => a.token) ?? [],
|
|
370
|
+
slots: catalog?.uiSlots.map((s) => s.name) ?? [],
|
|
371
|
+
};
|
|
372
|
+
const detected = kind && kind !== 'unsure' ? '' : ' (auto-detected)';
|
|
373
|
+
const text = [
|
|
374
|
+
'# Enhanced brief',
|
|
375
|
+
'',
|
|
376
|
+
'## Restated intent',
|
|
377
|
+
`> ${ask.trim()}`,
|
|
378
|
+
'',
|
|
379
|
+
`## Classification: ${resolved}${detected}`,
|
|
380
|
+
'',
|
|
381
|
+
'## Requirements - collect these from the user FIRST (if not already gathered)',
|
|
382
|
+
'A one-line ask is a starting point, not a spec. Your main job is to gather thorough requirements; the agents do the rest.',
|
|
383
|
+
'',
|
|
384
|
+
REQUIREMENTS_INTERVIEW,
|
|
385
|
+
'',
|
|
386
|
+
buildConsumerPlaybook(resolved, ctx),
|
|
387
|
+
'',
|
|
388
|
+
'## Acceptance criteria (derive from the requirements above)',
|
|
389
|
+
'- [ ] Happy path works end to end',
|
|
390
|
+
'- [ ] Edge cases handled',
|
|
391
|
+
'- [ ] `pnpm typecheck && pnpm lint` is green',
|
|
392
|
+
].join('\n');
|
|
393
|
+
return { content: [{ type: 'text', text }] };
|
|
394
|
+
});
|
|
395
|
+
server.registerTool('start', {
|
|
396
|
+
description: 'Onboarding entry point. Call when the user opens Claude Code in a fresh consumer repo, says "start", "help me build X", or asks what they can do. Returns a structured onboarding script to follow: questions to ask, options to present, what to do with answers.',
|
|
397
|
+
inputSchema: {
|
|
398
|
+
ask: z
|
|
399
|
+
.string()
|
|
400
|
+
.optional()
|
|
401
|
+
.describe("Pass the user's raw ask if already known. Omit to get the full interactive flow."),
|
|
402
|
+
},
|
|
403
|
+
}, async ({ ask }) => {
|
|
404
|
+
const loaded = loadCatalog();
|
|
405
|
+
const catalog = loaded?.catalog;
|
|
406
|
+
const modules = catalog?.modules.map((m) => `${m.group}/${m.id}`) ?? [];
|
|
407
|
+
const tokens = catalog?.adapters.map((a) => a.token) ?? [];
|
|
408
|
+
const role = [
|
|
409
|
+
'## Your role',
|
|
410
|
+
'You are a requirements interviewer and orchestrator, NOT the implementer. Your one human-facing job is to collect thorough requirements from the user. Everything after that - scaffolding, code, tests - you delegate to the agents (`expert`, `builder`, `qa`) via the Task tool. Keep the user out of the loop after requirements are confirmed, except to resolve genuine decisions only they can make.',
|
|
411
|
+
].join('\n');
|
|
412
|
+
if (ask) {
|
|
413
|
+
const resolved = classifyIntent(ask);
|
|
414
|
+
const playbook = buildConsumerPlaybook(resolved, {
|
|
415
|
+
modules,
|
|
416
|
+
tokens,
|
|
417
|
+
slots: catalog?.uiSlots.map((s) => s.name) ?? [],
|
|
418
|
+
});
|
|
419
|
+
return {
|
|
420
|
+
content: [
|
|
421
|
+
{
|
|
422
|
+
type: 'text',
|
|
423
|
+
text: [
|
|
424
|
+
'# Onboarding',
|
|
425
|
+
`The user opened with: **${ask}** (looks like: ${resolved})`,
|
|
426
|
+
'',
|
|
427
|
+
role,
|
|
428
|
+
'',
|
|
429
|
+
'## Step 1: gather requirements (the important part)',
|
|
430
|
+
'That opening line is a starting point, not a spec. Interview the user now:',
|
|
431
|
+
'',
|
|
432
|
+
REQUIREMENTS_INTERVIEW,
|
|
433
|
+
'',
|
|
434
|
+
'## Step 2: delegate everything',
|
|
435
|
+
'Once requirements are confirmed, call `enhance-intent` (ask = the confirmed requirements summary, kind = the detected kind), then follow its playbook - which hands the work to the agents. Do not implement directly.',
|
|
436
|
+
'',
|
|
437
|
+
playbook,
|
|
438
|
+
].join('\n'),
|
|
439
|
+
},
|
|
440
|
+
],
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
content: [
|
|
445
|
+
{
|
|
446
|
+
type: 'text',
|
|
447
|
+
text: [
|
|
448
|
+
'# Onboarding - follow this script',
|
|
449
|
+
'',
|
|
450
|
+
role,
|
|
451
|
+
'',
|
|
452
|
+
'## Step 1: high-level intent (AskUserQuestion, single-select)',
|
|
453
|
+
'Present AT MOST 4 options - AskUserQuestion rejects more, and it auto-adds an "Other" for anything else. This only routes the playbook, so keep it light:',
|
|
454
|
+
'Question: "What do you want to build?"',
|
|
455
|
+
'- New feature or behavior (bonus, campaign, player flow) -> kind: feature',
|
|
456
|
+
'- Swap a vendor adapter (payment / KYC / notifications) -> kind: adapter',
|
|
457
|
+
'- Add a UI page (player or backoffice) -> kind: ui-page',
|
|
458
|
+
'- Explore / not sure -> kind: unsure',
|
|
459
|
+
'A one-off API route or anything else: map the free-text answer to the closest kind (route -> feature, or unsure); enhance-intent will refine it.',
|
|
460
|
+
'',
|
|
461
|
+
'## Step 2: requirements interview (spend most of your effort here)',
|
|
462
|
+
REQUIREMENTS_INTERVIEW,
|
|
463
|
+
'',
|
|
464
|
+
'## Step 3: delegate everything',
|
|
465
|
+
'Call `enhance-intent` (ask = the confirmed requirements summary, kind = step 1). Then follow its playbook, which delegates to the agents:',
|
|
466
|
+
'- `expert` formalizes requirements + acceptance criteria (and may surface gaps - if so, ask the user those, then continue).',
|
|
467
|
+
'- `builder` implements (`pnpm gen ...`, code).',
|
|
468
|
+
'- `qa` writes/runs the E2E test.',
|
|
469
|
+
'You orchestrate; you do not write feature code yourself.',
|
|
470
|
+
'',
|
|
471
|
+
`Platform modules: ${modules.join(', ') || '(catalog not loaded - run pnpm build:oss first)'}`,
|
|
472
|
+
].join('\n'),
|
|
473
|
+
},
|
|
474
|
+
],
|
|
475
|
+
};
|
|
476
|
+
});
|
|
477
|
+
server.registerTool('dev:infra', {
|
|
478
|
+
description: 'Start / stop / status local dev infrastructure via docker compose (postgres on :5432). Call before pnpm db:migrate or pnpm dev when the database is not reachable.',
|
|
479
|
+
inputSchema: {
|
|
480
|
+
action: z
|
|
481
|
+
.enum(['up', 'down', 'status'])
|
|
482
|
+
.optional()
|
|
483
|
+
.describe('up (default): start containers. down: stop and remove. status: show running containers.'),
|
|
484
|
+
},
|
|
485
|
+
}, async ({ action = 'up' }) => {
|
|
486
|
+
if (action === 'status') {
|
|
487
|
+
const r = runShell('docker compose ps');
|
|
488
|
+
return { content: [{ type: 'text', text: r.output || '(no output)' }] };
|
|
489
|
+
}
|
|
490
|
+
if (action === 'down') {
|
|
491
|
+
const r = runShell('docker compose down');
|
|
492
|
+
return { content: [{ type: 'text', text: r.ok ? 'Stopped.' : r.output }] };
|
|
493
|
+
}
|
|
494
|
+
const up = runShell('docker compose up -d');
|
|
495
|
+
if (!up.ok)
|
|
496
|
+
return {
|
|
497
|
+
content: [{ type: 'text', text: `docker compose up failed:\n${up.output}` }],
|
|
498
|
+
};
|
|
499
|
+
const deadline = Date.now() + 30_000;
|
|
500
|
+
let ready = false;
|
|
501
|
+
while (Date.now() < deadline) {
|
|
502
|
+
if (runShell('docker compose exec -T postgres pg_isready -U postgres').ok) {
|
|
503
|
+
ready = true;
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
await new Promise((r) => setTimeout(r, 1_500));
|
|
507
|
+
}
|
|
508
|
+
const text = ready
|
|
509
|
+
? 'Postgres is ready on :5432.\n\nNext: pnpm db:migrate then pnpm dev.'
|
|
510
|
+
: 'Containers started but postgres did not become ready within 30s.\nRun `docker compose logs postgres` to investigate.';
|
|
511
|
+
return { content: [{ type: 'text', text: text }] };
|
|
512
|
+
});
|
|
513
|
+
const transport = new StdioServerTransport();
|
|
514
|
+
await server.connect(transport);
|
|
515
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|