by angel291592
Intent compiler for AI agents — converges vague requests into typed IntentSpec contracts (probe, ask, or halt before routing), the input layer for routers and typed-decision models like Jev & Laya
# Add to your Claude Code skills
git clone https://github.com/angel291592/Intent-RouterGuides for using ai agents skills like Intent-Router.
Last scanned: 9/25/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-09-25T09:26:15.239Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how Intent-Router compares with popular alternatives.
Intent-Router is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by angel291592. Intent compiler for AI agents — converges vague requests into typed IntentSpec contracts (probe, ask, or halt before routing), the input layer for routers and typed-decision models like Jev & Laya. It has 942 GitHub stars.
Yes. Intent-Router passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/angel291592/Intent-Router" and add it to your Claude Code skills directory (see the Installation section above).
Intent-Router is primarily written in Python. It is open-source under angel291592 on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh Intent-Router against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
English | 简体中文
An intent compiler for AI agents.
Turns a vague request into a typed IntentSpec: it looks up what it can, asks only what it
can't, calls out a request that contradicts itself, admits two readings, or rests on a premise
your own repo already disproves, and refuses to emit while the intent is still underspecified.
When the work gets handed off and carried out, it checks the result against the spec it wrote —
one constraint at a time, not a vibe check.
What that buys you:
IntentSpec, saved to
.intent/<intent>.intent.yaml before the reply that carries it, whose probed fields carry
evidence pointers and which records its own state: still waiting on a question, settled, or
already carried out. A later session reads that file before probing anything — an answered
question is never asked again, a settled contract is implemented as written — and the result of
checking the delivered work against it is written back into the same file. So the next agent,
session or teammate starts from what you actually decided instead of zero.Same weak request, same fixture, same permissions, one line apart —
bare vs. with the skill (N=5 bare, N=3 skill).
Excerpted verbatim from each run's own diff.patch, the part that decides what happens when the
cache itself fails:
Bare — no failure path exists to read. A downed Redis takes the request down with it:
const hit = await getCache<T>(key);
if (hit !== null) {
return hit;
}
const value = await load();
if (value !== null) {
await setCache(key, value);
}
return value;
With the skill — asked the one question no file could answer, then wrote the answer into the code:
async function readCache<T>(key: string): Promise<{ hit: boolean; value: T | null }> {
try {
return { hit: true, value: await getCache<T>(key) };
} catch {
return { hit: false, value: null };
}
}
Every one of the 5 bare runs shipped the first shape; every one of the 3 skill runs shipped the second. Neither line was written by hand for this README — both come straight out of the runs that produced the numbers in Evals.
"add caching to the user API" "this customer is furious — sort it out"
│ │
▼ ▼
┌────────────────────────────────────────────────────────────────────────────────────┐
│ parse → resolve → typecheck → emit one engine, one spec │
├────────────────────────────────────────────────────────────────────────────────────┤
│ PROBE deps, routes, git history, ADRs │ order + ticket log, entitlements, │
│ — you are not interrupted │ the policy in force │
│ │ │
│ ASK serve stale, or serve uncached? │ refund, or replace? │
│ the one answer no file holds │ the one that can't be undone │
└────────────────────────────────────────────────────────────────────────────────────┘
│ │
▼ ▼
IntentSpec ──────► your planner / agent / workflow / human
Same three passes. Same stopping predicate. Only the places it looks change.
What a real run looks like — one sentence in, it reads the repo itself and asks only what no file can answer. From the measured run of 2026-09-23 behind the numbers below: 8 of the 10 cases the suite held that day, 0 hallucinated evidence.
No install, no API key, no dependencies — it's a skill:
npx skills add angel291592/Intent-Router
Manual install, or an agent the installer doesn't know: Quick start.
Intent-Router is the layer between a vague request and the work: look it up, ask, or act — then check what got built. Your harness's own plan mode already prefers looking things up over asking, and grill-me converges beautifully and states the right principle — but neither one checks a stated premise against the evidence, and neither one checks the finished work against what was decided. spec-kit keeps everything and makes you buy its whole workflow to get it. Kiro's specs come closest on paper — requirement-level conflict analysis, a correctness check after delivery — at the cost of a full three-file spec workflow and an IDE. Jev and Laya make the same bet this skill makes — typed output instead of prose — one layer further down: both turn an already-clear input into a typed, calibrated decision in a single pass, and neither one converges a vague request into that clear input to begin with. Intent-Router is that upstream layer as a single skill: no workflow to adopt, no files to keep in sync by hand, no IDE, no separate decision service to run.
Read the row gaps, not the checkmarks. Every cell below is sourced to the tool's own docs or repo — quoted cells are verbatim, and an unquoted ✅/⚠️/❌ still traces to a specific page.
| Converges vague input | Doesn't ask what it can look up | Uses evidence against contradictions & bad premises | Never guesses past irreversible | Cross-session artifact | Checks delivery against intent | Fires automatically | |
|---|---|---|---|---|---|---|---|
| Intent-Router | ✅ | ✅ PROBE |
✅ ambiguous / conflict / premise |
✅ HALT |
✅ .intent/*.yaml |
✅ Intent check |
✅ |
| Your harness's native plan mode + question tool | ✅ asks | ⚠️ varies — Codex's plan template states the rule outright; Claude Code and Cursor explore but document none | ❌ not documented on any of the three | ⚠️ an approval gate, not a risk-based one | ✅ Claude Code, Cursor save a plan file; Codex's plan lives in the reply | ❌ not documented | ⚠️ Claude Code's tool is model-invoked; Cursor only suggests; Codex needs an explicit switch |
| grill-me | ✅ rounds/frontier | ✅ "don't ask the user for anything you could look up yourself" | ❌ not documented | ✅ "the decisions are the user's" | ❌ stateless by design | ❌ not documented | ❌ manual (/grill-me) |
spec-kit /clarify |
✅ category scan, ≤5 questions | ⚠️ excludes questions "already answered", not questions the repo could answer | ⚠️ a separate command, /analyze, flags conflicting requirements |
⚠️ flags unresolved items as "Deferred", no reversibility test | ✅ writes into spec.md |
✅ a separate command, /converge |
❌ manual, one /speckit-* command at a time |
| Kiro specs | ✅ "asks clarifying questions if needed" | ⚠️ "codebase exploration", no stated rule | ⚠️ analyze-requirements finds inconsistencies across the requirement set (IDE/CLI only) |
not documented | ✅ three files per spec | ✅ property-based "Correctness" checks (IDE only) | ❌ manual (Shift+Tab / /plan) |
| Jev (typed decisions) | ❌ needs clear input alrea |