From humanloop
Pauses agent execution to solicit human validation of decisions, choices between options, or freetext via hl CLI TUI, returning typed JSON answers. For design decisions, approval gates, meaningful alternatives.
npx claudepluginhub crouton-labs/crouton-kit --plugin humanloopThis skill is limited to using the following tools:
Use the `hl` CLI to ask the human a structured set of questions and block until they answer. The CLI opens a TUI (auto-splits a tmux pane when `$TMUX` is set), persists progress, and returns a JSON document with typed answers.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Analyzes competition with Porter's Five Forces, Blue Ocean Strategy, and positioning maps to identify differentiation opportunities and market positioning for startups and pitches.
Use the hl CLI to ask the human a structured set of questions and block until they answer. The CLI opens a TUI (auto-splits a tmux pane when $TMUX is set), persists progress, and returns a JSON document with typed answers.
Use hl when the next step materially depends on a human judgment you cannot make alone:
If all you need is one freetext answer, just ask inline. Reach for hl when there are 2+ structured questions, or a single question that benefits from the TUI's visual context.
hl schema.hl create <file>. This blocks on the interactive TUI and prints a JSON DecisionsOutput to stdout on success.id — never by index, since the human can skip questions.| Type | Required fields | Answer shape |
|---|---|---|
validation | id, type, statement, rationale | { id, type: "validation", approved: boolean, comment?: string } |
choice | id, type, question, rationale, options (≥2) | { id, type: "choice", selected: string, isCustom: boolean, comment?: string } |
freetext | id, type, question, rationale | { id, type: "freetext", response: string } |
statement (validation) is a proposition to approve or reject; question (choice/freetext) is an interrogative. rationale is required on every question — it explains why the decision matters and is shown to the human in the TUI.
For choice, the human may select a listed option (isCustom: false) or type their own (isCustom: true). The selected string holds the chosen text either way.
{
"title": "Architecture decisions for the capture pipeline",
"questions": [
{
"id": "db",
"type": "validation",
"statement": "We'll use Postgres over SQLite for the capture store",
"rationale": "Need concurrent writes from multiple services; SQLite locks the file"
},
{
"id": "migrate",
"type": "choice",
"question": "Which migration tool?",
"rationale": "Need repeatable schema changes across environments",
"options": ["Prisma", "Drizzle", "raw SQL with shmig"]
},
{
"id": "retry",
"type": "freetext",
"question": "What should the retry policy be on publish failures?",
"rationale": "Affects the reliability budget and downstream backpressure"
}
]
}
{
"answers": [
{ "id": "db", "type": "validation", "approved": true, "comment": "Yes, ACID + concurrent writes" },
{ "id": "migrate", "type": "choice", "selected": "Drizzle", "isCustom": false },
{ "id": "retry", "type": "freetext", "response": "Exponential backoff capped at 5 attempts, then DLQ" }
],
"completedAt": "2026-04-20T15:23:00.000Z"
}
The human can skip questions. answers may be shorter than questions. Always look up by id.
hl create decisions.json # block, print JSON to stdout
hl create decisions.json --output ans.json # write JSON to file instead
hl create decisions.json --no-visuals # skip haiku-generated visual context (faster)
hl create decisions.json --no-tmux # force TUI in current pane inside tmux
hl schema # print the input JSON schema
A typical end-to-end flow:
# 1. Write the decisions file
cat > /tmp/d.json <<'EOF'
{"questions":[{"id":"x","type":"validation",
"statement":"Postgres over SQLite","rationale":"concurrent writes"}]}
EOF
# 2. Block on the TUI, capture JSON
hl create /tmp/d.json > /tmp/answers.json
# 3. Look up the answer by id
jq '.answers[] | select(.id=="x")' /tmp/answers.json
$TMUX is set, the TUI opens in a new pane to the right. The caller keeps focus. Disable with --no-tmux.<file>.progress.json after every keystroke. If the process is killed, the next hl create <file> resumes from where the human left off. The progress file is deleted on full completion; partial files are preserved.--session-id), Haiku generates a short ANSI context block per question grounded in the conversation history. Disable with --no-visuals.0 — success; JSON emitted to stdout or the file passed to --output.1 — error on stderr. Common causes: missing file, invalid JSON, empty questions array, no TTY.If the caller captures stdin and the TUI cannot attach, run inside tmux so hl can auto-dispatch to a new pane.