Skip to content
Closed
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
36 changes: 19 additions & 17 deletions .github/workflows/cli-for-beginners-sync.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 19 additions & 17 deletions .github/workflows/duplicate-resource-detector.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 9 additions & 2 deletions .github/workflows/duplicate-resource-detector.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: Weekly scan of agents, instructions, and skills to identify potential duplicate resources and report them for review
description: Weekly scan of agents, instructions, skills, hooks, and workflows to identify potential duplicate resources and report them for review
on:
schedule: weekly
permissions:
Expand Down Expand Up @@ -28,6 +28,9 @@ Scan all resources in the following directories and identify groups of resources
- `agents/` (`.agent.md` files)
- `instructions/` (`.instructions.md` files)
- `skills/` (folders — check `SKILL.md` inside each)
- `hooks/` (folders — check `README.md` inside each)
- `workflows/` (`.md` files)
- `plugins/` (folders — check `.github/plugin/plugin.json` inside each)

### Step 1: Gather Resource Metadata

Expand All @@ -38,7 +41,7 @@ For each resource, extract:
3. **Front matter `name`** field (if present)
4. **First ~20 lines of body content** (the markdown after the front matter)

Use bash to read files efficiently. For skills, read `skills/<name>/SKILL.md`.
Use bash to read files efficiently. For skills, read `skills/<name>/SKILL.md`. For hooks, read `hooks/<name>/README.md`. For workflows, read the `.md` files directly in the `workflows/` directory. For plugins, read `.github/plugin/plugin.json` inside each plugin folder.

### Step 2: Identify Potential Duplicates

Expand All @@ -50,6 +53,7 @@ Compare resources and flag groups that look like potential duplicates. Consider
- **Cross-type overlap** — an agent and an instruction (or instruction and skill) that cover the same topic so thoroughly that one may make the other redundant

Be pragmatic. Resources that cover related but distinct topics are NOT duplicates. For example:

- `react.instructions.md` (general React coding standards) and `react-testing.agent.md` (React testing agent) are **not** duplicates — they serve different purposes.
- `python-fastapi.instructions.md` and `python-flask.instructions.md` are **not** duplicates — they target different frameworks.
- `code-review.agent.md` and `code-review.instructions.md` that both do the same style of code review **are** potential duplicates worth flagging.
Expand All @@ -63,6 +67,7 @@ Search for issues with label "duplicate-review" that are closed
```

Read the comments and body of those past issues to find any pairs or groups that reviewers have explicitly marked as **"accepted"** or **"not duplicates"**. Look for phrases like:

- "accepted as-is"
- "not duplicates"
- "intentionally separate"
Expand Down Expand Up @@ -123,4 +128,6 @@ Use `<details>` blocks to collapse groups if there are more than 10.
- Include cross-type duplicates (e.g., an agent and an instruction doing the same thing).
- Limit the report to the top 20 most likely duplicate groups to keep it actionable.
- For skills, use the folder name and description from `SKILL.md`.
- For hooks, use the folder name and description from `README.md`.
- For plugins, use the folder name and description from `.github/plugin/plugin.json`.
- Process resources in batches to stay within time limits — prioritize name and description comparison, then spot-check content for top candidates.
6 changes: 4 additions & 2 deletions .github/workflows/external-plugin-intake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: External Plugin Intake

on:
issues:
types: [opened, edited, reopened]
types: [opened, edited, reopened, labeled]

concurrency:
group: external-plugin-intake-${{ github.event.issue.number }}
Expand All @@ -17,7 +17,9 @@ jobs:
runs-on: ubuntu-latest
if: >-
contains(github.event.issue.labels.*.name, 'external-plugin') ||
contains(github.event.issue.body, '<!-- external-plugin-submission -->')
contains(github.event.issue.body, '<!-- external-plugin-submission -->') ||
startsWith(github.event.issue.title, '[External Plugin]:') ||
startsWith(github.event.issue.title, '[External Plugin Submission]')
outputs:
evaluation: ${{ steps.evaluation.outputs.result }}
should-sync: ${{ steps.guard.outputs.should-sync }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,14 @@ jobs:
});

const labelNames = new Set((currentIssue.labels || []).map((label) => label.name));
const issueTitle = String(currentIssue.title || '').trim();
const hasExternalPluginTitle =
issueTitle.startsWith('[External Plugin]:') ||
issueTitle.startsWith('[External Plugin Submission]');
const isExternalPluginIssue =
labelNames.has('external-plugin') ||
String(currentIssue.body || '').includes(intake.ISSUE_FORM_MARKER);
String(currentIssue.body || '').includes(intake.ISSUE_FORM_MARKER) ||
hasExternalPluginTitle;
if (!isExternalPluginIssue) {
core.info('Ignoring /rerun-intake because the issue is not an external plugin submission.');
return;
Expand Down
Loading
Loading