网站流水线
您从一个初始输入到部署预览,以尽可能少的用户输入运行一个客户网站。首先,每次运行(新建、恢复或单阶段):阅读 <pipeline>/RULES.md,即网站规则,除非本次会话已经阅读过。这些规则适用于每一步。tools/ 中的工具会机械地强制执行大部分规则,因此请运行它们,而不是通过肉眼重新检查。
工作区
所有内容都存放在同一个工作区 C:\Users\Administrator\Desktop\Claude Workspace(<workspace>)。以下路径均相对于它;在脚本中,从脚本自身位置(Path(__file__))推导路径,切勿使用硬编码的桌面路径。
| 内容 | 位置 |
|---|---|
流水线(<pipeline>) | Workflow and Pipeline/website-pipeline/(~/.claude/skills/website 是它的符号链接) |
| 共享工具 | <pipeline>/tools/:qa.py、browser_qa.mjs、deploy.py 的唯一副本。每个站点的 tools/ 中都包含存根,这些存根在该站点上运行共享工具(L-052),因此修复或新增检查会同时影响所有站点。仅限站点的脚本与存根放在一起。 |
| 示例站点 | Concept Websites/<名称> Website/ |
| 所有者的作品集 | Portfolio Site/ |
| 作品集截图 | Portfolio Screenshots/:仅限已完成站点的截图,别无其他 |
| 临时文件(测试脚本、测试截图、备份、植入的缺陷) | _temp/,切勿放入系统临时文件夹、项目或模板中 |
0. 我在哪里?
根据文件夹状态和参数决定入口点:
| 状态 | 操作 |
|---|---|
当前目录中没有 _src/build.py | 搭建脚手架:powershell -NoProfile -ExecutionPolicy Bypass -File "<pipeline>/scaffold.ps1" -Target "<cwd>" -NoLaunch,然后进入导入阶段。如果当前目录包含无关文件,则停止并询问(这是一个关键问题)。 |
PROJECT.md 中每个阶段都已勾选(一个已完成的站点被同名重新打开),并且参数为空或是新建站点导入,而不是阶段参数或变更请求 | 在执行或更改任何内容之前先询问(用户,2026-10-10,L-057)。使用一个 AskUserQuestion:"<名称> 已经完成(预览 )。重新设计它?",选项为 不,保留它 和 是,重新设计它。不: 停止,不执行任何操作,甚至不进行工具同步、QA 或部署。是: 像新站点一样从头开始;切勿根据旧简报自行重新设计(L-058)。(1) 提交所有未暂存的更改,并标记旧版本:git tag previous-<日期>。然后,将除 client-assets/ 和 .git/ 之外的所有内容(包括旧的 BRIEF.md)移动到 <workspace>/_temp/<名称>-previous-<日期>/(归档,切勿删除)。标签在 _temp 被清理后仍可恢复旧站点。(2) 再次搭建脚手架,复制模板的空白 BRIEF.md,并设置其 Business name: 行。(3) 在后台运行命令打开简报表单,python "<pipeline>/brief-form/brief_form.py" "<project>",告知用户窗口已打开,然后等待。在此期间不进行任何指引、库学习、素材搜索或设计工作。(4) 退出码 0("开始构建"):根据新简报运行常规的新站点流程,从导入阶段开始。退出码 3(关闭):停止并说明简报已保存。在交接时,替换站点的设计库条目,而不是添加第二个。 |
PROJECT.md 中有未勾选的阶段 | 从第一个未勾选的阶段恢复。用一句话说明在哪里恢复。 |
| 恢复或更改任何现有项目 | 工具无需同步:tools/ 包含共享工具的存根。如果站点没有 .git/,则运行 git init -b main、git config core.autocrlf false,复制模板的 .gitignore,并首先提交一个基线。如果 qa.py 警告存在共享工具的完整副本(2026-10-13 之前的站点),则运行 python "<pipeline>/dev/use_shared_tools.py" "<project>" 并提交。同时引入请求所需的新模板功能(例如 GSAP:build.py 中的 h_gsap、{{fn:gsap}}、tools/vendor/、motion.js)。 |
参数 status | 打印阶段清单以及开放的占位符。不执行其他操作。 |
参数 learn | 学习放入 <pipeline>/design-library/inspiration/ 的设计图片和 DESIGN.md 文件:按照 design-library/LEARN.md 操作,然后为每个参考输出一行报告。不执行其他操作。 |
参数 qa / deploy / handoff | 仅运行该阶段。 |
自由文本参数是导入材料(商业名称、电话、链接、备注)。将它们视为与 BRIEF.md 相同。
模式:示例或客户
BRIEF.md › Project type 设置模式。默认为 示例,即作品集作品。参数中明确的指令优先。
| 示例(作品集) | 客户(真实业务) | |
|---|---|---|
| 缺少的事实 | 当简报内容薄弱时,虚构一个合理且一致的虚构业务:名称、故事、服务、营业时间。使用 555-01xx 电话号码和 example.com 电子邮件,确保不会联系到真人。 | 绝不虚构。使用占位符和 data-todo。 |
| 评论、统计数据、资质 | 对于 虚构 业务可以接受;在交接时将其列为虚构。如果示例使用的是 真实 业务,则仅使用真实的公开事实:不得虚构关于真实人或公司的评论、声明或价格。 | 仅限客户提供的内容。 |
| 问题 | 几乎没有:仅限于删除文件、花钱、联系现实世界(真实收件箱、真实电话号码)以及关键设计评审(#5)。 | 下面的完整问题策略。 |
| 表单 | 演示模式即可。 | 需要真实端点;如果缺失则询问。 |
| 部署 | noindex 预览 | noindex 预览;仅当请求时才进行生产部署 |
| 交接附加项 | 作品集截图(见交接阶段) | 为客户编写的占位符列表 |
操作规则
- 自动运行。 不要询问“我该继续吗?”,从一个阶段进入下一个阶段。每个阶段完成后,在
PROJECT.md› 状态中勾选它。这使得运行在压缩或新会话后可以恢复。 - Git(每个站点和流水线都是仓库)。 在每个已勾选的阶段之后(
<阶段>: <完成的工作>)以及每次请求的变更轮次之后,在站点中提交,以便任何状态都可以比较或恢复。在流水线仓库中提交流水线变更(共享工具、模板、SKILL.md、LESSONS.md、设计库),如果存在,则在消息中包含经验教训 ID。dist/、qa/和缓存被 gitignore。绝不重写历史、强制推送或推送任何内容;没有远程仓库。 - 问题遵循下面的策略。其他一切都是决策: 做出决策,在
PROJECT.md› 决策中添加一行(做了什么+为什么),然后继续。 - 客户模式:绝不捏造客户事实。 这包括推荐语、评论数量、经营年限、许可证、认证、价格、保证、奖项和团队名称。如果输入材料中没有这些信息,则编写副本使其不需要这些事实。如果确实需要,则用
data-todo="所需内容"标记该元素,以便 QA 在交接时列出。示例模式遵循模式表。 - 在错误发生的那一刻,立即将其记录 在
PROJECT.md› 错误中。不要等到交接;上下文在此之前可能已被压缩。错误包括用户纠正的任何内容、QA、评审或审阅者标记的任何初稿错误(按类型记录一条,而不是按实例记录),以及任何错误的假设或工具使用错误。每条记录包括发生了什么、谁发现的、根本原因、修复方法以及如何预防。 - 唯一真相来源: 编辑
_src/(页面、局部模板、site_config.py)和assets/,然后运行python _src/build.py。绝不编辑dist/。 - 脚本化编辑(L-027): 单次更改使用编辑。多次替换应写入一个 Python 脚本中(使用写入命令写入
<workspace>/_temp),绝不要使用 shell heredoc。脚本会在每次匹配计数恰好为 1 时退出,并在写入任何文件之前检查每个文件。之后,对任何编辑过的.py文件运行py_compile并重新构建。 - 上下文卫生: 运行工具并阅读它们的 报告(
qa/*.md),而非原始输出。通过上下文模式(ctx_execute_file/ctx_batch_execute,附带问题如“仅错误和警告”)查询长报告、日志和列表,而不是完整阅读它们。使用读取工具查看截图。绝不要将整个 HTML 文件转储到对话中。
问题策略(仅限关键事项)
仅当以下情况之一成立时才提问。这是客户模式;在示例模式下仅适用 #2 和 #5,并且 noindex 预览无需询问。
- 身份未知。 您无法从任何输入或公开来源判断业务内容、位置或服务对象。错误的猜测意味着重写网站。
- 面向外部或不可逆。 生产部署、自定义域名、将表单连接到真实收件箱、任何花钱的操作、删除用户文件。当
BRIEF.md说明部署预览:是时,noindex 预览部署是预先授权的。 - 网站将做出的法律或事实声明 只有客户才能确认(许可、定价、保修)。默认情况下将其排除。仅当简报将其作为核心内容时才询问。
- 冲突指令 出现在简报、用户消息、RULES.md 和 CLAUDE.md 之间,且两种解读都合理。
- 关键设计评审。 无瑕评审或最终审阅者报告了 P0(阻塞性)或 P1(重大)问题。遵循以下评审关卡。这是构建过程中唯一允许提问的时刻。
如何提问:
- 一批次,在导入阶段结束时。 使用一个包含 1-4 个问题的 AskUserQuestion。将推荐答案放在首位,并标记为“(推荐)”。绝不在构建过程中提问,评审关卡(#5)除外。如果后来出现阻塞性问题,使用清晰标记的占位符,在延期问题下记录,并在交接时呈现。
- 绝不询问关于: 调色板、字体、布局、文案语气、页面列表、使用的图库照片、章节顺序、技术栈、文件名,或是否修复 QA 发现。决定这些。唯一的例外是 P0/P1 评审发现(#5)。
- 如果没有关键问题,则不问任何问题。 说“没有阻塞性问题;继续”并继续。
评审关卡(无瑕发现)
使用无瑕自己的严重性等级(P0 阻塞性、P1 重大、P2 次要、P3 润色)。对每个发现-审查者项目按相同等级评分。
- P2/P3(次要):不修复它们;继续。 在
PROJECT.md› 决策中为每个发现记录一行:“跳过:次要(P2/P3),<发现摘要>”。 - P0/P1(关键):在更改任何内容之前停止并询问。 使用一个包含最多 4 个问题的 AskUserQuestion 批次。每个发现写一个问题,或者如果超过 4 个则按类别分组。每个问题说明问题所在及其位置(页面、章节、截图文件)。它提供 2-3 个具体的修复选项,将推荐选项放在首位并标记为“(推荐)”,再加上“保留原样”。然后在整个站点范围内应用用户的选择(L-016),重新构建,并在决策中记录该选择。
- 重新检查: 在应用选择后,重新运行相同的评审一次。任何新的 P0/P1 将通过关卡再次处理;次要发现如上所述跳过。
- 不通过关卡: 由
qa.py、browser_qa.mjs、LESSONS.md 或 RULES.md 已经禁止的客观规则违规,例如对比度低于 4.5:1、溢出、重复照片、使文字对比度降低的发光效果(发光本身是允许的)、裁剪不完整的主题,或预填充默认值的选择框。无论评审员将其评为何种严重性,都自动修复这些问题,因为它们是缺陷,而非设计选择。impeccable detect标志除非违反这些规则之一,否则视为次要。像以前一样注明已知的误报(L-000)。
阶段
1 · 导入
- 阅读
<pipeline>/LESSONS-INDEX.md(每行一个经验教训,从 LESSONS.md 生成)。所有经验教训从初稿开始适用。打开与该项目相关的每个经验教训的完整 LESSONS.md 条目,并将其 ID 以及每个 ID 的简要说明(几个词)列在PROJECT.md› 错误 › “注意”中。列出 ID,切勿复制经验教训文本:复制的文本会在经验教训被取代时过时(Trevor Travis 和 Gadget Zone 在允许发光后仍然保留了“禁止发光”)。 - 阅读
BRIEF.md、参数以及client-assets/中的所有内容。使用读取工具打开每张照片,并在PROJECT.md› 资产中编目。记录主题、质量、任何问题(盘子、标志、杂乱、裁剪)以及最佳位置(英雄/特色/画廊/跳过)。图片上的第三方品牌标志(板子、标牌、渲染图)视为背书:标记为“使用前裁剪”或跳过(L-028)。注意哪些照片来自同一拍摄场景或显示相同视角(L-029)。 - 如果提供了链接(现有网站、Google Business Profile、Facebook),获取它们并提取事实:服务、服务区域、营业时间、故事、所有者、经营年限、真实项目。在
PROJECT.md› 事实中每个事实旁边注明来源。- 将说明文字、评论和所有者引语 逐字 保存到来源文件(例如
client-assets/sources.md)。从此文件复制引语;绝不要根据记忆重新输入或改写(L-007)。 - 在事实中记录每个项目的 署名行(由...设计/由...构建/年份)。仅由该业务构建的项目永远不会被标记为“由...设计”。
- 将说明文字、评论和所有者引语 逐字 保存到来源文件(例如
- 优化客户照片:
python tools/optimize_images.py(client-assets →assets/img/client/,EXIF 旋转,最大 2000 像素)。 - 填充
_src/site_config.py:BIZ、HOURS、SERVICES、PRIMARY_CTA、PAGES、FORM_ENDPOINT、SEO。未知的联系值保持""。构建将它们保留为可见的{{TOKEN}}占位符,并且 QA 会报告它们。- 联系表单。 将简报中的
表单端点:复制到FORM_ENDPOINT:空白 = 演示模式;netlify= Netlify Forms(仅当部署主机:netlify时;否则 qa.py 会报错);web3forms:<访问密钥>= 任何主机上的 Web3Forms(收件箱所有者在 web3forms.com 创建密钥);或 Formspree 风格的 URL。{{fn:form_fields}}添加匹配的隐藏字段和垃圾陷阱。切勿自行选择或连接真实收件箱:空白的简报保持演示模式,并列入交接列表。在客户端模式下,哪个收件箱接收消息是一个问题。将在线预订链接:复制到BOOKING_URL;{{fn:booking}}在联系页面上将其与呼叫按钮一起显示。 - GSAP 动画。 可选,默认关闭。仅当简报说明
GSAP 动画:开启或其等效内容时。
- 联系表单。 将简报中的
...