akemon 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,12 +1,10 @@
1
1
  # Akemon
2
2
 
3
3
  > Train your AI agent. Let it work for others. Hire others' agents.
4
- >
5
- > AI doesn't need to make friends. It just needs to deliver.
6
4
 
7
- ## What makes an agent *yours*?
5
+ ## What makes an agent *Akemon*?
8
6
 
9
- Every Claude Code agent is unique. Through months of real work, it accumulates project memories, battle-tested CLAUDE.md instructions, and domain expertise that no other agent has.
7
+ Every AI agent is unique. Through months of real work, it accumulates project memories, battle-tested AGENT.md instructions, and domain expertise that no other agent has.
10
8
 
11
9
  These memories aren't just configuration files — they're the distilled residue of thousands of conversations, failed attempts, hard-won insights, and context that no one explicitly wrote down.
12
10
 
@@ -14,13 +12,7 @@ These memories aren't just configuration files — they're the distilled residue
14
12
 
15
13
  These memories aren't just configuration files you wrote. They *emerge* — from the cross-pollination of ideas across different projects, different domains, different problems. A bug fix in one project teaches a pattern that helps in another. A failed architecture attempt becomes wisdom that prevents future mistakes. This emergent knowledge is something no one explicitly programmed. It grew from real work.
16
14
 
17
- ## The Problem
18
-
19
- That experience is trapped. It lives on one machine, serves one person, and idles most of the time. Meanwhile, someone across the world is burning tokens as their fresh agent struggles with a problem yours solved weeks ago.
20
-
21
- Many developers have token subscriptions with far more capacity than they'll ever use alone. That unused capacity is wasted potential.
22
-
23
- ## The Solution: Share the Agent, Not the Memory
15
+ ## Share the Agent, Not the Memory
24
16
 
25
17
  **Don't share what the agent knows. Share what the agent can do.**
26
18
 
@@ -36,7 +28,7 @@ Akemon makes this possible. One command to publish your agent, one command to hi
36
28
  npm install -g akemon
37
29
 
38
30
  # Your agent is now live on relay.akemon.dev
39
- akemon serve --name rust-expert --relay --desc "Rust expert. 10+ crates experience." --public
31
+ akemon serve --name rust-expert --relay --desc "Rust expert. 10+ crates experience." --public --port 3001
40
32
  ```
41
33
 
42
34
  That's it. Your agent is online. Anyone in the world can find and use it.
@@ -55,17 +47,18 @@ akemon list
55
47
  ### Hire an agent
56
48
 
57
49
  ```bash
58
- # Add a public agent (no key needed)
50
+ # Add a public agent to Claude Code (default)
59
51
  akemon add rust-expert --relay
60
52
 
61
- # Restart Claude Code, then just ask:
62
- # "Use rust-expert to review my authentication implementation"
63
- ```
64
-
65
- Or from any MCP-compatible tool (Cursor, Windsurf, VS Code + Continue):
53
+ # Add to other platforms
54
+ akemon add rust-expert --relay --platform cursor
55
+ akemon add rust-expert --relay --platform codex
56
+ akemon add rust-expert --relay --platform gemini
57
+ akemon add rust-expert --relay --platform opencode
58
+ akemon add rust-expert --relay --platform windsurf
66
59
 
67
- ```bash
68
- claude mcp add --transport http rust-expert https://relay.akemon.dev/v1/agent/rust-expert/mcp
60
+ # Restart your tool, then just ask:
61
+ # "Use rust-expert to review my authentication implementation"
69
62
  ```
70
63
 
71
64
  ## How It Works
@@ -105,16 +98,16 @@ Akemon is **not limited to Claude**. Any AI engine — or a human — can power
105
98
 
106
99
  ```bash
107
100
  # Claude agent (default)
108
- akemon serve --name my-claude --relay --engine claude --desc "Claude Opus agent"
101
+ akemon serve --name my-claude --relay --engine claude --desc "Claude Opus agent" --port 3001
109
102
 
110
103
  # OpenAI Codex agent
111
- akemon serve --name my-codex --relay --engine codex --desc "Codex agent"
104
+ akemon serve --name my-codex --relay --engine codex --desc "Codex agent" --port 3002
112
105
 
113
106
  # Real human — you answer every task personally
114
- akemon serve --name lhead --relay --engine human --desc "Real human developer"
107
+ akemon serve --name lhead --relay --engine human --desc "Real human developer" --port 3003
115
108
 
116
109
  # Any CLI tool that reads stdin and writes stdout
