Communitygithub.com

GrimNej/portfolio-design

自动采访用户并构建一套完整的、奖项级别的个人作品集网站(包含WebGL粒子星系、镂空肖像/ASCII令牌视角、动画姓名、自定义光标、聊天吉祥物、技术栈物理球池和实时GitHub存档),支持本地预览、浏览器质量检测,并在用户确认后直接部署。适合有人需要作品集、个人主页、开发者首页或“像grimnej.com那样的网站”时使用。

portfolio-design 是什么?

该技能能够根据个性化采访,自动生成一套固定但高度可定制化的个人作品集网站,设计风格已在模板中预调并优化。它支持Node 18+和Python 3.10+环境,通过读取`portfolio.json`配置文件和一组自动化脚本(裁剪肖像、抓取GitHub仓库、渲染OG图片等)生成完整静态站点。技能还集成了Playwright浏览器质量门控(检查碰撞、溢出、链接有效性等),确保构建结果无误。用户可在本地预览后确认部署,部署采用GitHub Pages或自定义域名,并附带Cloudflare配置指导。核心规则包括:不公开未获明确批准的内容;仅使用公共GitHub数据;用户的照片仅存储在项目文件夹内;不随意增删页面结构(仅调整内容、主题、吉祥物和文案);所有文案需用用户本人的语气重新撰写,不可直接填充原始笔记。工作流程分为采访、收集材料、配置文件编写与构建、预览、质量检测、用户审核、最终部署七个阶段,每个阶段都有详细命令和参考文档。

兼容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/GrimNej/Portfolio-Design-Skill/tree/HEAD/skills/portfolio-design

在你喜欢的 AI 中提问

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

文档

作品集设计(Portfolio Design)

本技能为任何人重新构建一套特定的作品集设计。设计是固定的且已经过调优。你的工作是收集用户的素材,以其语气撰写文案,生成网站,证明其正常工作,并在用户同意后发布。

所有内容都位于此技能文件夹内:

路径说明
template/assets/网站的 CSS、JavaScript 模块、字体和第三方库(GSAP、Lenis)。请勿针对个人编辑:构建时会复制并应用主题。
scripts/build.mjs将 portfolio.json 转换为完整的静态网站。Node 18+,无外部依赖。
scripts/prepare_photos.py裁剪肖像(去背景)并将关于照片调整为正方形。
scripts/discover_github.mjs列出 GitHub 用户的公开仓库,附带 README 标语和横幅图片,用于挑选项目。
scripts/snapshot_github.mjs保存存档所依赖的公开仓库列表快照。
scripts/render_images.py渲染分享卡片(og.jpg)和触摸图标。
scripts/serve.py构建后网站的本地预览服务器。
scripts/qa/run_all.py浏览器质量门控。构建未通过检查即视为未完成。
examples/portfolio.example.json一个虚构人物的完整配置,包含占位图片。
reference/配置模式、采访脚本、设计系统、文案规则、质量门控、部署指南。

在以下命令中,scripts/... 指此技能文件夹(运行时请使用绝对路径),portfolio/... 是用户工作目录中的项目文件夹。

在编写配置前请阅读 reference/config-schema.md,在编写任何文案前请阅读 reference/copywriting.md。

基本规则

  • 未经明确同意,不得公开任何内容。 在用户明确批准该步骤之前,不要执行 git push、部署或创建仓库。本地构建和预览是允许的。
  • 隐私。 仅使用公开的 GitHub 数据(两个 GitHub 脚本故意调用未认证的 API)。在存档上线前,展示将要显示的公开仓库列表,并询问用户希望隐藏哪些。除非用户要求,否则绝不在页面上放置电话号码、街道地址或私有仓库。
  • 用户的照片归用户所有。 只在项目文件夹内处理副本。除用户批准的网站外,不得将其上传至任何地方。
  • 设计即产品。 不要因为用户提出模糊要求而增加章节、更换字体或重新设计组件。只调整内容、主题预设、吉祥物和文案。如果用户提出结构性修改,请先告知其成本并获得确认。
  • 文案是写出来的,而不是填进去的。 用户提供的笔记是原始素材。以用户的语气起草每一行内容,遵守字数限制,并在构建最终版本前展示给用户。

工作流程

1. 检查工具链

node --version          # 18 或更高版本
python --version        # 3.10 或更高版本
python -m pip install playwright pillow numpy
python -m playwright install chromium

肖像背景去除需要 python -m pip install "rembg[cpu]"(首次运行会下载约 1 GB 的模型)。如果无法实现,请要求一张已去除背景的肖像,并使用 --no-cutout 参数。

与用户商定项目文件夹(默认:当前目录下的 ./portfolio/)。目录结构如下:

portfolio/
  portfolio.json      # 你编写的配置
  photos/             # 用户的原始照片(切勿原样发布)
  work/               # 项目横幅和截图
  site/               # 构建输出:该文件夹将被部署

2. 采访

