Начни здесь

От идеи к документам: курс по @dzhechkov/skills-idea2prd

Практический Head-First курс для участника harness-мастерской: как превратить сырую боль или сырую идею в набор документов, который можно отдать кодирующему ассистенту — требования, архитектурные решения, модель предметной области, псевдокод, сценарии тестов и чек-лист выката. Двенадцать разделов, сквозная героиня Мира, девять контрольных точек живого конвейера.

Знакомься: Мира

Мира — участница harness-мастерской. В курсе по harness-cli она научилась ставить инструменты, в курсе по feature-adr — вести фичу через конвейер с ревью. Теперь у неё своя идея сервиса подбора подрядчиков, и впервые ей нужно превратить эту идею в документы, по которым кто-то другой сможет написать код.

Содержание курса

1. Зачем нужен idea2prd: дизайн раньше кода

Почему прыжок от идеи прямо к коду обходится дороже, чем кажется

Ключевая мысль: Дизайн раньше кода: слой документов, которые можно прочитать и оспорить

Мира пришла на мастерскую с идеей: сервис подбора подрядчиков. Она открыла ассистента, написала «сделай мне такой сервис» — и через час держала в руках три тысячи строк кода, в которых не было ответа на главный вопрос: кто пользователь и что мы считаем успехом.

А цена вот в чём. Код — самая дорогая форма мышления. Чтобы изменить решение, зашитое в код, нужно переписать код и все тесты вокруг него. Чтобы изменить решение, записанное в документе, нужно переписать абзац. Поэтому пакет @dzhechkov/skills-idea2prd вставляет между идеей и кодом слой документов, которые ты читаешь и оспариваешь до того, как написана первая строка.

Что именно он выдаёт: требования, архитектурные решения с причинами, модель предметной области, псевдокод, сценарии тестов на Gherkin и чек-лист выката. Это не бумага ради бумаги — это задание, которое понимает кодирующий ассистент.

Три выгоды, ради которых стоит потратить час:

  1. неверное допущение ловится на уровне требований, а не после реализации;
  2. у каждого архитектурного выбора есть записанная причина, а не «так вышло»;
  3. готовый набор документов уходит дальше как одно цельное задание.

💬 Просто попроси.
- «сделай PRD пошагово для сервиса подбора подрядчиков» → ассистент включит скилл idea2prd-manual и начнёт с уточняющих вопросов, а не с кода.
- «у меня не идея, а боль: подрядчиков ищут только по знакомым» → ассистент поймёт, что на входе проблема, а не идея, и сначала запустит аналитическую ветку.

Ссылки: страница пакета на npm и исходники в зеркале репозитория.

2. Установка: одна команда npx и ничего больше

Как положить пак скиллов в свой проект и не поставить лишнего

Ключевая мысль: Установка пакета одной командой npx прямо в проект

Мира открыла папку проекта и приготовилась к долгой возне: зависимости, конфигурация, ключи. Ничего этого не понадобилось — установка занимает одну строку.

npx @dzhechkov/skills-idea2prd init

Команда кладёт скиллы прямо в проект, в каталог .claude/skills/, и добавляет слэш-команду /idea2prd-manual. Глобально ничего не ставится: пак живёт внутри проекта, поэтому у двух проектов могут быть разные версии, и это нормально.

После установки ассистент подхватывает скилл сам, по фразам вроде «сделай PRD пошагово для …» или «idea to prd manual: …». Отдельно включать ничего не нужно.

Если в системе уже есть общий harness-инструмент dz, тот же пак ставится через него — команда dz init --select idea2prd-manual. Это удобно, когда собираешь проект сразу из нескольких паков, а не только из этого.

💬 Просто попроси.
- «поставь idea2prd в этот проект» → ассистент выполнит установку через npx @dzhechkov/skills-idea2prd init и покажет, что появилось в .claude/skills/.
- «проверь, что пак встал правильно» → ассистент запустит npx @dzhechkov/skills-idea2prd doctor.

Ссылки: страница пакета на npm и исходники в зеркале репозитория.

3. Что внутри: самодостаточный пак из четырёх скиллов

