--- slug: fmode-skill-core-guide displayName: skill-core-guide version: 1.0.0 summary: Fmode Harness 平台母技能标准指南 —— 平台端点真值表、ESM-first 四端标准、四渠道分发、六项自动质检、一键凭证供给、新技能脚手架。 license: MIT tags: [fmode, harness, skill, standard, spec, esm, scaffold, meta] --- # skill-core-guide · Fmode Harness 平台母技能标准指南 > 一份**可独立阅读**的技能开发规范。读它不需要先读任何别的文档。 > 它是 Fmode 技能生态的「宪法」——定义平台真值、包结构、分发渠道、质检标准。 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) **技能名**:`skill-core-guide` | **npm**:`skill-core-guide` | **skillhub**:`fmode-skill-core-guide` --- ## 目录 - [零、给 Agent 的 60 秒速览](#零给-agent-的-60-秒速览) - [一、Fmode Harness 平台基础设施规范](#一fmode-harness-平台基础设施规范) - [二、技能分类体系](#二技能分类体系) - [三、ESM-first 多端可用打包标准](#三esm-first-多端可用打包标准) - [四、多渠道分发机制](#四多渠道分发机制) - [五、自动质检与看板机制](#五自动质检与看板机制) - [六、一键凭证供给机制](#六一键凭证供给机制) - [七、新技能开发 SOP](#七新技能开发-sop) - [八、事故复盘:本规范为什么这么写](#八事故复盘本规范为什么这么写) - [九、附录](#九附录) --- ## 零、给 Agent 的 60 秒速览 你要开发一个新技能?按这个顺序做,不要跳步: ```bash # 1. 脚手架 npx --yes skill-core-guide@latest init my-skill --name skill-my-skill cd skill-my-skill # 2. 写三处:技能契约 / SDK 接口 / CLI 入口 # skills/skill-my-skill/SKILL.md ← 何时触发、怎么用 # lib/index.mjs ← export 公共接口 # bin/my-skill.mjs ← CLI 命令 # 3. 跑通 npm test # 4. 六项质检(必须全绿或显式解释每个 skip) npx --yes skill-core-guide@latest check . # 5. 四渠道发布 npx --yes skill-core-guide@latest publish . --apply ``` **三条铁律**(违反其中任何一条,技能不算交付): 1. **零密钥入库** —— 凭据只从环境变量/用户目录解析,仓库里永远不出现真实密钥。 2. **不伪造成功** —— 拿不到结果就显式报错并给出修复指引,绝不假装跑通。 3. **端点先探测再调用** —— 标注 `planned` 的端点调用前必须探测,404 时显式回落。 --- ## 一、Fmode Harness 平台基础设施规范 ### 1.1 平台基址 | 用途 | 基址 | 鉴权方式 | |------|------|----------| | **API 网关**(LLM / 图像) | `https://api.fmode.cn` | `Authorization: Bearer sk-...` | | **业务网关**(转写 / 凭据自举 / deploy STS) | `https://server.fmode.cn` | `x-parse-session-token: r:...` 或 Bearer | | **CDN**(OBS → fmode.cn 回源) | `https://fmode.cn` | 公开读 | | **OBS 直链**(CDN 未生效时的降级通道) | `https://fmode-s3.obs.cn-north-4.myhuaweicloud.com` | 公开读 / AK-SK 写 | | **主 Gogs**(内网日常迭代) | `https://git.fmode.cn/fmode/` | URL 携带凭据 | | **GitHub 镜像**(公开发布) | `https://github.com/fmodecn/` | SSH key / PAT | | **npm** | `https://registry.npmjs.org` | `~/.npmrc` token | | **skillhub.cn** | `https://api.skillhub.cn` | `sk-ent-...`(团队 fmode / `org-m8z913un`) | ### 1.2 `.fmode/` 目录机制 ``` ~/.fmode/ ├── config.json # 全局配置(600 权限) │ # 非敏感:profiles / projects / obsBucket / storageProjectId │ # 敏感:sessionToken / fmodeApiToken / githubToken ├── credentials/ # 敏感凭据文件(700 目录 / 600 文件) │ └── academic-identity.txt └── projects/ # 项目认知文件映射 ``` **项目级覆盖**:`/.fmode/config.json` 优先级高于用户级(用于项目专属配置)。 **环境变量覆盖**: - `FMODE_HOME` —— 覆盖 `~/.fmode` 根目录(测试/多身份隔离用) - `FMODE_API_TOKEN` —— 直接指定 API token - `FMODE_SESSION_TOKEN` —— 指定 sessionToken(触发自举) - `FMODE_API_BASE` —— 覆盖业务网关基址 > ⚠️ **BOM 陷阱**:用户手工保存的 `config.json` 常带 UTF-8 BOM(`EF BB BF`), > `JSON.parse` 会直接抛错。**解析前必须剥 BOM**: > `JSON.parse(raw.replace(/^/, ''))`。这是多个技能踩过的真实坑。 ### 1.3 统一 API 接入 所有技能通过 Fmode 网关调用 LLM / 存储 / 图像 / 转写 / 视觉,**不在客户端直连第三方**。 #### 端点真值表(实测于 2026-09-22) 状态语义: - **`live`** —— 实测返回 200 或 401(401 = 端点存在、需鉴权),可直接使用 - **`planned`** —— 实测 404,设计文档存在但服务端未上线;**调用前必须探测并回落** - **`deprecated`** —— 曾经被文档描述、实测 404 且已确认不再维护;**不要使用** | # | 端点 | 方法 | 状态 | 鉴权 | 用途 | |---|------|------|------|------|------| | 1 | `api.fmode.cn/v1/chat/completions` | POST | ✅ **live** | Bearer `sk-` | LLM 对话补全(OpenAI 兼容)——所有技能的统一模型出口 | | 2 | `api.fmode.cn/v1/images/generations` | POST | ✅ **live** | Bearer `sk-` | 图像生成(fmode-image) | | 3 | `server.fmode.cn/api/listen/transcribe` | POST | ✅ **live** | Bearer `sk-` | 录音转写(讯飞 LFASR) | | 4 | `server.fmode.cn/api/fmode/voc-skill/install-prompt` | POST | ✅ **live** | `x-parse-session-token` | **凭据自举唯一通道**:sessionToken → API token | | 5 | `server.fmode.cn/api/apig/deploy/huaweicloud` | POST | ✅ **live** | Bearer sessionToken | 签发项目隔离 OBS STS | | 6 | `server.fmode.cn/api/storage/upload` | POST | 🕓 planned | Bearer `sk-` | 对象存储上传(未上线,走 obsutil 直传) | | 7 | `server.fmode.cn/api/storage/credentials` | POST | ✗ **deprecated** | Bearer sessionToken | 从未上线(恒 404),见 §8.1 事故复盘 | | 8 | `server.fmode.cn/api/image/generate` | POST | 🕓 planned | Bearer `sk-` | 网关侧图像生成(未上线,用 #2 代替) | | 9 | `server.fmode.cn/api/vision/analyze` | POST | 🕓 planned | Bearer `sk-` | 网关侧视觉识别(未上线,用 #1 多模态代替) | | 10 | `server.fmode.cn/api/fmode/verifycode` | POST | 🕓 planned | 无 | 手机号验证码(未上线,见 §6) | **统计**:5 live / 4 planned / 1 deprecated。 > 📌 **真值源**:上表由 `lib/platform.mjs` 的 `ENDPOINTS` 常量驱动。 > 代码里请**引用 `ENDPOINTS.llmChat.url` 而不是硬编码 URL**—— > 平台迁移时只改一处。可用 `skill-core endpoints` 随时打印最新真值表。 #### 调用示例 ```javascript // LLM 调用 const res = await fetch('https://api.fmode.cn/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ model: 'glm-5.3-flash', messages: [...] }), }); // 图像生成 await fetch('https://api.fmode.cn/v1/images/generations', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ model: '...', prompt: '...' }), }); // 录音转写 await fetch('https://server.fmode.cn/api/listen/transcribe', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ url: 'https://.../meeting.mp3', ... }), }); ``` #### 视觉识别:宿主优先策略 `skill-vision` 定义的**成本最优**策略,所有视觉类技能应遵循: ``` 1. 探测宿主 Agent 配置的模型是否支持视觉(Claude Code / Codex settings) → 支持则直接用宿主模型读图(零额外成本、零网络往返) 2. 否则回落 Fmode API 的 /v1/chat/completions(多模态 messages),模型 glm-5.3-flash ``` #### 存储:4 级诚实凭据链 `skill-storage` 的凭据链是平台存储接入的权威参考: ``` 第1级 环境变量 OBS_AK / OBS_SK(可选 OBS_ENDPOINT / OBS_BUCKET) 第2级 obsutil config 文件(OBSUTIL_CONFIG 或 ~/.obsutilconfig) 第3级 sessionToken + storageProjectId → POST /api/apig/deploy/huaweicloud → 项目隔离 STS (obsPath = obs://nova-cloud/dev//,key 强制限定前缀) STS 仅内存持有,用完即删 第4级 项目级 ./.fmode/config.json(obsBucket / obsEndpoint / cdnDomain) ``` **全失败时必须打印初始化向导并退出码 2,绝不伪装成功。** --- ## 二、技能分类体系 技能按**职责边界**分三层。分层决定了它的发布渠道、依赖关系与质检重点。 ### 2.1 系统层 / Infrastructure 平台基础设施与 Agent 运行时治理。**不依赖任何业务场景**,是其他技能的地基。 | 技能 | 作用 | 平台 | |------|------|------| | `skill-heterarchy` | 内异层认知协同范式(单主体内多心智分化) | Gogs/GitHub/npm/skillhub | | `skill-multi-branch` | 沟通/执行分层编排(Hermes → CC/Codex) | GitHub | | `skill-bypass-permission` | YOLO 模式权限自检(免确认自主执行) | GitHub | | `skill-task-progress` | 4 态任务进度跟踪(ack/running/done/failed) | GitHub | | `plugin-wecom-fix` | 企微通道自检修复(plugin 形态) | Hermes plugin | | `skill-agent-clone` | 数字生命克隆(配置/SOUL/记忆/会话) | GitHub | | **`skill-core-guide`** | **平台母技能标准指南(本技能)** | Gogs/GitHub/npm/skillhub | ### 2.2 服务层 / Platform Services Fmode 基础服务的客户端封装。**一个技能封装一个平台能力**,接口稳定、无业务假设。 | 技能 | 作用 | npm 包 | 平台 | |------|------|--------|------| | `skill-storage` | OBS 对象存储与公开分享 | — | GitHub | | `skill-image` | Fmode API 图像生成(白底 PNG,¥0.3-0.5/张) | `fmode-image@0.2.0` | GitHub/npm | | `skill-vision` | 宿主多模态优先 + Fmode API 回落视觉识别 | `fmode-vision@0.1.1` | npm | | `skill-listen` | 讯飞 LFASR × Fmode 网关录音转写 | `fmode-listen@0.1.2` | npm | | `fmode-ffmpeg` | FFmpeg 音视频处理封装 | `fmode-ffmpeg@0.1.1` | npm | | `fmode-qiwei` | 企微网关 SDK | `fmode-qiwei@0.5.2` | npm | ### 2.3 应用层 / Business Applications 面向具体业务场景的端到端技能。**可以依赖服务层**,但不应被服务层依赖。 | 技能 | 作用 | 平台 | |------|------|------| | `skill-study-report` | 学习复盘报告(多 Agent 采集 + PPT 级 HTML) | GitHub | | `skill-present` | 课程课件/报告 HTML 演讲系统(含 43 条 Claude 规则) | Gogs | | `fmode-product-lab` | 新品研发(VOC + KANO + 市场 + 定位分析) | npm | > 📊 **完整清单(含标签、版本、渠道、状态)见 [`inventory.md`](inventory.md)**, > 机器可读真值在 `lib/inventory.mjs`。用 `skill-core inventory` 随时查看。 ### 2.4 命名规则 | 形态 | 规则 | 示例 | |------|------|------| | 仓库名 / Hermes 技能名 | `skill-` | `skill-my-thing` | | npm 包名(部分历史技能) | `fmode-` | `fmode-image` | | skillhub slug | `fmode-skill-` | `fmode-skill-my-thing` | | CLI 命令名 | 去前缀的 kebab-case | `my-thing` | 正则:`/^(skill|fmode)-[a-z0-9]+(-[a-z0-9]+)*$/` --- ## 三、ESM-first 多端可用打包标准 ### 3.1 包结构模板 ``` / ├── package.json # type: module; exports: "." → lib/index.mjs ├── lib/ │ ├── index.mjs # ESM 入口,export 所有公共接口 │ ├── platform.mjs # (可选)平台常量与端点真值表 │ ├── check.mjs # (可选)质检引擎 │ └── bootstrap.mjs # (可选)凭证供给 ├── bin/ │ └── .mjs # CLI 入口(#!/usr/bin/env node) ├── browser/ │ └── index.mjs # 浏览器 bundle(无 Node 依赖) ├── skills/ │ └── / │ └── SKILL.md # 技能定义文档(Agent 读这个) ├── templates/ # (可选)脚手架模板 ├── test/ │ └── smoke.mjs # 冒烟测试 ├── README.md # GitHub/Gogs 首页 ├── LICENSE # MIT └── skill-package-manifest.json # 元数据清单(看板数据源) ``` ### 3.2 package.json 关键字段 ```json { "name": "skill-my-thing", "version": "1.0.0", "description": "一句话描述", "type": "module", "main": "./lib/index.mjs", "exports": { ".": { "import": "./lib/index.mjs", "default": "./lib/index.mjs" } }, "bin": { "my-thing": "./bin/my-thing.mjs" }, "files": [ "lib/", "bin/", "browser/", "skills/", "README.md", "LICENSE", "skill-package-manifest.json" ], "engines": { "node": ">=18" }, "scripts": { "test": "node test/smoke.mjs" }, "license": "MIT", "dependencies": {} } ``` **硬性约束**(`validatePackageJson()` 会逐条检查): | 字段 | 要求 | 原因 | |------|------|------| | `type` | 必须 `"module"` | ESM only | | `main` | 必须 `"./lib/index.mjs"` | 统一入口 | | `exports["."]` | 必须同时有 `import` 与 `default` | 多端解析一致 | | `bin` | 对象形式,指向 `.mjs` | CLI 端 | | `files` | 白名单必须覆盖 `lib/ bin/ skills/ README.md LICENSE manifest` | 避免发布缺文件 | | `license` | 必须(平台统一 MIT) | 合规 | | `require` | **禁止出现** | 不提供 CJS 入口 | | `dependencies` | 强烈建议为空 | 母技能/服务技能应零依赖 | > 💡 **零依赖原则**:服务层技能应尽量零依赖。平台已有 `fetch`(Node ≥18 内置)、 > `AbortSignal.timeout`、`node:test`,绝大多数需求不需要第三方包。 > 零依赖 = 安装快 + 供应链风险低 + 不会因上游破坏性升级而挂掉。 ### 3.3 四端等价性原则 | 端 | 入口 | 用法 | 状态 | |----|------|------|------| | **CLI** | `bin/.mjs` | `npx --yes @latest ` | ✅ 必须可用 | | **SDK** | `lib/index.mjs` | `import { ... } from ''` | ✅ 必须可用 | | **Browser** | `browser/index.mjs` | `