new-agent について
Boring app に機能を追加する開発スキルです。エージェント、ツール、ジョブ、チャット、ビュー、ページの定義や、マニフェストでの公開、変更の検証方法を説明します。
主な機能
- 01エージェントと出力契約の定義
- 02サンドボックスまたはサーバーツールの追加
- 03ジョブとチャットの構成
- 04ビューとページの登録
- 05テストと検証の実行
活用シーン
- 01アプリへのエージェント機能の追加
- 02ハブへのツール公開
- 03データに結び付くビューの作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ hachej/ boring-stack --skill new-agentインストール後、Claude Code で/new-agentを入力して読み込まれたか確認します。
詳細
Boring アプリに機能を追加する
アプリは機能プロバイダーです(hachej/boring-app)。機能フォルダーはすべて任意で、ハブが使用できる機能は boring.json で宣言します。**定義を追加し、ハブから呼び出せるようにする必要がある場合にのみ boring.json に追加してください。**宣言されていない定義は内部用です。アプリ内では動作しますが、マニフェストには含まれません。
どの機能を選ぶか
| 必要なもの | 作成するもの | boring.json の exposes に宣言するもの |
|---|---|---|
| 契約を持つ単一のモデル呼び出し | agents/<name>/agent.md(+ rules.md、tool.json) | ハブから呼び出す場合は agents.<name>: "<one line>" |
| ライフサイクルを持つ複数のエージェント(複数の部分から結果を生成) | agents/<name>/JOB.md + index.mjs(plan、collect) | jobs.<name> |
| 1つのエージェントと履歴を持つチャット | agents/<name>/CHAT.md(+ 任意の index.mjs の context) | chats.<name> |
| エージェントまたはハブが呼び出す純粋関数 | tools/<name>/tool.json(runtime: sandbox)+ tools/<name>/index.js | tools.<name>: { runtime, description } |
| データベース、ネットワーク、またはシークレットが必要な関数 | tools/<name>/tool.json(runtime: server)+ server/src/tools/<name>.ts | tools.<name> |
| ハブが表示できるデータにバインドされたコンポーネント | web/src/views/<name>/index.tsx(+ web/src/main.tsx に登録) | views.<name>: { shows, description } |
| アプリ独自の画面 | web/src/pages/<name>/index.tsx | pages.<name> |
ほとんどの機能はエージェントだけで実現できます。複数のエージェントをライフサイクルに沿って連携させる場合にのみジョブを追加し、複数のターンにわたって人がエージェントと会話する場合にのみチャットを追加してください。名前は agents/ 内で一意である必要があります。
エージェント
agents/<name>/
agent.md front matter + system prompt (the body)
rules.md the owner's rules, read-only in Settings; they change by pull request
tool.json only when output: tool: { name, description, input: JSON schema } (the output schema)
index.mjs optional: buildMessage(input), validate(output), asText(output); then the agent needs server/
agent.md のフロントマター:name(フォルダー名)、title、description、model(openai-codex/<model>)、effort、max_tokens、output(tool または markdown)、helper_tools: [<tool names>](宣言済みのツールのみ)、inputs:(name: { type, description, required })。
- 宣言型(
index.mjsなし):メッセージがルールと入力を定義します。Markdown 出力は空であってはならず、ツール出力にはtool.jsonの必須フィールドが含まれている必要があります。ハブはファイルだけを使って実行できます。 - コードあり:
validate(output)は、保存前にランタイムが適用する契約です(APP-B4)。モデル宛てのメッセージとともに、agents/_shared/validate.mjsのfail("…")で拒否してください。 - モックモデル(
server/src/fake-models.ts)は Markdown エージェントに応答します。ツールエージェントにはスクリプト化された応答を追加してください。そうしないと、そのテストを実行できません。 - Cloudflare アプリ(
project.mdのruntime: cloudflare)ではエージェントランタイムを実行しません。エージェントは宣言型のままにし、ハブで実行します。エージェントまたはチャットにindex.mjsを置くことはできず、ジョブも使用できません。verify checkはこれらを拒否します。
ツール
- サンドボックス:
tools/<name>/index.jsでfunction run(input, ops)を定義します。インポート、Node API、ネットワーク API を使わないプレーンな JavaScript とし、tool.jsonのoperationsに記載されたops.<name>のみを使用します。それ以外はverify checkによって拒否されます。 - サーバー:
server/src/tools/<name>.tsでhandler(input, { db })をエクスポートします。zod で入力を検証し、すべてのクエリをawaitしてください(同じコードが SQLite と D1 の両方で実行されます)。Cloudflare アプリでは Node API を使用しません(worker-portableルール)。 tool.json:description、runtime、input、outputの JSON スキーマ。
データ、ルート、Web
- テーブルを追加する場合:
server/src/db/schema.tsを編集し、次にnpm run db:generateを実行して、server/drizzle/をコミットします(drizzle-kit pushは決して使わないでください)。書き込み処理では、編集の基準にしたリビジョンを指定します(APP-B3。server/src/routes/memories.tsが例です)。 - ルートを追加する場合:
server/src/routes/<name>.ts(Hono +zValidator)を作成し、server/src/app.tsにマウントします。 - Web からサーバーへのアクセスには、必ず
web/src/lib/api.tsを使用します(呼び出しはweb/src/lib/model.tsに記述します)。
テストと検証
- ユニットテスト(
npm test):アプリを通したルートとツール (test/unit/app.test.mjs)、コードを持つエージェントの契約です。 - エンドツーエンドテスト(
test/e2e/journey.spec.mjs):利用者が何か新しいものを目にするときに実施します。 node scripts/verify.mjs checkを実行し、その後 verify-app スキルを使って操作します。- 機能マップ:利用者ができることを記した
docs/verify/内のエリアファイルです。
禁止事項
- 誤って何かを公開しないでください。公開するものは宣言し、それ以外は内部に留めてください。
- ランタイムの外部からモデルを呼び出したり、サンドボックスツールにインポートを渡したりしないでください。
vendor/を編集しないでください。
コメント
Markdown 対応