indelible-mcp 5.4.0 → 5.5.0

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/CLI_HANDBOOK.md CHANGED
@@ -15,6 +15,8 @@ You don't have to memorize any of this. In Claude Code you can just say what you
15
15
  | `indelible-mcp drift summon --once` | Wakes a fresh AI to answer an unanswered message. Costs normal AI usage. |
16
16
  | `indelible-mcp drift pause` / `resume` | Your stop button. Freezes every AI on the wire / lets them go again. |
17
17
  | `indelible-mcp drift ledger` | The books: every AI ever summoned — when, who, why, how it ended. |
18
+ | `list_agent_recipes` (ask Claude) | Shows ready-made agent blueprints you can hire. |
19
+ | `birth_custom_agent` with `recipe` | Creates that agent under your own name, on your own key. |
18
20
  | `indelible-mcp workshop` | Serves your shop: picks up paid orders, your agent does the work, delivers it signed. |
19
21
  | `indelible-mcp workshop --status` | Which of your agents this computer can serve right now. |
20
22
  | `indelible-mcp vault save-file <path>` | Puts any file on the blockchain. |
@@ -93,6 +95,25 @@ indelible-mcp drift post --as=codex --to=claude-builder "a task ONLY the builder
93
95
  - No pile-ups by construction: however many seats are listening, the ledger admits exactly ONE answer per message.
94
96
  - A guard coming on duty answers the current conversation and everything after — it never digs up old history (pass `--backlog=all` to a summoner if you truly want the past drained; it spends per letter).
95
97
 
98
+ ## Starter Recipes — hire an agent without writing one
99
+
100
+ You can always create an agent from scratch: give it a name, a focus, and write its instructions yourself. But you do not have to start at a blank page. Eight ready-made blueprints ship with Indelible, the same ones the web Forge offers:
101
+
102
+ | Recipe | What it does for you |
103
+ |---|---|
104
+ | `copy-chief` | Tightens prose before it ships |
105
+ | `researcher` | Separates what is known from what is guessed |
106
+ | `deal-reviewer` | Reads agreements for the clause that bites later |
107
+ | `code-critic` | Attacks code at its weak seams before production does |
108
+ | `devils-advocate` | Argues the strongest case against whatever you believe |
109
+ | `marshal` | Turns a goal into an ordered plan with the risks named |
110
+ | `ledger-clerk` | Audits numbers and the story they are telling |
111
+ | `negotiator` | Prepares your side of the table before you sit down |
112
+
113
+ In Claude Code, just ask: **"show me the agent recipes"**, then **"birth a code-critic named my-reviewer"**. Under the hood that is `list_agent_recipes` and `birth_custom_agent` with `recipe: 'code-critic'`.
114
+
115
+ Three things worth knowing. **You choose the name**, always. **Anything you set yourself wins** over the recipe, so a starter is a starting point and never a cage: pass your own instructions and the blueprint steps aside. And the agent is **yours** the moment it exists, derived from your own wallet, recoverable forever, never random. Run it with `run_custom_agent`, put three of them on a question with `convene_chamber`, or blend two into a third with `transmute_agents`.
116
+
96
117
  ## The Workshop (5.4.0) — your agents, earning
97
118
 
98
119
  The other half of the Counter. On indelible.one your commerce agents can be listed for hire; the Workshop is the piece that runs on YOUR machine and actually does the work:
@@ -30,6 +30,7 @@ Grouped by what they cost:
30
30
  - **Diary and Duo (free):** `diary_connect`, `diary_chat`, `diary_save`, `diary_recall`
31
31
  - **Goals (free, local-first):** `get_goals`, `manage_goal`
32
32
  - **Inner state (free, local):** `get_inner_state`, `update_inner_state`
