@leejungkiin/awkit 1.5.5 → 1.5.6

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.
Files changed (108) hide show
  1. package/bin/awk.js +188 -8
  2. package/core/GEMINI.md +15 -7
  3. package/core/work-modes.json +45 -0
  4. package/package.json +1 -1
  5. package/skill-packs/cocos2d/pack.json +8 -0
  6. package/skill-packs/cocos2d/skills/cocos2d-x/LICENSE.txt +8 -0
  7. package/skill-packs/cocos2d/skills/cocos2d-x/SKILL.md +168 -0
  8. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/action.md +278 -0
  9. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/animation.md +220 -0
  10. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/event.md +133 -0
  11. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/input.md +291 -0
  12. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/label.md +184 -0
  13. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/node-scene.md +212 -0
  14. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/scene.md +228 -0
  15. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/sprite.md +206 -0
  16. package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/texture.md +186 -0
  17. package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/about-engine.md +53 -0
  18. package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/installation.md +203 -0
  19. package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/quick-start.md +134 -0
  20. package/skill-packs/electron/pack.json +9 -0
  21. package/skill-packs/electron/skills/electron/LICENSE.txt +202 -0
  22. package/skill-packs/electron/skills/electron/SKILL.md +160 -0
  23. package/skill-packs/electron/skills/electron/api/app.md +83 -0
  24. package/skill-packs/electron/skills/electron/api/browser-window.md +84 -0
  25. package/skill-packs/electron/skills/electron/examples/advanced/packaging.md +140 -0
  26. package/skill-packs/electron/skills/electron/examples/api/browser-window.md +182 -0
  27. package/skill-packs/electron/skills/electron/examples/api/menu.md +187 -0
  28. package/skill-packs/electron/skills/electron/examples/getting-started/installation.md +88 -0
  29. package/skill-packs/electron/skills/electron/examples/getting-started/quick-start.md +104 -0
  30. package/skill-packs/electron/skills/electron/examples/processes/ipc-communication.md +140 -0
  31. package/skill-packs/electron/skills/electron/examples/processes/main-process.md +121 -0
  32. package/skill-packs/electron/skills/electron/templates/main-process.md +105 -0
  33. package/skill-packs/electron/skills/electron/templates/preload-script.md +84 -0
  34. package/skill-packs/electron/skills/electron-egg/LICENSE.txt +202 -0
  35. package/skill-packs/electron/skills/electron-egg/SKILL.md +154 -0
  36. package/skill-packs/electron/skills/electron-egg/api/config-api.md +62 -0
  37. package/skill-packs/electron/skills/electron-egg/api/ipc-api.md +55 -0
  38. package/skill-packs/electron/skills/electron-egg/api/main-api.md +54 -0
  39. package/skill-packs/electron/skills/electron-egg/api/renderer-api.md +62 -0
  40. package/skill-packs/electron/skills/electron-egg/api/window-api.md +64 -0
  41. package/skill-packs/electron/skills/electron-egg/examples/features/ipc-communication.md +84 -0
  42. package/skill-packs/electron/skills/electron-egg/examples/features/main-process.md +89 -0
  43. package/skill-packs/electron/skills/electron-egg/examples/features/renderer-process.md +74 -0
  44. package/skill-packs/electron/skills/electron-egg/examples/guide/build.md +77 -0
  45. package/skill-packs/electron/skills/electron-egg/examples/guide/configuration.md +88 -0
  46. package/skill-packs/electron/skills/electron-egg/examples/guide/installation.md +66 -0
  47. package/skill-packs/electron/skills/electron-egg/examples/guide/intro.md +47 -0
  48. package/skill-packs/electron/skills/electron-egg/examples/guide/project-structure.md +73 -0
  49. package/skill-packs/electron/skills/electron-egg/examples/guide/quick-start.md +78 -0
  50. package/skill-packs/electron/skills/electron-egg/templates/configuration.md +63 -0
  51. package/skill-packs/electron/skills/electron-egg/templates/installation.md +42 -0
  52. package/skill-packs/electron/skills/electron-egg/templates/project-setup.md +75 -0
  53. package/skill-packs/flutter/pack.json +9 -0
  54. package/skill-packs/flutter/skills/flutter/LICENSE.txt +202 -0
  55. package/skill-packs/flutter/skills/flutter/SKILL.md +127 -0
  56. package/skill-packs/flutter/skills/flutter-project-creater/LICENSE.txt +202 -0
  57. package/skill-packs/flutter/skills/flutter-project-creater/SKILL.md +106 -0
  58. package/skill-packs/threejs/pack.json +25 -0
  59. package/skill-packs/threejs/skills/README.md +95 -0
  60. package/skill-packs/threejs/skills/threejs-animation/SKILL.md +86 -0
  61. package/skill-packs/threejs/skills/threejs-animation/examples/workflow-mixer-action.md +20 -0
  62. package/skill-packs/threejs/skills/threejs-animation/references/official-sections.md +19 -0
  63. package/skill-packs/threejs/skills/threejs-audio/SKILL.md +112 -0
  64. package/skill-packs/threejs/skills/threejs-audio/examples/workflow-positional-audio.md +15 -0
  65. package/skill-packs/threejs/skills/threejs-audio/references/official-sections.md +16 -0
  66. package/skill-packs/threejs/skills/threejs-camera/SKILL.md +96 -0
  67. package/skill-packs/threejs/skills/threejs-camera/examples/workflow-perspective-resize.md +13 -0
  68. package/skill-packs/threejs/skills/threejs-controls/SKILL.md +101 -0
  69. package/skill-packs/threejs/skills/threejs-controls/examples/workflow-orbit-damping.md +15 -0
  70. package/skill-packs/threejs/skills/threejs-dev-setup/SKILL.md +102 -0
  71. package/skill-packs/threejs/skills/threejs-dev-setup/examples/workflow-scaffold.md +24 -0
  72. package/skill-packs/threejs/skills/threejs-geometries/SKILL.md +108 -0
  73. package/skill-packs/threejs/skills/threejs-geometries/examples/workflow-extrude-shape.md +13 -0
  74. package/skill-packs/threejs/skills/threejs-helpers/SKILL.md +103 -0
  75. package/skill-packs/threejs/skills/threejs-helpers/examples/workflow-light-camera-helpers.md +13 -0
  76. package/skill-packs/threejs/skills/threejs-lights/SKILL.md +103 -0
  77. package/skill-packs/threejs/skills/threejs-lights/examples/workflow-directional-shadow.md +17 -0
  78. package/skill-packs/threejs/skills/threejs-loaders/SKILL.md +89 -0
  79. package/skill-packs/threejs/skills/threejs-loaders/examples/workflow-gltf-draco.md +22 -0
  80. package/skill-packs/threejs/skills/threejs-loaders/references/official-sections.md +27 -0
  81. package/skill-packs/threejs/skills/threejs-materials/SKILL.md +102 -0
  82. package/skill-packs/threejs/skills/threejs-materials/examples/workflow-pbr-transparent.md +15 -0
  83. package/skill-packs/threejs/skills/threejs-math/SKILL.md +102 -0
  84. package/skill-packs/threejs/skills/threejs-math/examples/workflow-ray-aabb.md +11 -0
  85. package/skill-packs/threejs/skills/threejs-node-tsl/SKILL.md +83 -0
  86. package/skill-packs/threejs/skills/threejs-node-tsl/examples/workflow-tsl-entry.md +13 -0
  87. package/skill-packs/threejs/skills/threejs-node-tsl/references/official-links.md +8 -0
  88. package/skill-packs/threejs/skills/threejs-node-tsl/references/tsl-vs-classic.md +23 -0
  89. package/skill-packs/threejs/skills/threejs-objects/SKILL.md +111 -0
  90. package/skill-packs/threejs/skills/threejs-objects/examples/workflow-raycaster-pick.md +17 -0
  91. package/skill-packs/threejs/skills/threejs-postprocessing/SKILL.md +116 -0
  92. package/skill-packs/threejs/skills/threejs-postprocessing/examples/workflow-composer-bloom.md +15 -0
  93. package/skill-packs/threejs/skills/threejs-renderers/SKILL.md +91 -0
  94. package/skill-packs/threejs/skills/threejs-renderers/examples/workflow-renderer-resize.md +21 -0
  95. package/skill-packs/threejs/skills/threejs-renderers/references/official-sections.md +14 -0
  96. package/skill-packs/threejs/skills/threejs-scenes/SKILL.md +90 -0
  97. package/skill-packs/threejs/skills/threejs-scenes/examples/workflow-fog-background.md +13 -0
  98. package/skill-packs/threejs/skills/threejs-textures/SKILL.md +83 -0
  99. package/skill-packs/threejs/skills/threejs-textures/examples/workflow-pmrem-env.md +19 -0
  100. package/skill-packs/threejs/skills/threejs-webxr/SKILL.md +104 -0
  101. package/skill-packs/threejs/skills/threejs-webxr/examples/workflow-xr-button.md +15 -0
  102. package/skills/telegram-notify/SKILL.md +1 -0
  103. package/skills/trello-sync/SKILL.md +7 -0
  104. package/templates/project-identity/android.json +26 -1
  105. package/templates/project-identity/backend-nestjs.json +26 -1
  106. package/templates/project-identity/expo.json +26 -1
  107. package/templates/project-identity/ios.json +26 -1
  108. package/templates/project-identity/web-nextjs.json +26 -1
