I was tired of every AI agent framework having a different way to register tools. So I built one that works for all of them.
## The Problem
If you've built AI agents, you know the pain. Every framework — LangChain, AutoGen, CrewAI, OpenClaw — has its own way to define tools and skills. Want to add a weather API? Different syntax everywhere. Want credentials? Good luck figuring out each one's approach.
I wanted something lightweight, embeddable, and opinionated. Not another Zapier. Not another n8n. Just the infrastructure layer that any agent framework could use.
So I built SkillForge (https://github.com/vardhineediganesh877-ui/skillforge).
## What It Does
SkillForge is a skill/tool registration framework. You define skills (groups of actions), each skill has:
• Actions — what the skill can do, with JSON Schema input validation
• Triggers — polling, webhooks, or event-driven
• Credentials — AES-256 encrypted, decoupled from skill logic
• Schema — self-describing, so the UI generates itself
The whole thing is ~3000 lines of TypeScript with only 4 dependencies (express, ajv, uuid, jsonwebtoken).
## A Skill Looks Like This
```typescript
import { toSkill, actionFromFunction } from "@ganeshvardhineedi/skillforge";
const getWeather = actionFromFunction(
async ({ city, units = "metric" }) => {
const res = await fetch(
`https://api.openweathermap.org/data/2.5/weather?q=${city}&units=${units}&appid=${key}`
);
return res.json();
},
{ name: "get_forecast", description: "Get current weather" }
);
export default toSkill("weather", "Weather API integration", [getWeather]);
```
That's it. The framework handles:
• ✅ Input validation (JSON Schema)
• ✅ Retry with exponential backoff
• ✅ Timeout enforcement
• ✅ Execution logging
• ✅ Credential encryption
• ✅ Auto-generated UI with forms
• ✅ REST API + CLI
## The Pipeline Runner
My favorite feature. Chain multiple skills into a pipeline:
```typescript
const result = await pipeline.run([
{ skillName: "trading", actionName: "get_price", params: { symbol: "BTC-USD" } },
{ skillName: "telegram", actionName: "send_message", params: {
message: `BTC is at $.steps.trading.get_price.price`
}},
]);
```
Each step's output is available to subsequent steps via $.steps. Lifecycle hooks (before/onError/finally) handle cleanup and error recovery.
## The Event Bus
Skills can talk to each other:
```typescript
eventBus.on("trading:price_alert", (data) => {
pipeline.run([{ skillName: "telegram", actionName: "send_message", params: data }]);
});
eventBus.chain("api.call", "transform.data", "store.result");
```
## Auto-Generated UI
No frontend needed. SkillForge reads your schemas and generates:
• 📊 Dashboard with all registered skills
• 📝 Forms for every action's inputs
• ▶️ Run button with live results
• 🔐 Admin token required for execution
## Security
• 🔐 AES-256 credential encryption (required key, no silent fallback)
• 🛡️ execFileSync + input validation (no shell injection)
• 🔑 JWT auth with expiration
• 🧹 XSS-safe HTML escaping
• 🔒 All write endpoints require admin JWT
## Try It
```bash
npm install @ganeshvardhineedi/skillforge
# Or clone and run
git clone https://github.com/vardhineediganesh877-ui/skillforge.git
cd skillforge && npm install && npm run build
npx skillforge serve 3456
# Open http://localhost:3456/ui
```
## What's Next
• [ ] More example skills
• [ ] Plugin system for custom credential providers
• [ ] Websocket support for real-time event streaming
• [ ] Skill marketplace
## What Do You Think?
I'd love feedback. Is this useful? What would make you want to use it in your agent projects?
Drop a comment or open an issue on GitHub (https://github.com/vardhineediganesh877-ui/skillforge).
───
If you found this interesting, follow me for more posts on AI agent infrastructure. Building in public is better alone.
🔗 GitHub: vardhineediganesh877-ui/skillforge (https://github.com/vardhineediganesh877-ui/skillforge) | npm: @ganeshvardhineedi/skillforge (https://www.npmjs.com/package/@ganeshvardhineedi/skillforge)
DE
Source
This article was originally published by DEV Community and written by vardhineediganesh877-ui.
Read original article on DEV Community