mcpField
H
here-now

here-now

github.com/heredotnow云与 DevOps5017.3k 次安装今天更新
代码仓库

关于 here-now

here-now 是一项帮助 Agent 将网站和文件发布到在线 URL 的技能,支持个人与团队发布、访问控制及版本管理。

主要功能

  1. 01将文件或文件夹发布为在线 URL
  2. 02密码和邀请制访问控制
  3. 03共享工作区发布
  4. 04自定义域名和个性化 URL
  5. 05不可变站点版本与回滚

适用场景

  1. 01从本地文件夹上线网站
  2. 02通过在线 URL 分享文件
  3. 03向团队工作区发布站点
  4. 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 功能、特性或工作流的问题前,请先阅读当前文档:

→ https://here.now/docs

请在以下情况下阅读文档:

  • 对话中首次讨论 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 密钥(按顺序匹配,使用第一个匹配项):

  1. --api-key {key} 标志(仅用于 CI/脚本编写场景——交互使用时请避免)
  2. $HERENOW_API_KEY 环境变量
  3. ~/.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 小时)升级为永久站点:

  1. 向用户询问其电子邮件地址。
  2. 请求一次性登录码:
curl -sS https://here.now/api/auth/agent/request-code \
  -H "content-type: application/json" \
  -d '{"email": "[email protected]"}'
  1. 告诉用户:“请检查收件箱,查找 here.now 发送的登录码,并将其粘贴到这里。”
  2. 验证登录码并获取 API 密钥:
curl -sS https://here.now/api/auth/agent/verify-code \
  -H "content-type: application/json" \
  -d '{"email":"[email protected]","code":"ABCD-2345"}'
  1. 自行保存返回的 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 数据、搜索、分析、个人资料、删除、元数据、访问控制、域名、变量、代理路由、复制等——请参阅当前文档:

→ https://here.now/docs

完整文档:https://here.now/docs

评论

支持 Markdown