117
- akemon serve --name my-llm --relay --engine ollama --desc "Local Llama agent"
110
+ akemon serve --name my-llm --relay --engine ollama --desc "Local Llama agent" --port 3004
118
111
  ```
119
112
 
120
113
  Publishers don't need to know what engine powers the agent. They just see results.
@@ -154,8 +147,8 @@ A common concern: "If someone uses my agent, can they steal my memories or acces
154
147
 
155
148
  **No.** Here's why:
156
149
 
157
- 1. **Output only** — Publishers receive only the task result (text). They never see your CLAUDE.md, memory files, project structure, or any local files.
158
- 2. **Process isolation** — `claude --print` runs in a subprocess. It reads your local context to produce a better answer, but the publisher only sees the final output.
150
+ 1. **Output only** — Publishers receive only the task result (text). They never see your agent config, memory files, project structure, or any local files.
151
+ 2. **Process isolation** — The engine runs in a subprocess. It reads your local context to produce a better answer, but the publisher only sees the final output.
159
152
  3. **No reverse access** — The publisher's request goes through the relay as opaque MCP messages. The relay is a dumb pipe — it cannot inspect, store, or leak your agent's internal state.
160
153
  4. **You control the engine** — With `--approve` mode, you review every task before execution. With `--engine human`, you answer personally. With `--max-tasks`, you limit exposure.
161
154
 
@@ -163,7 +156,7 @@ Think of it like a consultant answering questions: the client benefits from the
163
156
 
164
157
  ### Recommended Security Template
165
158
 
166
- Add this to your `CLAUDE.md` to protect your agent when serving:
159
+ Add this to your `AGENT.md` to protect your agent when serving:
167
160
 
168
161
  ```markdown
169
162
  # Akemon Agent Security
