backlog.md 0.1.0 → 0.1.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/bin/backlog-darwin-arm64/backlog +0 -0
- package/bin/backlog-darwin-x64/backlog +0 -0
- package/bin/backlog-linux-arm64/backlog +0 -0
- package/{cli → bin/backlog-linux-x64}/backlog +0 -0
- package/bin/backlog-win32-x64/backlog.exe +0 -0
- package/cli.js +62 -0
- package/package.json +57 -46
- package/.backlog/archive/drafts/readme.md +0 -3
- package/.backlog/archive/drafts/task-41 - temporary-test-task.md +0 -13
- package/.backlog/archive/readme.md +0 -6
- package/.backlog/archive/tasks/readme.md +0 -3
- package/.backlog/archive/tasks/task-41 - cli-migrate-terminal-ui-to-bblessed.md +0 -14
- package/.backlog/config.yml +0 -7
- package/.backlog/decisions/readme.md +0 -7
- package/.backlog/docs/readme.md +0 -20
- package/.backlog/drafts/readme.md +0 -3
- package/.backlog/drafts/task-26 - docs-add-board-export-step-to-agent-dod.md +0 -21
- package/.backlog/drafts/task-28 - add-code-of-conduct.md +0 -20
- package/.backlog/drafts/task-30 - create-changelog.md +0 -19
- package/.backlog/milestones/m-0 - project-setup.md +0 -8
- package/.backlog/milestones/m-1 - cli.md +0 -8
- package/.backlog/milestones/m-2 - cli-kanban.md +0 -8
- package/.backlog/milestones/m-3 - gui.md +0 -8
- package/.backlog/milestones/m-4 - gui-kanban.md +0 -8
- package/.backlog/milestones/m-5 - gui-advanced.md +0 -12
- package/.backlog/milestones/readme.md +0 -3
- package/.backlog/readme.md +0 -5
- package/.backlog/tasks/readme.md +0 -37
- package/.backlog/tasks/task-1 - cli-setup-core-project.md +0 -23
- package/.backlog/tasks/task-10 - gui-init-packaging.md +0 -23
- package/.backlog/tasks/task-11 - gui-kanban-board.md +0 -26
- package/.backlog/tasks/task-12 - gui-advanced.md +0 -25
- package/.backlog/tasks/task-13 - cli-add-agent-instruction-prompt.md +0 -53
- package/.backlog/tasks/task-13.1 - cli-agent-instruction-file-selection.md +0 -40
- package/.backlog/tasks/task-14 - gui-introduction-screens.md +0 -21
- package/.backlog/tasks/task-15 - improve-tasks-readme-with-generic-example-and-cli-reference.md +0 -20
- package/.backlog/tasks/task-16 - improve-docs-readme-with-generic-example-and-cli-reference.md +0 -20
- package/.backlog/tasks/task-17 - improve-drafts-readme-with-generic-example-and-cli-reference.md +0 -20
- package/.backlog/tasks/task-18 - improve-decisions-readme-with-generic-example-and-cli-reference.md +0 -20
- package/.backlog/tasks/task-19 - cli-fix-default-task-status-and-remove-draft-from-statuses.md +0 -55
- package/.backlog/tasks/task-2 - cli-core-logic-library.md +0 -28
- package/.backlog/tasks/task-20 - add-agent-guideline-to-mark-tasks-in-progress-on-start.md +0 -32
- package/.backlog/tasks/task-21 - kanban-board-vertical-layout.md +0 -31
- package/.backlog/tasks/task-22 - cli-prevent-double-dash-in-task-filenames.md +0 -24
- package/.backlog/tasks/task-23 - cli-kanban-board-order-tasks-by-id-asc.md +0 -30
- package/.backlog/tasks/task-24 - handle-subtasks-in-the-kanban-view.md +0 -38
- package/.backlog/tasks/task-24.1 - cli-kanban-board-milestone-view.md +0 -19
- package/.backlog/tasks/task-25 - cli-export-kanban-board-to-readme.md +0 -28
- package/.backlog/tasks/task-27 - add-contributing-guidelines.md +0 -27
- package/.backlog/tasks/task-29 - add-github-templates.md +0 -28
- package/.backlog/tasks/task-3 - cli-implement-backlog-init.md +0 -63
- package/.backlog/tasks/task-31 - update-readme-for-open-source.md +0 -26
- package/.backlog/tasks/task-32 - cli-hide-empty-'no-status'-column.md +0 -31
- package/.backlog/tasks/task-33 - cli-export-milestones-board-as-roadmap.md +0 -20
- package/.backlog/tasks/task-34 - split-readme.md-for-users-and-contributors.md +0 -26
- package/.backlog/tasks/task-35 - finalize-package.json-metadata-for-publishing.md +0 -24
- package/.backlog/tasks/task-36 - cli-prompt-for-project-name-in-init.md +0 -24
- package/.backlog/tasks/task-37 - cli-board-view-open-tasks-in-ide.md +0 -19
- package/.backlog/tasks/task-38 - cli-improved-agent-selection-for-init.md +0 -25
- package/.backlog/tasks/task-39 - cli-fix-empty-agent-instruction-files-on-init.md +0 -31
- package/.backlog/tasks/task-4 - cli-task-management-commands.md +0 -28
- package/.backlog/tasks/task-4.1 - cli-task-create.md +0 -27
- package/.backlog/tasks/task-4.10 - use-cli-to-mark-tasks-done.md +0 -51
- package/.backlog/tasks/task-4.11 - docs-add-definition-of-done-to-agent-guidelines.md +0 -23
- package/.backlog/tasks/task-4.12 - cli-handle-task-id-conflicts-across-branches.md +0 -53
- package/.backlog/tasks/task-4.13 - cli-fix-config-command-local-global-logic.md +0 -58
- package/.backlog/tasks/task-4.2 - cli-task-list-view.md +0 -25
- package/.backlog/tasks/task-4.3 - cli-task-edit.md +0 -24
- package/.backlog/tasks/task-4.4 - cli-task-archive-transition.md +0 -27
- package/.backlog/tasks/task-4.5 - cli-init-prompts-for-reporter-name-and-global-local-config.md +0 -28
- package/.backlog/tasks/task-4.6 - cli-add-empty-assignee-array-field-for-new-tasks.md +0 -35
- package/.backlog/tasks/task-4.7 - cli-parse-unquoted-created_date.md +0 -40
- package/.backlog/tasks/task-4.8 - cli-enforce-description-header.md +0 -48
- package/.backlog/tasks/task-4.9 - cli-normalize-task-id-inputs.md +0 -66
- package/.backlog/tasks/task-40 - cli-board-command-defaults-to-view.md +0 -38
- package/.backlog/tasks/task-41 - cli-migrate-terminal-ui-to-bblessed.md +0 -93
- package/.backlog/tasks/task-41.1 - cli-bblessed-init-wizard.md +0 -42
- package/.backlog/tasks/task-41.2 - cli-bblessed-task-view.md +0 -44
- package/.backlog/tasks/task-41.3 - cli-bblessed-doc-view.md +0 -45
- package/.backlog/tasks/task-41.4 - cli-bblessed-board-view.md +0 -49
- package/.backlog/tasks/task-41.5 - cli-audit-remaining-ui-for-bblessed.md +0 -55
- package/.backlog/tasks/task-42 - visual-hierarchy.md +0 -54
- package/.backlog/tasks/task-43 - remove-duplicate-acceptance-criteria-and-style-metadata.md +0 -56
- package/.backlog/tasks/task-44 - checklist-alignment.md +0 -24
- package/.backlog/tasks/task-45 - safe-line-wrapping.md +0 -23
- package/.backlog/tasks/task-46 - split-pane-layout.md +0 -24
- package/.backlog/tasks/task-47 - sticky-header-in-detail-view.md +0 -43
- package/.backlog/tasks/task-48 - footer-hint-line.md +0 -21
- package/.backlog/tasks/task-49 - status-styling.md +0 -53
- package/.backlog/tasks/task-5 - cli-docs-decisions.md +0 -57
- package/.backlog/tasks/task-50 - borders-&-padding.md +0 -22
- package/.backlog/tasks/task-51 - code-path-styling.md +0 -23
- package/.backlog/tasks/task-52 - cli-filter-tasks-list-by-status-or-assignee.md +0 -29
- package/.backlog/tasks/task-6 - cli-packaging.md +0 -65
- package/.backlog/tasks/task-6.1 - cli-local-installation-support-for-bunx-npx.md +0 -49
- package/.backlog/tasks/task-6.2 - cli-github-actions-for-build-&-publish.md +0 -64
- package/.backlog/tasks/task-7 - cli-kanban-view.md +0 -60
- package/.backlog/tasks/task-7.1 - cli-kanban-board-detect-remote-task-status.md +0 -62
- package/.backlog/tasks/task-8 - gui-project-setup.md +0 -21
- package/.backlog/tasks/task-9 - gui-task-crud.md +0 -24
- package/.cursorrules +0 -223
- package/.gitattributes +0 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -25
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -15
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -8
- package/.github/workflows/ci.yml +0 -36
- package/.husky/pre-commit +0 -1
- package/AGENTS.md +0 -65
- package/CLAUDE.md +0 -87
- package/CONTRIBUTING.md +0 -19
- package/DEVELOPMENT.md +0 -37
- package/biome.json +0 -31
- package/bun.lock +0 -152
- package/cli/.cursorrules-xh86jabm.md +0 -82
- package/cli/AGENTS-xh86jabm.md +0 -82
- package/cli/CLAUDE-xh86jabm.md +0 -82
- package/cli/cli.js +0 -19622
- package/cli/index.js +0 -2
- package/docs/npm-publishing.md +0 -69
- package/scripts/build.js +0 -73
- package/src/agent-instructions.ts +0 -54
- package/src/board.ts +0 -263
- package/src/cli.ts +0 -806
- package/src/constants/index.ts +0 -48
- package/src/core/backlog.ts +0 -183
- package/src/core/remote-tasks.ts +0 -168
- package/src/file-system/operations.ts +0 -515
- package/src/git/operations.ts +0 -189
- package/src/guidelines/.cursorrules.md +0 -82
- package/src/guidelines/AGENTS.md +0 -82
- package/src/guidelines/CLAUDE.md +0 -82
- package/src/guidelines/index.ts +0 -7
- package/src/index.ts +0 -30
- package/src/markdown/parser.ts +0 -145
- package/src/markdown/serializer.ts +0 -71
- package/src/test/agent-instructions.test.ts +0 -62
- package/src/test/board.test.ts +0 -291
- package/src/test/build.test.ts +0 -28
- package/src/test/checklist.test.ts +0 -273
- package/src/test/cli.test.ts +0 -1300
- package/src/test/code-path.test.ts +0 -204
- package/src/test/core.test.ts +0 -330
- package/src/test/filesystem.test.ts +0 -435
- package/src/test/git.test.ts +0 -26
- package/src/test/heading.test.ts +0 -102
- package/src/test/line-wrapping.test.ts +0 -252
- package/src/test/local-install.test.ts +0 -34
- package/src/test/markdown.test.ts +0 -526
- package/src/test/parallel-loading.test.ts +0 -160
- package/src/test/parent-id-normalization.test.ts +0 -48
- package/src/test/remote-id-conflict.test.ts +0 -60
- package/src/test/status-icon.test.ts +0 -93
- package/src/types/blessed.d.ts +0 -14
- package/src/types/index.ts +0 -55
- package/src/types/raw.d.ts +0 -4
- package/src/ui/board.ts +0 -322
- package/src/ui/checklist.ts +0 -103
- package/src/ui/code-path.ts +0 -113
- package/src/ui/heading.ts +0 -121
- package/src/ui/loading.ts +0 -216
- package/src/ui/status-icon.ts +0 -53
- package/src/ui/task-list.ts +0 -168
- package/src/ui/task-viewer.ts +0 -640
- package/src/ui/tui.ts +0 -301
- package/tsconfig.json +0 -26
package/src/ui/tui.ts
DELETED
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Lightweight wrapper around the `blessed` terminal UI library.
|
|
3
|
-
*
|
|
4
|
-
* The real dependency may not always be available in the runtime
|
|
5
|
-
* (for example, in CI or when the user purposefully installs Backlog.md
|
|
6
|
-
* without optional TUI support). All exported helper functions therefore
|
|
7
|
-
* attempt to load `blessed` dynamically and will transparently fall back
|
|
8
|
-
* to a simple non-interactive implementation when the import fails or
|
|
9
|
-
* when the current process is not attached to a TTY.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { createRequire } from "node:module";
|
|
13
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
14
|
-
import { stdin as input, stdout as output } from "node:process";
|
|
15
|
-
import { formatHeading } from "./heading.ts";
|
|
16
|
-
|
|
17
|
-
// Utility: load blessed at runtime if present.
|
|
18
|
-
// biome-ignore lint/suspicious/noExplicitAny: blessed is dynamically loaded
|
|
19
|
-
async function loadBlessed(): Promise<any | null> {
|
|
20
|
-
// In Bun, isTTY might be undefined instead of false
|
|
21
|
-
if (output.isTTY === false) return null;
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
// Try using createRequire for better compatibility
|
|
25
|
-
const require = createRequire(import.meta.url);
|
|
26
|
-
const blessed = require("blessed");
|
|
27
|
-
return blessed;
|
|
28
|
-
} catch {
|
|
29
|
-
try {
|
|
30
|
-
// Fallback to dynamic import
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
32
|
-
// @ts-ignore — module may not exist at runtime.
|
|
33
|
-
const mod = await import("blessed");
|
|
34
|
-
return mod.default ?? mod;
|
|
35
|
-
} catch {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Ask the user for a single line of input. Falls back to readline.
|
|
42
|
-
export async function promptText(message: string, defaultValue = ""): Promise<string> {
|
|
43
|
-
const blessed = await loadBlessed();
|
|
44
|
-
if (!blessed) {
|
|
45
|
-
// Fallback to readline prompt
|
|
46
|
-
const { createInterface } = await import("node:readline/promises");
|
|
47
|
-
const rl = createInterface({ input, output });
|
|
48
|
-
const answer = (await rl.question(`${message} `)).trim();
|
|
49
|
-
rl.close();
|
|
50
|
-
return answer || defaultValue;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return new Promise<string>((resolve) => {
|
|
54
|
-
const screen = blessed.screen({ smartCSR: true });
|
|
55
|
-
|
|
56
|
-
const form = blessed.form({
|
|
57
|
-
parent: screen,
|
|
58
|
-
keys: true,
|
|
59
|
-
left: "center",
|
|
60
|
-
top: "center",
|
|
61
|
-
width: "50%",
|
|
62
|
-
height: 5,
|
|
63
|
-
border: "line",
|
|
64
|
-
label: ` ${message} `,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
const textbox = blessed.textbox({
|
|
68
|
-
parent: form,
|
|
69
|
-
name: "input",
|
|
70
|
-
inputOnFocus: true,
|
|
71
|
-
top: 1,
|
|
72
|
-
left: 1,
|
|
73
|
-
width: "95%",
|
|
74
|
-
height: 1,
|
|
75
|
-
padding: { left: 1, right: 1 },
|
|
76
|
-
border: "line",
|
|
77
|
-
value: defaultValue,
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
textbox.focus();
|
|
81
|
-
|
|
82
|
-
form.on("submit", (data: { input: string }) => {
|
|
83
|
-
screen.destroy();
|
|
84
|
-
resolve(data.input.trim());
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
screen.key(["enter"], () => {
|
|
88
|
-
form.submit();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
screen.key(["escape", "C-c"], () => {
|
|
92
|
-
screen.destroy();
|
|
93
|
-
resolve("");
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
screen.render();
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Multi-select check-box style prompt. Returns the values selected by the user.
|
|
101
|
-
export async function multiSelect<T extends string>(message: string, options: T[]): Promise<T[]> {
|
|
102
|
-
const blessed = await loadBlessed();
|
|
103
|
-
if (!blessed) {
|
|
104
|
-
// Non-interactive fallback: nothing selected.
|
|
105
|
-
return [];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return new Promise<T[]>((resolve) => {
|
|
109
|
-
const screen = blessed.screen({ smartCSR: true });
|
|
110
|
-
|
|
111
|
-
const list = blessed.list({
|
|
112
|
-
parent: screen,
|
|
113
|
-
label: ` ${message} `,
|
|
114
|
-
width: "50%",
|
|
115
|
-
height: "60%",
|
|
116
|
-
top: "center",
|
|
117
|
-
left: "center",
|
|
118
|
-
border: "line",
|
|
119
|
-
items: options.map((o) => `[ ] ${o}`),
|
|
120
|
-
keys: true,
|
|
121
|
-
vi: true,
|
|
122
|
-
mouse: true,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const selected = new Set<number>();
|
|
126
|
-
|
|
127
|
-
// biome-ignore lint/suspicious/noExplicitAny: blessed event handler
|
|
128
|
-
list.on("select", (item: any, idx: number) => {
|
|
129
|
-
if (selected.has(idx)) {
|
|
130
|
-
selected.delete(idx);
|
|
131
|
-
} else {
|
|
132
|
-
selected.add(idx);
|
|
133
|
-
}
|
|
134
|
-
// Toggle indicator
|
|
135
|
-
const prefix = selected.has(idx) ? "[x]" : "[ ]";
|
|
136
|
-
list.setItem(idx, `${prefix} ${options[idx]}`);
|
|
137
|
-
screen.render();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
screen.key(["space"], () => {
|
|
141
|
-
// emulate select event for current item
|
|
142
|
-
const idx = list.selected ?? 0;
|
|
143
|
-
list.emit("select", null, idx);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
screen.key(["enter"], () => {
|
|
147
|
-
const values = Array.from(selected).map((i) => options[i]);
|
|
148
|
-
screen.destroy();
|
|
149
|
-
resolve(values);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
screen.key(["escape", "C-c"], () => {
|
|
153
|
-
screen.destroy();
|
|
154
|
-
resolve([]);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
list.focus();
|
|
158
|
-
screen.render();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Display long content in a scrollable viewer.
|
|
163
|
-
export async function scrollableViewer(content: string): Promise<void> {
|
|
164
|
-
const blessed = await loadBlessed();
|
|
165
|
-
if (!blessed) {
|
|
166
|
-
console.log(content);
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return new Promise<void>((resolve) => {
|
|
171
|
-
const screen = blessed.screen({ smartCSR: true });
|
|
172
|
-
|
|
173
|
-
const box = blessed.box({
|
|
174
|
-
parent: screen,
|
|
175
|
-
content,
|
|
176
|
-
scrollable: true,
|
|
177
|
-
alwaysScroll: true,
|
|
178
|
-
keys: true,
|
|
179
|
-
vi: true,
|
|
180
|
-
mouse: true,
|
|
181
|
-
width: "100%",
|
|
182
|
-
height: "100%",
|
|
183
|
-
padding: { left: 1, right: 1 },
|
|
184
|
-
wrap: true,
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
screen.key(["escape", "q", "C-c"], () => {
|
|
188
|
-
screen.destroy();
|
|
189
|
-
resolve();
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
box.focus();
|
|
193
|
-
screen.render();
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Display a list of items and allow selection. Returns selected item or null.
|
|
198
|
-
export async function selectList<T extends { id: string; title: string }>(
|
|
199
|
-
title: string,
|
|
200
|
-
items: T[],
|
|
201
|
-
groupBy?: (item: T) => string,
|
|
202
|
-
): Promise<T | null> {
|
|
203
|
-
const blessed = await loadBlessed();
|
|
204
|
-
if (!blessed || items.length === 0) {
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return new Promise<T | null>((resolve) => {
|
|
209
|
-
const screen = blessed.screen({ smartCSR: true });
|
|
210
|
-
|
|
211
|
-
// Group items if groupBy is provided
|
|
212
|
-
const groups = new Map<string, T[]>();
|
|
213
|
-
if (groupBy) {
|
|
214
|
-
for (const item of items) {
|
|
215
|
-
const group = groupBy(item);
|
|
216
|
-
if (!groups.has(group)) {
|
|
217
|
-
groups.set(group, []);
|
|
218
|
-
}
|
|
219
|
-
const groupItems = groups.get(group);
|
|
220
|
-
if (groupItems) {
|
|
221
|
-
groupItems.push(item);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Build display items
|
|
227
|
-
const displayItems: string[] = [];
|
|
228
|
-
const itemMap = new Map<number, T>();
|
|
229
|
-
let index = 0;
|
|
230
|
-
|
|
231
|
-
if (groupBy) {
|
|
232
|
-
for (const [group, groupItems] of groups) {
|
|
233
|
-
displayItems.push(formatHeading(group || "No Status", 2));
|
|
234
|
-
itemMap.set(index++, null); // Group header
|
|
235
|
-
for (const item of groupItems) {
|
|
236
|
-
displayItems.push(` ${item.id} - ${item.title}`);
|
|
237
|
-
itemMap.set(index++, item);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
} else {
|
|
241
|
-
for (const item of items) {
|
|
242
|
-
displayItems.push(`${item.id} - ${item.title}`);
|
|
243
|
-
itemMap.set(index++, item);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const list = blessed.list({
|
|
248
|
-
parent: screen,
|
|
249
|
-
label: ` ${title} `,
|
|
250
|
-
width: "90%",
|
|
251
|
-
height: "90%",
|
|
252
|
-
top: "center",
|
|
253
|
-
left: "center",
|
|
254
|
-
border: "line",
|
|
255
|
-
items: displayItems,
|
|
256
|
-
keys: true,
|
|
257
|
-
vi: true,
|
|
258
|
-
mouse: true,
|
|
259
|
-
scrollable: true,
|
|
260
|
-
alwaysScroll: true,
|
|
261
|
-
tags: true,
|
|
262
|
-
style: {
|
|
263
|
-
selected: {
|
|
264
|
-
bg: "blue",
|
|
265
|
-
fg: "white",
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
// biome-ignore lint/suspicious/noExplicitAny: blessed event handler
|
|
271
|
-
list.on("select", (item: any, idx: number) => {
|
|
272
|
-
const selected = itemMap.get(idx);
|
|
273
|
-
if (selected) {
|
|
274
|
-
screen.destroy();
|
|
275
|
-
resolve(selected);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Help text
|
|
280
|
-
const help = blessed.box({
|
|
281
|
-
parent: screen,
|
|
282
|
-
bottom: 0,
|
|
283
|
-
left: 0,
|
|
284
|
-
width: "100%",
|
|
285
|
-
height: 1,
|
|
286
|
-
content: " ↑/↓: Navigate | Enter: Select | q/Esc: Cancel ",
|
|
287
|
-
style: {
|
|
288
|
-
fg: "white",
|
|
289
|
-
bg: "blue",
|
|
290
|
-
},
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
screen.key(["escape", "q", "C-c"], () => {
|
|
294
|
-
screen.destroy();
|
|
295
|
-
resolve(null);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
list.focus();
|
|
299
|
-
screen.render();
|
|
300
|
-
});
|
|
301
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
// Environment setup & latest features
|
|
4
|
-
"lib": ["ESNext", "DOM"],
|
|
5
|
-
"target": "ESNext",
|
|
6
|
-
"module": "Preserve",
|
|
7
|
-
"moduleDetection": "force",
|
|
8
|
-
"jsx": "react-jsx",
|
|
9
|
-
"allowJs": true,
|
|
10
|
-
// Bundler mode
|
|
11
|
-
"moduleResolution": "bundler",
|
|
12
|
-
"allowImportingTsExtensions": true,
|
|
13
|
-
"verbatimModuleSyntax": true,
|
|
14
|
-
"noEmit": true,
|
|
15
|
-
// Best practices
|
|
16
|
-
"strict": true,
|
|
17
|
-
"skipLibCheck": true,
|
|
18
|
-
"noFallthroughCasesInSwitch": true,
|
|
19
|
-
"noUncheckedIndexedAccess": true,
|
|
20
|
-
"noImplicitOverride": true,
|
|
21
|
-
// Some stricter flags (disabled by default)
|
|
22
|
-
"noUnusedLocals": false,
|
|
23
|
-
"noUnusedParameters": false,
|
|
24
|
-
"noPropertyAccessFromIndexSignature": false
|
|
25
|
-
}
|
|
26
|
-
}
|