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
6 changes: 6 additions & 0 deletions .github/review-routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,16 @@ pools:
team: github/awesome-copilot-content-reviewers
reviewers: [] # TODO: add at least three reviewers for skills, agents, and instructions.
backup: [] # TODO: add backup content reviewers.
workshops:
team: github/awesome-copilot-workshop-reviewers
reviewers: [] # TODO: add at least three workshop reviewers.
backup: [] # TODO: add backup workshop reviewers.

# Intent labels (applied by .github/workflows/label-pr-intent*.yml) mapped to
# pools. Order is priority: the first route whose label is on the PR wins.
routes:
- label: workshops
pool: workshops
- label: canvas-extension
pool: canvas
- label: external-plugin
Expand Down
6 changes: 6 additions & 0 deletions .github/risk-tiers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,12 @@ domains:
content:
paths: ["agents/**", "instructions/**", "skills/**", "workflows/**", "hooks/**"]
pools: ["content"]
workshops:
paths:
- "website/**/cli-for-beginners/**"
- "website/**/app-for-beginners/**"
- "website/**/copilot-workshops/**"
Comment on lines +147 to +150

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Fix the code for all comments in this review comment.

When a review comment includes a suggested change, apply the suggestion exactly.

Do not make changes beyond what is described in the linked review comment.

pools: ["workshops"]
# Files outside every domain (repository automation such as `.github/workflows/**`,
# `eng/**`, review policy, and docs) are owned by the core pools.

Expand Down
1,965 changes: 0 additions & 1,965 deletions .github/workflows/codeowner-update.lock.yml

This file was deleted.

94 changes: 0 additions & 94 deletions .github/workflows/codeowner-update.md

This file was deleted.

1 change: 1 addition & 0 deletions .github/workflows/label-pr-intent-writer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ jobs:
'agent',
'instructions',
'new-submission',
'workshops',
'website-update',
'external-plugin',
'hooks',
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/label-pr-intent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ jobs:
'agent': true,
'instructions': true,
'new-submission': true,
'workshops': true,
'website-update': true,
'external-plugin': true,
'hooks': true,
Expand Down Expand Up @@ -78,6 +79,9 @@ jobs:
websiteUpdate: [
/^website\//
],
workshops: [
/^website\/(?:.*\/)?(?:cli-for-beginners|app-for-beginners|copilot-workshops)\//
],
Comment on lines +82 to +84

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Fix the code for all comments in this review comment.

When a review comment includes a suggested change, apply the suggestion exactly.

Do not make changes beyond what is described in the linked review comment.

externalPlugin: [
/^plugins\/external\.json$/
],
Expand Down Expand Up @@ -130,6 +134,10 @@ jobs:
desiredLabels.add('instructions');
}

if (filenames.some((filename) => matchesAny(filename, patterns.workshops))) {
desiredLabels.add('workshops');
}
Comment on lines +137 to +139

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Fix the code for all comments in this review comment.

When a review comment includes a suggested change, apply the suggestion exactly.

Do not make changes beyond what is described in the linked review comment.


