@linkdesk/plugin-sdk 0.1.42 → 0.1.44

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.
@@ -6,34 +6,131 @@
6
6
  <title>LinkDesk dev 宿主</title>
7
7
  <style>
8
8
  /* dev 宿主页 = SDK 工具 UI(非壳/非产品),中性配色 + 兜底主题变量让插件 var(--xxx) 不至全黑。
9
- 固定值允许——不违反壳硬约束 16(那约束壳 UI;此页不属于壳渲染树)。 */
9
+ 固定值允许——不违反壳硬约束 16(那约束壳 UI;此页不属于壳渲染树)。
10
+
11
+ 🔴 :root 兜底集 = 壳仓 src/index.css 顶层 :root 块的 **token 全集照抄**(值同源,E6#134)——
12
+ 真机里插件能消费的 token 面就是宿主 :root 这一份;兜底少于它 ⇒ 作者在真机能用 var(--bg-card)
13
+ 在预览里解析为空、被迫写「中间兜底层」真机死代码。防手抄漂移 = src/dev-host.test.ts 的
14
+ 生成式对账(两块 token 名集合必须相等,壳加减 token 当场红)。⛔ 手改值前先对齐壳真源。 */
10
15
  :root {
11
- --text: #e8e8ea;
12
- --text-muted: #9a9aa2;
13
- --border: #2c2c33;
14
- --bg: #16161a;
15
- --bg-alt: #1f1f25;
16
- --accent: #4cc38a;
16
+ --bg-window: #1E1E1E;
17
+ --bg-card: #2D2D2D;
18
+ --bg-input: #3C3C3C;
19
+ --text-primary: #D4D4D4;
20
+ --text-secondary: #9D9D9D;
21
+ --text-muted: #8A8A8A;
22
+ --tone-surface-deep: #1A1A1A;
23
+ --tone-ink-on-deep: #FFFFFF;
24
+ --tone-surface-light: #F2F2F2;
25
+ --tone-ink-on-light: #1A1A1A;
26
+ --accent: #0078D4;
27
+ --accent-hover: #1A8CE8;
28
+ --border: #3C3C3C;
29
+ --separator: #474747;
30
+ --icon-inactive: #858585;
31
+ --icon-filter-inactive: brightness(0) saturate(100%) invert(52%);
32
+ --icon-filter-active: brightness(0) saturate(100%) invert(100%);
33
+ --system-log: #6A6A6A;
34
+ --sent-echo: #0078D4;
35
+ --status-connected: #4EC9B0;
36
+ --status-disconnected: #6A6A6A;
37
+ --scrollbar-thumb: rgba(255, 255, 255, 0.15);
38
+ --scrollbar-thumb-hover: rgba(255, 255, 255, 0.25);
39
+ --tab-hover-bg: #353535;
40
+ --drop-glass-bg: rgba(255, 255, 255, 0.08);
41
+ --drop-glass-border: rgba(255, 255, 255, 0.10);
42
+ --drop-glass-inner: inset 0 0 0 1px rgba(255, 255, 255, 0.06);
43
+ --dirty-dot: #CCA700;
44
+ --context-menu-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
45
+ --drag-preview-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
46
+ --tab-active-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
47
+ --floating-panel-backdrop: rgba(0, 0, 0, 0.35);
48
+ --floating-panel-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
49
+ --floating-panel-shadow-dragging: 0 18px 60px rgba(0, 0, 0, 0.6);
50
+ --scrim-dialog: rgba(0, 0, 0, 0.5);
51
+ --scrim-overlay: rgba(0, 0, 0, 0.3);
52
+ --bg-mask-color: #000;
53
+ --font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
54
+ --font-mono: "JetBrains Mono", Consolas, monospace;
55
+ --ui-scale: 1;
56
+ --font-size-2xs: 11px;
57
+ --font-size-xs: 12px;
58
+ --font-size-sm: 13px;
59
+ --font-size-md: 14px;
60
+ --font-size-lg: 16px;
61
+ --font-size-xl: 18px;
62
+ --font-size-2xl: 22px;
63
+ --font-size-3xl: 28px;
64
+ --font-size-4xl: 30px;
65
+ --radius-xs: 2px;
66
+ --radius-sm: 4px;
67
+ --radius-md: 6px;
68
+ --radius-lg: 8px;
69
+ --radius-2xl: 16px;
70
+ --radius-pill: 999px;
71
+ --radius-full: 50%;
72
+ --shadow-hairline: 0 0 1px rgba(0, 0, 0, 0.2);
73
+ --shadow-tiny: 0 0 2px rgba(0, 0, 0, 0.5);
74
+ --shadow-float: 0 4px 16px rgba(0, 0, 0, 0.25);
75
+ --shadow-pop: 0 4px 12px rgba(0, 0, 0, 0.4);
76
+ --shadow-tooltip: 0 2px 8px rgba(0, 0, 0, 0.3);
77
+ --shadow-dialog: 0 8px 32px rgba(0, 0, 0, 0.5);
78
+ --shadow-dialog-soft: 0 8px 32px rgba(0, 0, 0, 0.35);
79
+ --shadow-lift: 0 8px 24px rgba(0, 0, 0, 0.4);
80
+ --error: #E06C75;
81
+ --warning: #CCA700;
82
+ --success: #4CAF50;
83
+ --badge-text: var(--text-on-accent);
84
+ --badge-background: var(--accent);
85
+ --badge-foreground: var(--badge-text);
86
+ --bg-titlebar: #252526;
87
+ --bg-icon-bar: #18181B;
88
+ --bg-side-panel: #1E1E22;
89
+ --bg-toolbar: #1E1E22;
90
+ --titlebar-close-hover: #c42b1c;
91
+ --toggle-knob: #FFFFFF;
92
+ --hover-overlay: rgba(255, 255, 255, 0.06);
93
+ --icon-btn-hover-bg: rgba(255, 255, 255, 0.1);
94
+ --kbd-bg: rgba(128, 128, 128, 0.1);
95
+ --kbd-border: rgba(128, 128, 128, 0.12);
96
+ --kbd-hover-bg: rgba(255, 255, 255, 0.2);
97
+ --kbd-hover-border: rgba(255, 255, 255, 0.35);
98
+ --bg-selection: color-mix(in srgb, var(--accent) 20%, transparent);
99
+ --cm-timestamp: #8A8A8A;
100
+ --z-dropdown: 650;
101
+ --z-sticky: 200;
102
+ --z-overlay-backdrop: 500;
103
+ --z-overlay: 600;
104
+ --z-drag-preview: 1000;
105
+ --z-sidebar-sticky-header: 10;
106
+ --warning-text: #E8AB3E;
107
+ --warning-bg: rgba(255, 200, 0, 0.12);
108
+ --text-on-accent: #FFFFFF;
109
+ --danger: #EF4444;
17
110
  }
18
111
  * { box-sizing: border-box; }
19
112
  html, body { margin: 0; height: 100%; }
20
113
  body {
21
- background: var(--bg);
22
- color: var(--text);
23
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;
114
+ background: var(--bg-window);
115
+ color: var(--text-primary);
116
+ font-family: var(--font-ui);
24
117
  }
25
118
  #ld-topbar {
26
119
  position: sticky; top: 0; z-index: 10;
27
120
  display: flex; align-items: center; gap: 8px;
28
121
  padding: 5px 12px; font-size: 12px;
29
- background: var(--bg-alt); border-bottom: 1px solid var(--border);
122
+ background: var(--bg-input); border-bottom: 1px solid var(--border);
30
123
  user-select: none;
31
124
  }
