算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
site-builder【设计与创意】用对话把用户的想法做成一个真实可访问的网站并一键发布上线。当用户说"做一个网站/页面/门户/展示站/落地页/看板/H5 并要能打开访问""帮我搭个站""把这份内容做成网页发布出去",或要在已发布站点上继续迭代修改时,或需要应用数据库、MCP 托管时,务必使用本技能。它教你两条建站路径——简单内容手写静态站、复杂/精美需求用预装的 React 工程模板构建——并用 choose_design 让用户三选一设计方案,最后用 publish_site 发布为平台托管站点,拿到形如 /site/<slug>/ 的访问链接交付给用户。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
本技能教你把用户的需求做成一个完整可访问的网站,发布后返回一个可直接打开的链接
(形如 /site/<slug>/)。发布能力由「站点」插件的 site_publish MCP 提供。
发布后平台自动为站点建同名项目并保存源码;用户可从站点卡片的编辑按钮继续修改。 已有项目中先查看原文件,增量修改,不在其他目录重新生成整站。具体发布参数同样遵循 下文「编辑已有站点」,不能因绑定项目而省略 site_id 或 src_dir。
把用户当成不懂技术的知识工作者:
| 用哪条 | 判据 |
|---|---|
| A. 静态站 fast path | 单页内容展示、通知/介绍/菜单类落地页、需求简单明确、无组件化交互诉求 |
| B. React 工程 capability path | 多页面应用、交互组件、图表/数据看板、用户要求"好看/精致/App 感"、预期持续迭代 |
拿不准时:内容型选 A,产品型选 B。编辑已有站点时不换路径(见编辑一节)。
/workspace/site/ 下(项目会话则直接在项目文件夹里);index.html 入口;可以有多页面、子目录、css/、js/、图片;publish_site(title='站点名称', src_dir='<实际页面目录>')。必须明确页面根目录,不能默认上传整个项目。url 以 markdown 链接发给用户(管理入口见「交付话术」)。bash "${SITE_TEMPLATE_HOME:-/opt/site-template}/init-react-site.sh" /workspace/site-src/<英文短名>
模板预装 React 18 + antd + echarts + tailwind v4 + lucide/motion/dayjs,依赖开箱即用。 脚本幂等,可反复执行(重开会话后也先跑它自愈环境);它会打印本工程的构建 命令、产物目录与发布参数,后续步骤以其输出为准。
本机模式下,候选截图直接通过 choose_design 的 options[].image_path 传真实绝对路径,
无需调用 sandbox_get_artifact,也不要 pin_to_workspace 交付候选截图。下方登记 file_id 的步骤仅适用于云端。
在动手写正式代码之前,让用户从 3 个设计方向里挑一个:
/workspace/design_options/{a,b,c}.html:
npx playwright screenshot --viewport-size=1280,900 \
file:///workspace/design_options/a.html /workspace/design_options/a.png
每张图调 sandbox_get_artifact(src_path='/workspace/design_options/a.png', name='design-a.png') 拿 file_id。这些截图是选择器素材,不要 pin_to_workspace。choose_design(question='您喜欢哪种设计风格?', options=[{id, title, brief, image_file_id}, ...])——工具会挂起等用户在界面上点选(等多久都正常)。编辑已有站点、或用户已给出完整明确的设计要求时,跳过本步骤。
src/(页面放 src/pages/,路由表 src/App.jsx),并把
index.html 的 <title> 改成真实站点名(模板占位是"站点建设中",留着会
显示在用户浏览器标签页上)。工程硬约束:
vite.config.mjs 的 base: './' 不许改(改了发布后打不开);src/assets/ 交给构建打包;lucide-react 或 @ant-design/icons),禁止拿
emoji 当图标(跨系统渲染不一致、色相杂乱,是"AI 生成感"最强的元素);grid.top 留够
空间或适当抬高 yAxis.max;轴刻度单位归口到标题一处,不要每个刻度都带;package.json 后重跑
init 脚本(此时会物化独立依赖副本并增量安装,可能需要几分钟——bash 调用
记得给足超时),禁止在工程目录里直接 npm install。cd /workspace/site-src/<名> && npm run build(产物自动落
/workspace/.site-dist/<名>/)。构建报错先修再继续,禁止带错发布。index.html 的 <title> 已改成真实站点名(不是"站点建设中");barMaxWidth 而非固定值;publish_site(title='站点名',
src_dir='/workspace/.site-dist/<名>',
source_dir='/workspace/site-src/<名>')
产物进托管,源码工程镜像进项目文件夹(保证「编辑」进来的是可改的源码)。
漏传 source_dir 会导致项目里的源码被产物覆盖——绝不允许。编辑必须显式传原 site_id 和准确 src_dir。不依赖按钮或会话替你补参数。 只有用户明确要求新建另一个站点时才省略 site_id。
list_sites(),获取当前账号可修改站点的
site_id、title、url、version、kind、source_dir、publish_dir、in_current_project。
本机和云端都用这一个工具;即使是新会话、即使是点「编辑」按钮进来的,也照样先查。
按用户提到的网址、标题及源码选择;in_current_project=true 的通常就是目标。
多个候选无法区分时先询问,不能选最近发布的站点。工具报错或返回空不等于没有站点,
要如实说明查询失败,不能自动新建,也不从目录名猜测编号。
editable=false 是没有源码工程的老站点,改不了,只能征得用户同意后另建新站。publish_dir/index.html。
项目根目录和 sites/<名字>/ 各有 index.html 时,不能混淆二者。
发布记录与文件不一致时先查明正确页面目录,再显式指定;不要复制到根目录掩盖问题。publish_site(title='站点名称', site_id='<查询得到的原编号>', src_dir='<实际页面目录>')。publish_site(title='站点名称', site_id='<查询得到的原编号>', source_dir='<源码工程目录>', src_dir='<本次构建输出目录>')。
本机目录与额外参数遵循「执行环境与源码目录」;不使用云端 /myspace 示例路径。新建同样必须显式传 src_dir,成功后保留回执中的 site_id 和准确目录供后续修改。
list_sites不可用时,不套用“后端按项目自动定位”的旧规则;读取最新技能并核对能力版本。
用户新开一段对话说“帮我改一下之前那个站”时,不需要先切回原会话——list_sites 返回的
source_dir 当前就可直接读写(云端是项目文件夹、本机是绑定的本地目录),按这四步走即可:
list_sites() → 按用户说的网址或标题认出目标,多个拿不准就问;source_dir 原地改(构建型在 source_dir 改完重新构建);publish_site(title=…, site_id='<查到的编号>', src_dir='<静态站用 publish_dir/构建型用本次产物目录>');绝不能因为“这段对话没绑项目”就不带 site_id 直接发布——那会新建一个站点, 用户原来的网址纹丝不动,看起来就是“改了但没更新”。
沙箱空闲一段时间会被回收销毁,只有项目文件夹(/myspace/...)里的文件永久幸存:
/workspace/ 其余区域随沙箱销毁丢失。node_modules / 构建产物 / 缓存永远不进项目文件夹(工程里的 node_modules
是指向 /workspace 临时区的符号链接,不要删除或替换成真实目录)。package.json / package-lock.json 落入项目文件夹时可能弹一次
「同步到我的空间」确认,属正常,等用户确认即可。visibility:public(默认,凭链接访问)/ private(仅本人登录可见)/站内 JS 用相对路径(不带前导 /)fetch,平台已配好 CORS:
app_id 必须作为工具顶层参数,不放进 payload。字段类型只能为
text、integer、number、boolean、date、json,不能用 string 或 varchar。
json 用于对象和数组;不能加 unique/indexed,也不能作为查询过滤参数。
public_read 和 public_replace 默认关闭。共享列表需要时显式开启两项;
修改整个共享列表时须带当前 revision,409 时先重新加载,不能覆盖他人修改。
调用示例:
manage_application(action="table", app_id="<create返回的id>", payload={"name":"entries","columns":[{"name":"name","type":"text","required":true},{"name":"email","type":"text","required":true},{"name":"message","type":"text","required":true}],"public_insert":true})。
先完整定义所有字段,表创建后不通过重新定义修改结构。接口报错时按字段错误修正,
不删掉必填项、访问限制或用户要求的字段来换取成功。
网页提交 POST __api/data/entries,JSON 为 {rows:[{name,email}],request_key:唯一编号}。
访客不能读取、修改或删除记录。站点管理的数据页查看字段、记录和导出。站点可以在「实验室 → 站点」管理 (改可见性 / 版本回滚 / 看访问量 / 查看数据库与 MCP),点站点卡片上的「编辑」按钮可随时 回来通过对话继续修改。
用户:"做一个部门数据看板网站,能看各科室的月度指标,要好看。"
你(路径 B):init 模板 → 问一句"指标数据我先用示例数据占位,之后您可以发我真实数据"
→ 写 3 个 mockup(深色科技风 / 明亮商务风 / 极简卡片风)截图 → choose_design 等用户
选 → 按选中方案实现(antd 布局 + echarts 图表 + 按需定义应用数据库)→ npm run build →
publish_site(title='部门数据看板', src_dir='/workspace/.site-dist/dashboard', source_dir='/workspace/site-src/dashboard') → 交付链接 + 管理/编辑指引。