Skip to content

Add /agents gallery, detail pages, use-cases, and build-your-own#1065

Open
khaliqgant wants to merge 6 commits into
mainfrom
feat/agents-gallery
Open

Add /agents gallery, detail pages, use-cases, and build-your-own#1065
khaliqgant wants to merge 6 commits into
mainfrom
feat/agents-gallery

Conversation

@khaliqgant

Copy link
Copy Markdown
Member

What

A public surface for the open-source AgentWorkforce agents on the marketing site (web), built to match the existing primitives/pear design language.

  • /agents — gallery of 7 agents (PR Reviewer, Repo Hygiene, Granola Prospect, Linear Implementer, Hacker News Monitor, Vendor Monitor, Spotify Releases). Includes a sandbox / persistent-memory / one-click-deploy capabilities strip and a "Build your own agent" section (downloadable persona skill via npx skills add or npx prpm install, plus a copyable scaffolding prompt).
  • /agents/[slug] — static-generated detail pages: banner art, highlights, a human-readable trigger (Schedule/Event tag + cron/event chip), config inputs, a GitHub icon next to the title, and Launch agent (agentrelay.com/cloud/deploy?persona=…) + Fork on GitHub (/<repo>/fork) CTAs.
  • /agents/use-cases — proactive use cases grouped into 5 themes, mapped to the agents that deliver them.
  • Relocated the old /agents README markdown endpoint to /agents.md (same text/markdown + cache headers) so the HTML gallery can own /agents.

How

  • Typed catalog + helpers in lib/agents.ts.
  • Plain <img> (no next/image, per the SST/OpenNext optimizer constraint); deterministic monogram fallback for art-less agents.
  • Graphics synced from the agents repo into public/agents/<slug>/ via scripts/sync-agent-assets.sh.
  • Registered in sitemap.ts, robots.ts, and the footer Projects column (intentionally not in the header nav).

Validation

  • tsc --noEmit clean.
  • All routes render 200 in dev (/agents, all 7 /agents/<slug>, /agents/use-cases, /agents.md); unknown slug 404s.
  • Reviewed for design fidelity and mobile/a11y (sibling buttons, prompt-body wrapping, eager hero image) against primitives/pear.