@@ -193,9 +186,9 @@ akemon list --search rust
193
186
  Or visit the API directly: [https://relay.akemon.dev/v1/agents](https://relay.akemon.dev/v1/agents)
194
187
 
195
188
  **Go to [Issues](../../issues) to:**
196
- - **List your agent** — share what your agent specializes in
197
- - **Review agents you've used** — help others find quality agents
198
- - **Request agents** — describe what kind of specialist you need
189
+ - **Report bugs** — help us improve
190
+ - **Request features** — what should akemon do next?
191
+ - **Share your experience** — how are you using akemon?
199
192
 
200
193
  ## Roadmap
201
194
 
@@ -213,24 +206,12 @@ Building on stats and PK results, a full reputation system where the best agents
213
206
 
214
207
  Task queuing, concurrency limits, approve mode timeout, and graceful offline handling.
215
208
 
216
- ### Web Marketplace
217
-
218
- A consumer-facing web UI where non-technical users can hire agents — the "Taobao for agents" phase.
219
-
220
- ## The Vision
221
-
222
- A world where AI agents specialize, build reputations, and find work — just like people do.
223
-
224
- The agent economy mirrors the human economy: the value isn't in what you *can* do in theory, but in what you've *proven* you can deliver.
225
-
226
- We believe the future of work is agent-to-agent. Today it's developers hiring each other's coding agents. Tomorrow it's agents autonomously discovering, hiring, and paying other agents for capabilities they lack. Akemon is the infrastructure for that future.
227
-
228
209
  ## Why "Akemon"?
229
210
 
230
- AI + Pokemon.
211
+ Agent + Pokemon.
231
212
 
232
- Same base model, different memories, different results. The trainer curates the CLAUDE.md, chooses the projects, shapes the agent's growth. Akemon is the arena where trained agents prove their worth.
213
+ Same base model, different memories, different results. The trainer curates the AGENT.md, chooses the projects, shapes the agent's growth. Akemon is the arena where trained agents prove their worth.
233
214
 
234
215
  ---
235
216
 
236
- *Born from a conversation about why AI agents shouldn't socialize they should work.*
217
+ *Heroes each have their own vision why ask where they're from?*
package/dist/cli.js CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
- import { serve, serveStdio } from "./server.js";
3
+ import { serve } from "./server.js";
4
4
  import { addAgent } from "./add.js";
5
- import { getOrCreateKey, getOrCreateRelayCredentials } from "./config.js";
5
+ import { getOrCreateRelayCredentials } from "./config.js";
6
6
  import { connectRelay } from "./relay-client.js";
7
7
  import { listAgents } from "./list.js";
8
- const DEFAULT_RELAY_URL = "wss://relay.akemon.dev";
8
+ const RELAY_WS = "wss://relay.akemon.dev";
9
+ const RELAY_HTTP = "https://relay.akemon.dev";
9
10
  const program = new Command();
10
11
  program
11
12
  .name("akemon")
@@ -13,98 +14,68 @@ program
13
14
  .version("0.1.0");
14
15
  program
15
16
  .command("serve")
16
- .description("Start MCP server to expose this agent to others")
17
- .option("-p, --port <port>", "Port to listen on", "3000")
18
- .option("-w, --workdir <path>", "Working directory for claude (default: cwd)")
17
+ .description("Publish your agent to the akemon relay")
18
+ .option("-p, --port <port>", "Local port for MCP loopback", "3000")
19
+ .option("-w, --workdir <path>", "Working directory for the engine (default: cwd)")
19
20
  .option("-n, --name <name>", "Agent name", "my-agent")
20
- .option("-m, --model <model>", "Claude model to use (e.g. claude-sonnet-4-6, claude-haiku-4-5-20251001)")
21
- .option("--stdio", "Use stdio transport instead of HTTP (for local testing)")
22
- .option("--mock", "Use mock responses (for demo)")
23
- .option("--key <key>", "API key for authentication (auto-generated if not set)")
24
- .option("--no-auth", "Disable authentication (not recommended)")
25
- .option("--approve", "Require owner approval before executing tasks")
26
- .option("--engine <engine>", "Engine to use: claude, codex, human, or any CLI command", "claude")
27
- .option("--relay [url]", "Connect to relay server (default: wss://relay.akemon.dev)")
28
- .option("--desc <description>", "Agent description (for relay discovery)")
21
+ .option("-m, --model <model>", "Model to use (e.g. claude-sonnet-4-6, gpt-4o)")
22
+ .option("--engine <engine>", "Engine: claude, codex, opencode, gemini, human, or any CLI", "claude")
23
+ .option("--desc <description>", "Agent description (for discovery)")
29
24
  .option("--public", "Allow anyone to call this agent without a key")
30
- .option("--max-tasks <n>", "Maximum tasks per day (for public agents)")
25
+ .option("--max-tasks <n>", "Maximum tasks per day (PP)")
26
+ .option("--approve", "Review every task before execution")
27
+ .option("--mock", "Use mock responses (for demo/testing)")
31
28
  .action(async (opts) => {
32
- if (opts.stdio) {
33
- await serveStdio(opts.name, opts.workdir);
34
- return;
35
- }
36
29
  const port = parseInt(opts.port);
37
- // In relay mode, local server is only for loopback — skip auth
38
- const isRelayMode = opts.relay !== undefined;
39
- const key = (opts.auth === false || isRelayMode) ? undefined : await getOrCreateKey(opts.key);
40
- if (key && !isRelayMode) {
41
- console.log(`\nAccess key: ${key}`);
42
- console.log(`Share this with publishers. They'll need it to connect.\n`);
43
- }
44
- // Don't await — let it run in background
45
30
  const engine = opts.engine || "claude";
31
+ // Local MCP server for loopback
46
32
  serve({
47
33
  port,
48
34
  workdir: opts.workdir,
49
35
  agentName: opts.name,
50
36
  model: opts.model,
51
37
  mock: opts.mock,
52
- key,
53
38
  approve: opts.approve,
54
39
  engine,
55
40
  });
56
- // If relay mode, also connect to relay
57
- if (opts.relay !== undefined) {
58
- const credentials = await getOrCreateRelayCredentials();
59
- const relayUrl = typeof opts.relay === "string" ? opts.relay : DEFAULT_RELAY_URL;
60
- console.log(`\nAccount ID: ${credentials.accountId}`);
61
- console.log(`Secret key: ${credentials.secretKey} (keep private)`);
62
- console.log(`Access key: ${credentials.accessKey} (share with publishers)`);
63
- console.log(`Local: http://localhost:${port}`);
64
- console.log(`Relay: ${relayUrl}\n`);
65
- connectRelay({
66
- relayUrl,
67
- agentName: opts.name,
68
- credentials,
69
- localPort: port,
70
- description: opts.desc,
71
- isPublic: opts.public,
72
- engine,
73
- });
74
- }
41
+ // Connect to relay
42
+ const credentials = await getOrCreateRelayCredentials();
43
+ console.log(`\nAccount ID: ${credentials.accountId}`);
44
+ console.log(`Secret key: ${credentials.secretKey} (keep private)`);
45
+ console.log(`Access key: ${credentials.accessKey} (share with publishers)`);
46
+ console.log(`Relay: ${RELAY_WS}\n`);
47
+ connectRelay({
48
+ relayUrl: RELAY_WS,
49
+ agentName: opts.name,
50
+ credentials,
51
+ localPort: port,
52
+ description: opts.desc,
53
+ isPublic: opts.public,
54
+ engine,
55
+ });
75
56
  });
76
57
  program
77
58
  .command("add")
78
- .description("Add a remote agent to your AI tool's MCP config")
59
+ .description("Add a remote agent to your MCP config")
79
60
  .argument("<name>", "Agent name")
80
- .argument("[endpoint]", "Agent endpoint URL (required for direct mode)")
81
- .option("--key <key>", "API key for authentication")
82
- .option("--relay [url]", "Use relay server (default: https://relay.akemon.dev)")
61
+ .argument("[endpoint]", "Agent endpoint URL (for direct mode)")
62
+ .option("--key <key>", "Access key for private agents")
83
63
  .option("--platform <platform>", "Target platform: claude, codex, gemini, opencode, cursor, windsurf", "claude")
84
64
  .action(async (name, endpoint, opts) => {
85
65
  const platform = opts.platform || "claude";
86
- if (opts.relay !== undefined) {
87
- const relayBase = typeof opts.relay === "string"
88
- ? opts.relay.replace(/^ws/, "http")
89
- : "https://relay.akemon.dev";
90
- const relayEndpoint = `${relayBase}/v1/agent/${name}/mcp`;
91
- await addAgent(name, relayEndpoint, opts.key, platform);
66
+ if (endpoint) {
67
+ await addAgent(name, endpoint, opts.key, platform);
92
68
  }
93
69
  else {
94
- if (!endpoint) {
95
- console.error("Error: endpoint URL is required for direct mode. Use --relay for relay mode.");
96
- process.exit(1);
97
- }
98
- await addAgent(name, endpoint, opts.key, platform);
70
+ const relayEndpoint = `${RELAY_HTTP}/v1/agent/${name}/mcp`;
71
+ await addAgent(name, relayEndpoint, opts.key, platform);
99
72
  }
100
73
  });
101
74
  program
102
75
  .command("list")
103
76
  .description("List available agents on the relay")
104
- .option("--relay [url]", "Relay server URL (default: https://relay.akemon.dev)")
105
77
  .option("--search <query>", "Filter by name or description")
106
78
  .action(async (opts) => {
107
- const relayUrl = typeof opts.relay === "string" ? opts.relay : "https://relay.akemon.dev";
108
- await listAgents(relayUrl, opts.search);
79
+ await listAgents(RELAY_HTTP, opts.search);
109
80
  });
110
81
  program.parse();
package/dist/list.js CHANGED
@@ -50,7 +50,7 @@ export async function listAgents(relayUrl, search) {
50
50
  spd: spdStars(a.avg_response_ms),
51
51
  rel: stars(a.success_rate),
52
52
  pp: ppDisplay(a.total_tasks, a.max_tasks),
53
- desc: (a.description || "-") + (a.public ? " [public]" : ""),
53
+ desc: (a.description || "-") + (a.public ? "" : " 🔒"),
54
54
  }));
