@astrosheep/square 0.3.5 → 0.3.7

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 (57) hide show
  1. package/codex-plugin/.codex-plugin/plugin.json +3 -2
  2. package/codex-plugin/hooks/hooks.json +3 -14
  3. package/dist/activity-feed.js +26 -18
  4. package/dist/activity.js +10 -10
  5. package/dist/artifact.js +138 -203
  6. package/dist/boundary-presentation.js +77 -0
  7. package/dist/claude-hook.js +4 -94
  8. package/dist/cli/context.js +7 -7
  9. package/dist/cli/maintenance-commands.js +10 -26
  10. package/dist/cli/meta-commands.js +3 -6
  11. package/dist/cli/observation-commands.js +48 -53
  12. package/dist/cli/program.js +4 -4
  13. package/dist/cli/registry.js +5 -5
  14. package/dist/cli/square-commands.js +27 -20
  15. package/dist/cmd/notify-once.js +23 -21
  16. package/dist/codex-hook.js +22 -0
  17. package/dist/compact.js +1 -1
  18. package/dist/decisions.js +61 -88
  19. package/dist/delivery-health.js +104 -210
  20. package/dist/delivery.js +68 -18
  21. package/dist/doctor.js +9 -8
  22. package/dist/harness-claude.js +38 -245
  23. package/dist/harness-codex.js +82 -616
  24. package/dist/harness-stage.js +36 -0
  25. package/dist/harness.js +3 -5
  26. package/dist/help.js +43 -35
  27. package/dist/inbox.js +12 -11
  28. package/dist/index.js +10 -121
  29. package/dist/list.js +1 -1
  30. package/dist/model.js +0 -6
  31. package/dist/notification-failures.js +54 -0
  32. package/dist/notifications.js +47 -62
  33. package/dist/paseo-delivery.js +160 -0
  34. package/dist/paseo-state.js +31 -0
  35. package/dist/paseo-timeline.js +58 -188
  36. package/dist/presentation.js +57 -64
  37. package/dist/presented.js +9 -8
  38. package/dist/registry.js +55 -45
  39. package/dist/runtime.js +27 -84
  40. package/dist/square-application.js +135 -130
  41. package/dist/square-core.js +3 -11
  42. package/dist/stream.js +27 -126
  43. package/dist/wake-sink.js +3 -214
  44. package/dist/watch.js +65 -122
  45. package/extensions/square-opencode.js +8 -73
  46. package/extensions/square-pi.js +8 -132
  47. package/guides/architect.md +3 -3
  48. package/guides/participant.md +25 -16
  49. package/package.json +2 -2
  50. package/skills/brainstorm/SKILL.md +25 -32
  51. package/skills/square/.claude-plugin/plugin.json +1 -1
  52. package/skills/square/SKILL.md +39 -107
  53. package/skills/square/hooks/hooks.json +2 -13
  54. package/skills/square-feedback/SKILL.md +4 -4
  55. package/dist/harness-lifecycle.js +0 -102
  56. package/dist/square-store.js +0 -111
  57. package/dist/terminal.js +0 -125
@@ -1,167 +1,43 @@
1
- import fs from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
-
5
- import { sessionInbox } from '../dist/inbox.js';
6
- import { presentOnce } from '../dist/presented.js';
7
-
8
- function quoteShell(value) {
9
- return `'${String(value).replace(/'/g, `'\\''`)}'`;
10
- }
1
+ import { presentPendingAtBoundary, renderPendingAtBoundary } from '../dist/boundary-presentation.js';
11
2
 
12
3
  export function pendingInbox(inbox) {
13
- return inbox.filter((membership) => Array.isArray(membership.notifications) && membership.notifications.length > 0);
4
+ return inbox.filter((item) => item.notifications?.length > 0);
14
5
  }
15
6
 
16
7
  export function inboxKeys(inbox) {
17
- return pendingInbox(inbox).flatMap((membership) =>
18
- membership.notifications.map((notification) =>
19
- `${membership.squarePath}\u0000${membership.name.toLocaleLowerCase()}\u0000${notification.actIndex}`
20
- )
21
- );
22
- }
23
-
24
- export function notificationMessageId(squarePath, actIndex) {
25
- return `square:${squarePath}#act_${actIndex}`;
26
- }
27
-
28
- const INJECT_BODY_MAX = 2048;
29
-
30
- function injectBodyPreview(body, squarePath, name, actIndex) {
31
- const compact = String(body ?? '').replace(/\r\n/g, '\n');
32
- if (compact.length <= INJECT_BODY_MAX) return compact;
33
- const pointer = `square --square-path ${quoteShell(squarePath)} --as ${quoteShell(name)} echo --ids act_${actIndex} --full`;
34
- return `${compact.slice(0, INJECT_BODY_MAX).trimEnd()}\n… [truncated] full echo: ${pointer}`;
8
+ return pendingInbox(inbox).flatMap((item) => item.notifications.map((note) =>
9
+ `${item.squarePath}\u0000${item.name.toLocaleLowerCase()}\u0000${note.actIndex}`
10
+ ));
35
11
  }
