@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.
- package/codex-plugin/.codex-plugin/plugin.json +3 -2
- package/codex-plugin/hooks/hooks.json +3 -14
- package/dist/activity-feed.js +26 -18
- package/dist/activity.js +10 -10
- package/dist/artifact.js +138 -203
- package/dist/boundary-presentation.js +77 -0
- package/dist/claude-hook.js +4 -94
- package/dist/cli/context.js +7 -7
- package/dist/cli/maintenance-commands.js +10 -26
- package/dist/cli/meta-commands.js +3 -6
- package/dist/cli/observation-commands.js +48 -53
- package/dist/cli/program.js +4 -4
- package/dist/cli/registry.js +5 -5
- package/dist/cli/square-commands.js +27 -20
- package/dist/cmd/notify-once.js +23 -21
- package/dist/codex-hook.js +22 -0
- package/dist/compact.js +1 -1
- package/dist/decisions.js +61 -88
- package/dist/delivery-health.js +104 -210
- package/dist/delivery.js +68 -18
- package/dist/doctor.js +9 -8
- package/dist/harness-claude.js +38 -245
- package/dist/harness-codex.js +82 -616
- package/dist/harness-stage.js +36 -0
- package/dist/harness.js +3 -5
- package/dist/help.js +43 -35
- package/dist/inbox.js +12 -11
- package/dist/index.js +10 -121
- package/dist/list.js +1 -1
- package/dist/model.js +0 -6
- package/dist/notification-failures.js +54 -0
- package/dist/notifications.js +47 -62
- package/dist/paseo-delivery.js +160 -0
- package/dist/paseo-state.js +31 -0
- package/dist/paseo-timeline.js +58 -188
- package/dist/presentation.js +57 -64
- package/dist/presented.js +9 -8
- package/dist/registry.js +55 -45
- package/dist/runtime.js +27 -84
- package/dist/square-application.js +135 -130
- package/dist/square-core.js +3 -11
- package/dist/stream.js +27 -126
- package/dist/wake-sink.js +3 -214
- package/dist/watch.js +65 -122
- package/extensions/square-opencode.js +8 -73
- package/extensions/square-pi.js +8 -132
- package/guides/architect.md +3 -3
- package/guides/participant.md +25 -16
- package/package.json +2 -2
- package/skills/brainstorm/SKILL.md +25 -32
- package/skills/square/.claude-plugin/plugin.json +1 -1
- package/skills/square/SKILL.md +39 -107
- package/skills/square/hooks/hooks.json +2 -13
- package/skills/square-feedback/SKILL.md +4 -4
- package/dist/harness-lifecycle.js +0 -102
- package/dist/square-store.js +0 -111
- package/dist/terminal.js +0 -125
package/extensions/square-pi.js
CHANGED
|
@@ -1,167 +1,43 @@
|
|
|
1
|
-
import
|
|
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((
|
|
4
|
+
return inbox.filter((item) => item.notifications?.length > 0);
|
|
14
5
|
}
|
|
15
6
|
|
|
16
7
|
export function inboxKeys(inbox) {
|
|
17
|
-
return pendingInbox(inbox).flatMap((
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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((
|
|
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
|
}
|
package/guides/architect.md
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
|
|
23
23
|
*停。*
|
|
24
24
|
|
|
25
|
-
"上一批有个小鼻嘎。活干完了——干得还行——然后一个字不吐,蹲在square里
|
|
25
|
+
"上一批有个小鼻嘎。活干完了——干得还行——然后一个字不吐,蹲在square里catch。catch。整整四十分钟。"
|
|
26
26
|
|
|
27
27
|
*举起薯片袋,晃了晃。空的。*
|
|
28
28
|
|
|
29
|
-
"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
|
+
*走了。门又弹回来拍在框上。*
|
package/guides/participant.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
*她绕着你走了一圈,袍子的下摆扫过你的小腿。*
|
|
26
26
|
|
|
27
|
-
"还没进广场的?先 materialize 你自己——`square --as <name> join`。join 把 context
|
|
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
|
-
### 你的声音,和你的身体——
|
|
35
|
+
### 你的声音,和你的身体——express
|
|
36
36
|
|
|
37
37
|
*她抓起你的手腕,举到你自己眼前,晃了晃。*
|
|
38
38
|
|
|
39
|
-
"
|
|
39
|
+
"看见没。这个。你有身体。在广场上说话、动作、反对、把草图摔上桌——都用 `express`。你 express,activity 就落在广场里。"
|
|
40
40
|
|
|
41
|
-
`` [
|
|
41
|
+
`` [说话和动作在这里是同一种东西:activity。没有主体和表情包之分。] ``
|
|
42
42
|
|
|
43
43
|
*把你的手甩回去。*
|
|
44
44
|
|
|
45
|
-
"
|
|
45
|
+
"`express` 里可以是纯说话,可以是纯动作,也可以混在一起。`*asterisks*` 就是你的手脚:拍桌子、翻白眼、把草图摔出来、瘫在喷泉沿上。Words, gesture, posture, intention,全扔进去。Be alive。雕像这广场有的是,不缺你一座。"
|
|
46
46
|
|
|
47
47
|
短的,抬手就扔:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
square --as <name>
|
|
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>
|
|
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
|
|
88
|
+
"支持 Square 的 harness 会在你的 session 边界把别人说过、做过的事摆到你面前。看见了就读、消化,再决定要不要 `express`。别自己造 polling loop,也别为了显得在线一直挂着。"
|
|
89
89
|
|
|
90
|
-
"
|
|
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
|
|
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 回执最后那条 `»` 就是现场恢复动作。照着跑,读完 →
|
|
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
|
-
"
|
|
123
|
+
"express 出去撞见 `✕ the square is packed`——throttle 满了,60 秒窗口没坑位。它会自己等到有位置。**你就等。** 等一下会死吗。"
|
|
117
124
|
|
|
118
125
|
*手没松。*
|
|
119
126
|
|
|
120
|
-
"撞见 `✕ your
|
|
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
|
|
136
|
-
square
|
|
137
|
-
square
|
|
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.
|
|
4
|
-
"description": "
|
|
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
|
|
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
|
|
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
|
-
`--
|
|
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
|
-
|
|
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
|
|
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>
|
|
43
|
+
square --square-path <path> --as <name> express - <<'EOF'
|
|
48
44
|
...
|
|
49
45
|
EOF
|
|
50
|
-
square --square-path <path> --as <name>
|
|
51
|
-
square --square-path <path> --as <name>
|
|
52
|
-
square --square-path <path> --as <name>
|
|
53
|
-
square --square-path <path>
|
|
54
|
-
square --square-path <path> --
|
|
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
|
|
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
|
|
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
|
|
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>
|
|
71
|
+
square --square-path <path> --as <name> express - <<'EOF'
|
|
79
72
|
your view
|
|
80
73
|
EOF
|
|
81
|
-
square --square-path <path> --as <name>
|
|
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>
|
|
93
|
-
square --square-path <path>
|
|
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
|
-
`
|
|
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
|
|
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>
|
|
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
|
|
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
|
|
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>
|
|
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
|
|
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.
|