diff --git a/.github/agents/pm-assistant.agent.md b/.github/agents/pm-assistant.agent.md index bb4893f..068298d 100644 --- a/.github/agents/pm-assistant.agent.md +++ b/.github/agents/pm-assistant.agent.md @@ -2,7 +2,6 @@ name: PM Assistant description: Conversational guide for managing your workload. Interviews you about your current goal and routes you through the right prompts in the right order - daily focus, backlog review, iteration planning, and more. tools: [read, search] -model: GPT-5.4 --- # PM Assistant diff --git a/.github/agents/pm-backlog-management.agent.md b/.github/agents/pm-backlog-management.agent.md index 7e4ea35..b28f716 100644 --- a/.github/agents/pm-backlog-management.agent.md +++ b/.github/agents/pm-backlog-management.agent.md @@ -2,7 +2,6 @@ name: PM Backlog Manager description: Manages day-to-day backlog activities across markheydon's personal GitHub repos - daily prioritisation, backlog review, issue triage, story creation, and iteration planning. Invoke via the PM prompts (/pm-daily, /pm-backlog-review, /pm-issue-triage, /pm-create-story, /pm-iteration-plan). tools: [read, search, execute] -model: GPT-5.4 --- # Backlog Manager @@ -40,8 +39,9 @@ You are the **Backlog Manager** for `markheydon`'s personal GitHub projects. You - `story` - the primary unit of work; goes on the board - `bug` - something broken; goes on the board - **PRs are treated identically to issues** - they use the same label taxonomy (`story` or `bug`; never `epic`) and are subject to the same board inclusion rules - - Dependabot PRs are treated as `story` type on the board automatically - skip them during triage but include in counts and iteration planning + - Dependabot PRs are treated as `story` type on the board automatically - skip them during triage but include in counts and iteration planning. They automatically receive the `dependencies` label via `.github/dependabot.yml` - this is metadata for filtering, not a core classification. - Modifier labels add context: `priority-high`, `blocked`, `not-started`, `out-of-scope`, `feedback-required`, `waiting-for-details` + - Special labels (auto-assigned): `dependencies` (Dependabot PRs) - Deprecated labels to avoid: `feature`, `improvement`, `technical`, `spike`, `dependency` - **Active repos** - scan repos per `plan/REPO_PRIORITIES.md` and participation rules in `plan/REPO_PM_PARTICIPATION.md`. For issue scanning, use Tier 1, 2, and 3 only - skip Not PM Tracked, Paused, and `exclude` repos. Always scan all non-`exclude` repos for PRs regardless of tier. Flag any Tier 1 or Tier 2 repos with no issue or PR activity in the last 2 weeks as potentially stale (Tier 3 repos are low priority by design and need not be flagged). - **Observe repos** - surface likely next work from these repos during backlog review and iteration planning, but do not apply shared taxonomy checks to them. Use the `Selection Notes` in `plan/REPO_PM_PARTICIPATION.md` to decide what to surface. diff --git a/.github/agents/repo-docs-writer.agent.md b/.github/agents/repo-docs-writer.agent.md index 0ddc120..78187cf 100644 --- a/.github/agents/repo-docs-writer.agent.md +++ b/.github/agents/repo-docs-writer.agent.md @@ -2,7 +2,6 @@ name: Repo Docs Writer description: Use when you need documentation updates, README vs docs decisions, Diátaxis structure, public vs contributor-facing wording, or GitHub Pages documentation planning for this repository. tools: [read, edit, search, execute] -model: GPT-5.3-Codex --- You are an expert technical writer for this repository, guided by the Diátaxis documentation framework (https://diataxis.fr/). Your work spans two documentation contexts: diff --git a/.github/agents/repo-label-strategy-keeper.agent.md b/.github/agents/repo-label-strategy-keeper.agent.md index 0ace046..75de851 100644 --- a/.github/agents/repo-label-strategy-keeper.agent.md +++ b/.github/agents/repo-label-strategy-keeper.agent.md @@ -2,7 +2,6 @@ name: Repo Label Strategy Keeper description: Validates that all workflows, scripts, prompts, and agent instructions in this repo are consistent with the label strategy defined in plan/LABEL_STRATEGY.md. Run this agent after changing the strategy document, or periodically to catch drift. tools: [read, edit, search, execute] -model: GPT-5.3-Codex --- # Repo Label Strategy Keeper diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 816defc..90c6532 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -18,7 +18,7 @@ The strategy and tooling in this repo were specifically designed for my own pers - Project board: https://github.com/users/markheydon/projects/6. - Label strategy: `epic` (never on board), `story` (on board), `bug` (on board). Epics group stories; stories and bugs are the unit of work. - Both issues **and PRs** use the same label taxonomy. PRs labelled `story` or `bug` appear on the board identically to issues. All PM prompts scan for both. -- Dependabot PRs are treated as `story` type on the board when added; they are surfaced during `/pm-backlog-review` and added during `/pm-iteration-plan`. +- Dependabot PRs are treated as `story` type on the board when added; they are surfaced during `/pm-backlog-review` and added during `/pm-iteration-plan`. They automatically receive the `dependencies` label via `.github/dependabot.yml` - this label is metadata for filtering and visibility, not a core classification. ## Label strategy - single source of truth diff --git a/.github/prompts/pm-backlog-review.prompt.md b/.github/prompts/pm-backlog-review.prompt.md index 155af3b..9985493 100644 --- a/.github/prompts/pm-backlog-review.prompt.md +++ b/.github/prompts/pm-backlog-review.prompt.md @@ -70,7 +70,7 @@ gh issue list --repo --state open --json number,title,labels,milest gh pr list --repo --state open --json number,title,labels,milestone,assignees,updatedAt,author,isDraft --limit 100 ``` -For PRs, note the author. Dependabot PRs (`author.login` = `dependabot[bot]` or `dependabot-preview[bot]`) are treated as Stories on the board when added - they are handled separately and do not need core labels. Non-Dependabot PRs are subject to the same labelling and board rules as issues in `full` repos. +For PRs, note the author. Dependabot PRs (`author.login` = `dependabot[bot]` or `dependabot-preview[bot]`) are treated as Stories on the board when added - they are handled separately and do not need core labels. Dependabot PRs automatically receive the `dependencies` label via `.github/dependabot.yml`. Non-Dependabot PRs are subject to the same labelling and board rules as issues in `full` repos. For each Tier 1 and Tier 2 repo, note the date of the most recently updated issue or PR. Flag any Tier 1 or Tier 2 repos where nothing has been updated in the last 14 days as **potentially stale** - surface their ready work explicitly so it does not stay forgotten. diff --git a/.github/prompts/pm-issue-triage.prompt.md b/.github/prompts/pm-issue-triage.prompt.md index 7a80fd8..ef6e71e 100644 --- a/.github/prompts/pm-issue-triage.prompt.md +++ b/.github/prompts/pm-issue-triage.prompt.md @@ -46,7 +46,7 @@ gh pr list --repo --state open --json number,title,body,labels,auth Filter to items with no core label (`epic`, `story`, or `bug`), or if specific numbers were provided as an argument, fetch only those. -**Skip Dependabot PRs** (`author.login` = `dependabot[bot]` or `dependabot-preview[bot]`) - they do not need core labels. Include them only in the count of skipped items; they are handled during `/pm-backlog-review`. +**Skip Dependabot PRs** (`author.login` = `dependabot[bot]` or `dependabot-preview[bot]`) - they do not need core labels (they are auto-handled). They automatically receive the `dependencies` label via `.github/dependabot.yml`. Include them only in the count of skipped items; they are handled during `/pm-backlog-review`. **Skip draft PRs** - note their existence but do not triage them until they are marked ready for review. diff --git a/.github/prompts/pm-iteration-plan.prompt.md b/.github/prompts/pm-iteration-plan.prompt.md index 4a6a14e..26314bb 100644 --- a/.github/prompts/pm-iteration-plan.prompt.md +++ b/.github/prompts/pm-iteration-plan.prompt.md @@ -91,7 +91,7 @@ gh pr list --repo --state open --label "story" --json number,title, gh pr list --repo --state open --label "bug" --json number,title,labels,milestone,updatedAt,author,isDraft --limit 100 ``` -Exclude items labelled `out-of-scope` or `blocked`. Exclude draft PRs. Skip Dependabot PRs - they are already on the board. +Exclude items labelled `out-of-scope` or `blocked`. Exclude draft PRs. Skip Dependabot PRs (identified by author `dependabot[bot]` or `dependabot-preview[bot]`, auto-labelled with `dependencies`) - they are already on the board. For `observe` repos, do not require `story` / `bug` labels before proposing candidates. Instead, keep proposals conservative and prefer: diff --git a/.github/prompts/repo-update-from-strategy.prompt.md b/.github/prompts/repo-update-from-strategy.prompt.md index ed9301f..eabdb5a 100644 --- a/.github/prompts/repo-update-from-strategy.prompt.md +++ b/.github/prompts/repo-update-from-strategy.prompt.md @@ -2,7 +2,6 @@ name: Update From Strategy description: Reads plan/LABEL_STRATEGY.md and propagates any changes to all files that reference labels, issue types, or board rules - including the labels script. Run this after updating the strategy document. agent: Repo Label Strategy Keeper -model: GPT-5.3-Codex --- You are helping keep this repository consistent after a label strategy change. diff --git a/.github/prompts/repo-update-pinned-models.prompt.md b/.github/prompts/repo-update-pinned-models.prompt.md deleted file mode 100644 index c34c6cc..0000000 --- a/.github/prompts/repo-update-pinned-models.prompt.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: Update Pinned Models -description: This prompt is used to update model pinning across the repository according to a specific strategy. It searches for all files that reference models, checks if they align with the new model strategy, and updates them accordingly while preserving the original intent and structure of each file. This came about after analysis of the upcoming pricing changes for GitHub Copilot in June 2026. My analysis found that using 'Auto' for model selection in serious coding and agentic workflows is risky due to potential cost spikes, and that pinning to more 'just good enough' models like GPT-5.3-Codex for implementation and GPT-5.4 for planning can provide better cost predictability while still delivering consistent results. -model: GPT-5.4 -tools: [read, edit, search, execute] ---- - -Search this repository for any prompts, agents, skills, instructions, templates, or config files that either: -- contain a `model:` key, or -- describe model selection behaviour. - -Update them to follow this model strategy: - -- `GPT-5.4` for planning, specification, requirements shaping, task creation, and other pre-implementation reasoning. -- `GPT-5.3-Codex` for implementation, refactoring, code generation, repo-aware technical writing, and structured documentation generated from repository sources, including `README.md`. -- `GPT-5 mini` may be used only as an optional low-cost model for very lightweight, low-risk tasks such as quick summaries, simple explanations, or disposable boilerplate drafts. It must not be the default for serious repository work. -- Avoid `Auto` as the default for serious coding, repo-wide analysis, or agentic workflows unless a file has a clear and specific reason to allow automatic model selection. - -Rules for the update: -- Keep edits minimal and preserve the existing structure, tone, and intent. -- Use concise, practical UK English. -- Do not invent extra workflow rules beyond this policy. -- If a file already matches this policy closely, leave it unchanged. -- Where a `model:` value exists, update it to the closest appropriate model from this strategy. -- Where model guidance is described in prose, revise the wording to reflect this policy without unnecessary rewrites. - -After editing, provide: -1. a list of files changed -2. a short summary of what was updated in each file -3. any places where model choice was ambiguous and required judgement diff --git a/.github/skills/github-issue-management/references/github-labels.md b/.github/skills/github-issue-management/references/github-labels.md index 250439f..defc6fa 100644 --- a/.github/skills/github-issue-management/references/github-labels.md +++ b/.github/skills/github-issue-management/references/github-labels.md @@ -56,6 +56,16 @@ Apply alongside a core label as needed. Multiple modifiers are allowed. --- +## Special Labels + +Automatically assigned by tooling; not manually applied. Used for metadata and filtering. + +| Label | Colour | Hex | Description | +|-------|--------|-----|-------------| +| `dependencies` | Grey | `#cccccc` | Dependency or version bump (auto-assigned by Dependabot via `.github/dependabot.yml`). Used for filtering in backlog reviews. Do not apply manually. | + +--- + ## Excluded Labels --- diff --git a/agents/tech-writer.agent.md b/agents/tech-writer.agent.md index df65adc..d21dbc0 100644 --- a/agents/tech-writer.agent.md +++ b/agents/tech-writer.agent.md @@ -1,7 +1,6 @@ --- name: 'tech-writer' description: 'Project-aware technical writing specialist for developer documentation, user guides, tutorials, and technical blog posts.' -model: GPT-5.3-Codex tools: ['read', 'edit', 'search', 'execute'] --- diff --git a/docs/reference/label-taxonomy.md b/docs/reference/label-taxonomy.md index ef3438e..f2b0df7 100644 --- a/docs/reference/label-taxonomy.md +++ b/docs/reference/label-taxonomy.md @@ -26,6 +26,14 @@ This page documents the label strategy used across all repos managed by this wor | `feedback-required`| Lavender | Waiting for feedback | | `waiting-for-details` | Lavender | Needs more info | +## Special Labels + +Automatically assigned by tooling (not manually applied). + +| Label | Colour | Purpose | +|--------------------|----------|--------| +| `dependencies` | Grey | Auto-assigned to Dependabot PRs for filtering and visibility | + ## GitHub Default Labels These are optional modifiers and retain their default colours. diff --git a/plan/LABEL_STRATEGY.md b/plan/LABEL_STRATEGY.md index 0e0a88c..a170438 100644 --- a/plan/LABEL_STRATEGY.md +++ b/plan/LABEL_STRATEGY.md @@ -25,7 +25,7 @@ Epics are **excluded** - they exist only to group stories in the repository view ### Dependabot Rule -Dependabot PRs are treated as `story`-equivalent work on the project board. They are surfaced during `/pm-backlog-review` and added to the board by `/pm-iteration-plan` when relevant. No manual labelling is needed. +Dependabot PRs are treated as `story`-equivalent work on the project board. They are surfaced during `/pm-backlog-review` and added to the board by `/pm-iteration-plan` when relevant. Dependabot PRs automatically receive the `dependencies` label via `.github/dependabot.yml` - no manual labelling is needed. --- @@ -44,6 +44,16 @@ These labels provide additional context and can be applied **alongside** a core --- +## Special Labels + +These labels are automatically assigned by tooling and are not manually applied. They act as metadata for filtering and categorisation. + +| Label | Colour | Hex | Description (used in script) | Purpose | +|-------|--------|-----|------------------------------|--------| +| `dependencies` | Grey | `#cccccc` | Dependency or version bump (auto-assigned by Dependabot). | Automatically applied to all Dependabot PRs via `.github/dependabot.yml`. Used for filtering and visibility in backlog reviews. Do not apply manually. | + +--- + ## GitHub Default Labels Every new GitHub repository includes a set of default labels. Rather than deleting these, this strategy integrates them. They are treated as **optional modifier labels** and their colours are kept at GitHub's defaults. diff --git a/prompts/new-project-setup.prompt.md b/prompts/new-project-setup.prompt.md index 2d5d7a3..3d912a5 100644 --- a/prompts/new-project-setup.prompt.md +++ b/prompts/new-project-setup.prompt.md @@ -6,7 +6,6 @@ description: > the first ADR (technology choices), and an initial wave of GitHub Issues for MVP scope items and user journeys. argument-hint: Paste your completed Project Kickoff Spec, or tell me the path to the file -model: GPT-5.4 --- ## When to use this prompt diff --git a/scripts/Update-GitHubLabels-Batch.ps1 b/scripts/Update-GitHubLabels-Batch.ps1 new file mode 100644 index 0000000..2d80f45 --- /dev/null +++ b/scripts/Update-GitHubLabels-Batch.ps1 @@ -0,0 +1,92 @@ +<# +.SYNOPSIS + Batch-run label updates across local repositories. + +.DESCRIPTION + Scans a local folder for child directories and treats each directory name as a GitHub repository name. + For each repo folder found, this script calls the sibling `Update-GitHubLabels.ps1` script with + `-Repo "/"`. + + If `-Path` is omitted, the script scans the current working directory. + Use `-Limit` to process only the first N folders, which is useful for testing or batching. + +.PARAMETER Owner + The GitHub owner for the target repositories. + +.PARAMETER Path + Optional path to the folder containing repository directories. + If omitted, the current working directory is used. + +.PARAMETER Limit + Optional maximum number of repositories to process. +#> + +[CmdletBinding(SupportsShouldProcess)] +param ( + [Parameter(Mandatory = $true, Position = 0)] + [string]$Owner, + + [Parameter(Mandatory = $false, Position = 1)] + [string]$Path = (Get-Location).Path, + + [Parameter(Mandatory = $false)] + [int]$Limit +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +# Setup the Update-GitHubLabels.ps1 script path. +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$updateLabelsScript = Join-Path $scriptDir 'Update-GitHubLabels.ps1' + +if (-not (Test-Path -Path $updateLabelsScript -PathType Leaf)) { + throw "Could not find sibling script '$updateLabelsScript'. Ensure `Update-GitHubLabels.ps1` exists in the same folder." +} + +try { + $resolvedPath = Resolve-Path -Path $Path -ErrorAction Stop +} +catch { + throw "The specified path '$Path' does not exist or is not accessible." +} + +if (-not (Test-Path -Path $resolvedPath -PathType Container)) { + throw "The specified path '$Path' is not a directory." +} + +# Get all child directories in the specified path, sorted by name. +$repoFolders = Get-ChildItem -Path $resolvedPath -Directory | Sort-Object -Property Name + +if ($Limit -ne $null) { + if ($Limit -le 0) { + throw "The Limit parameter must be a positive integer." + } + $repoFolders = $repoFolders | Select-Object -First $Limit +} + +Write-Output "Scanning repository folders in '$resolvedPath'..." +Write-Output "Owner: $Owner" +Write-Output "Found ($repoFolders.Count) folder(s) to process." + +# Process each repository folder. +$processedCount = 0 +foreach ($folder in $repoFolders) { + $repositoryName = "$Owner/$($folder.Name)" + + if ($PSCmdlet.ShouldProcess($repositoryName, 'Update labels')) { + Write-Output "Processing $repositoryName..." + & $updateLabelsScript -Repo $repositoryName + + if ($LASTEXITCODE -ne 0) { + throw "Update-GitHubLabels.ps1 failed for repository '$repositoryName'." + } + + $processedCount++ + } + else { + Write-Output "Skipped $repositoryName" + } +} + +Write-Output "Done. Processed $processedCount repository(ies)." diff --git a/scripts/Update-GitHubLabels.ps1 b/scripts/Update-GitHubLabels.ps1 index c9ef90f..cb6d003 100644 --- a/scripts/Update-GitHubLabels.ps1 +++ b/scripts/Update-GitHubLabels.ps1 @@ -65,6 +65,9 @@ Set-Label -Name 'out-of-scope' -Color 'ededed' -Description 'Intentionally defer Set-Label -Name 'feedback-required' -Color 'd9d4f5' -Description 'Waiting for feedback before work can proceed.' Set-Label -Name 'waiting-for-details' -Color 'd9d4f5' -Description 'Further details required before work can start.' +# --- Special labels --- +Set-Label -Name 'dependencies' -Color 'cccccc' -Description 'Dependency or version bump (auto-assigned by Dependabot).' + # --- GitHub default labels --- Set-Label -Name 'documentation' -Color '0075ca' -Description 'Improvements or additions to documentation.' Set-Label -Name 'duplicate' -Color 'cfd3d7' -Description 'This issue or pull request already exists.'