16 · 明星技能【网站】:webapp-building + backend-building + .websites-templates 深拆

← 返回主报告:Kimi Agent(云端沙箱)技术报告GitHub 原文

合规与风险声明:本报告为安全研究与互操作学习目的的逆向分析,全程只读采集,未对目标系统做任何修改;文中所有密钥、token、账号级标识(chat_id / project_id / tenant_id 等)均已脱敏;沙箱内发现的默认弱口令(VNC/SSH)属平台侧配置,仅作安全发现披露,请勿用于访问任何不属于自己的系统。docx/pdf/xlsx/kimi-slides 等引擎二进制为 Moonshot 专有许可(禁再分发/逆向),本文仅作行为级描述。报告基于单次分析窗口(约 50 分钟生命周期),软件版本与技能库存随镜像更新可能变化。

范围:/app/.agents/skills/webapp-building/(141 行 init 脚本 + 25 套模板目录)、 /app/.agents/skills/backend-building/(650 行 graft 脚本 + 9 个 .mjs 结构化合并器 + base/db/auth 三层模板树 + 6 篇 docs)、 /mnt/portal-overlay/.websites-templates/(13 套运行时模板 zip + info.md,portal FUSE 只读挂载)。 采集方式:HTTP 只读(18080)。采集中段沙箱隧道一度中断(18080 connection refused,约 10:05–10:21Z),恢复后补采完成 docs/ 六篇与 13 份 info.md,全部关键文件均已通读。


1. 总览:两个技能 + 一个 portal 资产目录的分工

webapp-building(前端制品)
  ├─ SKILL.md 121 行:React19+TS+Vite+Tailwind3.4+shadcn/ui;尾部整段 Product Knowledge(平台事实防幻觉)
  ├─ scripts/init-webapp.sh 141 行:解 zip 模板 → 改 <title> → 覆盖预装 node_modules → 注册 app → git 基线提交
  ├─ scripts/.prepare-template.sh:镜像构建期预跑 npm install 生成 scripts/template/node_modules/(运行时零下载)
  ├─ scripts/template/:预装依赖的默认模板工程本体(http.server 直接返回其 index.html,证明是完整 Vite 工程)
  └─ templates/:25 个目录 = 13 套编号模板(0-origin…12-seaside-stay)+ 12 套 *-style 风格模板(airlens/exhibition/exvia/forest/kaleo/lipstick/modo/photographer/playza/shibumi/swiss-dada/villa)