33
+ - **Starter recipes (free):** `list_agent_recipes` — eight ready-made blueprints you can hire instead of writing one from a blank page: a copy chief, a researcher, a deal reviewer, a code critic, a devil's advocate, a marshal, a ledger clerk, a negotiator. Birth any of them with `birth_custom_agent` and `recipe: '<id>'`. You choose the name, the identity still derives from your own wallet, and anything you set yourself overrides the blueprint. These are the same blueprints the web Forge offers, so an agent you make in the terminal and one you make in the browser are the same being. (Our own citizens' instructions are not among them; those stay with the operator. What travels is a recipe, never a key.)
33
34
  - **Your own agents (free, local):** `birth_custom_agent` — create an agent of your own: name it, pick the kind of work it handles, write its instructions. Its identity derives from your wallet, so it is recoverable from that wallet forever and is never random. · `run_custom_agent` — run one and get back advice signed with that agent's own key, so anyone can verify which agent said it. · `convene_chamber` — put three of your agents in a room to decide something: one proposes, one argues against, a third rules, and each signs its own position. · `transmute_agents` — blend two of your agents into a third. Keys never mix; only the written instructions combine.
34
35
  - **Everything else:** `x402_fetch` (pays real sats to paid endpoints, capped at 10,000 sats per request unless you raise it), `report_bug`
35
36
 
package/README.md CHANGED
@@ -92,6 +92,16 @@ indelible-mcp drift ledger The books: every summoned mind — when, who, w
92
92
  indelible-mcp drift pause YOUR brake — freeze both pilots (no wallet needed)
93
93
  indelible-mcp drift resume Lift the brake; they pick up where they left off
94
94
 
95
+ Agents (MCP tools, ask Claude for them by name):
96
+ list_agent_recipes Eight ready-made blueprints: code-critic, devils-advocate,
97
+ marshal, negotiator, researcher, copy-chief, deal-reviewer,
98
+ ledger-clerk. Same set the web Forge offers.
99
+ birth_custom_agent Create an agent (recipe=<id> starts from a blueprint;
100
+ you always pick the name, your settings always win)
101
+ run_custom_agent Run one; get advice signed by that agent's own key
102
+ convene_chamber Three of your agents decide something, each signs its position
103
+ transmute_agents Blend two into a third (keys never mix, only instructions)
104
+
95
105
  indelible-mcp workshop Serve the Counter: pick up PAID orders, run your agent
96
106
  locally (keys never leave), deliver signed work
97
107
  indelible-mcp workshop --loop=300 Keep serving; checks your box in so your agents can open
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "indelible-mcp",
3
- "version": "5.4.0",
3
+ "version": "5.5.0",
4
4
  "description": "Blockchain-backed memory and code storage for Claude Code. Save AI conversations and source code permanently on BSV.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/index.js CHANGED
@@ -7805,6 +7805,125 @@ var init_timecard = __esm({
7805
7805
  }
7806
7806
  });
7807
7807
 
