@linkdesk/plugin-sdk 0.1.3 → 0.1.7

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.
@@ -0,0 +1,366 @@
1
+ /**
2
+ * 🔥 linkdesk-mock.generated.ts——dev 宿主 window.linkdesk mock 树(自动生成,勿手改)
3
+ *
4
+ * 生成源:src/core/api/linkdesk-api.ts + linkdesk-api/(LinkDeskAPI 交集——与 linkdesk.d.ts 同一标注源)
5
+ * 生成器:scripts/generate-contract.mjs(E6#27 第三产物,杜绝 mock/preload 双份漂移)
6
+ * 改契约源 → 跑 `node scripts/generate-contract.mjs`(npm run check 里 contracts:check 三产物逐字节强制)
7
+ *
8
+ * 消费方:packages/plugin-sdk/dev-host/mock.ts——injectDevMockApi() 用 Proxy 包本树:
9
+ * 树内方法 = 类型驱动中性默认 + 调用即打 [linkdesk-mock] 日志(mock vs 真 IPC 可感知);
10
+ * 树外路径(契约里不存在的方法名) = Proxy 抛「不在 linkdesk API 契约」。
11
+ * 默认值策略("不崩 + 可感知",详见 02-本地预览环境.md §10.2):
12
+ * Promise<void/…数据对象> → async 返 undefined;Promise<数组> → [];Promise<string/boolean> → ""/false;
13
+ * void → noop(registerCommand 等每插件必调,绝不抛);返回退订句柄(onChange 等)→ noop 函数;
14
+ * 其余同步 → ""/undefined。真数据/真行为走真实 IPC / linkdesk-plugin-sdk dev --real(E6#28.5)。
15
+ */
16
+ export const linkdeskMock: Record<string, unknown> = {
17
+ commands: {
18
+ execute: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.execute", ..._args); },
19
+ executeCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.executeCommand", ..._args); },
20
+ registerCommand: (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.registerCommand", ..._args); },
21
+ unregisterCommands: (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.unregisterCommands", ..._args); },
22
+ getCommands: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.getCommands", ..._args); return []; },
23
+ _executeShellLocal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands._executeShellLocal", ..._args); },
24
+ _setCommandMissHandler: (..._args: unknown[]) => { console.info("[linkdesk-mock] commands._setCommandMissHandler", ..._args); },
25
+ },
26
+ configuration: {
27
+ get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.get", ..._args); },
28
+ set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.set", ..._args); },
29
+ getSchema: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getSchema", ..._args); },
30
+ onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onChange", ..._args); return () => {}; },
31
+ getConfigurationContributions: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getConfigurationContributions", ..._args); return []; },
32
+ inspectConfiguration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.inspectConfiguration", ..._args); },
33
+ getUserSettings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getUserSettings", ..._args); },
34
+ onDidChangeConfiguration: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onDidChangeConfiguration", ..._args); return () => {}; },
35
+ onPluginLifecycleChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onPluginLifecycleChange", ..._args); return () => {}; },
36
+ consumeSettingsGroup: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeSettingsGroup", ..._args); },
37
+ onRequestSettingsGroup: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestSettingsGroup", ..._args); return () => {}; },
38
+ consumeScrollToSetting: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeScrollToSetting", ..._args); },
39
+ onRequestScrollToSetting: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestScrollToSetting", ..._args); return () => {}; },
40
+ consumeOpenKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeOpenKeybindings", ..._args); },
41
+ onRequestOpenKeybindings: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestOpenKeybindings", ..._args); return () => {}; },
42
+ },
43
+ config: {
44
+ get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.get", ..._args); },
45
+ set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.set", ..._args); },
46
+ getSchema: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getSchema", ..._args); },
47
+ onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onChange", ..._args); return () => {}; },
48
+ getConfigurationContributions: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getConfigurationContributions", ..._args); return []; },
49
+ inspectConfiguration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.inspectConfiguration", ..._args); },
50
+ getUserSettings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getUserSettings", ..._args); },
51
+ onDidChangeConfiguration: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onDidChangeConfiguration", ..._args); return () => {}; },
52
+ onPluginLifecycleChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onPluginLifecycleChange", ..._args); return () => {}; },
53
+ consumeSettingsGroup: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeSettingsGroup", ..._args); },
54
+ onRequestSettingsGroup: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestSettingsGroup", ..._args); return () => {}; },
55
+ consumeScrollToSetting: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeScrollToSetting", ..._args); },
56
+ onRequestScrollToSetting: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestScrollToSetting", ..._args); return () => {}; },
57
+ consumeOpenKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeOpenKeybindings", ..._args); },
58
+ onRequestOpenKeybindings: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestOpenKeybindings", ..._args); return () => {}; },
59
+ },
60
+ theme: {
61
+ getCurrent: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getCurrent", ..._args); return ""; },
62
+ getAvailable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getAvailable", ..._args); return []; },
63
+ apply: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.apply", ..._args); },
64
+ listRecipes: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.listRecipes", ..._args); return []; },
65
+ getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getActive", ..._args); },
66
+ getEffectiveTokens: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getEffectiveTokens", ..._args); },
67
+ setRecipe: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.setRecipe", ..._args); },
68
+ setColorway: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.setColorway", ..._args); },
69
+ resetAppearance: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.resetAppearance", ..._args); },
70
+ resetMix: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.resetMix", ..._args); },
71
+ getBaselineSeeds: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getBaselineSeeds", ..._args); },
72
+ },
73
+ language: {
74
+ getCurrent: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getCurrent", ..._args); return ""; },
75
+ getAvailable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getAvailable", ..._args); return []; },
76
+ set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.set", ..._args); },
77
+ getInitial: (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getInitial", ..._args); },
78
+ onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] language.onChange", ..._args); return () => {}; },
79
+ },
80
+ appearance: {
81
+ importImage: async (..._args: unknown[]) => { console.info("[linkdesk-mock] appearance.importImage", ..._args); return ""; },
82
+ revealStorage: async (..._args: unknown[]) => { console.info("[linkdesk-mock] appearance.revealStorage", ..._args); },
83
+ },
84
+ tabs: {
85
+ create: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.create", ..._args); },
86
+ openOrFocus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.openOrFocus", ..._args); },
87
+ focus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.focus", ..._args); },
88
+ close: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.close", ..._args); },
89
+ focusBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.focusBySourceId", ..._args); },
90
+ updateLabelBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.updateLabelBySourceId", ..._args); },
91
+ closeBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.closeBySourceId", ..._args); },
92
+ onDidChangeActiveTab: (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.onDidChangeActiveTab", ..._args); return () => {}; },
93
+ },
94
+ keybindings: {
95
+ getKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.getKeybindings", ..._args); return []; },
96
+ getConflicts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.getConflicts", ..._args); },
97
+ registerKeybinding: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.registerKeybinding", ..._args); },
98
+ saveUserKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.saveUserKeybindings", ..._args); },
99
+ removeKeybindingForCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.removeKeybindingForCommand", ..._args); },
100
+ resetKeybindingToDefault: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.resetKeybindingToDefault", ..._args); },
101
+ findKeybindingForCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.findKeybindingForCommand", ..._args); },
102
+ setKeybindingCaptureActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.setKeybindingCaptureActive", ..._args); },
103
+ keyboardEventToKeyString: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.keyboardEventToKeyString", ..._args); return ""; },
104
+ onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.onChange", ..._args); return () => {}; },
105
+ syncToMainProcess: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.syncToMainProcess", ..._args); },
106
+ onForwardedEvent: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.onForwardedEvent", ..._args); return () => {}; },
107
+ },
108
+ notifications: {
109
+ show: async (..._args: unknown[]) => { console.info("[linkdesk-mock] notifications.show", ..._args); return { update: async () => {}, finish: async () => {}, cancel: async () => {} }; },
110
+ },
111
+ menu: {
112
+ registerItems: async (..._args: unknown[]) => { console.info("[linkdesk-mock] menu.registerItems", ..._args); },
113
+ getItems: async (..._args: unknown[]) => { console.info("[linkdesk-mock] menu.getItems", ..._args); return []; },
114
+ },
115
+ contextKey: {
116
+ set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] contextKey.set", ..._args); },
117
+ _getValue: (..._args: unknown[]) => { console.info("[linkdesk-mock] contextKey._getValue", ..._args); },
118
+ },
119
+ dialog: {
120
+ confirm: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.confirm", ..._args); return false; },
121
+ alert: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.alert", ..._args); },
122
+ open: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.open", ..._args); },
123
+ openFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.openFile", ..._args); },
124
+ confirmContent: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.confirmContent", ..._args); return false; },
125
+ },
126
+ quickPick: {
127
+ show: async (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPick.show", ..._args); },
128
+ },
129
+ quickPickHost: {
130
+ registerHost: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.registerHost", ..._args); return () => {}; },
131
+ onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.onShow", ..._args); return () => {}; },
132
+ select: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.select", ..._args); },
133
+ highlight: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.highlight", ..._args); },
134
+ close: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.close", ..._args); },
135
+ itemAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.itemAction", ..._args); },
136
+ },
137
+ dialogHost: {
138
+ onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.onShow", ..._args); return () => {}; },
139
+ current: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.current", ..._args); },
140
+ confirm: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.confirm", ..._args); },
141
+ cancel: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.cancel", ..._args); },
142
+ },
143
+ floatingPanelHost: {
144
+ onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] floatingPanelHost.onShow", ..._args); return () => {}; },
145
+ action: (..._args: unknown[]) => { console.info("[linkdesk-mock] floatingPanelHost.action", ..._args); },
146
+ },
147
+ serial: {
148
+ listPorts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.listPorts", ..._args); return []; },
149
+ getStatus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.getStatus", ..._args); return []; },
150
+ openPort: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.openPort", ..._args); },
151
+ closePort: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.closePort", ..._args); },
152
+ sendData: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.sendData", ..._args); },
153
+ sendText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.sendText", ..._args); },
154
+ setDtr: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.setDtr", ..._args); },
155
+ setRts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.setRts", ..._args); },
156
+ onData: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onData", ..._args); return () => {}; },
157
+ onStats: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onStats", ..._args); return () => {}; },
158
+ onSystem: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onSystem", ..._args); return () => {}; },
159
+ },
160
+ clipboard: {
161
+ readText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.readText", ..._args); return ""; },
162
+ writeText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.writeText", ..._args); },
163
+ writeFileList: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.writeFileList", ..._args); },
164
+ },
165
+ p2p: {
166
+ send: (..._args: unknown[]) => { console.info("[linkdesk-mock] p2p.send", ..._args); },
167
+ on: (..._args: unknown[]) => { console.info("[linkdesk-mock] p2p.on", ..._args); return () => {}; },
168
+ },
169
+ events: {
170
+ on: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.on", ..._args); return () => {}; },
171
+ emit: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.emit", ..._args); },
172
+ heartbeat: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.heartbeat", ..._args); },
173
+ notifyTheme: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.notifyTheme", ..._args); },
174
+ },
175
+ pluginState: {
176
+ get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.get", ..._args); },
177
+ set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.set", ..._args); },
178
+ onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.onChange", ..._args); return () => {}; },
179
+ },
180
+ workspace: {
181
+ getFolders: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.getFolders", ..._args); return []; },
182
+ getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.getActive", ..._args); },
183
+ setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.setActive", ..._args); },
184
+ openFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.openFolder", ..._args); },
185
+ addFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.addFolder", ..._args); },
186
+ removeFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.removeFolder", ..._args); },
187
+ onDidChangeFolders: (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.onDidChangeFolders", ..._args); return () => {}; },
188
+ onDidChangeActiveWorkspace: (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.onDidChangeActiveWorkspace", ..._args); return () => {}; },
189
+ },
190
+ filesystem: {
191
+ readTextFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readTextFile", ..._args); return ""; },
192
+ writeTextFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.writeTextFile", ..._args); },
193
+ exists: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.exists", ..._args); return false; },
194
+ createDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.createDir", ..._args); },
195
+ copy: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.copy", ..._args); },
196
+ rename: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.rename", ..._args); },
197
+ remove: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.remove", ..._args); },
198
+ listDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.listDir", ..._args); return []; },
199
+ readBinaryFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readBinaryFile", ..._args); },
200
+ writeBinaryFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.writeBinaryFile", ..._args); },
201
+ watch: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.watch", ..._args); },
202
+ readdir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readdir", ..._args); return []; },
203
+ },
204
+ path: {
205
+ appDataDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] path.appDataDir", ..._args); return ""; },
206
+ normalize: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.normalize", ..._args); return ""; },
207
+ join: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.join", ..._args); return ""; },
208
+ basename: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.basename", ..._args); return ""; },
209
+ dirname: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.dirname", ..._args); return ""; },
210
+ extname: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.extname", ..._args); return ""; },
211
+ },
212
+ env: {
213
+ get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] env.get", ..._args); },
214
+ },
215
+ search: {
216
+ searchFiles: async (..._args: unknown[]) => { console.info("[linkdesk-mock] search.searchFiles", ..._args); return []; },
217
+ },
218
+ encoding: {
219
+ detect: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.detect", ..._args); return ""; },
220
+ decode: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.decode", ..._args); return ""; },
221
+ encode: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.encode", ..._args); },
222
+ },
223
+ decorations: {
224
+ registerProvider: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.registerProvider", ..._args); },
225
+ unregisterProvider: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.unregisterProvider", ..._args); },
226
+ getDecoration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.getDecoration", ..._args); },
227
+ onDidChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.onDidChange", ..._args); return () => {}; },
228
+ },
229
+ fileAssociation: {
230
+ getPluginFor: async (..._args: unknown[]) => { console.info("[linkdesk-mock] fileAssociation.getPluginFor", ..._args); },
231
+ },
232
+ langDef: {
233
+ get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] langDef.get", ..._args); },
234
+ },
235
+ lsp: {
236
+ spawn: async (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.spawn", ..._args); return ""; },
237
+ write: (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.write", ..._args); },
238
+ dispose: async (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.dispose", ..._args); },
239
+ onData: (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.onData", ..._args); return () => {}; },
240
+ },
241
+ protocol: {
242
+ listProtocols: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.listProtocols", ..._args); return []; },
243
+ getActiveProtocolId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.getActiveProtocolId", ..._args); return ""; },
244
+ setActiveProtocolId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.setActiveProtocolId", ..._args); },
245
+ },
246
+ viewContainer: {
247
+ getViewContainer: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getViewContainer", ..._args); },
248
+ getViews: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getViews", ..._args); return []; },
249
+ getView: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getView", ..._args); },
250
+ registerView: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.registerView", ..._args); },
251
+ },
252
+ plugins: {
253
+ resolvePath: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.resolvePath", ..._args); return ""; },
254
+ resolveEntry: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.resolveEntry", ..._args); },
255
+ listDirs: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listDirs", ..._args); return []; },
256
+ listAll: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listAll", ..._args); return []; },
257
+ listDisabledDirs: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listDisabledDirs", ..._args); return []; },
258
+ readManifest: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.readManifest", ..._args); return ""; },
259
+ readAllManifests: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.readAllManifests", ..._args); },
260
+ packageDownload: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageDownload", ..._args); },
261
+ packageExtract: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageExtract", ..._args); },
262
+ packageCancel: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageCancel", ..._args); return false; },
263
+ packageUpdateCheck: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageUpdateCheck", ..._args); },
264
+ packageStageUpdate: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageStageUpdate", ..._args); },
265
+ packageCommitUpdate: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageCommitUpdate", ..._args); },
266
+ },
267
+ pluginManager: {
268
+ list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.list", ..._args); return []; },
269
+ enable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.enable", ..._args); },
270
+ disable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.disable", ..._args); },
271
+ uninstall: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.uninstall", ..._args); },
272
+ install: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.install", ..._args); },
273
+ installWithProgress: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.installWithProgress", ..._args); },
274
+ reinstall: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.reinstall", ..._args); },
275
+ getDisabled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.getDisabled", ..._args); return []; },
276
+ getUninstalled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.getUninstalled", ..._args); return []; },
277
+ isDisabled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.isDisabled", ..._args); return false; },
278
+ update: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.update", ..._args); },
279
+ checkUpdates: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.checkUpdates", ..._args); },
280
+ notifyManifestChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.notifyManifestChanged", ..._args); },
281
+ },
282
+ bridge: {
283
+ onRequest: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.onRequest", ..._args); return () => {}; },
284
+ respond: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.respond", ..._args); },
285
+ broadcast: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.broadcast", ..._args); },
286
+ notifyConfigChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.notifyConfigChanged", ..._args); },
287
+ },
288
+ pool: {
289
+ pushLayout: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushLayout", ..._args); },
290
+ onReady: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onReady", ..._args); return () => {}; },
291
+ toggleDevTools: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.toggleDevTools", ..._args); },
292
+ onSidebarAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onSidebarAction", ..._args); return () => {}; },
293
+ onTabAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onTabAction", ..._args); return () => {}; },
294
+ onTabBarRects: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onTabBarRects", ..._args); return () => {}; },
295
+ onDragPosition: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onDragPosition", ..._args); return () => {}; },
296
+ pushAdsorbHint: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushAdsorbHint", ..._args); },
297
+ onAdsorbIndex: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onAdsorbIndex", ..._args); return () => {}; },
298
+ pushQuickPick: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushQuickPick", ..._args); },
299
+ onQuickPickAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onQuickPickAction", ..._args); return () => {}; },
300
+ pushDialog: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushDialog", ..._args); },
301
+ onDialogAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onDialogAction", ..._args); return () => {}; },
302
+ pushFloatingPanel: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushFloatingPanel", ..._args); },
303
+ onFloatingPanelAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onFloatingPanelAction", ..._args); return () => {}; },
304
+ onMemoryPressure: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onMemoryPressure", ..._args); return () => {}; },
305
+ createWindow: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.createWindow", ..._args); },
306
+ closeWindow: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.closeWindow", ..._args); },
307
+ onWindowClosed: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onWindowClosed", ..._args); return () => {}; },
308
+ onWindowBoundsChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onWindowBoundsChanged", ..._args); return () => {}; },
309
+ onLayout: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onLayout", ..._args); return () => {}; },
310
+ ready: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.ready", ..._args); },
311
+ sidebarAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.sidebarAction", ..._args); },
312
+ tabAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.tabAction", ..._args); },
313
+ tabBarRects: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.tabBarRects", ..._args); },
314
+ dragPosition: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.dragPosition", ..._args); },
315
+ onAdsorbHint: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onAdsorbHint", ..._args); return () => {}; },
316
+ adsorbIndex: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.adsorbIndex", ..._args); },
317
+ registerBeforeClose: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.registerBeforeClose", ..._args); },
318
+ unregisterBeforeClose: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.unregisterBeforeClose", ..._args); },
319
+ beforeClose: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.beforeClose", ..._args); return false; },
320
+ },
321
+ window: {
322
+ minimize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.minimize", ..._args); },
323
+ maximize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.maximize", ..._args); },
324
+ unmaximize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.unmaximize", ..._args); },
325
+ close: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.close", ..._args); },
326
+ setZoom: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.setZoom", ..._args); },
327
+ toggleDevTools: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.toggleDevTools", ..._args); },
328
+ isMaximized: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.isMaximized", ..._args); return false; },
329
+ onMaximizeChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.onMaximizeChange", ..._args); return () => {}; },
330
+ setAlwaysOnTop: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.setAlwaysOnTop", ..._args); },
331
+ isAlwaysOnTop: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.isAlwaysOnTop", ..._args); return false; },
332
+ onAlwaysOnTopChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.onAlwaysOnTopChange", ..._args); return () => {}; },
333
+ },
334
+ shell: {
335
+ showItemInFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.showItemInFolder", ..._args); },
336
+ openInTerminal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.openInTerminal", ..._args); },
337
+ pluginLocation: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.pluginLocation", ..._args); },
338
+ openPluginFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.openPluginFolder", ..._args); },
339
+ startDrag: (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.startDrag", ..._args); },
340
+ relaunch: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.relaunch", ..._args); },
341
+ },
342
+ hotExit: {
343
+ save: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.save", ..._args); },
344
+ load: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.load", ..._args); },
345
+ clear: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.clear", ..._args); },
346
+ },
347
+ getFilePath: (..._args: unknown[]) => { console.info("[linkdesk-mock] getFilePath", ..._args); return ""; },
348
+ panel: {
349
+ reveal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] panel.reveal", ..._args); },
350
+ revealFloating: async (..._args: unknown[]) => { console.info("[linkdesk-mock] panel.revealFloating", ..._args); },
351
+ },
352
+ settings: {
353
+ list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.list", ..._args); return []; },
354
+ getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.getActive", ..._args); },
355
+ setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.setActive", ..._args); },
356
+ },
357
+ factorySlots: {
358
+ listRoles: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.listRoles", ..._args); return []; },
359
+ list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.list", ..._args); return []; },
360
+ getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.getActive", ..._args); },
361
+ setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.setActive", ..._args); },
362
+ },
363
+ app: {
364
+ getVersion: async (..._args: unknown[]) => { console.info("[linkdesk-mock] app.getVersion", ..._args); return ""; },
365
+ },
366
+ };
package/dev-host/mock.ts CHANGED
@@ -1,34 +1,72 @@
1
1
  /**
2
- * dev 宿主 mock 注入锚点(E6#23.5c 位置定案)。
2
+ * dev 宿主 mock 注入锚点(E6#23.5c 位置定案)。`injectDevMockApi()` 签名与调用点不变。
3
3
  *
4
- * 纯浏览器 dev 没有真实 preload → `window.linkdesk` 不存在。现役注入体 = **throw-on-call 兜底**:
5
- * 任何未 mock API 调用抛「仅在生产环境可用」而非静默 `undefined`/`TypeError`——防「dev 正常、
6
- * 装进 LinkDesk 才炸」的反向落差(E6#27b 精神,先落行为、后补方法表)。
4
+ * 注入体(E6#27 落地替换,2026-09-07):
5
+ * - 方法树 = 自动生成 [linkdesk-mock.generated.ts](./linkdesk-mock.generated.ts)——与 linkdesk.d.ts
6
+ * 同一标注源 `src/core/api/linkdesk-api.ts`(杜绝 mock/preload 双份漂移)。每个方法 = 类型驱动
7
+ * 中性默认 + 调用即打 `[linkdesk-mock] <path>` 日志(mock vs 真 IPC 可感知,不静默假成功)。
8
+ * - #27b 兜底层 = 递归 Proxy:树内路径(契约里真实方法/命名空间)返回真子树/方法;**树外路径**
9
+ * (契约里不存在的方法名,如拼写错)**调用时抛错**「不在 linkdesk API 契约」而非静默 undefined /
10
+ * `undefined is not a function`——单源同构下,mock 缺 = 生产也缺,早抛早纠正。
7
11
  *
8
- * 🔵 承接锚:真方法默认值表 = E6#27(generate-contract.mjs 第二输出目标,第 2.3 轮)——
9
- * 届时替换本文件注入体(代理内填充生成的方法),`injectDevMockApi()` 签名与调用点不变。
12
+ * 真数据/真行为(串口/文件系统/IPC)不属于浏览器 mock——走真实 preload(装进 LinkDesk)或
13
+ * `linkdesk-plugin-sdk dev --real` 真机环(E6#28.5)。
10
14
  */
15
+ import { linkdeskMock } from "./linkdesk-mock.generated.js";
16
+
17
+ /** 常见 introspection 键——不当作 linkdesk API 路径,返回 undefined(防 console/JSON/运行时探测误触 throw-stub) */
18
+ const SKIP_INTRINSIC = new Set([
19
+ "then",
20
+ "toJSON",
21
+ "toString",
22
+ "valueOf",
23
+ "constructor",
24
+ "__proto__",
25
+ "hasOwnProperty",
26
+ "isPrototypeOf",
27
+ "propertyIsEnumerable",
28
+ ]);
29
+
30
+ /** 树外路径 call-stub——访问不抛(feature-detect 可安全探测),调用才抛(#27b)。
31
+ * 自身是 Proxy:继续取属性返回更深 stub(`linkdesk.foo.bar()` 整链报完整 dotted path,
32
+ * 而非裸 TypeError「not a function」);symbol/intrinsic 键返回 undefined 防运行时探测误触。 */
33
+ function missingApiStub(dotted: string): () => never {
34
+ const stub = () => {
35
+ throw new Error(
36
+ `[dev] window.linkdesk.${dotted} 不是 linkdesk API 方法——dev mock 与 src/core/api/linkdesk-api.ts` +
37
+ ` 同源自动生成(方法集与生产一致),契约里没有它 = 生产环境调用同样报错。请核对方法名/拼写。` +
38
+ `确需真实 IPC 行为 → linkdesk-plugin-sdk dev --real(E6#28.5 真机环)。`,
39
+ );
40
+ };
41
+ return new Proxy(stub, {
42
+ get(_t, prop) {
43
+ if (typeof prop === "symbol" || SKIP_INTRINSIC.has(String(prop))) return undefined;
44
+ return missingApiStub(`${dotted}.${String(prop)}`);
45
+ },
46
+ });
47
+ }
48
+
49
+ /** 递归 Proxy:树内路径返回真子树(命名空间再包一层 / 方法叶子直返),树外路径调用抛错 */
50
+ function wrapNode(node: Record<string, unknown>, path: string[]): Record<string, unknown> {
51
+ return new Proxy(node, {
52
+ get(t, prop) {
53
+ if (typeof prop === "symbol") return undefined;
54
+ const key = String(prop);
55
+ if (SKIP_INTRINSIC.has(key)) return undefined;
56
+ if (key in t) {
57
+ const v = t[key];
58
+ if (typeof v === "function") return v; // 方法叶子(自打 [linkdesk-mock] 调用日志)
59
+ if (v !== null && typeof v === "object") return wrapNode(v as Record<string, unknown>, [...path, key]);
60
+ return v;
61
+ }
62
+ return missingApiStub([...path, key].join("."));
63
+ },
64
+ });
65
+ }
66
+
11
67
  export function injectDevMockApi(): void {
12
68
  if (typeof window === "undefined") return;
13
69
  if ((window as unknown as Record<string, unknown>).linkdesk) return;
14
70
 
15
- // path 跟踪代理:window.linkdesk.configuration.get() 报「configuration.get 未 mock」
16
- const makeNs = (path: string[]): unknown =>
17
- new Proxy(function () {
18
- /* placeholder: 调用时走 apply trap */
19
- } as unknown as () => unknown, {
20
- apply(): never {
21
- const dotted = path.join(".") || "(根)";
22
- throw new Error(
23
- `[dev] window.linkdesk${dotted ? "." + dotted : ""} 未 mock——该 API 仅在生产环境可用` +
24
- `(build → 装进 LinkDesk 走真实 IPC)。E6#27 生成 mock 落地前,UI 骨架开发请先不调真实 API。`,
25
- );
26
- },
27
- get(_target, prop): unknown {
28
- if (prop === "then") return undefined; // 防 Promise.resolve(proxy) 探测无限递归
29
- return makeNs([...path, String(prop)]);
30
- },
31
- });
32
-
33
- (window as unknown as Record<string, unknown>).linkdesk = makeNs([]);
71
+ (window as unknown as Record<string, unknown>).linkdesk = wrapNode(linkdeskMock, []);
34
72
  }
package/dist/bin.js CHANGED
@@ -14,6 +14,8 @@ import { build } from "vite";
14
14
  import { validatePluginJson } from "./validate.js";
15
15
  import { defineLinkdeskPluginConfig } from "./vite-config.js";
16
16
  import { runPluginDev } from "./dev-server.js";
17
+ import { runPluginDevReal } from "./dev-real.js";
18
+ import { runPluginPublish } from "./publish.js";
17
19
  import { runPluginLint, renderPluginLintReport } from "./eslint/lint.js";
18
20
  const VITE_CONFIG_FILES = [
19
21
  "vite.config.ts",
@@ -28,7 +30,14 @@ const USAGE = `linkdesk-plugin-sdk <command>
28
30
  命令:
29
31
  dev 在插件工程根起 dev 宿主(E6#24)——读 plugin.json → Vite dev server(端口 1421)
30
32
  → 浏览器打开纯前端预览 + HMR。只支持带 entry 的视图插件(脚手架 tab 形态)
33
+ dev --real E6#28.5 真机环——watch 作者源码 → 隔离单插件 build → 直写 {userData}/plugins/<id>
34
+ → CDP reload「LinkDesk Pool」(LinkDesk 须以 --remote-debugging-port=9222 启动)。
35
+ 真 IPC/串口/LSP 类插件的秒级真机调试(壳零新代码;LINKDESK_USER_PLUGINS_DIR /
36
+ LINKDESK_CDP_PORT 可覆盖)
31
37
  build 在插件工程根构建 .linkdesk-plugin(读 plugin.json → Vite build → zip)
38
+ publish 一键发布(E6#26)——自动链路:建 GitHub Release → 上传 .linkdesk-plugin → 更新工程
39
+ origin 仓库根 marketplace.json(多市场源模型)。发前预览确认;--yes 跳过(CI);
40
+ --dry-run 只预览不碰网络。token:env LINKDESK_GITHUB_TOKEN,或首跑交互输入存入本机
32
41
  validate 校验 plugin.json(参数 = 路径,默认 ./plugin.json)
33
42
  lint E6#54d 门禁(eslint 12 规则 + 三 check 双轨,全 WARN 永不 fail;知情绕行 =
34
43
  eslint-disable 注释)。参数 = 工程根,默认 process.cwd()
@@ -56,28 +65,58 @@ function cmdValidate(target) {
56
65
  console.error("❌ plugin.json 验证失败:");
57
66
  for (const e of res.errors)
58
67
  console.error(` ${e}`);
68
+ // 警告照打——错与「写法过期」是两件事,修错时一并看到(E6#91d)
69
+ for (const w of res.warnings ?? [])
70
+ console.warn(` ⚠ ${w}`);
59
71
  return 1;
60
72
  }
61
73
  console.log("✅ plugin.json 验证通过");
74
+ for (const w of res.warnings ?? [])
75
+ console.warn(` ⚠ ${w}`);
62
76
  return 0;
63
77
  }
64
78
  async function main() {
65
- const [, , command, arg] = process.argv;
79
+ const [, , command] = process.argv;
80
+ const rest = process.argv.slice(3); // 参数:dev --real / validate <path> / lint <root>
66
81
  let code;
67
82
  switch (command) {
68
- case "dev":
69
- // 挂起直到 Ctrl+C(server.close resolve)——dev 无退出码语义,正常退出 = 0
70
- await runPluginDev(process.cwd());
83
+ case "dev": {
84
+ // dev [--real]——真机环(E6#28.5):build→直写 userData/plugins→CDP reload;挂起直到 Ctrl+C
85
+ if (rest.includes("--real")) {
86
+ await runPluginDevReal(process.cwd());
87
+ }
88
+ else if (rest.some((a) => a.startsWith("-") && a !== "--real")) {
89
+ console.error(USAGE);
90
+ code = 1;
91
+ break;
92
+ }
93
+ else {
94
+ // 挂起直到 Ctrl+C(server.close 后 resolve)——dev 无退出码语义,正常退出 = 0
95
+ await runPluginDev(process.cwd());
96
+ }
71
97
  code = 0;
72
98
  break;
99
+ }
73
100
  case "build":
74
101
  code = await cmdBuild();
75
102
  break;
103
+ case "publish": {
104
+ // publish [--yes|--dry-run]——E6#26 自动发布链路(发前预览确认)
105
+ const flags = rest.filter((a) => a.startsWith("-"));
106
+ const unknown = flags.filter((a) => a !== "--yes" && a !== "--dry-run");
107
+ if (unknown.length > 0 || rest.some((a) => !a.startsWith("-"))) {
108
+ console.error(USAGE);
109
+ code = 1;
110
+ break;
111
+ }
112
+ code = await runPluginPublish(process.cwd(), { yes: rest.includes("--yes"), dryRun: rest.includes("--dry-run") });
113
+ break;
114
+ }
76
115
  case "validate":
77
- code = cmdValidate(arg ?? "plugin.json");
116
+ code = cmdValidate(rest[0] ?? "plugin.json");
78
117
  break;
79
118
  case "lint":
80
- code = await cmdLint(arg ?? process.cwd());
119
+ code = await cmdLint(rest[0] ?? process.cwd());
81
120
  break;
82
121
  default:
83
122
  console.error(USAGE);
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** CDP reload 端口默认 9222(与壳 dev electron:dev 尾部 --remote-debugging-port=9222 对齐);LINKDESK_CDP_PORT 覆盖 */
2
+ export declare const CDP_PORT: number;
3
+ /** 作者当前平台 LinkDesk userData/plugins 代码根(Electron 默认 userData = appData/<appName>,dev/打包同名 "linkdesk")。
4
+ * LINKDESK_USER_PLUGINS_DIR 环境变量可覆盖(自定义安装布局 / CI 隔离 userData 的逃生门)。 */
5
+ export declare function resolveUserPluginsDir(): string;
6
+ /**
7
+ * 经 CDP 刷新「LinkDesk Pool」窗口——renderer 重 import = 直写产物生效。返回是否找到并刷新成功。
8
+ *
9
+ * E6#28.5 真机自验实证(2026-09-07):单发 Page.reload 不足——`protocol.handle` 的 linkdesk:// 响应
10
+ * 无 Cache-Control 头 → Chromium 同 URL 二次请求命中缓存,index.bundle.js 陈旧副本永远被喂(直写磁盘
11
+ * 被遮蔽,protocol-debug.log 无新 200 行可证)。修复 = reload 前 Network.enable + Network.clearBrowserCache,
12
+ * 清掉缓存让 reload 后重 import 落到磁盘逐请求 readFileSync(纯 CDP,壳零代码)。
13
+ */
14
+ export declare function cdpReloadPool(port?: number): Promise<boolean>;
15
+ export interface RealLoopHooks {
16
+ /** 每次成功 build+直写后回调(默认 = CDP reload;测试/工具可注入) */
17
+ onInstalled?: (pluginId: string, targetDir: string) => Promise<void>;
18
+ }
19
+ /**
20
+ * 跑真机环并挂起进程(Ctrl+C → 关 watcher + 退出)。每次源码变更:debounce → 全量单插件 build →
21
+ * 直写 {userData}/plugins/<id> → CDP reload「LinkDesk Pool」。
22
+ */
23
+ export declare function runPluginDevReal(root: string): Promise<void>;
24
+ //# sourceMappingURL=dev-real.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-real.d.ts","sourceRoot":"","sources":["../src/dev-real.ts"],"names":[],"mappings":"AA4BA,wGAAwG;AACxG,eAAO,MAAM,QAAQ,QAAgD,CAAC;AAEtE;wEACwE;AACxE,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C;AAyED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCrE;AAkBD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqIlE"}