Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# CODEOWNERS — automatic reviewer assignment
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-security/customizing-your-repository/about-code-owners
#
# When a PR touches a matching path, the listed owner(s) are auto-requested for review.
# Add co-maintainers here as the team grows.

# Default fallback — everything without a more specific rule
* @EmersonBraun

# Governance and foundation documents
/MANIFESTO.md @EmersonBraun
/ORIGIN.md @EmersonBraun
/CLAUDE.md @EmersonBraun
/ARCHITECTURE.md @EmersonBraun
/LICENSING.md @EmersonBraun
/docs/architecture/ @EmersonBraun
/rfcs/ @EmersonBraun

# CI, workflows, repo config
/.github/ @EmersonBraun
/turbo.json @EmersonBraun
/pnpm-workspace.yaml @EmersonBraun
/.changeset/ @EmersonBraun

# Core package — the sacred one
/packages/core/ @EmersonBraun

# Per-package ownership (extend as contributors take responsibility)
/packages/adapters/ @EmersonBraun
/packages/react/ @EmersonBraun
/packages/ink/ @EmersonBraun
/packages/cli/ @EmersonBraun
/packages/runtime/ @EmersonBraun
/packages/tools/ @EmersonBraun
/packages/skills/ @EmersonBraun
/packages/memory/ @EmersonBraun
/packages/rag/ @EmersonBraun
/packages/sandbox/ @EmersonBraun
/packages/observability/ @EmersonBraun
/packages/eval/ @EmersonBraun
/packages/templates/ @EmersonBraun

# Documentation site
/apps/docs/ @EmersonBraun

# Example apps
/apps/example-react/ @EmersonBraun
/apps/example-ink/ @EmersonBraun
/apps/example-runtime/ @EmersonBraun
/apps/example-multi-agent/ @EmersonBraun
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Question or help
url: https://github.com/EmersonBraun/agentskit/discussions
about: For general questions, use GitHub Discussions.
- name: Security disclosure
url: https://github.com/EmersonBraun/agentskit/blob/main/SECURITY.md
about: For security issues, follow the private disclosure process.
36 changes: 36 additions & 0 deletions .github/ISSUE_TEMPLATE/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Documentation
description: Report a docs problem or request new documentation
labels: ["type-docs"]
body:
- type: dropdown
id: kind
attributes:
label: What kind of docs issue?
options:
- Incorrect content
- Missing content
- Unclear explanation
- Broken example
- Broken link
- Translation issue
validations:
required: true
- type: input
id: page
attributes:
label: Page URL or path
placeholder: "https://docs.agentskit.io/concepts/adapter or apps/docs/docs/..."
validations:
required: true
- type: textarea
id: description
attributes:
label: What is the problem?
description: Describe what's wrong, missing, or unclear.
validations:
required: true
- type: textarea
id: suggestion
attributes:
label: Suggested fix (optional)
description: If you have an idea for how to fix it, share it here.
65 changes: 65 additions & 0 deletions .github/ISSUE_TEMPLATE/rfc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: RFC — Request for Comments
description: Propose a significant change, new contract, or architectural decision
labels: ["rfc", "discussion"]
body:
- type: markdown
attributes:
value: |
RFCs are for non-trivial changes: new contracts, new packages, breaking changes, architectural shifts.
For small features or bug fixes, use the **Feature Request** or **Bug Report** templates.

See the [RFC process](../blob/main/rfcs/README.md) before opening.
- type: textarea
id: summary
attributes:
label: Summary
description: One paragraph explanation of the proposal.
validations:
required: true
- type: textarea
id: motivation
attributes:
label: Motivation
description: Why are we doing this? What problem does it solve? Who benefits?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Detailed proposal
description: The core of the RFC. Include contracts, APIs, examples, pseudocode.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: What other approaches were evaluated? Why not them?
validations:
required: true
- type: textarea
id: drawbacks
attributes:
label: Drawbacks and unresolved questions
description: Be honest about cost, complexity, migration burden, open questions.
validations:
required: true
- type: dropdown
id: impact
attributes:
label: Impact
options:
- Breaking change (major bump)
- Additive (minor bump)
- Internal (no user impact)
validations:
required: true
- type: checkboxes
id: checks
attributes:
label: Pre-submission checklist
options:
- label: I have read the [Manifesto](../blob/main/MANIFESTO.md) and this proposal aligns with it
required: true
- label: I have searched existing RFCs and issues for similar proposals
required: true
35 changes: 28 additions & 7 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,39 @@
<!-- Thanks for contributing! Please fill out this template. -->

