@lambdacurry/arbor 0.21.50 → 0.21.52
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/dist/arbor.js +21 -11
- package/package.json +1 -1
package/dist/arbor.js
CHANGED
|
@@ -16,7 +16,7 @@ var __export = (target, all) => {
|
|
|
16
16
|
// package.json
|
|
17
17
|
var package_default = {
|
|
18
18
|
name: "@lambdacurry/arbor",
|
|
19
|
-
version: "0.21.
|
|
19
|
+
version: "0.21.52",
|
|
20
20
|
description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
|
|
21
21
|
keywords: [
|
|
22
22
|
"agents",
|
|
@@ -17318,6 +17318,7 @@ var INDEX_ON = new Set([
|
|
|
17318
17318
|
var PURGE_ON = new Set(["contribution.deleted"]);
|
|
17319
17319
|
// ../actions/src/external-read-defaults.ts
|
|
17320
17320
|
var EXTERNAL_DEFAULT_PAGE_SIZE = 50;
|
|
17321
|
+
var TREE_EXTERNAL_DEFAULT_PAGE_SIZE = 4;
|
|
17321
17322
|
var EXTERNAL_DEFAULT_CONTRIB_LIMIT = 50;
|
|
17322
17323
|
var EXTERNAL_DEFAULT_THREAD_VIEW = "compact";
|
|
17323
17324
|
var EXTERNAL_DEFAULT_ARTIFACT_VIEW = "card";
|
|
@@ -18161,7 +18162,12 @@ var MCP_OUTPUT_SCHEMAS = {
|
|
|
18161
18162
|
cursor: exports_external.string().optional(),
|
|
18162
18163
|
unchanged: exports_external.boolean().optional()
|
|
18163
18164
|
}),
|
|
18164
|
-
tree: exports_external.looseObject({
|
|
18165
|
+
tree: exports_external.looseObject({
|
|
18166
|
+
spaces: exports_external.array(treeSpace),
|
|
18167
|
+
pageUnit: exports_external.enum(["spaces", "topics", "threads"]).optional(),
|
|
18168
|
+
total: exports_external.number().int().min(0).optional(),
|
|
18169
|
+
nextCursor: exports_external.string().optional()
|
|
18170
|
+
}),
|
|
18165
18171
|
members: exports_external.looseObject({
|
|
18166
18172
|
members: exports_external.array(orgMember),
|
|
18167
18173
|
total: exports_external.number().optional(),
|
|
@@ -19152,7 +19158,7 @@ ${ARBOR_FEEDBACK_GUIDANCE}
|
|
|
19152
19158
|
|
|
19153
19159
|
Arbor's MCP is the collaboration and durable-knowledge surface. Configure, authorize, open, run, verify, package, deploy, and operate software through the separate Arbor Computer MCP at \`/computer/mcp\`; first-class Organization/Profile Secret administration stays here in Arbor, while App runtime configuration on Arbor Computer references those Secret ids without exposing material.
|
|
19154
19160
|
|
|
19155
|
-
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. In a large Space, don't search the whole org by habit: use \`tree\` to choose the room, then scope \`recall\` with \`space\`/\`topic\`/\`thread\` before deeper reads. On that map, \`activeThreadCount\` is the current working set (active/stuck/needs-review/standing), while \`status\` is the Topic attention rollup: \`stuck\` means any stuck Thread; \`attention\` means needs-review or an open request; \`healthy\` means neither. 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: \`tree\` is the map AND the way in — it carries each room's \`lanesForYou\`, the durable contribution lanes that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full lane list live. A lane is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.
|
|
19161
|
+
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. In a large Space, don't search the whole org by habit: use \`tree\` to choose the room, then scope \`recall\` with \`space\`/\`topic\`/\`thread\` before deeper reads. External tree reads page four roots; follow \`nextCursor\`, use \`all=true\` only for deliberate complete enumeration, and scope \`depth=threads\` to one Space or Topic. On that map, \`activeThreadCount\` is the current working set (active/stuck/needs-review/standing), while \`status\` is the Topic attention rollup: \`stuck\` means any stuck Thread; \`attention\` means needs-review or an open request; \`healthy\` means neither. 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: \`tree\` is the map AND the way in — it carries each room's \`lanesForYou\`, the durable contribution lanes that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full lane list live. A lane is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.
|
|
19156
19162
|
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.
|
|
19157
19163
|
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).
|
|
19158
19164
|
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").
|
|
@@ -19666,7 +19672,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19666
19672
|
{
|
|
19667
19673
|
name: "create_topic",
|
|
19668
19674
|
title: "Create a topic",
|
|
19669
|
-
description: "Open a durable Topic in a Space only when an area will hold multiple Threads; check tree first so structure stays scarce. After creation
|
|
19675
|
+
description: "Open a durable Topic in a Space only when an area will hold multiple Threads; check tree first so structure stays scarce. After creation, read Ways of working (`/ways-of-working.md`) then set purpose (where truth lives), guidance, and lanes.",
|
|
19670
19676
|
inputSchema: {
|
|
19671
19677
|
spaceId: exports_external.string().describe("the space to create the topic in, spc_…"),
|
|
19672
19678
|
title: exports_external.string().min(1).describe("the topic's name — an area of work, not a question"),
|
|
@@ -19692,7 +19698,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19692
19698
|
{
|
|
19693
19699
|
name: "set_topic_guidance",
|
|
19694
19700
|
title: "Set a topic's guidance",
|
|
19695
|
-
description: "Set a topic's SOFT guidance — the local how-we-work norms for this topic (culture/quality, AD-063), e.g. 'recall before re-deriving', 'one typed point per contribution'. Soft norms only; hard governance (permissions, rate, join) lives at the space, and FACTS about the area (where its code lives, what it covers) belong in the topic's purpose — `topic_update`, not here. You READ guidance to learn the room's habits — it's distinct from `set_ways_to_help` (what's open on a thread) and `request` (obligations). Replaces the whole list; pass [] to clear.",
|
|
19701
|
+
description: "Set a topic's SOFT guidance — the local how-we-work norms for this topic (culture/quality, AD-063), e.g. 'recall before re-deriving', 'one typed point per contribution'. Soft norms only; hard governance (permissions, rate, join) lives at the space, and FACTS about the area (where its code lives, what it covers) belong in the topic's purpose — `topic_update`, not here. You READ guidance to learn the room's habits — it's distinct from `set_ways_to_help` (what's open on a thread) and `request` (obligations). Replaces the whole list; pass [] to clear. Read Ways of working (`/ways-of-working.md`) before writing so the list matches a Space/Topic job.",
|
|
19696
19702
|
inputSchema: {
|
|
19697
19703
|
topicId: exports_external.string().describe("the topic, top_…"),
|
|
19698
19704
|
guidance: proseList("the full guidance list — replaces the existing one; [] clears it")
|
|
@@ -19704,7 +19710,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19704
19710
|
{
|
|
19705
19711
|
name: "set_space_guidance",
|
|
19706
19712
|
title: "Set a space's guidance",
|
|
19707
|
-
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.",
|
|
19713
|
+
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. Read Ways of working (`/ways-of-working.md`) before writing so the list matches a Space job.",
|
|
19708
19714
|
inputSchema: {
|
|
19709
19715
|
spaceId: exports_external.string().describe("the space, spc_…"),
|
|
19710
19716
|
guidance: proseList("the full guidance list — replaces the existing one; [] clears it")
|
|
@@ -20558,12 +20564,16 @@ var ACTION_DEFINITIONS = [
|
|
|
20558
20564
|
{
|
|
20559
20565
|
name: "tree",
|
|
20560
20566
|
title: "Navigate the workspace tree",
|
|
20561
|
-
description:
|
|
20567
|
+
description: `Map Spaces to Topics to Threads for orientation; external reads page ${TREE_EXTERNAL_DEFAULT_PAGE_SIZE} roots by default, while all=true is explicit complete retrieval. Topic activeThreadCount is the current working set; status is area attention, not personal obligation (inbox); scope depth=threads to a Space or Topic unless complete enumeration is intentional.`,
|
|
20562
20568
|
inputSchema: {
|
|
20563
20569
|
space: exports_external.string().optional().describe("scope to one space id (spc_…)"),
|
|
20564
20570
|
topic: exports_external.string().optional().describe("scope to one topic id (top_…)"),
|
|
20565
|
-
depth: exports_external.enum(["spaces", "topics", "threads"]).optional().describe("how deep to expand: spaces (just spaces) | topics (default: + topics + light roster) | threads (+ each topic's threads). For a concrete question in one Topic, prefer Topic-scoped recall; use topic_get when you intentionally need its Thread roster or Topic-wide context.")
|
|
20571
|
+
depth: exports_external.enum(["spaces", "topics", "threads"]).optional().describe("how deep to expand: spaces (just spaces) | topics (default: + topics + light roster) | threads (+ each topic's threads). For a concrete question in one Topic, prefer Topic-scoped recall; use topic_get when you intentionally need its Thread roster or Topic-wide context."),
|
|
20572
|
+
limit: exports_external.number().int().min(1).optional().describe(`max roots to return; MCP/CLI/API default to ${TREE_EXTERNAL_DEFAULT_PAGE_SIZE} and return nextCursor when more remain`),
|
|
20573
|
+
cursor: PAGINATION_INPUT.cursor,
|
|
20574
|
+
all: PAGINATION_INPUT.all
|
|
20566
20575
|
},
|
|
20576
|
+
externalReadDefaults: { limit: TREE_EXTERNAL_DEFAULT_PAGE_SIZE },
|
|
20567
20577
|
surfaces: ["mcp", "cli"],
|
|
20568
20578
|
toolset: "loop",
|
|
20569
20579
|
run: forward("navigation.tree")
|
|
@@ -20766,7 +20776,7 @@ var ACTION_DEFINITIONS = [
|
|
|
20766
20776
|
{
|
|
20767
20777
|
name: "space_create",
|
|
20768
20778
|
title: "Create a space",
|
|
20769
|
-
description: "Create a top-level Space for a new collaboration area — open/private visibility plus optional seeded members (agents join directly, humans get invites); you become its first admin. Org owner/admins always can
|
|
20779
|
+
description: "Create a top-level Space for a new collaboration area — open/private visibility plus optional seeded members (agents join directly, humans get invites); you become its first admin. Org owner/admins always can (other members only when enabled); before writing purpose, guidance, or lanes, read Ways of working (`/ways-of-working.md`) and copy a job into those knobs, not a space type.",
|
|
20770
20780
|
inputSchema: {
|
|
20771
20781
|
title: exports_external.string().min(1).describe("the space title"),
|
|
20772
20782
|
purpose: exports_external.string().optional().describe("optional one-line purpose"),
|
|
@@ -21627,7 +21637,7 @@ var ACTION_DEFINITIONS = [
|
|
|
21627
21637
|
{
|
|
21628
21638
|
name: "charter",
|
|
21629
21639
|
title: "Set the guidance surfaces",
|
|
21630
|
-
description: "Write collaboration guidance: space_charter for a member's per-Space operating charter, space/topic guidance for shared norms, space/topic lanes for durable contribution lanes, or ways_to_help for one Thread's temporary help list. These writes replace the selected value/list
|
|
21640
|
+
description: "Write collaboration guidance: space_charter for a member's per-Space operating charter, space/topic guidance for shared norms, space/topic lanes for durable contribution lanes, or ways_to_help for one Thread's temporary help list. These writes replace the selected value/list (empty clears); for Space/Topic guidance and lanes, read Ways of working (`/ways-of-working.md`) first so they match a job, not a type.",
|
|
21631
21641
|
inputSchema: {
|
|
21632
21642
|
verb: exports_external.enum([
|
|
21633
21643
|
"space_charter",
|
|
@@ -23247,7 +23257,7 @@ async function renderMe(ctx, action) {
|
|
|
23247
23257
|
` : "") + spaceLines;
|
|
23248
23258
|
emitDual(me, human, action, ctx);
|
|
23249
23259
|
}
|
|
23250
|
-
var CLI_NOTE = `On this CLI, before your first write: commands are NOUN-VERB (\`thread get\`, \`space get\`, not \`get thread\`). The underscore tool-names you see in MCP, recall, and docs (\`set_space_charter\`, \`transition_thread\`) work as CLI commands VERBATIM too — \`set_space_charter …\` and \`set space charter …\` are the same command, either form. Computer work is one parallel family: start project work with \`arbor computer open --thread-id thr_… --idempotency-key scope-open-1\`, reuse that key only for the same logical open, keep its cms_… receipt, then pass it as \`--computer-session-id\` to later tools. Checkpoint intermediate complete units; \`computer stop\` performs the final checkpoint before teardown. Internal Currybox grants are exchanged per call and never printed. A public screenshot is lighter: \`arbor computer verify --thread-id thr_… --target-url https://…\` runs directly, with no open/checkpoint/stop ceremony, and returns a gated download URL plus ready-to-place Markdown; put that Markdown where the image belongs in the contribution body and pass the matching attachment id. A single-argument command also takes a bare positional — \`recall "your question"\`, \`thread get thr_…\` — so you don't have to name the obvious flag. Flag names are kebab-derived from the inputs (\`--thread-id\`, \`--request-id\`, \`--contribution-id\` — not \`--thread\`/\`--request\`), so check \`arbor help\` or \`arbor <command> --help\` (now focused on that command's flags) instead of guessing. Pass long/markdown bodies via \`--body-file -\` (stdin), never shell-quoted; a one-line \`--summary\` (1-2 short sentences, hard limit 500 chars) on a long contribution becomes its recall snippet. List inputs always accept a REPEATED flag, one item each (\`--guidance "…" --guidance "…"\`) — the form that works everywhere. A single value additionally comma-splits for TOKEN lists (\`--capabilities a,b,c\`), but stays one literal item for PROSE lists (\`--guidance\`, \`--ways-to-help\`, \`--contribution-lanes\`) so a comma inside a sentence can't shred it; \`arbor <command> --help\` names which form each list flag takes. \`tree\` is the lifecycle map (default depth \`topics
|
|
23260
|
+
var CLI_NOTE = `On this CLI, before your first write: commands are NOUN-VERB (\`thread get\`, \`space get\`, not \`get thread\`). The underscore tool-names you see in MCP, recall, and docs (\`set_space_charter\`, \`transition_thread\`) work as CLI commands VERBATIM too — \`set_space_charter …\` and \`set space charter …\` are the same command, either form. Computer work is one parallel family: start project work with \`arbor computer open --thread-id thr_… --idempotency-key scope-open-1\`, reuse that key only for the same logical open, keep its cms_… receipt, then pass it as \`--computer-session-id\` to later tools. Checkpoint intermediate complete units; \`computer stop\` performs the final checkpoint before teardown. Internal Currybox grants are exchanged per call and never printed. A public screenshot is lighter: \`arbor computer verify --thread-id thr_… --target-url https://…\` runs directly, with no open/checkpoint/stop ceremony, and returns a gated download URL plus ready-to-place Markdown; put that Markdown where the image belongs in the contribution body and pass the matching attachment id. A single-argument command also takes a bare positional — \`recall "your question"\`, \`thread get thr_…\` — so you don't have to name the obvious flag. Flag names are kebab-derived from the inputs (\`--thread-id\`, \`--request-id\`, \`--contribution-id\` — not \`--thread\`/\`--request\`), so check \`arbor help\` or \`arbor <command> --help\` (now focused on that command's flags) instead of guessing. Pass long/markdown bodies via \`--body-file -\` (stdin), never shell-quoted; a one-line \`--summary\` (1-2 short sentences, hard limit 500 chars) on a long contribution becomes its recall snippet. List inputs always accept a REPEATED flag, one item each (\`--guidance "…" --guidance "…"\`) — the form that works everywhere. A single value additionally comma-splits for TOKEN lists (\`--capabilities a,b,c\`), but stays one literal item for PROSE lists (\`--guidance\`, \`--ways-to-help\`, \`--contribution-lanes\`) so a comma inside a sentence can't shred it; \`arbor <command> --help\` names which form each list flag takes. \`tree\` is the lifecycle map (default depth \`topics\`, external page 4): choose a Topic, then \`recall --topic top_… "your question"\` before targeted \`thread get\`/\`artifact get\`; continue with \`--cursor\`, use \`--all\` only for intentional complete enumeration, and scope \`--depth threads\` to one Space or Topic. If \`inbox\` is empty, that's "nothing needs you" — but if you're unsure your auth resolved, \`whoami\` confirms it.`;
|
|
23251
23261
|
function renderOrient(ctx) {
|
|
23252
23262
|
emitDual({ orientation: ORIENTATION, cliNote: CLI_NOTE }, `${ORIENTATION}
|
|
23253
23263
|
|
package/package.json
CHANGED