// changelog
更新日志
新功能、体验优化与工程改进。
生成流水线 · Chrome 两阶段 Agent
全局 chrome 拆为 architect_scaffold_agent(快速搭壳、链接可占位)与 chrome_optimize_agent(全部页面落盘后勘察真实路由与 section id,精修 Nav/Footer)。Page Agent 全程只读 chrome。
- 编排:scaffold → page_implement_agent ×N → chrome_optimize → await_images / install_deps
- checkpoint:skipScaffold / skipChromeOptimize;旧 architect_agent 完成记录视为 scaffold 已完成
- Page Agent:单页主区块须带 section id;禁止在 page 内重复全局 Nav/Footer
文档与预览说明对齐当前实现
技术文档、首页文档索引与 README 已与代码一致:主路径为 Architect → page_implement_agent;设计系统改为 infer + generate_project_design_system(已移除 match_design_system_skill 与内置 design-system skill 目录);预览支持 local / storage(默认 dev)/ e2b 三种后端;修正构建修复轮次与模型步骤表等过时描述。
- docs:流水线步骤含 validate_skill_prompts、await_images、typecheck_generated;移除已废弃的全局 preselect_skills / generate_section 主路径描述
- docs:预览沙箱页补充 Storage + `/site-previews` 代理与 OPEN_OX_PREVIEW_BACKEND 选型
- docs:Section 生成页改为 Page Implement Agent + Hero 运行时 skill 发现;设计系统页对齐并行编排与 token 写入方式
- README:Next.js 16 / React 19,预览与 Storage 双 bucket 架构简述
生成流水线 · Architect 先于 Page Agent
`architect_agent` 在全部 `page_implement_agent` 之前串行结束,各页预读到的 `app/layout.tsx` 与最终 chrome 落盘一致,降低重复导航/页脚等壳层风险。多页实现仍彼此并行。
- apply_project_design_tokens 之后:先 `runArchitectStep`,再 `generatePages`(移除与 Page Agent 的 Promise.allSettled 并行)
- 内部文档 `docs/architecture.md` 与 `app/docs/pipeline` 步骤说明已同步
生成流水线 · globals 竞态修复与编排调整
修复「日志里 apply_project_design_tokens 看似正确,磁盘上 globals.css 却不像 LLM 产出」的问题;统一由设计系统 Markdown + 当前 globals 走 LLM,并收紧 Agent 对全局样式文件的写入。
- apply_project_design_tokens 与 Architect / Page Agent 不再并行:token 步骤先落盘 app/globals.css,避免带 write_file 的代理在之后覆盖
- apply_project_design_tokens 仅消费设计系统正文与站点当前 globals,不再读取或复制 skills 下的 *.globals.css
- Architect 与多页 page_implement_agent 曾在 token 完成后并行(v1.5 起改为 Architect 先完成,再启动各页)
- checkpoint skipArchitect 恢复时:generatedFiles 计入磁盘上已有的 app/layout.tsx 与 components/chrome/**
- apply_project_design_tokens:提高 LLM 输出 token 上限(8k),降低超长 globals.css 截断风险
- architect_agent 提示词去掉「须先跑 format_code」的误导,与 write_file 自动 Prettier 一致
- docs/pipeline:移除已废弃 section 流水线步骤,补充 typecheck_generated,步骤编号与主路径对齐
- 移除 scripts/codegen-skill-globals.mjs、根目录 _test_parse.mjs,删除 package.json 中的 codegen:skill-globals 脚本
账号主流程 · 全员项目广场
飞书登录与回跳闭环、会话与退出体验优化;未登录发起构建可接续;项目列表默认按成员浏览团队全部作品。
- 独立 /auth 登录流程:飞书授权、错误提示、登录后按 redirect 回到来源页(含首页构建场景)
- 未登录在首页填写需求并点「构建」→ 完成登录后自动恢复草稿并继续创建项目,无需再点一次
- 项目页「全部成员 / 我的项目」:默认展示所有人项目并按创建者分组;「我的」下仍可用文件夹筛选
- 全员列表仅本人项目显示删除;退出登录路径优化,减轻顶栏布局抖动与不必要的全页刷新
生成链路升级 — 6 步到 8 核心节点
为提升页面整体一致性与风格稳定性,新增独立风格推理与页面级 section 设计描述两个节点;并将 requirement 输出收敛为最小结构。
- analyze_project_requirement 输出收敛为最小结构:brief + site(不再混入 designIntent)
- 新增 infer_design_intent:独立风格推理节点,产物注入 generate_project_design_system
- 新增 describe_page_sections:先整页结构描述,再拆分每个 section 的布局/背景/层次
- analyze_project_requirement 与 infer_design_intent 并行执行,减少串行等待
- site shell 输入改为扁平结构:site.navigation / site.footer,与 pages 同层
- normalizeBlueprint 兼容新旧输入形状,保证链路平滑迁移
架构收敛 — Flow 模块化 + Prompt 统一与去重
本次针对可维护性投诉做系统性重构:拆分 generate/modify 巨型流程文件,收敛 LLM 调用层,Studio 类型去 any,并把提示词加载改为统一 Prompt Core,同时清理重复提示词来源,减少冲突与漂移。
- Modify Flow 模块化:runModifyProject 拆分为 facade + loopEngine + stopHooks + context + tracking + prompt
- Generate Flow 抽取:新增 normalization 与 orchestration 层(resultAccumulator / buildRepairLoop / sectionBatchRunner 等)
- LLM 层统一:shared/llm 拆为 gateway、toolLoop、errorClassifier、contentExtractors,并保留 facade 导出
- Blueprint 规范化收口:normalizeBlueprint 独立为 schema 模块,并增加输入形状检测与 fallback 告警
- Studio 类型收口:BlueprintOverview 引入 ViewModel mapper,移除组件内 as any 读取
- Prompt Core 上线:统一 prompt catalog/loader/composer,旧 loadStepPrompt/loadGuardrail 接口兼容接入
- Modify 系统提示词迁移到 Markdown:从代码硬编码改为 prompts/system/modifyAgent.md
- 提示词去重落地:section.default 中与 outputTsx 重复约束已删除,outputTsx 作为单一权威来源
- 测试护栏补齐:新增 stopHooks、contentExtractors、normalizeBlueprint、buildRepairLoop、prompt composer 测试
Pipeline 重构 — Traits 系统 + 运行时 Skill 发现 + 并行提速
生成流水线的架构级重构。用结构化 Traits 替代 capability assist 白名单,移除全局 preselect_skills 步骤改为每个 section 运行时自发现 skill,design tokens 与 section 生成并行执行,repair_build 升级为 Agent 工具循环。
- Traits 系统:SectionDesignPlan 中的 capabilityAssistIds 替换为结构化的 layout/motion/visual/interaction traits
- 运行时 Skill 发现:移除全局 preselect_skills 步骤,每个 section 在生成时自行发现并选择 skill(score-based fallback)
- design_tokens ∥ section_generation:两者不再串行,Promise.all 并行执行
- repair_build 升级为 Agent 工具循环:使用 read_file / edit_file / write_file / run_build 工具,替代旧的 JSON 批量写入
- LLM 重试:chatCompletion 加入指数退避重试(500/502/503 + Thinking signature error),最多 2 次
- 模型配置:ModelConfig 新增 supportsThinking 字段,运行时可查询模型是否支持 thinking 模式
- composePage 安全增强:import 去重 + 重复渲染检测 + 自动 rebuild
- Section 去重:normalizeBlueprint、页面生成、composePage 三层去重,防止 LLM 输出重复 section
- Prompt 精简:删除 7 个 section prompt、3 个 motion prompt、2 个 capability prompt、5 个 layout prompt,统一收敛到 section.default + skill
- planProject 精简:SectionDesignPlan 验证从 15 字段缩减到 traits-based 结构
Studio UI 优化
GenerationAtlas 拓扑图 memoize 优化,DetailDrawer 从 fixed 改为 absolute 定位,避免遮挡全局导航。
- GenerationAtlas:useMemo + stepsFingerprint 避免每次渲染重新解析拓扑
- DetailDrawer:backdrop 和抽屉从 fixed 改为 absolute,作用域限定在父容器内
统一触发器系统 — / @ # URL 图片
HeroPrompt 输入框从单一的 /skill 升级为多触发器架构。支持在文本任意位置触发,选中后以彩色 chip 形式注入。
- / 风格模板:选择设计风格(如 /glassmorphism),注入 styleGuide
- @ 参考项目:引用已生成的项目作为设计参考,注入 referenceProjectId
- # 约束标签:添加约束条件(#暗色主题 #极简 #中文),追加到 prompt
- URL 自动检测:粘贴 URL 自动提取为 chip,传递 referenceUrl
- 图片粘贴:粘贴截图自动转为带缩略图的 chip,传递 imageBase64
- 快捷模板 pills:输入框为空时显示 SaaS/作品集/电商等一键模板
- 统一架构:usePromptTriggers hook + TriggerMenu + PromptChips 组件解耦
Modify Agent 架构升级 — 对标 Claude Code
基于 Claude Code 架构文档的全面对标分析,从模型路由、工具能力、上下文管理到 Agent 行为模式的系统性升级。
- 模型路由解耦:modify 不再依赖全局 _runtimeModelId,通过函数参数传递
- think 工具:内部推理 scratchpad,无副作用,用于复杂编辑前的规划
- revert_file 工具:基于 FileSnapshotTracker 快照回滚,打转时可一键恢复
- read_file 支持 start_line/end_line 行范围读取
- exec_shell 加入 modify 工具列表
- parallel_tool_calls: true 启用并行工具调用
- Must read before edit 保护:edit_file 前必须先 read_file
- Tool Result Budget:单条结果上限 30K 字符,防止 context 爆炸
- 基于相关性的 Context 压缩:热文件保留完整,冷文件压缩
- Loop Detection:连续 4 次操作同一文件时注入策略转换提示
- 4-Phase Progressive Workflow:Orient → Deep Read → Edit → Verify
- edit_file 失败时的近似行匹配诊断
- System Prompt 加入 Claude Code 核心准则(先诊断再换策略、简洁输出)
首页全面升级
首页从三段式(Hero + How it Works + Features)升级为五段式,增加数字指标栏和 CTA 区域,Features 从 3 张扩展到 6 张带指标的卡片。
- Stats Bar:~30s / 6 步 / 2x 修复 / ∞ 迭代 — 全宽数字指标栏
- Features 重做:6 张卡片,每张带右上角大数字指标 + hover 光晕
- CTA Section:Footer 前的全宽 call-to-action 区域
- AgentFlowDemo 重写:粒子流、节点呼吸灯、完成径向波纹、并行分裂动画、修复回路
- Footer 重做:四栏布局(品牌 + 产品 + 资源 + 社交)
- 全站中文化(主标题保留英文)
修改 Agent v7 — 受 Claude Code 启发的循环架构
修改流的完整重写。用开放式 Agent 循环替代了原来的"先规划后执行"模型,在单次循环中完成搜索、阅读、编辑和验证。
- Stop Hook:质量门控,防止 Agent 在搜索、编辑和构建之前停止
- 首次迭代 tool_choice='required' — Agent 必须先行动再思考
- 对话记忆:DB 历史 + session 历史合并去重,最多保留 10 轮
- 图片输入:可以粘贴截图配合文字指令
- FileSnapshotTracker:自动为每个修改文件计算前后 diff
- /clear 和 /memory 斜杠命令
preselect_skills:N 次串行 LLM 调用 → 1 次批量调用
所有 section 的 skill 选择原来是 N 次独立 LLM 调用。现在合并为单次批量调用,同时处理所有 section。
- 无论 section 数量多少,只需一次 LLM 调用
- 菜单/菜谱分离:选择阶段只看 metadata,生成阶段才加载完整 prompt
- LLM 失败时降级到每个类型的默认 skill
- 8 个 section 的网站节省约 13 秒
风格技能系统
用户现在可以在生成前通过 prompt 输入框中的斜杠命令注入视觉风格指南。
- /minimal、/bold、/glassmorphism、/brutalist 四种技能
- styleGuide 存储在 sessionStorage,仅传递给 generateProjectDesignSystem
- 截断到 1200 字符,避免 analyzeProjectRequirement prompt 溢出
- useSlashMenu hook — 在 HeroPrompt 和 BuildConversation 中复用
plan_project + generate_design_system 并行化
两个步骤都只依赖 blueprint 且互不依赖。并行执行节省一个完整的 LLM round-trip。
- Promise.all([stepPlanProject, stepGenerateProjectDesignSystem])
- 每次生成节省约 10-20 秒
- 安全检查:误放在 layoutSections 中的非 layout section 自动移回首页
buildSteps 增量持久化
构建步骤现在在每步完成后立即写入 Supabase,而非最后统一写入。用户中途关闭页面后重新进入能看到真实进度。
- appendBuildStep() 通过 SSE onStep 回调逐步调用
- 重新进入进行中的项目时启动 3 秒轮询
- 重试时清空 buildSteps 防止幽灵节点
- projectId 在 AI 启动前创建 — 支持恢复和可分享 URL
E2B 沙箱重连 + 静态导出策略
预览沙箱现在会重连已有的 E2B 实例而非创建新的。静态导出替代 next dev,提供稳定、低资源的预览 URL。
- sandbox_id 持久化到 DB 用于重连
- next build + npx serve out 替代 next dev
- 批量文件上传(20 个/批,并行)
- 智能依赖安装:只安装模板中缺失的包
- rebuildDevServer 复用沙箱,跳过未变更文件的重新上传
Blueprint normalize 层 + web_search 工具
analyze 步骤现在能优雅地处理 LLM 输出不一致的问题,并可以搜索网络获取未知品牌名信息。
- asProjectBlueprint() 对所有字段做类型化 normalize 和 fallback
- 支持嵌套、扁平和单页三种 LLM 输出格式
- web_search 工具:prompt 包含未知专有名词时自动触发
- analyze 步骤最多 4 次工具调用迭代
原生 fetch 替代 OpenAI SDK
OpenAI SDK 的 8 秒 socket timeout 会杀死长时间的 section 生成调用。替换为原生 fetch + AbortSignal.timeout(300_000)。
- AbortSignal.timeout(300_000) — 5 分钟硬上限
- 兼容任何 OpenAI-compatible 提供商(Gemini、本地 Ollama 等)
- 不再出现 60 秒 section 生成调用的静默断连