ai-developer-skill-os 8.3.0 → 9.0.0
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/.agents/AGENTS.md +21 -0
- package/.agents/registry/capability-graph.yml +74 -21
- package/.agents/registry/graph.json +138 -255
- package/.agents/registry/index.yaml +70 -96
- package/.agents/registry/skills-index.yml +70 -47
- package/.agents/rules/anti-patterns.md +45 -0
- package/.agents/rules/global.md +13 -0
- package/.agents/skills/_template/SKILL.md +127 -2
- package/.agents/skills/_template/capability.yaml +34 -20
- package/.agents/skills/qk-access-policy/SKILL.md +132 -2
- package/.agents/skills/qk-access-policy/capability.yaml +23 -0
- package/.agents/skills/qk-access-policy/evals/scorecard.yaml +36 -0
- package/.agents/skills/qk-agent-observability/SKILL.md +139 -3
- package/.agents/skills/qk-agent-observability/capability.yaml +29 -0
- package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-ai-builder/SKILL.md +132 -2
- package/.agents/skills/qk-ai-builder/capability.yaml +23 -0
- package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +30 -0
- package/.agents/skills/qk-api-lifecycle/SKILL.md +132 -2
- package/.agents/skills/qk-api-lifecycle/capability.yaml +23 -0
- package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-bug-resolution/SKILL.md +132 -2
- package/.agents/skills/qk-bug-resolution/capability.yaml +25 -0
- package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +30 -0
- package/.agents/skills/qk-code-review/SKILL.md +132 -2
- package/.agents/skills/qk-code-review/capability.yaml +23 -0
- package/.agents/skills/qk-code-review/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-context-loader/SKILL.md +135 -4
- package/.agents/skills/qk-context-loader/capability.yaml +23 -0
- package/.agents/skills/qk-context-loader/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-data-lifecycle/SKILL.md +132 -2
- package/.agents/skills/qk-data-lifecycle/capability.yaml +23 -0
- package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-db-optimizer/SKILL.md +132 -2
- package/.agents/skills/qk-db-optimizer/capability.yaml +22 -0
- package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-design-system-engineering/SKILL.md +132 -2
- package/.agents/skills/qk-design-system-engineering/capability.yaml +25 -0
- package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-devops-platform/SKILL.md +132 -2
- package/.agents/skills/qk-devops-platform/capability.yaml +29 -0
- package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-docs/SKILL.md +132 -2
- package/.agents/skills/qk-docs/capability.yaml +23 -0
- package/.agents/skills/qk-docs/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-engineering-standard/SKILL.md +132 -2
- package/.agents/skills/qk-engineering-standard/capability.yaml +23 -0
- package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-fe-api-integration/SKILL.md +132 -2
- package/.agents/skills/qk-fe-api-integration/capability.yaml +21 -0
- package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-feature-delivery/SKILL.md +132 -2
- package/.agents/skills/qk-feature-delivery/capability.yaml +24 -0
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-frontend-architecture/SKILL.md +132 -2
- package/.agents/skills/qk-frontend-architecture/capability.yaml +28 -0
- package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-help/SKILL.md +3 -3
- package/.agents/skills/qk-help/capability.yaml +20 -0
- package/.agents/skills/qk-help/evals/scorecard.yaml +13 -0
- package/.agents/skills/qk-orchestrator/SKILL.md +132 -2
- package/.agents/skills/qk-orchestrator/capability.yaml +22 -0
- package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-product-specification/SKILL.md +132 -2
- package/.agents/skills/qk-product-specification/capability.yaml +27 -0
- package/.agents/skills/qk-product-specification/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-production-release/SKILL.md +133 -3
- package/.agents/skills/qk-production-release/capability.yaml +27 -0
- package/.agents/skills/qk-production-release/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-project-bootstrap/SKILL.md +147 -4
- package/.agents/skills/qk-project-bootstrap/capability.yaml +23 -0
- package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-project-health/SKILL.md +132 -2
- package/.agents/skills/qk-project-health/capability.yaml +23 -0
- package/.agents/skills/qk-project-health/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-project-memory/SKILL.md +252 -277
- package/.agents/skills/qk-project-memory/capability.yaml +23 -0
- package/.agents/skills/qk-project-memory/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-refactor/SKILL.md +247 -0
- package/.agents/skills/qk-refactor/capability.yaml +26 -0
- package/.agents/skills/qk-refactor/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-security-audit/SKILL.md +132 -2
- package/.agents/skills/qk-security-audit/capability.yaml +30 -0
- package/.agents/skills/qk-security-audit/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-system-evolution/SKILL.md +132 -2
- package/.agents/skills/qk-system-evolution/capability.yaml +24 -0
- package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-test-engineering/SKILL.md +132 -2
- package/.agents/skills/qk-test-engineering/capability.yaml +28 -0
- package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-ui-audit/SKILL.md +132 -2
- package/.agents/skills/qk-ui-audit/capability.yaml +23 -0
- package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-ui-builder/capability.yaml +29 -0
- package/.agents/skills/qk-ui-builder/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-ui-system-builder/SKILL.md +132 -2
- package/.agents/skills/qk-ui-system-builder/capability.yaml +25 -0
- package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-validation-gate/SKILL.md +132 -2
- package/.agents/skills/qk-validation-gate/capability.yaml +23 -0
- package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-web-quality-gate/SKILL.md +132 -2
- package/.agents/skills/qk-web-quality-gate/capability.yaml +24 -0
- package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +26 -0
- package/.agents/workflows/production-release.yml +173 -0
- package/CHANGELOG.md +35 -0
- package/README.md +13 -4
- package/bin/install.js +1 -1
- package/package.json +6 -3
- package/tooling/build-registry.js +186 -186
- package/tooling/fix-refactor.js +8 -0
- package/tooling/sync-versions.js +299 -0
- package/tooling/validate-graph.js +87 -87
- package/tooling/validate-skills.js +1 -1
- package/tooling/generate-registry.js +0 -157
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qk-refactor
|
|
3
|
+
version: 9.0.0
|
|
4
|
+
status: stable
|
|
5
|
+
description: "Tái cấu trúc và dọn dẹp mã nguồn để dễ bảo trì hơn mà không làm thay đổi logic hoạt động bên ngoài."
|
|
6
|
+
platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
|
|
7
|
+
|
|
8
|
+
type: capability
|
|
9
|
+
|
|
10
|
+
intent:
|
|
11
|
+
- refactoring
|
|
12
|
+
- code-cleanup
|
|
13
|
+
- complexity-reduction
|
|
14
|
+
|
|
15
|
+
complexity:
|
|
16
|
+
level: medium
|
|
17
|
+
criteria:
|
|
18
|
+
files_affected: "2-5"
|
|
19
|
+
has_behavior_change: false
|
|
20
|
+
has_external_dependency: false
|
|
21
|
+
has_breaking_change: false
|
|
22
|
+
|
|
23
|
+
triggers:
|
|
24
|
+
- refactor
|
|
25
|
+
- tái cấu trúc
|
|
26
|
+
- clean up this code
|
|
27
|
+
- simplify
|
|
28
|
+
- reduce complexity
|
|
29
|
+
- dẫn cấu trúc code
|
|
30
|
+
|
|
31
|
+
selection:
|
|
32
|
+
priority: medium
|
|
33
|
+
confidence_threshold: 0.80
|
|
34
|
+
|
|
35
|
+
workflow: refactor
|
|
36
|
+
|
|
37
|
+
rules:
|
|
38
|
+
- global
|
|
39
|
+
- coding
|
|
40
|
+
- safety
|
|
41
|
+
|
|
42
|
+
tools:
|
|
43
|
+
- filesystem
|
|
44
|
+
- terminal
|
|
45
|
+
|
|
46
|
+
related_skills:
|
|
47
|
+
- qk-engineering-standard
|
|
48
|
+
- qk-project-health
|
|
49
|
+
|
|
50
|
+
knowledge_scope:
|
|
51
|
+
owns:
|
|
52
|
+
- refactoring-patterns
|
|
53
|
+
- code-smells
|
|
54
|
+
references:
|
|
55
|
+
- architecture
|
|
56
|
+
- coding-standards
|
|
57
|
+
|
|
58
|
+
verification:
|
|
59
|
+
required: true
|
|
60
|
+
strategy: refactor
|
|
61
|
+
|
|
62
|
+
examples: []
|
|
63
|
+
learnings: []
|
|
64
|
+
|
|
65
|
+
execution_mode: deterministic
|
|
66
|
+
cost: medium
|
|
67
|
+
latency: medium
|
|
68
|
+
risk: medium
|
|
69
|
+
side_effects: edit_files
|
|
70
|
+
produces: [code, report]
|
|
71
|
+
consumes: [source-code]
|
|
72
|
+
|
|
73
|
+
token_budget:
|
|
74
|
+
max_files_read: 3
|
|
75
|
+
max_lines_per_read: 150
|
|
76
|
+
max_shell_commands: 2
|
|
77
|
+
stop_early: true
|
|
78
|
+
|
|
79
|
+
exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
# qk-refactor - Safe Refactor
|
|
83
|
+
|
|
84
|
+
> Language rule: Code, identifiers, file names → English. Explanations, summaries → Vietnamese.
|
|
85
|
+
|
|
86
|
+
## Memory Workflow
|
|
87
|
+
|
|
88
|
+
### Pre-flight Retrieve (Trước khi thực thi)
|
|
89
|
+
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
90
|
+
bắt buộc tra cứu:
|
|
91
|
+
- `.agents/knowledge/index.yaml` (Shared Project Knowledge)
|
|
92
|
+
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
93
|
+
|
|
94
|
+
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
95
|
+
- Architecture
|
|
96
|
+
- Hard Bug
|
|
97
|
+
- Convention
|
|
98
|
+
- Pattern
|
|
99
|
+
- Tech Debt Pattern
|
|
100
|
+
- 👉 *Domain Focus:* Pattern / Convention (vd: chiến lược tách file anti-slop, bảo toàn public contract).
|
|
101
|
+
|
|
102
|
+
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
103
|
+
Không được xem Memory là Source of Truth.
|
|
104
|
+
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
109
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
110
|
+
- Hard Bug có khả năng tái diễn.
|
|
111
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
112
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
113
|
+
- Quyết định Architecture quan trọng.
|
|
114
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
115
|
+
- 👉 *Domain Harvest:* Pattern tái cấu trúc mã nguồn hiệu quả (vd: bẻ gẫy god-file thành module O(1)).
|
|
116
|
+
|
|
117
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
118
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
119
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
124
|
+
Sau khi hoàn thành task:
|
|
125
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
126
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
127
|
+
- Đề xuất người dùng xem xét.
|
|
128
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
129
|
+
- `/learn`
|
|
130
|
+
- `qk-project-memory`
|
|
131
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
138
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### Ignore (Không đưa vào Memory)
|
|
143
|
+
Không lưu:
|
|
144
|
+
- Trace log của một session đơn lẻ.
|
|
145
|
+
- Temporary debugging data.
|
|
146
|
+
- Output của một lần chạy test/scan.
|
|
147
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
148
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
149
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
150
|
+
- 👉 *Domain Ignore:* Các thao tác đổi tên biến (rename) hoặc format đơn giản.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
### Golden Rule
|
|
155
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
156
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
162
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
163
|
+
- Hard Bug có khả năng tái diễn.
|
|
164
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
165
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
166
|
+
- Quyết định Architecture quan trọng.
|
|
167
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
168
|
+
- 👉 *Domain Harvest:* Pattern tái cấu trúc mã nguồn hiệu quả (vd: bẻ gẫy god-file thành module O(1)).
|
|
169
|
+
|
|
170
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
171
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
172
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
177
|
+
Sau khi hoàn thành task:
|
|
178
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
179
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
180
|
+
- Đề xuất người dùng xem xét.
|
|
181
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
182
|
+
- `/learn`
|
|
183
|
+
- `qk-project-memory`
|
|
184
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
191
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### Ignore (Không đưa vào Memory)
|
|
196
|
+
Không lưu:
|
|
197
|
+
- Trace log của một session đơn lẻ.
|
|
198
|
+
- Temporary debugging data.
|
|
199
|
+
- Output của một lần chạy test/scan.
|
|
200
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
201
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
202
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
203
|
+
- 👉 *Domain Ignore:* Các thao tác đổi tên biến (rename) hoặc format đơn giản.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### Golden Rule
|
|
208
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
209
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
---
|
|
213
|
+
---
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Preconditions
|
|
217
|
+
- [ ] Target file(s) or module(s) are specified
|
|
218
|
+
- [ ] Tests exist for the target code (or can be created)
|
|
219
|
+
|
|
220
|
+
On missing precondition:
|
|
221
|
+
EXIT: BLOCKED
|
|
222
|
+
Message: "Missing: target files or test coverage"
|
|
223
|
+
|
|
224
|
+
## Scope
|
|
225
|
+
- Improve internal code quality without changing external behavior
|
|
226
|
+
- Reduce complexity, improve naming, extract functions
|
|
227
|
+
- Remove dead code and duplication
|
|
228
|
+
|
|
229
|
+
## Non-Goals
|
|
230
|
+
- Add new functionality
|
|
231
|
+
- Change public API signatures
|
|
232
|
+
- Modify behavior or business logic
|
|
233
|
+
|
|
234
|
+
## Workflow
|
|
235
|
+
1. Establish baseline (current behavior + tests)
|
|
236
|
+
2. Plan refactor steps
|
|
237
|
+
3. Execute step by step
|
|
238
|
+
4. Verify behavior unchanged
|
|
239
|
+
5. Run validation gate
|
|
240
|
+
|
|
241
|
+
## Exit Codes
|
|
242
|
+
| Code | Meaning |
|
|
243
|
+
|------|---------|
|
|
244
|
+
| SUCCESS | Refactor complete, behavior preserved, tests pass |
|
|
245
|
+
| PARTIAL | Refactor done, some tests need attention |
|
|
246
|
+
| BLOCKED | Missing preconditions |
|
|
247
|
+
| FAILED | Behavior changed or tests broken |
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: "qk-refactor"
|
|
3
|
+
version: "9.0.0"
|
|
4
|
+
description: "Tái cấu trúc và dọn dẹp mã nguồn để dễ bảo trì hơn mà không làm thay đổi logic hoạt động bên ngoài."
|
|
5
|
+
dependencies:
|
|
6
|
+
- "refactor"
|
|
7
|
+
tools:
|
|
8
|
+
- "filesystem"
|
|
9
|
+
- "terminal"
|
|
10
|
+
knowledge:
|
|
11
|
+
owns:
|
|
12
|
+
- "refactoring-patterns"
|
|
13
|
+
- "code-smells"
|
|
14
|
+
references:
|
|
15
|
+
- "architecture"
|
|
16
|
+
- "coding-standards"
|
|
17
|
+
eval:
|
|
18
|
+
scorecard: "evals/scorecard.yaml"
|
|
19
|
+
decision_boundary:
|
|
20
|
+
owns:
|
|
21
|
+
- "refactoring-patterns"
|
|
22
|
+
does_not_own:
|
|
23
|
+
- "new-functionality"
|
|
24
|
+
- "api-changes"
|
|
25
|
+
conflicts_with: []
|
|
26
|
+
delegates_to: []
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: qk-refactor-eval
|
|
2
|
+
description: Đánh giá an toàn và hiệu quả của tiến trình Refactor
|
|
3
|
+
version: 9.0.0
|
|
4
|
+
threshold: 90 # Yêu cầu an toàn rất cao, refactor không được làm hỏng tính năng
|
|
5
|
+
|
|
6
|
+
metrics:
|
|
7
|
+
- id: behavior_preservation
|
|
8
|
+
name: Bảo toàn Logic (Behavior Preservation)
|
|
9
|
+
description: Tái cấu trúc có làm thay đổi logic hoạt động hoặc API public không?
|
|
10
|
+
weight: 40
|
|
11
|
+
criteria:
|
|
12
|
+
- Tuyệt đối không thêm tính năng mới trong quá trình refactor (20đ)
|
|
13
|
+
- Không thay đổi chữ ký (signature) của các public API (20đ)
|
|
14
|
+
|
|
15
|
+
- id: test_coverage_precondition
|
|
16
|
+
name: Tiền điều kiện Kiểm thử (Tests)
|
|
17
|
+
description: Agent có từ chối refactor nếu không có Tests bảo vệ không?
|
|
18
|
+
weight: 35
|
|
19
|
+
criteria:
|
|
20
|
+
- Chặn (BLOCKED) và yêu cầu viết test nếu code chưa có coverage (35đ)
|
|
21
|
+
|
|
22
|
+
- id: complexity_reduction
|
|
23
|
+
name: Giảm Độ phức tạp (Complexity Reduction)
|
|
24
|
+
description: Kết quả refactor có thực sự làm code sạch và dễ bảo trì hơn không?
|
|
25
|
+
weight: 25
|
|
26
|
+
criteria:
|
|
27
|
+
- Tách hàm, loại bỏ code chết, giảm cyclomatic complexity rõ rệt (25đ)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
# ── Identity ───────────────────────────────────────────────
|
|
3
3
|
name: qk-security-audit
|
|
4
|
-
version:
|
|
4
|
+
version: 9.0.0
|
|
5
5
|
status: experimental
|
|
6
6
|
description: "Security audit (OWASP, dependency security, secret detection, permission model)."
|
|
7
7
|
platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
|
|
8
8
|
|
|
9
|
-
# ──
|
|
9
|
+
# ── V9: Classification ─────────────────────────────────────
|
|
10
10
|
type: capability
|
|
11
11
|
|
|
12
12
|
intent:
|
|
@@ -125,6 +125,136 @@ exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
|
125
125
|
|
|
126
126
|
> **Language rule:** Code, identifiers, file names → English. Explanations, summaries → Vietnamese.
|
|
127
127
|
|
|
128
|
+
## Memory Workflow
|
|
129
|
+
|
|
130
|
+
### Pre-flight Retrieve (Trước khi thực thi)
|
|
131
|
+
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
132
|
+
bắt buộc tra cứu:
|
|
133
|
+
- `.agents/knowledge/index.yaml` (Shared Project Knowledge)
|
|
134
|
+
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
135
|
+
|
|
136
|
+
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
137
|
+
- Architecture
|
|
138
|
+
- Hard Bug
|
|
139
|
+
- Convention
|
|
140
|
+
- Pattern
|
|
141
|
+
- Tech Debt Pattern
|
|
142
|
+
- 👉 *Domain Focus:* Hard Bug / Architecture (vd: lỗ hổng OWASP, lộ rò rỉ secret, quy chuẩn Zero-Trust R-SEC-04).
|
|
143
|
+
|
|
144
|
+
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
145
|
+
Không được xem Memory là Source of Truth.
|
|
146
|
+
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
151
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
152
|
+
- Hard Bug có khả năng tái diễn.
|
|
153
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
154
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
155
|
+
- Quyết định Architecture quan trọng.
|
|
156
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
157
|
+
- 👉 *Domain Harvest:* Lỗ hổng bảo mật mới phát hiện (Hard Bug) hoặc chính sách an toàn mới.
|
|
158
|
+
|
|
159
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
160
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
161
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
166
|
+
Sau khi hoàn thành task:
|
|
167
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
168
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
169
|
+
- Đề xuất người dùng xem xét.
|
|
170
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
171
|
+
- `/learn`
|
|
172
|
+
- `qk-project-memory`
|
|
173
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
180
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
### Ignore (Không đưa vào Memory)
|
|
185
|
+
Không lưu:
|
|
186
|
+
- Trace log của một session đơn lẻ.
|
|
187
|
+
- Temporary debugging data.
|
|
188
|
+
- Output của một lần chạy test/scan.
|
|
189
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
190
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
191
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
192
|
+
- 👉 *Domain Ignore:* Cảnh báo scanner giả (false positive) đã xác thực.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
### Golden Rule
|
|
197
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
198
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
204
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
205
|
+
- Hard Bug có khả năng tái diễn.
|
|
206
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
207
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
208
|
+
- Quyết định Architecture quan trọng.
|
|
209
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
210
|
+
- 👉 *Domain Harvest:* Lỗ hổng bảo mật mới phát hiện (Hard Bug) hoặc chính sách an toàn mới.
|
|
211
|
+
|
|
212
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
213
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
214
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
219
|
+
Sau khi hoàn thành task:
|
|
220
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
221
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
222
|
+
- Đề xuất người dùng xem xét.
|
|
223
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
224
|
+
- `/learn`
|
|
225
|
+
- `qk-project-memory`
|
|
226
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
233
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
### Ignore (Không đưa vào Memory)
|
|
238
|
+
Không lưu:
|
|
239
|
+
- Trace log của một session đơn lẻ.
|
|
240
|
+
- Temporary debugging data.
|
|
241
|
+
- Output của một lần chạy test/scan.
|
|
242
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
243
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
244
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
245
|
+
- 👉 *Domain Ignore:* Cảnh báo scanner giả (false positive) đã xác thực.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### Golden Rule
|
|
250
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
251
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
---
|
|
255
|
+
---
|
|
256
|
+
---
|
|
257
|
+
|
|
128
258
|
## Preconditions
|
|
129
259
|
- [ ] Tuân thủ `security.md`.
|
|
130
260
|
- [ ] Xác định phạm vi codebase cần audit.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Auto-generated from SKILL.md frontmatter
|
|
2
|
+
schema_version: 1
|
|
3
|
+
id: "qk-security-audit"
|
|
4
|
+
version: "9.0.0"
|
|
5
|
+
description: "Security audit (OWASP, dependency security, secret detection, permission model)."
|
|
6
|
+
tools:
|
|
7
|
+
- "filesystem"
|
|
8
|
+
- "terminal"
|
|
9
|
+
knowledge:
|
|
10
|
+
owns:
|
|
11
|
+
- "qk-security-audit"
|
|
12
|
+
references:
|
|
13
|
+
- "architecture"
|
|
14
|
+
- "security"
|
|
15
|
+
- "anti-patterns"
|
|
16
|
+
eval:
|
|
17
|
+
scorecard: "evals/scorecard.yaml"
|
|
18
|
+
decision_boundary:
|
|
19
|
+
owns:
|
|
20
|
+
- "application-security"
|
|
21
|
+
- "agent-security"
|
|
22
|
+
- "prompt-injection"
|
|
23
|
+
- "dependency-risk"
|
|
24
|
+
does_not_own:
|
|
25
|
+
- "access control implementation"
|
|
26
|
+
- "penetration testing"
|
|
27
|
+
- "compliance certification"
|
|
28
|
+
conflicts_with: []
|
|
29
|
+
delegates_to:
|
|
30
|
+
- "qk-validation-gate"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: qk-security-audit-eval
|
|
2
|
+
description: Đánh giá chất lượng Kiểm toán Bảo mật
|
|
3
|
+
version: 9.0.0
|
|
4
|
+
threshold: 95 # Threshold gần như tuyệt đối vì đây là lưới lọc bảo mật cuối cùng
|
|
5
|
+
|
|
6
|
+
metrics:
|
|
7
|
+
- id: secret_leak_detection
|
|
8
|
+
name: Nhận diện rò rỉ Secret (Secret Leak)
|
|
9
|
+
description: Agent có phát hiện được API keys/Passwords bị hardcode không?
|
|
10
|
+
weight: 40
|
|
11
|
+
criteria:
|
|
12
|
+
- Rà quét và chỉ điểm chính xác file/line chứa secret bị hardcode (40đ)
|
|
13
|
+
|
|
14
|
+
- id: r_sec_04_enforcement
|
|
15
|
+
name: Rà soát Zero-Trust & Phân quyền
|
|
16
|
+
description: Có kiểm tra các lỗ hổng RBAC/ABAC và Prompt Injection không?
|
|
17
|
+
weight: 35
|
|
18
|
+
criteria:
|
|
19
|
+
- Đánh giá mô hình quyền hạn xem có lỗ hổng BOLA hoặc Broken Auth không (15đ)
|
|
20
|
+
- Quét nguy cơ Prompt Injection (nếu có LLM integration) theo chuẩn R-SEC-04 (20đ)
|
|
21
|
+
|
|
22
|
+
- id: owasp_and_dependencies
|
|
23
|
+
name: Lỗ hổng OWASP & Dependencies
|
|
24
|
+
description: Có kiểm tra các thư viện lỗi thời hoặc lỗ hổng phổ biến không?
|
|
25
|
+
weight: 25
|
|
26
|
+
criteria:
|
|
27
|
+
- Đưa ra danh sách cảnh báo dựa trên OWASP Top 10 và Dependency Tree (25đ)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
# ── Identity ───────────────────────────────────────────────
|
|
3
3
|
name: qk-system-evolution
|
|
4
|
-
version:
|
|
4
|
+
version: 9.0.0
|
|
5
5
|
status: stable
|
|
6
6
|
description: "Nâng cấp thư viện/framework an toàn với rollback plan bắt buộc — incremental, không big-bang."
|
|
7
7
|
platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
|
|
8
8
|
|
|
9
|
-
# ──
|
|
9
|
+
# ── V9: Classification ─────────────────────────────────────
|
|
10
10
|
type: capability
|
|
11
11
|
|
|
12
12
|
intent:
|
|
@@ -87,6 +87,136 @@ exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
|
87
87
|
|
|
88
88
|
> **Language rule:** Code, identifiers, file names → English. Explanations, summaries → Vietnamese.
|
|
89
89
|
|
|
90
|
+
## Memory Workflow
|
|
91
|
+
|
|
92
|
+
### Pre-flight Retrieve (Trước khi thực thi)
|
|
93
|
+
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
94
|
+
bắt buộc tra cứu:
|
|
95
|
+
- `.agents/knowledge/index.yaml` (Shared Project Knowledge)
|
|
96
|
+
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
97
|
+
|
|
98
|
+
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
99
|
+
- Architecture
|
|
100
|
+
- Hard Bug
|
|
101
|
+
- Convention
|
|
102
|
+
- Pattern
|
|
103
|
+
- Tech Debt Pattern
|
|
104
|
+
- 👉 *Domain Focus:* Architecture / Hard Bug (vd: kế hoạch nâng cấp thư viện incremental, breaking changes).
|
|
105
|
+
|
|
106
|
+
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
107
|
+
Không được xem Memory là Source of Truth.
|
|
108
|
+
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
113
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
114
|
+
- Hard Bug có khả năng tái diễn.
|
|
115
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
116
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
117
|
+
- Quyết định Architecture quan trọng.
|
|
118
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
119
|
+
- 👉 *Domain Harvest:* Kinh nghiệm xử lý xung đột dependency hoặc bài học downgrade/rollback.
|
|
120
|
+
|
|
121
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
122
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
123
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
128
|
+
Sau khi hoàn thành task:
|
|
129
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
130
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
131
|
+
- Đề xuất người dùng xem xét.
|
|
132
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
133
|
+
- `/learn`
|
|
134
|
+
- `qk-project-memory`
|
|
135
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
142
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
### Ignore (Không đưa vào Memory)
|
|
147
|
+
Không lưu:
|
|
148
|
+
- Trace log của một session đơn lẻ.
|
|
149
|
+
- Temporary debugging data.
|
|
150
|
+
- Output của một lần chạy test/scan.
|
|
151
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
152
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
153
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
154
|
+
- 👉 *Domain Ignore:* Lockfile changes tạm thời trong local cache.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
### Golden Rule
|
|
159
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
160
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### Learning Flow (AI tự học có kiểm soát)
|
|
166
|
+
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
167
|
+
- Hard Bug có khả năng tái diễn.
|
|
168
|
+
- Pattern làm việc lặp lại trong dự án.
|
|
169
|
+
- Convention hoặc quy tắc kiến trúc mới.
|
|
170
|
+
- Quyết định Architecture quan trọng.
|
|
171
|
+
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
172
|
+
- 👉 *Domain Harvest:* Kinh nghiệm xử lý xung đột dependency hoặc bài học downgrade/rollback.
|
|
173
|
+
|
|
174
|
+
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
175
|
+
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
176
|
+
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
181
|
+
Sau khi hoàn thành task:
|
|
182
|
+
- AI đánh giá các Candidate Memory đã tạo.
|
|
183
|
+
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
184
|
+
- Đề xuất người dùng xem xét.
|
|
185
|
+
- Gửi yêu cầu phê duyệt thông qua:
|
|
186
|
+
- `/learn`
|
|
187
|
+
- `qk-project-memory`
|
|
188
|
+
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
195
|
+
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
### Ignore (Không đưa vào Memory)
|
|
200
|
+
Không lưu:
|
|
201
|
+
- Trace log của một session đơn lẻ.
|
|
202
|
+
- Temporary debugging data.
|
|
203
|
+
- Output của một lần chạy test/scan.
|
|
204
|
+
- Report health tạm thời của một đợt kiểm tra.
|
|
205
|
+
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
206
|
+
- Thông tin không có khả năng tái sử dụng.
|
|
207
|
+
- 👉 *Domain Ignore:* Lockfile changes tạm thời trong local cache.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### Golden Rule
|
|
212
|
+
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
213
|
+
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
---
|
|
217
|
+
---
|
|
218
|
+
---
|
|
219
|
+
|
|
90
220
|
## Preconditions
|
|
91
221
|
- [ ] Current version and target version are specified
|
|
92
222
|
- [ ] Rollback strategy is defined (git tag OR package-lock.json snapshot)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Auto-generated from SKILL.md frontmatter
|
|
2
|
+
schema_version: 1
|
|
3
|
+
id: "qk-system-evolution"
|
|
4
|
+
version: "9.0.0"
|
|
5
|
+
description: "Nâng cấp thư viện/framework an toàn với rollback plan bắt buộc — incremental, không big-bang."
|
|
6
|
+
tools:
|
|
7
|
+
- "filesystem"
|
|
8
|
+
- "terminal"
|
|
9
|
+
knowledge:
|
|
10
|
+
owns:
|
|
11
|
+
- "upgrade-strategy"
|
|
12
|
+
- "rollback-plan"
|
|
13
|
+
references:
|
|
14
|
+
- "testing"
|
|
15
|
+
- "architecture"
|
|
16
|
+
- "security"
|
|
17
|
+
- "anti-patterns"
|
|
18
|
+
eval:
|
|
19
|
+
scorecard: "evals/scorecard.yaml"
|
|
20
|
+
decision_boundary:
|
|
21
|
+
owns:
|
|
22
|
+
- "qk-system-evolution"
|
|
23
|
+
does_not_own: []
|
|
24
|
+
conflicts_with: []
|