Четыре скилла, четыре локальных скрипта и почему ничего больше не нужно

Ключевая мысль: Самодостаточный пак: четыре скилла и четыре локальных скрипта

Мира ждала, что после установки придётся ставить ещё пять пакетов. Не пришлось: пак самодостаточный — внутри лежит всё, что нужно конвейеру, и ни один другой пакет @dzhechkov не требуется.

Внутри четыре скилла. idea2prd-manual — оркестратор, он ведёт весь путь и останавливается на контрольных точках. explore превращает расплывчатую задачу в бриф через вопросы. goap-research-ed25519 ведёт исследование с явными источниками и подписью. problem-solver-enhanced разбирает проблему девятью модулями — от первых принципов до ТРИЗ.

Плюс четыре скрипта, которые работают локально, без сети: c4_generator.py рисует диаграммы, fitness_validator.py проверяет fitness-функции, pseudocode_generator.py собирает псевдокод, ai_context_builder.py готовит каталог .ai-context/ для кодирующего ассистента.

Важная деталь про происхождение. Канонический артефакт этого пака — только idea2prd-manual. Тройка explore / goap-research-ed25519 / problem-solver-enhanced — отслеживаемая копия: их родной дом — пакет @dzhechkov/skills-analyst-manual, а расхождения подтягиваются командой dz sync-upstream. Знать это стоит: править копию внутри пака бессмысленно — правку затрёт следующая синхронизация.

💬 Просто попроси.
- «покажи, какие скиллы установил idea2prd» → ассистент выполнит npx @dzhechkov/skills-idea2prd list.
- «объясни, чем explore отличается от problem-solver-enhanced» → ассистент прочитает оба SKILL.md из .claude/skills/ и сравнит их роли.

4. Ворота 0: у тебя проблема или уже идея?

Первая развилка конвейера и почему она решает, сколько работы впереди

Ключевая мысль: Ворота 0: проблема или идея решают, какая ветка запустится

Первый вопрос, который задаёт себе конвейер, звучит обманчиво просто: у тебя проблема или уже идея? Мира сначала не поняла разницы — а она решает, сколько работы впереди.

Проблема — это боль без решения: «подрядчиков ищут только по знакомым, и качество лотерея». В формулировке есть боль и вопрос «как?», но нет продукта.

Идея — это уже названный продукт: «каталог подрядчиков с рейтингом, проверкой документов и оплатой через эскроу». Есть аудитория, есть функции.

Развилка работает так:

  1. на входе проблема → сначала аналитическая ветка, она превращает боль в проверенную идею продукта;
  2. на входе идея → аналитическая ветка пропускается, сразу запускается конвейер PRD;
  3. вход непонятен → ассистент задаёт ровно один уточняющий вопрос и не больше.

Зачем вообще нужна эта развилка. Аналитическая ветка стоит времени: вопросы, исследование, девять модулей разбора. Гонять её поверх уже продуманной идеи — потратить час на подтверждение того, что ты и так знаешь. А вот пропустить её на сырой боли — значит написать требования к продукту, которого не должно существовать.

💬 Просто попроси.
- «это проблема или идея? реши сам и скажи почему» → ассистент классифицирует твой вход и назовёт признаки, по которым выбрал ветку.
- «считай это готовой идеей, аналитику пропусти» → ассистент возьмёт короткий путь и сразу перейдёт к требованиям.

5. Аналитическая ветка: как боль становится идеей

Три скилла подряд превращают сырую жалобу в проверенную идею продукта

Ключевая мысль: Аналитическая ветка: explore, затем исследование, затем разбор проблемы

Мира принесла боль, а не готовый продукт, поэтому включилась аналитическая ветка. Она короткая, но порядок в ней не случайный: каждый следующий шаг опирается на результат предыдущего.

Шаг первый — explore. Ассистент задаёт уточняющие вопросы и собирает бриф задачи: в чём боль, у кого она, что считается успехом, какие ограничения есть. Это единственный шаг, где обязательно нужен живой человек — на вопросы отвечаешь ты.

