Skip to content

Commit d5cf930

Browse files
committed
feat: render requirement descriptions as markdown
1 parent baf9cc8 commit d5cf930

2 files changed

Lines changed: 7 additions & 5 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ The bundled dashboard provides four views:
9292
- RD Session board: `Idle / Running / Waiting for human / Failed / Completed`
9393
- Timer board: `Active / Completed / Cancelled`, with each timer linked to its Requirement
9494

95-
Opening a Requirement shows its description, linked PRs, run information, per-Run Agent trace, and unified Human/RD/Reviewer conversation. The Session board cards open this work surface directly; the latest Run trace is selected by default and shows Provider-emitted reasoning summaries, tool calls, command/tool results, messages, and errors in real time. Starting a TODO card opens that conversation first, so optional instructions and attachments can be included in the initial Run; it also offers an explicit start-without-instructions action. TODO cards can be deleted before execution; the action requires confirmation and removes the Requirement from active lists. Messages support images and file attachments. The chat composer can create and cancel one-time or recurring scheduled wake-ups in minutes, hours, or days, while the Timer board shows timers across the workspace and opens their associated Requirements. New input can be queued while RD is running, or the current run can be interrupted so the same session handles the correction immediately. Replying to a completed Requirement reactivates it and resumes its original RD Session in a new Run. Requirement and Reviewer forms provide provider-specific model dropdowns populated by an Agent Manager catalog that refreshes every 24 hours.
95+
Opening a Requirement shows its description, linked PRs, run information, per-Run Agent trace, and unified Human/RD/Reviewer conversation. Requirement descriptions and conversation messages render GitHub Flavored Markdown, including tables, lists, links, and code blocks. The Session board cards open this work surface directly; the latest Run trace is selected by default and shows Provider-emitted reasoning summaries, tool calls, command/tool results, messages, and errors in real time. Starting a TODO card opens that conversation first, so optional instructions and attachments can be included in the initial Run; it also offers an explicit start-without-instructions action. TODO cards can be deleted before execution; the action requires confirmation and removes the Requirement from active lists. Messages support images and file attachments. The chat composer can create and cancel one-time or recurring scheduled wake-ups in minutes, hours, or days, while the Timer board shows timers across the workspace and opens their associated Requirements. New input can be queued while RD is running, or the current run can be interrupted so the same session handles the correction immediately. Replying to a completed Requirement reactivates it and resumes its original RD Session in a new Run. Requirement and Reviewer forms provide provider-specific model dropdowns populated by an Agent Manager catalog that refreshes every 24 hours.
9696

9797
The dashboard supports light and dark modes from the top-right theme control, remembers the selected theme, and follows the operating-system preference until one is selected. It also supports English and Simplified Chinese, remembers the selected locale, and initially follows the browser language. Its Agent Manager settings dialog persists workspace configuration, applies Requirement retention periods at runtime, and identifies changes that require a restart.
9898

apps/web/app/page.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ function isWithinTimeRange(value: string, timeRange: TimeRange, now: number): bo
341341
return Number.isFinite(timestamp) && timestamp >= now - timeRangeMilliseconds[timeRange];
342342
}
343343

344-
const MessageBody = memo(function MessageBody({ body, inverted = false }: { body: string; inverted?: boolean }) {
344+
const MarkdownBody = memo(function MarkdownBody({ body, inverted = false }: { body: string; inverted?: boolean }) {
345345
return (
346346
<div className={`message-markdown ${inverted ? 'message-markdown-inverted' : ''}`}>
347347
<ReactMarkdown
@@ -2001,7 +2001,9 @@ function RequirementDetail({
20012001
<div className="px-5 py-5 sm:px-6">
20022002
<section className="rounded-xl border border-border/80 bg-card px-4 py-3.5">
20032003
<p className="text-[10px] font-semibold tracking-[0.08em] text-muted-foreground uppercase">{t('Requirement description')}</p>
2004-
<p className="mt-1.5 text-xs leading-5 whitespace-pre-wrap">{requirement.description}</p>
2004+
<div className="mt-1.5 text-xs leading-5">
2005+
<MarkdownBody body={requirement.description} />
2006+
</div>
20052007
<dl className="mt-3 grid grid-cols-2 gap-x-4 gap-y-2 border-t border-border/70 pt-3 text-[10px] text-muted-foreground sm:grid-cols-3">
20062008
<div><dt className="sr-only">{t('Created at')}</dt><dd>{t('Created {time}', { time: formatTime(requirement.createdAt, locale) })}</dd></div>
20072009
<div><dt className="sr-only">{t('Run count')}</dt><dd>{t('{count} Runs', { count: runs.length })}</dd></div>
@@ -2075,7 +2077,7 @@ function RequirementDetail({
20752077
<span className="text-[10px] font-semibold">{t('System event')}</span>
20762078
<span className="shrink-0 text-[9px] text-muted-foreground">{formatTime(item.createdAt, locale)}</span>
20772079
</div>
2078-
{item.body ? <div className="mt-1 text-[11px] leading-5 break-words"><MessageBody body={item.body} /></div> : null}
2080+
{item.body ? <div className="mt-1 text-[11px] leading-5 break-words"><MarkdownBody body={item.body} /></div> : null}
20792081
{attachments.length > 0 ? <div className="mt-2"><MessageAttachments attachments={attachments} apiUrl={apiUrl} /></div> : null}
20802082
</div>
20812083
</article>
@@ -2095,7 +2097,7 @@ function RequirementDetail({
20952097
<span className="text-[9px] text-muted-foreground">{formatTime(item.createdAt, locale)}</span>
20962098
</div>
20972099
<div className={`mt-1.5 rounded-2xl px-3.5 py-2.5 text-left text-xs leading-5 break-words shadow-[0_1px_2px_oklch(0.18_0.02_255/0.04)] ${human ? 'rounded-tr-md bg-primary text-primary-foreground' : reviewer ? 'rounded-tl-md border border-violet-500/15 bg-violet-500/7' : 'rounded-tl-md border border-border/80 bg-card'}`}>
2098-
{item.body ? <MessageBody body={item.body} inverted={human} /> : null}
2100+
{item.body ? <MarkdownBody body={item.body} inverted={human} /> : null}
20992101
{attachments.length > 0 ? <div className={item.body ? 'mt-2.5' : ''}><MessageAttachments attachments={attachments} apiUrl={apiUrl} /></div> : null}
21002102
</div>
21012103
</div>

0 commit comments

Comments
 (0)