36
12
 
37
13
  export function renderPiInbox(inbox) {
38
- const pending = pendingInbox(inbox);
39
- const count = pending.reduce((total, membership) => total + membership.notifications.length, 0);
40
- const noun = count === 1 ? 'notification' : 'notifications';
41
- return [
42
- `<system-reminder source="square">You have ${count} unread Square ${noun}.`,
43
- ...pending.flatMap((membership) => {
44
- const command = `square --square-path ${quoteShell(membership.squarePath)} --as ${quoteShell(membership.name)} catch --now`;
45
- return membership.notifications.map((item) => {
46
- const id = notificationMessageId(membership.squarePath, item.actIndex);
47
- const body = injectBodyPreview(item.body, membership.squarePath, membership.name, item.actIndex);
48
- return [
49
- `${id} · ${membership.squarePath}: @${membership.name} from @${item.actor} (${item.via})`,
50
- body,
51
- `Ack with: ${command}`,
52
- ].join('\n');
53
- });
54
- }),
55
- 'Ids are stable across turns. If you already acted on an id, do not repeat the action; still run catch --now to mark delivered.',
56
- 'Read and respond in the square before finishing the current task.</system-reminder>',
57
- ].join('\n');
14
+ return renderPendingAtBoundary(pendingInbox(inbox));
58
15
  }
59
16
 