Шаг второй — goap-research-ed25519. Исследование: кто уже решает эту боль, какими способами, где дыры. Ключевая особенность — источники называются явно, а находки несут честную оценку уверенности. Исследование не доказывает истину, оно показывает, откуда взято утверждение.

Шаг третий — problem-solver-enhanced. Девять модулей разбора подряд: первые принципы, пять «почему», анализ ограничений, SCQA, теория игр, эффекты второго порядка, ТРИЗ, адвокат дьявола и синтез. На выходе — проверенная идея продукта: название, описание, аудитория, ключевые функции и то, чем она отличается от чужих решений.

После третьего шага аналитика заканчивается, и та же идея уходит в конвейер PRD — как если бы ты принёс её готовой.

💬 Просто попроси.
- «разбери мою боль по первым принципам, прежде чем предлагать продукт» → ассистент запустит problem-solver-enhanced и покажет разбор по модулям.
- «покажи, кто уже решает эту задачу и чем» → ассистент выполнит шаг исследования и приведёт находки с источниками.

6. Девять контрольных точек: где ты можешь сказать «стоп»

Режим MANUAL: конвейер останавливается после каждой фазы и ждёт твоего слова

Ключевая мысль: Девять контрольных точек: режим MANUAL ждёт твоего подтверждения

Мира ожидала, что ассистент отработает всё разом и вывалит стопку файлов. Вместо этого он остановился после первой же фазы и спросил: «подтверди требования или внеси правки».

Это и есть режим MANUAL. Девять контрольных точек — три в аналитической ветке (бриф, исследование, идея продукта) и шесть в конвейере PRD (требования, стратегический DDD, архитектура, тактический DDD, псевдокод, тесты). После каждой конвейер печатает сводку сделанного и ждёт.

Отвечать можно по-разному:

  • ok или «продолжай» — идём дальше;
  • «скорректируй X» — правим конкретный элемент;
  • «добавь Y» — дополняем недостающее;
  • «пересмотри Z» — возвращаемся к решению;
  • «стоп» — пауза с сохранением состояния.

Зачем это нужно. Ошибка в требованиях, пропущенная на первой точке, к шестой уже разошлась по модели предметной области, архитектурным решениям и псевдокоду — исправлять придётся всё сразу. Контрольная точка — это место, где ошибка стоит один абзац, а не шесть документов.

Есть и обратная сторона: девять остановок означают, что конвейер нельзя запустить и уйти пить кофе. Если идея простая и цена ошибки низкая, честнее взять быстрый автоматический режим — контрольные точки нужны там, где ошибка дорогая.

💬 Просто попроси.
- «остановись после требований, я хочу посмотреть» → ассистент дойдёт до первой контрольной точки и будет ждать.
- «пересмотри границы контекстов, третий выглядит лишним» → ассистент вернётся к фазе стратегического DDD, не трогая остальное.

7. Конвейер PRD: шесть фаз от требований до выката

Главный рабочий путь: что рождается на каждой фазе и почему именно в этом порядке

Ключевая мысль: Конвейер PRD: шесть фаз от требований до чек-листа выката

Вот тот самый главный путь, ради которого ставят пакет. Мира прошла его целиком, и удобнее всего смотреть на него как на лестницу: каждая ступень опирается на предыдущую, и перепрыгнуть нельзя.

требования → стратегический DDD → решения ADR и схемы C4
     → тактический DDD → псевдокод → тесты и fitness → чек-лист выката

Что происходит на ступенях. Требования: функциональные и нефункциональные, пользовательские истории, пути пользователя, ограничения и допущения. Стратегический DDD — деление предметной области на ограниченные контексты, то есть на участки, внутри которых слова означают одно и то же; плюс карта связей между ними. ADR и C4: архитектурные решения с причинами и три уровня схем — контекст системы, контейнеры, компоненты.

Дальше конвейер спускается к деталям. Тактический DDD — агрегаты, сущности, объекты-значения, доменные события и схема базы. Псевдокод фиксирует алгоритмическую логику до кодогенерации, чтобы генератор реализовывал принятый дизайн, а не изобретал свой на ходу. Тесты и fitness-функции — сценарии на Gherkin и проверяемые архитектурные правила. Чек-лист выката закрывает путь: окружение, конвейер сборки, мониторинг, безопасность.

