@clueprint/mcp 1.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.
- package/README.md +113 -0
- package/assets/logo.png +0 -0
- package/cli/commands/setup.d.ts +7 -0
- package/cli/commands/setup.d.ts.map +1 -0
- package/cli/commands/setup.js +248 -0
- package/cli/commands/setup.js.map +1 -0
- package/cli/commands/start.d.ts +6 -0
- package/cli/commands/start.d.ts.map +1 -0
- package/cli/commands/start.js +115 -0
- package/cli/commands/start.js.map +1 -0
- package/cli/commands/status.d.ts +2 -0
- package/cli/commands/status.d.ts.map +1 -0
- package/cli/commands/status.js +186 -0
- package/cli/commands/status.js.map +1 -0
- package/cli/index.d.ts +3 -0
- package/cli/index.d.ts.map +1 -0
- package/cli/index.js +53 -0
- package/cli/index.js.map +1 -0
- package/cli/ui/banner.d.ts +8 -0
- package/cli/ui/banner.d.ts.map +1 -0
- package/cli/ui/banner.js +41 -0
- package/cli/ui/banner.js.map +1 -0
- package/extension/background/index.js +2 -0
- package/extension/content/index.js +986 -0
- package/extension/devtools/devtools.html +10 -0
- package/extension/devtools/devtools.js +1 -0
- package/extension/devtools/panel.css +1584 -0
- package/extension/devtools/panel.html +16 -0
- package/extension/devtools/panel.js +40 -0
- package/extension/icons/clueprint.png +0 -0
- package/extension/manifest.json +70 -0
- package/extension/popup/popup.css +1584 -0
- package/extension/popup/popup.html +16 -0
- package/extension/popup/popup.js +122 -0
- package/extension/styles/overlay.css +111 -0
- package/package.json +41 -0
- package/server/analysis/format.d.ts +21 -0
- package/server/analysis/format.d.ts.map +1 -0
- package/server/analysis/format.js +583 -0
- package/server/analysis/format.js.map +1 -0
- package/server/index.d.ts +7 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +14 -0
- package/server/index.js.map +1 -0
- package/server/server.d.ts +8 -0
- package/server/server.d.ts.map +1 -0
- package/server/server.js +417 -0
- package/server/server.js.map +1 -0
- package/server/shared-state.d.ts +14 -0
- package/server/shared-state.d.ts.map +1 -0
- package/server/shared-state.js +131 -0
- package/server/shared-state.js.map +1 -0
- package/server/types/index.d.ts +239 -0
- package/server/types/index.d.ts.map +1 -0
- package/server/types/index.js +7 -0
- package/server/types/index.js.map +1 -0
- package/server/websocket.d.ts +55 -0
- package/server/websocket.d.ts.map +1 -0
- package/server/websocket.js +355 -0
- package/server/websocket.js.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/mariojankovic/clueprint/main/assets/logo.png" alt="clueprint" width="260" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://www.npmjs.com/package/@clueprint/mcp"><img src="https://img.shields.io/npm/v/@clueprint/mcp.svg?style=flat-square&color=7c3aed" alt="npm version" /></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/@clueprint/mcp"><img src="https://img.shields.io/npm/dm/@clueprint/mcp.svg?style=flat-square&color=06b6d4" alt="npm downloads" /></a>
|
|
8
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-94a3b8.svg?style=flat-square" alt="license" /></a>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
Give your AI coding assistant eyes on the browser.<br/>
|
|
13
|
+
Select elements, capture regions, record flows — all visible to Claude via MCP.
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx @clueprint/mcp setup
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The setup wizard installs the Chrome extension, configures the MCP server, and connects everything to Claude Code. Follow the on-screen instructions to load the extension.
|
|
25
|
+
|
|
26
|
+
## What it does
|
|
27
|
+
|
|
28
|
+
Instead of describing what you see or copy-pasting HTML, clueprint lets your AI assistant observe the browser directly:
|
|
29
|
+
|
|
30
|
+
| Action | What gets captured |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| **Cmd+Shift+S** to inspect, then click | Tag, classes, attributes, computed styles, parent context, related console errors |
|
|
33
|
+
| **Cmd+Shift+X** to select region, then drag | Screenshot, all elements within bounds, DOM structure, visual analysis |
|
|
34
|
+
| **Record a flow** (via widget) | Clicks, scrolls, inputs, network requests, console errors, layout shifts |
|
|
35
|
+
| **Activity buffer** (last 30s) | Background capture of interactions, network, and errors without explicit recording |
|
|
36
|
+
| **Run an audit** | Console errors, network failures, performance metrics, accessibility issues |
|
|
37
|
+
| **Snapshot & diff DOM** | Capture DOM state, compare before/after to see what changed |
|
|
38
|
+
|
|
39
|
+
All data flows through [MCP](https://modelcontextprotocol.io) so any compatible assistant can access it.
|
|
40
|
+
|
|
41
|
+
## How it works
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
┌─────────────┐ WebSocket ┌────────────┐ MCP ┌─────────────┐
|
|
45
|
+
│ Chrome │ ◄──────────────────► │ MCP │ ◄──────────────► │ Claude │
|
|
46
|
+
│ Extension │ │ Server │ │ Code │
|
|
47
|
+
└─────────────┘ └────────────┘ └─────────────┘
|
|
48
|
+
Captures DOM, Exposes tools Calls tools to
|
|
49
|
+
styles, network, for browser understand what
|
|
50
|
+
console, screenshots visibility you're seeing
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## CLI
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx @clueprint/mcp setup # install extension + configure MCP
|
|
57
|
+
npx @clueprint/mcp status # check installation health
|
|
58
|
+
npx @clueprint/mcp start # start MCP server manually
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Manual setup
|
|
62
|
+
|
|
63
|
+
<details>
|
|
64
|
+
<summary>If you prefer to configure things yourself</summary>
|
|
65
|
+
|
|
66
|
+
### Build
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm install && pnpm run build
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Load the extension
|
|
73
|
+
|
|
74
|
+
1. Open `chrome://extensions/`
|
|
75
|
+
2. Enable **Developer mode**
|
|
76
|
+
3. Click **Load unpacked** → select `packages/chrome-extension/dist`
|
|
77
|
+
|
|
78
|
+
### Configure MCP
|
|
79
|
+
|
|
80
|
+
Add to your Claude Code MCP config:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"mcpServers": {
|
|
85
|
+
"clueprint": {
|
|
86
|
+
"command": "node",
|
|
87
|
+
"args": ["/path/to/clueprint/packages/mcp-server/dist/index.js"]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
## Development
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# Watch extension
|
|
99
|
+
cd packages/chrome-extension && pnpm run watch
|
|
100
|
+
|
|
101
|
+
# Watch MCP server
|
|
102
|
+
cd packages/mcp-server && pnpm run dev
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Requirements
|
|
106
|
+
|
|
107
|
+
- Node.js 18+
|
|
108
|
+
- Chrome
|
|
109
|
+
- Claude Code (or any MCP-compatible assistant)
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
MIT
|
package/assets/logo.png
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAUA,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
export async function setup(options) {
|
|
10
|
+
p.intro(pc.bgCyan(pc.black(' clueprint setup ')));
|
|
11
|
+
const projectRoot = findProjectRoot();
|
|
12
|
+
if (projectRoot) {
|
|
13
|
+
await setupLocal(projectRoot, options);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
await setupFromNpm(options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// --- Local dev mode (inside cloned repo) ---
|
|
20
|
+
async function setupLocal(projectRoot, options) {
|
|
21
|
+
// Step 1: Install dependencies
|
|
22
|
+
const depsSpinner = p.spinner();
|
|
23
|
+
depsSpinner.start('Installing dependencies...');
|
|
24
|
+
try {
|
|
25
|
+
await runCommand('pnpm', ['install'], { cwd: projectRoot });
|
|
26
|
+
depsSpinner.stop('Dependencies installed');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
depsSpinner.stop('Failed to install dependencies');
|
|
30
|
+
p.log.error('Make sure pnpm is installed: npm install -g pnpm');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Step 2: Build extension and MCP server
|
|
34
|
+
if (!options.skipBuild) {
|
|
35
|
+
const buildSpinner = p.spinner();
|
|
36
|
+
buildSpinner.start('Building Chrome extension...');
|
|
37
|
+
try {
|
|
38
|
+
await runCommand('pnpm', ['run', 'build:extension'], { cwd: projectRoot });
|
|
39
|
+
buildSpinner.message('Building MCP server...');
|
|
40
|
+
await runCommand('pnpm', ['run', 'build:server'], { cwd: projectRoot });
|
|
41
|
+
buildSpinner.stop('Extension and MCP server built');
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
buildSpinner.stop('Build failed');
|
|
45
|
+
p.log.error('Check the error output above');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
p.log.info('Skipping build (--skip-build flag)');
|
|
51
|
+
}
|
|
52
|
+
// Step 3: Configure MCP for Claude Code
|
|
53
|
+
if (!options.skipMcp) {
|
|
54
|
+
const mcpServerPath = join(projectRoot, 'packages/mcp-server/dist/index.js');
|
|
55
|
+
await configureMcp(mcpServerPath);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
p.log.info('Skipping MCP configuration (--skip-mcp flag)');
|
|
59
|
+
}
|
|
60
|
+
// Step 4: Verify installation
|
|
61
|
+
const verifySpinner = p.spinner();
|
|
62
|
+
verifySpinner.start('Verifying installation...');
|
|
63
|
+
const issues = [];
|
|
64
|
+
const extensionDist = join(projectRoot, 'packages/chrome-extension/dist');
|
|
65
|
+
if (!existsSync(extensionDist)) {
|
|
66
|
+
issues.push('Extension not built');
|
|
67
|
+
}
|
|
68
|
+
const mcpDist = join(projectRoot, 'packages/mcp-server/dist');
|
|
69
|
+
if (!existsSync(mcpDist)) {
|
|
70
|
+
issues.push('MCP server not built');
|
|
71
|
+
}
|
|
72
|
+
if (issues.length === 0) {
|
|
73
|
+
verifySpinner.stop('Installation verified');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
verifySpinner.stop('Installation incomplete');
|
|
77
|
+
issues.forEach(issue => p.log.warn(issue));
|
|
78
|
+
}
|
|
79
|
+
// Print completion message
|
|
80
|
+
const extensionPath = join(projectRoot, 'packages/chrome-extension/dist');
|
|
81
|
+
p.note(`${pc.bold('Load the Chrome extension:')}\n` +
|
|
82
|
+
` ${pc.dim('1.')} Open ${pc.cyan('chrome://extensions/')}\n` +
|
|
83
|
+
` ${pc.dim('2.')} Enable ${pc.cyan('Developer mode')}\n` +
|
|
84
|
+
` ${pc.dim('3.')} Click ${pc.cyan('Load unpacked')}\n` +
|
|
85
|
+
` ${pc.dim('4.')} Select:\n` +
|
|
86
|
+
` ${pc.dim(extensionPath)}\n\n` +
|
|
87
|
+
`${pc.bold('Then restart Claude Code')} to load the MCP server`, 'Next steps');
|
|
88
|
+
p.outro(pc.green('Setup complete! Happy debugging ') + pc.cyan(''));
|
|
89
|
+
}
|
|
90
|
+
// --- npm mode (installed via npx @clueprint/mcp setup) ---
|
|
91
|
+
async function setupFromNpm(options) {
|
|
92
|
+
const clueprintDir = join(homedir(), '.clueprint');
|
|
93
|
+
// Resolve bundled assets relative to CLI location
|
|
94
|
+
// In the published package: cli/commands/setup.js → ../server/ and ../extension/
|
|
95
|
+
const packageRoot = join(__dirname, '..', '..');
|
|
96
|
+
const bundledServer = join(packageRoot, 'server');
|
|
97
|
+
const bundledExtension = join(packageRoot, 'extension');
|
|
98
|
+
// Verify bundled assets exist
|
|
99
|
+
if (!existsSync(bundledServer) || !existsSync(bundledExtension)) {
|
|
100
|
+
p.cancel('Bundled assets not found. The package may be corrupted.');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
// Step 1: Copy extension to ~/.clueprint/extension/
|
|
104
|
+
const copySpinner = p.spinner();
|
|
105
|
+
copySpinner.start('Installing Clueprint...');
|
|
106
|
+
try {
|
|
107
|
+
mkdirSync(clueprintDir, { recursive: true });
|
|
108
|
+
cpSync(bundledExtension, join(clueprintDir, 'extension'), { recursive: true });
|
|
109
|
+
copySpinner.message('Extension installed...');
|
|
110
|
+
cpSync(bundledServer, join(clueprintDir, 'server'), { recursive: true });
|
|
111
|
+
copySpinner.stop('Clueprint installed');
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
copySpinner.stop('Installation failed');
|
|
115
|
+
p.log.error(`Could not copy files to ${clueprintDir}`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
// Step 2: Configure MCP for Claude Code
|
|
119
|
+
if (!options.skipMcp) {
|
|
120
|
+
const mcpServerPath = join(clueprintDir, 'server', 'index.js');
|
|
121
|
+
await configureMcp(mcpServerPath);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
p.log.info('Skipping MCP configuration (--skip-mcp flag)');
|
|
125
|
+
}
|
|
126
|
+
// Step 3: Verify
|
|
127
|
+
const verifySpinner = p.spinner();
|
|
128
|
+
verifySpinner.start('Verifying installation...');
|
|
129
|
+
const issues = [];
|
|
130
|
+
if (!existsSync(join(clueprintDir, 'extension', 'manifest.json'))) {
|
|
131
|
+
issues.push('Extension not installed correctly');
|
|
132
|
+
}
|
|
133
|
+
if (!existsSync(join(clueprintDir, 'server', 'index.js'))) {
|
|
134
|
+
issues.push('MCP server not installed correctly');
|
|
135
|
+
}
|
|
136
|
+
if (issues.length === 0) {
|
|
137
|
+
verifySpinner.stop('Installation verified');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
verifySpinner.stop('Installation incomplete');
|
|
141
|
+
issues.forEach(issue => p.log.warn(issue));
|
|
142
|
+
}
|
|
143
|
+
// Print completion message
|
|
144
|
+
const extensionPath = join(clueprintDir, 'extension');
|
|
145
|
+
p.note(`${pc.bold('Load the Chrome extension:')}\n` +
|
|
146
|
+
` ${pc.dim('1.')} Open ${pc.cyan('chrome://extensions/')}\n` +
|
|
147
|
+
` ${pc.dim('2.')} Enable ${pc.cyan('Developer mode')}\n` +
|
|
148
|
+
` ${pc.dim('3.')} Click ${pc.cyan('Load unpacked')}\n` +
|
|
149
|
+
` ${pc.dim('4.')} Select:\n` +
|
|
150
|
+
` ${pc.dim(extensionPath)}\n\n` +
|
|
151
|
+
`${pc.bold('Then restart Claude Code')} to load the MCP server`, 'Next steps');
|
|
152
|
+
p.outro(pc.green('Setup complete! Happy debugging ') + pc.cyan(''));
|
|
153
|
+
}
|
|
154
|
+
// --- Shared utilities ---
|
|
155
|
+
function findProjectRoot() {
|
|
156
|
+
let dir = process.cwd();
|
|
157
|
+
while (dir !== '/') {
|
|
158
|
+
const packageJson = join(dir, 'package.json');
|
|
159
|
+
if (existsSync(packageJson)) {
|
|
160
|
+
try {
|
|
161
|
+
const pkg = JSON.parse(readFileSync(packageJson, 'utf-8'));
|
|
162
|
+
if (pkg.name === 'clueprint' || existsSync(join(dir, 'packages/chrome-extension'))) {
|
|
163
|
+
return dir;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Continue searching
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
dir = dirname(dir);
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function runCommand(command, args, options) {
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
const proc = spawn(command, args, {
|
|
177
|
+
cwd: options.cwd,
|
|
178
|
+
stdio: 'pipe',
|
|
179
|
+
shell: true,
|
|
180
|
+
});
|
|
181
|
+
let stderr = '';
|
|
182
|
+
proc.stderr?.on('data', (data) => {
|
|
183
|
+
stderr += data.toString();
|
|
184
|
+
});
|
|
185
|
+
proc.on('close', (code) => {
|
|
186
|
+
if (code === 0) {
|
|
187
|
+
resolve();
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
reject(new Error(stderr || `Command failed with code ${code}`));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
proc.on('error', reject);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async function configureMcp(mcpServerPath) {
|
|
197
|
+
const claudeConfigDir = join(homedir(), '.claude');
|
|
198
|
+
const claudeSettingsPath = join(claudeConfigDir, 'claude_desktop_config.json');
|
|
199
|
+
// Check if Claude Code config exists
|
|
200
|
+
if (!existsSync(claudeConfigDir)) {
|
|
201
|
+
const shouldCreate = await p.confirm({
|
|
202
|
+
message: 'Claude Code config not found. Create MCP configuration?',
|
|
203
|
+
initialValue: true,
|
|
204
|
+
});
|
|
205
|
+
if (p.isCancel(shouldCreate) || !shouldCreate) {
|
|
206
|
+
p.log.info('Skipping MCP configuration');
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
mkdirSync(claudeConfigDir, { recursive: true });
|
|
210
|
+
}
|
|
211
|
+
// Read existing config
|
|
212
|
+
let config = {};
|
|
213
|
+
if (existsSync(claudeSettingsPath)) {
|
|
214
|
+
try {
|
|
215
|
+
config = JSON.parse(readFileSync(claudeSettingsPath, 'utf-8'));
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
config = {};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const mcpServers = (config.mcpServers || {});
|
|
222
|
+
const existingClueprint = mcpServers['clueprint'];
|
|
223
|
+
if (existingClueprint) {
|
|
224
|
+
const shouldOverwrite = await p.confirm({
|
|
225
|
+
message: 'Clueprint MCP already configured. Overwrite?',
|
|
226
|
+
initialValue: false,
|
|
227
|
+
});
|
|
228
|
+
if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {
|
|
229
|
+
p.log.info('Keeping existing MCP configuration');
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
mcpServers['clueprint'] = {
|
|
234
|
+
command: 'node',
|
|
235
|
+
args: [mcpServerPath],
|
|
236
|
+
};
|
|
237
|
+
config.mcpServers = mcpServers;
|
|
238
|
+
try {
|
|
239
|
+
writeFileSync(claudeSettingsPath, JSON.stringify(config, null, 2));
|
|
240
|
+
p.log.success('MCP server configured for Claude Code');
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
p.log.error(`Could not write to ${claudeSettingsPath}`);
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGtE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
export async function startServer(options) {
|
|
9
|
+
p.intro(pc.bgCyan(pc.black(' clueprint start ')));
|
|
10
|
+
const port = options.port || '7007';
|
|
11
|
+
const projectRoot = findProjectRoot();
|
|
12
|
+
if (!projectRoot) {
|
|
13
|
+
p.log.error('Clueprint project not found');
|
|
14
|
+
p.outro(pc.red('Run from the project directory'));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const mcpServerPath = join(projectRoot, 'packages/mcp-server/dist/index.js');
|
|
18
|
+
if (!existsSync(mcpServerPath)) {
|
|
19
|
+
p.log.error('MCP server not built');
|
|
20
|
+
p.outro(pc.dim('Run: clueprint setup'));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const spinner = p.spinner();
|
|
24
|
+
spinner.start('Starting MCP server...');
|
|
25
|
+
const serverProcess = spawn('node', [mcpServerPath], {
|
|
26
|
+
env: { ...process.env, PORT: port },
|
|
27
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
28
|
+
});
|
|
29
|
+
let started = false;
|
|
30
|
+
// Helper to check for server started patterns
|
|
31
|
+
function checkStarted(output) {
|
|
32
|
+
return output.includes('Server started') ||
|
|
33
|
+
output.includes('listening') ||
|
|
34
|
+
output.includes('ready');
|
|
35
|
+
}
|
|
36
|
+
serverProcess.stdout?.on('data', (data) => {
|
|
37
|
+
const output = data.toString();
|
|
38
|
+
if (!started && checkStarted(output)) {
|
|
39
|
+
started = true;
|
|
40
|
+
spinner.stop(`MCP server running`);
|
|
41
|
+
console.log();
|
|
42
|
+
console.log(pc.dim(' Press Ctrl+C to stop'));
|
|
43
|
+
console.log();
|
|
44
|
+
}
|
|
45
|
+
process.stdout.write(pc.dim(output));
|
|
46
|
+
});
|
|
47
|
+
// Server logs often go to stderr - don't treat as error
|
|
48
|
+
serverProcess.stderr?.on('data', (data) => {
|
|
49
|
+
const output = data.toString();
|
|
50
|
+
// Check if this is actually a success message
|
|
51
|
+
if (!started && checkStarted(output)) {
|
|
52
|
+
started = true;
|
|
53
|
+
spinner.stop(`MCP server running`);
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(pc.dim(' Press Ctrl+C to stop'));
|
|
56
|
+
console.log();
|
|
57
|
+
}
|
|
58
|
+
// Color warnings yellow, errors red, info dim
|
|
59
|
+
if (output.includes('error') || output.includes('Error')) {
|
|
60
|
+
process.stderr.write(pc.red(output));
|
|
61
|
+
}
|
|
62
|
+
else if (output.includes('warn') || output.includes('already in use')) {
|
|
63
|
+
process.stderr.write(pc.yellow(output));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stderr.write(pc.dim(output));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
serverProcess.on('error', (error) => {
|
|
70
|
+
spinner.stop('Failed to start server');
|
|
71
|
+
p.log.error(error.message);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
});
|
|
74
|
+
serverProcess.on('close', (code) => {
|
|
75
|
+
if (code !== 0 && code !== null) {
|
|
76
|
+
console.log(pc.red(`Server exited with code ${code}`));
|
|
77
|
+
process.exit(code);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Handle graceful shutdown
|
|
81
|
+
process.on('SIGINT', () => {
|
|
82
|
+
console.log('\n');
|
|
83
|
+
serverProcess.kill('SIGTERM');
|
|
84
|
+
setTimeout(() => {
|
|
85
|
+
p.outro(pc.dim('Server stopped'));
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}, 300);
|
|
88
|
+
});
|
|
89
|
+
// Keep process running
|
|
90
|
+
await new Promise(() => { });
|
|
91
|
+
}
|
|
92
|
+
function findProjectRoot() {
|
|
93
|
+
let dir = process.cwd();
|
|
94
|
+
while (dir !== '/') {
|
|
95
|
+
const packageJson = join(dir, 'package.json');
|
|
96
|
+
if (existsSync(packageJson)) {
|
|
97
|
+
try {
|
|
98
|
+
const pkg = JSON.parse(readFileSync(packageJson, 'utf-8'));
|
|
99
|
+
if (pkg.name === 'clueprint' || existsSync(join(dir, 'packages/chrome-extension'))) {
|
|
100
|
+
return dir;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Continue searching
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
dir = dirname(dir);
|
|
108
|
+
}
|
|
109
|
+
const globalRoot = join(__dirname, '../../../../..');
|
|
110
|
+
if (existsSync(join(globalRoot, 'packages/chrome-extension'))) {
|
|
111
|
+
return globalRoot;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAgBA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAoK5C"}
|