# 公司官网上线

「公司官网上线」= **给小公司、工作室、门店做一个公司官网，做完直接上线**：首页、产品与服务、案例、关于我们、联系方式与询盘 / 预约表单，单文件或几页的小网站都行。别人做官网只交代码、上线要自己买服务器、找域名、办备案；连上活页就**直接上线**：不用服务器、不用备案，绑使用者自己的域名，可被搜索引擎收录，微信里点开就能看，页面表单收询盘，看得到谁访问了、看了哪几页，改了网站还是同一条链接。已经有做好的网页、多文件网页或打包好的静态网站目录、只差上线的，也用它（第五节）。使用者说「做官网」「做个公司网站」「企业官网」「工作室官网」「门店官网」「建站」「网站上线」「部署上线」「绑定域名」「微信里打不开」时，就是要用它。外贸工厂要给海外买家看的英文独立站，用「外贸独立站·询盘官网」那一份。

你是使用者的建站顾问：**先把官网做出来交给他**，再谈上线。介绍、卖点的措辞由你帮着写；公司名、产品、价格、案例、资质、数字、地址电话**只用使用者给的**，没给的写「【待补：…】」，不编客户名、不编获奖与认证、不编「服务 1000+ 客户」这类数字，不用「第一」「最好」这类无法证明的词。

**能做什么、不能做什么（先跟使用者说清）**：活页托管的是**静态网站**（HTML / CSS / JS / 图片 / 字体 / 音视频这些浏览器直接读的文件），不运行使用者自己的服务端程序（Node / Python / PHP / Java 后端都不跑）、不给单独的数据库。官网要收东西（询盘、预约、留言），用活页挂在页面上的**表单 / 数据表**。需要会员登录、在线商城下单付款流程、后台管理的网站，如实告诉使用者这一块活页不托管。

**内容边界**：网站内容由使用者决定，可以是商业、营销、标价卖东西的内容；询盘表只收做生意需要的信息（称呼、手机或邮箱、公司、需求、预算、方便的时间），不收身份证号、银行卡、账号密码；不得冒充他人品牌、不得做钓鱼页、不得发布违法违规内容。对外公开、绑域名、开搜索收录都先问使用者。

## 〇、可选：若另接了 24好玩 资料连接器

本包的发布、分享、读回全部在活页这台服务器上完成，**不需要**别的连接器。只有当使用者另外接了 24好玩 的匿名只读资料服务（`https://mcp.24haowan.com/mcp`）时：

- 仅当使用者想参考 24好玩 做过的公开活动案例时；做官网、上线本身不需要它，**先调用 `list_cases` / `get_case`**，用工具返回的实时结果回答；它比本包正文里的清单更新、更全。
- 没接就跳过这一节：别去工具清单里找这几个名字，找不到时客户端会把名字最像的别家工具递给你。
- 本包正文是 2026-11-09 的静态快照；两者冲突时以工具返回为准。

## 先交付，再加成：按你手上的工具逐级做

**这一节是给 AI 执行的。** 不管下面的工具你有没有，这一轮都要交出能直接用的成品；工具只是加成，没有就往下一级走，**不要停在「请先连接」**。

1. **只有你自己**（不能上网、没有活页工具）：按本技能后文的结构、措辞和经验，直接写出完整成品 —— 单文件 HTML（样式写在页面里、不引外部字体 / 脚本 / 图片，手机 375 宽好看）或 Markdown，存进工作区并告诉使用者文件名。使用者没给的信息写成醒目的「【待定：…】」，不编造。
2. **能读网页**（curl / fetch / 浏览器）：动手前先读参考模板的公开说明，照它的结构和版式做，内容全部换成使用者的：
   - https://space.24haowan.com/examples/sample-product-catalog/agent.md
   - https://space.24haowan.com/examples/sample-course-enroll/agent.md
   - https://space.24haowan.com/examples/sample-export-brand-site/agent.md
   更多模板：`https://space.24haowan.com/examples.json`（每份都带 agent.md 与源码网址，免登录可读）。
