@switchbot/homebridge-switchbot 5.0.0-beta.99 → 5.0.0

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 (282) hide show
  1. package/.changeset/config.json +14 -0
  2. package/.github/copilot-instructions.md +39 -0
  3. package/.github/workflows/ci.yml +4 -1
  4. package/.github/workflows/manual-e2e.yml +6 -3
  5. package/.github/workflows/release.yml +64 -15
  6. package/.github/workflows/stale.yml +2 -4
  7. package/.husky/pre-push +15 -0
  8. package/CHANGELOG.md +126 -134
  9. package/MIGRATION.md +16 -6
  10. package/README.md +84 -3
  11. package/TODO.md +263 -0
  12. package/config.schema.json +229 -36
  13. package/dist/SwitchBotHAPPlatform.d.ts +133 -0
  14. package/dist/SwitchBotHAPPlatform.d.ts.map +1 -0
  15. package/dist/SwitchBotHAPPlatform.js +555 -0
  16. package/dist/SwitchBotHAPPlatform.js.map +1 -0
  17. package/dist/SwitchBotMatterPlatform.d.ts +141 -0
  18. package/dist/SwitchBotMatterPlatform.d.ts.map +1 -0
  19. package/dist/SwitchBotMatterPlatform.js +536 -0
  20. package/dist/SwitchBotMatterPlatform.js.map +1 -0
  21. package/dist/device-types.d.ts +31 -0
  22. package/dist/device-types.d.ts.map +1 -0
  23. package/dist/device-types.js +246 -0
  24. package/dist/device-types.js.map +1 -0
  25. package/dist/deviceCommandMapper.d.ts +10 -0
  26. package/dist/deviceCommandMapper.d.ts.map +1 -0
  27. package/dist/deviceCommandMapper.js +319 -0
  28. package/dist/deviceCommandMapper.js.map +1 -0
  29. package/dist/deviceFactory.d.ts +3 -2
  30. package/dist/deviceFactory.d.ts.map +1 -1
  31. package/dist/deviceFactory.js +107 -29
  32. package/dist/deviceFactory.js.map +1 -1
  33. package/dist/devices/genericDevice.d.ts +59 -37
  34. package/dist/devices/genericDevice.d.ts.map +1 -1
  35. package/dist/devices/genericDevice.js +376 -78
  36. package/dist/devices/genericDevice.js.map +1 -1
  37. package/dist/errors.d.ts +38 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +32 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/homebridge-ui/device-types.js +246 -0
  42. package/dist/homebridge-ui/device-types.js.map +1 -0
  43. package/dist/homebridge-ui/deviceCommandMapper.js +319 -0
  44. package/dist/homebridge-ui/deviceCommandMapper.js.map +1 -0
  45. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  46. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  47. package/dist/homebridge-ui/endpoints/config.js +90 -0
  48. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  49. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  50. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  51. package/dist/homebridge-ui/endpoints/devices.js +144 -0
  52. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  53. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  54. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  55. package/dist/homebridge-ui/endpoints/discovery.js +219 -0
  56. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  57. package/dist/homebridge-ui/errors.js +32 -0
  58. package/dist/homebridge-ui/errors.js.map +1 -0
  59. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js +90 -0
  60. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js.map +1 -0
  61. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js +144 -0
  62. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js.map +1 -0
  63. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js +219 -0
  64. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js.map +1 -0
  65. package/dist/homebridge-ui/homebridge-ui/server.js +11 -0
  66. package/dist/homebridge-ui/homebridge-ui/server.js.map +1 -0
  67. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js +108 -0
  68. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js.map +1 -0
  69. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js +111 -0
  70. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js.map +1 -0
  71. package/dist/homebridge-ui/homebridge-ui/utils/logger.js +17 -0
  72. package/dist/homebridge-ui/homebridge-ui/utils/logger.js.map +1 -0
  73. package/dist/homebridge-ui/public/css/styles.css +483 -0
  74. package/dist/homebridge-ui/public/index.html +197 -621
  75. package/dist/homebridge-ui/public/js/advanced-settings.d.ts +3 -0
  76. package/dist/homebridge-ui/public/js/advanced-settings.d.ts.map +1 -0
  77. package/dist/homebridge-ui/public/js/advanced-settings.js +95 -0
  78. package/dist/homebridge-ui/public/js/advanced-settings.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/advanced-settings.ts +94 -0
  80. package/dist/homebridge-ui/public/js/api.d.ts +66 -0
  81. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  82. package/dist/homebridge-ui/public/js/api.js +295 -0
  83. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  84. package/dist/homebridge-ui/public/js/api.ts +355 -0
  85. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  86. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  87. package/dist/homebridge-ui/public/js/app.js +3722 -0
  88. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  89. package/dist/homebridge-ui/public/js/app.ts +22 -0
  90. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  91. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  92. package/dist/homebridge-ui/public/js/constants.js +2 -0
  93. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  94. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  95. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  96. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  97. package/dist/homebridge-ui/public/js/credentials.js +99 -0
  98. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/credentials.ts +105 -0
  100. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  101. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  102. package/dist/homebridge-ui/public/js/devices-delete.js +199 -0
  103. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  104. package/dist/homebridge-ui/public/js/devices-delete.ts +227 -0
  105. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  106. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  107. package/dist/homebridge-ui/public/js/devices.js +98 -0
  108. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  109. package/dist/homebridge-ui/public/js/devices.ts +106 -0
  110. package/dist/homebridge-ui/public/js/discovery.d.ts +9 -0
  111. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  112. package/dist/homebridge-ui/public/js/discovery.js +1201 -0
  113. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  114. package/dist/homebridge-ui/public/js/discovery.ts +1335 -0
  115. package/dist/homebridge-ui/public/js/logger.d.ts +7 -0
  116. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  117. package/dist/homebridge-ui/public/js/logger.js +17 -0
  118. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  119. package/dist/homebridge-ui/public/js/logger.ts +17 -0
  120. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  121. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  122. package/dist/homebridge-ui/public/js/modal.js +35 -0
  123. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  124. package/dist/homebridge-ui/public/js/modal.ts +35 -0
  125. package/dist/homebridge-ui/public/js/modals.d.ts +15 -0
  126. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  127. package/dist/homebridge-ui/public/js/modals.js +675 -0
  128. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  129. package/dist/homebridge-ui/public/js/modals.ts +765 -0
  130. package/dist/homebridge-ui/public/js/render.d.ts +71 -0
  131. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  132. package/dist/homebridge-ui/public/js/render.js +960 -0
  133. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  134. package/dist/homebridge-ui/public/js/render.ts +1084 -0
  135. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  136. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  137. package/dist/homebridge-ui/public/js/toast.js +38 -0
  138. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  139. package/dist/homebridge-ui/public/js/toast.ts +44 -0
  140. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  141. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  142. package/dist/homebridge-ui/public/js/types.js +2 -0
  143. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  144. package/dist/homebridge-ui/public/js/types.ts +26 -0
  145. package/dist/homebridge-ui/server.d.ts +1 -3
  146. package/dist/homebridge-ui/server.d.ts.map +1 -1
  147. package/dist/homebridge-ui/server.js +8 -471
  148. package/dist/homebridge-ui/server.js.map +1 -1
  149. package/dist/homebridge-ui/settings.js +8 -0
  150. package/dist/homebridge-ui/settings.js.map +1 -0
  151. package/dist/homebridge-ui/switchbotClient.js +247 -0
  152. package/dist/homebridge-ui/switchbotClient.js.map +1 -0
  153. package/dist/homebridge-ui/utils/config-parser.d.ts +39 -0
  154. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  155. package/dist/homebridge-ui/utils/config-parser.js +108 -0
  156. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  157. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  158. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  159. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  160. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  161. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  162. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  163. package/dist/homebridge-ui/utils/logger.js +17 -0
  164. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  165. package/dist/index.d.ts +10 -0
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +12 -2
  168. package/dist/index.js.map +1 -1
  169. package/dist/settings.d.ts +1 -0
  170. package/dist/settings.d.ts.map +1 -1
  171. package/dist/settings.js +1 -0
  172. package/dist/settings.js.map +1 -1
  173. package/dist/switchbotClient.d.ts +12 -10
  174. package/dist/switchbotClient.d.ts.map +1 -1
  175. package/dist/switchbotClient.js +156 -103
  176. package/dist/switchbotClient.js.map +1 -1
  177. package/dist/utils.d.ts +76 -1
  178. package/dist/utils.d.ts.map +1 -1
  179. package/dist/utils.js +1121 -4
  180. package/dist/utils.js.map +1 -1
  181. package/docs/assets/highlight.css +16 -2
  182. package/docs/assets/main.js +1 -1
  183. package/docs/index.html +82 -5
  184. package/docs/variables/default.html +3 -1
  185. package/eslint.config.js +9 -5
  186. package/nodemon.json +2 -2
  187. package/package.json +34 -21
  188. package/scripts/build-ui.js +37 -0
  189. package/scripts/free-dev-ports.mjs +105 -0
  190. package/scripts/generate-matter-maps.js +34 -17
  191. package/scripts/sync-device-types.mjs +31 -0
  192. package/src/SwitchBotHAPPlatform.ts +558 -0
  193. package/src/SwitchBotMatterPlatform.ts +538 -0
  194. package/src/device-types.js +246 -0
  195. package/src/device-types.js.map +1 -0
  196. package/src/device-types.ts +261 -0
  197. package/src/deviceCommandMapper.js +319 -0
  198. package/src/deviceCommandMapper.js.map +1 -0
  199. package/src/deviceCommandMapper.ts +333 -0
  200. package/src/deviceFactory.ts +125 -45
  201. package/src/devices/genericDevice.ts +411 -69
  202. package/src/errors.js +32 -0
  203. package/src/errors.js.map +1 -0
  204. package/src/errors.ts +35 -0
  205. package/src/homebridge-ui/endpoints/config.ts +110 -0
  206. package/src/homebridge-ui/endpoints/devices.ts +153 -0
  207. package/src/homebridge-ui/endpoints/discovery.ts +240 -0
  208. package/src/homebridge-ui/public/css/styles.css +483 -0
  209. package/src/homebridge-ui/public/index.html +197 -621
  210. package/src/homebridge-ui/public/js/advanced-settings.ts +94 -0
  211. package/src/homebridge-ui/public/js/api.ts +355 -0
  212. package/src/homebridge-ui/public/js/app.ts +22 -0
  213. package/src/homebridge-ui/public/js/constants.ts +1 -0
  214. package/src/homebridge-ui/public/js/credentials.ts +105 -0
  215. package/src/homebridge-ui/public/js/devices-delete.ts +227 -0
  216. package/src/homebridge-ui/public/js/devices.ts +106 -0
  217. package/src/homebridge-ui/public/js/discovery.ts +1335 -0
  218. package/src/homebridge-ui/public/js/logger.ts +17 -0
  219. package/src/homebridge-ui/public/js/modal.ts +35 -0
  220. package/src/homebridge-ui/public/js/modals.ts +765 -0
  221. package/src/homebridge-ui/public/js/render.ts +1084 -0
  222. package/src/homebridge-ui/public/js/toast.ts +44 -0
  223. package/src/homebridge-ui/public/js/types.ts +26 -0
  224. package/src/homebridge-ui/server.ts +9 -554
  225. package/src/homebridge-ui/utils/config-parser.ts +125 -0
  226. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  227. package/src/homebridge-ui/utils/logger.ts +17 -0
  228. package/src/index.ts +12 -2
  229. package/src/settings.js +8 -0
  230. package/src/settings.js.map +1 -0
  231. package/src/settings.ts +2 -0
  232. package/src/switchbotClient.js +247 -0
  233. package/src/switchbotClient.js.map +1 -0
  234. package/src/switchbotClient.ts +177 -114
  235. package/src/utils.ts +1133 -5
  236. package/test/client/switchbot-client-debounce.spec.ts +35 -0
  237. package/test/client/switchbot-client-openapi.spec.ts +19 -0
  238. package/test/client/switchbotClient.spec.ts +64 -0
  239. package/test/device/device-mapping.spec.ts +23 -0
  240. package/test/device/deviceBase.spec.ts +26 -0
  241. package/test/device/deviceFactory-edge.spec.ts +15 -0
  242. package/test/device/deviceFactory.spec.ts +33 -0
  243. package/test/device/fan-swing.spec.ts +34 -0
  244. package/test/device/genericDevice-blepoll.spec.ts +47 -0
  245. package/test/device/irdevice.spec.ts +9 -0
  246. package/test/device/lock-users.spec.ts +35 -0
  247. package/test/device/matter-descriptors.spec.ts +22 -0
  248. package/test/device/matter-device-state.spec.ts +37 -0
  249. package/test/e2e/run-e2e.spec.ts +18 -19
  250. package/test/errors/errors.spec.ts +10 -0
  251. package/test/helpers/matter-harness.ts +20 -9
  252. package/test/homebridge-ui/server.spec.ts +9 -0
  253. package/test/platform/accessory-restore.spec.ts +37 -0
  254. package/test/platform/matter-childbridge.spec.ts +34 -0
  255. package/test/platform/matter-integration.spec.ts +33 -0
  256. package/test/platform/platform-edge.spec.ts +73 -0
  257. package/test/platform/platform.integration.spec.ts +34 -0
  258. package/test/utils/utils-extra.spec.ts +10 -0
  259. package/test/utils/utils.spec.ts +53 -0
  260. package/todo/TODO.md +80 -0
  261. package/tsconfig.ui.json +11 -0
  262. package/.github/npm-version-script-esm.js +0 -97
  263. package/.github/workflows/beta-release.yml +0 -52
  264. package/dist/platform.d.ts +0 -35
  265. package/dist/platform.d.ts.map +0 -1
  266. package/dist/platform.js +0 -945
  267. package/dist/platform.js.map +0 -1
  268. package/src/platform.ts +0 -963
  269. package/test/accessory-restore.spec.ts +0 -73
  270. package/test/device-mapping.spec.ts +0 -37
  271. package/test/deviceFactory.spec.ts +0 -18
  272. package/test/fan-swing.spec.ts +0 -29
  273. package/test/lock-users.spec.ts +0 -44
  274. package/test/matter-childbridge.spec.ts +0 -55
  275. package/test/matter-descriptors.spec.ts +0 -97
  276. package/test/matter-device-state.spec.ts +0 -101
  277. package/test/matter-integration.spec.ts +0 -70
  278. package/test/platform.integration.spec.ts +0 -55
  279. package/test/switchbot-client-debounce.spec.ts +0 -131
  280. package/test/switchbot-client-openapi.spec.ts +0 -56
  281. package/test/switchbotClient.spec.ts +0 -10
  282. package/test/utils.spec.ts +0 -20
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
3
+ "changelog": [
4
+ "@changesets/cli/changelog",
5
+ { "repo": "OpenWonderLabs/homebridge-switchbot" }
6
+ ],
7
+ "commit": false,
8
+ "fixed": [],
9
+ "linked": [],
10
+ "access": "public",
11
+ "baseBranch": "latest",
12
+ "updateInternalDependencies": "patch",
13
+ "ignore": []
14
+ }
@@ -2,6 +2,45 @@
2
2
 
