Compact Memory Implementation
simbajigege/book2skills
A developer guide to adding compact memory to an agent: when to trigger compaction, how to fork a compactor sub-agent, what the summary holds, and how to restore it.
Build AI agents with Pydantic AI (Python) and Claude SDK (Node.js)
$ npx skills add alinaqi/maggy --skill agentic-development -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install alinaqi/maggy agentic-development --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/agentic-development .claude/skills/agentic-development && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .claude/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/alinaqi/maggy/tree/main/skills/agentic-developmentType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add alinaqi/maggy --skill agentic-development -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install alinaqi/maggy agentic-development --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/agentic-development .agents/skills/agentic-development && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .agents/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add alinaqi/maggy --skill agentic-development -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install alinaqi/maggy agentic-development --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/agentic-development .cursor/skills/agentic-development && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .cursor/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/alinaqi/maggy.git --path skills/agentic-development--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add alinaqi/maggy --skill agentic-development -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install alinaqi/maggy agentic-development --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/agentic-development .gemini/skills/agentic-development && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .gemini/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install alinaqi/maggy agentic-developmentInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add alinaqi/maggy --skill agentic-development -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/agentic-development .github/skills/agentic-development && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .github/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add alinaqi/maggy --skill agentic-development -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install alinaqi/maggy agentic-development --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/alinaqi/maggy.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/agentic-development .opencode/skills/agentic-development && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agentic-development" agent skill from https://github.com/alinaqi/maggy/tree/main/skills/agentic-development into .opencode/skills/agentic-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-development", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agentic-developmentBuild AI agents with Pydantic AI (Python) and Claude SDK (Node.js)
Agentic Development is an agent skill from alinaqi/maggy. Build AI agents with Pydantic AI (Python) and Claude SDK (Node.js)
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in AI & LLM Engineering. It works with Pydantic AI, Python, Node.js and Anthropic API. The repository describes itself as: What started as an opinionated Claude Code setup kit is now an autonomous AI engineering command center. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 72a456e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript, python and markdown).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.search.comAlso links to:
docs.anthropic.comanthropic.comai.pydantic.devdevelopers.googleblog.comdevelopers.openai.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agentic Development loads about 5.9k tokens when it runs. Until then it costs about 22 tokens; SKILL.md has 431 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from alinaqi/maggy at commit 72a456e, republished under its MIT licence (© alinaqi). 431 words, ~5,877 tokens.
.claude/skills/agentic-development/SKILL.md (or your agent's skills folder).For building autonomous AI agents that perform multi-step tasks with tools.
Sources: Claude Agent SDK | Anthropic Claude Code Best Practices | Pydantic AI | Google Gemini Agent Development | OpenAI Building Agents
| Language/Framework | Default | Why |
|---|---|---|
| Python | Pydantic AI | Type-safe, Pydantic validation, multi-model, production-ready |
| Node.js / Next.js | Claude Agent SDK | Official Anthropic SDK, tools, multi-agent, native streaming |
from pydantic_ai import Agent
from pydantic import BaseModel
class SearchResult(BaseModel):
title: str
url: str
summary: str
agent = Agent(
'claude-sonnet-4-6',
result_type=list[SearchResult],
system_prompt='You are a research assistant.',
)
# Type-safe result
result = await agent.run('Find articles about AI agents')
for item in result.data:
print(f"{item.title}: {item.url}")import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
// Define tools
const tools: Anthropic.Tool[] = [
{
name: "web_search",
description: "Search the web for information",
input_schema: {
type: "object",
properties: {
query: { type: "string", description: "Search query" },
},
required: ["query"],
},
},
];
// Agentic loop
async function runAgent(prompt: string) {
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: prompt },
];
while (true) {
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 4096,
tools,
messages,
});
// Check for tool use
if (response.stop_reason === "tool_use") {
const toolUse = response.content.find((b) => b.type === "tool_use");
if (toolUse) {
const result = await executeTool(toolUse.name, toolUse.input);
messages.push({ role: "assistant", content: response.content });
messages.push({
role: "user",
content: [{ type: "tool_result", tool_use_id: toolUse.id, content: result }],
});
continue;
}
}
// Done - return final response
return response.content.find((b) => b.type === "text")?.text;
}
}Plan first, act incrementally, verify always.
Agents that research and plan before executing consistently outperform those that jump straight to action. Break complex tasks into verifiable steps, use tools judiciously, and maintain clear state throughout execution.
┌─────────────────────────────────────────────────┐
│ AGENT │
├─────────────────────────────────────────────────┤
│ Model (Brain) │ LLM for reasoning & │
│ │ decision-making │
├─────────────────────┼───────────────────────────┤
│ Tools (Arms/Legs) │ APIs, functions, external │
│ │ systems for action │
├─────────────────────┼───────────────────────────┤
│ Instructions │ System prompts defining │
│ (Rules) │ behavior & boundaries │
└─────────────────────┴───────────────────────────┘project/
├── src/
│ ├── agents/
│ │ ├── orchestrator.ts # Main agent coordinator
│ │ ├── specialized/ # Task-specific agents
│ │ │ ├── researcher.ts
│ │ │ ├── coder.ts
│ │ │ └── reviewer.ts
│ │ └── base.ts # Shared agent interface
│ ├── tools/
│ │ ├── definitions/ # Tool schemas
│ │ ├── implementations/ # Tool logic
│ │ └── registry.ts # Tool discovery
│ ├── prompts/
│ │ ├── system/ # Agent instructions
│ │ └── templates/ # Task templates
│ └── memory/
│ ├── conversation.ts # Short-term context
│ └── persistent.ts # Long-term storage
├── tests/
│ ├── agents/ # Agent behavior tests
│ ├── tools/ # Tool unit tests
│ └── evals/ # End-to-end evaluations
└── skills/ # Agent skills (Anthropic pattern)
├── skill-name/
│ ├── instructions.md
│ ├── scripts/
│ └── resources/// Gather context before acting
async function explore(task: Task): Promise<Context> {
const relevantFiles = await agent.searchCodebase(task.query);
const existingPatterns = await agent.analyzePatterns(relevantFiles);
const dependencies = await agent.identifyDependencies(task);
return { relevantFiles, existingPatterns, dependencies };
}// Plan explicitly before execution
async function plan(task: Task, context: Context): Promise<Plan> {
const prompt = `
Task: ${task.description}
Context: ${JSON.stringify(context)}
Create a step-by-step plan. For each step:
1. What action to take
2. What tools to use
3. How to verify success
4. What could go wrong
Output JSON with steps array.
`;
return await llmCall({ prompt, schema: PlanSchema });
}// Execute with verification at each step
async function execute(plan: Plan): Promise<Result[]> {
const results: Result[] = [];
for (const step of plan.steps) {
// Execute single step
const result = await executeStep(step);
// Verify before continuing
if (!await verify(step, result)) {
// Self-correct or escalate
const corrected = await selfCorrect(step, result);
if (!corrected.success) {
return handleFailure(step, results);
}
}
results.push(result);
}
return results;
}// Independent verification prevents overfitting
async function verify(step: Step, result: Result): Promise<boolean> {
// Run tests if available
if (step.testCommand) {
const testResult = await runCommand(step.testCommand);
if (!testResult.success) return false;
}
// Use LLM to verify against criteria
const verification = await llmCall({
prompt: `
Step: ${step.description}
Expected: ${step.successCriteria}
Actual: ${JSON.stringify(result)}
Does the result satisfy the success criteria?
Respond with { "passes": boolean, "reasoning": string }
`,
schema: VerificationSchema
});
return verification.passes;
}// tools/definitions/file-operations.ts
import { z } from 'zod';
export const ReadFileTool = {
name: 'read_file',
description: 'Read contents of a file. Use before modifying any file.',
parameters: z.object({
path: z.string().describe('Absolute path to the file'),
startLine: z.number().optional().describe('Start line (1-indexed)'),
endLine: z.number().optional().describe('End line (1-indexed)'),
}),
// Risk level for guardrails (OpenAI pattern)
riskLevel: 'low' as const,
};
export const WriteFileTool = {
name: 'write_file',
description: 'Write content to a file. Always read first to understand context.',
parameters: z.object({
path: z.string().describe('Absolute path to the file'),
content: z.string().describe('Complete file content'),
}),
riskLevel: 'medium' as const,
// Require confirmation for high-risk operations
requiresConfirmation: true,
};// tools/implementations/file-operations.ts
export async function readFile(
params: z.infer<typeof ReadFileTool.parameters>
): Promise<ToolResult> {
try {
const content = await fs.readFile(params.path, 'utf-8');
const lines = content.split('\n');
const start = (params.startLine ?? 1) - 1;
const end = params.endLine ?? lines.length;
return {
success: true,
data: lines.slice(start, end).join('\n'),
metadata: { totalLines: lines.length }
};
} catch (error) {
return {
success: false,
error: `Failed to read file: ${error.message}`
};
}
}// Use platform-provided tools when available
const agent = createAgent({
tools: [
// Built-in tools (handled by platform)
{ type: 'web_search' },
{ type: 'code_interpreter' },
// Custom tools only when needed
{ type: 'function', function: customDatabaseTool },
],
});Use one agent for most tasks. Multiple agents add complexity.
// Expose specialized agents as callable tools
const researchAgent = createAgent({
name: 'researcher',
instructions: 'You research topics and return structured findings.',
tools: [webSearchTool, documentReadTool],
});
const mainAgent = createAgent({
tools: [
{
type: 'function',
function: {
name: 'research_topic',
description: 'Delegate research to specialized agent',
parameters: ResearchQuerySchema,
handler: async (query) => researchAgent.run(query),
},
},
],
});// One-way transfer between agents
const customerServiceAgent = createAgent({
tools: [
// Handoff to specialist when needed
{
name: 'transfer_to_billing',
description: 'Transfer to billing specialist for payment issues',
handler: async (context) => {
return { handoff: 'billing_agent', context };
},
},
],
});// memory/conversation.ts
interface ConversationMemory {
messages: Message[];
maxTokens: number;
add(message: Message): void;
getContext(): Message[];
summarize(): Promise<string>;
}
// Maintain state across tool calls (Gemini pattern)
interface AgentState {
thoughtSignature?: string; // Encrypted reasoning state
conversationId: string; // For shared memory
currentPlan?: Plan;
completedSteps: Step[];
}// memory/persistent.ts
interface PersistentMemory {
// Store learnings across sessions
store(key: string, value: any): Promise<void>;
retrieve(key: string): Promise<any>;
// Semantic search over past interactions
search(query: string, limit: number): Promise<Memory[]>;
}// guards/index.ts
interface GuardrailConfig {
// Input validation
inputClassifier: (input: string) => Promise<SafetyResult>;
// Output validation
outputValidator: (output: string) => Promise<SafetyResult>;
// Tool risk assessment
toolRiskLevels: Record<string, 'low' | 'medium' | 'high'>;
// Actions requiring human approval
humanInTheLoop: string[];
}
async function executeWithGuardrails(
agent: Agent,
input: string,
config: GuardrailConfig
): Promise<Result> {
// 1. Check input safety
const inputCheck = await config.inputClassifier(input);
if (!inputCheck.safe) {
return { blocked: true, reason: inputCheck.reason };
}
// 2. Execute with tool monitoring
const result = await agent.run(input, {
beforeTool: async (tool, params) => {
const risk = config.toolRiskLevels[tool.name];
if (risk === 'high' || config.humanInTheLoop.includes(tool.name)) {
return await requestHumanApproval(tool, params);
}
return { approved: true };
},
});
// 3. Validate output
const outputCheck = await config.outputValidator(result.output);
if (!outputCheck.safe) {
return { blocked: true, reason: outputCheck.reason };
}
return result;
}// Agent must stay within defined scope
const agentInstructions = `
You are a customer service agent for Acme Corp.
SCOPE BOUNDARIES (non-negotiable):
- Only answer questions about Acme products and services
- Never provide legal, medical, or financial advice
- Never access or modify data outside your authorized scope
- If a request is out of scope, politely decline and explain why
If you cannot complete a task within scope, notify the user
and request explicit approval before proceeding.
`;| Task Complexity | Recommended Model | Notes |
|---|---|---|
| Simple, fast | gpt-5-mini, claude-haiku | Low latency |
| General purpose | gpt-4.1, claude-sonnet | Balance |
| Complex reasoning | o4-mini, claude-opus | Higher accuracy |
| Deep planning | gpt-5 + reasoning, ultrathink | Maximum capability |
// Use thinking_level for reasoning depth
const response = await gemini.generate({
model: 'gemini-3',
thinking_level: 'high', // For complex planning
temperature: 1.0, // Optimized for reasoning engine
});
// Preserve thought state across tool calls
const nextResponse = await gemini.generate({
thoughtSignature: response.thoughtSignature, // Required for function calling
// ... rest of params
});// Trigger extended thinking with keywords
const thinkingLevels = {
'think': 'standard analysis',
'think hard': 'deeper reasoning',
'think harder': 'extensive analysis',
'ultrathink': 'maximum reasoning budget',
};
const prompt = `
Think hard about this problem before proposing a solution.
Task: ${task.description}
`;describe('readFile tool', () => {
it('reads file content correctly', async () => {
const result = await readFile({ path: '/test/file.txt' });
expect(result.success).toBe(true);
expect(result.data).toContain('expected content');
});
});describe('agent planning', () => {
it('creates plan before executing file modifications', async () => {
const trace = await agent.runWithTrace('Refactor the auth module');
// Verify planning happened first
const firstToolCall = trace.toolCalls[0];
expect(firstToolCall.name).toBe('read_file');
// Verify no writes without reads
const writeIndex = trace.toolCalls.findIndex(t => t.name === 'write_file');
const readIndex = trace.toolCalls.findIndex(t => t.name === 'read_file');
expect(readIndex).toBeLessThan(writeIndex);
});
});// Run nightly, not in regular CI
describe('Agent Accuracy (Eval)', () => {
const testCases = loadTestCases('./evals/coding-tasks.json');
it.each(testCases)('completes $name correctly', async (testCase) => {
const result = await agent.run(testCase.input);
// Verify against expected outcomes
expect(result.filesModified).toEqual(testCase.expectedFiles);
expect(await runTests(testCase.testCommand)).toBe(true);
}, 120000);
});project/
├── src/
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── researcher.py # Research agent
│ │ ├── coder.py # Coding agent
│ │ └── orchestrator.py # Main coordinator
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── web.py # Web search tools
│ │ ├── files.py # File operations
│ │ └── database.py # DB queries
│ ├── models/
│ │ ├── __init__.py
│ │ └── schemas.py # Pydantic models
│ └── deps.py # Dependencies
├── tests/
│ ├── test_agents.py
│ └── test_tools.py
└── pyproject.tomlfrom pydantic_ai import Agent, RunContext
from pydantic import BaseModel
from httpx import AsyncClient
class SearchResult(BaseModel):
title: str
url: str
snippet: str
class ResearchDeps(BaseModel):
http_client: AsyncClient
api_key: str
research_agent = Agent(
'claude-sonnet-4-6',
deps_type=ResearchDeps,
result_type=list[SearchResult],
system_prompt='You are a research assistant. Use tools to find information.',
)
@research_agent.tool
async def web_search(ctx: RunContext[ResearchDeps], query: str) -> list[dict]:
"""Search the web for information."""
response = await ctx.deps.http_client.get(
'https://api.search.com/search',
params={'q': query},
headers={'Authorization': f'Bearer {ctx.deps.api_key}'},
)
return response.json()['results']
@research_agent.tool
async def read_webpage(ctx: RunContext[ResearchDeps], url: str) -> str:
"""Read and extract content from a webpage."""
response = await ctx.deps.http_client.get(url)
return response.text[:5000] # Truncate for context
# Usage
async def main():
async with AsyncClient() as client:
deps = ResearchDeps(http_client=client, api_key='...')
result = await research_agent.run(
'Find recent articles about LLM agents',
deps=deps,
)
for item in result.data:
print(f"- {item.title}")from pydantic import BaseModel, Field
from pydantic_ai import Agent
class CodeReview(BaseModel):
summary: str = Field(description="Brief summary of the review")
issues: list[str] = Field(description="List of issues found")
suggestions: list[str] = Field(description="Improvement suggestions")
approval: bool = Field(description="Whether code is approved")
confidence: float = Field(ge=0, le=1, description="Confidence score")
review_agent = Agent(
'claude-sonnet-4-6',
result_type=CodeReview,
system_prompt='Review code for quality, security, and best practices.',
)
# Result is validated Pydantic model
result = await review_agent.run(f"Review this code:\n```python\n{code}\n```")
if result.data.approval:
print("Code approved!")
else:
for issue in result.data.issues:
print(f"Issue: {issue}")from pydantic_ai import Agent
# Specialized agents
planner = Agent('claude-sonnet-4-6', system_prompt='Create detailed plans.')
executor = Agent('claude-sonnet-4-6', system_prompt='Execute tasks precisely.')
reviewer = Agent('claude-sonnet-4-6', system_prompt='Review and verify work.')
async def orchestrate(task: str):
# 1. Plan
plan = await planner.run(f"Create a plan for: {task}")
# 2. Execute each step
results = []
for step in plan.data.steps:
result = await executor.run(f"Execute: {step}")
results.append(result.data)
# 3. Review
review = await reviewer.run(
f"Review the results:\nTask: {task}\nResults: {results}"
)
return review.datafrom pydantic_ai import Agent
agent = Agent('claude-sonnet-4-6')
async def stream_response(prompt: str):
async with agent.run_stream(prompt) as response:
async for chunk in response.stream():
print(chunk, end='', flush=True)
# Get final structured result
result = await response.get_data()
return resultimport pytest
from pydantic_ai import Agent
from pydantic_ai.models.test import TestModel
@pytest.fixture
def test_agent():
return Agent(
TestModel(), # Mock model for testing
result_type=str,
)
async def test_agent_response(test_agent):
result = await test_agent.run('Test prompt')
assert result.data is not None
# Test with specific responses
async def test_with_mock_response():
model = TestModel()
model.seed_response('Expected output')
agent = Agent(model)
result = await agent.run('Any prompt')
assert result.data == 'Expected output'skills/
└── code-review/
├── instructions.md # How to perform code reviews
├── scripts/
│ └── run-linters.sh # Supporting scripts
└── resources/
└── checklist.md # Review checklist# Code Review Skill
## When to Use
Activate this skill when asked to review code, PRs, or diffs.
## Process
1. Read the changed files completely
2. Run linters: `./scripts/run-linters.sh`
3. Check against resources/checklist.md
4. Provide structured feedback
## Output Format
- Summary (1-2 sentences)
- Issues found (severity: critical/major/minor)
- Suggestions for improvement
- Approval recommendationasync function loadSkill(skillName: string): Promise<Skill> {
const skillPath = `./skills/${skillName}`;
const instructions = await fs.readFile(`${skillPath}/instructions.md`, 'utf-8');
const scripts = await glob(`${skillPath}/scripts/*`);
const resources = await glob(`${skillPath}/resources/*`);
return {
name: skillName,
instructions,
scripts: scripts.map(s => ({ name: path.basename(s), path: s })),
resources: await Promise.all(resources.map(loadResource)),
};
}"think" → Standard analysis
"think hard" → Deeper reasoning
"think harder" → Extensive analysis
"ultrathink" → Maximum reasoningthinking_level: "high" | "low"
temperature: 1.0 (keep at 1.0 for reasoning)
thoughtSignature: <pass back for function calling>© alinaqi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/agentic-development of alinaqi/maggy.
Open the folder on GitHubat commit 72a456e
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in alinaqi/maggy, which our catalogue first saw on October 7, 2026.
Agentic Development next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agentic Development this skillalinaqi/maggy | 707 | 1 repos | ~5.9k | Automated safety check: Pass | MIT | |
| Compact Memory Implementationsimbajigege/book2skills | 184 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Claude APIloulanyue/awesome-claude-notes | 272 | 1 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Edgeone Makers ToolsTencentEdgeOne/edgeone-makers-tools | 1.9k | — | ~395 | Automated safety check: Pass | MIT | |
| Claude APImajiayu000/claude-skill-registry | 666 | 3 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Agent BuilderMathews-Tom/armory | 328 | — | ~1.7k | Automated safety check: Pass | MIT |
simbajigege/book2skills
A developer guide to adding compact memory to an agent: when to trigger compaction, how to fork a compactor sub-agent, what the summary holds, and how to restore it.
loulanyue/awesome-claude-notes
Anthropic Claude API 的 Python 和 TypeScript 使用模式。涵盖 Messages API、流式处理、工具使用、视觉功能、扩展思维、批量处理、提示缓存和 Claude Agent SDK。适用于使用 Claude API 或 Anthropic SDK 构建应用程序的场景。
TencentEdgeOne/edgeone-makers-tools
EdgeOne Makers 全栈开发技能包 —— 涵盖 AI Agent 开发(DeepAgents、LangGraph、 Claude SDK、OpenAI Agents、CrewAI)、云函数(Node.js/Go/Python)、边缘函数、 KV 存储、中间件及快速部署,帮助 AI 编程助手准确高效地在 EdgeOne 平台上构建和发布应用。
majiayu000/claude-skill-registry
Anthropic Claude API patterns for Python and TypeScript. An agent skill from majiayu000/claude-skill-registry.
Mathews-Tom/armory
Build AI agents and automate Claude Code programmatically via the Claude Agent SDK and headless CLI mode.
pydantic/pydantic-ai
Migrate Python applications from the Claude Agent SDK to Pydantic AI and, only when needed, Pydantic AI Harness.
alinaqi/maggy
Latest AI models reference - Claude, OpenAI, Gemini, Eleven Labs, Replicate
alinaqi/maggy
Azure Cosmos DB partition keys, consistency levels, change feed, SDK patterns
alinaqi/maggy
AI-first application patterns, LLM testing, prompt management
alinaqi/maggy
WooCommerce REST API - products, orders, customers, webhooks
alinaqi/maggy
AI Engine Optimization - semantic triples, page templates, content clusters for AI citations
alinaqi/maggy
Claude Code Agent Teams - default team-based development with strict TDD pipeline enforcement
Categories
Build AI agents with Pydantic AI (Python) and Claude SDK (Node.js). Agentic Development is an agent skill from alinaqi/maggy.
Agentic Development fits situations like: AI & LLM Engineering work in your project.
Run `npx skills add alinaqi/maggy --skill agentic-development -a claude-code`. Or copy the skill folder (skills/agentic-development in alinaqi/maggy) into .claude/skills/agentic-development in your project. Claude Code loads it when a task matches its description.
Run `npx skills add alinaqi/maggy --skill agentic-development -a codex`. Or copy the skill folder (skills/agentic-development in alinaqi/maggy) into .agents/skills/agentic-development in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add alinaqi/maggy --skill agentic-development -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agentic-development, .gemini/skills/agentic-development, .github/skills/agentic-development and .opencode/skills/agentic-development in your project.
SKILL.md names no scripts, command-line tools or credentials: Agentic Development is instructions for the agent only. Our summary lists: Python 3; Node.js.
SKILL.md names 6 domains. In commands or code: api.search.com; the agent is likely to contact it when it follows the instructions. As links in the text: docs.anthropic.com, anthropic.com, ai.pydantic.dev, developers.googleblog.com and developers.openai.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Agentic Development is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agentic Development: Compact Memory Implementation (simbajigege/book2skills, 184 stars), Claude API (loulanyue/awesome-claude-notes, 272 stars), Edgeone Makers Tools (TencentEdgeOne/edgeone-makers-tools, 1.9k stars) and Claude API (majiayu000/claude-skill-registry, 666 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
alinaqi (a GitHub user) maintains it in alinaqi/maggy, which has 707 GitHub stars. The repository holds 71 skills in this directory. The repository was last updated on September 24, 2026.
Source: alinaqi/maggy on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.