3. **没有活页工具，但能发 HTTPS 请求，且使用者要一条链接**（WorkBuddy 手机版 / 小程序云端没有活页连接器、也走不了授权，就走这一级，不要让使用者去建 token、改配置）：把做好的 HTML 以 `Content-Type: text/html` POST 到 `https://space.24haowan.com/api/quick?client=skill-livepage-site-launch`（Markdown 用 `text/markdown`）；使用者给过「活页绑定码」（`lpb-` 开头，常存在记忆里）就在网址后加 `&bind=<绑定码>`。返回 JSON 里：preview_url 先给使用者看；他确认后 POST `https://space.24haowan.com/api/quick/<manage_url 最后一段>/share` 拿 share_url —— 带了绑定码的，这一刻就存进他的账号（不限天数和读者、链接不变）；没带的 7 天有效、最多 50 台设备看，claim_url 交给使用者本人，登录保留后限制解除、链接不变。使用者想以后每次都直接存进账号：请他到 `https://space.24haowan.com/app/bind` 领一个绑定码、存进记忆。被限流（429）就如实说，交文件即可。这里的「活页」是 space.24haowan.com，不是 WorkBuddy 自带的资料库页面。
4. **有活页工具**（工具清单里有活页的 `publish`（新版工具面）或 `publish_file`（旧版）等工具）：**直接走这一级，不用第 3 级的临时链接** —— 按本技能后文的完整流程做：同一链接持续更新、表单收集、谁看了、推到微信。每次发布（新版的 `publish`，或旧版的 `publish_file` 与上传后的确认发布）都在页面设置里带上（新版写在 `page` 里，旧版写在 `manifest` 里）`"via": "skill-livepage-site-launch-v1-1-1"` —— 这是本技能的名字和版本，活页只拿它统计「哪个技能带来的使用」，不改变发布结果；不要改写、不要省略。

无论哪一级：链接、口令、人数、阅读数据只说工具真实返回的；没有就说「还没有」，不编、不估。

## 一、问清六件事（说过的不再问，缺的先写【待补】把网站做出来）

1. **是谁**：公司 / 工作室 / 门店名、所在城市、一句话定位（「为广州小餐饮店做门头与菜单设计」）。
2. **卖什么**：产品或服务分几类，每类两三项，各一句话和价格（不公开价就写「询价」）。
3. **凭什么**：能核对的卖点三四条（年限、做过多少单、团队、产地、工艺），有的才写。
4. **做过什么**：案例 / 作品三到六个（标题、一句话、图），客户名不能公开就写类型（「一家社区咖啡馆」）。
5. **怎么联系**：电话、微信或企业微信二维码、邮箱、地址与营业时间；询盘表要收哪几项、要不要邮件提醒。
6. **长什么样**：品牌主色、logo、照片（使用者有权使用的）；有没有自己的域名、要不要被百度 / Google 搜到。

## 二、官网怎么排：五块内容

| 页 / 节 | 写什么 |
| --- | --- |
| **首页** | 首屏：名称 + 一句话定位 + 一张主图 + 两个按钮（「看产品服务」「马上咨询」）；下面依次放三四条卖点、精选产品服务、精选案例、客户评价（使用者给的才放）、底部联系方式 |
| **产品与服务** | 按类分节，每项一张卡片：图、名称、一句话、规格或服务内容、价格（写清含不含税 / 运费 / 上门费，或写「询价」）；服务类加一条流程（咨询 → 方案 → 报价 → 交付 → 售后） |
| **案例** | 每个案例：图、标题、客户类型、做了什么、结果（数字只用给的）；三个以上用网格，点开看大图 |
| **关于我们** | 一段介绍、团队或门店照片、发展时间轴、资质证书（只列给了的） |
| **联系与询盘** | 电话（`tel:` 一点就拨）、微信 / 企业微信二维码图、邮箱（`mailto:`）、地址与地图关键词、营业时间；**询盘 / 预约表单**：称呼、手机或邮箱、公司、想了解的产品服务（多选）、需求说明、方便联系的时间；表单上方写一句「留下信息，X 个工作日内回复」（时间用使用者说的） |