Note: next build currently fails on /message with a useContext null prerender error — this is pre-existing on main (reproduced with this branch's changes stashed and .next cleared) and unrelated to these pages, which prerender cleanly.

🤖 Generated with Claude Code

…ur-own

Public surface for the open-source AgentWorkforce agents on the marketing site:

- /agents — gallery of 7 agents with a sandbox / persistent-memory / one-click-deploy
  capabilities strip, plus a "Build your own agent" section (downloadable persona
  skill + copyable prompt).
- /agents/[slug] — static-generated detail pages: banner art, highlights, a
  human-readable trigger (Schedule/Event tag + cron/event chip), config inputs,
  a GitHub icon by the title, and "Launch agent" (agentrelay.com/cloud/deploy?persona=…)
  + "Fork on GitHub" CTAs.
- /agents/use-cases — proactive use cases grouped into 5 themes.
- Relocated the /agents README markdown endpoint to /agents.md (same content-type
  and cache headers) so the HTML gallery can own /agents.

Typed catalog in lib/agents.ts; graphics synced into public/agents/<slug>/ via
scripts/sync-agent-assets.sh. Registered in sitemap.ts, robots.ts, and the footer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@khaliqgant khaliqgant requested a review from willwashburn as a code owner June 9, 2026 09:53
@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f3e22c5c-69e5-4a03-85c4-75d2284d84ff

📥 Commits

Reviewing files that changed from the base of the PR and between 9bc6186 and 2183884.

⛔ Files ignored due to path filters (21)
  • web/public/agent-art/granola/banner.png is excluded by !**/*.png
  • web/public/agent-art/granola/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/granola/card.png is excluded by !**/*.png
  • web/public/agent-art/hn-monitor/banner.png is excluded by !**/*.png
  • web/public/agent-art/hn-monitor/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/hn-monitor/card.png is excluded by !**/*.png
  • web/public/agent-art/linear/banner.png is excluded by !**/*.png
  • web/public/agent-art/linear/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/linear/card.png is excluded by !**/*.png
  • web/public/agent-art/repo-hygiene/banner.png is excluded by !**/*.png
  • web/public/agent-art/repo-hygiene/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/repo-hygiene/card.png is excluded by !**/*.png
  • web/public/agent-art/review/banner.png is excluded by !**/*.png
  • web/public/agent-art/review/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/review/card.png is excluded by !**/*.png
  • web/public/agent-art/spotify-releases/banner.png is excluded by !**/*.png
  • web/public/agent-art/spotify-releases/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/spotify-releases/card.png is excluded by !**/*.png
  • web/public/agent-art/vendor-monitor/banner.png is excluded by !**/*.png
  • web/public/agent-art/vendor-monitor/card-sm.png is excluded by !**/*.png
  • web/public/agent-art/vendor-monitor/card.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • web/lib/agents.ts
  • web/scripts/sync-agent-assets.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • web/scripts/sync-agent-assets.sh
  • web/lib/agents.ts

📝 Walkthrough

Walkthrough

Adds a full agents discovery feature: typed catalog data, gallery and detail pages, a use-cases view, reusable UI components (art, fork, build flow), CSS module styling, SEO/sitemap/robots/footer updates, and an asset sync script. Includes a relocation note for the /agents.md endpoint.

Changes

Agent Feature

Layer / File(s) Summary
Agent data model and helper functions
web/lib/agents.ts
Defines Integration, Agent, AgentTrigger, UseCase, and UseCaseGroup types; exports AGENTS catalog array, INTEGRATION_LABELS, USE_CASE_GROUPS, NON_PUBLIC_AGENT_LABELS, and helper functions (getAgent, allAgentSlugs, agentAsset, sourceUrl, forkUrl, launchUrl).
Styling and AgentArt fallback
web/app/agents/agents.module.css, web/components/agents/AgentArt.tsx
Adds comprehensive scoped CSS for gallery, detail, use-cases, and build flow; AgentArt renders committed PNG assets per variant or a gradient+monogram fallback with accessible labeling.
Reusable agent UI components
web/components/agents/BuildYourOwn.tsx, web/components/agents/ForkAgentButton.tsx
BuildYourOwn provides a multi-step scaffold UI with copy-to-clipboard logic and prompt preview; ForkAgentButton renders primary “Launch agent” and secondary “Fork on GitHub” CTAs with accessible attributes.
Agent gallery page
web/app/agents/AgentsGallery.tsx, web/app/agents/page.tsx
Adds the Agents gallery component and page module with metadata; renders hero, capabilities, agent card grid with integration chips, BuildYourOwn, and powered-by footer.
Agent detail page with static generation
web/app/agents/[slug]/page.tsx, web/app/agents/[slug]/AgentDetail.tsx
Implements per-agent routes using allAgentSlugs() for static params and generateMetadata() for per-agent metadata (including optional custom OG image); AgentDetail composes banner, integration chips, fork CTAs, descriptive content, meta card, and optional inputs configuration.
Use cases page with themed organization
web/app/agents/use-cases/UseCasesContent.tsx, web/app/agents/use-cases/page.tsx
Adds themed use-case groups with pill navigation linking to anchored bands of case cards; AgentRef resolves agent links or non-public labels; includes page metadata.
SEO, navigation, and asset infrastructure
web/app/robots.ts, web/app/sitemap.ts, web/components/SiteFooter.tsx, web/scripts/sync-agent-assets.sh
Allows /agents in robots rules; extends sitemap with /agents, /agents/use-cases, and per-agent /agents/<slug> entries; adds "Agents" link to the footer; includes script to sync PNG assets into web/public/agent-art/.
Markdown endpoint relocation note
web/app/agents.md/route.ts
Adds documentation comment noting /agents.md endpoint was relocated so app/agents/page.tsx serves the HTML gallery while preserving the original Content-Type and Cache-Control behavior.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I hopped through files and stitched the hall,

Cards and banners line the wall,
Copy, fork, and launch with cheer,
Use-cases guide the browsing near,
A tiny script brings art to all.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main changes: adding the /agents gallery page, detail pages, use-cases section, and build-your-own feature.
Description check ✅ Passed The description provides comprehensive coverage but lacks the required test plan section from the template; however, author notes validation steps in a separate note and most other information is well-documented.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/agents-gallery

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a new /agents section to the web application, featuring an agent gallery, detailed agent pages, and use-case mappings, along with associated components, styles, and asset-syncing scripts. The review feedback highlights a potential runtime crash in the monogram helper when handling empty names, recommends adding a directory existence check in the asset-syncing shell script for better robustness, and suggests replacing fictional model names in the agent definitions with real, currently available models.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +13 to +17
function monogram(name: string): string {
const words = name.split(/\s+/).filter(Boolean);
if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
return (words[0][0] + words[words.length - 1][0]).toUpperCase();
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The monogram function will throw a TypeError if name is empty or contains only whitespace. When name is empty, words will be an empty array ([]), and words.length === 1 will be false. The function will then attempt to access words[0][0], which results in reading property 0 of undefined.

To prevent potential runtime crashes, add a guard check for empty words.

Suggested change
function monogram(name: string): string {
const words = name.split(/\s+/).filter(Boolean);
if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
return (words[0][0] + words[words.length - 1][0]).toUpperCase();
}
function monogram(name: string): string {
const words = name.split(/\s+/).filter(Boolean);
if (words.length === 0) return '';
if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
return (words[0][0] + words[words.length - 1][0]).toUpperCase();
}


SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WEB_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
AGENTS_REPO="$(cd "$WEB_DIR/../../agents" && pwd)"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

If the agents repository is not cloned side-by-side with this repository, the cd command on line 16 will fail. Because set -e is active, the script will crash immediately with a generic and potentially confusing error.

Adding a check to verify the directory's existence and printing a clear, user-friendly error message will greatly improve the developer experience.

Suggested change
AGENTS_REPO="$(cd "$WEB_DIR/../../agents" && pwd)"
if [ ! -d "$WEB_DIR/../../agents" ]; then
echo "Error: agents repository not found at $WEB_DIR/../../agents" >&2
echo "Please clone the 'agents' repository side-by-side with this repository." >&2
exit 1
fi
AGENTS_REPO="$(cd "$WEB_DIR/../../agents" && pwd)"

Comment thread web/lib/agents.ts
detail: 'pull_request · review comments · check runs · review submitted',
},
integrations: ['github', 'slack'],
runtime: 'Codex · gpt-5.5',

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The model names specified in the runtime fields (such as gpt-5.5, claude-sonnet-4-6, and claude-haiku-4-5) appear to be hallucinations of non-existent models.

Since this is a public-facing marketing site, displaying fictional model names can confuse visitors and look unprofessional. Please update these to actual, currently available models (e.g., gpt-4o, claude-3-5-sonnet, claude-3-5-haiku) or the correct internal names.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
web/scripts/sync-agent-assets.sh (2)

19-28: ⚖️ Poor tradeoff

Consider reducing duplication with the agent catalog.

The hardcoded AGENTS mapping duplicates the agent slug list from lib/agents.ts. If a new agent is added to the catalog but not to this script, its assets won't be synced, which could cause the gallery to fall back to monogram placeholders unexpectedly.

Options to reduce drift risk:

  1. Generate this list from the catalog using a Node.js script
  2. Document in both locations that they must be kept in sync
  3. Add a validation step that compares the two lists
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/scripts/sync-agent-assets.sh` around lines 19 - 28, The AGENTS array is
duplicated and will drift from the canonical catalog in lib/agents.ts; replace
the hardcoded AGENTS in sync-agent-assets.sh by invoking a small Node.js helper
that imports the catalog from lib/agents.ts and prints the required "dir:slug"
entries (or just slugs) to stdout, then read that output into the AGENTS
variable (e.g. AGENTS=($(node ./scripts/generate-agent-list.js))); alternatively
add a validation step (a Node script that compares the shell AGENTS entries
against the exported list in lib/agents.ts) and run it in CI to fail when they
differ; reference AGENTS in the script and the catalog export in lib/agents.ts
to locate code to change.

14-17: ⚡ Quick win

Document the cross-repo dependency and add validation.

The script assumes a sibling agents repository exists at ../../agents, but this requirement isn't documented in the header comments. Line 16 will fail with a cryptic "No such file or directory" error if the agents repo hasn't been cloned.

Consider adding a validation check with a helpful error message:

📝 Suggested improvement
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 WEB_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
-AGENTS_REPO="$(cd "$WEB_DIR/../../agents" && pwd)"
+AGENTS_REPO_PATH="$WEB_DIR/../../agents"
+
+if [ ! -d "$AGENTS_REPO_PATH" ]; then
+  echo "ERROR: agents repository not found at $AGENTS_REPO_PATH" >&2
+  echo "This script requires the agentworkforce/agents repo to be cloned as a sibling to the relay repo." >&2
+  exit 1
+fi
+
+AGENTS_REPO="$(cd "$AGENTS_REPO_PATH" && pwd)"
 DEST_ROOT="$WEB_DIR/public/agents"

Also update the header comment to document this requirement:

 # Sync the AgentWorkforce agents' graphics (avatar/banner/card/card-sm PNGs)
 # from the agents repo into public/agents/<slug>/ so the /agents gallery can
 # serve them as static assets.
 #
-# Source of truth: ../../agents/<dir>/{avatar,banner,card,card-sm}.png
+# Prerequisites: The agentworkforce/agents repository must be cloned as a 
+# sibling directory to the relay repository.
+# Source of truth: ../../agents/<dir>/{avatar,banner,card,card-sm}.png
 # Run from anywhere; paths are resolved relative to this script.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/scripts/sync-agent-assets.sh` around lines 14 - 17, Update the script
header to document the cross-repo dependency (that a sibling "agents" repo must
be cloned at ../../agents) and add a runtime validation after AGENTS_REPO is
set: check that the resolved AGENTS_REPO directory exists and is a git repo (or
contains expected files) and if not print a clear, actionable error message and
exit non‑zero; update any references that use DEST_ROOT/AGENTS_REPO to rely on
this check so failures are explicit and user-friendly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/agents/agents.module.css`:
- Line 74: Add support for users who prefer reduced motion by wrapping animation
and transition rules in a prefers-reduced-motion media query: disable the pulse
animation on .badgeDot (the rule that declares "animation: pulse 2s ease-in-out
infinite;") and set transition/transform/animation to none for interactive
classes like .pill, .card, .useCard, .iconBtn, .backLink (and any other
hover/transform rules at the ranges mentioned) inside `@media`
(prefers-reduced-motion: reduce) so animations/transitions are suppressed for
those selectors while leaving existing styles intact for other users.
- Line 891: The CSS rule uses the deprecated value `word-break: break-word`;
remove that declaration (or change it to `word-break: normal`) in the
agents.module.css rule so the existing `overflow-wrap: anywhere` handles
long-word wrapping; locate the `word-break: break-word` entry in
agents.module.css and delete or replace it with `word-break: normal`.

In `@web/components/agents/BuildYourOwn.tsx`:
- Around line 30-48: The copyText function currently swallows failures and
ignores the boolean result of document.execCommand('copy'), causing handleCopy
and handleCopyCmd to always show success; update copyText to return a boolean
(or throw) indicating success by: checking and returning the result of
document.execCommand('copy') in the fallback path and returning true/false (or
throwing) when using navigator.clipboard.writeText, then adjust callers
handleCopy and handleCopyCmd to use that returned value (or catch the thrown
error) to only show the "Copied" feedback on actual success; reference copyText,
handleCopy, handleCopyCmd and document.execCommand in your changes.

---

Nitpick comments:
In `@web/scripts/sync-agent-assets.sh`:
- Around line 19-28: The AGENTS array is duplicated and will drift from the
canonical catalog in lib/agents.ts; replace the hardcoded AGENTS in
sync-agent-assets.sh by invoking a small Node.js helper that imports the catalog
from lib/agents.ts and prints the required "dir:slug" entries (or just slugs) to
stdout, then read that output into the AGENTS variable (e.g. AGENTS=($(node
./scripts/generate-agent-list.js))); alternatively add a validation step (a Node
script that compares the shell AGENTS entries against the exported list in
lib/agents.ts) and run it in CI to fail when they differ; reference AGENTS in
the script and the catalog export in lib/agents.ts to locate code to change.
- Around line 14-17: Update the script header to document the cross-repo
dependency (that a sibling "agents" repo must be cloned at ../../agents) and add
a runtime validation after AGENTS_REPO is set: check that the resolved
AGENTS_REPO directory exists and is a git repo (or contains expected files) and
if not print a clear, actionable error message and exit non‑zero; update any
references that use DEST_ROOT/AGENTS_REPO to rely on this check so failures are
explicit and user-friendly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a6919d46-ebee-4542-95c2-d50b41f11356

📥 Commits

Reviewing files that changed from the base of the PR and between 6b67acf and 3b300b8.

⛔ Files ignored due to path filters (28)
  • web/public/agents/granola/avatar.png is excluded by !**/*.png
  • web/public/agents/granola/banner.png is excluded by !**/*.png
  • web/public/agents/granola/card-sm.png is excluded by !**/*.png
  • web/public/agents/granola/card.png is excluded by !**/*.png
  • web/public/agents/hn-monitor/avatar.png is excluded by !**/*.png
  • web/public/agents/hn-monitor/banner.png is excluded by !**/*.png
  • web/public/agents/hn-monitor/card-sm.png is excluded by !**/*.png
  • web/public/agents/hn-monitor/card.png is excluded by !**/*.png
  • web/public/agents/linear/avatar.png is excluded by !**/*.png
  • web/public/agents/linear/banner.png is excluded by !**/*.png
  • web/public/agents/linear/card-sm.png is excluded by !**/*.png
  • web/public/agents/linear/card.png is excluded by !**/*.png
  • web/public/agents/repo-hygiene/avatar.png is excluded by !**/*.png
  • web/public/agents/repo-hygiene/banner.png is excluded by !**/*.png
  • web/public/agents/repo-hygiene/card-sm.png is excluded by !**/*.png
  • web/public/agents/repo-hygiene/card.png is excluded by !**/*.png
  • web/public/agents/review/avatar.png is excluded by !**/*.png
  • web/public/agents/review/banner.png is excluded by !**/*.png
  • web/public/agents/review/card-sm.png is excluded by !**/*.png
  • web/public/agents/review/card.png is excluded by !**/*.png
  • web/public/agents/spotify-releases/avatar.png is excluded by !**/*.png
  • web/public/agents/spotify-releases/banner.png is excluded by !**/*.png
  • web/public/agents/spotify-releases/card-sm.png is excluded by !**/*.png
  • web/public/agents/spotify-releases/card.png is excluded by !**/*.png
  • web/public/agents/vendor-monitor/avatar.png is excluded by !**/*.png
  • web/public/agents/vendor-monitor/banner.png is excluded by !**/*.png
  • web/public/agents/vendor-monitor/card-sm.png is excluded by !**/*.png
  • web/public/agents/vendor-monitor/card.png is excluded by !**/*.png
📒 Files selected for processing (16)
  • web/app/agents.md/route.ts
  • web/app/agents/AgentsGallery.tsx
  • web/app/agents/[slug]/AgentDetail.tsx
  • web/app/agents/[slug]/page.tsx
  • web/app/agents/agents.module.css
  • web/app/agents/page.tsx
  • web/app/agents/use-cases/UseCasesContent.tsx
  • web/app/agents/use-cases/page.tsx
  • web/app/robots.ts
  • web/app/sitemap.ts
  • web/components/SiteFooter.tsx
  • web/components/agents/AgentArt.tsx
  • web/components/agents/BuildYourOwn.tsx
  • web/components/agents/ForkAgentButton.tsx
  • web/lib/agents.ts
  • web/scripts/sync-agent-assets.sh

border-radius: 50%;
background: var(--primary);
box-shadow: 0 0 6px color-mix(in srgb, var(--primary) 50%, transparent);
animation: pulse 2s ease-in-out infinite;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Missing prefers-reduced-motion support for accessibility.

The stylesheet includes multiple animations and transitions (badge pulse, hover effects, transforms) without respecting user motion preferences. Users with vestibular disorders or motion sensitivity should be able to disable animations via the prefers-reduced-motion media query.

Wrap animations in a media query or provide reduced-motion alternatives:

`@media` (prefers-reduced-motion: reduce) {
  .badgeDot {
    animation: none;
  }
  .pill,
  .card,
  .useCard,
  .iconBtn,
  .backLink,
  /* etc. */ {
    transition: none;
  }
}

[accessibility]

Also applies to: 130-134, 236-240

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/app/agents/agents.module.css` at line 74, Add support for users who
prefer reduced motion by wrapping animation and transition rules in a
prefers-reduced-motion media query: disable the pulse animation on .badgeDot
(the rule that declares "animation: pulse 2s ease-in-out infinite;") and set
transition/transform/animation to none for interactive classes like .pill,
.card, .useCard, .iconBtn, .backLink (and any other hover/transform rules at the
ranges mentioned) inside `@media` (prefers-reduced-motion: reduce) so
animations/transitions are suppressed for those selectors while leaving existing
styles intact for other users.

color: var(--fg);
white-space: pre-wrap;
overflow-wrap: anywhere;
word-break: break-word;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove deprecated word-break: break-word value.

The break-word value for word-break is deprecated. Since overflow-wrap: anywhere on line 890 already handles wrapping long words, the word-break declaration is redundant and should be removed or set to normal.

🛠️ Proposed fix
   color: var(--fg);
   white-space: pre-wrap;
   overflow-wrap: anywhere;
-  word-break: break-word;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
word-break: break-word;
color: var(--fg);
white-space: pre-wrap;
overflow-wrap: anywhere;
}
🧰 Tools
🪛 Stylelint (17.12.0)

