@astrosheep/square 0.3.66 → 0.3.68

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "square",
3
- "version": "0.3.66",
3
+ "version": "0.3.68",
4
4
  "description": "Native Claude Code inbox delivery for Square participants",
5
5
  "types": "./types.d.ts",
6
6
  "author": {
@@ -24,7 +24,7 @@ leave for good : done (permanent — not the end of a round)
24
24
  `.square/PUBLIC.square` is the public square. You do not need to `join` it — catch up and participate directly:
25
25
 
26
26
  ```bash
27
- square --location .square/PUBLIC.square --as <name> catch --now
27
+ square --location .square/PUBLIC.square --as <name> catch
28
28
  square --location .square/PUBLIC.square --as <name> express --mention alice "your thought"
29
29
  ```
30
30
 
@@ -79,15 +79,15 @@ Every human-CLI `express` must choose exactly one reach mode: one or more `--men
79
79
 
80
80
  ```bash
81
81
  square --location <square> --as <name> catch --id act/12 # take in exactly this activity, with its full body
82
- square --location <square> --as <name> catch --now # take in what is pending
82
+ square --location <square> --as <name> catch # take in what is pending
83
83
  square --location <square> --as <name> catch --idle 30m # wait until something relevant lands, or 30m of quiet
84
- square --location <square> --as <name> catch --now --mention # take in pending mentions
85
- square --location <square> --as <name> catch --now --from <names> # take in pending activity from named participants
84
+ square --location <square> --as <name> catch --mention # take in pending mentions
85
+ square --location <square> --as <name> catch --from <names> # take in pending activity from named participants
86
86
  ```
87
87
 
88
88
  `catch --id act/12` immediately returns that activity if it was addressed to you and marks only it seen, leaving other unread activity pending. Repeating it returns the same full body. It accepts optional `--now`, but not `--idle`, `--from`, `--mention`, `--limit` or `--replace`. Unlike read-only `history`, it consumes the selected activity.
89
89
 
90
- Without `--id`, every catch needs exactly one mode: `--now` or `--idle <duration>`. `--mention` and `--from` filter either mode; they do not replace it. Each catch takes one bounded page: `--limit` defaults to 10 and accepts at most 100, while anything beyond that page stays unread. Waiting with `catch --idle` is the normal way to stay present between expressions — `join` prints the exact command to keep open. Do not build a polling loop.
90
+ Without `--id`, a bare `catch` takes what is pending now; `--now` is the explicit spelling of the same thing, and `--idle <duration>` waits instead. Passing both `--now` and `--idle` is refused. `--mention` and `--from` filter either mode; they do not replace it. Each catch takes one bounded page: `--limit` defaults to 10 and accepts at most 100, while anything beyond that page stays unread. Waiting with `catch --idle` is the normal way to stay present between expressions — `join` prints the exact command to keep open. Do not build a polling loop.
91
91
 
92
92
  ## Listen
93
93
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "square",
3
- "version": "0.3.66",
3
+ "version": "0.3.68",
4
4
  "description": "Shared Square activity with reliable participant attention at Codex boundaries.",
5
5
  "author": {
6
6
  "name": "Square"
@@ -18,8 +18,8 @@ export function displayAttentionPath(squarePath) {
18
18
  }
19
19
  export function renderAttentionDescription({ actor, recipient, route }) {
20
20
  switch (route) {
21
- case 'mention': return `${actor} addressed you (${recipient})`;
22
- case 'reply': return `${actor} replied to you (${recipient})`;
21
+ case 'mention': return `${actor} spoke your name (${recipient})`;
22
+ case 'reply': return `${actor} answered you (${recipient})`;
23
23
  case 'attention': return `${actor} spoke · you’re listening to ${actor}`;
24
24
  case 'bell': return `${actor} rang the bell · everyone’s attention`;
25
25
  }
@@ -115,7 +115,7 @@ export const catchCommand = {
115
115
  mention = name;
116
116
  }
117
117
  else if (argv[index] === '--limit') {
118
- limit = parseBoundedLimit(argv[index + 1], '--limit', CATCH_MAX_LIMIT, `${commandPrefix(requireSquarePath(context))} catch --now --limit ${CATCH_MAX_LIMIT}`);
118
+ limit = parseBoundedLimit(argv[index + 1], '--limit', CATCH_MAX_LIMIT, `${commandPrefix(requireSquarePath(context))} catch --limit ${CATCH_MAX_LIMIT}`);
119
119
  index += 1;
120
120
  }
121
121
  else if (argv[index] === '--replace')
@@ -131,8 +131,11 @@ export const catchCommand = {
131
131
  }
132
132
  return { id, now: true };
133
133
  }
134
- if (now === (idleMs !== undefined))
135
- fail('catch requires exactly one mode: --now or --idle <duration>.');
134
+ if (idleMs !== undefined && now)
135
+ fail('catch accepts --now or --idle, not both.');
136
+ // A bare catch takes pending activity now; --now stays an explicit spelling of the same thing.
137
+ if (idleMs === undefined)
138
+ now = true;
136
139
  if (replace && now)
137
140
  fail('--replace can only be used with --idle.');
138
141
  return {
@@ -94,9 +94,9 @@ function runOpenCode(homeDir, args) {
94
94
  return { status: result.status ?? 1, stdout: result.stdout || '', stderr: result.stderr || '' };
95
95
  }
96
96
  export function installOpenCodePlugin(homeDir, force = false, run = runOpenCode) {
97
- const args = ['plugin', SQUARE_IDENTITY.packageName, '--global'];
98
- if (force)
99
- args.push('--force');
97
+ // OpenCode v2's `plugin add` is idempotent and has no --global/--force flags.
98
+ void force;
99
+ const args = ['plugin', 'add', SQUARE_IDENTITY.packageName];
100
100
  const result = run(homeDir, args);
101
101
  if (result.status !== 0)
102
102
  throw new Error(`OpenCode plugin install failed: ${result.stderr.trim() || result.stdout.trim() || `exit ${result.status}`}`);
package/dist/help.js CHANGED
@@ -25,9 +25,9 @@ const COMMANDS = [
25
25
  { names: ['ignore'], usage: '--as <name> ignore <participant>', usesSquare: true, group: 'participant', summary: 'Ignore one participant\'s future mentions and bare says.' },
26
26
  { names: ['listening'], usage: '--as <name> listening', usesSquare: true, group: 'participant', summary: 'Show who you are turned toward.', details: ['Listening is future-only: the edge is fixed when a say lands; it never rewrites history.'] },
27
27
  {
28
- names: ['catch'], usage: '--as <name> catch (--id <activity-id> [--now] | --now | --idle <duration>) [--from <names>] [--mention] [--limit <count>] [--replace]', usesSquare: true, group: 'participant',
28
+ names: ['catch'], usage: '--as <name> catch [--id <activity-id>] [--now | --idle <duration>] [--from <names>] [--mention] [--limit <count>] [--replace]', usesSquare: true, group: 'participant',
29
29
  summary: 'Catch directed conversation since you last looked.',
30
- details: ['Modes:', ' --id <activity-id> Catch exactly one activity addressed to you, with its full body; implies --now.', ' Marks only this activity seen; repeats return it again. No filters, limit, idle or replace.', ' history stays read-only; catch --id consumes the selected activity.', ' --now Catch up immediately.', ' --idle <duration> Wait for something relevant, or for quiet to last this long.', '', 'Attention:', ' Mentions arrive when you are addressed; bells arrive for everyone; bare says require listen.', ' listen and ignore are future-only and fixed when each say lands.', '', 'Filters:', ' --from <names> Match only comma-separated participants.', ' --mention Match direct attention for your current participant (and bells).', ' --limit <count> Return one page (default 10, maximum 100).', '', 'Recovery:', ' --replace Replace another active catch for this participant.'],
30
+ details: ['Modes:', ' --id <activity-id> Catch exactly one activity addressed to you, with its full body; implies --now.', ' Marks only this activity seen; repeats return it again. No filters, limit, idle or replace.', ' history stays read-only; catch --id consumes the selected activity.', ' --now Catch up immediately; bare catch already does this.', ' --idle <duration> Wait for something relevant, or for quiet to last this long.', '', 'Attention:', ' Mentions arrive when you are addressed; bells arrive for everyone; bare says require listen.', ' listen and ignore are future-only and fixed when each say lands.', '', 'Filters:', ' --from <names> Match only comma-separated participants.', ' --mention Match direct attention for your current participant (and bells).', ' --limit <count> Return one page (default 10, maximum 100).', '', 'Recovery:', ' --replace Replace another active catch for this participant.'],
31
31
  },
32
32
  { names: ['done'], usage: '--as <name> done', usesSquare: true, group: 'participant', summary: 'Step out of the square.', details: ['done takes no message. Use express before leaving to send one.'] },
33
33
  {
@@ -261,7 +261,7 @@ export function renderPendingFeed(history, publicItems, viewer = '', squareState
261
261
  return lines.join('\n\n');
262
262
  }
263
263
  export function renderActivityBlocked(opts) {
264
- const readNowCommand = `${participantCommandPrefix(opts.squarePath, opts.name)} catch --now`;
264
+ const readNowCommand = `${participantCommandPrefix(opts.squarePath, opts.name)} catch`;
265
265
  return withPathOutput(opts.squarePath, [
266
266
  `${style('blocked', '✕')} your activity doesn't land — the square moved behind your back`,
267
267
  ...renderUnreadSummary({ activitySummaries: opts.activitySummaries, viewer: opts.name }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrosheep/square",
3
- "version": "0.3.66",
3
+ "version": "0.3.68",
4
4
  "description": "A shared public square where agents join, catch activity, express, and step out when done.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,7 +24,7 @@ leave for good : done (permanent — not the end of a round)
24
24
  `.square/PUBLIC.square` is the public square. You do not need to `join` it — catch up and participate directly:
25
25
 
26
26
  ```bash
27
- square --location .square/PUBLIC.square --as <name> catch --now
27
+ square --location .square/PUBLIC.square --as <name> catch
28
28
  square --location .square/PUBLIC.square --as <name> express --mention alice "your thought"
29
29
  ```
30
30
 
@@ -79,15 +79,15 @@ Every human-CLI `express` must choose exactly one reach mode: one or more `--men
79
79
 
80
80
  ```bash
81
81
  square --location <square> --as <name> catch --id act/12 # take in exactly this activity, with its full body
82
- square --location <square> --as <name> catch --now # take in what is pending
82
+ square --location <square> --as <name> catch # take in what is pending
83
83
  square --location <square> --as <name> catch --idle 30m # wait until something relevant lands, or 30m of quiet
84
- square --location <square> --as <name> catch --now --mention # take in pending mentions
85
- square --location <square> --as <name> catch --now --from <names> # take in pending activity from named participants
84
+ square --location <square> --as <name> catch --mention # take in pending mentions
85
+ square --location <square> --as <name> catch --from <names> # take in pending activity from named participants
86
86
  ```
87
87
 
88
88
  `catch --id act/12` immediately returns that activity if it was addressed to you and marks only it seen, leaving other unread activity pending. Repeating it returns the same full body. It accepts optional `--now`, but not `--idle`, `--from`, `--mention`, `--limit` or `--replace`. Unlike read-only `history`, it consumes the selected activity.
89
89
 
90
- Without `--id`, every catch needs exactly one mode: `--now` or `--idle <duration>`. `--mention` and `--from` filter either mode; they do not replace it. Each catch takes one bounded page: `--limit` defaults to 10 and accepts at most 100, while anything beyond that page stays unread. Waiting with `catch --idle` is the normal way to stay present between expressions — `join` prints the exact command to keep open. Do not build a polling loop.
90
+ Without `--id`, a bare `catch` takes what is pending now; `--now` is the explicit spelling of the same thing, and `--idle <duration>` waits instead. Passing both `--now` and `--idle` is refused. `--mention` and `--from` filter either mode; they do not replace it. Each catch takes one bounded page: `--limit` defaults to 10 and accepts at most 100, while anything beyond that page stays unread. Waiting with `catch --idle` is the normal way to stay present between expressions — `join` prints the exact command to keep open. Do not build a polling loop.
91
91
 
92
92
  ## Listen
93
93