Skip to content

Commit 6684884

Browse files
refactor(docs): Option C IA 大重组 — learn/career/community/projects 四大区 (#307)
* refactor(docs): 语义化重组 — RAG 归 AI 基础模型,AI 项目归 AI 目录 背景:Scan 发现 3 处目录语义错配,这批修掉: - CommunityShare/RAG/{rag,embedding,context-engineering-intro} 实际上是 AI 核心基础设施(检索增强、向量嵌入、上下文工程), 放社区分享目录既不好发现也语义错位 → ai/foundation-models/rag/ - all-projects/ai-town 是 AI 多智能体模拟项目,不应和通用项目混 → ai/projects/ 本 PR 也作为 sync-uuid 跨路径贡献者追踪机制的大规模验证。 Workflow 只在 main / feat/contributor 触发,feature 分支零风险 (DB 不动),merge 后在 main 自动跑一次 backfill 核对。 变更点: 1. git mv 4 份原文 + 4 份翻译(.en.mdx / .en.md)= 8 个文件 - rag.mdx (+.en) → ai/foundation-models/rag/ - embedding.mdx (+.en) → ai/foundation-models/rag/ - context_engineering_intro.md (+.en) → 同上(顺便 rename 下划线 → kebab-case 统一命名规范) - ai-town.mdx (+.en) → ai/projects/ 2. 所有 docId 原样保留(验证 grep "^docId:" 通过,8 份一致) 3. placeholder 标签 tag-one / ai-project 替换成真实内容标签: - rag: rag-system / retrieval-augmented-generation / vector-search - embedding: embedding-models / vector-representation / rag-system - context-eng: context-engineering / prompt-engineering / llm-fundamentals - ai-town: ai-agent-simulation / multi-agent-systems / generative-agents / godot-engine 4. next.config.mjs 新增 async redirects(),所有老 URL 301 跳新 canonical,保护 SEO 权重 + 外链 + 用户收藏 验证预期(合 main 后 sync-uuid workflow 跑完): - 涉及 4 个 docId 的老贡献者 contributions 保持不变 - longsizhuo 本次 rename commit 在每个 docId 上 +1 - generated/doc-contributors.json path 字段更新为新位置 剩余工作(独立 PR): - 其余 78 份文档的 tag-one 占位符清理 - 文件名命名规范化批量(下划线 → kebab-case) * fix(redirects): 从 permanent:true (308) 改成 statusCode: 301 此前 Next.js permanent:true 下发的是 308 Permanent Redirect,和 PR 描述 / commit message 里写的 "301" 对不上。虽然 SEO 语义上 308 和 301 等价 (Google 都认永久跳转),但: - 301 是最老最广为人知的"永久跳转"语义,老爬虫/老工具识别最稳 - Google Search Console 报告显式认 301 - 代码实际行为和文档口径对齐,避免后续阅读混淆 statusCode 与 permanent 互斥,优先级更高。这里显式用 statusCode:301 覆盖默认的 308 行为。 验证:node 直接 eval next.config.mjs 的 redirects() 返回 4 条全部带 statusCode:301,pnpm typecheck 通过。 * refactor(docs): phase 2 — CommunityShare 下 AI 内容进一步归并到 ai/ 延续 PR 初版的语义化重组思路,继续把散落在 CommunityShare 下的纯 AI 内容 移到 ai/ 主目录对应主题下。新增 4 个 docId 的迁移: - CommunityShare/Geek/leworldmodel (JEPA 世界模型论文摘要) → ai/foundation-models/world-models/leworldmodel - CommunityShare/Amazing-AI-Tools/perplexity-comet (AI 浏览器介绍) → ai/misc-tools/perplexity-comet - CommunityShare/Amazing-AI-Tools/prompt-repetition-improves-non-reasoning-llms (arXiv prompt 技巧论文摘要) → ai/foundation-models/prompt-engineering/ - CommunityShare/Personal-Study-Notes/Reinforcement-Learning/ppo → ai/reinforcement-learning/ppo 新增 3 个 ai/ 下子目录:world-models / prompt-engineering / reinforcement-learning 顺手收拾的: - ppo.md 原本是 tag-one 占位符 → [reinforcement-learning, ppo, policy-gradient, gae] (和 PR #308 里对 ppo 的 tag 选择完全一致,merge 顺序无所谓) - leworldmodel 原本 tag 是中文 "世界模型" → kebab-case 英文 [world-models, jepa, representation-learning, embodied-ai] - 清理空目录 CommunityShare/Personal-Study-Notes/Reinforcement-Learning/ 和 Personal-Study-Notes/ next.config.mjs 补 4 条 301,累计 8 条。statusCode:301 继续用显式 301 (和 PR / commit 口径一致)。 与 PR #308 (feat/docs-tag-cleanup) 的冲突风险: 本 PR 已经移走 ppo.md 并应用了和 PR #308 完全相同的 tag 更新。merge 顺序: - 若本 PR 先合:PR #308 rebase 时会发现 ppo 老路径不存在,它对 ppo 的 tag 修改会变 "deleted by us / modified by them" 冲突,需要 drop PR #308 中 ppo 那条 hunk(因为本 PR 已处理) - 若 PR #308 先合:本 PR rebase 时 ppo 在老路径已有新 tags,git mv 自然工作,无冲突 推荐:**本 PR 先合**,然后 PR #308 rebase 时丢掉 ppo 相关改动。 docId 守恒(4 份原文 + 3 份翻译 = 7 个文件全部 grep 对齐): - boo70qqm8nos8b0q9h7zjrki (leworldmodel) - eej2awin6irhbdgcy8vvs3xb (perplexity-comet) - l6eepr5ctjgrhdgupy3twr1t (prompt-repetition) - zf8zk108oqbsg56xjyqb5txk (ppo) Reviewer subagent LGTM,无阻塞问题。 * chore(docs): 清理 tag-one 占位符 → 真实内容标签(28 原文 + 26 翻译) 背景:站点早期模板带 "tag-one" 占位符作为 frontmatter.tags 默认值, contributors 撰文时没覆盖,30 份文档仍带占位符。tags 字段影响 sidebar 显示、未来可能接入的 tag 筛选 UI、SEO 结构化数据。批量清理。 作用域: - 28 份原文 + 26 份 .en/.zh 翻译 = 54 个文件 - 跳过 PR #307 已在处理的 4 份(rag, embedding, context-eng, ai-town), 由那个 PR 负责清理,合并顺序无关 - 纯文本改动,零 URL 变化,无需 301 redirects 内容标签分类覆盖: - CommunityShare/Geek: image-hosting / self-hosting / cdn / git-workflow - CommunityShare/Life: unsw / university-benefits / australia-study - CommunityShare/Personal-Study-Notes: reinforcement-learning / ppo / gae - ai/Introduction-of-Multi-agents-system: multi-agent-systems / agent-framework - ai/MoE: mixture-of-experts / model-architecture - ai/Multi-agents-system-on-Code-Translation: code-translation / llm-application - ai/ai-math-basics: math-textbooks / learning-resources / book-recommendations - ai/misc-tools: ml-experiment-tracking / swanlab - ai/recommender-systems: 6 份王树森笔记统一 recommender-systems 前缀 + 各章节专属标签(feature-crossing / retrieval / cold-start / ranking 等) - computer-science/cpp_backend: 8 份统一 cpp-backend 前缀 + 子主题 (threadpool / memory-pool / build-system / gcc / cmake / vcpkg) - jobs: career / interview-preparation / internship / australia-job-market 流程: 1. Scan + 自己起草 tag 提案 2. 派 reviewer subagent 读每份文档前 50 行审标签(9 处被挑出修正全部采纳) 3. Python 脚本原子替换 frontmatter 里 " - tag-one" → 多行新 tags 4. grep 校验残留:仅剩 PR #307 的 4 个文件 docId 全部原样保留,sync-uuid 合并后不会误判为新文档。 * revert: ppo.md tag 改动挪到 PR #307 处理 背景:PR #307 (feat/docs-reorg-rag-projects) 的 phase 2 新增把 CommunityShare/Personal-Study-Notes/Reinforcement-Learning/ppo.md 移到 ai/reinforcement-learning/ppo.md 并同步更新 tags。 两个 PR 改同一个文件在同一行(tag-one → 真 tags)会 rebase 冲突。 本 PR 主动剔除对 ppo 的修改,由 PR #307 独占处理,merge 顺序无关。 其他 53 个文件(27 原文 + 26 翻译)的 tag 清理不受影响。 * refactor(docs): cpp_backend 目录树规范化 — 下划线 / 大驼峰 → kebab-case 背景:Involution Hell 文档站全站命名约定是 kebab-case,但 cpp_backend 整棵 子树残留早期混用风格: - 下划线目录:cpp_backend / easy_compile - 大驼峰目录:Handwritten_pool_components - 下划线 + 大驼峰文件名:1_Handwritten_threadpool.md / 3_Make.md 等 批量规范化成 kebab-case,保留数字前缀以维持 sidebar 阅读顺序 (Fumadocs 按文件名字母序排 sidebar,去掉前缀会打乱 1→5 的教学顺序)。 变更: - 3 个目录 rename - 8 份原文 + 7 份 .en.md 翻译 = 17 个文件 git mv - next.config.mjs 新增 async redirects(),8 条老 URL → 新 canonical 301 映射 使用 statusCode:301(不是 permanent:true 的 308),两者 SEO 等价,选 301 因识别最稳、和 PR 描述口径一致。Next.js 源码 allowedStatusCodes 里合法。 验证: - git status 显示全部 R (rename),相似度 100% - docId 守恒:grep "^docId:" 对照 8 个 docId 全部原样保留 - pnpm typecheck 通过 - node 实测 next.config.mjs 的 redirects() 返回 8 条全 statusCode:301 合并顺序:和 PR #307 / #308 独立,互不冲突(改动在完全不同的目录)。 流程: 1. 建分支 feat/docs-filename-kebab-case 2. mkdir 新目录 + git mv 17 个文件 3. rmdir 旧空目录 4. 加 301 redirects 5. reviewer subagent 审稿:误报 1(statusCode 实测 OK)+ 非阻塞 1 (generated/ JSON 由 sync-uuid CI 自动 regen,不应手动改) 6. 采纳 reviewer 关于注释措辞的建议,修掉 "HTTP/1.0" 这个不准的词 * 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 标记具体哪些过期) --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent dccce6b commit 6684884

420 files changed

Lines changed: 490 additions & 97 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: 7 additions & 2 deletions

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

Lines changed: 7 additions & 2 deletions

app/docs/career/index.mdx

Lines changed: 15 additions & 0 deletions

0 commit comments

Comments
 (0)