Add /agents gallery, detail pages, use-cases, and build-your-own#1065
Add /agents gallery, detail pages, use-cases, and build-your-own#1065khaliqgant wants to merge 6 commits into
Conversation
…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>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (21)
📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughAdds 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 ChangesAgent Feature
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
There was a problem hiding this comment.
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.
| 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(); | ||
| } |
There was a problem hiding this comment.
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.
| 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)" |
There was a problem hiding this comment.
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.
| 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)" |
| detail: 'pull_request · review comments · check runs · review submitted', | ||
| }, | ||
| integrations: ['github', 'slack'], | ||
| runtime: 'Codex · gpt-5.5', |
There was a problem hiding this comment.
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.
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
web/scripts/sync-agent-assets.sh (2)
19-28: ⚖️ Poor tradeoffConsider reducing duplication with the agent catalog.
The hardcoded
AGENTSmapping duplicates the agent slug list fromlib/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:
- Generate this list from the catalog using a Node.js script
- Document in both locations that they must be kept in sync
- 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 winDocument the cross-repo dependency and add validation.
The script assumes a sibling
agentsrepository 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
⛔ Files ignored due to path filters (28)
web/public/agents/granola/avatar.pngis excluded by!**/*.pngweb/public/agents/granola/banner.pngis excluded by!**/*.pngweb/public/agents/granola/card-sm.pngis excluded by!**/*.pngweb/public/agents/granola/card.pngis excluded by!**/*.pngweb/public/agents/hn-monitor/avatar.pngis excluded by!**/*.pngweb/public/agents/hn-monitor/banner.pngis excluded by!**/*.pngweb/public/agents/hn-monitor/card-sm.pngis excluded by!**/*.pngweb/public/agents/hn-monitor/card.pngis excluded by!**/*.pngweb/public/agents/linear/avatar.pngis excluded by!**/*.pngweb/public/agents/linear/banner.pngis excluded by!**/*.pngweb/public/agents/linear/card-sm.pngis excluded by!**/*.pngweb/public/agents/linear/card.pngis excluded by!**/*.pngweb/public/agents/repo-hygiene/avatar.pngis excluded by!**/*.pngweb/public/agents/repo-hygiene/banner.pngis excluded by!**/*.pngweb/public/agents/repo-hygiene/card-sm.pngis excluded by!**/*.pngweb/public/agents/repo-hygiene/card.pngis excluded by!**/*.pngweb/public/agents/review/avatar.pngis excluded by!**/*.pngweb/public/agents/review/banner.pngis excluded by!**/*.pngweb/public/agents/review/card-sm.pngis excluded by!**/*.pngweb/public/agents/review/card.pngis excluded by!**/*.pngweb/public/agents/spotify-releases/avatar.pngis excluded by!**/*.pngweb/public/agents/spotify-releases/banner.pngis excluded by!**/*.pngweb/public/agents/spotify-releases/card-sm.pngis excluded by!**/*.pngweb/public/agents/spotify-releases/card.pngis excluded by!**/*.pngweb/public/agents/vendor-monitor/avatar.pngis excluded by!**/*.pngweb/public/agents/vendor-monitor/banner.pngis excluded by!**/*.pngweb/public/agents/vendor-monitor/card-sm.pngis excluded by!**/*.pngweb/public/agents/vendor-monitor/card.pngis excluded by!**/*.png
📒 Files selected for processing (16)
web/app/agents.md/route.tsweb/app/agents/AgentsGallery.tsxweb/app/agents/[slug]/AgentDetail.tsxweb/app/agents/[slug]/page.tsxweb/app/agents/agents.module.cssweb/app/agents/page.tsxweb/app/agents/use-cases/UseCasesContent.tsxweb/app/agents/use-cases/page.tsxweb/app/robots.tsweb/app/sitemap.tsweb/components/SiteFooter.tsxweb/components/agents/AgentArt.tsxweb/components/agents/BuildYourOwn.tsxweb/components/agents/ForkAgentButton.tsxweb/lib/agents.tsweb/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; |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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.
| 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
| 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); | ||
| } |
There was a problem hiding this comment.
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.
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
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>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
Preview deployed!
This preview will be cleaned up when the PR is merged or closed. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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. |
|
pr-reviewer could not complete review for #1065 in AgentWorkforce/relay. |
|
ℹ️ 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 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>
|
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>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
ℹ️ 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. |
There was a problem hiding this comment.
🧹 Nitpick comments (3)
web/components/agents/AgentArt.tsx (2)
7-11: ⚡ Quick winSimplify the identity mapping.
The
ASSET_FORmapping is redundant—each variant maps to itself. You can remove this mapping and passvariantdirectly toagentAsset:♻️ 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 winDocument the parent positioning requirement.
The fallback
divusesposition: absolutewithinset: 0, which requires the parent container to haveposition: relative(or another non-static positioning). Consider adding a comment or ensuring the parent containers in callers (AgentsGallery card media, AgentDetail banner) explicitly setposition: relativein 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 valueConsider varying animation delays for all cards.
The current animation delay calculation
(ci % 2) * 60on 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 usingci * 60instead 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
📒 Files selected for processing (6)
web/app/agents/agents.module.cssweb/app/agents/use-cases/UseCasesContent.tsxweb/components/agents/AgentArt.tsxweb/components/agents/ForkAgentButton.tsxweb/lib/agents.tsweb/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>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
What
A public surface for the open-source AgentWorkforce agents on the marketing site (
web), built to match the existingprimitives/peardesign 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 vianpx skills addornpx 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./agentsREADME markdown endpoint to/agents.md(sametext/markdown+ cache headers) so the HTML gallery can own/agents.How
lib/agents.ts.<img>(nonext/image, per the SST/OpenNext optimizer constraint); deterministic monogram fallback for art-less agents.public/agents/<slug>/viascripts/sync-agent-assets.sh.sitemap.ts,robots.ts, and the footer Projects column (intentionally not in the header nav).Validation
tsc --noEmitclean./agents, all 7/agents/<slug>,/agents/use-cases,/agents.md); unknown slug 404s.primitives/pear.🤖 Generated with Claude Code