| name | add-tool |
| description | Добавить новый инструмент (карточку) в ландшафт технологий 1С — разметка по методологии, связи, логотип, проверки. Use when the user asks to add a new tool/instrument/card to the landscape (добавить инструмент, новая карточка, принесли технологии). |
Добавление инструмента в ландшафт
Карточка живет в app/data.js (window.LANDSCAPE.items). Правила разметки — docs/METHODOLOGY.md (сверяйся с ним, ниже — выжимка). UI только русский, без буквы «ё».
1. Собери сведения
Имя (как принято в сообществе), сайт, репозиторий, что делает, зачем 1С-специалисту. Если пользователь принес список — у него могут быть подсказки по зрелости/происхождению, используй их, но проверяй по методологии.
2. Разметь 6 осей
- roles (массив) — кто «работает руками»:
разработчик / администратор (включая devops) / тестировщик / аналитик. Решения: производительность и СУБД — админ (исключение: анализ техжурнала — разработчик); юнит-тесты — разработчик; функциональные автотесты — тестировщик (+аналитик помогает сценариям); CI-серверы — А+Т+Р; API-клиенты — Р+Т (+Ан, если аналитики реально пользуются).
- contexts (массив):
франчайзи (простота, минимум инфраструктуры) / продукты (максимум современных практик) / проекты (крупные внедрения) / инхаус (самый широкий профиль).
- maturity (скаляр) — положение в экосистеме 1С, не общесофтовое:
базовое (обязан знать каждый) / продвинутое (профессиональный мейнстрим) / нишевое (узкие задачи; новые отечественные продукты и технически устаревшие — сюда).
- origin:
отечественное / зарубежное — по родине технологии (ClickHouse — отечественное).
- license:
open-source (по основному продукту) / бесплатное (закрытый код, бесплатно; или платный сервис с рабочим бесплатным тарифом — GitHub, Jira) / проприетарное.
- availability:
ограничен — вендор ушел из РФ, заблокировал аккаунты или платный зарубежный продукт, который из РФ не купить; рабочий из РФ бесплатный тариф = доступен. Проверь «соседей» вендора: у JetBrains/HashiCorp/Atlassian/Microsoft/Amazon все продукты должны быть размечены одинаково.
Значения должны точно совпадать с axes.<ось>.values в data.js — иначе фильтр не сработает (проверит validate.js).
3. Категория и подкатегория
Категория — только из LANDSCAPE.categories. Подкатегорию смотри у соседей по категории (выгрузи их: node -e со списком category/subcategory). Если карточка не ложится в существующие подгруппы — оставь subcategory: null (на схеме такие рисуются сверху колонки). Новую подкатегорию заводи, только когда в ней будет ≥2 карточек.
Пороги ёмкости (жёсткие, проверяет validate.js): подкатегория — не более 9 инструментов (бакет «без подкатегории» тоже считается); раздел (blocks) — не более 6 категорий. Если новая карточка переполняет подкатегорию — разбей группу на подкатегории; если в подходящий раздел не влезает новая категория — заведи новый раздел. Подробнее — docs/METHODOLOGY.md («Ёмкость подкатегорий и разделов»).
4. Тексты
description — одна строка, что это; why — зачем 1С-нику, конкретная польза. Оба без точки в конце, без «ё» (проверяет validate.js).
aliases — скрытые поисковые синонимы: русские транслитерации и разговорные названия («мермейд», «тимсити»).
start — массив {label, url} ссылок «с чего начать», можно пустой.
5. Связи
analogs — двусторонние: добавил на новой карточке → добавь новую в analogs каждой указанной. Валидатор проверит и существование имен, и симметрию.
depends — односторонние (только у зависимой карточки).
6. Запись в data.js
Мелкие правки — через редактор (./start.command → кнопка «Сохранить» сама пишет файл и прогоняет cachebust). Программно — либо точечные текстовые вставки, либо полная пересериализация строго канонично, как editor.js: JSON.stringify(D, null, 2) без umbrella и без пустых analogs/depends (файл хранится в этой канон-форме, validate.js проверяет совпадение байт-в-байт). Формат: JSON с 2-пробельным отступом, объекты items с отступом 4, поля 6, элементы массивов 8. Вставка новой карточки — перед \n ]\n}; в конце файла:
const obj = JSON.stringify(card, null, 2).split("\n")
.map((l, k) => (k ? " " + l : l)).join("\n");
src = src.slice(0, tailAt) + ",\n " + obj + src.slice(tailAt);
Дописывание в массив существующей карточки — найди сегмент по "name": <json-имя> до следующего "name": ", замени regex-ом ("roles": \[)([\s\S]*?)(\n {6}\]) → `${m[1]}${m[2]},\n ${JSON.stringify(value)}${m[3]}` — не теряй ${m[3]} (закрывающую скобку). Поля может не быть вовсе (редактор не пишет пустые массивы) — тогда вставь его перед закрытием объекта.
Даты карточки (ISO YYYY-MM-DD): у новой карточки задай и added, и updated = сегодня. При ручной правке существующей карточки обнови её updated на сегодня (редактор делает это сам; программно — не забудь). validate.js требует корректные added/updated у каждой карточки и updated >= added.
При ручной правке обнови и LANDSCAPE.updated (дата файла) на сегодняшнюю дату («11 июня 2026» — без нулей, месяц родительным падежом).
7. Логотип
Источники по убыванию удобства (проверять curl-ом, что пришел настоящий SVG/PNG, а не HTML-страница 404):
https://cdn.simpleicons.org/<slug> — отдает SVG в фирменном цвете;
https://cdn.jsdelivr.net/gh/gilbarbara/logos@master/logos/<name>.svg (есть варианты <name>-icon.svg);
- официальный сайт:
/favicon.svg, /icon.svg, логотип со страницы;
- Wikimedia API:
commons.wikimedia.org/w/api.php?action=query&list=search&srnamespace=6.
Файл — в app/logos/, имя маленькими буквами через дефис, SVG предпочтительнее PNG. В карточке logo: "имя.svg"; темный монохромный логотип — "logoInvert": true (движок инвертирует в темной теме). Не нашелся — logo: null (заглушка «1С»), скажи об этом пользователю.
8. Проверки и коммит
node scripts/validate.js
node scripts/cachebust.js
Смоук без скриншотов (визуал проверяет пользователь): страница должна открываться без ошибок консоли, карточка находиться поиском, модалка показывать категорию · подкатегорию. Коммит в стиле репозитория: Данные: <что добавлено> (<новое число карточек>), подпись Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>.