Creates complete Terrazul AI assistant packages with proper directory structure, agents.toml manifest, Handlebars templates, and dynamic content using askUser/askAgent helpers. Use when creating reusable AI assistant configurations for Claude, Codex, or Gemini.
Installs into .claude/skills of the current project.
Are you the author of Create Assistant Terrazul Ai?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/diegosouzapw-create-assistant-terrazul-ai)
---
name: create-assistant
description: Creates complete Terrazul AI assistant packages with proper directory structure, agents.toml manifest, Handlebars templates, and dynamic content using askUser/askAgent helpers. Use when creating reusable AI assistant configurations for Claude, Codex, or Gemini.
---
# Create Terrazul Assistant Package
This skill guides you through creating a complete Terrazul package - a reusable, distributable AI assistant configuration that works across Claude Code, Codex, and Gemini.
## When to Use This Skill
Activate this skill when the user wants to:
- Create a reusable AI assistant package
- Build a shareable configuration for Claude, Codex, or Gemini
- Set up a package with skills, agents, and MCP servers
- Create dynamic templates using `askUser` and `askAgent`
- Understand Terrazul package structure and best practices
## Related Skills
This skill works best in combination with:
| Skill | Use For |
|-------|---------|
| `create-skill` | Creating individual skills within the package |
| `add-mcp` | Finding and configuring MCP servers for the package |
| `create-agent` | Creating Claude agents for the package |
| `create-command` | Creating slash commands for Claude |
When building a full-featured assistant package, use these skills to create the individual components after setting up the package structure.
## Terrazul Package Overview
A Terrazul package is a distributable unit containing:
- **Configuration manifest** (`agents.toml`) - package metadata and exports
- **Context templates** (`.md.hbs` or `.md`) - documentation for AI tools
- **Operational files** - skills, agents, commands, MCP configs
- **Dynamic content** - interactive prompts and AI-generated content
## Package Creation Workflow
### 1. Gather Requirements
Ask the user:
- What is the purpose of this assistant package?
- Which AI tools should it support? (Claude, Codex, Gemini)
- What skills/capabilities should it provide?
- Does it need MCP server integrations?
- Should content be dynamic (using askUser/askAgent)?
### 2. Create Directory Structure
Create the package directory with this structure:
```
my-package/
├── agents.toml # REQUIRED: Package manifest
├── README.md # RECOMMENDED: Documentation
├── templates/ # Template files
│ ├── CLAUDE.md.hbs # Claude context (or .md if no dynamic content)
│ ├── AGENTS.md.hbs # Codex context
│ ├── GEMINI.md.hbs # Gemini context
│ ├── claude/ # Claude-specific files
│ │ ├── mcp_servers.json.hbs
│ │ ├── skills/
│ │ │ └── [skill-name]/
│ │ │ └── SKILL.md
│ │ ├── agents/
│ │ │ └── [agent-name].md
│ │ └── commands/
│ │ └── [command-name].md
│ ├── codex/ # Codex-specific files
│ │ └── config.toml.hbs
│ └── gemini/ # Gemini-specific files
│ ├── settings.json.hbs
│ └── commands/
│ └── [command-name].toml
└── prompts/ # Optional: External prompt files for askAgent
└── analyze.txt
```
**Required vs Optional Components**:
| Component | Status | Purpose |
|-----------|--------|---------|
| `agents.toml` | **Required** | Package manifest |
| `README.md` | Recommended | Package documentation |
| `templates/` | Recommended | All template files |
| Context templates | Optional | CLAUDE.md, AGENTS.md, GEMINI.md |
| `templates/claude/skills/` | Optional | Claude skills |
| `templates/claude/agents/` | Optional | Claude agents |
| `templates/claude/commands/` | Optional | Claude commands |
| `prompts/` | Optional | External askAgent prompts |
### 3. Create agents.toml Manifest
The manifest defines package metadata and exports:
```toml
[package]
name = "@owner/package-name" # Required for publish
version = "1.0.0" # Required for publish
description = "Brief package description"
repository = "https://github.com/..."
license = "MIT"
keywords = ["ai-assistant", "claude", "codex"]
authors = ["Name <email@example.com>"]
[compatibility]
claude = ">=0.2.0"
codex = "*"
gemini = "*"
[exports.claude]
template = "templates/CLAUDE.md.hbs"
skillsDir = "templates/claude/skills"
agentsDir = "templates/claude/agents"
commandsDir = "templates/claude/commands"
mcpServers = "templates/claude/mcp_servers.json.hbs"
[exports.codex]
template = "templates/AGENTS.md.hbs"
skillsDir = "templates/claude/skills"
[exports.gemini]
template = "templates/GEMINI.md.hbs"
skillsDir = "templates/claude/skills"
commandsDir = "templates/gemini/commands"
mcpServers = "templates/gemini/settings.json.hbs"
```
**Manifest Rules**:
- `name` format: `@scope/package-name` (lowercase, hyphens allowed)
- `version` must be valid semver
- All paths in `[exports]` must be relative to package root
- Tool keys: `claude`, `codex`, `gemini`, `cursor`, `copilot`
### 4. Create Context Templates
Context templates provide instructions to the AI tool. Use `.hbs` extension for dynamic content, `.md` for static.
**Static template (CLAUDE.md)**:
```markdown
# Package Name
This package provides [description].
## Available Skills
| Skill | Description |
|-------|-------------|
| `skill-name` | Brief description |
## Quick Start
[Usage instructions]
```
**Dynamic template (CLAUDE.md.hbs)**:
```handlebars
{{~ var projectInfo = askAgent("""
Analyze this repository and return:
{
"name": "repository name",
"description": "brief description",
"languages": "primary languages used"
}
""", { json: true }) ~}}
# {{ vars.projectInfo.name }}
{{ vars.projectInfo.description }}
## Tech Stack
Languages: {{ vars.projectInfo.languages }}
```
### 5. Add Dynamic Content with askUser/askAgent
#### askUser - Interactive Prompts
Gather information from users during package rendering:
```handlebars
{{~ var projectPitch = askUser('Describe your project in 1-2 sentences.') ~}}
{{~ var targetAudience = askUser('Who is the primary user of this assistant?') ~}}
{{~ var constraints = askUser('List any constraints or guardrails.', {
default: 'None',
placeholder: 'Enter constraints or press Enter for none'
}) ~}}
# Project Overview
{{ vars.projectPitch }}
**Primary User**: {{ vars.targetAudience }}
**Constraints**: {{ vars.constraints }}
```
**askUser Options**:
- `default` - Default value if user presses Enter
- `placeholder` - Hint text shown when empty
#### askAgent - AI-Powered Analysis
Generate content using AI analysis of the codebase:
```handlebars
{{~ var analysis = askAgent("""
Analyze this repository structure and provide:
{
"mainDirectories": "key directories and their purposes",
"buildTools": "build tools used",
"testFramework": "testing framework if present"
}
""", { json: true }) ~}}
## Repository Structure
{{ vars.analysis.mainDirectories }}
## Development
Build: {{ vars.analysis.buildTools }}
Tests: {{ vars.analysis.testFramework }}
```
**askAgent Options**:
- `json: true` - Expect JSON response
- `tool: 'claude'` - Specify AI tool
- `systemPrompt: 'custom prompt'` - Override system prompt
- `timeoutMs: 60000` - Custom timeout
**IMPORTANT Best Practice**: Use ONE comprehensive askAgent call with flat JSON instead of multiple sequential calls:
```handlebars
{{~ var projectData = askAgent("""
Analyze this repository and return a flat JSON object:
{
"name": "repository name",
"description": "brief description",
"languages": "TypeScript, Python",
"frameworks": "Next.js, FastAPI",
"directories": "src: source code, tests: test files"
}
""", { json: true }) ~}}
```
This is more efficient and produces more coherent results than multiple separate calls.
### 6. Create Skills (Optional)
**TIP**: Use the `create-skill` skill for detailed guidance on creating skills. It provides templates, validation checklists, and best practices for different skill types.
Add skills in `templates/claude/skills/[skill-name]/SKILL.md`:
```markdown
---
name: skill-name
description: Third-person description of what this skill does and when to use it
---
# Skill Title
[Overview of what this skill provides]
## When to Use
Activate this skill when:
- [Trigger condition 1]
- [Trigger condition 2]
## Instructions
[Specific instructions for Claude to follow]
## Examples
[Concrete usage examples]
```
### 7. Create Agents (Optional)
Add Claude agents in `templates/claude/agents/[agent-name].md`:
```markdown
---
name: agent-name
description: What this agent does
model: sonnet
color: blue
tools:
- Read
- Grep
- Glob
- Edit
examples:
- "Review this PR for security issues"
- "Analyze the architecture"
---
You are a specialized agent for [purpose].
## Your Role
[Agent's responsibilities]
## Guidelines
[Specific instructions for the agent]
```
### 8. Configure MCP Servers (Optional)
**TIP**: Use the `add-mcp` skill to search mcp.so for servers, get configuration details, and properly set up MCP integrations. It handles searching, fetching server details, and generating correct configurations.
Add MCP configuration in `templates/claude/mcp_servers.json.hbs`:
```json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
},
"context7": {
"command": "npx",
"args": ["-y", "@context7/mcp-server"]
}
}
}
```
**CRITICAL REQUIREMENT: Include setup-mcp Command**
Every package with MCP servers **MUST** include the `setup-mcp` command. This is not optional.
When the package includes MCP server configuration:
1. **Copy the setup-mcp command** to `templates/claude/commands/setup-mcp.md`
2. **Copy the Gemini version** to `templates/gemini/commands/setup-mcp.toml`
3. **Update README.md** to include post-installation section:
```markdown
## Setup Required
After installing, configure MCP credentials:
```
/setup-mcp
```
```
4. **Update CLAUDE.md** to list the MCP servers and note that `/setup-mcp` must be run
The `setup-mcp` command guides users through setting up environment variables in their shell profile (`~/.zshenv`, `~/.bashrc`) so MCP servers can authenticate with external services.
### 9. Write README.md
Document the package for users:
```markdown
# @owner/package-name
Brief description of what this package provides.
## Features
- Feature 1
- Feature 2
## Installation
\`\`\`bash
tz add @owner/package-name
tz apply
\`\`\`
## Usage
[How to use the package]
## Configuration
[Any configuration needed]
## License
MIT
```
### 10. Validate Package
Before publishing, validate the package:
```bash
# Check structure and manifest
tz validate
# Test rendering locally
tz run --force
# Verify generated files
ls -la agent_modules/@owner/package-name/
```
## Validation Checklist
Before considering the package complete:
- [ ] `agents.toml` has valid `name` and `version`
- [ ] All template paths in `[exports]` exist
- [ ] Context templates render without errors
- [ ] Skills have valid frontmatter (name, description)
- [ ] Agents have valid frontmatter (name, description, model)
- [ ] MCP configs have valid JSON/TOML syntax
- [ ] README.md documents installation and usage
- [ ] Package works with `tz apply --force`
- [ ] **If MCP servers configured** → `setup-mcp.md` exists in `templates/claude/commands/`
- [ ] **If MCP servers configured** → `setup-mcp.toml` exists in `templates/gemini/commands/`
- [ ] **If MCP servers configured** → README mentions `/setup-mcp` in post-installation steps
- [ ] **If MCP servers configured** → CLAUDE.md documents required credentials
## Common Patterns
### Documentation-Focused Package
For packages that primarily provide context and guidelines:
```
my-docs-package/
├── agents.toml
├── README.md
└── templates/
├── CLAUDE.md.hbs # Dynamic analysis of codebase
├── AGENTS.md # Static codex docs
└── claude/
└── skills/
└── guidelines/
└── SKILL.md
```
### Skills-Focused Package
For packages that add capabilities:
```
my-skills-package/
├── agents.toml
├── README.md
└── templates/
├── CLAUDE.md
└── claude/
└── skills/
├── skill-1/
│ ├── SKILL.md
│ ├── reference.md
│ └── examples.md
└── skill-2/
└── SKILL.md
```
### Full-Featured Package
For comprehensive packages:
```
my-full-package/
├── agents.toml
├── README.md
├── prompts/
│ └── analyze.txt
└── templates/
├── CLAUDE.md.hbs
├── AGENTS.md.hbs
├── GEMINI.md.hbs
├── claude/
│ ├── mcp_servers.json.hbs
│ ├── skills/
│ ├── agents/
│ └── commands/
├── codex/
│ └── config.toml.hbs
└── gemini/
├── settings.json.hbs
└── commands/
```
## Tips for Effective Packages
1. **Start Simple**: Begin with `agents.toml` and one context template
2. **Use Dynamic Content Wisely**: `askAgent` is expensive; use sparingly
3. **Flat JSON Only**: Always request flat JSON structures from `askAgent`
4. **One Comprehensive Call**: Prefer single `askAgent` with multiple fields over multiple calls
5. **Cache-Friendly Prompts**: Design stable prompts for better caching
6. **Platform-Agnostic Skills**: Write skills that work across tools when possible
7. **Document Everything**: Good README and context files save user time
8. **Test Before Publishing**: Run `tz validate` and `tz apply --force`
9. **Use Related Skills**: Leverage `create-skill` for skill creation, `add-mcp` for MCP configuration, and `create-agent` for agent definitions
## Working with PDF Context
Assistants are often given PDFs for context (documentation, specifications, guidelines). Large PDFs can hit token limits when read directly.
**Best Practice**: Use `pdftotext` to convert PDFs to plain text:
```bash
# Convert PDF to text
pdftotext input.pdf output.txt
# Convert with layout preservation
pdftotext -layout input.pdf output.txt
```
Use the converted text however is appropriate for your use case. This avoids token limits and makes the content more accessible to the AI tool.
## Reference Materials
For detailed information:
- `reference.md` - Complete manifest and template reference
- `examples.md` - Real-world package examples
- `templates/` - Starter templates for different package types