flowcollab 0.3.0 → 0.3.2

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/bin/edit.mjs CHANGED
@@ -38,7 +38,8 @@ async function main() {
38
38
  const label = updated.title || id.slice(0, 8);
39
39
  process.stdout.write(`Updated: ${label}\n`);
40
40
  for (const [k, v] of Object.entries(changes)) {
41
- process.stdout.write(` ${k}: ${v === null ? '(cleared)' : v}\n`);
41
+ const display = v === null || (Array.isArray(v) && v.length === 0) ? '(cleared)' : v;
42
+ process.stdout.write(` ${k}: ${display}\n`);
42
43
  }
43
44
  }
44
45
 
package/bin/pull.mjs CHANGED
@@ -414,7 +414,7 @@ async function main() {
414
414
  let gc = {};
415
415
  try { gc = JSON.parse(readFileSync(configPath, 'utf8')); } catch {}
416
416
  gc.projectId = defaultProject.id;
417
- writeFileSync(configPath, JSON.stringify(gc, null, 2));
417
+ writeFileSync(configPath, JSON.stringify(gc, null, 2), { encoding: 'utf8', mode: 0o600 });
418
418
  process.stdout.write(` project_id → ~/.flow/config.json (project: ${defaultProject.slug})\n`);
419
419
  }
420
420
  } catch { /* non-fatal */ }
package/bin/scan.mjs CHANGED
@@ -204,20 +204,22 @@ async function main() {
204
204
 
205
205
  if (all || doIssues) {
206
206
  process.stdout.write(' [issues] fetching GitHub Issues vs Flow tasks...\n');
207
- let s;
208
- try { s = await scanIssues(repo); } catch (e) { process.stdout.write(` [issues] Error: ${e.message}\n`); s = []; }
207
+ let s, issueErr = false;
208
+ try { s = await scanIssues(repo); } catch (e) { process.stdout.write(` [issues] Error: ${e.message}\n`); issueErr = true; s = []; }
209
209
  if (doIssues) { printSection('Untracked GitHub Issues', s || []); return; }
210
210
  if (s === null) process.stdout.write('\n[issues] Skipped — FLOW_GITHUB_REPO not set.\n');
211
+ else if (issueErr) process.stdout.write('\n[issues] Scan failed — check FLOW_GITHUB_REPO and token.\n');
211
212
  else if (all && s.length) printSection('Untracked GitHub Issues', s);
212
213
  else if (all) process.stdout.write('\n[issues] All open Issues are tracked in Flow.\n');
213
214
  }
214
215
 
215
216
  if (all || doPRs) {
216
217
  process.stdout.write(' [prs] fetching open PRs vs Flow tasks...\n');
217
- let s;
218
- try { s = await scanPRs(repo); } catch (e) { process.stdout.write(` [prs] Error: ${e.message}\n`); s = []; }
218
+ let s, prErr = false;
219
+ try { s = await scanPRs(repo); } catch (e) { process.stdout.write(` [prs] Error: ${e.message}\n`); prErr = true; s = []; }
219
220
  if (doPRs) { printSection('Unlinked open PRs', s || []); return; }
220
221
  if (s === null) process.stdout.write('\n[prs] Skipped — FLOW_GITHUB_REPO not set.\n');
222
+ else if (prErr) process.stdout.write('\n[prs] Scan failed — check FLOW_GITHUB_REPO and token.\n');
221
223
  else if (all && s.length) printSection('Unlinked open PRs', s);
222
224
  else if (all) process.stdout.write('\n[prs] All open PRs are linked to Flow tasks.\n');
223
225
  }
package/bin/standup.mjs CHANGED
@@ -30,7 +30,7 @@ const TITLE_W = Math.max(20, TERM_COLS - 29);
30
30
  const SHORT_TITLE_W = Math.max(20, TERM_COLS - 37); // agents have longer prefix
31
31
 
32
32
  async function main() {
33
- const sinceHours = Math.max(1, parseInt(arg('since') || '24'));
33
+ const sinceHours = Math.max(1, parseInt(arg('since') || '24') || 24);
34
34
  const since = new Date(Date.now() - sinceHours * 3600000);
35
35
  const showVelocity = process.argv.includes('--velocity');
36
36
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowcollab",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Multi-Claude coordination layer — shared task board + CLI for teams running Claude Code",
5
5
  "type": "module",
6
6
  "files": [