diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6f10f91..46add1f 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,8 @@ "name": "repokit", "source": "./plugins/repokit", "description": "Scaffold standard-compliant repos (/new-repo) and apply the repo standard while you work.", - "version": "0.1.0" + "version": "0.2.0", + "category": "productivity" } ] } diff --git a/.gitignore b/.gitignore index d673bef..ca9b5de 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,9 @@ __pycache__/ release-assets/ *.nupkg node_modules/ + +# Bundled scaffolding templates are payload, never local cruft: a GLOBAL gitignore +# may match template filenames (a `*private*` rule ate powershell-module's +# Private/.gitkeep; env rules ate docker-compose's .env.example). This repo-level +# negation outranks the global file so template files always stay tracked. +!plugins/repokit/skills/new-repo/templates/** diff --git a/CHANGELOG.md b/CHANGELOG.md index ebfcc5d..804b552 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.0] - 2026-07-06 + ### Added - A `docker-compose` repo type for `/new-repo`: a minimal `compose.yaml` (named volumes for data, @@ -19,11 +21,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 every output, and a scheduled sync workflow opens a PR when the upstream collection changes. The collection is committed, so the repo builds with just Docker — no Postman account. - The `repo-standard` skill now tells agents to check the remote after a push/PR — CI/Actions status and GitHub Copilot / reviewer feedback — before calling work done. +- A `where-things-go.md` placement guide in the `repo-standard` skill: "I have X — where does it + go, how do I create the place if it's missing, and on what convention?" +- A naming-conventions section in the standard: which casing each convention-bearing file and + directory follows, and why (match the ecosystem that owns the name). +- `README.md` documents the [`PBNZ/pbnz-skills`](https://github.com/PBNZ/pbnz-skills) marketplace + listing as an alternative install channel; this repo remains the canonical home (ADR-0004). ### Changed - The plugin now displays as `repo-kit` in the `/plugin` UI (via `displayName`), matching the marketplace name. - `/new-repo` now sets a repo-local commit identity using the GitHub noreply email by default (so a new repo doesn't leak a personal address) and initialises the default branch as `main`. +- `category` moved from `plugin.json` to the marketplace entry — Claude Code reads it from the + marketplace manifest, not the plugin manifest (flagged by `claude plugin validate`). + +### Fixed + +- Two bundled template files existed only in the author's working tree — a global gitignore + (`*private*` and env patterns) had silently kept them out of git, so fresh clones and installed + copies scaffolded incomplete repos: `powershell-module/core/Private/.gitkeep` (#2) and + `docker-compose/core/.env.example`. Both are now tracked, and the repo's `.gitignore` un-ignores + everything under the bundled `templates/` tree so this cannot recur. +- The `powershell-module` manifest template now matches the type's modern-PowerShell-only tooling + (pwsh CI, `Publish-PSResource`): `PowerShellVersion = '7.0'`, `CompatiblePSEditions = @('Core')`, + plus a hint to add the Gallery's compatibility tags (`PSEdition_Core` + OS tags) before + publishing (#3). ## [0.1.0] - 2026-06-21 @@ -36,5 +58,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Templates for the **Core**, **Public**, and **Published** tiers, plus the **powershell-module** type overlay. The other types ship as stubs. -[Unreleased]: https://github.com/PBNZ/repo-kit/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/PBNZ/repo-kit/compare/v0.2.0...HEAD +[0.2.0]: https://github.com/PBNZ/repo-kit/compare/v0.1.0...v0.2.0 [0.1.0]: https://github.com/PBNZ/repo-kit/releases/tag/v0.1.0 diff --git a/README.md b/README.md index 9ed06b6..fe53a1e 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,13 @@ flowchart LR /reload-plugins ``` +RepoKit is also listed in the [`PBNZ/pbnz-skills`](https://github.com/PBNZ/pbnz-skills) +marketplace (a directory of PBNZ plugins); if you already have that marketplace added: + +```text +/plugin install repokit@pbnz-skills +``` + Then scaffold a repo: ```text diff --git a/docs/adr/0004-public-release-and-distribution.md b/docs/adr/0004-public-release-and-distribution.md new file mode 100644 index 0000000..02aa037 --- /dev/null +++ b/docs/adr/0004-public-release-and-distribution.md @@ -0,0 +1,41 @@ +# ADR-0004: Going public, and distribution via two marketplaces + +- **Status:** accepted +- **Date:** 2026-07-06 + +## Context + +RepoKit was built private-first (ADR-0001) and has reached the point of being useful beyond its +author: three built-out types, a dogfooded standard, green CI, and a first real-world scaffold +test behind it. Going public raised two distribution questions: + +1. **Where do people install from?** RepoKit ships its own self-contained marketplace + (ADR-0001 D1) — but PBNZ also operates [`pbnz-skills`](https://github.com/PBNZ/pbnz-skills), + a public marketplace repo that currently lists nothing (its only plugin, Newton, moved to a + dedicated repo, and its README declared "one repo per plugin, not back here"). +2. **What does "ready to be public" require?** The repo already dogfoods the Public tier + (LICENSE, SECURITY, CoC, PR/issue templates, CI), so the gap was release hygiene (#4) and the + GitHub-side settings (topics, branch rules, security features). + +## Decision + +- **Go public with release 0.2.0**, clearing the release-hygiene backlog (#4): retroactive tag + `v0.1.0` on the commit that declared 0.1.0, `v0.2.0` on the release commit, matching GitHub + releases, and versions bumped in `plugin.json` + `marketplace.json`. +- **This repo stays the canonical home and marketplace.** The primary install is + `/plugin marketplace add PBNZ/repo-kit`. +- **Also list the plugin in `PBNZ/pbnz-skills` as a reference**, using a `git-subdir` marketplace + source pointing at `plugins/repokit` in this repo. This is a listing, not a copy: no plugin + content is duplicated into pbnz-skills, so the maintained-in-two-places failure that prompted + pbnz-skills' one-repo-per-plugin rule cannot recur. pbnz-skills becomes a directory of PBNZ + plugins whose canonical homes are their own repos. + +## Consequences + +- "Publish" remains bump + tag + push (ADR-0001 D1). The pbnz-skills listing is a second + discovery channel that needs **no per-release maintenance** — the reference entry carries no + version pin, so installs always fetch the current tagged content from this repo. +- pbnz-skills' README/policy is amended in that repo (reference listings welcome; + content-carrying plugins still live in their own repos). +- This repo must remain public for either channel to work; flipping visibility is the release + act, done by the maintainer. diff --git a/plugins/repokit/.claude-plugin/plugin.json b/plugins/repokit/.claude-plugin/plugin.json index 45e7789..75bb25c 100644 --- a/plugins/repokit/.claude-plugin/plugin.json +++ b/plugins/repokit/.claude-plugin/plugin.json @@ -3,13 +3,12 @@ "name": "repokit", "displayName": "repo-kit", "description": "Scaffold standard-compliant repos with /new-repo, and apply the RepoKit standard (conventions + pre-commit/pre-PR checklists) while working in any compliant repo.", - "version": "0.1.0", + "version": "0.2.0", "author": { "name": "PBNZ" }, "homepage": "https://github.com/PBNZ/repo-kit", "repository": "https://github.com/PBNZ/repo-kit", "license": "Apache-2.0", - "keywords": ["scaffolding", "repo-standard", "templates", "conventional-commits", "agent-skills"], - "category": "productivity" + "keywords": ["scaffolding", "repo-standard", "templates", "conventional-commits", "agent-skills"] } diff --git a/plugins/repokit/skills/new-repo/templates/types/docker-compose/core/.env.example b/plugins/repokit/skills/new-repo/templates/types/docker-compose/core/.env.example new file mode 100644 index 0000000..5e75676 --- /dev/null +++ b/plugins/repokit/skills/new-repo/templates/types/docker-compose/core/.env.example @@ -0,0 +1,4 @@ +# Copy to .env (gitignored) and fill in. .env holds secrets and local config; +# this .env.example is committed as the template. +APP_PORT=8080 +DB_PASSWORD=change-me diff --git a/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/Private/.gitkeep b/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/Private/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/{{ModuleName}}.psd1.tmpl b/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/{{ModuleName}}.psd1.tmpl index 401d9a1..59fe1d5 100644 --- a/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/{{ModuleName}}.psd1.tmpl +++ b/plugins/repokit/skills/new-repo/templates/types/powershell-module/core/{{ModuleName}}.psd1.tmpl @@ -1,10 +1,11 @@ @{ - RootModule = '{{ModuleName}}.psm1' - ModuleVersion = '0.1.0' # x-release-please-version - GUID = '{{Guid}}' - Author = '{{author}}' - Description = '{{description}}' - PowerShellVersion = '5.1' + RootModule = '{{ModuleName}}.psm1' + ModuleVersion = '0.1.0' # x-release-please-version + GUID = '{{Guid}}' + Author = '{{author}}' + Description = '{{description}}' + PowerShellVersion = '7.0' + CompatiblePSEditions = @('Core') # List the Public/ functions you want exported (explicit — no wildcards). FunctionsToExport = @() @@ -14,7 +15,9 @@ PrivateData = @{ PSData = @{ - # Fill these before publishing to the PowerShell Gallery. + # Fill these before publishing to the PowerShell Gallery. For the + # Gallery's compatibility filters, tag the edition and OS you support, + # e.g. 'PSEdition_Core', 'Windows', 'Linux', 'macOS'. Tags = @() LicenseUri = '' ProjectUri = ''