Почему порядок именно такой: каждая ступень отвечает на вопрос, который поставила предыдущая. Требования спрашивают «что», DDD отвечает «в каких границах», ADR — «каким способом», псевдокод — «по какому алгоритму», тесты — «как узнать, что мы не соврали».

💬 Просто попроси.
- «покажи карту контекстов, прежде чем писать ADR» → ассистент остановится на фазе стратегического DDD и нарисует карту.
- «собери псевдокод только для агрегата заказов» → ассистент сузит фазу псевдокода до одного агрегата.

8. Дисциплина утверждений: число без пометки — дефект

Как пакет запрещает себе и тебе писать красивые цифры из ниоткуда

Ключевая мысль: Дисциплина утверждений: число без честной пометки считается дефектом

Мира дочитала черновик требований и споткнулась о фразу: «система ускоряет подбор подрядчика на 40%». Откуда сорок? Никто не мерил. Цифра появилась, потому что красиво звучит.

Именно против этого работает дисциплина утверждений. Правило простое: рядом с числом, которое выглядит как результат, обязана стоять честная пометка — откуда оно взялось. Пометок три:

  • MEASURED — измерено, и рядом назван воспроизводитель: команда, файл, прогон;
  • CLAIMED — это чужое утверждение, которое ты пересказываешь, и назван автор;
  • ESTIMATED — это оценка или цель, и названо основание, на котором она выбрана.

Непомеченное число, похожее на результат, считается дефектом документа. И отдельно запрещена идеальная оценка: голые 100%, «ноль дефектов», «никогда не падает» помечаются как серьёзная находка даже с честным тегом — потому что совершенство в измерениях почти не встречается. Вместо этого пишут реальное значение в сравнении с базовой линией или цель с пометкой ESTIMATED.

Проверить документы можно машинно: если в системе есть harness-инструмент dz, запусти dz claim-check docs/ --fail-on medium. Порог именно medium: на пороге high обычные непомеченные утверждения средней силы проскакивают мимо — то есть проверка становится зелёной ровно там, где она нужна.

💬 Просто попроси.
- «проверь мои документы на непомеченные числа» → ассистент запустит dz claim-check docs/ --fail-on medium и покажет находки.
- «убери из PRD все цифры, которые никто не мерил» → ассистент найдёт утверждения без пометки и либо удалит их, либо предложит тег с основанием.

9. Стойка Confirmation: решение, которое можно опровергнуть

Как архитектурное решение перестаёт быть красивым текстом и становится проверяемым

Ключевая мысль: Стойка Confirmation: у каждого решения есть опровергающий тест

Архитектурное решение легко написать так, что его невозможно проверить: «выбрали микросервисы ради масштабируемости». Красиво — и бесполезно: непонятно, что должно случиться, чтобы мы признали решение неверным.

Поэтому каждый ADR, который генерирует пакет, обязан нести стойку ## Confirmation. В ней два несущих поля. Load-bearing property — то самое свойство, ради которого решение принято. Required automated check — конкретная проверка, которая покраснеет, если свойство нарушено: fitness-функция вида FF-001 или сценарий .feature на Gherkin.

Мира сначала решила, что это формальность, — пока не дошла до фазы 5, где конвейер сверяет обещания с реальностью. Сверка проходит по каждому ADR и требует трёх вещей:

  1. названный тест конкретен, а не заглушка вроде TBD или FF-NNN;
  2. этот тест реально существует в выходе фазы 5 — идея FF-001 есть в таблице fitness-функций, файл .feature лежит в docs/tests/;
  3. тест привязан именно к несущему свойству, то есть покраснеет при его нарушении, а не проверяет просто счастливый путь.

Любая незакрытая строка блокирует подпись фазы 5. Смысл в том, что стойка Confirmation превращает решение из прозы в обещание с механизмом проверки — и связывает фазу 3 с фазой 5 не по доброй воле автора, а по правилу конвейера.

