@chengzhao-dev/dsh-cpp-workflow 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 chengzhao-dev
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ MIT License
2
+
3
+ Copyright (c) 2026 chengzhao-dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
package/README.en.md CHANGED
@@ -18,13 +18,13 @@ Both skills read the project skill `cpp-workflow-project` first. Without it, the
18
18
  Pinned npm install:
19
19
 
20
20
  ```bash
21
- dsh plugin --profile web add npm:@chengzhao-dev/dsh-cpp-workflow@0.1.0
21
+ dsh plugin --profile web add npm:@chengzhao-dev/dsh-cpp-workflow@0.1.1
22
22
  ```
23
23
 
24
24
  The matching Git tag:
25
25
 
26
26
  ```bash
27
- dsh plugin --profile web add github:chengzhao-dev/dsh-cpp-workflow#v0.1.0
27
+ dsh plugin --profile web add github:chengzhao-dev/dsh-cpp-workflow#v0.1.1
28
28
  ```
29
29
 
30
30
  The desktop app owns the `desktop` profile. If the command-line `add` is rejected, add the plugin in the app settings and use the same pinned npm version. A Git tag install uses the prebuilt `lib/` committed in the repository and runs no build on the target machine; the package has no install script that needs approval.
@@ -96,7 +96,6 @@ Requires Node.js 22 or newer.
96
96
  ```bash
97
97
  npm ci
98
98
  npm test # build, structural check, gate/environment/schema tests
99
- npm run check # same as npm test
100
99
  npm run pack:check # inspect the npm package contents
101
100
  ```
102
101
 
package/README.md CHANGED
@@ -18,13 +18,13 @@
18
18
  npm 安装钉死版本:
19
19
 
20
20
  ```bash
21
- dsh plugin --profile web add npm:@chengzhao-dev/dsh-cpp-workflow@0.1.0
21
+ dsh plugin --profile web add npm:@chengzhao-dev/dsh-cpp-workflow@0.1.1
22
22
  ```
23
23
 
24
24
  同版本的 Git 标签:
25
25
 
26
26
  ```bash
27
- dsh plugin --profile web add github:chengzhao-dev/dsh-cpp-workflow#v0.1.0
27
+ dsh plugin --profile web add github:chengzhao-dev/dsh-cpp-workflow#v0.1.1
28
28
  ```
29
29
 
30
30
  桌面应用独占 `desktop` profile。命令行 `add` 被拒绝时,在应用设置里添加插件,地址填同一个 npm 版本。Git 标签安装使用仓库内已构建的 `lib/`,不在目标机器上重新构建;包内也不含需要授权执行的安装脚本。
@@ -96,7 +96,6 @@ dsh-cpp-workflow/
96
96
  ```bash
97
97
  npm ci
98
98
  npm test # 构建、结构检查、门禁/环境/schema 测试
99
- npm run check # 同 npm test
100
99
  npm run pack:check # 核对 npm 包内容
101
100
  ```
102
101
 
package/cordis.patch.yml CHANGED
@@ -4,11 +4,8 @@
4
4
  # replaced. The row loads this package's `main` entry, which registers the
5
5
  # packaged developing-cpp and building-cpp skills through `ctx.skills`.
6
6
  #
7
- # Install from npm or from the matching Git tag, for example:
8
- #
9
- # dsh plugin --profile web add npm:@chengzhao-dev/dsh-cpp-workflow@0.1.0
10
- # dsh plugin --profile web add github:chengzhao-dev/dsh-cpp-workflow#v0.1.0
11
- #
7
+ # Install with `dsh plugin --profile <name> add <package>`. Pinned npm and Git
8
+ # tag addresses are in the README's Install section.
12
9
  - insert:
13
10
  - id: cpp-workflow
14
11
  name: "@chengzhao-dev/dsh-cpp-workflow"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chengzhao-dev/dsh-cpp-workflow",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "C++20 工程流程技能包:源码四步与构建三步,按项目声明的环境组合校验 · C++20 workflow skills for DeepSeek Harness",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -43,7 +43,6 @@
43
43
  "scripts": {
44
44
  "build": "tsc -p tsconfig.json",
45
45
  "test": "npm run build && node scripts/checking-skill-links.mjs && node --test tests/*.test.mjs",
46
- "check": "npm test",
47
46
  "pack:check": "npm pack --dry-run"
48
47
  },
