gateway-script-design
Design gateway scripts as entry points for agentic coding. Use when creating CLI entry points for agents, designing subprocess-based agent invocation, or building script interfaces for agentic workflows.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Gateway Script Design Skill
Guide creation of gateway scripts - the entry points into agentic coding.
When to Use
- Creating new CLI entry points for agents
- Building programmatic agent invocation
- Designing composed workflows
- Setting up automation scripts
Core Concept
"This script is the gateway into agentic coding. It's distinctly different from any other type of code - it's calling an agent."
Gateway scripts move you from conversation to automation.
Three Gateway Patterns
Pattern 1: Direct Prompt
Execute ad-hoc prompts:
# adw_prompt.py
@click.command()
@click.argument("prompt")
@click.option("--model", default="opus")
def main(prompt: str, model: str):
request = AgentPromptRequest(
prompt=prompt,
model=model,
agent_name="oneoff"
)
response = prompt_claude_code(request)
Use case: Quick one-offs, testing, exploration
Pattern 2: Slash Command Wrapper
Execute slash commands programmatically:
# adw_slash_command.py
@click.command()
@click.argument("command")
@click.argument("args", nargs=-1)
def main(command: str, args: tuple):
request = AgentTemplateRequest(
slash_command=f"/{command}",
args=list(args)
)
response = execute_template(request)
Use case: Scheduled commands, triggers, external integration
Pattern 3: Composed Workflow
Chain multiple agents:
# adw_chore_implement.py
def main(description: str):
# Phase 1: Plan
plan_response = execute_template("/chore", description)
plan_path = extract_plan_path(plan_response)
# Phase 2: Implement
impl_response = execute_template("/implement", plan_path)
return impl_response
Use case: Multi-step automation, full workflows
Design Checklist
1. CLI Interface
import click
@click.command()
@click.argument("input", required=True)
@click.option("--model", default="opus", help="Model to use")
@click.option("--verbose", is_flag=True, help="Verbose output")
def main(input: str, model: str, verbose: bool):
...
2. Unique Identification
def generate_short_id() -> str:
return uuid.uuid4().hex[:8]
adw_id = generate_short_id() # e.g., "a1b2c3d4"
3. Output Organization
output_dir = f"agents/{adw_id}/{agent_name}"
os.makedirs(output_dir, exist_ok=True)
output_file = f"{output_dir}/cc_raw_output.jsonl"
4. Safe Environment
def get_safe_env() -> dict:
return {
"ANTHROPIC_API_KEY": os.getenv("ANTHROPIC_API_KEY"),
"PATH": os.getenv("PATH"),
# Only essential vars
}
5. Error Handling
try:
response = prompt_claude_code(request)
except TimeoutError:
log_error("Agent timed out")
sys.exit(1)
except ExecutionError as e:
log_error(f"Execution failed: {e}")
sys.exit(1)
6. Rich Output
from rich.console import Console
from rich.panel import Panel
console = Console()
console.print(Panel(
response.output,
title=f"[bold green]{agent_name}[/]",
border_style="green"
))
Request/Response Models
class AgentPromptRequest(BaseModel):
prompt: str
adw_id: str
model: str = "opus"
agent_name: str = "oneoff"
output_file: Optional[str] = None
class AgentPromptResponse(BaseModel):
output: str
success: bool
error: Optional[str] = None
output_file: str
Output File Structure
Every gateway produces:
agents/{adw_id}/{agent_name}/
├── cc_raw_output.jsonl # Streaming messages
├── cc_raw_output.json # Parsed array
├── cc_final_object.json # Last message
└── custom_summary.json # Metadata
Key Memory References
- @gateway-script-patterns.md - Pattern examples
- @agentic-layer-structure.md - Where scripts live
- @programmable-claude-patterns.md - CLI invocation
Output Format
## Gateway Script Design
**Script Name:** adw_{purpose}.py
**Pattern:** [Direct | Wrapper | Composed]
### CLI Interface
- Arguments: {required args}
- Options: --model, --verbose
### Agent Configuration
- Name: {agent_name}
- Model: opus (default)
- Output: agents/{adw_id}/{agent_name}/
### Execution Flow
1. Parse arguments
2. Generate ADW ID
3. Create output directory
4. Build request
5. Execute agent
6. Handle response
7. Display results
### Error Handling
- Timeout: Log and exit 1
- Execution error: Log reason and exit 1
- Success: Display panel with results
### Files Generated
- cc_raw_output.jsonl
- cc_raw_output.json
- cc_final_object.json
- custom_summary.json
Anti-Patterns
- Passing full environment to subprocess
- Not generating unique IDs (collision risk)
- No error handling (silent failures)
- Inline output instead of files (not auditable)
- No CLI interface (hard to use)
Version History
- v1.0.0 (2025-12-26): Initial release
Last Updated
Date: 2025-12-26 Model: claude-opus-4-5-20251101
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-02-04
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!