if (filenames.some((filename) => matchesAny(filename, patterns.websiteUpdate))) {
desiredLabels.add('website-update');
}
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/setup-labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ jobs:
color: '006B75',
description: 'PR adds at least one new contribution'
},
'workshops': {
color: '7057FF',
description: 'PR touches Copilot workshop content'
},
'website-update': {
color: '0052CC',
description: 'PR touches website content or code'
Expand Down
62 changes: 5 additions & 57 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
#
# - Teams own paths; no individual is the default owner. Do not add individual
# users to the `*` rule or to the team block below.
# - The last matching rule wins, so per-resource owners appended at the end of
# this file (for example by the `#codeowner` automation) override the team
# defaults for their specific paths.
# - The last matching rule wins.
# - Reviewer pools used for automatic review requests live in
# .github/review-routing.yml.

Expand All @@ -22,57 +20,7 @@
/.github/ @github/awesome-copilot-core-maintainers
/eng/ @github/awesome-copilot-core-maintainers

# Adding Dan Wahlin as the owner for the CLI for Beginners content and images
/website/src/content/docs/learning-hub/cli-for-beginners/ @DanWahlin
/website/src/images/cli-for-beginners/ @DanWahlin

# Copilot app for Beginners course and public images
/website/src/content/docs/learning-hub/app-for-beginners/ @DanWahlin
/website/public/images/learning-hub/copilot-app-for-beginners/ @DanWahlin

# Agentic Workflows
/workflows/ @brunoborges
/.github/workflows/validate-agentic-workflows-pr.yml @brunoborges

# Copilot review policy
/.github/skills/code-review/ @aaronpowell
/.github/copilot-instructions.md @aaronpowell

# Added via #codeowner from PR #930
/plugins/automate-this/ @dvelton
/skills/automate-this/ @dvelton

# Added via #codeowner from PR #915
/skills/cli-mastery/ @DUBSOpenHub

# Added via #codeowner from PR #929
/plugins/napkin/ @dvelton
/skills/napkin/ @dvelton

# Added via #codeowner from PR #888
/skills/github-issues/ @labudis

# Added via #codeowner from PR #884
/skills/github-issues/ @labudis

# Added via #codeowner from PR #889
/skills/copilot-spaces/ @labudis

# Added via #codeowner from PR #978
/agents/doublecheck.agent.md @dvelton
/plugins/doublecheck/ @dvelton
/skills/doublecheck/ @dvelton

# Added via #codeowner from PR #990
/skills/issue-fields-migration/ @labudis

# Added via #codeowner from PR #1009
/skills/publish-to-pages/ @AndreaGriffiths11

# Added via #codeowner from PR #1049
/skills/codeql/ @VeVarunSharma
/skills/dependabot/ @VeVarunSharma
/skills/secret-scanning/ @VeVarunSharma

# Added via #codeowner from PR #1118
/agents/github-actions-node-upgrade.agent.md @joshjohanning
# Copilot workshops
/website/**/cli-for-beginners/ @github/awesome-copilot-workshop-reviewers
/website/**/app-for-beginners/ @github/awesome-copilot-workshop-reviewers
Comment on lines +24 to +25

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Fix the code for all comments in this review comment.

When a review comment includes a suggested change, apply the suggestion exactly.

Do not make changes beyond what is described in the linked review comment.

/website/**/copilot-workshops/ @github/awesome-copilot-workshop-reviewers
6 changes: 4 additions & 2 deletions docs/maintainers/review-routing.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@ The root [`CODEOWNERS`](../../CODEOWNERS) file assigns every path to a team, not
| `/plugins/` | `@github/awesome-copilot-plugin-reviewers` |
| `/agents/`, `/instructions/`, `/skills/`, `/hooks/`, `/workflows/` | `@github/awesome-copilot-content-reviewers` |
| `/.github/` (including GitHub Actions workflows), `/eng/` | `@github/awesome-copilot-core-maintainers` |
| Copilot workshop content under `/website/` | `@github/awesome-copilot-workshop-reviewers` |

GitHub applies the **last** matching rule, so the per-resource entries at the bottom of the file override the team defaults for their paths. Those entries are added through the `#codeowner` command (`.github/workflows/codeowner-update.md`), which only appends a block at the end of the file. The existing per-resource entries are kept as they are for now; removing them is planned as a separate cleanup. When you edit `CODEOWNERS` by hand:
GitHub applies the **last** matching rule, so the workshop entries at the bottom of the file override the default team for their paths. When you edit `CODEOWNERS` by hand:

- Keep the `*` rule and the domain team block at the top of the file.
- Never add an individual user to the `*` rule.
- Append new per-resource owners at the end of the file.
- Add more-specific path owners after the broader rules they override.

## Reviewer pools (`.github/review-routing.yml`)

Expand All @@ -44,6 +45,7 @@ Current routes, in priority order:

| Intent label | Pool |
|---|---|
| `workshops` | `workshops` |
| `canvas-extension` | `canvas` |
| `external-plugin`, `plugin` | `plugin` |
| `skills`, `agent`, `instructions`, `workflow`, `hooks` | `content` |
Expand Down
1 change: 1 addition & 0 deletions eng/review-routing.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const INTENT_LABELS = Object.freeze([
"new-submission",
"plugin",
"skills",
"workshops",
"website-update",
"workflow",
]);
Expand Down
6 changes: 5 additions & 1 deletion eng/review-routing.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ function rawConfig(overrides = {}) {
canvas: { team: "github/canvas", reviewers: ["canvas1", "canvas2", "canvas3"], backup: ["canvasBackup"] },
plugin: { team: "github/plugin", reviewers: ["plugin1"], backup: [] },
content: { team: "github/content", reviewers: [], backup: [] },
workshops: { team: "github/workshops", reviewers: ["workshop1"], backup: [] },
automation: { team: "github/automation", reviewers: ["auto1"], backup: ["autoBackup"] },
},
routes: [
{ label: "workshops", pool: "workshops" },
{ label: "workflow", pool: "automation" },
{ label: "hooks", pool: "automation" },
{ label: "canvas-extension", pool: "canvas" },
Expand Down Expand Up @@ -97,6 +99,7 @@ describe("configuration", () => {
assert.deepEqual(
loaded.routes.map((route) => [route.label, route.pool]),
[
["workshops", "workshops"],
["canvas-extension", "canvas"],
["external-plugin", "plugin"],
["plugin", "plugin"],
Expand All @@ -108,7 +111,7 @@ describe("configuration", () => {
["website-update", "core-maintainers"],
]
);
assert.deepEqual(Object.keys(loaded.pools).sort(), ["canvas", "content", "core-maintainers", "plugin"]);
assert.deepEqual(Object.keys(loaded.pools).sort(), ["canvas", "content", "core-maintainers", "plugin", "workshops"]);
assert.equal(loaded.defaultPool, "core-maintainers");
assert.equal(loaded.escalationPool, "core-maintainers");
});
Expand Down Expand Up @@ -165,6 +168,7 @@ describe("reviewer selection", () => {
assert.equal(selectPool(["skills", "plugin"], cfg), "plugin");
assert.equal(selectPool(["plugin", "canvas-extension"], cfg), "canvas");
assert.equal(selectPool(["canvas-extension", "workflow"], cfg), "automation");
assert.equal(selectPool(["website-update", "workshops"], cfg), "workshops");
assert.equal(selectPool(["website-update"], cfg), "core-maintainers");
});

Expand Down
14 changes: 13 additions & 1 deletion eng/submission-gate.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ const routing = {
canvas: { team: "github/canvas", reviewers: ["canvasa"], backup: [] },
plugin: { team: "github/plugin", reviewers: [], backup: [] },
content: { reviewers: [] },
workshops: { team: "github/workshops", reviewers: ["workshopa"], backup: [] },
},
};

Expand Down Expand Up @@ -255,7 +256,11 @@ test("latest review state wins and changes requested blocks", () => {
});

test("medium tier requires a domain reviewer when the pool is staffed", () => {
const permissions = new Map([["alice", "write"], ["canvasa", "write"]]);
const permissions = new Map([
["alice", "write"],
["canvasa", "write"],
["workshopa", "write"],
]);
const files = [file("extensions/x/extension.mjs", { status: "added" })];
const base = { tier: "medium", tiers, author: "author", permissions, routing, files };
assert.equal(evaluateApprovals({ ...base, reviews: [review("alice", "APPROVED")] }).satisfied, false);
Expand All @@ -270,6 +275,13 @@ test("medium tier requires a domain reviewer when the pool is staffed", () => {
assert.equal(unstaffed.satisfied, true, "falls back to any writer when the domain pool is empty");
assert.ok(unstaffed.notes.length > 0);

const workshop = evaluateApprovals({
...base,
files: [file("website/src/content/docs/learning-hub/copilot-workshops/lesson.md", { status: "added" })],
reviews: [review("workshopa", "APPROVED")],
});
assert.equal(workshop.satisfied, true);

const noRouting = evaluateApprovals({ ...base, routing: null, reviews: [review("alice", "APPROVED")] });
assert.equal(noRouting.satisfied, true);
});
Expand Down
Loading