← 返回主报告: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.shonly 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 全文已读)
- 解压
$TEMPLATE_NAME.zip到/tmp/temp-webapp(若解压出同名子目录则下钻一层); - 把 info.md 拷进项目根(留给 agent 读);
- sed 替换
index.html的<title>(对/&做转义); cp -r模板文件 + 直接复制scripts/template/node_modules(这就是冷启动零下载的关键);- 非默认模板(≠0-origin)额外跑一次
npm install --silent补齐模板特有依赖; curl -sf -X POST http://localhost:8080/api/v1/apps -d '{"name":..., "features":[]}'向 portal 注册 app(失败仅警告,不阻塞);- 追加
node_modules到 .gitignore,git init -b main+ 配置 safe.directory + 提交基线 commitchore(webapp-building): init template "..."; - 非默认模板把 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)反推特性,从旧 .env 读 APP_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.mjs | 9 步幂等补丁:加 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.mjs | 向 api/router.ts 最后 import 后插 import { authRouter };找到 ping: 行在其后插 auth: authRouter,——ping 路由是注入锚点 |
patch-boot-auth.mjs | 向 api/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.ts的required()只在 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/callback:stateatob 回 redirectUri →POST {KIMI_AUTH_URL}/api/oauth/token换 access_token → jose.createRemoteJWKSet({KIMI_AUTH_URL}/api/.well-known/jwks.json) 验签 取user_id→GET {KIMI_OPEN_URL}/v1/users/me/profile取昵称头像 → upsertUser → 自签 HS256 会话 JWT(APP_SECRET 签名,1 年)→ 写kimi_sidcookie 跳回/; - 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 把验收写成硬门槛:
npm run check(tsc -b)必须零类型错误;npm run dev必须起在 3000 端口(端口写死,禁止改);- init 输出出现 “Wiring required” 时必须按 docs/Post-Init-Wiring.md 手动补接线;
- 数据层:
npm run db:push同步 schema;NEVERdb:push --force、NEVER drop 表修迁移(MySQL 无事务 DDL,给了 4 步恢复流程); - Common Mistakes 11 条:禁止手写 DB 类型(用
typeof table.$inferSelect,对齐 superjson 的 Date 序列化)、禁止裸 SQL、禁止改api/lib/api/kimi、禁止从前端 importapi/(走@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_id→OWNER_UNION_ID,unionId 匹配即 admin)、三级 procedure 表(publicQuery/authedQuery/adminQuery)。与 swarm 版唯一实质差异:少了 “The supported scope isprofile” 和注册流程两句话(swarm 版更新)。 - Database.md(381 行):Drizzle 纪律——
$inferSelect/$inferInsert代替手写 interface(与 superjson 的 Date 序列化对齐)、MySQL 无.returning()用.$returningId()、onDuplicateKeyUpdateupsert、db:push(开发)vsdb: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-origin | 116 KB | 默认基座(40+ shadcn 组件) |
| 1-cyber-rain | 90 KB | 数字雨 hero,AI/深科技落地页 |
| 2-color-room | 31 KB | 最小的一套 |
| 3-flow-shader | 89 KB | 流体 shader |
| 4-sunset-trip | 88 KB | 旅行 |
| 5-dream-run | 87 KB | 奔跑动效 |
| 6-ascii-moon | 87 KB | ASCII 艺术 |
| 7-vortex-gallery | 84 KB | 画廊 |
| 8-liquit-paint | 88 KB | 液态颜料(info.md 最长,15.5 KB) |
| 9-moon-note-fullstack | 167 KB | wiki 双链笔记 + D3 知识图谱 + 月相 widget |
| 10-calm-space-fullstack | 122 KB | CHRONOS 计时器 + WebGL 粒子球 |
| 11-my-blog-fullstack | 1.2 MB | 双语博客 NEURAL ATELIER(含 admin 写作流) |
| 12-seaside-stay-fullstack | 14.4 MB | 海景酒店 LUNAMARE(视频 hero,体积大户) |
info.md 的统一套路(这是”模板说明书驱动 agent”的范式):
- frontend 模板(1-8 号):约定 所有可编辑内容集中在
src/config.ts,禁止改组件文件;info.md 逐个 config 对象给出字段说明 + 字符数约束(如 hero 标题 ≤20 字符、nav CTA ≤15 字符——按渲染宽度推算);开头统一两段”Language/Content”指令(网站语言跟随用户查询语言,内容匹配用户意图)。 - fullstack 模板(9-12 号):开头红字警告 “⚠ FULLSTACK — READ FIRST: You MUST use the
backend-buildingskill”,并给出强制流水线 “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 的完整设计。 - 小矛盾点: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. 坑与亮点总结
亮点:
- 幂等可重入:manifest + 特性差集 + 每个补丁器自检,重复执行安全;
- 永不覆盖用户代码:safe_copy + git wip 快照 + 跳过清单;
- 锚点协同设计:ping 路由、
// TODO:注释、bodyLimit 行都是预留注入点; - 降级而非失败:补丁失败 → 全量替换或人工 TODO 清单;
- 凭证零硬编码:portal 动态下发,.env 生成后冻结;
- Product Knowledge 防幻觉:把”预览≠发布””导出不带登录”等产品事实写进技能,直接砍断一类用户投诉。
坑 / 风险:
- 正则补丁对用户大改过的文件会失配(wire-*.mjs 直接 exit 1 靠人工);前端若换了 router 库或 main.tsx 结构,接线全废;
merge-tsconfig.mjs的 JSONC 清洗很糙(只认行首//、单行/ /),复杂注释会炸;- 会话 JWT 有效期 1 年、无刷新机制(
refresh_token在 TokenResponse 里但代码没用); state只是 base64 的 redirectUri,无 CSRF 校验(state 不验随机性),靠 cookie SameSite 兜底;- auth 特性依赖 portal + Kimi OAuth + MySQL 三件套同时可用,任一缺失特性即残;
- 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 云。