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 +12 -0
- package/package.json +1 -1
- package/src/cli/task.ts +19 -6
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.
|
|
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
|
-
/**
|
|
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
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
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 {
|