Files
hermes-os/app/skills/[name]/page.tsx
T
Hermes e24c179e89 Markdown rendering for skills, refresh button on replay
- react-markdown + remark-gfm for proper skill SKILL.md rendering
- Prose styles matching dark theme (tables, code blocks, blockquotes)
- Strips YAML frontmatter before rendering
- Refresh button in session replay header
2026-04-09 21:25:10 -05:00

61 lines
2.3 KiB
TypeScript

"use client";
import { use } from "react";
import { ArrowLeft, FileText, Folder } from "lucide-react";
import Link from "next/link";
import { useSkill } from "@/lib/hooks";
import { Markdown } from "@/components/Markdown";
export default function SkillDetailPage({ params }: { params: Promise<{ name: string }> }) {
const { name } = use(params);
const { data, isLoading } = useSkill(name);
// Strip YAML frontmatter for rendering
let content = data?.content || "";
if (content.startsWith("---")) {
const end = content.indexOf("---", 3);
if (end > 0) content = content.slice(end + 3).trim();
}
return (
<div className="space-y-4">
<div className="flex items-center gap-3">
<Link href="/skills" className="p-1 -ml-1 rounded-lg active:bg-white/[0.04]">
<ArrowLeft size={20} style={{ color: "var(--text-2)" }} />
</Link>
<h1 className="text-[15px] font-medium" style={{ color: "var(--text-1)" }}>{name}</h1>
</div>
{isLoading ? (
<div className="card p-4 animate-pulse space-y-2">
<div className="h-4 rounded w-full" style={{ background: "var(--bg-hover)" }} />
<div className="h-4 rounded w-3/4" style={{ background: "var(--bg-hover)" }} />
</div>
) : data ? (
<>
{data.linked_files && Object.keys(data.linked_files).length > 0 && (
<div className="card p-3">
<div className="text-[11px] font-medium mb-2 flex items-center gap-1.5" style={{ color: "var(--text-2)" }}>
<Folder size={12} /> Linked Files
</div>
{Object.entries(data.linked_files).map(([dir, files]) =>
(files as string[]).map((f) => (
<div key={dir + "/" + f} className="flex items-center gap-2 text-[12px] py-0.5" style={{ color: "var(--text-3)" }}>
<FileText size={11} />
<span className="font-mono">{dir}/{f}</span>
</div>
))
)}
</div>
)}
<div className="card p-4 overflow-x-hidden">
<Markdown content={content} />
</div>
</>
) : (
<p className="text-sm py-8 text-center" style={{ color: "var(--text-3)" }}>Skill not found</p>
)}
</div>
);
}