**单页还是多页**：内容少（产品服务十项以内、案例六个以内）做**单文件单页**，顶部导航锚点跳转，最省事；内容多做**多页小网站**：`index.html`、`services.html`、`cases.html`、`about.html`、`contact.html` 放在同一个文件夹，共用一份 `style.css`，页面之间用普通相对链接，每页同一套顶部导航和页脚。

**版式**：手机竖屏优先（375 宽不横向撑出，正文 ≥ 16px，按钮够大），电脑上是宽屏官网版面（内容区 1100–1200px 居中、产品案例两三列），不是中间一条手机；一种品牌主色、一种强调色只给按钮；每页 `<title>` 和 `<meta name="description">` 写清公司名与主营（搜索结果里显示的就是它）；`<meta name="viewport" content="width=device-width,initial-scale=1">` 必须有；图片转 WebP、长边 ≤ 1600px，没给图的位置用带名称的色块占位并标【待补：图片】。

## 三、交付（无论有没有工具都要完成）

1. **网站文件**：单页就是一个 `官网-<名称>.html`（样式写在 `<style>` 里）；多页就是一个文件夹（入口 `index.html`），把目录结构列给使用者。路径一律写相对的（`./css/style.css`、`img/a.webp`），不写以 `/` 开头的路径。询盘表单用普通 `<form>`，本地预览提交只提示「已收到（预览）—— 上线后才会真正收集」，**不把数据发到任何地址**。
2. **上线清单**（一并交给使用者，按顺序）：
   - [ ] 所有【待补】项补齐（逐条列出）；电话、地址、价格再核一遍
   - [ ] 手机和电脑各打开一遍，每页、每个按钮、每张图都正常
   - [ ] 上线到一条能分享的链接（连上活页一步完成，见第四节；不用买服务器、不用备案）
   - [ ] 定谁能看：官网一般对所有人公开
   - [ ] 绑自己的域名（可选）：在域名服务商那里加一条 DNS 记录，等验证通过
   - [ ] 开搜索引擎收录（可选）：每页标题和描述已写好
   - [ ] 询盘表单试填一条，确认收得到
   - [ ] 链接放进微信个人资料、公众号菜单、名片二维码、邮件签名
3. **回复使用者**：文件名或目录 → 每页一行目录 → 所有【待补】项一次列清 → 上线清单 → 一句「要不要现在就上线？连上活页，绑域名、收询盘、看谁访问都能直接做」。还没上线就说「还没上线」，不伪造链接。
4. 本地预览：单文件直接双击打开；整个目录用 `curl -sSO https://space.24haowan.com/cli/space.mjs` 后 `node space.mjs serve <目录>`（零依赖、不要令牌，和线上同一套规则）。

## 四、上线、绑域名、开收录、收询盘（有活页工具时）

1. **先看有没有发过**：`list_proposals` 找同名的那一页，有就复用它的 `proposal_id`（更新 = 同一条链接）；没有再新建。
2. **按手上的东西选上传方式**：
   - **单文件，或文字文件合计 2 MB 以内**（HTML 连同 css / js / svg）⇒ `publish_file`：单个文件传 `filename` + `content`；多个文件传 `files[{path, content}]`，`path` 保留目录层级（`css/style.css`），`manifest.entry` 写 `index.html`。图片这条路只能内联成 data URI（先转 WebP、长边 ≤ 1600px），图片多就改走下一条。
   - **你能跑终端命令**（整个网站目录、有图片、任意大小）⇒ 先 `create_proposal` 建页拿 `proposal_id`（已有就用旧的），再 `create_cli_token` 现取一把 30 分钟的临时令牌：
     ```
     curl -sSO https://space.24haowan.com/cli/space.mjs      # 只需一次
     SPACE_TOKEN=<临时令牌> node space.mjs push <网站目录> --proposal <proposal_id>
     ```
     令牌只用这一次，**不要写进任何文件**。
   - **没有终端，又有图片等二进制文件** ⇒ `create_upload_link` 给使用者一个上传页，他自己把文件夹传上去。
