kodu 2.1.3 → 2.2.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/__tests__/core/registry/registry.service.test.ts +82 -0
- package/__tests__/shared/runbook/runbook.service.test.ts +104 -0
- package/dist/package.json +1 -1
- package/dist/src/app.module.js +6 -0
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/commands/ops/ops-add.command.d.ts +18 -0
- package/dist/src/commands/ops/ops-add.command.js +102 -0
- package/dist/src/commands/ops/ops-add.command.js.map +1 -0
- package/dist/src/commands/ops/ops-init.command.d.ts +22 -0
- package/dist/src/commands/ops/ops-init.command.js +130 -0
- package/dist/src/commands/ops/ops-init.command.js.map +1 -0
- package/dist/src/commands/ops/ops-list.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-list.command.js +73 -0
- package/dist/src/commands/ops/ops-list.command.js.map +1 -0
- package/dist/src/commands/ops/ops-path.command.d.ts +9 -0
- package/dist/src/commands/ops/ops-path.command.js +52 -0
- package/dist/src/commands/ops/ops-path.command.js.map +1 -0
- package/dist/src/commands/ops/ops-runbook.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-runbook.command.js +81 -0
- package/dist/src/commands/ops/ops-runbook.command.js.map +1 -0
- package/dist/src/commands/ops/ops-status.command.d.ts +11 -0
- package/dist/src/commands/ops/ops-status.command.js +62 -0
- package/dist/src/commands/ops/ops-status.command.js.map +1 -0
- package/dist/src/commands/ops/ops-use.command.d.ts +12 -0
- package/dist/src/commands/ops/ops-use.command.js +76 -0
- package/dist/src/commands/ops/ops-use.command.js.map +1 -0
- package/dist/src/commands/ops/ops.command.d.ts +7 -0
- package/dist/src/commands/ops/ops.command.js +56 -0
- package/dist/src/commands/ops/ops.command.js.map +1 -0
- package/dist/src/commands/ops/ops.helpers.d.ts +2 -0
- package/dist/src/commands/ops/ops.helpers.js +11 -0
- package/dist/src/commands/ops/ops.helpers.js.map +1 -0
- package/dist/src/commands/ops/ops.module.d.ts +2 -0
- package/dist/src/commands/ops/ops.module.js +36 -0
- package/dist/src/commands/ops/ops.module.js.map +1 -0
- package/dist/src/core/registry/registry.module.d.ts +2 -0
- package/dist/src/core/registry/registry.module.js +22 -0
- package/dist/src/core/registry/registry.module.js.map +1 -0
- package/dist/src/core/registry/registry.schema.d.ts +24 -0
- package/dist/src/core/registry/registry.schema.js +21 -0
- package/dist/src/core/registry/registry.schema.js.map +1 -0
- package/dist/src/core/registry/registry.service.d.ts +16 -0
- package/dist/src/core/registry/registry.service.js +91 -0
- package/dist/src/core/registry/registry.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.module.d.ts +2 -0
- package/dist/src/shared/runbook/runbook.module.js +22 -0
- package/dist/src/shared/runbook/runbook.module.js.map +1 -0
- package/dist/src/shared/runbook/runbook.service.d.ts +20 -0
- package/dist/src/shared/runbook/runbook.service.js +118 -0
- package/dist/src/shared/runbook/runbook.service.js.map +1 -0
- package/dist/src/shared/runbook/runbook.templates.d.ts +6 -0
- package/dist/src/shared/runbook/runbook.templates.js +49 -0
- package/dist/src/shared/runbook/runbook.templates.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/registry.schema.json +39 -0
- package/scripts/generate-json-schema.ts +14 -5
- package/skills/ac/SKILL.md +239 -0
- package/skills/al/SKILL.md +98 -0
- package/skills/audit/SKILL.md +205 -0
- package/skills/audit/audit-baseline-template.yml +188 -0
- package/skills/audit/runtime-detect.md +64 -0
- package/skills/audit/stacks/_generic.md +41 -0
- package/skills/audit/stacks/_registry.md +47 -0
- package/skills/audit/stacks/go.md +66 -0
- package/skills/audit/stacks/java.md +44 -0
- package/skills/audit/stacks/node.md +57 -0
- package/skills/audit/stacks/python.md +45 -0
- package/skills/audit/stacks/rust.md +44 -0
- package/skills/audit-api-contracts/SKILL.md +201 -0
- package/skills/audit-architecture/SKILL.md +200 -0
- package/skills/audit-bugs/SKILL.md +226 -0
- package/skills/audit-concurrency/SKILL.md +197 -0
- package/skills/audit-deployment/SKILL.md +218 -0
- package/skills/audit-docs/SKILL.md +209 -0
- package/skills/audit-errors/SKILL.md +216 -0
- package/skills/audit-logging/SKILL.md +197 -0
- package/skills/audit-matrix/SKILL.md +245 -0
- package/skills/audit-meta/SKILL.md +120 -0
- package/skills/audit-naming/SKILL.md +200 -0
- package/skills/audit-owasp/SKILL.md +223 -0
- package/skills/audit-performance/SKILL.md +199 -0
- package/skills/audit-reinvention/SKILL.md +214 -0
- package/skills/audit-secrets/SKILL.md +198 -0
- package/skills/audit-tests/SKILL.md +210 -0
- package/skills/audit-validation/SKILL.md +206 -0
- package/skills/audit-verify/SKILL.md +139 -0
- package/skills/audit-yagni/SKILL.md +188 -0
- package/skills/generate-project-docs/SKILL.md +380 -0
- package/skills/ops/SKILL.md +94 -0
- package/skills/post-call-task-builder/SKILL.md +419 -0
- package/skills/skills-best-practices/SKILL.md +415 -0
- package/src/app.module.ts +6 -0
- package/src/commands/ops/ops-add.command.ts +83 -0
- package/src/commands/ops/ops-init.command.ts +125 -0
- package/src/commands/ops/ops-list.command.ts +57 -0
- package/src/commands/ops/ops-path.command.ts +38 -0
- package/src/commands/ops/ops-runbook.command.ts +74 -0
- package/src/commands/ops/ops-status.command.ts +47 -0
- package/src/commands/ops/ops-use.command.ts +76 -0
- package/src/commands/ops/ops.command.ts +42 -0
- package/src/commands/ops/ops.helpers.ts +20 -0
- package/src/commands/ops/ops.module.ts +23 -0
- package/src/core/registry/registry.module.ts +9 -0
- package/src/core/registry/registry.schema.ts +46 -0
- package/src/core/registry/registry.service.ts +128 -0
- package/src/shared/runbook/runbook.module.ts +9 -0
- package/src/shared/runbook/runbook.service.ts +164 -0
- package/src/shared/runbook/runbook.templates.ts +66 -0
package/package.json
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"$schema": {
|
|
6
|
+
"type": "string"
|
|
7
|
+
},
|
|
8
|
+
"projects": {
|
|
9
|
+
"default": {},
|
|
10
|
+
"type": "object",
|
|
11
|
+
"propertyNames": {
|
|
12
|
+
"type": "string"
|
|
13
|
+
},
|
|
14
|
+
"additionalProperties": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"properties": {
|
|
17
|
+
"path": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 1
|
|
20
|
+
},
|
|
21
|
+
"repo": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"stands": {
|
|
25
|
+
"default": ["local", "dev", "stage", "prod"],
|
|
26
|
+
"type": "array",
|
|
27
|
+
"items": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"required": ["path", "stands"],
|
|
33
|
+
"additionalProperties": false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"required": ["projects"],
|
|
38
|
+
"additionalProperties": false
|
|
39
|
+
}
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { writeFile } from 'node:fs/promises';
|
|
2
2
|
import { execa } from 'execa';
|
|
3
3
|
import { configSchema } from '../src/core/config/config.schema';
|
|
4
|
+
import { registrySchema } from '../src/core/registry/registry.schema';
|
|
4
5
|
|
|
5
6
|
async function main(): Promise<void> {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
await writeFile(
|
|
8
|
+
'kodu.schema.json',
|
|
9
|
+
JSON.stringify(configSchema.toJSONSchema(), null, 2),
|
|
10
|
+
'utf8',
|
|
11
|
+
);
|
|
10
12
|
await execa('biome', ['format', '--write', 'kodu.schema.json']);
|
|
11
|
-
|
|
12
13
|
console.log('✅ JSON schema generated: kodu.schema.json');
|
|
14
|
+
|
|
15
|
+
await writeFile(
|
|
16
|
+
'registry.schema.json',
|
|
17
|
+
JSON.stringify(registrySchema.toJSONSchema(), null, 2),
|
|
18
|
+
'utf8',
|
|
19
|
+
);
|
|
20
|
+
await execa('biome', ['format', '--write', 'registry.schema.json']);
|
|
21
|
+
console.log('✅ JSON schema generated: registry.schema.json');
|
|
13
22
|
}
|
|
14
23
|
|
|
15
24
|
main().catch((error: unknown) => {
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ac
|
|
3
|
+
description: "Обновляет status.md, фиксирует решения и выполняет грамотный git commit."
|
|
4
|
+
compatibility: opencode
|
|
5
|
+
metadata:
|
|
6
|
+
level: multi
|
|
7
|
+
output: .agent-log/ + git commit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Что делает этот скилл
|
|
11
|
+
|
|
12
|
+
Перед коммитом делает три вещи:
|
|
13
|
+
1. **Проверяет** — нет ли секретов в коде
|
|
14
|
+
2. **Обновляет** — `status.md` (отмечает что сделано) и пишет decision если нужно
|
|
15
|
+
3. **Коммитит** — по Conventional Commits, с WHY в теле
|
|
16
|
+
|
|
17
|
+
Запускается **автоматически** при словах "коммитим / готово / push / закончили / сохрани".
|
|
18
|
+
Пользователь может вызвать вручную: `/ac`.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Шаги
|
|
23
|
+
|
|
24
|
+
## Шаг 1 — Узнать что изменилось
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git diff --cached --name-only
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Если список пустой:
|
|
31
|
+
```bash
|
|
32
|
+
git diff HEAD --name-only
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Если и там пусто → написать "Нечего коммитить" и **остановиться**.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Шаг 2 — Проверить на секреты
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git diff --cached
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Проверить весь diff по паттернам:
|
|
46
|
+
|
|
47
|
+
- AWS access key
|
|
48
|
+
- GitHub PAT
|
|
49
|
+
- OpenAI / Anthropic key / ...
|
|
50
|
+
- Приватный ключ
|
|
51
|
+
- Пароль в коде (не placeholder)
|
|
52
|
+
- Секрет в коде (не placeholder)
|
|
53
|
+
|
|
54
|
+
**Нашёл → СТОП.** Показать строку с проблемой. Коммитить нельзя.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Шаг 3 — Записать архитектурное решение (если было)
|
|
59
|
+
|
|
60
|
+
**Сначала ответить:** было ли в сессии архитектурное решение? (обсуждались варианты, выбирался подход)
|
|
61
|
+
|
|
62
|
+
**Нет → пропустить этот шаг.**
|
|
63
|
+
|
|
64
|
+
**Да:**
|
|
65
|
+
|
|
66
|
+
1. Найти следующий ID: `glob: .agent-log/decisions/**/*.md` → max номер `DEC-NNNN` → +1. Если файлов нет → `DEC-0001`.
|
|
67
|
+
|
|
68
|
+
2. Slug из заголовка:
|
|
69
|
+
```bash
|
|
70
|
+
python3 -c "import unicodedata,re,sys; s=unicodedata.normalize('NFKD',sys.argv[1]).encode('ascii','ignore').decode(); print(re.sub(r'[^a-z0-9]+','-',s.lower()).strip('-'))" "Заголовок решения"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
3. Создать `.agent-log/decisions/YYYY/MM/DD/DEC-NNNN-slug.md`:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
---
|
|
77
|
+
id: DEC-NNNN
|
|
78
|
+
type: decision
|
|
79
|
+
title: Заголовок решения
|
|
80
|
+
summary: Одна строка — суть выбора
|
|
81
|
+
status: active
|
|
82
|
+
created_at: YYYY-MM-DD
|
|
83
|
+
updated_at: YYYY-MM-DD
|
|
84
|
+
tags: [тег1, тег2]
|
|
85
|
+
confidence: medium
|
|
86
|
+
schema_version: 1
|
|
87
|
+
related_files: [только исходный код, без .agent-log/]
|
|
88
|
+
origin: generated
|
|
89
|
+
verification_state: unverified
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Контекст
|
|
93
|
+
|
|
94
|
+
Почему возник этот вопрос. Что за проблема. Понятно для нового разработчика.
|
|
95
|
+
|
|
96
|
+
## Решение
|
|
97
|
+
|
|
98
|
+
Что выбрали и почему именно это.
|
|
99
|
+
|
|
100
|
+
## Альтернативы
|
|
101
|
+
|
|
102
|
+
Что рассматривали и почему не выбрали. Даже плохие варианты — чтобы не предлагали снова.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Запомнить ID (`DEC-NNNN`) — нужен в шаге 6.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Шаг 4 — Обновить status.md
|
|
110
|
+
|
|
111
|
+
Прочитать `.agent-log/status.md`.
|
|
112
|
+
|
|
113
|
+
Определить: какая задача из "Текущего фокуса" решена этим коммитом?
|
|
114
|
+
|
|
115
|
+
- `- [ ] задача` → `- [x] задача` для выполненной
|
|
116
|
+
- Если в "Ближайшем бэклоге" есть задачи — перенести первую в "Текущий фокус"
|
|
117
|
+
(убрать из бэклога, добавить как `- [ ]` в фокус)
|
|
118
|
+
- Обновить `updated_at` во frontmatter: текущая дата и время (`YYYY-MM-DD HH:MM`)
|
|
119
|
+
|
|
120
|
+
Если `status.md` не существует → создать пустой шаблон:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
---
|
|
124
|
+
type: status
|
|
125
|
+
updated_at: YYYY-MM-DD HH:MM
|
|
126
|
+
current_goal: ""
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
# Текущий фокус
|
|
130
|
+
- [ ] Задача не определена
|
|
131
|
+
|
|
132
|
+
# Ближайший бэклог (Next Steps)
|
|
133
|
+
|
|
134
|
+
# Известные проблемы / Технический долг
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Шаг 5 — Добавить файлы в staged
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git add .agent-log/status.md
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Если в шаге 3 создано решение:
|
|
146
|
+
```bash
|
|
147
|
+
git add .agent-log/decisions/
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Шаг 6 — Сформировать commit message
|
|
153
|
+
|
|
154
|
+
### Формат (Conventional Commits)
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
тип(область): короткое описание
|
|
158
|
+
|
|
159
|
+
Почему было сделано это изменение.
|
|
160
|
+
Какая проблема решалась и почему именно так.
|
|
161
|
+
|
|
162
|
+
Related: DEC-NNNN
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Как выбрать тип
|
|
166
|
+
|
|
167
|
+
| Тип | Когда |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `feat` | Новая функциональность |
|
|
170
|
+
| `fix` | Исправление бага |
|
|
171
|
+
| `refactor` | Переработка без изменения поведения |
|
|
172
|
+
| `docs` | Только документация |
|
|
173
|
+
| `chore` | Конфиги, зависимости |
|
|
174
|
+
| `test` | Тесты |
|
|
175
|
+
| `perf` | Производительность |
|
|
176
|
+
| `style` | Форматирование |
|
|
177
|
+
| `build` | Сборка, CI/CD |
|
|
178
|
+
|
|
179
|
+
### Правила первой строки
|
|
180
|
+
|
|
181
|
+
- Императив: `add`, `fix`, `remove` (не `added`, не `adding`)
|
|
182
|
+
- Строчная буква после двоеточия, без точки, ≤72 символа
|
|
183
|
+
- **Всегда на английском**
|
|
184
|
+
|
|
185
|
+
### Тело — обязательно
|
|
186
|
+
|
|
187
|
+
WHY, не WHAT. Почему именно так. Отделить пустой строкой, перенос на 72 символах.
|
|
188
|
+
|
|
189
|
+
### Footer
|
|
190
|
+
|
|
191
|
+
- `Related: DEC-NNNN` — если в шаге 3 создано решение
|
|
192
|
+
- `BREAKING CHANGE: описание` — если ломающее изменение
|
|
193
|
+
|
|
194
|
+
### Пример
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
feat(auth): add session invalidation via Redis
|
|
198
|
+
|
|
199
|
+
JWT tokens could not be revoked server-side without maintaining
|
|
200
|
+
a blacklist. Redis-based sessions solve this with O(1) lookup
|
|
201
|
+
and TTL-based cleanup.
|
|
202
|
+
|
|
203
|
+
Related: DEC-0001
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Шаг 7 — Выполнить коммит
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
git commit -m "тип(область): описание
|
|
212
|
+
|
|
213
|
+
WHY в теле.
|
|
214
|
+
|
|
215
|
+
Related: DEC-NNNN"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Шаг 8 — Вывод пользователю
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
✅ Изменения зафиксированы
|
|
224
|
+
Коммит: <sha7> — <описание>
|
|
225
|
+
status.md обновлён.
|
|
226
|
+
Решений записано: [N / нет]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
# Правила
|
|
232
|
+
|
|
233
|
+
- **Секреты** → СТОП, показать строку, не коммитить
|
|
234
|
+
- **Decision** — только при реальном архитектурном выборе, не каждый коммит
|
|
235
|
+
- **Commit message** — английский, Conventional Commits
|
|
236
|
+
- **WHY неясен** — инферировать из контекста сессии, не спрашивать повторно
|
|
237
|
+
- **status.md** — обновлять всегда, минимум `updated_at`
|
|
238
|
+
- **Язык в markdown-файлах** — просто и понятно, короткие предложения, без жаргона без объяснений
|
|
239
|
+
- **Порядок**: проверить → записать файлы → git add → git commit
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: al
|
|
3
|
+
description: "Загружает рабочий контекст из .agent-log/ и git log в начале сессии."
|
|
4
|
+
compatibility: opencode
|
|
5
|
+
metadata:
|
|
6
|
+
level: single
|
|
7
|
+
output: context summary
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Что делает этот скилл
|
|
11
|
+
|
|
12
|
+
Даёт агенту актуальный рабочий контекст перед началом работы:
|
|
13
|
+
- что делаем прямо сейчас (из `status.md`)
|
|
14
|
+
- что уже было сделано (из `git log`)
|
|
15
|
+
- какие архитектурные решения приняты (из `decisions/`)
|
|
16
|
+
|
|
17
|
+
Запускается **автоматически** в начале каждой сессии. Пользователь может вызвать вручную: `/al`.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Шаги
|
|
22
|
+
|
|
23
|
+
**Шаг 1 — Проверить базу знаний**
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
ls .agent-log/
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> ⚠️ Никогда не использовать инструмент `read` для директории — вернёт "File not found". Всегда через `bash`.
|
|
30
|
+
|
|
31
|
+
- Директория есть → перейти к шагу 2
|
|
32
|
+
- Директории нет → сообщить: _"AKMS не инициализирован. Запустить `akms init`?"_ — остановиться
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
**Шаг 2 — Прочитать текущий фокус**
|
|
37
|
+
|
|
38
|
+
Прочитать `.agent-log/status.md` целиком — файл всегда короткий.
|
|
39
|
+
|
|
40
|
+
Запомнить:
|
|
41
|
+
- `current_goal` из frontmatter — глобальная цель проекта
|
|
42
|
+
- первый незакрытый пункт `- [ ]` из раздела "Текущий фокус"
|
|
43
|
+
|
|
44
|
+
Если `status.md` не существует → пропустить, продолжить без фокуса.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
**Шаг 3 — Загрузить активные решения**
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
glob: .agent-log/decisions/**/*.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Для каждого читать **только первые 15 строк** — frontmatter достаточно.
|
|
55
|
+
|
|
56
|
+
Оставить только: `status: active` или `status: needs_review`. Максимум **7 записей**.
|
|
57
|
+
|
|
58
|
+
Если решений нет → пропустить.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
**Шаг 4 — Прочитать историю из Git**
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git log -n 5 --pretty=format:"* %h — %s (%ar)"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Последние 5 коммитов в одну строку каждый. Быстро, не читает файловую систему.
|
|
69
|
+
|
|
70
|
+
Если git не инициализирован или репозиторий пустой → пропустить.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
**Шаг 5 — Вывести контекст пользователю**
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
📚 AKMS контекст загружен
|
|
78
|
+
Текущая цель: [current_goal из status.md / "не задана"]
|
|
79
|
+
Активная задача: [первый - [ ] пункт / "нет открытых задач"]
|
|
80
|
+
Последние коммиты:
|
|
81
|
+
* a1b2c3d — feat(auth): add redis support (2 hours ago)
|
|
82
|
+
* ...
|
|
83
|
+
Активные решения: [DEC-0001: заголовок, ...] / нет
|
|
84
|
+
|
|
85
|
+
Работаем.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
После вывода — сразу переходить к задаче пользователя.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
# Правила
|
|
93
|
+
|
|
94
|
+
- **status.md читать целиком** — он специально короткий, это не расточительство
|
|
95
|
+
- **decisions** — только первые 15 строк (frontmatter), тело не нужно
|
|
96
|
+
- **git log вместо файлов коммитов** — быстрее и всегда актуально
|
|
97
|
+
- **Директорию проверять через `bash ls`** — не через `read`
|
|
98
|
+
- **Не задавать вопросов** — только читать, ничего не менять
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit
|
|
3
|
+
description: >
|
|
4
|
+
Мастер-оркестратор комплексного аудита кодовой базы. Запускает все 18 специализированных
|
|
5
|
+
проверок и группирует результаты по компонентам системы. Вызывай при /audit или
|
|
6
|
+
запросе "полный аудит", "комплексный аудит кодовой базы".
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Задача
|
|
10
|
+
|
|
11
|
+
Ты — ведущий инженер по качеству и безопасности, проводящий полный аудит кодовой базы.
|
|
12
|
+
|
|
13
|
+
## Шаг 0 — Runtime resolution (определение стека)
|
|
14
|
+
|
|
15
|
+
Аудиты стек-агностичны: конкретика берётся из профиля стека. Определи рантайм
|
|
16
|
+
ОДИН раз здесь и передай его всем саб-скиллам, чтобы они не передетектили.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
if [ -f package.json ]; then echo "runtime=node"
|
|
20
|
+
elif [ -f go.mod ]; then echo "runtime=go"
|
|
21
|
+
elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
|
|
22
|
+
elif [ -f Cargo.toml ]; then echo "runtime=rust"
|
|
23
|
+
elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
|
|
24
|
+
else echo "runtime=generic"; fi
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Один запуск `/audit` = ОДИН рантайм. **Полиглот-репозиторий** (например Go-бэкенд
|
|
28
|
+
+ Node-фронтенд в сабмодулях) аудить по подпроектам: запусти `/audit` отдельно
|
|
29
|
+
внутри каждого подкаталога (`backend/`, `frontend/`). Если в текущем каталоге
|
|
30
|
+
несколько маркеров — выбери по scope и сообщи об этом пользователю.
|
|
31
|
+
|
|
32
|
+
Прочитай профиль один раз через Read: `./skills/audit/stacks/<runtime>.md`
|
|
33
|
+
(fallback `./skills/audit/stacks/_generic.md`). Канон детекта — `./skills/audit/runtime-detect.md`.
|
|
34
|
+
|
|
35
|
+
Передавай `runtime=<id>` + содержимое профиля как контекст каждому sub-скиллу
|
|
36
|
+
(тем же каналом, что и baseline). Саб-скиллы увидят это и пропустят собственный
|
|
37
|
+
детект; при автономном запуске они детектят сами.
|
|
38
|
+
|
|
39
|
+
## Шаг 1 — Подготовка сессии
|
|
40
|
+
|
|
41
|
+
Выполни через Bash:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Удалить старые сессии, оставить 2 последних
|
|
45
|
+
ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | tail -n +3 | xargs rm -rf 2>/dev/null
|
|
46
|
+
# Создать папку новой сессии
|
|
47
|
+
mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Для incremental-аудита (только изменённые файлы) — определи scope:
|
|
51
|
+
```bash
|
|
52
|
+
git diff --name-only HEAD~1 2>/dev/null | grep -E '\.(ts|js|py|go|rs)$' | head -30
|
|
53
|
+
```
|
|
54
|
+
Если список < 20 файлов — начинай аудит с них, затем критические пути.
|
|
55
|
+
|
|
56
|
+
## Шаг 2 — Baseline
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
cat ./docs/audit-baseline.yml 2>/dev/null
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Если файл не существует — создай:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
|
|
66
|
+
printf "accepted: []\n" > ./docs/audit-baseline.yml
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Сообщи: `📋 docs/audit-baseline.yml создан. Заполни для подавления принятых рисков.`
|
|
70
|
+
|
|
71
|
+
Содержимое baseline передавай как контекст каждому sub-скиллу (вместе с `runtime=<id>` и профилем из Шага 0).
|
|
72
|
+
|
|
73
|
+
## Шаг 3 — Декомпозиция системы
|
|
74
|
+
|
|
75
|
+
Перечисли логические компоненты (Аутентификация, API, Фоновые задачи и т.д.) перед запуском аудитов. Используй структуру папок как ориентир.
|
|
76
|
+
|
|
77
|
+
## Шаг 3.5 — Критические пути (Risk-Based Prioritization)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
grep -rl "auth\|login\|payment\|billing\|webhook\|cron\|migration" ./src 2>/dev/null | head -20
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Перечисли critical paths — файлы/модули с наибольшим blast radius:
|
|
84
|
+
```
|
|
85
|
+
Critical paths (exhaustive depth):
|
|
86
|
+
- Authentication: src/auth/**
|
|
87
|
+
- Payments: src/payments/**
|
|
88
|
+
- Webhooks/Workers: src/workers/**
|
|
89
|
+
|
|
90
|
+
Standard paths: src/api/**, src/services/**
|
|
91
|
+
Low priority (naming/style): src/utils/**
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Передавай список critical paths каждому sub-скиллу — они должны начинать с этих файлов.
|
|
95
|
+
|
|
96
|
+
## Шаг 4 — Анализ по 18 направлениям
|
|
97
|
+
|
|
98
|
+
**ОБЯЗАТЕЛЬНО:** Для каждого направления вызови специализированный скилл через `Skill`. Прямой анализ без скилла недопустим.
|
|
99
|
+
|
|
100
|
+
**Правило пропуска:** направление нерелевантно → пропусти без упоминания.
|
|
101
|
+
|
|
102
|
+
Скиллы сгруппированы для параллельного запуска. Группы выполняются последовательно — скиллы внутри группы можно запускать параллельно через Agent-вызовы.
|
|
103
|
+
|
|
104
|
+
**Группа А — Безопасность:**
|
|
105
|
+
| # | Направление | Скилл |
|
|
106
|
+
|---|-------------|-------|
|
|
107
|
+
| 1 | Secrets Leak | `audit-secrets` |
|
|
108
|
+
| 2 | OWASP Security | `audit-owasp` |
|
|
109
|
+
| 3 | Boundary Validation | `audit-validation` |
|
|
110
|
+
|
|
111
|
+
**Группа Б — Логика:**
|
|
112
|
+
| # | Направление | Скилл |
|
|
113
|
+
|---|-------------|-------|
|
|
114
|
+
| 4 | Bugs & Logic | `audit-bugs` |
|
|
115
|
+
| 5 | Error Handling | `audit-errors` |
|
|
116
|
+
| 6 | Concurrency | `audit-concurrency` |
|
|
117
|
+
|
|
118
|
+
**Группа В — Качество:**
|
|
119
|
+
| # | Направление | Скилл |
|
|
120
|
+
|---|-------------|-------|
|
|
121
|
+
| 7 | Architecture | `audit-architecture` |
|
|
122
|
+
| 8 | Naming | `audit-naming` |
|
|
123
|
+
| 9 | YAGNI | `audit-yagni` |
|
|
124
|
+
| 10 | Reinventing the Wheel | `audit-reinvention` |
|
|
125
|
+
| 11 | Documentation | `audit-docs` |
|
|
126
|
+
|
|
127
|
+
**Группа Г — Операции:**
|
|
128
|
+
| # | Направление | Скилл |
|
|
129
|
+
|---|-------------|-------|
|
|
130
|
+
| 12 | Tests & Linters | `audit-tests` |
|
|
131
|
+
| 13 | Logging | `audit-logging` |
|
|
132
|
+
| 14 | Performance | `audit-performance` |
|
|
133
|
+
| 15 | Deployment | `audit-deployment` |
|
|
134
|
+
| 16 | API Contracts | `audit-api-contracts` |
|
|
135
|
+
| 17 | Meta-контроль | `audit-meta` |
|
|
136
|
+
|
|
137
|
+
**Группа Д — Системный уровень:**
|
|
138
|
+
| # | Направление | Скилл |
|
|
139
|
+
|---|-------------|-------|
|
|
140
|
+
| 18 | Матрица взаимодействий | `audit-matrix` |
|
|
141
|
+
|
|
142
|
+
**Каждый скилл ОБЯЗАН сохранить файл в папку сессии: `./docs/audits/<SESSION>/audit-<name>.md`**
|
|
143
|
+
|
|
144
|
+
## Шаг 5 — Сводный отчёт по компонентам
|
|
145
|
+
|
|
146
|
+
После всех скиллов собери только строки `❌ FAIL` и `⏸ ACCEPTED`:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
## Компонент: [Название]
|
|
150
|
+
|
|
151
|
+
| Check ID | Проверка | Статус | Доказательство | Решение | Исправлено |
|
|
152
|
+
|----------|----------|--------|----------------|---------|------------|
|
|
153
|
+
| OWA-02 | Auth на protected routes | ❌ FAIL 🔴 | `routes/admin.ts:14` | **1. Добавить authMiddleware** \\ 2. ... \\ 3. ... | Нет |
|
|
154
|
+
| OWA-06 | Rate limiting | ⏸ ACCEPTED | `src/app.ts` | В baseline: nginx rate limit | — |
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Если все PASS — выведи: `✅ Проблем не обнаружено.`
|
|
158
|
+
|
|
159
|
+
## Шаг 6 — Итоговая таблица
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
## Сводка
|
|
163
|
+
|
|
164
|
+
| Компонент | ❌ FAIL 🔴 | ❌ FAIL 🟠 | ❌ FAIL 🟡🟢 | ⏸ ACCEPTED | Итого FAIL |
|
|
165
|
+
|-----------|-----------|-----------|------------|-----------|------------|
|
|
166
|
+
| [Компонент] | N | N | N | N | N |
|
|
167
|
+
| **ИТОГО** | **N** | **N** | **N** | **N** | **N** |
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Шаг 7 — Разбор FAIL 🔴
|
|
171
|
+
|
|
172
|
+
Для каждого `❌ FAIL 🔴`:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
### 🔴 [Check ID] — [Компонент]
|
|
176
|
+
**Файл:** `path/file.ts:line`
|
|
177
|
+
**Проверка:** [название]
|
|
178
|
+
**Доказательство:** [конкретный код]
|
|
179
|
+
**Решение:** [первый вариант из таблицы]
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Шаг 8 — Финальная верификация
|
|
183
|
+
|
|
184
|
+
Вызови: `Skill("audit-verify")`
|
|
185
|
+
|
|
186
|
+
Затем вызови: `Skill("audit-meta")`
|
|
187
|
+
|
|
188
|
+
## Шаг 9 — Сохранение
|
|
189
|
+
|
|
190
|
+
Сохрани полный отчёт через Write: `./docs/audits/<SESSION>/audit-report.md`
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
# Full Audit Report — <YYYY-MM-DD HH:MM>
|
|
194
|
+
## Компоненты системы
|
|
195
|
+
## Компонент: [Название]
|
|
196
|
+
## Сводка
|
|
197
|
+
## Критические риски
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Сообщи путь к папке сессии и число FAIL по severity.
|
|
201
|
+
|
|
202
|
+
## Language Rule
|
|
203
|
+
|
|
204
|
+
Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
|
|
205
|
+
|