bootstrap-issue-config

$npx mdskill add warpdotdev/oz-for-oss/bootstrap-issue-config

Generate triage configuration files from repository analysis.

  • Creates label definitions and stakeholder mappings for automation.
  • Integrates with GitHub API to list and classify existing labels.
  • Decides on defaults when repositories lack sufficient label data.
  • Outputs config.json and STAKEHOLDERS files to the .github directory.
SKILL.md
.github/skills/bootstrap-issue-configView on GitHub ↗
---
name: bootstrap-issue-config
description: Bootstrap the issue triage configuration for a repository by analyzing existing issues, labels, and contributors to generate `.github/issue-triage/config.json` and `.github/STAKEHOLDERS`. Use when setting up triage automation on a new or existing repository for the first time.
---

# Bootstrap issue triage configuration

Analyze the target repository and generate (or update) the issue triage configuration files used by the `triage-new-issues` workflow.

## Outputs

This skill produces two files:

1. **`.github/issue-triage/config.json`** — label definitions used during triage.
2. **`.github/STAKEHOLDERS`** — CODEOWNERS-style ownership mappings from path patterns to GitHub usernames.

## Workflow

### 1. Discover existing labels

- Use `gh label list --repo <owner>/<repo> --limit 200 --json name,color,description` to fetch all labels currently defined on the repository.
- Classify each label into one of three categories:
  - **area** labels — identify a component or subsystem (e.g. `area:api`, `area:docs`).
  - **feature** labels — identify a capability or request type (e.g. `enhancement`, `bug`, `documentation`).
  - **status** labels — identify workflow state (e.g. `triaged`, `needs-info`, `wontfix`).
- If the repository has very few or no labels, seed the config with sensible defaults:
  - `triaged` (status), `bug` (feature), `enhancement` (feature), `documentation` (feature), `needs-info` (status), `duplicate` (status)
  - `repro:high`, `repro:medium`, `repro:low`, `repro:unknown` (status)

### 2. Analyze recent issues

- Use `gh issue list --repo <owner>/<repo> --state all --limit 100 --json number,title,labels,createdAt` to fetch recent issues.
- If issues use labels that are not yet captured, add them to the appropriate category.
- Look at `.github/ISSUE_TEMPLATE/` for template files — template names and labels referenced in templates can inform label discovery.

### 3. Generate or update `config.json`

- Read any existing `.github/issue-triage/config.json`.
- Merge newly discovered labels into the existing `labels` object. Do **not** remove labels that already exist in the config — only add or update.
- The config must contain **only** the `labels` key. Do **not** include `stakeholders` or `default_experts`.
- Each label entry should have `color` (6-character hex without `#`) and `description` (one-sentence summary).
- Write the result to `.github/issue-triage/config.json`.
- Validate with `jq . .github/issue-triage/config.json`.

### 4. Generate or update `.github/STAKEHOLDERS`

- Inspect `CODEOWNERS` if it exists for initial ownership hints.
- Use `git log --format='%aN <%aE>' --since='6 months ago' -- <path>` and `gh api` to identify recent contributors to major directories.
- Read any existing `.github/STAKEHOLDERS` file and merge new entries rather than overwriting.
- Write the file using CODEOWNERS conventions:
  ```
  # Syntax follows CODEOWNERS conventions: later rules take precedence.
  # NOTE: This file is advisory only — GitHub does not enforce it.

  # --- Section comment ---
  /path/pattern/ @owner1 @owner2
  ```
- Each line maps a path glob to one or more `@username` owners.

### 5. Create missing labels

- For every label in the final `config.json` that does not already exist on the repository, create it:
  ```
  gh label create "<name>" --color "<color>" --description "<description>" --repo <owner>/<repo>
  ```
- Skip labels that already exist (the `gh label create` command will error on duplicates — ignore those errors).

### 6. Note repo-local companion skills (do not scaffold)

The reusable agent roles that support a repo-specific companion are:

- `.agents/skills/review-pr-local/SKILL.md`
- `.agents/skills/review-spec-local/SKILL.md`
- `.agents/skills/triage-issue-local/SKILL.md`
- `.agents/skills/dedupe-issue-local/SKILL.md`

Do **not** create these files during bootstrap. The prompt-construction layer treats a missing companion file and a body-only frontmatter stub the same way, so there is no value in materializing an empty file during bootstrap. Each file gets created on-demand by the matching `update-<agent>` self-improvement loop (or by a maintainer) the first time there is evidence-backed content to add. Bootstrap only needs to ensure the directory convention is documented; the files themselves stay absent until a real rule lands.

If a companion file already exists in the repo, leave it untouched; bootstrap is additive.

### 7. Validate and summarize

- Re-validate `config.json` with `jq`.
- Print a short summary of:
  - How many labels were discovered vs. newly created.
  - How many stakeholder entries were written.
  - Which repo-local companion skills are already present in the repo (if any).
  - Any warnings (e.g. no issues found, no CODEOWNERS file).

## Idempotency

This skill is designed to be run multiple times safely. Re-running will:
- Merge new labels into the existing config without removing old ones.
- Merge new stakeholder entries without duplicating existing lines.
- Skip label creation for labels that already exist on the repository.

## Assumptions

- The `gh` CLI is authenticated and has access to the target repository.
- The skill is run from the repository root.
- The target repository is the current working directory unless the prompt specifies otherwise.
More from warpdotdev/oz-for-oss