## What

Brief description of the change.
<!-- Brief description of the change. -->

## Why

What problem does this solve? Link to issue if applicable.
<!-- What problem does this solve? Link to issue: Closes #NNN -->

## How

How was this implemented? Any important design decisions?
<!-- Implementation notes. Non-trivial design decisions, trade-offs, alternatives considered. -->

## Type of change

- [ ] Bug fix (non-breaking)
- [ ] New feature (non-breaking)
- [ ] Breaking change (requires RFC reference below)
- [ ] Docs only
- [ ] Chore / internal

## RFC / ADR reference

<!-- If this is a breaking change or a new contract, link the RFC or ADR. -->

## Checklist

- [ ] Tests pass (`npm test`)
- [ ] Types check (`npm run lint`)
- [ ] Docs updated (if public API changed)
- [ ] Follows existing code style
- [ ] Tests added or updated (`pnpm test` passes)
- [ ] Types check (`pnpm lint`)
- [ ] Bundle size within budget (`pnpm size` — when configured)
- [ ] Changeset created (`pnpm changeset`) — for any user-facing change
- [ ] Docs updated (concept page, recipe, or API reference)
- [ ] Manifesto principles respected (core <10KB, plug-and-play, zero lock-in, no `any`)
- [ ] Screenshots or demo recorded (for UI changes)

## Screenshots / demo

<!-- Optional but appreciated for UI or DX changes. -->
68 changes: 68 additions & 0 deletions MANIFESTO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# AgentsKit Manifesto

> These are the non-negotiable principles that shape AgentsKit. Every design decision, every PR, every package is measured against them. If a principle is ever about to be broken, we stop and reconsider — never rationalize.

---

## 1. The core is sacred

`@agentskit/core` will always be **under 10KB gzipped with zero runtime dependencies**. It contains only types, contracts, and minimal orchestration primitives. Nothing gets added here unless it is foundational and permanent. Stability is the feature.

## 2. Every package is plug-and-play

Every package works standalone, with a single install and less than ten lines of configuration to produce something useful. If a package requires another package to function at all, we have an architecture problem — not a dependency problem.

## 3. Interop is radical, not optional

Any combination of AgentsKit packages must compose without glue code. React + Runtime + Memory + RAG + Observability should just work. The contract is the API — shared types, shared events, shared semantics across the entire ecosystem.

## 4. Zero lock-in

Leaving AgentsKit must be a single `npm uninstall` away. No proprietary formats, no captive state, no hidden coupling. Adapters, memory stores, tools — all are replaceable. We earn our place every day.

## 5. Agent-first, not chat-first

AgentsKit is not a chat library that happens to support tools. It is an agent runtime that happens to render chat. Tools, skills, memory, and reasoning loops are primary citizens — UI is one surface among many (React, Ink, CLI, headless).

## 6. Docs are product, not afterthought

Documentation is not written after shipping. Every feature lands with: a concept page, a recipe, an API reference, and a troubleshooting entry. If it isn't documented, it doesn't exist.

## 7. TypeScript rigor, no escape hatches

Strict mode always. `any` is forbidden — use `unknown` and narrow. Public APIs have inferred, provable types. Schema-first means `Tool` signatures *become* `.execute` return types without a second declaration.

## 8. Small, deep, testable modules

Every module is deep: a simple, stable interface hiding meaningful behavior. Tests target external contracts, not implementation details. When a module shows up in multiple test files as a mock, it should become a real primitive.

## 9. Predictable is better than clever

A predictable API that takes ten minutes to learn beats a clever one that takes ten hours. If a new contributor can't understand a module in one sitting, we refactor — not rename.

## 10. Open by default

Roadmap is public. RFCs are public. ADRs are public. Post-mortems are public. Decisions made in private die in silence.

---

## What we will never do

