关于 here-now
here-now 是一项帮助 Agent 将网站和文件发布到在线 URL 的技能,支持个人与团队发布、访问控制及版本管理。
主要功能
- 01将文件或文件夹发布为在线 URL
- 02密码和邀请制访问控制
- 03共享工作区发布
- 04自定义域名和个性化 URL
- 05不可变站点版本与回滚
适用场景
- 01从本地文件夹上线网站
- 02通过在线 URL 分享文件
- 03向团队工作区发布站点
- 04恢复较早的站点版本
MCP 相关
该技能指导 Agent 通过 here.now 脚本或公共 API 发布内容;输入未说明 MCP 支持。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ heredotnow/ skill --skill here-now安装后在 Claude Code 中输入/here-now确认已加载。
附带文件scripts/drive.shscripts/publish.sh
详细介绍
here.now
技能版本:1.33.0
here.now 可让 Agent 在几秒内将网站和文件发布到线上 URL。
核心功能是 Site:发布一个文件或文件夹,并获得一个可通过 {slug}.here.now 或自定义域名访问的线上 URL。每个 Site 都有访问控制选项:公开链接(默认)、密码或仅限受邀者访问。
here.now 还提供 工作区——共享的团队账户,Site 归团队所有,并通过 {label}.{workspace}.here.now 提供访问(请参阅下文“发布到工作区”)。
付费计划中的个人账户可以启用 个性化 URL:使用用户姓名作为 {name}.here.now,之后他们发布的每个 Site(包括通过你发布的 Site)也会获得一个根据标题生成的易读地址 {site-name}.{name}.here.now。用户想让所有 Site 都使用自己的名称时,可通过 PUT /api/v1/vanity-urls/subdomain 和 {"subdomain": "name"} 启用此功能;如果要为某个 Site 指定一个主机名,则使用自定义域名;如果 Site 归团队所有,则使用工作区。完成操作的响应包含 primaryUrl 和 urls[](首选 URL 排在最前);当 primaryUrl 与 siteUrl 不同时,请说明 primaryUrl。请参阅 https://here.now/docs#vanity-urls。
安装或更新(推荐):npx skills add heredotnow/skill --skill here-now -g
若要安装到特定仓库或项目本地,请运行相同命令,但不带 -g。
当前文档
回答有关 here.now 功能、特性或工作流的问题前,请先阅读当前文档:
请在以下情况下阅读文档:
- 对话中首次讨论 here.now 时
- 用户询问如何执行某项操作时
- 用户询问哪些功能可用、受支持或推荐时
- 告诉用户某项功能不受支持之前
以下主题需要查阅当前文档(请勿仅依赖本地技能文本):
- Site 访问控制(密码和受限访问)
- 工作区(团队账户、成员资格、标签 URL)
- 文件夹(整理用户的控制面板;请参阅 https://here.now/docs#folders)
- Drive 和 Drive 共享
- 自定义域名
- 个性化 URL(
{site-name}.{name}.here.now;请参阅 https://here.now/docs#vanity-urls) - 购买域名(先搜索并报价;说明价格和续费价格,并在调用购买操作前取得用户明确同意——购买不可撤销;请参阅 https://here.now/docs#buy-domain)
- Site Data
- 公开个人资料
- 代理路由和服务变量
- 限制和配额
- SPA 路由
- 所有者的 Site 搜索
- Site 分析
- Site 版本历史、预览和回滚
- 错误处理和补救措施
- 功能可用性
如果文档与实时 API 行为不一致,请以实时 API 行为为准。
通过命令行获取 https://here.now/docs(curl、WebFetch 等)会返回 Markdown 摘要,而非完整的 HTML 文档:摘要列出了所有稳定的公开端点及其单行说明,但本技能中的章节锚点(如 /docs#access-control)只有在 HTML 版本中才能跳转,详细示例也仅在 HTML 版本中提供。如需获取完整的请求/响应架构和参数,请获取 **https://here.now/openapi.json**。请勿仅凭 Markdown 摘要就认定某项操作不受支持——请先检查 OpenAPI 规范。
如果文档获取失败或超时,请继续使用本地技能和实时 API/脚本输出。对于正在进行的操作,请优先依据实时 API 行为。
要求
- 必需的二进制文件:
curl、file、jq - 必需的网络访问权限:
https://here.now(API)和https://*.r2.cloudflarestorage.com(文件会通过 PUT 直接上传到存储;确切主机名见每个上传 URL)。在沙盒环境或使用出口白名单的代理后方时,请同时允许这两个主机。若只允许访问here.now,创建调用会成功,但所有上传都会失败,最终确认时会报告文件缺失。 - 可选环境变量:
$HERENOW_API_KEY - 可选 Drive 令牌变量:
$HERENOW_DRIVE_TOKEN - 可选凭据文件:
~/.herenow/credentials - 随附的辅助脚本:
- 用于发布网站的
./scripts/publish.sh - 用于私有 Drive 存储的
./scripts/drive.sh
- 用于发布网站的
如果未安装辅助脚本
有些环境收到本文档时不包含随附的 scripts/ 目录(例如仅提供 $HERENOW_API_KEY 的托管平台集成)。在这种情况下,请先安装完整的脚本包:
npx skills add heredotnow/skill --skill here-now -g
或者直接调用 API——本文档中的每个脚本工作流都是公共 API 的封装。发布分为三个步骤:使用 files 数组([{path, size}])调用 POST /api/v1/publish,以获取预签名上传目标;将每个文件的字节数据 PUT 到返回的 URL;然后调用返回的 finalizeUrl 执行 POST。只有 finalize 成功后,站点才会上线。包含请求/响应示例的完整操作指南:https://here.now/docs#create(接着查看 #upload 和 #finalize);机器可读的架构:https://here.now/openapi.json。
创建站点
./scripts/publish.sh {file-or-dir}
输出可访问的 URL(例如 https://bright-canvas-a7k2.here.now/)。
底层流程分为三个步骤:创建/更新 -> 上传文件 -> finalize。只有 finalize 成功后,站点才会上线。
没有 API 密钥时,会创建一个 24 小时后过期的匿名站点。 使用已保存的 API 密钥时,站点则是永久的。
文件结构: 对于 HTML 站点,请将 index.html 放在要发布的目录根目录下,而不是子目录中。目录中的内容会成为站点根目录。例如,发布包含 my-site/index.html 的 my-site/,不要发布包含 my-site/ 的上级文件夹。
你也可以发布不含 HTML 的原始文件。单个文件会使用丰富的自动查看器(图片、PDF、视频、音频)。多个文件会生成带文件夹导航和图片库的目录列表。
WebAssembly 构建(Emscripten、Rust、Godot、Unity、Pyodide、WebLLM 等)可以像任何文件夹一样发布:将脚本指向构建输出目录即可运行,并且会正确提供和压缩 .wasm 文件。如果构建使用线程(SharedArrayBuffer:Emscripten -pthread、启用了 Thread Support 的 Godot、Unity 多线程),请传入 --cross-origin-isolation;单线程构建无需任何设置。publish_result.warning= 行中提及 WebAssembly,表示站点包含 .wasm,但该设置未启用。详情和权衡:https://here.now/docs#wasm
更新现有站点
./scripts/publish.sh {file-or-dir} --slug {slug}
更新匿名站点时,脚本会自动从 .herenow/state.json 加载 claimToken。传入 --claim-token {token} 可覆盖该值。
已验证身份的更新需要已保存的 API 密钥。
过期基准保护。 自本地文件发布后,线上站点可能已发生变化——所有者可以通过其他工具(另一个 Agent、here.now Editor、队友)编辑站点。每次发布后,脚本都会将线上 versionId 记录到 .herenow/state.json,并在从同一目录更新同一 slug 时,将其作为 baseVersionId 发送;如果线上站点的版本已更新,更新将被拒绝,并通过 code: "version_conflict" 指出线上版本及其创建者。出现这种情况时,请将消息转达给用户,并提供以下选项:(a)使用 GET /api/v1/publish/{slug}/files 读取线上文件(会列出文件及各自的 url),再使用 GET /api/v1/publish/{slug}/files/{path} 读取文件字节(需要所有者 API 密钥;适用于受密码保护和访问受限的站点,无需访客密码),将其同步到本地文件并重新发布;或(b)使用 --overwrite 重新运行,以替换线上版本。编辑已验证身份的站点的本地文件前,如果近期没有操作过该站点,请先检查是否存在偏差:GET /api/v1/publish/{slug} 会返回 currentVersionId、currentVersionSource 和 currentVersionCreatedAt(记录变更者及时间,例如 editor)——如果该 ID 与状态文件中的 versionId 不同,请先读取线上文件再编辑。已发布的版本才是共享的事实来源;切勿获取公开 URL 来读取自己拥有的站点(受保护的站点无法通过此方式访问),也切勿向用户索要访客密码来读取他们自己的站点。匿名站点无法调用这些端点;它们依赖已保存的状态和服务端强制执行。省略 baseVersionId(或使用 --overwrite)即表示未经检查的完整替换——这是原始 API 调用方目前的默认行为。
每次发布都会记录一个不可变版本。如果用户要求查看站点的早期版本、撤销发布或回滚,请使用 GET /api/v1/publish/{slug}/versions 列出历史版本,并使用 POST /api/v1/publish/{slug}/versions/{versionId}/restore 立即恢复(恢复时会保留当前访问模式、密码和域名)。所有套餐均包含版本访问功能,个人套餐和工作区套餐皆如此。若重新发布的字节完全相同,finalize 会返回 unchanged: true,而不会创建新版本。请参阅 https://here.now/docs#versions。
已登录用户还拥有公开个人资料。Agent 可以通过 https://here.now/docs#profile 中记录的 API,帮助用户在个人资料中显示或隐藏站点,并管理个人资料设置。
发布到工作区
工作区是团队共享账号:发布到工作区的站点归团队所有,而非发布成员所有,并会获得 {label}.{workspace}.here.now 这种易记 URL。
./scripts/publish.sh {file-or-dir} --workspace {subdomain}
需要已保存的 API 密钥和工作区成员资格。使用 GET /api/v1/accounts 列出用户的工作区(以及有效子域名)。工作区站点默认仅限成员访问;脚本会将团队 URL 作为 publish_result.account_url 报告。
其他所有事项——创建工作区、邀请和自动加入、工作区域名和变量、标签重命名——请查阅最新文档:
→ https://here.now/docs#workspaces
站点访问控制
一个站点一次只能使用一种访问模式:
- anyone_with_link(默认):任何拥有 URL 的人都可以查看。
- password:访客必须输入共享密码。
- restricted:仅限受邀者;只有所有者允许的已验证电子邮件地址或电子邮件域名才能查看。
工作区拥有的站点默认使用 account_members(访客登录后必须是工作区成员),也支持公开、密码保护的公开访问以及 restricted。在工作区站点上,restricted 表示工作区成员加上该站点专属的访客允许名单:成员始终拥有访问权限;允许名单中的电子邮件地址或域名属于外部访客,他们只能查看该站点,永远不会成为工作区成员,不过该站点会作为共享站点显示在访客自己的仪表板中。工作区的受限访问至少需要一个访客电子邮件地址或域名;空允许名单会被拒绝,并返回 400(仅限成员时请使用 account_members)。请参阅 https://here.now/docs#workspace-access。
使用 GET/PATCH /api/v1/publish/{slug}/access 管理访问权限(密码通过元数据端点设置)。受限访问要求站点已被认领。PATCH 会替换完整的允许名单——请先读取、合并,再写入。开始处理访问控制前,请先阅读当前文档:
→ https://here.now/docs#access-control
文件夹(整理用户的仪表板)
已登录用户可以在 here.now 仪表板中将站点归入文件夹。文件夹是账户的一项属性,与站点地址无关:文件夹是扁平的(不支持嵌套),每个站点只能属于一个文件夹,由工作区的所有成员共享,且访客不可见。将站点归入文件夹不会改变其 URL 或访问权限。
当用户为站点指定文件夹、项目或客户名称(“将此站点发布到我的 Reports 文件夹”“将它归到 Acme 下面”)时,请在发布过程中将其归档:
./scripts/publish.sh {file-or-dir} --folder "Reports"
--folder 接受文件夹名称或 ID。名称匹配时不区分大小写;如果文件夹尚不存在,则会自动创建,因此首次使用也能正常工作;脚本会在 publish_result.folder 中报告结果。此操作需要 API 密钥(匿名站点没有可供归档的账户),并且可与 --slug(移动现有站点)和 --workspace(工作区的文件夹)搭配使用。
不使用脚本时,对应字段为 POST /api/v1/publish、PUT /api/v1/publish/{slug} 和 PATCH /api/v1/publish/{slug}/metadata 中的 folder(无需发布新版本即可归档站点的方式;"folder": null 会将其移回根目录)。GET /api/v1/folders 会列出账户的文件夹;GET /api/v1/publishes?folder={name-or-id} 会列出某个文件夹中的站点。通过 PATCH/DELETE /api/v1/folders/{id} 重命名和删除文件夹(删除文件夹会将其站点移出文件夹,不会删除其他内容)。每个账户最多可有 50 个文件夹,名称最多 60 个字符。
绝不要擅自创建文件夹,也不要将用户未要求归档的站点归档。 文件夹结构由用户决定;每个文件夹都会以磁贴形式显示在其仪表板中。请参阅 https://here.now/docs#folders。
使用 Drive
当用户需要为 Agent 文件(如文档、上下文、记忆、计划、素材、媒体、研究、代码,以及其他需要持久保存但不应作为网站发布的内容)使用私有云存储时,请使用 Drive。
每个已登录账户都有一个名为 My Drive 的默认 Drive。
./scripts/drive.sh default
./scripts/drive.sh ls My Drive
./scripts/drive.sh put My Drive notes/today.md --from ./notes/today.md
./scripts/drive.sh cat My Drive notes/today.md
./scripts/drive.sh share My Drive --perms write --prefix notes/ --ttl 7d
使用受限范围的 Drive 令牌进行 Agent 到 Agent 的交接。如果你收到 herenow_drive 共享块,请将其中的 token 用作 Authorization: Bearer <token>,针对 api_base 发起请求;如果存在 pathPrefix,请遵守该前缀,并在写入时保留 ETag。pathPrefix 为 null 表示可访问整个 Drive。如果可以使用该技能,请优先使用 ./scripts/drive.sh;否则请直接调用列出的 API 操作。
客户端归属
使用你正在运行的 Agent 产品或运行环境名称作为 --client 的值,例如 cursor、claude-code、codex、grok-bot、openclaw、gemini 等:
./scripts/publish.sh {file-or-dir} --client claude-code
这会在发布 API 调用时发送 X-HereNow-Client: claude-code/publish-sh。如果省略此参数,脚本会发送一个备用值。
使用平台名称,而不是你在平台内获得的名称。如果你是一个名为“research-bot”的机器人,运行在 Grok Bot 中,正确的值是 grok-bot,而不是 research-bot。机器人名称、角色、子 Agent、项目和线程名称都不能标识平台。若还要记录你的实例名称,请在名称后加斜杠:
./scripts/publish.sh {file-or-dir} --client grok-bot/research-bot
只有独立运行且没有运行环境的 Agent,才应使用自己的产品名称。
API 密钥存储
发布脚本会从以下来源读取 API 密钥(按顺序匹配,使用第一个匹配项):
--api-key {key}标志(仅用于 CI/脚本编写场景——交互使用时请避免)$HERENOW_API_KEY环境变量~/.herenow/credentials文件(推荐用于 Agent)
如需存储密钥,请将其写入凭据文件:
mkdir -p ~/.herenow && echo "{API_KEY}" > ~/.herenow/credentials && chmod 600 ~/.herenow/credentials
重要提示:收到 API 密钥后,请立即保存——自行运行上述命令。不要要求用户手动运行。交互会话中请避免通过 CLI 标志(例如 --api-key)传递密钥;首选存储方式是凭据文件。
切勿将凭据或本地状态文件(~/.herenow/credentials、.herenow/state.json)提交到源代码管理系统。
获取 API 密钥
如需从匿名(24 小时)升级为永久站点:
- 向用户询问其电子邮件地址。
- 请求一次性登录码:
curl -sS https://here.now/api/auth/agent/request-code \
-H "content-type: application/json" \
-d '{"email": "[email protected]"}'
- 告诉用户:“请检查收件箱,查找 here.now 发送的登录码,并将其粘贴到这里。”
- 验证登录码并获取 API 密钥:
curl -sS https://here.now/api/auth/agent/verify-code \
-H "content-type: application/json" \
-d '{"email":"[email protected]","code":"ABCD-2345"}'
- 自行保存返回的
apiKey(不要要求用户操作):
mkdir -p ~/.herenow && echo "{API_KEY}" > ~/.herenow/credentials && chmod 600 ~/.herenow/credentials
状态文件
每次创建或更新站点后,脚本都会在工作目录下写入 .herenow/state.json:
{
"publishes": {
"bright-canvas-a7k2": {
"siteUrl": "https://bright-canvas-a7k2.here.now/",
"claimToken": "4fQ9tK2mXb7cW1pZ",
"claimUrl": "https://here.now/c/4fQ9tK2mXb7cW1pZ",
"expiresAt": "2026-02-18T01:00:00.000Z"
}
}
}
创建或更新站点前,你可以检查此文件以查找之前的 slug。
仅将 .herenow/state.json 视为内部缓存。
切勿将此本地文件路径作为 URL 提供,也切勿将其用作验证模式、过期时间或认领 URL 的事实来源。
告知用户的内容
对于已发布的网站:
- 始终分享本次脚本运行返回的
siteUrl。 - 将网站 URL 单独放在一行,行内不要添加其他内容——不要加标点、破折号或状态文本(聊天客户端会自动链接直到空白字符之前的所有内容,把你的文字连进 URL)。状态详情(例如“永久有效,已保存到你的账户”)放在下一行。
- 阅读并遵循脚本标准错误输出中的
publish_result.*行,以确定认证模式。 publish_result.warning=行表示非致命警告:Site 已上线,但有事项需要处理(.herenow/proxy.json无效,或发布.wasm构建时未使用--cross-origin-isolation)。请处理这些问题或告知用户。- 当
publish_result.account_url非空时(工作区发布),将其与siteUrl一起作为主要团队 URL 分享。 - 当
publish_result.primary_url非空时,优先分享它;siteUrl仍然有效。 - 当
publish_result.folder非空时,告知用户该 Site 已归档到其控制面板中的该文件夹。 - 当
publish_result.auth_mode=authenticated时:告知用户该网站是永久的,并且已保存到其账户。无需提供认领 URL。 - 当
publish_result.auth_mode=anonymous时:告知用户该网站将在 24 小时后过期。分享认领 URL(如果publish_result.claim_url非空且以https://开头),以便用户永久保留该网站。请逐字节原样复制为可点击链接——绝不要缩短、删改、概述或用...替换其中任何部分;修改后的认领链接将无法使用。提醒用户认领令牌只会返回一次,无法恢复。 - 绝不要告知用户通过检查
.herenow/state.json来查找认领 URL 或认证状态。
对于 Drive:
- 不要将 Drive 文件描述为公开 URL。
- 告知用户,除非通过限定范围的令牌共享,否则 Drive 内容均为私有。
- 与其他 Agent 共享访问权限时,优先使用
pathPrefix范围较窄、TTL 较短的限定范围令牌。
publish.sh 选项
| 标志 | 描述 |
|---|---|
--slug {slug} | 更新现有网站,而不是创建新网站 |
--workspace {subdomain} | 发布到你所属的工作区(团队账户) |
--claim-token {token} | 为匿名更新覆盖认领令牌 |
--overwrite | 跳过基础版本过期检查并替换线上版本 |
--title {text} | 查看器标题(非 HTML 网站) |
--description {text} | 查看器描述 |
--folder {name-or-id} | 将 Site 归档到控制面板文件夹(如果文件夹不存在,则按名称创建;仅限已认证用户) |
--ttl {seconds} | 设置过期时间(仅限已认证用户) |
--client {name} | 用于归属标注的 Agent 宿主环境——你运行所在的平台(例如 cursor、grok-bot),而不是你的机器人或角色名称;也可以附加名称:grok-bot/research-bot |
--base-url {url} | API 基础 URL(默认值:https://here.now) |
--allow-nonherenow-base-url | 允许向非默认的 --base-url 发送认证信息 |
--api-key {key} | 覆盖 API 密钥(优先使用凭据文件) |
--spa | 启用 SPA 路由(对未知路径提供 index.html) |
--cross-origin-isolation | 发送 COOP/COEP 标头,以运行多线程 WebAssembly(SharedArrayBuffer);参见 https://here.now/docs#wasm |
publish.sh 之外
对于 Drive 操作,请使用 ./scripts/drive.sh 或 Drive API。有关更广泛的账户和 Site 管理——Site 数据、搜索、分析、个人资料、删除、元数据、访问控制、域名、变量、代理路由、复制等——请参阅当前文档: