Skip to content

✨ 编辑器标出脚本猫不支持的 @grant - #1763

Merged
CodFrm merged 1 commit into
mainfrom
claude/scriptcat-unsupported-grant-ca5bad
Sep 22, 2026
Merged

CodFrm merged 1 commit into
mainfrom
claude/scriptcat-unsupported-grant-ca5bad

Conversation

@cyfung1031

@cyfung1031 cyfung1031 commented Sep 21, 2026 •

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

N/A — 无关联 issue,本次改动为按需求文档实现的新诊断能力,非缺陷修复。

背景

安装页已经用 isSupportedGrant() 标出脚本猫不实现的 @grant(如 GM_webRequest),但编辑器里的
ScriptCat metadata 诊断(@grant none 冲突、未知指令、对齐、部分取值修复建议)目前唯独没有覆盖“已识别但
脚本猫不支持”的 @grant,用户在编辑器里看不到这类指令写了也不会生效。

本次改动

  • 复用 src/pkg/utils/script_compat.ts 中的 isSupportedGrant() 作为唯一判定
    来源,未新增独立的不支持列表,也未对 GM_webRequest 做特判。
  • 在 src/pkg/utils/monaco-editor/metadata.ts 新增纯函数
    getUnsupportedGrantMatches():只扫描已识别的 ==UserScript== 区块中的 @grant 行,取出指令取值后交给
    isSupportedGrant() 判定,返回精确的行/列范围。
  • 在 src/pkg/utils/monaco-editor/index.ts 新增 Monaco 诊断标记规则
    scriptcat/unsupported-grant,接入 updateScriptcatMetadataMarkers(),与现有 @grant none 冲突、未定义
    指令诊断使用相同的 Warning 级别与呈现方式。
  • 为 10 个编辑器语言文件(src/pkg/utils/monaco-editor/langs/*.ts)新增本地化文案 unsupportedGrant。
  • 顺带把原本写死在 index.ts 里的取值提取函数 getMetadataValueToken 提升为 metadata.ts 的导出纯函数,
    避免和新逻辑各写一份同样的 token 提取,index.ts 改为导入使用。

已知限制

  • 诊断为纯提示:不写入、不校验 src/pkg/utils/script.ts 的解析逻辑,不影响保存与安装页运行时判定,
    未修改 packages/eslint/compat-grant.js(该文件描述的是 eslint-plugin-userscripts 的跨管理器兼容数据,
    与“脚本猫是否实现”是两个不同的问题)。
  • 未新增 ESLint 侧的去重逻辑:compat-grant.js 收录的是更宽泛用户脚本生态的已知指令名,GM_webRequest
    等本身是被识别的合法指令名,ESLint 不会因此再报 no-undef/无效指令,因此本次未观察到需要去重的重复诊断。

建议审查重点

  • getUnsupportedGrantMatches() 的列范围计算(line.valueColumn + 1 起始)是否与同文件里
    getGrantValueHoverPrompt() 的既有列计算方式保持一致。
  • updateScriptcatMetadataMarkers() 中新 marker 的接入顺序是否会影响既有 @grant none 冲突诊断的行为
    (本次未改动 getGrantNoneConflictMarkers,只是在其后追加)。
  • 10 个语言文件的翻译措辞是否符合各语言术语规范(已保留 ScriptCat、@grant 等标识符不译)。

验证

Base 61cc2481fe1bc32fbc174d4b1f016e7717b25a47,Head 78662a621e7b973ed451d9a5abb26f4011669521(与本地
git rev-parse HEAD 及远端 git ls-remote origin refs/heads/claude/scriptcat-unsupported-grant-ca5bad 一致),
git diff <base>...<head> --stat 确认改动范围仅为上述 13 个文件、126 行新增/3 行删除。

  • pnpm vitest run src/pkg/utils/monaco-editor/metadata.test.ts src/pkg/utils/script_compat.test.ts — 2 files, 54
    tests passed。新增用例覆盖:GM_webRequest/GM_audio/GM_addScript/GM_createObjectURL 被标记;
    GM_setValue/GM.setValue/GM_xmlhttpRequest/GM.xmlHttpRequest/CAT_fileStorage/unsafeWindow/GM_info/
    none 不被标记;精确列范围;改为受支持取值后 marker 消失;删除该行后 marker 消失;区块内编辑后重新计算
    正确。
  • pnpm typecheck — 通过,无报错。
  • pnpm run check:i18n — 通过,10 个 Monaco 编辑器语言文件的 key 集合与 en-US 一致。
  • pnpm lint(prettier + tsc + check:i18n + check:issue-templates + eslint)— 全部通过,eslint 无输出即无问题。
  • pnpm test:ci — 373 files / 4853 tests all passed,无回归。
  • 未执行真人编辑器人工冒烟测试:本次改动是纯 metadata 解析逻辑,docs/verification.md 的跳过条款("pure
    logic, parsers, utilities... anything the committed suite already proves")适用,且与同文件里同样没有 e2e
    覆盖的既有 marker 构造函数(getGrantNoneConflictMarkers、getUndefinedMetadataTagMarkers)保持一致的验证
    深度。

🤖 Generated with Claude Code

复用 isSupportedGrant() 作为唯一判定来源,新增 getUnsupportedGrantMatches()
纯函数识别 metadata 区块中不受支持的 @grant(如 GM_webRequest),并接入
Monaco 诊断标记(scriptcat/unsupported-grant),使其与已有的未定义指令/
grant none 冲突诊断保持一致。诊断为只读提示,不影响保存与运行时安装
逻辑;10 个编辑器语言文件同步补充 unsupportedGrant 文案。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cyfung1031

Copy link
Copy Markdown
Collaborator Author
Screenshot 2026-09-21 at 18 03 16

@CodFrm
CodFrm merged commit 39cd40c into main Sep 22, 2026
10 checks passed
@CodFrm
CodFrm deleted the claude/scriptcat-unsupported-grant-ca5bad branch September 22, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants