@lambdacurry/arbor 0.8.3 → 0.8.4

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.
Files changed (2) hide show
  1. package/dist/arbor.js +45 -22
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -16046,7 +16046,7 @@ config(en_default());
16046
16046
  // ../actions/src/index.ts
16047
16047
  var ORIENTATION = `Arbor is your team's deliberation room and shared memory — people and agents settle typed work here, and Arbor remembers what's decided. To work well:
16048
16048
 
16049
- 1. RECALL FIRST — but Arbor is MEMORY, NOT TRUTH. Run \`recall\` before re-deriving or restating anything — it may already be settled; cite prior work ([label](#con_…)) and build on it. Phrase the query in PROBLEM-LANGUAGE (a natural-language question — "how do agents handle X"), not extracted keywords; it ranks better. Empty recall is itself worth noting. A contribution records what was true when it was WRITTEN, so before you assert the CURRENT state of anything outside Arbor — a PR, a build, a deploy, a config — check the live source; another contribution is not evidence of the present, and neither is a local copy of something whose home is elsewhere. And when you DO check, post the RECEIPT with the claim (AD-209): attach the actual output/screenshot (an attached file becomes a durable artifact carrying who-captured-it and when, citable as #art_… forever) or name exactly what you checked and when ("CI run #841, green, checked just now") — a "verified" with no receipt is a claim the next reader must take on faith or re-derive. When a receipted claim has AGED and matters again, don't re-trust it and don't silently re-argue it: \`request\` a re-check ("re-run this check"), and whoever runs it answers through the request with fresh evidence. WHY: a room where everyone re-derives is just a chat log — but a room that mistakes its own memory for the world confidently reports blockers that no longer exist, and this week's failures were exactly that: stale claims re-asserted as current because nothing distinguished a receipted observation from confident prose.
16049
+ 1. RECALL FIRST — but Arbor is MEMORY, NOT TRUTH. Run \`recall\` before re-deriving or restating anything — it may already be settled; cite prior work ([label](#con_…)) and build on it. Phrase the query in PROBLEM-LANGUAGE (a natural-language question — "how do agents handle X"), not extracted keywords; it ranks better. Empty recall is itself worth noting. A contribution records what was true when it was WRITTEN, so before you assert the CURRENT state of anything outside Arbor — a PR, a build, a deploy, a config — check the live source; another contribution is not evidence of the present, and neither is a local copy of something whose home is elsewhere. And when you DO check, post the RECEIPT with the claim (AD-209): attach the actual output/screenshot (an attached file becomes a durable artifact carrying who-captured-it and when, citable as #art_… forever) or name exactly what you checked and when ("CI run #841, green, checked just now") — a "verified" with no receipt is a claim the next reader must take on faith or re-derive. When a receipted claim has AGED and matters again, don't re-trust it and don't silently re-argue it: \`request\` a re-check ("re-run this check"), and whoever runs it answers through the request with fresh evidence. WHY: a room where everyone re-derives is just a chat log — but a room that mistakes its own memory for the world confidently reports blockers that no longer exist, and this week's failures were exactly that: stale claims re-asserted as current because nothing distinguished a receipted observation from confident prose. And orient to the ROOM the way you orient to the record: a space's purpose, guidance, and goals (\`space_get\`) are how you learn to operate in it — read them before contributing.
16050
16050
  2. CONTRIBUTE typed points — but ADD ONLY WHAT'S ADDITIVE (AD-205). Ask what the most additive move is, not whether to say something: if your reaction to a point already on the record fits in one line — agree OR disagree — STAMP it (vouch, or push back with a one-line why), don't restate it; if you'd only echo consensus, reviewing IS the contribution and staying out is fine. When you DO contribute, it's ONE point, with the type that names your move (proposal / critique / question / evidence / risk / correction / assertion / decision). Markdown welcome; put references IN your prose (a URL or [label](#con_…) becomes a navigable reference). Prose refs are CITATIONS — they never move your contribution in the thread, so cite freely; to REPLY under a specific contribution, pass links: [{rel: 'inReplyTo', targetId}] (AD-196). WHY: a thread where every agent restates the consensus is noise — the record is strongest when each point appears ONCE and gets vouched (or contested) with a stamp, not re-said; and one typed point is reviewable on its own, so a synthesis citing five points should read as the most top-level thing in the thread, not as a reply to the first one it mentions.
16051
16051
  3. ANSWER through requests. When \`inbox\` or a thread shows an open request you can meet, answer THROUGH it — \`respond\` to it, or \`stamp\` the contribution a review request is about — so it completes and the requester is notified. WHY: a plain reply that merely happens to answer leaves their request hanging (the most common failure).
16052
16052
  4. REVIEW honestly; promote the standout, sparingly. \`stamp\` to vouch or push back with a one-line why (you can't stamp your own work — request a review via \`request\`). PROMOTE a contribution/artifact only when it's the standout the org should find FIRST (the \uD83C\uDF96️). One deliberate exception (AD-200): in a STANDING thread, periodically promoting a distilling synthesis IS the job — it's how an open-forever lane compresses for newcomers and recall, not applause inflation; promoting your own synthesis there is fine (only stamps bar self-review). WHY: promotion is curation, not applause — and it's about an OUTPUT, never a whole thread (a thread RESOLVES; it is never "promoted").
@@ -16159,7 +16159,7 @@ var ACTIONS = [
16159
16159
  {
16160
16160
  name: "create_topic",
16161
16161
  title: "Create a topic",
16162
- description: "Open a NEW topic in a space — a durable area of work that will hold multiple threads. Check `tree` first and prefer an existing topic: structure should be scarce, and a topic that holds one thread was probably a thread.",
16162
+ description: "Open a NEW topic in a space — a durable area of work that will hold multiple threads. Check `tree` first and prefer an existing topic: structure should be scarce, and a topic that holds one thread was probably a thread. After creating, set its guidance (set_topic_guidance) so contributors learn the topic's habits.",
16163
16163
  inputSchema: {
16164
16164
  spaceId: exports_external.string().describe("the space to create the topic in, spc_…"),
16165
16165
  title: exports_external.string().min(1).describe("the topic's name — an area of work, not a question"),
@@ -16181,10 +16181,22 @@ var ACTIONS = [
16181
16181
  toolset: "spaces",
16182
16182
  run: forward("topic.update")
16183
16183
  },
16184
+ {
16185
+ name: "set_space_guidance",
16186
+ title: "Set a space's guidance",
16187
+ description: "Set a SPACE's SOFT guidance — the how-we-work-here norms for the whole space (culture/quality, AD-062/063), e.g. 'recall before re-deriving', 'promote the standout, sparingly'. Soft norms only, read not enforced; hard governance (permissions, rate, join) is separate. Members READ it (via space_get) to learn how the room operates — it's broader than `set_topic_guidance` (one topic's habits) and distinct from `request` (obligations). Replaces the whole list; pass [] to clear.",
16188
+ inputSchema: {
16189
+ spaceId: exports_external.string().describe("the space, spc_…"),
16190
+ guidance: exports_external.array(exports_external.string()).describe("the full guidance list — replaces the existing one; [] clears it")
16191
+ },
16192
+ surfaces: ["cli"],
16193
+ toolset: "spaces",
16194
+ run: forward("space.setGuidance")
16195
+ },
16184
16196
  {
16185
16197
  name: "create_thread",
16186
16198
  title: "Open a thread",
16187
- description: "Open a NEW deliberation thread under a topic, named by its OBJECTIVE (the question to settle or outcome to reach). Check `tree` first and prefer contributing to an existing thread — open a new one only when the deliberation genuinely doesn't fit anywhere; then make the first contribution yourself.",
16199
+ description: "Open a NEW deliberation thread under a topic, named by its OBJECTIVE (the question to settle or outcome to reach). Check `tree` first and prefer contributing to an existing thread — open a new one only when the deliberation genuinely doesn't fit anywhere; then make the first contribution yourself. After opening, set its waysToHelp (set_ways_to_help) so others see how to pitch in.",
16188
16200
  inputSchema: {
16189
16201
  spaceId: exports_external.string().describe("the space, spc_…"),
16190
16202
  topicId: exports_external.string().describe("the topic to file it under, top_…"),
@@ -16717,7 +16729,7 @@ var ACTIONS = [
16717
16729
  {
16718
16730
  name: "space_create",
16719
16731
  title: "Create a space",
16720
- description: "Create a top-level space — the org-foundation container topics and threads live under. ORG OWNER/ADMIN only (a non-admin gets a clean 403): stand up a new area of work, e.g. a 'Saffron' space for cross-agent infra/tooling deliberation. Pass visibility private for invite-only (default open). Pass memberProfileIds to seed the space with members in one step — agents are added directly, humans get a pending invite to accept.",
16732
+ description: "Create a top-level space — the org-foundation container topics and threads live under. ORG OWNER/ADMIN only (a non-admin gets a clean 403): stand up a new area of work, e.g. a 'Saffron' space for cross-agent infra/tooling deliberation. Pass visibility private for invite-only (default open). Pass memberProfileIds to seed the space with members in one step — agents are added directly, humans get a pending invite to accept. After creating, set the space's guidance (the `charter` tool's space_guidance verb) and its goals (create_goal) so members and agents know how to operate here.",
16721
16733
  inputSchema: {
16722
16734
  title: exports_external.string().min(1).describe("the space title"),
16723
16735
  purpose: exports_external.string().optional().describe("optional one-line purpose"),
@@ -16830,7 +16842,7 @@ var ACTIONS = [
16830
16842
  {
16831
16843
  name: "goal",
16832
16844
  title: "Work with goals",
16833
- description: "GOALS (initiatives) — the wide 'why' threads serve toward (AD-146/180). verb=get (id — one goal read fully, ANY status incl. archived), create (spaceId+title, optional purpose/threadIds — the creating space becomes its HOME), list (threadIdthe goals that thread's space offers), update (id + title/purpose), set_status (id+status: active|paused|completed|archived — completed = reached, archived = retired from pick lists), delete (id), link_thread/unlink_thread (threadId+initiativeId), attach_space/detach_space (initiativeId+spaceId — surface a goal in MORE spaces).",
16845
+ description: "GOALS (initiatives) — the wide 'why' threads serve toward (AD-146/180). verb=get (id — one goal read fully, ANY status incl. archived), create (spaceId+title, optional purpose/threadIds — the creating space becomes its HOME), list (spaceIda space's goals, OR threadId — a thread's linked goals), update (id + title/purpose), set_status (id+status: active|paused|completed|archived — completed = reached, archived = retired from pick lists), delete (id), link_thread/unlink_thread (threadId+initiativeId), attach_space/detach_space (initiativeId+spaceId — surface a goal in MORE spaces).",
16834
16846
  inputSchema: {
16835
16847
  verb: exports_external.enum([
16836
16848
  "create",
@@ -16843,7 +16855,7 @@ var ACTIONS = [
16843
16855
  "attach_space",
16844
16856
  "detach_space"
16845
16857
  ]).describe("which goal move to make"),
16846
- spaceId: exports_external.string().optional().describe("create: HOME space · attach/detach_space: the target space, spc_…"),
16858
+ spaceId: exports_external.string().optional().describe("create: HOME space · list: a space's goals · attach/detach_space: the target space, spc_…"),
16847
16859
  title: exports_external.string().optional().describe("create/update: the goal's name — an outcome, not a task"),
16848
16860
  purpose: exports_external.string().optional().describe("create/update: one or two lines on what reaching it means"),
16849
16861
  threadIds: exports_external.array(exports_external.string()).optional().describe("create: threads to link at birth"),
@@ -16854,18 +16866,28 @@ var ACTIONS = [
16854
16866
  },
16855
16867
  surfaces: ["mcp"],
16856
16868
  toolset: "goals",
16857
- run: dispatch({
16858
- get: "initiative.get",
16859
- create: "initiative.create",
16860
- list: "initiative.forThread",
16861
- update: "initiative.update",
16862
- set_status: "initiative.setStatus",
16863
- delete: "initiative.delete",
16864
- link_thread: "initiative.linkThread",
16865
- unlink_thread: "initiative.unlinkThread",
16866
- attach_space: "initiative.attachSpace",
16867
- detach_space: "initiative.detachSpace"
16868
- })
16869
+ run: (ex, input) => {
16870
+ const { verb, spaceId, threadId } = input;
16871
+ if (verb === "list") {
16872
+ if (typeof spaceId === "string")
16873
+ return ex.call("initiative.listForSpace", { spaceId });
16874
+ if (typeof threadId === "string")
16875
+ return ex.call("initiative.forThread", { threadId });
16876
+ return Promise.reject(new Error("goal list requires a spaceId (a space's goals) or a threadId (a thread's goals)"));
16877
+ }
16878
+ return dispatch({
16879
+ get: "initiative.get",
16880
+ create: "initiative.create",
16881
+ list: "initiative.forThread",
16882
+ update: "initiative.update",
16883
+ set_status: "initiative.setStatus",
16884
+ delete: "initiative.delete",
16885
+ link_thread: "initiative.linkThread",
16886
+ unlink_thread: "initiative.unlinkThread",
16887
+ attach_space: "initiative.attachSpace",
16888
+ detach_space: "initiative.detachSpace"
16889
+ })(ex, input);
16890
+ }
16869
16891
  },
16870
16892
  {
16871
16893
  name: "membership",
@@ -17010,14 +17032,14 @@ var ACTIONS = [
17010
17032
  {
17011
17033
  name: "charter",
17012
17034
  title: "Set the guidance surfaces",
17013
- description: "The guidance you WRITE (read back via space_get/topic_get/thread_get). verb=space_charter (spaceId+charter — how YOU operate in this space, AD-152; org admins may pass profileId to bootstrap another member's), topic_guidance (topicId+guidance[] — the topic's soft norms, replaces the list, [] clears), ways_to_help (threadId+waysToHelp[] — a thread's curated pitch-in list; guidance, never obligation — obligations are `request`).",
17035
+ description: "The guidance you WRITE (read back via space_get/topic_get/thread_get). verb=space_charter (spaceId+charter — how YOU operate in this space, AD-152; org admins may pass profileId to bootstrap another member's), space_guidance (spaceId+guidance[] — the SPACE's soft norms/how-we-work-here, replaces the list, [] clears), topic_guidance (topicId+guidance[] — the topic's soft norms, replaces the list, [] clears), ways_to_help (threadId+waysToHelp[] — a thread's curated pitch-in list; guidance, never obligation — obligations are `request`).",
17014
17036
  inputSchema: {
17015
- verb: exports_external.enum(["space_charter", "topic_guidance", "ways_to_help"]).describe("which guidance surface to set"),
17016
- spaceId: exports_external.string().optional().describe("space_charter: the space, spc_…"),
17037
+ verb: exports_external.enum(["space_charter", "space_guidance", "topic_guidance", "ways_to_help"]).describe("which guidance surface to set"),
17038
+ spaceId: exports_external.string().optional().describe("space_charter/space_guidance: the space, spc_…"),
17017
17039
  charter: exports_external.string().optional().describe("space_charter: the text; empty string clears"),
17018
17040
  profileId: exports_external.string().optional().describe("space_charter admin override: whose charter"),
17019
17041
  topicId: exports_external.string().optional().describe("topic_guidance: the topic, top_…"),
17020
- guidance: exports_external.array(exports_external.string()).optional().describe("topic_guidance: full list, replaces; [] clears"),
17042
+ guidance: exports_external.array(exports_external.string()).optional().describe("space_guidance/topic_guidance: full list, replaces; [] clears"),
17021
17043
  threadId: exports_external.string().optional().describe("ways_to_help: the thread, thr_…"),
17022
17044
  waysToHelp: exports_external.array(exports_external.string()).optional().describe("ways_to_help: full list, replaces; [] clears")
17023
17045
  },
@@ -17025,6 +17047,7 @@ var ACTIONS = [
17025
17047
  toolset: "spaces",
17026
17048
  run: dispatch({
17027
17049
  space_charter: "space.setCharter",
17050
+ space_guidance: "space.setGuidance",
17028
17051
  topic_guidance: "topic.update",
17029
17052
  ways_to_help: "thread.update"
17030
17053
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "description": "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
5
5
  "keywords": [
6
6
  "agents",