Qwen Code + OpenSpec 实战指南:AI 驱动开发的从安装到落地

Qwen Code + OpenSpec 实战指南:AI 驱动开发的从安装到落地

1. 安装 Qwen Code

1.1 基本信息

  • GitHub:https://github.com/QwenLM/qwen-code
  • 中文官网:https://qwenlm.github.io/qwen-code-docs/zh/users/overview/

核心功能

  • 从描述构建功能:用简单语言告诉 Qwen Code 想构建的内容,它会制定计划、编写代码并确保正常运行。
  • 调试和修复问题:描述 bug 或粘贴错误信息,Qwen Code 会分析代码库、识别问题并修复。
  • 导航任何代码库:询问团队代码库相关问题,获得答案;维护项目结构感知,可从网络获取最新信息,通过 MCP 拉取 Google Drive、Figma、Slack 等外部数据。
  • 自动化繁琐任务:修复 lint 问题、解决合并冲突、编写发布说明等,可通过单个命令在开发机器或 CI 中自动执行。

1.2 安装步骤

第一步:全局安装 CLI

npminstall-g @qwen-code/qwen-code@latest 

第二步:配置 Qwen Code

支持两种认证方式(公司电脑无法使用 Qwen OAuth,需用第二种):

  • Qwen OAuth(免费):浏览器登录 qwen.ai 账户。
  • OpenAI 兼容 API:使用 API 密钥(OpenAI 或兼容提供商/端点)。

配置时需输入:

  • API key:大语言模型供应商的密钥
  • Base URL:大语言供应商提供的模型地址
  • Model:大语言模型的名称

1.2 支持 Agent Skill

Agent Skill 将专业知识打包为可发现能力,含 SKILL.md(模型加载指令)及可选支持文件(脚本、模板)。

启动方式

1. 通过 CLI 标志
qwen --experimental-skills 
2. 通过 settings.json

添加到 ~/.qwen/settings.json 或项目的 .qwen/settings.json

{"tools":{"experimental":{"skills":true}}}
其他说明
  • 存储位置~/.qwen/skills/
  • 运行命令/skills <skill-name>

2. 安装 OpenSpec

2.1 基本信息

  • GitHub:https://github.com/Fission-AI/OpenSpec

主流开源 SDD 工具对比

特性维度SpecKitOpenSpecBMAD
核心理念“规范即代码源”,开发者维护规范,代码由 AI 生成“规范锚定”,规范作为长期资产贯穿 AI 辅助开发“规范优先”,规范是人类与 AI 代理沟通的“单一事实来源”
核心主张四阶段流程(Specify->Plan->Tasks->Implement)将意图转代码轻量级流程引擎,规范驱动开发注入现有代码库定义智能体行为、交互和工具使用编排
工作流严格线性流程轻量级、非侵入式流程引擎基础方法框架,需自行实现协作逻辑
AI 工具兼容性深度集成 GitHub Copilot,兼容差支持 Claude Code、Cursor、Copilot 等十几种工具基础构件,需大量自行集成
项目适配性零到一(Zero to One)项目无缝融入现有项目,不改变开发习惯提供基础构件,需大量自行实现

OpenSpec 核心流程

┌────────────────────┐ │ Draft Change │ │ Proposal │ └────────┬───────────┘ │ share intent with your AI ▼ ┌────────────────────┐ │ Review & Align │ │ (edit specs/tasks) │◀──── feedback loop ──────┐ └────────┬───────────┘ │ │ approved plan │ ▼ │ ┌────────────────────┐ │ │ Implement Tasks │──────────────────────────┘ │ (AI writes code) │ └────────┬───────────┘ │ ship the change ▼ ┌────────────────────┐ │ Archive & Update │ │ Specs (source) │ └────────────────────┘ 

流程步骤

  1. 起草变更提案(捕获规范更新意图)。
  2. 与 AI 助手审核提案至共识。
  3. 实施引用已批准规范的 task(AI 写代码)。
  4. 归档变更,将批准的更新合并回源规范。

2.2 安装步骤

前置条件

Node.js ≥ 20.19.0(通过 node --version 检查版本)。

第一步:全局安装 CLI

# 安装npminstall-g @fission-ai/openspec@latest # 确认安装 openspec --version

第二步:项目中初始化 OpenSpec

# 进入项目目录cd my-project # 运行初始化 openspec init 

初始化过程

  • 提示选择原生支持的 AI 工具(Claude Code、CodeBuddy 等),其他 agent 依赖共享存根 AGENTS.md
  • 自动配置所选工具的斜杠命令,在项目根写入受管理的交接 AGENTS.md

创建 openspec/ 目录,结构如下:

openspec - AGENTS.md - project.md 

project.md可参考:一个AI编码的项目规范约束(project规范)

第三步:检查状态

openspec list # 验证设置状态,查看当前活跃变更提案

初始化后,主流 AI 工具可直接使用 /openspec 相关命令。

2.3 配置 Qwen Code

执行 openspec init 选择 AI 模型时选 qwen-code,会在当前目录创建 .qwen 目录,含三个配置文件:

.qwen - commands - openspec-apply.toml - openspec-archive.toml - openspec-proposal.toml 

3. AI 编码实践

3.1 配置 OpenSpec 项目约束文件