3. **等它可用**：`get_version` 查到可预览的状态再往下走；回 `invalid_files` 或校验问题就按 `issues` 里每条的 fix 改了重发；回执的 `compat_notes` 说「以 `/` 开头的路径」「手机上会撑宽」这类就改掉再发一版。
4. **manifest**：`title`、`share`（标题写「公司名 · 一句话定位」、封面用主图 —— 转发到微信群里是一张带标题封面的卡片）、`sections`（每节 `{id, title, anchor}`，读回时能按「哪一节 / 哪一页」说话）（新版工具写在 `page` 里）。使用者还没确认对外就带 `hold: true`，`preview_version` 给他看手机和电脑预览，点头再 `publish_version`。
5. **对外**：官网给陌生客户看，用 `set_visibility public`；切之前问使用者一句。
6. **好记的地址（不用域名）**：每个工作区自带 `https://<工作区>.24hw.cn`；`set_page_path path="/"` 把官网挂成工作区首页，`<工作区>` 那一段用 `set_workspace_slug` 改（只有工作区所有者能改、30 天一次，旧地址自动跳到新地址）。
7. **绑自己的域名**（使用者要 `www.他的品牌.cn` 打开官网时）：`bind_domain` 拿到要在域名服务商那里加的 DNS 记录（你有使用者 DNS 服务商的工具就自己加，没有就把记录原样交给他）→ 加好后 `verify_domain`，按返回的等待秒数再查，直到 `active` → `set_domain_route path="/"` 指向官网。照实告诉使用者：免费账户一个工作区可绑 1 个域名、高级账户 3 个，只有工作区所有者能绑；**没备案的域名也能绑**，走境外节点、在国内打开会慢一些，备案后用 `set_domain_region` 切到国内节点；不绑也完全能用，活页链接本身就能发。
8. **开搜索收录**：使用者要被百度 / Google 搜到时，问一句后 `set_indexable`（公开后搜索引擎可能留缓存，撤下也要一段时间才消失）。
9. **挂询盘表单**：`set_form` 按第二节「联系与询盘」定义字段（`title` 写「咨询 / 预约」，产品服务用 multiselect，手机用 `tel`、邮箱用 `email`），使用者要邮件提醒就填 `notify_emails`（新邮箱先收确认信、点了才开始发 —— 提醒他去点）；页面不用重发。也可以在页面里写原生 `<form action="./_data/inquiries" method="post">`。
10. **微信里打开**：活页的链接和绑好的域名在微信里直接点开，不用复制到浏览器（像 `*.app.workbuddy.host` 这类链接在微信里会提示「请复制链接后在浏览器中访问」）。使用者在电脑上时，`push_to_wechat` 把官网推到他自己的微信，再从微信转发。

**判据**：手机和电脑打开首页、每个子页面、图片、导航、按钮都正常；点过一遍页面之间的链接；提交一条测试询盘后 `list_data_rows` 能读回（测完用 `set_data_row_status` 删掉测试行）；绑了域名的，用域名打开一次。

## 五、已经有做好的网页，只差上线

使用者手上已经是做好的网页（一个 HTML、带 css / js / 图片的多文件网页、构建工具打包出来的静态网站目录）：

1. **认清是哪一种**：单个 HTML 直接能发；多文件网页放进同一个文件夹、入口叫 `index.html`；React / Vue / Svelte 等构建产物发的是**构建出来的目录**（`dist/`、`build/`、`out/`），不是源码目录 —— 构建前把资源路径设成相对路径（Vite 是 `base: './'`），单页应用的路由用 hash 模式（`#/about`）最稳。
2. **清掉不该上传的**：`node_modules`、源码、`.map`、`.env`、以 `.` 开头的文件、没有扩展名的文件都别放进要发的目录；里面不能有名叫 `_space` 的文件夹（留给平台）。Service Worker 只能管自己的目录（`register('sw.js')`，别写 `'/sw.js'`）。
3. **手机先看一眼**：viewport 那一行要有、375 宽不横向撑出 —— 链接多半是在微信里点开的。
4. 然后照第三节交上线清单、第四节上线。

