The ml-research entry from #613 was hand-added to the generated
dashboard/public/plugins.json without registering the repo in the
generator's REPOS list, so #697's regeneration silently dropped it.
- Add krasserm/ml-plugins to REPOS so the listing survives regeneration
- Restore the entry as produced by the generator's own process_repo(),
inserted in stars-descending order
- Generator: prefer plugin.json displayName for the display name
- Generator: for single-plugin repos, fall back to the locally scanned
component counts already collected for plugins_detail
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Clicking a plugin inside a marketplace (e.g. commit-commands in
claude-plugins-official) now opens a modal listing its actual
commands/agents/skills with names and descriptions, instead of just a
count badge. Also adds a live search box to filter plugins within a
marketplace page.
generate_plugins_json.py now fetches each component file's frontmatter
description (bounded by max_local_scans=50 locally-sourced plugins per
marketplace) and stores it in components_items, consumed by the new
MarketplacePluginsList.tsx island.
- Add required tools and model frontmatter fields (audit-only allowlist: Read, Grep, Glob, Bash, WebSearch, WebFetch)
- Modernize security toolchain with Foundry, Aderyn, Echidna/Medusa, Certora Prover/Halmos
- Reference OWASP Smart Contract Top 10 and add explicit severity classification (Critical/High/Medium/Low/Informational)
- Cover cross-chain bridge exploits and business logic/tokenomics attack categories
- Add Integration with Other Agents section and When to Stop and Ask guardrail
Automated review cycle | Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
- Add TR flag to CountryFlag.tsx so Turkey renders correctly in the
trending "Top Countries" list instead of falling back to the generic
placeholder icon.
- Wrap the "Promote your component" button on mobile so it no longer
overflows the Featured Integrations card.
- Fix Vercel/Anthropic footer icons being invisible in dark mode: they
relied on currentColor (which doesn't apply to <img> sources) and on
Tailwind's dark: variant, which is media-query based here while the
site's theme is toggled via a class on <html>. Now fetch fixed white
icons and invert them under html.light via a dedicated oss-icon class.
Filter toolbar (search/category/filters/sort) wrapped awkwardly on mobile,
leaving the sort dropdown orphaned to the right via ml-auto. Featured
integrations grid jumped from 1 to 3 columns right at the md breakpoint,
cramming card text. The mobile hamburger button also sat flush against
the search input with no gap.
The pagination safety limit (1,000,000 records) was cutting off before
reaching the end of the table (1,382,542 records total), and since
pagination orders by id ascending (oldest first), the cutoff always
excluded the most recent ~380k downloads — exactly the data needed to
compute today/week/month trending correctly. This produced suspicious
output where todayDownloads == weeklyDownloads == monthlyDownloads
(94,484 each), which should be mathematically near-impossible.
Raised the limit to 10,000,000 (plenty of headroom over the current
table size) and regenerated both trending-data.json copies. New numbers
show the expected progression: today (132,189) < week (152,849) <
month (227,654) < total (1,340,064).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Placeholder while the logo gets a proper redesign — swaps the pink
"AITMPL" image for a minimal terminal-style icon (>_) matching the site's
mono/terminal aesthetic and accent color, instead of leaving it blank.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The mobile hamburger button called toggleSidebar(), a function that was
never defined anywhere — a silent ReferenceError, so the button did
nothing. The sidebar itself was also `hidden` on mobile with no mechanism
to show it at all.
- Implements toggleSidebar() as a real slide-in drawer with a dark overlay
(closes on overlay tap, on navigating to a link, or on resize to desktop
width). Desktop collapse-to-icons behavior is untouched.
- Fixing the drawer surfaced a pre-existing horizontal overflow bug on
mobile (previously invisible since the sidebar never rendered): the
filter toolbar in ComponentGrid.tsx (search + category + sort) was a
flex row with no wrap, forcing the whole page to scroll horizontally
and clip content on narrow viewports. Added flex-wrap plus min-w-0/
min-w on the flex children so they stack instead of overflowing, and
min-w-0 on #main-content + overflow-x-hidden on <body> as defense in
depth against the same class of bug elsewhere.
Confirmed via browser console (scrollWidth > clientWidth check) that no
element overflows the mobile viewport after the fix.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Companies wanting to pay for a promoted slot need a way to apply. Adds a
button-style link next to the section title pointing to the public Google
Form (aitmpl.com Ads), styled with the site's accent color so it's visible
enough to notice — an earlier plain-text version was nearly invisible.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds free-tier Sentry error reporting to close the biggest observability
gap: automated cron/worker failures were previously invisible (aitmpl-crons
had no error handling at all). Uses a dependency-free fetch()-based Sentry
envelope client (cloudflare-workers/*/sentry.js, dashboard error-tracking.ts,
cli-tool error-reporting.js) instead of the official SDKs, to keep the
zero-dependency worker style and avoid Cloudflare Pages SSR friction.
- Cloudflare Workers: report failures + Cron Monitor check-ins in crons,
pulse, and docs-monitor (complementing, not replacing, existing Telegram
alerts). Also drops the pulse Vercel collector (VERCEL_API/collectVercel),
since the dashboard no longer deploys to Vercel.
- Dashboard: captureApiError() wired into claude-code-check, health-check,
and the three track-* endpoints.
- CLI: opt-in only crash reporting (CCT_ERROR_REPORTING=true), always
deferring to the existing CCT_NO_TRACKING/CCT_NO_ANALYTICS/CI opt-outs.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The dashboard is on Cloudflare Pages with a 24h edge cache already in
place, but every island still downloaded the full ~1.9MB index (327KB
gz) — even the sidebars/plugins/collection pages that only need per-type
counts. This splits the index into purpose-built artifacts so the
browser fetches only what each surface needs.
Generator (scripts/generate_components_json.py):
- Decouple the docs and dashboard index writes (they were a byte copy).
docs/components.json keeps `security` (the legacy site renders it);
the dashboard index drops both `content` and `security` (unused there)
→ ~13% smaller.
- Emit dashboard/public/counts.json (per-type counts, ~150 bytes),
components/{type}.json (per-type slices), and search-index.json
(flat name/description/category/type/path for global search).
Dashboard islands:
- ComponentGrid loads only the active type via fetchComponentsByType,
re-fetching on type switch (per-type in-memory cache).
- SearchModal (Cmd+K) uses the lighter search-index.json.
- Sidebar + plugins index/detail + collection pages fetch counts.json
instead of the full index just to read array lengths.
- data.ts gains fetchComponentsByType/fetchSearchIndex (additive);
fetchComponents() stays for the SSR detail page and Discord bot.
Fix: SendToRepoModal read `match.content` off an index that no longer
carries content, so "Send to repo" produced empty PRs / threw "No
component content found". buildFileMap now pulls each item's content via
fetchComponentContent (the per-component files), which also removes its
full-index fetch.
_headers: cache/CORS blocks for counts.json, components/*, search-index.json.
Payload (gzip on-the-wire): sidebars/plugins/collection 327KB → ~124B;
grid default type (agents) 327KB → 145KB; Cmd+K 327KB → 260KB.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add missing model: sonnet frontmatter field to match sibling agents
- Rewrite system prompt to be Claude-specific: XML tag structuring,
role framing, multishot examples, extended thinking/effort parameter,
prompt caching, and grounded long-context answers
- Remove outdated JSON "Communication Protocol" handshake pattern in
favor of a plain-language Requirements Gathering step
- Add explicit boundaries vs. llm-architect, model-evaluator, and
task-decomposition-expert to reduce delegation ambiguity
- Reframe hardcoded example metrics (accuracy %, latency, cost) as
illustrative targets to confirm with the user rather than universal
thresholds
- Regenerate component catalog entries for prompt-engineer
Automated review cycle | Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
- Add required model field (sonnet) and color field to frontmatter
- Add Write/Edit tools so the agent can produce the test plans/docs it describes
- Rewrite QA excellence and excellence checklists as concrete, verifiable criteria instead of vague adjectives
- Replace hardcoded fake metrics in progress tracking and delivery notification with placeholder templates and explicit anti-fabrication guidance
- Replace speculative JSON "Communication Protocol" context-manager pattern with plain-language context-gathering guidance
- Add AI-assisted and agentic testing practices section covering risk-based test planning and delegation to test-automator/playwright-tester
- Regenerate component catalog (docs/components.json, dashboard/public/components.json)
Automated review cycle | Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>