Modular LLM scripting. Finally.
Orchestrate with retryable pipes. Turn your markdown into context modules.
/import {roles, tasks} from @company/prompts
/var @arch = <README.md # Architecture>
/var @standards = <README.md # Code Standards>
/var @diff = run {git diff | cat}
/var @prompt = `
Read our docs: @arch @standards
Review the latest changes: @diff
Here's your task: @tasks.codereview
`
/run {llm @prompt --system @roles.architect}
---
what is prompt scripting?
If you've experienced the pain,
you know what you need it to be.
Tired of repeating yourself
“I'd do a lot more with LLMs if constantly assembling and re-assembling context wasn't such a chore.”
Tired of wrong tools for the job
“I just want to script LLMs. Don't give me a kitchen sink 'agentic framework' or a magic black box. Give me a unix pipe.”
And if you've seen the possibility,
you know what you want it to be.
Retries built-in? Heck yes. Use shell commands, JS, mlld's when expressions to create readable workflows in a tenth as much code.
/var @commits = run {git log --since="yesterday"}
/var @prs = run {gh pr list --json title,url,createdAt}
/exe @claude(request) = run {claude -p "@request"}
/exe @formatPRs(items) = js {
return items.map(pr => `- PR: ${pr.title} (${pr.url})`).join('\n');
}
>> simple template
/var @standup = `
Write a standup update in markdown summarizing the work I did
yesterday based on the following commits and PRs.
## Commits:
@commits
## PRs:
@formatPRs(@prs)
`
>> executable template
/exe @reviewPrompt(input) = `
Review the following standup update to ensure I'm not taking credit for work I didn't do.
My username is @githubuser. Here's my standup update:
<standup>
@input
</standup>
Check whether there are any commits or PRs listed that I wasn't involved in. If there are, respond with DENY. If there are not, respond with APPROVE.
Your response should contain APPROVE or DENY in all caps.
`
/exe @hasApproval(text) = js {
const lowerText = text.toLowerCase();
if (lowerText.includes('approve')) {
return 'true';
} else if (lowerText.includes('deny')) {
return 'false';
}
return 'error';
}
/exe @review(@input) = when [
@input => @check = @claude(@reviewPrompt(@input))
@hasApproval(@check) => show "Approved: @check"
@hasApproval(@check) => @input
!@hasApproval(@check) && @ctx.retries < 3 => retry
none => show "No definitive answer: @input"
]
/show @claude(@standup) | show "Reviewing #@p.try..." | @review
Embed LLM context in your docs and treat markdown sections as modules you can import
# TypeBlorp
## Overview
TypeBlorp is lightweight state management library built with TypeScript, with a unidirectional data flow pattern combined with observer-based pub/sub architecture.
Here's the structure of the codebase:
/show {tree --gitignore}
/show <./docs/ARCHITECTURE.md> as "## Architecture"
/show <./docs/STANDARDS.md> as "## Code Standards"
Chain requests like shell commands
/var @tests = run {npm test}
/var @res = run {llm "What's broken here? @tests"}
/run {llm "Make a plan to fix @res"}
---
Imports, templating, command creation
/var @docs = <README.md>
/var @role = {
"architect": "You are a software architect.",
"security": "You are a security engineer.",
"ux": "You are a ux designer.",
"pm": "You are a project manager."
}
/var @task = {
"archrev": "What's the architecture's biggest flaw?",
"uxrev": "Review the UX of this code",
"secrev": "Review this code for vulnerabilities",
"roadmap": "Create a roadmap based on highest priority"
}
>> command creation
/exe @listfiles(dir,ext) = run {find @dir -type f -name "*.@ext" | head -5}
/exe @ask(context, role, task) = run {llm --context @context --instructions @task --system @role}
/import "imports.mld"
/path @services = "./src/services"
/var @code = @listfiles(@services,"ts")
/var @context = `
Read our docs: @imports.docs
Review our code: @code
`
/var @arch_review = @imports.ask(@context, @imports.role.architect, @imports.task.archrev)
/var @ux_review = @imports.ask(@context, @imports.role.ux, @imports.task.uxrev)
/var @sec_review = @imports.ask(@context, @imports.role.security, @imports.task.secrev)
/var @pm_review = ::
Here's the team's input on our priorities:
- Architect review: @arch_review
- UX review: @ux_review
- Security review: @sec_review
Your task: @imports.task.roadmap
::
/run @imports.ask(@context, @imports.role.pm, @pm_review)