tuiboard 0.13.2 → 0.13.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.13.3] - 2026-09-19
11
+
12
+ ### Fixed
13
+ - **`tuiboard task --board` refuses ambiguous boards** (#63) instead of taking
14
+ the first configured board whose path ends with the argument. Two boards can
15
+ easily end the same way (`Work/Personal.md`, `Home/Personal.md`), and this is
16
+ the headless path used by cron jobs and the bar widget, so the wrong board
17
+ could be mutated silently. It now lists the candidates and writes nothing,
18
+ the way an ambiguous `--match` already did. Thanks to the commenter on
19
+ Reddit who spotted it.
20
+
10
21
  ## [0.13.2] - 2026-09-17
11
22
 
12
23
  ### Fixed
@@ -501,6 +512,7 @@ First public release on npm. This entry captures the full feature set at launch.
501
512
 
502
513
  Built with [OpenTUI](https://opentui.com) + SolidJS on Bun.
503
514
 
515
+ [0.13.3]: https://github.com/NazzarenoGiannelli/tuiboard/releases/tag/v0.13.3
504
516
  [0.13.2]: https://github.com/NazzarenoGiannelli/tuiboard/releases/tag/v0.13.2
505
517
  [0.13.1]: https://github.com/NazzarenoGiannelli/tuiboard/releases/tag/v0.13.1
506
518
  [0.13.0]: https://github.com/NazzarenoGiannelli/tuiboard/releases/tag/v0.13.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tuiboard",
3
- "version": "0.13.2",
3
+ "version": "0.13.3",
4
4
  "description": "Terminal kanban for markdown task boards, with optional Today/Tomorrow planner, 24h agenda + calendar overlay, and a live view of your coding-agent sessions (Claude Code, Codex, OpenCode, Pi). Use only the panels you want.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/cli/task.ts CHANGED
@@ -71,18 +71,31 @@ function isoShift(days: number): string {
71
71
  return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
72
72
  }
73
73
 
74
- /** Resolve a board by configured name, then by path suffix. */
74
+ /**
75
+ * Resolve a board by configured name, then by path suffix — and refuse to
76
+ * guess when more than one matches, the way findTask does for task titles.
77
+ * Two boards can easily end the same way (`Work/Personal.md`,
78
+ * `Home/Personal.md`), and this is the headless path: a cron job or the bar
79
+ * widget mutating the wrong board would go unnoticed.
80
+ */
75
81
  function resolveBoard(needle: string) {
76
82
  const cfg = loadConfig();
77
83
  const lower = needle.toLowerCase();
78
- const hit =
79
- cfg.boards.find((b) => (b.name ?? "").toLowerCase() === lower) ??
80
- cfg.boards.find((b) => b.path.toLowerCase().endsWith(lower));
81
- if (!hit) {
84
+ const byName = cfg.boards.filter((b) => (b.name ?? "").toLowerCase() === lower);
85
+ const hits = byName.length > 0
86
+ ? byName
87
+ : cfg.boards.filter((b) => b.path.toLowerCase().endsWith(lower));
88
+ if (hits.length === 0) {
82
89
  const names = cfg.boards.map((b) => b.name ?? b.path).join(", ");
83
90
  throw new Error(`board "${needle}" not found. Configured: ${names || "(none)"}`);
84
91
  }
85
- return hit;
92
+ if (hits.length > 1) {
93
+ const candidates = hits.map((b) => (b.name ? `${b.name} (${b.path})` : b.path)).join(", ");
94
+ throw new Error(
95
+ `board "${needle}" matches ${hits.length} boards: ${candidates}; be more specific`,
96
+ );
97
+ }
98
+ return hits[0]!;
86
99
  }
87
100
 
88
101
  function findColumn(board: Board, name: string): Column {