@just-every/design 0.1.1 → 0.1.3
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 +64 -10
- package/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +111 -29
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +870 -111
- package/dist/cli.js.map +1 -1
- package/dist/design-client.d.ts.map +1 -1
- package/dist/design-client.js +13 -0
- package/dist/design-client.js.map +1 -1
- package/dist/install.d.ts +20 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +558 -49
- package/dist/install.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -83
- package/dist/server.js.map +1 -1
- package/dist/tool-logic.d.ts +12 -0
- package/dist/tool-logic.d.ts.map +1 -0
- package/dist/tool-logic.js +108 -0
- package/dist/tool-logic.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,33 +4,72 @@ MCP (Model Context Protocol) stdio server that proxies the **Design App API** (d
|
|
|
4
4
|
|
|
5
5
|
## Quick start
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
The recommended path is to run the guided installer once. It will:
|
|
8
|
+
|
|
9
|
+
- Authenticate you (if needed)
|
|
10
|
+
- Install a local `every-design` launcher (no `npx` required after)
|
|
11
|
+
- Configure detected MCP clients (and install Skills where supported)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx -y @just-every/design@latest install
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
After install, you can use `every-design` directly.
|
|
18
|
+
|
|
19
|
+
### Authenticate
|
|
20
|
+
|
|
21
|
+
Login once (interactive approval-link flow):
|
|
8
22
|
|
|
9
23
|
```bash
|
|
10
|
-
|
|
24
|
+
every-design auth login
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If you do not have `every-design` on PATH yet, you can always run:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx -y @just-every/design@latest auth login
|
|
11
31
|
```
|
|
12
32
|
|
|
13
33
|
If your user belongs to multiple companies, this will prompt you to pick one.
|
|
14
34
|
To skip the prompt, pass `--account <slug>`.
|
|
15
35
|
|
|
16
|
-
|
|
36
|
+
### Run as an MCP server (stdio)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
every-design
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Fallback (no local install):
|
|
17
43
|
|
|
18
44
|
```bash
|
|
19
|
-
npx @just-every/design
|
|
45
|
+
npx -y @just-every/design@latest
|
|
20
46
|
```
|
|
21
47
|
|
|
22
48
|
## Install into common MCP clients
|
|
23
49
|
|
|
24
|
-
This writes MCP server config entries for detected clients (Claude Desktop, Cursor, Gemini CLI, Qwen Code, Codex, and Every Code), and installs a small local playbook “skill”
|
|
50
|
+
This writes MCP server config entries for detected clients (Claude Desktop, Cursor, Gemini CLI, Qwen Code, Codex, and Every Code), and installs a small local playbook “skill” where supported.
|
|
25
51
|
|
|
26
52
|
```bash
|
|
27
|
-
npx @just-every/design install
|
|
53
|
+
npx -y @just-every/design@latest install
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
By default, install will prefer a local launcher and attempt to ensure `~/.local/bin` is on your `PATH`.
|
|
57
|
+
To skip modifying shell config files:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx -y @just-every/design@latest install --no-path
|
|
28
61
|
```
|
|
29
62
|
|
|
30
63
|
To force-install into all supported clients:
|
|
31
64
|
|
|
32
65
|
```bash
|
|
33
|
-
npx @just-every/design install --client all --yes
|
|
66
|
+
npx -y @just-every/design@latest install --client all --yes
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
To remove the MCP server + playbook skill from detected clients:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx -y @just-every/design@latest remove
|
|
34
73
|
```
|
|
35
74
|
|
|
36
75
|
### Claude Desktop config example
|
|
@@ -39,13 +78,15 @@ npx @just-every/design install --client all --yes
|
|
|
39
78
|
{
|
|
40
79
|
"mcpServers": {
|
|
41
80
|
"every-design": {
|
|
42
|
-
"command": "
|
|
43
|
-
"args": [
|
|
81
|
+
"command": "/absolute/path/to/every-design",
|
|
82
|
+
"args": []
|
|
44
83
|
}
|
|
45
84
|
}
|
|
46
85
|
}
|
|
47
86
|
```
|
|
48
87
|
|
|
88
|
+
Tip: GUI apps may not inherit your shell `PATH`, so an absolute path is recommended.
|
|
89
|
+
|
|
49
90
|
## Authentication (recommended)
|
|
50
91
|
|
|
51
92
|
This package uses the JustEvery **login approval-link** flow:
|
|
@@ -61,7 +102,7 @@ This avoids needing long-lived client secrets and is the lowest-friction path fo
|
|
|
61
102
|
|
|
62
103
|
### Config file
|
|
63
104
|
|
|
64
|
-
- Default path: `~/.config/just-every/every-design/mcp.json`
|
|
105
|
+
- Default path: `$XDG_CONFIG_HOME/just-every/every-design/mcp.json` (or `~/.config/just-every/every-design/mcp.json`)
|
|
65
106
|
- Override: `DESIGN_MCP_CONFIG_PATH=/path/to/mcp.json`
|
|
66
107
|
|
|
67
108
|
### Environment variables
|
|
@@ -82,3 +123,16 @@ Current tools are focused on runs + artifacts:
|
|
|
82
123
|
- `design.events`
|
|
83
124
|
- `design.artifacts.list`
|
|
84
125
|
- `design.artifacts.download` (downloads and caches locally)
|
|
126
|
+
|
|
127
|
+
CLI helper commands (non-MCP):
|
|
128
|
+
|
|
129
|
+
- `every-design screenshot <url>`
|
|
130
|
+
- `every-design critique --json '{...}'`
|
|
131
|
+
|
|
132
|
+
## Output kinds (CLI/MCP)
|
|
133
|
+
|
|
134
|
+
When using this package via MCP/CLI:
|
|
135
|
+
|
|
136
|
+
- HTML output is **opt-in**: set `output.designKind` to `html`.
|
|
137
|
+
- For web/app UI prompts with no explicit `output`, the CLI/MCP path defaults to `output.designKind: "interface"` to avoid expensive code builds while still producing a UI design.
|
|
138
|
+
- If you explicitly set `output.designKind` to `auto`, the backend will infer the best kind from the prompt (this may select `html`).
|
package/dist/auth.d.ts
CHANGED
|
@@ -12,8 +12,19 @@ export type LoginFlowResult = {
|
|
|
12
12
|
bearerToken: string;
|
|
13
13
|
bearerExpiresAt?: number;
|
|
14
14
|
userId: string;
|
|
15
|
+
organizationId?: string;
|
|
16
|
+
organizationSlug?: string;
|
|
15
17
|
sessionToken: string;
|
|
16
18
|
sessionExpiresAt?: string;
|
|
17
19
|
};
|
|
20
|
+
export declare function refreshLoginSession(args: {
|
|
21
|
+
loginOrigin: string;
|
|
22
|
+
sessionToken: string;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
sessionToken: string;
|
|
26
|
+
sessionExpiresAt?: string;
|
|
27
|
+
changed: boolean;
|
|
28
|
+
} | null>;
|
|
18
29
|
export declare function runApprovalLinkLoginFlow(options: LoginFlowOptions): Promise<LoginFlowResult>;
|
|
19
30
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAYF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CA4CxF;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4FlG"}
|
package/dist/auth.js
CHANGED
|
@@ -2,8 +2,48 @@ import { setTimeout as sleep } from 'node:timers/promises';
|
|
|
2
2
|
import { execFileSync } from 'node:child_process';
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { httpRequest, readErrorBodyText } from './http.js';
|
|
5
|
+
import { CookieJar, getSetCookieHeaders } from './cookies.js';
|
|
6
|
+
export async function refreshLoginSession(args) {
|
|
7
|
+
const { loginOrigin, sessionToken } = args;
|
|
8
|
+
const timeoutMs = args.timeoutMs ?? 30000;
|
|
9
|
+
const origin = stripTrailingSlash(loginOrigin);
|
|
10
|
+
const jar = new CookieJar({
|
|
11
|
+
'__Secure-better-auth.session_token': sessionToken,
|
|
12
|
+
'better-auth.session_token': sessionToken,
|
|
13
|
+
});
|
|
14
|
+
const res = await httpRequest(`${origin}/api/auth/session`, {
|
|
15
|
+
method: 'GET',
|
|
16
|
+
headers: {
|
|
17
|
+
cookie: jar.toHeader(),
|
|
18
|
+
},
|
|
19
|
+
timeoutMs,
|
|
20
|
+
});
|
|
21
|
+
// Better Auth uses 401 for unauthenticated.
|
|
22
|
+
if (res.status === 401 || res.status === 403) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
throw new Error(`Session refresh failed (${res.status}): ${await readErrorBodyText(res)}`);
|
|
27
|
+
}
|
|
28
|
+
for (const cookie of getSetCookieHeaders(res.headers)) {
|
|
29
|
+
jar.applySetCookie(cookie);
|
|
30
|
+
}
|
|
31
|
+
const cookieToken = jar.get('__Secure-better-auth.session_token') ?? jar.get('better-auth.session_token') ?? '';
|
|
32
|
+
const nextToken = cookieToken.trim() || sessionToken.trim();
|
|
33
|
+
let sessionExpiresAt;
|
|
34
|
+
try {
|
|
35
|
+
const payload = (await res.json());
|
|
36
|
+
const maybe = typeof payload?.session?.expiresAt === 'string' ? payload.session.expiresAt : null;
|
|
37
|
+
sessionExpiresAt = maybe ? maybe : undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Non-fatal; token refresh is primarily via Set-Cookie.
|
|
41
|
+
}
|
|
42
|
+
const changed = nextToken !== sessionToken;
|
|
43
|
+
return { sessionToken: nextToken, sessionExpiresAt, changed };
|
|
44
|
+
}
|
|
5
45
|
export async function runApprovalLinkLoginFlow(options) {
|
|
6
|
-
const { loginOrigin, scopes = ['
|
|
46
|
+
const { loginOrigin, scopes = ['design.mcp'], ttlSeconds, ttlHours, ttlDays, intervalSeconds = 5, timeoutSeconds = 600, openBrowser = true, } = options;
|
|
7
47
|
const requestPayload = { scopes };
|
|
8
48
|
if (typeof ttlSeconds === 'number')
|
|
9
49
|
requestPayload.ttlSeconds = ttlSeconds;
|
|
@@ -24,49 +64,74 @@ export async function runApprovalLinkLoginFlow(options) {
|
|
|
24
64
|
throw new Error('Login approval request returned an unexpected payload');
|
|
25
65
|
}
|
|
26
66
|
const expiresAtText = typeof approval.expiresAt === 'number' ? new Date(approval.expiresAt).toISOString() : 'unknown';
|
|
27
|
-
console.error('
|
|
28
|
-
console.error(
|
|
29
|
-
console.error(
|
|
67
|
+
console.error('Every Design authentication');
|
|
68
|
+
console.error('');
|
|
69
|
+
console.error('1) Approve this login request in your browser:');
|
|
70
|
+
console.error(` ${approval.approvalUrl}`);
|
|
71
|
+
console.error(` Expires at: ${expiresAtText}`);
|
|
72
|
+
console.error('');
|
|
73
|
+
console.error('2) Return here and this CLI will finish setup automatically.');
|
|
30
74
|
if (openBrowser) {
|
|
31
|
-
openUrl(approval.approvalUrl);
|
|
75
|
+
const opened = openUrl(approval.approvalUrl);
|
|
76
|
+
if (opened) {
|
|
77
|
+
console.error('Opened your browser to the approval link.');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.error('Could not auto-open a browser window. Open the link manually.');
|
|
81
|
+
}
|
|
32
82
|
}
|
|
33
83
|
const deadline = Date.now() + timeoutSeconds * 1000;
|
|
34
84
|
let lastStatus = '';
|
|
85
|
+
const startedAt = Date.now();
|
|
35
86
|
while (Date.now() < deadline) {
|
|
36
87
|
const pollRes = await httpRequest(`${approval.pollUrl}?secret=${encodeURIComponent(approval.pollSecret)}`, {
|
|
37
88
|
method: 'GET',
|
|
38
89
|
timeoutMs: 30000,
|
|
39
90
|
});
|
|
40
|
-
if (pollRes.ok) {
|
|
41
|
-
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
bearerToken: poll.token,
|
|
46
|
-
bearerExpiresAt: poll.expiresAt,
|
|
47
|
-
userId: poll.userId,
|
|
48
|
-
sessionToken: session.sessionToken,
|
|
49
|
-
sessionExpiresAt: session.expiresAt ?? undefined,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
const status = String(poll?.status ?? 'pending');
|
|
53
|
-
if (status && status !== lastStatus) {
|
|
54
|
-
console.error(`Approval status: ${status}`);
|
|
55
|
-
lastStatus = status;
|
|
91
|
+
if (!pollRes.ok) {
|
|
92
|
+
// Transient errors happen; keep polling until timeout.
|
|
93
|
+
if (!lastStatus) {
|
|
94
|
+
console.error(`Waiting for approval… (poll error ${pollRes.status})`);
|
|
95
|
+
lastStatus = 'pending';
|
|
56
96
|
}
|
|
97
|
+
await sleep(intervalSeconds * 1000);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const poll = (await pollRes.json());
|
|
101
|
+
if (poll?.token && poll.userId) {
|
|
102
|
+
console.error('Approval received. Minting session…');
|
|
103
|
+
const session = await exchangeBearerForSession({ loginOrigin, bearerToken: poll.token, userId: poll.userId, scopes });
|
|
104
|
+
console.error('Login complete.');
|
|
105
|
+
return {
|
|
106
|
+
bearerToken: poll.token,
|
|
107
|
+
bearerExpiresAt: poll.expiresAt,
|
|
108
|
+
userId: poll.userId,
|
|
109
|
+
organizationId: typeof poll.organizationId === 'string' ? poll.organizationId : undefined,
|
|
110
|
+
organizationSlug: typeof poll.organizationSlug === 'string' ? poll.organizationSlug : undefined,
|
|
111
|
+
sessionToken: session.sessionToken,
|
|
112
|
+
sessionExpiresAt: session.expiresAt ?? undefined,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const status = String(poll?.status ?? 'pending');
|
|
116
|
+
if (status && status !== lastStatus) {
|
|
117
|
+
console.error(`Waiting for approval… (status: ${status}, elapsed: ${formatElapsed(Date.now() - startedAt)})`);
|
|
118
|
+
lastStatus = status;
|
|
57
119
|
}
|
|
58
120
|
await sleep(intervalSeconds * 1000);
|
|
59
121
|
}
|
|
60
122
|
throw new Error('Timed out waiting for approval');
|
|
61
123
|
}
|
|
62
|
-
async function exchangeBearerForSession(
|
|
63
|
-
const
|
|
124
|
+
async function exchangeBearerForSession(args) {
|
|
125
|
+
const { loginOrigin, bearerToken, userId, scopes } = args;
|
|
126
|
+
const wantsImpersonation = scopes.includes('auth.impersonate');
|
|
127
|
+
const endpoint = wantsImpersonation ? '/api/auth/m2m/session' : '/api/auth/m2m/session-self';
|
|
128
|
+
const sessionRes = await httpRequest(`${stripTrailingSlash(loginOrigin)}${endpoint}`, {
|
|
64
129
|
method: 'POST',
|
|
65
130
|
headers: {
|
|
66
131
|
Authorization: `Bearer ${bearerToken}`,
|
|
67
132
|
},
|
|
68
133
|
json: {
|
|
69
|
-
userId,
|
|
134
|
+
...(wantsImpersonation ? { userId } : {}),
|
|
70
135
|
returnToken: true,
|
|
71
136
|
redirect: '/profile',
|
|
72
137
|
},
|
|
@@ -76,29 +141,46 @@ async function exchangeBearerForSession(loginOrigin, bearerToken, userId) {
|
|
|
76
141
|
throw new Error(`Failed to mint session (${sessionRes.status}): ${await readErrorBodyText(sessionRes)}`);
|
|
77
142
|
}
|
|
78
143
|
const payload = (await sessionRes.json());
|
|
79
|
-
|
|
80
|
-
|
|
144
|
+
// Prefer the actual cookie value, since some backends return a session id in JSON
|
|
145
|
+
// while setting the real session token as a cookie.
|
|
146
|
+
const jar = new CookieJar();
|
|
147
|
+
for (const cookie of getSetCookieHeaders(sessionRes.headers)) {
|
|
148
|
+
jar.applySetCookie(cookie);
|
|
81
149
|
}
|
|
82
|
-
|
|
150
|
+
const cookieToken = jar.get('__Secure-better-auth.session_token') ?? jar.get('better-auth.session_token') ?? '';
|
|
151
|
+
const payloadToken = typeof payload?.sessionToken === 'string' ? payload.sessionToken.trim() : '';
|
|
152
|
+
const sessionToken = (cookieToken || payloadToken).trim();
|
|
153
|
+
if (!sessionToken) {
|
|
154
|
+
throw new Error('Login session endpoint did not return a usable session token');
|
|
155
|
+
}
|
|
156
|
+
return { sessionToken, expiresAt: payload.expiresAt };
|
|
83
157
|
}
|
|
84
158
|
function stripTrailingSlash(value) {
|
|
85
159
|
return value.replace(/\/+$/, '');
|
|
86
160
|
}
|
|
161
|
+
function formatElapsed(ms) {
|
|
162
|
+
const totalSeconds = Math.max(0, Math.floor(ms / 1000));
|
|
163
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
164
|
+
const seconds = totalSeconds % 60;
|
|
165
|
+
return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
|
|
166
|
+
}
|
|
87
167
|
function openUrl(url) {
|
|
88
168
|
try {
|
|
89
169
|
const platform = os.platform();
|
|
90
170
|
if (platform === 'darwin') {
|
|
91
171
|
execFileSync('open', [url], { stdio: 'ignore' });
|
|
92
|
-
return;
|
|
172
|
+
return true;
|
|
93
173
|
}
|
|
94
174
|
if (platform === 'win32') {
|
|
95
175
|
execFileSync('cmd', ['/c', 'start', '', url], { stdio: 'ignore' });
|
|
96
|
-
return;
|
|
176
|
+
return true;
|
|
97
177
|
}
|
|
98
178
|
execFileSync('xdg-open', [url], { stdio: 'ignore' });
|
|
179
|
+
return true;
|
|
99
180
|
}
|
|
100
181
|
catch {
|
|
101
182
|
// Best-effort only.
|
|
183
|
+
return false;
|
|
102
184
|
}
|
|
103
185
|
}
|
|
104
186
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|