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
22 changes: 13 additions & 9 deletions .github/GOVERNANCE.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Repository governance

Adopted baseline: **2026-09-16** from [PathGao/governance](https://github.com/PathGao/PathGao/tree/main/governance).
Adopted [source snapshot](https://github.com/PathGao/PathGao/tree/efab3e421c6606c1ce0a1c5836e98ba0ff64addb/governance).
Adopted baseline: **2026-09-16, Markpad labels** from [PathGao/governance](https://github.com/PathGao/PathGao/tree/main/governance).
Adopted [source snapshot](https://github.com/PathGao/PathGao/tree/46466b51863fdab52d9b1d4d16f1d7d145ebcfb9/governance).
Updates are reviewed and copied manually; there is no automatic inheritance.

## Workflow
Expand All @@ -10,9 +10,12 @@ Use the short PR template. `Closes #123` or `Fixes #123` closes a completed issu
on merge. For partial work, use `Related to #123` and state what remains. There
is no release-confirmation or inactivity-close automation.

`question` is a usage question. `needs info` waits for reporter details,
`awaiting decision` waits for a maintainer decision, and `planned` means accepted.
Type and resolution labels are defined in [labels.json](labels.json).
The ten shared labels use Markpad's names, colors and descriptions.
`question` is a usage question; `needs info` waits for reporter input;
`awaiting decision` waits for a maintainer decision; `planned` means accepted.
`Final_Check_Request` is a manual marker for confirmation or incomplete work.
Keep those issues open with normal references until complete; no bot acts on it.
The full set, including project extensions, is defined in [labels.json](labels.json).

## Maintenance

Expand All @@ -29,10 +32,11 @@ Preview label changes from the repository root:
```

Add `--apply` to create/update the declared labels. Labels outside the manifest
are preserved, including historical labels attached to closed issues.
are preserved. Adoption explicitly removes the unused defaults `wontfix`,
`good first issue`, `help wanted`, `invalid` and `duplicate` after checking usage.
A zero-change preview alone does not verify that cleanup.

## Project differences

Nifro retains site submission and other project labels, existing issue forms,
and its five required CI jobs. `Final_Check_Request` remains only as a legacy
GitHub label for historical issues; it is outside the managed manifest.
Nifro retains `accessibility`, `site submission`, `swift` and `upstream`,
existing issue forms and its five required CI jobs.
74 changes: 27 additions & 47 deletions .github/labels.json
Original file line number Diff line number Diff line change
@@ -1,79 +1,59 @@
[
{
"name": "awaiting decision",
"color": "c129c4",
"description": "Needs a product-direction call from the maintainer before work can start"
},
{
"name": "bug",
"color": "d73a4a",
"description": "Something isn't working"
},
{
"name": "enhancement",
"color": "a2eeef",
"description": "New feature or improvement"
"name": "dependencies",
"color": "b9d130",
"description": "Pull requests that update a dependency file"
},
{
"name": "documentation",
"color": "bfd4f2",
"color": "BFD4F2",
"description": "Docs, README or contributor-facing text"
},
{
"name": "question",
"color": "fbca04",
"description": "A usage question, not a request for missing information"
},
{
"name": "needs info",
"color": "f9d0c4",
"description": "Waiting on the reporter to supply missing information"
},
{
"name": "awaiting decision",
"color": "c129c4",
"description": "Needs a maintainer decision before work can start"
"name": "enhancement",
"color": "a2eeef",
"description": "New feature or request"
},
{
"name": "planned",
"color": "0453ab",
"description": "Accepted and queued for work"
"name": "Final_Check_Request",
"color": "5ade98",
"description": "Looks fixed, but do not close yet: needs confirmation, or part of it is still open"
},
{
"name": "duplicate",
"color": "cfd3d7",
"description": "Same issue or pull request; link to the original"
"name": "github_actions",
"color": "000000",
"description": "Pull requests that update GitHub Actions code"
},
{
"name": "wontfix",
"color": "6e7781",
"description": "Decided against, with a reason"
"name": "needs info",
"color": "F9D0C4",
"description": "Waiting on the reporter to confirm or supply detail"
},
{
"name": "dependencies",
"color": "b9d130",
"description": "Dependency update"
"name": "planned",
"color": "0453ab",
"description": "Accepted and queued for the next round of work"
},
{
"name": "github_actions",
"color": "000000",
"description": "GitHub Actions update"
"name": "question",
"color": "FBCA04",
"description": "A usage question, not a defect"
},
{
"name": "accessibility",
"color": "f143ab",
"description": "Barrier affecting people with disabilities"
},
{
"name": "good first issue",
"color": "7057ff",
"description": "Good for newcomers"
},
{
"name": "help wanted",
"color": "008672",
"description": "Extra attention is needed"
},
{
"name": "invalid",
"color": "e4e669",
"description": "This doesn't seem right"
},
{
"name": "site submission",
"color": "1D76DB",
Expand Down
4 changes: 3 additions & 1 deletion Tools/sync-labels.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ import subprocess
parser = argparse.ArgumentParser(description="Preview or apply .github/labels.json")
parser.add_argument("repository", help="Explicit OWNER/REPO target")
parser.add_argument("--apply", action="store_true")
parser.add_argument("--labels", type=Path, default=Path(".github/labels.json"),
help="Manifest path; use an absolute path outside the script root")
args = parser.parse_args()
if not re.fullmatch(r"[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+", args.repository):
parser.error("repository must be OWNER/REPO")
labels = json.loads(Path(".github/labels.json").read_text())
labels = json.loads(args.labels.read_text())
if not isinstance(labels, list):
parser.error("labels.json must contain an array")
seen = set()
Expand Down
Loading