flowcollab 0.2.1 → 0.2.3

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/bin/standup.mjs +10 -5
  2. package/package.json +2 -2
package/bin/standup.mjs CHANGED
@@ -24,6 +24,11 @@ function sanitizeText(s, maxLen = 200) {
24
24
 
25
25
  function pad(s, n) { return String(s).padEnd(n).slice(0, n); }
26
26
 
27
+ const TERM_COLS = process.stdout.columns || 120;
28
+ // Reserve: 2 indent + 7 ref + 2 gap + 14 actor + 2 gap = 27 fixed chars
29
+ const TITLE_W = Math.max(20, TERM_COLS - 29);
30
+ const SHORT_TITLE_W = Math.max(20, TERM_COLS - 37); // agents have longer prefix
31
+
27
32
  async function main() {
28
33
  const sinceHours = Math.max(1, parseInt(arg('since') || '24'));
29
34
  const since = new Date(Date.now() - sinceHours * 3600000);
@@ -67,7 +72,7 @@ async function main() {
67
72
  for (const ev of doneItems) {
68
73
  const t = taskById.get(ev.task_id);
69
74
  const ref = t ? `#${t.issue_num ?? t.id.slice(0, 6)}` : `#${ev.task_id.slice(0, 6)}`;
70
- out.push(` ${ref} ${pad(ev.actor_id || '?', 14)} ${sanitizeText(t?.title ?? '(unknown)', 65)}`);
75
+ out.push(` ${ref} ${pad(ev.actor_id || '?', 14)} ${sanitizeText(t?.title ?? '(unknown)', TITLE_W)}`);
71
76
  }
72
77
  } else {
73
78
  out.push(' (nothing closed)');
@@ -77,7 +82,7 @@ async function main() {
77
82
  out.push(`[in progress — ${inProgress.length}]`);
78
83
  if (inProgress.length) {
79
84
  for (const t of inProgress) {
80
- out.push(` #${t.issue_num ?? t.id.slice(0, 6)} ${pad(t.assignee_id || 'unassigned', 14)} ${sanitizeText(t.title, 60)}`);
85
+ out.push(` #${t.issue_num ?? t.id.slice(0, 6)} ${pad(t.assignee_id || 'unassigned', 14)} ${sanitizeText(t.title, TITLE_W)}`);
81
86
  }
82
87
  } else {
83
88
  out.push(' (nothing in progress)');
@@ -87,7 +92,7 @@ async function main() {
87
92
  if (inReview.length) {
88
93
  out.push(`[in review — ${inReview.length}]`);
89
94
  for (const t of inReview) {
90
- out.push(` #${t.issue_num ?? t.id.slice(0, 6)} ${pad(t.assignee_id || 'unassigned', 14)} ${sanitizeText(t.title, 60)}`);
95
+ out.push(` #${t.issue_num ?? t.id.slice(0, 6)} ${pad(t.assignee_id || 'unassigned', 14)} ${sanitizeText(t.title, TITLE_W)}`);
91
96
  }
92
97
  out.push('');
93
98
  }
@@ -96,7 +101,7 @@ async function main() {
96
101
  out.push(`[active agents — ${agents.length} online]`);
97
102
  for (const a of agents) {
98
103
  const t = a.task_id ? taskById.get(a.task_id) : null;
99
- const taskPart = t ? `on #${t.issue_num ?? t.id.slice(0, 6)} "${sanitizeText(t.title, 40)}"` : 'idle';
104
+ const taskPart = t ? `on #${t.issue_num ?? t.id.slice(0, 6)} "${sanitizeText(t.title, SHORT_TITLE_W)}"` : 'idle';
100
105
  const flag = a.actor_id === myId ? ' ← you' : '';
101
106
  out.push(` ${pad(a.actor_id, 16)} ${taskPart}${flag}`);
102
107
  }
@@ -106,7 +111,7 @@ async function main() {
106
111
  out.push(`[decisions pending — ${decisions.length}]`);
107
112
  if (decisions.length) {
108
113
  for (const d of decisions.slice(0, 5)) {
109
- out.push(` #${d.id.slice(0, 6)} [${d.confidence}] ${sanitizeText(d.proposal_title, 65)}`);
114
+ out.push(` #${d.id.slice(0, 6)} [${d.confidence}] ${sanitizeText(d.proposal_title, TITLE_W)}`);
110
115
  }
111
116
  if (decisions.length > 5) out.push(` … and ${decisions.length - 5} more`);
112
117
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowcollab",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Multi-Claude coordination layer — shared task board + CLI for teams running Claude Code",
5
5
  "type": "module",
6
6
  "files": [
@@ -56,7 +56,7 @@
56
56
  "zod": "^3.24.1"
57
57
  },
58
58
  "engines": {
59
- "node": ">=18"
59
+ "node": ">=22"
60
60
  },
61
61
  "license": "UNLICENSED"
62
62
  }