32
125
  #ld-topbar .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); }
33
126
  #ld-topbar .sep { opacity: 0.4; }
34
- #ld-topbar code { color: #9fd0ff; font-family: ui-monospace, "Cascadia Code", Consolas, monospace; }
127
+ #ld-topbar code { color: var(--sent-echo); font-family: var(--font-mono); }
35
128
  #ld-topbar .hint { color: var(--text-muted); margin-left: auto; }
36
- #ld-root { padding: 0; }
129
+ /* 🔴 挂载点必须有确定高度(E6#134)——真壳的标签页容器有确定高度,插件 height:100% 依赖它;
130
+ 这里 flex 链拉伸(html/body 100% → body 纵向 flex → #ld-root 吃满剩余),等价真机形态。
131
+ 少了它插件画布塌陷,作者被迫写 ResizeObserver 自愈真机死代码。防漂移 = src/dev-host.test.ts。 */
132
+ body { display: flex; flex-direction: column; }
133
+ #ld-root { flex: 1 1 auto; min-height: 0; padding: 0; }
37
134
  </style>
38
135
  </head>
39
136
  <body>
@@ -10,5 +10,12 @@
10
10
  * - 纯函数返回违规数组(不 process.exit)——知情绕行由 buildDisableIndex 裁决。
11
11
  */
