@interopio/iocd-cli 0.0.30 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +72 -72
  2. package/dist/schemas/iocd.cli.config.schema.json +4 -4
  3. package/dist/services/components/stores/github.store.js +0 -2
  4. package/dist/services/components/stores/github.store.js.map +1 -1
  5. package/dist/services/components/stores/local.store.js +2 -1
  6. package/dist/services/components/stores/local.store.js.map +1 -1
  7. package/dist/services/config/config.service.js +6 -1
  8. package/dist/services/config/config.service.js.map +1 -1
  9. package/dist/services/installer/windows.helper.js +11 -46
  10. package/dist/services/installer/windows.helper.js.map +1 -1
  11. package/dist/services/license.service.js +14 -14
  12. package/dist/templates/groups/apps/groups/.gitignore.template +23 -23
  13. package/dist/templates/groups/apps/groups/README.md +15 -15
  14. package/dist/templates/groups/apps/groups/config/web-group-dev.json +12 -12
  15. package/dist/templates/groups/apps/groups/index.html +17 -17
  16. package/dist/templates/groups/apps/groups/iocd.app.json +19 -19
  17. package/dist/templates/groups/apps/groups/package.json +25 -25
  18. package/dist/templates/groups/apps/groups/public/manifest.json +24 -24
  19. package/dist/templates/groups/apps/groups/public/robots.txt +3 -3
  20. package/dist/templates/groups/apps/groups/src/App.css +38 -38
  21. package/dist/templates/groups/apps/groups/src/App.tsx +11 -11
  22. package/dist/templates/groups/apps/groups/src/index.css +13 -13
  23. package/dist/templates/groups/apps/groups/src/index.tsx +19 -19
  24. package/dist/templates/groups/apps/groups/vite.config.ts +8 -8
  25. package/dist/templates/groups/template.json +12 -12
  26. package/dist/templates/ioconnect-desktop/.env.example +35 -41
  27. package/dist/templates/ioconnect-desktop/.github/actions/setup-smctl/action.yml +122 -0
  28. package/dist/templates/ioconnect-desktop/.github/workflows/build.yml +395 -327
  29. package/dist/templates/ioconnect-desktop/.gitignore.template +14 -14
  30. package/dist/templates/ioconnect-desktop/README.md +13 -13
  31. package/dist/templates/ioconnect-desktop/config/forge.config.js +59 -59
  32. package/dist/templates/ioconnect-desktop/config/iocd.cli.config.json +42 -42
  33. package/dist/templates/ioconnect-desktop/config/mac-build/entitlements.mac.plist +44 -44
  34. package/dist/templates/ioconnect-desktop/config/win-build/template.nuspectemplate +32 -32
  35. package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge +2 -2
  36. package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge-autoUpdate +9 -9
  37. package/dist/templates/ioconnect-desktop/package.json +32 -32
  38. package/dist/templates/ioconnect-desktop/template.json +6 -6
  39. package/dist/templates/launchpad/apps/launchpad/.eslintrc.json +3 -3
  40. package/dist/templates/launchpad/apps/launchpad/.gitignore.template +1 -1
  41. package/dist/templates/launchpad/apps/launchpad/config/iocd.app.def.dev.json +56 -56
  42. package/dist/templates/launchpad/apps/launchpad/config/iocd.system.build.json +2 -2
  43. package/dist/templates/launchpad/apps/launchpad/config/iocd.system.dev.json +2 -2
  44. package/dist/templates/launchpad/apps/launchpad/index.html +16 -16
  45. package/dist/templates/launchpad/apps/launchpad/iocd.app.json +27 -27
  46. package/dist/templates/launchpad/apps/launchpad/package-lock.json +2778 -2778
  47. package/dist/templates/launchpad/apps/launchpad/package.json +21 -21
  48. package/dist/templates/launchpad/apps/launchpad/src/app/app.tsx +41 -41
  49. package/dist/templates/launchpad/apps/launchpad/src/app/constants.ts +27 -27
  50. package/dist/templates/launchpad/apps/launchpad/src/components/logo.tsx +11 -11
  51. package/dist/templates/launchpad/apps/launchpad/src/components/main-context-menu.tsx +161 -161
  52. package/dist/templates/launchpad/apps/launchpad/src/components/notifications-button.tsx +44 -44
  53. package/dist/templates/launchpad/apps/launchpad/src/main.tsx +6 -6
  54. package/dist/templates/launchpad/apps/launchpad/src/styles.css +16 -16
  55. package/dist/templates/launchpad/apps/launchpad/tsconfig.json +10 -10
  56. package/dist/templates/launchpad/apps/launchpad/vite.config.ts +13 -13
  57. package/dist/templates/launchpad/template.json +12 -12
  58. package/dist/templates/splash/apps/splash/assets/styles/style.css +39 -39
  59. package/dist/templates/splash/apps/splash/iocd.app.json +7 -7
  60. package/dist/templates/splash/apps/splash/script.js +53 -53
  61. package/dist/templates/splash/apps/splash/splash.html +25 -25
  62. package/dist/templates/splash/template.json +12 -12
  63. package/dist/templates/tests/template.json +8 -8
  64. package/dist/templates/tests/tests/package-lock.json +7283 -7283
  65. package/dist/templates/tests/tests/package.json +22 -22
  66. package/dist/templates/tests/tests/tests/sample.spec.ts +30 -30
  67. package/dist/templates/tests/tests/tsconfig.json +10 -10
  68. package/dist/templates/tests/tests/wdio.config.ts +32 -32
  69. package/dist/templates/workspaces/apps/workspaces/README.md +15 -15
  70. package/dist/templates/workspaces/apps/workspaces/config/workspaces-dev.json +20 -20
  71. package/dist/templates/workspaces/apps/workspaces/index.html +17 -17
  72. package/dist/templates/workspaces/apps/workspaces/iocd.app.json +19 -19
  73. package/dist/templates/workspaces/apps/workspaces/package.json +29 -29
  74. package/dist/templates/workspaces/apps/workspaces/public/manifest.json +25 -25
  75. package/dist/templates/workspaces/apps/workspaces/public/robots.txt +3 -3
  76. package/dist/templates/workspaces/apps/workspaces/src/App.css +38 -38
  77. package/dist/templates/workspaces/apps/workspaces/src/App.tsx +102 -102
  78. package/dist/templates/workspaces/apps/workspaces/src/index.css +3 -3
  79. package/dist/templates/workspaces/apps/workspaces/src/index.tsx +28 -28
  80. package/dist/templates/workspaces/apps/workspaces/src/logo.svg +7 -7
  81. package/dist/templates/workspaces/apps/workspaces/src/reportWebVitals.ts +15 -15
  82. package/dist/templates/workspaces/apps/workspaces/src/setupTests.ts +5 -5
  83. package/dist/templates/workspaces/apps/workspaces/vite.config.ts +8 -8
  84. package/dist/templates/workspaces/template.json +12 -12
  85. package/package.json +83 -83
  86. package/scripts/copy-assets.js +15 -15
  87. package/scripts/delete-dist.js +12 -12
  88. package/scripts/generate-schema.js +50 -50
  89. package/scripts/handle-gitignore-templates.js +157 -157
  90. package/dist/templates/tests/tests/interopio-wdio-iocd-service-0.1.0.tgz +0 -0