@@ -0,0 +1,187 @@
1
+ # Menu | 菜单
2
+
3
+ **官方文档**: https://www.electronjs.org/zh/docs/latest/,
4
+
5
+
6
+ ## Instructions
7
+
8
+ This example demonstrates how to use Menu to create application menus and context menus.
9
+
10
+ ### Key Concepts
11
+
12
+ - Application menu
13
+ - Context menu
14
+ - Menu items
15
+ - Menu roles
16
+ - Menu accelerators
17
+
18
+ ### Example: Application Menu
19
+
20
+ ```javascript
21
+ const { app, Menu } = require('electron')
22
+
23
+ const template = [
24
+ {
25
+ label: 'File',
26
+ submenu: [
27
+ {
28
+ label: 'New',
29
+ accelerator: 'CmdOrCtrl+N',
30
+ click: () => {
31
+ console.log('New file')
32
+ }
33
+ },
34
+ {
35
+ label: 'Open',
36
+ accelerator: 'CmdOrCtrl+O',
37
+ click: () => {
38
+ console.log('Open file')
39
+ }
40
+ },
41
+ { type: 'separator' },
42
+ {
43
+ label: 'Exit',
44
+ accelerator: process.platform === 'darwin' ? 'Cmd+Q' : 'Ctrl+Q',
45
+ click: () => {
46
+ app.quit()
47
+ }
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ label: 'Edit',
53
+ submenu: [
54
+ { role: 'undo', label: 'Undo' },
55
+ { role: 'redo', label: 'Redo' },
56
+ { type: 'separator' },
57
+ { role: 'cut', label: 'Cut' },
58
+ { role: 'copy', label: 'Copy' },
59
+ { role: 'paste', label: 'Paste' }
60
+ ]
61
+ },
62
+ {
63
+ label: 'View',
64
+ submenu: [
65
+ { role: 'reload', label: 'Reload' },
66
+ { role: 'forceReload', label: 'Force Reload' },
67
+ { role: 'toggleDevTools', label: 'Toggle Developer Tools' },
68
+ { type: 'separator' },
69
+ { role: 'resetZoom', label: 'Actual Size' },
70
+ { role: 'zoomIn', label: 'Zoom In' },
71
+ { role: 'zoomOut', label: 'Zoom Out' },
72
+ { type: 'separator' },
73
+ { role: 'togglefullscreen', label: 'Toggle Fullscreen' }
74
+ ]
75
+ },
76
+ {
77
+ label: 'Window',
78
+ submenu: [
79
+ { role: 'minimize', label: 'Minimize' },
80
+ { role: 'close', label: 'Close' }
81
+ ]
82
+ }
83
+ ]
84
+
85
+ // macOS: Add app menu
86
+ if (process.platform === 'darwin') {
87
+ template.unshift({
88
+ label: app.getName(),
89
+ submenu: [
90
+ { role: 'about', label: 'About' },
91
+ { type: 'separator' },
92
+ { role: 'services', label: 'Services' },
93
+ { type: 'separator' },
94
+ { role: 'hide', label: 'Hide' },
95
+ { role: 'hideOthers', label: 'Hide Others' },
96
+ { role: 'unhide', label: 'Show All' },
97
+ { type: 'separator' },
98
+ { role: 'quit', label: 'Quit' }
99
+ ]
100
+ })
101
+ }
102
+
103
+ const menu = Menu.buildFromTemplate(template)
104
+ Menu.setApplicationMenu(menu)
105
+ ```
106
+
107
+ ### Example: Context Menu
108
+
109
+ ```javascript
110
+ const { Menu, MenuItem } = require('electron')
111
+
112
+ // In preload.js
113
+ const { contextBridge } = require('electron')
114
+
115
+ contextBridge.exposeInMainWorld('electronAPI', {
116
+ showContextMenu: () => {
117
+ const menu = new Menu()
118
+
119
+ menu.append(new MenuItem({
120
+ label: 'Copy',
121
+ role: 'copy'
122
+ }))
123
+
124
+ menu.append(new MenuItem({
125
+ label: 'Paste',
126
+ role: 'paste'
127
+ }))
128
+
129
+ menu.append(new MenuItem({
130
+ type: 'separator'
131
+ }))
132
+
133
+ menu.append(new MenuItem({
134
+ label: 'Custom Action',
135
+ click: () => {
136
+ console.log('Custom action clicked')
137
+ }
138
+ }))
139
+
140
+ menu.popup()
141
+ }
142
+ })
143
+ ```
144
+
145
+ ### Example: Dynamic Menu
146
+
147
+ ```javascript
148
+ const { Menu } = require('electron')
149
+
150
+ function updateMenu(hasFile) {
151
+ const template = [
152
+ {
153
+ label: 'File',
154
+ submenu: [
155
+ {
156
+ label: 'New',
157
+ enabled: true,
158
+ click: () => createNewFile()
159
+ },
160
+ {
161
+ label: 'Open',
162
+ enabled: true,
163
+ click: () => openFile()
164
+ },
165
+ {
166
+ label: 'Save',
167
+ enabled: hasFile,
168
+ click: () => saveFile()
169
+ }
170
+ ]
171
+ }
172
+ ]
173
+
174
+ const menu = Menu.buildFromTemplate(template)
175
+ Menu.setApplicationMenu(menu)
176
+ }
177
+ ```
178
+
179
+ ### Key Points
180
+
181
+ - Use Menu.buildFromTemplate() to create menus
182
+ - Use Menu.setApplicationMenu() for app menu
183
+ - Use menu.popup() for context menus
184
+ - Use role property for standard menu items
185
+ - Use accelerator for keyboard shortcuts
186
+ - macOS requires special app menu structure
187
+ - Context menus should be created in preload or main process
@@ -0,0 +1,88 @@
1
+ # Installation | 安装
2
+
3
+ **官方文档**: https://www.electronjs.org/zh/docs/latest/,
4
+
5
+
6
+ ## Instructions
7
+
8
+ This example demonstrates how to install Electron and set up a basic project.
9
+
10
+ ### Key Concepts
11
+
12
+ - Installing Electron
13
+ - Project structure
14
+ - package.json configuration
15
+ - Running Electron app
16
+
17
+ ### Example: Installation
18
+
19
+ ```bash
20
+ # Using npm
21
+ npm install electron --save-dev
22
+
23
+ # Using yarn
24
+ yarn add electron --dev
25
+
26
+ # Using pnpm
27
+ pnpm add electron --save-dev
28
+ ```
29
+
30
+ ### Example: Basic package.json
31
+
32
+ ```json
33
+ {
34
+ "name": "my-electron-app",
35
+ "version": "1.0.0",
36
+ "description": "My Electron app",
37
+ "main": "main.js",
38
+ "scripts": {
39
+ "start": "electron .",
40
+ "dev": "electron ."
41
+ },
42
+ "devDependencies": {
43
+ "electron": "^latest"
44
+ }
45
+ }
46
+ ```
47
+
48
+ ### Example: Project Structure
49
+
50
+ ```
51
+ my-electron-app/
52
+ ├── main.js # Main process entry point
53
+ ├── preload.js # Preload script (optional)
54
+ ├── renderer/
55
+ │ ├── index.html # Renderer HTML
56
+ │ └── renderer.js # Renderer script
57
+ ├── package.json
58
+ └── README.md
59
+ ```
60
+
61
+ ### Example: Running the App
62
+
63
+ ```bash
64
+ # Start the app
65
+ npm start
66
+
67
+ # Or directly
68
+ npx electron .
69
+ ```
70
+
71
+ ### Example: Using Electron Forge
72
+
73
+ ```bash
74
+ # Create new project with Electron Forge
75
+ npm create electron-app@latest my-app
76
+
77
+ # Or add to existing project
78
+ npx @electron-forge/cli import
79
+ ```
80
+
81
+ ### Key Points
82
+
83
+ - Install Electron as dev dependency
84
+ - Set `main` field in package.json to main process file
85
+ - Use `electron .` to run the app
86
+ - Main process file (main.js) is required
87
+ - Electron Forge can scaffold projects automatically
88
+ - Works on Windows, macOS, and Linux
@@ -0,0 +1,104 @@
1
+ # Quick Start | 快速开始
2
+
3
+ **官方文档**: https://www.electronjs.org/zh/docs/latest/,
4
+
5
+
6
+ ## Instructions
7
+
8
+ This example demonstrates how to create a basic Electron application.
9
+
10
+ ### Key Concepts
11
+
12
+ - Main process setup
13
+ - Creating BrowserWindow
14
+ - Loading HTML content
15
+ - App lifecycle
16
+
17
+ ### Example: Basic main.js
18
+
19
+ ```javascript
20
+ // main.js
21
+ const { app, BrowserWindow } = require('electron')
22
+ const path = require('path')
23
+
24
+ function createWindow() {
25
+ const win = new BrowserWindow({
26
+ width: 800,
27
+ height: 600,
28
+ webPreferences: {
29
+ preload: path.join(__dirname, 'preload.js')
30
+ }
31
+ })
32
+
33
+ win.loadFile('index.html')
34
+ }
35
+
36
+ app.whenReady().then(() => {
37
+ createWindow()
38
+
39
+ app.on('activate', () => {
40
+ if (BrowserWindow.getAllWindows().length === 0) {
41
+ createWindow()
42
+ }
43
+ })
44
+ })
45
+
46
+ app.on('window-all-closed', () => {
47
+ if (process.platform !== 'darwin') {
48
+ app.quit()
49
+ }
50
+ })
51
+ ```
52
+
53
+ ### Example: Basic index.html
54
+
55
+ ```html
56
+ <!DOCTYPE html>
57
+ <html>
58
+ <head>
59
+ <meta charset="UTF-8">
60
+ <title>Hello Electron</title>
61
+ </head>
62
+ <body>
63
+ <h1>Hello Electron!</h1>
64
+ <p>Welcome to Electron</p>
65
+ <script src="renderer.js"></script>
66
+ </body>
67
+ </html>
68
+ ```
69
+
70
+ ### Example: Basic preload.js
71
+
72
+ ```javascript
73
+ // preload.js
74
+ const { contextBridge, ipcRenderer } = require('electron')
75
+
76
+ // Expose protected methods that allow the renderer process to use
77
+ // the ipcRenderer without exposing the entire object
78
+ contextBridge.exposeInMainWorld('electronAPI', {
79
+ openFile: () => ipcRenderer.invoke('dialog:openFile')
80
+ })
81
+ ```
82
+
83
+ ### Example: Basic renderer.js
84
+
85
+ ```javascript
86
+ // renderer.js
87
+ document.addEventListener('DOMContentLoaded', () => {
88
+ console.log('Renderer process loaded')
89
+
90
+ // Use exposed API from preload
91
+ window.electronAPI.openFile().then(result => {
92
+ console.log('File selected:', result)
93
+ })
94
+ })
95
+ ```
96
+
97
+ ### Key Points
98
+
99
+ - Main process (main.js) controls app lifecycle
100
+ - BrowserWindow creates application windows
101
+ - loadFile() loads local HTML files
102
+ - Preload scripts bridge main and renderer safely
103
+ - Renderer process runs web content
104
+ - Use contextBridge for secure IPC exposure
@@ -0,0 +1,140 @@
1
+ # IPC Communication | IPC 通信
2
+
3
+ **官方文档**: https://www.electronjs.org/zh/docs/latest/,
4
+
5
+
6
+ ## Instructions
7
+
8
+ This example demonstrates IPC (Inter-Process Communication) between main and renderer processes.
9
+
10
+ ### Key Concepts
11
+
12
+ - ipcMain in main process
13
+ - ipcRenderer in renderer process
14
+ - contextBridge for secure exposure
15
+ - Two-way communication
16
+
17
+ ### Example: Basic IPC Setup
18
+
19
+ ```javascript
20
+ // main.js
21
+ const { app, BrowserWindow, ipcMain } = require('electron')
22
+ const path = require('path')
23
+
24
+ let mainWindow
25
+
26
+ function createWindow() {
27
+ mainWindow = new BrowserWindow({
28
+ width: 800,
29
+ height: 600,
30
+ webPreferences: {
31
+ preload: path.join(__dirname, 'preload.js'),
32
+ contextIsolation: true,
33
+ nodeIntegration: false
34
+ }
35
+ })
36
+
37
+ mainWindow.loadFile('index.html')
38
+ }
39
+
40
+ // Handle IPC from renderer
41
+ ipcMain.handle('get-app-version', () => {
42
+ return app.getVersion()
43
+ })
44
+
45
+ ipcMain.on('window-minimize', () => {
46
+ mainWindow.minimize()
47
+ })
48
+
49
+ app.whenReady().then(() => {
50
+ createWindow()
51
+ })
52
+ ```
53
+
54
+ ### Example: Preload Script
55
+
56
+ ```javascript
57
+ // preload.js
58
+ const { contextBridge, ipcRenderer } = require('electron')
59
+
60
+ // Expose safe API to renderer
61
+ contextBridge.exposeInMainWorld('electronAPI', {
62
+ getVersion: () => ipcRenderer.invoke('get-app-version'),
63
+ minimizeWindow: () => ipcRenderer.send('window-minimize'),
64
+
65
+ // Two-way communication
66
+ openFile: () => ipcRenderer.invoke('dialog:openFile'),
67
+
68
+ // Listen to main process
69
+ onUpdateAvailable: (callback) => {
70
+ ipcRenderer.on('update-available', (event, data) => callback(data))
71
+ }
72
+ })
73
+ ```
74
+
75
+ ### Example: Renderer Process
76
+
77
+ ```javascript
78
+ // renderer.js
79
+ document.addEventListener('DOMContentLoaded', () => {
80
+ // Get app version
81
+ window.electronAPI.getVersion().then(version => {
82
+ console.log('App version:', version)
83
+ })
84
+
85
+ // Minimize window
86
+ document.getElementById('minimize-btn').addEventListener('click', () => {
87
+ window.electronAPI.minimizeWindow()
88
+ })
89
+
90
+ // Open file dialog
91
+ document.getElementById('open-file-btn').addEventListener('click', async () => {
92
+ const result = await window.electronAPI.openFile()
93
+ console.log('Selected file:', result)
94
+ })
95
+
96
+ // Listen for updates
97
+ window.electronAPI.onUpdateAvailable((data) => {
98
+ console.log('Update available:', data)
99
+ })
100
+ })
101
+ ```
102
+
103
+ ### Example: Advanced IPC Patterns
104
+
105
+ ```javascript
106
+ // main.js
107
+ const { ipcMain, dialog } = require('electron')
108
+
109
+ // Handle with async response
110
+ ipcMain.handle('dialog:openFile', async () => {
111
+ const { canceled, filePaths } = await dialog.showOpenDialog({
112
+ properties: ['openFile']
113
+ })
114
+
115
+ if (!canceled) {
116
+ return filePaths[0]
117
+ }
118
+ return null
119
+ })
120
+
121
+ // Send to renderer
122
+ ipcMain.on('check-updates', () => {
123
+ // Simulate update check
124
+ setTimeout(() => {
125
+ mainWindow.webContents.send('update-available', {
126
+ version: '1.0.1',
127
+ url: 'https://example.com/update'
128
+ })
129
+ }, 2000)
130
+ })
131
+ ```
132
+
133
+ ### Key Points
134
+
135
+ - Use ipcMain.handle() for request-response pattern
136
+ - Use ipcMain.on() for one-way communication
137
+ - Use contextBridge.exposeInMainWorld() for secure API exposure
138
+ - Never expose ipcRenderer directly to renderer
139
+ - Use contextIsolation: true and nodeIntegration: false
140
+ - IPC enables safe communication between processes
@@ -0,0 +1,121 @@
1
+ # Main Process | 主进程
2
+
3
+ **官方文档**: https://www.electronjs.org/zh/docs/latest/,
4
+
5
+
6
+ ## Instructions
7
+
8
+ This example demonstrates main process concepts and usage in Electron.
9
+
10
+ ### Key Concepts
11
+
12
+ - Main process role
13
+ - App lifecycle events
14
+ - Creating windows
15
+ - Managing application state
16
+
17
+ ### Example: App Lifecycle
18
+
19
+ ```javascript
20
+ // main.js
21
+ const { app, BrowserWindow } = require('electron')
22
+
23
+ let mainWindow
24
+
25
+ function createWindow() {
26
+ mainWindow = new BrowserWindow({
27
+ width: 800,
28
+ height: 600,
29
+ webPreferences: {
30
+ nodeIntegration: false,
31
+ contextIsolation: true,
32
+ preload: path.join(__dirname, 'preload.js')
33
+ }
34
+ })
35
+
36
+ mainWindow.loadFile('index.html')
37
+
38
+ mainWindow.on('closed', () => {
39
+ mainWindow = null
40
+ })
41
+ }
42
+
43
+ // App ready
44
+ app.whenReady().then(() => {
45
+ createWindow()
46
+ })
47
+
48
+ // macOS: Re-open window when dock icon is clicked
49
+ app.on('activate', () => {
50
+ if (BrowserWindow.getAllWindows().length === 0) {
51
+ createWindow()
52
+ }
53
+ })
54
+
55
+ // Quit when all windows are closed (except macOS)
56
+ app.on('window-all-closed', () => {
57
+ if (process.platform !== 'darwin') {
58
+ app.quit()
59
+ }
60
+ })
61
+ ```
62
+
63
+ ### Example: App Events
64
+
65
+ ```javascript
66
+ const { app } = require('electron')
67
+
68
+ // Before app quits
69
+ app.on('before-quit', (event) => {
70
+ console.log('App is about to quit')
71
+ })
72
+
73
+ // Will quit
74
+ app.on('will-quit', (event) => {
75
+ console.log('App will quit')
76
+ })
77
+
78
+ // Quit
79
+ app.on('quit', () => {
80
+ console.log('App quit')
81
+ })
82
+
83
+ // Second instance
84
+ app.on('second-instance', () => {
85
+ // Focus existing window
86
+ if (mainWindow) {
87
+ if (mainWindow.isMinimized()) mainWindow.restore()
88
+ mainWindow.focus()
89
+ }
90
+ })
91
+ ```
92
+
93
+ ### Example: Single Instance App
94
+
95
+ ```javascript
96
+ const { app } = require('electron')
97
+
98
+ const gotTheLock = app.requestSingleInstanceLock()
99
+
100
+ if (!gotTheLock) {
101
+ app.quit()
102
+ } else {
103
+ app.on('second-instance', () => {
104
+ // Handle second instance
105
+ })
106
+
107
+ // Continue with app initialization
108
+ app.whenReady().then(() => {
109
+ createWindow()
110
+ })
111
+ }
112
+ ```
113
+
114
+ ### Key Points
115
+
116
+ - Main process manages app lifecycle
117
+ - Use app.whenReady() before creating windows
118
+ - Handle window-all-closed for proper quit behavior
119
+ - macOS requires special handling for dock icon
120
+ - Use requestSingleInstanceLock() for single instance apps
121
+ - Main process has full Node.js access