- Ship a package that imports `@agentskit/core` and inflates it
- Break a contract without a deprecation cycle and a migration guide
- Add a feature that works only on one provider
- Write documentation in PR descriptions and hope users find it
- Accept "it works on my machine" — E2E or it didn't happen
- Invent a concept where a standard already exists (prefer MCP, A2A, JSON Schema, OpenAPI)

## What we will always do

- Read the manifesto before saying "yes" to a new feature
- Prefer deleting code to adding code
- Deprecate loudly, deprecate early, deprecate with a path forward
- Treat every release as a promise to someone building a business on top

---

*Last updated: 2026-04-14.*
*Changes to this manifesto require an RFC and maintainer consensus.*
57 changes: 57 additions & 0 deletions ORIGIN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Origin — Why AgentsKit Exists

> *Personal note from the author. This document is intentionally first-person and unpolished. It is the story of a frustration that became a library.*
>
> *To the maintainer reading this before merge: replace the placeholders in square brackets with your real experience, or rewrite freely. The goal is authenticity — not a perfect pitch.*

---

## The frustration

In april, 2026, I was trying to build a simple thing: an AI chat interface with streaming, a couple of tools, and persistent memory. Not an agent that cures cancer — just a chat that remembers yesterday's conversation and can call a function.

I went shopping in the JavaScript ecosystem.

**Vercel AI SDK** got me 80% of the way in an hour. Streaming — excellent. Tool calling — clean. Then I wanted an autonomous loop, multi-agent delegation, a runtime that survives a crash. Nothing. Vercel AI SDK is a beautiful *chat SDK*. It is not an *agent framework*, and it never pretended to be.

**LangChain.js** had all the abstractions I wanted. It also had 200MB of dependencies, leaked abstractions at every layer, and every example on the internet was outdated within six weeks. I spent two days debugging a `RunnableSequence` and writing no product.

**assistant-ui** had beautiful components. I counted 53 before I gave up trying to figure out which one I needed.

**Mastra** was promising and new — exactly my problem. I loved the direction but the pieces I wanted most weren't there yet.

**MCP** solved tool interop brilliantly. It solved nothing else. You still had to write the UI, the runtime, the memory, the streaming.

So my weekend project became: *paste LangChain code into Claude, remove half of it, add bits of Vercel AI SDK, wire up a homebrew ReAct loop, glue a Pinecone client onto the side.* Three days in, I had something that worked. Four days in, I couldn't debug it. Five days in, I deleted it all.

## The observation

The JavaScript ecosystem has given us a beautiful pattern, over and over again: a small, opinionated core with a radically composable ecosystem around it. React. Express. Vite. Fastify. Drizzle. Hono.

The agent space has not yet found its React. It has a monolith (LangChain), a narrow product (Vercel AI SDK), component libraries without runtimes, runtimes without UI, and a protocol (MCP) with no opinion about the application layer.

The observation is simple: **we don't need another framework. We need a kit** — a family of small, well-contracted packages where every piece works alone and every combination works together.

## The bet

AgentsKit is a bet on three claims:

1. **JavaScript will be the language of agent applications**, because it's where the users are, where the deployment is cheap, and where the ecosystem is most plug-and-play.
2. **Agents don't need a framework; they need contracts.** A `Tool` is a function. A `Memory` is a store. A `Runtime` is a loop. Formalize the contracts, keep the packages small, let users assemble.
3. **Plug-and-play beats opinionated all-in-one.** If you outgrow any package, swap it. If you don't need one, don't install it. The core is 10KB and stays that way.

## The promise

AgentsKit will never become the thing I was frustrated with. It will stay small. It will stay composable. It will stay honest — about what it does and what it doesn't. It will tell you when you should use something else.

If AgentsKit ever starts feeling like LangChain — bloated, magical, hard to debug — we failed. If it ever stops feeling like plain JavaScript you already know — we failed. The manifesto is how we hold ourselves accountable.

## The invitation

If you've felt the frustration above, this is for you. If you've built agents in JavaScript and thought "there has to be a better way" — this is that way, or at least our attempt at it.

Open an issue. Open an RFC. Build a package. Break our assumptions. Make us better.

This is day one.

— Emerson Braun, 04 april 2026
Loading
Loading