我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Fonoster 工程实践:用 OPSX:Propose 与 OpenSpec CLI 一步生成变更设计、方案与实施任务

Fonoster 工程实践:用 OPSX:Propose 与 OpenSpec CLI 一步生成变更设计、方案与实施任务 后端音视频【免费下载链接】fonoster The open-source alternative to Twilio.项目地址https://gitcode.com/gh_mirrors/fo/fonoster点击查看免费下载本篇技术指南围绕 Fonoster 仓库中.claude/commands/opsx/propose.md定义的OPSX:Propose工作流讲解如何通过一条斜杠命令驱动 OpenSpec CLI把我想做 X的模糊想法一键转化为结构化的变更产物——proposal.md做什么、为什么、design.md怎么做、tasks.md实施步骤。读者将掌握openspec new change、openspec status --json、openspec instructions的完整用法与 JSON 字段语义并看到这些产物在 Fonoster 仓库openspec/changes/中的真实落地形态。一、命令定位OPSX:Propose 是什么在 Fonoster 仓库的.claude/commands/opsx/propose.md中该命令被定义为OPSX: Propose— Propose a new change: create it and generate all artifacts in one step. Category: Workflowtags:[workflow, artifacts, experimental]。它本质上是一个面向 AI Agent 的变更提案工作流把 OpenSpec 规范里先提变更、再评审、后实施的流程封装成单条命令让 Agent 在一轮交互内完成变更脚手架搭建与全部文档产物生成产物包括proposal.md— 变更的what why为什么做、改变什么、影响面design.md— 变更的how技术方案、取舍与参考实现tasks.md— 实施步骤清单可勾选的落地任务。当产物齐备、可以进入实现阶段时再运行配套命令/opsx:apply开始落地。也就是说/opsx:propose负责设计/opsx:apply负责实现二者构成完整闭环。二、输入与前置约定命令的输入是/opsx:propose之后的参数取值有两种变更名称kebab-case如add-user-auth对用户想构建内容的自然语言描述。若两种都没提供Agent 应使用 AskUserQuestion 工具开放式提问、无预设选项询问What change do you want to work on? Describe what you want to build or fix.随后从用户描述中推导出 kebab-case 名称例如描述 add user authentication 即得到变更名add-user-auth。工作流强调在未理解用户构建意图前不得继续执行。所有产物将落在由 OpenSpec CLI 依据.openspec.yamlplanning home解析出的变更目录中而非硬编码的仓库路径——这是后续所有命令都必须以 CLI 返回的planningHome、changeRoot为准的原因。三、工作流五步走步骤 1确认变更意图仅当缺少输入时无输入则先提问见上文核心产出物是一个符合 kebab-case 规范的变更名。Fonoster 仓库中真实的变更名可作为命名参照asterisk-answering-machine-detectionidentity-clientidentity-multi-productidentity-standalone-servicevoice-audio-filters这些目录就存在于 openspec/changes/ 下每个目录内的产物结构完全对应本工作流要生成的东西。步骤 2创建变更目录openspec new change name该命令在 planning home由 CLI 通过.openspec.yaml解析得到下创建一个脚手架变更目录。以 Fonoster 仓库的 openspec/changes/identity-standalone-service/ 为例scaffold 之后的典型目录形态为openspec/changes/identity-standalone-service/ ├── proposal.md ├── design.md ├── tasks.md └── specs/ └── identity-service/ └── spec.md其中specs/capability/spec.md是 OpenSpec 的能力规格增量文件## ADDED Requirements等其余三个文件即命令产物。步骤 3获取产物构建顺序openspec status --change name --json解析返回的 JSON重点关注四个字段applyRequires实施前必须完成的产物 ID 数组例如[tasks]artifacts全部产物清单及各自状态ready/done/pending与依赖关系planningHome、changeRoot、artifactPaths路径与作用域上下文必须使用它们而非假设的仓库路径actionContext动作执行的上下文信息。该命令的职责是告诉 Agent当前变更有哪些产物、各自是否满足依赖、以及应该写到哪个路径。步骤 4按依赖顺序循环生成产物直到 apply-ready这是整个工作流的核心循环用 TodoWrite 工具跟踪进度。算法为反复处理依赖已满足且状态为 ready的产物直到applyRequires中的所有产物 ID 在artifacts数组中都变为status: done。每个 ready 产物先取指令openspec instructions artifact-id --change name --json返回的指令 JSON 包含六个关键字段字段含义使用方式context项目背景约束 Agent 行为的上下文作为写作约束不写入产物文件rules产物专属规则作为写作约束不写入产物文件template输出文件应遵循的结构骨架直接用作产物文件结构instruction该产物类型的模式级写作指引决定每个 section 写什么resolvedOutputPath已解析的产物写入路径或模式确定文件写到哪里dependencies已完成的、供阅读参考的依赖产物创建前先读完随后读取依赖产物获取上下文按template结构把产物写到resolvedOutputPath过程中受context/rules约束但不拷贝context、rules、project_context块到文件里完成后简要汇报 Created artifact-id。循环中每创建一个产物就重新运行一次openspec status --change name --json检查applyRequires是否全部 done若某产物因上下文不清需要用户输入则用 AskUserQuestion 澄清后继续。步骤 5展示最终状态openspec status --change name产物全部完成后的输出总结应包含变更名称与位置、创建的产物清单附简短描述、就绪声明All artifacts created! Ready for implementation.并提示用户运行/opsx:apply开始实施。四、产物创建指南与护栏Guardrails工作流对产物质量有明确约束遵循每个产物类型instruction字段的指引schema 定义什么产物就写什么内容创建新产物前必须先读依赖产物用template作为结构骨架填充其各 sectioncontext与rules是约束 Agent 的不是文件内容——严禁把context、rules、project_context块复制进产物文件。护栏规则汇总必须创建 schema 的apply.requires定义的全部实施所需产物创建新产物前必须读依赖产物上下文严重不清时可问用户但更倾向于基于合理判断继续推进、保持节奏若同名变更已存在询问用户是继续该变更还是新建每个产物写入后都要验证文件确实存在再进入下一个。五、真实仓库佐证Fonoster 的 OpenSpec 产物长什么样Fonoster 仓库完整实践了这套工作流。根级 openspec/config.yaml 就是该工作流所依赖的项目上下文context字段它描述了 Fonoster 是 MIT 许可的开源可编程电话平台、TypeScript monorepomods/*、服务组合进单一 gRPCapiserver并列出mods/identity、mods/apiserver、mods/sdk、mods/common等核心模块以及变更面向的外部产品诉求如 QCobro 想复用 Fonoster Identity 而不跑电话单体与规范约定Spec delta 采用 OpenSpec 的## ADDED/MODIFIED Requirements、### Requirement:、#### Scenario:WHEN/THEN/AND 格式。以 openspec/changes/identity-standalone-service/proposal.md 为例其结构正是工作流要求的what whyWhyfonoster/identity只是库buildIdentityService唯一运行它的是mods/apiserver后者耦合了电话栈Asterisk/ARI、NATS、InfluxDB外部产品被迫手搓 gRPC server、vendor proto 和 Prisma schema重复劳动且与上游漂移。What Changes为mods/identity增加可运行入口./server子路径导出 servebin、配置外置化含 fail-fast 校验、数据库供给脚本、容器镜像与 compose 示例。Capabilities / Impact新增identity-service能力明确代码、发布、文档、兼容性影响并把客户端 SDK、多产品 identity 列为 out of scope。openspec/changes/identity-standalone-service/design.md 则聚焦how强调复用而非 fork——服务只是buildIdentityService(config)的薄壳与apiserver的loadServices同构明确它不会启动 NATS/InfluxDB/Asterisk/ARI用 packageexports区分纯库入口fonoster/identity与可运行入口fonoster/identity/server避免纯库使用者背服务运行时并记录参考实现QCobro 的瘦身版同构服务。openspec/changes/identity-standalone-service/tasks.md 提供了可直接勾选的分组任务清单抽取共享横切关注点 → 让mods/identity可运行 → 配置加载校验 → 数据库供给 → 打包发布 → 验证服务健康、allow-list 方法免 token、端到端 sign-up→login→create-workspace。openspec/changes/identity-standalone-service/specs/identity-service/spec.md 则是标准的 OpenSpec 能力增量含### Requirement: Standalone Identity gRPC service、Externalized configuration with fail-fast validation、Database provisioning entrypoint、Container image and accept-invite bridge等需求及逐条 WHEN/THEN/AND 场景。六、从设计到落地的闭环验证这套工作流在 Fonoster 中并非纸上谈兵。仓库源码显示 identity-standalone-service 变更已经落地mods/identity/src/server/index.ts中通过import { buildIdentityService, identityAllowList, upsertDefaultUser } from ..组装独立服务注释明确写着 Standalone Identity gRPC service. WrapsbuildIdentityServicewith the auth...mods/identity/src/service.ts定义了buildIdentityService(identityConfig)并导出mods/identity/src/server/config.ts将文件配置映射为buildIdentityService期望的IdentityConfig形状。而 mods/identity/README.md 也把能力规格指向openspec/specs/identity/spec.md并说明能力级变更提案存放在openspec/changes/。这正是 OPSX:Propose 工作流价值的完整呈现proposal.md → design.md → tasks.md → spec.md的产物链为后续/opsx:apply的实现提供了从为什么到怎么验的全链路依据产物与源码一一对得上。七、实践建议与注意事项始终信任 CLI 返回的路径planningHome、changeRoot、artifactPaths、resolvedOutputPath是权威来源不要假设产物落在仓库固定目录——多仓库、多 planning home 场景下这一点尤其关键。区分约束与内容context和rules是写作者的约束写进产物文件反而污染文档template与instruction才是文件结构的来源。保持依赖纪律先读dependencies再动笔避免产物间上下文不一致每个文件写完即验证存在性防止静默失败。命名规范kebab-case 的变更名贯穿new change、status、instructions三条命令命名错误会导致产物分散或覆盖冲突。节奏控制上下文不清时优先基于已有信息做合理决策仅在严重歧义时才打断用户提问。赞分享后端音视频【免费下载链接】fonoster The open-source alternative to Twilio.项目地址https://gitcode.com/gh_mirrors/fo/fonoster点击查看免费下载相关推荐Halo 的 OpenSpec 实践OPSX:propose 一步生成变更提案、设计与任务工件Halo 的 OpenSpec 实践OPSX:propose 一步生成变更提案、设计与任务工件 Halo 仓库内置了一套基于 OpenSpec 的 AI 辅助后端前端CMS在 gf 项目中用 /opsx:propose 一键生成 OpenSpec 变更提案与实施工件在 gf 项目中用 /opsx:propose 一键生成 OpenSpec 变更提案与实施工件 导读 /opsx:propose 是当前仓库内置的一套 AgenWeb框架后端CLIFonoster 仓库的 openspec-propose 技能用 openspec CLI 一步生成变更提案proposal / design / tasks完整指南Fonoster 仓库的 openspec propose 技能用 openspec CLI 一步生成变更提案proposal / design / tas后端音视频上一篇深度解析One API如何无缝集成智谱GLM-4大模型下一篇告别JSON解析烦恼HTMX项目中的错误排查与完美解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表