@interopio/iocd-cli 0.0.39 → 0.0.40

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 (83) hide show
  1. package/README.md +780 -779
  2. package/dist/services/installer/electronForge.js +5 -3
  3. package/dist/services/installer/electronForge.js.map +1 -1
  4. package/dist/services/installer/macOS.helper.js +0 -1
  5. package/dist/services/installer/macOS.helper.js.map +1 -1
  6. package/dist/services/license.service.js +14 -14
  7. package/dist/templates/groups/apps/groups/.gitignore.template +23 -23
  8. package/dist/templates/groups/apps/groups/README.md +15 -15
  9. package/dist/templates/groups/apps/groups/config/web-group-dev.json +12 -12
  10. package/dist/templates/groups/apps/groups/index.html +17 -17
  11. package/dist/templates/groups/apps/groups/iocd.app.json +19 -19
  12. package/dist/templates/groups/apps/groups/package.json +25 -25
  13. package/dist/templates/groups/apps/groups/public/manifest.json +24 -24
  14. package/dist/templates/groups/apps/groups/public/robots.txt +3 -3
  15. package/dist/templates/groups/apps/groups/src/App.css +38 -38
  16. package/dist/templates/groups/apps/groups/src/App.tsx +11 -11
  17. package/dist/templates/groups/apps/groups/src/index.css +13 -13
  18. package/dist/templates/groups/apps/groups/src/index.tsx +19 -19
  19. package/dist/templates/groups/apps/groups/vite.config.ts +8 -8
  20. package/dist/templates/groups/template.json +12 -12
  21. package/dist/templates/ioconnect-desktop/.github/actions/setup-smctl/action.yml +121 -121
  22. package/dist/templates/ioconnect-desktop/.github/workflows/build.yml +395 -395
  23. package/dist/templates/ioconnect-desktop/.gitignore.template +15 -15
  24. package/dist/templates/ioconnect-desktop/README.md +780 -779
  25. package/dist/templates/ioconnect-desktop/config/forge.config.js +59 -59
  26. package/dist/templates/ioconnect-desktop/config/iocd.cli.config.json +16 -16
  27. package/dist/templates/ioconnect-desktop/config/mac-build/entitlements.mac.plist +44 -44
  28. package/dist/templates/ioconnect-desktop/config/win-build/template.nuspectemplate +32 -32
  29. package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge +2 -2
  30. package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge-autoUpdate +9 -9
  31. package/dist/templates/ioconnect-desktop/package.json +33 -33
  32. package/dist/templates/ioconnect-desktop/template.json +6 -6
  33. package/dist/templates/launchpad/apps/launchpad/.eslintrc.json +3 -3
  34. package/dist/templates/launchpad/apps/launchpad/.gitignore.template +1 -1
  35. package/dist/templates/launchpad/apps/launchpad/config/iocd.app.def.dev.json +56 -56
  36. package/dist/templates/launchpad/apps/launchpad/config/iocd.system.build.json +2 -2
  37. package/dist/templates/launchpad/apps/launchpad/config/iocd.system.dev.json +2 -2
  38. package/dist/templates/launchpad/apps/launchpad/index.html +16 -16
  39. package/dist/templates/launchpad/apps/launchpad/iocd.app.json +27 -27
  40. package/dist/templates/launchpad/apps/launchpad/package-lock.json +2778 -2778
  41. package/dist/templates/launchpad/apps/launchpad/package.json +21 -21
  42. package/dist/templates/launchpad/apps/launchpad/src/app/app.tsx +41 -41
  43. package/dist/templates/launchpad/apps/launchpad/src/app/constants.ts +27 -27
  44. package/dist/templates/launchpad/apps/launchpad/src/components/logo.tsx +11 -11
  45. package/dist/templates/launchpad/apps/launchpad/src/components/main-context-menu.tsx +161 -161
  46. package/dist/templates/launchpad/apps/launchpad/src/components/notifications-button.tsx +44 -44
  47. package/dist/templates/launchpad/apps/launchpad/src/main.tsx +6 -6
  48. package/dist/templates/launchpad/apps/launchpad/src/styles.css +16 -16
  49. package/dist/templates/launchpad/apps/launchpad/tsconfig.json +10 -10
  50. package/dist/templates/launchpad/apps/launchpad/vite.config.ts +13 -13
  51. package/dist/templates/launchpad/template.json +12 -12
  52. package/dist/templates/splash/apps/splash/assets/styles/style.css +39 -39
  53. package/dist/templates/splash/apps/splash/iocd.app.json +7 -7
  54. package/dist/templates/splash/apps/splash/script.js +53 -53
  55. package/dist/templates/splash/apps/splash/splash.html +25 -25
  56. package/dist/templates/splash/template.json +12 -12
  57. package/dist/templates/tests/template.json +8 -8
  58. package/dist/templates/tests/tests/package-lock.json +7289 -7289
  59. package/dist/templates/tests/tests/package.json +22 -22
  60. package/dist/templates/tests/tests/tests/sample.spec.ts +30 -30
  61. package/dist/templates/tests/tests/tsconfig.json +10 -10
  62. package/dist/templates/tests/tests/wdio.config.ts +32 -32
  63. package/dist/templates/workspaces/apps/workspaces/README.md +15 -15
  64. package/dist/templates/workspaces/apps/workspaces/config/workspaces-dev.json +20 -20
  65. package/dist/templates/workspaces/apps/workspaces/index.html +17 -17
  66. package/dist/templates/workspaces/apps/workspaces/iocd.app.json +19 -19
  67. package/dist/templates/workspaces/apps/workspaces/package.json +29 -29
  68. package/dist/templates/workspaces/apps/workspaces/public/manifest.json +25 -25
  69. package/dist/templates/workspaces/apps/workspaces/public/robots.txt +3 -3
  70. package/dist/templates/workspaces/apps/workspaces/src/App.css +38 -38
  71. package/dist/templates/workspaces/apps/workspaces/src/App.tsx +102 -102
  72. package/dist/templates/workspaces/apps/workspaces/src/index.css +3 -3
  73. package/dist/templates/workspaces/apps/workspaces/src/index.tsx +28 -28
  74. package/dist/templates/workspaces/apps/workspaces/src/logo.svg +7 -7
  75. package/dist/templates/workspaces/apps/workspaces/src/reportWebVitals.ts +15 -15
  76. package/dist/templates/workspaces/apps/workspaces/src/setupTests.ts +5 -5
  77. package/dist/templates/workspaces/apps/workspaces/vite.config.ts +8 -8
  78. package/dist/templates/workspaces/template.json +12 -12
  79. package/package.json +83 -83
  80. package/scripts/copy-assets.js +19 -19
  81. package/scripts/delete-dist.js +12 -12
  82. package/scripts/generate-schema.js +50 -50
  83. package/scripts/handle-gitignore-templates.js +157 -157
