@agentrhq/webcmd 0.1.2 → 0.2.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 +183 -218
- package/cli-manifest.json +16247 -34913
- package/clis/_atlassian/shared.js +1 -1
- package/clis/booking/search.js +4 -4
- package/clis/chatgpt/ask.js +2 -2
- package/clis/chatgpt/utils.js +41 -42
- package/clis/chatgpt/utils.test.js +23 -23
- package/clis/chatgpt-app/ax.js +5 -5
- package/clis/chatgpt-app/ax.test.js +8 -8
- package/clis/chatgpt-app/new.js +2 -2
- package/clis/codex/sidebar.js +1 -1
- package/clis/codex/sidebar.test.js +12 -12
- package/clis/coingecko/top.js +3 -3
- package/clis/dblp/dblp.test.js +1 -1
- package/clis/discord-app/search.js +1 -1
- package/clis/discord-app/utils.js +6 -6
- package/clis/facebook/__fixtures__/notifications-page.html +6 -6
- package/clis/facebook/add-friend.js +2 -2
- package/clis/facebook/feed.js +18 -18
- package/clis/facebook/friends.js +4 -4
- package/clis/facebook/groups.js +3 -3
- package/clis/facebook/join-group.js +2 -2
- package/clis/facebook/marketplace-inbox.js +3 -3
- package/clis/facebook/marketplace-listings.js +1 -1
- package/clis/facebook/notifications.js +14 -15
- package/clis/facebook/notifications.test.js +28 -29
- package/clis/gemini/ask.test.js +12 -12
- package/clis/gemini/deep-research-result.js +2 -2
- package/clis/gemini/deep-research-result.test.js +2 -2
- package/clis/gemini/deep-research.js +2 -2
- package/clis/gemini/deep-research.test.js +1 -1
- package/clis/gemini/models.js +11 -11
- package/clis/gemini/models.test.js +1 -1
- package/clis/gemini/reply-state.test.js +89 -89
- package/clis/gemini/utils.js +41 -41
- package/clis/gemini/utils.test.js +30 -30
- package/clis/geogebra/utils.js +1 -1
- package/clis/google-scholar/search.js +3 -3
- package/clis/grok/delete.js +1 -1
- package/clis/grok/export-all.js +2 -2
- package/clis/grok/export.js +2 -2
- package/clis/grok/pin.js +3 -3
- package/clis/grok/utils.js +12 -12
- package/clis/grok/utils.test.js +2 -2
- package/clis/indeed/indeed.test.js +3 -3
- package/clis/indeed/utils.js +1 -1
- package/clis/instagram/post.js +19 -19
- package/clis/instagram/post.test.js +2 -2
- package/clis/instagram/reel.js +6 -6
- package/clis/linkedin/connect.js +3 -3
- package/clis/linkedin/people-search.js +4 -4
- package/clis/linkedin/profile-experience.js +6 -6
- package/clis/linkedin/profile-experience.test.js +10 -10
- package/clis/linkedin/profile-read.js +1 -1
- package/clis/linkedin/safe-send.js +1 -1
- package/clis/linkedin/search.js +1 -1
- package/clis/linkedin/shared.js +2 -2
- package/clis/linkedin/timeline.js +5 -5
- package/clis/manus/manus.test.js +2 -2
- package/clis/medium/feed.js +3 -3
- package/clis/medium/search.js +3 -3
- package/clis/medium/user.js +3 -3
- package/clis/notebooklm/auth.js +2 -2
- package/clis/notebooklm/note-list.test.js +4 -4
- package/clis/notebooklm/notes-get.test.js +8 -8
- package/clis/notebooklm/source-fulltext.test.js +11 -11
- package/clis/notebooklm/utils.js +28 -28
- package/clis/notebooklm/utils.test.js +10 -10
- package/clis/pixiv/search.test.js +3 -3
- package/clis/qoder/quest.js +2 -2
- package/clis/reddit/home.js +2 -2
- package/clis/reddit/hot.js +1 -1
- package/clis/reddit/read.js +2 -2
- package/clis/reddit/read.test.js +1 -1
- package/clis/reddit/reply.js +2 -2
- package/clis/reddit/whoami.js +2 -2
- package/clis/reuters/article-detail.js +1 -1
- package/clis/reuters/search.js +1 -1
- package/clis/slock/attachment-upload.test.js +1 -1
- package/clis/slock/task-convert.js +1 -1
- package/clis/substack/feed.js +3 -3
- package/clis/substack/publication.js +3 -3
- package/clis/substack/search.js +4 -4
- package/clis/tiktok/comment.js +2 -2
- package/clis/tiktok/follow.js +4 -4
- package/clis/tiktok/like.js +1 -1
- package/clis/tiktok/save.js +1 -1
- package/clis/tiktok/unfollow.js +4 -4
- package/clis/tiktok/unlike.js +1 -1
- package/clis/tiktok/unsave.js +2 -2
- package/clis/tiktok/write-refactor.test.js +5 -5
- package/clis/twitter/accept.js +3 -3
- package/clis/twitter/followers.js +1 -1
- package/clis/twitter/list-remove-core.js +2 -2
- package/clis/twitter/list-tweets.test.js +3 -3
- package/clis/twitter/lists.js +6 -6
- package/clis/twitter/lists.test.js +2 -2
- package/clis/twitter/reply-dm.js +1 -1
- package/clis/twitter/shared.test.js +4 -5
- package/clis/twitter/trending.js +1 -1
- package/clis/twitter/utils.js +1 -1
- package/clis/web/read.js +1 -1
- package/clis/web/read.test.js +2 -2
- package/clis/yahoo-finance/quote.js +1 -1
- package/clis/youtube/history.js +4 -4
- package/clis/youtube/transcript-group.js +1 -1
- package/clis/youtube/transcript-group.test.js +5 -5
- package/clis/youtube/transcript.js +5 -5
- package/clis/youtube/video.js +4 -4
- package/clis/youtube/video.test.js +6 -6
- package/dist/src/browser/analyze.test.js +13 -13
- package/dist/src/browser/bridge-readiness.d.ts +1 -1
- package/dist/src/browser/daemon-client.d.ts +1 -0
- package/dist/src/browser/daemon-client.js +102 -50
- package/dist/src/browser/daemon-client.test.js +104 -19
- package/dist/src/browser/errors.js +11 -0
- package/dist/src/browser/protocol.d.ts +2 -0
- package/dist/src/browser.test.js +2 -2
- package/dist/src/cli-argv-preprocess.d.ts +2 -2
- package/dist/src/cli-argv-preprocess.js +2 -2
- package/dist/src/cli-argv-preprocess.test.js +35 -35
- package/dist/src/cli.js +2 -2
- package/dist/src/cli.test.js +57 -57
- package/dist/src/commanderAdapter.test.js +19 -19
- package/dist/src/convention-audit.js +1 -1
- package/dist/src/daemon/server.js +28 -23
- package/dist/src/daemon/server.test.js +52 -0
- package/dist/src/daemon-utils.d.ts +1 -0
- package/dist/src/daemon-utils.js +9 -0
- package/dist/src/daemon.test.js +10 -1
- package/dist/src/doctor.js +7 -1
- package/dist/src/doctor.test.js +8 -1
- package/dist/src/download/article-download.d.ts +3 -3
- package/dist/src/download/article-download.js +7 -7
- package/dist/src/download/article-download.test.js +6 -6
- package/dist/src/download/index.js +1 -1
- package/dist/src/download/index.test.js +1 -2
- package/dist/src/download/media-download.d.ts +1 -1
- package/dist/src/download/media-download.js +1 -1
- package/dist/src/electron-apps.js +0 -8
- package/dist/src/electron-apps.test.js +2 -11
- package/dist/src/errors.test.js +9 -9
- package/dist/src/execution.js +2 -0
- package/dist/src/execution.test.js +12 -0
- package/dist/src/external-clis.yaml +0 -37
- package/dist/src/external.d.ts +1 -1
- package/dist/src/external.test.js +2 -17
- package/dist/src/generate-release-notes-cli.test.js +140 -0
- package/dist/src/help.d.ts +3 -3
- package/dist/src/help.test.js +8 -8
- package/dist/src/main.js +1 -1
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/node-network.test.js +2 -2
- package/dist/src/output.js +1 -1
- package/dist/src/pipeline/steps/download.test.js +3 -3
- package/dist/src/registry.test.js +2 -2
- package/dist/src/release-notes.d.ts +38 -0
- package/dist/src/release-notes.js +99 -0
- package/dist/src/release-notes.test.js +61 -0
- package/dist/src/serialization.test.js +7 -7
- package/dist/src/snapshotFormatter.js +3 -5
- package/dist/src/snapshotFormatter.test.d.ts +1 -1
- package/dist/src/snapshotFormatter.test.js +50 -50
- package/dist/src/tui.js +1 -1
- package/package.json +4 -1
- package/scripts/generate-release-notes.ts +234 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/silent-column-drop-baseline.json +0 -498
- package/scripts/typed-error-lint-baseline.json +0 -464
- package/skills/webcmd-adapter-author/SKILL.md +216 -213
- package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
- package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
- package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
- package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
- package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
- package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
- package/skills/webcmd-adapter-author/references/output-design.md +47 -125
- package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
- package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
- package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
- package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
- package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
- package/skills/webcmd-autofix/SKILL.md +136 -143
- package/skills/webcmd-sitemap-author/SKILL.md +58 -67
- package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
- package/skills/webcmd-usage/SKILL.md +106 -97
- package/clis/12306/auth.js +0 -59
- package/clis/12306/me.js +0 -73
- package/clis/12306/orders.js +0 -96
- package/clis/12306/passengers.js +0 -90
- package/clis/12306/price.js +0 -166
- package/clis/12306/stations.js +0 -66
- package/clis/12306/train.js +0 -91
- package/clis/12306/trains.js +0 -166
- package/clis/12306/utils.js +0 -272
- package/clis/12306/utils.test.js +0 -424
- package/clis/1688/assets.js +0 -205
- package/clis/1688/assets.test.js +0 -39
- package/clis/1688/auth.js +0 -46
- package/clis/1688/download.js +0 -77
- package/clis/1688/download.test.js +0 -31
- package/clis/1688/item.js +0 -188
- package/clis/1688/item.test.js +0 -67
- package/clis/1688/search.js +0 -310
- package/clis/1688/search.test.js +0 -75
- package/clis/1688/shared.js +0 -557
- package/clis/1688/shared.test.js +0 -57
- package/clis/1688/store.js +0 -227
- package/clis/1688/store.test.js +0 -62
- package/clis/1point3acres/auth.js +0 -52
- package/clis/1point3acres/digest.js +0 -35
- package/clis/1point3acres/forum.js +0 -51
- package/clis/1point3acres/forums.js +0 -44
- package/clis/1point3acres/hot.js +0 -35
- package/clis/1point3acres/latest.js +0 -35
- package/clis/1point3acres/notifications.js +0 -64
- package/clis/1point3acres/search.js +0 -71
- package/clis/1point3acres/thread.js +0 -117
- package/clis/1point3acres/user.js +0 -77
- package/clis/1point3acres/utils.js +0 -247
- package/clis/36kr/article.js +0 -66
- package/clis/36kr/article.test.js +0 -46
- package/clis/36kr/hot.js +0 -87
- package/clis/36kr/hot.test.js +0 -15
- package/clis/36kr/news.js +0 -52
- package/clis/36kr/news.test.js +0 -85
- package/clis/36kr/search.js +0 -79
- package/clis/51job/company.js +0 -126
- package/clis/51job/detail.js +0 -109
- package/clis/51job/hot.js +0 -56
- package/clis/51job/search.js +0 -80
- package/clis/51job/utils.js +0 -302
- package/clis/51job/utils.test.js +0 -69
- package/clis/aibase/news.js +0 -110
- package/clis/aibase/news.test.js +0 -59
- package/clis/autohome/__fixtures__/catalog.html +0 -11
- package/clis/autohome/__fixtures__/koubei.json +0 -116
- package/clis/autohome/autohome.test.js +0 -115
- package/clis/autohome/brand.js +0 -108
- package/clis/autohome/score.js +0 -103
- package/clis/autohome/utils.js +0 -157
- package/clis/baidu-scholar/search.js +0 -87
- package/clis/baidu-scholar/search.test.js +0 -23
- package/clis/bilibili/auth.js +0 -36
- package/clis/bilibili/comment.js +0 -107
- package/clis/bilibili/comment.test.js +0 -153
- package/clis/bilibili/comments.js +0 -136
- package/clis/bilibili/comments.test.js +0 -142
- package/clis/bilibili/download.js +0 -178
- package/clis/bilibili/download.test.js +0 -173
- package/clis/bilibili/dynamic.js +0 -34
- package/clis/bilibili/dynamic.test.js +0 -68
- package/clis/bilibili/favorite.js +0 -47
- package/clis/bilibili/feed.js +0 -220
- package/clis/bilibili/follow.js +0 -140
- package/clis/bilibili/follow.test.js +0 -203
- package/clis/bilibili/following.js +0 -44
- package/clis/bilibili/history.js +0 -45
- package/clis/bilibili/hot.js +0 -40
- package/clis/bilibili/hot.test.js +0 -17
- package/clis/bilibili/me.js +0 -13
- package/clis/bilibili/ranking.js +0 -25
- package/clis/bilibili/search.js +0 -24
- package/clis/bilibili/subtitle.js +0 -141
- package/clis/bilibili/subtitle.test.js +0 -240
- package/clis/bilibili/summary.js +0 -167
- package/clis/bilibili/summary.test.js +0 -210
- package/clis/bilibili/unfollow.js +0 -121
- package/clis/bilibili/user-videos.js +0 -39
- package/clis/bilibili/utils.js +0 -273
- package/clis/bilibili/utils.test.js +0 -97
- package/clis/bilibili/video.js +0 -155
- package/clis/bilibili/video.test.js +0 -308
- package/clis/boss/auth.js +0 -47
- package/clis/boss/batchgreet.js +0 -61
- package/clis/boss/chatlist.js +0 -116
- package/clis/boss/chatlist.test.js +0 -211
- package/clis/boss/chatmsg.js +0 -117
- package/clis/boss/chatmsg.test.js +0 -230
- package/clis/boss/detail.js +0 -63
- package/clis/boss/exchange.js +0 -46
- package/clis/boss/greet.js +0 -49
- package/clis/boss/invite.js +0 -64
- package/clis/boss/joblist.js +0 -31
- package/clis/boss/mark.js +0 -70
- package/clis/boss/recommend.js +0 -45
- package/clis/boss/resume.js +0 -150
- package/clis/boss/search.js +0 -197
- package/clis/boss/search.test.js +0 -78
- package/clis/boss/send.js +0 -44
- package/clis/boss/stats.js +0 -66
- package/clis/boss/utils.js +0 -468
- package/clis/boss/utils.test.js +0 -34
- package/clis/chaoxing/assignments.js +0 -76
- package/clis/chaoxing/auth.js +0 -54
- package/clis/chaoxing/exams.js +0 -75
- package/clis/chaoxing/utils.js +0 -223
- package/clis/chaoxing/utils.test.js +0 -45
- package/clis/cnki/search.js +0 -61
- package/clis/cnki/search.test.js +0 -18
- package/clis/ctrip/auth.js +0 -50
- package/clis/ctrip/ctrip.test.js +0 -719
- package/clis/ctrip/flight.js +0 -136
- package/clis/ctrip/hotel-search.js +0 -132
- package/clis/ctrip/hotel-suggest.js +0 -45
- package/clis/ctrip/search.js +0 -41
- package/clis/ctrip/utils.js +0 -473
- package/clis/deepseek/ask.js +0 -158
- package/clis/deepseek/ask.test.js +0 -399
- package/clis/deepseek/auth.js +0 -54
- package/clis/deepseek/detail.js +0 -46
- package/clis/deepseek/detail.test.js +0 -81
- package/clis/deepseek/history.js +0 -27
- package/clis/deepseek/new.js +0 -33
- package/clis/deepseek/read.js +0 -25
- package/clis/deepseek/send.js +0 -140
- package/clis/deepseek/send.test.js +0 -107
- package/clis/deepseek/status.js +0 -26
- package/clis/deepseek/utils.js +0 -487
- package/clis/deepseek/utils.test.js +0 -370
- package/clis/dianping/__fixtures__/search.html +0 -168
- package/clis/dianping/__fixtures__/shop.html +0 -6
- package/clis/dianping/auth.js +0 -49
- package/clis/dianping/cityResolver.js +0 -185
- package/clis/dianping/dianping.test.js +0 -578
- package/clis/dianping/search.js +0 -157
- package/clis/dianping/shop.js +0 -173
- package/clis/dianping/utils.js +0 -157
- package/clis/dongchedi/__fixtures__/search.json +0 -60
- package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
- package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
- package/clis/dongchedi/dongchedi.test.js +0 -191
- package/clis/dongchedi/koubei.js +0 -85
- package/clis/dongchedi/models.js +0 -91
- package/clis/dongchedi/score.js +0 -83
- package/clis/dongchedi/search.js +0 -83
- package/clis/dongchedi/series.js +0 -87
- package/clis/dongchedi/specs.js +0 -115
- package/clis/dongchedi/utils.js +0 -180
- package/clis/douban/auth.js +0 -50
- package/clis/douban/book-hot.js +0 -15
- package/clis/douban/download.js +0 -68
- package/clis/douban/download.test.js +0 -170
- package/clis/douban/marks.js +0 -116
- package/clis/douban/movie-hot.js +0 -15
- package/clis/douban/movie-hot.test.js +0 -14
- package/clis/douban/photos.js +0 -35
- package/clis/douban/reviews.js +0 -107
- package/clis/douban/search.js +0 -18
- package/clis/douban/search.test.js +0 -11
- package/clis/douban/subject.js +0 -46
- package/clis/douban/subject.test.js +0 -11
- package/clis/douban/top250.js +0 -68
- package/clis/douban/utils.js +0 -657
- package/clis/douban/utils.test.js +0 -488
- package/clis/doubao/ask.js +0 -40
- package/clis/doubao/auth.js +0 -66
- package/clis/doubao/detail.js +0 -35
- package/clis/doubao/detail.test.js +0 -42
- package/clis/doubao/history.js +0 -30
- package/clis/doubao/history.test.js +0 -37
- package/clis/doubao/meeting-summary.js +0 -41
- package/clis/doubao/meeting-transcript.js +0 -38
- package/clis/doubao/new.js +0 -22
- package/clis/doubao/read.js +0 -21
- package/clis/doubao/send.js +0 -24
- package/clis/doubao/status.js +0 -26
- package/clis/doubao/utils.js +0 -1156
- package/clis/doubao/utils.test.js +0 -396
- package/clis/doubao-app/ask.js +0 -54
- package/clis/doubao-app/dump.js +0 -25
- package/clis/doubao-app/new.js +0 -21
- package/clis/doubao-app/read.js +0 -19
- package/clis/doubao-app/screenshot.js +0 -19
- package/clis/doubao-app/send.js +0 -28
- package/clis/doubao-app/status.js +0 -17
- package/clis/doubao-app/utils.js +0 -110
- package/clis/douyin/_shared/browser-fetch.js +0 -66
- package/clis/douyin/_shared/browser-fetch.test.js +0 -64
- package/clis/douyin/_shared/creation-id.js +0 -5
- package/clis/douyin/_shared/creation-id.test.js +0 -22
- package/clis/douyin/_shared/evaluate-result.js +0 -16
- package/clis/douyin/_shared/imagex-upload.js +0 -53
- package/clis/douyin/_shared/imagex-upload.test.js +0 -87
- package/clis/douyin/_shared/public-api.js +0 -29
- package/clis/douyin/_shared/sts2.js +0 -21
- package/clis/douyin/_shared/sts2.test.js +0 -27
- package/clis/douyin/_shared/text-extra.js +0 -15
- package/clis/douyin/_shared/text-extra.test.js +0 -37
- package/clis/douyin/_shared/timing.js +0 -22
- package/clis/douyin/_shared/timing.test.js +0 -28
- package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
- package/clis/douyin/_shared/tos-upload.js +0 -331
- package/clis/douyin/_shared/tos-upload.test.js +0 -229
- package/clis/douyin/_shared/transcode.js +0 -45
- package/clis/douyin/_shared/transcode.test.js +0 -91
- package/clis/douyin/_shared/vod-upload.js +0 -212
- package/clis/douyin/_shared/vod-upload.test.js +0 -38
- package/clis/douyin/activities.js +0 -23
- package/clis/douyin/activities.test.js +0 -55
- package/clis/douyin/auth.js +0 -39
- package/clis/douyin/collections.js +0 -23
- package/clis/douyin/collections.test.js +0 -45
- package/clis/douyin/delete.js +0 -152
- package/clis/douyin/delete.test.js +0 -100
- package/clis/douyin/draft.js +0 -355
- package/clis/douyin/draft.test.js +0 -335
- package/clis/douyin/drafts.js +0 -24
- package/clis/douyin/drafts.test.js +0 -11
- package/clis/douyin/hashtag.js +0 -114
- package/clis/douyin/hashtag.test.js +0 -171
- package/clis/douyin/location.js +0 -25
- package/clis/douyin/location.test.js +0 -23
- package/clis/douyin/profile.js +0 -29
- package/clis/douyin/profile.test.js +0 -46
- package/clis/douyin/publish-upload-id.test.js +0 -206
- package/clis/douyin/publish.js +0 -341
- package/clis/douyin/publish.test.js +0 -38
- package/clis/douyin/search.js +0 -308
- package/clis/douyin/search.test.js +0 -307
- package/clis/douyin/stats.js +0 -28
- package/clis/douyin/stats.test.js +0 -22
- package/clis/douyin/update.js +0 -32
- package/clis/douyin/update.test.js +0 -11
- package/clis/douyin/user-videos.js +0 -82
- package/clis/douyin/user-videos.test.js +0 -151
- package/clis/douyin/videos.js +0 -52
- package/clis/douyin/videos.test.js +0 -54
- package/clis/eastmoney/_secid.js +0 -78
- package/clis/eastmoney/announcement.js +0 -53
- package/clis/eastmoney/convertible.js +0 -74
- package/clis/eastmoney/etf.js +0 -66
- package/clis/eastmoney/holders.js +0 -79
- package/clis/eastmoney/hot-rank.js +0 -51
- package/clis/eastmoney/hot-rank.test.js +0 -59
- package/clis/eastmoney/index-board.js +0 -97
- package/clis/eastmoney/kline.js +0 -88
- package/clis/eastmoney/kuaixun.js +0 -55
- package/clis/eastmoney/longhu.js +0 -68
- package/clis/eastmoney/money-flow.js +0 -79
- package/clis/eastmoney/northbound.js +0 -58
- package/clis/eastmoney/quote.js +0 -108
- package/clis/eastmoney/rank.js +0 -95
- package/clis/eastmoney/sectors.js +0 -77
- package/clis/flomo/auth.js +0 -55
- package/clis/flomo/memos.js +0 -228
- package/clis/flomo/memos.test.js +0 -144
- package/clis/gitee/auth.js +0 -41
- package/clis/gitee/index.js +0 -3
- package/clis/gitee/search.js +0 -137
- package/clis/gitee/search.test.js +0 -65
- package/clis/gitee/trending.js +0 -568
- package/clis/gitee/user.js +0 -200
- package/clis/gitee/user.test.js +0 -63
- package/clis/gov-law/commands.test.js +0 -39
- package/clis/gov-law/recent.js +0 -22
- package/clis/gov-law/search.js +0 -41
- package/clis/gov-law/shared.js +0 -51
- package/clis/gov-policy/__fixtures__/recent.html +0 -16
- package/clis/gov-policy/__fixtures__/search.html +0 -41
- package/clis/gov-policy/gov-policy.test.js +0 -224
- package/clis/gov-policy/recent.js +0 -90
- package/clis/gov-policy/search.js +0 -91
- package/clis/gov-policy/utils.js +0 -54
- package/clis/guazi/__fixtures__/detail.html +0 -7
- package/clis/guazi/__fixtures__/list.html +0 -5
- package/clis/guazi/browse.js +0 -95
- package/clis/guazi/car.js +0 -110
- package/clis/guazi/guazi.test.js +0 -126
- package/clis/guazi/utils.js +0 -133
- package/clis/huodongxing/events.js +0 -322
- package/clis/huodongxing/events.test.js +0 -296
- package/clis/hupu/__fixtures__/hot-home.html +0 -64
- package/clis/hupu/auth.js +0 -47
- package/clis/hupu/detail.js +0 -72
- package/clis/hupu/hot.js +0 -163
- package/clis/hupu/hot.test.js +0 -224
- package/clis/hupu/like.js +0 -76
- package/clis/hupu/mentions.js +0 -160
- package/clis/hupu/reply.js +0 -72
- package/clis/hupu/search.js +0 -60
- package/clis/hupu/unlike.js +0 -76
- package/clis/hupu/utils.js +0 -319
- package/clis/jd/add-cart.js +0 -72
- package/clis/jd/auth.js +0 -46
- package/clis/jd/cart.js +0 -80
- package/clis/jd/commands.test.js +0 -41
- package/clis/jd/detail.js +0 -63
- package/clis/jd/item.js +0 -730
- package/clis/jd/item.test.js +0 -354
- package/clis/jd/item.test.ts +0 -517
- package/clis/jd/reviews.js +0 -55
- package/clis/jd/search.js +0 -66
- package/clis/jianyu/auth.js +0 -62
- package/clis/jianyu/detail.js +0 -21
- package/clis/jianyu/search.js +0 -634
- package/clis/jianyu/search.test.js +0 -153
- package/clis/jianyu/shared/china-bid-search.js +0 -165
- package/clis/jianyu/shared/procurement-contract.js +0 -324
- package/clis/jianyu/shared/procurement-contract.test.js +0 -72
- package/clis/jianyu/shared/procurement-detail.js +0 -107
- package/clis/jianyu/shared/procurement-detail.test.js +0 -84
- package/clis/jike/auth.js +0 -48
- package/clis/jike/comment.js +0 -107
- package/clis/jike/create.js +0 -106
- package/clis/jike/feed.js +0 -68
- package/clis/jike/like.js +0 -61
- package/clis/jike/notifications.js +0 -169
- package/clis/jike/post.js +0 -72
- package/clis/jike/read.test.js +0 -86
- package/clis/jike/repost.js +0 -103
- package/clis/jike/search.js +0 -68
- package/clis/jike/topic.js +0 -65
- package/clis/jike/user.js +0 -65
- package/clis/jike/utils.js +0 -25
- package/clis/jimeng/auth.js +0 -46
- package/clis/jimeng/generate.js +0 -84
- package/clis/jimeng/history.js +0 -48
- package/clis/jimeng/new.js +0 -44
- package/clis/jimeng/workspaces.js +0 -42
- package/clis/juejin/hot.js +0 -37
- package/clis/juejin/juejin.test.js +0 -241
- package/clis/juejin/recommend.js +0 -61
- package/clis/juejin/utils.js +0 -199
- package/clis/ke/auth.js +0 -46
- package/clis/ke/chengjiao.js +0 -78
- package/clis/ke/ershoufang.js +0 -101
- package/clis/ke/utils.js +0 -104
- package/clis/ke/xiaoqu.js +0 -78
- package/clis/ke/zufang.js +0 -95
- package/clis/kimi/_utils.js +0 -110
- package/clis/kimi/audit-extras.js +0 -268
- package/clis/kimi/auth.js +0 -57
- package/clis/kimi/chat.js +0 -470
- package/clis/kimi/kimi.test.js +0 -187
- package/clis/kimi/storage.js +0 -169
- package/clis/kimi/ui.js +0 -314
- package/clis/kimi/usage.js +0 -144
- package/clis/linux-do/auth.js +0 -55
- package/clis/linux-do/categories.js +0 -50
- package/clis/linux-do/feed.js +0 -395
- package/clis/linux-do/feed.test.js +0 -153
- package/clis/linux-do/search.js +0 -29
- package/clis/linux-do/tags.js +0 -28
- package/clis/linux-do/topic-content.js +0 -155
- package/clis/linux-do/topic-content.test.js +0 -59
- package/clis/linux-do/topic.js +0 -53
- package/clis/linux-do/user-posts.js +0 -57
- package/clis/linux-do/user-topics.js +0 -37
- package/clis/maimai/auth.js +0 -47
- package/clis/maimai/search-talents.js +0 -192
- package/clis/maimai/search-talents.test.js +0 -29
- package/clis/mubu/doc.js +0 -41
- package/clis/mubu/docs.js +0 -44
- package/clis/mubu/notes.js +0 -245
- package/clis/mubu/recent.js +0 -28
- package/clis/mubu/search.js +0 -63
- package/clis/mubu/utils.js +0 -304
- package/clis/nowcoder/auth.js +0 -65
- package/clis/nowcoder/companies.js +0 -24
- package/clis/nowcoder/creators.js +0 -28
- package/clis/nowcoder/detail.js +0 -62
- package/clis/nowcoder/experience.js +0 -37
- package/clis/nowcoder/hot.js +0 -25
- package/clis/nowcoder/jobs.js +0 -22
- package/clis/nowcoder/notifications.js +0 -30
- package/clis/nowcoder/papers.js +0 -41
- package/clis/nowcoder/practice.js +0 -38
- package/clis/nowcoder/recommend.js +0 -31
- package/clis/nowcoder/referral.js +0 -40
- package/clis/nowcoder/salary.js +0 -41
- package/clis/nowcoder/search.js +0 -50
- package/clis/nowcoder/suggest.js +0 -34
- package/clis/nowcoder/topics.js +0 -28
- package/clis/nowcoder/trending.js +0 -26
- package/clis/ones/common.js +0 -144
- package/clis/ones/enrich-tasks.js +0 -37
- package/clis/ones/login.js +0 -81
- package/clis/ones/logout.js +0 -18
- package/clis/ones/me.js +0 -31
- package/clis/ones/my-tasks.js +0 -121
- package/clis/ones/resolve-labels.js +0 -64
- package/clis/ones/task-helpers.js +0 -212
- package/clis/ones/task-helpers.test.js +0 -12
- package/clis/ones/task.js +0 -67
- package/clis/ones/tasks.js +0 -80
- package/clis/ones/token-info.js +0 -43
- package/clis/ones/worklog.js +0 -268
- package/clis/ones/worklog.test.js +0 -20
- package/clis/powerchina/auth.js +0 -52
- package/clis/powerchina/search.js +0 -251
- package/clis/powerchina/search.test.js +0 -93
- package/clis/quark/auth.js +0 -47
- package/clis/quark/ls.js +0 -64
- package/clis/quark/mkdir.js +0 -37
- package/clis/quark/mv.js +0 -54
- package/clis/quark/rename.js +0 -27
- package/clis/quark/rm.js +0 -25
- package/clis/quark/save.js +0 -81
- package/clis/quark/share-tree.js +0 -46
- package/clis/quark/utils.js +0 -146
- package/clis/quark/utils.test.js +0 -58
- package/clis/qwen/ask.js +0 -104
- package/clis/qwen/ask.test.js +0 -36
- package/clis/qwen/auth.js +0 -56
- package/clis/qwen/detail.js +0 -62
- package/clis/qwen/history.js +0 -61
- package/clis/qwen/image.js +0 -179
- package/clis/qwen/new.js +0 -23
- package/clis/qwen/read.js +0 -41
- package/clis/qwen/send.js +0 -55
- package/clis/qwen/status.js +0 -37
- package/clis/qwen/utils.js +0 -461
- package/clis/qwen/utils.test.js +0 -128
- package/clis/rednote/auth.js +0 -52
- package/clis/rednote/comments.js +0 -85
- package/clis/rednote/download.js +0 -59
- package/clis/rednote/feed.js +0 -27
- package/clis/rednote/navigation.test.js +0 -26
- package/clis/rednote/note.js +0 -68
- package/clis/rednote/notifications.js +0 -139
- package/clis/rednote/rednote.test.js +0 -240
- package/clis/rednote/search.js +0 -107
- package/clis/rednote/user.js +0 -55
- package/clis/sinablog/article.js +0 -15
- package/clis/sinablog/hot.js +0 -15
- package/clis/sinablog/search.js +0 -52
- package/clis/sinablog/user.js +0 -16
- package/clis/sinablog/utils.js +0 -186
- package/clis/sinafinance/news.js +0 -62
- package/clis/sinafinance/rolling-news.js +0 -41
- package/clis/sinafinance/stock-rank.js +0 -66
- package/clis/sinafinance/stock.js +0 -121
- package/clis/sinafinance/stock.test.js +0 -59
- package/clis/smzdm/search.js +0 -149
- package/clis/smzdm/search.test.js +0 -114
- package/clis/taobao/add-cart.js +0 -150
- package/clis/taobao/auth.js +0 -58
- package/clis/taobao/cart.js +0 -96
- package/clis/taobao/commands.test.js +0 -41
- package/clis/taobao/detail.js +0 -71
- package/clis/taobao/reviews.js +0 -77
- package/clis/taobao/search.js +0 -97
- package/clis/tdx/hot-rank.js +0 -48
- package/clis/tdx/hot-rank.test.js +0 -59
- package/clis/ths/hot-rank.js +0 -50
- package/clis/ths/hot-rank.test.js +0 -64
- package/clis/tieba/commands.test.js +0 -79
- package/clis/tieba/hot.js +0 -48
- package/clis/tieba/posts.js +0 -86
- package/clis/tieba/read.js +0 -141
- package/clis/tieba/search.js +0 -109
- package/clis/tieba/utils.js +0 -240
- package/clis/tieba/utils.test.js +0 -290
- package/clis/toutiao/articles.js +0 -55
- package/clis/toutiao/auth.js +0 -70
- package/clis/toutiao/hot.js +0 -63
- package/clis/toutiao/toutiao.test.js +0 -378
- package/clis/toutiao/utils.js +0 -161
- package/clis/trae-cn/activity.js +0 -22
- package/clis/trae-cn/approve.js +0 -52
- package/clis/trae-cn/ask.js +0 -99
- package/clis/trae-cn/dump.js +0 -5
- package/clis/trae-cn/export.js +0 -40
- package/clis/trae-cn/model.js +0 -22
- package/clis/trae-cn/new.js +0 -63
- package/clis/trae-cn/read.js +0 -23
- package/clis/trae-cn/screenshot.js +0 -5
- package/clis/trae-cn/select-model.js +0 -25
- package/clis/trae-cn/send.js +0 -23
- package/clis/trae-cn/setup.js +0 -75
- package/clis/trae-cn/status.js +0 -27
- package/clis/trae-cn/targets.js +0 -96
- package/clis/trae-cn/trae-cn.test.js +0 -412
- package/clis/trae-cn/utils.js +0 -750
- package/clis/trae-cn/watch.js +0 -119
- package/clis/uisdc/news.js +0 -105
- package/clis/uisdc/news.test.js +0 -66
- package/clis/v2ex/auth.js +0 -44
- package/clis/v2ex/daily.js +0 -99
- package/clis/v2ex/hot.js +0 -26
- package/clis/v2ex/latest.js +0 -26
- package/clis/v2ex/me.js +0 -100
- package/clis/v2ex/member.js +0 -28
- package/clis/v2ex/node.js +0 -39
- package/clis/v2ex/nodes.js +0 -26
- package/clis/v2ex/notifications.js +0 -72
- package/clis/v2ex/replies.js +0 -27
- package/clis/v2ex/topic.js +0 -31
- package/clis/v2ex/user.js +0 -34
- package/clis/wanfang/search.js +0 -66
- package/clis/wanfang/search.test.js +0 -23
- package/clis/wechat-channels/auth.js +0 -62
- package/clis/wechat-channels/publish.js +0 -732
- package/clis/wechat-channels/publish.test.js +0 -144
- package/clis/weibo/auth.js +0 -53
- package/clis/weibo/comments.js +0 -53
- package/clis/weibo/delete.js +0 -172
- package/clis/weibo/delete.test.js +0 -94
- package/clis/weibo/envelope.test.js +0 -85
- package/clis/weibo/favorites.js +0 -170
- package/clis/weibo/favorites.test.js +0 -114
- package/clis/weibo/feed.js +0 -69
- package/clis/weibo/hot.js +0 -39
- package/clis/weibo/me.js +0 -75
- package/clis/weibo/post.js +0 -75
- package/clis/weibo/publish.js +0 -306
- package/clis/weibo/publish.test.js +0 -192
- package/clis/weibo/search.js +0 -80
- package/clis/weibo/user-posts.js +0 -234
- package/clis/weibo/user-posts.test.js +0 -92
- package/clis/weibo/user.js +0 -63
- package/clis/weibo/utils.js +0 -59
- package/clis/weibo/utils.test.js +0 -36
- package/clis/weixin/create-draft.js +0 -226
- package/clis/weixin/download.js +0 -371
- package/clis/weixin/download.test.js +0 -106
- package/clis/weixin/drafts.js +0 -66
- package/clis/weixin/drafts.test.js +0 -69
- package/clis/weixin/search.js +0 -157
- package/clis/weixin/search.test.js +0 -227
- package/clis/weread/ai-outline.js +0 -171
- package/clis/weread/ai-outline.test.js +0 -83
- package/clis/weread/auth.js +0 -59
- package/clis/weread/book-search.js +0 -438
- package/clis/weread/book-search.test.js +0 -242
- package/clis/weread/book.js +0 -233
- package/clis/weread/commands.test.js +0 -398
- package/clis/weread/highlights.js +0 -24
- package/clis/weread/notebooks.js +0 -22
- package/clis/weread/notes.js +0 -30
- package/clis/weread/private-api-regression.test.js +0 -369
- package/clis/weread/ranking.js +0 -29
- package/clis/weread/search-regression.test.js +0 -494
- package/clis/weread/search.js +0 -186
- package/clis/weread/shelf.js +0 -66
- package/clis/weread/utils.js +0 -321
- package/clis/weread/utils.test.js +0 -128
- package/clis/weread-official/book.js +0 -135
- package/clis/weread-official/commands.test.js +0 -385
- package/clis/weread-official/discover.js +0 -107
- package/clis/weread-official/list-apis.js +0 -95
- package/clis/weread-official/notes.js +0 -171
- package/clis/weread-official/readdata.js +0 -158
- package/clis/weread-official/review.js +0 -93
- package/clis/weread-official/search.js +0 -106
- package/clis/weread-official/shelf.js +0 -97
- package/clis/weread-official/utils.js +0 -293
- package/clis/weread-official/utils.test.js +0 -242
- package/clis/xianyu/auth.js +0 -68
- package/clis/xianyu/chat.js +0 -74
- package/clis/xianyu/chat.test.js +0 -84
- package/clis/xianyu/im.js +0 -322
- package/clis/xianyu/im.test.js +0 -253
- package/clis/xianyu/inbox.js +0 -96
- package/clis/xianyu/item.js +0 -153
- package/clis/xianyu/item.test.js +0 -56
- package/clis/xianyu/messages.js +0 -91
- package/clis/xianyu/publish.js +0 -485
- package/clis/xianyu/publish.test.js +0 -220
- package/clis/xianyu/reply.js +0 -82
- package/clis/xianyu/search.js +0 -262
- package/clis/xianyu/search.test.js +0 -104
- package/clis/xianyu/utils.js +0 -8
- package/clis/xiaoe/auth.js +0 -55
- package/clis/xiaoe/catalog.js +0 -227
- package/clis/xiaoe/content.js +0 -175
- package/clis/xiaoe/courses.js +0 -127
- package/clis/xiaoe/detail.js +0 -36
- package/clis/xiaoe/play-url.js +0 -121
- package/clis/xiaoe/xiaoe.test.js +0 -486
- package/clis/xiaohongshu/ask.js +0 -426
- package/clis/xiaohongshu/ask.test.js +0 -271
- package/clis/xiaohongshu/auth.js +0 -53
- package/clis/xiaohongshu/collection-helpers.js +0 -283
- package/clis/xiaohongshu/collection-helpers.test.js +0 -125
- package/clis/xiaohongshu/comments.js +0 -228
- package/clis/xiaohongshu/comments.test.js +0 -320
- package/clis/xiaohongshu/creator-note-detail.js +0 -482
- package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
- package/clis/xiaohongshu/creator-notes-summary.js +0 -98
- package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
- package/clis/xiaohongshu/creator-notes.js +0 -479
- package/clis/xiaohongshu/creator-notes.test.js +0 -281
- package/clis/xiaohongshu/creator-profile.js +0 -55
- package/clis/xiaohongshu/creator-stats.js +0 -76
- package/clis/xiaohongshu/creator-stats.test.js +0 -24
- package/clis/xiaohongshu/delete-note.js +0 -260
- package/clis/xiaohongshu/delete-note.test.js +0 -172
- package/clis/xiaohongshu/download.js +0 -249
- package/clis/xiaohongshu/download.test.js +0 -339
- package/clis/xiaohongshu/draft-clear.js +0 -91
- package/clis/xiaohongshu/draft-delete.js +0 -103
- package/clis/xiaohongshu/draft-open.js +0 -43
- package/clis/xiaohongshu/draft-utils.js +0 -142
- package/clis/xiaohongshu/drafts.js +0 -28
- package/clis/xiaohongshu/drafts.test.js +0 -172
- package/clis/xiaohongshu/feed.js +0 -163
- package/clis/xiaohongshu/feed.test.js +0 -126
- package/clis/xiaohongshu/follow.js +0 -226
- package/clis/xiaohongshu/follow.test.js +0 -211
- package/clis/xiaohongshu/liked.js +0 -29
- package/clis/xiaohongshu/liked.test.js +0 -82
- package/clis/xiaohongshu/navigation.test.js +0 -38
- package/clis/xiaohongshu/note-helpers.js +0 -69
- package/clis/xiaohongshu/note.js +0 -104
- package/clis/xiaohongshu/note.test.js +0 -249
- package/clis/xiaohongshu/notifications.js +0 -46
- package/clis/xiaohongshu/publish.js +0 -1423
- package/clis/xiaohongshu/publish.test.js +0 -1141
- package/clis/xiaohongshu/saved.js +0 -29
- package/clis/xiaohongshu/saved.test.js +0 -143
- package/clis/xiaohongshu/search.js +0 -330
- package/clis/xiaohongshu/search.test.js +0 -325
- package/clis/xiaohongshu/unfollow.js +0 -285
- package/clis/xiaohongshu/user-helpers.js +0 -78
- package/clis/xiaohongshu/user-helpers.test.js +0 -160
- package/clis/xiaohongshu/user.js +0 -140
- package/clis/xiaohongshu/user.test.js +0 -141
- package/clis/xiaoyuzhou/auth.js +0 -303
- package/clis/xiaoyuzhou/auth.test.js +0 -124
- package/clis/xiaoyuzhou/download.js +0 -54
- package/clis/xiaoyuzhou/download.test.js +0 -135
- package/clis/xiaoyuzhou/episode.js +0 -34
- package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
- package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
- package/clis/xiaoyuzhou/podcast.js +0 -33
- package/clis/xiaoyuzhou/transcript.js +0 -77
- package/clis/xiaoyuzhou/transcript.test.js +0 -195
- package/clis/xiaoyuzhou/utils.js +0 -15
- package/clis/xiaoyuzhou/utils.test.js +0 -39
- package/clis/xueqiu/auth.js +0 -63
- package/clis/xueqiu/comments.js +0 -355
- package/clis/xueqiu/comments.test.js +0 -696
- package/clis/xueqiu/danjuan-utils.js +0 -126
- package/clis/xueqiu/danjuan-utils.test.js +0 -41
- package/clis/xueqiu/earnings-date.js +0 -45
- package/clis/xueqiu/feed.js +0 -39
- package/clis/xueqiu/fund-holdings.js +0 -29
- package/clis/xueqiu/fund-snapshot.js +0 -26
- package/clis/xueqiu/groups.js +0 -23
- package/clis/xueqiu/hot-stock.js +0 -32
- package/clis/xueqiu/hot.js +0 -37
- package/clis/xueqiu/kline.js +0 -44
- package/clis/xueqiu/search.js +0 -37
- package/clis/xueqiu/stock.js +0 -65
- package/clis/xueqiu/utils.js +0 -48
- package/clis/xueqiu/utils.test.js +0 -26
- package/clis/xueqiu/watchlist.js +0 -37
- package/clis/youdao/note.js +0 -258
- package/clis/youdao/note.test.js +0 -99
- package/clis/yuanbao/ask.js +0 -362
- package/clis/yuanbao/ask.test.js +0 -124
- package/clis/yuanbao/auth.js +0 -59
- package/clis/yuanbao/detail.js +0 -65
- package/clis/yuanbao/history.js +0 -51
- package/clis/yuanbao/new.js +0 -72
- package/clis/yuanbao/new.test.js +0 -30
- package/clis/yuanbao/read.js +0 -38
- package/clis/yuanbao/send.js +0 -57
- package/clis/yuanbao/shared.js +0 -341
- package/clis/yuanbao/shared.test.js +0 -80
- package/clis/yuanbao/status.js +0 -44
- package/clis/zhihu/answer-comments.js +0 -280
- package/clis/zhihu/answer-comments.test.js +0 -287
- package/clis/zhihu/answer-detail.js +0 -216
- package/clis/zhihu/answer-detail.test.js +0 -338
- package/clis/zhihu/answer.js +0 -54
- package/clis/zhihu/answer.test.js +0 -54
- package/clis/zhihu/auth.js +0 -59
- package/clis/zhihu/collection.js +0 -199
- package/clis/zhihu/collection.test.js +0 -337
- package/clis/zhihu/collections.js +0 -128
- package/clis/zhihu/collections.test.js +0 -182
- package/clis/zhihu/comment.js +0 -55
- package/clis/zhihu/comment.test.js +0 -50
- package/clis/zhihu/download.js +0 -80
- package/clis/zhihu/download.test.js +0 -12
- package/clis/zhihu/favorite.js +0 -87
- package/clis/zhihu/favorite.test.js +0 -59
- package/clis/zhihu/follow.js +0 -50
- package/clis/zhihu/follow.test.js +0 -42
- package/clis/zhihu/followers.js +0 -40
- package/clis/zhihu/followers.test.js +0 -42
- package/clis/zhihu/following.js +0 -40
- package/clis/zhihu/following.test.js +0 -44
- package/clis/zhihu/hot.js +0 -44
- package/clis/zhihu/like.js +0 -47
- package/clis/zhihu/like.test.js +0 -41
- package/clis/zhihu/paginate.js +0 -128
- package/clis/zhihu/pins.js +0 -41
- package/clis/zhihu/pins.test.js +0 -44
- package/clis/zhihu/question.js +0 -113
- package/clis/zhihu/question.test.js +0 -251
- package/clis/zhihu/recommend.js +0 -103
- package/clis/zhihu/recommend.test.js +0 -143
- package/clis/zhihu/search.js +0 -206
- package/clis/zhihu/search.test.js +0 -198
- package/clis/zhihu/target.js +0 -91
- package/clis/zhihu/target.test.js +0 -77
- package/clis/zhihu/text.js +0 -29
- package/clis/zhihu/text.test.js +0 -24
- package/clis/zhihu/user-answers.js +0 -41
- package/clis/zhihu/user-answers.test.js +0 -69
- package/clis/zhihu/user-arg.js +0 -34
- package/clis/zhihu/user-articles.js +0 -40
- package/clis/zhihu/user-articles.test.js +0 -44
- package/clis/zhihu/user.js +0 -59
- package/clis/zhihu/user.test.js +0 -73
- package/clis/zhihu/write-shared.js +0 -228
- package/clis/zhihu/write-shared.test.js +0 -176
- package/clis/zsxq/auth.js +0 -68
- package/clis/zsxq/dynamics.js +0 -48
- package/clis/zsxq/groups.js +0 -33
- package/clis/zsxq/search.js +0 -44
- package/clis/zsxq/search.test.js +0 -24
- package/clis/zsxq/topic.js +0 -50
- package/clis/zsxq/topic.test.js +0 -30
- package/clis/zsxq/topics.js +0 -26
- package/clis/zsxq/topics.test.js +0 -24
- package/clis/zsxq/utils.js +0 -233
- package/clis/zsxq/utils.test.js +0 -31
- package/dist/src/weixin-download.test.js +0 -45
- package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
- package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
- /package/{clis/douyin/_shared/types.js → dist/src/generate-release-notes-cli.test.d.ts} +0 -0
- /package/dist/src/{weixin-download.test.d.ts → release-notes.test.d.ts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Article download helper — shared logic for downloading articles as Markdown.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
4
|
+
* Used by article adapters that export readable web pages as Markdown.
|
|
5
5
|
*
|
|
6
6
|
* Flow: ArticleData → TurndownService → image download → frontmatter → .md file
|
|
7
7
|
*/
|
|
@@ -35,12 +35,12 @@ export interface ArticleDownloadOptions {
|
|
|
35
35
|
configureTurndown?: (td: TurndownService) => void;
|
|
36
36
|
/** Custom image extension detector (default: infer from URL extension) */
|
|
37
37
|
detectImageExt?: (url: string) => string;
|
|
38
|
-
/** Custom frontmatter labels (default:
|
|
38
|
+
/** Custom frontmatter labels (default: English labels) */
|
|
39
39
|
frontmatterLabels?: FrontmatterLabels;
|
|
40
40
|
/**
|
|
41
41
|
* Extra CSS selectors removed from the article before Turndown conversion.
|
|
42
42
|
* Use this to drop site-specific noise the adapter can't always trim upstream
|
|
43
|
-
* (e.g.
|
|
43
|
+
* (e.g. social widgets, reward panels, wiki infoboxes).
|
|
44
44
|
*/
|
|
45
45
|
cleanSelectors?: string[];
|
|
46
46
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Article download helper — shared logic for downloading articles as Markdown.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
4
|
+
* Used by article adapters that export readable web pages as Markdown.
|
|
5
5
|
*
|
|
6
6
|
* Flow: ArticleData → TurndownService → image download → frontmatter → .md file
|
|
7
7
|
*/
|
|
@@ -13,9 +13,9 @@ import { httpDownload, sanitizeFilename } from './index.js';
|
|
|
13
13
|
import { formatBytes } from './progress.js';
|
|
14
14
|
const IMAGE_CONCURRENCY = 5;
|
|
15
15
|
const DEFAULT_LABELS = {
|
|
16
|
-
author: '
|
|
17
|
-
publishTime: '
|
|
18
|
-
sourceUrl: '
|
|
16
|
+
author: 'Author',
|
|
17
|
+
publishTime: 'Published',
|
|
18
|
+
sourceUrl: 'Source URL',
|
|
19
19
|
};
|
|
20
20
|
// ============================================================
|
|
21
21
|
// Markdown Conversion
|
|
@@ -112,8 +112,8 @@ function createTurndown(configure, cleanSelectors) {
|
|
|
112
112
|
},
|
|
113
113
|
});
|
|
114
114
|
// Per-adapter dirty-node removal. Adapters know their site's specific noise
|
|
115
|
-
// (
|
|
116
|
-
// empty so the generic converter stays untouched.
|
|
115
|
+
// (social widgets, reward panels, wiki infoboxes, and similar chrome);
|
|
116
|
+
// we keep the default set empty so the generic converter stays untouched.
|
|
117
117
|
const selectorRules = (cleanSelectors ?? [])
|
|
118
118
|
.map(sel => sel.trim())
|
|
119
119
|
.filter(Boolean);
|
|
@@ -152,7 +152,7 @@ function convertToMarkdown(contentHtml, codeBlocks, configure, cleanSelectors) {
|
|
|
152
152
|
md = md.replace(/\u00a0/g, ' ');
|
|
153
153
|
// Turndown leaves behind lone dashes / middle dots when list bullets or
|
|
154
154
|
// decorative separators lose their surrounding inline context.
|
|
155
|
-
md = md.replace(/^[ \t]*[
|
|
155
|
+
md = md.replace(/^[ \t]*[-\u00b7][ \t]*$/gm, '');
|
|
156
156
|
md = md.replace(/^[ \t]+$/gm, '');
|
|
157
157
|
md = md.replace(/[ \t]+$/gm, '');
|
|
158
158
|
md = md.replace(/\n{3,}/g, '\n\n');
|
|
@@ -96,11 +96,11 @@ describe('downloadArticle', () => {
|
|
|
96
96
|
it('collapses 3+ blank lines and strips lone bullet / middle-dot residue', async () => {
|
|
97
97
|
const md = await runAndRead('<p>top</p>' +
|
|
98
98
|
'<p>-</p>' +
|
|
99
|
-
'<p
|
|
99
|
+
'<p>\u00b7</p>' +
|
|
100
100
|
'<p>bottom</p>');
|
|
101
101
|
expect(md).not.toMatch(/\n{3,}/);
|
|
102
102
|
expect(md).not.toMatch(/^\s*-\s*$/m);
|
|
103
|
-
expect(md).not.toMatch(/^\s
|
|
103
|
+
expect(md).not.toMatch(/^\s*\u00b7\s*$/m);
|
|
104
104
|
expect(md).toContain('top');
|
|
105
105
|
expect(md).toContain('bottom');
|
|
106
106
|
});
|
|
@@ -118,13 +118,13 @@ describe('downloadArticle', () => {
|
|
|
118
118
|
});
|
|
119
119
|
it('cleanSelectors removes matching nodes before conversion', async () => {
|
|
120
120
|
const md = await runAndRead('<p>keep-me</p>' +
|
|
121
|
-
'<div class="vote-card"
|
|
122
|
-
'<section class="reward-panel"
|
|
121
|
+
'<div class="vote-card">Collapsed card</div>' +
|
|
122
|
+
'<section class="reward-panel">Reward panel</section>' +
|
|
123
123
|
'<p>also-keep</p>', { cleanSelectors: ['.vote-card', '.reward-panel'] });
|
|
124
124
|
expect(md).toContain('keep-me');
|
|
125
125
|
expect(md).toContain('also-keep');
|
|
126
|
-
expect(md).not.toContain('
|
|
127
|
-
expect(md).not.toContain('
|
|
126
|
+
expect(md).not.toContain('Collapsed card');
|
|
127
|
+
expect(md).not.toContain('Reward panel');
|
|
128
128
|
});
|
|
129
129
|
it('cleanSelectors silently ignores invalid selectors', async () => {
|
|
130
130
|
const md = await runAndRead('<p>survives</p><div class="x">and-this-too</div>', { cleanSelectors: ['!!!not-a-valid-selector', '.missing'] });
|
|
@@ -18,7 +18,7 @@ export function checkYtdlp() {
|
|
|
18
18
|
}
|
|
19
19
|
/** Domains that host video content and can be downloaded via yt-dlp. */
|
|
20
20
|
const VIDEO_PLATFORM_DOMAINS = [
|
|
21
|
-
'youtube.com', 'youtu.be', '
|
|
21
|
+
'youtube.com', 'youtu.be', 'twitter.com',
|
|
22
22
|
'x.com', 'tiktok.com', 'vimeo.com', 'twitch.tv',
|
|
23
23
|
];
|
|
24
24
|
/**
|
|
@@ -143,11 +143,10 @@ describe('video-platform host detection', () => {
|
|
|
143
143
|
for (const url of [
|
|
144
144
|
'https://www.youtube.com/watch?v=abc',
|
|
145
145
|
'https://youtu.be/abc',
|
|
146
|
-
'https://
|
|
146
|
+
'https://vimeo.com/12345',
|
|
147
147
|
'https://twitter.com/u/status/1',
|
|
148
148
|
'https://x.com/u/status/1',
|
|
149
149
|
'https://www.tiktok.com/@u/video/1',
|
|
150
|
-
'https://vimeo.com/12345',
|
|
151
150
|
'https://www.twitch.tv/u',
|
|
152
151
|
]) {
|
|
153
152
|
expect(requiresYtdlp(url)).toBe(true);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Media download helper — shared logic for batch downloading images/videos.
|
|
3
3
|
*
|
|
4
|
-
* Used by:
|
|
4
|
+
* Used by: twitter/download, youtube/download,
|
|
5
5
|
* and future media adapters.
|
|
6
6
|
*
|
|
7
7
|
* Flow: MediaItem[] → DownloadProgressTracker → httpDownload/ytdlpDownload → results
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Media download helper — shared logic for batch downloading images/videos.
|
|
3
3
|
*
|
|
4
|
-
* Used by:
|
|
4
|
+
* Used by: twitter/download, youtube/download,
|
|
5
5
|
* and future media adapters.
|
|
6
6
|
*
|
|
7
7
|
* Flow: MediaItem[] → DownloadProgressTracker → httpDownload/ytdlpDownload → results
|
|
@@ -13,7 +13,6 @@ export const builtinApps = {
|
|
|
13
13
|
codex: { port: 9238, processName: 'Codex', bundleId: 'com.openai.codex', displayName: 'Codex' },
|
|
14
14
|
chatwise: { port: 9228, processName: 'ChatWise', bundleId: 'com.chatwise.app', displayName: 'ChatWise' },
|
|
15
15
|
'discord-app': { port: 9232, processName: 'Discord', bundleId: 'com.discord.app', displayName: 'Discord' },
|
|
16
|
-
'doubao-app': { port: 9225, processName: 'Doubao', bundleId: 'com.volcengine.doubao', displayName: 'Doubao' },
|
|
17
16
|
antigravity: {
|
|
18
17
|
port: 9234,
|
|
19
18
|
processName: 'Antigravity',
|
|
@@ -36,13 +35,6 @@ export const builtinApps = {
|
|
|
36
35
|
bundleId: 'com.trae.solo.app',
|
|
37
36
|
displayName: 'Trae SOLO',
|
|
38
37
|
},
|
|
39
|
-
'trae-cn': {
|
|
40
|
-
port: 39240,
|
|
41
|
-
processName: 'Trae CN',
|
|
42
|
-
executableNames: ['Electron'],
|
|
43
|
-
bundleId: 'cn.trae.app',
|
|
44
|
-
displayName: 'Trae CN',
|
|
45
|
-
},
|
|
46
38
|
};
|
|
47
39
|
/** Merge builtin + user-defined apps. User entries are additive only. */
|
|
48
40
|
export function loadApps(userApps) {
|
|
@@ -17,16 +17,8 @@ describe('electron-apps registry', () => {
|
|
|
17
17
|
expect(new Set(ports).size).toBe(ports.length);
|
|
18
18
|
expect(ports).not.toContain(9222);
|
|
19
19
|
});
|
|
20
|
-
it('returns builtin app entry for Trae CN', () => {
|
|
21
|
-
const app = getElectronApp('trae-cn');
|
|
22
|
-
expect(app).toBeDefined();
|
|
23
|
-
expect(app.port).toBe(39240);
|
|
24
|
-
expect(app.processName).toBe('Trae CN');
|
|
25
|
-
expect(app.bundleId).toBe('cn.trae.app');
|
|
26
|
-
expect(app.executableNames).toEqual(['Electron']);
|
|
27
|
-
});
|
|
28
20
|
it('returns undefined for non-Electron sites', () => {
|
|
29
|
-
expect(getElectronApp('
|
|
21
|
+
expect(getElectronApp('youtube')).toBeUndefined();
|
|
30
22
|
expect(getElectronApp('hackernews')).toBeUndefined();
|
|
31
23
|
});
|
|
32
24
|
it('isElectronApp returns true for registered apps', () => {
|
|
@@ -35,7 +27,6 @@ describe('electron-apps registry', () => {
|
|
|
35
27
|
expect(isElectronApp('chatwise')).toBe(true);
|
|
36
28
|
expect(isElectronApp('qoder')).toBe(true);
|
|
37
29
|
expect(isElectronApp('trae-solo')).toBe(true);
|
|
38
|
-
expect(isElectronApp('trae-cn')).toBe(true);
|
|
39
30
|
});
|
|
40
31
|
it('registers Qoder on its own CDP port', () => {
|
|
41
32
|
const app = getElectronApp('qoder');
|
|
@@ -54,7 +45,7 @@ describe('electron-apps registry', () => {
|
|
|
54
45
|
expect(app.bundleId).toBe('com.trae.solo.app');
|
|
55
46
|
});
|
|
56
47
|
it('isElectronApp returns false for non-Electron sites', () => {
|
|
57
|
-
expect(isElectronApp('
|
|
48
|
+
expect(isElectronApp('youtube')).toBe(false);
|
|
58
49
|
expect(isElectronApp('notion')).toBe(false);
|
|
59
50
|
expect(isElectronApp('unknown-app')).toBe(false);
|
|
60
51
|
});
|
package/dist/src/errors.test.js
CHANGED
|
@@ -19,11 +19,11 @@ describe('Error type hierarchy', () => {
|
|
|
19
19
|
}
|
|
20
20
|
});
|
|
21
21
|
it('AuthRequiredError has correct code, domain, and auto-generated hint', () => {
|
|
22
|
-
const err = new AuthRequiredError('
|
|
22
|
+
const err = new AuthRequiredError('youtube.com');
|
|
23
23
|
expect(err.code).toBe('AUTH_REQUIRED');
|
|
24
|
-
expect(err.domain).toBe('
|
|
25
|
-
expect(err.message).toBe('Not logged in to
|
|
26
|
-
expect(err.hint).toContain('https://
|
|
24
|
+
expect(err.domain).toBe('youtube.com');
|
|
25
|
+
expect(err.message).toBe('Not logged in to youtube.com');
|
|
26
|
+
expect(err.hint).toContain('https://youtube.com');
|
|
27
27
|
});
|
|
28
28
|
it('AuthRequiredError accepts custom message', () => {
|
|
29
29
|
const err = new AuthRequiredError('x.com', 'No ct0 cookie found');
|
|
@@ -31,9 +31,9 @@ describe('Error type hierarchy', () => {
|
|
|
31
31
|
expect(err.hint).toContain('https://x.com');
|
|
32
32
|
});
|
|
33
33
|
it('TimeoutError has correct code and hint', () => {
|
|
34
|
-
const err = new TimeoutError('
|
|
34
|
+
const err = new TimeoutError('youtube/search', 60);
|
|
35
35
|
expect(err.code).toBe('TIMEOUT');
|
|
36
|
-
expect(err.message).toBe('
|
|
36
|
+
expect(err.message).toBe('youtube/search timed out after 60s');
|
|
37
37
|
expect(err.hint).toContain('timeout');
|
|
38
38
|
});
|
|
39
39
|
it('ArgumentError has correct code', () => {
|
|
@@ -59,14 +59,14 @@ describe('Error type hierarchy', () => {
|
|
|
59
59
|
});
|
|
60
60
|
describe('toEnvelope', () => {
|
|
61
61
|
it('converts CliError to structured envelope', () => {
|
|
62
|
-
const err = new AuthRequiredError('
|
|
62
|
+
const err = new AuthRequiredError('youtube.com');
|
|
63
63
|
const envelope = toEnvelope(err);
|
|
64
64
|
expect(envelope).toEqual({
|
|
65
65
|
ok: false,
|
|
66
66
|
error: {
|
|
67
67
|
code: 'AUTH_REQUIRED',
|
|
68
|
-
message: 'Not logged in to
|
|
69
|
-
help: expect.stringContaining('https://
|
|
68
|
+
message: 'Not logged in to youtube.com',
|
|
69
|
+
help: expect.stringContaining('https://youtube.com'),
|
|
70
70
|
exitCode: 77,
|
|
71
71
|
},
|
|
72
72
|
});
|
package/dist/src/execution.js
CHANGED
|
@@ -19,6 +19,7 @@ import { adapterLoadError, ArgumentError, CommandExecutionError, attachTraceRece
|
|
|
19
19
|
import { shouldUseBrowserSession } from './capabilityRouting.js';
|
|
20
20
|
import { getBrowserFactory, browserSession, runWithTimeout, DEFAULT_BROWSER_COMMAND_TIMEOUT } from './runtime.js';
|
|
21
21
|
import { resolveProfileContextId } from './browser/profile.js';
|
|
22
|
+
import { setDaemonCommandTimeoutSeconds } from './browser/daemon-client.js';
|
|
22
23
|
import { emitHook } from './hooks.js';
|
|
23
24
|
import { log } from './logger.js';
|
|
24
25
|
import { isElectronApp } from './electron-apps.js';
|
|
@@ -182,6 +183,7 @@ export async function executeCommand(cmd, rawKwargs, debug = false, opts = {}) {
|
|
|
182
183
|
throw new ArgumentError(getErrorMessage(err));
|
|
183
184
|
}
|
|
184
185
|
const userTimeoutSec = readUserTimeoutSeconds(cmd, kwargs);
|
|
186
|
+
setDaemonCommandTimeoutSeconds(userTimeoutSec);
|
|
185
187
|
const traceMode = normalizeTraceMode(opts.trace);
|
|
186
188
|
const hookCtx = {
|
|
187
189
|
command: fullName(cmd),
|
|
@@ -2,6 +2,16 @@ import { describe, expect, it, vi } from 'vitest';
|
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as os from 'node:os';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
|
+
const { mockSetDaemonCommandTimeoutSeconds } = vi.hoisted(() => ({
|
|
6
|
+
mockSetDaemonCommandTimeoutSeconds: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
vi.mock('./browser/daemon-client.js', async () => {
|
|
9
|
+
const actual = await vi.importActual('./browser/daemon-client.js');
|
|
10
|
+
return {
|
|
11
|
+
...actual,
|
|
12
|
+
setDaemonCommandTimeoutSeconds: mockSetDaemonCommandTimeoutSeconds,
|
|
13
|
+
};
|
|
14
|
+
});
|
|
5
15
|
import { executeCommand, prepareCommandArgs } from './execution.js';
|
|
6
16
|
import { ArgumentError, TimeoutError, toEnvelope } from './errors.js';
|
|
7
17
|
import { cli, Strategy } from './registry.js';
|
|
@@ -90,6 +100,7 @@ describe('executeCommand — non-browser timeout', () => {
|
|
|
90
100
|
vi.restoreAllMocks();
|
|
91
101
|
});
|
|
92
102
|
it('applies the user --timeout arg as the ceiling for browser commands (with +30s padding)', async () => {
|
|
103
|
+
mockSetDaemonCommandTimeoutSeconds.mockClear();
|
|
93
104
|
const closeWindow = vi.fn().mockResolvedValue(undefined);
|
|
94
105
|
const mockPage = { closeWindow };
|
|
95
106
|
vi.spyOn(capRouting, 'shouldUseBrowserSession').mockReturnValue(true);
|
|
@@ -112,6 +123,7 @@ describe('executeCommand — non-browser timeout', () => {
|
|
|
112
123
|
timeout: 35,
|
|
113
124
|
label: 'test-execution/browser-with-timeout',
|
|
114
125
|
});
|
|
126
|
+
expect(mockSetDaemonCommandTimeoutSeconds).toHaveBeenCalledWith(5);
|
|
115
127
|
vi.restoreAllMocks();
|
|
116
128
|
});
|
|
117
129
|
it('falls back to DEFAULT_BROWSER_COMMAND_TIMEOUT for browser commands without a --timeout arg', async () => {
|
|
@@ -37,34 +37,6 @@
|
|
|
37
37
|
install:
|
|
38
38
|
default: "npm install -g @larksuite/cli"
|
|
39
39
|
|
|
40
|
-
- name: longbridge
|
|
41
|
-
binary: longbridge
|
|
42
|
-
description: "Longbridge CLI — AI-native market data, account management and trading commands for Longbridge OpenAPI"
|
|
43
|
-
homepage: "https://open.longbridge.com/zh-CN/docs/cli/"
|
|
44
|
-
tags: [longbridge, finance, trading, market-data, openapi, ai-agent]
|
|
45
|
-
install:
|
|
46
|
-
mac: "brew install --cask longbridge/tap/longbridge-terminal"
|
|
47
|
-
windows: "scoop install https://open.longbridge.com/longbridge/longbridge-terminal/longbridge.json"
|
|
48
|
-
|
|
49
|
-
- name: dws
|
|
50
|
-
binary: dws
|
|
51
|
-
package: DingTalk Workspace
|
|
52
|
-
description: "DingTalk Workspace CLI — messages, docs, calendar, contacts and more for humans and AI agents"
|
|
53
|
-
homepage: "https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli"
|
|
54
|
-
tags: [dingtalk, collaboration, productivity, ai-agent]
|
|
55
|
-
install:
|
|
56
|
-
mac: "npm install -g dingtalk-workspace-cli"
|
|
57
|
-
linux: "npm install -g dingtalk-workspace-cli"
|
|
58
|
-
|
|
59
|
-
- name: wecom-cli
|
|
60
|
-
binary: wecom-cli
|
|
61
|
-
package: 企业微信
|
|
62
|
-
description: "WeCom/企业微信 CLI — contacts, todos, meetings, messages, calendar, docs and smart sheets for AI agents"
|
|
63
|
-
homepage: "https://github.com/WecomTeam/wecom-cli"
|
|
64
|
-
tags: [wecom, wechat-work, collaboration, productivity, ai-agent]
|
|
65
|
-
install:
|
|
66
|
-
default: "npm install -g @wecom/cli"
|
|
67
|
-
|
|
68
40
|
- name: vercel
|
|
69
41
|
binary: vercel
|
|
70
42
|
description: "Vercel CLI — deploy projects, manage domains, env vars, logs and serverless functions"
|
|
@@ -91,15 +63,6 @@
|
|
|
91
63
|
install:
|
|
92
64
|
default: "uv tool install kabi-discord-cli"
|
|
93
65
|
|
|
94
|
-
- name: wx
|
|
95
|
-
binary: wx
|
|
96
|
-
package: wx-cli
|
|
97
|
-
description: "WeChat local data CLI — sessions, messages, search, contacts, export for AI agents"
|
|
98
|
-
homepage: "https://github.com/jackwener/wx-cli"
|
|
99
|
-
tags: [wechat, messaging, search, export, ai-agent]
|
|
100
|
-
install:
|
|
101
|
-
default: "npm install -g @jackwener/wx-cli"
|
|
102
|
-
|
|
103
66
|
- name: wrangler
|
|
104
67
|
binary: wrangler
|
|
105
68
|
description: "Cloudflare Wrangler — deploy Workers, manage R2/D1/KV, publish Pages"
|
package/dist/src/external.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export interface ExternalCliConfig {
|
|
|
11
11
|
/**
|
|
12
12
|
* Display alias rendered alongside `name` in help/listing as `name(package)`.
|
|
13
13
|
* Use either the upstream distribution/project name (e.g. `tg-cli`, `discord-cli`)
|
|
14
|
-
* or a human-readable brand label (e.g. `notion`,
|
|
14
|
+
* or a human-readable brand label (e.g. `notion`, `linear`) when the bare
|
|
15
15
|
* executable name is ambiguous.
|
|
16
16
|
*/
|
|
17
17
|
package?: string;
|
|
@@ -44,32 +44,17 @@ describe('parseCommand', () => {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
|
-
it('registers Longbridge with safe package-manager installers only', () => {
|
|
48
|
-
const raw = fs.readFileSync(path.join(__dirname, 'external-clis.yaml'), 'utf8');
|
|
49
|
-
const entries = (yaml.load(raw) || []);
|
|
50
|
-
const longbridge = entries.find((entry) => entry.name === 'longbridge');
|
|
51
|
-
expect(longbridge).toMatchObject({
|
|
52
|
-
binary: 'longbridge',
|
|
53
|
-
homepage: 'https://open.longbridge.com/zh-CN/docs/cli/',
|
|
54
|
-
install: {
|
|
55
|
-
mac: 'brew install --cask longbridge/tap/longbridge-terminal',
|
|
56
|
-
windows: 'scoop install https://open.longbridge.com/longbridge/longbridge-terminal/longbridge.json',
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
expect(longbridge?.install?.linux).toBeUndefined();
|
|
60
|
-
expect(longbridge?.install?.default).toBeUndefined();
|
|
61
|
-
});
|
|
62
47
|
});
|
|
63
48
|
describe('formatExternalCliLabel', () => {
|
|
64
49
|
it('shows the package name when the executable name differs', () => {
|
|
65
|
-
expect(formatExternalCliLabel({ name: '
|
|
50
|
+
expect(formatExternalCliLabel({ name: 'tg', binary: 'tg', package: 'tg-cli' })).toBe('tg(tg-cli)');
|
|
66
51
|
});
|
|
67
52
|
it('keeps the label compact when package and name match', () => {
|
|
68
53
|
expect(formatExternalCliLabel({ name: 'docker', binary: 'docker', package: 'docker' })).toBe('docker');
|
|
69
54
|
});
|
|
70
55
|
it('renders a human-readable brand alias for ambiguous executable names', () => {
|
|
71
56
|
expect(formatExternalCliLabel({ name: 'ntn', binary: 'ntn', package: 'notion' })).toBe('ntn(notion)');
|
|
72
|
-
expect(formatExternalCliLabel({ name: '
|
|
57
|
+
expect(formatExternalCliLabel({ name: 'lin', binary: 'lin', package: 'linear' })).toBe('lin(linear)');
|
|
73
58
|
});
|
|
74
59
|
});
|
|
75
60
|
describe('installExternalCli', () => {
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { loadReleaseContext, runGenerateReleaseNotes } from '../scripts/generate-release-notes.js';
|
|
5
|
+
function createIo() {
|
|
6
|
+
let stdout = '';
|
|
7
|
+
let stderr = '';
|
|
8
|
+
return {
|
|
9
|
+
io: {
|
|
10
|
+
writeStdout(chunk) {
|
|
11
|
+
stdout += chunk;
|
|
12
|
+
},
|
|
13
|
+
writeStderr(chunk) {
|
|
14
|
+
stderr += chunk;
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
read() {
|
|
18
|
+
return { stdout, stderr };
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe('runGenerateReleaseNotes', () => {
|
|
23
|
+
it('exits 1 with usage text when the tag argument is missing', async () => {
|
|
24
|
+
const { io, read } = createIo();
|
|
25
|
+
const exitCode = await runGenerateReleaseNotes(['node', 'script'], {}, {}, io);
|
|
26
|
+
expect(exitCode).toBe(1);
|
|
27
|
+
expect(read()).toEqual({
|
|
28
|
+
stdout: '',
|
|
29
|
+
stderr: 'Usage: generate-release-notes <tag>\n',
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
it('exits 0 and leaves stdout empty when GEMINI_API_KEY is missing', async () => {
|
|
33
|
+
const { io, read } = createIo();
|
|
34
|
+
const exitCode = await runGenerateReleaseNotes(['node', 'script', 'v0.0.0'], {}, {}, io);
|
|
35
|
+
expect(exitCode).toBe(0);
|
|
36
|
+
expect(read()).toEqual({
|
|
37
|
+
stdout: '',
|
|
38
|
+
stderr: 'GEMINI_API_KEY is not set; leaving release-please notes unchanged.\n',
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('normalizes generated markdown before printing it to stdout', async () => {
|
|
42
|
+
const { io, read } = createIo();
|
|
43
|
+
const context = {
|
|
44
|
+
tag: 'v1.2.3',
|
|
45
|
+
previousTag: 'v1.2.2',
|
|
46
|
+
currentRef: 'abcdef1',
|
|
47
|
+
pullRequests: [
|
|
48
|
+
{
|
|
49
|
+
number: 42,
|
|
50
|
+
title: 'feat: improve release notes',
|
|
51
|
+
author: { login: 'alice' },
|
|
52
|
+
labels: [],
|
|
53
|
+
files: [],
|
|
54
|
+
url: 'https://example.com/42',
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
const loadContext = vi.fn(async () => context);
|
|
59
|
+
const generateText = vi.fn(async () => '## Highlights\n- Better summaries.');
|
|
60
|
+
const exitCode = await runGenerateReleaseNotes(['node', 'script', 'v1.2.3'], { GEMINI_API_KEY: 'test-key' }, { loadContext, generateText }, io);
|
|
61
|
+
expect(exitCode).toBe(0);
|
|
62
|
+
expect(loadContext).toHaveBeenCalledWith('v1.2.3', { GEMINI_API_KEY: 'test-key' });
|
|
63
|
+
expect(generateText).toHaveBeenCalledOnce();
|
|
64
|
+
expect(read()).toEqual({
|
|
65
|
+
stdout: [
|
|
66
|
+
'## Highlights',
|
|
67
|
+
'- Better summaries.',
|
|
68
|
+
'',
|
|
69
|
+
'## Improvements',
|
|
70
|
+
'None.',
|
|
71
|
+
'',
|
|
72
|
+
'## Fixes',
|
|
73
|
+
'None.',
|
|
74
|
+
'',
|
|
75
|
+
'## Contributors',
|
|
76
|
+
'- @alice',
|
|
77
|
+
'',
|
|
78
|
+
'## Reverts',
|
|
79
|
+
'None.',
|
|
80
|
+
'',
|
|
81
|
+
].join('\n'),
|
|
82
|
+
stderr: '',
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
it('swallows generator errors and keeps release-please notes intact', async () => {
|
|
86
|
+
const { io, read } = createIo();
|
|
87
|
+
const loadContext = vi.fn(async () => {
|
|
88
|
+
throw new Error('gh timed out');
|
|
89
|
+
});
|
|
90
|
+
const exitCode = await runGenerateReleaseNotes(['node', 'script', 'v1.2.3'], { GEMINI_API_KEY: 'test-key' }, { loadContext }, io);
|
|
91
|
+
expect(exitCode).toBe(0);
|
|
92
|
+
expect(read()).toEqual({
|
|
93
|
+
stdout: '',
|
|
94
|
+
stderr: 'Gemini release notes failed: gh timed out\n',
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
it('loads bounded PR diffs into release context', async () => {
|
|
98
|
+
const gh = vi.fn((args) => {
|
|
99
|
+
const key = args.join(' ');
|
|
100
|
+
if (key === 'api repos/acme/webcmd/releases?per_page=100') {
|
|
101
|
+
return JSON.stringify([{ tag_name: 'v1.2.3' }, { tag_name: 'v1.2.2' }]);
|
|
102
|
+
}
|
|
103
|
+
if (key === 'api repos/acme/webcmd/compare/v1.2.2...v1.2.3') {
|
|
104
|
+
return JSON.stringify({
|
|
105
|
+
commits: [
|
|
106
|
+
{ sha: 'abc123', commit: { message: 'feat: improve releases (#42)\n\nBody' } },
|
|
107
|
+
],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (key === 'api repos/acme/webcmd/pulls/42') {
|
|
111
|
+
return JSON.stringify({
|
|
112
|
+
number: 42,
|
|
113
|
+
title: 'feat: improve releases',
|
|
114
|
+
body: 'Release polish.',
|
|
115
|
+
user: { login: 'alice' },
|
|
116
|
+
labels: [{ name: 'feature' }],
|
|
117
|
+
html_url: 'https://github.com/acme/webcmd/pull/42',
|
|
118
|
+
merged_at: '2026-07-03T00:00:00Z',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (key === 'api repos/acme/webcmd/pulls/42/files?per_page=100') {
|
|
122
|
+
return JSON.stringify([{ filename: 'src/release-notes.ts' }]);
|
|
123
|
+
}
|
|
124
|
+
if (key === 'pr diff 42 --repo acme/webcmd') {
|
|
125
|
+
return `diff --git a/src/release-notes.ts b/src/release-notes.ts\n${'x'.repeat(80)}`;
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`unexpected gh call: ${key}`);
|
|
128
|
+
});
|
|
129
|
+
const context = await loadReleaseContext('v1.2.3', { GITHUB_REPOSITORY: 'acme/webcmd' }, { gh, maxDiffCharacters: 40 });
|
|
130
|
+
expect(context.pullRequests).toHaveLength(1);
|
|
131
|
+
expect(context.pullRequests[0]?.diff).toBe('diff --git a/src/release-notes.ts b/src/\n[diff truncated]');
|
|
132
|
+
expect(gh).toHaveBeenCalledWith(['pr', 'diff', '42', '--repo', 'acme/webcmd']);
|
|
133
|
+
});
|
|
134
|
+
it('keeps npm publish unblocked when enhanced release-note editing fails', () => {
|
|
135
|
+
const workflowPath = fileURLToPath(new URL('../.github/workflows/release.yml', import.meta.url));
|
|
136
|
+
const workflow = readFileSync(workflowPath, 'utf8');
|
|
137
|
+
expect(workflow).toMatch(/if gh release edit "\$\{\{ steps\.release\.outputs\.tag_name \}\}" --notes-file "\$RUNNER_TEMP\/release-notes\.md"; then/);
|
|
138
|
+
expect(workflow).toMatch(/Enhanced release notes could not be applied; keeping release-please notes\./);
|
|
139
|
+
});
|
|
140
|
+
});
|
package/dist/src/help.d.ts
CHANGED
|
@@ -28,9 +28,9 @@ export declare function wrapCommaList(items: readonly string[], opts?: {
|
|
|
28
28
|
/**
|
|
29
29
|
* Adapter category for help-text grouping.
|
|
30
30
|
*
|
|
31
|
-
* - `site`: web site adapter (real DNS-style domain, e.g. `www.
|
|
31
|
+
* - `site`: web site adapter (real DNS-style domain, e.g. `www.youtube.com`)
|
|
32
32
|
* - `app`: desktop app adapter (Electron/osascript, signaled by `domain: 'localhost'`
|
|
33
|
-
* or other non-DNS/local endpoint string like `'127.0.0.1'` / `'
|
|
33
|
+
* or other non-DNS/local endpoint string like `'127.0.0.1'` / `'custom-app'`)
|
|
34
34
|
*
|
|
35
35
|
* Classification is derived from the adapter's `domain` field — no new schema
|
|
36
36
|
* required. Adapters without a `domain` field default to `site` (most are
|
|
@@ -43,7 +43,7 @@ export interface RootAdapterGroups {
|
|
|
43
43
|
external: readonly RootExternalCli[];
|
|
44
44
|
/** Desktop-app adapters (chatgpt-app, chatwise, codex, ...) */
|
|
45
45
|
apps: readonly string[];
|
|
46
|
-
/** Web-site adapters (
|
|
46
|
+
/** Web-site adapters (youtube, reddit, github, ...) */
|
|
47
47
|
sites: readonly string[];
|
|
48
48
|
}
|
|
49
49
|
export interface RootExternalCli {
|
package/dist/src/help.test.js
CHANGED
|
@@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { classifyAdapter, formatRootAdapterHelpText } from './help.js';
|
|
3
3
|
describe('classifyAdapter', () => {
|
|
4
4
|
it('classifies DNS-style domains as site', () => {
|
|
5
|
-
expect(classifyAdapter('www.
|
|
5
|
+
expect(classifyAdapter('www.youtube.com')).toBe('site');
|
|
6
6
|
expect(classifyAdapter('chatgpt.com')).toBe('site');
|
|
7
7
|
expect(classifyAdapter('claude.ai')).toBe('site');
|
|
8
8
|
expect(classifyAdapter('grok.com')).toBe('site');
|
|
@@ -10,8 +10,8 @@ describe('classifyAdapter', () => {
|
|
|
10
10
|
it('classifies localhost as app (Electron / osascript desktop integrations)', () => {
|
|
11
11
|
expect(classifyAdapter('localhost')).toBe('app');
|
|
12
12
|
});
|
|
13
|
-
it('classifies non-DNS domain strings as app (e.g. literal "
|
|
14
|
-
expect(classifyAdapter('
|
|
13
|
+
it('classifies non-DNS domain strings as app (e.g. literal "custom-app")', () => {
|
|
14
|
+
expect(classifyAdapter('custom-app')).toBe('app');
|
|
15
15
|
});
|
|
16
16
|
it('defaults missing domain to site (most adapters without explicit domain are public web scrapers)', () => {
|
|
17
17
|
expect(classifyAdapter(undefined)).toBe('site');
|
|
@@ -22,15 +22,15 @@ describe('formatRootAdapterHelpText', () => {
|
|
|
22
22
|
const text = formatRootAdapterHelpText({
|
|
23
23
|
external: [
|
|
24
24
|
{ name: 'gh', label: 'gh' },
|
|
25
|
-
{ name: '
|
|
25
|
+
{ name: 'vercel', label: 'vercel' },
|
|
26
26
|
],
|
|
27
27
|
apps: ['chatwise', 'codex'],
|
|
28
|
-
sites: ['
|
|
28
|
+
sites: ['youtube'],
|
|
29
29
|
});
|
|
30
30
|
expect(text).toContain('External CLIs (2):');
|
|
31
31
|
expect(text).toContain('App adapters (2):');
|
|
32
32
|
expect(text).toContain('Site adapters (1):');
|
|
33
|
-
expect(text).toContain('
|
|
33
|
+
expect(text).toContain('vercel');
|
|
34
34
|
expect(text.indexOf('External CLIs')).toBeLessThan(text.indexOf('App adapters'));
|
|
35
35
|
expect(text.indexOf('App adapters')).toBeLessThan(text.indexOf('Site adapters'));
|
|
36
36
|
});
|
|
@@ -38,7 +38,7 @@ describe('formatRootAdapterHelpText', () => {
|
|
|
38
38
|
const text = formatRootAdapterHelpText({
|
|
39
39
|
external: [],
|
|
40
40
|
apps: [],
|
|
41
|
-
sites: ['
|
|
41
|
+
sites: ['youtube'],
|
|
42
42
|
});
|
|
43
43
|
expect(text).not.toContain('External CLIs');
|
|
44
44
|
expect(text).not.toContain('App adapters');
|
|
@@ -51,7 +51,7 @@ describe('formatRootAdapterHelpText', () => {
|
|
|
51
51
|
const text = formatRootAdapterHelpText({
|
|
52
52
|
external: [],
|
|
53
53
|
apps: [],
|
|
54
|
-
sites: ['
|
|
54
|
+
sites: ['youtube'],
|
|
55
55
|
});
|
|
56
56
|
expect(text).toContain("'webcmd <site> --help -f yaml'");
|
|
57
57
|
});
|
package/dist/src/main.js
CHANGED
|
@@ -153,7 +153,7 @@ const { rewriteBrowserArgv, BrowserSessionArgvError, escapeLeadingDashPositional
|
|
|
153
153
|
try {
|
|
154
154
|
let rewritten = rewriteBrowserArgv(process.argv.slice(2));
|
|
155
155
|
// Insert a `--` separator before a required positional whose value starts
|
|
156
|
-
// with `-` (e.g.
|
|
156
|
+
// with `-` (e.g. opaque securityId tokens; #1160). Skipped when the
|
|
157
157
|
// manifest is unavailable so the user-cli / dev paths still work.
|
|
158
158
|
try {
|
|
159
159
|
const manifestPath = getCliManifestPath(BUILTIN_CLIS);
|
|
@@ -30,7 +30,7 @@ export interface ManifestEntry {
|
|
|
30
30
|
pipeline?: Record<string, unknown>[];
|
|
31
31
|
defaultFormat?: 'table' | 'plain' | 'json' | 'yaml' | 'yml' | 'md' | 'markdown' | 'csv';
|
|
32
32
|
type: 'js';
|
|
33
|
-
/** Relative path from clis/ dir, e.g. '
|
|
33
|
+
/** Relative path from clis/ dir, e.g. 'youtube/search.js' */
|
|
34
34
|
modulePath?: string;
|
|
35
35
|
/** Relative path to the source file from clis/ dir (e.g. 'site/cmd.js') */
|
|
36
36
|
sourceFile?: string;
|