Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
529c4b9
refactor: 目录按用途分组,删除 clangd 时代死代码
Sunrisepeak Oct 2, 2026
5a439a4
feat(i18n,config): 中英文案跟随 VS Code,配置注册表成为单一事实源
Sunrisepeak Oct 2, 2026
73d7dbd
feat(mcppls,cli): 能力探测/降级、C++ Modules 状态适配层、mcpp 协议与错误分层、缓存聚合
Sunrisepeak Oct 2, 2026
3160cd5
feat(views): 三棵视图树的纯模型、清理计划表与工程摘要
Sunrisepeak Oct 2, 2026
4c85f95
feat(buildscript): mcpp build-script API snapshot and self-contained …
Sunrisepeak Oct 2, 2026
e342eee
feat(toml): mcpp.toml 段/键/枚举快照与七条清单诊断
Sunrisepeak Oct 2, 2026
6feaa4d
chore(ci): 生成物漂移门禁与 npm 脚本
Sunrisepeak Oct 2, 2026
2569a7a
docs: 统一 mcpp.toml 枚举键名为 opt(mcpp 实际拼写)
Sunrisepeak Oct 2, 2026
f6042cc
docs: 记录 round 1 进展与下一轮起点
Sunrisepeak Oct 2, 2026
058788b
feat(views,commands): 视图容器、三棵视图、清理命令、C++ Modules 状态视图、配置面板与清单接线
Sunrisepeak Oct 2, 2026
32dc167
chore(release): 0.5.0 版本、英文更新日志与本地验收 profile
Sunrisepeak Oct 2, 2026
342ee26
docs: 英文 README 与中文对照,补齐用户文档;e2e 覆盖五种 mcppls 变体
Sunrisepeak Oct 2, 2026
0ee0319
test: 修正版本与双语 README 断言;e2e 支持用已安装的 VS Code 运行
Sunrisepeak Oct 2, 2026
a759edc
feat: 补齐 §8 缺口(TOML hover/跳转/键补全、缓存 webview 面板、设置接线)、CI 体系与两条防倒退门禁
Sunrisepeak Oct 2, 2026
69c3e3b
docs: 修正 round 3 起已实现的功能描述(TOML 悬停/跳转/键补全、缓存 webview 面板)
Sunrisepeak Oct 2, 2026
783e739
fix(package): 本地验收 profile 曾被打进 VSIX(4035 文件 64.7 MB)
Sunrisepeak Oct 2, 2026
5d8ecff
feat: 快捷键、视图可见性、设置重命名提示、语言服务版本提示;例外表防腐烂
Sunrisepeak Oct 2, 2026
8415024
feat: 64 个设置全部接线;例外表清零,改为'间接读取'证据表
Sunrisepeak Oct 2, 2026
519705c
docs(settings): 每个设置的中文说明直接取自 package.nls.zh-cn.json
Sunrisepeak Oct 2, 2026
c0a9568
ci(release): 发布产物也加体积与目录守卫
Sunrisepeak Oct 2, 2026
11c804c
docs(plan): 记录 round 5 进展
Sunrisepeak Oct 2, 2026
8518f89
feat(i18n): 硬编码中文 162 行清零,并加上'纯模块不依赖 vscode'的架构门禁
Sunrisepeak Oct 2, 2026
441e968
docs(plan): round 5 收尾状态
Sunrisepeak Oct 2, 2026
02a7758
feat(ui): 侧边栏重组为 工程 / mcpp 库生态 / 缓存(0.6.0)
Sunrisepeak Oct 2, 2026
c4c2222
fix(views): 修正'关闭视图会移除活动栏图标'这一错误假设,并补两处遗漏
Sunrisepeak Oct 2, 2026
11ded01
fix(ui): 按真实实例的 6 条反馈修正(0.6.0)
Sunrisepeak Oct 2, 2026
12e84f2
fix(ui): 修库视图渲染死循环、菜单图标配色、cache 默认折叠、状态栏背景(0.6.0)
Sunrisepeak Oct 2, 2026
51f2556
fix(ui): 侧边栏配比、库标签与详情页重排、年龄渐变、新建工程入口(0.6.0)
Sunrisepeak Oct 3, 2026
721fcb9
feat(menu): C++ Modules 分组补上抓日志与日志/压缩包定位(0.6.0 补)
Sunrisepeak Oct 3, 2026
273f299
refactor(library): 去掉筛选标签行、详情页合成一行按钮;说明活动栏 logo 为何是单色
Sunrisepeak Oct 3, 2026
3f1cec9
feat(library): 详情页认识"已添加/已安装版本",按钮变为切换版本;外链点击不再无声
Sunrisepeak Oct 3, 2026
7a7dd44
docs: 0.6.0 更新日志与 README 与实现对齐(含验收轮次修掉的真 bug)
Sunrisepeak Oct 3, 2026
34c7c35
fix(ci): 修好两处只在 CI 才会红的门禁(都不是功能 bug,但都该本地可复现)
Sunrisepeak Oct 3, 2026
8688388
fix(ci): isolated-install 自己下载 VS Code——runner 本来就没有 code CLI
Sunrisepeak Oct 3, 2026
02917a0
ci: 三平台矩阵——gates/e2e/isolated-install 都跑 Linux+macOS+Windows
Sunrisepeak Oct 3, 2026
461fd84
ci: VS Code 下载加外层重试与 .vscode-test 缓存(macos 瞬断过一轮)
Sunrisepeak Oct 3, 2026
88bfc31
docs: 方案 §21 仓库工程化四项——l10n 命名/目录树收敛/README 精简/Open VSX(仅方案,待 review)
Sunrisepeak Oct 3, 2026
e5eb1ca
docs: 0.6.x 仓库工程化实施方案——双市场发布/images 合并/README/webview 骨架(待 review,未动代码)
Sunrisepeak Oct 3, 2026
d065c35
docs: 实施方案 §7.1 记录作者答复——commit 6/7 批准,第 3 项待定
Sunrisepeak Oct 3, 2026
7024cac
build(release): 双市场发布——Open VSX 必发(缺 token 显式失败),Marketplace 未配 token…
Sunrisepeak Oct 3, 2026
31e2a74
chore: images/ 并入 media/——根目录少一个,全部 6 处引用对齐(package.json×2、README×2、图…
Sunrisepeak Oct 3, 2026
1cdc164
docs: README 中英重构——121/120 行收至 81/79,新增相关项目表(mcpp/mcppls/本插件 × 仓库+双市场…
Sunrisepeak Oct 3, 2026
96e4441
refactor(webview): 抽出 WebviewDocument——每视图 nonce + 只在文档变化时赋值;library …
Sunrisepeak Oct 3, 2026
9ace876
fix(cache): 缓存视图换用 WebviewDocument——数据未变的刷新不再整页重载,预算输入与滚动位置保留;nonce 由…
Sunrisepeak Oct 3, 2026
817be1e
refactor(config,library): 设置面板与详情页同用 WebviewDocument——nonce 全仓库一个铸造点,…
Sunrisepeak Oct 3, 2026
a8f43d4
chore: cache 四文件移入 src/cache/——views/ 只剩工程树,与 library/config 对称;PURE_…
Sunrisepeak Oct 3, 2026
cf9a420
docs: 实施方案 D1 表修正——设置面板本就 postMessage 更新不重载,迁移是骨架一致性收口
Sunrisepeak Oct 3, 2026
88cd23e
feat(library): 详情页真的认识"已添加"了——宿主读 mcpp.toml/mcpp.lock 填 installed(§20…
Sunrisepeak Oct 3, 2026
e0edc48
feat(library): 详情页 round 9 补——import 名按全 id(唯 mcpplibs 短名);命令/用法行代码块样…
Sunrisepeak Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
342 changes: 342 additions & 0 deletions .agents/docs/2026-10-02-implementation-plan.md

Large diffs are not rendered by default.

1,115 changes: 1,115 additions & 0 deletions .agents/docs/2026-10-02-plugin-optimisation-plan.md

Large diffs are not rendered by default.

1,445 changes: 1,445 additions & 0 deletions .agents/docs/2026-10-02-ui-ux-optimisation-plan.md

Large diffs are not rendered by default.

279 changes: 279 additions & 0 deletions .agents/docs/2026-10-03-repo-engineering-plan.md

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions .agents/docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# .agents/docs

本目录存放 **面向贡献者与 agent 的设计/背景文档**:对 mcpp-vscode 当前架构、跨仓库契约
与决策的记录。使用说明请看仓库根目录的 `README.md`。

| 文件 | 内容 | 状态 |
| --- | --- | --- |
| [`architecture.md`](architecture.md) | mcpp-vscode 的分层结构、模块职责与扩展点 | 现状 |
| [`mcpp-integration.md`](mcpp-integration.md) | 与 `mcpp-community/mcpp`(mcpp CLI)的接口契约 | 现状 |
| [`mcppls-integration.md`](mcppls-integration.md) | 与 `sunrisepeak.mcpp-language-server`(mcppls)的依赖与命令桥接契约 | 现状 |
| [`2026-10-02-plugin-optimisation-plan.md`](2026-10-02-plugin-optimisation-plan.md) | 插件优化方案 **v4**:目录树与 README、mcppls 依赖韧性、稳定基座、`mcpp.toml` 与 `build.mcpp` 编辑体验、缓存统计与两级清理、配色与可视化、i18n、统一配置模块与配置面板、**mcppls 状态与管理(§3.9)** | **待评审** |

边界:

- `docs/`(仓库根)= **用户文档**(安装、命令、设置、排错);
- `.agents/docs/` = **贡献者/agent 文档**(设计、契约、方案、决策);
- `.agents/superpowers/` = **过程文档**(原 `docs/superpowers/`,plans/specs);
- `.agents/reviews/` = **分析与评审记录**,已加入 `.gitignore`,不进入版本库。

背景分析见 `.agents/reviews/2026-10-02-mcpp-vscode-architecture-and-mcppls-dependency-review.md`。
77 changes: 77 additions & 0 deletions .agents/docs/architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# mcpp-vscode 架构

> 状态:0.4.0(mcppls 语言服务迁移之后)。本文记录**当前**结构;变动请同步更新。

## 1. 一句话定位

mcpp-vscode 是 **mcpp CLI 的 IDE 前端**:工程发现、任务(build/run/test/clean)、工具链管理、
`mcpp.toml` 的语法与结构补全。C++ 模块语义(诊断/补全/跳转/引用/模块图/状态)由扩展依赖
`sunrisepeak.mcpp-language-server`(mcppls)提供,本扩展**不创建 LSP 客户端**。

## 2. 分层

```
extension.ts VS Code 装配层:激活、命令注册、provider 注册、资源释放
├── cliController.ts CLI 编排层:快捷菜单、任务、工具链、新工程、操作互斥
│ ├── newProject.ts 新建工程流程(纯函数 + 注入的动作)
│ └── commands.ts 命令 ID 与快捷菜单清单(纯数据)
├── languageServer.ts mcppls 桥接层:只调用 4 个公开 VS Code 命令
├── moduleSetup.ts 一键流程状态机(build → 刷新语言服务)
├── inProject.ts `mcpp.inProject` 上下文键
├── mcppTomlCompletion.ts mcpp.toml 补全查询层(段头 + 写法模板)
├── mcppTomlParser.ts 容错 TOML 解析器(纯函数)
├── discovery.ts 最近的 mcpp.toml 发现(纯函数)
├── cli.ts mcpp CLI 输出解析(工具链清单)
├── process.ts runProcess 封装
└── tasks.ts 任务计划、退出码分类、操作注册表(纯函数)
```

**约束**:`tasks.ts` / `moduleSetup.ts` / `discovery.ts` / `cli.ts` / `mcppTomlParser.ts` /
`newProject.ts` 不 import `vscode`,因此可用 `node --test` 直接测。`extension.ts` 与
`cliController.ts` 是唯一接触 VS Code API 的地方。

## 3. 运行时边界

| 触发 | 行为 |
| --- | --- |
| 打开含 `mcpp.toml` 的工作区 | 激活;不执行 `mcpp`,不下载工具链 |
| 执行 mcpp 命令 | 通过 `vscode.Task` + `ProcessExecution` 在专用终端运行 |
| build 结束(含失败) | 调用一次 `mcppls.restartServer`(单飞,取消除外) |
| run/test/clean 结束 | 不触碰语言服务 |
| 未受信任工作区 | 只保留语法高亮与 TOML 结构补全 |

## 4. 并发模型

`McppOperationRegistry`(`tasks.ts`)做两级互斥:

- **项目级**(键 = 工程根):build/run/test/clean 互斥;
- **全局**:工具链安装 / 设置全局默认,与所有项目级操作互斥。

任务结束**先释放锁、再刷新语言服务**,避免刷新期间用户操作被拒。该顺序由
`test/artifacts.test.ts` 钉住。

## 5. 与 mcppls 的唯一接口

`languageServer.ts` 是全部耦合面:

| 本扩展命令 | 转发到 |
| --- | --- |
| `mcpp.configureLanguageServer`(+ 弃用别名 `mcpp.configureClangd`) | `mcppls.selectContext` |
| `mcpp.checkModuleSupport` | `mcppls.restartServer` |
| `mcpp.showModuleGraph` | `mcppls.showModuleGraph` |
| `mcpp.showLanguageServerLogs` | `mcppls.showLogs` |
| build 之后 | `mcppls.restartServer` |

不读 `mcppls.*` 设置、不解析 LSP、不写跨扩展配置。详见
[`mcppls-integration.md`](mcppls-integration.md)。

## 6. 已知的结构性债务

- `src/configureOnly.ts`、`src/ideWorkflow.ts` 在 0.4.0 迁移后已无生产调用者(仅被自身测试引用),
它们描述的是 `compile_commands.json` 时代的行为,与当前职责边界冲突。
- `cli.ts` 用正则解析 `mcpp toolchain list` 的**人类输出**,而 mcpp 已提供
`--format json` 的稳定契约。
- 命令 ID `mcpp.refreshCompilationDatabase` / `mcpp.checkModuleSupport` 是历史拼写,与当前语义
(build / restart)不符。

具体建议见 `.agents/reviews/` 下的评审报告。
80 changes: 80 additions & 0 deletions .agents/docs/mcpp-integration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# 与 mcpp CLI 的集成契约

> 对象:`mcpp-community/mcpp`(C++23 模块优先构建工具,下称 mcpp)。本文记录本扩展**实际
> 调用**的 mcpp 接口,以及 mcpp 已经提供、本扩展尚未使用的稳定接口。

## 1. 本扩展实际调用的命令

| 调用点 | 命令 | 依赖的输出 |
| --- | --- | --- |
| `cliController.newProject` | `mcpp new <name>` | 退出码 |
| `tasks.projectTaskPlan` | `mcpp build` / `run` / `test` / `clean` | 退出码(VS Code Task) |
| `cliController.readToolchainInventory` | `mcpp toolchain list` | **人类文本**(正则解析) |
| `cliController.selectDefaultToolchainFromInventory` | `mcpp toolchain default <spec>` | 退出码 |
| `cliController.pickInstallSpec` → `installToolchain` | `mcpp toolchain install <spec>` | 退出码 |

`mcpp.path` 为空时用 `"mcpp"`,由 VS Code 进程的 `PATH` 解析。

## 2. mcpp 已提供的稳定机读接口(本扩展未使用)

mcpp 有正式的机读输出协议(`docs/50-machine-output.md`)。**检测规则**:解析 stdout,
要求 `schemaVersion` 与 `kind` 存在;**不要**用退出码或"命令没报错"来判断支持与否。

| 命令 | `kind` | 用途 |
| --- | --- | --- |
| `mcpp --protocol-version` | `mcpp.protocol` | 静态探测:信封版本、各 kind 版本、每个命令的 `effects`;无副作用 |
| `mcpp self env --format json` | `mcpp.env` | `mcppHome` / `registry` / `xlingsBinary` / `config` / `buildCache` / `mcppVersion` / `defaultToolchain`;**只读**,不会创建 `$MCPP_HOME` |
| `mcpp toolchain list --format json` | `mcpp.toolchain.list` | `{host, toolchains[], targets[]}`,字段 `family`/`version`/`default`/`source`,target 行含 `target`/`note`/`toolchain`/`pin`/`status`/`default` |
| `mcpp emit build-database [--spec s1\|compile-commands] --format json` | `mcpp.build-database` | 构建计划;**不写工程目录**(`--configure-only` 会写 `compile_commands.json`) |
| `mcpp why toolchain --format json` | `mcpp.why.toolchain` | 某个 (target, toolchain) 的解析依据,含 `reason` token |

信封形态:

```jsonc
{ "schemaVersion": 1, "kind": "...", "kindVersion": 1,
"effects": [], "mcpp": { "version": "2026.9.30.2",
"protocol": { "min": 1, "max": 1 } },
"data": {}, "diagnostics": [] }
```

`kind` 内字段只增不删、含义不变;破坏性变更提升 `kindVersion`。

## 3. 流与退出码

- **stdout = 结果,stderr = 叙述**(2026.9.30.2 起;此前叙述在 stdout)。`mcpp toolchain list`
这样的"列表"命令,列表本身在 stdout。
- `--format json`(带信封)与 `--json`(裸文档,如 `mcpp cache list --json`)是两种**永久并存**
的输出;`ndjson` 不被 `--format` 接受。
- `mcpp build --configure-only` 在规划失败(无 `mcpp.toml`、工具链/依赖解析失败)时返回 **2**,
而不是 1;`mcpp emit build-database` 对同类失败返回 **1** 并给出信封与 `diagnostics`。
- 完整退出码契约(SPEC-003):`0` 成功、`1` 运行期失败、`2` 用法错误、**`4` 环境未就绪**、
`70` 内部错误、`101` **仅 `mcpp run`** 的构建失败、`127` 未知命令。
- **退出码不得用于协议识别**:判断某功能是否支持,唯一跨版本成立的判据是解析 stdout。
- `1` 可以与 stdout 上的信封同时出现,不要因为非零退出就丢弃已解析到的文档。
- `mcpp run` 透传被运行程序的退出码(`0–124`);`125/126/127` 是 spawn 被拒。

## 4. 明确不是接口的东西

`docs/51-supported-versions.md` 的表面稳定性表把 `mcpp.toml` 键、CLI 命令与标志、机读输出、
`build.mcpp` 指令协议、`mcpp.lock`、target 行列为 additive;而 **构建指纹、缓存布局与
`target/` 下的内容不是接口**,无通知即变。判断"要不要重新规划"请用
`mcpp emit build-database` 的 `watch` 与 `inputs-fingerprint`。

## 5. mcpp 版本

形如 `2026.10.1.3`(`年.月.日.序号`),数字**不携带**兼容性承诺。`mcpp --version` 输出
`mcpp <version>`(**无** `v` 前缀);`mcpp --help` 的横幅反而带 `v`,不要从那里抓版本。
机读版本号在 `mcpp self env --format json` 的 `data.mcppVersion`,以及任何信封的
`mcpp.version`。mcpp 自身仍标注为早期项目,接口与行为可能变化;`docs/50` 与 `docs/specs/`
是兼容性承诺的来源。

## 6. 本扩展对 mcpp 的已知假设(需要随 mcpp 版本复核)

1. `mcpp toolchain list` 的人类输出包含 `Toolchains:` / `Targets:` / `Available toolchains...:` 段,
用 `*` 标记有效项,并用 `global default is '<spec>'` 报告全局默认。
—— 在 mcpp 2026.9.30.2 上已观察不到该 `global default` 行,解析器会退化为用"有效项"充当
全局默认。
2. `mcpp toolchain list` 的每一行可用 `family version [/ version...]` 或 `family@version` 形式解析。
3. `mcpp new <name>` 的模板不做 TOML/C++ 转义,且名字包含 `PROJECT` 时模板替换不终止
(mcpp#380);`newProject.ts` 因此做名称白名单校验。
4. `--configure-only` 会写 `compile_commands.json`,成功条件是退出码 0 且该文件可解析。
Loading
Loading