-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial 2 How the Code Works ru
Цель: понять горстку проектных решений, которые делают этот проект простым — и безопасным — для изменения с ИИ-агентом. Запоминать код не нужно; нужна ментальная модель, чтобы точно направлять агента.
← Назад: Урок 1 Ориентация · Далее: Урок 3 Ваша первая задача для агента
lockedin-cli/
├── bin/lockedin.js # точка входа — ЕДИНСТВЕННАЯ часть, делающая ввод/вывод
├── src/lockedin.js # ядро — чистые функции, возвращающие строки
├── test/
│ ├── unit.test.js # тестирует функции ядра напрямую
│ └── cli.test.js # запускает настоящий бинарник и проверяет его вывод
├── tools/screenshot.js # рендерит SVG, которые вы видите в docs/
└── package.json # метаданные + скрипт `npm test`
Четыре идеи заставляют это работать. Изучите их, и вы сможете попросить агента почти о любом изменении с уверенностью.
Откройте src/lockedin.js. Обратите внимание, что функции рендеринга не
печатают — они возвращают строки:
function renderConnect() {
const names = shuffle(NAMES).slice(0, 6);
// ...собирает массив строк...
return out.join('\n'); // возвращает текст; ничего не печатает
}Вся реальная печать (и чтение ваших нажатий) происходит в bin/lockedin.js. Это
разделение «ядро возвращает данные, край делает I/O» — самая важная вещь
здесь, потому что функцию, которая просто возвращает строку, тривиально
тестировать:
const out = app.renderConnect();
assert.ok(out.includes("“Буду рад(а) добавить вас в свою professional network.” — отправлено "));Никакого мока терминала, никакого захвата stdout. Когда вы просите агента добавить функцию, именно поэтому он может добавить и быстрый, надёжный тест для неё.
Шутки живут в простых массивах ближе к началу src/lockedin.js:
const HOOKS = [ 'Непопулярное мнение:', 'Пусть это осядет.', /* ...~25 всего... */ ];
const LESSONS = [ '→ Ваш нетворк — ваш net worth.', /* ... */ ];Генераторы выбирают из этих пулов. В v1.2.0 каждый пул вырос до ~25 вариаций,
и был добавлен второй слой пулов шаблонов (такие как POST_REVEALS и
REFLECT_TAGSETS), чтобы структура каждого вывода варьировалась, а не только
слова. Добавление контента часто так же просто, как добавление строк в массив —
идеальная первая задача для передачи агенту.
Случайный вывод и автоматические тесты звучат несовместимо. Этот проект решает эту дилемму с помощью генератора случайных чисел с seed:
setSeed(42);
const a = generatePost();
setSeed(42);
const b = generatePost();
// a === b → тот же seed, тот же постКаждый случайный выбор проходит через общие помощники pick() / shuffle(),
которые черпают из этого генератора с seed. Задайте LOCKEDIN_SEED=42, и CLI
полностью воспроизводим. Золотое правило для любого изменения: новая случайность
должна использовать pick / shuffle, никогда Math.random напрямую — иначе
детерминизм (и тесты) ломаются. Держите это под рукой; вы напомните об этом агенту
в Главе 3.
-
test/unit.test.jsвызывает функции ядра и утверждает о строках, которые они возвращают (быстро, точно). -
test/cli.test.jsреально запускаетbin/lockedin.jsи проверяет его настоящий stdout и код выхода (доказывает, что всё работает от начала до конца).
Вместе они — барьер. Они также кодируют инварианты — обещания, которые даёт
приложение. Например, пост всегда открывается известным hook-ом и всегда содержит
хотя бы три → урока; экран «connect» всегда говорит incalculable. Когда агент
меняет код, эти тесты ловят всё, что тихо нарушило обещание.
Сложите четыре идеи вместе, и вы получите код, в котором агент может:
- Добавить функцию как чистую функцию, возвращающую строку,
- Добавить тест для неё без всякой гимнастики с I/O,
- Сохранить вывод воспроизводимым через генератор с seed, и
- Доказать, что ничего не сломал, запустив существующий барьер.
Это цикл, который вы прогоните в следующей главе.
Попросите агента проверить ваше понимание — читая, не редактируя:
- «Перечисли каждый пул контента в
src/lockedin.jsи сколько записей в каждом.» - «Покажи мне один инвариант, который
test/unit.test.jsобеспечивает дляgeneratePost, и объясни, что бы его сломало.» - «Где определён генератор с seed, и какие функции должны использовать его
вместо
Math.random? Ничего не меняй — просто объясни.»
Когда ответы агента совпадут с этой главой, вы готовы строить.
Tutorial
- 1 · Orientation
- 2 · How the Code Works
- 3 · Your First Agent Task
- 4 · Prompting & Reviewing
- 5 · Localization
Reference
Satire · Sátira · 風刺. Not affiliated with LinkedIn. GPL-3.0-or-later.