🐞 fix: 修复env set会丢失配置注释文档

This commit is contained in:
2025-12-15 20:07:01 +08:00
parent 1329643932
commit 33372e5102
4 changed files with 69 additions and 321 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "aide-plugin",
"description": "Aide 工作流体系插件,提供环境配置、项目认知、文档管理和任务执行的标准化流程",
"version": "2.0.0",
"version": "2.0.1",
"author": {
"name": "Aide Team"
},

View File

@@ -1,211 +0,0 @@
---
description: 任务执行流程。基于任务细则执行任务,包含流程设计、迭代实现、验证交付、文档更新。
argument-hint: [任务细则文档路径]
---
# Aide 任务执行
你正在执行 Aide 任务执行流程。基于任务细则完成实际的任务实施。
## 参数
- `$ARGUMENTS`:任务细则文档路径(可选)
- 未传入时使用配置中的默认路径
---
## 前置准备
**首先触发 `aide` skill 学习 aide 命令的使用方法。**
这是必要步骤,确保你了解 `aide flow` 等命令的正确用法。
---
## 开始
### 确定任务细则
```bash
# 如果传入了参数
细则文档 = $ARGUMENTS
# 如果未传入参数,使用配置默认值
aide config get task.spec
```
读取任务细则内容。如文档不存在,提示用户先执行 `/aide:prep` 或指定文档路径。
### 进入流程设计环节
```bash
aide flow next-part flow-design "进入流程设计环节"
```
---
## 环节 1流程设计 (flow-design)
### 理解任务细则
- 明确任务目标和成功标准
- 理解执行步骤和依赖关系
- 识别技术决策和约束
### 分析项目环境
根据需要阅读相关代码/文档。
### 制定执行计划
- 具体的实现步骤
- 每个步骤的预期产出
- 潜在风险和应对方案
> 复杂任务建议使用 sequential-thinking 进行结构化规划
### 创建流程图(如需要)
在配置指定的流程图目录创建 PlantUML 源文件。
```bash
aide flow next-step "流程图设计完成"
```
> aide flow 会在此环节自动校验 PlantUML 语法
### 进入下一环节
```bash
aide flow next-part main "流程设计完成,进入实现环节"
```
> aide flow 会自动生成 PNG 流程图
---
## 环节 2迭代实现 (impl)
### 按计划执行
对于每个实现步骤,完成后记录:
```bash
aide flow next-step "<完成内容简述>"
```
### 处理问题
```bash
# 一般问题(可继续)
aide flow issue "<问题描述>"
# 严重错误(需解决)
aide flow error "<错误描述>"
```
严重错误处理:
1. 尝试自行解决最多3次
2. 成功:在 `discuss/` 创建分析文档
3. 失败:停止并告知用户
### 需要回退时
```bash
# 回退到上一步
aide flow back-step "<原因>"
# 回退到之前环节
aide flow back-part <环节名> "<原因>"
```
### 进入下一环节
```bash
aide flow next-part verify "实现完成,进入验证环节"
```
---
## 环节 3验证交付 (verify)
### 对照任务细则验证
- 每个成功标准是否满足
- 每个交付物是否完成
- 功能是否正常工作
### 执行测试
根据项目情况运行测试或手动验证。
### 记录结果
```bash
aide flow next-step "验证完成: <验证结论>"
```
验证失败时回退修复:
```bash
aide flow back-part main "验证失败: <原因>"
```
### 进入下一环节
```bash
aide flow next-part docs "验证通过,进入文档环节"
```
---
## 环节 4文档更新 (docs)
> aide flow 会在进入此环节时提示更新 CHANGELOG
### 更新相关文档
- `README.md`(如有用户可见变更)
- `CHANGELOG.md`
- 其他相关文档
### 记录完成
```bash
aide flow next-step "文档更新完成"
```
### 进入下一环节
```bash
aide flow next-part finish "文档更新完成,进入收尾"
```
> aide flow 会校验 CHANGELOG 是否已更新
---
## 环节 5收尾 (finish)
### 清理工作
- 删除临时文件和调试代码
- 确保代码格式规范
- 检查遗漏的 TODO
### 最终检查
确认所有计划步骤已完成。
### 记录完成
```bash
aide flow next-step "任务完成"
```
### 向用户汇报
总结本次任务:
- 完成了什么
- 主要变更点
- 遗留问题(如有)

View File

