pre-release

Modular LLM scripting. Finally.

Orchestrate with retryable pipes. Turn your markdown into context modules.

code-review.mld
/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.

standup.mld
/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

README.md
# 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

test-plan.mld
/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

imports.mld
/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}
plan.mld
/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)