12
12
  import { type CheckViolation } from "./scan.js";
13
+ /**
14
+ * 报错即文档——可用的 token 族清单(E6#132)。此处列的每个族都由 css-hardcode.test.ts 对账
15
+ * (族前缀必须在壳 `src/index.css` 的 `:root` 真源里真实存在):此前文案列了不存在的 `--surface-*`
16
+ * 而漏了 `--shadow-*`,第三方作者照文案找 token 不得,把三处阴影全删。⛔ 不做动态拼接
17
+ * (lint 运行时读文件 = 引入 IO 依赖);新增族在这里补一条 + 对账测试自动接管。
18
+ */
19
+ export declare const CSS_TOKEN_HINT = "\u5E94\u8D70 CSS \u53D8\u91CF\uFF1Avar(--text-*/--bg-*/--accent-*/--border-*/--shadow-*/--radius-*/--tone-*/--status-*/--icon-*/--z-*/\u2026\u2014\u2014\u65CF\u5168\u96C6\u4EE5\u5BBF\u4E3B :root \u4E0B\u53D1\u4E3A\u51C6\uFF0C\u52FF\u81EA\u9020\u515C\u5E95";
13
20
  export declare function runCssHardcodeCheck(root: string): CheckViolation[];
14
21
  //# sourceMappingURL=css-hardcode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"css-hardcode.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/css-hardcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAwF,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAoBtI,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CA6DlE"}
1
+ {"version":3,"file":"css-hardcode.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/css-hardcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAwF,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAOtI;;;;;GAKG;AACH,eAAO,MAAM,cAAc,oQACgH,CAAC;AAe5I,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CA6DlE"}
@@ -14,6 +14,13 @@ import { buildDisableIndex, isDisabled, CHECK_IDS } from "./disable.js";
14
14
  const DATA_DIR_RE = /(^|\/)(i18n|themes?|color-picker)\//;
15
15
  const EXT_CSS = [".css"];
16
16
  const EXT_CODE = [".ts", ".tsx"];
17
+ /**
18
+ * 报错即文档——可用的 token 族清单(E6#132)。此处列的每个族都由 css-hardcode.test.ts 对账
19
+ * (族前缀必须在壳 `src/index.css` 的 `:root` 真源里真实存在):此前文案列了不存在的 `--surface-*`
20
+ * 而漏了 `--shadow-*`,第三方作者照文案找 token 不得,把三处阴影全删。⛔ 不做动态拼接
21
+ * (lint 运行时读文件 = 引入 IO 依赖);新增族在这里补一条 + 对账测试自动接管。
22
+ */
23
+ export const CSS_TOKEN_HINT = "应走 CSS 变量:var(--text-*/--bg-*/--accent-*/--border-*/--shadow-*/--radius-*/--tone-*/--status-*/--icon-*/--z-*/…——族全集以宿主 :root 下发为准,勿自造兜底";
17
24
  const HEX_RE = /#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\b/g;
