57 Commits
Author SHA1 Message Date
Liu Wenjie aecc3124b0 fix(changelog): enhance catalog handling for npm installs with missing notes
Updated the logic in `updateNotesFor` to check if a catalog is needed when no usable notes are found. This prevents unnecessary catalog queries for GitHub root installs lacking probe data. Added a test to ensure the catalog is not consulted in such cases.
2026-09-27 23:36:14 +08:00
Liu Wenjie 0823aa2fed fix(changelog): an npm install's update notes are not found by the catalog name (#746) 2026-09-27 22:46:17 +08:00
Regulus b83751e614 Merge pull request #737 from zhanghao3693/i18n/zh-locale-meta
i18n: add zh-CN display metadata (locale/*.json)
2026-09-27 22:30:54 +08:00
Regulus 180c3144da fix(net): carry our own dispatcher on a direct fetch (#742)
Node 22's global fetch reads the legacy undici dispatcher symbol. The
host's first undici 8 import (web_fetch) writes a Dispatcher1Wrapper
there, and gzip catalog bodies then fail JSON.parse for the rest of
the process. A proxied request already passed its own dispatcher; a
direct one now does the same, with a plain Agent.
The Node 25 measurement stays beside it: there, the package's
setGlobalDispatcher does not steer global fetch at all. The two name
different Nodes and different symbols, and both are why every market
request carries a dispatcher this module created.
2026-09-27 14:17:53 +08:00
Liu Wenjie 317acd0537 docs(net): keep the two dispatcher measurements apart (#742)
The Node 25 proxy measurement and the Node 22 symbol clash were written
as one argument, so a later edit could drop the direct-path dispatcher
by trusting only the first. They name different Nodes and different
symbols, and both are why every market request carries its own.
2026-09-27 13:59:49 +08:00
Liu Wenjie a7e3bf9622 fix(net): carry our own dispatcher on a direct fetch (#742)
Node 22's global fetch reads the legacy undici dispatcher. The host's
first undici 8 import (web_fetch) replaces it, and gzip catalog bodies
then fail JSON.parse for the rest of the process. A proxied request
already passed a dispatcher; a direct one now does the same.
2026-09-27 13:45:18 +08:00
Regulus f4478f5301 fix(client): a core-bundle red line still left its verb in English (#401) (#735)
The scanner's detail is itself a sentence — "overrides bundle …" or
"disables bundle …" — and the translation was pasting that detail
through. A reader then had to parse the English verb to learn whether
the install would replace a part of DSH or switch one off. Those two
shapes are the only details the scanner emits.

A detail that is neither of those stays on the generic sentence, so a
future shape is not guessed into an override or a disable.
2026-09-26 22:13:44 +08:00
Liu Wenjie b903de2ff8 test(client): add test for unrecognized core-bundle detail handling in MarketSection
This test verifies that when an unrecognized core-bundle detail is present, it remains on the generic sentence without being incorrectly classified as an override or disable. The test ensures the expected behavior of the MarketSection component in this scenario.
2026-09-26 16:54:32 +08:00
Liu Wenjie 57fe7bfa97 fix(client): a core-bundle red line still left its verb in English (#401)
The scanner's detail is itself a sentence — "overrides bundle …" or
"disables bundle …" — and the translation was pasting that detail
through. A reader then had to parse the English verb to learn whether
the install would replace a part of DSH or switch one off. Those two
shapes are the only details the scanner emits.
2026-09-26 16:14:54 +08:00
Regulus 90a31aed5a fix(approve-builds): keep a remote's key as spelled, with or without .git (#665) (#695)
Follow-up to #665 from merge review.

The allowlist required `.git` on a clone-URL key, so a self-hosted remote
installed as `git+https://host/owner/repo` had its key derived correctly and
then dropped on the way out — the same silent hole #665 closed, one spelling
over.

The suffix is now optional rather than appended. pnpm keys a remote exactly
as it was spelled: measured on 12.4.1 against a remote without `.git`, the
key as spelled authorizes the build and the key with `.git` appended does
not, so "normalizing" would have written an entry pnpm never reads. The same
spelling pinned with `#<sha>` is what 11.8.0 matches.

Also from the review: `codeloadAllowBuildsKey`'s doc had ended up above
`pinnedGitAllowBuildsKey`, and a couple of comments still said "github".
2026-09-23 12:36:57 +08:00
RegulusandGnaneshKunal a366817293 fix(client): resolve ui-primitives icons across the 0.1.7 rename (#671) (#681)
* fix(client): resolve ui-primitives icons across the 0.1.7 rename (#671)

Host 0.1.7-alpha.1 dropped size-suffixed icon exports for Regular/Medium
with no alias, so MarketSection rendered undefined and threw React #130.
Pick the new name when present, fall back to the old one, and skip
registration when neither spelling exists.

* fix(client): harden icon resolve for exotic components and real exports (#671)

Accept memo/forwardRef-shaped primitives exports, not only plain functions,
and pin the alias table against the measured 0.1.6 / 0.1.7 icon export lists.

* fix(client): prefer Regular icons and skip missing glyphs (#671)

Align with the size-vs-weight split on 0.1.7: always resolve …Regular first,
keep call-site `size` props, and render nothing (with a warning) when neither
spelling exists so a rename cannot blank the market. Also guard host-table
lookups that throw on unknown keys.

Co-authored-by: GnaneshKunal <20211167+GnaneshKunal@users.noreply.github.com>

---------

Co-authored-by: GnaneshKunal <20211167+GnaneshKunal@users.noreply.github.com>
2026-09-23 00:39:54 +08:00
Regulus 8c02171176 fix(client): tighten the installed groups view (#668)
Ungrouped rows reused the card shell, so the name sat above an empty band and Assign filled the row. The group header put rename and delete next to add. Both are one line now: the header keeps the switch, Choose/Change theme, and Add members, with rename and delete in the overflow menu. An ungrouped row is the name, a short status, a truncated note, and Assign.

A group holds one theme, so choosing one is its own dialog, not another checkbox in Add members. The theme stays the first row, marked "· Theme", and choosing it does not enable it. Adding plugins does not enable them either. Search filters groups by name, member, note, and description. Leaving the new-group field, or pressing Esc, restores the button.
2026-09-22 21:45:06 +08:00
Liu Wenjie cd2029adaa refactor(client): streamline group creation and cancellation logic
Enhanced the group creation process by consolidating the cancellation logic into a reusable callback function. Updated the UI to ensure that the group creation input field is cleared and the state is reset upon cancellation, either through button clicks or focus loss. Improved keyboard accessibility by allowing cancellation with the Escape key. This refactor aims to simplify the code and improve user experience during group management.
2026-09-22 21:16:23 +08:00
Liu Wenjie bcf385858b refactor(client): enhance group management UI and functionality
Updated the group management interface to improve user experience by introducing modals for adding members and renaming groups. Enhanced the layout for better visibility and interaction, ensuring that actions like adding members and changing themes are more intuitive. Added new localization strings for improved internationalization support. Adjusted CSS for better alignment and spacing in group-related components.
2026-09-22 21:10:18 +08:00
Liu Wenjie 09a8965699 fix(client): move group rename and add-member into modals
Inline rename jammed the header with Add/Delete; the add picker expanded
inside the group card. Use the shared Modal so those flows stay focused.
2026-09-22 21:10:18 +08:00
Liu Wenjie 455ffa8e2f fix(client): tighten installed groups layout
Ungrouped rows reused the column .irow card shell, so flex-grow left a tall
empty band above Assign. Use a compact horizontal row, restore the missing
.sect label style, and demote delete behind add actions.
2026-09-22 21:10:18 +08:00
Regulus 299c7a106c fix(client): load host requirements on the favorites tab (#669)
* fix(client): load host requirements on the favorites tab

Favorites reuse pluginCard badges but only Discover was fetching
discovery-compatibility, so bookmark-only packages stayed on loading.

* chore(client): rebuild bundle for favorites host-requirement fix
2026-09-22 15:19:45 +08:00
Regulus 2f208c91dd fix(client): keep host-requirement badges quiet unless they fail (#666)
Compatible host-requirement badges used the same chrome as category tags;
keep red only for a confirmed mismatch. Status / filtering / data-status unchanged.
2026-09-22 12:16:59 +08:00
Regulus 7ec601a9f1 docs(cli): record why the host package-manager env replaces the process env (#653)
Fixes #653

Only documents why hostEnv follows process.env in spawnEnv; no behavior change.
#654 already shipped the fix in v1.53.0.
2026-09-22 11:41:57 +08:00
Liu Wenjie 4123aebd9a fix(client): keep host-requirement badges quiet unless they fail
Compatible cards were wearing a green success chip next to grey category tags, so every discovery card looked decorated. Matching the category chrome leaves colour for a confirmed mismatch only.
2026-09-22 11:30:10 +08:00
Liu Wenjie 6e4f93e3da docs(cli): record why the host package-manager env replaces the process env (#653)
The inherited PATH is never empty, so leaving it in place would keep the bundled Node off the path. Proxy and GIT_TERMINAL_PROMPT still keep a value the caller already set.
2026-09-22 09:48:55 +08:00
Regulus 488e92663c fix: count optionalDependencies when deciding if uninstall needs a restart (#441) (#660)
SinglePlayer keeps node-hid there, so uninstall still promised a page refresh while the host holds the .node files.
2026-09-22 00:41:42 +08:00
Liu WenjieandCursor 83327f8765 release 1.53.0: the Desktop GUI can install, and a dead restart can be undone
- Official Desktop GUI installs failed with `env: node: No such file or
  directory`: the shell's PATH has no node, so the pnpm on PATH could not
  run (#653, by @Yur0918 in #654). The market now prefers the host's own
  package manager and env when the launcher publishes them, and `env: node:`
  is no longer diagnosed as a corepack network problem.
- A market restart that never comes back no longer takes the UI with it
  (#650, by @Karl-441). The helper waits until the replacement is actually
  listening, then offers "adjust plugins" on the same origin — implicated
  plugins unticked — writes the patch, and starts again. Only market-triggered
  restarts; loopback + same-origin POST; only names that were in the list
  before the restart.
- Updating a GitLab or Bitbucket install no longer silently swaps in the
  npm package of the same name (#637, by @po-et in #656). `gitlab:` /
  `bitbucket:` are git sources; identity is host + owner/repo, including
  archive tarballs in the lockfile.
- `runtime` / `restart.managedBy` follow the desktop shell, not "a profile
  directory exists" (#655, by @po-et), so an ordinary `dsh web` is not
  reported as desktop.
- Desktop staging `ERR_PNPM_UNEXPECTED_STORE` stops telling people to relink
  the profile (#652, by @elkaix); the Chinese UI gets the matching half of
  that pair (#658).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 21:31:44 +08:00
Regulus 2a9d55c80a fix(pnpm-compat): restore Chinese for the Desktop staging unexpected-store advice
Follow-up to #652: the Desktop staging unexpected-store branch is a
中文 / English pair again, so a Chinese UI no longer shows the whole
English sentence. Same remediations; still no --store-dir.
2026-09-21 21:24:18 +08:00
Liu Wenjie 549b6954fc fix(pnpm-compat): update error message for unexpected-store to include Chinese translation
Refactor the error message for unexpected-store when the desktop client's install staging directory is claimed by a pnpm workspace. The message now includes a Chinese translation, providing clearer guidance on how to resolve the issue. Additionally, update tests to verify the presence of the new translations in the error messages.
2026-09-21 20:58:37 +08:00
Regulus a8ee401b06 fix(pnpm-compat): keep the unexpected-store advice honest when the mismatch is Desktop staging
Desktop 在 .generations/staging 安装时,祖先目录的 pnpm-workspace.yaml 可能抢走 store,报 ERR_PNPM_UNEXPECTED_STORE。原先建议去 profile 里 --store-dir relink,对象是错的。

改为识别暂存路径后给出真正的处理:用上层 workspace 自己的 pnpm 大版本 relink,或去掉祖先的 pnpm-workspace.yaml。
2026-09-21 20:52:13 +08:00
Regulus fd777b5a41 fix(update): read a gitlab.com / bitbucket.org install as a git source, not an npm name (#637)
pnpm 会把 GitLab / Bitbucket 安装改写成 gitlab: / bitbucket: 简写,市场不认,更新就按包名去 npm 装,同名包会被静默顶掉。

改为按简写表识别 git 源,归档 tarball 按 host 读 commit,更新透传简写;未写入 gist / sourcehut(pnpm 并不把它们当 git)。
2026-09-21 20:25:19 +08:00
Regulus f5d3867a87 feat(cli): prefer the host's own package manager over PATH (#653)
官方桌面 GUI 的 PATH 上没有 node,PATH 上的 pnpm 因 shebang 起不来,自动配置还被误导向 corepack。

改为优先使用 launcher 发布的 packageManager 整档(command / args / env),并把宿主 env 交给探测和 dsh plugin 安装链;未发布该字段时行为不变。
2026-09-21 20:15:13 +08:00
Regulus 298accbb7a Merge pull request #655 from po-et/fix/capabilities-runtime-not-directory
#644 之后 launcher 会给每个 profile 带上目录,普通 dsh web 也被当成 desktop。

能力位改为只在确有 Desktop 壳(desktopProfiles + desktopPnpm)时报告 desktop / desktop-host,不再从「有没有 profileDirectory」反推。
2026-09-21 14:53:18 +08:00
Regulus df88044a51 feat: 重启后起不来时,在失败提示处提供「调整插件」
市场触发的重启若替代进程没稳住,助手在同一 origin 起恢复面:
按 DSH 点名默认取消勾选,写入 patch/bundles 后再启。

助手以端口听稳一段时间才算起来,避免激活审计失败时的假阳性。
只覆盖市场自己点的重启;环回 + POST 同源;只能动重启前清单里的插件。
2026-09-21 10:44:35 +08:00
Regulus 013cda180a Merge pull request #583 from Fishquito7/feat/market-nav-icon
feat: the market's nav entry wears the block mark, not the shell's gear
2026-09-20 23:57:05 +08:00
Regulus baad7b89c1 Merge pull request #644 from po-et/fix/639-desktop-profile-context
fix(host): take the profile from the launcher, not from argv alone (#639)
2026-09-20 22:30:02 +08:00
Liu Wenjie db13e8b64e release 1.51.0: notes you can read, and words in your language
The through-line is the text the market puts in front of people:
long release notes that used to overflow, and bilingual copy that
used to stay in one language.
- Update-notes dialogs scroll, strip pasted HTML images, and render
  links / fences / quotes (#547).
- CJK / bilingual strings localize for the active UI language (#534).
- Discover cards can show the catalog's npm latest version on the
  byline when the catalog provides it (#515 / #348).
2026-09-20 21:59:00 +08:00
Regulus a6ad5f6e78 Merge pull request #515 from liuwenji007/feat/discover-catalog-version
feat: 发现页 byline 展示目录 npm latest 版本 (#348)
2026-09-20 18:37:17 +08:00
Regulus 0943c53323 Merge pull request #547 from liuwenji007/fix/update-notes-scroll-readable
fix: make update-notes dialog readable for long and short bodies
2026-09-20 18:36:57 +08:00
Liu Wenjie 102d4706ad fix: keep short update-notes dialogs at default width
Only widen the modal for release prose. npm publish-time lists and
commit tails stay compact so a few rows do not float in a large box.
2026-09-20 17:36:13 +08:00
Liu Wenjie 9e43554962 fix: include notesModal width rules in the client bundle
The widen class was referenced before its CSS landed in client.js.
2026-09-20 17:36:13 +08:00
Liu Wenjie 809777ea16 fix: widen update-notes dialog and label the dismiss as close
Reading release prose in the default narrow Modal felt cramped; size
the notes dialog to 640px and use the existing gotIt copy (关闭 /
Dismiss) instead of Cancel.
2026-09-20 17:36:12 +08:00
Liu Wenjie bb911ec5b0 fix: render links, fences, and quotes in update notes
Release bodies still looked raw after the scroll fix: [text](url),
``` fences, and > quotes were plain text. Teach the tiny renderer those
shapes (https links only) and give the scroll body bottom padding so
content does not sit under the Cancel button.
2026-09-20 17:36:12 +08:00
Liu Wenjie 13e9d98b31 fix: scroll long update notes and strip pasted HTML imgs
Cap the notes dialog body so long release text scrolls inside the
modal, drop literal HTML (especially GitHub-pasted <img>) before the
tiny markdown renderer, and allow allowlisted https markdown images.
2026-09-20 17:36:12 +08:00
Regulus 7040b46a9a Merge pull request #534 from liuwenji007/fix/localize-bilingual-ui
feat: add bilingual localization functions for CJK text handling
2026-09-20 17:28:15 +08:00
Liu Wenjie dc74315660 feat: 发现页 byline 展示目录 npm latest 版本 (#348)
目录侧已提供 version 字段;有非空字符串时在作者旁以 · v1.2.3
静默展示,缺失则省略,不增加卡片高度或 badge。
2026-09-20 16:43:35 +08:00
Liu Wenjie 550d5ff4b5 fix: update test to reflect localization changes in rollback message
- Replaced the Chinese rollback message with its English equivalent in the test case to ensure accurate verification of the displayed message when the server cannot confirm the exact source.
- Updated assertions to check for the presence of the English message and the absence of the original Chinese message, improving test clarity and accuracy.
2026-09-20 16:41:12 +08:00
Liu Wenjie ac24a80611 feat: add bilingual localization functions for CJK text handling
- Introduced functions to count CJK characters, pick the appropriate language from bilingual strings, and localize lists of bilingual reasons.
- Updated various components to utilize these new localization functions, ensuring that error messages and status lines are displayed in the correct language based on user preference.
- Enhanced the `statusLine` and `setInstallError` functions to support bilingual output, improving user experience for Chinese and English speakers.
- Added tests for the new localization functions to ensure correct behavior across different scenarios.
2026-09-20 16:41:12 +08:00
Regulus 964169e033 test: accept git lock shapes in #385 compat probe (#540)
* test: accept git+https lock shape in #385 compat probe

pnpm now resolves github: shortcuts as git+https / type: git instead of
codeload tarballs with gitHosted. Keep both shapes; only poison the
proxy orphan path when the seed lock is still codeload.

* test: enhance compatibility for github shortcuts in lock shapes

Updated the handling of github:owner/repo#sha shortcuts to support both
git+https and git+ssh formats, reflecting current pnpm behavior.
Introduced a new function to create orphaned proxy lockfiles for legacy
compatibility, ensuring proper installation and mutation handling in
tests.
2026-09-13 16:13:17 +08:00
Regulus 619975aa23 feat: enhance sticky header behavior in market section (#518)
Introduced a new state `stuckExpanded` to manage the expansion of categories when the sticky header is active. This change ensures that the expansion state is consistent with user interactions, allowing for a smoother experience when toggling category visibility. Updated related logic to synchronize the `catsOpen` state with the new `catsExpanded` derived from `stuckExpanded`. Adjusted scroll event handling to prevent unnecessary state updates. Improved test coverage for category row expansion behavior under sticky conditions.
2026-09-13 10:34:47 +08:00
Regulus 19a5d125ff fix: discover page polish — back-to-top, tag wrap, page-size menu (#511)
Give the back-to-top control an opaque disc under the outline Button,
wrap long host/category tags inside .footTags so favorite/comments stay
on the right, and close the per-page Menu after a pick.
2026-09-07 21:34:11 +08:00
RegulusandCursor 42a90a49dd fix: do not treat private git installs as npm on update (#525) (#529)
* fix: do not treat private git installs as npm on update (#525)

repoOfTarget only recognized github:/codeload, so a Gitea git+https
spec fell through to name@latest. Detect git-hosted remotes, compare
HEAD via smart HTTP, and re-add the git URL instead of the registry.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: enhance git URL handling for private hosts and Gitea support

- Introduced `looksLikeHttpsGitRemote` to identify valid git URLs without the `.git` suffix, accommodating Gitea and GitLab formats.
- Updated `gitUpdateTarget` to correctly rewrite GitHub URLs to `github:` format during updates, ensuring proper handling of private git installations.
- Enhanced `gitUploadPackUrl` to strip user info from URLs for security during smart-HTTP probes.
- Added tests to verify the handling of Gitea URLs and ensure they are treated as git remotes, not npm packages.

This addresses issues with private git installations falling back to npm name parsing, improving the update flow for self-hosted git services (#525).

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 21:29:56 +08:00
RegulusandCursor f546968282 fix: stop npm update double-fetch from false RESOLVED_VERSION_MISMATCH (#496) (#498)
Pin the update add target to the registry version already resolved for the
downgrade guard so Desktop's install boundary does not fetch latest again.
Keep resolvedNpmVersion only as a fallback when the add still carries a
floating dist-tag, and never let it lower an exact pin the route sent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 22:56:39 +08:00
RegulusandCursor 9c1b423f39 test: 为 pnpm 10/11 compat「accepts it」用例拆分超时预算 (#500)
原先一个 it 在 300s 内连续跑两次真实安装,CI 慢时会偶发超时 (#499)。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 22:42:40 +08:00
Regulusandfkysly 3a6f80ef5a fix: improve local-dev restore UX and prevent wrong same-name catalog restores (#487)
* fix: enhance local development restore functionality in Market section

- Updated the MarketSection component to improve the handling of local development restores, ensuring the restore button is correctly displayed and functional.
- Adjusted CSS styles for better layout and readability of installed rows, including the addition of a new button for restoring local development plugins.
- Modified tests to verify the correct behavior of the restore functionality, ensuring that the user experience is seamless and intuitive.

* fix: enhance restore functionality in Market section with modal confirmation

- Added a new confirmation modal for restoring local development plugins, improving user experience by requiring explicit confirmation before proceeding.
- Updated the restore button text to "Confirm restore" for clarity, aligning with the new modal functionality.
- Adjusted tests to verify the correct behavior of the restore process, ensuring that the modal appears as expected and that the restore action is handled correctly.
- Made minor CSS adjustments to improve the layout of action buttons in the Market section.

* fix: add restore failure handling and improve user feedback in Market section

- Introduced a new title for the restore failure modal to enhance clarity for users when a plugin cannot be restored due to absence in the catalog.
- Updated the restore button's behavior to ensure it is only enabled when appropriate, preventing unnecessary actions.
- Adjusted the modal footer button text for better user understanding.
- Enhanced tests to validate the new modal behavior and ensure proper user feedback during restore operations.

* feat: implement catalog matching for local file installs

- Introduced a new module for catalog matching of locally linked and file-based installs, enhancing the restore functionality for plugins.
- Added functions to validate subpaths and extract catalog match keys from GitHub URLs, ensuring accurate identification of plugins.
- Updated the Market section to utilize the new catalog matching logic, improving the handling of local development restores.
- Enhanced tests to cover new functionality, ensuring correct behavior when restoring plugins with conflicting identities.

* feat: enhance restore functionality with detailed feedback and new catalog matching logic

- Added a new message for users when a local plugin cannot be safely restored due to a mismatch with the catalog.
- Implemented functions to resolve catalog restoration issues, distinguishing between missing catalog entries and repository mismatches.
- Updated the Market section to utilize the new restoration logic, improving user experience during local development restores.
- Enhanced tests to cover new functionality, ensuring accurate behavior when restoring plugins with conflicting identities.

* fix: improve local plugin matching logic in market data

- Enhanced the `matchInstalledName` function to better handle local file and link installations, ensuring accurate identification of installed plugins.
- Updated the logic to prevent false positives when matching plugins with similar names but different repository identities.
- Added new tests to validate the behavior of the updated matching logic, particularly in scenarios with conflicting identities and local development setups.
- Improved existing tests to ensure comprehensive coverage of the new functionality.

---------

Co-authored-by: fkysly <fkysly@gmail.com>
2026-09-03 01:17:14 -07:00
Regulusandfkysly f1779d5642 feat: add plugin favorites tab with bookmark toggle (#414) (#478)
* feat: implement favorites functionality for plugins

This update introduces a favorites feature allowing users to bookmark plugin URLs for later access. The implementation includes:

- New UI elements for adding/removing favorites in the client.
- Backend support for managing favorites, including API endpoints for adding and removing favorites.
- Updates to the market state to persist favorites across sessions.
- Localization updates for new favorite-related strings in both English and Chinese.
- Tests to ensure the functionality works as expected, including edge cases for invalid URLs.

This feature enhances user experience by providing a way to easily access preferred plugins.

* feat: enhance favorites section with plugin and theme grouping

This update introduces a new grouping feature for favorites, allowing users to view their saved items categorized into plugins and themes. Key changes include:

- Updated UI to display separate sections for plugins and themes within the favorites tab.
- Localization updates for new section headers in both English and Chinese.
- Adjustments to pagination logic to handle separate counts for plugins and themes.
- Added tests to verify the correct grouping and display of favorites.

This enhancement improves user experience by providing clearer organization of favorite items.

* feat: implement stale favorites management and limit

This update enhances the favorites functionality by introducing a mechanism to manage stale favorites, allowing users to clear bookmarks that are no longer in the catalog. Key changes include:

- New UI elements for displaying and clearing stale favorites in both English and Chinese.
- Backend support for identifying and removing stale favorites, with a limit set to 500 favorites.
- Localization updates for new strings related to stale favorites.
- Tests to ensure the functionality works as expected, including edge cases for stale entries.

This improvement enhances user experience by keeping the favorites list relevant and manageable.

* feat: implement queuing for favorite writes during ongoing installations

This update introduces a mechanism to queue favorite operations while an installation is in progress, preventing conflicts and ensuring a smoother user experience. Key changes include:

- New function `withMutationQueued` to handle queued favorite writes.
- Updated error handling to provide user feedback when favorites are busy.
- Localization updates for new messages related to queued favorites.
- Tests to verify the queuing behavior during concurrent operations.

This enhancement improves the reliability of the favorites feature by managing concurrent modifications effectively.

---------

Co-authored-by: fkysly <fkysly@gmail.com>
2026-09-03 00:54:35 -07:00
Regulus 2b0f1686e9 fix: 允许为无目录简介的已安装插件添加备注 (#458) (#483)
* fix: ensure notes display correctly for plugins without catalog descriptions (#458)

- Updated the MarketSection component to conditionally render notes only when they are not empty, preventing unnecessary null returns.
- Adjusted CSS styles for note rows to improve layout and spacing, ensuring a consistent appearance.
- Added tests to verify that the "add-note" button is visible even when a plugin lacks a catalog description, enhancing user experience.

* fix: improve layout and spacing for note rows in Market module

- Added CSS adjustments to ensure proper spacing between note rows, enhancing readability and layout consistency.
- Updated styles to prevent visual overlap between note rows and description lines, addressing layout issues reported in #458.
2026-09-03 00:05:33 -07:00
Regulusandfkysly d5f4ab85a8 fix: stabilize Tasks entry spacing in tab row (#464)
Co-authored-by: fkysly <fkysly@gmail.com>
2026-09-01 07:07:46 -07:00
Regulus a480278575 fix: 调试器附着时禁用一键重启 (#447) (#462)
* feat: add debugger detection to prevent self-restart during debugging sessions

This update introduces a mechanism to detect if the host process is under a debugger, specifically using the Node.js inspector. When a debugger is detected, self-restart functionality is disabled to prevent potential issues. The UI has been updated to reflect this state, providing appropriate messages to users. Additionally, tests have been added to ensure the new behavior is correctly enforced.

* feat: enhance debugger detection with new inspect-wait flag support

This update expands the debugger detection mechanism to include the `--inspect-wait` flag, allowing for better handling of debugging sessions. The UI has been updated to reflect the debugger state, and tests have been added to ensure the new flag is correctly recognized. Additionally, the MarketSection component now updates the debugger latch based on the fetched status, improving user feedback during debugging operations.
2026-09-01 06:44:20 -07:00
Regulusandfkysly 807c8cc759 docs(market): note catalog url schema for GitHub mark (#453)
* refactor: update GitHub mark description for catalog card titles

Enhanced the documentation for the GitHub mark component beside catalog card titles to clarify its unconditional rendering based on URL validation. This change ensures users understand the component's behavior without relying on hover actions.

* refactor: update CSS styles and improve client.js.map for better performance

This commit refines the CSS styles in client.js to enhance the layout and responsiveness of the market section. Additionally, the client.js.map file has been updated to reflect the latest changes in the source files, ensuring accurate mapping for debugging and development purposes.

---------

Co-authored-by: fkysly <fkysly@gmail.com>
2026-08-31 06:10:37 -07:00
Regulusandfkysly d71bc4ad02 feat: add GitHub repository mark to plugin titles in the market section (#443)
This update introduces a visual GitHub mark beside the titles of catalog cards, enhancing user experience by clearly indicating the destination of the links without requiring hover actions. The new component replaces the previous icon and maintains the layout integrity of the card design. Additionally, related tests have been updated to reflect this change.

Co-authored-by: fkysly <fkysly@gmail.com>
2026-08-31 02:25:14 -07:00