chore(github): establish repository governance and automation
Introduce essential GitHub configuration files to standardize project maintenance and contribution workflows. - Add PR and issue templates to improve contribution quality - Configure Dependabot for automated dependency management - Implement a workflow for automated PR labeling - Add FUNDING.yml for project support visibility - Update copilot-instructions.md with specific PR review standards and title requirements
This commit is contained in:
1 parent
0ec78567a6
commit
79cc2a12a9
6 files changed
+170
-1
No files matched your search
@@ -0,0 +1 @@
|
||||
custom: https://www.openhomefoundation.org
|
||||
@@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: "🐛 Report a bug"
|
||||
url: https://github.com/OHF-Voice/linux-voice-assistant/issues/new?template=bug_report.md
|
||||
about: Report bugs in the Linux Voice Assistant.
|
||||
- name: "💬 Discord community & support"
|
||||
url: https://discord.com/channels/330944238910963714/1464387232201703547
|
||||
about: Chat with the community and get help from other users.
|
||||
- name: "❓ Questions & how-to (Q&A)"
|
||||
url: https://github.com/OHF-Voice/linux-voice-assistant/discussions
|
||||
about: Ask how-to questions and search previous answers.
|
||||
- name: "💡 Feature requests & ideas"
|
||||
url: https://github.com/OHF-Voice/linux-voice-assistant/discussions
|
||||
about: Suggest and vote on new features and enhancements.
|
||||
@@ -0,0 +1,29 @@
|
||||
# What does this implement/fix?
|
||||
|
||||
<!-- Quick description and explanation of changes. -->
|
||||
|
||||
**Related issue (if applicable):**
|
||||
|
||||
- Fixes #<issue number>
|
||||
|
||||
## Types of changes
|
||||
|
||||
<!--
|
||||
Tick exactly one box. CI derives the label from the ticked box.
|
||||
-->
|
||||
|
||||
- [ ] Bugfix (non-breaking change which fixes an issue) — `bugfix`
|
||||
- [ ] New feature (non-breaking change which adds functionality) — `new-feature`
|
||||
- [ ] Enhancement to an existing feature — `enhancement`
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change`
|
||||
- [ ] Refactor (no behaviour change) — `refactor`
|
||||
- [ ] Documentation only — `documentation`
|
||||
- [ ] Maintenance / chore — `maintenance`
|
||||
- [ ] CI / workflow change — `ci`
|
||||
- [ ] Dependencies bump — `dependencies`
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] The code change is tested and works locally.
|
||||
- [ ] `./script/lint` passes.
|
||||
- [ ] `./script/tests` passes, and tests have been added/updated under `tests/` where applicable.
|
||||
@@ -9,4 +9,28 @@ For comprehensive development guidelines, see [AGENTS.md](../AGENTS.md).
|
||||
./script/setup --dev # Install dev dependencies
|
||||
./script/lint # Run all linting checks
|
||||
./script/tests # Run pytest unit tests
|
||||
```
|
||||
```
|
||||
|
||||
## PR Review Standards
|
||||
|
||||
### Review Philosophy
|
||||
- Only comment when confident an issue exists
|
||||
- Be concise: one sentence per comment when possible
|
||||
- Focus on actionable feedback, not observations
|
||||
- When reviewing text, only comment on clarity issues if the text is genuinely confusing or could lead to errors
|
||||
- If you're uncertain whether something is an issue, don't comment
|
||||
|
||||
### What to Analyze
|
||||
- Code quality and style consistency with the existing codebase
|
||||
- Potential bugs or issues
|
||||
- Performance implications
|
||||
- Blocking IO in async code
|
||||
- Security concerns
|
||||
- Test coverage
|
||||
- Documentation updates if needed
|
||||
|
||||
### Project Standards
|
||||
Respect the project standards as outlined in AGENTS.md. Any deviations must be raised as `[PROBLEM]`.
|
||||
|
||||
### PR Title
|
||||
The PR title must be a functional description of the change. It must NOT contain conventional commit prefixes such as `feat:`, `fix:`, `refactor:`, `chore:`, etc. Labels categorize PRs, not the title. Flag as `[PROBLEM]` if the title uses such prefixes.
|
||||
@@ -0,0 +1,14 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
- package-ecosystem: "pip"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
groups:
|
||||
dependencies:
|
||||
patterns:
|
||||
- "*"
|
||||
@@ -0,0 +1,87 @@
|
||||
name: PR Labels
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
- synchronize
|
||||
- labeled
|
||||
- unlabeled
|
||||
- reopened
|
||||
- ready_for_review
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
apply_label:
|
||||
name: Apply
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.user.type != 'Bot'
|
||||
steps:
|
||||
- name: 🏷 Apply label from PR description checkbox
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3
|
||||
with:
|
||||
script: |
|
||||
const known = [
|
||||
'breaking-change', 'bugfix', 'refactor',
|
||||
'new-feature', 'enhancement', 'maintenance',
|
||||
'ci', 'dependencies', 'documentation',
|
||||
];
|
||||
|
||||
const { owner, repo } = context.repo;
|
||||
const issue_number = context.payload.pull_request.number;
|
||||
const current = (context.payload.pull_request.labels || [])
|
||||
.map(l => l.name);
|
||||
|
||||
const alreadyLabelled = current.filter(n => known.includes(n));
|
||||
if (alreadyLabelled.length === 1) {
|
||||
core.info(
|
||||
`Skipping: PR already labelled '${alreadyLabelled[0]}'.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const body = context.payload.pull_request.body || '';
|
||||
const re = /^\s*-\s*\[x\][^`\n]*`([^`]+)`/gim;
|
||||
const ticked = [];
|
||||
for (const m of body.matchAll(re)) {
|
||||
const name = m[1];
|
||||
if (known.includes(name) && !ticked.includes(name)) {
|
||||
ticked.push(name);
|
||||
}
|
||||
}
|
||||
|
||||
if (ticked.length === 0) {
|
||||
core.setFailed(
|
||||
'No "Types of changes" checkbox is ticked in the PR ' +
|
||||
'description. Edit the description and tick exactly ' +
|
||||
'one box so this PR can be release-noted.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (ticked.length > 1) {
|
||||
core.setFailed(
|
||||
`Multiple "Types of changes" checkboxes are ticked ` +
|
||||
`(${ticked.join(', ')}). Tick exactly one.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const desired = ticked[0];
|
||||
|
||||
for (const name of current) {
|
||||
if (known.includes(name) && name !== desired) {
|
||||
await github.rest.issues.removeLabel({
|
||||
owner, repo, issue_number, name,
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
if (!current.includes(desired)) {
|
||||
await github.rest.issues.addLabels({
|
||||
owner, repo, issue_number, labels: [desired],
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user