Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add j5ik2o/okite-ai --skill domain-model-firstgit clone --depth 1 https://github.com/j5ik2o/okite-aiWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/j5ik2o/okite-ai/domain-model-first)<a href="https://agentmods.dev/skills/j5ik2o/okite-ai/domain-model-first"><img src="https://agentmods.dev/badge/skills/j5ik2o/okite-ai/domain-model-first/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/j5ik2o/okite-ai/domain-model-first"><img src="https://agentmods.dev/badge/skills/j5ik2o/okite-ai/domain-model-first.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00133 | $0.02499 |
| Opus 5 | $0.00067 | $0.01249 |
| Sonnet 5 | $0.00027 | $0.00500 |
| Haiku 4.5 | $0.00013 | $0.00250 |
Grade A, and why
domain-model-first scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 240 lines — stays where its author put it; the contents beside it link to each section on GitHub.
ドメインモデル中心の開発手順
このガイドは特定のプログラミング言語に依存せず、どの言語でも適用可能な原則を説明しています。コード例はTypeScriptで示していますが、概念は他の言語にも応用できます。
テストファーストのドメインモデル設計・実装
目的
外部依存に左右されない純粋なドメインロジックを実装する。
具体的な手順
- ドメインモデルの振る舞いをテストとして定義
- モデルが持つべき機能と制約を明確にする
- エッジケースも含めて考慮する
- テストを満たすドメインモデルの実装
- テストが示す仕様に従って実装
- 値オブジェクト、エンティティ、集約の設計原則に従う
- リファクタリングによる設計の洗練
- コードの重複排除
- 責務の明確化と分離
- 命名の改善
メリット
- 仕様の明確化と要件の理解促進
- 設計品質の向上(責務分離・凝集度向上)
- リファクタリングの安全性確保
- エッジケースの早期発見
- ドキュメントとしての価値
テスト例
// Taskのテスト例
describe("Task", () => {
it("タスクが完了しているかどうかを確認できる", () => {
const taskId = TaskId.of("task-1");
const title = TaskTitle.of("テストタスク");
const task = Task.of({
id: taskId,
title: title,
completed: false,
createdAt: new Date("2023-03-01T10:00:00")
});
expect(task.isCompleted()).toBe(false);
const completedTask = task.markAsCompleted();
expect(completedTask.isCompleted()).toBe(true);
});
it("期限日が未来の日付であることを検証できる", () => {
const pastDate = new Date();
pastDate.setDate(pastDate.getDate() - 1); // 昨日の日付
const result = Task.validateDueDate(pastDate);
expect(result.isFailure()).toBe(true);
expect(result.error.message).toContain("期限は未来の日付である必要があります");
});
});
インメモリリポジトリの実装
目的
- データベースに依存せず、ドメインモデルとユースケースのテスト実行を可能にする
具体的な手順
- リポジトリインタフェースの定義
- ドメインモデルで必要な操作を定義
- インメモリ実装の作成
- メモリ上のコレクションを使用
- 実際のデータベースの振る舞いをシミュレート
ユースケース開発
目的
- アプリケーション層のロジックをドメインモデルとリポジトリを使って実装
具体的な手順
- ユースケースのテストを定義
- 実行条件と期待結果を明確に
- 成功ケースと失敗ケースの両方をカバー
- テストを満たすユースケースを実装
- 適切なドメインモデルとリポジトリの利用
- ビジネスルールの適用
- リファクタリング
- 責務の分離と明確化
テスト例
describe("CompleteTaskUseCase", () => {
let taskRepository: TaskRepositoryInMemory;
let completeTaskUseCase: CompleteTaskUseCase;
beforeEach(() => {
taskRepository = new TaskRepositoryInMemory();
const task1 = Task.of({
id: TaskId.of("task-1"),
title: TaskTitle.of("未完了タスク"),
completed: false,
createdAt: new Date("2023-03-01T10:00:00"),
});
const task2 = Task.of({
id: TaskId.of("task-2"),
title: TaskTitle.of("既に完了しているタスク"),
completed: true,
createdAt: new Date("2023-03-01T13:00:00"),
});
taskRepository.save(task1);
taskRepository.save(task2);
completeTaskUseCase = new CompleteTaskUseCase(taskRepository);
});
it("タスクを完了できる", async () => {
const result = await completeTaskUseCase.execute({
taskId: "task-1",
});
expect(result.isSuccess()).toBe(true);
const updatedTask = await taskRepository.findById(TaskId.of("task-1"));
expect(updatedTask.isSuccess()).toBe(true);
expect(updatedTask.value.isCompleted()).toBe(true);
});
it("存在しないタスクを処理できる", async () => {
const result = await completeTaskUseCase.execute({
taskId: "non-existent",
});
expect(result.isFailure()).toBe(true);
expect(result.error.message).toContain("タスクが見つかりません");
});
});
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago First seen · 240 lines · 133 tokens per session scan A ab35e65a79fa
domain-model-first is a skill published in the GitHub repository j5ik2o/okite-ai (81 stars, last pushed 4mo ago), licensed MIT. It adds 133 tokens to every session and 2,499 once invoked, about $0.0007 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-01.
Other skills, from other repositories
server-side-calls
Call tRPC procedures directly from server code using t.createCallerFactory() and router.createCaller(context) for integration testing, internal server logic, and custom API endpoints. Catch TRPCError and extract HTTP status with getHTTPStatusCodeFromError(). Error handling via onError option.
nw-fp-domain-modeling
Domain modeling with algebraic data types, smart constructors, and type-level error handling.
nw-fp-hexagonal-architecture
Hexagonal architecture patterns with pure core and side-effect shell for functional codebases.
django-tdd
Django testing strategies with pytest-django, TDD methodology, factoryboy, mocking, coverage, and testing Django REST Framework APIs.
django-tdd
Django testing strategies with pytest-django, TDD methodology, factoryboy, mocking, coverage, and testing Django REST Framework APIs.
springboot-tdd
Test-driven development for Spring Boot using JUnit 5, Mockito, MockMvc, Testcontainers, and JaCoCo. Use when adding features, fixing bugs, or refactoring.