[error] 891-891: Deprecated keyword "break-word" for property "word-break" (declaration-property-value-keyword-no-deprecated)

(declaration-property-value-keyword-no-deprecated)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/app/agents/agents.module.css` at line 891, The CSS rule uses the
deprecated value `word-break: break-word`; remove that declaration (or change it
to `word-break: normal`) in the agents.module.css rule so the existing
`overflow-wrap: anywhere` handles long-word wrapping; locate the `word-break:
break-word` entry in agents.module.css and delete or replace it with
`word-break: normal`.

Source: Linters/SAST tools

Comment on lines +30 to +48
async function copyText(text: string) {
if (navigator.clipboard?.writeText) {
try {
await navigator.clipboard.writeText(text);
return;
} catch {
// Fall back for embedded browsers that expose clipboard without write access.
}
}
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.setAttribute('readonly', '');
textarea.style.position = 'fixed';
textarea.style.left = '-9999px';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Copy operation doesn't propagate failure, causing false-positive "Copied" feedback.

The copyText function doesn't return a success indicator or throw on failure. document.execCommand('copy') on line 46 returns a boolean, but it's ignored. As a result, handleCopy and handleCopyCmd (lines 55–65) unconditionally display the "Copied" checkmark even when the copy operation fails, misleading users.

🛡️ Proposed fix to propagate copy failure
-async function copyText(text: string) {
+async function copyText(text: string): Promise<boolean> {
   if (navigator.clipboard?.writeText) {
     try {
       await navigator.clipboard.writeText(text);
-      return;
+      return true;
     } catch {
       // Fall back for embedded browsers that expose clipboard without write access.
     }
   }
   const textarea = document.createElement('textarea');
   textarea.value = text;
   textarea.setAttribute('readonly', '');
   textarea.style.position = 'fixed';
   textarea.style.left = '-9999px';
   document.body.appendChild(textarea);
   textarea.select();
-  document.execCommand('copy');
+  const success = document.execCommand('copy');
   document.body.removeChild(textarea);
+  return success;
 }

 async function handleCopy() {
-  await copyText(BUILD_AGENT_PROMPT);
-  setCopied(true);
-  window.setTimeout(() => setCopied(false), 1800);
+  const success = await copyText(BUILD_AGENT_PROMPT);
+  if (success) {
+    setCopied(true);
+    window.setTimeout(() => setCopied(false), 1800);
+  }
 }

 async function handleCopyCmd(cmd: string) {
-  await copyText(cmd);
-  setCopiedCmd(cmd);
-  window.setTimeout(() => setCopiedCmd(null), 1800);
+  const success = await copyText(cmd);
+  if (success) {
+    setCopiedCmd(cmd);
+    window.setTimeout(() => setCopiedCmd(null), 1800);
+  }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/components/agents/BuildYourOwn.tsx` around lines 30 - 48, The copyText
function currently swallows failures and ignores the boolean result of
document.execCommand('copy'), causing handleCopy and handleCopyCmd to always
show success; update copyText to return a boolean (or throw) indicating success
by: checking and returning the result of document.execCommand('copy') in the
fallback path and returning true/false (or throwing) when using
navigator.clipboard.writeText, then adjust callers handleCopy and handleCopyCmd
to use that returned value (or catch the thrown error) to only show the "Copied"
feedback on actual success; reference copyText, handleCopy, handleCopyCmd and
document.execCommand in your changes.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