@@ -1,396 +1,396 @@
1
- # Manual Release Build Workflow
2
- name: Build
3
-
4
- on:
5
- workflow_dispatch:
6
- inputs:
7
- build_windows:
8
- description: 'Build for Windows'
9
- required: true
10
- type: boolean
11
- default: true
12
- build_mac:
13
- description: 'Build for macOS'
14
- required: true
15
- type: boolean
16
- default: true
17
- windows_sign:
18
- description: 'Windows Code Signing Method'
19
- required: true
20
- type: choice
21
- default: 'off'
22
- options:
23
- - 'off'
24
- - 'signtool'
25
- release_notes:
26
- description: 'Release Notes'
27
- required: true
28
- type: string
29
- default: 'New release'
30
- prerelease:
31
- description: 'Mark as prerelease'
32
- required: true
33
- type: boolean
34
- default: true
35
-
36
- env:
37
- NODE_VERSION: '24'
38
-
39
- jobs:
40
- get-version:
41
- runs-on: ubuntu-latest
42
- outputs:
43
- version: ${{ steps.get_version.outputs.version }}
44
- steps:
45
- - name: Checkout code
46
- uses: actions/checkout@v4
47
-
48
- - name: Get version from package.json
49
- id: get_version
50
- run: |
51
- VERSION=$(node -p "require('./package.json').version")
52
- echo "version=$VERSION" >> $GITHUB_OUTPUT
53
- echo "Version: $VERSION"
54
-
55
- build-windows:
56
- if: ${{ inputs.build_windows }}
57
- runs-on: windows-latest
58
- timeout-minutes: 30
59
- needs: get-version
60
- env:
61
- IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
62
- WIN_CODE_SIGN_TYPE: ${{ inputs.windows_sign }}
63
- WIN_PFX_PATH: ${{ secrets.WIN_PFX_PATH }}
64
- WIN_PFX_PASS: ${{ secrets.WIN_PFX_PASS }}
65
- SM_API_KEY: ${{ secrets.SM_API_KEY }}
66
- SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
67
- SM_HOST: ${{ secrets.SM_HOST }}
68
- steps:
69
- - name: Checkout code
70
- uses: actions/checkout@v4
71
-
72
- - name: Setup Node.js
73
- uses: actions/setup-node@v4
74
- with:
75
- node-version: ${{ env.NODE_VERSION }}
76
- cache: 'npm'
77
-
78
- - name: Install dependencies
79
- run: npm install
80
-
81
- - name: Install latest @interopio/iocd-cli
82
- run: npm install @interopio/iocd-cli@latest
83
-
84
- - name: Setup project
85
- env:
86
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
87
- run: npm run setup
88
-
89
- # This step setup digicert
90
- - name: Setup SMCTL Code Signing
91
- if: ${{ env.SM_API_KEY != '' }}
92
- id: setup-smctl
93
- uses: ./.github/actions/setup-smctl
94
- with:
95
- api-key: ${{ secrets.SM_API_KEY }}
96
- client-cert-b64: ${{ secrets.SM_CLIENT_CERT_FILE }}
97
- client-cert-password: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
98
- keypair-name: ${{ secrets.SM_KEYPAIR_NAME }}
99
- host: ${{ secrets.SM_HOST }}
100
-
101
- - name: Set certificate file path
102
- if: ${{ env.SM_API_KEY != '' }}
103
- shell: cmd
104
- run: echo SM_CLIENT_CERT_FILE=${{ steps.setup-smctl.outputs.cert-file-path }} >> %GITHUB_ENV%
105
-
106
- - name: SMCTL Health Check
107
- if: ${{ env.SM_API_KEY != '' }}
108
- shell: cmd
109
- run: smctl healthcheck
110
-
111
- - name: Build application
112
- env:
113
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
114
- WIN_CERT_SHA1: ${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}
115
- shell: pwsh
116
- run: |
117
- # Add SMCTL to PATH
118
- $env:PATH = "C:\Program Files\DigiCert\DigiCert Keylocker Tools;$env:PATH"
119
-
120
- # Find and add signtool to PATH dynamically
121
- $sdkPath = "C:\Program Files (x86)\Windows Kits\10\bin"
122
- if (Test-Path $sdkPath) {
123
- $signtoolPath = Get-ChildItem -Path $sdkPath -Filter "signtool.exe" -Recurse -ErrorAction SilentlyContinue |
124
- Where-Object { $_.FullName -match "\\x64\\signtool.exe$" } |
125
- Select-Object -First 1 -ExpandProperty Directory
126
- if ($signtoolPath) {
127
- Write-Host "Found signtool at: $signtoolPath"
128
- $env:PATH = "$signtoolPath;$env:PATH"
129
- } else {
130
- Write-Host "Warning: signtool.exe not found in Windows SDK"
131
- }
132
- }
133
-
134
- npm run build-skip-install
135
-
136
- - name: Upload Windows artifacts
137
- uses: actions/upload-artifact@v4
138
- with:
139
- name: windows-artifacts
140
- path: dist/make/**/*
141
- if-no-files-found: error
142
-
143
- - name: Gather logs
144
- if: always()
145
- shell: bash
146
- run: |
147
- # Get the actual temp directory that Node.js uses
148
- NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
149
- echo "Node.js tmpdir: $NODEJS_TMPDIR"
150
- echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
151
-
152
- # Create logs collection directory
153
- mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
154
-
155
- # Copy from Node.js temp directory (where actual logs are)
156
- if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
157
- echo "Found Node.js temp log directory, contents:"
158
- ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
159
- cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
160
- else
161
- echo "Node.js temp log directory not found"
162
- fi
163
-
164
- # Also check GitHub Actions temp directory
165
- if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
166
- echo "Found GitHub Actions temp log directory"
167
- cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
168
- else
169
- echo "GitHub Actions temp log directory not found"
170
- fi
171
-
172
- - name: Upload Windows build logs
173
- if: always()
174
- uses: actions/upload-artifact@v4
175
- with:
176
- name: windows-build-logs
177
- path: |
178
- ./all-logs/**/*
179
- if-no-files-found: warn
180
-
181
- build-mac:
182
- if: ${{ inputs.build_mac }}
183
- runs-on: macos-latest
184
- timeout-minutes: 30
185
- needs: get-version
186
- env:
187
- IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
188
-
189
- steps:
190
- - name: Checkout code
191
- uses: actions/checkout@v4
192
-
193
- - name: Setup Node.js
194
- uses: actions/setup-node@v4
195
- with:
196
- node-version: ${{ env.NODE_VERSION }}
197
- cache: 'npm'
198
-
199
- - name: Install dependencies
200
- run: npm install
201
-
202
- - name: Install latest @interopio/iocd-cli
203
- run: npm install @interopio/iocd-cli@latest
204
-
205
- - name: Setup project
206
- env:
207
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
208
- run: npm run setup
209
-
210
- - name: Setup code-signing (MacOS only)
211
- uses: apple-actions/import-codesign-certs@v3
212
- with:
213
- p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
214
- p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
215
-
216
- - name: Build application
217
- env:
218
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
219
- APPLE_ID: ${{ secrets.APPLE_ID }}
220
- APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
221
- APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
222
- run: npm run build-skip-install
223
-
224
- - name: Upload macOS artifacts
225
- uses: actions/upload-artifact@v4
226
- with:
227
- name: mac-artifacts
228
- path: dist/make/**/*
229
- if-no-files-found: error
230
-
231
- - name: Collect and upload macOS build logs
232
- if: always()
233
- shell: bash
234
- run: |
235
- # Get the actual temp directory that Node.js uses
236
- NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
237
- echo "Node.js tmpdir: $NODEJS_TMPDIR"
238
- echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
239
-
240
- # Create logs collection directory
241
- mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
242
-
243
- # Copy from Node.js temp directory (where actual logs are)
244
- if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
245
- echo "Found Node.js temp log directory, contents:"
246
- ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
247
- cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
248
- else
249
- echo "Node.js temp log directory not found"
250
- fi
251
-
252
- # Also check GitHub Actions temp directory
253
- if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
254
- echo "Found GitHub Actions temp log directory"
255
- cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
256
- else
257
- echo "GitHub Actions temp log directory not found"
258
- fi
259
-
260
- - name: Upload macOS build logs
261
- if: always()
262
- uses: actions/upload-artifact@v4
263
- with:
264
- name: mac-build-logs
265
- path: |
266
- ./all-logs/**/*
267
- if-no-files-found: warn
268
-
269
- create-release:
270
- runs-on: ubuntu-latest
271
- needs: [get-version, build-windows, build-mac]
272
- if: always() && ((!inputs.build_windows || needs.build-windows.result == 'success') && (!inputs.build_mac || needs.build-mac.result == 'success') && (inputs.build_windows || inputs.build_mac))
273
-
274
- steps:
275
- - name: Checkout code
276
- uses: actions/checkout@v4
277
-
278
- - name: Download Windows artifacts
279
- if: ${{ inputs.build_windows && needs.build-windows.result == 'success' }}
280
- uses: actions/download-artifact@v4
281
- with:
282
- name: windows-artifacts
283
- path: ./artifacts/windows/
284
-
285
- - name: Download macOS artifacts
286
- if: ${{ inputs.build_mac && needs.build-mac.result == 'success' }}
287
- uses: actions/download-artifact@v4
288
- with:
289
- name: mac-artifacts
290
- path: ./artifacts/mac/
291
-
292
- - name: List all artifacts
293
- run: |
294
- echo "All downloaded artifacts:"
295
- find ./artifacts -type f -name "*.dmg" -o -name "*.zip" -o -name "*.exe" 2>/dev/null || echo "No artifacts found"
296
-
297
- - name: Delete existing release if exists
298
- env:
299
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
300
- run: |
301
- VERSION="${{ needs.get-version.outputs.version }}"
302
- echo "Checking for existing release v$VERSION..."
303
-
304
- # Try to delete existing release first
305
- if gh release view "v$VERSION" >/dev/null 2>&1; then
306
- echo "Found existing release v$VERSION, deleting..."
307
- gh release delete "v$VERSION" --yes
308
- echo "Release v$VERSION deleted"
309
- else
310
- echo "No existing release v$VERSION found"
311
- fi
312
-
313
- # Try to delete existing tag
314
- if git ls-remote --tags origin | grep -q "refs/tags/v$VERSION$"; then
315
- echo "Found existing tag v$VERSION, deleting..."
316
- git push --delete origin "v$VERSION"
317
- echo "Tag v$VERSION deleted"
318
- else
319
- echo "No existing tag v$VERSION found"
320
- fi
321
- continue-on-error: true
322
-
323
- - name: Create Release
324
- uses: softprops/action-gh-release@v2
325
- with:
326
- tag_name: v${{ needs.get-version.outputs.version }}
327
- name: Release v${{ needs.get-version.outputs.version }}
328
- body: ${{ inputs.release_notes }}
329
- draft: false
330
- prerelease: ${{ inputs.prerelease }}
331
- files: |
332
- ./artifacts/**/*.dmg
333
- ./artifacts/**/*.zip
334
- ./artifacts/**/*.exe
335
- env:
336
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
337
-
338
- summary:
339
- runs-on: ubuntu-latest
340
- needs: [get-version, build-windows, build-mac, create-release]
341
- if: always()
342
-
343
- steps:
344
- - name: Generate Summary
345
- run: |
346
- echo "# Workflow Summary" >> $GITHUB_STEP_SUMMARY
347
- echo "" >> $GITHUB_STEP_SUMMARY
348
- echo "## Build Results" >> $GITHUB_STEP_SUMMARY
349
- echo "- **Version**: v${{ needs.get-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
350
- echo "- **Windows Signing**: ${{ inputs.windows_sign }}" >> $GITHUB_STEP_SUMMARY
351
-
352
- # Windows Build Status
353
- if [[ "${{ inputs.build_windows }}" == "true" ]]; then
354
- if [[ "${{ needs.build-windows.result }}" == "success" ]]; then
355
- echo "- **Windows Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
356
- elif [[ "${{ needs.build-windows.result }}" == "failure" ]]; then
357
- echo "- **Windows Build**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
358
- else
359
- echo "- **Windows Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
360
- fi
361
- else
362
- echo "- **Windows Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
363
- fi
364
-
365
- # macOS Build Status
366
- if [[ "${{ inputs.build_mac }}" == "true" ]]; then
367
- if [[ "${{ needs.build-mac.result }}" == "success" ]]; then
368
- echo "- **macOS Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
369
- elif [[ "${{ needs.build-mac.result }}" == "failure" ]]; then
370
- echo "- **macOS Build**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
371
- else
372
- echo "- **macOS Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
373
- fi
374
- else
375
- echo "- **macOS Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
376
- fi
377
-
378
- # Release Status
379
- if [[ "${{ needs.create-release.result }}" == "success" ]]; then
380
- echo "- **Release Created**: ✅ Success" >> $GITHUB_STEP_SUMMARY
381
- elif [[ "${{ needs.create-release.result }}" == "failure" ]]; then
382
- echo "- **Release Created**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
383
- else
384
- echo "- **Release Created**: ⏭️ Skipped (builds failed/cancelled)" >> $GITHUB_STEP_SUMMARY
385
- fi
386
-
387
- echo "- **Prerelease**: ${{ inputs.prerelease && '✅ Yes' || '❌ No' }}" >> $GITHUB_STEP_SUMMARY
388
- echo "" >> $GITHUB_STEP_SUMMARY
389
- echo "## Release Notes" >> $GITHUB_STEP_SUMMARY
390
- echo "${{ inputs.release_notes }}" >> $GITHUB_STEP_SUMMARY
391
- echo "" >> $GITHUB_STEP_SUMMARY
392
- if [[ "${{ needs.create-release.result }}" == "success" ]]; then
393
- echo "🎉 **Release successfully created**: [v${{ needs.get-version.outputs.version }}](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.get-version.outputs.version }})" >> $GITHUB_STEP_SUMMARY
394
- else
395
- echo "⚠️ **Release creation failed or was skipped**" >> $GITHUB_STEP_SUMMARY
1
+ # Manual Release Build Workflow
2
+ name: Build
3
+
4
+ on:
5
+ workflow_dispatch:
6
+ inputs:
7
+ build_windows:
8
+ description: 'Build for Windows'
9
+ required: true
10
+ type: boolean
11
+ default: true
12
+ build_mac:
13
+ description: 'Build for macOS'
14
+ required: true
15
+ type: boolean
16
+ default: true
17
+ windows_sign:
18
+ description: 'Windows Code Signing Method'
19
+ required: true
20
+ type: choice
21
+ default: 'off'
22
+ options:
23
+ - 'off'
24
+ - 'signtool'
25
+ release_notes:
26
+ description: 'Release Notes'
27
+ required: true
28
+ type: string
29
+ default: 'New release'
30
+ prerelease:
31
+ description: 'Mark as prerelease'
32
+ required: true
33
+ type: boolean
34
+ default: true
35
+
36
+ env:
37
+ NODE_VERSION: '24'
38
+
39
+ jobs:
40
+ get-version:
41
+ runs-on: ubuntu-latest
42
+ outputs:
43
+ version: ${{ steps.get_version.outputs.version }}
44
+ steps:
45
+ - name: Checkout code
46
+ uses: actions/checkout@v4
47
+
48
+ - name: Get version from package.json
49
+ id: get_version
50
+ run: |
51
+ VERSION=$(node -p "require('./package.json').version")
52
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
53
+ echo "Version: $VERSION"
54
+
55
+ build-windows:
56
+ if: ${{ inputs.build_windows }}
57
+ runs-on: windows-latest
58
+ timeout-minutes: 30
59
+ needs: get-version
60
+ env:
61
+ IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
62
+ WIN_CODE_SIGN_TYPE: ${{ inputs.windows_sign }}
63
+ WIN_PFX_PATH: ${{ secrets.WIN_PFX_PATH }}
64
+ WIN_PFX_PASS: ${{ secrets.WIN_PFX_PASS }}
65
+ SM_API_KEY: ${{ secrets.SM_API_KEY }}
66
+ SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
67
+ SM_HOST: ${{ secrets.SM_HOST }}
68
+ steps:
69
+ - name: Checkout code
70
+ uses: actions/checkout@v4
71
+
72
+ - name: Setup Node.js
73
+ uses: actions/setup-node@v4
74
+ with:
75
+ node-version: ${{ env.NODE_VERSION }}
76
+ cache: 'npm'
77
+
78
+ - name: Install dependencies
79
+ run: npm install
80
+
81
+ - name: Install latest @interopio/iocd-cli
82
+ run: npm install @interopio/iocd-cli@latest
83
+
84
+ - name: Setup project
85
+ env:
86
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
87
+ run: npm run setup
88
+
89
+ # This step setup digicert
90
+ - name: Setup SMCTL Code Signing
91
+ if: ${{ env.SM_API_KEY != '' }}
92
+ id: setup-smctl
93
+ uses: ./.github/actions/setup-smctl
94
+ with:
95
+ api-key: ${{ secrets.SM_API_KEY }}
96
+ client-cert-b64: ${{ secrets.SM_CLIENT_CERT_FILE }}
97
+ client-cert-password: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
98
+ keypair-name: ${{ secrets.SM_KEYPAIR_NAME }}
99
+ host: ${{ secrets.SM_HOST }}
100
+
101
+ - name: Set certificate file path
102
+ if: ${{ env.SM_API_KEY != '' }}
103
+ shell: cmd
104
+ run: echo SM_CLIENT_CERT_FILE=${{ steps.setup-smctl.outputs.cert-file-path }} >> %GITHUB_ENV%
105
+
106
+ - name: SMCTL Health Check
107
+ if: ${{ env.SM_API_KEY != '' }}
108
+ shell: cmd
109
+ run: smctl healthcheck
110
+
111
+ - name: Build application
112
+ env:
113
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
114
+ WIN_CERT_SHA1: ${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}
115
+ shell: pwsh
116
+ run: |
117
+ # Add SMCTL to PATH
118
+ $env:PATH = "C:\Program Files\DigiCert\DigiCert Keylocker Tools;$env:PATH"
119
+
120
+ # Find and add signtool to PATH dynamically
121
+ $sdkPath = "C:\Program Files (x86)\Windows Kits\10\bin"
122
+ if (Test-Path $sdkPath) {
123
+ $signtoolPath = Get-ChildItem -Path $sdkPath -Filter "signtool.exe" -Recurse -ErrorAction SilentlyContinue |
124
+ Where-Object { $_.FullName -match "\\x64\\signtool.exe$" } |
125
+ Select-Object -First 1 -ExpandProperty Directory
126
+ if ($signtoolPath) {
127
+ Write-Host "Found signtool at: $signtoolPath"
128
+ $env:PATH = "$signtoolPath;$env:PATH"
129
+ } else {
130
+ Write-Host "Warning: signtool.exe not found in Windows SDK"
131
+ }
132
+ }
133
+
134
+ npm run build-skip-install
135
+
136
+ - name: Upload Windows artifacts
137
+ uses: actions/upload-artifact@v4
138
+ with:
139
+ name: windows-artifacts
140
+ path: dist/make/**/*
141
+ if-no-files-found: error
142
+
143
+ - name: Gather logs
144
+ if: always()
145
+ shell: bash
146
+ run: |
147
+ # Get the actual temp directory that Node.js uses
148
+ NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
149
+ echo "Node.js tmpdir: $NODEJS_TMPDIR"
150
+ echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
151
+
152
+ # Create logs collection directory
153
+ mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
154
+
155
+ # Copy from Node.js temp directory (where actual logs are)
156
+ if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
157
+ echo "Found Node.js temp log directory, contents:"
158
+ ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
159
+ cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
160
+ else
161
+ echo "Node.js temp log directory not found"
162
+ fi
163
+
164
+ # Also check GitHub Actions temp directory
165
+ if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
166
+ echo "Found GitHub Actions temp log directory"
167
+ cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
168
+ else
169
+ echo "GitHub Actions temp log directory not found"
170
+ fi
171
+
172
+ - name: Upload Windows build logs
173
+ if: always()
174
+ uses: actions/upload-artifact@v4
175
+ with:
176
+ name: windows-build-logs
177
+ path: |
178
+ ./all-logs/**/*
179
+ if-no-files-found: warn
180
+
181
+ build-mac:
182
+ if: ${{ inputs.build_mac }}
183
+ runs-on: macos-latest
184
+ timeout-minutes: 30
185
+ needs: get-version
186
+ env:
187
+ IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
188
+
189
+ steps:
190
+ - name: Checkout code
191
+ uses: actions/checkout@v4
192
+
193
+ - name: Setup Node.js
194
+ uses: actions/setup-node@v4
195
+ with:
196
+ node-version: ${{ env.NODE_VERSION }}
197
+ cache: 'npm'
198
+
199
+ - name: Install dependencies
200
+ run: npm install
201
+
202
+ - name: Install latest @interopio/iocd-cli
203
+ run: npm install @interopio/iocd-cli@latest
204
+
205
+ - name: Setup project
206
+ env:
207
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
208
+ run: npm run setup
209
+
210
+ - name: Setup code-signing (MacOS only)
211
+ uses: apple-actions/import-codesign-certs@v3
212
+ with:
213
+ p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
214
+ p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
215
+
216
+ - name: Build application
217
+ env:
218
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
219
+ APPLE_ID: ${{ secrets.APPLE_ID }}
220
+ APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
221
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
222
+ run: npm run build-skip-install
223
+
224
+ - name: Upload macOS artifacts
225
+ uses: actions/upload-artifact@v4
226
+ with:
227
+ name: mac-artifacts
228
+ path: dist/make/**/*
229
+ if-no-files-found: error
230
+
231
+ - name: Collect and upload macOS build logs
232
+ if: always()
233
+ shell: bash
234
+ run: |
235
+ # Get the actual temp directory that Node.js uses
236
+ NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
237
+ echo "Node.js tmpdir: $NODEJS_TMPDIR"
238
+ echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
239
+
240
+ # Create logs collection directory
241
+ mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
242
+
243
+ # Copy from Node.js temp directory (where actual logs are)
244
+ if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
245
+ echo "Found Node.js temp log directory, contents:"
246
+ ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
247
+ cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
248
+ else
249
+ echo "Node.js temp log directory not found"
250
+ fi
251
+
252
+ # Also check GitHub Actions temp directory
253
+ if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
254
+ echo "Found GitHub Actions temp log directory"
255
+ cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
256
+ else
257
+ echo "GitHub Actions temp log directory not found"
258
+ fi
259
+
260
+ - name: Upload macOS build logs
261
+ if: always()
262
+ uses: actions/upload-artifact@v4
263
+ with:
264
+ name: mac-build-logs
265
+ path: |
266
+ ./all-logs/**/*
267
+ if-no-files-found: warn
268
+
269
+ create-release:
270
+ runs-on: ubuntu-latest
271
+ needs: [get-version, build-windows, build-mac]
272
+ if: always() && ((!inputs.build_windows || needs.build-windows.result == 'success') && (!inputs.build_mac || needs.build-mac.result == 'success') && (inputs.build_windows || inputs.build_mac))
273
+
274
+ steps:
275
+ - name: Checkout code
276
+ uses: actions/checkout@v4
277
+
278
+ - name: Download Windows artifacts
279
+ if: ${{ inputs.build_windows && needs.build-windows.result == 'success' }}
280
+ uses: actions/download-artifact@v4
281
+ with:
282
+ name: windows-artifacts
283
+ path: ./artifacts/windows/
284
+
285
+ - name: Download macOS artifacts
286
+ if: ${{ inputs.build_mac && needs.build-mac.result == 'success' }}
287
+ uses: actions/download-artifact@v4
288
+ with:
289
+ name: mac-artifacts
290
+ path: ./artifacts/mac/
291
+
292
+ - name: List all artifacts
293
+ run: |
294
+ echo "All downloaded artifacts:"
295
+ find ./artifacts -type f -name "*.dmg" -o -name "*.zip" -o -name "*.exe" 2>/dev/null || echo "No artifacts found"
296
+
297
+ - name: Delete existing release if exists
298
+ env:
299
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
300
+ run: |
301
+ VERSION="${{ needs.get-version.outputs.version }}"
302
+ echo "Checking for existing release v$VERSION..."
303
+
304
+ # Try to delete existing release first
305
+ if gh release view "v$VERSION" >/dev/null 2>&1; then
306
+ echo "Found existing release v$VERSION, deleting..."
307
+ gh release delete "v$VERSION" --yes
308
+ echo "Release v$VERSION deleted"
309
+ else
310
+ echo "No existing release v$VERSION found"
311
+ fi
312
+
313
+ # Try to delete existing tag
314
+ if git ls-remote --tags origin | grep -q "refs/tags/v$VERSION$"; then
315
+ echo "Found existing tag v$VERSION, deleting..."
316
+ git push --delete origin "v$VERSION"
317
+ echo "Tag v$VERSION deleted"
318
+ else
319
+ echo "No existing tag v$VERSION found"
320
+ fi
321
+ continue-on-error: true
322
+
323
+ - name: Create Release
324
+ uses: softprops/action-gh-release@v2
325
+ with:
326
+ tag_name: v${{ needs.get-version.outputs.version }}
327
+ name: Release v${{ needs.get-version.outputs.version }}
328
+ body: ${{ inputs.release_notes }}
329
+ draft: false
330
+ prerelease: ${{ inputs.prerelease }}
331
+ files: |
332
+ ./artifacts/**/*.dmg
333
+ ./artifacts/**/*.zip
334
+ ./artifacts/**/*.exe
335
+ env:
336
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
337
+
338
+ summary:
339
+ runs-on: ubuntu-latest
340
+ needs: [get-version, build-windows, build-mac, create-release]
341
+ if: always()
342
+
343
+ steps:
344
+ - name: Generate Summary
345
+ run: |
346
+ echo "# Workflow Summary" >> $GITHUB_STEP_SUMMARY
347
+ echo "" >> $GITHUB_STEP_SUMMARY
348
+ echo "## Build Results" >> $GITHUB_STEP_SUMMARY
349
+ echo "- **Version**: v${{ needs.get-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
350
+ echo "- **Windows Signing**: ${{ inputs.windows_sign }}" >> $GITHUB_STEP_SUMMARY
351
+
352
+ # Windows Build Status
353
+ if [[ "${{ inputs.build_windows }}" == "true" ]]; then
354
+ if [[ "${{ needs.build-windows.result }}" == "success" ]]; then
355
+ echo "- **Windows Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
356
+ elif [[ "${{ needs.build-windows.result }}" == "failure" ]]; then
357
+ echo "- **Windows Build**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
358
+ else
359
+ echo "- **Windows Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
360
+ fi
361
+ else
362
+ echo "- **Windows Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
363
+ fi
364
+
365
+ # macOS Build Status
366
+ if [[ "${{ inputs.build_mac }}" == "true" ]]; then
367
+ if [[ "${{ needs.build-mac.result }}" == "success" ]]; then
368
+ echo "- **macOS Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
369
+ elif [[ "${{ needs.build-mac.result }}" == "failure" ]]; then
370
+ echo "- **macOS Build**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
371
+ else
372
+ echo "- **macOS Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
373
+ fi
374
+ else
375
+ echo "- **macOS Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
376
+ fi
377
+
378
+ # Release Status
379
+ if [[ "${{ needs.create-release.result }}" == "success" ]]; then
380
+ echo "- **Release Created**: ✅ Success" >> $GITHUB_STEP_SUMMARY
381
+ elif [[ "${{ needs.create-release.result }}" == "failure" ]]; then
382
+ echo "- **Release Created**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
383
+ else
384
+ echo "- **Release Created**: ⏭️ Skipped (builds failed/cancelled)" >> $GITHUB_STEP_SUMMARY
385
+ fi
386
+
387
+ echo "- **Prerelease**: ${{ inputs.prerelease && '✅ Yes' || '❌ No' }}" >> $GITHUB_STEP_SUMMARY
388
+ echo "" >> $GITHUB_STEP_SUMMARY
389
+ echo "## Release Notes" >> $GITHUB_STEP_SUMMARY
390
+ echo "${{ inputs.release_notes }}" >> $GITHUB_STEP_SUMMARY
391
+ echo "" >> $GITHUB_STEP_SUMMARY
392
+ if [[ "${{ needs.create-release.result }}" == "success" ]]; then
393
+ echo "🎉 **Release successfully created**: [v${{ needs.get-version.outputs.version }}](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.get-version.outputs.version }})" >> $GITHUB_STEP_SUMMARY
394
+ else
395
+ echo "⚠️ **Release creation failed or was skipped**" >> $GITHUB_STEP_SUMMARY
396
396
  fi