microsoft / microsoft/AI-Engineering-Coach

Community catalog always empty: scraper looks for <article>, site now serves <div>

Open Beginner friendly
#265 1 comment 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

bug
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
  1. Open the dashboard → Skill Finder
  2. Click Analyze
  3. 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:

  1. The entry tag. <article><div>, ideally accepting both so it survives a revert.

  2. 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, titleMatch fails, and if (!title) continue drops 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.