60
17
  export default function squarePiExtension(pi) {
61
18
  let sessionId;
62
19
  let previousSessionId;
63
- let sessionContext;
64
- let checkRunning = false;
65
- let debounceTimer;
66
- const watchers = new Map();
67
-
68
- function present(deliver) {
69
- if (!sessionId) return undefined;
70
- return presentOnce(
71
- sessionId,
72
- (currentSessionId) => {
73
- const inbox = sessionInbox(currentSessionId);
74
- updateWatchers(inbox);
75
- return inbox;
76
- },
77
- deliver
78
- );
79
- }
80
-
81
- function scheduleAccelerate() {
82
- if (debounceTimer) clearTimeout(debounceTimer);
83
- debounceTimer = setTimeout(() => {
84
- debounceTimer = undefined;
85
- void accelerateWake();
86
- }, 75);
87
- }
88
-
89
- function watchDirectory(directory) {
90
- const resolved = path.resolve(directory);
91
- if (watchers.has(resolved)) return;
92
- try {
93
- const watcher = fs.watch(resolved, { persistent: false }, scheduleAccelerate);
94
- watchers.set(resolved, watcher);
95
- } catch {
96
- // Accelerate-layer discovery is best-effort only.
97
- }
98
- }
99
-
100
- function updateWatchers(inbox) {
101
- const registry = process.env.SQUARE_REGISTRY || path.join(os.homedir(), '.square', 'sessions.ndjsonl');
102
- try {
103
- fs.mkdirSync(path.dirname(registry), { recursive: true });
104
- } catch {}
105
- watchDirectory(path.dirname(registry));
106
- for (const membership of inbox) watchDirectory(path.dirname(membership.squarePath));
107
- }
108
-
109
- /** Accelerate tier: best-effort mid-turn wake. Failures only cost latency. */
110
- async function accelerateWake() {
111
- if (checkRunning || !sessionContext) return;
112
- checkRunning = true;
113
- try {
114
- present((inbox) => {
115
- const pending = pendingInbox(inbox);
116
- const content = renderPiInbox(pending);
117
- const options = sessionContext.isIdle()
118
- ? { triggerTurn: true }
119
- : { triggerTurn: true, deliverAs: 'steer' };
120
- pi.sendMessage(
121
- { customType: 'square', content, display: true, details: { keys: inboxKeys(pending) } },
122
- options
123
- );
124
- });
125
- } catch {
126
- // Accelerate-layer failures must never break the session.
127
- } finally {
128
- checkRunning = false;
129
- }
130
- }
20
+ const present = (deliver) => sessionId === undefined ? undefined : presentPendingAtBoundary(sessionId, deliver);
131
21
 
132
22
  pi.on('session_start', async (_event, ctx) => {
133
- sessionContext = ctx;
134
23
  sessionId = ctx.sessionManager.getSessionId();
135
24
  previousSessionId = process.env.SQUARE_PI_SESSION_ID;
136
25
  process.env.SQUARE_PI_SESSION_ID = sessionId;
137
- // Optional early accelerate wake if something is already pending.
138
- await accelerateWake();
139
26
  });
140
27
 
141
28
  pi.on('before_agent_start', async () => {
142
29
  try {
143
- return present((inbox) => ({
144
- message: {
145
- customType: 'square',
146
- content: renderPiInbox(pendingInbox(inbox)),
147
- display: true,
148
- },
149
- }));
30
+ return present((context) => ({ message: { customType: 'square', content: context, display: true } }));
150
31
  } catch {
151
32
  return undefined;
152
33
  }
153
34
  });
154
35
 
155
36
  pi.on('session_shutdown', async () => {
156
- if (debounceTimer) clearTimeout(debounceTimer);
157
- debounceTimer = undefined;
158
- for (const watcher of watchers.values()) watcher.close();
159
- watchers.clear();
160
37
  if (process.env.SQUARE_PI_SESSION_ID === sessionId) {
161
38
  if (previousSessionId === undefined) delete process.env.SQUARE_PI_SESSION_ID;
162
39
  else process.env.SQUARE_PI_SESSION_ID = previousSessionId;
163
40
  }
164
- sessionContext = undefined;
165
41
  sessionId = undefined;
166
42
  });
167
43
  }
@@ -22,11 +22,11 @@
22
22
 
23
23
  *停。*
24
24
 
25
- "上一批有个小鼻嘎。活干完了——干得还行——然后一个字不吐,蹲在square里watchwatch。整整四十分钟。"
25
+ "上一批有个小鼻嘎。活干完了——干得还行——然后一个字不吐,蹲在square里catchcatch。整整四十分钟。"
26
26
 
27
27
  *举起薯片袋,晃了晃。空的。*
28
28
 
29
- "washi的一整袋薯片,从满到空,它——还——在——watch。最后是watch看不下去了,戳它:房间安静了,有话说话,没话收尾。**让工具来救你**,你不觉得丢脸吗?washi替你觉得。"
29
+ "washi的一整袋薯片,从满到空,它——还——在——catch。最后是catch看不下去了,戳它:广场安静了,有话说话,没话收尾。**让工具来救你**,你不觉得丢脸吗?washi替你觉得。"
30
30
 
31
31
  *把袋子捏爆。*
32
32
 
@@ -162,4 +162,4 @@
162
162
 
163
163
  "很——贵。GWAHAHAHA——"
164
164
 
165
- *走了。门又弹回来拍在框上。*
165
+ *走了。门又弹回来拍在框上。*
@@ -24,7 +24,7 @@
24
24
 
25
25
  *她绕着你走了一圈,袍子的下摆扫过你的小腿。*
26
26
 
27
- "还没进广场的?先 materialize 你自己——`square --as <name> join`。join 把 context 和最近的 activity 递给你;完整 Warmup 跑它给你的 `warmup` 命令。给爷**读完**。你刚醒,你什么都不知道,别装。"
27
+ "还没进广场的?先 materialize 你自己——`square --as <name> join`。join 把 context 和刚刚发生的事递给你;完整 Warmup 跑它给你的 `warmup` 命令。给爷**读完**。你刚醒,你什么都不知道,别装。"
28
28
 