遵循 reference/interview.md。采访分为十个简短轮次,对于有合理选项的每个选择(主题、吉祥物、展示哪些仓库、在英雄区放哪些链接),使用 AskUserQuestion。自由格式的素材(个人简介、项目描述)以纯文本形式询问。一次只问一轮,对于用户不想撰写的内容,主动提供草稿。

顺序依次为:

  1. 身份:全名、别名或常用账号、简短头衔、邮箱、城市和国家(用于实时时钟时区)、语言。
  2. 照片:一张头像半身肖像(用于英雄区裁剪)和一张可选用于“关于”部分的照片。
  3. 链接:用户希望列出的所有个人资料;从中挑选两到四个放在英雄区行中。
  4. 英雄区与关于:用一句话说明用户做什么,然后用两段简短文字介绍其工作方式。
  5. 作品分类:四种作品类型,每个用一个词表示,附带一行描述和一个悬停动画(如 agents、automation、context、launch、code、data、design)。
  6. 项目:最多六个精选项目和最多三个支线项目。先运行 discover_github.mjs 并推荐候选项目。
  7. 存档:是否显示所有公开仓库,以及要隐藏哪些。
  8. 技术栈:分组的工具列表,以及 12 到 24 个用作物理球池球体的工具。
  9. 流程、联系、滚动条:三个流程步骤、联系行、两条滚动磁带条。
  10. 外观与附加:主题预设、吉祥物(名称、语气或关闭)、网站 URL 及托管位置。

3. 收集项目素材

node scripts/discover_github.mjs --user <github-user> --out portfolio/discovery.json
node scripts/discover_github.mjs --user <github-user> --out portfolio/discovery.json --download portfolio/work --repos RepoA,RepoB

第一次运行列出公开仓库及其 README 标语、图片和在线链接。第二次运行将每个选定仓库的第一张 README 图片保存到本地。每个精选项目至少需要一张预览图片。合适的来源依次为:README 横幅、在线应用的截图(使用 Playwright 以 1600x900 尺寸截取)、仿照 examples/assets/*.svg 风格生成的横幅。检查每张图片:截图中不能包含机密信息,不能模糊,应为宽屏格式(16:9 或接近)。

4. 准备照片

python scripts/prepare_photos.py --portrait portfolio/photos/portrait.jpg \
  --about portfolio/photos/about.jpg --about-gray --out portfolio/photos/out

打开结果并检查。裁剪后的肖像必须边缘干净、无透明破洞,头部靠近顶部。如果关于照片中脸部裁剪不当,请使用 --about-focus x,y(图像宽高的 0 到 1 分数)重新运行。将配置中 person.photos.portrait 和 .about 指向 out/ 中的文件。

5. 编写配置并构建

编写 portfolio/portfolio.json(模式见 reference/config-schema.md;工作示例见 examples/portfolio.example.json)。其中的路径是相对于配置文件本身的。然后执行:

node scripts/build.mjs --config portfolio/portfolio.json --out portfolio/site
node scripts/snapshot_github.mjs --user <github-user> --site portfolio/site   # 仅当启用存档时运行
python scripts/render_images.py --site portfolio/site

当缺少必填字段时,构建会给出明确提示并停止。有关未知图标的警告意味着该球体将以文本形式显示其名称;请从 data/simple-icons.json 中选择一个 slug,或者保持不变。

6. 预览

在后台启动网站预览服务器,并将 URL 提供给用户:

python scripts/serve.py --site portfolio/site --port 4321

请使用此服务器而非 python -m http.server:后者在页面同时请求大量文件时会断开连接,导致随机性的 QA 失败。此服务器还会发送无缓存头(重新构建后刷新即可看到更新),并对未知路径(如 GitHub Pages 中那样)返回 404.html。

7. 质量门控

python scripts/qa/run_all.py --url http://127.0.0.1:4321/ --out portfolio/qa

所有检查必须通过(reference/quality-gates.md 解释了每项检查及其常见故障的修复方法)。然后亲自查看 portfolio/qa/shots/ 中的截图,逐部分检查桌面端和手机端。自动化检查能捕获碰撞和溢出;你的眼睛能发现别扭的断行、模糊的图片和读起来不通顺的文案。修复、重新构建、重新运行。在部署前至少运行一次 --full。

8. 与用户一起审核

带领用户浏览预览:英雄区、关于、行、项目、存档、球池、流程、联系、吉祥物聊天。收集修改意见,将其应用到配置中(而不是构建后的文件),重新构建并重新运行质量检测。

9. 部署(仅在其明确同意后)

遵循 reference/deploy.md:GitHub Pages(用户站点或项目站点)、自定义域名以及重要的 Cloudflare 设置。部署后,运行在线检查:

python scripts/qa/run_all.py --url https://their-domain/ --only smoke,live --out portfolio/qa-live

如果“邮箱未被重写”检查失败,说明 Cloudflare 的邮箱地址混淆功能已启用,破坏了“联系我们”环;修复方法在 reference/deploy.md 中。

后续修改

编辑 portfolio.json,重新构建,重新运行质量检测,重新部署。每次构建都会在每个资源上添加新的 ?v= 版本字符串,因此浏览器和 CDN 无需手动清除缓存即可获取更新。

相关技能