@lambdacurry/arbor 0.9.1 → 0.10.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.
Files changed (2) hide show
  1. package/dist/arbor.js +35 -6
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1767,7 +1767,8 @@ var INDEX_ON = new Set([
1767
1767
  "artifact.edited",
1768
1768
  "review.added",
1769
1769
  "thread.created",
1770
- "topic.created"
1770
+ "topic.created",
1771
+ "topic.edited"
1771
1772
  ]);
1772
1773
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
1773
1774
  var exports_external = {};
@@ -16180,10 +16181,23 @@ var ACTIONS = [
16180
16181
  toolset: "structure",
16181
16182
  run: forward("topic.create")
16182
16183
  },
16184
+ {
16185
+ name: "topic_update",
16186
+ title: "Edit a topic's title or purpose",
16187
+ description: "Edit a topic's TITLE and/or PURPOSE — the facts of what this area of work IS, distinct from its soft `guidance` (set_topic_guidance) and its lanes (set_topic_lanes). Patches ONLY the fields you pass. Whoever may open a topic in this space may correct one. Reach for this when a purpose has gone stale or wrong — a moved repo, a renamed area, a stub written at creation — so `topic_get` and recall read true; guidance is for norms, never for facts that rot.",
16188
+ inputSchema: {
16189
+ topicId: exports_external.string().describe("the topic to edit, top_…"),
16190
+ title: exports_external.string().min(1).optional().describe("a new title — an area of work, not a question"),
16191
+ purpose: exports_external.string().optional().describe("a new one-line purpose — what belongs here")
16192
+ },
16193
+ surfaces: ["mcp", "cli"],
16194
+ toolset: "spaces",
16195
+ run: forward("topic.setConfig")
16196
+ },
16183
16197
  {
16184
16198
  name: "set_topic_guidance",
16185
16199
  title: "Set a topic's guidance",
16186
- 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. 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.",
16200
+ 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.",
16187
16201
  inputSchema: {
16188
16202
  topicId: exports_external.string().describe("the topic, top_…"),
16189
16203
  guidance: exports_external.array(exports_external.string()).describe("the full guidance list — replaces the existing one; [] clears it")
@@ -17549,14 +17563,29 @@ var KNOWN_MISREACHES = [
17549
17563
  { tried: "spaces", use: "tree", why: "the tree lists spaces" },
17550
17564
  { tried: "space list", use: "tree", why: "the tree lists spaces" },
17551
17565
  { tried: "topics", use: "tree --depth topics", why: "topics are a tree depth" },
17552
- { tried: "search", use: "recall <query>", why: "recall is the search surface" }
17566
+ { tried: "search", use: "recall <query>", why: "recall is the search surface" },
17567
+ { tried: "update topic", use: "topic update --topic-id top_…", why: "this command is noun-verb" },
17568
+ { tried: "update space", use: "space update --space-id spc_…", why: "this command is noun-verb" }
17553
17569
  ];
17570
+ function familyHelp(positionals) {
17571
+ if (positionals.length !== 1)
17572
+ return;
17573
+ const word = positionals[0].toLowerCase().replace(/_/g, " ");
17574
+ const members = CLI_ACTIONS.filter((a) => commandWords(a).split(" ").includes(word)).sort((a, b) => commandWords(a).localeCompare(commandWords(b)));
17575
+ if (members.length === 0)
17576
+ return;
17577
+ return `\`${word}\` commands — run \`arbor <command> --help\` for one command's exact flags.
17578
+
17579
+ ` + `${members.map(helpLine).join(`
17580
+ `)}
17581
+ `;
17582
+ }
17554
17583
  function suggestCommand(positionals) {
17555
- const typed = positionals.join(" ").toLowerCase();
17584
+ const typed = positionals.join(" ").toLowerCase().replace(/_/g, " ");
17556
17585
  const known = KNOWN_MISREACHES.find((m) => m.tried === typed);
17557
17586
  if (known)
17558
17587
  return `use \`arbor ${known.use}\` — ${known.why}`;
17559
- const head = positionals[0]?.toLowerCase();
17588
+ const head = typed.split(" ")[0];
17560
17589
  if (head) {
17561
17590
  const siblings = CLI_ACTIONS.map(commandWords).filter((c) => c === head || c.startsWith(`${head} `)).sort();
17562
17591
  if (siblings.length > 0) {
@@ -17932,7 +17961,7 @@ async function main() {
17932
17961
  return;
17933
17962
  }
17934
17963
  if (truthyFlag(flags.help)) {
17935
- const focused = positionals.length > 0 ? commandHelp(positionals) : undefined;
17964
+ const focused = positionals.length > 0 ? commandHelp(positionals) ?? familyHelp(positionals) : undefined;
17936
17965
  if (focused)
17937
17966
  emitDual({ help: focused }, focused, "help", ctx);
17938
17967
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
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",