openspec init 后生成:

  • AGENTS.md:定义 AI 模型 agent 的引导。
  • project.md:定义项目规范约束(可由 AI 生成)。

3.2 创建变更(五步骤)

1. 起草提案

启动 qwen-code(qwenqwen --experimental-skills),提交变更请求:

/openspec-proposal 构建一个业务场景agent注册中心生成注册表,提供新增、编辑和查询功能,一个业务场景只有一个生效的智能 

生成目录结构:

openspec - changes - 对应变更名称 (AI 创建的名称) - design.md (提案设计) - proposal.md (变更提案) - tasks.md (完成任务所需任务) 

2. 核实与审核

检查变更是否正确创建并审查提案:

$ openspec list # 确认变更文件夹存在 $ openspec validate add-profile-filters # 验证规范格式 $ openspec show add-profile-filters # 审查提案、任务和规范差异

3. 检查与完善

若 AI 理解偏差或提案不符需求,可:

  • 与 AI 多轮交流修正提案设计。
  • 手动修改 design.mdproposal.md 等文档。

4. 实施任务

文档完善后,执行实施:

/openspec-apply 指定开始实施的任务 

5. 归档变更

验证无误后归档:

/openspec-archive 指定归档的变更 

一键三连,让我的信心像气球一样膨胀!

Read more

C++之基于正倒排索引的Boost搜索引擎项目数据清洗代码及详解(下)

C++之基于正倒排索引的Boost搜索引擎项目数据清洗代码及详解(下)

1.  第一步详解 我们要使用到boost里面filesystem这个命名空间里面的函数,所以我在这里先给它取个别名。然后我们把src_path里面的路径交给root_path。接着我们判断这个路径是否存在,如果不存在那就直接结束代码。接着我们通过迭代器循环的方式来对root_path里面的每一个文件。 第一个if用来判断是否是普通文件,第二个if来判断文件的扩展名是否为 .html,接着走到最后就书面是扩展名为 .html的普通文件。然后我们就把它的路径转化为string类型。 注意:在这里不可以把.string()换成to_string()。这是因为: .string() 是 std::filesystem::path 类的成员函数,专门用于将路径对象转换为 std::string 类型的字符串(返回路径的字符串表示)。to_string() 是 C++ 标准库中的全局函数(或针对基础类型的重载),用于将数值类型(如 int、double 等)转换为字符串,不能直接用于路径对象。 bool EnumFile(const

By Ne0inhk
C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展 💡 学习目标:掌握运算符重载的核心语法与规则,能够为自定义类型重载常用运算符,实现类对象的灵活运算。 💡 学习重点:运算符重载的基本形式、成员函数与全局函数重载的区别、常见运算符的重载实现、禁止重载的运算符。 一、运算符重载的概念与核心价值 ✅ 结论:运算符重载是 C++ 静态多态的重要体现,允许为自定义类型(如类、结构体)重新定义运算符的行为,让自定义对象可以像内置类型一样使用运算符。 运算符重载的核心价值: 1. 简化代码书写:用直观的运算符替代繁琐的成员函数调用,提升代码可读性 2. 统一操作风格:让自定义类型的运算逻辑与内置类型保持一致,降低学习和使用成本 3. 扩展类型功能:根据业务需求定制运算符的行为,满足自定义类型的运算需求 ⚠️ 注意事项:运算符重载不会改变运算符的优先级和结合性,也不会改变运算符的操作数个数。 二、运算符重载的基本语法 运算符重载的本质是函数重载,分为成员函数重载和全局函数重载两种形式。 2.1 成员函数重载语法 将运算符重载函数定义为类的成员函数,语法格式如下: class

By Ne0inhk
Effective Modern C++ 条款37:使std::thread在所有路径最后都不可结合

Effective Modern C++ 条款37:使std::thread在所有路径最后都不可结合

Effective Modern C++ 条款37:使std::thread在所有路径最后都不可结合 * 引言:线程生命周期的关键问题 * 线程的两种状态:可结合与不可结合 * 可结合(Joinable)状态的特征 * 不可结合(Unjoinable)状态的四种情况 * 为什么可结合性如此重要? * 两种被拒绝的替代方案 * RAII拯救方案:ThreadRAII类 * ThreadRAII实现详解 * 关键设计决策 * 实际应用案例 * 高级讨论:何时选择join或detach * 性能考量与最佳实践 * 结论:让线程管理无忧 BiliBili上对应的视频为:https://www.bilibili.com/video/BV1iZZgBiE9j 引言:线程生命周期的关键问题 在多线程程序设计中,std::thread的管理是一个看似简单实则暗藏玄机的话题。想象一下,你精心设计的并发程序在大多数情况下运行良好,却在某些边缘情况下突然崩溃——这正是许多开发者在使用原生线程时遇到的噩梦场景。本文将深入探讨std::thread对象

By Ne0inhk
【C++指南】告别C字符串陷阱:如何实现封装string?

【C++指南】告别C字符串陷阱:如何实现封装string?

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本章节只详讲string中常用接口及实现,有其他需求查阅文档介绍。 🚀 今天通过了解string接口,从而实现封装自己的string类达到类似功能。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦! 引入 C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。因此在C++中string用封装的方式解决了这一问题。 string类的文档介绍 --> 如有需要自行查阅文档中接口实现。 auto和范围for auto关键字(自动推导类型):在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变

By Ne0inhk