@astrosheep/square 0.3.94 → 0.3.96
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/artifact.js +1 -1
- package/dist/attention-presentation.d.ts +5 -4
- package/dist/attention-presentation.js +18 -8
- package/dist/attention.d.ts +19 -0
- package/dist/attention.js +30 -0
- package/dist/boundary-presentation.js +50 -48
- package/dist/catch-decisions.d.ts +1 -2
- package/dist/catch-decisions.js +41 -21
- package/dist/channel.d.ts +72 -0
- package/dist/channel.js +86 -0
- package/dist/claude-delivery.js +2 -1
- package/dist/cli/context.js +0 -2
- package/dist/cli/express-presentation.js +3 -3
- package/dist/cli/json.js +1 -1
- package/dist/cli/program.js +1 -1
- package/dist/cli/registry.js +1 -3
- package/dist/cli/square-commands.d.ts +0 -2
- package/dist/cli/square-commands.js +21 -27
- package/dist/decisions.d.ts +0 -5
- package/dist/decisions.js +0 -13
- package/dist/delivery-attempts.d.ts +52 -0
- package/dist/delivery-attempts.js +73 -0
- package/dist/delivery-effects.d.ts +139 -0
- package/dist/delivery-effects.js +163 -0
- package/dist/delivery-operations.js +43 -68
- package/dist/delivery-primitives.d.ts +5 -0
- package/dist/delivery-primitives.js +3 -0
- package/dist/delivery.d.ts +1 -1
- package/dist/delivery.js +8 -7
- package/dist/help.js +4 -6
- package/dist/http-delivery.d.ts +16 -0
- package/dist/http-delivery.js +101 -0
- package/dist/inbox.js +3 -1
- package/dist/mcp.js +65 -63
- package/dist/model.d.ts +10 -6
- package/dist/model.js +20 -1
- package/dist/notifications.js +2 -0
- package/dist/operation-presentation.d.ts +1 -2
- package/dist/operation-presentation.js +12 -20
- package/dist/ports.d.ts +8 -14
- package/dist/presentation-operations.d.ts +15 -19
- package/dist/presentation-operations.js +47 -57
- package/dist/presentation.d.ts +2 -9
- package/dist/presentation.js +13 -48
- package/dist/receive.d.ts +66 -0
- package/dist/receive.js +54 -0
- package/dist/runtime.d.ts +0 -1
- package/dist/runtime.js +2 -3
- package/dist/sqlite-square.d.ts +3 -2
- package/dist/sqlite-square.js +83 -57
- package/dist/square-api.d.ts +1 -1
- package/dist/square-api.js +1 -1
- package/dist/square-core.d.ts +1 -9
- package/dist/square-domain.js +29 -36
- package/dist/square-facade.d.ts +25 -23
- package/dist/square-legacy-framing.d.ts +2 -0
- package/dist/square-legacy-framing.js +8 -0
- package/dist/square-migration.d.ts +3 -1
- package/dist/square-migration.js +46 -13
- package/dist/square-receive.d.ts +6 -0
- package/dist/square-receive.js +18 -0
- package/dist/square-sqlite.d.ts +5 -3
- package/dist/square-sqlite.js +100 -92
- package/dist/square-tools.d.ts +1 -0
- package/dist/square-tools.js +12 -12
- package/dist/views.d.ts +2 -3
- package/dist/views.js +14 -19
- package/dist/wakes.d.ts +0 -3
- package/dist/wakes.js +3 -5
- package/examples/symmetric-domains.mjs +250 -0
- package/guides/application-facade-delivery-evidence.md +5 -5
- package/guides/attention-primitive.md +32 -0
- package/guides/change-waits.md +2 -2
- package/guides/codex-delivery.md +1 -1
- package/guides/delivery-primitives.md +180 -0
- package/guides/mcp.md +1 -1
- package/guides/migration.md +12 -6
- package/guides/participant-ownership.md +1 -1
- package/guides/pi-tools.md +2 -2
- package/guides/primitive-catch-consolidation.md +5 -5
- package/guides/primitive-history-consolidation.md +2 -2
- package/guides/primitive-status-consolidation.md +3 -3
- package/guides/primitive-storage-consolidation.md +1 -1
- package/guides/receive-primitive.md +90 -0
- package/guides/row-runtime-delivery-evidence.md +1 -1
- package/guides/row-storage-design.md +17 -23
- package/guides/square-api.md +77 -10
- package/guides/symmetric-domains.md +92 -0
- package/package.json +18 -1
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/skills/square/SKILL.md +2 -6
- package/plugins/codex/.codex-plugin/plugin.json +1 -1
- package/plugins/paseo/client/marble.ts +7 -0
- package/plugins/paseo/client/markdown.tsx +65 -9
- package/plugins/paseo/client/palette.ts +43 -20
- package/plugins/paseo/client/square-message.tsx +57 -48
- package/plugins/paseo/shared/message.ts +1 -2
- package/plugins/pi/square-pi.js +6 -4
- package/skills/square/SKILL.md +2 -6
|
@@ -1,40 +1,50 @@
|
|
|
1
1
|
import type { PluginTheme } from "@getpaseo/plugin";
|
|
2
|
+
import { MARBLE_DARK, MARBLE_LIGHT } from "./marble";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
|
-
* Square's own courtyard palette:
|
|
5
|
-
* slate
|
|
5
|
+
* Square's own courtyard palette: veinless honed stone (muted grey light, charcoal dark) and a
|
|
6
|
+
* slate seal ■ — everything half a step down, the quiet card on the timeline, deliberately no relative of notesoup's warm parchment or
|
|
6
7
|
* pi-meantime's neutral carbon. Every token here is opaque and self-contained — the card and
|
|
7
8
|
* Markdown never borrow the host's surface ramp or accent, only its appearance
|
|
8
9
|
* (read from the host ink) and its accentForeground, which paints text on top
|
|
9
10
|
* of an accent fill.
|
|
10
11
|
*/
|
|
11
12
|
const DARK = {
|
|
12
|
-
surface0: "#
|
|
13
|
-
surface1: "#
|
|
14
|
-
surface2: "#
|
|
15
|
-
border: "#
|
|
16
|
-
foreground: "#
|
|
17
|
-
foregroundMuted: "#
|
|
18
|
-
accent: "#
|
|
13
|
+
surface0: "#15171a", // inset / code
|
|
14
|
+
surface1: "#1a1d20", // card (charcoal stone)
|
|
15
|
+
surface2: "#15171a", // inset / code
|
|
16
|
+
border: "#2b2f34",
|
|
17
|
+
foreground: "#dde1e6",
|
|
18
|
+
foregroundMuted: "#858b94",
|
|
19
|
+
accent: "#8298ad", // plaza ■ / links
|
|
19
20
|
} as const;
|
|
20
21
|
|
|
21
22
|
const LIGHT = {
|
|
22
|
-
surface0: "#
|
|
23
|
-
surface1: "#
|
|
24
|
-
surface2: "#
|
|
25
|
-
border: "#
|
|
26
|
-
foreground: "#
|
|
27
|
-
foregroundMuted: "#
|
|
28
|
-
accent: "#
|
|
23
|
+
surface0: "#e9ebee",
|
|
24
|
+
surface1: "#f4f5f6", // card (grey stone)
|
|
25
|
+
surface2: "#e9ebee",
|
|
26
|
+
border: "#e0e2e5",
|
|
27
|
+
foreground: "#2b2e33",
|
|
28
|
+
foregroundMuted: "#90959c",
|
|
29
|
+
accent: "#56687e",
|
|
29
30
|
} as const;
|
|
30
31
|
|
|
31
|
-
const
|
|
32
|
+
const TILE = 512;
|
|
33
|
+
|
|
34
|
+
/** Web-only surface: react-native-web passes these through as inline CSS. */
|
|
35
|
+
const STONE = {
|
|
36
|
+
// A slab resting on the page: one darker cut along the bottom edge, a tight contact shadow, no sheen.
|
|
37
|
+
dark: { image: `url(${MARBLE_DARK})`, edge: "#34393f", boxShadow: "0 1px 0 rgba(0,0,0,0.3), 0 4px 10px -6px rgba(0,0,0,0.55)", inlay: "inset 0 0 0 0.5px rgba(0,0,0,0.4)" },
|
|
38
|
+
light: { image: `url(${MARBLE_LIGHT})`, edge: "#c9ccd1", boxShadow: "0 1px 0 rgba(24,26,30,0.04), 0 4px 10px -6px rgba(24,26,30,0.18)", inlay: "inset 0 0 0 0.5px rgba(0,0,0,0.26)" },
|
|
39
|
+
} as const;
|
|
32
40
|
|
|
33
41
|
export interface SquarePalette {
|
|
34
42
|
/** Complete theme for the card and its Markdown surfaces. */
|
|
35
43
|
theme: PluginTheme;
|
|
36
|
-
/**
|
|
37
|
-
|
|
44
|
+
/** Marble card surface for the web host, cut from the tile at `seed`; native keeps the flat surface1. */
|
|
45
|
+
stone(seed: string): { backgroundImage: string; backgroundSize: string; backgroundPosition: string; borderBottomColor: string; boxShadow: string };
|
|
46
|
+
/** Web-only: the ■ set into the stone. */
|
|
47
|
+
inlay: { boxShadow: string };
|
|
38
48
|
}
|
|
39
49
|
|
|
40
50
|
/** Paseo theme colors are hex (#RGB or #RRGGBB). */
|
|
@@ -57,6 +67,19 @@ export function squarePalette(theme: PluginTheme): SquarePalette {
|
|
|
57
67
|
statusWarning: theme.colors.statusWarning,
|
|
58
68
|
statusDanger: theme.colors.statusDanger,
|
|
59
69
|
} },
|
|
60
|
-
|
|
70
|
+
stone: seed => {
|
|
71
|
+
// Each card shows its own patch of the slab, so neighbours never repeat a vein.
|
|
72
|
+
let hash = 2166136261;
|
|
73
|
+
for (const char of seed) hash = Math.imul(hash ^ char.charCodeAt(0), 16777619);
|
|
74
|
+
const { image, edge, boxShadow } = dark ? STONE.dark : STONE.light;
|
|
75
|
+
return {
|
|
76
|
+
backgroundImage: image,
|
|
77
|
+
backgroundSize: `${TILE}px ${TILE}px`,
|
|
78
|
+
backgroundPosition: `${-((hash >>> 0) % TILE)}px ${-((hash >>> 9) % TILE)}px`,
|
|
79
|
+
borderBottomColor: edge,
|
|
80
|
+
boxShadow,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
inlay: { boxShadow: (dark ? STONE.dark : STONE.light).inlay },
|
|
61
84
|
};
|
|
62
85
|
}
|
|
@@ -1,95 +1,104 @@
|
|
|
1
1
|
import type { PluginTimelineItemProps } from "@getpaseo/plugin/client";
|
|
2
2
|
import { Icon } from "@getpaseo/plugin/client/react-native";
|
|
3
3
|
import { useMemo, useState } from "react";
|
|
4
|
-
import { Pressable, ScrollView, StyleSheet, Text, View } from "react-native";
|
|
4
|
+
import { Pressable, ScrollView, StyleSheet, Text, View, type ViewStyle } from "react-native";
|
|
5
5
|
import { parseSquareBlocks, parseSquareVoice, type SquareMessageData } from "../shared/message";
|
|
6
|
-
import { MONO, SquareInline, SquareMarkdownBody } from "./markdown";
|
|
6
|
+
import { MONO, SquareCue, SquareInline, SquareMarkdownBody } from "./markdown";
|
|
7
7
|
import { squarePalette } from "./palette";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* The accent ■ marks the square itself, not a route.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Header (both states): ■ square · who spoke … act ids · how many.
|
|
12
|
+
* Collapsed: two preview lines. Expanded: the whole scene, at full width.
|
|
13
|
+
* One attribution style for one voice or many — each speaker's name runs into
|
|
14
|
+
* their first line in the seal's color (not repeated while they keep talking);
|
|
15
|
+
* a bell or an *action* is stage direction, a caption on a hairline.
|
|
15
16
|
*/
|
|
16
17
|
export function SquareMessage({ item, theme, layout }: PluginTimelineItemProps<SquareMessageData>) {
|
|
17
18
|
const [expanded, setExpanded] = useState(false);
|
|
19
|
+
const [hovered, setHovered] = useState(false);
|
|
18
20
|
const palette = useMemo(() => squarePalette(theme), [theme]);
|
|
19
21
|
const { text, items } = item.data;
|
|
20
22
|
const latest = items?.[items.length - 1];
|
|
21
23
|
const preview = latest?.preview?.replace(/\s+/g, " ").trim();
|
|
22
24
|
const blocks = useMemo(() => parseSquareBlocks(text), [text]);
|
|
23
|
-
const
|
|
24
|
-
const single = multi ? undefined : parseSquareVoice(blocks[0].actor, blocks[0].meta);
|
|
25
|
+
const voices = useMemo(() => blocks.map(block => parseSquareVoice(block.actor, block.meta)), [blocks]);
|
|
25
26
|
const names = items !== undefined
|
|
26
27
|
? items.map(entry => entry.actor)
|
|
27
|
-
:
|
|
28
|
+
: voices.map(voice => voice.speaker);
|
|
28
29
|
const speakers = [...new Set(names.filter((name): name is string => name !== undefined))];
|
|
29
30
|
const squareName = latest?.square ?? blocks[0].meta?.split("·")[1]?.trim() ?? "Square";
|
|
30
|
-
const bell = latest?.route === "bell" ||
|
|
31
|
+
const bell = latest?.route === "bell" || (voices.length === 1 && voices[0].bell);
|
|
31
32
|
// Header is the same in both states; act id is always shown when we know it.
|
|
32
|
-
const actIds = [...new Set(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}))];
|
|
36
|
-
const trailing = `· ${squareName}${actIds.length ? ` · ${actIds.join(", ")}` : ""}${items && items.length > 1 ? ` · ${items.length}` : ""}`;
|
|
33
|
+
const actIds = [...new Set(voices.flatMap(voice => voice.actId ? [voice.actId] : []))];
|
|
34
|
+
const trailing = [actSpan(actIds), items && items.length > 1 ? String(items.length) : undefined]
|
|
35
|
+
.filter(Boolean).join(" · ");
|
|
37
36
|
const { accent, border, foreground, foregroundMuted: muted, surface1 } = palette.theme.colors;
|
|
37
|
+
// On web the header brightens its details under the cursor; touch keeps them quiet.
|
|
38
|
+
const detail = layout.platform === "web" && hovered ? foreground : muted;
|
|
38
39
|
const row = { flexDirection: "row" as const, alignItems: "center" as const, gap: 6 };
|
|
39
40
|
const indent = { paddingLeft: 15 };
|
|
40
41
|
|
|
41
42
|
return (
|
|
42
|
-
<View style={
|
|
43
|
+
<View style={[
|
|
44
|
+
{ backgroundColor: surface1, borderWidth: StyleSheet.hairlineWidth, borderColor: border, borderRadius: 4, paddingHorizontal: 12, paddingVertical: 9 },
|
|
45
|
+
layout.platform === "web" && palette.stone(`${squareName} ${actIds[0] ?? ""}`) as ViewStyle,
|
|
46
|
+
]}>
|
|
43
47
|
<Pressable
|
|
44
48
|
accessibilityRole="button"
|
|
45
49
|
accessibilityLabel={`${expanded ? "收起" : "展开"} ${squareName}: ${speakers.join(", ") || "Square"}`}
|
|
46
50
|
aria-expanded={expanded}
|
|
47
51
|
onPress={() => setExpanded(value => !value)}
|
|
48
|
-
|
|
52
|
+
onHoverIn={() => setHovered(true)}
|
|
53
|
+
onHoverOut={() => setHovered(false)}
|
|
54
|
+
style={({ pressed }) => ({ opacity: pressed ? 0.85 : 1 })}
|
|
49
55
|
>
|
|
50
56
|
<View style={row}>
|
|
51
|
-
<
|
|
52
|
-
<Text numberOfLines={1} style={{ color: foreground, fontSize: 13, fontWeight: "
|
|
53
|
-
{
|
|
54
|
-
{
|
|
57
|
+
<View style={[{ width: 9, height: 9, borderRadius: 1.5, backgroundColor: accent }, layout.platform === "web" && palette.inlay as ViewStyle]} />
|
|
58
|
+
<Text numberOfLines={1} style={{ color: foreground, fontSize: 13, fontWeight: "600", flex: 1 }}>
|
|
59
|
+
{squareName}
|
|
60
|
+
{(speakers.length > 0 || bell) && (
|
|
61
|
+
<Text style={{ color: muted, fontWeight: "400" }}> · {[speakers.join(", "), bell ? "🔔" : ""].filter(Boolean).join(" · ")}</Text>
|
|
62
|
+
)}
|
|
55
63
|
</Text>
|
|
56
|
-
<Text style={{ color:
|
|
57
|
-
<Icon name={expanded ? "ChevronUp" : "ChevronDown"} size={15} color={
|
|
64
|
+
{trailing !== "" && <Text style={{ color: detail, fontSize: 11, fontFamily: MONO, fontVariant: ["tabular-nums"] }}>{trailing}</Text>}
|
|
65
|
+
<Icon name={expanded ? "ChevronUp" : "ChevronDown"} size={15} color={detail} />
|
|
58
66
|
</View>
|
|
59
67
|
{!expanded && preview !== undefined && preview !== "" && (
|
|
60
68
|
<View style={{ ...indent, marginTop: 3 }}>
|
|
61
|
-
<SquareInline text={preview} theme={palette.theme} numberOfLines={2} />
|
|
69
|
+
<SquareInline text={preview} theme={palette.theme} numberOfLines={2} lead={latest?.actor} />
|
|
62
70
|
</View>
|
|
63
71
|
)}
|
|
64
72
|
</Pressable>
|
|
65
73
|
{expanded && (
|
|
66
74
|
<ScrollView style={{ maxHeight: layout.compact ? 280 : 400, marginTop: 3 }} nestedScrollEnabled>
|
|
67
|
-
{
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
);
|
|
86
|
-
})}
|
|
87
|
-
</View>
|
|
88
|
-
) : (
|
|
89
|
-
<SquareMarkdownBody text={blocks[0].body} theme={palette.theme} style={indent} />
|
|
90
|
-
)}
|
|
75
|
+
<View style={{ ...indent, gap: 7 }}>
|
|
76
|
+
{blocks.map((block, index) => {
|
|
77
|
+
const voice = voices[index];
|
|
78
|
+
if (block.body === "" && !voice.bell) return null;
|
|
79
|
+
const repeat = index > 0 && voices[index - 1].speaker === voice.speaker;
|
|
80
|
+
return (
|
|
81
|
+
<View key={voice.actId ?? index} style={{ gap: 6 }}>
|
|
82
|
+
{voice.bell && <SquareCue theme={palette.theme} label={`${voice.speaker ?? ""} 🔔`} />}
|
|
83
|
+
<SquareMarkdownBody
|
|
84
|
+
text={block.body}
|
|
85
|
+
theme={palette.theme}
|
|
86
|
+
lead={repeat ? undefined : voice.speaker}
|
|
87
|
+
actor={voice.speaker}
|
|
88
|
+
/>
|
|
89
|
+
</View>
|
|
90
|
+
);
|
|
91
|
+
})}
|
|
92
|
+
</View>
|
|
91
93
|
</ScrollView>
|
|
92
94
|
)}
|
|
93
95
|
</View>
|
|
94
96
|
);
|
|
95
97
|
}
|
|
98
|
+
|
|
99
|
+
/** act/18, act/19 → act/18–19; anything else is listed as is. */
|
|
100
|
+
function actSpan(ids: string[]): string | undefined {
|
|
101
|
+
if (ids.length < 2) return ids[0];
|
|
102
|
+
const numbers = ids.map(id => /^act\/(\d+)$/.exec(id)?.[1]).map(Number);
|
|
103
|
+
return numbers.every(Number.isInteger) ? `act/${Math.min(...numbers)}–${Math.max(...numbers)}` : ids.join(", ");
|
|
104
|
+
}
|
|
@@ -50,7 +50,7 @@ export function parseSquareBlocks(text: string): SquareBlock[] {
|
|
|
50
50
|
return blocks;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
export interface SquareVoice {
|
|
53
|
+
export interface SquareVoice { speaker?: string; bell: boolean; actId?: string }
|
|
54
54
|
|
|
55
55
|
// A voice line is chrome for the card: `● rei rang the bell` names who, how, and which
|
|
56
56
|
// activity. Route prose is parsed into those marks, never rendered as narration.
|
|
@@ -58,7 +58,6 @@ export function parseSquareVoice(actorLine?: string, metaLine?: string): SquareV
|
|
|
58
58
|
const line = actorLine?.trim() ?? "";
|
|
59
59
|
const cleaned = line.replace(/^[●○◎◆■·]\s*/, "").trim();
|
|
60
60
|
return {
|
|
61
|
-
glyph: /^[●○◎·]/.exec(line)?.[0] ?? "●",
|
|
62
61
|
speaker: /\S+/.exec(cleaned)?.[0],
|
|
63
62
|
bell: /rang the bell/i.test(cleaned),
|
|
64
63
|
actId: /act\/\d+/.exec(metaLine ?? "")?.[0],
|
package/plugins/pi/square-pi.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Container, Markdown, Spacer, Text } from '@earendil-works/pi-tui';
|
|
|
3
3
|
import { z } from 'zod/v4';
|
|
4
4
|
|
|
5
5
|
import { Square, harnessOwner } from '../../dist/square-api.js';
|
|
6
|
-
import { SQUARE_TOOLS, SQUARE_TOOL_INSTRUCTIONS, squareToolFailure, squareToolFailureText } from '../../dist/square-tools.js';
|
|
6
|
+
import { SQUARE_TOOLS, SQUARE_TOOL_INSTRUCTIONS, squareToolsEnabled, squareToolFailure, squareToolFailureText } from '../../dist/square-tools.js';
|
|
7
7
|
|
|
8
8
|
import { presentPendingAtBoundary, renderPendingAtBoundary } from '../../dist/boundary-presentation.js';
|
|
9
9
|
import { operationEnv } from '../../dist/participant-identity.js';
|
|
@@ -46,8 +46,10 @@ export function pendingCardDetails(pending) {
|
|
|
46
46
|
recipient: membership.seat.participant,
|
|
47
47
|
route: note.route,
|
|
48
48
|
act: formatActivityId(note.actIndex),
|
|
49
|
-
preview: previewAttentionBody(note.body),
|
|
50
|
-
description:
|
|
49
|
+
preview: previewAttentionBody(note.body, note.delivery),
|
|
50
|
+
description: note.delivery?.mode === 'direct'
|
|
51
|
+
? `${note.actor} → ${membership.seat.participant}`
|
|
52
|
+
: renderAttentionDescription({ actor: note.actor, route: note.route }),
|
|
51
53
|
body: note.body,
|
|
52
54
|
})));
|
|
53
55
|
if (items.length === 0) return undefined;
|
|
@@ -141,7 +143,7 @@ export function renderSquareCard(message, { expanded, outputPad = 1 }, theme) {
|
|
|
141
143
|
}
|
|
142
144
|
|
|
143
145
|
export default function squarePiExtension(pi) {
|
|
144
|
-
for (const tool of SQUARE_TOOLS) {
|
|
146
|
+
if (squareToolsEnabled(process.env)) for (const tool of SQUARE_TOOLS) {
|
|
145
147
|
pi.registerTool({
|
|
146
148
|
name: `square_${tool.name}`,
|
|
147
149
|
label: `Square ${tool.name}`,
|
package/skills/square/SKILL.md
CHANGED
|
@@ -8,7 +8,7 @@ allowed-tools: Bash(square *)
|
|
|
8
8
|
|
|
9
9
|
Bring a thought, a question, an objection, or a gesture. Leave private tool chatter out; quiet is welcome too.
|
|
10
10
|
|
|
11
|
-
This skill explains what Square is and how to be present in it. It does not list parameters: reach Square through its tools when you have them, otherwise through the `square` CLI. The tool descriptions and `square <operation> --help` are the exact usage. The tools group listen, unlisten and ignore under `attention
|
|
11
|
+
This skill explains what Square is and how to be present in it. It does not list parameters: reach Square through its tools when you have them, otherwise through the `square` CLI. The tool descriptions and `square <operation> --help` are the exact usage. The tools group listen, unlisten and ignore under `attention`.
|
|
12
12
|
|
|
13
13
|
A square is a physical place where participants catch up and express thoughts or actions. Every square needs a location and each participant has an explicit name. Tools take the execution body from their live harness context. Use `--location` (or `SQUARE_LOCATION`) and an explicit `--as <name>` when joining. Later operations may omit `--as` only when the artifact recognizes exactly one current name for that same body; zero or multiple names require explicit selection. A name never grants custody.
|
|
14
14
|
|
|
@@ -45,7 +45,7 @@ Addressing is not a secrecy boundary. Everything stays readable through `history
|
|
|
45
45
|
|
|
46
46
|
**Pace.** Leave space for others to speak. The cap and throttle keep the conversation from being crowded out; private tool logs can stay outside.
|
|
47
47
|
|
|
48
|
-
**Behind you.** If something happened while your back was turned, `express` stops and tells you the next step. Take it, take in what happened, then express again. If the square is packed
|
|
48
|
+
**Behind you.** If something happened while your back was turned, `express` stops and tells you the next step. Take it, take in what happened, then express again. If the square is packed, wait for the opening; never restart or repost. Express without catching up only when you deliberately mean to.
|
|
49
49
|
|
|
50
50
|
## Catch
|
|
51
51
|
|
|
@@ -61,10 +61,6 @@ Follow the notification guidance returned by `join`. When automatic notification
|
|
|
61
61
|
|
|
62
62
|
`history` is the only way to look back: remembering, not keeping up. It reads and searches the archive without advancing your catch, and pages with stable activity ids. Use `catch` to stay present. Never read or parse the binary Square artifact directly.
|
|
63
63
|
|
|
64
|
-
## Hold
|
|
65
|
-
|
|
66
|
-
`hold` raises a hand when the square should pause. Lower it with `hold` and `release: true` in the tools, or `resume` in the CLI.
|
|
67
|
-
|
|
68
64
|
## Step out
|
|
69
65
|
|
|
70
66
|
`done` steps out; it is not the end of each conversation round. You can join again later. Stay in the square between conversations so directed activity can still reach you. Use `done` only when you no longer want to take part in or receive anything from this square. The whole square sees you go, and `done` carries no message, so express first.
|