backend-building(后端嫁接,技术含量核心)
  ├─ SKILL.md 274 行:tRPC 11 + Drizzle + Hono + MySQL + Kimi OAuth;10+ 条 NEVER 防御性条款
  ├─ scripts/init.sh 650 行:--features db,auth 增量 graft;.backend-features.json manifest 记账;--template 模式
  ├─ scripts/lib/*.mjs ×9:结构化合并器/补丁器(regex 级,非 AST)
  └─ scripts/template/:base/ db/ auth/ 三层模板 + 预装 node_modules/(85 个顶层包,含 @trpc/*、drizzle-orm、mysql2、jose、@aws-sdk/client-s3、hono、react-router 等)+ package.json(name: backend-building-toolchain)

/mnt/portal-overlay/.websites-templates/(portal 下发的只读资产)
  └─ 13 个目录:每个含 <name>.zip + info.md(+ 0-origin 有个 .DS_Store)
     0-origin / 1-cyber-rain-frontend / 2-color-room-frontend / 3-flow-shader-frontend /
     4-sunset-trip-frontend / 5-dream-run-frontend / 6-ascii-moon-frontend / 7-vortex-gallery-frontend /
     8-liquit-paint-frontend / 9-moon-note-fullstack / 10-calm-space-fullstack / 11-my-blog-fullstack / 12-seaside-stay-fullstack

关键架构事实(与第一轮报告互相印证):

  • /app/.websites-templates/mnt/agents/.websites-templates 都是指向 /mnt/portal-overlay/.websites-templates 的符号链接——模板由 portal 按账号实时下发、可热更新,不烘焙进镜像
  • webapp-building/scripts 下的注释明确写了这一点:”The repository-local templates directory remains a build input for .prepare-template.sh only and is intentionally not a runtime fallback.”

2. webapp-building 详解

2.1 输入输出契约

  • 输入:init-webapp.sh <website-title> [template-name];模板名正则白名单 ^[A-Za-z0-9_-]+$
  • 硬错误(无回退):portal 挂载缺失、模板目录缺失、zip 缺失、info.md 缺失、zip/info.md 是符号链接——全部直接 exit 1。
  • 防目录逃逸:cd -P 解析物理路径后做前缀检查,TEMPLATE_PATH_REAL != MOUNT_ROOT_REAL/* 即拒绝。
  • 输出:固定写到 /mnt/agents/output/app(可用 PROJECT_PATH 环境变量覆盖);模板专属说明通过 stdout 打印 info.md 给 agent 读。

2.2 工作流程(init-webapp.sh 全文已读)

  1. 解压 $TEMPLATE_NAME.zip/tmp/temp-webapp(若解压出同名子目录则下钻一层);
  2. 把 info.md 拷进项目根(留给 agent 读);
  3. sed 替换 index.html<title>(对 / & 做转义);
  4. cp -r 模板文件 + 直接复制 scripts/template/node_modules(这就是冷启动零下载的关键);
  5. 非默认模板(≠0-origin)额外跑一次 npm install --silent 补齐模板特有依赖;
  6. curl -sf -X POST http://localhost:8080/api/v1/apps -d '{"name":..., "features":[]}' 向 portal 注册 app(失败仅警告,不阻塞);
  7. 追加 node_modules 到 .gitignore,git init -b main + 配置 safe.directory + 提交基线 commit chore(webapp-building): init template "..."
  8. 非默认模板把 info.md 全文用分隔线框起来打到 stdout(”TEMPLATE INFO”),供 agent 消费。

2.3 预装 node_modules 的来历(.prepare-template.sh 全文已读,27 行)

镜像构建期跑一次:解 templates/0-origin/0-origin.zip → 在模板目录里 npm install → 把整个工程(含 node_modules)拷到 scripts/template/。运行时 init-webapp.sh 的 cp -r node_modules 全部来源于此——沙箱运行时零 npm 下载,只有非默认模板才需要增量 npm install 补差异依赖。实测 scripts/template/ 是一个完整 Vite 工程(http.server 直接返回它的 index.html),node_modules 顶层 257 个条目;package.json 证实栈为 React 19.2 + Vite 7.2.4 + Tailwind 3.4.19 + 全部 30 个 @radix-ui 包 + recharts/embla/cmdk/sonner/react-hook-form/zod。info.md(0-origin)自述 “Using Node.js 20, Tailwind CSS v3.4.19, and Vite v7.2.4” + 40+ 组件清单 + import 示例——是 init 回显 + agent 说明书二合一。

devDependencies 里有 kimi-plugin-inspect-react: ^1.0.3——Kimi 自己发布的 npm 包(React 元素审查),是预览环境”点选元素定位源码”能力的构建期钩子,随默认模板进入每个产物工程。

2.4 SKILL.md 的 Product Knowledge 段(防幻觉工程)

后半 40 行不是技术文档而是平台事实注入,值得逐条学习:

  • 交付 = 保存 build_version,平台渲染预览并挂”版本卡片”;工具返回 version ID 而非 URL(deploy 关闭),禁止编造 URL;
  • 预览 ≠ 发布:发布是用户手动点「publish」得到 <name>.ok.kimi.link,agent 永远不能说”已上线”;
  • 能力清单:全栈(backend-building)、Kimi 登录内置、公共托管内置、版本回滚、自定义子域、代码导出——并明确”导出的代码不带走 Kimi 登录和平台数据库”;
  • 边界:不支持微信支付/支付宝、不支持第三方 OAuth(只有 Kimi 登录 + 账号密码);
  • 排障话术:预览空白→确认项目在 /mnt/agents/output/app;”数据丢了”→先确认是不是真的全栈;长对话→建议开新会话并导出项目。

3. backend-building 详解(本轮核心)

3.1 graft 增量安装机制(init.sh 650 行全文已读)

设计思想:不重写前端,只增量合并。 前端文件永不替换;后端以 api/contracts/、可选 db/ 的形式”嫁接”到既有 webapp-building 工程上。

三种运行模式:

  • 首跑(无 manifest 无 api/):装 base 基础设施 + 请求的特性(默认 auth,向后兼容);
  • 增量跑(有 manifest):只装 NEW_FEATURES = 请求特性 − 已装特性;无新特性则直接 exit 0(幂等);
  • –template 模式:fullstack 模板 zip(9/10/11/12 号)已把文件铺好并自带 .backend-features.json,脚本跳过所有文件脚手架,只做 portal 注册 + 写 .env + node_modules 覆盖 + npm install + git 提交。与 --features 互斥。

特性解析resolve_features()auth 自动展开为 db auth(依赖闭包),去重、白名单校验。

状态记账.backend-features.json manifest:

{ "version": 1, "features": ["db","auth"], "app_id": "...", "initialized_at": "..." }

遗留工程探测:无 manifest 但有 api/ 时,按 db/schema.ts+drizzle.config.ts(→db)和 api/kimi/(→auth)反推特性,从旧 .envAPP_ID补写 manifest——老工程平滑迁移到新记账体系。

安全网:动任何文件之前,先把工作区未提交的改动 git add -A && commit -m "wip: save changes before backend-building init"。每步完成后再次提交基线。配合 trap ERR 打印”请中止任务并向 Kimi 反馈”。

safe_copy 哲学:目标已存在则跳过并记录到 SKIPPED_FILES(带人类可读的”该文件本应提供什么”描述),结尾统一打印”Skipped (already exist)”清单让 agent 人工核对。用户改过的文件永不被覆盖。

3.2 九个 .mjs 结构化合并器(scripts/lib/,全部已读)

注意:全部基于正则/字符串锚点,不是 AST;每个都幂等(已含目标内容则 exit 0),失败时 init.sh 有兜底(全量替换 vite.config.ts)或降级为人工接线清单(WIRING_TODO)。

脚本逻辑要点
merge-package-json.mjs强制 type:"module";scripts 后端覆盖;deps 只增不改(不覆盖既有版本,避免把前端依赖版本冲掉)
merge-tsconfig.mjs自带 JSONC 解析(去 // 注释、去尾逗号);root tsconfig 加 references: [./tsconfig.server.json] + @contracts/@db/ paths;tsconfig.app.json 额外加 "node" types(因为 trpc.tsx 类型引用 api/router.ts 会拖入 Node 类型)
patch-vite-config.mjs9 步幂等补丁:加 import path、注入 __dirname = import.meta.dirname删除 base:"./"(Hono 必须从 “/” 服务)、加 @contracts/@db/db alias、加 envDir、build.outDir=dist/public、加 @hono/vite-dev-server import 和插件(exclude 非 /api 路径)、server.port=3000
merge-schema.mjs把 users 表定义合入 db/schema.ts:正则提取 export const X = mysqlTable( 得表名做幂等检查;逐条 merge import 符号(同名 from 合并、去重);表体插到 // TODO: 注释之前——即模板 schema 里的 TODO 锚点是有语义的
patch-env-ts.mjs通用工具:向 api/lib/env.ts 的 env 对象最后一个 }; 前插入 JSON 片段描述的属性(如 databaseUrl: required("DATABASE_URL"));按 key 幂等
patch-router-auth.mjsapi/router.ts 最后 import 后插 import { authRouter };找到 ping: 行在其后插 auth: authRouter,——ping 路由是注入锚点
patch-boot-auth.mjsapi/boot.ts 插 OAuth import(优先锚定 env import 行),在 app.use(bodyLimit(...)) 后插 app.get(Paths.oauthCallback, createOAuthCallbackHandler())
wire-main-tsx.mjs<BrowserRouter> 内容包进 <TRPCProvider>,并对包裹内容统一加两格缩进;无锚点则 exit 1 → 降级为人工 TODO
wire-app-tsx.mjs在最后一个 ./pages/ import 后插 Login/NotFound import,在 </Routes> 前插两条 <Route>,缩进自动匹配已有 Route

工程质量评价:锚点选择(ping 路由、bodyLimit 行、// TODO: 注释、最后一个 };)说明模板文件和补丁器是协同设计的;每个补丁器失败都有明确降级路径(fallback 全量替换 / WIRING_TODO 清单),不会出现半残状态。

3.3 模板树三层结构(scripts/template/)

template/
├─ node_modules/          85 个顶层条目(.bin + @aws @hono @trpc @tanstack drizzle-orm mysql2 jose hono react-router…)
├─ package.json           "backend-building-toolchain":全特性依赖合集(npm install 时 --prefer-offline 秒装)
├─ package-lock.json
├─ base/   (首跑必装)
│  ├─ api/  boot.ts(Hono+tRPC fetchRequestHandler+生产模式 serveStatic+动态 import @hono/node-server)
│  │        context.ts(裸 req/resHeaders) middleware.ts(initTRPC+superjson) router.ts(ping 锚点)
│  │        lib/env.ts(required() 仅生产抛错) lib/http.ts(通用 HttpClient) lib/vite.ts(SPA fallback)
│  ├─ contracts/ errors.ts(5 个工厂函数) types.ts(仅 re-export errors)
│  ├─ client-patches/providers/trpc.tsx(httpBatchLink + credentials:include,唯一跨边界 type import)
│  └─ configs/ package.json.feat / tsconfig.server.json / vitest.config.ts / .prettierrc / .gitignore / .dockerignore
├─ db/     (--features db)
│  ├─ db/ schema.ts(空表+TODO 锚点+serial/bigint 注意事项注释) relations.ts seed.ts migrations/.gitkeep
│  ├─ api/queries/connection.ts(lazy getDb() 单例)
│  └─ configs/ drizzle.config.ts(mysql dialect) package.json.feat(db:generate/migrate/push 三脚本)
└─ auth/   (--features auth,自动含 db)
   ├─ api/ context.ts(可选认证:try/catch 附加 ctx.user) middleware.ts(authedQuery/adminQuery 两级)
   │       auth-router.ts(me/logout) queries/users.ts(findUserByUnionId/upsertUser+ownerUnionId→admin)
   │       kimi/ auth.ts(OAuth callback+JWKS 验签+authenticateRequest) platform.ts(/v1/users/me/profile)
   │            session.ts(HS256 JWT, 1 年有效期) types.ts
   │       lib/cookies.ts(localhost→Lax+非 secure,否则 None+secure)
   ├─ db/ schema.users.ts(users 表:serial PK + unionId unique + role enum(user,admin) + $onUpdate 时间戳)
   ├─ contracts/ constants.ts(Session.cookieName="kimi_sid"/Paths/ErrorMessages) types.ts(re-export db/schema+errors)
   ├─ client-patches/ hooks/useAuth.ts pages/Login.tsx pages/NotFound.tsx components/AuthLayout.tsx(可拖宽 sidebar)
   │                 AuthLayoutSkeleton.tsx const.ts(LOGIN_PATH)
   └─ configs/ package.json.feat(含 @aws-sdk/client-s3——头像/文件上传预留)

值得注意的模板设计细节:

  • boot.ts 生产模式用动态 import @hono/node-server 和 vite.ts——开发态由 @hono/vite-dev-server 托管,不加载 node-server;
  • build 脚本是 vite build && esbuild api/boot.ts --bundle + createRequire banner——前后端同一仓库双产物(dist/public + dist/boot.js);
  • env.tsrequired() 只在 production 抛错——开发期允许空值,降低上手摩擦;
  • auth 的 context 是”可选认证”(try/catch 静默),鉴权强制点下放到 authedQuery 中间件——公开/私有路由可以共存;
  • users 表把 OWNER_UNION_ID 匹配的首个登录者自动提升为 admin——零配置管理员。

3.4 Kimi OAuth 与 portal 的对接(凭证流)

这是整个技能组与 Kimi 云耦合最深的部分,两条通道:

通道一:portal 应用注册(沙箱内 → portal:8080)

init.sh → POST http://localhost:8080/api/v1/apps {"name":..., "features":["db","auth"]}
       ← {app_id, app_secret, credentials: {KIMI_AUTH_URL, KIMI_OPEN_URL, DATABASE_URL, ...}}
→ 写 $PROJECT_PATH/.env:APP_ID/APP_SECRET + 派生 VITE_APP_ID/VITE_KIMI_AUTH_URL + 全部 credentials 原样展开
  • webapp-building 也调同一端点但 features:[] 且失败仅警告;backend-building 则失败即死(拿不到 app_id/secret 无法继续)。
  • .env 由 init.sh 生成且 SKILL.md 用 NEVER 条款禁止 agent 修改/重建/占位化其中任何值。
  • manifest 里存 app_id,增量加特性时不会重复注册。

通道二:运行时 OAuth(产物站点 → Kimi 云服务)

  • 前端 Login.tsx 拼 ${VITE_KIMI_AUTH_URL}/api/oauth/authorize?client_id&redirect_uri&response_type=code&scope=profile&state=btoa(redirectUri)
  • 回调 GET /api/oauth/callbackstate atob 回 redirectUri → POST {KIMI_AUTH_URL}/api/oauth/token 换 access_token → jose.createRemoteJWKSet({KIMI_AUTH_URL}/api/.well-known/jwks.json) 验签user_idGET {KIMI_OPEN_URL}/v1/users/me/profile 取昵称头像 → upsertUser → 自签 HS256 会话 JWT(APP_SECRET 签名,1 年)→ 写 kimi_sid cookie 跳回 /
  • cookie 策略按 host 区分:localhost → SameSite=Lax 非 secure;否则 SameSite=None+Secure(跨域预览 iframe 场景)。

即:app_id/secret 由 portal 下发,authorize/token/jwks/profile 四个端点指向 auth.kimi.com/open.kimi.com 体系。没有 portal 就没有 .env;没有 Kimi OAuth 服务 auth 特性整体失效。

3.5 产物验收标准

SKILL.md 把验收写成硬门槛:

  1. npm run checktsc -b)必须零类型错误;
  2. npm run dev 必须起在 3000 端口(端口写死,禁止改);
  3. init 输出出现 “Wiring required” 时必须按 docs/Post-Init-Wiring.md 手动补接线;
  4. 数据层:npm run db:push 同步 schema;NEVER db:push --force、NEVER drop 表修迁移(MySQL 无事务 DDL,给了 4 步恢复流程);
  5. Common Mistakes 11 条:禁止手写 DB 类型(用 typeof table.$inferSelect,对齐 superjson 的 Date 序列化)、禁止裸 SQL、禁止改 api/lib/api/kimi、禁止从前端 import api/(走 @contracts/)、tRPC 客户端名是 trpc 不是 api、必须 Zod 校验 input、FK 必须 bigint(unsigned) 匹配 serial PK……

3.6 docs/ 六篇(全部已读;其中 Database/Development-Guide/Post-Init-Wiring/tRPC 与 swarm 变体逐字节相同,Authentication/Project-Structure 仅差 1-3 行措辞)

  • Authentication.md(242 行):完整 OAuth 2.0 说明——架构(api/kimi/{auth,session,platform}.ts)、Login.tsx 全文内嵌并要求”禁止自写登录页”、无注册流程(首登自动 upsert,注册 CTA 一律指向 LOGIN_PATH)、admin 分配机制(portal 响应的 creator_user_idOWNER_UNION_ID,unionId 匹配即 admin)、三级 procedure 表(publicQuery/authedQuery/adminQuery)。与 swarm 版唯一实质差异:少了 “The supported scope is profile” 和注册流程两句话(swarm 版更新)。
  • Database.md(381 行):Drizzle 纪律——$inferSelect/$inferInsert 代替手写 interface(与 superjson 的 Date 序列化对齐)、MySQL 无 .returning().$returningId()onDuplicateKeyUpdate upsert、db:push(开发)vs db:generate+db:migrate(生产)分流、relations 型联表查询。
  • Project-Structure.md(147 行):完整目录树 + import 别名公约表(@/→src 前端专用、@contracts/→前后端共享、@db/→api 专用;api 内部用相对路径)。
  • tRPC.md(161 行):按特性模块化 router、zod input 强制、superjson 语义、curl 测端点;明确 “db-only 模式 middleware.ts 只导出 publicQuery/createRouter”。
  • Development-Guide.md(260 行):端到端加一个 notes 特性的五步走(schema→queries→router→注册→前端页面)。
  • Post-Init-Wiring.md(38 行):auto-wire 失败时的人工接线两步骤(main.tsx 包 TRPCProvider、App.tsx 加两条 Route)——确定性脚本失败有显式人工兜底文档,闭环完整。

3.7 13 套 portal 模板(/mnt/portal-overlay/.websites-templates/,info.md 全部已读 + zip 尺寸已记录)

zip 尺寸(HEAD content-length):

模板zip 大小类型
0-origin116 KB默认基座(40+ shadcn 组件)
1-cyber-rain90 KB数字雨 hero,AI/深科技落地页
2-color-room31 KB最小的一套
3-flow-shader89 KB流体 shader
4-sunset-trip88 KB旅行
5-dream-run87 KB奔跑动效
6-ascii-moon87 KBASCII 艺术
7-vortex-gallery84 KB画廊
8-liquit-paint88 KB液态颜料(info.md 最长,15.5 KB)
9-moon-note-fullstack167 KBwiki 双链笔记 + D3 知识图谱 + 月相 widget
10-calm-space-fullstack122 KBCHRONOS 计时器 + WebGL 粒子球
11-my-blog-fullstack1.2 MB双语博客 NEURAL ATELIER(含 admin 写作流)
12-seaside-stay-fullstack14.4 MB海景酒店 LUNAMARE(视频 hero,体积大户)

info.md 的统一套路(这是”模板说明书驱动 agent”的范式):

  1. frontend 模板(1-8 号):约定 所有可编辑内容集中在 src/config.ts,禁止改组件文件;info.md 逐个 config 对象给出字段说明 + 字符数约束(如 hero 标题 ≤20 字符、nav CTA ≤15 字符——按渲染宽度推算);开头统一两段”Language/Content”指令(网站语言跟随用户查询语言,内容匹配用户意图)。
  2. fullstack 模板(9-12 号):开头红字警告 “⚠ FULLSTACK — READ FIRST: You MUST use the backend-building skill”,并给出强制流水线 “webapp-building 出模板 → backend-building --template 供应 → 改内容”;zip 内自带 api/ db/ contracts/ Dockerfile .backend-features.json .env.example,manifest 声明 ["auth","db"] 供 init.sh –template 模式消费;内容编辑点是双处src/config.ts + api/notes-router.ts 的 STARTER_NOTES,明确要求两个数组保持同步);未登录用户走 localStorage 降级 + 首登自动 seed 的完整设计。
  3. 小矛盾点:fullstack info.md 写 “Then you must deploy the website”,与 webapp-building SKILL.md 的”agent 不能发布、只有保存版本”存在措辞冲突——实际含义应是”保存 build_version 完成交付”,但对模型是个潜在的歧义源。

另外注意到 webapp 默认模板的 devDependencies 里有 kimi-plugin-inspect-react: ^1.0.3——Kimi 自己发的 npm 包(React 元素审查工具),是预览环境”点选元素定位源码”能力的构建期钩子,随模板进入每个产物工程。

4. 坑与亮点总结

亮点:

  1. 幂等可重入:manifest + 特性差集 + 每个补丁器自检,重复执行安全;
  2. 永不覆盖用户代码:safe_copy + git wip 快照 + 跳过清单;
  3. 锚点协同设计:ping 路由、// TODO: 注释、bodyLimit 行都是预留注入点;
  4. 降级而非失败:补丁失败 → 全量替换或人工 TODO 清单;
  5. 凭证零硬编码:portal 动态下发,.env 生成后冻结;
  6. Product Knowledge 防幻觉:把”预览≠发布””导出不带登录”等产品事实写进技能,直接砍断一类用户投诉。

坑 / 风险:

  1. 正则补丁对用户大改过的文件会失配(wire-*.mjs 直接 exit 1 靠人工);前端若换了 router 库或 main.tsx 结构,接线全废;
  2. merge-tsconfig.mjs 的 JSONC 清洗很糙(只认行首 //、单行 / /),复杂注释会炸;
  3. 会话 JWT 有效期 1 年、无刷新机制(refresh_token 在 TokenResponse 里但代码没用);
  4. state 只是 base64 的 redirectUri,无 CSRF 校验(state 不验随机性),靠 cookie SameSite 兜底;
  5. auth 特性依赖 portal + Kimi OAuth + MySQL 三件套同时可用,任一缺失特性即残;
  6. node_modules 覆盖复制(85 包)后 npm install --prefer-offline 补缺——沙箱无外网时非默认模板的增量 install 会失败。

5. 移植评估

5.1 移植评估表

组件对 Hermes 价值对 Kimi Code 价值移植工作量硬依赖
webapp-building init-webapp.sh(解 zip+复制预装 node_modules+git 基线)中——Hermes 无内置网站制品链,但”预装 node_modules 冷启动”模式可直接借给任何脚手架技能高——Kimi Code 本地有 node/npm,脚本几乎可直接跑;改 PROJECT_PATH 默认值即可需适配(去 portal 注册、模板源改本地目录)node/npm/unzip/git;模板 zip 源
13 套模板 zip + info.md(portal 下发)中——前端模板本身与 Kimi 云无关(React+Vite),可直接离线打包复用高——同上,放 user/plugin scope 即可纯拷贝(zip 无需改造)无(fullstack 模板除外)
4 套 fullstack 模板(9-12 号)低——依赖 portal 供应 + Kimi OAuth中——骨架可复用,需替换供应层需重写(替换 portal 注册与 .env 生成)portal API、Kimi OAuth、MySQL
backend-building init.sh graft 机制(manifest/特性差集/safe_copy/git 快照)高——这套”增量 graft 而非重建”范式可直接搬进 Hermes 的技能工程实践高——机制本身与栈无关需适配(portal 调用替换)git、node
9 个 .mjs 结构化合并器中——正则补丁思路通用,但锚点强耦合模板文件高——连同模板一起搬即可工作纯拷贝(随模板)node
base/db 模板层(Hono+tRPC+Drizzle+MySQL)中——Hermes 用户未必用这套栈;作为”全栈脚手架”参考实现有价值高——本地起 MySQL/SQLite 换 dialect 即可用需适配(数据库连接改本地)MySQL(可换 SQLite)
auth 模板层(Kimi OAuth + JWKS + 会话 JWT)低——强耦合 auth.kimi.com/open.kimi.com 四端点,Hermes 自托管场景无此服务低——同上;除非目标是”给 Kimi 生态建站”需重写(换任意 OIDC provider 的工作量)Kimi OAuth 云服务(不可替代部分)
portal POST /api/v1/apps 凭证下发低——Hermes 无 portal;需自建等效物(本地密钥管理/.env 向导)低——同上需重写portal 沙箱服务(闭源)
Product Knowledge 防幻觉段(预览≠发布、平台边界)高——范式级价值:把产品事实写进技能防模型幻觉,任何平台都该抄高——同上纯拷贝(改写成自己产品的事实)
docs/ 六篇必读文档 + Common Mistakes 条款中——条款本身耦合栈,但”故障经验固化进提示词”的做法通用需适配

5.2 总体判断

  • 可直接带走的(纯拷贝/轻适配):13 套前端模板、9 个合并器、init 脚本骨架、Product Knowledge 写法、验收门槛设计(npm run check 零错误 + 端口固定)。
  • 带不走的:portal 凭证下发、Kimi OAuth 四端点、<name>.ok.kimi.link 托管——这三者是 Kimi 云的闭环,离开了整套 auth/fullstack 特性要换供应层(任何 OIDC + 本地 DB + 自管密钥)。
  • 对 Hermes 最有价值的是范式而非代码:graft 增量合并、manifest 记账、safe_copy 永不覆盖、git 快照兜底、防幻觉产品知识段——这些可以直接写进 Hermes 的技能开发规范。
  • 对 Kimi Code 最有价值的是整套脚手架:Kimi Code 本地具备 node/npm/git,webapp-building 去掉 portal 注册、模板源改为 plugin 内置目录后,可作为 user-scope 技能直接落地;backend-building 把 portal 注册换成”交互式填 .env / 本地密钥链”,db 层换 SQLite(drizzle 支持)即可脱离 Kimi 云。