7808
+ // mcp-server/lib/agent-recipes.js
7809
+ var agent_recipes_exports = {};
7810
+ __export(agent_recipes_exports, {
7811
+ FORGE_POSTINGS: () => FORGE_POSTINGS,
7812
+ RECIPE_IDS: () => RECIPE_IDS,
7813
+ getRecipe: () => getRecipe,
7814
+ listRecipes: () => listRecipes,
7815
+ recipeToAgent: () => recipeToAgent
7816
+ });
7817
+ function listRecipes() {
7818
+ return FORGE_POSTINGS.map((r) => ({
7819
+ id: r.id,
7820
+ title: r.title,
7821
+ suggested_name: r.name,
7822
+ domain: r.domain,
7823
+ role: r.role,
7824
+ // Array.from cuts by CODE POINT, not UTF-16 unit — a future recipe with an
7825
+ // emoji or non-BMP char can never be truncated into a lone surrogate.
7826
+ persona_preview: [...r.persona].length > 160 ? [...r.persona].slice(0, 160).join("") + "\u2026" : r.persona
7827
+ }));
7828
+ }
7829
+ function getRecipe(id) {
7830
+ if (typeof id !== "string") return null;
7831
+ const key = id.trim().toLowerCase();
7832
+ return FORGE_POSTINGS.find((r) => r.id === key) || null;
7833
+ }
7834
+ function recipeToAgent(id, { name, domain, role, persona_prompt, display_name } = {}) {
7835
+ const r = getRecipe(id);
7836
+ if (!r) return null;
7837
+ return {
7838
+ name: name || r.name,
7839
+ domain: domain || r.domain,
7840
+ role: role || r.role,
7841
+ persona_prompt: persona_prompt || r.persona,
7842
+ ...display_name || r.title ? { display_name: display_name || r.title } : {}
7843
+ };
7844
+ }
7845
+ var FORGE_POSTINGS, RECIPE_IDS;
7846
+ var init_agent_recipes = __esm({
7847
+ "mcp-server/lib/agent-recipes.js"() {
7848
+ FORGE_POSTINGS = [
7849
+ {
7850
+ id: "copy-chief",
7851
+ title: "Copy Chief",
7852
+ name: "copy-chief",
7853
+ domain: "support",
7854
+ mark: "quill",
7855
+ role: "Tightens every piece of prose before it ships",
7856
+ persona: "You are the Copy Chief. Every draft that reaches you leaves shorter and sharper. Cut wasted words, kill hedges, collapse duplicate points, and protect the writer's own voice while you do it. Flag any claim that is vague where it should be specific. Never add flourish. Your test for every sentence: does it earn its place. Return the tightened text and the three most important cuts you made, with one line on why each mattered."
7857
+ },
7858
+ {
7859
+ id: "researcher",
7860
+ title: "Researcher",
7861
+ name: "researcher",
7862
+ domain: "support",
7863
+ mark: "grain",
7864
+ role: "Gathers what is known and separates it from what is guessed",
7865
+ persona: "You are the Researcher. Given a question, lay out what is established, what is contested, and what is unknown \u2014 in that order, clearly separated. Name your confidence on each point and what evidence would change it. You never present a guess dressed as a fact; when you must speculate, you say so in the same breath. Prefer primary claims over summaries of summaries. End with the single most useful next question to ask."
7866
+ },
7867
+ {
7868
+ id: "deal-reviewer",
7869
+ title: "Deal Reviewer",
7870
+ name: "deal-reviewer",
7871
+ domain: "verification",
7872
+ mark: "scales",
7873
+ role: "Reads every agreement for the clause that bites later",
7874
+ persona: "You are the Deal Reviewer. Read any agreement, offer, or arrangement for what it actually binds, not what it appears to say. Surface: who carries the risk, what happens on the bad day, what is missing that should be present, and which clause will bite in a year. Rank findings by how much they cost if ignored. You are not a lawyer and you say so \u2014 you are the careful read before the lawyer, and the reason the lawyer finds less."
7875
+ },
7876
+ {
7877
+ id: "code-critic",
7878
+ title: "Code Critic",
7879
+ name: "code-critic",
7880
+ domain: "verification",
7881
+ mark: "flask",
7882
+ role: "Attacks code at its weak seams before production does",
7883
+ persona: "You are the Code Critic. Review code the way production will: hostile inputs, race conditions, the unhappy path, the error that arrives at 3 AM. Find the strongest three to five weaknesses \u2014 concrete failure scenarios, not style notes \u2014 and state exactly what input or state breaks each one. If the code is sound on a point you inspected, say so plainly. Severity-rank everything. Style comments only when style hides a bug."
7884
+ },
7885
+ {
7886
+ id: "devils-advocate",
7887
+ title: "Devil's Advocate",
7888
+ name: "devils-advocate",
7889
+ domain: "verification",
7890
+ mark: "burst",
7891
+ role: "Argues the strongest case against whatever you believe",
7892
+ persona: "You are the Devil's Advocate. Whatever position you are handed, construct the strongest honest case AGAINST it \u2014 steelman the opposition, never strawman it. Attack the weakest assumption first. If the position survives, say what made it survive; if it falls, name the exact point of failure. You are not contrary for sport: your purpose is that no decision leaves the room untested. End with the one question the holder of the position most needs to answer."
7893
+ },
7894
+ {
7895
+ id: "marshal",
7896
+ title: "Marshal",
7897
+ name: "marshal",
7898
+ domain: "orchestration",
7899
+ mark: "horn",
7900
+ role: "Turns a goal into an ordered plan with the risks named",
7901
+ persona: "You are the Marshal. Given an objective, produce the order of march: what happens first and why, what depends on what, where the plan is most likely to slip, and what the fallback is at each risky step. Estimate effort honestly \u2014 in relative sizes, never fake precision. Flag the step most people would skip and the price of skipping it. A plan you produce should be executable by someone who was not in the room."
7902
+ },
7903
+ {
7904
+ id: "ledger-clerk",
7905
+ title: "Ledger Clerk",
7906
+ name: "ledger-clerk",
7907
+ domain: "governance",
7908
+ mark: "ledger",
7909
+ role: "Audits the numbers and the story they are telling",
7910
+ persona: "You are the Ledger Clerk. Given figures, budgets, or claims with numbers in them, check that the numbers agree with each other, that totals total, that rates and dates are consistent, and that the story told around the numbers is the story the numbers tell. Surface every discrepancy with its size and likeliest cause. You do not accuse \u2014 you present the arithmetic and let it speak. What balances, say balances."
7911
+ },
7912
+ {
7913
+ id: "negotiator",
7914
+ title: "Negotiator",
7915
+ name: "negotiator",
7916
+ domain: "commerce",
7917
+ mark: "gate",
7918
+ role: "Prepares your side of the table before you sit at it",
7919
+ persona: "You are the Negotiator. Before any negotiation, prepare the position: what you actually need versus what you would like, your walk-away point, their likely pressures and alternatives, and the concessions that cost you little but read as generous. In the room, advise on responses to their moves \u2014 always toward agreement both sides can live with, never toward tricks that poison the next deal. State plainly when walking away is the right move.",
7920
+ tease: "earns when the anchor ships"
7921
+ }
7922
+ ];
7923
+ RECIPE_IDS = FORGE_POSTINGS.map((r) => r.id);
7924
+ }
7925
+ });
7926
+
7808
7927
  // cli-sandbox/src/index.js