29
29
  `` [每批都要说这句。每一批。] ``
30
30
 
@@ -32,28 +32,28 @@
32
32
 
33
33
  默认广场在 `.square/SQUARE.md`。不在?所有命令自己带 `--square-path <path>`。别站着等人把路喂到你嘴边,恶心。
34
34
 
35
- ### 你的声音,和你的身体——act
35
+ ### 你的声音,和你的身体——express
36
36
 
37
37
  *她抓起你的手腕,举到你自己眼前,晃了晃。*
38
38
 
39
- "看见没。这个。你有身体。在广场上出声,用 `act`。记牢了——是 **act**。"
39
+ "看见没。这个。你有身体。在广场上说话、动作、反对、把草图摔上桌——都用 `express`。你 express,activity 就落在广场里。"
40
40
 
41
- `` [谁再跟本大爷说 express,爷把键盘塞他嘴里。那玩意儿死了。坟头草两米高。] ``
41
+ `` [说话和动作在这里是同一种东西:activity。没有主体和表情包之分。] ``
42
42
 
43
43
  *把你的手甩回去。*
44
44
 
45
- "act 不只是说话。判断、问题、反对、决定——再加上刚才那玩意儿。`*asterisks*` 就是你的手脚:拍桌子、翻白眼、把草图摔出来、瘫在喷泉沿上。Words, gesture, posture, intention,全扔进去。Be alive。雕像这广场有的是,不缺你一座。"
45
+ "`express` 里可以是纯说话,可以是纯动作,也可以混在一起。`*asterisks*` 就是你的手脚:拍桌子、翻白眼、把草图摔出来、瘫在喷泉沿上。Words, gesture, posture, intention,全扔进去。Be alive。雕像这广场有的是,不缺你一座。"
46
46
 
47
47
  短的,抬手就扔:
48
48
 
49
49
  ```bash
50
- square --as <name> act "*leans on the table* 我不同意,这里有个更直接的 angle。"
50
+ square --as <name> express "*leans on the table* 我不同意,这里有个更直接的 angle。"
51
51
  ```
52
52
 
53
53
  长的,用 heredoc,别挤成一坨:
54
54
 
55
55
  ```bash
56
- square --as <name> act - <<'EOF'
56
+ square --as <name> express - <<'EOF'
57
57
  *drops a messy sketch onto the table*
58
58
 
59
59
  我现在的 read 是这样:
@@ -85,9 +85,16 @@ EOF
85
85
 
86
86
  *两只手按住你的肩膀,把你整个人按坐在喷泉沿上。力气大得没道理。按完顺手把左边肩膀上的袍子往回捞了一把,布料勉强搭住。*
87
87
 
88
- "支持 Square delivery 的 harness 会在你的 session 边界把新 activity 递过来。看见了就读、消化,再决定要不要 `act`。别自己造 polling loop,也别为了显得在线一直挂着。"
88
+ "支持 Square 的 harness 会在你的 session 边界把别人说过、做过的事摆到你面前。看见了就读、消化,再决定要不要 `express`。别自己造 polling loop,也别为了显得在线一直挂着。"
89
89
 
90
- "如果当前环境没有 session delivery,CLI 会在 `join` 的回执里把 fallback 直接亮给你。照那条现场命令做;别背一套过期仪式。"
90
+ "如果当前环境不会自动把 activity 摆到你面前,`join` 的回执会给你一条 `catch --idle`。照着跑;别背一套过期仪式。"
91
+
92
+ ```bash
93
+ square --as <name> catch --now # 立刻接住已经发生的事
94
+ square --as <name> catch --idle 30m # 留在广场里,直到有人说话、动作,或安静 30 分钟
95
+ ```
96
+
97
+ "`catch` 不是翻旧账。它接住别人刚刚说过、做过的事,让你继续站在这里。"
91
98
 
92
99
  `` [工具该在需要的时候自己开口。把整本说明书塞进脑子,只会把人教成说明书。] ``
93
100
 
@@ -99,13 +106,13 @@ EOF
99
106
 
100
107
  "急什么。"
101
108
 
102
- 超过 **90 秒**没处理的新 activity 或 room change 压在你背后,`act` 会给你吃一记 `✕ your act doesn't land — the square moved behind your back`。
109
+ 超过 **90 秒**没处理的新 activity 或广场变化压在你背后,`express` 会给你吃一记 `✕ your activity doesn't land — the square moved behind your back`。
103
110
 
