@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,13 +1,13 @@
1
- {
2
- "name": "web-group-app",
3
- "type": "webGroup",
4
- "hidden": true,
5
- "details": {
6
- "url": "http://localhost:5175/",
7
- "captureErrors": true,
8
- "preloadScripts": [],
9
- "pool": {
10
- "min": 5
11
- }
12
- }
1
+ {
2
+ "name": "web-group-app",
3
+ "type": "webGroup",
4
+ "hidden": true,
5
+ "details": {
6
+ "url": "http://localhost:5175/",
7
+ "captureErrors": true,
8
+ "preloadScripts": [],
9
+ "pool": {
10
+ "min": 5
11
+ }
12
+ }
13
13
  }
@@ -1,18 +1,18 @@
1
- <!doctype html>
2
- <html lang="en" style="height: 100%;">
3
-
4
- <head>
5
- <meta charset="utf-8" />
6
- <link rel="shortcut icon" href="/favicon.ico" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
8
- <meta name="theme-color" content="#000000" />
9
- <link rel="manifest" href="/manifest.json" />
10
- <title>{{name}}</title>
11
- </head>
12
-
13
- <body style="overflow: hidden; margin: 0px; height: 100%; width: 100%;">
14
- <div id="root" style="display: flex; flex-direction: row; overflow: hidden; height: 100%; width: 100%;"></div>
15
- <script type="module" src="/src/index.tsx"></script>
16
- </body>
17
-
1
+ <!doctype html>
2
+ <html lang="en" style="height: 100%;">
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <link rel="shortcut icon" href="/favicon.ico" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
8
+ <meta name="theme-color" content="#000000" />
9
+ <link rel="manifest" href="/manifest.json" />
10
+ <title>{{name}}</title>
11
+ </head>
12
+
13
+ <body style="overflow: hidden; margin: 0px; height: 100%; width: 100%;">
14
+ <div id="root" style="display: flex; flex-direction: row; overflow: hidden; height: 100%; width: 100%;"></div>
15
+ <script type="module" src="/src/index.tsx"></script>
16
+ </body>
17
+
18
18
  </html>
@@ -1,20 +1,20 @@
1
- {
2
- "dev": {
3
- "script": "start",
4
- "modifications": [
5
- {
6
- "source": "/config/web-group-dev.json",
7
- "destination": "/modifications/dev/iocd/config/apps/webGroup.json"
8
- }
9
- ]
10
- },
11
- "build": {
12
- "script": "build",
13
- "modifications": [
14
- {
15
- "source": "/dist/",
16
- "destination": "/modifications/build/iocd/assets/webGroups/app-react"
17
- }
18
- ]
19
- }
1
+ {
2
+ "dev": {
3
+ "script": "start",
4
+ "modifications": [
5
+ {
6
+ "source": "/config/web-group-dev.json",
7
+ "destination": "/modifications/dev/iocd/config/apps/webGroup.json"
8
+ }
9
+ ]
10
+ },
11
+ "build": {
12
+ "script": "build",
13
+ "modifications": [
14
+ {
15
+ "source": "/dist/",
16
+ "destination": "/modifications/build/iocd/assets/webGroups/app-react"
17
+ }
18
+ ]
19
+ }
20
20
  }
@@ -1,26 +1,26 @@
1
- {
2
- "name": "groups-react",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "scripts": {
7
- "start": "vite --port 5175",
8
- "build": "tsc -b && vite build"
9
- },
10
- "dependencies": {
11
- "@interopio/desktop": "^6.8.4",
12
- "@interopio/groups-ui-react": "^3.0.0",
13
- "@interopio/react-hooks": "^3.5.12",
14
- "react": "18.0.0",
15
- "react-dom": "18.0.0"
16
- },
17
- "devDependencies": {
18
- "@types/node": "^22.8.6",
19
- "@types/react": "^18.3.12",
20
- "@types/react-dom": "^18.3.1",
21
- "@vitejs/plugin-react": "^4.3.3",
22
- "globals": "^15.11.0",
23
- "vite": "^7.1.5",
24
- "typescript": "^4.6.4"
25
- }
1
+ {
2
+ "name": "groups-react",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "start": "vite --port 5175",
8
+ "build": "tsc -b && vite build"
9
+ },
10
+ "dependencies": {
11
+ "@interopio/desktop": "^6.8.4",
12
+ "@interopio/groups-ui-react": "^3.0.0",
13
+ "@interopio/react-hooks": "^3.5.12",
14
+ "react": "18.0.0",
15
+ "react-dom": "18.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.8.6",
19
+ "@types/react": "^18.3.12",
20
+ "@types/react-dom": "^18.3.1",
21
+ "@vitejs/plugin-react": "^4.3.3",
22
+ "globals": "^15.11.0",
23
+ "vite": "^7.1.5",
24
+ "typescript": "^4.6.4"
25
+ }
26
26
  }
@@ -1,25 +1,25 @@
1
- {
2
- "short_name": "io.Connect Web Group App",
3
- "name": "io.Connect Web Group App",
4
- "icons": [
5
- {
6
- "src": "favicon.ico",
7
- "sizes": "64x64 32x32 24x24 16x16",
8
- "type": "image/x-icon"
9
- },
10
- {
11
- "src": "logo192.png",
12
- "type": "image/png",
13
- "sizes": "192x192"
14
- },
15
- {
16
- "src": "logo512.png",
17
- "type": "image/png",
18
- "sizes": "512x512"
19
- }
20
- ],
21
- "start_url": ".",
22
- "display": "standalone",
23
- "theme_color": "#000000",
24
- "background_color": "#ffffff"
1
+ {
2
+ "short_name": "io.Connect Web Group App",
3
+ "name": "io.Connect Web Group App",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ },
10
+ {
11
+ "src": "logo192.png",
12
+ "type": "image/png",
13
+ "sizes": "192x192"
14
+ },
15
+ {
16
+ "src": "logo512.png",
17
+ "type": "image/png",
18
+ "sizes": "512x512"
19
+ }
20
+ ],
21
+ "start_url": ".",
22
+ "display": "standalone",
23
+ "theme_color": "#000000",
24
+ "background_color": "#ffffff"
25
25
  }
@@ -1,3 +1,3 @@
1
- # https://www.robotstxt.org/robotstxt.html
2
- User-agent: *
3
- Disallow:
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
@@ -1,38 +1,38 @@
1
- .App {
2
- text-align: center;
3
- }
4
-
5
- .App-logo {
6
- height: 40vmin;
7
- pointer-events: none;
8
- }
9
-
10
- @media (prefers-reduced-motion: no-preference) {
11
- .App-logo {
12
- animation: App-logo-spin infinite 20s linear;
13
- }
14
- }
15
-
16
- .App-header {
17
- background-color: #282c34;
18
- min-height: 100vh;
19
- display: flex;
20
- flex-direction: column;
21
- align-items: center;
22
- justify-content: center;
23
- font-size: calc(10px + 2vmin);
24
- color: white;
25
- }
26
-
27
- .App-link {
28
- color: #61dafb;
29
- }
30
-
31
- @keyframes App-logo-spin {
32
- from {
33
- transform: rotate(0deg);
34
- }
35
- to {
36
- transform: rotate(360deg);
37
- }
38
- }
1
+ .App {
2
+ text-align: center;
3
+ }
4
+
5
+ .App-logo {
6
+ height: 40vmin;
7
+ pointer-events: none;
8
+ }
9
+
10
+ @media (prefers-reduced-motion: no-preference) {
11
+ .App-logo {
12
+ animation: App-logo-spin infinite 20s linear;
13
+ }
14
+ }
15
+
16
+ .App-header {
17
+ background-color: #282c34;
18
+ min-height: 100vh;
19
+ display: flex;
20
+ flex-direction: column;
21
+ align-items: center;
22
+ justify-content: center;
23
+ font-size: calc(10px + 2vmin);
24
+ color: white;
25
+ }
26
+
27
+ .App-link {
28
+ color: #61dafb;
29
+ }
30
+
31
+ @keyframes App-logo-spin {
32
+ from {
33
+ transform: rotate(0deg);
34
+ }
35
+ to {
36
+ transform: rotate(360deg);
37
+ }
38
+ }
@@ -1,11 +1,11 @@
1
- import React, { useContext } from 'react'
2
- import Group from "@interopio/groups-ui-react";
3
- import "@interopio/groups-ui-react/dist/styles/groups.css";
4
- import { IOConnectContext } from '@interopio/react-hooks';
5
-
6
- const App = () => {
7
- (window as any).io = useContext(IOConnectContext);
8
- return <Group />
9
- };
10
-
11
- export default App;
1
+ import React, { useContext } from 'react'
2
+ import Group from "@interopio/groups-ui-react";
3
+ import "@interopio/groups-ui-react/dist/styles/groups.css";
4
+ import { IOConnectContext } from '@interopio/react-hooks';
5
+
6
+ const App = () => {
7
+ (window as any).io = useContext(IOConnectContext);
8
+ return <Group />
9
+ };
10
+
11
+ export default App;
@@ -1,13 +1,13 @@
1
- body {
2
- margin: 0;
3
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
- sans-serif;
6
- -webkit-font-smoothing: antialiased;
7
- -moz-osx-font-smoothing: grayscale;
8
- }
9
-
10
- code {
11
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12
- monospace;
13
- }
1
+ body {
2
+ margin: 0;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
+ sans-serif;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
+ }
9
+
10
+ code {
11
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12
+ monospace;
13
+ }
@@ -1,19 +1,19 @@
1
- import React from 'react';
2
- import ReactDOM from 'react-dom/client';
3
- import App from './App';
4
- import { IOConnectProvider } from "@interopio/react-hooks";
5
- import IODesktop from '@interopio/desktop';
6
-
7
- ReactDOM.createRoot(document.getElementById('root')!).render(
8
- <React.StrictMode>
9
- <IOConnectProvider settings={{
10
- desktop: {
11
- factory: (config: any) => {
12
- return IODesktop();
13
- }
14
- }
15
- }}>
16
- <App />
17
- </IOConnectProvider>
18
- </React.StrictMode >
19
- );
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom/client';
3
+ import App from './App';
4
+ import { IOConnectProvider } from "@interopio/react-hooks";
5
+ import IODesktop from '@interopio/desktop';
6
+
7
+ ReactDOM.createRoot(document.getElementById('root')!).render(
8
+ <React.StrictMode>
9
+ <IOConnectProvider settings={{
10
+ desktop: {
11
+ factory: (config: any) => {
12
+ return IODesktop();
13
+ }
14
+ }
15
+ }}>
16
+ <App />
17
+ </IOConnectProvider>
18
+ </React.StrictMode >
19
+ );
@@ -1,8 +1,8 @@
1
- import { defineConfig } from 'vite'
2
- import react from '@vitejs/plugin-react'
3
-
4
- // https://vite.dev/config/
5
- export default defineConfig({
6
- plugins: [react()],
7
- base: './'
8
- })
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ // https://vite.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ base: './'
8
+ })
@@ -1,12 +1,12 @@
1
- {
2
- "name": "groups",
3
- "displayName": "Groups App",
4
- "description": "Adds custom groups application support to io.Connect Desktop",
5
- "version": "1.0.0",
6
- "type": "application",
7
- "setupUI": {
8
- "text": "Add a custom groups app",
9
- "separate": false,
10
- "selected": false
11
- }
12
- }
1
+ {
2
+ "name": "groups",
3
+ "displayName": "Groups App",
4
+ "description": "Adds custom groups application support to io.Connect Desktop",
5
+ "version": "1.0.0",
6
+ "type": "application",
7
+ "setupUI": {
8
+ "text": "Add a custom groups app",
9
+ "separate": false,
10
+ "selected": false
11
+ }
12
+ }
@@ -1,41 +1,35 @@
1
- ###
2
- # Windows Code Signing Options
3
- ###
4
- # PFX Code Signing Options, WIN_CODE_SIGNING_TYPE must be set to 'pfx'
5
- WIN_PFX_PATH=
6
- WIN_PFX_PASS=
7
-
8
- # DigiCert smctl (KeyLocker) Code Signing Options, WIN_CODE_SIGNING_TYPE must be set to 'smctl'
9
- SM_API_KEY=
10
- SM_CLIENT_CERT_FILE=
11
- SM_CLIENT_CERT_PASSWORD=
12
- SM_CODE_SIGNING_CERT_SHA1_HASH=
13
-
14
- # Custom Code Signing Options, WIN_CODE_SIGNING_TYPE must be set to 'custom'
15
- WIN_CUSTOM_CODE_SIGNING=
16
-
17
- # Timestamping server URL (optional, defaults to DigiCert)
18
- TSA_URL=http://timestamp.digicert.com
19
-
20
- # Sign all binaries (exe, dll) for better SmartScreen reputation (optional, defaults to false)
21
- SIGN_ALL_BINARIES=true
22
-
23
- ###
24
- # MacOS Code Signing & Notarization Options
25
- # Required for distribution outside Mac App Store
26
- ###
27
-
28
- # Your Apple ID email (must be enrolled in Apple Developer Program)
29
- MAC_NOTARIZATION_APPLE_ID=your.email@example.com
30
-
31
- # App-specific password (NOT your regular Apple ID password)
32
- # Generate at: https://appleid.apple.com/account/manage
33
- # See: https://support.apple.com/en-us/102654
34
- MAC_NOTARIZATION_APPLE_ID_PASSWORD=your-app-specific-password
35
-
36
- # Your Apple Developer Team ID (found in Apple Developer account)
37
- MAC_NOTARIZATION_APPLE_TEAM_ID=ABCD123456
38
-
39
- # Optional: Specify code signing identity (auto-detected if not set)
40
- # Example: "Developer ID Application: Your Name (TEAM123456)"
41
- # MAC_CODE_SIGNING_IDENTITY=
1
+ ###
2
+ # Windows Code Signing Options
3
+ ###
4
+ # SignTool Code Signing Options (PFX or Certificate Store), WIN_CODE_SIGNING_TYPE must be set to 'signtool'
5
+ WIN_PFX_PATH=
6
+ WIN_PFX_PASS=
7
+
8
+ # Custom Code Signing Options, WIN_CODE_SIGNING_TYPE must be set to 'custom'
9
+ WIN_CUSTOM_CODE_SIGNING=
10
+
11
+ # Timestamping server URL (optional, defaults to DigiCert)
12
+ TSA_URL=http://timestamp.digicert.com
13
+
14
+ # Sign all binaries (exe, dll) for better SmartScreen reputation (optional, defaults to false)
15
+ SIGN_ALL_BINARIES=true
16
+
17
+ ###
18
+ # MacOS Code Signing & Notarization Options
19
+ # Required for distribution outside Mac App Store
20
+ ###
21
+
22
+ # Your Apple ID email (must be enrolled in Apple Developer Program)
23
+ MAC_NOTARIZATION_APPLE_ID=your.email@example.com
24
+
25
+ # App-specific password (NOT your regular Apple ID password)
26
+ # Generate at: https://appleid.apple.com/account/manage
27
+ # See: https://support.apple.com/en-us/102654
28
+ MAC_NOTARIZATION_APPLE_ID_PASSWORD=your-app-specific-password
29
+
30
+ # Your Apple Developer Team ID (found in Apple Developer account)
31
+ MAC_NOTARIZATION_APPLE_TEAM_ID=ABCD123456
32
+
33
+ # Optional: Specify code signing identity (auto-detected if not set)
34
+ # Example: "Developer ID Application: Your Name (TEAM123456)"
35
+ # MAC_CODE_SIGNING_IDENTITY=
@@ -0,0 +1,122 @@
1
+ name: 'Setup DigiCert SMCTL'
2
+ description: 'Install and configure DigiCert SMCTL for code signing'
3
+
4
+ inputs:
5
+ api-key:
6
+ description: 'DigiCert API Key'
7
+ required: true
8
+ client-cert-b64:
9
+ description: 'Base64 encoded client certificate'
10
+ required: true
11
+ client-cert-password:
12
+ description: 'Client certificate password'
13
+ required: true
14
+ keypair-name:
15
+ description: 'Keypair alias name'
16
+ required: true
17
+ host:
18
+ description: 'DigiCert host URL'
19
+ required: false
20
+ default: 'https://clientauth.one.digicert.com'
21
+
22
+ outputs:
23
+ cert-file-path:
24
+ description: 'Path to the client certificate file'
25
+ value: ${{ steps.write-file.outputs.filePath }}
26
+
27
+ runs:
28
+ using: "composite"
29
+ steps:
30
+ - name: Save p12 for authentication
31
+ id: write-file
32
+ uses: timheuer/base64-to-file@v1
33
+ with:
34
+ fileName: Certificate_pkcs12.p12
35
+ encodedString: ${{ inputs.client-cert-b64 }}
36
+
37
+ - name: Export certificate path as environment variable
38
+ shell: cmd
39
+ run: echo SM_CLIENT_CERT_FILE=${{ steps.write-file.outputs.filePath }} >> $GITHUB_ENV
40
+
41
+ - name: Install SMCTL
42
+ shell: cmd
43
+ run: |
44
+ echo Installing SMCTL...
45
+ curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/Keylockertools-windows-x64.msi/download -H "x-api-key:${{ inputs.api-key }}" -o Keylockertools-windows-x64.msi
46
+ msiexec /i Keylockertools-windows-x64.msi /quiet /qn /norestart
47
+ if %errorlevel% neq 0 (
48
+ echo ERROR: MSI installation failed with exit code %errorlevel%
49
+ exit /b %errorlevel%
50
+ )
51
+ echo MSI installed successfully.
52
+ echo.
53
+ echo Checking installation directory...
54
+ dir "C:\Program Files\DigiCert\" /b 2>nul || echo DigiCert directory not found in Program Files
55
+
56
+ - name: Update environment variables and configure SMCTL
57
+ shell: cmd
58
+ env:
59
+ SM_API_KEY: ${{ inputs.api-key }}
60
+ SM_CLIENT_CERT_PASSWORD: ${{ inputs.client-cert-password }}
61
+ SM_CLIENT_CERT_FILE: ${{ steps.write-file.outputs.filePath }}
62
+ SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ inputs.cert-sha1-hash }}
63
+ SM_HOST: ${{ inputs.host }}
64
+ SMCTL_PATH: C:\Program Files\DigiCert\DigiCert Keylocker Tools
65
+ run: |
66
+ echo Checking SMCTL installation...
67
+ dir "C:\Program Files\DigiCert\" /s /b | findstr /i "smctl"
68
+
69
+ echo.
70
+ echo Adding SMCTL to PATH for this session...
71
+ set "PATH=%SMCTL_PATH%;%PATH%"
72
+
73
+ echo Current PATH: %PATH%
74
+ echo.
75
+
76
+ echo Testing smctl availability...
77
+ where smctl
78
+
79
+ echo.
80
+ echo Saving SMCTL path to GITHUB_PATH for future steps...
81
+ echo C:\Program Files\DigiCert\DigiCert Keylocker Tools>> %GITHUB_PATH%
82
+ echo C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86>> %GITHUB_PATH%
83
+
84
+ echo.
85
+ echo Healthcheck
86
+ smctl healthcheck
87
+
88
+ echo.
89
+ echo Saving credentials...
90
+ smctl credentials save %SM_API_KEY% %SM_CLIENT_CERT_PASSWORD%
91
+
92
+ echo Synchronizing certificate for keypair: ${{ inputs.keypair-name }}
93
+ smctl windows certsync --keypair-alias=${{ inputs.keypair-name }}
94
+
95
+ - name: Verify SMCTL setup
96
+ shell: cmd
97
+ env:
98
+ SMCTL_PATH: C:\Program Files\DigiCert\DigiCert Keylocker Tools
99
+ run: |
100
+ set PATH=%SMCTL_PATH%;%PATH%
101
+
102
+ if defined RUNNER_DEBUG (
103
+ echo ::group:: List DigiCert KSP libraries
104
+ smctl windows ksp list
105
+ echo ::endgroup::
106
+
107
+ echo ::group::List KSP registered
108
+ smksp_registrar list
109
+ echo ::endgroup::
110
+
111
+ echo ::group::List keypairs in account
112
+ smctl keypair ls
113
+ echo ::endgroup::
114
+
115
+ echo ::group::List keys stored under user profile
116
+ certutil -csp "DigiCert Signing Manager KSP" -key -user
117
+ echo ::endgroup::
118
+
119
+ echo ::group::SMCTL Healthcheck
120
+ smctl healthcheck
121
+ echo ::endgroup::
122
+ )