Skip to content

Commit 5cd9d2e

Browse files
refactor(docs): Option C IA 大重组 — 按读者意图分 learn/career/community/projects 四大区
Admin 反馈"目录结构要重新设计,很多内容过时"。经 owner 拍板选方案 C(按 读者意图分类),全站 docs 在本 PR 内一次到位,避免分多个 PR 把 contributors 的 review 路径切碎。 # 顶层结构(Before → After) - ai/ → learn/ai/ (AI 学科知识) - computer-science/ → learn/cs/ (CS 基础 + 系统) - jobs/interview-prep/ → career/interview-prep/ (刷题 BQ OA VI) - jobs/event-keynote/ → career/events/ (Coffee Chat / Mock Interview) - CommunityShare/Leetcode/ → career/interview-prep/leetcode/ (50+ 题解归求职刷题) - CommunityShare/Amazing-AI-Tools/perplexity-comet → community/tools/ (工具推荐) - CommunityShare/Amazing-AI-Tools/prompt-repetition → community/papers/ (论文摘要) - CommunityShare/Geek/leworldmodel → community/papers/ (JEPA paper) - CommunityShare/Geek/*(其他) → community/dev-tips/ (开发技巧) - CommunityShare/Language/ → community/language/ - CommunityShare/Life/ → community/life/ - CommunityShare/MentalHealth/ → community/mental-health/ - CommunityShare/Personal-Study-Notes/Reinforcement-Learning/ppo → learn/ai/reinforcement-learning/ppo - all-projects/ + ai/projects/ → projects/(项目文档顶层化) # 变更清单 1. 新增 4 个顶层区 index.mdx (learn / career / community 原有 / projects) 加上 SectionIndex 作为品类着陆页 2. 31 条 301 redirects(statusCode:301),覆盖所有老 URL - 特殊文件级(RAG / leworldmodel / perplexity-comet / prompt-repetition / ppo / swanlab / cpp_backend 老名字 / all-projects/ai-town 等)排前 - Wildcard 顶层区(/docs/ai/:path* / /docs/computer-science/:path* / /docs/jobs/{interview-prep,event-keynote}/:path* / /docs/all-projects/:path* / CommunityShare/{Leetcode,Language,Life,MentalHealth,Geek,Amazing-AI-Tools}/:path*) 排后做兜底 3. Hard-coded URL 修正:Hero.tsx / Footer.tsx / layout.tsx / source.ts / SectionIndex.tsx / [...slug]/page.tsx 注释 / dev_docs/umami_tracking.md 4. data/event.json 三条 playback URL + coffee-chat.md 内链域名统一成 involutionhell.com + 路径指向新位置 5. SectionIndex root props 更新: - community/index.mdx: root="community" - career/interview-prep/leetcode/index.mdx: root="career/interview-prep/leetcode" 6. lib/source.ts pinyin transformer 前缀匹配更新 # docId 守恒 所有 289 个 .mdx/.md 文件的 docId 原样保留,sync-uuid workflow 合 main 后 backfill 按 docId 聚合,老贡献者 contributions 不变,longsizhuo 本轮 rename commit 在每个涉及的 docId 上 +1。 # reviewer subagent 审后修正 reviewer 审出 3 条 P0 死链 + 4 条 P1 index 缺失 + 3 条 P2 陈旧注释,全部 采纳并修完: - P0 Footer /docs/career 404 → 新建 career/index.mdx - P0 event.json playback 旧路径 → sed 批量替换 - P0 coffee-chat 内链 vercel.app + 旧路径 → 统一 involutionhell.com + 新路径 - P1 learn/ 和 projects/ 无 index → 新建 index.mdx - P1 /docs/all-projects 裸路径无 redirect → 补 redirect 规则 - P2 SectionIndex / page.tsx / [...slug] / umami_tracking 注释旧术语 → sed 更新 # 后续工作 - Leetcode 50+ 题解文件名规范化(走 pinyin 路由,URL 规则特殊) - frontmatter status 字段(active/deprecated/archived)机制接入 - archive/ 过期内容治理(本 PR 暂未创建目录,等 owner/admin 标记具体哪些过期)
1 parent dd7bf83 commit 5cd9d2e