💬 Просто попроси.
- «покажи таблицу ADR и их опровергающих тестов» → ассистент напечатает сводку с несущим свойством и названным тестом для каждого решения.
- «этот ADR ничем не проверяется — допиши fitness-функцию» → ассистент добавит проверку и привяжет её к несущему свойству.

10. Память проекта: recall в начале, teach в конце

Как конвейер перестаёт быть одноразовым и начинает помнить прошлые прогоны

Ключевая мысль: Память проекта: recall в начале и teach в конце, один канонический склад

Мира запустила конвейер во второй раз и сразу заметила разницу. Первый прогон был чистым листом; второй начался с того, что конвейер вспомнил уроки первого.

Механика простая: у этой петли два конца. В начале — recall. Ещё до ворот 0, если в системе есть harness-инструмент dz, конвейер выполняет dz recall по ключевым словам задачи и вкладывает найденные уроки в бриф. Это прошлые находки: удачная граница контекста, доменное ограничение, которое однажды укусило, форма fitness-функции, которая сработала.

В конце — teach. После последней фазы конвейер сравнивает свои новые уроки с тем, что уже вспомнил в начале. Уже известное не переучивается. По-настоящему новое записывается командой dz teach — по одному уроку за вызов. Честный результат «ноль новых уроков» тоже бывает и не считается провалом.

Одна деталь решает, работает ли петля вообще: склад должен быть один. И recall, и teach привязываются к одному и тому же абсолютному пути проекта через --project. Если начало читает из одного склада, а конец пишет в другой, уроки копятся в разных местах и не подкрепляют друг друга — петля разомкнута, хотя обе команды отработали успешно.

Всё это включается само, только если dz есть в системе. Нет — конвейер молча работает как раньше, без памяти.

💬 Просто попроси.
- «вспомни, что мы уже решали про границы контекстов в этом проекте» → ассистент выполнит dz recall и вложит находки в бриф.
- «запиши урок: эскроу нельзя моделировать внутри контекста каталога» → ассистент выполнит dz teach с привязкой к каноническому складу проекта.

11. Пять команд: init, update, remove, list, doctor

Полный набор команд пакета и когда какая нужна

Ключевая мысль: Пять команд пакета: init, update, remove, list, doctor

Мира привыкла, что у инструмента десятки ключей и половина из них непонятна. Здесь всё короче: у пакета ровно пять команд, и каждая делает одну вещь.

init ставит пак в текущий проект и работает по умолчанию — если подкоманду не указать, выполнится именно она. update обновляет пак до свежей версии. remove убирает его из проекта. list показывает, что установлено. doctor проверяет здоровье установки — на месте ли скиллы, не побились ли файлы.

К любой из них добавляются четыре флага: --force продавливает действие, --dry-run показывает, что произошло бы, ничего не меняя, --help печатает справку, --version — версию.

Правило, которое экономит нервы: сначала --dry-run, потом без него. Особенно с remove и update — сухой прогон печатает список файлов, которых коснётся команда, и это единственный дешёвый способ убедиться, что она понимает твой проект так же, как ты.

Если что-то ведёт себя странно — скилл не подхватывается, слэш-команда не появилась, — начинай с doctor. Он отвечает на вопрос «установка вообще цела?» раньше, чем ты начнёшь искать причину в ассистенте.

💬 Просто попроси.
- «проверь установку idea2prd» → ассистент выполнит npx @dzhechkov/skills-idea2prd doctor и разберёт вывод.
- «покажи, что удалит remove, но не удаляй» → ассистент выполнит npx @dzhechkov/skills-idea2prd remove --dry-run.

12. Границы: чего пакет не делает за тебя

Честный список ограничений — и что из этого следует для твоей работы

Ключевая мысль: Границы честности: пакет готовит документы, но не пишет код и не проверяет факты за тебя

Последний раздел — самый полезный, потому что он про то, чего инструмент не умеет. Мира выучила эти границы дорогой ценой и рекомендует выучить их дешевле.

