Mastra Hono
jwynia/agent-skills
Develop AI agents, tools, and workflows with Mastra v1 Beta and Hono servers.
Hono web framework for edge-first, lightweight APIs - routing, middleware, validation, and multi-runtime support When user works with Hono, builds APIs, creates middleware, uses Zod validation with…
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shepherdjerred/monorepo hono-helper --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .claude/skills/hono-helper && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .claude/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helperType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shepherdjerred/monorepo hono-helper --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .agents/skills/hono-helper && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .agents/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shepherdjerred/monorepo hono-helper --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .cursor/skills/hono-helper && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .cursor/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/shepherdjerred/monorepo.git --path packages/dotfiles/dot_agents/skills/hono-helper--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shepherdjerred/monorepo hono-helper --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .gemini/skills/hono-helper && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .gemini/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install shepherdjerred/monorepo hono-helperInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .github/skills/hono-helper && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .github/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shepherdjerred/monorepo --skill hono-helper -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shepherdjerred/monorepo hono-helper --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shepherdjerred/monorepo.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/dotfiles/dot_agents/skills/hono-helper .opencode/skills/hono-helper && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hono-helper" agent skill from https://github.com/shepherdjerred/monorepo/tree/main/packages/dotfiles/dot_agents/skills/hono-helper into .opencode/skills/hono-helper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hono-helper", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hono-helperHono web framework for edge-first, lightweight APIs - routing, middleware, validation, and multi-runtime support When user works with Hono, builds APIs, creates middleware, uses Zod validation with…
Hono Helper is an agent skill from shepherdjerred/monorepo. Hono web framework for edge-first, lightweight APIs - routing, middleware, validation, and multi-runtime support When user works with Hono, builds APIs, creates middleware, uses Zod validation with Hono, or mentions hono patterns
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/middleware-patterns.md` and `references/openapi-rpc.md`).
It sits in Frontend & Design, covering Forms and validation. It works with Hono and Zod. The repository describes itself as: Monorepo for all of my projects. The licence is GPL-3.0.
10 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit bc57ca5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bunnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
unpkg.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
JWT_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Hono Helper loads about 4.3k tokens when it runs, and up to ~6.6k if it reads all its reference files. Until then it costs about 60 tokens; SKILL.md has 278 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from shepherdjerred/monorepo at commit bc57ca5, republished under its GPL-3.0 licence (© shepherdjerred). 278 words, ~4,254 tokens.
.claude/skills/hono-helper/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.hc client# For Bun
bun add hono
# For Node.js
npm install hono @hono/node-server
# For Cloudflare Workers
npm install honoimport { Hono } from "hono";
const app = new Hono();
app.get("/", (c) => c.text("Hello Hono!"));
export default app;Bun automatically serves the default export on port 3000.
import { Hono } from "hono";
import { serve } from "@hono/node-server";
const app = new Hono();
app.get("/", (c) => c.text("Hello Hono!"));
serve({ fetch: app.fetch, port: 3000 });app.get("/users", (c) => c.json({ users: [] }));
app.post("/users", (c) => c.json({ created: true }));
app.put("/users/:id", (c) => c.json({ updated: true }));
app.patch("/users/:id", (c) => c.json({ patched: true }));
app.delete("/users/:id", (c) => c.json({ deleted: true }));
// All methods
app.all("/any", (c) => c.text("Any method"));
// Multiple methods
app.on(["GET", "POST"], "/multi", (c) => c.text("GET or POST"));// Single parameter
app.get("/users/:id", (c) => {
const id = c.req.param("id");
return c.json({ id });
});
// Multiple parameters
app.get("/posts/:postId/comments/:commentId", (c) => {
const { postId, commentId } = c.req.param();
return c.json({ postId, commentId });
});
// Optional parameter
app.get("/articles/:id?", (c) => {
const id = c.req.param("id") ?? "default";
return c.json({ id });
});// Wildcard - matches any path segment
app.get("/files/*", (c) => {
const path = c.req.path;
return c.text(`File path: ${path}`);
});
// Regex constraint
app.get("/users/:id{[0-9]+}", (c) => {
const id = c.req.param("id"); // Guaranteed to be numeric
return c.json({ id: Number(id) });
});const api = new Hono();
api.get("/users", (c) => c.json({ users: [] }));
api.get("/posts", (c) => c.json({ posts: [] }));
const app = new Hono();
app.route("/api/v1", api);
// Routes: GET /api/v1/users, GET /api/v1/postsapp
.get("/endpoint", (c) => c.text("GET"))
.post((c) => c.text("POST"))
.put((c) => c.text("PUT"));The c (context) object provides request/response utilities:
app.get("/info", (c) => {
// URL and path
const url = c.req.url;
const path = c.req.path;
const method = c.req.method;
// Query parameters
const page = c.req.query("page");
const allQueries = c.req.queries("tag"); // Array for repeated params
// Headers
const auth = c.req.header("Authorization");
const allHeaders = c.req.header(); // All headers
return c.json({ url, path, method, page, auth });
});app.post("/data", async (c) => {
// JSON body
const json = await c.req.json();
// Form data
const form = await c.req.parseBody();
// Raw text
const text = await c.req.text();
// Array buffer
const buffer = await c.req.arrayBuffer();
return c.json({ received: true });
});// Text response
app.get("/text", (c) => c.text("Plain text"));
// JSON response
app.get("/json", (c) => c.json({ message: "Hello" }));
// HTML response
app.get("/html", (c) => c.html("<h1>Hello</h1>"));
// Custom status
app.get("/created", (c) => c.json({ id: 1 }, 201));
// Redirect
app.get("/old", (c) => c.redirect("/new"));
app.get("/permanent", (c) => c.redirect("/new", 301));
// Not found
app.get("/missing", (c) => c.notFound());
// Stream response
app.get("/stream", (c) => {
return c.streamText(async (stream) => {
await stream.write("Hello ");
await stream.write("World!");
});
});app.get("/custom", (c) => {
// Set response headers
c.header("X-Custom-Header", "value");
c.header("Cache-Control", "max-age=3600");
// Set status
c.status(201);
return c.json({ created: true });
});
// Response with headers inline
app.get("/inline", (c) => {
return c.json({ data: "value" }, 200, { "X-Custom": "header" });
});// Set variables for downstream handlers
app.use(async (c, next) => {
c.set("userId", "user-123");
c.set("requestTime", Date.now());
await next();
});
app.get("/profile", (c) => {
const userId = c.get("userId");
const requestTime = c.get("requestTime");
return c.json({ userId, requestTime });
});app.use(async (c, next) => {
console.log(`${c.req.method} ${c.req.path}`);
const start = Date.now();
await next();
const ms = Date.now() - start;
c.header("X-Response-Time", `${ms}ms`);
});// Apply to specific path
app.use("/api/*", async (c, next) => {
const auth = c.req.header("Authorization");
if (!auth) {
return c.json({ error: "Unauthorized" }, 401);
}
await next();
});
// Apply to specific method
app.use("/admin/*", "POST", async (c, next) => {
// Only runs for POST requests to /admin/*
await next();
});const rateLimiter = (limit: number) => {
const requests = new Map<string, number>();
return async (c: Context, next: Next) => {
const ip = c.req.header("x-forwarded-for") ?? "unknown";
const count = requests.get(ip) ?? 0;
if (count >= limit) {
return c.json({ error: "Rate limited" }, 429);
}
requests.set(ip, count + 1);
await next();
};
};
app.use(rateLimiter(100));import { cors } from "hono/cors";
import { logger } from "hono/logger";
import { secureHeaders } from "hono/secure-headers";
import { compress } from "hono/compress";
import { etag } from "hono/etag";
import { basicAuth } from "hono/basic-auth";
import { bearerAuth } from "hono/bearer-auth";
import { csrf } from "hono/csrf";
import { timing } from "hono/timing";
// CORS
app.use(
cors({
origin: ["https://example.com"],
allowMethods: ["GET", "POST", "PUT", "DELETE"],
allowHeaders: ["Content-Type", "Authorization"],
credentials: true,
}),
);
// Logging
app.use(logger());
// Security headers
app.use(secureHeaders());
// Compression
app.use(compress());
// ETag caching
app.use(etag());
// Basic auth
app.use(
"/admin/*",
basicAuth({
username: "admin",
password: "secret",
}),
);
// Bearer token auth
app.use(
"/api/*",
bearerAuth({
token: "my-secret-token",
}),
);
// CSRF protection
app.use(csrf());
// Server timing
app.use(timing());bun add @hono/zod-validator zodimport { zValidator } from "@hono/zod-validator";
import { z } from "zod";
const CreateUserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
age: z.number().int().positive().optional(),
});
app.post("/users", zValidator("json", CreateUserSchema), (c) => {
const data = c.req.valid("json");
// data is typed: { name: string; email: string; age?: number }
return c.json({ created: data });
});const QuerySchema = z.object({
page: z.coerce.number().default(1),
limit: z.coerce.number().default(10),
});
const ParamSchema = z.object({
id: z.string().uuid(),
});
app.get(
"/users/:id",
zValidator("param", ParamSchema),
zValidator("query", QuerySchema),
(c) => {
const { id } = c.req.valid("param");
const { page, limit } = c.req.valid("query");
return c.json({ id, page, limit });
},
);// JSON body
zValidator("json", schema);
// Query parameters
zValidator("query", schema);
// URL parameters
zValidator("param", schema);
// Form data
zValidator("form", schema);
// Headers
zValidator("header", schema);
// Cookies
zValidator("cookie", schema);app.post(
"/users",
zValidator("json", CreateUserSchema, (result, c) => {
if (!result.success) {
return c.json(
{
error: "Validation failed",
issues: result.error.issues,
},
400,
);
}
}),
(c) => {
const data = c.req.valid("json");
return c.json({ created: data });
},
);app.onError((err, c) => {
console.error(err);
if (err instanceof HTTPException) {
return err.getResponse();
}
return c.json(
{
error: "Internal Server Error",
message: process.env.NODE_ENV === "development" ? err.message : undefined,
},
500,
);
});import { HTTPException } from "hono/http-exception";
app.get("/protected", (c) => {
const auth = c.req.header("Authorization");
if (!auth) {
throw new HTTPException(401, { message: "Unauthorized" });
}
return c.json({ data: "secret" });
});app.notFound((c) => {
return c.json(
{
error: "Not Found",
path: c.req.path,
},
404,
);
});import { Hono } from "hono";
import { zValidator } from "@hono/zod-validator";
import { z } from "zod";
const app = new Hono()
.get("/users", (c) => c.json({ users: [] }))
.post("/users", zValidator("json", z.object({ name: z.string() })), (c) => {
const { name } = c.req.valid("json");
return c.json({ id: 1, name });
})
.get("/users/:id", (c) => {
const id = c.req.param("id");
return c.json({ id, name: "John" });
});
export type AppType = typeof app;
export default app;import { hc } from "hono/client";
import type { AppType } from "./server";
const client = hc<AppType>("http://localhost:3000");
// Fully typed API calls
const users = await client.users.$get();
const json = await users.json(); // { users: [] }
const newUser = await client.users.$post({
json: { name: "John" },
});
const created = await newUser.json(); // { id: 1, name: "John" }
const user = await client.users[":id"].$get({
param: { id: "1" },
});import { describe, expect, test } from "vitest";
import app from "./app";
describe("API", () => {
test("GET / returns hello", async () => {
const res = await app.request("/");
expect(res.status).toBe(200);
expect(await res.text()).toBe("Hello Hono!");
});
test("POST /users creates user", async () => {
const res = await app.request("/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "John", email: "john@example.com" }),
});
expect(res.status).toBe(201);
const json = await res.json();
expect(json.name).toBe("John");
});
test("GET /users/:id returns user", async () => {
const res = await app.request("/users/123");
expect(res.status).toBe(200);
const json = await res.json();
expect(json.id).toBe("123");
});
test("returns 401 without auth", async () => {
const res = await app.request("/protected");
expect(res.status).toBe(401);
});
test("returns 200 with auth", async () => {
const res = await app.request("/protected", {
headers: { Authorization: "Bearer token" },
});
expect(res.status).toBe(200);
});
});import { testClient } from "hono/testing";
describe("API with testClient", () => {
test("typed client testing", async () => {
const client = testClient(app);
const res = await client.users.$get();
expect(res.status).toBe(200);
const data = await res.json();
expect(data.users).toEqual([]);
});
});import { Hono } from "hono";
import { serveStatic } from "hono/bun";
const app = new Hono();
// Serve static files from ./public
app.use("/static/*", serveStatic({ root: "./public" }));
// Serve index.html for root
app.get("/", serveStatic({ path: "./public/index.html" }));
// SPA fallback
app.use("*", serveStatic({ root: "./public" }));
app.use("*", serveStatic({ path: "./public/index.html" }));
export default app;bun add @hono/zod-openapiimport { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
const app = new OpenAPIHono();
const getUserRoute = createRoute({
method: "get",
path: "/users/{id}",
request: {
params: z.object({
id: z.string().openapi({ example: "123" }),
}),
},
responses: {
200: {
content: {
"application/json": {
schema: z.object({
id: z.string(),
name: z.string(),
}),
},
},
description: "User found",
},
404: {
description: "User not found",
},
},
});
app.openapi(getUserRoute, (c) => {
const { id } = c.req.valid("param");
return c.json({ id, name: "John" });
});
// Generate OpenAPI spec
app.doc("/openapi.json", {
openapi: "3.0.0",
info: { title: "My API", version: "1.0.0" },
});
// Swagger UI
app.get("/docs", (c) => {
return c.html(`
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script>
<script>
SwaggerUIBundle({ url: '/openapi.json', dom_id: '#swagger-ui' });
</script>
</body>
</html>
`);
});const v1 = new Hono();
v1.get("/users", (c) => c.json({ version: "v1", users: [] }));
const v2 = new Hono();
v2.get("/users", (c) => c.json({ version: "v2", data: { users: [] } }));
const app = new Hono();
app.route("/api/v1", v1);
app.route("/api/v2", v2);import { createMiddleware } from "hono/factory";
const requestId = createMiddleware(async (c, next) => {
const id = crypto.randomUUID();
c.set("requestId", id);
c.header("X-Request-ID", id);
await next();
});
app.use(requestId);import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
app.get("/users", async (c) => {
const users = await prisma.user.findMany();
return c.json({ users });
});
app.post("/users", zValidator("json", CreateUserSchema), async (c) => {
const data = c.req.valid("json");
const user = await prisma.user.create({ data });
return c.json(user, 201);
});import { jwt } from "hono/jwt";
// JWT middleware
app.use("/api/*", jwt({ secret: process.env.JWT_SECRET! }));
app.get("/api/me", (c) => {
const payload = c.get("jwtPayload");
return c.json({ userId: payload.sub });
});
// Login endpoint (outside protected routes)
app.post("/login", async (c) => {
const { email, password } = await c.req.json();
// Validate credentials...
const token = await sign(
{ sub: user.id, exp: Math.floor(Date.now() / 1000) + 60 * 60 },
process.env.JWT_SECRET!,
);
return c.json({ token });
});app.onError()app.request() for fast, isolated testsAppType for end-to-end type inferencesecureHeaders() middleware© shepherdjerred, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in packages/dotfiles/dot_agents/skills/hono-helper of shepherdjerred/monorepo.
Open the folder on GitHubat commit bc57ca5
Hono Helper next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hono Helper this skillshepherdjerred/monorepo | 112 | — | ~4.3k | Automated safety check: Pass | GPL-3.0 | |
| Mastra Honojwynia/agent-skills | 169 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Hono Idiomsirahardianto/awesome-agv | 157 | — | ~3k | Automated safety check: Pass | MIT | |
| Hono Routingsecondsky/claude-skills | 227 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Typescript Idiomsirahardianto/awesome-agv | 157 | — | ~6.1k | Automated safety check: Pass | MIT | |
| World Book Skillecho-xianyu/worldbook-skill | 211 | — | ~1.8k | Automated safety check: Pass | Custom licence |
jwynia/agent-skills
Develop AI agents, tools, and workflows with Mastra v1 Beta and Hono servers.
irahardianto/awesome-agv
Hono lightweight web framework patterns: type-safe route handlers, middleware composition, Zod validation, and RPC clients for Cloudflare Workers, Node, or Bun.
secondsky/claude-skills
Type-safe Hono APIs with routing, middleware, RPC. An agent skill from secondsky/claude-skills.
irahardianto/awesome-agv
TypeScript strict typing: type narrowing, discriminated unions, Zod runtime validation, generic utility types, and Vitest testing.
echo-xianyu/worldbook-skill
Create and manage SillyTavern Character Cards (角色卡) and World Books (世界书).
victorgarciaesgi/regle
Core Regle form validation in Vue 3 — setup with useRegle, the reactive r$ object, validation properties, displaying errors, and modifiers.
shepherdjerred/monorepo
Bun runtime APIs and current operational patterns for files, processes, modules, networking, databases, tests, and deployment.
shepherdjerred/monorepo
Current Bun test runner guidance for discovery, isolation, parallelism, sharding, changed tests, mocks, timers, snapshots, coverage, DOM Testing Library, and integration teardown.
shepherdjerred/monorepo
Current Bun workspace guidance for isolated and hoisted linkers, catalogs, filters, scripts, dependency classes, lockfiles, lifecycle trust, caches, publishing, TypeScript package exports, and…
shepherdjerred/monorepo
This skill should be used when the user asks to "deep research", "research this topic", "investigate thoroughly", "do a deep dive on", "comprehensive research on", "find everything about", "survey…
shepherdjerred/monorepo
This skill should be used when the user asks to "create a Figma design", "design in Figma", "make a Figma mockup", "create an app icon", "design UI", "render JSX to Figma", "export from Figma"…
shepherdjerred/monorepo
Current Fish shell scripting, functions, abbreviations, completions, variables, events, configuration, plugins, testing, and safety guidance.
Categories
Hono web framework for edge-first, lightweight APIs - routing, middleware, validation, and multi-runtime support When user works with Hono, builds APIs, creates middleware, uses Zod validation with…. Hono Helper is an agent skill from shepherdjerred/monorepo.
Hono Helper fits situations like: works with Hono; creates middleware; uses Zod validation with Hono; mentions hono patterns.
Run `npx skills add shepherdjerred/monorepo --skill hono-helper -a claude-code`. Or copy the skill folder (packages/dotfiles/dot_agents/skills/hono-helper in shepherdjerred/monorepo) into .claude/skills/hono-helper in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shepherdjerred/monorepo --skill hono-helper -a codex`. Or copy the skill folder (packages/dotfiles/dot_agents/skills/hono-helper in shepherdjerred/monorepo) into .agents/skills/hono-helper in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add shepherdjerred/monorepo --skill hono-helper -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hono-helper, .gemini/skills/hono-helper, .github/skills/hono-helper and .opencode/skills/hono-helper in your project.
Going by SKILL.md and its folder, Hono Helper needs the command-line tools its instructions call (bun and npm) and credentials named JWT_SECRET. Our summary lists: Node.js.
SKILL.md names 1 domain. In commands or code: unpkg.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Hono Helper is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Hono Helper: Mastra Hono (jwynia/agent-skills, 169 stars), Hono Idioms (irahardianto/awesome-agv, 157 stars), Hono Routing (secondsky/claude-skills, 227 stars) and Typescript Idioms (irahardianto/awesome-agv, 157 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shepherdjerred (a GitHub user) maintains it in shepherdjerred/monorepo, which has 112 GitHub stars. The repository holds 63 skills in this directory. The repository was last updated on October 9, 2026.
Source: shepherdjerred/monorepo on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.