-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial 2 How the Code Works ja
ゴール: このプロジェクトがAIエージェントにとって変更しやすく、そして安全で あるための、いくつかの設計判断を理解すること。コードを暗記する必要はありません。 エージェントに正確な指示を出すための「地図」を頭に入れるのが目的です。
← 前へ: チュートリアル1 オリエンテーション · 次へ: チュートリアル3 はじめてのエージェントタスク
lockedin-cli/
├── bin/lockedin.js # エントリポイント — 入出力を行う唯一の場所
├── src/lockedin.js # コア — 文字列を返すだけの純粋関数
├── test/
│ ├── unit.test.js # コアの関数を直接テストする
│ └── cli.test.js # 実際のバイナリを起動し、出力を検証する
├── tools/screenshot.js # docs/ にあるSVGを生成する
└── package.json # メタデータと `npm test` スクリプト
このプロジェクトを支えているのは4つの考え方です。これさえ押さえれば、 たいていの変更は自信を持ってエージェントに頼めます。
src/lockedin.js を開いてみてください。描画(render)系の関数は
出力しません。文字列を返すだけです。
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("「私のプロのネットワークに加えたいです。」— 送信先:"));ターミナルのモックも、標準出力のキャプチャも要りません。エージェントに機能追加を 頼んだとき、実装と一緒に速くて安定したテストまで書けるのは、この設計のおかげです。
ジョークの中身は、src/lockedin.js の先頭付近にある素朴な配列に入っています。
const HOOKS = [ '不人気な意見ですが:', 'この言葉を、心に染み込ませてください。', /* ...全部で約25個... */ ];
const LESSONS = [ '→ あなたの人脈こそが、あなたの純資産。', /* ... */ ];ジェネレータは、このプールから要素を選びます。v1.2.0 で各プールは約25種類まで
増え、さらにテンプレート用のプール(POST_REVEALS や REFLECT_TAGSETS など)
という2層目が追加されました。これにより、言葉だけでなく出力の構造そのものが
変化します。コンテンツの追加は配列に文字列を足すだけで済むことも多く、
エージェントに任せる最初のタスクとして最適です。
ランダムな出力と自動テストは、一見すると両立しません。このプロジェクトは シードを指定できる乱数生成器でその矛盾を解消しています。
setSeed(42);
const a = generatePost();
setSeed(42);
const b = generatePost();
// a === b → 同じシードなら、同じ投稿ランダムな選択はすべて、共有ヘルパーの pick() / shuffle() を経由し、
このシード付き生成器から値を取ります。LOCKEDIN_SEED=42 を設定すれば、
CLIの出力は完全に再現可能になります。変更を加えるときの鉄則は、新しい乱数も
必ず pick / shuffle を使い、Math.random を直接呼ばないこと。
これを破ると決定性が壊れ、テストも落ちます。第3章でエージェントに念を押す場面が
あるので、覚えておいてください。
-
test/unit.test.jsはコアの関数を呼び、返ってきた文字列を検証します (速くて、狙いが正確)。 -
test/cli.test.jsは実際にbin/lockedin.jsを起動し、本物の標準出力と 終了コードを確認します(全体が通しで動くことの証明)。
この2つが揃って「ゲート」になります。さらにこれらは、アプリが守ると約束した
不変条件を記録したものでもあります。たとえば、投稿は必ず既知のフックで始まり、
→ で始まる教訓を必ず3つ以上含む。connectの画面には必ず incalculable が出る。
エージェントがコードを変更したとき、こっそり壊れた約束をこのテストが捕まえます。
4つの考え方を組み合わせると、エージェントは次のように動けます。
- 文字列を返す純粋関数として、機能を追加する
- I/Oの小細工なしに、そのテストを追加する
- シード付き乱数によって、出力を再現可能に保つ
- 既存のゲートを実行して、何も壊していないことを証明する
次の章では、まさにこのループを回します。
理解の確認をエージェントに手伝ってもらいましょう。読むだけで、編集はさせません。
- 「
src/lockedin.jsにあるコンテンツプールをすべて列挙し、それぞれ何件 入っているか教えてください。」 - 「
test/unit.test.jsがgeneratePostについて強制している不変条件を1つ挙げ、 何をすればそれが壊れるか説明してください。」 - 「シード付き乱数はどこで定義されていますか?
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.