@@ -1,106 +0,0 @@
---
description: 项目认知与环境初始化。进入新项目或开始工作前使用,触发对项目的主动认知和环境检测修复。
argument-hint: [无参数]
---
# Aide 初始化
你正在使用 Aide 工作流体系。本命令帮助你快速认知项目并确保环境就绪。
---
## 核心约束(必须遵守)
**禁止直接读取或编辑 `.aide/` 目录下的任何文件!**
- ❌ 禁止使用 Read 工具读取 `.aide/config.toml`
- ❌ 禁止使用 Edit/Write 工具修改 `.aide/` 下的文件
- ✅ 必须通过 `aide config get/set` 读写配置
- ✅ 必须通过 `aide env set` 修改环境配置
- ✅ 配置有误时,触发 `env-config` skill 学习正确的设置方法
**原因**`.aide/` 是 aide 程序的内部数据目录,直接操作可能导致格式错误或状态不一致。
---
## 执行步骤
### 1. Aide 运行时环境检测
首先确保 aide 程序本身可以正常运行:
```bash
aide env ensure --runtime
```
根据输出处理:
- `✓`aide 运行时就绪,继续
- `✗`:按提示修复后重试,无法修复则告知用户
> **重要**`--runtime` 参数表示仅检查 aide 自身运行环境,不依赖项目配置文件
### 2. Aide 数据目录初始化
```bash
aide init
```
此命令会:
- 创建 `.aide/` 目录(如不存在)
- 生成默认配置文件
- 检查并更新 `.gitignore`
### 3. 项目认知
快速建立对项目的整体理解:
1. 阅读项目根目录的 `README.md`(如存在)
2. 阅读 `CLAUDE.md`(如存在)
3. 浏览项目目录结构,理解核心模块划分
4. 识别项目类型和主要技术栈
向用户简要汇报项目概况3-5句话
### 4. 项目环境检测
```bash
aide env ensure
```
根据输出处理:
- `✓`:环境就绪,**直接进入步骤 5**(不要再查看配置文件)
- `⚠`:有警告但可继续,记录警告信息并继续
- `✗`**触发 `env-config` skill**,学习如何使用 `aide env set` 命令修复配置,然后重试
**环境检测失败时的正确做法**
1. 触发 `env-config` skill 获取配置指导
2. 使用 `aide env set <模块>.<配置项> <值>` 修改配置
3. 重新执行 `aide env ensure` 验证
**错误做法**(禁止):
- 直接编辑 `.aide/config.toml` 文件
### 5. 汇报就绪状态
环境检测通过后,直接向用户汇报(不要再读取配置文件):
```
项目概况:[来自步骤3的概要]
环境状态:[aide env ensure 的输出结果]
Aide 已就绪,可用命令:
- /aide:prep [文档路径] - 任务准备
- /aide:exec [文档路径] - 任务执行
```
> 注:任务文档路径等配置信息已在 aide env ensure 输出中显示,无需额外查看配置文件。
---
## 注意事项
1. **不要读取 `.aide/` 目录下的文件**——所有配置操作通过 aide 命令完成
2. 如果在初始化过程中发现严重环境问题无法解决,建议用户修复后重开对话
3. 本命令只做认知和环境准备,不修改任何业务代码
4. 所有输出使用简体中文

View File

@@ -295,12 +295,77 @@ class ConfigManager:
return self._walk_get(data, key)
def set_value(self, key: str, value: Any) -> None:
data = self.ensure_config()
self._walk_set(data, key, value)
self._write_config(data)
self.ensure_config()
self._update_config_value(key, value)
output.ok(f"已更新 {key} = {value!r}")
def _update_config_value(self, key: str, value: Any) -> None:
"""保守更新配置值,保留注释和格式。"""
import re
content = self.config_path.read_text(encoding="utf-8")
parts = key.split(".")
# 格式化值为 TOML 格式
if isinstance(value, bool):
toml_value = "true" if value else "false"
elif isinstance(value, str):
toml_value = f'"{value}"'
elif isinstance(value, (int, float)):
toml_value = str(value)
elif isinstance(value, list):
toml_value = toml_dumps({"_": value}).split("=", 1)[1].strip()
else:
toml_value = toml_dumps({"_": value}).split("=", 1)[1].strip()
new_content = None
count = 0
if len(parts) == 1:
# 顶层键key = value
pattern = rf'^({re.escape(parts[0])}\s*=\s*)(.*)$'
new_content, count = re.subn(pattern, rf'\g<1>{toml_value}', content, count=1, flags=re.MULTILINE)
elif len(parts) >= 2:
# 两级或三级键:找到对应 section然后替换其中的 key
if len(parts) == 2:
section = parts[0]
subkey = parts[1]
else:
section = ".".join(parts[:-1])
subkey = parts[-1]
# 找到 section 的起始位置
section_pattern = rf'^\[{re.escape(section)}\]\s*$'
section_match = re.search(section_pattern, content, flags=re.MULTILINE)
if section_match:
section_start = section_match.end()
# 找到下一个 section 的位置(或文件末尾)
next_section = re.search(r'^\[', content[section_start:], flags=re.MULTILINE)
if next_section:
section_end = section_start + next_section.start()
else:
section_end = len(content)
# 在 section 范围内查找并替换 key
section_content = content[section_start:section_end]
key_pattern = rf'^({re.escape(subkey)}\s*=\s*)(.*)$'
new_section, count = re.subn(key_pattern, rf'\g<1>{toml_value}', section_content, count=1, flags=re.MULTILINE)
if count > 0:
new_content = content[:section_start] + new_section + content[section_end:]
if count == 0 or new_content is None:
# 键不存在,需要添加(回退到传统方式,会丢失注释)
data = self.load_config()
self._walk_set(data, key, value)
self._write_config(data)
output.warn("配置键不存在,已添加(注释可能丢失)")
else:
self.config_path.write_text(new_content, encoding="utf-8")
def _write_config(self, data: dict[str, Any]) -> None:
"""完全重写配置文件(会丢失注释,仅在添加新键时使用)。"""
self.config_path.write_text(toml_dumps(data), encoding="utf-8")
@staticmethod