@mr.dj2u/cli 0.1.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.
Files changed (50) hide show
  1. package/dist/cli.d.ts +12 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +475 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/agent.d.ts +41 -0
  6. package/dist/commands/agent.d.ts.map +1 -0
  7. package/dist/commands/agent.js +661 -0
  8. package/dist/commands/agent.js.map +1 -0
  9. package/dist/commands/continue.d.ts +59 -0
  10. package/dist/commands/continue.d.ts.map +1 -0
  11. package/dist/commands/continue.js +336 -0
  12. package/dist/commands/continue.js.map +1 -0
  13. package/dist/commands/dev-tools.d.ts +14 -0
  14. package/dist/commands/dev-tools.d.ts.map +1 -0
  15. package/dist/commands/dev-tools.js +283 -0
  16. package/dist/commands/dev-tools.js.map +1 -0
  17. package/dist/commands/explain.d.ts +29 -0
  18. package/dist/commands/explain.d.ts.map +1 -0
  19. package/dist/commands/explain.js +216 -0
  20. package/dist/commands/explain.js.map +1 -0
  21. package/dist/commands/mcp-install.d.ts +28 -0
  22. package/dist/commands/mcp-install.d.ts.map +1 -0
  23. package/dist/commands/mcp-install.js +265 -0
  24. package/dist/commands/mcp-install.js.map +1 -0
  25. package/dist/commands/onboard.d.ts +71 -0
  26. package/dist/commands/onboard.d.ts.map +1 -0
  27. package/dist/commands/onboard.js +552 -0
  28. package/dist/commands/onboard.js.map +1 -0
  29. package/dist/commands/report.d.ts +12 -0
  30. package/dist/commands/report.d.ts.map +1 -0
  31. package/dist/commands/report.js +70 -0
  32. package/dist/commands/report.js.map +1 -0
  33. package/dist/commands/skills.d.ts +19 -0
  34. package/dist/commands/skills.d.ts.map +1 -0
  35. package/dist/commands/skills.js +81 -0
  36. package/dist/commands/skills.js.map +1 -0
  37. package/dist/commands/test-and-iterate.d.ts +9 -0
  38. package/dist/commands/test-and-iterate.d.ts.map +1 -0
  39. package/dist/commands/test-and-iterate.js +90 -0
  40. package/dist/commands/test-and-iterate.js.map +1 -0
  41. package/dist/continue.d.ts +3 -0
  42. package/dist/continue.d.ts.map +1 -0
  43. package/dist/continue.js +2 -0
  44. package/dist/continue.js.map +1 -0
  45. package/dist/project-memory.d.ts +58 -0
  46. package/dist/project-memory.d.ts.map +1 -0
  47. package/dist/project-memory.js +2161 -0
  48. package/dist/project-memory.js.map +1 -0
  49. package/package.json +64 -0
  50. package/templates/project/guidelines.md +88 -0