18
25
  const RGB_RE = /rgba?\(|hsla?\(/g;
19
26
  /** 定义上下文:本行属 `--name: <字面量>` 自定义属性(token 单一权威,非消费) */
@@ -58,7 +65,7 @@ export function runCssHardcodeCheck(root) {
58
65
  }
59
66
  }
60
67
  for (const h of hits) {
61
- push(rel, i + 1, `${line.trim().slice(0, 100)} ← 硬编码 ${h.color}(应走 CSS 变量 var(--text-*/--bg-*/--accent-*/--surface-*))`, disabled);
68
+ push(rel, i + 1, `${line.trim().slice(0, 100)} ← 硬编码 ${h.color}(${CSS_TOKEN_HINT})`, disabled);
62
69
  }
63
70
  });
64
71
  }
@@ -78,7 +85,7 @@ export function runCssHardcodeCheck(root) {
78
85
  for (const m of line.matchAll(RGB_RE)) {
79
86
  if (isDynamicFunc(line, m.index))
80
87
  continue;
81
- push(rel, i + 1, `${line.trim().slice(0, 100)} ← 硬编码 ${m[0] === "rgb(" || m[0] === "rgba(" ? "rgb()" : "hsl()"}(应走 CSS 变量)`, disabled);
88
+ push(rel, i + 1, `${line.trim().slice(0, 100)} ← 硬编码 ${m[0] === "rgb(" || m[0] === "rgba(" ? "rgb()" : "hsl()"}(${CSS_TOKEN_HINT})`, disabled);
82
89
  }
83
90
  });
