microsoft / microsoft/AI-Engineering-Coach
Community catalog always empty: scraper looks for <article>, site now serves <div>
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 4.2k
- Forks
- 585
- Avg merge
- 22h 5m
- Merged PRs (30d)
- 16
Description
Description
getCatalogItems() always returns an empty array, so Skill Finder → Community Skills & Agents shows "0 curated from 0 catalog items" for everyone, on every harness. No error is surfaced — the fetch succeeds and the parse silently matches nothing.
The catalog site changed its markup. Each entry is now a <div class="resource-item">; the scraper in src/webview/panel-catalog.ts:43 still looks for <article>:
const articleRegex = /<article\s+class="resource-item"[^>]*data-path="([^"]*)"[^>]*>([\s\S]*?)<\/article>/g;
Against the live site today:
$ curl -s https://awesome-copilot.github.com/skills/ | grep -oE '<(article|div) class="resource-item"' | sort | uniq -c
418 <div class="resource-item"
418 entries on that page alone, zero of them <article>.
Steps to Reproduce
- Open the dashboard → Skill Finder
- Click Analyze
- The Community Skills & Agents section reports 0 items
Or directly:
import { getCatalogItems } from './src/webview/panel-catalog';
getCatalogItems().then(i => console.log('items:', i.length)); // items: 0
Expected Behavior
Catalog items are fetched and listed.
Notes toward a fix
Two things need changing, not just the tag name:
-
The entry tag.
<article>→<div>, ideally accepting both so it survives a revert. -
The block delimiter. Entries now contain nested
<div>s, so a non-greedy[\s\S]*?up to</div>stops at the first inner close tag. The captured block ends mid-element,titleMatchfails, andif (!title) continuedrops every item — so simply swapping the tag name still yields 0. Delimiting on the start of the next entry works:
const articleRegex = /<(?:article|div)\s+class="resource-item"[^>]*data-path="([^"]*)"[^>]*>([\s\S]*?)(?=<(?:article|div)\s+class="resource-item"|$)/g;
With that, all 833 items across the four pages parse, descriptions included.
A note on robustness rather than the bug itself: because the parse failure is silent, this went unnoticed while looking like "no matches for your workflow". A zero-item result after a successful fetch is more likely a parse break than an empty catalog, and saying so in the UI (or logging it) would surface the next markup change immediately.
Separately, hooks 404s — https://awesome-copilot.github.com/hooks/ does not exist, so that fetchCatalogPage call is always wasted. Harmless today since !response.ok returns [], but it may be a leftover.
Extension Version
0.1.0 (reproduced against main as of 2026-09-15)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read src/webview/panel-catalog.ts at getCatalogItems and run the direct reproduction described in the issue. Update the parser so current resource-item div entries, with nested divs and article compatibility, are captured; done means catalog items and descriptions are returned instead of an empty result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 84/100