From aa4abaa046be089f0ab6b585b5350d7292dfaf18 Mon Sep 17 00:00:00 2001 From: Willie Chalmers III Date: Mon, 10 Aug 2026 11:09:10 -0700 Subject: [PATCH] feat: publish organization contribution templates Provide native issue forms and the readable pull request outline from the pinned repository-tooling release. Co-Authored-By: Codex --- .github/ISSUE_TEMPLATE/bug.yml | 34 ++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 2 ++ .github/ISSUE_TEMPLATE/feature.yml | 27 +++++++++++++++++++++ .github/pull_request_template.md | 11 +++++++++ .github/workflows/ci.yml | 31 ++++++++++++++++++++++++ AGENTS.md | 9 +++++++ CLAUDE.md | 3 +++ README.md | 11 +++++++-- SOURCE.json | 11 +++++++++ package.json | 12 +++++++++ tests/community-health.test.mjs | 39 ++++++++++++++++++++++++++++++ 11 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/ci.yml create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 SOURCE.json create mode 100644 package.json create mode 100644 tests/community-health.test.mjs diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..d629bca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,34 @@ +name: Bug report +description: Report behavior that did not work as expected. +title: "" +labels: + - bug +body: + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce + description: What is the shortest sequence that demonstrates the problem? + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What should have happened? + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + description: What happened instead? + validations: + required: true + - type: textarea + id: context + attributes: + label: Additional context + description: Add screenshots, logs, links, or other useful context if available. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..8005e32 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,2 @@ +blank_issues_enabled: false +contact_links: [] diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 0000000..21e3f2e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,27 @@ +name: Feature request +description: Suggest an improvement or new capability. +title: "" +labels: + - enhancement +body: + - type: textarea + id: problem + attributes: + label: Problem + description: What need or limitation should this address? + validations: + required: true + - type: textarea + id: proposed-change + attributes: + label: Proposed change + description: What outcome or behavior would address the problem? + validations: + required: true + - type: textarea + id: context + attributes: + label: Additional context + description: Add examples, links, or other useful context if available. + validations: + required: false diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..0d16bf0 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +# TL;DR + +# Overview of Changes + +## [subheading if needed] + +## [more subheadings if needed] + +# Follow-ups + +- [ ] Future issue title if needed diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..45a5b23 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: CI + +on: + pull_request: + branches: [main] + push: + branches-ignore: [main] + +permissions: + contents: read + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + name: Validate + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Node + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + with: + node-version: 24 + + - name: Validate published community files + run: npm run check diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..57e8866 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,9 @@ +# Working in the organization community-health repository + +The files under `.github/` are published copies from the pinned +`LasVegasForTransit/repository-tooling` release. Do not edit them independently. +Update the source repository, publish a release, then update the files and +checksums here together. + +Run `npm run check` before opening a pull request. Use the organization +`github-contribution` skill for GitHub creation. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..2cc2d46 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +# Organization community-health files + +Follow [`AGENTS.md`](AGENTS.md). diff --git a/README.md b/README.md index 8a8f458..d2f08a7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ -# .github -Organization-wide GitHub contribution templates and community health files. +# Las Vegans for Better Transit + +This special repository publishes the native GitHub issue forms and pull +request template inherited by LVBT repositories. + +The canonical files live in +[`LasVegasForTransit/repository-tooling`](https://github.com/LasVegasForTransit/repository-tooling). +[`SOURCE.json`](SOURCE.json) pins the release and checksums published here. +Individual repositories should not copy or override these templates. diff --git a/SOURCE.json b/SOURCE.json new file mode 100644 index 0000000..a636505 --- /dev/null +++ b/SOURCE.json @@ -0,0 +1,11 @@ +{ + "repository": "LasVegasForTransit/repository-tooling", + "ref": "v1.0.0", + "commit": "53ef865ad7bc38239837bfe53900103b1ecf8854", + "files": { + ".github/ISSUE_TEMPLATE/bug.yml": "04ad19b1762d23f0e07aa08b0929752663ae158c44f952489f17ea01420f800f", + ".github/ISSUE_TEMPLATE/feature.yml": "6e1a717193eaf7a24a7e90caa4d31b9173dc18fc101401d53af45bb2a9fff0dd", + ".github/ISSUE_TEMPLATE/config.yml": "8b09e7df09fc7534371988062769ee427af2954a02c04c763e8a8005be0f2be4", + ".github/pull_request_template.md": "38ee62db634c37469a06d37bfac8c63a8c1592a7fa4c612b8c8206b68ef8b953" + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2a841a6 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "lvbt-community-health", + "private": true, + "version": "1.0.0", + "type": "module", + "engines": { + "node": ">=24" + }, + "scripts": { + "check": "node --test" + } +} diff --git a/tests/community-health.test.mjs b/tests/community-health.test.mjs new file mode 100644 index 0000000..89b67b4 --- /dev/null +++ b/tests/community-health.test.mjs @@ -0,0 +1,39 @@ +import assert from 'node:assert/strict'; +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import test from 'node:test'; + +const root = path.resolve(import.meta.dirname, '..'); +const read = (file) => readFile(path.join(root, file)); + +test('published community files match the pinned tooling release', async () => { + const source = JSON.parse(await read('SOURCE.json')); + assert.equal(source.repository, 'LasVegasForTransit/repository-tooling'); + assert.equal(source.ref, 'v1.0.0'); + + for (const [file, expected] of Object.entries(source.files)) { + const digest = createHash('sha256').update(await read(file)).digest('hex'); + assert.equal(digest, expected, file); + } +}); + +test('the pull request template contains only the readable organization outline', async () => { + const template = (await read('.github/pull_request_template.md')).toString(); + assert.equal( + template, + `# TL;DR + +# Overview of Changes + +## [subheading if needed] + +## [more subheadings if needed] + +# Follow-ups + +- [ ] Future issue title if needed +`, + ); + assert.doesNotMatch(template, /