@jackwener/opencli 0.9.6 → 1.0.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 (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  4. package/.github/ISSUE_TEMPLATE/new_site_adapter.yml +57 -0
  5. package/.github/dependabot.yml +27 -0
  6. package/.github/pull_request_template.md +24 -0
  7. package/.github/workflows/ci.yml +14 -8
  8. package/.github/workflows/e2e-headed.yml +6 -2
  9. package/.github/workflows/pkg-pr-new.yml +2 -2
  10. package/.github/workflows/release-please.yml +25 -0
  11. package/.github/workflows/release.yml +2 -2
  12. package/.github/workflows/security.yml +36 -0
  13. package/CDP.md +1 -1
  14. package/CDP.zh-CN.md +1 -1
  15. package/CLI-ELECTRON.md +89 -36
  16. package/CLI-EXPLORER.md +4 -4
  17. package/CONTRIBUTING.md +167 -0
  18. package/README.md +113 -89
  19. package/README.zh-CN.md +114 -91
  20. package/SKILL.md +10 -8
  21. package/TESTING.md +7 -7
  22. package/dist/browser/daemon-client.d.ts +37 -0
  23. package/dist/browser/daemon-client.js +82 -0
  24. package/dist/browser/discover.d.ts +11 -34
  25. package/dist/browser/discover.js +15 -190
  26. package/dist/browser/errors.d.ts +6 -20
  27. package/dist/browser/errors.js +24 -63
  28. package/dist/browser/index.d.ts +2 -11
  29. package/dist/browser/index.js +5 -11
  30. package/dist/browser/mcp.d.ts +9 -18
  31. package/dist/browser/mcp.js +70 -284
  32. package/dist/browser/page.d.ts +28 -6
  33. package/dist/browser/page.js +210 -85
  34. package/dist/browser.test.js +4 -202
  35. package/dist/build-manifest.d.ts +26 -0
  36. package/dist/build-manifest.js +132 -60
  37. package/dist/build-manifest.test.d.ts +1 -0
  38. package/dist/build-manifest.test.js +26 -0
  39. package/dist/cli-manifest.json +1582 -29
  40. package/dist/clis/bilibili/download.d.ts +10 -0
  41. package/dist/clis/bilibili/download.js +135 -0
  42. package/dist/clis/chatwise/ask.d.ts +1 -0
  43. package/dist/clis/chatwise/ask.js +76 -0
  44. package/dist/clis/chatwise/export.d.ts +1 -0
  45. package/dist/clis/chatwise/export.js +46 -0
  46. package/dist/clis/chatwise/history.d.ts +1 -0
  47. package/dist/clis/chatwise/history.js +43 -0
  48. package/dist/clis/chatwise/model.d.ts +1 -0
  49. package/dist/clis/chatwise/model.js +81 -0
  50. package/dist/clis/chatwise/new.d.ts +1 -0
  51. package/dist/clis/chatwise/new.js +18 -0
  52. package/dist/clis/chatwise/read.d.ts +1 -0
  53. package/dist/clis/chatwise/read.js +39 -0
  54. package/dist/clis/chatwise/screenshot.d.ts +1 -0
  55. package/dist/clis/chatwise/screenshot.js +27 -0
  56. package/dist/clis/chatwise/send.d.ts +1 -0
  57. package/dist/clis/chatwise/send.js +45 -0
  58. package/dist/clis/chatwise/status.d.ts +1 -0
  59. package/dist/clis/chatwise/status.js +22 -0
  60. package/dist/clis/discord-app/channels.d.ts +1 -0
  61. package/dist/clis/discord-app/channels.js +45 -0
  62. package/dist/clis/discord-app/members.d.ts +1 -0
  63. package/dist/clis/discord-app/members.js +38 -0
  64. package/dist/clis/discord-app/read.d.ts +1 -0
  65. package/dist/clis/discord-app/read.js +45 -0
  66. package/dist/clis/discord-app/search.d.ts +1 -0
  67. package/dist/clis/discord-app/search.js +56 -0
  68. package/dist/clis/discord-app/send.d.ts +1 -0
  69. package/dist/clis/discord-app/send.js +27 -0
  70. package/dist/clis/discord-app/servers.d.ts +1 -0
  71. package/dist/clis/discord-app/servers.js +36 -0
  72. package/dist/clis/discord-app/status.d.ts +1 -0
  73. package/dist/clis/discord-app/status.js +16 -0
  74. package/dist/clis/feishu/new.d.ts +1 -0
  75. package/dist/clis/feishu/new.js +27 -0
  76. package/dist/clis/feishu/read.d.ts +1 -0
  77. package/dist/clis/feishu/read.js +40 -0
  78. package/dist/clis/feishu/search.d.ts +1 -0
  79. package/dist/clis/feishu/search.js +30 -0
  80. package/dist/clis/feishu/send.d.ts +1 -0
  81. package/dist/clis/feishu/send.js +39 -0
  82. package/dist/clis/feishu/status.d.ts +1 -0
  83. package/dist/clis/feishu/status.js +28 -0
  84. package/dist/clis/grok/ask.d.ts +1 -0
  85. package/dist/clis/grok/ask.js +82 -0
  86. package/dist/clis/grok/debug.d.ts +1 -0
  87. package/dist/clis/grok/debug.js +45 -0
  88. package/dist/clis/jimeng/generate.yaml +84 -0
  89. package/dist/clis/jimeng/history.yaml +47 -0
  90. package/dist/clis/linux-do/categories.yaml +41 -0
  91. package/dist/clis/linux-do/category.yaml +49 -0
  92. package/dist/clis/linux-do/hot.yaml +50 -0
  93. package/dist/clis/linux-do/latest.yaml +40 -0
  94. package/dist/clis/linux-do/search.yaml +45 -0
  95. package/dist/clis/linux-do/topic.yaml +38 -0
  96. package/dist/clis/neteasemusic/like.d.ts +1 -0
  97. package/dist/clis/neteasemusic/like.js +25 -0
  98. package/dist/clis/neteasemusic/lyrics.d.ts +1 -0
  99. package/dist/clis/neteasemusic/lyrics.js +47 -0
  100. package/dist/clis/neteasemusic/next.d.ts +1 -0
  101. package/dist/clis/neteasemusic/next.js +26 -0
  102. package/dist/clis/neteasemusic/play.d.ts +1 -0
  103. package/dist/clis/neteasemusic/play.js +26 -0
  104. package/dist/clis/neteasemusic/playing.d.ts +1 -0
  105. package/dist/clis/neteasemusic/playing.js +59 -0
  106. package/dist/clis/neteasemusic/playlist.d.ts +1 -0
  107. package/dist/clis/neteasemusic/playlist.js +46 -0
  108. package/dist/clis/neteasemusic/prev.d.ts +1 -0
  109. package/dist/clis/neteasemusic/prev.js +25 -0
  110. package/dist/clis/neteasemusic/search.d.ts +1 -0
  111. package/dist/clis/neteasemusic/search.js +52 -0
  112. package/dist/clis/neteasemusic/status.d.ts +1 -0
  113. package/dist/clis/neteasemusic/status.js +16 -0
  114. package/dist/clis/neteasemusic/volume.d.ts +1 -0
  115. package/dist/clis/neteasemusic/volume.js +54 -0
  116. package/dist/clis/notion/export.d.ts +1 -0
  117. package/dist/clis/notion/export.js +31 -0
  118. package/dist/clis/notion/favorites.d.ts +1 -0
  119. package/dist/clis/notion/favorites.js +84 -0
  120. package/dist/clis/notion/new.d.ts +1 -0
  121. package/dist/clis/notion/new.js +34 -0
  122. package/dist/clis/notion/read.d.ts +1 -0
  123. package/dist/clis/notion/read.js +30 -0
  124. package/dist/clis/notion/search.d.ts +1 -0
  125. package/dist/clis/notion/search.js +46 -0
  126. package/dist/clis/notion/sidebar.d.ts +1 -0
  127. package/dist/clis/notion/sidebar.js +41 -0
  128. package/dist/clis/notion/status.d.ts +1 -0
  129. package/dist/clis/notion/status.js +16 -0
  130. package/dist/clis/notion/write.d.ts +1 -0
  131. package/dist/clis/notion/write.js +40 -0
  132. package/dist/clis/twitter/download.d.ts +8 -0
  133. package/dist/clis/twitter/download.js +204 -0
  134. package/dist/clis/wechat/chats.d.ts +1 -0
  135. package/dist/clis/wechat/chats.js +28 -0
  136. package/dist/clis/wechat/contacts.d.ts +1 -0
  137. package/dist/clis/wechat/contacts.js +28 -0
  138. package/dist/clis/wechat/read.d.ts +1 -0
  139. package/dist/clis/wechat/read.js +58 -0
  140. package/dist/clis/wechat/search.d.ts +1 -0
  141. package/dist/clis/wechat/search.js +31 -0
  142. package/dist/clis/wechat/send.d.ts +1 -0
  143. package/dist/clis/wechat/send.js +42 -0
  144. package/dist/clis/wechat/status.d.ts +1 -0
  145. package/dist/clis/wechat/status.js +29 -0
  146. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +10 -0
  147. package/dist/clis/xiaohongshu/creator-note-detail.js +88 -0
  148. package/dist/clis/xiaohongshu/creator-notes.d.ts +11 -0
  149. package/dist/clis/xiaohongshu/creator-notes.js +109 -0
  150. package/dist/clis/xiaohongshu/creator-profile.d.ts +10 -0
  151. package/dist/clis/xiaohongshu/creator-profile.js +54 -0
  152. package/dist/clis/xiaohongshu/creator-stats.d.ts +10 -0
  153. package/dist/clis/xiaohongshu/creator-stats.js +74 -0
  154. package/dist/clis/xiaohongshu/download.d.ts +7 -0
  155. package/dist/clis/xiaohongshu/download.js +155 -0
  156. package/dist/clis/xiaohongshu/search.js +1 -1
  157. package/dist/clis/xiaohongshu/user-helpers.d.ts +15 -0
  158. package/dist/clis/xiaohongshu/user-helpers.js +67 -0
  159. package/dist/clis/xiaohongshu/user-helpers.test.d.ts +1 -0
  160. package/dist/clis/xiaohongshu/user-helpers.test.js +81 -0
  161. package/dist/clis/xiaohongshu/user.js +46 -29
  162. package/dist/clis/zhihu/download.d.ts +11 -0
  163. package/dist/clis/zhihu/download.js +186 -0
  164. package/dist/clis/zhihu/download.test.d.ts +1 -0
  165. package/dist/clis/zhihu/download.test.js +10 -0
  166. package/dist/daemon.d.ts +13 -0
  167. package/dist/daemon.js +187 -0
  168. package/dist/doctor.d.ts +27 -61
  169. package/dist/doctor.js +70 -601
  170. package/dist/doctor.test.js +30 -170
  171. package/dist/download/index.d.ts +79 -0
  172. package/dist/download/index.js +325 -0
  173. package/dist/download/progress.d.ts +36 -0
  174. package/dist/download/progress.js +111 -0
  175. package/dist/engine.test.js +15 -0
  176. package/dist/main.js +22 -28
  177. package/dist/pipeline/executor.test.js +1 -0
  178. package/dist/pipeline/registry.js +2 -0
  179. package/dist/pipeline/steps/browser.js +2 -2
  180. package/dist/pipeline/steps/download.d.ts +34 -0
  181. package/dist/pipeline/steps/download.js +251 -0
  182. package/dist/pipeline/steps/intercept.js +1 -2
  183. package/dist/pipeline/template.js +28 -0
  184. package/dist/setup.d.ts +6 -0
  185. package/dist/setup.js +46 -160
  186. package/dist/types.d.ts +6 -0
  187. package/extension/icons/icon-128.png +0 -0
  188. package/extension/icons/icon-16.png +0 -0
  189. package/extension/icons/icon-32.png +0 -0
  190. package/extension/icons/icon-48.png +0 -0
  191. package/extension/manifest.json +31 -0
  192. package/extension/package.json +16 -0
  193. package/extension/src/background.ts +293 -0
  194. package/extension/src/cdp.ts +125 -0
  195. package/extension/src/protocol.ts +57 -0
  196. package/extension/store-assets/screenshot-1280x800.png +0 -0
  197. package/extension/tsconfig.json +15 -0
  198. package/extension/vite.config.ts +18 -0
  199. package/package.json +8 -7
  200. package/scripts/test-site.mjs +70 -0
  201. package/src/browser/daemon-client.ts +113 -0
  202. package/src/browser/discover.ts +18 -216
  203. package/src/browser/errors.ts +30 -100
  204. package/src/browser/index.ts +6 -12
  205. package/src/browser/mcp.ts +78 -278
  206. package/src/browser/page.ts +222 -88
  207. package/src/browser.test.ts +3 -210
  208. package/src/build-manifest.test.ts +28 -0
  209. package/src/build-manifest.ts +147 -57
  210. package/src/clis/bilibili/download.ts +161 -0
  211. package/src/clis/chatgpt/README.md +1 -1
  212. package/src/clis/chatgpt/README.zh-CN.md +1 -1
  213. package/src/clis/chatwise/README.md +38 -0
  214. package/src/clis/chatwise/README.zh-CN.md +38 -0
  215. package/src/clis/chatwise/ask.ts +87 -0
  216. package/src/clis/chatwise/export.ts +51 -0
  217. package/src/clis/chatwise/history.ts +47 -0
  218. package/src/clis/chatwise/model.ts +87 -0
  219. package/src/clis/chatwise/new.ts +21 -0
  220. package/src/clis/chatwise/read.ts +42 -0
  221. package/src/clis/chatwise/screenshot.ts +33 -0
  222. package/src/clis/chatwise/send.ts +50 -0
  223. package/src/clis/chatwise/status.ts +25 -0
  224. package/src/clis/discord-app/README.md +28 -0
  225. package/src/clis/discord-app/README.zh-CN.md +28 -0
  226. package/src/clis/discord-app/channels.ts +48 -0
  227. package/src/clis/discord-app/members.ts +41 -0
  228. package/src/clis/discord-app/read.ts +49 -0
  229. package/src/clis/discord-app/search.ts +64 -0
  230. package/src/clis/discord-app/send.ts +32 -0
  231. package/src/clis/discord-app/servers.ts +39 -0
  232. package/src/clis/discord-app/status.ts +18 -0
  233. package/src/clis/feishu/README.md +20 -0
  234. package/src/clis/feishu/README.zh-CN.md +20 -0
  235. package/src/clis/feishu/new.ts +32 -0
  236. package/src/clis/feishu/read.ts +48 -0
  237. package/src/clis/feishu/search.ts +35 -0
  238. package/src/clis/feishu/send.ts +46 -0
  239. package/src/clis/feishu/status.ts +34 -0
  240. package/src/clis/grok/ask.ts +90 -0
  241. package/src/clis/grok/debug.ts +49 -0
  242. package/src/clis/jimeng/generate.yaml +84 -0
  243. package/src/clis/jimeng/history.yaml +47 -0
  244. package/src/clis/linux-do/categories.yaml +41 -0
  245. package/src/clis/linux-do/category.yaml +49 -0
  246. package/src/clis/linux-do/hot.yaml +50 -0
  247. package/src/clis/linux-do/latest.yaml +40 -0
  248. package/src/clis/linux-do/search.yaml +45 -0
  249. package/src/clis/linux-do/topic.yaml +38 -0
  250. package/src/clis/neteasemusic/README.md +31 -0
  251. package/src/clis/neteasemusic/README.zh-CN.md +31 -0
  252. package/src/clis/neteasemusic/like.ts +28 -0
  253. package/src/clis/neteasemusic/lyrics.ts +53 -0
  254. package/src/clis/neteasemusic/next.ts +30 -0
  255. package/src/clis/neteasemusic/play.ts +30 -0
  256. package/src/clis/neteasemusic/playing.ts +62 -0
  257. package/src/clis/neteasemusic/playlist.ts +51 -0
  258. package/src/clis/neteasemusic/prev.ts +29 -0
  259. package/src/clis/neteasemusic/search.ts +58 -0
  260. package/src/clis/neteasemusic/status.ts +18 -0
  261. package/src/clis/neteasemusic/volume.ts +61 -0
  262. package/src/clis/notion/README.md +29 -0
  263. package/src/clis/notion/README.zh-CN.md +29 -0
  264. package/src/clis/notion/export.ts +36 -0
  265. package/src/clis/notion/favorites.ts +87 -0
  266. package/src/clis/notion/new.ts +39 -0
  267. package/src/clis/notion/read.ts +33 -0
  268. package/src/clis/notion/search.ts +54 -0
  269. package/src/clis/notion/sidebar.ts +44 -0
  270. package/src/clis/notion/status.ts +18 -0
  271. package/src/clis/notion/write.ts +45 -0
  272. package/src/clis/twitter/download.ts +227 -0
  273. package/src/clis/wechat/README.md +28 -0
  274. package/src/clis/wechat/README.zh-CN.md +28 -0
  275. package/src/clis/wechat/chats.ts +33 -0
  276. package/src/clis/wechat/contacts.ts +33 -0
  277. package/src/clis/wechat/read.ts +72 -0
  278. package/src/clis/wechat/search.ts +36 -0
  279. package/src/clis/wechat/send.ts +49 -0
  280. package/src/clis/wechat/status.ts +35 -0
  281. package/src/clis/xiaohongshu/creator-note-detail.ts +95 -0
  282. package/src/clis/xiaohongshu/creator-notes.ts +116 -0
  283. package/src/clis/xiaohongshu/creator-profile.ts +60 -0
  284. package/src/clis/xiaohongshu/creator-stats.ts +81 -0
  285. package/src/clis/xiaohongshu/download.ts +173 -0
  286. package/src/clis/xiaohongshu/search.ts +1 -1
  287. package/src/clis/xiaohongshu/user-helpers.test.ts +106 -0
  288. package/src/clis/xiaohongshu/user-helpers.ts +85 -0
  289. package/src/clis/xiaohongshu/user.ts +52 -32
  290. package/src/clis/zhihu/download.test.ts +12 -0
  291. package/src/clis/zhihu/download.ts +223 -0
  292. package/src/daemon.ts +217 -0
  293. package/src/doctor.test.ts +32 -193
  294. package/src/doctor.ts +74 -668
  295. package/src/download/index.ts +395 -0
  296. package/src/download/progress.ts +125 -0
  297. package/src/engine.test.ts +17 -0
  298. package/src/main.ts +18 -26
  299. package/src/pipeline/executor.test.ts +1 -0
  300. package/src/pipeline/registry.ts +2 -0
  301. package/src/pipeline/steps/browser.ts +2 -2
  302. package/src/pipeline/steps/download.ts +310 -0
  303. package/src/pipeline/steps/intercept.ts +1 -2
  304. package/src/pipeline/template.ts +26 -0
  305. package/src/setup.ts +47 -183
  306. package/src/types.ts +1 -0
  307. package/tests/e2e/browser-auth.test.ts +25 -0
@@ -1,223 +1,62 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import {
3
- readTokenFromShellContent,
4
- renderBrowserDoctorReport,
5
- upsertShellToken,
6
- readTomlConfigToken,
7
- upsertTomlConfigToken,
8
- upsertJsonConfigToken,
9
- } from './doctor.js';
10
-
11
- describe('shell token helpers', () => {
12
- it('reads token from shell export', () => {
13
- expect(readTokenFromShellContent('export PLAYWRIGHT_MCP_EXTENSION_TOKEN="abc123"\n')).toBe('abc123');
14
- });
15
-
16
- it('appends token export when missing', () => {
17
- const next = upsertShellToken('export PATH="/usr/bin"\n', 'abc123');
18
- expect(next).toContain('export PLAYWRIGHT_MCP_EXTENSION_TOKEN="abc123"');
19
- });
20
-
21
- it('replaces token export when present', () => {
22
- const next = upsertShellToken('export PLAYWRIGHT_MCP_EXTENSION_TOKEN="old"\n', 'new');
23
- expect(next).toContain('export PLAYWRIGHT_MCP_EXTENSION_TOKEN="new"');
24
- expect(next).not.toContain('"old"');
25
- });
26
- });
27
-
28
- describe('toml token helpers', () => {
29
- it('reads token from playwright env section', () => {
30
- const content = `
31
- [mcp_servers.playwright.env]
32
- PLAYWRIGHT_MCP_EXTENSION_TOKEN = "abc123"
33
- `;
34
- expect(readTomlConfigToken(content)).toBe('abc123');
35
- });
36
-
37
- it('updates token inside existing env section', () => {
38
- const content = `
39
- [mcp_servers.playwright.env]
40
- PLAYWRIGHT_MCP_EXTENSION_TOKEN = "old"
41
- `;
42
- const next = upsertTomlConfigToken(content, 'new');
43
- expect(next).toContain('PLAYWRIGHT_MCP_EXTENSION_TOKEN = "new"');
44
- expect(next).not.toContain('"old"');
45
- });
46
-
47
- it('creates env section when missing', () => {
48
- const content = `
49
- [mcp_servers.playwright]
50
- type = "stdio"
51
- `;
52
- const next = upsertTomlConfigToken(content, 'abc123');
53
- expect(next).toContain('[mcp_servers.playwright.env]');
54
- expect(next).toContain('PLAYWRIGHT_MCP_EXTENSION_TOKEN = "abc123"');
55
- });
56
- });
57
-
58
- describe('json token helpers', () => {
59
- it('writes token into standard mcpServers config', () => {
60
- const next = upsertJsonConfigToken(JSON.stringify({
61
- mcpServers: {
62
- playwright: {
63
- command: 'npx',
64
- args: ['-y', '@playwright/mcp@latest', '--extension'],
65
- },
66
- },
67
- }), 'abc123');
68
- const parsed = JSON.parse(next);
69
- expect(parsed.mcpServers.playwright.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN).toBe('abc123');
70
- });
71
-
72
- it('writes token into opencode mcp config', () => {
73
- const next = upsertJsonConfigToken(JSON.stringify({
74
- $schema: 'https://opencode.ai/config.json',
75
- mcp: {
76
- playwright: {
77
- command: ['npx', '-y', '@playwright/mcp@latest', '--extension'],
78
- enabled: true,
79
- type: 'local',
80
- },
81
- },
82
- }), 'abc123');
83
- const parsed = JSON.parse(next);
84
- expect(parsed.mcp.playwright.environment.PLAYWRIGHT_MCP_EXTENSION_TOKEN).toBe('abc123');
85
- });
86
-
87
- it('creates standard mcpServers format for empty file (not OpenCode)', () => {
88
- const next = upsertJsonConfigToken('', 'abc123');
89
- const parsed = JSON.parse(next);
90
- expect(parsed.mcpServers.playwright.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN).toBe('abc123');
91
- expect(parsed.mcp).toBeUndefined();
92
- });
93
-
94
- it('creates OpenCode format when filePath contains opencode', () => {
95
- const next = upsertJsonConfigToken('', 'abc123', '/home/user/.config/opencode/opencode.json');
96
- const parsed = JSON.parse(next);
97
- expect(parsed.mcp.playwright.environment.PLAYWRIGHT_MCP_EXTENSION_TOKEN).toBe('abc123');
98
- expect(parsed.mcpServers).toBeUndefined();
99
- });
100
-
101
- it('creates standard format when filePath is claude.json', () => {
102
- const next = upsertJsonConfigToken('', 'abc123', '/home/user/.claude.json');
103
- const parsed = JSON.parse(next);
104
- expect(parsed.mcpServers.playwright.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN).toBe('abc123');
105
- });
106
- });
107
-
108
- describe('fish shell support', () => {
109
- it('generates fish set -gx syntax for fish config path', () => {
110
- const next = upsertShellToken('', 'abc123', '/home/user/.config/fish/config.fish');
111
- expect(next).toContain('set -gx PLAYWRIGHT_MCP_EXTENSION_TOKEN "abc123"');
112
- expect(next).not.toContain('export');
113
- });
114
-
115
- it('replaces existing fish set line', () => {
116
- const content = 'set -gx PLAYWRIGHT_MCP_EXTENSION_TOKEN "old"\n';
117
- const next = upsertShellToken(content, 'new', '/home/user/.config/fish/config.fish');
118
- expect(next).toContain('set -gx PLAYWRIGHT_MCP_EXTENSION_TOKEN "new"');
119
- expect(next).not.toContain('"old"');
120
- });
121
-
122
- it('appends fish syntax to existing fish config', () => {
123
- const content = 'set -gx PATH /usr/bin\n';
124
- const next = upsertShellToken(content, 'abc123', '/home/user/.config/fish/config.fish');
125
- expect(next).toContain('set -gx PLAYWRIGHT_MCP_EXTENSION_TOKEN "abc123"');
126
- expect(next).toContain('set -gx PATH /usr/bin');
127
- });
128
-
129
- it('uses export syntax for zshrc even with filePath', () => {
130
- const next = upsertShellToken('', 'abc123', '/home/user/.zshrc');
131
- expect(next).toContain('export PLAYWRIGHT_MCP_EXTENSION_TOKEN="abc123"');
132
- expect(next).not.toContain('set -gx');
133
- });
134
- });
2
+ import { renderBrowserDoctorReport } from './doctor.js';
135
3
 
136
4
  describe('doctor report rendering', () => {
137
5
  const strip = (s: string) => s.replace(/\x1b\[[0-9;]*m/g, '');
138
6
 
139
- it('renders OK-style report when tokens match', () => {
7
+ it('renders OK-style report when daemon and extension connected', () => {
140
8
  const text = strip(renderBrowserDoctorReport({
141
- envToken: 'abc123',
142
- envFingerprint: 'fp1',
143
- extensionToken: 'abc123',
144
- extensionFingerprint: 'fp1',
145
- extensionInstalled: true,
146
- extensionBrowsers: ['Chrome'],
147
- shellFiles: [{ path: '/tmp/.zshrc', exists: true, token: 'abc123', fingerprint: 'fp1' }],
148
- configs: [{ path: '/tmp/mcp.json', exists: true, format: 'json', token: 'abc123', fingerprint: 'fp1', writable: true }],
149
- recommendedToken: 'abc123',
150
- recommendedFingerprint: 'fp1',
151
- warnings: [],
9
+ daemonRunning: true,
10
+ extensionConnected: true,
152
11
  issues: [],
153
12
  }));
154
13
 
155
- expect(text).toContain('[OK] Extension installed (Chrome)');
156
- expect(text).toContain('[OK] Environment token: configured (fp1)');
157
- expect(text).toContain('[OK] /tmp/mcp.json');
158
- expect(text).toContain('configured (fp1)');
14
+ expect(text).toContain('[OK] Daemon: running on port 19825');
15
+ expect(text).toContain('[OK] Extension: connected');
16
+ expect(text).toContain('Everything looks good!');
17
+ });
18
+
19
+ it('renders MISSING when daemon not running', () => {
20
+ const text = strip(renderBrowserDoctorReport({
21
+ daemonRunning: false,
22
+ extensionConnected: false,
23
+ issues: ['Daemon is not running.'],
24
+ }));
25
+
26
+ expect(text).toContain('[MISSING] Daemon: not running');
27
+ expect(text).toContain('[MISSING] Extension: not connected');
28
+ expect(text).toContain('Daemon is not running.');
159
29
  });
160
30
 
161
- it('renders MISMATCH-style report when fingerprints differ', () => {
31
+ it('renders extension not connected when daemon is running', () => {
162
32
  const text = strip(renderBrowserDoctorReport({
163
- envToken: 'abc123',
164
- envFingerprint: 'fp1',
165
- extensionToken: null,
166
- extensionFingerprint: null,
167
- extensionInstalled: false,
168
- extensionBrowsers: [],
169
- shellFiles: [{ path: '/tmp/.zshrc', exists: true, token: 'def456', fingerprint: 'fp2' }],
170
- configs: [{ path: '/tmp/mcp.json', exists: true, format: 'json', token: 'abc123', fingerprint: 'fp1', writable: true }],
171
- recommendedToken: 'abc123',
172
- recommendedFingerprint: 'fp1',
173
- warnings: [],
174
- issues: ['Detected inconsistent Playwright MCP tokens across env/config files.'],
33
+ daemonRunning: true,
34
+ extensionConnected: false,
35
+ issues: ['Daemon is running but the Chrome extension is not connected.'],
175
36
  }));
176
37
 
177
- expect(text).toContain('[MISSING] Extension not installed in any browser');
178
- expect(text).toContain('[MISMATCH] Environment token: configured (fp1)');
179
- expect(text).toContain('[MISMATCH] /tmp/.zshrc');
180
- expect(text).toContain('configured (fp2)');
181
- expect(text).toContain('[MISMATCH] Recommended token fingerprint: fp1');
38
+ expect(text).toContain('[OK] Daemon: running on port 19825');
39
+ expect(text).toContain('[MISSING] Extension: not connected');
182
40
  });
183
41
 
184
42
  it('renders connectivity OK when live test succeeds', () => {
185
43
  const text = strip(renderBrowserDoctorReport({
186
- envToken: 'abc123',
187
- envFingerprint: 'fp1',
188
- extensionToken: 'abc123',
189
- extensionFingerprint: 'fp1',
190
- extensionInstalled: true,
191
- extensionBrowsers: ['Chrome'],
192
- shellFiles: [],
193
- configs: [],
194
- recommendedToken: 'abc123',
195
- recommendedFingerprint: 'fp1',
44
+ daemonRunning: true,
45
+ extensionConnected: true,
196
46
  connectivity: { ok: true, durationMs: 1234 },
197
- warnings: [],
198
47
  issues: [],
199
48
  }));
200
49
 
201
- expect(text).toContain('[OK] Browser connectivity: connected in 1.2s');
50
+ expect(text).toContain('[OK] Connectivity: connected in 1.2s');
202
51
  });
203
52
 
204
- it('renders connectivity WARN when not tested', () => {
53
+ it('renders connectivity SKIP when not tested', () => {
205
54
  const text = strip(renderBrowserDoctorReport({
206
- envToken: 'abc123',
207
- envFingerprint: 'fp1',
208
- extensionToken: 'abc123',
209
- extensionFingerprint: 'fp1',
210
- extensionInstalled: true,
211
- extensionBrowsers: ['Chrome'],
212
- shellFiles: [],
213
- configs: [],
214
- recommendedToken: 'abc123',
215
- recommendedFingerprint: 'fp1',
216
- warnings: [],
55
+ daemonRunning: true,
56
+ extensionConnected: true,
217
57
  issues: [],
218
58
  }));
219
59
 
220
- expect(text).toContain('[WARN] Browser connectivity: not tested (use --live)');
60
+ expect(text).toContain('[SKIP] Connectivity: not tested (use --live)');
221
61
  });
222
62
  });
223
-