-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial 3 Your First Agent Task ja
ゴール: エージェントに指示して、CLIに新しいコマンドを最初から最後まで
追加すること。ここでは lockedin endorse を作ります。まったく面識のない相手を、
本人が持っていそうにないスキルで推薦(endorse)するコマンドです。実にこのCLIらしい。
ここがチュートリアルの中心です。実際のループ——仕様 → テスト → 実装 → ゲートが緑 → レビュー——を練習します。
← 前へ: チュートリアル2 コードのしくみ · 次へ: チュートリアル4 プロンプトとレビュー
プロンプトを書く前に、まず自分の言葉で仕様を書きます。曖昧な依頼からは曖昧なコードしか 出てきません。相手が人間でも、エージェントでも同じです。
endorseは5〜7行を出力する。各行は、ランダムに選んだ人物(既存のNAMESプールを再利用)を、ランダムに選んだバズワードのスキル(新しいプール)で 推薦する内容とする。最後は風刺の効いた一言で締める。lockedin endorseとして 実行でき、セッション内では/endorseとして使え、helpにも表示されること。 乱数はすべてシード付きのpick/shuffleヘルパーを使い、出力が決定的であること。npm testは緑のままで、不変条件を1つ以上固定する新しいテストを追加すること。
この段落こそが、エージェントに渡すものです。第2章で学んだ制約(シード付き乱数、 テストゲート、不変条件を書く習慣)が、きちんと明記されている点に注目してください。
最初は計画を聞くところから。ファイルが1つも変わらないうちに、まずい方針を 止められる貴重なタイミングです。
「LockedIn CLIに
endorseコマンドを追加したいです。仕様はこちらです: [paste your spec]。コードを書く前に、どのファイルをどう変更するつもりか、 方針を教えてください。承認してから進めたいです。connectのような既存コマンドの パターンに従ってください。」
良い計画には、次の要素が入っているはずです。src/lockedin.js に新しい SKILLS
プールと renderEndorse() を追加し、dispatch() と handleSlash() に接続し、
renderHelp() に1行足し、追加したものを module.exports に載せ、両方のテスト
ファイルにテストを書く。もしシード付き乱数のルールやテストが抜けていたら、
この時点で指摘してください。
実装より先にテストを書かせます。テストファーストは、仕様を実行可能な形に変え、 エージェントに近道をさせないための仕掛けです。
「いいですね。まずは失敗するテストだけを追加してください。
renderEndorse()が 既知のスキル名を含み、推薦が5件以上あるテキストを返すというユニットテストと、lockedin endorseが終了コード0で推薦を出力するというcli.test.jsのテストです。 シードは固定してください。renderEndorseの実装はまだしないでください。 まずテストが落ちるところを見たいです。」
実行して、正しい理由で(=関数がまだ存在しないから)落ちることを確認します。
npm testここでようやく実装にGOを出します。
「では、そのテストが通るように実装してください。
connectのパターンに従います。 バズワード系スキルを約25個入れたSKILLSプール、文字列を返すrenderEndorse()を追加し、dispatchとhandleSlashに接続し、helpに1行足して、追加したものを エクスポートしてください。乱数はpick/shuffleのみを使ってください。」
エージェントの成果物は、ファイルの他の部分とよく似た見た目になるはずです。
たとえば SKILLS プールとレンダラーはこんな形です。
const SKILLS = [
'ソートリーダーシップ', 'シナジー', 'ストーリーテリング', 'バイブス',
'戦略的昼寝', 'ステークホルダー調整', '徹底的な率直さ', /* ...全部で約25個... */
];
function renderEndorse() {
const people = shuffle(NAMES).slice(0, 5 + Math.floor(rand() * 3)); // 5〜7
const skills = shuffle(SKILLS);
const out = [''];
people.forEach((n, i) =>
out.push(' ✔ ' + n + ' を「' + skills[i % skills.length] + '」で推薦しました'));
out.push('', ' 確認できないスキルについて、見知らぬ6人を推薦しました。1時間以内に相手もあなたを推薦します。');
return out.join('\n');
}……これに加えて、dispatch() と handleSlash() に1行ずつ、renderHelp() に1行、
そして module.exports に SKILLS, renderEndorse が追加されます。
npm test緑になりましたか? おめでとうございます。エージェントと一緒に、テストファーストで 機能を1つ出荷しました。緑にならない? それは普通のことです。第4章の 立て直しループへ進み、何がどう失敗したのかを正確にエージェントへ伝えましょう。
そのあとは、実物を自分の目で見ます(テストは文字列を確認するだけなので、 見る工程は人間の仕事です)。
node bin/lockedin.js endorse
LOCKEDIN_SEED=1 node bin/lockedin.js endorse # 再現可能読んでいない差分を受け入れてはいけません。特に次の観点で目を通します。
-
既存パターンに従っているか? 新しいコマンドは
connectを写したような形に なっているはずです。依存の追加なし、src/の中にconsole.logなし。 -
シード付き乱数だけを使っているか? 差分から
Math.randomを検索します。 1件も出てこないのが正解です。 - 触るべきでない場所を触っていないか? 変更は追加が中心であるべきで、 無関係な行が動いていたら要注意です。
-
新しいテストは意味があるか? 将来その機能を壊したときに、ちゃんと落ちる
テストであるべきです。
trueを検証するだけのテストでは意味がありません。
気になる点があれば修正を依頼します(第4章)。問題なければ、これで完了です。
まずは上のループを、実際に最後まで回してみてください。そのうえで、 発展課題としてエージェントに拡張を頼んでみましょう。
- 「
endorseが名前を任意の引数として受け取れるようにしてください。lockedin endorse Adaなら Ada を名指しで推薦します。テストも追加し、 ゲートは緑のまま維持してください。」
これで機能を1つ、通しで作り上げました。最後の章では、この一連の流れを なめらかに回すコツ——リードエンジニアとしてのプロンプトとレビュー——を扱います。
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.