84
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"css-hardcode.js","sourceRoot":"","sources":["../../../src/eslint/checks/css-hardcode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"css-hardcode.js","sourceRoot":"","sources":["../../../src/eslint/checks/css-hardcode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * check-css-namespace 腿·**插件域自有类名引用悬空**(E6#136 · 2026-09-20)。
3
+ *
4
+ * ── 这条缝是怎么被实测踩出来的 ──
5
+ * 生态首个第三方 AI 作者(geme-tihu-bicycle)在 CSS 头注释里列 token 族时用了 `--text-` 族名+`/` 分隔——闭合符
6
+ * 把块注释**提前闭合**,注释后的残渣文本黏住紧随其后的 `.geme-tihu-bicycle-root` 规则,把整条规则
7
+ * 吞掉;TSX 里引用该类名的样式**静默不生效**(PostCSS/Vite 全程零警告,靠逐条截图比对才发现)。
8
+ * 三条既有腿都没接住(缝隙正中央):
9
+ * · `dangling-names.ts`(E6#119)头注明写「**非 `ldk-` 的未定义名不计悬空**——假红比漏报更坏」
10
+ * ⇒ 自有前缀类名**有意宽松掉**(`notJudged`);
11
+ * · `keyframe-refs.ts`(E6#112)只管关键帧;
12
+ * · 壳侧 `audit:plugin-dead-css`(E6#113)是反方向(定义了没人用)。
13
+ * 本腿把「自有前缀类名引用了、本仓 CSS 里却找不到定义」这一格补上——是既有口径的**补缝**,
14
+ * 不是第二把全能尺子。
15
+ *
16
+ * ── 🔴 窄口子(判据写死,不许走样)──
17
+ * · 射程 = 插件仓 `.ts`/`.tsx` 里 `className` 的**字符串字面量**(`classList` / `querySelector`
18
+ * 等其他通道不进本腿——任务书判据写死 className;`ldk-*` 借用归 dangling-names、宿主保留名归
19
+ * reserved-classes、前缀形态归 plugin-prefix,各归各腿);
20
+ * · 只判**本插件前缀**(`<pluginId>-`)的类名——非本前缀的自有名(DOM 钩子 / 第三方内联)不判;
21
+ * · **动态拼接一律跳过并计数**(模板插值 / `clsx(...)` / 变量 / 三元——静态读不出运行时拼出来的
22
+ * 名字,拦就是假红;口径与 `dangling-names.ts` 逐字同源);
23
+ * · 定义集 = 本仓自有 CSS(`.css` 全量)**规则选择器提及**的类名(`classTokensIn` 口径——scoped
24
+ * 调优 `.root .item` 里的 `.item` 是合法定义,⇒ 按**提及集**收,⛔ 不用裸定义集,否则 scoped 假红)。
25
+ *
26
+ * ── 🔴 根因案为什么要「孤儿闭合符段剔除」──
27
+ * 注释被提前闭合后,`stripComments` 的非贪婪匹配在**第一个闭合符**处收口 ⇒ cleaned 里残留
28
+ * 「孤儿闭合符 + 残渣文本」;残渣与紧随的规则选择器**黏成同一段**(直到 `{`)——运行时解析器把
29
+ * 这一整段当无效选择器 ⇒ **规则整条被吞**(这正是样式丢失的机制)。若直接照抄提及集口径,黏住的
30
+ * 类名照样被抓出来 ⇒ 假绿(根因案不红)。本腿在收提及集前先找**孤儿闭合符**(cleaned 中已无配对
31
+ * 注释 ⇒ 任何存活的星号+斜杠相邻对都是提前闭合的产物;字符串里的跳过):含孤儿的选择器段**整段剔除**
32
+ * ——与运行时「规则被吞」如实对齐。剔除的段数记进报告(`orphanSegments`,诊断读数),判红仍走
33
+ * 「引用找不到」这一条路(⛔ 不给孤儿本身单开判红灯——判据写死引用↔定义集比对)。
34
+ *
35
+ * ── fail-closed ──
36
+ * `pluginId` 读不到 ⇒ 前缀无从谈起 ⇒ 报「无法判定」(与前缀腿同一件事同一落点 `plugin.json:1`,
37
+ * 由 lint.ts 的同点去重保证不重复报)——⛔ 不许静默当 0 处通过。
38
+ *
39
+ * 知情绕行 = 标准 disable 注释(`CHECK_IDS.cssNamespace`,与命名空间家族同一 id)。
40
+ */
41
+ import { type CheckViolation } from "./scan.js";
42
+ import { type PluginIdResolution } from "./plugin-prefix.js";
43
+ /** cleaned(已剥配对注释)里的**孤儿闭合符**:任何存活的「星号+斜杠」相邻对都是注释内容提前闭合的产物(字符串里的跳过) */
44
+ export declare function orphanCloseIndices(cleaned: string): number[];
45
+ /** 一处悬空引用站点 */
46
+ export interface DanglingOwnClassSite {
47
+ /** 工程相对路径(正斜杠) */
48
+ file: string;
49
+ /** 1-based */
50
+ line: number;
51
+ /** 被引用但本仓 CSS 定义集里没有的自有前缀类名 */
52
+ name: string;
53
+ }
54
+ export interface DanglingOwnClassReport {
55
+ root: string;
56
+ pluginId: string | null;
57
+ /** 非 null ⇒ fail-closed(身份读不到 ⇒ 「无法判定」,⛔ 不许当 0 处通过) */
58
+ error: string | null;
59
+ /** 自有前缀 className 引用站点数 */
60
+ ownRefs: number;
61
+ /** 本仓 CSS 定义集规模(提及集口径) */
62
+ ownDefs: number;
63
+ /** 含孤儿闭合符被整段剔除的选择器段数(根因案信号——诊断读数,不单独判红) */
64
+ orphanSegments: number;
65
+ /** 射程外计数(插值模板 / 动态拼接——静态读不出,⛔ 不判) */
66
+ skipped: {
67
+ interp: number;
68
+ dynamic: number;
69
+ };
70
+ dangling: DanglingOwnClassSite[];
71
+ violations: CheckViolation[];
72
+ }
73
+ /**
74
+ * 跑本仓自有类名引用悬空判据。⚠️ `resolution` 可注入(单测用);缺省从工程根 plugin.json 解析。
75
+ */
76
+ export declare function runDanglingOwnClassCheck(root: string, opts?: {
77
+ resolution?: PluginIdResolution;
78
+ }): DanglingOwnClassReport;
79
+ //# sourceMappingURL=dangling-own-classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangling-own-classes.d.ts","sourceRoot":"","sources":["../../../src/eslint/checks/dangling-own-classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAInB,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA8JpF,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB5D;AAED,eAAe;AACf,MAAM,WAAW,oBAAoB;IACnC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uDAAuD;IACvD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAcD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAAO,GAC7C,sBAAsB,CAmFxB"}