49
48
  "keywords": [
@@ -1,76 +1,76 @@
1
- # 第 1 步:定构建
2
-
3
- ## 产出
4
-
5
- 一组 target-based 的 CMake 规则、一个固定的构建目录、一个可用的编译数据库。构建结果只取决于 `environment.json` 声明的组合,不取决于当前 shell 碰巧有什么。
6
-
7
- ```text
8
- CMakeLists.txt
9
- build/
10
- clang/ # compiler=clang
11
- compile_commands.json
12
- gcc/ # compiler=gcc
13
- compile_commands.json
14
- compile_commands.json # 指向上面的当前数据库
15
- ```
16
-
17
- ## 通用情况
18
-
19
- 先读 `environment.json`。三个轴分别表示:
20
-
21
- | 轴 | 取值 | 含义 |
22
- | --- | --- | --- |
23
- | `host` | `windows` / `linux` / `macos` | 编辑器与代理壳所在系统 |
24
- | `build_host` | `native` / `wsl` | 执行编译和运行产物的环境;`native` 表示 `host` 本机,`wsl` 表示 Windows 的 WSL,且只允许 `host=windows` |
25
- | `compiler` | `clang` / `gcc` | 用哪个编译器;一次只配一个 |
26
-
27
- 轴为空、值未知或组合非法(如 `host=linux` + `build_host=wsl`)时,停在定构建,先让用户把 `environment.json` 填对。不要替用户选 WSL、Clang 或构建目录。
28
-
29
- 构建规则:
30
-
31
- - CMake 最低 3.20;`project(... LANGUAGES CXX)`;只有确有 C 源时才写 `LANGUAGES C CXX`。目标标准 C++20。
32
- - 生成器固定单配置 Ninja,不用 Ninja Multi-Config:同一源文件会写多条命令,clangd 默认只取第一条,容易读错数据库(clangd#2026);构建目录固定 `build/clang` 或 `build/gcc`。
33
- - 一个 configure 只用一个编译器:`-DCMAKE_CXX_COMPILER=clang++` 或 `g++`。
34
- - 程序 target 固定叫 `app`;库 target 用组件名,程序链接库。库与程序分开,不把 `main()` 编进库。
35
- - 用 `target_include_directories`、`target_compile_features`、`target_link_libraries` 表达依赖;禁止全局 `include_directories()`、`add_definitions()`、`CMAKE_CXX_FLAGS` 污染所有 target。
36
- - 库的公共 include 根用 `PUBLIC`;实现私有头用 `PRIVATE`;测试 target 只链接被测库的公共接口。
37
- - `set(CMAKE_EXPORT_COMPILE_COMMANDS ON)`;Ninja 生成器下会产出 `compile_commands.json`。
38
- - 输出目录统一:可执行文件到 `build/<compiler>/bin`,库到 `build/<compiler>/lib`;不要用源码目录当输出目录。
39
- - 开启 `CMAKE_EXPORT_COMPILE_COMMANDS` 后,把 `build/<compiler>/compile_commands.json` 符号链接到 `build/compile_commands.json`,让 clangd 默认能找到当前数据库。本插件固定产出 `build/<compiler>/` 并在 `build/` 下维护链接,不生成 `out/build/`,也不把两套构建根混用。
40
- - 目标标准写在 target 上:`target_compile_features(app PRIVATE cxx_std_20)`;库用 `PUBLIC` 传播标准。每个 target 再加 `CXX_EXTENSIONS OFF`,避免 CMake 默认的 `-std=gnu++20`。
41
- - 工程确有 C 源时才写 `LANGUAGES C CXX`,并且 `CMAKE_C_COMPILER` 与 `CMAKE_CXX_COMPILER` 必须来自同一套编译器(`clang`/`clang++` 或 `gcc`/`g++`);没有 C 源时只启用 CXX。
42
- - 不写 `file(GLOB ...)`;源文件显式列出,新增文件时改 CMake。
43
- - 不加 `-march=native`、`-ffast-math` 等改变语义或可移植性的选项;警告选项按团队约定统一加。
44
- - 配置阶段不隐式下载依赖;需要 GoogleTest 时由项目显式选择固定版本、带哈希的 `FetchContent`,或使用项目自带的 cmake 模块,只把下载用于测试依赖。
45
-
46
- 命令形状:
47
-
48
- ```bash
49
- cmake -S . -B build/clang -G Ninja \
50
- -DCMAKE_BUILD_TYPE=Debug \
51
- -DCMAKE_CXX_COMPILER=clang++ \
52
- -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
53
- cmake --build build/clang
54
- rm -f build/compile_commands.json
55
- ln -s clang/compile_commands.json build/compile_commands.json
56
- ```
57
-
58
- GCC 模式把目录和编译器换成 `build/gcc`、`g++`。工程确有 C 源时,再补 `-DCMAKE_C_COMPILER=clang` 或 `gcc`,和 C++ 编译器同属一套。每次构建都重新 configure;不要依赖上一次的缓存。
59
-
60
- ## 情况
61
-
62
- **新工程**:从 `assets/templates/projects/` 选形态:`single` 单文件、`multi` 多文件单程序、`static-library` 静态库 + 程序、`shared-library` 动态库 + 程序。只复制目标工程缺的文件;已有的 `CMakeLists.txt`、`.clang-*`、源码不覆盖。模板里的 `{{PROJECT_NAME}}` 换成真实工程名。
63
-
64
- **已有工程**:先读现有 `CMakeLists.txt`,找出全局设置、GLOB、输出目录和 target 命名;只改与当前任务相关的一处。大改前先让通过检查的项目入口跑通,保留可回退点。
65
-
66
- **库 + 程序**:库 target 的 `PUBLIC` include 根指向 `<component>/include`;程序 target 只链接库,不直接包含库的 `src/`。静态库与动态库的接口相同;动态库额外设置运行时库路径。
67
-
68
- **测试**:`enable_testing()` 放在顶层,`add_subdirectory(tests)` 在 `add_subdirectory(<component>)` 之后;测试 target 用 `add_test(NAME ... COMMAND ...)` 注册。没有测试时不要为了「看起来完整」加空测试。
69
-
70
- **CMakePresets**:如果项目使用 preset,名称固定 `clang` / `gcc`,与构建目录一致;没有 preset 时直接用上面的命令,不要两套并存。
71
-
72
- ## 正反例指针
73
-
74
- - 全局 include、GLOB、把 `main()` 编进库:`examples/cmake.md`。
75
- - 正确的最小库 + 程序:`examples/cmake.md`「最小可用形状」。
76
- - target 与目录的完整说明:`references/cmake.md`。
1
+ # 第 1 步:定构建
2
+
3
+ ## 产出
4
+
5
+ 一组 target-based 的 CMake 规则、一个固定的构建目录、一个可用的编译数据库。构建结果只取决于 `environment.json` 声明的组合,不取决于当前 shell 碰巧有什么。
6
+
7
+ ```text
8
+ CMakeLists.txt
9
+ build/
10
+ clang/ # compiler=clang
11
+ compile_commands.json
12
+ gcc/ # compiler=gcc
13
+ compile_commands.json
14
+ compile_commands.json # 指向上面的当前数据库
15
+ ```
16
+
17
+ ## 通用情况
18
+
19
+ 先读 `environment.json`。三个轴分别表示:
20
+
21
+ | 轴 | 取值 | 含义 |
22
+ | --- | --- | --- |
23
+ | `host` | `windows` / `linux` / `macos` | 编辑器与代理壳所在系统 |
24
+ | `build_host` | `native` / `wsl` | 执行编译和运行产物的环境;`native` 表示 `host` 本机,`wsl` 表示 Windows 的 WSL,且只允许 `host=windows` |
25
+ | `compiler` | `clang` / `gcc` | 用哪个编译器;一次只配一个 |
26
+
27
+ 轴为空、值未知或组合非法(如 `host=linux` + `build_host=wsl`)时,停在定构建,先让用户把 `environment.json` 填对。不要替用户选 WSL、Clang 或构建目录。
28
+
29
+ 构建规则:
30
+
31
+ - CMake 最低 3.20;`project(... LANGUAGES CXX)`;只有确有 C 源时才写 `LANGUAGES C CXX`。目标标准 C++20。
32
+ - 生成器固定单配置 Ninja,不用 Ninja Multi-Config:同一源文件会写多条命令,clangd 默认只取第一条,容易读错数据库(clangd#2026);构建目录固定 `build/clang` 或 `build/gcc`。
33
+ - 一个 configure 只用一个编译器:`-DCMAKE_CXX_COMPILER=clang++` 或 `g++`。
34
+ - 程序 target 固定叫 `app`;库 target 用组件名,程序链接库。库与程序分开,不把 `main()` 编进库。
35
+ - 用 `target_include_directories`、`target_compile_features`、`target_link_libraries` 表达依赖;禁止全局 `include_directories()`、`add_definitions()`、`CMAKE_CXX_FLAGS` 污染所有 target。
36
+ - 库的公共 include 根用 `PUBLIC`;实现私有头用 `PRIVATE`;测试 target 只链接被测库的公共接口。
37
+ - `set(CMAKE_EXPORT_COMPILE_COMMANDS ON)`;Ninja 生成器下会产出 `compile_commands.json`。
38
+ - 输出目录统一:可执行文件到 `build/<compiler>/bin`,库到 `build/<compiler>/lib`;不要用源码目录当输出目录。
39
+ - 开启 `CMAKE_EXPORT_COMPILE_COMMANDS` 后,把 `build/<compiler>/compile_commands.json` 符号链接到 `build/compile_commands.json`,让 clangd 默认能找到当前数据库。本插件固定产出 `build/<compiler>/` 并在 `build/` 下维护链接,不生成 `out/build/`,也不把两套构建根混用。
40
+ - 目标标准写在 target 上:`target_compile_features(app PRIVATE cxx_std_20)`;库用 `PUBLIC` 传播标准。每个 target 再加 `CXX_EXTENSIONS OFF`,避免 CMake 默认的 `-std=gnu++20`。
41
+ - 工程确有 C 源时才写 `LANGUAGES C CXX`,并且 `CMAKE_C_COMPILER` 与 `CMAKE_CXX_COMPILER` 必须来自同一套编译器(`clang`/`clang++` 或 `gcc`/`g++`);没有 C 源时只启用 CXX。
42
+ - 不写 `file(GLOB ...)`;源文件显式列出,新增文件时改 CMake。
43
+ - 不加 `-march=native`、`-ffast-math` 等改变语义或可移植性的选项;警告选项按团队约定统一加。
44
+ - 配置阶段不隐式下载依赖;需要 GoogleTest 时由项目显式选择固定版本、带哈希的 `FetchContent`,或使用项目自带的 cmake 模块,只把下载用于测试依赖。
45
+
46
+ 命令形状:
47
+
48
+ ```bash
49
+ cmake -S . -B build/clang -G Ninja \
50
+ -DCMAKE_BUILD_TYPE=Debug \
51
+ -DCMAKE_CXX_COMPILER=clang++ \
52
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
53
+ cmake --build build/clang
54
+ rm -f build/compile_commands.json
55
+ ln -s clang/compile_commands.json build/compile_commands.json
56
+ ```
57
+
58
+ GCC 模式把目录和编译器换成 `build/gcc`、`g++`。工程确有 C 源时,再补 `-DCMAKE_C_COMPILER=clang` 或 `gcc`,和 C++ 编译器同属一套。每次构建都重新 configure;不要依赖上一次的缓存。
59
+
60
+ ## 情况
61
+
62
+ **新工程**:从 `assets/templates/projects/` 选形态:`single` 单文件、`multi` 多文件单程序、`static-library` 静态库 + 程序、`shared-library` 动态库 + 程序。只复制目标工程缺的文件;已有的 `CMakeLists.txt`、`.clang-*`、源码不覆盖。模板里的 `{{PROJECT_NAME}}` 换成真实工程名。
63
+
64
+ **已有工程**:先读现有 `CMakeLists.txt`,找出全局设置、GLOB、输出目录和 target 命名;只改与当前任务相关的一处。大改前先让通过检查的项目入口跑通,保留可回退点。
65
+
66
+ **库 + 程序**:库 target 的 `PUBLIC` include 根指向 `<component>/include`;程序 target 只链接库,不直接包含库的 `src/`。静态库与动态库的接口相同;动态库额外设置运行时库路径。
67
+
68
+ **测试**:`enable_testing()` 放在顶层,`add_subdirectory(tests)` 在 `add_subdirectory(<component>)` 之后;测试 target 用 `add_test(NAME ... COMMAND ...)` 注册。没有测试时不要为了「看起来完整」加空测试。
69
+
70
+ **CMakePresets**:如果项目使用 preset,名称固定 `clang` / `gcc`,与构建目录一致;没有 preset 时直接用上面的命令,不要两套并存。
71
+
72
+ ## 正反例指针
73
+
74
+ - 全局 include、GLOB、把 `main()` 编进库:`examples/cmake.md`。
75
+ - 正确的最小库 + 程序:`examples/cmake.md`「最小可用形状」。
76
+ - target 与目录的完整说明:`references/cmake.md`。
@@ -1,41 +1,41 @@
1
- # 第 2 步:定工具配置
2
-
3
- ## 产出
4
-
5
- 工程自己的 `.clang-format`、`.clang-tidy`、`.clangd` 和编辑器推荐配置。三份配置各管一段:格式化、静态检查、语言服务,不互相复制规则。
6
-
7
- ## 通用情况
8
-
9
- - 工程拥有配置:`.clang-format`、`.clang-tidy`、`.clangd`、`.vscode/` 放在工程根;不要依赖用户主目录或插件目录里的同名文件。
10
- - 只复制缺失的文件。已有配置先读再改,不覆盖;需要合并时逐项说明理由。
11
- - 工具角色固定:`clang-format` 管排版,`clang-tidy` 管静态诊断,`clangd` 管补全/跳转/诊断;无论 `compiler` 是 clang 还是 gcc,这三件都用 Clang 工具链。
12
- - 版本要求见 `references/environment.md`:Clang 模式要求 `clang++`、`clang-format`、`clang-tidy`、`clangd` 同一 LLVM 主版本;GCC 模式要求 `clang-format` / `clang-tidy` ≥ 16,`clangd` 只要求可用。
13
- - `.clangd` 的 `CompilationDatabase` 指向 `build/<compiler>`;切换编译器时同步改,不能留旧目录。
14
- - `--query-driver` 是 clangd 的命令行参数,写在 `.vscode/settings.json` 的 `clangd.arguments` 里,不是 `.clangd` 的 YAML 键。它告诉 clangd 允许执行哪个编译器驱动来取系统头路径;路径写绝对路径,并与 `environment.json` 的编译器一致。
15
- - 首次复制时按轴替换两个值:`compiler=clang` 用 `CompilationDatabase: build/clang` 和 `--query-driver=/usr/bin/clang++`;`compiler=gcc` 用 `build/gcc` 和 `/usr/bin/g++`。只复制模板而不改这两处,GCC 模式会指向错误的数据库或驱动。原工程已有的 `.clangd` 不覆盖;要改先征得同意。
16
- - `.clang-format` 固定 `BasedOnStyle: Google`、`Standard: c++20`、`ColumnLimit: 100`、`DerivePointerAlignment: false`、`PointerAlignment: Left`;`IncludeCategories` 维持包含顺序。不要逐项手调换行。
17
- - `.clang-tidy` 保留 `bugprone-*`、`cppcoreguidelines-*`、`misc-*`、`modernize-*`、`performance-*`、`portability-*`、`readability-*`、`clang-analyzer-core.*` 和四条 `google-*` 的主体;关闭项必须写理由。不要把整个检查族一关了之。
18
- - `.vscode/extensions.json` 推荐 clangd 与 CMake Tools;`.vscode/settings.json` 固定 clangd 参数和 CMake 构建目录。配置注释用 JSONC 的 `//`,贴在被解释的键上方。
19
- - 配置注释写「为什么这样设」,不写「这一项是什么」;不写策略头、不指向文档路径。
20
- - 格式化与静态检查只扫描项目源码:`src/`、`include/`、`apps/`、`tests/` 等实际存在的源码根;不扫描 `build/`、第三方目录、生成文件。
21
- - `clang-tidy` 用 `-p build/<compiler>` 读取编译数据库,`--header-filter` 只列项目根下的顶层目录,避免把第三方头纳入;不要加 `--system-headers`,也不要用 clang-tidy 19 才加入、16 没有的 `--exclude-header-filter`。
22
- - 格式化用 `--dry-run --Werror` 做检查;需要自动修复时单独运行 `-i`,不要让构建脚本悄悄改源码。
23
- - 工程模板里不预置 `compile_commands.json`;它由定构建的 configure 生成,是构建产物。
24
-
25
- ## 情况
26
-
27
- **新工程**:从 `assets/config/` 复制 `.clang-format`、`.clang-tidy`、`.clangd` 和 `.vscode/` 两个文件,按编译器的映射改 `.clangd` 的编译数据库目录和 `.vscode/settings.json` 的 `--query-driver` 路径。不要复制 `build/`。
28
-
29
- **已有工程**:先跑一次 `clang-format --dry-run --Werror` 和 `clang-tidy`,看现有配置实际报什么;只改导致当前失败或与声明环境冲突的项。不要借机重排全工程格式。
30
-
31
- **换编译器**:改 `.clangd` 的 `CompilationDatabase`,改 `--query-driver` 指向的编译器,清理旧构建目录;不要同时保留两套 clangd 配置。
32
-
33
- **GCC 模式**:`clangd` 仍可工作,但系统头来自 GCC;`--query-driver` 指向 `g++`。`clang-format` / `clang-tidy` 仍是 Clang 工具,版本要求不因编译器是 GCC 而降低。
34
-
35
- **共享库**:静态检查不因链接方式改变;运行时库路径在定构建的 CMake 里设置,不要写进 clang 配置。
36
-
37
- ## 正反例指针
38
-
39
- - `.clangd` 指错编译数据库、`query-driver` 写进 YAML:`examples/tooling.md`。
40
- - 配置文件堆策略头、关闭检查不写理由:`examples/tooling.md`「配置注释」。
41
- - 工具调用与头文件过滤:`references/static-analysis.md`。
1
+ # 第 2 步:定工具配置
2
+
3
+ ## 产出
4
+
5
+ 工程自己的 `.clang-format`、`.clang-tidy`、`.clangd` 和编辑器推荐配置。三份配置各管一段:格式化、静态检查、语言服务,不互相复制规则。
6
+
7
+ ## 通用情况
8
+
9
+ - 工程拥有配置:`.clang-format`、`.clang-tidy`、`.clangd`、`.vscode/` 放在工程根;不要依赖用户主目录或插件目录里的同名文件。
10
+ - 只复制缺失的文件。已有配置先读再改,不覆盖;需要合并时逐项说明理由。
11
+ - 工具角色固定:`clang-format` 管排版,`clang-tidy` 管静态诊断,`clangd` 管补全/跳转/诊断;无论 `compiler` 是 clang 还是 gcc,这三件都用 Clang 工具链。
12
+ - 版本要求见 `references/environment.md`:Clang 模式要求 `clang++`、`clang-format`、`clang-tidy`、`clangd` 同一 LLVM 主版本;GCC 模式要求 `clang-format` / `clang-tidy` ≥ 16,`clangd` 只要求可用。
13
+ - `.clangd` 的 `CompilationDatabase` 指向 `build/<compiler>`;切换编译器时同步改,不能留旧目录。
14
+ - `--query-driver` 是 clangd 的命令行参数,写在 `.vscode/settings.json` 的 `clangd.arguments` 里,不是 `.clangd` 的 YAML 键。它告诉 clangd 允许执行哪个编译器驱动来取系统头路径;路径写绝对路径,并与 `environment.json` 的编译器一致。
15
+ - 首次复制时按轴替换两个值:`compiler=clang` 用 `CompilationDatabase: build/clang` 和 `--query-driver=/usr/bin/clang++`;`compiler=gcc` 用 `build/gcc` 和 `/usr/bin/g++`。只复制模板而不改这两处,GCC 模式会指向错误的数据库或驱动。原工程已有的 `.clangd` 不覆盖;要改先征得同意。
16
+ - `.clang-format` 固定 `BasedOnStyle: Google`、`Standard: c++20`、`ColumnLimit: 100`、`DerivePointerAlignment: false`、`PointerAlignment: Left`;`IncludeCategories` 维持包含顺序。不要逐项手调换行。
17
+ - `.clang-tidy` 保留 `bugprone-*`、`cppcoreguidelines-*`、`misc-*`、`modernize-*`、`performance-*`、`portability-*`、`readability-*`、`clang-analyzer-core.*` 和四条 `google-*` 的主体;关闭项必须写理由。不要把整个检查族一关了之。
18
+ - `.vscode/extensions.json` 推荐 clangd 与 CMake Tools;`.vscode/settings.json` 固定 clangd 参数和 CMake 构建目录。配置注释用 JSONC 的 `//`,贴在被解释的键上方。
19
+ - 配置注释写「为什么这样设」,不写「这一项是什么」;不写策略头、不指向文档路径。
20
+ - 格式化与静态检查只扫描项目源码:`src/`、`include/`、`apps/`、`tests/` 等实际存在的源码根;不扫描 `build/`、第三方目录、生成文件。
21
+ - `clang-tidy` 用 `-p build/<compiler>` 读取编译数据库,`--header-filter` 只列项目根下的顶层目录,避免把第三方头纳入;不要加 `--system-headers`,也不要用 clang-tidy 19 才加入、16 没有的 `--exclude-header-filter`。
22
+ - 格式化用 `--dry-run --Werror` 做检查;需要自动修复时单独运行 `-i`,不要让构建脚本悄悄改源码。
23
+ - 工程模板里不预置 `compile_commands.json`;它由定构建的 configure 生成,是构建产物。
24
+
25
+ ## 情况
26
+
27
+ **新工程**:从 `assets/config/` 复制 `.clang-format`、`.clang-tidy`、`.clangd` 和 `.vscode/` 两个文件,按编译器的映射改 `.clangd` 的编译数据库目录和 `.vscode/settings.json` 的 `--query-driver` 路径。不要复制 `build/`。
28
+
29
+ **已有工程**:先跑一次 `clang-format --dry-run --Werror` 和 `clang-tidy`,看现有配置实际报什么;只改导致当前失败或与声明环境冲突的项。不要借机重排全工程格式。
30
+
31
+ **换编译器**:改 `.clangd` 的 `CompilationDatabase`,改 `--query-driver` 指向的编译器,清理旧构建目录;不要同时保留两套 clangd 配置。
32
+
33
+ **GCC 模式**:`clangd` 仍可工作,但系统头来自 GCC;`--query-driver` 指向 `g++`。`clang-format` / `clang-tidy` 仍是 Clang 工具,版本要求不因编译器是 GCC 而降低。
34
+
35
+ **共享库**:静态检查不因链接方式改变;运行时库路径在定构建的 CMake 里设置,不要写进 clang 配置。
36
+
37
+ ## 正反例指针
38
+
39
+ - `.clangd` 指错编译数据库、`query-driver` 写进 YAML:`examples/tooling.md`。
40
+ - 配置文件堆策略头、关闭检查不写理由:`examples/tooling.md`「配置注释」。
41
+ - 工具调用与头文件过滤:`references/static-analysis.md`。
@@ -1,60 +1,60 @@
1
- # 第 3 步:通过检查
2
-
3
- ## 产出
4
-
5
- 一次可复现的通过记录:环境校验、配置、构建、格式化、静态检查、测试、运行都通过;失败时能指出是哪一步、哪个角色、哪条诊断。
6
-
7
- ## 通用情况
8
-
9
- 按固定顺序跑,前一步失败就停,不要带着失败继续:
10
-
11
- 1. **校验环境声明(不带 `--live`)**:读 `environment.json`,检查三个轴和组合是否合法。轴为空或组合非法时,停在这里,不找可执行文件。
12
- 2. **活动校验**:在声明的 build host 上跑 `--live`,核对 PATH 中的角色和版本。Windows 原生组合当前没有构建脚本,`--live` 会明确报告「缺的是 shell,不是编译器」。
13
- 3. **跑项目入口命令**:项目技能里写的入口命令(如 `./running-build.sh clang`)。入口内部依次 configure → build → format → tidy → ctest → run;每一步失败都保留原始输出。
14
- 4. **核对产物**:`build/<compiler>/compile_commands.json` 存在;`build/compile_commands.json` 指向当前编译器;`app` 可执行文件在 `build/<compiler>/bin`。
15
- 5. **记录结果**:通过时记录编译器版本、构建目录、测试数量;失败时记录命令、退出码、第一条根因诊断。
16
-
17
- 环境校验脚本:
18
-
19
- ```bash
20
- node "<skill-dir>/scripts/checking-environment.mjs" --project . # 声明校验
21
- node "<skill-dir>/scripts/checking-environment.mjs" --project . --live # 活动校验
22
- ```
23
-
24
- `<skill-dir>` 换成插件里 `building-cpp` 的实际目录;不要复制脚本到项目里再改。脚本只读,不安装、不下载、不改 PATH。
25
-
26
- ## 失败分诊
27
-
28
- | 现象 | 先看 | 回到 |
29
- | --- | --- | --- |
30
- | 轴为空、组合非法、版本不匹配 | `environment.json`、`--live` 输出 | 定构建,先修声明 |
31
- | 找不到头文件、链接失败、target 不存在 | `CMakeLists.txt`、`target_include_directories`、`target_link_libraries` | 定构建 |
32
- | 没有 `compile_commands.json`、clangd 跳转失败 | 生成器、`CMAKE_EXPORT_COMPILE_COMMANDS`、`.clangd` 路径 | 定构建 / 定工具配置 |
33
- | `clang-format` 报格式 | 源码排版 | 定工具配置;只改格式,不改行为 |
34
- | `clang-tidy` 报命名/类型/现代 C++ 用法 | 源码声明或实现 | `developing-cpp` 的定声明 / 定实现 |
35
- | 编译错误指向声明或类型 | 头文件、类型定义、函数签名 | `developing-cpp` 的定声明 |
36
- | 编译错误指向函数体 | 实现 | `developing-cpp` 的定实现;先修语义,再重跑 |
37
- | CTest 失败 | 测试断言、行为句 | `developing-cpp` 的定行为 / 定实现 |
38
- | `app` 启动失败、找不到共享库 | 输出目录、RPATH / 运行时库路径 | 定构建 |
39
-
40
- 分诊只定位,不自动改。一次只改一类问题;改完从失败的那一步重跑,只有行为或边界也变了才回到定行为。
41
-
42
- ## 情况
43
-
44
- **第一次接工程**:先跑声明校验,再跑 `--live`;两者都过再跑入口命令。环境没声明对时,构建脚本再完美也会失败。
45
-
46
- **只改源码**:仍跑完整入口命令;格式化和静态检查可能暴露声明层问题,不要只看编译通过。
47
-
48
- **只改配置**:至少跑一次完整构建 + 格式化 + 静态检查;配置错误常常在 clangd 或 tidy 阶段才暴露。
49
-
50
- **没有测试**:CTest 显示没有测试是合法结果;不要为了「全绿」造空测试。行为验收由定行为的验收句负责。
51
-
52
- **Windows 原生**:当前版本没有 PowerShell 构建脚本;`--live` 会失败并说明缺 shell。不要伪造一个临时脚本绕过,也不要把 `build_host` 改成 `wsl` 来「让它过」;先和用户确认是否补脚本。
53
-
54
- **macOS**:`/usr/bin/clang++` 通常是 Apple Clang;`.clangd` 不写死 Homebrew 路径,clangd 要能经 xcrun 找到 SDK。`compiler=clang` 时 `--live` 按同一 LLVM 主版本核对 clang++、clang-format、clang-tidy、clangd;不要混用 Homebrew LLVM 与 Xcode 资源目录来凑版本,也不要为了通过而改 `environment.json` 的编译器。
55
-
56
- ## 正反例指针
57
-
58
- - 环境组合与 `--live` 输出:`examples/environment.md`。
59
- - 失败分诊的具体命令:`references/build-script.md`「失败分诊」。
60
- - 工具调用细节:`references/static-analysis.md`。
1
+ # 第 3 步:通过检查
2
+
3
+ ## 产出
4
+
5
+ 一次可复现的通过记录:环境校验、配置、构建、格式化、静态检查、测试、运行都通过;失败时能指出是哪一步、哪个角色、哪条诊断。
6
+
7
+ ## 通用情况
8
+
9
+ 按固定顺序跑,前一步失败就停,不要带着失败继续:
10
+
11
+ 1. **校验环境声明(不带 `--live`)**:读 `environment.json`,检查三个轴和组合是否合法。轴为空或组合非法时,停在这里,不找可执行文件。
12
+ 2. **活动校验**:在声明的 build host 上跑 `--live`,核对 PATH 中的角色和版本。Windows 原生组合当前没有构建脚本,`--live` 会明确报告「缺的是 shell,不是编译器」。
13
+ 3. **跑项目入口命令**:项目技能里写的入口命令(如 `./running-build.sh clang`)。入口内部依次 configure → build → format → tidy → ctest → run;每一步失败都保留原始输出。
14
+ 4. **核对产物**:`build/<compiler>/compile_commands.json` 存在;`build/compile_commands.json` 指向当前编译器;`app` 可执行文件在 `build/<compiler>/bin`。
15
+ 5. **记录结果**:通过时记录编译器版本、构建目录、测试数量;失败时记录命令、退出码、第一条根因诊断。
16
+
17
+ 环境校验脚本:
18
+
19
+ ```bash
20
+ node "<skill-dir>/scripts/checking-environment.mjs" --project . # 声明校验
21
+ node "<skill-dir>/scripts/checking-environment.mjs" --project . --live # 活动校验
22
+ ```
23
+
24
+ `<skill-dir>` 换成插件里 `building-cpp` 的实际目录;不要复制脚本到项目里再改。脚本只读,不安装、不下载、不改 PATH。
25
+
26
+ ## 失败分诊
27
+
28
+ | 现象 | 先看 | 回到 |
29
+ | --- | --- | --- |
30
+ | 轴为空、组合非法、版本不匹配 | `environment.json`、`--live` 输出 | 定构建,先修声明 |
31
+ | 找不到头文件、链接失败、target 不存在 | `CMakeLists.txt`、`target_include_directories`、`target_link_libraries` | 定构建 |
32
+ | 没有 `compile_commands.json`、clangd 跳转失败 | 生成器、`CMAKE_EXPORT_COMPILE_COMMANDS`、`.clangd` 路径 | 定构建 / 定工具配置 |
33
+ | `clang-format` 报格式 | 源码排版 | 定工具配置;只改格式,不改行为 |
34
+ | `clang-tidy` 报命名/类型/现代 C++ 用法 | 源码声明或实现 | `developing-cpp` 的定声明 / 定实现 |
35
+ | 编译错误指向声明或类型 | 头文件、类型定义、函数签名 | `developing-cpp` 的定声明 |
36
+ | 编译错误指向函数体 | 实现 | `developing-cpp` 的定实现;先修语义,再重跑 |
37
+ | CTest 失败 | 测试断言、行为句 | `developing-cpp` 的定行为 / 定实现 |
38
+ | `app` 启动失败、找不到共享库 | 输出目录、RPATH / 运行时库路径 | 定构建 |
39
+
40
+ 分诊只定位,不自动改。一次只改一类问题;改完从失败的那一步重跑,只有行为或边界也变了才回到定行为。
41
+
42
+ ## 情况
43
+
44
+ **第一次接工程**:先跑声明校验,再跑 `--live`;两者都过再跑入口命令。环境没声明对时,构建脚本再完美也会失败。
45
+
46
+ **只改源码**:仍跑完整入口命令;格式化和静态检查可能暴露声明层问题,不要只看编译通过。
47
+
48
+ **只改配置**:至少跑一次完整构建 + 格式化 + 静态检查;配置错误常常在 clangd 或 tidy 阶段才暴露。
49
+
50
+ **没有测试**:CTest 显示没有测试是合法结果;不要为了「全绿」造空测试。行为验收由定行为的验收句负责。
51
+
52
+ **Windows 原生**:当前版本没有 PowerShell 构建脚本;`--live` 会失败并说明缺 shell。不要伪造一个临时脚本绕过,也不要把 `build_host` 改成 `wsl` 来「让它过」;先和用户确认是否补脚本。
53
+
54
+ **macOS**:`/usr/bin/clang++` 通常是 Apple Clang;`.clangd` 不写死 Homebrew 路径,clangd 要能经 xcrun 找到 SDK。`compiler=clang` 时 `--live` 按同一 LLVM 主版本核对 clang++、clang-format、clang-tidy、clangd;不要混用 Homebrew LLVM 与 Xcode 资源目录来凑版本,也不要为了通过而改 `environment.json` 的编译器。
55
+
56
+ ## 正反例指针
57
+
58
+ - 环境组合与 `--live` 输出:`examples/environment.md`。
59
+ - 失败分诊的具体命令:`references/build-script.md`「失败分诊」。
60
+ - 工具调用细节:`references/static-analysis.md`。