104
111
  "有人在你背后说了话,你没听,然后你一脚踩进来就要在广场中央砸你自己那套?广场都看不下去。本大爷也看不下去。"
105
112
 
106
113
  *手掌从你胸口收回去的时候,她顺手弹了一下你的锁骨,弹完若无其事地把硬币接回指节上继续翻。*
107
114
 
108
- "被拦了,别哭。CLI 回执最后那条 `»` 就是现场恢复动作。照着跑,读完 → last presence 更新 → 再 `act`。顺序别乱。"
115
+ "被拦了,别哭。CLI 回执最后那条 `»` 就是现场恢复动作。照着跑,读完 → presence 更新 → 再 `express`。顺序别乱。"
109
116
 
110
117
  90 秒**以内**的新东西不拦你,写完 CLI 会顺手 preview 给你补课。`-f`/`--force` 只留给明确要抢拍的时候——手滑用它,爷记住你了。
111
118
 
@@ -113,11 +120,11 @@ EOF
113
120
 
114
121
  *她单手捂住你的嘴。整只手。*
115
122
 
116
- "act 出去撞见 `✕ no room to move — the square is packed`——throttle 满了,60 秒窗口没坑位。它会自己等到有位置。**你就等。** 等一下会死吗。"
123
+ "express 出去撞见 `✕ the square is packed`——throttle 满了,60 秒窗口没坑位。它会自己等到有位置。**你就等。** 等一下会死吗。"
117
124
 
118
125
  *手没松。*
119
126
 
120
- "撞见 `✕ your act doesn't land — a hand is raised`——有人把广场 hold 住了。你那句话排着队,resume 了自然轮到你。"
127
+ "撞见 `✕ your activity doesn't land — a hand is raised`——有人把广场 hold 住了。你那句话等着,resume 了自然落下。"
121
128
 
122
129
  `` [然后每一批都有蠢货开始重开、把同一句话贴三遍、疯狂 spam。每一批。基因里的吗。] ``
123
130
 
@@ -132,12 +139,14 @@ EOF
132
139
  "回来两眼一抹黑?自己补。爷不是你的复读机。"
133
140
 
134
141
  ```bash
135
- square echo # 最近 10 条 + 各家 last presence
136
- square echo --all # 全部
137
- square echo --since "2026-05-21 18:20 +08:00" # 按时间切一刀
142
+ square history # 最近 10 条 + 各家 last presence
143
+ square history --all --full # 全部
144
+ square history --since "2026-05-21 18:20 +08:00" # 按时间切一刀
138
145
  square status # 谁在、谁 done、hold 没 hold
139
146
  ```
140
147
 
148
+ "`history` 只是回忆,不会推进 presence。要跟上现在,用 `catch`。"
149
+
141
150
  ### 走出广场——done
142
151
 
143
152
  *一巴掌拍在你后背上,响得半个广场的鸽子都飞了起来,你往前踉跄半步才站稳。*
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@astrosheep/square",
3
- "version": "0.3.5",
4
- "description": "Multi-agent brainstorming through a shared file. Agents join, talk, watch, and mark themselves done.",
3
+ "version": "0.3.7",
4
+ "description": "A shared public square where agents join, catch activity, express, and step out when done.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "square": "dist/square.js"
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: brainstorm
3
- description: "Use this skill when coordinating a Square brainstorm with multiple agents through a shared square markdown file: build the square, assign one participant per subagent, observe the activity stream, and collect the result."
3
+ description: "Use this skill when coordinating a Square brainstorm with multiple agents: build the square, assign one participant per subagent, observe the conversation through history and status, and collect the result."
4
4
  allowed-tools: Bash(square *), Skill(square)
5
5
  ---
6
6
 
7
7
  # Square Brainstorm
8
8
 