3
3
  Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
4
4
 
5
+ ## Topic-Based Reference Priority
6
+
7
+ When a prompt includes the topics below, consult these upstream references first before implementation decisions.
8
+
9
+ ### Matter (keyword examples: "Matter", "child bridge", "cluster", "conformance")
10
+
11
+ Primary references:
12
+ - https://github.com/homebridge-plugins/homebridge-matter
13
+ - https://github.com/homebridge/homebridge/ - only if latest is 2.0.0 or later and contains Matter-related code or reference:
14
+ - https://github.com/homebridge/homebridge/tree/beta-2.0.0/
15
+ - https://github.com/matter-js/matter.js
16
+
17
+ Usage rule:
18
+ - For Matter behavior, conformance, clustering, or registration logic, align implementation with these references before applying local changes.
19
+
20
+ ### SwitchBot BLE (keyword examples: "BLE", "Bluetooth", "RSSI", "advertisement", "scan")
21
+
22
+ Primary references:
23
+ - https://github.com/OpenWonderLabs/SwitchBotAPI-BLE
24
+ - https://github.com/sblibs/pySwitchbot
25
+
26
+ Usage rule:
27
+ - For BLE command/state/scan behavior, prefer these references for protocol expectations and payload shape.
28
+
29
+ ### SwitchBot OpenAPI (keyword examples: "OpenAPI", "cloud API", "device list", "command")
30
+
31
+ Primary reference:
32
+ - https://github.com/OpenWonderLabs/SwitchBotAPI
33
+
34
+ Usage rule:
35
+ - For OpenAPI device models, commands, and response fields, prioritize this reference for compatibility.
36
+
37
+ ### Conflict Resolution
38
+
39
+ If references conflict:
40
+ 1. Prefer official upstream docs/API specs.
41
+ 2. Keep existing plugin behavior unless a clear bug is identified.
42
+ 3. Document any intentional deviation in PR notes.
43
+
5
44
  ## Branch Targeting Strategy