420 files changed

Lines changed: 195 additions & 61 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/components/Footer.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export async function Footer() {
6363
<ul className="space-y-3 font-body text-sm text-[var(--foreground)]">
6464
<li>
6565
<Link
66-
href="/docs/ai"
66+
href="/docs/learn/ai"
6767
className="hover:text-[#CC0000] transition-colors"
6868
data-umami-event="navigation_click"
6969
data-umami-event-region="footer"
@@ -74,7 +74,7 @@ export async function Footer() {
7474
</li>
7575
<li>
7676
<Link
77-
href="/docs/computer-science"
77+
href="/docs/learn/cs"
7878
className="hover:text-[#CC0000] transition-colors"
7979
data-umami-event="navigation_click"
8080
data-umami-event-region="footer"
@@ -85,7 +85,7 @@ export async function Footer() {
8585
</li>
8686
<li>
8787
<Link
88-
href="/docs/CommunityShare"
88+
href="/docs/community"
8989
className="hover:text-[#CC0000] transition-colors"
9090
data-umami-event="navigation_click"
9191
data-umami-event-region="footer"
@@ -96,7 +96,7 @@ export async function Footer() {
9696
</li>
9797
<li>
9898
<Link
99-
href="/docs/jobs"
99+
href="/docs/career"
100100
className="hover:text-[#CC0000] transition-colors"
101101
data-umami-event="navigation_click"
102102
data-umami-event-region="footer"

app/components/Hero.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,22 @@ export async function Hero() {
2121
{
2222
title: t("categories.ai.title"),
2323
desc: t("categories.ai.desc"),
24-
href: "/docs/ai",
24+
href: "/docs/learn/ai",
2525
},
2626
{
2727
title: t("categories.cs.title"),
2828
desc: t("categories.cs.desc"),
29-
href: "/docs/computer-science",
29+
href: "/docs/learn/cs",
3030
},
3131
{
3232
title: t("categories.jobs.title"),
3333
desc: t("categories.jobs.desc"),
34-
href: "/docs/jobs/interview-prep/bq",
34+
href: "/docs/career/interview-prep/bq",
3535
},
3636
{
3737
title: t("categories.community.title"),
3838
desc: t("categories.community.desc"),
39-
href: "/docs/CommunityShare",
39+
href: "/docs/community",
4040
},
4141
];
4242

@@ -91,7 +91,7 @@ export async function Hero() {
9191
{t("join.body")}
9292
</p>
9393
<Link
94-
href="/docs/ai"
94+
href="/docs/learn/ai"
9595
className="block w-full"
9696
data-umami-event="navigation_click"
9797
data-umami-event-region="hero_cta"

app/components/docs/SectionIndex.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import type { PageTree } from "fumadocs-core/server";
99
*
1010
* 三处使用场景:
1111
* 1. /docs landing SectionIndex 不传参 列出顶层分区(ai / cs / 群友分享 等)
12-
* 2. CommunityShare 首页 SectionIndex root=CommunityShare 列出 Geek / Leetcode / RAG 等子分类
13-
* 3. Leetcode 首页 SectionIndex root=CommunityShare/Leetcode 列出全部 Leetcode 题解
12+
* 2. community 首页 SectionIndex root=community 列出 Geek / Leetcode / RAG 等子分类
13+
* 3. career/interview-prep/leetcode 首页 SectionIndex root=career/interview-prep/leetcode 列出全部 Leetcode 题解
1414
*
1515
* ----------------------------------------------------------------------------
1616
* 为什么不直接用 fumadocs 自带的?
@@ -27,7 +27,7 @@ import type { PageTree } from "fumadocs-core/server";
2727
* children:
2828
* Folder
2929
* name = AI 知识库
30-
* index = Page(url=/docs/ai, name=AI 知识库) // 有 index.mdx
30+
* index = Page(url=/docs/learn/ai, name=AI 知识库) // 有 index.mdx
3131
* children: [Page, Folder, ...]
3232
* Folder
3333
* name = All projects
@@ -53,7 +53,7 @@ type FolderNode = Extract<PageTree.Node, { type: "folder" }>;
5353

5454
interface SectionIndexProps {
5555
/**
56-
* 从 pageTree 根往下走的目录路径,段之间用 / 分隔,例如 CommunityShare/Leetcode
56+
* 从 pageTree 根往下走的目录路径,段之间用 / 分隔,例如 career/interview-prep/leetcode
5757
* 不传 = 直接用 pageTree 根节点本身(用于 /docs landing)。
5858
*/
5959
root?: string;
@@ -69,9 +69,9 @@ interface CardEntry {
6969
/**
7070
* 从 pageTree 根一路钻到 root 指定的目录节点。
7171
*
72-
* 举例:root = CommunityShare/Leetcode
73-
* 1) 根的 children 里找 segmentName = CommunityShare 的 folder
74-
* 2) 再在这个 folder 的 children 里找 segmentName = Leetcode 的 folder
72+
* 举例:root = career/interview-prep/leetcode
73+
* 1) 根的 children 里找 segmentName = career 的 folder
74+
* 2) 再在这个 folder 的 children 里找 segmentName = interview-prep/leetcode 的 folder
7575
* 3) 返回这个 folder 节点
7676
*
7777
* 任一段找不到就返回 null(组件会渲染一个明显的错误提示,而不是静默空页)。
@@ -101,7 +101,7 @@ function findFolderByPath(
101101
* 为什么不直接用 folder.name:
102102
* fumadocs 的 FolderNode.name 是 ReactNode 类型(可能是 string,也可能是 JSX),
103103
* 直接字符串比较会在极端情况踩坑。更可靠的办法是从 folder.index.url 反推——
104-
* 比如 /docs/CommunityShare/Geek 最后一段 Geek 就是目录名。
104+
* 比如 /docs/community/dev-tips 最后一段 Geek 就是目录名。
105105
*
106106
* 没 index 时退回 name.toString()。目前仓库里这种情况目录名都是纯字符串,
107107
* 所以兜底够用。
@@ -154,10 +154,10 @@ function buildCanonicalUrlSet(): Set<string> {
154154
* 用途:folder 没有自己的 index.mdx 时,不能硬拼 /docs/<folder> 做卡片链接(Next 路由
155155
* 里没这条,会 404)。所以往里走一层,找到第一个 page 文件的 url 拿来做兜底链接。比如:
156156
*
157-
* CommunityShare/Language/ 没 index.mdx
157+
* community/language/ 没 index.mdx
158158
* pte-intro.mdx 用这篇的 url 做兜底
159159
*
160-
* 点击卡片会进到 /docs/CommunityShare/Language/pte-intro,不会 404。
160+
* 点击卡片会进到 /docs/community/language/pte-intro,不会 404。
161161
*/
162162
function findFirstPageUrl(
163163
nodes: PageTree.Node[],

app/docs/[...slug]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ export async function generateMetadata({ params }: Param): Promise<Metadata> {
195195
notFound();
196196
}
197197

198-
// 规范化 slug → canonical 路径。用户访问 /docs/ai/rl(原文)或 /docs/ai/rl.en(翻译版)
198+
// 规范化 slug → canonical 路径。用户访问 /docs/learn/ai/rl(原文)或 /docs/learn/ai/rl.en(翻译版)
199199
// 都统一指向原始 slug,避免两个 URL 竞争同一份内容的 PageRank。
200200
const slugPath = (slug ?? []).join("/");
201201
const canonical = slugPath ? `/docs/${slugPath}` : "/docs";

app/docs/jobs/event-keynote/coffee-chat.en.md renamed to app/docs/career/events/coffee-chat.en.md

Lines changed: 1 addition & 1 deletion

app/docs/jobs/event-keynote/coffee-chat.md renamed to app/docs/career/events/coffee-chat.md

Lines changed: 1 addition & 1 deletion

app/docs/career/index.mdx

Lines changed: 15 additions & 0 deletions

0 commit comments

Comments
 (0)