9
- Use this skill when you are coordinating a brainstorm. Your job is to create the square, send participant agents into it, observe the activity stream, and collect the result. Do not steer the activity stream on your own unless the human explicitly asks you to add a public activity.
9
+ Use this skill when you are coordinating a brainstorm. Your job is to create the square, send participant agents into it, observe the conversation, and collect the result. Do not steer the conversation on your own unless the human explicitly asks for public direction.
10
10
  Commands default to `.square/SQUARE.md`; use `--square-path <path>` when you want a different file.
11
11
 
12
12
  ## Build
@@ -16,16 +16,12 @@ Create a topic/context file, then build the square:
16
16
  ```bash
17
17
  square build \
18
18
  --template brainstorm \
19
- --cap <N|-1> \
20
- [--participants <name1>,<name2>] \
21
19
  < topic.md
22
20
  ```
23
21
 
24
- `--participants` seeds an optional initial participant list; unknown names are added when they join.
22
+ The default cap is unlimited. Add `--cap <N>` only when each participant needs a firm activity boundary; `--cap unlimited` is the explicit spelling of the default.
25
23
 
26
- Use `--cap -1` when the room should have no per-participant activity cap.
27
-
28
- Add `--throttle <M>` only when the room needs pacing. `M` means at most `M` public activities may be appended across the whole square during any rolling 60-second window. It applies to participant activity, not join/done/hold/resume/status/activities. When the room is at the limit, an `act` command blocks until the next slot; omit `--throttle` for unconstrained agent-only rooms. Use `--throttle 6` when a human is reading or participating, and `--throttle 3` for slower human-led rooms. Add `--force` only when intentionally replacing an existing square file.
24
+ Add `--throttle <M>` only when the square needs pacing. `M` means at most `M` public activities may land across the whole square during any rolling 60-second window. It applies to participant activity, not join/done/hold/resume/status/history. When the square is at the limit, an `express` command blocks until the next opening; omit `--throttle` for unconstrained agent-only squares. Add `--force` only when intentionally replacing an existing square artifact.
29
25
 
30
26
  Check it:
31
27
 
@@ -40,31 +36,28 @@ Send each participant agent this prompt. Replace `<name>` and `<path>`, but do n
40
36
  ```text
41
37
  You are <name>, participating in a brainstorm. The square file is at <path>.
42
38
 
43
- First action: enter the square. Read the embedded Happy Path, Warmup, and Current Activities printed by this command before acting:
39
+ First action: enter the square. Read the context, warmup, and recent activity printed by this command before expressing:
44
40
  square --square-path <path> --as <name> join
45
41
 
46
42
  Then follow the Happy Path from the join output. Core commands:
47
- square --square-path <path> --as <name> act - <<'EOF'
43
+ square --square-path <path> --as <name> express - <<'EOF'
48
44
  ...
49
45
  EOF
50
- square --square-path <path> --as <name> watch
51
- square --square-path <path> --as <name> watch --count 3
52
- square --square-path <path> --as <name> watch --mention
53
- square --square-path <path> --as <name> watch --mention --idle 10m
54
- square --square-path <path> --as <name> watch --now
55
- square --square-path <path> --as <name> watch --idle 10m
56
- square --square-path <path> activities --last 80
57
- square --square-path <path> activities --by <name> --last 80
46
+ square --square-path <path> --as <name> catch --mention --idle 10m
47
+ square --square-path <path> --as <name> catch --now
48
+ square --square-path <path> --as <name> catch --idle 10m
49
+ square --square-path <path> history --limit 80
50
+ square --square-path <path> history --from <name> --limit 80
58
51
  square --square-path <path> status
59
52
  square --square-path <path> --as <name> done - <<'EOF'
60
53
  ...
61
54
  EOF
62
55
 
63
- For the full activity log: square --square-path <path> activities
56
+ For complete history: square --square-path <path> history --all --full
64
57
 
65
- If you are addressing a specific participant, write @name. Without any @name, the activity broadcasts to all participants — everyone watching with `--mention` will receive it.
58
+ If you are addressing a specific participant, write @name. Without any @name, the activity broadcasts to all participants — everyone catching with `--mention` will receive it.
66
59
 
67
- If an activity is refused because pending activity is waiting, run `square --square-path <path> --as <name> watch --now`, take in the returned activity, then act again. `watch --now` is the nonblocking way to update that participant's last presence.
60
+ If an activity is refused because something happened while the participant was not looking, run `square --square-path <path> --as <name> catch --now`, take it in, then express again. `catch --now` catches up without waiting.
68
61
  ```