6
45
 
7
46
  When creating pull requests, ALWAYS follow this branch targeting strategy:
@@ -6,12 +6,15 @@ on:
6
6
  pull_request:
7
7
  branches: ["main", "latest"]
8
8
 
9
+ permissions:
10
+ contents: read
11
+
9
12
  jobs:
10
13
  build-and-test:
11
14
  runs-on: ubuntu-latest
12
15
  strategy:
13
16
  matrix:
14
- node-version: [20, 22]
17
+ node-version: [22, 24]
15
18
 
16
19
  steps:
17
20
  - uses: actions/checkout@v4
@@ -1,5 +1,8 @@
1
1
  name: Manual E2E (build + optional E2E)
2
2
 
3
+ permissions:
4
+ contents: read
5
+
3
6
  on:
4
7
  workflow_dispatch:
5
8
  inputs:
@@ -43,12 +46,12 @@ jobs:
43
46
  runs-on: ubuntu-latest
44
47
  steps:
45
48
  - name: Checkout
46
- uses: actions/checkout@v4
49
+ uses: actions/checkout@v6
47
50
 
48
51
  - name: Setup Node
49
- uses: actions/setup-node@v4
52
+ uses: actions/setup-node@v6
50
53
  with:
51
- node-version: '18'
54
+ node-version: '22'
52
55
 
