ccgx-workflow 1.0.0 → 1.0.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/README.md +37 -5
- package/README.zh-CN.md +35 -5
- package/dist/cli.mjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.SJPbUy5_.mjs} +17 -110
- package/package.json +2 -1
- package/templates/commands/agents/phase-runner.md +321 -321
- package/templates/commands/autonomous.md +792 -792
- package/templates/commands/cancel.md +132 -132
- package/templates/commands/debug.md +226 -226
- package/templates/commands/status.md +206 -206
- package/templates/commands/team.md +484 -0
- package/templates/hooks/ccg-session-state.cjs +510 -510
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
- package/templates/scripts/invoke-model.mjs +64 -0
- package/templates/skills/domains/ai/SKILL.md +35 -35
- package/templates/skills/domains/ai/agent-dev.md +242 -242
- package/templates/skills/domains/ai/llm-security.md +288 -288
- package/templates/skills/domains/ai/rag-system.md +542 -542
- package/templates/skills/domains/architecture/SKILL.md +43 -43
- package/templates/skills/domains/architecture/api-design.md +225 -225
- package/templates/skills/domains/architecture/cloud-native.md +285 -285
- package/templates/skills/domains/architecture/security-arch.md +297 -297
- package/templates/skills/domains/data-engineering/SKILL.md +208 -208
- package/templates/skills/domains/development/SKILL.md +47 -47
- package/templates/skills/domains/development/cpp.md +246 -246
- package/templates/skills/domains/development/go.md +323 -323
- package/templates/skills/domains/development/java.md +277 -277
- package/templates/skills/domains/development/python.md +288 -288
- package/templates/skills/domains/development/rust.md +313 -313
- package/templates/skills/domains/development/shell.md +313 -313
- package/templates/skills/domains/development/typescript.md +277 -277
- package/templates/skills/domains/devops/SKILL.md +40 -40
- package/templates/skills/domains/devops/database.md +217 -217
- package/templates/skills/domains/devops/devsecops.md +198 -198
- package/templates/skills/domains/devops/git-workflow.md +181 -181
- package/templates/skills/domains/devops/testing.md +283 -283
- package/templates/skills/domains/frontend-design/SKILL.md +244 -244
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
- package/templates/skills/domains/frontend-design/state-management.md +680 -680
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
- package/templates/skills/domains/infrastructure/SKILL.md +201 -201
- package/templates/skills/domains/mobile/SKILL.md +225 -225
- package/templates/skills/domains/orchestration/SKILL.md +30 -30
- package/templates/skills/domains/orchestration/multi-agent.md +228 -228
- package/templates/skills/domains/security/SKILL.md +73 -73
- package/templates/skills/domains/security/blue-team.md +436 -436
- package/templates/skills/domains/security/code-audit.md +265 -265
- package/templates/skills/domains/security/pentest.md +226 -226
- package/templates/skills/domains/security/red-team.md +374 -374
- package/templates/skills/domains/security/threat-intel.md +372 -372
- package/templates/skills/domains/security/vuln-research.md +369 -369
- package/templates/skills/tools/lib/shared.js +98 -98
- package/templates/skills/tools/override-refusal/SKILL.md +53 -53
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
|
@@ -1,246 +1,246 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cpp
|
|
3
|
-
description: C/C++ 开发。系统编程、性能优化、内存管理。当用户提到 C、C++、CMake、内存、指针时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 📜 符箓秘典 · C/C++
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## 现代 C++ (C++17/20)
|
|
10
|
-
|
|
11
|
-
### 智能指针
|
|
12
|
-
```cpp
|
|
13
|
-
#include <memory>
|
|
14
|
-
|
|
15
|
-
// unique_ptr - 独占所有权
|
|
16
|
-
auto ptr = std::make_unique<MyClass>(args);
|
|
17
|
-
ptr->method();
|
|
18
|
-
|
|
19
|
-
// shared_ptr - 共享所有权
|
|
20
|
-
auto shared = std::make_shared<MyClass>(args);
|
|
21
|
-
auto copy = shared; // 引用计数 +1
|
|
22
|
-
|
|
23
|
-
// weak_ptr - 弱引用,不增加引用计数
|
|
24
|
-
std::weak_ptr<MyClass> weak = shared;
|
|
25
|
-
if (auto locked = weak.lock()) {
|
|
26
|
-
locked->method();
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 容器与算法
|
|
31
|
-
```cpp
|
|
32
|
-
#include <vector>
|
|
33
|
-
#include <algorithm>
|
|
34
|
-
#include <ranges>
|
|
35
|
-
|
|
36
|
-
std::vector<int> nums = {1, 2, 3, 4, 5};
|
|
37
|
-
|
|
38
|
-
// 范围 for
|
|
39
|
-
for (const auto& n : nums) {
|
|
40
|
-
std::cout << n << std::endl;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 算法
|
|
44
|
-
auto it = std::find(nums.begin(), nums.end(), 3);
|
|
45
|
-
std::sort(nums.begin(), nums.end());
|
|
46
|
-
|
|
47
|
-
// C++20 Ranges
|
|
48
|
-
auto even = nums | std::views::filter([](int n) { return n % 2 == 0; });
|
|
49
|
-
auto squared = nums | std::views::transform([](int n) { return n * n; });
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Lambda 表达式
|
|
53
|
-
```cpp
|
|
54
|
-
// 基础 lambda
|
|
55
|
-
auto add = [](int a, int b) { return a + b; };
|
|
56
|
-
|
|
57
|
-
// 捕获
|
|
58
|
-
int x = 10;
|
|
59
|
-
auto capture_val = [x]() { return x; }; // 值捕获
|
|
60
|
-
auto capture_ref = [&x]() { return x; }; // 引用捕获
|
|
61
|
-
auto capture_all = [=]() { return x; }; // 全部值捕获
|
|
62
|
-
auto capture_all_ref = [&]() { return x; }; // 全部引用捕获
|
|
63
|
-
|
|
64
|
-
// 泛型 lambda (C++14)
|
|
65
|
-
auto generic = [](auto a, auto b) { return a + b; };
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 并发编程
|
|
69
|
-
```cpp
|
|
70
|
-
#include <thread>
|
|
71
|
-
#include <mutex>
|
|
72
|
-
#include <future>
|
|
73
|
-
|
|
74
|
-
// 线程
|
|
75
|
-
std::thread t([]() {
|
|
76
|
-
std::cout << "Hello from thread" << std::endl;
|
|
77
|
-
});
|
|
78
|
-
t.join();
|
|
79
|
-
|
|
80
|
-
// 互斥锁
|
|
81
|
-
std::mutex mtx;
|
|
82
|
-
{
|
|
83
|
-
std::lock_guard<std::mutex> lock(mtx);
|
|
84
|
-
// 临界区
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// async/future
|
|
88
|
-
auto future = std::async(std::launch::async, []() {
|
|
89
|
-
return compute_result();
|
|
90
|
-
});
|
|
91
|
-
auto result = future.get();
|
|
92
|
-
|
|
93
|
-
// 条件变量
|
|
94
|
-
std::condition_variable cv;
|
|
95
|
-
std::unique_lock<std::mutex> lock(mtx);
|
|
96
|
-
cv.wait(lock, []() { return ready; });
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## 内存管理
|
|
100
|
-
|
|
101
|
-
### RAII 模式
|
|
102
|
-
```cpp
|
|
103
|
-
class FileHandle {
|
|
104
|
-
public:
|
|
105
|
-
FileHandle(const char* path) : file(fopen(path, "r")) {
|
|
106
|
-
if (!file) throw std::runtime_error("Failed to open file");
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
~FileHandle() {
|
|
110
|
-
if (file) fclose(file);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 禁止拷贝
|
|
114
|
-
FileHandle(const FileHandle&) = delete;
|
|
115
|
-
FileHandle& operator=(const FileHandle&) = delete;
|
|
116
|
-
|
|
117
|
-
// 允许移动
|
|
118
|
-
FileHandle(FileHandle&& other) noexcept : file(other.file) {
|
|
119
|
-
other.file = nullptr;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
private:
|
|
123
|
-
FILE* file;
|
|
124
|
-
};
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### 内存安全检查
|
|
128
|
-
```bash
|
|
129
|
-
# AddressSanitizer
|
|
130
|
-
g++ -fsanitize=address -g main.cpp -o main
|
|
131
|
-
./main
|
|
132
|
-
|
|
133
|
-
# Valgrind
|
|
134
|
-
valgrind --leak-check=full ./main
|
|
135
|
-
|
|
136
|
-
# 静态分析
|
|
137
|
-
clang-tidy main.cpp
|
|
138
|
-
cppcheck main.cpp
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## CMake
|
|
142
|
-
|
|
143
|
-
### CMakeLists.txt
|
|
144
|
-
```cmake
|
|
145
|
-
cmake_minimum_required(VERSION 3.16)
|
|
146
|
-
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
|
|
147
|
-
|
|
148
|
-
set(CMAKE_CXX_STANDARD 17)
|
|
149
|
-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
150
|
-
|
|
151
|
-
# 添加可执行文件
|
|
152
|
-
add_executable(myapp
|
|
153
|
-
src/main.cpp
|
|
154
|
-
src/utils.cpp
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
# 添加库
|
|
158
|
-
add_library(mylib STATIC
|
|
159
|
-
src/lib.cpp
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# 链接库
|
|
163
|
-
target_link_libraries(myapp PRIVATE mylib)
|
|
164
|
-
|
|
165
|
-
# 包含目录
|
|
166
|
-
target_include_directories(myapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
|
|
167
|
-
|
|
168
|
-
# 查找外部库
|
|
169
|
-
find_package(Threads REQUIRED)
|
|
170
|
-
target_link_libraries(myapp PRIVATE Threads::Threads)
|
|
171
|
-
|
|
172
|
-
# 测试
|
|
173
|
-
enable_testing()
|
|
174
|
-
add_executable(tests tests/test_main.cpp)
|
|
175
|
-
add_test(NAME MyTests COMMAND tests)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### 构建
|
|
179
|
-
```bash
|
|
180
|
-
mkdir build && cd build
|
|
181
|
-
cmake ..
|
|
182
|
-
cmake --build .
|
|
183
|
-
ctest # 运行测试
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## 测试
|
|
187
|
-
|
|
188
|
-
### Google Test
|
|
189
|
-
```cpp
|
|
190
|
-
#include <gtest/gtest.h>
|
|
191
|
-
|
|
192
|
-
TEST(MathTest, Add) {
|
|
193
|
-
EXPECT_EQ(add(1, 2), 3);
|
|
194
|
-
EXPECT_EQ(add(-1, 1), 0);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
TEST(MathTest, Divide) {
|
|
198
|
-
EXPECT_DOUBLE_EQ(divide(10, 2), 5.0);
|
|
199
|
-
EXPECT_THROW(divide(1, 0), std::invalid_argument);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Fixture
|
|
203
|
-
class UserTest : public ::testing::Test {
|
|
204
|
-
protected:
|
|
205
|
-
void SetUp() override {
|
|
206
|
-
user = std::make_unique<User>("Alice");
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
std::unique_ptr<User> user;
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
TEST_F(UserTest, GetName) {
|
|
213
|
-
EXPECT_EQ(user->getName(), "Alice");
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## 项目结构
|
|
218
|
-
|
|
219
|
-
```
|
|
220
|
-
myproject/
|
|
221
|
-
├── CMakeLists.txt
|
|
222
|
-
├── include/
|
|
223
|
-
│ └── myproject/
|
|
224
|
-
│ ├── utils.h
|
|
225
|
-
│ └── types.h
|
|
226
|
-
├── src/
|
|
227
|
-
│ ├── main.cpp
|
|
228
|
-
│ └── utils.cpp
|
|
229
|
-
├── tests/
|
|
230
|
-
│ └── test_main.cpp
|
|
231
|
-
└── build/
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## 常用库
|
|
235
|
-
|
|
236
|
-
| 库 | 用途 |
|
|
237
|
-
|---|------|
|
|
238
|
-
| Boost | 通用库集合 |
|
|
239
|
-
| fmt | 格式化输出 |
|
|
240
|
-
| spdlog | 日志 |
|
|
241
|
-
| nlohmann/json | JSON |
|
|
242
|
-
| Catch2/GTest | 测试 |
|
|
243
|
-
| OpenSSL | 加密 |
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
1
|
+
---
|
|
2
|
+
name: cpp
|
|
3
|
+
description: C/C++ 开发。系统编程、性能优化、内存管理。当用户提到 C、C++、CMake、内存、指针时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 📜 符箓秘典 · C/C++
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 现代 C++ (C++17/20)
|
|
10
|
+
|
|
11
|
+
### 智能指针
|
|
12
|
+
```cpp
|
|
13
|
+
#include <memory>
|
|
14
|
+
|
|
15
|
+
// unique_ptr - 独占所有权
|
|
16
|
+
auto ptr = std::make_unique<MyClass>(args);
|
|
17
|
+
ptr->method();
|
|
18
|
+
|
|
19
|
+
// shared_ptr - 共享所有权
|
|
20
|
+
auto shared = std::make_shared<MyClass>(args);
|
|
21
|
+
auto copy = shared; // 引用计数 +1
|
|
22
|
+
|
|
23
|
+
// weak_ptr - 弱引用,不增加引用计数
|
|
24
|
+
std::weak_ptr<MyClass> weak = shared;
|
|
25
|
+
if (auto locked = weak.lock()) {
|
|
26
|
+
locked->method();
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 容器与算法
|
|
31
|
+
```cpp
|
|
32
|
+
#include <vector>
|
|
33
|
+
#include <algorithm>
|
|
34
|
+
#include <ranges>
|
|
35
|
+
|
|
36
|
+
std::vector<int> nums = {1, 2, 3, 4, 5};
|
|
37
|
+
|
|
38
|
+
// 范围 for
|
|
39
|
+
for (const auto& n : nums) {
|
|
40
|
+
std::cout << n << std::endl;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 算法
|
|
44
|
+
auto it = std::find(nums.begin(), nums.end(), 3);
|
|
45
|
+
std::sort(nums.begin(), nums.end());
|
|
46
|
+
|
|
47
|
+
// C++20 Ranges
|
|
48
|
+
auto even = nums | std::views::filter([](int n) { return n % 2 == 0; });
|
|
49
|
+
auto squared = nums | std::views::transform([](int n) { return n * n; });
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Lambda 表达式
|
|
53
|
+
```cpp
|
|
54
|
+
// 基础 lambda
|
|
55
|
+
auto add = [](int a, int b) { return a + b; };
|
|
56
|
+
|
|
57
|
+
// 捕获
|
|
58
|
+
int x = 10;
|
|
59
|
+
auto capture_val = [x]() { return x; }; // 值捕获
|
|
60
|
+
auto capture_ref = [&x]() { return x; }; // 引用捕获
|
|
61
|
+
auto capture_all = [=]() { return x; }; // 全部值捕获
|
|
62
|
+
auto capture_all_ref = [&]() { return x; }; // 全部引用捕获
|
|
63
|
+
|
|
64
|
+
// 泛型 lambda (C++14)
|
|
65
|
+
auto generic = [](auto a, auto b) { return a + b; };
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 并发编程
|
|
69
|
+
```cpp
|
|
70
|
+
#include <thread>
|
|
71
|
+
#include <mutex>
|
|
72
|
+
#include <future>
|
|
73
|
+
|
|
74
|
+
// 线程
|
|
75
|
+
std::thread t([]() {
|
|
76
|
+
std::cout << "Hello from thread" << std::endl;
|
|
77
|
+
});
|
|
78
|
+
t.join();
|
|
79
|
+
|
|
80
|
+
// 互斥锁
|
|
81
|
+
std::mutex mtx;
|
|
82
|
+
{
|
|
83
|
+
std::lock_guard<std::mutex> lock(mtx);
|
|
84
|
+
// 临界区
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// async/future
|
|
88
|
+
auto future = std::async(std::launch::async, []() {
|
|
89
|
+
return compute_result();
|
|
90
|
+
});
|
|
91
|
+
auto result = future.get();
|
|
92
|
+
|
|
93
|
+
// 条件变量
|
|
94
|
+
std::condition_variable cv;
|
|
95
|
+
std::unique_lock<std::mutex> lock(mtx);
|
|
96
|
+
cv.wait(lock, []() { return ready; });
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 内存管理
|
|
100
|
+
|
|
101
|
+
### RAII 模式
|
|
102
|
+
```cpp
|
|
103
|
+
class FileHandle {
|
|
104
|
+
public:
|
|
105
|
+
FileHandle(const char* path) : file(fopen(path, "r")) {
|
|
106
|
+
if (!file) throw std::runtime_error("Failed to open file");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
~FileHandle() {
|
|
110
|
+
if (file) fclose(file);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 禁止拷贝
|
|
114
|
+
FileHandle(const FileHandle&) = delete;
|
|
115
|
+
FileHandle& operator=(const FileHandle&) = delete;
|
|
116
|
+
|
|
117
|
+
// 允许移动
|
|
118
|
+
FileHandle(FileHandle&& other) noexcept : file(other.file) {
|
|
119
|
+
other.file = nullptr;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private:
|
|
123
|
+
FILE* file;
|
|
124
|
+
};
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 内存安全检查
|
|
128
|
+
```bash
|
|
129
|
+
# AddressSanitizer
|
|
130
|
+
g++ -fsanitize=address -g main.cpp -o main
|
|
131
|
+
./main
|
|
132
|
+
|
|
133
|
+
# Valgrind
|
|
134
|
+
valgrind --leak-check=full ./main
|
|
135
|
+
|
|
136
|
+
# 静态分析
|
|
137
|
+
clang-tidy main.cpp
|
|
138
|
+
cppcheck main.cpp
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## CMake
|
|
142
|
+
|
|
143
|
+
### CMakeLists.txt
|
|
144
|
+
```cmake
|
|
145
|
+
cmake_minimum_required(VERSION 3.16)
|
|
146
|
+
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
|
|
147
|
+
|
|
148
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
149
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
150
|
+
|
|
151
|
+
# 添加可执行文件
|
|
152
|
+
add_executable(myapp
|
|
153
|
+
src/main.cpp
|
|
154
|
+
src/utils.cpp
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# 添加库
|
|
158
|
+
add_library(mylib STATIC
|
|
159
|
+
src/lib.cpp
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# 链接库
|
|
163
|
+
target_link_libraries(myapp PRIVATE mylib)
|
|
164
|
+
|
|
165
|
+
# 包含目录
|
|
166
|
+
target_include_directories(myapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
|
|
167
|
+
|
|
168
|
+
# 查找外部库
|
|
169
|
+
find_package(Threads REQUIRED)
|
|
170
|
+
target_link_libraries(myapp PRIVATE Threads::Threads)
|
|
171
|
+
|
|
172
|
+
# 测试
|
|
173
|
+
enable_testing()
|
|
174
|
+
add_executable(tests tests/test_main.cpp)
|
|
175
|
+
add_test(NAME MyTests COMMAND tests)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 构建
|
|
179
|
+
```bash
|
|
180
|
+
mkdir build && cd build
|
|
181
|
+
cmake ..
|
|
182
|
+
cmake --build .
|
|
183
|
+
ctest # 运行测试
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## 测试
|
|
187
|
+
|
|
188
|
+
### Google Test
|
|
189
|
+
```cpp
|
|
190
|
+
#include <gtest/gtest.h>
|
|
191
|
+
|
|
192
|
+
TEST(MathTest, Add) {
|
|
193
|
+
EXPECT_EQ(add(1, 2), 3);
|
|
194
|
+
EXPECT_EQ(add(-1, 1), 0);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
TEST(MathTest, Divide) {
|
|
198
|
+
EXPECT_DOUBLE_EQ(divide(10, 2), 5.0);
|
|
199
|
+
EXPECT_THROW(divide(1, 0), std::invalid_argument);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Fixture
|
|
203
|
+
class UserTest : public ::testing::Test {
|
|
204
|
+
protected:
|
|
205
|
+
void SetUp() override {
|
|
206
|
+
user = std::make_unique<User>("Alice");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
std::unique_ptr<User> user;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
TEST_F(UserTest, GetName) {
|
|
213
|
+
EXPECT_EQ(user->getName(), "Alice");
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 项目结构
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
myproject/
|
|
221
|
+
├── CMakeLists.txt
|
|
222
|
+
├── include/
|
|
223
|
+
│ └── myproject/
|
|
224
|
+
│ ├── utils.h
|
|
225
|
+
│ └── types.h
|
|
226
|
+
├── src/
|
|
227
|
+
│ ├── main.cpp
|
|
228
|
+
│ └── utils.cpp
|
|
229
|
+
├── tests/
|
|
230
|
+
│ └── test_main.cpp
|
|
231
|
+
└── build/
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## 常用库
|
|
235
|
+
|
|
236
|
+
| 库 | 用途 |
|
|
237
|
+
|---|------|
|
|
238
|
+
| Boost | 通用库集合 |
|
|
239
|
+
| fmt | 格式化输出 |
|
|
240
|
+
| spdlog | 日志 |
|
|
241
|
+
| nlohmann/json | JSON |
|
|
242
|
+
| Catch2/GTest | 测试 |
|
|
243
|
+
| OpenSSL | 加密 |
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|