Skip to content

Commit 4603323

Browse files
joeylee12629-starjoey
andauthored
feat: add Showcase section + Changelog (daily updates) (#45)
- Guide sidebar: new Showcase section (coming soon) - Navigation: Changelog link (EN + ZH) - /changelog and /zh/changelog pages with timeline UI - First entry: 2026-04-15 Guide V3 restructure - sync-content.sh updated for changelog dirs Co-authored-by: joey <joey@joeydeMacBook-Air.local>
1 parent afb4505 commit 4603323

File tree

8 files changed

+201
-19
lines changed

8 files changed

+201
-19
lines changed

changelog/2026-04-15.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
date: "2026-04-15"
3+
title: "Guide V3: Concept Clarity + Practice Focus"
4+
---
5+
6+
# 2026-04-15 — Guide V3: Concept Clarity + Practice Focus
7+
8+
Major restructure of the Guide section from 22 articles to 14 focused tutorials.
9+
10+
## What Changed
11+
12+
### New Architecture
13+
- **Getting Started** (3): What is a Harness, Your First Harness, Harness vs Framework
14+
- **Core Concepts** (4): Agentic Loop, Tool System, Memory & Context, Guardrails
15+
- **Practice** (5): Context Engineering, Sandbox, Skill System, Sub-Agent, Error Handling
16+
- **Reference** (2): Implementation Comparison, Glossary
17+
18+
### Quality Improvements
19+
- Every article now opens with a **Core Insight** summary
20+
- Professional terminology preserved in English (Agentic Loop, Guardrails, Context Window)
21+
- New concepts explained with before/after comparisons
22+
- Agent definition updated: 2023 Agent vs Harness-era Agent distinction
23+
24+
### New Content
25+
- **Nexu Windows Packaging** article added (EN + ZH) — Electron build optimization case study
26+
27+
### Fixes
28+
- Fixed Start Reading button 404 on homepage
29+
- Fixed all internal `.md` links → converted to `/guide/slug` routes
30+
- Synced sidebar titles with article H1 headings
31+
- Added GitHub button to Chinese homepage

site/app/changelog/page.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { getAllContent } from "@/lib/content";
2+
3+
export const metadata = {
4+
title: "Changelog | Harness Guide",
5+
description: "Daily updates and changes to the Harness Engineering Guide",
6+
};
7+
8+
export default async function ChangelogPage() {
9+
const entries = await getAllContent("changelog");
10+
const sorted = entries.sort((a, b) => (b.date || "").localeCompare(a.date || ""));
11+
12+
return (
13+
<div className="mx-auto max-w-4xl px-4 sm:px-6 lg:px-8 pt-24 pb-16">
14+
<h1 className="font-[family-name:var(--font-heading)] text-4xl font-bold text-[var(--color-text-primary)] mb-2">
15+
Changelog
16+
</h1>
17+
<p className="text-[var(--color-text-secondary)] mb-12">
18+
Daily updates and changes to the Harness Engineering Guide.
19+
</p>
20+
21+
<div className="relative">
22+
{/* Timeline line */}
23+
<div className="absolute left-[7px] top-2 bottom-2 w-px bg-[var(--color-border)]" />
24+
25+
<div className="space-y-12">
26+
{sorted.map((entry) => (
27+
<article key={entry.slug} className="relative pl-8">
28+
{/* Timeline dot */}
29+
<div className="absolute left-0 top-2 w-[15px] h-[15px] rounded-full bg-[var(--color-accent-cyan)] border-2 border-[var(--color-bg-primary)]" />
30+
31+
<time className="text-sm font-mono text-[var(--color-accent-cyan)] mb-1 block">
32+
{entry.date}
33+
</time>
34+
<h2 className="text-xl font-semibold text-[var(--color-text-primary)] mb-4">
35+
{entry.title}
36+
</h2>
37+
<div
38+
className="prose-custom text-[var(--color-text-secondary)]"
39+
dangerouslySetInnerHTML={{ __html: entry.contentHtml }}
40+
/>
41+
</article>
42+
))}
43+
</div>
44+
</div>
45+
46+
{sorted.length === 0 && (
47+
<p className="text-[var(--color-text-muted)] text-center py-20">
48+
No changelog entries yet. Check back soon!
49+
</p>
50+
)}
51+
</div>
52+
);
53+
}

site/app/zh/changelog/page.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { getAllContent } from "@/lib/content";
2+
3+
export const metadata = {
4+
title: "日报 | Harness Engineering Guide",
5+
description: "Harness Engineering Guide 每日更新记录",
6+
};
7+
8+
export default async function ZhChangelogPage() {
9+
const entries = await getAllContent("zh-changelog");
10+
const sorted = entries.sort((a, b) => (b.date || "").localeCompare(a.date || ""));
11+
12+
return (
13+
<div className="mx-auto max-w-4xl px-4 sm:px-6 lg:px-8 pt-24 pb-16">
14+
<h1 className="font-[family-name:var(--font-heading)] text-4xl font-bold text-[var(--color-text-primary)] mb-2">
15+
日报
16+
</h1>
17+
<p className="text-[var(--color-text-secondary)] mb-12">
18+
Harness Engineering Guide 每日更新记录。
19+
</p>
20+
21+
<div className="relative">
22+
{/* Timeline line */}
23+
<div className="absolute left-[7px] top-2 bottom-2 w-px bg-[var(--color-border)]" />
24+
25+
<div className="space-y-12">
26+
{sorted.map((entry) => (
27+
<article key={entry.slug} className="relative pl-8">
28+
{/* Timeline dot */}
29+
<div className="absolute left-0 top-2 w-[15px] h-[15px] rounded-full bg-[var(--color-accent-cyan)] border-2 border-[var(--color-bg-primary)]" />
30+
31+
<time className="text-sm font-mono text-[var(--color-accent-cyan)] mb-1 block">
32+
{entry.date}
33+
</time>
34+
<h2 className="text-xl font-semibold text-[var(--color-text-primary)] mb-4">
35+
{entry.title}
36+
</h2>
37+
<div
38+
className="prose-custom text-[var(--color-text-secondary)]"
39+
dangerouslySetInnerHTML={{ __html: entry.contentHtml }}
40+
/>
41+
</article>
42+
))}
43+
</div>
44+
</div>
45+
46+
{sorted.length === 0 && (
47+
<p className="text-[var(--color-text-muted)] text-center py-20">
48+
暂无日报,敬请期待!
49+
</p>
50+
)}
51+
</div>
52+
);
53+
}

site/components/GuideSidebar.tsx

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,30 @@ export default function GuideSidebar({ isZh = false }: { isZh?: boolean }) {
1717
{isZh ? section.zhLabel : section.label}
1818
</h3>
1919
<ul className="space-y-0.5">
20-
{section.items.map((item) => {
21-
const href = `${prefix}/guide/${item.slug}`;
22-
const isActive = pathname === href || pathname === `${href}/`;
23-
return (
24-
<li key={item.slug}>
25-
<Link
26-
href={href}
27-
className={`block px-2 py-1.5 text-sm rounded-md transition-colors ${
28-
isActive
29-
? "text-[var(--color-accent-cyan)] bg-[var(--color-accent-cyan)]/10 font-medium"
30-
: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-card)]"
31-
}`}
32-
>
33-
{isZh ? item.zhTitle : item.title}
34-
</Link>
35-
</li>
36-
);
37-
})}
20+
{section.items.length === 0 ? (
21+
<li className="px-2 py-1.5 text-xs text-[var(--color-text-muted)] italic">
22+
{isZh ? "即将推出…" : "Coming soon…"}
23+
</li>
24+
) : (
25+
section.items.map((item) => {
26+
const href = `${prefix}/guide/${item.slug}`;
27+
const isActive = pathname === href || pathname === `${href}/`;
28+
return (
29+
<li key={item.slug}>
30+
<Link
31+
href={href}
32+
className={`block px-2 py-1.5 text-sm rounded-md transition-colors ${
33+
isActive
34+
? "text-[var(--color-accent-cyan)] bg-[var(--color-accent-cyan)]/10 font-medium"
35+
: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-card)]"
36+
}`}
37+
>
38+
{isZh ? item.zhTitle : item.title}
39+
</Link>
40+
</li>
41+
);
42+
})
43+
)}
3844
</ul>
3945
</div>
4046
))}