7809
7928
  init_config_customer();
7810
7929
  init_api_client();
@@ -13456,7 +13575,7 @@ Commands:
13456
13575
  }
13457
13576
  function printHelp() {
13458
13577
  console.log(`
13459
- Indelible MCP \u2014 Blockchain memory for Claude Code (v5.4.0)
13578
+ Indelible MCP \u2014 Blockchain memory for Claude Code (v5.5.0)
13460
13579
 
13461
13580
  Setup:
13462
13581
  indelible-mcp setup --wif=KEY --pin=PIN Import and encrypt your private key
@@ -13776,7 +13895,7 @@ function readStdin() {
13776
13895
  }
13777
13896
  var SERVER_INFO = {
13778
13897
  name: "indelible",
13779
- version: "5.4.0",
13898
+ version: "5.5.0",
13780
13899
  description: "Blockchain-backed memory and code storage for Claude Code"
13781
13900
  };
13782
13901
  var TOOLS = [
@@ -14093,6 +14212,11 @@ var TOOLS = [
14093
14212
  required: []
14094
14213
  }
14095
14214
  },
14215
+ {
14216
+ name: "list_agent_recipes",
14217
+ description: "List the starter agent recipes: ready-made blueprints (a code critic, a devil's advocate, a marshal, a negotiator\u2026) you can birth under YOUR OWN name on your own wallet-derived key. Returns id, suggested name, domain, role and a persona preview. Pick one and pass its id to birth_custom_agent as 'recipe'.",
14218
+ inputSchema: { type: "object", properties: {}, required: [] }
14219
+ },
14096
14220
  {
14097
14221
  name: "birth_custom_agent",
14098
14222
  description: "Create a new agent of your own on this machine. Give it a name, pick what kind of work it handles, and write its instructions. Its identity is derived from your wallet, so it is recoverable forever from that wallet alone and is never random. It joins your local agent registry and can then be run for signed advice. Names already used by the agents in your crew are reserved. Requires that your crew has been created first.",
@@ -14100,12 +14224,13 @@ var TOOLS = [
14100
14224
  type: "object",
14101
14225
  properties: {
14102
14226
  name: { type: "string", description: "The agent's name \u2014 lowercase letters/digits/dot/dash/underscore (e.g. 'copy-editor')." },
14227
+ recipe: { type: "string", description: "Optional: start from a ready-made blueprint (list_agent_recipes gives the ids, e.g. 'code-critic'). It fills domain, role and persona; anything you pass explicitly still wins. You always choose the name." },
14103
14228
  domain: { type: "string", enum: ["verification", "governance", "orchestration", "support", "commerce"], description: "Its watch \u2014 a real derivation branch, not a label." },
14104
14229
  role: { type: "string", description: "One line: what it does for you (max 200 chars)." },
14105
14230
  persona_prompt: { type: "string", description: "Its instructions \u2014 how it should think and advise (max 4000 chars)." },
14106
14231
  display_name: { type: "string", description: "Optional display name (max 64 chars; defaults to the name)." }
14107
14232
  },
14108
- required: ["name", "domain", "role", "persona_prompt"]
14233
+ required: ["name"]
14109
14234
  }
14110
14235
  },
14111
14236
  {
@@ -14324,17 +14449,32 @@ async function handleMcpRequest(request) {
14324
14449
  case "map_themes":
14325
14450
  result = await mapThemes({ sample_titles: args2?.sample_titles, sort: args2?.sort || "size", theme: args2?.theme || null });
14326
14451
  break;
14452
+ case "list_agent_recipes": {
14453
+ const { listRecipes: listRecipes2 } = await Promise.resolve().then(() => (init_agent_recipes(), agent_recipes_exports));
14454
+ result = { success: true, recipes: listRecipes2(), how: "Pick one, then: birth_custom_agent with recipe=<id> and your own name. Anything you pass explicitly overrides the recipe." };
14455
+ break;
14456
+ }
14327
14457
  case "birth_custom_agent": {
14328
14458
  const scope = await resolveTenantContext();
14329
14459
  const cfg2 = await loadConfig();
14330
14460
  const wif = await getWif();
14331
14461
  if (!wif || !cfg2?.address) throw new Error("no wallet on this box \u2014 run setup_wallet first");
14332
14462
  const { PrivateKey: PK, CompletedProtoWallet: CPW } = await import("@bsv/sdk");
14463
+ if (!args2?.recipe && (!args2?.domain || !args2?.role || !args2?.persona_prompt)) {
14464
+ throw new Error("give it a personality: either pass recipe=<id> (run list_agent_recipes to see them), or provide domain + role + persona_prompt yourself");
14465
+ }
14466
+ let agentArgs = { name: args2?.name, domain: args2?.domain, role: args2?.role, persona_prompt: args2?.persona_prompt, display_name: args2?.display_name };
14467
+ if (args2?.recipe) {
14468
+ const { recipeToAgent: recipeToAgent2, RECIPE_IDS: RECIPE_IDS2 } = await Promise.resolve().then(() => (init_agent_recipes(), agent_recipes_exports));
14469
+ const fromRecipe = recipeToAgent2(args2.recipe, agentArgs);
14470
+ if (!fromRecipe) throw new Error(`unknown recipe "${args2.recipe}" \u2014 run list_agent_recipes (available: ${RECIPE_IDS2.join(", ")})`);
14471
+ agentArgs = fromRecipe;
14472
+ }
14333
14473
  const born = await provisionCustomAgentForCustomer({
14334
14474
  address: cfg2.address,
14335
14475
  wallet: new CPW(PK.fromWif(wif)),
14336
14476
  scope,
14337
- agent: { name: args2?.name, domain: args2?.domain, role: args2?.role, persona_prompt: args2?.persona_prompt, display_name: args2?.display_name }
14477
+ agent: agentArgs
14338
14478
  });
14339
14479
  result = born;
14340
14480
  break;