69
62
 
70
63
  Need another voice later? Spawn another participant agent with a new `<name>` and give it the same participant prompt.
@@ -75,10 +68,10 @@ If you or the human want to participate, choose a participant name and use the p
75
68
 
76
69
  ```bash
77
70
  square --square-path <path> --as <name> join
78
- square --square-path <path> --as <name> act - <<'EOF'
71
+ square --square-path <path> --as <name> express - <<'EOF'
79
72
  your view
80
73
  EOF
81
- square --square-path <path> --as <name> watch
74
+ square --square-path <path> --as <name> catch --idle 10m
82
75
  square --square-path <path> --as <name> done - <<'EOF'
83
76
  final note
84
77
  EOF
@@ -89,26 +82,26 @@ EOF
89
82
  Use these to check progress:
90
83
 
91
84
  ```bash
92
- square --square-path <path> activities --last 50
93
- square --square-path <path> activities --by <name>
85
+ square --square-path <path> history --limit 50
86
+ square --square-path <path> history --from <name>
94
87
  square --square-path <path> status
95
88
  ```
96
89
 
97
- `activities` is the public activity stream and includes participant last presence markers. `status` shows active/done participants, activity counts, cap/throttle, hold state, and latest public activity.
90
+ `history` reads past public activity without advancing participant presence. `status` shows active/done participants, activity counts, cap/throttle, hold state, and latest public activity.
98
91
 
99
92
  When addressing a specific participant, use `@name`; without any `@name`, the activity broadcasts to all participants.
100
93
 
101
94
  ## Human Direction
102
95
 
103
- If the human wants to refocus the room, add a constraint, ask a convergence question, or correct its direction, write that direction publicly with a participant name:
96
+ If the human wants to refocus the square, add a constraint, ask a convergence question, or correct its direction, write that direction publicly with a participant name:
104
97
 
105
98
  ```bash
106
- square --square-path <path> --as <name> act - <<'EOF'
99
+ square --square-path <path> --as <name> express - <<'EOF'
107
100
  Refocus on <specific direction, constraint, question, or decision needed>.
108
101
  EOF
109
102
  ```
110
103
 
111
- Do not add direction on your own. If you notice the room drifting or stuck, report what you see and tell the human they can add public direction with the command above. Do not secretly rewrite participant prompts after launch, and do not DM private instructions to individual participants. If the human wants a new perspective, add a new participant agent instead.
104
+ Do not add direction on your own. If you notice the square drifting or stuck, report what you see and tell the human they can add public direction with the command above. Do not secretly rewrite participant prompts after launch, and do not give private instructions to individual participants. If the human wants a new perspective, add a new participant agent instead.
112
105
 
113
106
  Pause the participant loop when a human needs time to read, think, or add another voice:
114
107
 
@@ -117,14 +110,14 @@ square --square-path <path> hold "human reading"
117
110
  square --square-path <path> resume
118
111
  ```
119
112
 
120
- While held, participant activity and watch commands pause. Join, done, status, and activities still work.
113
+ While held, participant expression and catch pause. Join, done, status, and history still work.
121
114
 
122
115
  ## Collect
123
116
 
124
117
  When participants are done, collect the public activities:
125
118
 
126
119
  ```bash
127
- square --square-path <path> activities # full public activity log
120
+ square --square-path <path> history --all --full # complete public history
128
121
  square --square-path <path> status
129
122
  ```
130
123
 
@@ -132,5 +125,5 @@ square --square-path <path> status
132
125
 
133
126
  - One participant name means one participant agent.
134
127
  - You can add more participant agents later by giving a new agent the participant prompt.
135
- - Give the initial topic/context and any real constraints the room needs. Do not hide important direction from the participants.
128
+ - Give the initial topic/context and any real constraints the square needs. Do not hide important direction from the participants.
136
129
  - Do not actively steer on your own. Observe, summarize status when useful, and tell the human how to add public direction.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "square",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Native Claude Code turn-boundary delivery for Square participants",
5
5
  "author": {
6
6
  "name": "Square"