site/components/Navigation.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import ThemeToggle from "./ThemeToggle";
77

88
const enNavLinks = [
99
{ href: "/guide/what-is-harness", label: "Guide" },
10+
{ href: "/changelog", label: "Changelog" },
1011
];
1112

1213
const zhNavLinks = [
1314
{ href: "/zh/guide/what-is-harness", label: "指南" },
15+
{ href: "/zh/changelog", label: "日报" },
1416
];
1517

1618
function LangSwitcher({ isZh }: { isZh: boolean }) {

site/lib/guide-data.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ export const guideSections: GuideSection[] = [
4949
{ slug: "glossary", title: "Glossary", zhTitle: "术语表" },
5050
],
5151
},
52+
{
53+
id: "showcase",
54+
label: "Showcase",
55+
zhLabel: "分享",
56+
items: [],
57+
},
5258
];
5359

5460
// Flat list of all guide slugs in order

site/scripts/sync-content.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ CONTENT_DIR="$(cd "$(dirname "$0")/.." && pwd)/content"
88
rm -rf "$CONTENT_DIR"
99
mkdir -p "$CONTENT_DIR"
1010

11-
for dir in guide zh-guide; do
11+
for dir in guide zh-guide changelog zh-changelog; do
1212
if [ -d "$REPO_ROOT/$dir" ]; then
1313
cp -r "$REPO_ROOT/$dir" "$CONTENT_DIR/$dir"
1414
echo "✓ Synced $dir/ ($(ls "$CONTENT_DIR/$dir" | wc -l | tr -d ' ') files)"

zh-changelog/2026-04-15.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
date: "2026-04-15"
3+
title: "Guide V3:概念清晰化 + 实战聚焦"
4+
---
5+
6+
# 2026-04-15 — Guide V3:概念清晰化 + 实战聚焦
7+
8+
Guide 板块大重构,从 22 篇精简为 14 篇聚焦教程。
9+
10+
## 更新内容
11+
12+
### 全新架构
13+
- **入门** (3):什么是 Harness、你的第一个 Harness、Harness vs Framework
14+
- **核心概念** (4):Agentic Loop、Tool 系统、Memory 与 Context、Guardrails
15+
- **实战** (5):Context 工程、Sandbox、Skill 系统、Sub-Agent、错误处理
16+
- **参考** (2):主流 Harness 实现对比、术语表
17+
18+
### 质量提升
19+
- 每篇文章开头新增 **Core Insight** 核心洞察
20+
- 专业术语保留英文(Agentic Loop、Guardrails、Context Window)
21+
- 新概念配有前后对比表格解释
22+
- Agent 定义更新:区分 2023 Agent 与 Harness 时代的 Agent
23+
24+
### 新增内容
25+
- **Nexu Windows 打包实战**文章(中英双语)— Electron 打包优化案例
26+
27+
### 修复
28+
- 修复首页 Start Reading 按钮 404
29+
- 修复所有内部 `.md` 链接 → 转为 `/guide/slug` 路由
30+
- 侧边栏标题与文章 H1 标题统一
31+
- 中文首页补充 GitHub 按钮

0 commit comments

Comments
 (0)