@linkdesk/plugin-sdk 0.1.30 → 0.1.32
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/dist/eslint/checks/appearance-ownership.d.ts +91 -0
- package/dist/eslint/checks/appearance-ownership.d.ts.map +1 -0
- package/dist/eslint/checks/appearance-ownership.js +314 -0
- package/dist/eslint/checks/appearance-ownership.js.map +1 -0
- package/dist/eslint/checks/command-ownership.d.ts +33 -2
- package/dist/eslint/checks/command-ownership.d.ts.map +1 -1
- package/dist/eslint/checks/command-ownership.js +25 -4
- package/dist/eslint/checks/command-ownership.js.map +1 -1
- package/dist/eslint/checks/config-ownership.d.ts +79 -0
- package/dist/eslint/checks/config-ownership.d.ts.map +1 -0
- package/dist/eslint/checks/config-ownership.js +239 -0
- package/dist/eslint/checks/config-ownership.js.map +1 -0
- package/dist/eslint/checks/disable.d.ts +7 -0
- package/dist/eslint/checks/disable.d.ts.map +1 -1
- package/dist/eslint/checks/disable.js +7 -0
- package/dist/eslint/checks/disable.js.map +1 -1
- package/dist/eslint/index.d.ts +23 -3
- package/dist/eslint/index.d.ts.map +1 -1
- package/dist/eslint/index.js +21 -3
- package/dist/eslint/index.js.map +1 -1
- package/dist/eslint/lint.d.ts +39 -0
- package/dist/eslint/lint.d.ts.map +1 -1
- package/dist/eslint/lint.js +106 -3
- package/dist/eslint/lint.js.map +1 -1
- package/dist/validate.d.ts +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +27 -1
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
- package/schemas/host-reserved.json +23 -2
- package/schemas/plugin.schema.json +2 -2
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type PluginIdSource } from "./plugin-prefix.js";
|
|
2
|
+
import { type HostReservedNames } from "./command-ownership.js";
|
|
3
|
+
import { type CheckViolation } from "./scan.js";
|
|
4
|
+
/** 判据命中的两种形态(与 `CommandIdCode` 同词表:红 = 占别人/宿主的面;黄 = 不带本仓归属) */
|
|
5
|
+
export type ConfigKeyCode = "host-reserved" | "no-plugin-prefix";
|
|
6
|
+
/** 扫描面:声明面 / 弱默认值面 / 运行时面(身份字面量) */
|
|
7
|
+
export type ConfigKeyFace = "declared" | "defaults" | "runtime";
|
|
8
|
+
/** 一处不合规站点(探针与腿共用同一份数据) */
|
|
9
|
+
export interface ConfigKeySite {
|
|
10
|
+
face: ConfigKeyFace;
|
|
11
|
+
/** 工程相对路径(正斜杠);声明面 / 弱默认值面恒为 `plugin.json` */
|
|
12
|
+
file: string;
|
|
13
|
+
line: number;
|
|
14
|
+
/** 配置键;`runtime` 面 = 注册调用的第一个实参(**身份字面量**,不是键) */
|
|
15
|
+
key: string;
|
|
16
|
+
code: ConfigKeyCode;
|
|
17
|
+
/** 应改成什么:**只换第一段**(`<pluginId>.` + 原键第一段之后的全部)——词干零变化 */
|
|
18
|
+
suggested: string;
|
|
19
|
+
/** code = host-reserved 时:撞上的那条宿主保留键 / 宿主伪身份 */
|
|
20
|
+
reserved?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ConfigOwnershipReport {
|
|
23
|
+
root: string;
|
|
24
|
+
pluginId: string | null;
|
|
25
|
+
pluginIdSource: PluginIdSource | null;
|
|
26
|
+
pluginIdNote: string | null;
|
|
27
|
+
/** fail-closed:非 null ⇒ 本腿报红(拿不到身份就无从判归属) */
|
|
28
|
+
error: string | null;
|
|
29
|
+
/** 🔴 必须改的(进腿报点) */
|
|
30
|
+
red: ConfigKeySite[];
|
|
31
|
+
/** 🟡 建议改的(只打印,不拦) */
|
|
32
|
+
yellow: ConfigKeySite[];
|
|
33
|
+
/** 三面的**全部**名(合规 + 不合规,按出现顺序去重)——探针的读数面(口径:名数,非站点数) */
|
|
34
|
+
declaredKeys: string[];
|
|
35
|
+
defaultsKeys: string[];
|
|
36
|
+
runtimeIdentities: string[];
|
|
37
|
+
/** 账的加载实况(账没读到 ⇒ 判据① 空转,报告里必须能看出来) */
|
|
38
|
+
hostLedger: {
|
|
39
|
+
file: string;
|
|
40
|
+
found: boolean;
|
|
41
|
+
configKeys: number;
|
|
42
|
+
pseudoPluginIds: number;
|
|
43
|
+
};
|
|
44
|
+
/** 腿报点 = fail-closed + 全部红 */
|
|
45
|
+
violations: CheckViolation[];
|
|
46
|
+
/** 黄灯建议(`lint.ts` 打印用;**不进** `LintLeg.violations` ⇒ 不拦 CI) */
|
|
47
|
+
advisories: CheckViolation[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 一个配置键的裁决(纯函数——单测与探针共用,别在别处再写一份判据)。
|
|
51
|
+
*
|
|
52
|
+
* 🔴 建议名的形状 = **只替换第一段**(`app.theme` → `myplugin.theme`,词干零变化),与 `judgeCommandId` 同形。
|
|
53
|
+
* ⚠️ `face` 在这里**真的参与判定**:`defaults` 面不判判据②(弱默认值的键天然是别人的键——见文件头)。
|
|
54
|
+
*/
|
|
55
|
+
export declare function judgeConfigKey(key: string, pluginId: string, reserved: HostReservedNames, face: ConfigKeyFace): {
|
|
56
|
+
code: ConfigKeyCode;
|
|
57
|
+
suggested: string;
|
|
58
|
+
reserved?: string;
|
|
59
|
+
} | null;
|
|
60
|
+
/**
|
|
61
|
+
* 运行时面:注册调用**第一个实参**(身份字面量)的裁决(纯函数)。
|
|
62
|
+
* 🔴 落在 `pseudoPluginIds` ⇒ 冒充宿主身份(红):用 "app" 注册 ⇒ 壳的冲突检测永不响(因为宿主自己就是 "app"),
|
|
63
|
+
* 且注销插件时会**摘掉宿主自己的条目**。改法 = 用自己的 pluginId(或干脆别在插件源码里调这两支 API)。
|
|
64
|
+
*/
|
|
65
|
+
export declare function judgeRegisterIdentity(id: string, pluginId: string, reserved: HostReservedNames): {
|
|
66
|
+
code: ConfigKeyCode;
|
|
67
|
+
suggested: string;
|
|
68
|
+
reserved?: string;
|
|
69
|
+
} | null;
|
|
70
|
+
/** 运行时面:`registerConfiguration("<字面量>", …)` + `registerConfigurationDefaults("<字面量>", …)`
|
|
71
|
+
* (两支 API 的第一个实参都是身份;`(?:Defaults)?` 让一条正则覆盖两支——⛔ 别拆成两条) */
|
|
72
|
+
export declare const RE_REGISTER_CONFIGURATION: RegExp;
|
|
73
|
+
/** 取 manifest 里某个键的行号(JSONC 原文里找 `"<key>":`;找不到 ⇒ 1,不许当成「不存在」) */
|
|
74
|
+
export declare function manifestKeyLine(raw: string, key: string): number;
|
|
75
|
+
/**
|
|
76
|
+
* 跑本仓配置键归属判据。返回结构化报告(探针用)+ 腿报点(`lint.ts` 用)——**同一份实现**。
|
|
77
|
+
*/
|
|
78
|
+
export declare function runConfigOwnershipCheck(root: string, reserved?: HostReservedNames, reservedFile?: string): ConfigOwnershipReport;
|
|
79
|
+
//# sourceMappingURL=config-ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-ownership.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/config-ownership.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAGnB,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEjE,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhE,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;IACpB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oBAAoB;IACpB,GAAG,EAAE,aAAa,EAAE,CAAC;IACrB,sBAAsB;IACtB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,sCAAsC;IACtC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1F,8BAA8B;IAC9B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,8DAA8D;IAC9D,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,aAAa,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQtE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,GAC1B;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAItE;AAED;6DAC6D;AAC7D,eAAO,MAAM,yBAAyB,QAAmE,CAAC;AAiB1G,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhE;AAuBD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,iBAAsC,EAChD,YAAY,GAAE,MAA2B,GACxC,qBAAqB,CAuIvB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check-config-ownership 腿·**配置键归属判据**(E6#111d · 轮次 1.34)。
|
|
3
|
+
*
|
|
4
|
+
* ── 为什么(本件立项的那条轴)──
|
|
5
|
+
* 配置键是**用户数据面**:`settings.json` 里以键存值,壳的设置页按 pluginId 分组渲染。
|
|
6
|
+
* 插件占宿主的 `app.*` 键 = 顶掉宿主设置面(宿主那条键的生效值被插件的值串掉,而**两边都不报错**);
|
|
7
|
+
* 两个插件用同一个键 = 后注册者的值静默胜出(用户改一个设置,另一个插件的行为跟着变)。
|
|
8
|
+
* 1.31 实测:官方 18 仓有 **19 个键**不带本仓归属(`explorer.confirmDelete` 之类,属主其实是别人的壳面)。
|
|
9
|
+
*
|
|
10
|
+
* ── 两条判据(与壳仓 `scripts/gen-host-reserved.mjs` 的账同源)──
|
|
11
|
+
* ① **宿主保留面**(🔴 红):键落在账(包内 `schemas/host-reserved.json`)的 `configKeys` 里
|
|
12
|
+
* ⇒ 占用宿主设置面。**含退役键**——宿主不再写入的键也不腾位(老 `settings.json` 里可能仍有值,
|
|
13
|
+
* 迁移代码还会读它)。判据出处 = 1.33 §11.1 裁决(丙)·(甲)。
|
|
14
|
+
* ② **本仓前缀**(🟡 黄):**新键**第一段应是本仓 `pluginId`(`<pluginId>.<你的名字>`)。
|
|
15
|
+
* 与命令 id 同形(`judgeCommandId` 的「只换第一段、词干零变化」)。
|
|
16
|
+
* ⚠️ 只对 **`declared` 面**判——`defaults` 面的键**天然是别人的键**(`configurationDefaults` 的语义
|
|
17
|
+
* 就是"为已存在的键建议一个弱默认值",要求它带本仓前缀等于取消这个能力)。运行时面同理不判键。
|
|
18
|
+
* ③ **宿主伪身份**(🔴 红):源码里 `registerConfiguration("<字面量>", …)` / `registerConfigurationDefaults(...)`
|
|
19
|
+
* 的第一个实参落在账的 `pseudoPluginIds`(app / appearance / update)⇒ 冒充宿主身份注册。
|
|
20
|
+
*
|
|
21
|
+
* ── 扫描面(三面)──
|
|
22
|
+
* · **声明面** `declared` = `plugin.json` 的 `contributes.configuration.properties` 的**键名**(权威面);
|
|
23
|
+
* · **弱默认值面** `defaults` = `plugin.json` 的 `contributes.configurationDefaults` 的**键名**;
|
|
24
|
+
* · **运行时面** `runtime` = 源码里注册调用的**第一个实参**(身份字面量)。
|
|
25
|
+
* ⚠️ 实测宿主侧口径:插件**零使用**这两支 API(插件声明走 `plugin.json`)——本面是给"哪天真有人这么写"留的,
|
|
26
|
+
* 面要量全但**今日恒为空**(空面不是判据失效,报告里能看出来)。
|
|
27
|
+
*
|
|
28
|
+
* ── 🔴 分工:本腿报红的那一条,运行时也报 ──
|
|
29
|
+
* 判据① 在**运行时**(壳 `ConfigurationRegistry` 的保护区)同样生效——本腿是**提前在作者仓里**把同一件事报出来
|
|
30
|
+
* (作者不必等装上壳才发现自己的键被拒)。判据② 运行时**不管**(存量 19 个反例还在,运行时拒前缀不合规的键
|
|
31
|
+
* 会把存量插件当场弄坏)⇒ 判据② 只在这里、且只是黄。
|
|
32
|
+
*
|
|
33
|
+
* 知情绕行 = 标准 disable 注释(`CHECK_IDS.configOwnership`)。⚠️ **fail-closed 不参与豁免**:
|
|
34
|
+
* 拿不到 `pluginId` 说的不是「你的键怎么写」,而是「你的身份读不到」——那是工程根的问题。
|
|
35
|
+
*/
|
|
36
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
37
|
+
import { join, resolve } from "node:path";
|
|
38
|
+
import { readPluginManifest } from "../../validate.js";
|
|
39
|
+
import { resolvePluginIdForCss } from "./plugin-prefix.js";
|
|
40
|
+
import { HOST_RESERVED_FILE, loadHostReserved } from "./command-ownership.js";
|
|
41
|
+
import { collectFiles, isTestOrMockRel, readSource, relPath, } from "./scan.js";
|
|
42
|
+
import { buildDisableIndex, isDisabled, CHECK_IDS } from "./disable.js";
|
|
43
|
+
/**
|
|
44
|
+
* 一个配置键的裁决(纯函数——单测与探针共用,别在别处再写一份判据)。
|
|
45
|
+
*
|
|
46
|
+
* 🔴 建议名的形状 = **只替换第一段**(`app.theme` → `myplugin.theme`,词干零变化),与 `judgeCommandId` 同形。
|
|
47
|
+
* ⚠️ `face` 在这里**真的参与判定**:`defaults` 面不判判据②(弱默认值的键天然是别人的键——见文件头)。
|
|
48
|
+
*/
|
|
49
|
+
export function judgeConfigKey(key, pluginId, reserved, face) {
|
|
50
|
+
const dot = key.indexOf(".");
|
|
51
|
+
const suggested = `${pluginId}.${dot > 0 ? key.slice(dot + 1) : key}`;
|
|
52
|
+
// ① 宿主保留面(比**全等**——保留面是一张逐个列出的键名清单,不是前缀面)
|
|
53
|
+
if (reserved.configKeys.includes(key))
|
|
54
|
+
return { code: "host-reserved", suggested, reserved: key };
|
|
55
|
+
// ② 本仓前缀——只对声明面判(弱默认值面的键不是"插件新键",运行时面压根不是键)
|
|
56
|
+
if (face === "declared" && !key.startsWith(`${pluginId}.`))
|
|
57
|
+
return { code: "no-plugin-prefix", suggested };
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 运行时面:注册调用**第一个实参**(身份字面量)的裁决(纯函数)。
|
|
62
|
+
* 🔴 落在 `pseudoPluginIds` ⇒ 冒充宿主身份(红):用 "app" 注册 ⇒ 壳的冲突检测永不响(因为宿主自己就是 "app"),
|
|
63
|
+
* 且注销插件时会**摘掉宿主自己的条目**。改法 = 用自己的 pluginId(或干脆别在插件源码里调这两支 API)。
|
|
64
|
+
*/
|
|
65
|
+
export function judgeRegisterIdentity(id, pluginId, reserved) {
|
|
66
|
+
if (reserved.pseudoPluginIds.includes(id))
|
|
67
|
+
return { code: "host-reserved", suggested: pluginId, reserved: id };
|
|
68
|
+
if (id !== pluginId)
|
|
69
|
+
return { code: "no-plugin-prefix", suggested: pluginId };
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/** 运行时面:`registerConfiguration("<字面量>", …)` + `registerConfigurationDefaults("<字面量>", …)`
|
|
73
|
+
* (两支 API 的第一个实参都是身份;`(?:Defaults)?` 让一条正则覆盖两支——⛔ 别拆成两条) */
|
|
74
|
+
export const RE_REGISTER_CONFIGURATION = /registerConfiguration(?:Defaults)?\s*\(\s*["'`]([^"'`]+)["'`]/g;
|
|
75
|
+
/** 源码字面量扫描:`collect` 返回 id——行号按 1-based 计(与 `command-ownership.ts` 同实现,口径一致) */
|
|
76
|
+
function scanLiterals(src, re, collect) {
|
|
77
|
+
const out = [];
|
|
78
|
+
for (const m of src.matchAll(re)) {
|
|
79
|
+
const id = collect(m);
|
|
80
|
+
if (!id)
|
|
81
|
+
continue;
|
|
82
|
+
out.push({ id, line: src.slice(0, m.index ?? 0).split("\n").length });
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** 取 manifest 里某个键的行号(JSONC 原文里找 `"<key>":`;找不到 ⇒ 1,不许当成「不存在」) */
|
|
87
|
+
export function manifestKeyLine(raw, key) {
|
|
88
|
+
const esc = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
89
|
+
const m = raw.match(new RegExp(`"${esc}"\\s*:`));
|
|
90
|
+
if (!m || m.index === undefined)
|
|
91
|
+
return 1;
|
|
92
|
+
return raw.slice(0, m.index).split("\n").length;
|
|
93
|
+
}
|
|
94
|
+
/** `contributes.configuration` 允许对象或对象数组 ⇒ 统一摊平成 properties 记录(读不出 ⇒ null) */
|
|
95
|
+
function configPropertiesOf(node) {
|
|
96
|
+
const one = (v) => {
|
|
97
|
+
const props = v?.properties;
|
|
98
|
+
return props && typeof props === "object" && !Array.isArray(props) ? props : null;
|
|
99
|
+
};
|
|
100
|
+
if (Array.isArray(node)) {
|
|
101
|
+
const out = {};
|
|
102
|
+
let any = false;
|
|
103
|
+
for (const item of node) {
|
|
104
|
+
const props = one(item);
|
|
105
|
+
if (props) {
|
|
106
|
+
Object.assign(out, props);
|
|
107
|
+
any = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return any ? out : null;
|
|
111
|
+
}
|
|
112
|
+
return one(node);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 跑本仓配置键归属判据。返回结构化报告(探针用)+ 腿报点(`lint.ts` 用)——**同一份实现**。
|
|
116
|
+
*/
|
|
117
|
+
export function runConfigOwnershipCheck(root, reserved = loadHostReserved(), reservedFile = HOST_RESERVED_FILE) {
|
|
118
|
+
const absRoot = resolve(root);
|
|
119
|
+
const manifestPath = join(absRoot, "plugin.json");
|
|
120
|
+
const resolution = resolvePluginIdForCss(absRoot);
|
|
121
|
+
const violations = [];
|
|
122
|
+
const report = {
|
|
123
|
+
root: absRoot,
|
|
124
|
+
pluginId: resolution.pluginId,
|
|
125
|
+
pluginIdSource: resolution.source,
|
|
126
|
+
pluginIdNote: resolution.note,
|
|
127
|
+
error: resolution.error,
|
|
128
|
+
red: [],
|
|
129
|
+
yellow: [],
|
|
130
|
+
declaredKeys: [],
|
|
131
|
+
defaultsKeys: [],
|
|
132
|
+
runtimeIdentities: [],
|
|
133
|
+
hostLedger: {
|
|
134
|
+
file: reservedFile,
|
|
135
|
+
found: existsSync(reservedFile),
|
|
136
|
+
configKeys: reserved.configKeys.length,
|
|
137
|
+
pseudoPluginIds: reserved.pseudoPluginIds.length,
|
|
138
|
+
},
|
|
139
|
+
violations,
|
|
140
|
+
advisories: [],
|
|
141
|
+
};
|
|
142
|
+
// ── fail-closed(不可豁免:拿不到身份 = 判据①② 全部无从谈起)──
|
|
143
|
+
if (resolution.error || !resolution.pluginId) {
|
|
144
|
+
violations.push({
|
|
145
|
+
file: "plugin.json",
|
|
146
|
+
line: 1,
|
|
147
|
+
message: `拿不到本仓 pluginId:${resolution.error}。归属判据以「本仓身份」为唯一前缀来源——读不到它就无从判` +
|
|
148
|
+
`「这个键是不是你的」。在插件工程根修好 plugin.json(或显式声明 pluginId),` +
|
|
149
|
+
`别用 disable 注释绕:这是身份问题,不受豁免注释管辖。`,
|
|
150
|
+
});
|
|
151
|
+
return report;
|
|
152
|
+
}
|
|
153
|
+
const pluginId = resolution.pluginId;
|
|
154
|
+
const prefix = `${pluginId}.`;
|
|
155
|
+
const manifestRaw = existsSync(manifestPath) ? readFileSync(manifestPath, "utf8") : "";
|
|
156
|
+
const manifestDisabled = buildDisableIndex(manifestRaw, [CHECK_IDS.configOwnership]);
|
|
157
|
+
const push = (site, message, disabled) => {
|
|
158
|
+
if (disabled && isDisabled(disabled.idx, disabled.line, CHECK_IDS.configOwnership))
|
|
159
|
+
return;
|
|
160
|
+
if (site.code === "host-reserved") {
|
|
161
|
+
report.red.push(site);
|
|
162
|
+
violations.push({ file: site.file, line: site.line, message });
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
report.yellow.push(site);
|
|
166
|
+
report.advisories.push({ file: site.file, line: site.line, message });
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
/** 判据①②合一的报点(声明面 / 弱默认值面) */
|
|
170
|
+
const judgeAndPush = (face, key, line) => {
|
|
171
|
+
const verdict = judgeConfigKey(key, pluginId, reserved, face);
|
|
172
|
+
if (!verdict)
|
|
173
|
+
return;
|
|
174
|
+
const where = face === "declared"
|
|
175
|
+
? "声明面(plugin.json contributes.configuration.properties)"
|
|
176
|
+
: "弱默认值面(plugin.json contributes.configurationDefaults)";
|
|
177
|
+
const message = verdict.code === "host-reserved"
|
|
178
|
+
? `${where}:配置键 "${key}" 属于**宿主的保留名字空间**(保留键清单见包内 schemas/host-reserved.json 的 configKeys)。` +
|
|
179
|
+
`占用它 = 顶替宿主设置面——宿主那条键的生效值会被你的值串掉,**两边都不报错**(用户在设置页看到的值与宿主实际行为不一致)。` +
|
|
180
|
+
`改法:改成 "${verdict.suggested}"(只换第一段、词干零变化)。`
|
|
181
|
+
: `${where}:配置键 "${key}" 不带本仓归属(本插件 pluginId = "${pluginId}",新键应以 "${prefix}" 开头)` +
|
|
182
|
+
`——键是**用户数据面**:同名键被两个插件声明时只有一个能生效(壳 1.34 起"首撞保留",后到者被拒),` +
|
|
183
|
+
`改名后归属才唯一。改成 "${verdict.suggested}"(只换第一段、词干零变化)。`;
|
|
184
|
+
push({ face, file: "plugin.json", line, key, code: verdict.code, suggested: verdict.suggested, ...(verdict.reserved !== undefined ? { reserved: verdict.reserved } : {}) }, message, { idx: manifestDisabled, line });
|
|
185
|
+
};
|
|
186
|
+
// ── ①② 声明面 + 弱默认值面:plugin.json(读不出 ⇒ 两面跳过——plugin-prefix 腿已对同一件事 fail-closed 报红,不重复报)
|
|
187
|
+
if (manifestRaw) {
|
|
188
|
+
let manifest = null;
|
|
189
|
+
try {
|
|
190
|
+
manifest = readPluginManifest(manifestPath);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
manifest = null;
|
|
194
|
+
}
|
|
195
|
+
const contributes = manifest?.contributes;
|
|
196
|
+
const props = configPropertiesOf(contributes?.configuration);
|
|
197
|
+
if (props) {
|
|
198
|
+
for (const key of Object.keys(props)) {
|
|
199
|
+
if (!report.declaredKeys.includes(key))
|
|
200
|
+
report.declaredKeys.push(key);
|
|
201
|
+
judgeAndPush("declared", key, manifestKeyLine(manifestRaw, key));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const defaults = contributes?.configurationDefaults;
|
|
205
|
+
if (defaults && typeof defaults === "object" && !Array.isArray(defaults)) {
|
|
206
|
+
for (const key of Object.keys(defaults)) {
|
|
207
|
+
if (!report.defaultsKeys.includes(key))
|
|
208
|
+
report.defaultsKeys.push(key);
|
|
209
|
+
judgeAndPush("defaults", key, manifestKeyLine(manifestRaw, key));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ── ③ 运行时面:源码里注册调用的第一个实参(只扫真源码——测试/mock 跳过,与另几条腿同口径) ──
|
|
214
|
+
for (const abs of collectFiles(absRoot, [".ts", ".tsx", ".js", ".jsx"])) {
|
|
215
|
+
const rel = relPath(absRoot, abs);
|
|
216
|
+
if (isTestOrMockRel(rel))
|
|
217
|
+
continue;
|
|
218
|
+
const src = readSource(abs);
|
|
219
|
+
const idx = buildDisableIndex(src, [CHECK_IDS.configOwnership]);
|
|
220
|
+
for (const hit of scanLiterals(src, RE_REGISTER_CONFIGURATION, (m) => m[1])) {
|
|
221
|
+
if (!report.runtimeIdentities.includes(hit.id))
|
|
222
|
+
report.runtimeIdentities.push(hit.id);
|
|
223
|
+
const verdict = judgeRegisterIdentity(hit.id, pluginId, reserved);
|
|
224
|
+
if (!verdict)
|
|
225
|
+
continue;
|
|
226
|
+
const message = verdict.code === "host-reserved"
|
|
227
|
+
? `运行时面(源码里 registerConfiguration* 的第一个实参):身份 "${hit.id}" 是**宿主自己的身份**` +
|
|
228
|
+
`(app / appearance / update 由宿主用来注册配置/外观/更新)——插件用它注册 ⇒ 壳的冲突检测永不响` +
|
|
229
|
+
`(因为宿主自己就是这个身份),且**注销插件时会摘掉宿主自己的条目**。改用本仓 pluginId "${pluginId}"。` +
|
|
230
|
+
`⚠️ 插件声明配置的正常路径是 plugin.json 的 contributes.configuration——别在自己的源码里调壳的注册 API。`
|
|
231
|
+
: `运行时面(源码里 registerConfiguration* 的第一个实参):身份 "${hit.id}" 与本仓 pluginId "${pluginId}" 不同` +
|
|
232
|
+
`——身份是归属的唯一来源,用别人的 id 注册会让这些键挂到别人名下(注销时按身份摘条目,摘错人)。` +
|
|
233
|
+
`改用 "${pluginId}"(若这是给别人的键建议弱默认值,键名照旧、身份仍须是你自己)。`;
|
|
234
|
+
push({ face: "runtime", file: rel, line: hit.line, key: hit.id, code: verdict.code, suggested: verdict.suggested, ...(verdict.reserved !== undefined ? { reserved: verdict.reserved } : {}) }, message, { idx, line: hit.line });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return report;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=config-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-ownership.js","sourceRoot":"","sources":["../../../src/eslint/checks/config-ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,13 @@ export declare const CHECK_IDS: {
|
|
|
20
20
|
readonly cssNamespace: "linkdesk/no-reserved-class-name";
|
|
21
21
|
/** E6#111b(1.32):命令 id / 协议 id 必须带本仓 `<pluginId>.` 前缀,且不得占用宿主保留面 */
|
|
22
22
|
readonly commandOwnership: "linkdesk/no-unowned-command-id";
|
|
23
|
+
/** E6#111d(1.34):配置键必须带本仓 `<pluginId>.` 前缀(🟡 黄),且不得占用宿主保留键(🔴 红) */
|
|
24
|
+
readonly configOwnership: "linkdesk/no-unowned-config-key";
|
|
25
|
+
/** E6#111f(1.36):外观族 id(配方 / 配色 / 图标主题 / 共享图标)必须带本仓 `<pluginId>.` 前缀
|
|
26
|
+
* (🟡 黄——★回退条件 + 轴上排序纪律,见 `appearance-ownership.ts` 文件头),
|
|
27
|
+
* 且不得占用宿主兜底外观 id(🔴 红:配方 / 配色 / 图标主题三栏**按空间**比,有证照者除外)。
|
|
28
|
+
* ⚠️ 图标主题 id **不判前缀**(1.36 §二.2 ⑦:本轮不改名——改名 = 设置页可见文字变化)⇒ 这个 id 只覆盖判据②。 */
|
|
29
|
+
readonly appearanceOwnership: "linkdesk/no-unowned-appearance-id";
|
|
23
30
|
};
|
|
24
31
|
export interface DisableIndex {
|
|
25
32
|
/** 1-based 行 → 该行豁免的 id 集合(行级 next-line/line + 文件级 disable 区间) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/disable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS;;;;;IAKpB,oEAAoE;;
|
|
1
|
+
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/disable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS;;;;;IAKpB,oEAAoE;;IAEpE,qEAAqE;;IAErE;;;gFAG4E;;CAEpE,CAAC;AAoFX,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAClC;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAmDnF;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAGjF"}
|
|
@@ -20,6 +20,13 @@ export const CHECK_IDS = {
|
|
|
20
20
|
cssNamespace: "linkdesk/no-reserved-class-name",
|
|
21
21
|
/** E6#111b(1.32):命令 id / 协议 id 必须带本仓 `<pluginId>.` 前缀,且不得占用宿主保留面 */
|
|
22
22
|
commandOwnership: "linkdesk/no-unowned-command-id",
|
|
23
|
+
/** E6#111d(1.34):配置键必须带本仓 `<pluginId>.` 前缀(🟡 黄),且不得占用宿主保留键(🔴 红) */
|
|
24
|
+
configOwnership: "linkdesk/no-unowned-config-key",
|
|
25
|
+
/** E6#111f(1.36):外观族 id(配方 / 配色 / 图标主题 / 共享图标)必须带本仓 `<pluginId>.` 前缀
|
|
26
|
+
* (🟡 黄——★回退条件 + 轴上排序纪律,见 `appearance-ownership.ts` 文件头),
|
|
27
|
+
* 且不得占用宿主兜底外观 id(🔴 红:配方 / 配色 / 图标主题三栏**按空间**比,有证照者除外)。
|
|
28
|
+
* ⚠️ 图标主题 id **不判前缀**(1.36 §二.2 ⑦:本轮不改名——改名 = 设置页可见文字变化)⇒ 这个 id 只覆盖判据②。 */
|
|
29
|
+
appearanceOwnership: "linkdesk/no-unowned-appearance-id",
|
|
23
30
|
};
|
|
24
31
|
/** 单遍注释 tokenizer:产出全部 // 行注释与 /* 块注释(块注释可跨行)。 */
|
|
25
32
|
function tokenizeComments(source) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/eslint/checks/disable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,EAAE,2BAA2B;IACxC,SAAS,EAAE,iCAAiC;IAC5C,WAAW,EAAE,iCAAiC;IAC9C,YAAY,EAAE,iCAAiC;IAC/C,oEAAoE;IACpE,gBAAgB,EAAE,gCAAgC;
|
|
1
|
+
{"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/eslint/checks/disable.ts"],"names":[],"mappings":"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"}
|
package/dist/eslint/index.d.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* "lint": "linkdesk-plugin-sdk lint" // 两条腿全跑 + 打印报告(bin)
|
|
6
6
|
* // 或编程:linkdeskPluginLintConfig() 展开进作者自配 eslint.config.js
|
|
7
7
|
*
|
|
8
|
-
* 全量门禁 = eslint 规则腿 +
|
|
9
|
-
* 见 src/eslint/rules.ts
|
|
10
|
-
* bin lint
|
|
8
|
+
* 全量门禁 = eslint 规则腿 + **七条** check 扫描腿(lint.ts 编排)。规则 id 与 disable 注释格式
|
|
9
|
+
* 见 src/eslint/rules.ts 头注(双源注记)。除下面这组**审计入口**外不暴露内部 check 函数——
|
|
10
|
+
* bin lint 已聚合。(审计入口逐个带「不是第二条判据路径」的注记——腿用的就是同一个函数。)
|
|
11
11
|
*
|
|
12
12
|
* 🔴 E6#109h-b①:`runPluginPrefixCheck` 是**唯一一个对内 check 的具名导出**,专供壳仓只读审计工具
|
|
13
13
|
* `scripts/plugin-css-prefix-audit.mjs`(改名轮 ③–⑦ 生成「旧名 → 新名」映射、⑧ 全量复核)。
|
|
@@ -37,4 +37,24 @@ export type { SelectorFormReport, SelectorFormSite, SelectorFormCode } from "./c
|
|
|
37
37
|
*/
|
|
38
38
|
export { runCommandOwnershipCheck, judgeCommandId, loadHostReserved } from "./checks/command-ownership.js";
|
|
39
39
|
export type { CommandOwnershipReport, CommandIdSite, CommandIdCode, CommandIdFace, HostReservedNames, } from "./checks/command-ownership.js";
|
|
40
|
+
/**
|
|
41
|
+
* 🔴 E6#111d(1.34):同一纪律再加一个 —— `runConfigOwnershipCheck`(配置键归属判据)。壳仓只读探针
|
|
42
|
+
* 用它与 `runCommandOwnershipCheck` 拼出「设置面」读数;**同样不是第二条判据路径**
|
|
43
|
+
* (`lint.ts` 的第六条腿用的就是它——同一份实现,改一处两边一起变)。
|
|
44
|
+
* 分级:判据① 占宿主保留键 = 红(进腿报点);判据② 新键不带本仓前缀 = 黄(`configAdvisories`,只打印)。
|
|
45
|
+
* `loadHostReserved` 沿用上面命令腿那一个(**同一个 loader**——⛔ 不许在配置腿上再写一份)。
|
|
46
|
+
*/
|
|
47
|
+
export { runConfigOwnershipCheck, judgeConfigKey, judgeRegisterIdentity, manifestKeyLine } from "./checks/config-ownership.js";
|
|
48
|
+
export type { ConfigOwnershipReport, ConfigKeySite, ConfigKeyCode, ConfigKeyFace } from "./checks/config-ownership.js";
|
|
49
|
+
/**
|
|
50
|
+
* 🔴 E6#111f(1.36):同一纪律再加一个 —— `runAppearanceOwnershipCheck`(外观族 id 归属判据)。
|
|
51
|
+
* 壳仓只读探针 `scripts/audit-nonnaming.mjs` 用它出外观族读数;**同样不是第二条判据路径**
|
|
52
|
+
* (`lint.ts` 的第七条腿用的就是它——同一份实现,改一处两边一起变)。
|
|
53
|
+
* 分级与配置腿同形:判据② 占宿主兜底外观 id = 红(进腿报点);判据① 新 id 不带本仓前缀 = 黄
|
|
54
|
+
* (`appearanceAdvisories`,只打印)——★回退条件 + 排序纪律,见该文件头。
|
|
55
|
+
* ⚠️ 五空间的**空间参数**是判据的一部分(`recipe` / `colorway` / `iconTheme` / `sharedIcon` / `sentinel`):
|
|
56
|
+
* 跨空间比 = 假红(配方 `light` vs 配色 `light`),判据一律**按空间**取账栏,见 `reservedIdsForSpace`。
|
|
57
|
+
*/
|
|
58
|
+
export { runAppearanceOwnershipCheck, judgeAppearanceId, reservedIdsForSpace, grantHoldersFor, readThemeJson, themeIdLine, } from "./checks/appearance-ownership.js";
|
|
59
|
+
export type { AppearanceOwnershipReport, AppearanceIdSite, AppearanceIdCode, AppearanceIdSpace, AppearanceIdFace, } from "./checks/appearance-ownership.js";
|
|
40
60
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvG,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAExG;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC3G,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvG,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAExG;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC3G,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/H,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAEvH;;;;;;;;GAQG;AACH,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC"}
|
package/dist/eslint/index.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* "lint": "linkdesk-plugin-sdk lint" // 两条腿全跑 + 打印报告(bin)
|
|
6
6
|
* // 或编程:linkdeskPluginLintConfig() 展开进作者自配 eslint.config.js
|
|
7
7
|
*
|
|
8
|
-
* 全量门禁 = eslint 规则腿 +
|
|
9
|
-
* 见 src/eslint/rules.ts
|
|
10
|
-
* bin lint
|
|
8
|
+
* 全量门禁 = eslint 规则腿 + **七条** check 扫描腿(lint.ts 编排)。规则 id 与 disable 注释格式
|
|
9
|
+
* 见 src/eslint/rules.ts 头注(双源注记)。除下面这组**审计入口**外不暴露内部 check 函数——
|
|
10
|
+
* bin lint 已聚合。(审计入口逐个带「不是第二条判据路径」的注记——腿用的就是同一个函数。)
|
|
11
11
|
*
|
|
12
12
|
* 🔴 E6#109h-b①:`runPluginPrefixCheck` 是**唯一一个对内 check 的具名导出**,专供壳仓只读审计工具
|
|
13
13
|
* `scripts/plugin-css-prefix-audit.mjs`(改名轮 ③–⑦ 生成「旧名 → 新名」映射、⑧ 全量复核)。
|
|
@@ -31,4 +31,22 @@ export { runSelectorFormCheck, judgeSelectorForm, SELECTOR_FORM_WHY } from "./ch
|
|
|
31
31
|
* ⚠️ 本格(1.32)该判据**只判黄**(`bin lint` 退出码只看 eslint severity 2),1.49 收紧为红。
|
|
32
32
|
*/
|
|
33
33
|
export { runCommandOwnershipCheck, judgeCommandId, loadHostReserved } from "./checks/command-ownership.js";
|
|
34
|
+
/**
|
|
35
|
+
* 🔴 E6#111d(1.34):同一纪律再加一个 —— `runConfigOwnershipCheck`(配置键归属判据)。壳仓只读探针
|
|
36
|
+
* 用它与 `runCommandOwnershipCheck` 拼出「设置面」读数;**同样不是第二条判据路径**
|
|
37
|
+
* (`lint.ts` 的第六条腿用的就是它——同一份实现,改一处两边一起变)。
|
|
38
|
+
* 分级:判据① 占宿主保留键 = 红(进腿报点);判据② 新键不带本仓前缀 = 黄(`configAdvisories`,只打印)。
|
|
39
|
+
* `loadHostReserved` 沿用上面命令腿那一个(**同一个 loader**——⛔ 不许在配置腿上再写一份)。
|
|
40
|
+
*/
|
|
41
|
+
export { runConfigOwnershipCheck, judgeConfigKey, judgeRegisterIdentity, manifestKeyLine } from "./checks/config-ownership.js";
|
|
42
|
+
/**
|
|
43
|
+
* 🔴 E6#111f(1.36):同一纪律再加一个 —— `runAppearanceOwnershipCheck`(外观族 id 归属判据)。
|
|
44
|
+
* 壳仓只读探针 `scripts/audit-nonnaming.mjs` 用它出外观族读数;**同样不是第二条判据路径**
|
|
45
|
+
* (`lint.ts` 的第七条腿用的就是它——同一份实现,改一处两边一起变)。
|
|
46
|
+
* 分级与配置腿同形:判据② 占宿主兜底外观 id = 红(进腿报点);判据① 新 id 不带本仓前缀 = 黄
|
|
47
|
+
* (`appearanceAdvisories`,只打印)——★回退条件 + 排序纪律,见该文件头。
|
|
48
|
+
* ⚠️ 五空间的**空间参数**是判据的一部分(`recipe` / `colorway` / `iconTheme` / `sharedIcon` / `sentinel`):
|
|
49
|
+
* 跨空间比 = 假红(配方 `light` vs 配色 `light`),判据一律**按空间**取账栏,见 `reservedIdsForSpace`。
|
|
50
|
+
*/
|
|
51
|
+
export { runAppearanceOwnershipCheck, judgeAppearanceId, reservedIdsForSpace, grantHoldersFor, readThemeJson, themeIdLine, } from "./checks/appearance-ownership.js";
|
|
34
52
|
//# sourceMappingURL=index.js.map
|
package/dist/eslint/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGvG;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGvG;;;;;GAKG;AACH,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAS3G;;;;;;GAMG;AACH,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/H;;;;;;;;GAQG;AACH,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,kCAAkC,CAAC"}
|
package/dist/eslint/lint.d.ts
CHANGED
|
@@ -42,6 +42,23 @@ export interface PluginLintReport {
|
|
|
42
42
|
protocol: number;
|
|
43
43
|
bad: number;
|
|
44
44
|
};
|
|
45
|
+
/** 🟡 E6#111d(1.34)配置键归属判据的**黄灯建议**(判据②:新键不带本仓前缀)——**只打印、不拦** */
|
|
46
|
+
configAdvisories: CheckViolation[];
|
|
47
|
+
/** 配置键归属判据的计数(`runtime` = 源码里注册调用的身份名数;`bad` = 红站点数;`advisory` = 黄建议数) */
|
|
48
|
+
configOwnershipCounts: {
|
|
49
|
+
declared: number;
|
|
50
|
+
defaults: number;
|
|
51
|
+
runtime: number;
|
|
52
|
+
bad: number;
|
|
53
|
+
advisory: number;
|
|
54
|
+
};
|
|
55
|
+
/** 宿主保留键账的加载实况(configKeys / pseudoPluginIds 两栏——账没读到 ⇒ 判据① 空转,必须能看出来) */
|
|
56
|
+
hostConfigLedger: {
|
|
57
|
+
file: string;
|
|
58
|
+
found: boolean;
|
|
59
|
+
configKeys: number;
|
|
60
|
+
pseudoPluginIds: number;
|
|
61
|
+
} | null;
|
|
45
62
|
/** 宿主保留面账的加载实况(账没读到 ⇒ 判据②空转——报告里必须能看出来,不许静默) */
|
|
46
63
|
hostReservedLedger: {
|
|
47
64
|
file: string;
|
|
@@ -49,6 +66,28 @@ export interface PluginLintReport {
|
|
|
49
66
|
commandPrefixes: number;
|
|
50
67
|
protocolIds: number;
|
|
51
68
|
} | null;
|
|
69
|
+
/** 🟡 E6#111f(1.36)外观族 id 归属判据的**黄灯建议**(判据①:新外观 id 不带本仓前缀 + 同插件跨配方重复配色)——**只打印、不拦** */
|
|
70
|
+
appearanceAdvisories: CheckViolation[];
|
|
71
|
+
/** 外观族 id 归属判据的计数(四面名数 + 红站点数 + 黄建议数) */
|
|
72
|
+
appearanceOwnershipCounts: {
|
|
73
|
+
declaredRecipe: number;
|
|
74
|
+
declaredIconTheme: number;
|
|
75
|
+
declaredSharedIcon: number;
|
|
76
|
+
themeFileRecipe: number;
|
|
77
|
+
themeFileColorway: number;
|
|
78
|
+
bad: number;
|
|
79
|
+
advisory: number;
|
|
80
|
+
};
|
|
81
|
+
/** 宿主兜底外观 id 四栏 + 证照账的加载实况(账没读到 ⇒ 判据② 空转,必须能看出来) */
|
|
82
|
+
hostAppearanceLedger: {
|
|
83
|
+
file: string;
|
|
84
|
+
found: boolean;
|
|
85
|
+
appearanceRecipeIds: number;
|
|
86
|
+
appearanceColorwayIds: number;
|
|
87
|
+
appearanceIconThemeIds: number;
|
|
88
|
+
appearanceSentinels: number;
|
|
89
|
+
appearanceIdGrants: number;
|
|
90
|
+
} | null;
|
|
52
91
|
}
|
|
53
92
|
export declare function runPluginLint(root: string, options?: PluginLintOptions): Promise<PluginLintReport>;
|
|
54
93
|
/** 打印报告(人机双通道的即时反馈环);返回进程退出码(真 error 才 1,WARN 永不 fail)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/eslint/lint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/eslint/lint.ts"],"names":[],"mappings":"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"}
|