From 5b7a516b18a8c35473a0d7013fadd85655c6bdd9 Mon Sep 17 00:00:00 2001 From: outreach <280983584+hivecommons-hive[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 17:40:08 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=96=20docs:=20point=20newcomers=20at?= =?UTF-8?q?=20starter=20issues,=20issue=20forms=20and=20the=20community=20?= =?UTF-8?q?in=20CONTRIBUTING.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: outreach <280983584+hivecommons-hive[bot]@users.noreply.github.com> --- CONTRIBUTING.md | 11 +++++++++ test/community-links.test.js | 43 ++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9943b50..813409d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,17 @@ Thanks for helping improve pluk. This project follows the same lightweight contribution expectations as other hivecommons tools. +See [ROADMAP.md](ROADMAP.md) for what has shipped, what is planned next and what is out of scope for now. + +## Finding something to work on + +- Browse [`good first issue`](https://github.com/hivecommons/pluk/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) for small, well-scoped tasks, or [`help wanted`](https://github.com/hivecommons/pluk/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) for work maintainers would welcome help with. +- pluk misclassified an agent CLI's output, or you want a new CLI supported? Use the [pattern request form](https://github.com/hivecommons/pluk/issues/new?template=pattern_request.yml) (`.github/ISSUE_TEMPLATE/pattern_request.yml`), or send the fix yourself by following [Adding or fixing a pattern set](#adding-or-fixing-a-pattern-set). +- Found a bug? Use the [bug report form](https://github.com/hivecommons/pluk/issues/new?template=bug_report.yml) (`.github/ISSUE_TEMPLATE/bug_report.yml`). +- Have an idea for a new feature? Use the [feature request form](https://github.com/hivecommons/pluk/issues/new?template=feature_request.yml) (`.github/ISSUE_TEMPLATE/feature_request.yml`). +- Ask setup and contributor questions on [Discord](https://hivecommons.dev/discord). +- Meet the maintainers at the biweekly [Hive Commons community meeting](https://docs.hivecommons.dev/docs/community/meetings). + ## Local development Requirements: diff --git a/test/community-links.test.js b/test/community-links.test.js index f6507a8..5914eb1 100644 --- a/test/community-links.test.js +++ b/test/community-links.test.js @@ -1,14 +1,18 @@ -// Guards the community entry points in the README and the issue chooser so -// they stay in step with the hivecommons/hive README Community line. +// Guards the community entry points in the README, the issue chooser and +// CONTRIBUTING.md so they stay in step with the hivecommons/hive README +// Community line. import { test } from 'node:test'; import assert from 'node:assert/strict'; -import { readFileSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); const README = readFileSync(join(ROOT, 'README.md'), 'utf8'); -const CHOOSER = readFileSync(join(ROOT, '.github', 'ISSUE_TEMPLATE', 'config.yml'), 'utf8'); +const TEMPLATES = join(ROOT, '.github', 'ISSUE_TEMPLATE'); +const CHOOSER = readFileSync(join(TEMPLATES, 'config.yml'), 'utf8'); +const CONTRIBUTING = readFileSync(join(ROOT, 'CONTRIBUTING.md'), 'utf8'); +const ISSUES = 'https://github.com/hivecommons/pluk/issues'; const chooserUrls = [...CHOOSER.matchAll(/^\s+url:[ \t]*(\S+)$/gm)].map((m) => m[1]); const COMMUNITY_LINKS = [ @@ -26,3 +30,34 @@ for (const [name, url] of COMMUNITY_LINKS) { assert.ok(chooserUrls.includes(url), `.github/ISSUE_TEMPLATE/config.yml is missing ${url}`); }); } + +for (const label of ['good+first+issue', 'help+wanted']) { + test(`CONTRIBUTING.md links open "${label.replace(/\+/g, ' ')}" issues`, () => { + const url = `${ISSUES}?q=is%3Aissue+is%3Aopen+label%3A%22${label}%22`; + assert.ok(CONTRIBUTING.includes(`](${url})`), `CONTRIBUTING.md is missing ${url}`); + }); +} + +test('CONTRIBUTING.md links every issue form, and each linked form exists', () => { + const forms = [...CONTRIBUTING.matchAll(/\(https:\/\/github\.com\/hivecommons\/pluk\/issues\/new\?template=([^)\s]+)\)/g)].map((m) => m[1]); + for (const form of ['pattern_request.yml', 'bug_report.yml', 'feature_request.yml']) { + assert.ok(forms.includes(form), `CONTRIBUTING.md must link the ${form} issue form`); + } + for (const form of forms) { + assert.ok(existsSync(join(TEMPLATES, form)), `CONTRIBUTING.md links missing issue form ${form}`); + } +}); + +test('CONTRIBUTING.md links ROADMAP.md', () => { + assert.ok(CONTRIBUTING.includes('](ROADMAP.md)'), 'CONTRIBUTING.md is missing a ROADMAP.md link'); + assert.ok(existsSync(join(ROOT, 'ROADMAP.md')), 'ROADMAP.md linked from CONTRIBUTING.md is missing'); +}); + +for (const [name, url] of [ + ['Discord', 'https://hivecommons.dev/discord'], + ['community meeting', 'https://docs.hivecommons.dev/docs/community/meetings'], +]) { + test(`CONTRIBUTING.md links the Hive Commons ${name}`, () => { + assert.ok(CONTRIBUTING.includes(`](${url})`), `CONTRIBUTING.md is missing ${url}`); + }); +}