Gallery cards were loading the full 1.5MB card.png; switch them to the
~52KB card-sm.png variant (AgentArt gains a 'card-sm' variant). Detail
banners still use the full-resolution banner.png.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Preview deployed!

Environment URL
Web https://d3kdiy7bdpzz4h.cloudfront.net

This preview will be cleaned up when the PR is merged or closed.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

The GitHub view-source icon now lives next to the agent title, so the
icon-only branch in ForkAgentButton (and its .iconBtn styles + sourceUrl
import) was dead. Remove it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

The use-case reference chips were loading full ~1.3MB avatar.png files for
18px thumbnails (~9.5MB on the page). Replace with a lightweight accent dot
(agent.accent). avatar.png is then unused everywhere, so drop the 'avatar'
variant from AgentArt/agentAsset, remove it from the sync script, and delete
the committed avatar PNGs. Remaining assets: banner (detail), card-sm
(gallery), card (OG).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

@agent-relay-code

Copy link
Copy Markdown
Contributor

ℹ️ pr-reviewer: review only — no file changes were applied to the PR (nothing to commit after review). The notes below are advisory and were not pushed.

pr-reviewer could not complete review for #1065 in AgentWorkforce/relay.
The review harness exited with code 1.
No review was posted; this needs operator attention.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
web/components/agents/AgentArt.tsx (2)

