Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/agents/pm-assistant.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
4 changes: 2 additions & 2 deletions .github/agents/pm-backlog-management.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -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.
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-docs-writer.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
1 change: 0 additions & 1 deletion .github/agents/repo-label-strategy-keeper.agent.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-backlog-review.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ gh issue list --repo <owner/repo> --state open --json number,title,labels,milest
gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-issue-triage.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -46,7 +46,7 @@ gh pr list --repo <owner/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.

Expand Down
2 changes: 1 addition & 1 deletion .github/prompts/pm-iteration-plan.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,7 +91,7 @@ gh pr list --repo <owner/repo> --state open --label "story" --json number,title,
gh pr list --repo <owner/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:

Expand Down
1 change: 0 additions & 1 deletion .github/prompts/repo-update-from-strategy.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
30 changes: 0 additions & 30 deletions .github/prompts/repo-update-pinned-models.prompt.md

This file was deleted.

Original file line numberDiff line numberDiff line change
Expand Up@@ -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

---
Expand Down
1 change: 0 additions & 1 deletion agents/tech-writer.agent.md
Original file line numberDiff line numberDiff line change
@@ -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']
---

Expand Down
8 changes: 8 additions & 0 deletions docs/reference/label-taxonomy.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
12 changes: 11 additions & 1 deletion plan/LABEL_STRATEGY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

---

Expand All@@ -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.
Expand Down
1 change: 0 additions & 1 deletion prompts/new-project-setup.prompt.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
92 changes: 92 additions & 0 deletions scripts/Update-GitHubLabels-Batch.ps1
Original file line numberDiff line numberDiff line change
@@ -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 "<Owner>/<RepoName>"`.

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)."
3 changes: 3 additions & 0 deletions scripts/Update-GitHubLabels.ps1
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.'
Expand Down