@@ -0,0 +1,283 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { rm, readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import chalk from 'chalk';
6
+ const execFileAsync = promisify(execFile);
7
+ export async function runKillPortCommand(argv) {
8
+ const ports = normalizePorts([...(argv.ports ?? []), ...(argv.port ?? [])], [8081]);
9
+ const killed = await killPorts(ports);
10
+ console.log(chalk.bold('mds free-port'));
11
+ for (const port of ports) {
12
+ const entries = killed.get(port) ?? [];
13
+ if (entries.length === 0) {
14
+ console.log(chalk.gray(`port ${port}: no listening process found`));
15
+ }
16
+ else {
17
+ console.log(chalk.green(`port ${port}: killed ${formatKilledEntries(entries)}`));
18
+ }
19
+ }
20
+ }
21
+ export async function runClearExpoStartCommand(argv) {
22
+ const projectPath = path.resolve(argv.path ?? '.');
23
+ const autoPorts = await shouldIncludeServerPort(projectPath) ? [8081, 3000] : [8081];
24
+ const ports = normalizePorts(argv.ports ? argv.ports.split(',') : [], autoPorts);
25
+ console.log(chalk.bold('mds clear-expo-start'));
26
+ console.log(chalk.dim(projectPath));
27
+ console.log();
28
+ const killed = await killPorts(ports);
29
+ for (const port of ports) {
30
+ const entries = killed.get(port) ?? [];
31
+ console.log(entries.length > 0
32
+ ? chalk.green(`port ${port}: killed ${formatKilledEntries(entries)}`)
33
+ : chalk.gray(`port ${port}: no listening process found`));
34
+ }
35
+ await clearExpoCaches(projectPath);
36
+ console.log(chalk.green('Expo/Metro project caches cleared.'));
37
+ if (argv.start === false) {
38
+ console.log(chalk.gray('Skipping Expo start because --no-start was passed.'));
39
+ return;
40
+ }
41
+ const command = buildExpoStartCommand(await detectPackageManager(projectPath));
42
+ console.log(chalk.cyan(`Starting: ${command}`));
43
+ await runInheritedShellCommand(command, projectPath);
44
+ }
45
+ async function killPorts(ports) {
46
+ const results = new Map();
47
+ for (const port of ports) {
48
+ const pids = await findPidsForPort(port);
49
+ const killed = [];
50
+ for (const pid of pids) {
51
+ const name = await getProcessName(pid);
52
+ if (await killPid(pid)) {
53
+ killed.push({ pid, name });
54
+ }
55
+ }
56
+ results.set(port, killed);
57
+ }
58
+ return results;
59
+ }
60
+ function formatKilledEntries(entries) {
61
+ return entries.map(({ pid, name }) => (name ? `${pid} (${name})` : String(pid))).join(', ');
62
+ }
63
+ function normalizePorts(values, fallback) {
64
+ const ports = values
65
+ .flatMap((value) => String(value).split(','))
66
+ .map((value) => Number.parseInt(value.trim(), 10))
67
+ .filter((value) => Number.isInteger(value) && value > 0 && value < 65536);
68
+ return Array.from(new Set(ports.length > 0 ? ports : fallback));
69
+ }
70
+ async function findPidsForPort(port) {
71
+ if (process.platform === 'win32') {
72
+ return findWindowsPidsForPort(port);
73
+ }
74
+ try {
75
+ const { stdout } = await execFileAsync('lsof', ['-ti', `tcp:${port}`], {
76
+ windowsHide: true,
77
+ });
78
+ return stdout
79
+ .split(/\r?\n/)
80
+ .map((line) => Number.parseInt(line.trim(), 10))
81
+ .filter((pid) => Number.isInteger(pid) && pid > 0);
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ }
87
+ async function findWindowsPidsForPort(port) {
88
+ const powershellPids = await findWindowsPidsForPortWithPowerShell(port);
89
+ if (powershellPids.length > 0) {
90
+ return powershellPids;
91
+ }
92
+ try {
93
+ const { stdout } = await execFileAsync('netstat', ['-ano', '-p', 'tcp'], {
94
+ windowsHide: true,
95
+ });
96
+ return parseWindowsNetstatPids(stdout, port);
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ async function findWindowsPidsForPortWithPowerShell(port) {
103
+ try {
104
+ const script = [
105
+ '$ErrorActionPreference = "SilentlyContinue"',
106
+ `Get-NetTCPConnection -LocalPort ${port}`,
107
+ ' | Where-Object { $_.State -eq "Listen" -and $_.OwningProcess -gt 0 }',
108
+ ' | Select-Object -ExpandProperty OwningProcess -Unique',
109
+ ].join(' ');
110
+ const { stdout } = await execFileAsync('powershell.exe', ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-Command', script], { windowsHide: true });
111
+ return parsePidLines(stdout);
112
+ }
113
+ catch {
114
+ return [];
115
+ }
116
+ }
117
+ export function parseWindowsNetstatPids(stdout, port) {
118
+ const pids = new Set();
119
+ for (const line of stdout.split(/\r?\n/)) {
120
+ const normalized = line.trim().replace(/\s+/g, ' ');
121
+ const parts = normalized.split(' ');
122
+ if (parts.length < 5 || parts[0] !== 'TCP') {
123
+ continue;
124
+ }
125
+ const localAddress = parts[1] ?? '';
126
+ const state = parts[3] ?? '';
127
+ const pid = Number.parseInt(parts[4] ?? '', 10);
128
+ if (state === 'LISTENING' && localAddress.endsWith(`:${port}`) && Number.isInteger(pid) && pid > 0) {
129
+ pids.add(pid);
130
+ }
131
+ }
132
+ return [...pids];
133
+ }
134
+ export function parsePidLines(stdout) {
135
+ return Array.from(new Set(stdout
136
+ .split(/\r?\n/)
137
+ .map((line) => Number.parseInt(line.trim(), 10))
138
+ .filter((pid) => Number.isInteger(pid) && pid > 0)));
139
+ }
140
+ async function getProcessName(pid) {
141
+ try {
142
+ if (process.platform === 'win32') {
143
+ const { stdout } = await execFileAsync('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], {
144
+ windowsHide: true,
145
+ });
146
+ const match = stdout.match(/^"([^"]+)"/);
147
+ return match?.[1];
148
+ }
149
+ const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'comm='], {
150
+ windowsHide: true,
151
+ });
152
+ const trimmed = stdout.trim();
153
+ return trimmed || undefined;
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ }
159
+ async function killPid(pid) {
160
+ try {
161
+ if (process.platform === 'win32') {
162
+ await execFileAsync('taskkill', ['/PID', String(pid), '/F'], { windowsHide: true });
163
+ }
164
+ else {
165
+ process.kill(pid, 'SIGKILL');
166
+ }
167
+ return true;
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ async function clearExpoCaches(projectPath) {
174
+ const projectCachePaths = [
175
+ '.expo',
176
+ '.cache',
177
+ path.join('node_modules', '.cache', 'metro'),
178
+ path.join('node_modules', '.cache', 'babel-loader'),
179
+ ].map((p) => path.join(projectPath, p));
180
+ // Windows system-level Metro cache (mirrors core-monorepo clear-metro-cache.cjs)
181
+ const systemCachePaths = [];
182
+ if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
183
+ systemCachePaths.push(path.join(process.env.LOCALAPPDATA, 'Temp', 'metro-cache'));
184
+ }
185
+ await Promise.all([...projectCachePaths, ...systemCachePaths].map((p) => rm(p, { recursive: true, force: true })));
186
+ }
187
+ async function shouldIncludeServerPort(projectPath) {
188
+ const packageJson = await readJson(path.join(projectPath, 'package.json'));
189
+ const scripts = isRecord(packageJson?.scripts) ? packageJson.scripts : {};
190
+ const hasServerScript = Object.keys(scripts).some((name) => ['server', 'serve', 'web:server', 'dev:server', 'api'].includes(name));
191
+ if (hasServerScript) {
192
+ return true;
193
+ }
194
+ const appJson = await readJson(path.join(projectPath, 'app.json'));
195
+ const output = readNestedString(appJson, ['expo', 'web', 'output']);
196
+ return output === 'server';
197
+ }
198
+ async function detectPackageManager(projectPath) {
199
+ const packageJson = await readJson(path.join(projectPath, 'package.json'));
200
+ const declared = readString(packageJson?.packageManager);
201
+ if (declared?.startsWith('pnpm@'))
202
+ return 'pnpm';
203
+ if (declared?.startsWith('yarn@'))
204
+ return 'yarn';
205
+ if (declared?.startsWith('bun@'))
206
+ return 'bun';
207
+ if (await fileExists(path.join(projectPath, 'pnpm-lock.yaml')))
208
+ return 'pnpm';
209
+ if (await fileExists(path.join(projectPath, 'yarn.lock')))
210
+ return 'yarn';
211
+ if (await fileExists(path.join(projectPath, 'bun.lockb')) || await fileExists(path.join(projectPath, 'bun.lock'))) {
212
+ return 'bun';
213
+ }
214
+ return 'npm';
215
+ }
216
+ function buildExpoStartCommand(packageManager) {
217
+ switch (packageManager) {
218
+ case 'pnpm':
219
+ return 'pnpm exec expo start --clear';
220
+ case 'yarn':
221
+ return 'yarn expo start --clear';
222
+ case 'bun':
223
+ return 'bunx expo start --clear';
224
+ case 'npm':
225
+ return 'npx expo start --clear';
226
+ }
227
+ }
228
+ async function runInheritedShellCommand(command, cwd) {
229
+ const { spawn } = await import('node:child_process');
230
+ await new Promise((resolve, reject) => {
231
+ const child = spawn(command, {
232
+ cwd,
233
+ shell: true,
234
+ stdio: 'inherit',
235
+ windowsHide: true,
236
+ });
237
+ child.on('error', reject);
238
+ child.on('close', (code) => {
239
+ if (code === 0) {
240
+ resolve();
241
+ }
242
+ else {
243
+ reject(new Error(`${command} exited with code ${code ?? 'unknown'}.`));
244
+ }
245
+ });
246
+ });
247
+ }
248
+ async function readJson(filePath) {
249
+ try {
250
+ const raw = await readFile(filePath, 'utf8');
251
+ const parsed = JSON.parse(raw);
252
+ return isRecord(parsed) ? parsed : null;
253
+ }
254
+ catch {
255
+ return null;
256
+ }
257
+ }
258
+ async function fileExists(filePath) {
259
+ try {
260
+ await readFile(filePath, 'utf8');
261
+ return true;
262
+ }
263
+ catch {
264
+ return false;
265
+ }
266
+ }
267
+ function readNestedString(value, keys) {
268
+ let current = value;
269
+ for (const key of keys) {
270
+ if (!isRecord(current)) {
271
+ return undefined;
272
+ }
273
+ current = current[key];
274
+ }
275
+ return readString(current);
276
+ }
277
+ function readString(value) {
278
+ return typeof value === 'string' ? value : undefined;
279
+ }
280
+ function isRecord(value) {
281
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
282
+ }
283
+ //# sourceMappingURL=dev-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-tools.js","sourceRoot":"","sources":["../../src/commands/dev-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface ExplainArgv {
2
+ topic?: string;
3
+ json?: boolean;
4
+ }
5
+ export type ExplainMatch = {
6
+ type: 'doctor';
7
+ id: string;
8
+ name: string;
9
+ description: string;
10
+ nextStep: string;
11
+ relatedResources: string[];
12
+ } | {
13
+ type: 'knowledge';
14
+ id: string;
15
+ name: string;
16
+ description: string;
17
+ uri: string;
18
+ kind: string;
19
+ keywords: string[];
20
+ excerpt: string;
21
+ };
22
+ export interface ExplainResult {
23
+ query: string;
24
+ status: 'found' | 'ambiguous' | 'not-found';
25
+ matches: ExplainMatch[];
26
+ }
27
+ export declare function runExplainCommand(argv: ExplainArgv): Promise<void>;
28
+ export declare function explainTopic(topic: string): Promise<ExplainResult>;
29
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAsFD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA2CxE"}
@@ -0,0 +1,216 @@
1
+ import chalk from 'chalk';
2
+ import { listKnowledgeResources, readKnowledgeResource } from '@mr.dj2u/knowledge';
3
+ const DOCTOR_TOPICS = [
4
+ {
5
+ id: 'project docs',
6
+ name: 'Project Docs',
7
+ description: 'Checks that project/info.md, project/todo.md, project/style.md, and project/guidelines.md exist.',
8
+ nextStep: 'Create or normalize the project memory files so agents have a stable source of truth.',
9
+ relatedResources: ['project-documentation-org', 'post-create-onboarding'],
10
+ aliases: ['project-docs', 'project memory', 'docs'],
11
+ },
12
+ {
13
+ id: 'todo-for-context markers',
14
+ name: 'TodoForContext Markers',
15
+ description: 'Blocks unresolved optional intake markers from surviving into phase work or CI.',
16
+ nextStep: 'Fill the section under each marker, or delete the marker line to acknowledge that no extra context is needed.',
17
+ relatedResources: ['post-create-onboarding'],
18
+ aliases: ['todoforcontext', 'todo for context', 'markers'],
19
+ },
20
+ {
21
+ id: 'gitignore env',
22
+ name: 'Gitignore Env',
23
+ description: 'Checks that local environment files are ignored before secrets land in git.',
24
+ nextStep: 'Make sure .env, .env.local, and similar files are ignored while safe examples remain tracked.',
25
+ relatedResources: ['env-hygiene', 'deployment-environment-config'],
26
+ aliases: ['env gitignore', '.env', 'gitignore'],
27
+ },
28
+ {
29
+ id: 'package scripts',
30
+ name: 'Package Scripts',
31
+ description: 'Checks whether the project exposes useful local scripts for linting, testing, building, and Doctor.',
32
+ nextStep: 'Add missing scripts only when the package manager and framework support them.',
33
+ relatedResources: ['deployment-ci-cd-patterns'],
34
+ aliases: ['scripts', 'npm scripts'],
35
+ },
36
+ {
37
+ id: 'styling stack',
38
+ name: 'Styling Stack',
39
+ description: 'Checks for the expected Uniwind/Tailwind styling setup and conflicting NativeWind artifacts.',
40
+ nextStep: 'Prefer Uniwind plus Tailwind v4 for new MDS app scaffolds.',
41
+ relatedResources: ['styling-uniwind-setup', 'uniwind-theming'],
42
+ aliases: ['styling', 'uniwind', 'tailwind'],
43
+ },
44
+ {
45
+ id: 'expo config',
46
+ name: 'Expo Config',
47
+ description: 'Checks that Expo configuration is present and compatible with selected platforms and web output.',
48
+ nextStep: 'Inspect app.json or app.config.* and align platforms, web output, and EAS expectations.',
49
+ relatedResources: ['project-configuration-patterns', 'deployment-build-configuration'],
50
+ aliases: ['expo configuration', 'app.json', 'app config'],
51
+ },
52
+ {
53
+ id: 'env hygiene',
54
+ name: 'Env Hygiene',
55
+ description: 'Checks for secret-looking values exposed through EXPO_PUBLIC variables or client code.',
56
+ nextStep: 'Move private keys server-side and keep client env vars publishable only.',
57
+ relatedResources: ['env-hygiene', 'env-vars'],
58
+ aliases: ['environment hygiene', 'secrets', 'expo public'],
59
+ },
60
+ {
61
+ id: 'app architecture',
62
+ name: 'App Architecture',
63
+ description: 'Checks Expo Router route files for oversized screens and business/data logic in app/.',
64
+ nextStep: 'Move real UI into feature screens and keep route files focused on routing and layout.',
65
+ relatedResources: ['app-folder-architecture', 'expo-router-architecture', 'routing-file-based-routing'],
66
+ aliases: ['app folder', 'route architecture', 'routes'],
67
+ },
68
+ {
69
+ id: 'seo metadata',
70
+ name: 'SEO Metadata',
71
+ description: 'Checks web-facing metadata basics such as title, description, and indexing strategy.',
72
+ nextStep: 'Define route-level metadata and canonical/indexing expectations for production web output.',
73
+ relatedResources: ['seo-metadata'],
74
+ aliases: ['seo', 'metadata'],
75
+ },
76
+ {
77
+ id: 'script checks',
78
+ name: 'Script Checks',
79
+ description: 'Runs lint, typecheck, tests, Expo Doctor, and build scripts when the selected Doctor mode asks for them.',
80
+ nextStep: 'Fix the failing script locally, rerun mds doctor, then push only after the CI-equivalent profile passes.',
81
+ relatedResources: ['deployment-ci-cd-patterns', 'deployment'],
82
+ aliases: ['eslint', 'typescript', 'typecheck', 'expo doctor', 'build checks', 'ci'],
83
+ },
84
+ ];
85
+ export async function runExplainCommand(argv) {
86
+ if (!argv.topic) {
87
+ throw new Error('mds explain requires a topic.');
88
+ }
89
+ const result = await explainTopic(argv.topic);
90
+ if (argv.json) {
91
+ console.log(JSON.stringify(result, null, 2));
92
+ }
93
+ else {
94
+ printExplainResult(result);
95
+ }
96
+ if (result.status !== 'found') {
97
+ process.exitCode = 1;
98
+ }
99
+ }
100
+ export async function explainTopic(topic) {
101
+ const query = topic.trim();
102
+ const normalized = normalize(query);
103
+ const exactDoctorMatches = DOCTOR_TOPICS.filter((candidate) => [candidate.id, candidate.name, ...candidate.aliases].map(normalize).includes(normalized)).map(doctorMatchFromTopic);
104
+ if (exactDoctorMatches.length === 1) {
105
+ return { query, status: 'found', matches: exactDoctorMatches };
106
+ }
107
+ const resources = listKnowledgeResources();
108
+ const exactResourceMatches = await Promise.all(resources
109
+ .filter((resource) => resource.uri === query ||
110
+ [resource.id, resource.name].map(normalize).includes(normalized))
111
+ .map(async (resource) => knowledgeMatchFromResource(resource)));
112
+ if (exactResourceMatches.length === 1) {
113
+ return { query, status: 'found', matches: exactResourceMatches };
114
+ }
115
+ const doctorMatches = DOCTOR_TOPICS.filter((candidate) => [candidate.id, candidate.name, candidate.description, ...candidate.aliases]
116
+ .map(normalize)
117
+ .some((value) => value.includes(normalized) || normalized.includes(value))).map(doctorMatchFromTopic);
118
+ const knowledgeMatches = await Promise.all(resources
119
+ .filter((resource) => resourceMatches(resource, normalized))
120
+ .map(async (resource) => knowledgeMatchFromResource(resource)));
121
+ const matches = [...doctorMatches, ...knowledgeMatches];
122
+ if (matches.length === 1) {
123
+ return { query, status: 'found', matches };
124
+ }
125
+ if (matches.length > 1) {
126
+ return { query, status: 'ambiguous', matches };
127
+ }
128
+ return { query, status: 'not-found', matches: [] };
129
+ }
130
+ function doctorMatchFromTopic(candidate) {
131
+ return {
132
+ type: 'doctor',
133
+ id: candidate.id,
134
+ name: candidate.name,
135
+ description: candidate.description,
136
+ nextStep: candidate.nextStep,
137
+ relatedResources: [...candidate.relatedResources],
138
+ };
139
+ }
140
+ function printExplainResult(result) {
141
+ if (result.status === 'not-found') {
142
+ console.log(chalk.red(`No MDS explanation matched "${result.query}".`));
143
+ console.log(chalk.gray('Try a Doctor check name like env hygiene, app architecture, or seo metadata.'));
144
+ return;
145
+ }
146
+ if (result.status === 'ambiguous') {
147
+ console.log(chalk.yellow(`"${result.query}" matched multiple topics:`));
148
+ for (const match of result.matches.slice(0, 10)) {
149
+ console.log(` ${match.id} - ${match.name}`);
150
+ }
151
+ console.log(chalk.gray('Run `mds explain <exact id>` for one of these topics.'));
152
+ return;
153
+ }
154
+ const match = result.matches[0];
155
+ if (!match) {
156
+ console.log(chalk.red(`No MDS explanation matched "${result.query}".`));
157
+ return;
158
+ }
159
+ console.log(chalk.bold(match.name));
160
+ console.log(chalk.dim(`${match.type}: ${match.id}`));
161
+ console.log();
162
+ console.log(match.description);
163
+ console.log();
164
+ if (match.type === 'doctor') {
165
+ console.log(chalk.bold('Next Step'));
166
+ console.log(match.nextStep);
167
+ if (match.relatedResources.length > 0) {
168
+ console.log();
169
+ console.log(chalk.bold('Related Resources'));
170
+ for (const resource of match.relatedResources) {
171
+ console.log(`- ${resource}`);
172
+ }
173
+ }
174
+ return;
175
+ }
176
+ console.log(chalk.bold('Resource'));
177
+ console.log(`${match.kind} ${match.uri}`);
178
+ if (match.excerpt) {
179
+ console.log();
180
+ console.log(chalk.bold('Excerpt'));
181
+ console.log(match.excerpt);
182
+ }
183
+ }
184
+ async function knowledgeMatchFromResource(resource) {
185
+ const content = await readKnowledgeResource(resource.uri);
186
+ return {
187
+ type: 'knowledge',
188
+ id: resource.id,
189
+ name: resource.name,
190
+ description: resource.description,
191
+ uri: resource.uri,
192
+ kind: resource.kind,
193
+ keywords: resource.keywords,
194
+ excerpt: summarizeContent(content),
195
+ };
196
+ }
197
+ function summarizeContent(resource) {
198
+ if (!resource) {
199
+ return '';
200
+ }
201
+ return resource.content
202
+ .split(/\r?\n/)
203
+ .map((line) => line.trim())
204
+ .filter((line) => line && !line.startsWith('#'))
205
+ .slice(0, 3)
206
+ .join('\n');
207
+ }
208
+ function resourceMatches(resource, normalizedQuery) {
209
+ return [resource.id, resource.uri, resource.name, resource.description, ...resource.keywords]
210
+ .map(normalize)
211
+ .some((value) => value.includes(normalizedQuery) || normalizedQuery.includes(value));
212
+ }
213
+ function normalize(value) {
214
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();
215
+ }
216
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type McpClient = 'claude' | 'codex' | 'cursor' | 'vscode';
2
+ export type McpScope = 'user' | 'project';
3
+ export interface McpInstallArgv {
4
+ client?: McpClient;
5
+ scope?: McpScope;
6
+ target?: string;
7
+ serverPath?: string;
8
+ command?: string;
9
+ dryRun?: boolean;
10
+ }
11
+ export interface ResolvedServer {
12
+ command: string;
13
+ args: string[];
14
+ }
15
+ export declare const SERVER_KEY = "mds-dev-suite";
16
+ export declare const VSCODE_SERVER_KEY = "mdsDevSuite";
17
+ export declare function runMcpInstallCommand(argv: McpInstallArgv): Promise<void>;
18
+ export declare function resolveServerInvocation(argv: McpInstallArgv): ResolvedServer;
19
+ export declare function writeMcpJsonToProject(targetDir: string): Promise<void>;
20
+ export declare function writeJsonMcpConfig(filePath: string, server: ResolvedServer, dryRun: boolean): Promise<void>;
21
+ export declare function writeCodexConfig(filePath: string, server: ResolvedServer, dryRun: boolean): Promise<void>;
22
+ export declare function renderCodexBlock(key: string, server: ResolvedServer): string;
23
+ export declare function writeVscodeMcpConfig(filePath: string, server: ResolvedServer, dryRun: boolean): Promise<void>;
24
+ export declare function installVscodeUserMcp(server: ResolvedServer, dryRun: boolean): Promise<void>;
25
+ export declare function buildVscodeAddMcpPayload(server: ResolvedServer): Record<string, unknown>;
26
+ export declare function renderVscodeAddMcpCommand(payload: Record<string, unknown>): string;
27
+ export declare function stripExistingCodexBlock(content: string, key: string): string;
28
+ //# sourceMappingURL=mcp-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-install.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-install.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E;AAkDD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAe5E;AAWD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAG5E;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMxF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAElF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa5E"}