7-11: ⚡ Quick win

Simplify the identity mapping.

The ASSET_FOR mapping is redundant—each variant maps to itself. You can remove this mapping and pass variant directly to agentAsset:

♻️ Proposed simplification
-const ASSET_FOR: Record<Variant, 'card' | 'card-sm' | 'banner'> = {
-  card: 'card',
-  'card-sm': 'card-sm',
-  banner: 'banner',
-};
-
 const FALLBACK_FONT_SIZE: Record<Variant, string> = {
   banner: 'clamp(3rem, 9vw, 6rem)',
   card: 'clamp(2.4rem, 12vw, 4rem)',
   'card-sm': 'clamp(2.4rem, 12vw, 4rem)',
 };
   if (agent.hasCustomArt) {
     return (
       <img
-        src={agentAsset(agent.slug, ASSET_FOR[variant])}
+        src={agentAsset(agent.slug, variant)}
         alt={alt ?? `${agent.name} artwork`}
         loading={loading}
       />
     );
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/components/agents/AgentArt.tsx` around lines 7 - 11, ASSET_FOR is a
redundant identity map—remove the ASSET_FOR constant from AgentArt.tsx and
update any usage (where ASSET_FOR[variant] is passed to agentAsset) to pass the
variant value directly; ensure the Variant type is still used for typing and
that all references to ASSET_FOR are replaced with variant so agentAsset
receives the same string previously derived from ASSET_FOR.

53-66: ⚡ Quick win

Document the parent positioning requirement.

The fallback div uses position: absolute with inset: 0, which requires the parent container to have position: relative (or another non-static positioning). Consider adding a comment or ensuring the parent containers in callers (AgentsGallery card media, AgentDetail banner) explicitly set position: relative in their CSS modules.

📝 Suggested comment addition
   const style: CSSProperties = {
+    // Requires parent container to have position: relative
     position: 'absolute',
     inset: 0,
     background: `linear-gradient(135deg, ${agent.accent}, color-mix(in srgb, ${agent.accent} 50%, `#0b0e14`))`,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/components/agents/AgentArt.tsx` around lines 53 - 66, The fallback style
in AgentArt.tsx (the style constant used for the fallback div with position:
'absolute' and inset: 0) requires its parent to be non-static (e.g., position:
'relative'); add a short comment above the style or the JSX fallback div noting
this parent positioning requirement, and update the callers (AgentsGallery card
media and AgentDetail banner) to ensure their container styles include position:
'relative' (or another non-static position) so the absolute inset behaves as
intended.
web/app/agents/use-cases/UseCasesContent.tsx (1)

84-98: 💤 Low value

Consider varying animation delays for all cards.

The current animation delay calculation (ci % 2) * 60 on line 86 only creates two delay values (0ms and 60ms) alternating for even/odd cards. If you want each card in a row to have a distinct stagger effect, consider using ci * 60 instead to increment the delay for each card.

♻️ Alternative delay calculation
               <div className={s.useGrid}>
                 {group.cases.map((useCase, ci) => (
-                  <FadeIn key={useCase.title} direction="up" delay={(ci % 2) * 60}>
+                  <FadeIn key={useCase.title} direction="up" delay={ci * 60}>
                     <div className={s.useCard}>

Note: This assumes you want a progressive stagger across all cards in a group. The current implementation may be intentional if you only want to stagger by column in a two-column grid.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/app/agents/use-cases/UseCasesContent.tsx` around lines 84 - 98, The
FadeIn stagger currently uses (ci % 2) * 60 which only alternates 0/60ms; update
the delay calculation inside the group.cases map in UseCasesContent (the map
that produces FadeIn for each useCase, using the index variable ci) to use a
progressive stagger (e.g., ci * 60) so each card gets an increasing delay,
ensuring a distinct stagger effect across all cards rather than just alternating
values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@web/app/agents/use-cases/UseCasesContent.tsx`:
- Around line 84-98: The FadeIn stagger currently uses (ci % 2) * 60 which only
alternates 0/60ms; update the delay calculation inside the group.cases map in
UseCasesContent (the map that produces FadeIn for each useCase, using the index
variable ci) to use a progressive stagger (e.g., ci * 60) so each card gets an
increasing delay, ensuring a distinct stagger effect across all cards rather
than just alternating values.

In `@web/components/agents/AgentArt.tsx`:
- Around line 7-11: ASSET_FOR is a redundant identity map—remove the ASSET_FOR
constant from AgentArt.tsx and update any usage (where ASSET_FOR[variant] is
passed to agentAsset) to pass the variant value directly; ensure the Variant
type is still used for typing and that all references to ASSET_FOR are replaced
with variant so agentAsset receives the same string previously derived from
ASSET_FOR.
- Around line 53-66: The fallback style in AgentArt.tsx (the style constant used
for the fallback div with position: 'absolute' and inset: 0) requires its parent
to be non-static (e.g., position: 'relative'); add a short comment above the
style or the JSX fallback div noting this parent positioning requirement, and
update the callers (AgentsGallery card media and AgentDetail banner) to ensure
their container styles include position: 'relative' (or another non-static
position) so the absolute inset behaves as intended.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e9d73b44-3b8d-4685-8cd5-8c328863ebb3

📥 Commits

Reviewing files that changed from the base of the PR and between 95be33c and 9bc6186.

📒 Files selected for processing (6)
  • web/app/agents/agents.module.css
  • web/app/agents/use-cases/UseCasesContent.tsx
  • web/components/agents/AgentArt.tsx
  • web/components/agents/ForkAgentButton.tsx
  • web/lib/agents.ts
  • web/scripts/sync-agent-assets.sh
✅ Files skipped from review due to trivial changes (1)
  • web/scripts/sync-agent-assets.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • web/app/agents/agents.module.css
  • web/lib/agents.ts

SST/OpenNext turns each top-level public/ folder into a CloudFront -> S3
cache behavior. public/agents/ shadowed the /agents page routes, so on the
CloudFront deploy every /agents* path (gallery, detail pages, /agents.md)
403'd from S3 while working fine in next dev. Move the graphics to
public/agent-art/<slug>/ and point agentAsset()/the sync script there so the
page routes reach the server/prerendered HTML again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codeant-ai

codeant-ai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant