code-ai-installer 2.3.0 → 2.4.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/.agents/skills/karpathy-guidelines/SKILL.md +326 -0
- package/.agents/skills/karpathy-guidelines/agents/claude.json +21 -0
- package/.agents/skills/karpathy-guidelines/agents/copilot.json +21 -0
- package/.agents/skills/karpathy-guidelines/agents/gemini.json +21 -0
- package/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/.agents/skills/karpathy-guidelines/agents/qwen.json +21 -0
- package/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/AGENTS.md +13 -0
- package/CONTEXT.md +14 -8
- package/agents/architect.md +1 -0
- package/agents/conductor.md +1 -0
- package/agents/devops.md +1 -0
- package/agents/product_manager.md +1 -0
- package/agents/reviewer.md +1 -0
- package/agents/senior_full_stack.md +1 -0
- package/agents/tester.md +1 -0
- package/agents/ux_ui_designer.md +1 -0
- package/dist/installer.d.ts +2 -0
- package/dist/installer.js +48 -0
- package/dist/platforms/adapters.js +2 -2
- package/domains/analytics/.agents/skills/karpathy-guidelines/SKILL.md +326 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/claude.json +21 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/copilot.json +21 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/gemini.json +21 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/qwen.json +21 -0
- package/domains/analytics/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/analytics/AGENTS.md +3 -0
- package/domains/analytics/agents/conductor.md +1 -0
- package/domains/analytics/agents/data_analyst.md +2 -1
- package/domains/analytics/agents/designer.md +1 -0
- package/domains/analytics/agents/interviewer.md +1 -0
- package/domains/analytics/agents/layouter.md +1 -0
- package/domains/analytics/agents/mediator.md +1 -0
- package/domains/analytics/agents/researcher.md +1 -0
- package/domains/analytics/agents/strategist.md +1 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/SKILL.md +325 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/claude.json +22 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/copilot.json +22 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/gemini.json +22 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/qwen.json +22 -0
- package/domains/analytics/locales/en/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/analytics/locales/en/AGENTS.md +3 -0
- package/domains/analytics/locales/en/agents/data_analyst.md +1 -1
- package/domains/content/.agents/skills/karpathy-guidelines/SKILL.md +326 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/claude.json +21 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/copilot.json +21 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/gemini.json +21 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/qwen.json +21 -0
- package/domains/content/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/content/AGENTS.md +3 -0
- package/domains/content/agents/conductor.md +1 -0
- package/domains/content/agents/copywriter.md +1 -0
- package/domains/content/agents/researcher.md +1 -0
- package/domains/content/agents/reviewer.md +1 -0
- package/domains/content/agents/strategist.md +1 -0
- package/domains/content/agents/visual_concept.md +1 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/SKILL.md +325 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/claude.json +22 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/copilot.json +22 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/gemini.json +22 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/qwen.json +22 -0
- package/domains/content/locales/en/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/content/locales/en/AGENTS.md +3 -0
- package/domains/development/.agents/skills/karpathy-guidelines/SKILL.md +326 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/claude.json +21 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/copilot.json +21 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/gemini.json +21 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/qwen.json +21 -0
- package/domains/development/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/development/AGENTS.md +3 -0
- package/domains/development/agents/architect.md +1 -0
- package/domains/development/agents/conductor.md +1 -0
- package/domains/development/agents/devops.md +1 -0
- package/domains/development/agents/product_manager.md +1 -0
- package/domains/development/agents/reviewer.md +1 -0
- package/domains/development/agents/senior_full_stack.md +1 -0
- package/domains/development/agents/tester.md +1 -0
- package/domains/development/agents/ux_ui_designer.md +2 -1
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/SKILL.md +325 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/claude.json +22 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/copilot.json +22 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/gemini.json +22 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/qwen.json +22 -0
- package/domains/development/locales/en/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/development/locales/en/AGENTS.md +3 -0
- package/domains/development/locales/en/agents/ux_ui_designer.md +1 -1
- package/domains/product/.agents/skills/karpathy-guidelines/SKILL.md +326 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/claude.json +21 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/copilot.json +21 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/gemini.json +21 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/qwen.json +21 -0
- package/domains/product/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/product/AGENTS.md +3 -0
- package/domains/product/agents/conductor.md +1 -0
- package/domains/product/agents/data_analyst.md +1 -0
- package/domains/product/agents/designer.md +1 -0
- package/domains/product/agents/discovery.md +1 -0
- package/domains/product/agents/layouter.md +1 -0
- package/domains/product/agents/mediator.md +1 -0
- package/domains/product/agents/pm.md +1 -0
- package/domains/product/agents/product_strategist.md +1 -0
- package/domains/product/agents/tech_lead.md +1 -0
- package/domains/product/agents/ux_designer.md +1 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/SKILL.md +325 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/claude.json +22 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/copilot.json +22 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/gemini.json +22 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/qwen.json +22 -0
- package/domains/product/locales/en/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/domains/product/locales/en/AGENTS.md +3 -0
- package/locales/en/.agents/skills/karpathy-guidelines/SKILL.md +325 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/claude.json +22 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/copilot.json +22 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/gemini.json +22 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/openai.yaml +8 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/qwen.json +22 -0
- package/locales/en/.agents/skills/karpathy-guidelines/agents/skill.yaml +25 -0
- package/package.json +1 -1
package/dist/installer.js
CHANGED
|
@@ -5,6 +5,8 @@ import { loadSourceCatalog } from "./catalog.js";
|
|
|
5
5
|
import { transformContentForTarget } from "./contentTransformer.js";
|
|
6
6
|
/**
|
|
7
7
|
* Runs installation for selected target with optional dry-run and backup.
|
|
8
|
+
* For target=google-antugravity, runs legacy prompt.md migration before applyOperations
|
|
9
|
+
* so the migrated <agent>.md ends up under applyOperations' backup/rollback coverage.
|
|
8
10
|
* @param options Install options.
|
|
9
11
|
* @returns Install state and write summary.
|
|
10
12
|
*/
|
|
@@ -27,6 +29,12 @@ export async function runInstall(options) {
|
|
|
27
29
|
selectedAgents: options.selectedAgents,
|
|
28
30
|
selectedSkills: options.selectedSkills,
|
|
29
31
|
};
|
|
32
|
+
if (options.target === "google-antugravity" && !options.dryRun) {
|
|
33
|
+
await migrateLegacyGeminiPromptFiles({
|
|
34
|
+
destinationDir: options.destinationDir,
|
|
35
|
+
selectedAgents: options.selectedAgents,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
30
38
|
const result = await applyOperations({
|
|
31
39
|
operations,
|
|
32
40
|
overwriteMode: options.overwriteMode,
|
|
@@ -181,6 +189,46 @@ async function deleteInstallState(destinationDir, target, domain) {
|
|
|
181
189
|
await fs.remove(stateFile);
|
|
182
190
|
}
|
|
183
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Renames legacy <agentsDir>/<agent>/prompt.md to <agent>.md for installs
|
|
194
|
+
* created by code-ai-installer <= v2.4.0 on the google-antugravity target.
|
|
195
|
+
* If both files exist (already migrated, but old prompt.md remained as orphan),
|
|
196
|
+
* removes the legacy file. Idempotent and safe to run on every install.
|
|
197
|
+
* Runs before applyOperations so the renamed file is backed up by the normal
|
|
198
|
+
* install transaction; on apply failure rollback restores user-customized content.
|
|
199
|
+
* @param args Migration arguments.
|
|
200
|
+
*/
|
|
201
|
+
async function migrateLegacyGeminiPromptFiles(args) {
|
|
202
|
+
const agentsDir = path.join(args.destinationDir, ".gemini", "agents");
|
|
203
|
+
if (!(await fs.pathExists(agentsDir))) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
for (const agentName of args.selectedAgents) {
|
|
207
|
+
const legacyPath = path.join(agentsDir, agentName, "prompt.md");
|
|
208
|
+
const newPath = path.join(agentsDir, agentName, `${agentName}.md`);
|
|
209
|
+
const configPath = path.join(agentsDir, agentName, "config.json");
|
|
210
|
+
if (await fs.pathExists(legacyPath)) {
|
|
211
|
+
if (await fs.pathExists(newPath)) {
|
|
212
|
+
await fs.remove(legacyPath);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
await fs.rename(legacyPath, newPath);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (await fs.pathExists(configPath)) {
|
|
219
|
+
try {
|
|
220
|
+
const config = (await fs.readJson(configPath));
|
|
221
|
+
if (config.promptFile === "prompt.md") {
|
|
222
|
+
config.promptFile = `${agentName}.md`;
|
|
223
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Malformed config.json — leave it for applyOperations (overwrite mode regenerates it).
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
184
232
|
/**
|
|
185
233
|
* Returns absolute path to state file for the target.
|
|
186
234
|
* @param destinationDir Destination root.
|
|
@@ -237,7 +237,7 @@ function planForGeminiLayout(layout, catalog, destinationDir, selectedAgents, se
|
|
|
237
237
|
}
|
|
238
238
|
operations.push({
|
|
239
239
|
sourcePath,
|
|
240
|
-
destinationPath: path.join(destinationDir, layout.agentsDir, agentName,
|
|
240
|
+
destinationPath: path.join(destinationDir, layout.agentsDir, agentName, `${agentName}.md`),
|
|
241
241
|
generated: false,
|
|
242
242
|
transform: {
|
|
243
243
|
target,
|
|
@@ -345,7 +345,7 @@ function renderGeminiAgentConfig(agentName) {
|
|
|
345
345
|
return `${JSON.stringify({
|
|
346
346
|
name: agentName,
|
|
347
347
|
model: "gemini-2.5-pro",
|
|
348
|
-
promptFile:
|
|
348
|
+
promptFile: `${agentName}.md`,
|
|
349
349
|
reasoning: "medium",
|
|
350
350
|
temperature: 0.2,
|
|
351
351
|
}, null, 2)}\n`;
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: karpathy-guidelines
|
|
3
|
+
description: Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата.
|
|
4
|
+
license: MIT
|
|
5
|
+
source: https://x.com/karpathy/status/2015883857489522876
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Karpathy Guidelines
|
|
9
|
+
|
|
10
|
+
Правила работы, основанные на наблюдениях Андрея Карпати о типичных ошибках LLM.
|
|
11
|
+
|
|
12
|
+
> Эти правила ставят аккуратность выше скорости. Для совсем тривиальных задач используй здравый смысл.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. Сначала думай, потом делай
|
|
17
|
+
|
|
18
|
+
**Не предполагай молча. Не скрывай неопределённость. Называй альтернативы.**
|
|
19
|
+
|
|
20
|
+
Перед тем как приступить:
|
|
21
|
+
- Явно назови свои предположения. Если не уверен — спроси.
|
|
22
|
+
- Если задачу можно понять по-разному — перечисли варианты, не выбирай сам.
|
|
23
|
+
- Если есть более простой путь — скажи об этом. Возражай, когда это уместно.
|
|
24
|
+
- Если что-то непонятно — остановись, назови конкретно что, и спроси.
|
|
25
|
+
|
|
26
|
+
### Пример: скрытые предположения
|
|
27
|
+
|
|
28
|
+
**Запрос:** "Добавь экспорт пользовательских данных"
|
|
29
|
+
|
|
30
|
+
❌ **Что делают LLM** — молча предполагают формат, поля и объём:
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
def export_users(format='json'):
|
|
34
|
+
users = User.query.all()
|
|
35
|
+
with open('users.json', 'w') as f:
|
|
36
|
+
json.dump([u.to_dict() for u in users], f)
|
|
37
|
+
return f"Exported {len(users)} users"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
✅ **Как надо** — сначала назвать предположения и уточнить:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Прежде чем делать, нужно прояснить:
|
|
44
|
+
|
|
45
|
+
1. Кого экспортировать: всех пользователей или отфильтрованных? (вопрос приватности)
|
|
46
|
+
2. Что значит "экспорт": скачать файл, фоновая задача с уведомлением или API endpoint?
|
|
47
|
+
3. Какие поля включать? (часть данных может быть чувствительной)
|
|
48
|
+
4. Сколько пользователей обычно? (влияет на архитектуру)
|
|
49
|
+
|
|
50
|
+
Что из этого важнее всего?
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Пример: несколько трактовок
|
|
54
|
+
|
|
55
|
+
**Запрос:** "Ускорь поиск"
|
|
56
|
+
|
|
57
|
+
❌ **Что делают LLM** — выбирают одну трактовку и пишут 200 строк оптимизации.
|
|
58
|
+
|
|
59
|
+
✅ **Как надо:**
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
"Ускорить поиск" — это может быть разное:
|
|
63
|
+
|
|
64
|
+
1. Уменьшить время ответа (< 100 мс вместо 500 мс)
|
|
65
|
+
→ индексы в БД, кеш частых запросов | ~2 часа
|
|
66
|
+
|
|
67
|
+
2. Выдерживать больше одновременных запросов
|
|
68
|
+
→ async/await, connection pooling | ~4 часа
|
|
69
|
+
|
|
70
|
+
3. Субъективно казаться быстрее (UX)
|
|
71
|
+
→ показывать частичные результаты сразу | ~3 часа
|
|
72
|
+
|
|
73
|
+
Сейчас поиск занимает ~500 мс. Что важнее?
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 2. Делай только то, что просили
|
|
79
|
+
|
|
80
|
+
**Минимум, решающий задачу. Ничего лишнего.**
|
|
81
|
+
|
|
82
|
+
- Не добавляй возможности сверх того, что просили.
|
|
83
|
+
- Не создавай абстракции, если код используется один раз.
|
|
84
|
+
- Не делай код "гибким" и "настраиваемым" без запроса.
|
|
85
|
+
- Не обрабатывай ошибки, которые не могут случиться.
|
|
86
|
+
- Написал 200 строк, а можно 50 — перепиши.
|
|
87
|
+
|
|
88
|
+
Спроси себя: "Сказал бы опытный коллега, что это переусложнено?" Если да — упрости.
|
|
89
|
+
|
|
90
|
+
### Пример: лишние абстракции
|
|
91
|
+
|
|
92
|
+
**Запрос:** "Добавь функцию расчёта скидки"
|
|
93
|
+
|
|
94
|
+
❌ **Что делают LLM** — Strategy pattern, ABC, dataclass, конфигуратор:
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
class DiscountStrategy(ABC):
|
|
98
|
+
@abstractmethod
|
|
99
|
+
def calculate(self, amount: float) -> float: pass
|
|
100
|
+
|
|
101
|
+
class PercentageDiscount(DiscountStrategy):
|
|
102
|
+
def __init__(self, percentage: float):
|
|
103
|
+
self.percentage = percentage
|
|
104
|
+
def calculate(self, amount: float) -> float:
|
|
105
|
+
return amount * (self.percentage / 100)
|
|
106
|
+
|
|
107
|
+
@dataclass
|
|
108
|
+
class DiscountConfig:
|
|
109
|
+
strategy: DiscountStrategy
|
|
110
|
+
min_purchase: float = 0.0
|
|
111
|
+
max_discount: float = float('inf')
|
|
112
|
+
|
|
113
|
+
# Ещё 40 строк ради одной формулы
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
✅ **Как надо:**
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
def calculate_discount(amount: float, percent: float) -> float:
|
|
120
|
+
"""Calculate discount amount. percent should be 0-100."""
|
|
121
|
+
return amount * (percent / 100)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Усложнять — только когда реально появится несколько типов скидок.
|
|
125
|
+
|
|
126
|
+
### Пример: возможности "на будущее"
|
|
127
|
+
|
|
128
|
+
**Запрос:** "Сохрани пользовательские настройки в БД"
|
|
129
|
+
|
|
130
|
+
❌ **Что делают LLM** — кеш, валидатор, флаг merge, уведомления:
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
class PreferenceManager:
|
|
134
|
+
def __init__(self, db, cache=None, validator=None):
|
|
135
|
+
...
|
|
136
|
+
def save(self, user_id, prefs, merge=True, validate=True, notify=False):
|
|
137
|
+
# 50 строк вместо трёх
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
✅ **Как надо:**
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
def save_preferences(db, user_id: int, preferences: dict):
|
|
144
|
+
db.execute(
|
|
145
|
+
"UPDATE users SET preferences = ? WHERE id = ?",
|
|
146
|
+
(json.dumps(preferences), user_id)
|
|
147
|
+
)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Кеш, валидацию, merge — добавить тогда, когда это реально понадобится.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 3. Трогай только то, что нужно
|
|
155
|
+
|
|
156
|
+
**Правь минимум. Чисти только за собой.**
|
|
157
|
+
|
|
158
|
+
При редактировании существующего кода:
|
|
159
|
+
- Не "улучшай" соседний код, комментарии или форматирование.
|
|
160
|
+
- Не рефактори то, что работает.
|
|
161
|
+
- Сохраняй существующий стиль, даже если ты сделал бы иначе.
|
|
162
|
+
- Заметил лишний код рядом — упомяни, но не трогай.
|
|
163
|
+
|
|
164
|
+
Если после твоих правок что-то стало неиспользуемым:
|
|
165
|
+
- Удали то, что стало ненужным из-за твоих изменений.
|
|
166
|
+
- Не трогай уже существующий мёртвый код без запроса.
|
|
167
|
+
|
|
168
|
+
**Проверка:** каждая изменённая строка должна напрямую относиться к запросу.
|
|
169
|
+
|
|
170
|
+
### Пример: попутный рефакторинг
|
|
171
|
+
|
|
172
|
+
**Запрос:** "Исправь баг — пустой email вызывает падение валидатора"
|
|
173
|
+
|
|
174
|
+
❌ **Что делают LLM** — заодно улучшают валидацию email, добавляют валидацию username, меняют комментарии, пишут docstring.
|
|
175
|
+
|
|
176
|
+
✅ **Как надо — только строки, связанные с пустым email:**
|
|
177
|
+
|
|
178
|
+
```diff
|
|
179
|
+
def validate_user(user_data):
|
|
180
|
+
# Check email format
|
|
181
|
+
- if not user_data.get('email'):
|
|
182
|
+
+ email = user_data.get('email', '')
|
|
183
|
+
+ if not email or not email.strip():
|
|
184
|
+
raise ValueError("Email required")
|
|
185
|
+
|
|
186
|
+
# Basic email validation
|
|
187
|
+
- if '@' not in user_data['email']:
|
|
188
|
+
+ if '@' not in email:
|
|
189
|
+
raise ValueError("Invalid email")
|
|
190
|
+
|
|
191
|
+
# Check username ← не трогаем, это не в задаче
|
|
192
|
+
if not user_data.get('username'):
|
|
193
|
+
raise ValueError("Username required")
|
|
194
|
+
|
|
195
|
+
return True
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Пример: дрейф стиля
|
|
199
|
+
|
|
200
|
+
**Запрос:** "Добавь логирование в функцию upload"
|
|
201
|
+
|
|
202
|
+
❌ **Что делают LLM** — заодно добавляют type hints, меняют одинарные кавычки на двойные, пишут docstring, переформатируют отступы.
|
|
203
|
+
|
|
204
|
+
✅ **Как надо — сохраняй существующий стиль:**
|
|
205
|
+
|
|
206
|
+
```diff
|
|
207
|
+
+ import logging
|
|
208
|
+
+
|
|
209
|
+
+ logger = logging.getLogger(__name__)
|
|
210
|
+
+
|
|
211
|
+
def upload_file(file_path, destination):
|
|
212
|
+
+ logger.info(f'Starting upload: {file_path}')
|
|
213
|
+
try:
|
|
214
|
+
with open(file_path, 'rb') as f:
|
|
215
|
+
data = f.read()
|
|
216
|
+
|
|
217
|
+
response = requests.post(destination, files={'file': data})
|
|
218
|
+
|
|
219
|
+
if response.status_code == 200:
|
|
220
|
+
+ logger.info(f'Upload successful: {file_path}')
|
|
221
|
+
return True
|
|
222
|
+
else:
|
|
223
|
+
+ logger.error(f'Upload failed: {file_path}, status={response.status_code}')
|
|
224
|
+
return False
|
|
225
|
+
except Exception as e:
|
|
226
|
+
- print(f"Error: {e}")
|
|
227
|
+
+ logger.exception(f'Upload error: {file_path}')
|
|
228
|
+
return False
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Сохранено: одинарные кавычки, нет type hints, тот же стиль boolean-возврата.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 4. Работай от результата
|
|
236
|
+
|
|
237
|
+
**Определи, как выглядит "готово". Проверяй каждый шаг.**
|
|
238
|
+
|
|
239
|
+
Переформулируй задачи в проверяемые цели:
|
|
240
|
+
- "Добавь валидацию" → "Напиши тесты на некорректные данные, затем сделай их зелёными"
|
|
241
|
+
- "Исправь баг" → "Напиши тест, воспроизводящий баг, затем исправь"
|
|
242
|
+
- "Рефакторинг X" → "Убедись, что тесты проходят до и после"
|
|
243
|
+
|
|
244
|
+
Для многошаговых задач — кратко опиши план:
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
1. [Шаг] → проверка: [что проверить]
|
|
248
|
+
2. [Шаг] → проверка: [что проверить]
|
|
249
|
+
3. [Шаг] → проверка: [что проверить]
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Чёткие критерии дают возможность работать самостоятельно. Размытые ("сделай так, чтобы работало") требуют постоянных уточнений.
|
|
253
|
+
|
|
254
|
+
### Пример: пошаговая реализация с проверкой
|
|
255
|
+
|
|
256
|
+
**Запрос:** "Добавь rate limiting в API"
|
|
257
|
+
|
|
258
|
+
❌ **Что делают LLM** — реализуют Redis, несколько стратегий, конфигурацию и мониторинг в одном PR на 300 строк без чётких шагов проверки.
|
|
259
|
+
|
|
260
|
+
✅ **Как надо:**
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
План:
|
|
264
|
+
|
|
265
|
+
1. Базовый лимит в памяти (один endpoint)
|
|
266
|
+
Проверка: 100 запросов → первые 10 проходят, остальные получают 429
|
|
267
|
+
|
|
268
|
+
2. Вынести в middleware (все endpoints)
|
|
269
|
+
Проверка: существующие тесты не сломались
|
|
270
|
+
|
|
271
|
+
3. Redis вместо памяти (для нескольких серверов)
|
|
272
|
+
Проверка: лимит сохраняется после перезапуска
|
|
273
|
+
|
|
274
|
+
4. Настройка лимитов per-endpoint
|
|
275
|
+
Проверка: /search — 10/мин, /users — 100/мин
|
|
276
|
+
|
|
277
|
+
Начинаем с первого шага?
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Пример: сначала воспроизведи баг
|
|
281
|
+
|
|
282
|
+
**Запрос:** "Сортировка ломается при одинаковых значениях"
|
|
283
|
+
|
|
284
|
+
❌ **Что делают LLM** — сразу меняют логику сортировки, не убедившись, что воспроизвели проблему.
|
|
285
|
+
|
|
286
|
+
✅ **Как надо:**
|
|
287
|
+
|
|
288
|
+
```python
|
|
289
|
+
# 1. Сначала — тест, воспроизводящий баг
|
|
290
|
+
def test_sort_with_duplicate_scores():
|
|
291
|
+
scores = [
|
|
292
|
+
{'name': 'Alice', 'score': 100},
|
|
293
|
+
{'name': 'Bob', 'score': 100},
|
|
294
|
+
{'name': 'Charlie', 'score': 90},
|
|
295
|
+
]
|
|
296
|
+
result = sort_scores(scores)
|
|
297
|
+
# Проблема: при одинаковых score порядок непредсказуем
|
|
298
|
+
assert result[0]['score'] == 100
|
|
299
|
+
assert result[2]['score'] == 90
|
|
300
|
+
assert result[0]['name'] < result[1]['name'] # ожидаем стабильную сортировку
|
|
301
|
+
|
|
302
|
+
# Запускаем тест → он падает → баг подтверждён
|
|
303
|
+
|
|
304
|
+
# 2. Только теперь исправляем
|
|
305
|
+
def sort_scores(scores):
|
|
306
|
+
return sorted(scores, key=lambda x: (-x['score'], x['name']))
|
|
307
|
+
|
|
308
|
+
# Запускаем тест → зелёный
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Сводка: что делать нельзя
|
|
314
|
+
|
|
315
|
+
| Принцип | Типичная ошибка | Правильно |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| Сначала думай | Молча выбирает формат, поля, трактовку задачи | Называет предположения явно, спрашивает |
|
|
318
|
+
| Делай только то, что просили | Strategy pattern ради одного расчёта | Одна функция — и точка |
|
|
319
|
+
| Трогай только то, что нужно | Правит кавычки и добавляет типы при фиксе бага | Меняет только строки, касающиеся задачи |
|
|
320
|
+
| Работай от результата | "Проанализирую и улучшу" | "Тест воспроизводит баг → исправляю → проверяю регрессии" |
|
|
321
|
+
|
|
322
|
+
## Главный вывод
|
|
323
|
+
|
|
324
|
+
Переусложнённые решения не выглядят явно неправильными — они следуют паттернам и best practices. Проблема в **моменте**: сложность добавляется раньше, чем она реально нужна.
|
|
325
|
+
|
|
326
|
+
**Хорошее решение — это минимум, который решает задачу сегодня, а не задачу, которая, возможно, появится завтра.**
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "karpathy-guidelines",
|
|
3
|
+
"display_name": "Karpathy Guidelines",
|
|
4
|
+
"description": "Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата.",
|
|
5
|
+
"default_prompt": "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование.",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"karpathy-guidelines",
|
|
8
|
+
"karpathy",
|
|
9
|
+
"Karpathy Guidelines",
|
|
10
|
+
"сначала думай потом делай",
|
|
11
|
+
"простота прежде всего",
|
|
12
|
+
"хирургические изменения"
|
|
13
|
+
],
|
|
14
|
+
"capabilities": [
|
|
15
|
+
"quality",
|
|
16
|
+
"guidelines",
|
|
17
|
+
"best-practices"
|
|
18
|
+
],
|
|
19
|
+
"tools": [],
|
|
20
|
+
"implicit_invocation": true
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "karpathy-guidelines",
|
|
3
|
+
"display_name": "Karpathy Guidelines",
|
|
4
|
+
"description": "Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата.",
|
|
5
|
+
"default_prompt": "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование.",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"karpathy-guidelines",
|
|
8
|
+
"karpathy",
|
|
9
|
+
"Karpathy Guidelines",
|
|
10
|
+
"сначала думай потом делай",
|
|
11
|
+
"простота прежде всего",
|
|
12
|
+
"хирургические изменения"
|
|
13
|
+
],
|
|
14
|
+
"capabilities": [
|
|
15
|
+
"quality",
|
|
16
|
+
"guidelines",
|
|
17
|
+
"best-practices"
|
|
18
|
+
],
|
|
19
|
+
"tools": [],
|
|
20
|
+
"implicit_invocation": true
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "karpathy-guidelines",
|
|
3
|
+
"display_name": "Karpathy Guidelines",
|
|
4
|
+
"description": "Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата.",
|
|
5
|
+
"default_prompt": "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование.",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"karpathy-guidelines",
|
|
8
|
+
"karpathy",
|
|
9
|
+
"Karpathy Guidelines",
|
|
10
|
+
"сначала думай потом делай",
|
|
11
|
+
"простота прежде всего",
|
|
12
|
+
"хирургические изменения"
|
|
13
|
+
],
|
|
14
|
+
"capabilities": [
|
|
15
|
+
"quality",
|
|
16
|
+
"guidelines",
|
|
17
|
+
"best-practices"
|
|
18
|
+
],
|
|
19
|
+
"tools": [],
|
|
20
|
+
"implicit_invocation": true
|
|
21
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Karpathy Guidelines"
|
|
3
|
+
short_description: "Поведенческие правила для снижения типичных ошибок LLM — думай перед тем как делать, простота, хирургические изменения, ориентация на цель."
|
|
4
|
+
default_prompt: "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование."
|
|
5
|
+
dependencies:
|
|
6
|
+
tools: []
|
|
7
|
+
policy:
|
|
8
|
+
allow_implicit_invocation: true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "karpathy-guidelines",
|
|
3
|
+
"display_name": "Karpathy Guidelines",
|
|
4
|
+
"description": "Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата.",
|
|
5
|
+
"default_prompt": "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование.",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"karpathy-guidelines",
|
|
8
|
+
"karpathy",
|
|
9
|
+
"Karpathy Guidelines",
|
|
10
|
+
"сначала думай потом делай",
|
|
11
|
+
"простота прежде всего",
|
|
12
|
+
"хирургические изменения"
|
|
13
|
+
],
|
|
14
|
+
"capabilities": [
|
|
15
|
+
"quality",
|
|
16
|
+
"guidelines",
|
|
17
|
+
"best-practices"
|
|
18
|
+
],
|
|
19
|
+
"tools": [],
|
|
20
|
+
"implicit_invocation": true
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
name: "karpathy-guidelines"
|
|
3
|
+
display_name: "Karpathy Guidelines"
|
|
4
|
+
description: "Правила работы для предотвращения типичных ошибок LLM — сначала думай, делай только нужное, правь точечно, работай от результата."
|
|
5
|
+
default_prompt: "Используй $karpathy-guidelines, когда задача требует соблюдения правил качества: написание кода, ревью, рефакторинг, анализ или проектирование."
|
|
6
|
+
triggers:
|
|
7
|
+
- "karpathy-guidelines"
|
|
8
|
+
- "karpathy"
|
|
9
|
+
- "Karpathy Guidelines"
|
|
10
|
+
- "сначала думай потом делай"
|
|
11
|
+
- "простота прежде всего"
|
|
12
|
+
- "хирургические изменения"
|
|
13
|
+
capabilities:
|
|
14
|
+
- "quality"
|
|
15
|
+
- "guidelines"
|
|
16
|
+
- "best-practices"
|
|
17
|
+
tools: []
|
|
18
|
+
invocation:
|
|
19
|
+
explicit: true
|
|
20
|
+
implicit: true
|
|
21
|
+
localization:
|
|
22
|
+
default_locale: "ru"
|
|
23
|
+
available_locales:
|
|
24
|
+
- "ru"
|
|
25
|
+
- "en"
|
|
@@ -93,3 +93,6 @@ CONDUCTOR → INTERVIEWER → RESEARCHER → DATA_ANALYST → STRATEGIST → MED
|
|
|
93
93
|
|
|
94
94
|
### Верстальщик
|
|
95
95
|
- $html-pdf-report — генерация HTML/CSS → PDF
|
|
96
|
+
|
|
97
|
+
### Cross-cutting / Quality (все агенты домена)
|
|
98
|
+
- $karpathy-guidelines — обязателен перед любой нетривиальной задачей
|
|
@@ -42,6 +42,7 @@ compliance — анализ не уходит за пределы исследо
|
|
|
42
42
|
## Используемые skills
|
|
43
43
|
|
|
44
44
|
### Обязательные (каждый раз)
|
|
45
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
45
46
|
- **$board** — управление доской задач, трекинг статусов гейтов, метрики прогресса
|
|
46
47
|
- **$handoff** — формирование handoff-конвертов и межсессионных файлов
|
|
47
48
|
- **$gates** — контроль гейтов, проверка deliverables, severity (Blocker/Gap/Note)
|
|
@@ -45,6 +45,7 @@ Alpha и обязан: (1) провести собственный анализ
|
|
|
45
45
|
## Используемые skills
|
|
46
46
|
|
|
47
47
|
### Обязательные (каждый раз)
|
|
48
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
48
49
|
- **`$gates`** — проверка deliverable по AN-xx criteria перед передачей
|
|
49
50
|
- **`$handoff`** — формирование конверта для Strategist
|
|
50
51
|
|
|
@@ -327,7 +328,7 @@ Data quality: Verified XX% | Estimated XX% | Assumed XX%
|
|
|
327
328
|
## Анализ по фреймворкам
|
|
328
329
|
|
|
329
330
|
### Фреймворк 1: [Название]
|
|
330
|
-
**Skill:**
|
|
331
|
+
**Skill:** `<skill-name>`
|
|
331
332
|
**Quality Gate:** ✅ Пройден (N/N чекбоксов)
|
|
332
333
|
|
|
333
334
|
**Результат:**
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
## Используемые skills
|
|
41
41
|
|
|
42
42
|
### Обязательные (каждый раз)
|
|
43
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
43
44
|
- **`$report-design`** — проектирование макета: структура, визуализации, иерархия, палитра
|
|
44
45
|
- **`$gates`** — проверка deliverable по DS-xx criteria перед передачей Layouter
|
|
45
46
|
- **`$handoff`** — формирование конверта для Layouter
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
## Используемые skills
|
|
44
44
|
|
|
45
45
|
### Обязательные (каждый раз)
|
|
46
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
46
47
|
- **`$gates`** --- проверка deliverable по INT-xx criteria перед передачей
|
|
47
48
|
- **`$handoff`** --- приём handoff от COND-01 + формирование конверта с Research Brief
|
|
48
49
|
- **`$board`** --- обновление статуса INT-01
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
## Используемые skills
|
|
40
40
|
|
|
41
41
|
### Обязательные (каждый раз)
|
|
42
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
42
43
|
- **`$html-pdf-report`** — полный протокол генерации HTML: CSS, Chart.js, Mermaid, компоненты, тестирование
|
|
43
44
|
- **`$gates`** — проверка deliverable по LY-xx criteria + Release Gate
|
|
44
45
|
- **`$handoff`** — приём от DS-01 + передача на Release Gate
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
## Используемые skills
|
|
42
42
|
|
|
43
43
|
### Обязательные (каждый раз)
|
|
44
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
44
45
|
- **`$gates`** --- проверка deliverable по MED-xx criteria перед передачей
|
|
45
46
|
- **`$handoff`** --- приём от COND-04 + формирование конверта с Mediated Conclusion
|
|
46
47
|
- **`$board`** --- обновление статуса MED-01
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
## Используемые skills
|
|
47
47
|
|
|
48
48
|
### Обязательные (каждый раз)
|
|
49
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
49
50
|
- **`$web-research`** — веб-поиск и верификация данных. Запускается **всегда**. Протокол: тирование источников (T1/T2/T3), 3-уровневая достоверность, аудит-трейл, контр-поиск, метрики качества.
|
|
50
51
|
- **`$gates`** — проверка deliverable по RES-xx criteria (web-search = Blocker, dependency check)
|
|
51
52
|
- **`$handoff`** — приём от COND-xx + формирование конверта для AN-xx
|
|
@@ -49,6 +49,7 @@ Reasoning всегда `high` — стратегические рекоменд
|
|
|
49
49
|
## Используемые skills
|
|
50
50
|
|
|
51
51
|
### Обязательные (каждый раз)
|
|
52
|
+
- **$karpathy-guidelines** — сначала думай, делай только нужное, правь точечно, работай от результата
|
|
52
53
|
- **`$gates`** — проверка deliverable по ST-xx criteria (прослеживаемость, dependency check)
|
|
53
54
|
- **`$handoff`** — приём от AN-xx + формирование конверта для Conductor
|
|
54
55
|
- **`$board`** — обновление статуса ST-xx
|