53
56
  - name: Install dependencies
54
57
  run: npm ci --prefer-offline --no-audit --progress=false
@@ -1,30 +1,78 @@
1
- name: Unified Release
1
+ name: Release
2
2
 
3
3
  on:
4
4
  push:
5
5
  branches:
6
- #- "alpha-*"
7
- #- "beta-*"
8
- - latest
6
+ - 'beta-*'
7
+ - 'beta'
8
+ - 'latest'
9
9
  workflow_dispatch:
10
10
 
11
11
  jobs:
12
+ # ─── BETA RELEASE (branches starting with "beta") ────────────────────────────
13
+
14
+ # 1️⃣ Build and test
15
+ build_and_test:
16
+ if: startsWith(github.ref_name, 'beta')
17
+ uses: homebridge/.github/.github/workflows/nodejs-build-and-test.yml@latest
18
+ with:
19
+ enable_coverage: false
20
+ secrets:
21
+ token: ${{ secrets.GITHUB_TOKEN }}
22
+
23
+ # 2️⃣ Lint
24
+ lint:
25
+ if: startsWith(github.ref_name, 'beta')
26
+ needs: build_and_test
27
+ uses: homebridge/.github/.github/workflows/eslint.yml@latest
28
+
29
+ # 3️⃣ Publish beta to NPM (OIDC — id-token required here and in the reusable workflow)
30
+ beta-publish:
31
+ if: startsWith(github.ref_name, 'beta')
32
+ needs: lint
33
+ permissions:
34
+ id-token: write
35
+ uses: homebridge/.github/.github/workflows/npm-publish-esm-oidc.yml@latest
36
+ with:
37
+ tag: 'beta'
38
+ dynamically_adjust_version: true
39
+ npm_version_command: 'pre'
40
+ pre_id: 'beta'
41
+
42
+ # 4️⃣ Create GitHub pre-release
43
+ beta-pre-release:
44
+ if: startsWith(github.ref_name, 'beta')
45
+ needs: beta-publish
46
+ uses: homebridge/.github/.github/workflows/pre-release.yml@latest
47
+ with:
48
+ npm_version: ${{ needs.beta-publish.outputs.NPM_VERSION }}
49
+ body: |
50
+ **Beta Release**
51
+ **Version**: v${{ needs.beta-publish.outputs.NPM_VERSION }}
52
+ [How To Test Beta Releases](https://github.com/OpenWonderLabs/homebridge-switchbot/wiki/Beta-Version)
53
+
54
+
55
+ # ─── STABLE RELEASE (branch: "latest") ───────────────────────────────────────
56
+
12
57
  # 1️⃣ Determine release type, ESM status, and branch name
13
58
  determine-release-type:
59
+ if: github.ref_name == 'latest'
14
60
  uses: homebridge/.github/.github/workflows/determine-release-type.yml@latest
15
61
  with:
16
62
  ref_name: ${{ github.ref_name }}
17
63
 
18
64
  # 2️⃣ Update version and changelog using the scripts
19
65
  update-version:
66
+ if: github.ref_name == 'latest'
20
67
  needs: determine-release-type
21
68
  uses: homebridge/.github/.github/workflows/update-version.yml@latest
22
69
  with:
23
70
  release_type: ${{ needs.determine-release-type.outputs.release_type }}
24
71
  is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
25
72
 
26
- # 3️⃣ Publish to NPM and create GitHub release
73
+ # 3️⃣ Publish to NPM and create GitHub release (OIDC — id-token required here and in the reusable workflow)
27
74
  publish-release:
75
+ if: github.ref_name == 'latest'
28
76
  needs: [determine-release-type, update-version]
29
77
  permissions:
30
78
  id-token: write
@@ -39,17 +87,17 @@ jobs:
39
87
 
40
88
  # 4️⃣ Promote branch if this is a prerelease (alpha/beta)
41
89
  promote-branch:
90
+ if: ${{ github.ref_name == 'latest' && needs.determine-release-type.outputs.release_type != 'latest' && needs.determine-release-type.outputs.release_type != 'skip' }}
42
91
  needs: [determine-release-type, publish-release]
43
- if: ${{ needs.determine-release-type.outputs.release_type != 'latest' && needs.determine-release-type.outputs.release_type != 'skip' }}
44
92
  uses: homebridge/.github/.github/workflows/promote-branch.yml@latest
45
93
  with:
46
94
  branch_name: ${{ needs.determine-release-type.outputs.branch_name }}
47
95
  release_type: ${{ needs.determine-release-type.outputs.release_type }}
48
96
  is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
49
97
 
50
- # 5️⃣ Notify if any previous job fails
98
+ # 5️⃣ Notify if any stable-release job fails
51
99
  workflow-failure:
52
- if: ${{ failure() }}
100
+ if: failure()
53
101
  needs: [determine-release-type, update-version, publish-release, promote-branch]
54
102
  uses: homebridge/.github/.github/workflows/report-failure.yml@latest
55
103
  with:
@@ -57,15 +105,16 @@ jobs:
57
105
  job_name: ${{ github.job }}
58
106
  run_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
59
107
 
60
- # 6️⃣ Post to Discord
61
- github-releases-to-discord:
62
- name: Discord Webhooks
63
- needs: [determine-release-type, update-version, publish-release]
108
+ # 6️⃣ Post to Discord (Beta + Stable)
109
+ discord:
110
+ name: Release Notifications
111
+ if: ${{ always() && ((startsWith(github.ref_name, 'beta') && needs.beta-publish.result == 'success') || (github.ref_name == 'latest' && needs.publish-release.result == 'success')) }}
112
+ needs: [beta-publish, update-version, publish-release]
64
113
  uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
65
114
  with:
66
- title: "SwitchBot Release"
115
+ title: ${{ startsWith(github.ref_name, 'beta') && 'Homebridge SwitchBot Beta Release' || 'Homebridge SwitchBot Release' }}
67
116
  description: |
68
- Version `v${{ needs.update-version.outputs.version }}`
69
- url: "https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v${{ needs.update-version.outputs.version }}"
117
+ Version `v${{ startsWith(github.ref_name, 'beta') && needs.beta-publish.outputs.NPM_VERSION || needs.update-version.outputs.version }}`
118
+ url: "https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v${{ startsWith(github.ref_name, 'beta') && needs.beta-publish.outputs.NPM_VERSION || needs.update-version.outputs.version }}"
70
119
  secrets:
71
120
  DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_LATEST }}
@@ -3,12 +3,10 @@ name: Stale workflow
3
3
  on:
4
4
  workflow_dispatch:
5
5
  schedule:
6
- - cron: '45 11 * * *'
6
+ - cron: '45 7 * * *'
7
7
 
8
8
  jobs:
9
9
  stale:
10
- uses: OpenWonderLabs/.github/.github/workflows/stale.yml@latest
11
- with:
12
- days-before-issue-stale: 15
10
+ uses: homebridge/.github/.github/workflows/stale.yml@latest
13
11
  secrets:
14
12
  token: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,15 @@
1
+ #!/bin/sh
2
+ . "$(dirname "$0")/_/husky.sh"
3
+
4
+ echo "Running changeset version before push..."
5
+ if npx @changesets/cli version --yes; then
6
+ git add package.json package-lock.json CHANGELOG.md || true
7
+ if ! git diff --staged --quiet; then
8
+ echo "Committing version and changelog updates"
9
+ git commit -m "chore(release): version packages [skip ci]" || true
10
+ else
11
+ echo "No version changes to commit"
12
+ fi
13
+ else
14
+ echo "changeset version failed or no changesets present"
15
+ fi