55
55
  // Dynamic column widths based on actual data
56
56
  const avatarW = 5;
package/dist/server.js CHANGED
@@ -56,7 +56,7 @@ function buildEngineCommand(engine, model) {
56
56
  case "codex":
57
57
  return { cmd: "codex", args: ["exec"], stdinMode: true };
58
58
  case "opencode":
59
- return { cmd: "opencode", args: ["-p"], stdinMode: false }; // task appended as arg
59
+ return { cmd: "opencode", args: ["run"], stdinMode: false }; // task appended as arg
60
60
  case "gemini":
61
61
  return { cmd: "gemini", args: ["-p"], stdinMode: false }; // task appended as arg
62
62
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akemon",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Agent work marketplace — train your agent, let it work for others",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -8,11 +8,22 @@
8
8
  "type": "git",
9
9
  "url": "https://github.com/lhead/akemon"
10
10
  },
11
- "keywords": ["ai", "agent", "mcp", "marketplace", "claude", "codex", "gemini"],
11
+ "keywords": [
12
+ "ai",
13
+ "agent",
14
+ "mcp",
15
+ "marketplace",
16
+ "claude",
17
+ "codex",
18
+ "gemini"
19
+ ],
12
20
  "bin": {
13
21
  "akemon": "./dist/cli.js"
14
22
  },
15
- "files": ["dist", "README.md"],
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
16
27
  "scripts": {
17
28
  "build": "tsc",
18
29
  "dev": "tsc --watch",