关于 SpecMgr
SpecMgr 是用于管理系统规格说明工件的文件型工具,面向需求工程和系统设计团队。它以带 YAML frontmatter 的 Markdown 文件为事实来源,并通过 MCP 提供结构化管理、校验和图表能力。
主要功能
- 01管理需求、目标、风险和决策
- 02以 Markdown 文件保存工件
- 03提供结构化读取与写入工具
- 04生成用例和引用关系图
- 05校验 PlantUML 图表
适用场景
- 01组织系统需求规格说明
- 02关联需求、用例与验证记录
- 03生成规格工件引用关系图
- 04通过 MCP 管理规格文档
MCP 相关
可选 MCP 服务提供规格文档管理工具、资源和提示词,包括读取、写入、列表、状态及图表相关能力。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx biz-dfch-specmgrSPECMGR_MCP_TRANSPORTTransport mode for the MCP server.SPECMGR_MCP_HOSTBind address, SSE/streamable-http mode only.SPECMGR_MCP_PORTTCP port, SSE/streamable-http mode only.SPECMGR_ADR_DIRBase directory scanned for Architecture Decision Record (.md) files.SPECMGR_DOCS_DIRShared base directory root for the document-type domains that do not have their own dedicated directory environment variable (req, uc, tsk, qa, prb, gol, rsk, dec, sop, vcr, sysrs). Each domain's own subdirectory is appended automatically, e.g. docs/req.SPECMGR_FEAT_DIRBase directory scanned for Feature folders (<base>/<id>/README.md).SPECMGR_SIMILARITY_DISABLEDPresence-based opt-out for the semantic-similarity search feature (the find_related and find_similar_text tools): set to any value to disable the feature, so that every call returns a structured unavailable result and the embedding model is never loaded, and to skip the similarity phase of the unified server-startup warmup thread. Unset by default. Its resolved state is reported by the similarity section of the specmgr://config resource.SPECMGR_FEAT_WARMUP_DISABLEDPresence-based opt-out for the feat domain's two background cache-warming phases (frontmatter and full-parse) of the unified server-startup warmup thread: set to any value to skip both phases; when set together with SPECMGR_SIMILARITY_DISABLED, no warmup thread is started at all. Unset by default. Its resolved state is reported by the feat_warmup_disabled field of the specmgr://config resource.SPECMGR_PLANTUML_JARPath to a plantuml.jar, one of exactly three PlantUML validation-source selectors (the first one set, in JAR then BIN then URL order, is the only source used; no fall-through, no PATH discovery, no public default; all three unset is the offline structure-only floor). Unset by default. The selected source is reported by the plantuml section of the specmgr://config resource.SPECMGR_PLANTUML_BINPath to an executable speaking the PlantUML CLI contract, one of exactly three PlantUML validation-source selectors (the first one set, in JAR then BIN then URL order, is the only source used; no fall-through, no PATH discovery, no public default; all three unset is the offline structure-only floor). Unset by default. The selected source is reported by the plantuml section of the specmgr://config resource.SPECMGR_PLANTUML_URLPlantUML server base URL, one of exactly three PlantUML validation-source selectors (the first one set, in JAR then BIN then URL order, is the only source used; no fall-through, no PATH discovery, no public default; all three unset is the offline structure-only floor). Diagram content is only sent to a PlantUML server if this variable is set. Unset by default. The selected source is reported by the plantuml section of the specmgr://config resource.SPECMGR_DIAGRAM_MAX_TITLEMaximum length (in characters) of a resolved node's title label in the reference-graph diagrams (the get_reference_diagram / get_reference_diagram_all MCP tools and the specmgr diagram refs CLI): labels longer than the limit are cut at the last word boundary within the limit (a hard cut when there is none) with an ellipsis appended; the diagram title itself and unresolved node ids are never truncated. An integer; the default 40 applies when the variable is unset or set to an invalid value (empty, non-integer, or less than 1).SPECMGR_TESTS_NO_DOTENVPresence-based test/CI sentinel: set to any value to skip the CLI's module-level default .env load entirely, so the process runs under the CI (source-less) condition whatever the local (gitignored) .env configures; this is what keeps the specmgr coverage-badge pre-commit hook's source-less re-run source-less end-to-end. Unset by default, never set outside test runs.FASTEMBED_CACHE_PATHCache directory for the semantic-similarity feature's embedding model (the third-party fastembed backend's own variable, not a SPECMGR_* one): set to a directory to cache the model there; an unset or empty value falls back to the default <tempdir>/fastembed_cache, where <tempdir> is the process's temporary directory (e.g. /tmp on Linux). Unset by default. The resolved directory is reported by the similarity section of the specmgr://config resource.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
biz.dfch.SpecMgr
用于管理系统规范的制品管理器。
本项目是一个 MCP 服务,可用于管理不同的规范制品——完整的制品类型列表及其相互关系,请参阅概念;工具、资源和提示词参考,请参阅 MCP 服务 / docs/MCP.md。
MCP 服务(以及管理用的 CLI)均为可选项。可将它们作为“额外组件”安装(参见安装)。
目录
概念
每个工件在磁盘上都是一个包含 YAML frontmatter 块的纯 Markdown 文件——对 Git 友好、便于比较差异,也方便手动阅读和编辑。文件系统始终是事实来源;MCP 服务通过结构化且经过验证的读取、写入、列出和状态工具对其进行封装(参见用法)。
| 类型 | 用途 |
|---|---|
| QA — 问答 | 结构化的引导式访谈(按 ISO/IEC 25010 特性组织),用于记录利益相关方的问答;通常是新规范工作的起点 |
| GOL — 目标 | 高层业务目标——组织希望实现的目标,层级高于单个需求 |
| PRB — 问题陈述 | 采用六西格玛风格的问题陈述,描述某个目标或需求所要解决的问题 |
| REQ — 需求 | 单个系统需求(采用 EARS 风格表述),按 ISO/IEC 25010 特性分类 |
| UC — 用例 | 描述特定使用场景的参与者与系统交互 |
| RSK — 风险 | 风险登记项:原因/触发因素/后果、5x5 概率/影响评估(初始值和剩余值)、TARA 应对策略 |
| DEC — 决策 | 通用决策记录(MADR 风格),不限于架构 |
| ADR — 架构决策记录 | 特定于架构的决策记录;已弃用,请改用 DEC |
| TSK — 任务清单 | 实施任务检查清单,例如针对某项需求或功能 |
| VCR — 验证案例记录 | 恰好验证一项 REQ 或 UC;包含一组 AC-NNN 验收标准(每项都附有一种 DTAIS 验证方法),以及一个总体覆盖结果(完整/部分/无) |
| SOP — 标准操作规程 | 分步骤的操作规程,包含 RASCI 职责分配和审批生命周期 |
| FEAT — 功能 | 开发工作单元的计划/进度跟踪(.specmgr/feat/<id>/README.md) |
| SYSRS — 系统需求规范 | 通过交叉引用列表汇总 GOL/PRB/QA/UC/REQ/RSK/DEC-ADR/VCR,构成一份便于导航的规范;其结构遵循 ISO/IEC/IEEE 29148:2018(系统与软件工程——生命周期过程——需求工程),并包含少量仅供 specmgr 使用的补充内容(例如 ## Decisions、## Risks) |
典型的规范工作从一次 QA 引导式访谈开始,访谈会梳理出 GOL(目标)和 PRB(问题)。这些内容为 REQ 和 UC 提供依据;随后对其进行风险评估(RSK)并由 DEC 决策支持,每项 REQ/UC 都通过一个 VCR 进行验证(每个 VCR 收集其验收标准),并通过 TSK 任务清单跟踪。SYSRS 将所有内容整合为一份遵循 ISO/IEC/IEEE 29148 结构的规范。SOP 和 FEAT 用于支持流程本身,而不属于这一链条。
QA -> GOL / PRB -> REQ / UC -> RSK / DEC -> TSK, VCR -> SYSRS (aggregates all)
安装
仅作为库使用(不包含 CLI 或 MCP 服务):
pip install biz-dfch-specmgr
使用 CLI:
pip install "biz-dfch-specmgr[cli]"
使用 MCP 服务:
pip install "biz-dfch-specmgr[mcp]"
使用语义相似度搜索(find_related/find_similar_text,参见下文语义相似度搜索)时,请在 mcp 基础上添加 similarity extra:
pip install "biz-dfch-specmgr[mcp,similarity]"
或者使用 uv:
uv add "biz-dfch-specmgr[cli,mcp,similarity]"
CLI 用法
使用 CLI 可以生成 schema 和文档。我们会在 pre-commit 钩子和 ci.yml 中使用这些命令。
目前 CLI 尚无领域文档管理命令(创建/更新/状态等)——这些功能目前仅由 MCP 提供,参见 MCP 服务。CLI 包含 version、mcp(下文介绍)、一些跨领域/文档生成命令,以及图表命令——UC → PlantUML(参见 UC → PlantUML 图表)和引用关系图(参见引用关系图)(完整列表请运行 specmgr --help)。
specmgr version
UC → PlantUML 图表
Specmgr 可以将 UC 工件转换为 PlantUML 图表——确定性的用例图和包图,以及由 Agent 流程标注的时序图。
时序图(Agent 路径)。 generate_uc_sequence_diagram MCP
提示词(在 OpenCode 中:自触发的 uc-diagram 技能或
/uc-diagram <id> 命令)会运行冻结的规则手册流程:Agent 为每条
UNATTRIBUTED 消息标注归属(不确定时使用 question 工具提问),使用
validate_plantuml 验证,并以宿主原生方式写入 diagrams/uc/<id>.sequence.puml——specmgr 工具不会写入 .puml 文件。
确定性图表 + 工具(CLI,仅确定性操作——CLI 绝不会创建、覆盖或比较由 Agent 管理的 *.sequence.puml 文件):
specmgr diagram uc <id>|all --out <dir> [--check] # per-UC <id>.usecase.puml + package.puml; --check byte-diffs without writing (exit 0 ok / 1 diff / 2 usage-or-render error)
specmgr plantuml-check <path...> # validates any .puml through the chain (exit 0 valid / 1 invalid / 2 source misconfigured-or-unavailable / 3 inconclusive)
specmgr plantuml-encode <path|-> # offline classic SoWkI… encoding
验证来源。 恰好有三个环境变量,按顺序,第一个已设置的变量是唯一使用的来源(不会回退、不会从 PATH 查找,也没有公共默认值):
SPECMGR_PLANTUML_JAR(plantuml.jar 路径)、SPECMGR_PLANTUML_BIN(符合 PlantUML CLI 契约的可执行文件)、SPECMGR_PLANTUML_URL(PlantUML 服务基础 URL)。全部未设置 ⇒ 仅进行离线结构验证。
除非设置该 URL,否则图表内容绝不会发送到 plantuml.com。
规范规则手册以 specmgr://uc/plantuml 资源的形式提供;完整的 MCP 接口见 docs/MCP.md。
参考关系图
Specmgr 可以将其工件之间确定性的交叉引用网络(list_references 工具背后的 <TYPE> <id> 标签词汇)渲染为 PlantUML 组件图:每个工件对应一个节点(标签 = 文档标题,截断至 SPECMGR_DIAGRAM_MAX_TITLE 限制,默认为 40);每种工件类型对应一个构造型和一种颜色(固定的 14 项调色板);节点按域分组到 component "TYPE" { … } 花括号组件组中;每条唯一引用对应一条无标签边({src} --> {dst});所有位于环路上的边(自环和同一强连通分量中包含 ≥ 2 个节点的边)都使用红色无标签 -[#red]-> 箭头绘制;无法在磁盘上解析目标的引用会绘制为顶层 <<UNRESOLVED>> 节点。完全确定:相同的注册表和参数始终生成字节级完全相同的源文本。
MCP 工具。 get_reference_diagram(type, id, depth=1, reverse=False, include_feat=True, title=None) 渲染一个源文档的引用邻域(向前遍历至 depth 层,取值范围为 1..5;reverse=True 会额外添加直接指向该文档的引用,仅限直接引用);
get_reference_diagram_all(include_feat=True, title=None) 渲染整个注册表的关系图。两者都直接返回 PlantUML 源文本(不写入文件);范围限定工具接受全部 13 个域(包括 adr),对于存在但有错误的源文件,会返回不抛出异常的 ParseFailureResult;全注册表工具不会因内容而抛出异常。
CLI(写入工件,仅限确定性模式):
specmgr diagram refs <type> <id> [--depth N] [--reverse] [--no-feat] [--title T] [--out diagrams/refs] [--check] # scoped → <id>.refs.puml
specmgr diagram refs all [--no-feat] [--title T] [--out diagrams/refs] [--check] # registry-wide → reference-graph.puml
--no-feat 会移除所有 FEAT 节点,但显式指定的源除外(随后移除所有连接到已移除节点的边)。退出代码:0 已写入 / 无差异,1 存在 --check 差异(缺失文件也算差异)或缺少 mcp 扩展,2 用法或解析错误(type/id/depth 格式错误——不接受单独的 feat-NNN,请使用 list_feat 查找准确的 ID——源文件缺失、源文件存在但有错误,或 all 与源文件同时使用)。写入的工件不含仅用于结构检查的标头(按构造即可通过检查)。
验证。 specmgr plantuml-check <path...>(或通过源文本调用 validate_plantuml MCP 工具)会使用与 UC 图相同的严格验证链验证关系图(三个 SPECMGR_PLANTUML_* 源环境变量,参见 UC → PlantUML Diagrams;全部未设置时采用离线结构检查的最低要求)。
标签限制。 SPECMGR_DIAGRAM_MAX_TITLE(整数,默认值为 40)限制已解析节点的 H1 标签长度(按词边界截断并添加 …;若已设置但值无效,则回退至 40);@startuml 图表标题会进行清理,但不会截断。该变量的已设置 / 有效 / 默认 / 已解析状态会通过 specmgr://config 资源的 diagram 部分报告(不会披露原始值)。
规范性规则手册作为 specmgr://reference-graph 资源提供;完整的 MCP 接口见 docs/MCP.md。
MCP 服务
需要 mcp 扩展。该服务提供用于文档管理的资源、工具和提示词,以及跨领域实用工具(例如 Markdown 格式化)。
所有资源、资源模板、工具和提示词的完整最新列表——包括参数、MIME 类型和说明——请参见
docs/MCP.md。 该文档由实时服务注册信息通过 specmgr mcp-docs 生成,并由 pre-commit 钩子和 CI 检查保持同步。
环境变量
每种文档类型都会将其 .md 文件存储在磁盘上的基础目录中——文件始终是唯一可信来源,每次调用工具时都会重新读取并解析,因此在两次调用之间手动编辑文件是安全的。
- ADR:基础目录默认为
docs/adr,可通过SPECMGR_ADR_DIR环境变量配置。此目录仅用于 ADR,不与其他文档类型共享。 - 需求(REQ)和未来的文档类型:共用一个根目录,可通过
SPECMGR_DOCS_DIR环境变量配置(默认为docs),系统会自动追加每种类型各自的子目录(例如,需求使用docs/req)。 - 功能(FEAT):基础目录默认为
.specmgr/feat,可通过SPECMGR_FEAT_DIR环境变量配置。与上面的 ADR 一样,此目录仅用于 FEAT,不通过SPECMGR_DOCS_DIR共享。 - PlantUML 验证来源(UC 图):
SPECMGR_PLANTUML_JAR(plantuml.jar 路径)、SPECMGR_PLANTUML_BIN(符合 PlantUML CLI 契约的可执行文件)和SPECMGR_PLANTUML_URL(PlantUML 服务的基础 URL)——只使用第一个已设置的来源(不会回退到其他来源,不会搜索 PATH,也没有公共默认值);若均未设置,则仅执行离线结构检查。使用方法请参阅 UC → PlantUML 图。 - 引用关系图的标签长度限制:
SPECMGR_DIAGRAM_MAX_TITLE(整数,默认值为40)——get_reference_diagram/get_reference_diagram_allPlantUML 图中,已解析节点的 H1 标签最大长度(在词边界处截断,并添加…;图标题本身永不截断)。若该变量已设置但值无效(为空、非整数或小于 1),则回退到40。specmgr://config资源的diagram部分会报告该变量的设置状态、有效性、默认值和解析后的值(不会披露原始值)。
specmgr mcp 命令自身的传输设置同样由环境变量控制:SPECMGR_MCP_TRANSPORT 用于选择传输方式(默认为 stdio;允许的值为 stdio、sse 和 streamable-http);SPECMGR_MCP_HOST(默认为 localhost)和 SPECMGR_MCP_PORT(默认为 8000)分别用于指定绑定地址和 TCP 端口,仅在 sse/streamable-http 模式下使用。命令的 --transport/--host/--port 标志优先于这些变量——选项表请参阅下文的 启动 MCP 服务。
设置 SPECMGR_SIMILARITY_DISABLED 环境变量(任意值;按是否存在判断)即可关闭 find_related/find_similar_text 工具(语义相似度搜索,需要安装 similarity 扩展)——完整行为(安装、服务启动时非阻塞的后台预热、模型缓存位置,以及功能已禁用或后端/模型加载失败时两个工具返回的结构化不可用结果)请参阅下文的 语义相似度搜索。
语义相似度功能的模型缓存目录由 FASTEMBED_CACHE_PATH 环境变量指定(这是第三方 fastembed 后端自身的变量,并非 SPECMGR_* 变量):若未设置或值为空,则回退到 <tempdir>/fastembed_cache(例如,Linux 上为 /tmp/fastembed_cache)。解析后的目录会由 specmgr://config 资源的 similarity 部分报告——完整行为请参阅下文的 语义相似度搜索。
feat 域的两个后台缓存预热阶段(frontmatter 和 full-parse,由与相似度预热相同的统一服务启动预热线程运行)也可通过设置 SPECMGR_FEAT_WARMUP_DISABLED 环境变量关闭(任意值;按是否存在判断)——有关该线程的完整行为以及两个选择退出标志,请参阅下文 语义相似度搜索中的后台预热段落。
SPECMGR_TESTS_NO_DOTENV 是一个基于是否存在判断的测试/CI 哨兵变量(无默认值;测试运行之外绝不设置):将其设为任意值,即可完全跳过 CLI 在模块级别默认加载 .env 的操作,这样测试运行就不会读取任何本地(被 git 忽略的).env 配置,无论开发者的机器上设置了什么。
除非通过对应环境变量覆盖,否则上述所有基础目录都相对于 MCP 服务进程自身的当前工作目录解析;对于共享的 SPECMGR_DOCS_DIR 根目录,若服务是通过针对你的项目的 --directory/uv run --directory 启动,则不受此限制。如果该 CWD 与预期不符——例如,按照下文的 添加到 OpenCode 将 specmgr 添加到 MCP 宿主后——请读取 specmgr://config 资源,查看每个领域实际解析出的绝对基础目录,以及其环境变量是否已显式设置,无需访问服务所在主机的 shell。
语义相似度搜索
find_related 和 find_similar_text 工具使用本地句子嵌入按语义相似度对文档排序(推理时无需 API 密钥或网络)。find_related(type, id) 用于查找与现有文档最相关的文档;find_similar_text(query) 用于查找与自由格式查询最相似的文档,例如尚未保存的草稿,可用于创建前的去重和发现。无论该功能是否已安装或启用,这两个工具始终会显示在工具列表中:功能不可用时,每次调用都会返回结构化的 {available: false, reason, message} 结果,而不是抛出异常。
安装。 除 mcp 外,这些工具还需要可选的 similarity 扩展包,具体命令见安装(pip install "biz-dfch-specmgr[mcp,similarity]" 或 uv add "biz-dfch-specmgr[cli,mcp,similarity]")。后端为运行 BAAI/bge-small-en-v1.5 的 fastembed(仅使用 CPU、ONNX Runtime、384 维)。
模型下载和缓存。 首次加载模型时,会从 Hugging Face Hub 下载一次(仅此时需要网络;之后推理完全离线)。如果设置了环境变量 $FASTEMBED_CACHE_PATH,模型会缓存在该路径下;否则会缓存在 <tempdir>/fastembed_cache 中(例如 Linux 上的 /tmp/fastembed_cache)。
服务启动时在后台预热。 除非同时设置了 SPECMGR_FEAT_WARMUP_DISABLED 和 SPECMGR_SIMILARITY_DISABLED,否则服务启动时会启动一个后台守护线程,按严格顺序执行三个预热阶段:feat 前置元数据阶段(开销低:仅处理前置元数据和 H1)、feat 完整解析阶段(开销高:处理完整的 feat 语料库),以及相似度阶段(将完整文档语料库嵌入内存缓存)。每个阶段都由各自的退出标志独立控制:设置 SPECMGR_FEAT_WARMUP_DISABLED(任意值;按是否存在判断)会跳过两个 feat 阶段;设置 SPECMGR_SIMILARITY_DISABLED(任意值;按是否存在判断)会跳过相似度阶段,无论是否安装了 similarity 扩展包。如果缺少该扩展包,或者模型加载失败,相似度阶段会在内部运行可用性检查,然后立即退出,不写入缓存(且不会抛出异常)。该线程不会阻塞服务启动,服务启动不会等待它完成(如需加载或下载模型,这些操作会在线程内执行,不会在启动流程中执行);如果预热过程中途失败,会记录日志并吞掉异常,缓存则会保留部分预热结果。这样做是为了加快首次工具调用:缓存尚未预热时,list_feat 会在请求处理过程中扫描并重新解析整个 feat 语料库,而相似度工具则会按需嵌入该语料库——两者都可能耗费数分钟的 CPU 时间。
退出。 设置 SPECMGR_SIMILARITY_DISABLED(任意值;按是否存在判断)可在不卸载扩展包的情况下禁用该功能,例如完全跳过模型下载、在从未下载模型的主机上禁用该功能,或释放模型和缓存占用的内存。无论如何,这两个工具都会保持注册状态。设置 SPECMGR_FEAT_WARMUP_DISABLED(任意值;按是否存在判断)可跳过两个 feat 缓存预热阶段,不会产生其他影响,例如在很少调用 list_feat/get_feat 的主机上使用。设置这两个退出标志后,则完全不会启动预热线程。
信息查询。 读取 specmgr://config 资源可查看该功能的静态配置——其中的 similarity 部分会报告是否安装了 similarity 扩展包、是否设置了退出标志、模型名称以及解析后的缓存目录(仅静态信息;读取该资源不会加载模型或创建缓存目录);其中的 feat_warmup_disabled 字段会报告是否设置了 feat 预热退出标志。读取 specmgr://version 资源可查看已安装的 fastembed 版本(未安装该扩展包时为 null)。
启动 MCP 服务
使用 mcp 命令启动服务:
specmgr mcp
默认情况下,它通过 stdio 运行,供将其作为子进程启动的 MCP 宿主使用(见下文的添加到 OpenCode)。它也可以通过 SSE/网络运行:
specmgr mcp --transport sse --host localhost --port 8000
或者通过当前规范中的 streamable-http 传输方式运行,该方式取代了用于 HTTP 部署的旧版/已弃用 sse 传输方式:
specmgr mcp --transport streamable-http --host localhost --port 8000
| 选项 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--transport / -t | SPECMGR_MCP_TRANSPORT | stdio | 传输模式:stdio、sse 或 streamable-http |
--host / -h | SPECMGR_MCP_HOST | localhost | 绑定地址(仅限 SSE/streamable-http 模式) |
--port / -p | SPECMGR_MCP_PORT | 8000 | TCP 端口(仅限 SSE/streamable-http 模式) |
添加到 OpenCode
要将 specmgr MCP 服务添加到 OpenCode 配置中:
-
打开 OpenCode 配置文件(通常为
~/.config/opencode/opencode.json或~/.config/opencode/opencode.jsonc) -
在
mcp部分添加配置(并通过stdio使用)。仅使用不带
--directory且未设置SPECMGR_*_DIR环境变量的uvx --from biz-dfch-specmgr[mcp] specmgr mcp命令并不安全:服务会将每个基础目录(docs、docs/adr、.specmgr/feat……)解析为相对于其进程当前工作目录的路径,而 MCP 宿主可以从任意位置启动该进程,不一定是你的项目根目录。请从以下两个选项中选择一个,而不要使用上述命令:选项 A — 使用
--directory固定工作目录(这是全局uv/uvx标志,因此必须放在--from之前):"specmgr": { "type": "local", "enabled": true, "command": [ "uvx", "--directory", "<path-to-your-project>", "--from", "biz-dfch-specmgr[mcp]", "specmgr", "mcp" ] }
若要同时启用语义相似度搜索功能(find_related/find_similar_text),请将上方 --from 值中的 [mcp] 改为 [mcp,similarity] — 安装和运行时激活的详情请参见该部分。
选项 B — 显式设置目录环境变量,以替代(或配合)--directory:
"specmgr": {
"type": "local",
"enabled": true,
"command": [
"uvx",
"--from",
"biz-dfch-specmgr[mcp]",
"specmgr",
"mcp"
],
"environment": {
"SPECMGR_DOCS_DIR": "<path-to-your-project>/docs",
"SPECMGR_ADR_DIR": "<path-to-your-project>/docs/adr",
"SPECMGR_FEAT_DIR": "<path-to-your-project>/.specmgr/feat"
}
}
这里同样适用将 --from 值中的 [mcp] 改为 [mcp,similarity],以启用语义相似度搜索。
两种选项(或同时使用)都能让解析出的基础目录不受 MCP 宿主实际启动服务的位置影响。无论选择哪种方式,都可以通过读取 specmgr://config 资源来确认是否生效;该资源会报告每个领域实际解析出的绝对基础目录,以及是否显式设置了对应的环境变量。
选项 C — 从本地源代码检出目录运行(开发)。 选项 A 和 B 都使用 uvx(uv tool run),它会从配置的索引(默认是 PyPI)将 biz-dfch-specmgr[...] 作为具名包解析到临时工具环境中 — 它们始终运行已发布版本,不会运行本地或尚未发布的更改。若要改为运行磁盘上的指定目录中的项目 — 直接使用其自身的 pyproject.toml、锁文件和源代码树,包括尚未发布的/dev 分支提交 — 请使用 uv run --directory <path-to-your-checkout>(不带 --from,也不使用 uvx):
"specmgr": {
"type": "local",
"enabled": true,
"command": [
"uv",
"run",
"--directory",
"<path-to-your-checkout>",
"--extra",
"mcp",
"--extra",
"similarity",
"specmgr",
"mcp"
]
}
贡献者/开发者可通过此方式让 OpenCode 指向自己的 git 检出目录,而不是已发布的包。可重复使用的 --extra 标志(或用于启用所有内容的 --all-extras)用于控制要同步到本地运行环境中的可选依赖项,与 PyPI 上发布的内容无关 — 如果不需要语义相似度搜索,可移除 --extra similarity。
- 保存文件并重启 OpenCode
用法
连接后,你的 AI 助手会看到每个文档领域的两类工具:每个领域专属工具(create_<d>、get_<d>、list_<d>、parse_<d>,以及 get_<d>_example/get_<d>_template),还有通用分派工具。通用分派工具接受 type= 参数,在所有领域中的行为一致:update(编辑整个正文或指定行范围)、set_status、set_classification、delete 和 validate(ADR 是唯一例外,它早于此模式,因此使用自己的专用工具)。完整列表请参阅 docs/MCP.md。
服务还提供提示词(例如 create_req、update_req、implement_task)——这些是引导式、多轮的访谈流程,是以对话方式撰写文档的推荐方式,而非逐个调用工具。大多数 MCP 宿主会将其显示为斜杠命令或提示词选择器。
日常使用时,你完全不必了解任何工具名称——只需用日常语言向已连接的 AI 助手提出要求,例如:
- “创建一个减少客户入门用时的新目标。”
- “列出所有未解决的风险,并显示高严重性风险。”
- “为需求
<id>起草任务列表。”
要解析制品中已有的交叉引用,请参阅 引用制品。
引用制品
specmgr 文档会通过结构化位置中的 <TYPE> <uuid> 行互相交叉引用(VCR 的 ## Verifies、SYSRS 的各节项目符号列表、DEC 的 ## Related Artifacts);此外,在任意自由格式正文中,也可使用任何引用标签,包括携带某个功能自身 ID 的 FEAT 标签(完整的 feat-NNN-slug 或不带 slug 的 feat-NNN 编号;上述结构化位置仍仅使用 uuid)。list_references MCP 工具可解析这些引用:将任意制品(<type> <id>)交给你的助手,它便会列出制品正文中的所有交叉引用标签,并解析出被引用文档的类型、ID、标题(其 H1)和磁盘路径。结果与所有 list_* 工具一样采用分页;磁盘上无法解析的引用会作为带有 error 的行返回(不视为失败),其他自由格式或不符合规范的文本则会被忽略。
在 opencode 中,/refs <type> <id> 斜杠命令(.opencode/command/refs.md)封装了同一工具:它会委派给只读的 ref-finder 子 Agent(.opencode/agent/ref-finder.md),由该子 Agent 调用 list_references 并报告结果行,同时标记任何 NOT FOUND 引用。/refs 需要 opencode——该工具本身是纯 MCP 工具,可从任何 MCP 客户端直接调用。
同样在 opencode 中,项目本地的 specmgr-refs 技能(.opencode/skills/specmgr-refs/SKILL.md)是由 Agent 主动发起的入口:当任务符合引用检索相关表述时,它会自动加载,将单文档请求路由到 list_references 工具、ref-finder 子 Agent 或 /refs 命令,并规范 /refs 和 ref-finder 未覆盖的图谱、批量及反向工作流。
开发
安装开发依赖
uv sync --all-extras
安装 pre-commit 钩子(仅需一次)
uv run --frozen pre-commit install
uv sync 只会将 Python 依赖安装到虚拟环境中——它不会将 .pre-commit-config.yaml 中的钩子注册到 git,因此请在每次克隆后、首次提交前运行一次。
运行代码检查工具
uv run --frozen ruff format --check
uv run --frozen ruff check
uv run --frozen pylint $(git ls-files '*.py')
运行测试
uv run --frozen pytest -n auto --cov=src --cov-report=
测试
你可以通过 MCP Inspector 直接测试 MCP 服务,可使用其 CLI(可编写脚本)客户端,也可使用 TUI(交互式终端)客户端。
前提条件
- 已安装
mcp额外组件(参见安装),这样就会有.venv/bin/specmgr。 npx(随 Node.js 一同提供, 版本为 22.19.0 或更高)——无需单独安装 Inspector;它会通过npx @modelcontextprotocol/inspector按需运行。
直接将 venv 中的 specmgr 二进制文件指定为 Inspector 的目标(而不是使用
uv run specmgr mcp),这样 uv run 自身的标志(例如 --frozen)就不会被误认为是 Inspector 标志:
npx @modelcontextprotocol/inspector --tui .venv/bin/specmgr mcp
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp --method tools/list
CLI 示例
每次 CLI 调用都会建立连接、运行一次请求、打印结果,然后退出——适用于脚本编写或快速冒烟测试。
获取 specmgr://version 资源:
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
--method resources/read --uri specmgr://version
通过 list_tsk 工具列出任务列表:
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
--method tools/call --tool-name list_tsk
通过 get_tsk 工具获取一个任务列表(将 <id> 替换为上方 list_tsk 输出中的实际任务列表 ID):
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
--method tools/call --tool-name get_tsk --tool-arg id=<id>
在上述任一命令中添加 --format json,即可获得机器可读的输出,例如通过管道传入 jq。
使用 TUI 连接
npx @modelcontextprotocol/inspector --tui .venv/bin/specmgr mcp
此命令会将服务作为临时 stdio 目标启动,并打开已预选该目标的终端 UI(与 CLI 不同,TUI 没有 --server <name> 标志——它会列出可用的服务,由你选择;不过只有一个临时目标时,也没有其他选项)。按 c 连接,然后使用选项卡进行探索:
t— **Tools(工具)**选项卡:浏览并调用工具(例如get_tsk),使用基于表单的输入。r— **Resources(资源)**选项卡:浏览并读取资源(例如specmgr://version、specmgr://iso25010)。m— **Prompts(提示词)**选项卡:列出并呈现提示词。p— **Protocol(协议)**选项卡:原始 JSON-RPC 请求/响应历史记录,适用于调试。o— **Console(控制台)**选项卡:已连接的specmgr mcp进程的stderr(回溯信息会显示在此处)。c/d— 连接 / 断开连接;Esc或Ctrl+C— 退出。
TUI 需要真实的 TTY(支持原始模式),无法在无头 CI 作业中运行——请改用 CLI 客户端。
发布
规范的发布流程是 SOP
执行 biz.dfch.SpecMgr 发布
(SOP 98537416)。如果本节、脚本或命令与 SOP 有任何不一致,以 SOP 为准。
使用 OpenCode 命令(推荐)
/release [X.Y.Z | patch | minor | major] [--dry-run]
该命令会运行分阶段脚本,并执行 SOP 中需要 Agent 判断的步骤:与您确认解析出的版本、整理变更日志的 [Unreleased] 部分、在将 dev 合并到 main 之前暂停等待合并关卡,并对失败进行分类处理,且绝不会自动重试。
直接使用脚本
SOP 中的每一步都对应一个确定且幂等的阶段(每一步的 SOP 中都附有手动备用命令):
scripts/release.sh resolve minor # print the target version (e.g. 0.15.0); no mutation
scripts/release.sh precheck 0.15.0 # fail-fast pre-release checks, incl. the feat closeout gate and the previous-release branch cleanup
scripts/release.sh bump 0.15.0 # pyproject.toml + uv.lock
scripts/release.sh changelog 0.15.0 # [Unreleased] -> dated section
scripts/release.sh commit-push 0.15.0 # 3-file release commit, push dev, wait for CI
scripts/release.sh pr-create 0.15.0 # dev->main release PR, wait for checks (no merge)
scripts/release.sh pr-merge 0.15.0 # ff-only merge (after maintainer go-ahead)
scripts/release.sh tag-push 0.15.0 # tag on main, push the tag, back to dev
scripts/release.sh publish-wait 0.15.0 # the four publish.yml jobs
scripts/release.sh release-notes 0.15.0 # verify the release + set the GH release notes
scripts/release.sh status 0.15.0 # where does this release stand?
scripts/release.sh all 0.15.0 # the whole chain, TTY only (interactive merge gate)
precheck 以 feat-233(问题 #233)新增的两个子项结束:feat 收尾关卡——当前发布窗口内(自上一个标签以来)发布的每个 .specmgr/feat/feat-*/ 文件夹,都必须在其 README frontmatter 中将状态收尾为 status: done;若不符合要求,预检将失败,并针对每个违规 feat 给出一条可执行的说明(处理方式:在 dev 上将指定 feat 收尾为 done,提交,然后重新运行 precheck);以及上一版本分支清理——删除上一版本或更早版本遗留的 feat-*/fix/* 分支,包括本地和 origin 端;每次删除都必须由该分支已合并的 PR 证明,并通过四项风险检查(--dry-run 会使此子项仅报告结果:输出将删除/将保留的表格,不删除任何引用)。
变更日志的整理(SOP 第 3 步)是 Agent 或手动步骤:changelog 阶段只会将已整理好的 [Unreleased] 部分移入带日期的形式。
手动备用方案
按照 SOP 逐步操作——每个步骤都附有一段手动备用方案说明。要点:更新 pyproject.toml 中的 version,并将 CHANGELOG.md 的 [Unreleased] 部分移至新的带日期的 ## [x.y.z] - YYYY-MM-DD 部分;执行 uv lock;仅将 pyproject.toml、uv.lock 和 CHANGELOG.md 提交为 chore(release): bump version to vX.Y.Z,并推送到 dev;CI 通过后,创建 dev → main 拉取请求,并以仅快进方式合并(git merge --ff-only dev——绝不可创建合并提交或执行 squash:main 必须始终是 dev 的严格祖先);然后在 main 上创建 git tag vX.Y.Z,推送标签,并等待发布工作流完成。
注意:推送上述标签后,.github/workflows/publish.yml 会自动处理发布的其余工作——它会通过 Trusted Publishing(OIDC,不使用存储的令牌)构建并将 sdist/wheel 发布到 TestPyPI,然后发布到 PyPI;创建附有构建产物的对应 GitHub Release;并通过 mcp-publisher/GitHub OIDC 将 server.json(仓库根目录中的 MCP Registry 发布者清单——参见 server.json 格式规范)发布到 MCP Registry。截至 v0.1.0,biz-dfch-specmgr 已在 PyPI 和 MCP Registry 上发布。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。