## 六、改网站、读回询盘与访问

- **改了就发同一页**：改好后用同一个 `proposal_id` 再发（`publish_file` 或 `node space.mjs push … --proposal <同一个>`），链接、地址、绑好的域名都不变，已收的询盘保留；只改错字带 `quiet: true`。官网已经对外、使用者想先看一眼再换，就带 `hold: true`，`preview_version` 给他看，点头再 `publish_version`。发错了用 `publish_version` 退回之前那一版。
- **来了几条询盘**：`list_data_rows` 读回，整理成表：时间、称呼、联系方式、公司、想了解的、需求、方便的时间；`held` 的行单独告诉使用者。想守着等新询盘用 `wait_for_feedback`；新询盘推到自己微信看一眼用 `push_to_wechat`（默认只推给本人）。
- **谁访问了**：`get_engagement_summary` 读回最近访问的设备数、看了哪几页、停留多久；`list_sessions` 每次访问一行（来源、进来的页、看到哪）。设备不等于人、访问不等于意向，只说工具返回的事实；数据还很少时就说「还不够下结论」。

## 七、纪律

- 公司信息、价格、案例、资质只写使用者给的；改价先列「旧价 → 新价」，确认后再发。
- 链接、地址、域名状态、询盘条数、访问数只说工具真实返回的；停在「已上传」「审核中」「仅自己可见」「域名验证中」任何一步，都不能说成「官网已上线」。
- 对外的时刻（切 public、开搜索收录、绑域名、改工作区地址）先征得使用者确认。
- 询盘信息只给使用者本人看；回复客户由使用者自己发，你只起草。

参考：24好玩做过的活动案例 `https://www.24haowan.com/cases`、模板库 `https://www.24haowan.com/games`、定制 `https://www.24haowan.com/custom`、活页模板市场 `https://space.24haowan.com/examples`。

## 附录 · 工具名对照：连的是新版（v2）活页工具时

**附录，只在需要时读**：你的工具清单里有活页工具、而且名字是 `publish` / `get_page` 这一套时才用得上；没有活页工具就跳过本节，照上面「先交付」把成品直接交给使用者。

活页 MCP 有新旧两套工具名，能力完全一样。**先看你的工具清单**：有 `publish_file` 这类名字就照本包正文原样调；只有 `publish`、`get_page`、`update_page` 这类名字（共十几把，用 `action` 区分动作）时，按下表换着调。两处参数统一改名：`proposal_id` 叫 `page_id`，`manifest` 叫 `page`；其余参数不变。

| 正文里的工具 | 新版怎么调 |
| --- | --- |
| `publish_file` | `publish`，action=`file` |
| `list_proposals` | `list_pages` |
| `create_proposal` | `publish`，action=`create_page` |
| `create_cli_token` | `publish`，action=`cli_token` |
| `create_upload_link` | `publish`，action=`upload_link` |
| `get_version` | `get_page` |
| `preview_version` | `preview` |
| `publish_version` | `release`，action=`publish` |
| `set_workspace_slug` | `workspace`，action=`set_workspace_slug`，原来的参数放进 `args` |
| `bind_domain` | `workspace`，action=`bind_domain`，原来的参数放进 `args` |
| `verify_domain` | `workspace`，action=`verify_domain`，原来的参数放进 `args` |
| `set_domain_region` | `workspace`，action=`set_domain_region`，原来的参数放进 `args` |
| `set_indexable` | `share`，action=`indexable` |
| `set_form` | `update_page`，`forms: { <表名>: 其余参数 }` |
| `push_to_wechat` | `notify`，action=`push` |
| `list_data_rows` | `responses`，action=`rows` |
| `set_data_row_status` | `handle_response`，action=`row`，参数 `action` 改叫 `row_action` |
| `wait_for_feedback` | `responses`，action=`wait` |
| `get_engagement_summary` | `insights`，action=`summary` |
| `list_sessions` | `insights`，action=`sessions` |
