@homebridge-plugins/homebridge-august 3.3.0-beta.0 → 3.3.0-beta.1
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.
- package/CHANGELOG.md +19 -14
- package/CLAUDE.md +48 -0
- package/README.md +39 -27
- package/config.schema.json +47 -3
- package/dist/Platform.HAP.d.ts +139 -20
- package/dist/Platform.HAP.d.ts.map +1 -1
- package/dist/Platform.HAP.js +732 -46
- package/dist/Platform.HAP.js.map +1 -1
- package/dist/connectivity-manager.d.ts +3 -3
- package/dist/connectivity-manager.d.ts.map +1 -1
- package/dist/connectivity-manager.js +14 -57
- package/dist/connectivity-manager.js.map +1 -1
- package/dist/devices/device.d.ts +16 -5
- package/dist/devices/device.d.ts.map +1 -1
- package/dist/devices/device.js +75 -18
- package/dist/devices/device.js.map +1 -1
- package/dist/devices/device.test.d.ts +2 -0
- package/dist/devices/device.test.d.ts.map +1 -0
- package/dist/devices/device.test.js +294 -0
- package/dist/devices/device.test.js.map +1 -0
- package/dist/devices/lock.d.ts +3 -3
- package/dist/devices/lock.d.ts.map +1 -1
- package/dist/devices/lock.js +41 -41
- package/dist/devices/lock.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/platform.matter.d.ts +26 -18
- package/dist/platform.matter.d.ts.map +1 -1
- package/dist/platform.matter.js +95 -76
- package/dist/platform.matter.js.map +1 -1
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/package.json +37 -32
- package/test/connectivity-manager.test.ts +592 -0
- package/test/platform.matter.test.ts +660 -0
- package/test/platform.polling.test.ts +5 -5
- package/test/{platform.hap.test.ts → platform.test.ts} +23 -23
- package/.github/FUNDING.yml +0 -4
- package/.github/ISSUE_TEMPLATE/bug-report.yml +0 -97
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature-request.yml +0 -38
- package/.github/ISSUE_TEMPLATE/support-request.yml +0 -85
- package/.github/ISSUE_TEMPLATE.md +0 -48
- package/.github/PULL_REQUEST_TEMPLATE/pull_request.md +0 -27
- package/.github/copilot-instructions.md +0 -200
- package/.github/dependabot.yml +0 -17
- package/.github/labeler.yml +0 -38
- package/.github/npm-version-script-esm.js +0 -97
- package/.github/workflows/release.yml +0 -169
- package/.github/workflows/stale.yml +0 -12
- package/SECURITY.md +0 -19
- package/branding/Homebridge_x_August.svg +0 -32
- package/branding/icon.png +0 -0
- package/dist/Platform.Base.d.ts +0 -288
- package/dist/Platform.Base.d.ts.map +0 -1
- package/dist/Platform.Base.js +0 -797
- package/dist/Platform.Base.js.map +0 -1
- package/dist/package.json +0 -85
- package/docs/.nojekyll +0 -1
- package/docs/assets/hierarchy.js +0 -1
- package/docs/assets/highlight.css +0 -22
- package/docs/assets/icons.js +0 -18
- package/docs/assets/icons.svg +0 -1
- package/docs/assets/main.js +0 -60
- package/docs/assets/navigation.js +0 -1
- package/docs/assets/search.js +0 -1
- package/docs/assets/style.css +0 -1633
- package/docs/hierarchy.html +0 -1
- package/docs/index.html +0 -44
- package/docs/modules.html +0 -1
- package/docs/variables/default.html +0 -1
- package/eslint.config.js +0 -47
- package/test/device.test.ts +0 -384
- package/vitest.config.ts +0 -8
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
# Copilot Instructions for Homebridge August Plugin
|
|
2
|
-
|
|
3
|
-
## Repository Overview
|
|
4
|
-
|
|
5
|
-
This repository is a Homebridge dynamic platform plugin for August and Yale locks.
|
|
6
|
-
|
|
7
|
-
- Runtime uses TypeScript + ES modules.
|
|
8
|
-
- The plugin supports a dual runtime path:
|
|
9
|
-
- HAP path via AugustPlatform.
|
|
10
|
-
- Matter path via AugustMatterPlatform when Homebridge Matter is available and enabled.
|
|
11
|
-
|
|
12
|
-
## Current Architecture
|
|
13
|
-
|
|
14
|
-
- Plugin type: dynamic platform plugin.
|
|
15
|
-
- Entry point: src/index.ts.
|
|
16
|
-
- HAP platform class: src/Platform.HAP.ts (AugustPlatform).
|
|
17
|
-
- Matter platform class: src/Platform.Matter.ts (AugustMatterPlatform).
|
|
18
|
-
- Shared device logic: src/devices/device.ts and src/devices/lock.ts.
|
|
19
|
-
- Connectivity state machine: src/connectivity-manager.ts.
|
|
20
|
-
- Config/types/constants: src/settings.ts.
|
|
21
|
-
- UI backend/static assets: src/homebridge-ui/.
|
|
22
|
-
|
|
23
|
-
The entry point in src/index.ts registers a proxy constructor that selects Matter or HAP at runtime based on:
|
|
24
|
-
- api.isMatterAvailable()
|
|
25
|
-
- api.isMatterEnabled()
|
|
26
|
-
- config.options.disableMatter
|
|
27
|
-
|
|
28
|
-
## Toolchain and Runtime
|
|
29
|
-
|
|
30
|
-
Use the values from package.json and tsconfig.json as source of truth.
|
|
31
|
-
|
|
32
|
-
- Node support: ^22 || ^24
|
|
33
|
-
- Homebridge support: ^2.0.0
|
|
34
|
-
- TypeScript target: ES2022
|
|
35
|
-
- Module: ES2022
|
|
36
|
-
- Module resolution: bundler
|
|
37
|
-
- Strict mode: enabled (noImplicitAny is false)
|
|
38
|
-
|
|
39
|
-
## Commands
|
|
40
|
-
|
|
41
|
-
### Build and Packaging
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
npm run clean
|
|
45
|
-
npm run build
|
|
46
|
-
npm run prepublishOnly
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Lint
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
npm run lint
|
|
53
|
-
npm run lint:fix
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Test
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
npm test
|
|
60
|
-
npm run test:watch
|
|
61
|
-
npm run test-coverage
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Docs
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
npm run docs
|
|
68
|
-
npm run docs:lint
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Development
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
npm run watch
|
|
75
|
-
npm run plugin-ui
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Branch and Release Workflow
|
|
79
|
-
|
|
80
|
-
This repo follows a beta-first workflow.
|
|
81
|
-
|
|
82
|
-
- Do not target main directly.
|
|
83
|
-
- Target a beta branch named beta-X.Y.Z.
|
|
84
|
-
- Use issue labels to determine bump type:
|
|
85
|
-
- patch
|
|
86
|
-
- minor
|
|
87
|
-
- major
|
|
88
|
-
|
|
89
|
-
If no matching beta branch exists, create one from the next expected version.
|
|
90
|
-
|
|
91
|
-
## Coding Expectations
|
|
92
|
-
|
|
93
|
-
1. Keep imports as ES module paths ending in .js.
|
|
94
|
-
2. Preserve Homebridge plugin constants:
|
|
95
|
-
- PLATFORM_NAME = August
|
|
96
|
-
- PLUGIN_NAME = homebridge-august
|
|
97
|
-
3. Maintain backward compatibility unless issue scope is explicitly breaking.
|
|
98
|
-
4. Keep runtime and schema aligned:
|
|
99
|
-
- Update src/settings.ts and config.schema.json together for option changes.
|
|
100
|
-
5. Add or update Vitest coverage for behavior changes.
|
|
101
|
-
6. Never commit generated output from dist/.
|
|
102
|
-
|
|
103
|
-
## Homebridge and August/Yale Patterns
|
|
104
|
-
|
|
105
|
-
- Use Homebridge DynamicPlatformPlugin patterns for lifecycle methods.
|
|
106
|
-
- Use PlatformAccessory caching and proper unregister/update behavior.
|
|
107
|
-
- Handle August auth and refresh flows defensively.
|
|
108
|
-
- Respect polling and push/update intervals from options.
|
|
109
|
-
- Prefer robust error classification and graceful retries over broad catch-and-ignore.
|
|
110
|
-
|
|
111
|
-
## Matter and HomeKit Integration
|
|
112
|
-
|
|
113
|
-
### Matter Implementation
|
|
114
|
-
|
|
115
|
-
The plugin uses a dual-mode runtime that selects HAP or Matter at startup.
|
|
116
|
-
|
|
117
|
-
- HAP mode (HomeKit Accessory Protocol): implemented by AugustPlatform in src/Platform.HAP.ts.
|
|
118
|
-
- Matter mode: implemented by AugustMatterPlatform in src/Platform.Matter.ts.
|
|
119
|
-
|
|
120
|
-
In src/index.ts, the platform proxy chooses AugustMatterPlatform only when Matter is available and enabled, and the user has not disabled Matter via config.options.disableMatter. Otherwise it falls back to AugustPlatform.
|
|
121
|
-
|
|
122
|
-
### Matter Device Type Mapping
|
|
123
|
-
|
|
124
|
-
Matter registrations use api.matter.deviceTypes.* and api.matter.types.* from Homebridge's Matter API.
|
|
125
|
-
|
|
126
|
-
| August Device | HAP Service | Matter DeviceType | Matter Clusters |
|
|
127
|
-
|---|---|---|---|
|
|
128
|
-
| August/Yale lock | LockMechanism (plus optional ContactSensor in HAP mode) | DoorLock | doorLock |
|
|
129
|
-
|
|
130
|
-
Notes:
|
|
131
|
-
- AugustMatterPlatform currently maps lock accessories to Matter DoorLock.
|
|
132
|
-
- Lock state updates are written through the doorLock cluster (for example lockState) and mirrored from August API polling/push updates.
|
|
133
|
-
|
|
134
|
-
### Authoritative Matter References
|
|
135
|
-
|
|
136
|
-
1. https://matter-js.github.io/docs/index.html
|
|
137
|
-
2. https://github.com/homebridge-plugins/homebridge-matter
|
|
138
|
-
|
|
139
|
-
For cluster, attribute, deviceType, and conversion details, use the homebridge-matter wiki:
|
|
140
|
-
- Introduction: https://github.com/homebridge-plugins/homebridge-matter/wiki/Introduction
|
|
141
|
-
- Core Concepts: https://github.com/homebridge-plugins/homebridge-matter/wiki/Core-Concepts
|
|
142
|
-
- Getting Started: https://github.com/homebridge-plugins/homebridge-matter/wiki/Getting-Started
|
|
143
|
-
- State Management: https://github.com/homebridge-plugins/homebridge-matter/wiki/State-Management
|
|
144
|
-
- Monitoring External Changes: https://github.com/homebridge-plugins/homebridge-matter/wiki/Monitoring-External-Changes
|
|
145
|
-
- Best Practices: https://github.com/homebridge-plugins/homebridge-matter/wiki/Best-Practices
|
|
146
|
-
- Advanced Patterns: https://github.com/homebridge-plugins/homebridge-matter/wiki/Advanced-Patterns
|
|
147
|
-
- API Reference: https://github.com/homebridge-plugins/homebridge-matter/wiki/API-Reference
|
|
148
|
-
- Matter Types: https://github.com/homebridge-plugins/homebridge-matter/wiki/Matter-Types
|
|
149
|
-
- Value Conversions: https://github.com/homebridge-plugins/homebridge-matter/wiki/Value-Conversions
|
|
150
|
-
|
|
151
|
-
Device reference pages:
|
|
152
|
-
- Sensors (Section 7): https://github.com/homebridge-plugins/homebridge-matter/wiki/Section-7-Sensors
|
|
153
|
-
- Closure (Section 8): https://github.com/homebridge-plugins/homebridge-matter/wiki/Section-8-Closure
|
|
154
|
-
|
|
155
|
-
## Testing Guidelines
|
|
156
|
-
|
|
157
|
-
- Test files live under test/ with .test.ts suffix.
|
|
158
|
-
- Mock external dependencies:
|
|
159
|
-
- august-yale
|
|
160
|
-
- file system
|
|
161
|
-
- Homebridge API surfaces
|
|
162
|
-
- Cover:
|
|
163
|
-
- startup and discovery
|
|
164
|
-
- polling loops
|
|
165
|
-
- push/pull state sync
|
|
166
|
-
- Matter fallback behavior
|
|
167
|
-
- error paths and retries
|
|
168
|
-
|
|
169
|
-
## Files to Avoid Editing Directly
|
|
170
|
-
|
|
171
|
-
- dist/
|
|
172
|
-
- node_modules/
|
|
173
|
-
- docs/ generated output unless intentionally regenerating docs
|
|
174
|
-
|
|
175
|
-
## Changelog Requirements
|
|
176
|
-
|
|
177
|
-
When adding a release entry to CHANGELOG.md:
|
|
178
|
-
|
|
179
|
-
1. Header format:
|
|
180
|
-
|
|
181
|
-
```md
|
|
182
|
-
## [X.Y.Z](https://github.com/homebridge-plugins/homebridge-august/releases/tag/vX.Y.Z) (YYYY-MM-DD)
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
2. Add sections as needed (for example Bug Fixes, Features, Documentation).
|
|
186
|
-
|
|
187
|
-
3. Include a trailing full changelog comparison line:
|
|
188
|
-
|
|
189
|
-
```md
|
|
190
|
-
**Full Changelog**: https://github.com/homebridge-plugins/homebridge-august/compare/vX.Y.(Z-1)...vX.Y.Z
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
4. Ensure commit links point to this repository:
|
|
194
|
-
- https://github.com/homebridge-plugins/homebridge-august/commit/<sha>
|
|
195
|
-
|
|
196
|
-
## Security and Privacy
|
|
197
|
-
|
|
198
|
-
- Never log secrets (passwords, tokens, validation codes).
|
|
199
|
-
- Avoid exposing sensitive values in thrown errors.
|
|
200
|
-
- Validate user-supplied config inputs before use.
|
package/.github/dependabot.yml
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# To get started with Dependabot version updates, you'll need to specify which
|
|
2
|
-
# package ecosystems to update and where the package manifests are located.
|
|
3
|
-
# Please see the documentation for all configuration options:
|
|
4
|
-
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
5
|
-
|
|
6
|
-
version: 2
|
|
7
|
-
updates:
|
|
8
|
-
- package-ecosystem: 'npm' # See documentation for possible values
|
|
9
|
-
directory: '/' # Location of package manifests
|
|
10
|
-
target-branch: 'beta-*.*.*'
|
|
11
|
-
schedule:
|
|
12
|
-
interval: 'daily'
|
|
13
|
-
- package-ecosystem: 'github-actions' # See documentation for possible values
|
|
14
|
-
directory: '/' # Location of package manifests
|
|
15
|
-
target-branch: 'beta-*.*.*'
|
|
16
|
-
schedule:
|
|
17
|
-
interval: 'daily'
|
package/.github/labeler.yml
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Add 'branding' label to any changes within 'docs' folder or any subfolders
|
|
2
|
-
branding:
|
|
3
|
-
- changed-files:
|
|
4
|
-
- any-glob-to-any-file: branding/**
|
|
5
|
-
|
|
6
|
-
# Add 'docs' label to any change to .md files within the entire repository
|
|
7
|
-
docs:
|
|
8
|
-
- changed-files:
|
|
9
|
-
- any-glob-to-any-file: '**/*.md'
|
|
10
|
-
|
|
11
|
-
# Add 'enhancement' label to any change to src files within the source dir EXCEPT for the docs sub-folder
|
|
12
|
-
enhancement:
|
|
13
|
-
- changed-files:
|
|
14
|
-
- any-glob-to-any-file: 'src/**/*'
|
|
15
|
-
- any-glob-to-any-file: 'config.schema.json'
|
|
16
|
-
|
|
17
|
-
# Add 'dependencies' label to any change to src files within the source dir EXCEPT for the docs sub-folder
|
|
18
|
-
dependencies:
|
|
19
|
-
- changed-files:
|
|
20
|
-
- any-glob-to-any-file: 'package.json'
|
|
21
|
-
- any-glob-to-any-file: 'package-lock.json'
|
|
22
|
-
|
|
23
|
-
# Add 'beta' label to any PR that is opened against the `beta` branch
|
|
24
|
-
beta:
|
|
25
|
-
- base-branch: 'beta*'
|
|
26
|
-
|
|
27
|
-
# Add 'alpha' label to any PR that is opened against the `alpha` branch
|
|
28
|
-
alpha:
|
|
29
|
-
- base-branch: 'alpha*'
|
|
30
|
-
|
|
31
|
-
# Add 'latest' label to any PR that is opened against the `latest` branch
|
|
32
|
-
latest:
|
|
33
|
-
- base-branch: 'latest'
|
|
34
|
-
|
|
35
|
-
# Add 'workflow' to any changes within 'workflow' folder or any subfolders
|
|
36
|
-
workflow:
|
|
37
|
-
- changed-files:
|
|
38
|
-
- any-glob-to-any-file: .github/**
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
#!/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* This scripts queries the npm registry to pull out the latest version for a given tag.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import assert from 'node:assert'
|
|
8
|
-
import child_process from 'node:child_process'
|
|
9
|
-
import fs from 'node:fs'
|
|
10
|
-
import process from 'node:process'
|
|
11
|
-
|
|
12
|
-
const BRANCH_VERSION_PATTERN = /^([A-Z]+)-(\d+\.\d+\.\d+)$/i
|
|
13
|
-
|
|
14
|
-
// Load the contents of the package.json file
|
|
15
|
-
const packageJSON = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
16
|
-
|
|
17
|
-
const refArgument = process.argv[2]
|
|
18
|
-
const tagArgument = process.argv[3] || 'latest'
|
|
19
|
-
|
|
20
|
-
if (!refArgument) {
|
|
21
|
-
console.error('ref argument is missing')
|
|
22
|
-
console.error('Usage: npm-version-script-esm.js <ref> [tag]')
|
|
23
|
-
process.exit(1)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Queries the NPM registry for the latest version for the provided base version and tag.
|
|
28
|
-
* If the tag is latest, then the base version is returned if it exists. For other tags, the latest
|
|
29
|
-
* version found for that base version and tag is returned.
|
|
30
|
-
* @param baseVersion The base version to query for, e.g. 2.0.0
|
|
31
|
-
* @param tag The tag to query for, e.g. beta or latest
|
|
32
|
-
* @returns {string} Returns the version, or '' if not found
|
|
33
|
-
*/
|
|
34
|
-
function getTagVersionFromNpm(baseVersion, tag) {
|
|
35
|
-
try {
|
|
36
|
-
return JSON.parse(child_process.execSync(`npm info ${packageJSON.name} versions --json`).toString('utf8').trim())
|
|
37
|
-
.filter(v => tag === 'latest' ? v === baseVersion : v.startsWith(`${baseVersion}-${tag}.`)) // find all published versions for this base version and tag
|
|
38
|
-
.reduce((_, current) => current, '') // choose the last as they're sorted in ascending order, or '' if there are none
|
|
39
|
-
} catch (e) {
|
|
40
|
-
console.error(`Failed to query the npm registry for the latest version for tag: ${tag}`, e)
|
|
41
|
-
// throw e;
|
|
42
|
-
return ''
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function desiredTargetVersion(ref) {
|
|
47
|
-
// ref is a GitHub action ref string
|
|
48
|
-
if (ref.startsWith('refs/pull/')) {
|
|
49
|
-
throw new Error('The version script was executed inside a PR!')
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
assert(ref.startsWith('refs/heads/'))
|
|
53
|
-
const branchName = ref.slice('refs/heads/'.length)
|
|
54
|
-
|
|
55
|
-
const results = branchName.match(BRANCH_VERSION_PATTERN)
|
|
56
|
-
if (results !== null) {
|
|
57
|
-
if (results[1] !== tagArgument) {
|
|
58
|
-
console.warn(`The base branch name (${results[1]}) differs from the tag name ${tagArgument}`)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return results[2]
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
throw new Error(`Malformed branch name for ref: ${ref}. Can't derive the base version. Use a branch name like: beta-x.x.x or alpha-x.x.x`)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// derive the base version from the branch ref
|
|
68
|
-
const baseVersion = desiredTargetVersion(refArgument)
|
|
69
|
-
|
|
70
|
-
// query the npm registry for the latest version of the provided tag name
|
|
71
|
-
const latestReleasedVersion = getTagVersionFromNpm(baseVersion, tagArgument) // e.g. 0.7.0-beta.12
|
|
72
|
-
|
|
73
|
-
let publishTag
|
|
74
|
-
|
|
75
|
-
if (latestReleasedVersion) {
|
|
76
|
-
console.warn(`Latest published version for ${baseVersion} with tag ${tagArgument} is ${latestReleasedVersion}`)
|
|
77
|
-
publishTag = latestReleasedVersion // set this released beta or alpha to be incremented
|
|
78
|
-
} else {
|
|
79
|
-
console.warn(`No published versions for ${baseVersion} with tag ${tagArgument}`)
|
|
80
|
-
publishTag = baseVersion // start off with a new beta or alpha version
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (packageJSON.version !== publishTag) {
|
|
84
|
-
// report the change for CI
|
|
85
|
-
console.warn(`Changing version in package.json from ${packageJSON.version} to ${publishTag}`)
|
|
86
|
-
|
|
87
|
-
// save the package.json
|
|
88
|
-
packageJSON.version = publishTag
|
|
89
|
-
fs.writeFileSync('package.json', JSON.stringify(packageJSON, null, 2))
|
|
90
|
-
|
|
91
|
-
// perform the same change to the package-lock.json
|
|
92
|
-
const packageLockJSON = JSON.parse(fs.readFileSync('package-lock.json', 'utf8'))
|
|
93
|
-
packageLockJSON.version = publishTag
|
|
94
|
-
fs.writeFileSync('package-lock.json', JSON.stringify(packageLockJSON, null, 2))
|
|
95
|
-
} else {
|
|
96
|
-
console.warn(`Leaving version in package.json at ${packageJSON.version}`)
|
|
97
|
-
}
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- 'beta-*'
|
|
7
|
-
- 'beta'
|
|
8
|
-
- 'latest'
|
|
9
|
-
workflow_dispatch:
|
|
10
|
-
inputs:
|
|
11
|
-
release_type:
|
|
12
|
-
description: Release channel
|
|
13
|
-
required: true
|
|
14
|
-
type: choice
|
|
15
|
-
options:
|
|
16
|
-
- latest
|
|
17
|
-
- beta
|
|
18
|
-
- alpha
|
|
19
|
-
default: latest
|
|
20
|
-
is_esm:
|
|
21
|
-
description: Package is ESM
|
|
22
|
-
required: true
|
|
23
|
-
type: boolean
|
|
24
|
-
default: true
|
|
25
|
-
version_override:
|
|
26
|
-
description: Exact version (for example 2.1.0). Leave empty for auto bump.
|
|
27
|
-
required: false
|
|
28
|
-
type: string
|
|
29
|
-
version_bump:
|
|
30
|
-
description: Auto bump type when version_override is empty
|
|
31
|
-
required: false
|
|
32
|
-
type: choice
|
|
33
|
-
options:
|
|
34
|
-
- patch
|
|
35
|
-
- minor
|
|
36
|
-
- major
|
|
37
|
-
default: patch
|
|
38
|
-
max_attempts:
|
|
39
|
-
description: Max retries for prerelease collision handling
|
|
40
|
-
required: false
|
|
41
|
-
type: number
|
|
42
|
-
default: 5
|
|
43
|
-
|
|
44
|
-
# Cancel any in-progress workflow for the same branch. A new push should
|
|
45
|
-
# supersede the previous run rather than racing it to publish.
|
|
46
|
-
concurrency:
|
|
47
|
-
group: release-${{ github.ref }}
|
|
48
|
-
cancel-in-progress: true
|
|
49
|
-
|
|
50
|
-
jobs:
|
|
51
|
-
# ─── QUALITY GATE (all branches) ────────────────────────────────────────────
|
|
52
|
-
# Build and test run for EVERY push, regardless of branch. Both the beta
|
|
53
|
-
# and stable release paths depend on these passing before anything is
|
|
54
|
-
# published or version-bumped.
|
|
55
|
-
|
|
56
|
-
# 1️⃣ Build and test
|
|
57
|
-
build_and_test:
|
|
58
|
-
uses: homebridge/.github/.github/workflows/nodejs-build-and-test.yml@latest
|
|
59
|
-
with:
|
|
60
|
-
enable_coverage: false
|
|
61
|
-
secrets:
|
|
62
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
63
|
-
|
|
64
|
-
# 2️⃣ Lint
|
|
65
|
-
lint:
|
|
66
|
-
needs: build_and_test
|
|
67
|
-
uses: homebridge/.github/.github/workflows/eslint.yml@latest
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# ─── BETA RELEASE (branches starting with "beta") ────────────────────────────
|
|
71
|
-
|
|
72
|
-
# 3️⃣ Publish beta to NPM (OIDC — id-token required here and in the reusable workflow)
|
|
73
|
-
beta-publish:
|
|
74
|
-
if: startsWith(github.ref_name, 'beta')
|
|
75
|
-
needs: lint
|
|
76
|
-
permissions:
|
|
77
|
-
id-token: write
|
|
78
|
-
uses: homebridge/.github/.github/workflows/npm-publish-esm-oidc.yml@latest
|
|
79
|
-
with:
|
|
80
|
-
tag: 'beta'
|
|
81
|
-
dynamically_adjust_version: true
|
|
82
|
-
npm_version_command: 'pre'
|
|
83
|
-
pre_id: 'beta'
|
|
84
|
-
|
|
85
|
-
# 4️⃣ Create GitHub pre-release
|
|
86
|
-
beta-pre-release:
|
|
87
|
-
if: startsWith(github.ref_name, 'beta')
|
|
88
|
-
needs: beta-publish
|
|
89
|
-
uses: homebridge/.github/.github/workflows/pre-release.yml@latest
|
|
90
|
-
with:
|
|
91
|
-
npm_version: ${{ needs.beta-publish.outputs.NPM_VERSION }}
|
|
92
|
-
body: |
|
|
93
|
-
**Beta Release**
|
|
94
|
-
**Version**: v${{ needs.beta-publish.outputs.NPM_VERSION }}
|
|
95
|
-
[How To Test Beta Releases](https://github.com/homebridge-plugins/homebridge-august/wiki/Beta-Version)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
# ─── STABLE RELEASE (branch: "latest") ───────────────────────────────────────
|
|
99
|
-
|
|
100
|
-
# 3️⃣ Determine release type, ESM status, and branch name
|
|
101
|
-
determine-release-type:
|
|
102
|
-
if: github.ref_name == 'latest'
|
|
103
|
-
needs: lint
|
|
104
|
-
uses: homebridge/.github/.github/workflows/determine-release-type.yml@latest
|
|
105
|
-
with:
|
|
106
|
-
ref_name: ${{ github.ref_name }}
|
|
107
|
-
|
|
108
|
-
# 4️⃣ Update version and changelog using the scripts
|
|
109
|
-
update-version:
|
|
110
|
-
if: github.ref_name == 'latest'
|
|
111
|
-
needs: determine-release-type
|
|
112
|
-
uses: homebridge/.github/.github/workflows/update-version.yml@latest
|
|
113
|
-
with:
|
|
114
|
-
release_type: ${{ needs.determine-release-type.outputs.release_type || inputs.release_type }}
|
|
115
|
-
is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' || inputs.is_esm == 'true' }}
|
|
116
|
-
version_override: ${{ inputs.version_override }}
|
|
117
|
-
version_bump: ${{ inputs.version_bump }}
|
|
118
|
-
|
|
119
|
-
# 5️⃣ Publish to NPM and create GitHub release (OIDC — id-token required here and in the reusable workflow)
|
|
120
|
-
publish-release:
|
|
121
|
-
if: github.ref_name == 'latest'
|
|
122
|
-
needs: [determine-release-type, update-version]
|
|
123
|
-
permissions:
|
|
124
|
-
id-token: write
|
|
125
|
-
contents: write
|
|
126
|
-
uses: homebridge/.github/.github/workflows/publish-release.yml@latest
|
|
127
|
-
with:
|
|
128
|
-
release_type: ${{ needs.determine-release-type.outputs.release_type }}
|
|
129
|
-
version: ${{ needs.update-version.outputs.version }}
|
|
130
|
-
is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
|
|
131
|
-
version_override: ${{ inputs.version_override || '' }}
|
|
132
|
-
version_bump: ${{ inputs.version_bump || 'patch' }}
|
|
133
|
-
max_attempts: ${{ inputs.max_attempts || 5 }}
|
|
134
|
-
secrets:
|
|
135
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
136
|
-
|
|
137
|
-
# 6️⃣ Promote branch if this is a prerelease (alpha/beta)
|
|
138
|
-
promote-branch:
|
|
139
|
-
if: ${{ github.ref_name == 'latest' && needs.determine-release-type.outputs.release_type != 'latest' && needs.determine-release-type.outputs.release_type != 'skip' }}
|
|
140
|
-
needs: [determine-release-type, publish-release]
|
|
141
|
-
uses: homebridge/.github/.github/workflows/promote-branch.yml@latest
|
|
142
|
-
with:
|
|
143
|
-
branch_name: ${{ needs.determine-release-type.outputs.branch_name }}
|
|
144
|
-
release_type: ${{ needs.determine-release-type.outputs.release_type }}
|
|
145
|
-
is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' || inputs.is_esm == 'true' }}
|
|
146
|
-
|
|
147
|
-
# 7️⃣ Notify if any job fails
|
|
148
|
-
workflow-failure:
|
|
149
|
-
if: failure()
|
|
150
|
-
needs: [build_and_test, lint, determine-release-type, update-version, publish-release, promote-branch]
|
|
151
|
-
uses: homebridge/.github/.github/workflows/report-failure.yml@latest
|
|
152
|
-
with:
|
|
153
|
-
workflow_name: ${{ github.workflow }}
|
|
154
|
-
job_name: ${{ github.job }}
|
|
155
|
-
run_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
156
|
-
|
|
157
|
-
# 8️⃣ Post to Discord (Beta + Stable)
|
|
158
|
-
discord:
|
|
159
|
-
name: Release Notifications
|
|
160
|
-
if: ${{ always() && ((startsWith(github.ref_name, 'beta') && needs.beta-publish.result == 'success') || (github.ref_name == 'latest' && needs.publish-release.result == 'success')) }}
|
|
161
|
-
needs: [beta-publish, update-version, publish-release]
|
|
162
|
-
uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
|
|
163
|
-
with:
|
|
164
|
-
title: ${{ startsWith(github.ref_name, 'beta') && 'Homebridge August Beta Release' || 'Homebridge August Release' }}
|
|
165
|
-
description: |
|
|
166
|
-
Version `v${{ startsWith(github.ref_name, 'beta') && needs.beta-publish.outputs.NPM_VERSION || needs.update-version.outputs.version }}`
|
|
167
|
-
url: "https://github.com/homebridge-plugins/homebridge-august/releases/tag/v${{ startsWith(github.ref_name, 'beta') && needs.beta-publish.outputs.NPM_VERSION || needs.update-version.outputs.version }}"
|
|
168
|
-
secrets:
|
|
169
|
-
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_LATEST }}
|
package/SECURITY.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Supported Versions
|
|
4
|
-
|
|
5
|
-
Use this section to tell people about which versions of your project are
|
|
6
|
-
currently being supported with security updates.
|
|
7
|
-
|
|
8
|
-
| Version | Supported |
|
|
9
|
-
| ------- | ------------------ |
|
|
10
|
-
| 1.0.0 | :white_check_mark: |
|
|
11
|
-
| < 0.0.0 | :x: |
|
|
12
|
-
|
|
13
|
-
## Reporting a Vulnerability
|
|
14
|
-
|
|
15
|
-
Use this section to tell people how to report a vulnerability.
|
|
16
|
-
|
|
17
|
-
Tell them where to go, how often they can expect to get an update on a
|
|
18
|
-
reported vulnerability, what to expect if the vulnerability is accepted or
|
|
19
|
-
declined, etc.
|