622 const m = p.slice(base.length).match(/^\/([a-z]{2}(?:-[A-Z]{2})?)\//);622 const m = p.slice(base.length).match(/^\/([a-z]{2}(?:-[A-Z]{2})?)\//);
623 const locale = m ? m[1] : 'en';623 const locale = m ? m[1] : 'en';
624 return href => {624 return href => {
625 if (!href || href[0] !== '/' || href[1] === '/') return href;625 if (!href) return undefined;
626 if (href[0] === '#' || href.startsWith('https://')) return href;
627 if (!(/^\/[A-Za-z0-9]/).test(href)) return undefined;
626 return base + (href.startsWith('/en/') ? '/' + locale + href.slice(3) : href);628 return base + (href.startsWith('/en/') ? '/' + locale + href.slice(3) : href);
627 };629 };
628 }, []);630 }, []);
671 const assemble = p => p.prompt.replace(/\{(\w+)\}/g, (_, k) => fillOf(p, k) || p.slots && p.slots[k] || k);673 const assemble = p => p.prompt.replace(/\{(\w+)\}/g, (_, k) => fillOf(p, k) || p.slots && p.slots[k] || k);
672 const preview = p => p.prompt.replace(/\{(\w+)\}/g, (_, k) => p.slots && p.slots[k] || k);674 const preview = p => p.prompt.replace(/\{(\w+)\}/g, (_, k) => p.slots && p.slots[k] || k);
673 const bodyText = p => preview(p) + ' ' + p.teaches.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + ' ' + (p.next || '');675 const bodyText = p => preview(p) + ' ' + p.teaches.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + ' ' + (p.next || '');
674 const widthFor = s => (s || '').length + 3 + 'ch';676 const WIDE_RE = /[\u1100-\u115F\u2E80-\uA4CF\uAC00-\uD7A3\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/g;
677 const widthFor = s => {
678 const t = typeof s === 'string' ? s : '';
679 return t.length + (t.match(WIDE_RE) || []).length + 3 + 'ch';
680 };
675 const ql = q.trim().toLowerCase();681 const ql = q.trim().toLowerCase();
676 const toggleTag = k => {682 const toggleTag = k => {
677 setStart(false);683 setStart(false);
1098 "get-oriented-in-a": {1104 "get-oriented-in-a": {
1099 title: "Ориентируйтесь в новом репозитории",1105 title: "Ориентируйтесь в новом репозитории",
1100 teaches: "Опишите, что вы хотите узнать, а не какие файлы читать. Claude исследует проект самостоятельно и возвращает сводку того, как он устроен.",1106 teaches: "Опишите, что вы хотите узнать, а не какие файлы читать. Claude исследует проект самостоятельно и возвращает сводку того, как он устроен.",
1101 next: "Запустите `/init`, чтобы установить `CLAUDE.md`, чтобы Claude помнил это в каждой сессии"1107 next: "Запустите `/init`, чтобы установить `CLAUDE.md`, чтобы Claude помнил это в каждой сессии",
1108 prompt: "дайте обзор этой кодовой базы: архитектура, ключевые каталоги и то, как связаны её части"
1102 },1109 },
1103 "explain-unfamiliar-code": {1110 "explain-unfamiliar-code": {
1104 title: "Объясните незнакомый код",1111 title: "Объясните незнакомый код",
1105 teaches: "Назовите файл и скажите, в каком формате вы хотите ответ. Замените HTML-страницу на диаграмму, маркированный список или что-то, что соответствует вашему стилю обучения.",1112 teaches: "Назовите файл и скажите, в каком формате вы хотите ответ. Замените HTML-страницу на диаграмму, маркированный список или что-то, что соответствует вашему стилю обучения.",
1106 next: "Установите стиль вывода, чтобы Claude всегда объяснял в вашем предпочитаемом формате"1113 next: "Установите стиль вывода, чтобы Claude всегда объяснял в вашем предпочитаемом формате",
1114 prompt: "объясните, что делает {path} и как через него проходят данные. оформите это как {format}",
1115 slots: {
1116 path: "src/scheduler/queue.ts",
1117 format: "HTML-страницу с диаграммой, затем откройте её в моём браузере"
1118 }
1107 },1119 },
1108 "find-where-something-happens": {1120 "find-where-something-happens": {
1109 title: "Найдите, где что-то происходит",1121 title: "Найдите, где что-то происходит",
1110 teaches: "Ищите по поведению, а не по имени файла. Поиск работает даже когда вы не знаете, как называется файл или в каком каталоге он находится."1122 teaches: "Ищите по поведению, а не по имени файла. Поиск работает даже когда вы не знаете, как называется файл или в каком каталоге он находится.",
1123 prompt: "где мы {behavior}?",
1124 slots: {
1125 behavior: "проверяем типы загружаемых файлов"
1126 }
1111 },1127 },
1112 "see-what-depends-on": {1128 "see-what-depends-on": {
1113 title: "Проверьте, что сломается перед удалением",1129 title: "Проверьте, что сломается перед удалением",
1114 teaches: "Спросите перед удалением чего-либо. Список вызывающих функций и нисходящих эффектов показывает, смотрите ли вы на однострочную очистку или изменение, которое нужно координировать."1130 teaches: "Спросите перед удалением чего-либо. Список вызывающих функций и нисходящих эффектов показывает, смотрите ли вы на однострочную очистку или изменение, которое нужно координировать.",
1131 prompt: "что сломается, если я удалю {target}?",
1132 slots: {
1133 target: "хелпер retryWithBackoff"
1134 }
1115 },1135 },
1116 "trace-how-code-evolved": {1136 "trace-how-code-evolved": {
1117 title: "Проследите, как код эволюционировал",1137 title: "Проследите, как код эволюционировал",
1118 teaches: "Указывайте на историю коммитов, когда вопрос в том, почему, а не что. Claude читает логи и blame для любой системы контроля версий, которую вы используете, и объясняет решения, стоящие за текущей реализацией."1138 teaches: "Указывайте на историю коммитов, когда вопрос в том, почему, а не что. Claude читает логи и blame для любой системы контроля версий, которую вы используете, и объясняет решения, стоящие за текущей реализацией.",
1139 prompt: "просмотрите историю коммитов {path} и кратко опишите, как он развивался и почему",
1140 slots: {
1141 path: "internal/auth/session.go"
1142 }
1119 },1143 },
1120 "scope-a-change-before": {1144 "scope-a-change-before": {
1121 title: "Определите объем изменений перед началом",1145 title: "Определите объем изменений перед началом",
1122 teaches: "Оцените объем работы перед тем, как взять её в дорожную карту. Список файлов показывает, смотрите ли вы на один компонент или сквозное изменение."1146 teaches: "Оцените объем работы перед тем, как взять её в дорожную карту. Список файлов показывает, смотрите ли вы на один компонент или сквозное изменение.",
1147 prompt: "какие файлы мне придётся изменить, чтобы {change}?",
1148 slots: {
1149 change: "добавить переключатель тёмной темы в настройки"
1150 }
1123 },1151 },
1124 "ask-the-codebase-a": {1152 "ask-the-codebase-a": {
1125 title: "Задайте кодовой базе вопрос о продукте",1153 title: "Задайте кодовой базе вопрос о продукте",
1126 teaches: "Укажите вашу роль, чтобы ответ был на нужном уровне. Claude объясняет, что продукт на самом деле делает из исходного кода, без необходимости его читать.",1154 teaches: "Укажите вашу роль, чтобы ответ был на нужном уровне. Claude объясняет, что продукт на самом деле делает из исходного кода, без необходимости его читать.",
1127 next: "Установите стиль вывода, чтобы Claude всегда давал ответы на этом уровне"1155 next: "Установите стиль вывода, чтобы Claude всегда давал ответы на этом уровне",
1156 prompt: "я {role}. проведите меня через то, что происходит, когда пользователь {action}, от UI до результата",
1157 slots: {
1158 role: "PM",
1159 action: "нажимает «Экспорт в PDF»"
1160 }
1128 },1161 },
1129 "plan-a-multi-file": {1162 "plan-a-multi-file": {
1130 title: "Спланируйте многофайловое изменение перед редактированием кода",1163 title: "Спланируйте многофайловое изменение перед редактированием кода",
1131 teaches: "Добавление \"не редактируйте пока\" разделяет исследование от изменений, поэтому вы видите подход перед тем, как код движется. Чтобы сделать план-первый подход по умолчанию для каждого промпта, нажмите Shift+Tab для [режима плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode)."1164 teaches: "Добавление \"не редактируйте пока\" разделяет исследование от изменений, поэтому вы видите подход перед тем, как код движется. Чтобы сделать план-первый подход по умолчанию для каждого промпта, нажмите Shift+Tab для [режима планирования](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode).",
1165 prompt: "составьте план рефакторинга {target}, чтобы {goal}. перечислите файлы, которые вы бы изменили, но пока ничего не редактируйте",
1166 slots: {
1167 target: "платёжного модуля",
1168 goal: "поддерживать несколько валют"
1169 }
1132 },1170 },
1133 "draft-a-spec-by": {1171 "draft-a-spec-by": {
1134 title: "Составьте спецификацию путём интервью",1172 title: "Составьте спецификацию путём интервью",
1135 teaches: "Попросите провести интервью вместо того, чтобы писать спецификацию самостоятельно. Claude задаёт вам структурированные вопросы, пока требования не будут полными, затем записывает результат в файл.",1173 teaches: "Попросите провести интервью вместо того, чтобы писать спецификацию самостоятельно. Claude задаёт вам структурированные вопросы, пока требования не будут полными, затем записывает результат в файл.",
1136 next: "Сохраните ваши вопросы интервью как skill `/spec`, чтобы каждая спецификация начиналась одинаково"1174 next: "Сохраните ваши вопросы интервью как скилл `/spec`, чтобы каждая спецификация начиналась одинаково",
1175 prompt: "я хочу создать {feature}. проведите со мной интервью о реализации, UX, граничных случаях и компромиссах, пока мы не охватим всё, затем запишите спецификацию в SPEC.md",
1176 slots: {
1177 feature: "ограничения частоты запросов для каждого рабочего пространства"
1178 }
1137 },1179 },
1138 "turn-a-meeting-into": {1180 "turn-a-meeting-into": {
1139 title: "Превратите встречу в задачи",1181 title: "Превратите встречу в задачи",
1140 teaches: "Пропустите этап транскрипции. Claude извлекает пункты действий из неструктурированного ввода и записывает их прямо в ваш трекер через [MCP](/docs/ru/mcp), поэтому вы проверяете задачи, а не транскрипцию.",1182 teaches: "Пропустите этап составления транскрипта. Claude извлекает пункты действий из неструктурированного ввода и записывает их прямо в ваш трекер через [MCP](/docs/ru/mcp), поэтому вы проверяете задачи, а не транскрипт.",
1141 next: "Сохраните это как skill `/tickets`"1183 next: "Сохраните это как скилл `/tickets`",
1184 prompt: "прочитайте {input} и выпишите пункты действий, затем создайте задачу в {tracker} для каждого с критериями приёмки",
1185 slots: {
1186 input: "@meeting-notes.md",
1187 tracker: "Linear"
1188 }
1142 },1189 },
1143 "map-edge-cases-before": {1190 "map-edge-cases-before": {
1144 title: "Определите граничные случаи перед разработкой",1191 title: "Определите граничные случаи перед разработкой",
1145 teaches: "Спросите, чего не хватает, а не что есть. Claude перечисляет состояния ошибок, пустые состояния и граничные случаи, которые дизайн счастливого пути обычно пропускает."1192 teaches: "Спросите, чего не хватает, а не что есть. Claude перечисляет состояния ошибок, пустые состояния и граничные случаи, которые дизайн счастливого пути обычно пропускает.",
1193 prompt: "перечислите состояния ошибок, пустые состояния и граничные случаи для {feature}, которые должен учитывать дизайн",
1194 slots: {
1195 feature: "процесса загрузки файлов"
1196 }
1146 },1197 },
1147 "turn-a-mockup-into": {1198 "turn-a-mockup-into": {
1148 title: "Превратите макет в работающий прототип",1199 title: "Превратите макет в работающий прототип",
1149 teaches: "Интерактивный прототип отвечает на вопросы, на которые статический макет не может. Передайте работающий код инженерам вместо объяснения взаимодействий в документе."1200 teaches: "Интерактивный прототип отвечает на вопросы, на которые статический макет не может. Передайте работающий код инженерам вместо объяснения взаимодействий в документе.",
1201 prompt: "вот макет. создайте работающий прототип, по которому я смогу покликать, с той же вёрсткой и состояниями, что показаны"
1150 },1202 },
1151 "implement-from-a-screenshot": {1203 "implement-from-a-screenshot": {
1152 title: "Реализуйте из скриншота и самопроверьте",1204 title: "Реализуйте из скриншота и самопроверьте",
1153 teaches: "Это даёт Claude цикл проверки: он рендерит, сравнивает с исходным изображением и повторяет без вашего указания на каждый пробел.",1205 teaches: "Это даёт Claude цикл проверки: он рендерит, сравнивает с исходным изображением и повторяет без вашего указания на каждый пробел.",
1154 next: "Используйте `/goal`, чтобы Claude продолжал повторять, пока скриншоты не совпадут"1206 next: "Используйте `/goal`, чтобы Claude продолжал повторять, пока скриншоты не совпадут",
1207 prompt: "реализуйте этот дизайн, затем сделайте скриншот результата, сравните его с оригиналом и исправьте все различия"
1155 },1208 },
1156 "follow-an-existing-pattern": {1209 "follow-an-existing-pattern": {
1157 title: "Следуйте существующему паттерну",1210 title: "Следуйте существующему паттерну",
1158 teaches: "Укажите на код, который вам уже нравится. Без ссылки Claude использует общие лучшие практики. С ней он соответствует соглашениям, которые ваша кодовая база на самом деле использует.",1211 teaches: "Укажите на код, который вам уже нравится. Без ссылки Claude использует общие лучшие практики. С ней он соответствует соглашениям, которые ваша кодовая база на самом деле использует.",
1159 next: "Попросите Claude написать паттерн, который он следовал, в `CLAUDE.md`, чтобы будущие сессии соответствовали ему без ссылки"1212 next: "Попросите Claude написать паттерн, который он следовал, в `CLAUDE.md`, чтобы будущие сессии соответствовали ему без ссылки",
1213 prompt: "посмотрите, как реализован {example}, чтобы понять паттерн, затем создайте {new} таким же образом",
1214 slots: {
1215 example: "обработчик вебхуков GitHub",
1216 new: "обработчик вебхуков Stripe"
1217 }
1160 },1218 },
1161 "add-a-small-well": {1219 "add-a-small-well": {
1162 title: "Добавьте небольшую, хорошо определённую функцию",1220 title: "Добавьте небольшую, хорошо определённую функцию",
1163 teaches: "Укажите входы и выходы, а не как её построить. Claude находит, где живёт похожий код, и добавляет ваш рядом с ним."1221 teaches: "Укажите входы и выходы, а не как её создать. Claude находит, где живёт похожий код, и добавляет ваш рядом с ним.",
1222 prompt: "добавьте эндпоинт {endpoint}, который возвращает {payload}",
1223 slots: {
1224 endpoint: "/health",
1225 payload: "версию приложения и время работы"
1226 }
1164 },1227 },
1165 "build-a-small-internal": {1228 "build-a-small-internal": {
1166 title: "Создайте небольшой внутренний инструмент с нуля",1229 title: "Создайте небольшой внутренний инструмент с нуля",
1167 teaches: "Вам не нужен проект, фреймворк или этап сборки. Опишите инструмент и попросите Claude открыть его, чтобы вы сразу увидели, что он работает."1230 teaches: "Вам не нужен проект, фреймворк или этап сборки. Опишите инструмент и попросите Claude открыть его, чтобы вы сразу увидели, что он работает.",
1231 prompt: "создайте {tool} на HTML, CSS и vanilla JavaScript, затем откройте результат в моём браузере",
1232 slots: {
1233 tool: "канбан-доску с перетаскиванием и тремя колонками"
1234 }
1168 },1235 },
1169 "work-an-issue-end": {1236 "work-an-issue-end": {
1170 title: "Работайте над задачей от начала до конца",1237 title: "Работайте над задачей от начала до конца",
1171 teaches: "Дайте номер задачи, а не сводку. Claude читает полный билет сам, поэтому требования, которые вы забыли упомянуть, проходят, и он проверяет изменение перед отчётом."1238 teaches: "Дайте номер задачи, а не сводку. Claude читает полный билет сам, поэтому требования, которые вы забыли упомянуть, проходят, и он проверяет изменение перед отчётом.",
1239 prompt: "прочитайте issue #{issue}, реализуйте исправление и запустите тесты",
1240 slots: {
1241 issue: "312"
1242 }
1172 },1243 },
1173 "find-and-update-copy": {1244 "find-and-update-copy": {
1174 title: "Найдите и обновите текст по всей кодовой базе",1245 title: "Найдите и обновите текст по всей кодовой базе",
1175 teaches: "Спросите варианты и скажите, что пропустить. Claude находит фразировки, которые буквальный поиск пропустит, и оставляет тестовые фиксчуры и историю нетронутыми, поэтому вы проверяете только текст, который видят пользователи."1246 teaches: "Спросите варианты и скажите, что пропустить. Claude находит фразировки, которые буквальный поиск пропустит, и оставляет тестовые фиксчуры и историю нетронутыми, поэтому вы проверяете только текст, который видят пользователи.",
1247 prompt: "найдите все места, где мы пишем «{copy}» или близкий вариант, покажите каждое в контексте, затем замените их все на «{new}». тесты и changelog не трогайте",
1248 slots: {
1249 copy: "Зарегистрируйтесь бесплатно",
1250 new: "Начните бесплатный пробный период"
1251 }
1176 },1252 },
1177 "draft-from-past-examples": {1253 "draft-from-past-examples": {
1178 title: "Составьте документ из прошлых примеров",1254 title: "Составьте документ из прошлых примеров",
1179 teaches: "Укажите на папку готовой работы вместо описания вашего стиля. Claude изучает структуру и голос из того, что вы уже выпустили, поэтому первый черновик читается как один из ваших.",1255 teaches: "Укажите на папку готовой работы вместо описания вашего стиля. Claude изучает структуру и голос из того, что вы уже выпустили, поэтому первый черновик читается как один из ваших.",
1180 next: "Сохраните голос как skill, чтобы каждый черновик начинался там"1256 next: "Сохраните голос как скилл, чтобы каждый черновик начинался там",
1257 prompt: "прочитайте {examples} в {folder}, чтобы изучить структуру и стиль, затем составьте новый документ для {topic}",
1258 slots: {
1259 examples: "оценки воздействия на конфиденциальность",
1260 folder: "legal/pia/",
1261 topic: "новой интеграции аналитики"
1262 }
1181 },1263 },
1182 "write-tests-run-them": {1264 "write-tests-run-them": {
1183 title: "Напишите тесты, запустите их, исправьте ошибки",1265 title: "Напишите тесты, запустите их, исправьте ошибки",
1184 teaches: "Спросите написать, запустить и исправить вместе, чтобы Claude повторял без остановки для инструкций.",1266 teaches: "Спросите написать, запустить и исправить вместе, чтобы Claude повторял без остановки для инструкций.",
1185 next: "Запустите `/init`, чтобы Claude автоматически изучил вашу команду тестирования"1267 next: "Запустите `/init`, чтобы Claude автоматически изучил вашу команду тестирования",
1268 prompt: "напишите тесты для {path}, запустите их и исправьте все падения",
1269 slots: {
1270 path: "app/parsers/feed.py"
1271 }
1186 },1272 },
1187 "drive-implementation-from-tests": {1273 "drive-implementation-from-tests": {
1188 title: "Управляйте реализацией из тестов",1274 title: "Управляйте реализацией из тестов",
1189 teaches: "Разработка, управляемая тестами: тесты определяют, когда работа завершена, и Claude повторяет реализацию, пока они не пройдут."1275 teaches: "Разработка, управляемая тестами: тесты определяют, когда работа завершена, и Claude повторяет реализацию, пока они не пройдут.",
1276 prompt: "сначала напишите тесты для {feature}, затем реализуйте функциональность, пока тесты не пройдут",
1277 slots: {
1278 feature: "процесса сброса пароля"
1279 }
1190 },1280 },
1191 "fill-gaps-from-a": {1281 "fill-gaps-from-a": {
1192 title: "Заполните пробелы из отчёта о покрытии",1282 title: "Заполните пробелы из отчёта о покрытии",
1193 teaches: "Укажите на отчёт о покрытии вместо угадывания того, что не протестировано. Claude читает фактические числа и пишет тесты для файлов, которые нуждаются в них больше всего.",1283 teaches: "Укажите на отчёт о покрытии вместо угадывания того, что не протестировано. Claude читает фактические числа и пишет тесты для файлов, которые нуждаются в них больше всего.",
1194 next: "Установите это как `/goal`, чтобы Claude продолжал писать тесты, пока покрытие не достигнет целевого показателя"1284 next: "Установите это как `/goal`, чтобы Claude продолжал писать тесты, пока покрытие не достигнет целевого показателя",
1285 prompt: "прочитайте {report} и добавьте тесты для файлов с наименьшим покрытием, пока у каждого оно не превысит {target}%",
1286 slots: {
1287 report: "coverage/coverage-summary.json",
1288 target: "80"
1289 }
1195 },1290 },
1196 "port-code-between-languages": {1291 "port-code-between-languages": {
1197 title: "Перенесите код на другой язык",1292 title: "Перенесите код на другой язык",
1198 teaches: "Скажите, что сохранить, а не только целевой язык. Название API или поведения, которое должно остаться неизменным, даёт Claude контракт для проверки переноса."1293 teaches: "Скажите, что сохранить, а не только целевой язык. Название API или поведения, которое должно остаться неизменным, даёт Claude контракт для проверки переноса.",
1294 prompt: "перенесите {source} на {target}, сохранив без изменений {keep}",
1295 slots: {
1296 source: "этот модуль Python",
1297 target: "Rust",
1298 keep: "публичный API и поведение тестов"
1299 }
1199 },1300 },
1200 "generate-docs-for-code": {1301 "generate-docs-for-code": {
1201 title: "Создайте документацию для недокументированного кода",1302 title: "Создайте документацию для недокументированного кода",
1202 teaches: "Назовите область и формат. Claude находит, что не хватает, и соответствует стилю комментариев, уже находящемуся в файле, поэтому новая документация читается как остальная."1303 teaches: "Назовите охват и формат. Claude находит, что не хватает, и соответствует стилю комментариев, уже находящемуся в файле, поэтому новая документация читается как остальная.",
1304 prompt: "найдите {scope} без комментариев {format} и добавьте их, соблюдая стиль, уже используемый в файле",
1305 slots: {
1306 scope: "публичные функции в src/auth/",
1307 format: "JSDoc"
1308 }
1203 },1309 },
1204 "migrate-a-pattern-across": {1310 "migrate-a-pattern-across": {
1205 title: "Перенесите паттерн по всей кодовой базе",1311 title: "Перенесите паттерн по всей кодовой базе",
1206 teaches: "Опишите старый паттерн и новый. Попросить Claude сначала определить каждое место означает, что сайты вызовов перечислены в ответе, поэтому вы можете проверить, что ничего не пропущено. Для миграции по многим файлам запустите [/batch](/docs/ru/commands). Claude разбивает работу на единицы для вашего одобрения, затем фоновые подагенты делают изменения."1312 teaches: "Опишите старый паттерн и новый. Попросить Claude сначала определить каждое место означает, что сайты вызовов перечислены в ответе, поэтому вы можете проверить, что ничего не пропущено. Для миграции по многим файлам запустите [/batch](/docs/ru/commands). Claude разбивает работу на единицы для вашего одобрения, затем фоновые субагенты делают изменения.",
1313 prompt: "перенесите всё с {from} на {to}: найдите каждое место, которое нужно изменить, затем внесите изменения",
1314 slots: {
1315 from: "старого API логирования",
1316 to: "структурированный логгер"
1317 }
1207 },1318 },
1208 "optimize-against-a-measurable": {1319 "optimize-against-a-measurable": {
1209 title: "Оптимизируйте против измеримой цели",1320 title: "Оптимизируйте против измеримой цели",
1210 teaches: "Указание метрики и цели даёт Claude чёткое определение завершения.",1321 teaches: "Указание метрики и цели даёт Claude чёткое определение завершения.",
1211 next: "Установите это как `/goal`, чтобы Claude продолжал измерять и повторять, пока не достигнет числа"1322 next: "Установите это как `/goal`, чтобы Claude продолжал измерять и повторять, пока не достигнет числа",
1323 prompt: "оптимизируйте {target}, чтобы снизить {metric} с {current} до менее чем {goal}",
1324 slots: {
1325 target: "поисковый запрос",
1326 metric: "задержку p95",
1327 current: "2s",
1328 goal: "500ms"
1329 }
1212 },1330 },
1213 "fix-a-precise-visual": {1331 "fix-a-precise-visual": {
1214 title: "Исправьте точную визуальную ошибку",1332 title: "Исправьте точную визуальную ошибку",
1215 teaches: "Точная визуальная обратная связь получает точное исправление. Укажите точный элемент, измерение и viewport.",1333 teaches: "Точная визуальная обратная связь получает точное исправление. Укажите точный элемент, измерение и viewport.",
1216 next: "Добавьте инструмент предпросмотра, чтобы Claude сделал скриншот и проверил исправление сам"1334 next: "Добавьте инструмент предпросмотра, чтобы Claude сделал скриншот и проверил исправление сам",
1335 prompt: "{element} выходит на {amount} за пределы {container} на {viewport}. исправьте это.",
1336 slots: {
1337 element: "кнопка входа",
1338 amount: "20px",
1339 container: "рамки карточки",
1340 viewport: "мобильных устройствах"
1341 }
1217 },1342 },
1218 "review-your-changes-before": {1343 "review-your-changes-before": {
1219 title: "Проверьте ваши изменения перед коммитом",1344 title: "Проверьте ваши изменения перед коммитом",
1220 teaches: "Поймайте проблемы, пока они ещё дешевы в исправлении. Claude читает изменённые файлы полностью, а не только строки diff, поэтому он замечает проблемы, которые быстрая самопроверка пропускает.",1345 teaches: "Поймайте проблемы, пока они ещё дешевы в исправлении. Claude читает изменённые файлы полностью, а не только строки diff, поэтому он замечает проблемы, которые быстрая самопроверка пропускает.",
1221 next: "Запустите `/code-review` для той же проверки в одной команде"1346 next: "Запустите `/code-review` для той же проверки в одной команде",
1347 prompt: "проверьте мои незакоммиченные изменения и отметьте всё, что выглядит рискованным, до того как я сделаю коммит"
1222 },1348 },
1223 "review-a-pull-request": {1349 "review-a-pull-request": {
1224 title: "Проверьте pull request",1350 title: "Проверьте pull request",
1225 teaches: "Claude проверяет со всей кодовой базой в контексте, а не только diff. Он читает изменённый код и то, что он вызывает, поэтому он ловит проблемы, которые проверка только diff пропустит.",1351 teaches: "Claude проверяет со всей кодовой базой в контексте, а не только diff. Он читает изменённый код и то, что он вызывает, поэтому он ловит проблемы, которые проверка только diff пропустит.",
1226 next: "Запустите `/code-review <pr#>` в одной команде, или включите Code Review для каждого PR"1352 next: "Запустите `/code-review <pr#>` в одной команде, или включите Code Review для каждого PR",
1353 prompt: "проверьте PR #{pr}, кратко опишите, что изменилось, затем перечислите все замечания",
1354 slots: {
1355 pr: "247"
1356 }
1227 },1357 },
1228 "review-infrastructure-changes-before": {1358 "review-infrastructure-changes-before": {
1229 title: "Проверьте изменения инфраструктуры перед применением",1359 title: "Проверьте изменения инфраструктуры перед применением",
1230 teaches: "Вывод плана плотный и сложно сканировать. Вставка его даёт вам простой текстовый обзор того, что на самом деле будет изменено перед применением."1360 teaches: "Вывод плана плотный и сложно сканировать. Вставка его даёт вам простой текстовый обзор того, что на самом деле будет изменено перед применением.",
1361 prompt: "вот вывод моего Terraform plan. что это сделает, и может ли что-то здесь вызвать проблемы?"
1231 },1362 },
1232 "run-a-security-review": {1363 "run-a-security-review": {
1233 title: "Запустите проверку безопасности с подагентом",1364 title: "Запустите проверку безопасности с субагентом",
1234 teaches: "[Подагент](/docs/ru/sub-agents) запускает аудит в своём собственном контекстном окне и сообщает обратно сводку, поэтому длинная проверка безопасности не заполняет вашу основную сессию. Встроенный универсальный подагент справляется с этим без дополнительной настройки.",1365 teaches: "[Субагент](/docs/ru/sub-agents) запускает аудит в своём собственном контекстном окне и сообщает обратно сводку, поэтому длинная проверка безопасности не заполняет вашу основную сессию. Встроенный универсальный субагент справляется с этим без дополнительной настройки.",
1235 next: "Установите выделенный подагент security-review, который может использовать вся ваша команда"1366 next: "Настройте выделенного субагента security-review, которого может использовать вся ваша команда",
1367 prompt: "используйте субагента, чтобы проверить {path} на проблемы безопасности, и сообщите, что он найдёт",
1368 slots: {
1369 path: "src/api/"
1370 }
1236 },1371 },
1237 "review-content-before-sending": {1372 "review-content-before-sending": {
1238 title: "Поймайте проблемы перед формальной проверкой",1373 title: "Поймайте проблемы перед формальной проверкой",
1239 teaches: "Получите первый проход перед тем, как человек потратит на это время. Назовите проблемы, которые вы хотите проверить, чтобы проверка была сосредоточена, затем исправьте то, что она находит, и отправьте более чистый черновик.",1374 teaches: "Получите первый проход перед тем, как человек потратит на это время. Назовите проблемы, которые вы хотите проверить, чтобы проверка была сосредоточена, затем исправьте то, что она находит, и отправьте более чистый черновик.",
1240 next: "Захватите ваш контрольный список проверки как skill, который может запустить вся ваша команда"1375 next: "Захватите ваш контрольный список проверки как скилл, который может запустить вся ваша команда",
1376 prompt: "проверьте {file} на {concerns} и перечислите всё, что мне нужно исправить до того, как он отправится к {reviewer}",
1377 slots: {
1378 file: "launch-post.md",
1379 concerns: "необоснованные утверждения, отсутствующие ссылки на источники и нарушения брендбука",
1380 reviewer: "юристам"
1381 }
1241 },1382 },
1242 "course-correct-a-wrong": {1383 "course-correct-a-wrong": {
1243 title: "Исправьте неправильный подход",1384 title: "Исправьте неправильный подход",
1244 teaches: "Назовите ограничение, которое Claude пропустил, а не просто что это неправильно. Конкретная причина даёт Claude конкретное ограничение для удовлетворения при повторной попытке, вместо угадывания снова.",1385 teaches: "Назовите ограничение, которое Claude пропустил, а не просто что это неправильно. Конкретная причина даёт Claude конкретное ограничение для удовлетворения при повторной попытке, вместо угадывания снова.",
1245 next: "Нажмите `Esc` дважды, чтобы открыть меню перемотки и восстановить код и разговор, чтобы повторная попытка началась чистой"1386 next: "Нажмите `Esc` дважды, чтобы открыть меню перемотки и восстановить код и диалог, чтобы повторная попытка началась чистой",
1387 prompt: "это неправильно: {feedback}. попробуйте другой подход",
1388 slots: {
1389 feedback: "сигнатура функции должна остаться обратно совместимой"
1390 }
1246 },1391 },
1247 "narrow-the-scope-of": {1392 "narrow-the-scope-of": {
1248 title: "Сузьте область изменения",1393 title: "Сузьте масштаб изменения",
1249 teaches: "Когда направление правильное, но изменение стало слишком широким, попросите Claude сохранить часть его, а не перематывать всё. Указанная граница держит небольшое исправление от становления рефакторингом."1394 teaches: "Когда направление правильное, но изменение стало слишком широким, попросите Claude сохранить часть его, а не перематывать всё. Указанная граница держит небольшое исправление от становления рефакторингом.",
1395 prompt: "это слишком много. оставьте только изменения в {scope} и отмените остальные правки",
1396 slots: {
1397 scope: "логике валидации в src/forms/"
1398 }
1250 },1399 },
1251 "turn-a-correction-into": {1400 "turn-a-correction-into": {
1252 title: "Превратите исправление в правило",1401 title: "Превратите исправление в правило",
1253 teaches: "Исправление в чате не делится с вашей командой. Правило в [CLAUDE.md](/docs/ru/memory) проекта делится один раз, когда вы его коммитите, и Claude читает его в начале каждой сессии.",1402 teaches: "Исправление в чате не делится с вашей командой. Правило в [CLAUDE.md](/docs/ru/memory) проекта делится один раз, когда вы его коммитите, и Claude читает его в начале каждой сессии.",
1254 next: "Откройте `/memory`, чтобы проверить, что Claude написал"1403 next: "Откройте `/memory`, чтобы проверить, что Claude написал",
1404 prompt: "вы постоянно {mistake}. добавьте правило в CLAUDE.md, чтобы это прекратилось",
1405 slots: {
1406 mistake: "используете экспорт по умолчанию, хотя в этом проекте используются именованные экспорты"
1407 }
1255 },1408 },
1256 "resolve-merge-conflicts": {1409 "resolve-merge-conflicts": {
1257 title: "Разрешите конфликты слияния",1410 title: "Разрешите конфликты слияния",
1258 teaches: "Скажите, какое состояние вы хотите, а не какие маркеры сохранить. Запрос рассуждения делает слияние проверяемым вместо чёрного ящика."1411 teaches: "Скажите, какое состояние вы хотите, а не какие маркеры сохранить. Запрос рассуждения делает слияние проверяемым вместо чёрного ящика.",
1412 prompt: "разрешите конфликты слияния в этой ветке и объясните, что вы оставили с каждой стороны"
1259 },1413 },
1260 "commit-with-a-generated": {1414 "commit-with-a-generated": {
1261 title: "Коммитьте с сгенерированным сообщением",1415 title: "Коммитьте с сгенерированным сообщением",
1262 teaches: "Позвольте Claude вывести сообщение из diff. Это соответствует существующему стилю коммитов вашего репозитория."1416 teaches: "Позвольте Claude вывести сообщение из diff. Это соответствует существующему стилю коммитов вашего репозитория.",
1417 prompt: "сделайте коммит этих изменений с сообщением, которое кратко описывает, что я сделал"
1263 },1418 },
1264 "open-a-pull-request": {1419 "open-a-pull-request": {
1265 title: "Откройте pull request из задачи",1420 title: "Откройте pull request из задачи",
1266 teaches: "Пропустите переключение контекста между трекером, редактором и GitHub. Один промпт читает спецификацию, делает изменение и открывает PR."1421 teaches: "Пропустите переключение контекста между трекером, редактором и GitHub. Один промпт читает спецификацию, делает изменение и открывает PR.",
1422 prompt: "найдите задачу в {tracker} про {topic} и откройте PR, который её реализует",
1423 slots: {
1424 tracker: "Linear",
1425 topic: "таймаут входа"
1426 }
1267 },1427 },
1268 "draft-release-notes-from": {1428 "draft-release-notes-from": {
1269 title: "Составьте примечания к выпуску из истории git",1429 title: "Составьте примечания к выпуску из истории git",
1270 teaches: "Дайте две контрольные точки и структуру, которую вы хотите. Claude читает логи коммитов между ними и составляет changelog, который вы можете редактировать.",1430 teaches: "Дайте две контрольные точки и структуру, которую вы хотите. Claude читает логи коммитов между ними и составляет changelog, который вы можете редактировать.",
1271 next: "Сохраните это как skill `/changelog`"1431 next: "Сохраните это как скилл `/changelog`",
1432 prompt: "сравните {from} с {to} и составьте примечания к выпуску, сгруппированные по функциям, исправлениям и критическим изменениям",
1433 slots: {
1434 from: "v2.3.0",
1435 to: "v2.4.0"
1436 }
1272 },1437 },
1273 "write-a-ci-workflow": {1438 "write-a-ci-workflow": {
1274 title: "Напишите CI workflow",1439 title: "Напишите CI workflow",
1275 teaches: "Опишите, когда он должен запускаться и что он должен делать; YAML генерируется для вас, соответствуя командам сборки и тестирования вашего проекта."1440 teaches: "Опишите, когда он должен запускаться и что он должен делать; YAML генерируется для вас, соответствуя командам сборки и тестирования вашего проекта.",
1441 prompt: "напишите workflow GitHub Actions, который {steps} при каждом push в {branch}",
1442 slots: {
1443 steps: "запускает тесты и деплоит на staging",
1444 branch: "main"
1445 }
1276 },1446 },
1277 "find-and-fix-a": {1447 "find-and-fix-a": {
1278 title: "Найдите и исправьте неудачный тест",1448 title: "Найдите и исправьте неудачный тест",
1279 teaches: "Опишите симптом; вам не нужно знать, какой файл сломан. Claude запускает тест, чтобы увидеть ошибку, отслеживает её в исходный код и исправляет её."1449 teaches: "Опишите симптом; вам не нужно знать, какой файл сломан. Claude запускает тест, чтобы увидеть ошибку, отслеживает её в исходный код и исправляет её.",
1450 prompt: "тест {test} падает, выясните почему и исправьте его",
1451 slots: {
1452 test: "UserAuth"
1453 }
1280 },1454 },
1281 "investigate-a-reported-error": {1455 "investigate-a-reported-error": {
1282 title: "Исследуйте сообщённую ошибку",1456 title: "Исследуйте сообщённую ошибку",
1283 teaches: "Опишите симптом и местоположение; Claude читает соответствующий путь кода и отслеживает вероятные причины. Вставьте трассировки стека или логи, если они у вас есть.",1457 teaches: "Опишите симптом и местоположение; Claude читает соответствующий путь кода и отслеживает вероятные причины. Вставьте трассировки стека или логи, если они у вас есть.",
1284 next: "Поместите глубокую ссылку в вашу runbook, которая открывает Claude с этим промптом предварительно заполненным"1458 next: "Поместите глубокую ссылку в вашу runbook, которая открывает Claude с этим промптом предварительно заполненным",
1459 prompt: "пользователи видят {symptom} на {where}. разберитесь и расскажите, что происходит",
1460 slots: {
1461 symptom: "ошибки 500",
1462 where: "/api/settings"
1463 }
1285 },1464 },
1286 "fix-a-build-error": {1465 "fix-a-build-error": {
1287 title: "Исправьте ошибку сборки в корне",1466 title: "Исправьте ошибку сборки в корне",
1288 teaches: "Запрос корневой причины и проверки предотвращает поверхностные патчи, которые подавляют ошибку без её исправления."1467 teaches: "Запрос корневой причины и проверки предотвращает поверхностные патчи, которые подавляют ошибку без её исправления.",
1468 prompt: "вот ошибка сборки. исправьте первопричину и убедитесь, что сборка проходит успешно"
1289 },1469 },
1290 "investigate-a-production-incident": {1470 "investigate-a-production-incident": {
1291 title: "Исследуйте инцидент в production",1471 title: "Исследуйте инцидент в production",
1292 teaches: "Перечислите источники доказательств для корреляции, а не шаги для выполнения. Claude читает логи, историю git и конфигурацию вместе, чтобы сузить причину.",1472 teaches: "Перечислите источники доказательств для корреляции, а не шаги для выполнения. Claude читает логи, историю git и конфигурацию вместе, чтобы сузить причину.",
1293 next: "Подключите Sentry или ваше хранилище логов через MCP"1473 next: "Подключите Sentry или ваше хранилище логов через MCP",
1474 prompt: "{symptom}. проверьте логи, недавние деплои и изменения конфигурации, затем назовите наиболее вероятную причину",
1475 slots: {
1476 symptom: "эндпоинт checkout начал возвращать ошибки 500 час назад"
1477 }
1294 },1478 },
1295 "query-logs-in-plain": {1479 "query-logs-in-plain": {
1296 title: "Запросите логи на простом английском",1480 title: "Запросите логи на простом английском",
1297 teaches: "Спросите вопрос вместо написания SQL. Claude строит запрос, запускает его против ваших подключённых логов и показывает как запрос, так и результат, чтобы вы могли проверить, что запустилось."1481 teaches: "Спросите вопрос вместо написания SQL. Claude составляет запрос, запускает его против ваших подключённых логов и показывает как запрос, так и результат, чтобы вы могли проверить, что запустилось.",
1482 prompt: "покажите все {events} для {scope} за {timeframe}. напишите запрос, выполните его и расскажите, что выделяется",
1483 slots: {
1484 events: "неудачные попытки входа",
1485 scope: "сервиса авторизации",
1486 timeframe: "последние 24 часа"
1487 }
1298 },1488 },
1299 "diagnose-from-a-console": {1489 "diagnose-from-a-console": {
1300 title: "Диагностируйте из скриншота консоли",1490 title: "Диагностируйте из скриншота консоли",
1301 teaches: "Облачные консоли показывают вам проблему, но не команды для её исправления. Claude читает скриншот и переводит панель управления в команды kubectl, gcloud или aws для запуска."1491 teaches: "Облачные консоли показывают вам проблему, но не команды для её исправления. Claude читает скриншот и переводит панель управления в команды kubectl, gcloud или aws для запуска.",
1492 prompt: "вот скриншот {console}. объясните, почему {resource} не работает, и дайте точные команды для исправления",
1493 slots: {
1494 console: "панели Kubernetes в GCP",
1495 resource: "этот под"
1496 }
1302 },1497 },
1303 "analyze-a-data-file": {1498 "analyze-a-data-file": {
1304 title: "Проанализируйте файл данных",1499 title: "Проанализируйте файл данных",
1305 teaches: "Одноразовый вопрос не требует одноразового скрипта. Укажите на файл в папке вашего проекта, и Claude читает его напрямую, находит закономерности и пишет вывод туда, где вы просите.",1500 teaches: "Одноразовый вопрос не требует одноразового скрипта. Укажите на файл в папке вашего проекта, и Claude читает его напрямую, находит закономерности и пишет вывод туда, где вы просите.",
1306 next: "Подключите источник данных через MCP вместо экспорта файлов"1501 next: "Подключите источник данных через MCP вместо экспорта файлов",
1502 prompt: "прочитайте {file}, кратко опишите ключевые закономерности и запишите результаты в {output}",
1503 slots: {
1504 file: "@reports/q1-signups.csv",
1505 output: "HTML-страницу с графиками, затем откройте её в моём браузере"
1506 }
1307 },1507 },
1308 "generate-variations-from-performance": {1508 "generate-variations-from-performance": {
1309 title: "Создайте варианты из данных производительности",1509 title: "Создайте варианты из данных производительности",
1310 teaches: "Укажите ограничение в начале, чтобы генерация оставалась в пределах лимита. Claude читает метрики, выбирает, что заменить, и производит альтернативы, которые подходят.",1510 teaches: "Укажите ограничение в начале, чтобы генерация оставалась в пределах лимита. Claude читает метрики, выбирает, что заменить, и производит альтернативы, которые подходят.",
1311 next: "Подключите платформу объявлений через MCP вместо экспорта файла"1511 next: "Подключите платформу объявлений через MCP вместо экспорта файла",
1512 prompt: "прочитайте {file}, найдите неэффективные {items} и сгенерируйте {n} новых вариантов длиной не более {limit} символов",
1513 slots: {
1514 file: "@ads-performance.csv",
1515 items: "заголовки",
1516 n: "20",
1517 limit: "90"
1518 }
1312 },1519 },
1313 "turn-a-recurring-task": {1520 "turn-a-recurring-task": {
1314 title: "Превратите повторяющуюся задачу в skill",1521 title: "Превратите повторяющуюся задачу в скилл",
1315 teaches: "Назовите шаги один раз; переиспользуйте их как команду. Claude пишет [skill](/docs/ru/skills), который может запустить кто-либо из вашей команды."1522 teaches: "Назовите шаги один раз; переиспользуйте их как команду. Claude пишет [скилл](/docs/ru/skills), который может запустить кто-либо из вашей команды.",
1523 prompt: "создайте скилл /{name} для этого проекта, который {steps}",
1524 slots: {
1525 name: "ship",
1526 steps: "запускает линтер и тесты, затем составляет сообщение коммита"
1527 }
1316 },1528 },
1317 "add-a-hook-for": {1529 "add-a-hook-for": {
1318 title: "Добавьте hook для повторяющегося поведения",1530 title: "Добавьте хук для повторяющегося поведения",
1319 teaches: "Hooks делают поведение автоматическим вместо того, чтобы вы должны были помнить просить об этом. Опишите триггер и действие, и Claude пишет конфигурацию [hook](/docs/ru/hooks)."1531 teaches: "Хуки делают поведение автоматическим вместо того, чтобы вы должны были помнить просить об этом. Опишите триггер и действие, и Claude пишет конфигурацию [хука](/docs/ru/hooks).",
1532 prompt: "напишите хук, который {action} после каждого {event}",
1533 slots: {
1534 action: "запускает prettier",
1535 event: "редактирования файла .ts или .tsx"
1536 }
1320 },1537 },
1321 "connect-a-tool-with": {1538 "connect-a-tool-with": {
1322 title: "Подключите инструмент с MCP",1539 title: "Подключите инструмент с MCP",
1323 teaches: "Подключите источник один раз вместо вставки данных в каждую сессию. После настройки [MCP](/docs/ru/mcp), Claude читает из инструмента напрямую, когда вы спрашиваете об этом."1540 teaches: "Подключите источник один раз вместо вставки данных в каждую сессию. После настройки [MCP](/docs/ru/mcp), Claude читает из инструмента напрямую, когда вы спрашиваете об этом.",
1541 prompt: "настройте MCP-сервер {server}, чтобы вы могли напрямую читать мои {data}",
1542 slots: {
1543 server: "Sentry",
1544 data: "отчёты об ошибках"
1545 }
1324 },1546 },
1325 "capture-what-to-remember": {1547 "capture-what-to-remember": {
1326 title: "Захватите, что помнить в следующий раз",1548 title: "Захватите, что помнить в следующий раз",
1327 teaches: "Спросите перед тем, как забыть. Claude знает, что ему пришлось разобраться в этой сессии, и предлагает записи [CLAUDE.md](/docs/ru/memory), чтобы следующая сессия начиналась с этого контекста."1549 teaches: "Спросите перед тем, как забыть. Claude знает, что ему пришлось разобраться в этой сессии, и предлагает записи [CLAUDE.md](/docs/ru/memory), чтобы следующая сессия начиналась с этого контекста.",
1550 prompt: "кратко опишите, что мы сделали в этой сессии, и предложите, что добавить в CLAUDE.md"
1328 }1551 }
1329};1552};
1330 1553