@@ -1,328 +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
- release_notes:
18
- description: 'Release Notes'
19
- required: true
20
- type: string
21
- default: 'New release'
22
- prerelease:
23
- description: 'Mark as prerelease'
24
- required: true
25
- type: boolean
26
- default: true
27
-
28
- env:
29
- NODE_VERSION: '24'
30
-
31
- jobs:
32
- get-version:
33
- runs-on: ubuntu-latest
34
- outputs:
35
- version: ${{ steps.get_version.outputs.version }}
36
- steps:
37
- - name: Checkout code
38
- uses: actions/checkout@v4
39
-
40
- - name: Get version from package.json
41
- id: get_version
42
- run: |
43
- VERSION=$(node -p "require('./package.json').version")
44
- echo "version=$VERSION" >> $GITHUB_OUTPUT
45
- echo "Version: $VERSION"
46
-
47
- build-windows:
48
- if: ${{ inputs.build_windows }}
49
- runs-on: windows-latest
50
- timeout-minutes: 30
51
- needs: get-version
52
- env:
53
- IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
54
-
55
- steps:
56
- - name: Checkout code
57
- uses: actions/checkout@v4
58
-
59
- - name: Setup Node.js
60
- uses: actions/setup-node@v4
61
- with:
62
- node-version: ${{ env.NODE_VERSION }}
63
- cache: 'npm'
64
-
65
- - name: Install dependencies
66
- run: npm install
67
-
68
- - name: Install latest @interopio/iocd-cli
69
- run: npm install @interopio/iocd-cli@latest
70
-
71
- - name: Setup project
72
- env:
73
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
74
- run: npm run setup
75
-
76
- - name: Build application
77
- env:
78
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
79
- run: npm run build-skip-install
80
-
81
- - name: Upload Windows artifacts
82
- uses: actions/upload-artifact@v4
83
- with:
84
- name: windows-artifacts
85
- path: dist/make/**/*
86
- if-no-files-found: error
87
-
88
- - name: Collect and upload Windows build logs
89
- if: always()
90
- shell: bash
91
- run: |
92
- # Get the actual temp directory that Node.js uses
93
- NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
94
- echo "Node.js tmpdir: $NODEJS_TMPDIR"
95
- echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
96
-
97
- # Create logs collection directory
98
- mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
99
-
100
- # Copy from Node.js temp directory (where actual logs are)
101
- if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
102
- echo "Found Node.js temp log directory, contents:"
103
- ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
104
- cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
105
- else
106
- echo "Node.js temp log directory not found"
107
- fi
108
-
109
- # Also check GitHub Actions temp directory
110
- if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
111
- echo "Found GitHub Actions temp log directory"
112
- cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
113
- else
114
- echo "GitHub Actions temp log directory not found"
115
- fi
116
-
117
- - name: Upload Windows build logs
118
- if: always()
119
- uses: actions/upload-artifact@v4
120
- with:
121
- name: windows-build-logs
122
- path: |
123
- ./all-logs/**/*
124
- if-no-files-found: warn
125
-
126
- build-mac:
127
- if: ${{ inputs.build_mac }}
128
- runs-on: macos-latest
129
- timeout-minutes: 30
130
- needs: get-version
131
- env:
132
- IOCD_LICENSE_KEY: ${{ secrets.IOCD_LICENSE_KEY }}
133
-
134
- steps:
135
- - name: Checkout code
136
- uses: actions/checkout@v4
137
-
138
- - name: Setup Node.js
139
- uses: actions/setup-node@v4
140
- with:
141
- node-version: ${{ env.NODE_VERSION }}
142
- cache: 'npm'
143
-
144
- - name: Install dependencies
145
- run: npm install
146
-
147
- - name: Install latest @interopio/iocd-cli
148
- run: npm install @interopio/iocd-cli@latest
149
-
150
- - name: Setup project
151
- env:
152
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
153
- run: npm run setup
154
-
155
- - name: Setup code-signing (MacOS only)
156
- uses: apple-actions/import-codesign-certs@v3
157
- with:
158
- p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
159
- p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
160
-
161
- - name: Build application
162
- env:
163
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
164
- # code-signing environment variables
165
- MAC_CODE_SIGN_TYPE: keychain # keychain will use the certificate installed by apple-actions/import-codesign-certs
166
- # notarization environment variables
167
- MAC_NOTARIZATION_TYPE: notarytool
168
- MAC_NOTARIZATION_APPLE_ID: ${{ secrets.APPLE_ID }}
169
- MAC_NOTARIZATION_APPLE_ID_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
170
- MAC_NOTARIZATION_APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
171
- run: npm run build-skip-install
172
-
173
- - name: Upload macOS artifacts
174
- uses: actions/upload-artifact@v4
175
- with:
176
- name: mac-artifacts
177
- path: dist/make/**/*
178
- if-no-files-found: error
179
-
180
- - name: Collect and upload macOS build logs
181
- if: always()
182
- shell: bash
183
- run: |
184
- # Get the actual temp directory that Node.js uses
185
- NODEJS_TMPDIR=$(node -e "console.log(require('os').tmpdir())")
186
- echo "Node.js tmpdir: $NODEJS_TMPDIR"
187
- echo "Looking for logs in: $NODEJS_TMPDIR/@interopio-iocd-cli/"
188
-
189
- # Create logs collection directory
190
- mkdir -p ./all-logs/nodejs-temp ./all-logs/runner-temp
191
-
192
- # Copy from Node.js temp directory (where actual logs are)
193
- if [ -d "$NODEJS_TMPDIR/@interopio-iocd-cli" ]; then
194
- echo "Found Node.js temp log directory, contents:"
195
- ls -la "$NODEJS_TMPDIR/@interopio-iocd-cli/" || true
196
- cp -r "$NODEJS_TMPDIR/@interopio-iocd-cli" ./all-logs/nodejs-temp/ 2>/dev/null || echo "No files to copy from Node.js temp"
197
- else
198
- echo "Node.js temp log directory not found"
199
- fi
200
-
201
- # Also check GitHub Actions temp directory
202
- if [ -d "${{ runner.temp }}/@interopio-iocd-cli" ]; then
203
- echo "Found GitHub Actions temp log directory"
204
- cp -r "${{ runner.temp }}/@interopio-iocd-cli" ./all-logs/runner-temp/ 2>/dev/null || echo "No files to copy from runner temp"
205
- else
206
- echo "GitHub Actions temp log directory not found"
207
- fi
208
-
209
- - name: Upload macOS build logs
210
- if: always()
211
- uses: actions/upload-artifact@v4
212
- with:
213
- name: mac-build-logs
214
- path: |
215
- ./all-logs/**/*
216
- if-no-files-found: warn
217
-
218
- create-release:
219
- runs-on: ubuntu-latest
220
- needs: [get-version, build-windows, build-mac]
221
- if: always() && ((!inputs.build_windows || needs.build-windows.result == 'success') && (!inputs.build_mac || needs.build-mac.result == 'success') && (inputs.build_windows || inputs.build_mac))
222
-
223
- steps:
224
- - name: Checkout code
225
- uses: actions/checkout@v4
226
-
227
- - name: Download Windows artifacts
228
- if: ${{ inputs.build_windows && needs.build-windows.result == 'success' }}
229
- uses: actions/download-artifact@v4
230
- with:
231
- name: windows-artifacts
232
- path: ./artifacts/windows/
233
-
234
- - name: Download macOS artifacts
235
- if: ${{ inputs.build_mac && needs.build-mac.result == 'success' }}
236
- uses: actions/download-artifact@v4
237
- with:
238
- name: mac-artifacts
239
- path: ./artifacts/mac/
240
-
241
- - name: List all artifacts
242
- run: |
243
- echo "All downloaded artifacts:"
244
- find ./artifacts -type f -name "*.dmg" -o -name "*.zip" -o -name "*.exe" 2>/dev/null || echo "No artifacts found"
245
-
246
- - name: Delete existing release if exists
247
- env:
248
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
249
- run: |
250
- VERSION="${{ needs.get-version.outputs.version }}"
251
- # Try to delete existing release and tag
252
- gh release delete "v$VERSION" --yes || echo "Release v$VERSION does not exist"
253
- git push --delete origin "v$VERSION" || echo "Tag v$VERSION does not exist"
254
- continue-on-error: true
255
-
256
- - name: Create Release
257
- uses: softprops/action-gh-release@v2
258
- with:
259
- tag_name: v${{ needs.get-version.outputs.version }}
260
- name: Release v${{ needs.get-version.outputs.version }}
261
- body: ${{ inputs.release_notes }}
262
- draft: false
263
- prerelease: ${{ inputs.prerelease }}
264
- files: |
265
- ./artifacts/**/*.dmg
266
- ./artifacts/**/*.zip
267
- ./artifacts/**/*.exe
268
- env:
269
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
270
-
271
- summary:
272
- runs-on: ubuntu-latest
273
- needs: [get-version, build-windows, build-mac, create-release]
274
- if: always()
275
-
276
- steps:
277
- - name: Generate Summary
278
- run: |
279
- echo "# Workflow Summary" >> $GITHUB_STEP_SUMMARY
280
- echo "" >> $GITHUB_STEP_SUMMARY
281
- echo "## Build Results" >> $GITHUB_STEP_SUMMARY
282
- echo "- **Version**: v${{ needs.get-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
283
-
284
- # Windows Build Status
285
- if [[ "${{ inputs.build_windows }}" == "true" ]]; then
286
- if [[ "${{ needs.build-windows.result }}" == "success" ]]; then
287
- echo "- **Windows Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
288
- elif [[ "${{ needs.build-windows.result }}" == "failure" ]]; then
289
- echo "- **Windows Build**: ❌ Failed" >> $GITHUB_STEP_SUMMARY
290
- else
291
- echo "- **Windows Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
292
- fi
293
- else
294
- echo "- **Windows Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
295
- fi
296
-
297
- # macOS Build Status
298
- if [[ "${{ inputs.build_mac }}" == "true" ]]; then
299
- if [[ "${{ needs.build-mac.result }}" == "success" ]]; then
300
- echo "- **macOS Build**: ✅ Success" >> $GITHUB_STEP_SUMMARY
301
- elif [[ "${{ needs.build-mac.result }}" == "failure" ]]; then
302
- echo "- **macOS Build**: Failed" >> $GITHUB_STEP_SUMMARY
303
- else
304
- echo "- **macOS Build**: ⏸️ Cancelled/Skipped" >> $GITHUB_STEP_SUMMARY
305
- fi
306
- else
307
- echo "- **macOS Build**: ⏭️ Not Requested" >> $GITHUB_STEP_SUMMARY
308
- fi
309
-
310
- # Release Status
311
- if [[ "${{ needs.create-release.result }}" == "success" ]]; then
312
- echo "- **Release Created**: ✅ Success" >> $GITHUB_STEP_SUMMARY
313
- elif [[ "${{ needs.create-release.result }}" == "failure" ]]; then
314
- echo "- **Release Created**: Failed" >> $GITHUB_STEP_SUMMARY
315
- else
316
- echo "- **Release Created**: ⏭️ Skipped (builds failed/cancelled)" >> $GITHUB_STEP_SUMMARY
317
- fi
318
-
319
- echo "- **Prerelease**: ${{ inputs.prerelease && '✅ Yes' || '❌ No' }}" >> $GITHUB_STEP_SUMMARY
320
- echo "" >> $GITHUB_STEP_SUMMARY
321
- echo "## Release Notes" >> $GITHUB_STEP_SUMMARY
322
- echo "${{ inputs.release_notes }}" >> $GITHUB_STEP_SUMMARY
323
- echo "" >> $GITHUB_STEP_SUMMARY
324
- if [[ "${{ needs.create-release.result }}" == "success" ]]; then
325
- 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
326
- else
327
- 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
328
396
  fi