@actuate-media/cli 0.10.0 → 0.11.1
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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +296 -36
- package/CHANGELOG.md +14 -0
- package/dist/__tests__/load-dotenv.test.d.ts +2 -0
- package/dist/__tests__/load-dotenv.test.d.ts.map +1 -0
- package/dist/__tests__/load-dotenv.test.js +40 -0
- package/dist/__tests__/load-dotenv.test.js.map +1 -0
- package/dist/__tests__/mcp-init.test.d.ts +2 -0
- package/dist/__tests__/mcp-init.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-init.test.js +100 -0
- package/dist/__tests__/mcp-init.test.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +126 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/load-dotenv.d.ts +11 -0
- package/dist/utils/load-dotenv.d.ts.map +1 -0
- package/dist/utils/load-dotenv.js +47 -0
- package/dist/utils/load-dotenv.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/load-dotenv.test.ts +53 -0
- package/src/__tests__/mcp-init.test.ts +125 -0
- package/src/commands/doctor.ts +4 -1
- package/src/commands/mcp.ts +181 -0
- package/src/index.ts +2 -0
- package/src/utils/load-dotenv.ts +52 -0
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,64 +1,324 @@
|
|
|
1
1
|
|
|
2
|
-
> @actuate-media/cli@0.
|
|
2
|
+
> @actuate-media/cli@0.11.1 test /home/runner/work/actuatecms/actuatecms/packages/cli
|
|
3
3
|
> vitest run
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.8 [39m[90m/home/runner/work/actuatecms/actuatecms/packages/cli[39m
|
|
7
7
|
|
|
8
|
-
[32m✓[39m dist/__tests__/db-sync.test.js [2m([22m[2m10 tests[22m[2m)[22m[33m
|
|
9
|
-
[32m✓[39m dist/__tests__/seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
10
|
-
[32m✓[39m src/__tests__/db-sync.test.ts [2m([22m[2m10 tests[22m[2m)[22m[
|
|
11
|
-
[32m✓[39m src/__tests__/seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
12
|
-
[32m✓[39m dist/__tests__/deployment-diagnostics.test.js [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
13
|
-
[32m✓[39m src/__tests__/deployment-diagnostics.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
8
|
+
[32m✓[39m dist/__tests__/db-sync.test.js [2m([22m[2m10 tests[22m[2m)[22m[33m 301[2mms[22m[39m
|
|
9
|
+
[32m✓[39m dist/__tests__/seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 92[2mms[22m[39m
|
|
10
|
+
[32m✓[39m src/__tests__/db-sync.test.ts [2m([22m[2m10 tests[22m[2m)[22m[33m 320[2mms[22m[39m
|
|
11
|
+
[32m✓[39m src/__tests__/seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 107[2mms[22m[39m
|
|
12
|
+
[32m✓[39m dist/__tests__/deployment-diagnostics.test.js [2m([22m[2m8 tests[22m[2m)[22m[32m 43[2mms[22m[39m
|
|
13
|
+
[32m✓[39m src/__tests__/deployment-diagnostics.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 55[2mms[22m[39m
|
|
14
14
|
- Reading canonical Actuate schema...
|
|
15
|
+
✔ Actuate CMS models added to schema.
|
|
16
|
+
- Running prisma generate...
|
|
15
17
|
[90mstdout[2m | dist/__tests__/db-init.test.js[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2minjects canonical models with @@map and no duplicate datasource/generator
|
|
16
18
|
[22m[39m✔ Prisma client generated.
|
|
17
19
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
- Reading canonical Actuate schema...
|
|
22
|
+
✖ Could not locate @actuate-media/cms-core.
|
|
21
23
|
[90mstdout[2m | dist/__tests__/db-init.test.js[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mfails clearly when cms-core cannot be located
|
|
22
24
|
[22m[39mℹ Install it first: `npm install @actuate-media/cms-core`.
|
|
23
|
-
- Reading canonical Actuate schema...
|
|
24
25
|
|
|
25
|
-
✖ Could not locate @actuate-media/cms-core.
|
|
26
26
|
- Reading canonical Actuate schema...
|
|
27
|
+
✔ Actuate CMS models added to schema.
|
|
28
|
+
- Running prisma generate...
|
|
27
29
|
[90mstdout[2m | dist/__tests__/db-init.test.js[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mis idempotent without --force
|
|
28
30
|
[22m[39m✔ Prisma client generated.
|
|
29
31
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
30
32
|
|
|
31
|
-
✔ Actuate CMS models added to schema.
|
|
32
|
-
- Running prisma generate...
|
|
33
33
|
- Reading canonical Actuate schema...
|
|
34
34
|
ℹ Actuate CMS models already present in schema. Use --force to overwrite.
|
|
35
|
-
[32m✓[39m dist/__tests__/db-init.test.js [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
35
|
+
[32m✓[39m dist/__tests__/db-init.test.js [2m([22m[2m4 tests[22m[2m)[22m[32m 228[2mms[22m[39m
|
|
36
36
|
- Reading canonical Actuate schema...
|
|
37
|
-
✔ Actuate CMS models added to schema.
|
|
38
|
-
- Running prisma generate...
|
|
39
37
|
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2minjects canonical models with @@map and no duplicate datasource/generator
|
|
40
38
|
[22m[39m✔ Prisma client generated.
|
|
41
39
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
✔ Actuate CMS models added to schema.
|
|
42
|
+
- Running prisma generate...
|
|
44
43
|
- Reading canonical Actuate schema...
|
|
44
|
+
✖ Could not locate @actuate-media/cms-core.
|
|
45
|
+
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mfails clearly when cms-core cannot be located
|
|
45
46
|
[22m[39mℹ Install it first: `npm install @actuate-media/cms-core`.
|
|
46
47
|
|
|
47
|
-
✖ Could not locate @actuate-media/cms-core.
|
|
48
48
|
- Reading canonical Actuate schema...
|
|
49
|
-
✔ Actuate CMS models added to schema.
|
|
50
|
-
- Running prisma generate...
|
|
51
49
|
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mis idempotent without --force
|
|
52
50
|
[22m[39m✔ Prisma client generated.
|
|
53
51
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
54
52
|
|
|
53
|
+
✔ Actuate CMS models added to schema.
|
|
54
|
+
- Running prisma generate...
|
|
55
55
|
- Reading canonical Actuate schema...
|
|
56
56
|
ℹ Actuate CMS models already present in schema. Use --force to overwrite.
|
|
57
|
-
[32m✓[39m src/__tests__/db-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
[32m✓[39m src/__tests__/db-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 226[2mms[22m[39m
|
|
58
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
59
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
60
|
+
|
|
61
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
62
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
63
|
+
|
|
64
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
65
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
66
|
+
|
|
67
|
+
Next steps
|
|
68
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
69
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
70
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
71
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
72
|
+
|
|
73
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
74
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
75
|
+
|
|
76
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
77
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
78
|
+
|
|
79
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
80
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
81
|
+
|
|
82
|
+
Next steps
|
|
83
|
+
1. Restart Cursor / VS Code so the MCP server is picked up
|
|
84
|
+
|
|
85
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
86
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
87
|
+
|
|
88
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
89
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
90
|
+
|
|
91
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
92
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
93
|
+
|
|
94
|
+
Next steps
|
|
95
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
96
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
97
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
98
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
99
|
+
|
|
100
|
+
[90mstderr[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
101
|
+
[22m[39m⚠.cursor/mcp.json already has an "actuate" server — use --force to replace it.
|
|
102
|
+
|
|
103
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
104
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
105
|
+
|
|
106
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
107
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
108
|
+
|
|
109
|
+
Next steps
|
|
110
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
111
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
112
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
113
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
114
|
+
|
|
115
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
116
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
117
|
+
|
|
118
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
119
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
120
|
+
|
|
121
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
122
|
+
[22m[39m
|
|
123
|
+
Next steps
|
|
124
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
125
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
126
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
127
|
+
|
|
128
|
+
[90mstderr[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
129
|
+
[22m[39m✖ .cursor/mcp.json contains invalid JSON — fix it or re-run with --force.
|
|
130
|
+
|
|
131
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
132
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
133
|
+
|
|
134
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
135
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
136
|
+
|
|
137
|
+
Next steps
|
|
138
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
139
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
140
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
141
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
142
|
+
|
|
143
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
144
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
145
|
+
|
|
146
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
147
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
148
|
+
|
|
149
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
150
|
+
[22m[39m
|
|
151
|
+
Next steps
|
|
152
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
153
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
154
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
155
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
156
|
+
|
|
157
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
158
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
159
|
+
|
|
160
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
161
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
162
|
+
|
|
163
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
164
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
165
|
+
|
|
166
|
+
Next steps
|
|
167
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
168
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
169
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
170
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
171
|
+
|
|
172
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
173
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
174
|
+
|
|
175
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
176
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
177
|
+
|
|
178
|
+
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
179
|
+
[22m[39m
|
|
180
|
+
Next steps
|
|
181
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
182
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
183
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
184
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
185
|
+
|
|
186
|
+
[32m✓[39m dist/__tests__/mcp-init.test.js [2m([22m[2m6 tests[22m[2m)[22m[33m 420[2mms[22m[39m
|
|
187
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
188
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
189
|
+
|
|
190
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
191
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
192
|
+
|
|
193
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
194
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
195
|
+
|
|
196
|
+
Next steps
|
|
197
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
198
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
199
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
200
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
201
|
+
|
|
202
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
203
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
204
|
+
|
|
205
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
206
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
207
|
+
|
|
208
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mapplies --url and --key to both configs
|
|
209
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
210
|
+
|
|
211
|
+
Next steps
|
|
212
|
+
1. Restart Cursor / VS Code so the MCP server is picked up
|
|
213
|
+
|
|
214
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
215
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
216
|
+
|
|
217
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
218
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
219
|
+
|
|
220
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mmerges into an existing config without clobbering other servers
|
|
221
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
222
|
+
|
|
223
|
+
Next steps
|
|
224
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
225
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
226
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
227
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
228
|
+
|
|
229
|
+
[90mstderr[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
230
|
+
[22m[39m⚠.cursor/mcp.json already has an "actuate" server — use --force to replace it.
|
|
231
|
+
|
|
232
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
233
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
234
|
+
|
|
235
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
236
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
237
|
+
|
|
238
|
+
Next steps
|
|
239
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
240
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
241
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
242
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
243
|
+
|
|
244
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
245
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
246
|
+
|
|
247
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
248
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
249
|
+
|
|
250
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mleaves an existing actuate entry alone unless --force is passed
|
|
251
|
+
[22m[39m
|
|
252
|
+
Next steps
|
|
253
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
254
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
255
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
256
|
+
|
|
257
|
+
[90mstderr[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
258
|
+
[22m[39m✖ .cursor/mcp.json contains invalid JSON — fix it or re-run with --force.
|
|
259
|
+
|
|
260
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
261
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
262
|
+
|
|
263
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
264
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
265
|
+
|
|
266
|
+
Next steps
|
|
267
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
268
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
269
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
270
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
271
|
+
|
|
272
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
273
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
274
|
+
|
|
275
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
276
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
277
|
+
|
|
278
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mfails on invalid JSON without --force, overwrites with --force
|
|
279
|
+
[22m[39m
|
|
280
|
+
Next steps
|
|
281
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
282
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
283
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
284
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
285
|
+
|
|
286
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
287
|
+
[22m[39m✔ Created .cursor/mcp.json
|
|
288
|
+
|
|
289
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
290
|
+
[22m[39m✔ Created .vscode/mcp.json
|
|
291
|
+
|
|
292
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
293
|
+
[22m[39m✔ Added to .gitignore: .cursor/mcp.json, .vscode/mcp.json
|
|
294
|
+
|
|
295
|
+
Next steps
|
|
296
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
297
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
298
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
299
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
300
|
+
|
|
301
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
302
|
+
[22m[39m✔ Updated .cursor/mcp.json
|
|
303
|
+
|
|
304
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
305
|
+
[22m[39m✔ Updated .vscode/mcp.json
|
|
306
|
+
|
|
307
|
+
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mdoes not duplicate gitignore entries on re-runs
|
|
308
|
+
[22m[39m
|
|
309
|
+
Next steps
|
|
310
|
+
1. Mint an API key in Admin → Settings → API Keys (act_sk_...)
|
|
311
|
+
2. Replace act_sk_REPLACE_WITH_YOUR_KEY in both config files with the real key
|
|
312
|
+
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
313
|
+
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
314
|
+
|
|
315
|
+
[32m✓[39m src/__tests__/mcp-init.test.ts [2m([22m[2m6 tests[22m[2m)[22m[33m 407[2mms[22m[39m
|
|
316
|
+
[32m✓[39m dist/__tests__/form-seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 59[2mms[22m[39m
|
|
317
|
+
[32m✓[39m src/__tests__/form-seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 75[2mms[22m[39m
|
|
318
|
+
[32m✓[39m dist/__tests__/vercel-env-matrix.test.js [2m([22m[2m5 tests[22m[2m)[22m[32m 66[2mms[22m[39m
|
|
319
|
+
[32m✓[39m src/__tests__/vercel-env-matrix.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 56[2mms[22m[39m
|
|
320
|
+
[32m✓[39m dist/__tests__/load-dotenv.test.js [2m([22m[2m3 tests[22m[2m)[22m[32m 65[2mms[22m[39m
|
|
321
|
+
[32m✓[39m src/__tests__/load-dotenv.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 54[2mms[22m[39m
|
|
62
322
|
- Reading canonical Actuate schema...
|
|
63
323
|
✔ Actuate CMS models added to schema.
|
|
64
324
|
- Running prisma generate...
|
|
@@ -66,20 +326,20 @@
|
|
|
66
326
|
[22m[39m✔ Prisma client generated.
|
|
67
327
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
68
328
|
|
|
69
|
-
[32m✓[39m dist/__tests__/schema-fragment.test.js [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
329
|
+
[32m✓[39m dist/__tests__/schema-fragment.test.js [2m([22m[2m1 test[22m[2m)[22m[32m 146[2mms[22m[39m
|
|
70
330
|
- Reading canonical Actuate schema...
|
|
71
|
-
[90mstdout[2m | src/__tests__/schema-fragment.test.ts[2m > [22m[2mdb:init schema fragment[2m > [22m[2minjects all deploy-critical Actuate models
|
|
72
331
|
✔ Actuate CMS models added to schema.
|
|
332
|
+
- Running prisma generate...
|
|
333
|
+
[90mstdout[2m | src/__tests__/schema-fragment.test.ts[2m > [22m[2mdb:init schema fragment[2m > [22m[2minjects all deploy-critical Actuate models
|
|
73
334
|
[22m[39m✔ Prisma client generated.
|
|
74
335
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
75
336
|
|
|
76
|
-
-
|
|
77
|
-
[32m✓[39m
|
|
78
|
-
[32m✓[39m
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
[2m
|
|
82
|
-
[2m
|
|
83
|
-
[2m
|
|
84
|
-
[2m Duration [22m 23.79s[2m (transform 2.27s, setup 0ms, import 6.86s, tests 2.20s, environment 2ms)[22m
|
|
337
|
+
[32m✓[39m src/__tests__/schema-fragment.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 130[2mms[22m[39m
|
|
338
|
+
[32m✓[39m dist/__tests__/init.test.js [2m([22m[2m2 tests[22m[2m)[22m[32m 16[2mms[22m[39m
|
|
339
|
+
[32m✓[39m src/__tests__/init.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 31[2mms[22m[39m
|
|
340
|
+
|
|
341
|
+
[2m Test Files [22m [1m[32m20 passed[39m[22m[90m (20)[39m
|
|
342
|
+
[2m Tests [22m [1m[32m118 passed[39m[22m[90m (118)[39m
|
|
343
|
+
[2m Start at [22m 01:58:55
|
|
344
|
+
[2m Duration [22m 27.03s[2m (transform 2.41s, setup 0ms, import 6.84s, tests 2.90s, environment 16ms)[22m
|
|
85
345
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @actuate-media/cli
|
|
2
2
|
|
|
3
|
+
## 0.11.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4899af9: Fix consumer production builds on Next.js 16 by not injecting a no-op webpack hook in `withActuateCMS`. Add `CRON_SECRET` to scaffold `.env.example`. Remove obsolete `earlyAccess` from scaffolded `prisma.config.ts`. Load project `.env` files in `actuate doctor` and `actuate deploy:check`.
|
|
8
|
+
|
|
9
|
+
## 0.11.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- eb998e5: New `actuate mcp:init` command — retrofit the Actuate MCP server onto existing projects.
|
|
14
|
+
|
|
15
|
+
Writes `.cursor/mcp.json` (Cursor / Claude Desktop shape) and `.vscode/mcp.json` (VS Code shape) wiring `@actuate-media/mcp-server`, with `--url` / `--key` options. Merges into existing configs without clobbering other MCP servers; an existing `actuate` entry is only replaced with `--force`. Both paths are appended to `.gitignore` so a real `act_sk_...` key is never committed. New scaffolds already get these files from `create-actuate-cms` — this closes the gap for projects created before that.
|
|
16
|
+
|
|
3
17
|
## 0.10.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-dotenv.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/load-dotenv.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { mkdtemp, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { loadProjectEnv, parseDotenv } from '../utils/load-dotenv.js';
|
|
6
|
+
describe('parseDotenv', () => {
|
|
7
|
+
it('parses KEY=VALUE lines and strips quotes', () => {
|
|
8
|
+
expect(parseDotenv(`
|
|
9
|
+
# comment
|
|
10
|
+
CMS_SECRET=abc123456789012345678901234567890
|
|
11
|
+
DATABASE_URL="postgresql://x"
|
|
12
|
+
EMPTY=
|
|
13
|
+
`)).toEqual({
|
|
14
|
+
CMS_SECRET: 'abc123456789012345678901234567890',
|
|
15
|
+
DATABASE_URL: 'postgresql://x',
|
|
16
|
+
EMPTY: '',
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('loadProjectEnv', () => {
|
|
21
|
+
it('loads .env and lets .env.local override empty base values', async () => {
|
|
22
|
+
const dir = await mkdtemp(join(tmpdir(), 'actuate-doctor-env-'));
|
|
23
|
+
await writeFile(join(dir, '.env'), 'CMS_SECRET=from-dotenv\nCMS_ENCRYPTION_KEY=enc\n', 'utf-8');
|
|
24
|
+
await writeFile(join(dir, '.env.local'), 'NEXT_PUBLIC_SITE_URL=http://localhost:3000\n', 'utf-8');
|
|
25
|
+
const env = await loadProjectEnv(dir, {
|
|
26
|
+
DATABASE_URL: 'postgresql://preset',
|
|
27
|
+
});
|
|
28
|
+
expect(env.DATABASE_URL).toBe('postgresql://preset');
|
|
29
|
+
expect(env.CMS_SECRET).toBe('from-dotenv');
|
|
30
|
+
expect(env.CMS_ENCRYPTION_KEY).toBe('enc');
|
|
31
|
+
expect(env.NEXT_PUBLIC_SITE_URL).toBe('http://localhost:3000');
|
|
32
|
+
});
|
|
33
|
+
it('does not override non-empty values already in the parent env', async () => {
|
|
34
|
+
const dir = await mkdtemp(join(tmpdir(), 'actuate-doctor-env-'));
|
|
35
|
+
await writeFile(join(dir, '.env'), 'CMS_SECRET=from-file\n', 'utf-8');
|
|
36
|
+
const env = await loadProjectEnv(dir, { CMS_SECRET: 'from-shell' });
|
|
37
|
+
expect(env.CMS_SECRET).toBe('from-shell');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=load-dotenv.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-dotenv.test.js","sourceRoot":"","sources":["../../src/__tests__/load-dotenv.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CACJ,WAAW,CAAC;;;;;CAKjB,CAAC,CACG,CAAC,OAAO,CAAC;YACR,UAAU,EAAE,mCAAmC;YAC/C,YAAY,EAAE,gBAAgB;YAC9B,KAAK,EAAE,EAAE;SACV,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAA;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,kDAAkD,EAAE,OAAO,CAAC,CAAA;QAC/F,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EACvB,8CAA8C,EAC9C,OAAO,CACR,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE;YACpC,YAAY,EAAE,qBAAqB;SACpC,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACpD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAA;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAA;QAErE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAA;QAEnE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-init.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-init.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { registerMcpCommand } from '../commands/mcp.js';
|
|
7
|
+
/**
|
|
8
|
+
* `actuate mcp:init` retrofits MCP editor configs onto existing projects.
|
|
9
|
+
* Pins the merge contract: other configured servers are never clobbered, an
|
|
10
|
+
* existing `actuate` entry needs `--force`, and both config paths end up
|
|
11
|
+
* git-ignored (they hold a real API key once configured).
|
|
12
|
+
*/
|
|
13
|
+
let projectDir;
|
|
14
|
+
let originalCwd;
|
|
15
|
+
async function run(args = []) {
|
|
16
|
+
const program = new Command();
|
|
17
|
+
program.exitOverride();
|
|
18
|
+
registerMcpCommand(program);
|
|
19
|
+
await program.parseAsync(['mcp:init', ...args], { from: 'user' });
|
|
20
|
+
}
|
|
21
|
+
async function readJson(relPath) {
|
|
22
|
+
return JSON.parse(await readFile(path.join(projectDir, relPath), 'utf8'));
|
|
23
|
+
}
|
|
24
|
+
beforeEach(async () => {
|
|
25
|
+
originalCwd = process.cwd();
|
|
26
|
+
projectDir = await mkdtemp(path.join(tmpdir(), 'actuate-mcp-init-'));
|
|
27
|
+
process.chdir(projectDir);
|
|
28
|
+
});
|
|
29
|
+
afterEach(async () => {
|
|
30
|
+
process.chdir(originalCwd);
|
|
31
|
+
process.exitCode = 0;
|
|
32
|
+
await rm(projectDir, { recursive: true, force: true });
|
|
33
|
+
});
|
|
34
|
+
describe('mcp:init', () => {
|
|
35
|
+
it('creates both editor configs with placeholder key and git-ignores them', async () => {
|
|
36
|
+
await writeFile(path.join(projectDir, '.gitignore'), 'node_modules\n', 'utf8');
|
|
37
|
+
await run();
|
|
38
|
+
const cursor = await readJson('.cursor/mcp.json');
|
|
39
|
+
expect(cursor.mcpServers.actuate.command).toBe('npx');
|
|
40
|
+
expect(cursor.mcpServers.actuate.args).toEqual(['-y', '@actuate-media/mcp-server']);
|
|
41
|
+
expect(cursor.mcpServers.actuate.env.ACTUATE_BASE_URL).toBe('http://localhost:3000');
|
|
42
|
+
expect(cursor.mcpServers.actuate.env.ACTUATE_API_KEY).toBe('act_sk_REPLACE_WITH_YOUR_KEY');
|
|
43
|
+
const vscode = await readJson('.vscode/mcp.json');
|
|
44
|
+
expect(vscode.servers.actuate.type).toBe('stdio');
|
|
45
|
+
const gitignore = await readFile(path.join(projectDir, '.gitignore'), 'utf8');
|
|
46
|
+
expect(gitignore).toContain('node_modules');
|
|
47
|
+
expect(gitignore).toContain('.cursor/mcp.json');
|
|
48
|
+
expect(gitignore).toContain('.vscode/mcp.json');
|
|
49
|
+
});
|
|
50
|
+
it('applies --url and --key to both configs', async () => {
|
|
51
|
+
await run(['--url', 'https://example.com', '--key', 'act_sk_real123']);
|
|
52
|
+
const cursor = await readJson('.cursor/mcp.json');
|
|
53
|
+
expect(cursor.mcpServers.actuate.env).toEqual({
|
|
54
|
+
ACTUATE_BASE_URL: 'https://example.com',
|
|
55
|
+
ACTUATE_API_KEY: 'act_sk_real123',
|
|
56
|
+
});
|
|
57
|
+
const vscode = await readJson('.vscode/mcp.json');
|
|
58
|
+
expect(vscode.servers.actuate.env.ACTUATE_BASE_URL).toBe('https://example.com');
|
|
59
|
+
});
|
|
60
|
+
it('merges into an existing config without clobbering other servers', async () => {
|
|
61
|
+
await mkdir(path.join(projectDir, '.cursor'), { recursive: true });
|
|
62
|
+
await writeFile(path.join(projectDir, '.cursor', 'mcp.json'), JSON.stringify({ mcpServers: { sentry: { command: 'sentry-mcp' } } }), 'utf8');
|
|
63
|
+
await run();
|
|
64
|
+
const cursor = await readJson('.cursor/mcp.json');
|
|
65
|
+
expect(cursor.mcpServers.sentry).toEqual({ command: 'sentry-mcp' });
|
|
66
|
+
expect(cursor.mcpServers.actuate).toBeDefined();
|
|
67
|
+
});
|
|
68
|
+
it('leaves an existing actuate entry alone unless --force is passed', async () => {
|
|
69
|
+
await mkdir(path.join(projectDir, '.cursor'), { recursive: true });
|
|
70
|
+
const existing = {
|
|
71
|
+
mcpServers: { actuate: { command: 'custom', env: { ACTUATE_BASE_URL: 'https://keep.me' } } },
|
|
72
|
+
};
|
|
73
|
+
await writeFile(path.join(projectDir, '.cursor', 'mcp.json'), JSON.stringify(existing), 'utf8');
|
|
74
|
+
await run();
|
|
75
|
+
let cursor = await readJson('.cursor/mcp.json');
|
|
76
|
+
expect(cursor.mcpServers.actuate.command).toBe('custom');
|
|
77
|
+
await run(['--force', '--url', 'https://new.example.com']);
|
|
78
|
+
cursor = await readJson('.cursor/mcp.json');
|
|
79
|
+
expect(cursor.mcpServers.actuate.command).toBe('npx');
|
|
80
|
+
expect(cursor.mcpServers.actuate.env.ACTUATE_BASE_URL).toBe('https://new.example.com');
|
|
81
|
+
});
|
|
82
|
+
it('fails on invalid JSON without --force, overwrites with --force', async () => {
|
|
83
|
+
await mkdir(path.join(projectDir, '.cursor'), { recursive: true });
|
|
84
|
+
await writeFile(path.join(projectDir, '.cursor', 'mcp.json'), '{ not json', 'utf8');
|
|
85
|
+
await run();
|
|
86
|
+
expect(process.exitCode).toBe(1);
|
|
87
|
+
process.exitCode = 0;
|
|
88
|
+
await run(['--force']);
|
|
89
|
+
const cursor = await readJson('.cursor/mcp.json');
|
|
90
|
+
expect(cursor.mcpServers.actuate).toBeDefined();
|
|
91
|
+
});
|
|
92
|
+
it('does not duplicate gitignore entries on re-runs', async () => {
|
|
93
|
+
await run();
|
|
94
|
+
await run(['--force']);
|
|
95
|
+
const gitignore = await readFile(path.join(projectDir, '.gitignore'), 'utf8');
|
|
96
|
+
const count = gitignore.split('\n').filter((l) => l.trim() === '.cursor/mcp.json').length;
|
|
97
|
+
expect(count).toBe(1);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=mcp-init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-init.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0GnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB5D;AAsED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8CjE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqD5D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -4,6 +4,7 @@ import chalk from 'chalk';
|
|
|
4
4
|
import { buildDeploymentManifest, createDiagnosticReport, detectPackageManager, VERCEL_MATRIX_OPTIONAL, VERCEL_MATRIX_REQUIRED, } from '../deployment/diagnostics.js';
|
|
5
5
|
import { createVercelClient, readVercelLink, resolveVercelToken, VercelApiError, VERCEL_TARGETS, } from '../vercel/client.js';
|
|
6
6
|
import { buildEnvMatrix } from '../vercel/env-matrix.js';
|
|
7
|
+
import { loadProjectEnv } from '../utils/load-dotenv.js';
|
|
7
8
|
import { logger } from '../utils/logger.js';
|
|
8
9
|
async function fileExists(path) {
|
|
9
10
|
try {
|
|
@@ -69,11 +70,12 @@ async function buildReport(schemaPath, configPath, mode = 'doctor') {
|
|
|
69
70
|
readOptionalFile(resolvedConfig),
|
|
70
71
|
detectProjectPackageManager(),
|
|
71
72
|
]);
|
|
73
|
+
const env = await loadProjectEnv(process.cwd());
|
|
72
74
|
return createDiagnosticReport({
|
|
73
75
|
schemaModels,
|
|
74
76
|
schemaContent,
|
|
75
77
|
configContent,
|
|
76
|
-
env
|
|
78
|
+
env,
|
|
77
79
|
packageManager,
|
|
78
80
|
schemaPath,
|
|
79
81
|
mode,
|