Communitygithub.com

mitchelljrpalmer/portfolio-website

Mitchell Palmer 个人作品集网站的约定与架构文档。在此仓库中工作时使用——添加/编辑项目、照片、个人简介内容、导航、样式或任何页面/组件工作。解释了内容/页面/组件拆分、frontmatter 结构、已知问题以及不应触碰的内容(自动生成文件、node_modules)。

portfolio-website 是什么?

此技能为 Mitchell Palmer 的个人作品集网站提供了一个完整的维护指南,该网站使用 Next.js 16(App Router)构建,内容以纯 TypeScript/JSON/MDX 文件形式存储在 `src/content/` 中,而非 CMS。它清晰地定义了内容(`src/content/`)、页面(`src/app/`)和 UI 组件(`src/components/`)之间的边界,指导 AI 代理在添加或编辑内容时应仅修改 `src/content/` 下的文件,而不会误触路由或组件代码。技能文档详细说明了每种内容文件(如 `site.ts`、`about.ts`、`photography.json`、`projects/*.mdx`)的结构和 frontmatter 形状,包括项目 MDX 中 `skills`/`tools`/`techGroups` 字段的优先顺序,以及两个自定义 MDX 组件(`<DashboardEmbed>` 和 `<PdfEmbed>`)的使用方式。此外,它还列出了样式约定(Tailwind v4、CSS 变量、两种字体),明确标注了不应手动编辑的文件(如 `node_modules/`、`AGENTS.md`、`CLAUDE.md`、`next-env.d.ts`),并为常见任务(如添加新项目、新照片、编辑个人简介、添加工作经历)提供了快速参考。该技能适用于任何 AI 代理平台(如 Claude Code、Cursor、Codex),确保开发者和代理在维护该仓库时遵循一致的约定,避免引入新模式。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add mitchelljrpalmer/portfolio-website

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

作品集网站 — 维护技能

这是 Mitchell Palmer 的个人作品集:一个 Next.js 16(App Router)重建的网站,原先基于 Webflow 构建。内容以纯 TypeScript/JSON/MDX 文件的形式存储在 src/content/ 下,而非 CMS。在做出更改之前请阅读本文档,以确保遵循现有约定,而不是引入新模式。

心智模型

src/content/    → 数据        (要说的内容——几乎所有编辑都修改这里)
src/app/        → 页面        (路由——一个文件夹 = 一个 URL,App Router 约定)
src/components/ → UI 组件     (可复用的组件——Header、Footer、ProjectCard、PhotoGallery、MDX 嵌入组件)
public/images/  → 静态资源,按部分组织(site/、projects/、projects/hero/、photography/、icons/)

如果任务是“添加/编辑内容”(项目、工作经历、个人简介行、照片),几乎肯定只修改 src/content/。纯内容更改时不要触碰 src/app/ 或 src/components/。

内容文件参考

文件控制的内容
src/content/site.ts姓名、标签行、邮箱、导航链接、社交链接
src/content/about.ts个人简介段落、“旅程”故事、使命声明、状态
src/content/experience.ts工作经历(experience[])、教育背景、技能列表、服务卡片
src/content/photography.json{ src, season, location, type } 数组——/photography 页面上的过滤按钮会根据此文件中出现的值自动生成
src/content/projects.ts仅包含逻辑(读取 projects/ 下的 .mdx 文件)——除非更改项目的加载/排序方式,否则不要编辑
src/content/projects/*.mdx每个项目一个文件。frontmatter + Markdown/MDX 正文。文件名 = URL slug。

项目 MDX frontmatter 结构

---
title: "项目标题"
description: "1-2 句话,显示在卡片和详情页顶部。"
image: "/images/projects/thumbnail.jpg"
heroImage: "/images/projects/hero/banner.jpg"   # 可选,默认回退到 `image`
featured: true                                    # 在首页显示
link: { label: "GitHub 仓库", href: "https://..." }
skills: ["技能一", "技能二"]
tools: ["Python", "PostgreSQL"]
# 或者对于包含多种技术的项目,使用 techGroups 替代 skills/tools:
techGroups:
  语言与库: ["Python", "pandas"]
  统计方法: ["CUSUM", "Z-Score 分析"]
---

注意:ProjectCard.tsx 显示 project.tools ?? project.skills(如果两者都存在,tools 优先)。techGroups 与 skills/tools 在显示上是互斥的——详情页的侧边栏只显示其中之一,不会同时显示。

在任何项目正文中都可以使用两个自定义 MDX 组件:

<DashboardEmbed src="https://your-app.streamlit.app/" title="我的仪表板" />
<PdfEmbed src="/path/to/summary.pdf" />

样式约定

  • Tailwind v4,CSS 变量定义在 src/app/globals.css 的 :root 中(例如 --color-brand: #486161)。在那里更改调色板,而不是在组件中硬编码十六进制值。
  • 两种字体:--font-serif(Merriweather,标题)和 --font-sans(Inter Tight,正文)——都在 layout.tsx 中通过 next/font/google 加载。在构建时需要互联网访问——在离线/沙盒环境中会失败。
  • .container-page 工具类用于跨页面保持一致的最大宽度和内边距。

不要触碰

  • node_modules/ — 被 gitignore 忽略,通过 npm install 重新生成。切勿重新添加到 git。
  • 仓库根目录中的 AGENTS.md — 由 next dev 自动重新生成,向 AI 代理介绍此 Next.js 版本的具体约定。不要手动编辑;它会被覆盖。
  • 仓库根目录中的 CLAUDE.md — 目前仅包含 @AGENTS.md(一个导入)。如果需要添加持久的自定义指令,请将其放在新文件中并单独引用,不要覆盖 AGENTS.md 的导入。
  • next-env.d.ts — 自动生成,被 gitignore 忽略。

常见任务快速参考

新项目 → 将缩略图放入 public/images/projects/(可选英雄横幅)→ 在 src/content/projects/ 中创建一个新的 .mdx 文件 → 完成,无需路由代码。

新照片 → 将文件放入 public/images/photography/ → 在 photography.json 中添加匹配条目。

编辑个人简介/使命 → src/content/about.ts,纯字符串编辑。

新工作经历条目 → src/content/experience.ts,前置添加到 experience[] 数组中(按数组顺序渲染,因此最新的在前)。

导航/社交链接更改 → src/content/site.ts。

构建与验证

npm install       # 在拉取更改触及 package.json 后执行
npm run dev        # 本地开发服务器,热重载
npm run build       # 生产构建——在推送结构性更改之前运行此命令
npm run lint        # eslint 检查

npm run build 在没有互联网访问时会失败(Google Fonts 拉取)——这在完全离线环境中是预期行为,而非代码错误。

相关技能