Пакет не пишет код. На выходе — документы: требования, решения, модель, псевдокод, сценарии тестов, чек-лист. Реализацию делает кодирующий ассистент или человек, взяв этот набор как задание.

Пакет не проверяет факты. Дисциплина утверждений требует, чтобы у числа была честная пометка, но она не может отличить настоящее измерение от выдуманного — тег MEASURED рядом с фантазией пройдёт машинную проверку. Формат проверяется, правдивость — нет, и это ровно та граница, где начинается твоя ответственность.

Проверка уроков тоже про форму. Слой памяти отклоняет записи, похожие на личные данные, — почта, телефон, номер записи. Но он не решает, о методе урок или о человеке: это остаётся на суждении автора.

Контрольные точки требуют человека. Девять остановок — не декорация: без ответов конвейер стоит. Автономный ночной прогон здесь не предусмотрен.

И одна деталь про подпись пакета. Манифест подписи описывает ровно те файлы, которые пакет отгружает, а не всё, что лежит у автора в рабочем дереве. Раньше он подписывал и то, что в поставку не попадает, — и у каждого получателя проверка честно сообщала о недостающих файлах, то есть пакет читался как подделанный. Урок общий: подпись должна описывать то, что реально доехало до получателя.

💬 Просто попроси.
- «набор документов готов — реализуй агрегат заказов по псевдокоду» → ассистент перейдёт к коду, взяв документы как задание.
- «пройдись по PRD и покажи все числа, которые я не могу подтвердить» → ассистент соберёт список утверждений, требующих твоей проверки.

Частые вопросы

Чем idea2prd отличается от того, чтобы просто попросить ассистента «напиши PRD»?

Разовая просьба даёт один документ и никакой связности. Здесь идёт конвейер: требования задают деление предметной области, оно задаёт архитектурные решения, решения обязаны назвать опровергающий тест, а тест обязан реально существовать в фазе 5. Плюс девять остановок, на которых можно повернуть работу назад, пока она дешёвая.

Обязательно ли проходить аналитическую ветку?

Нет. Она включается, только если на входе проблема, а не готовая идея. Если продукт уже сформулирован — аудитория, функции, отличие от чужих решений — ворота 0 пропускают аналитику и сразу запускают конвейер PRD. Можно и прямо сказать ассистенту: «считай это готовой идеей».

Нужен ли harness-инструмент dz, чтобы пакет работал?

Нет, он опциональный. Без dz конвейер работает ровно как раньше, просто без слоя памяти: не будет recall в начале и teach в конце. Наличие dz обнаруживается автоматически, требовать его установку пакет не станет.

Что делать, если ассистент выдал число без честной пометки?

Считать это дефектом документа и чинить: либо удалить число, либо измерить и поставить MEASURED с воспроизводителем, либо назвать оценкой ESTIMATED с основанием. Машинно найти такие места помогает dz claim-check docs/ --fail-on medium — порог именно medium, на high обычные непомеченные утверждения проходят насквозь.

Можно ли править скиллы explore, goap-research-ed25519 и problem-solver-enhanced внутри пака?

Технически можно, но правка не переживёт синхронизацию: это отслеживаемая копия, её канонический дом — пакет @dzhechkov/skills-analyst-manual, и расхождение подтягивается командой dz sync-upstream. Править нужно канонический источник.

Сколько времени занимает полный проход?

Режим MANUAL с девятью контрольными точками рассчитан на длинную сессию с участием человека — конвейер стоит, пока ты не ответишь. Если идея простая и цена ошибки низкая, разумнее не гонять полный путь: контрольные точки нужны там, где ошибка дорогая.

Что делать, если после установки слэш-команда не появилась?

Начни с npx @dzhechkov/skills-idea2prd doctor — он отвечает на вопрос «цела ли установка» раньше, чем ты начнёшь искать причину в ассистенте. Затем list, чтобы увидеть, что реально установлено в .claude/skills/.

Бесплатный интерактивный курс · aicoding.space

Лицензии шрифтов

Onest

Copyright 2021 The Onest Project Authors (https://github.com/googlefonts/onest)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

JetBrainsMono

Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.