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.
Files changed (165) hide show
  1. package/bin/backlog-darwin-arm64/backlog +0 -0
  2. package/bin/backlog-darwin-x64/backlog +0 -0
  3. package/bin/backlog-linux-arm64/backlog +0 -0
  4. package/{cli → bin/backlog-linux-x64}/backlog +0 -0
  5. package/bin/backlog-win32-x64/backlog.exe +0 -0
  6. package/cli.js +62 -0
  7. package/package.json +57 -46
  8. package/.backlog/archive/drafts/readme.md +0 -3
  9. package/.backlog/archive/drafts/task-41 - temporary-test-task.md +0 -13
  10. package/.backlog/archive/readme.md +0 -6
  11. package/.backlog/archive/tasks/readme.md +0 -3
  12. package/.backlog/archive/tasks/task-41 - cli-migrate-terminal-ui-to-bblessed.md +0 -14
  13. package/.backlog/config.yml +0 -7
  14. package/.backlog/decisions/readme.md +0 -7
  15. package/.backlog/docs/readme.md +0 -20
  16. package/.backlog/drafts/readme.md +0 -3
  17. package/.backlog/drafts/task-26 - docs-add-board-export-step-to-agent-dod.md +0 -21
  18. package/.backlog/drafts/task-28 - add-code-of-conduct.md +0 -20
  19. package/.backlog/drafts/task-30 - create-changelog.md +0 -19
  20. package/.backlog/milestones/m-0 - project-setup.md +0 -8
  21. package/.backlog/milestones/m-1 - cli.md +0 -8
  22. package/.backlog/milestones/m-2 - cli-kanban.md +0 -8
  23. package/.backlog/milestones/m-3 - gui.md +0 -8
  24. package/.backlog/milestones/m-4 - gui-kanban.md +0 -8
  25. package/.backlog/milestones/m-5 - gui-advanced.md +0 -12
  26. package/.backlog/milestones/readme.md +0 -3
  27. package/.backlog/readme.md +0 -5
  28. package/.backlog/tasks/readme.md +0 -37
  29. package/.backlog/tasks/task-1 - cli-setup-core-project.md +0 -23
  30. package/.backlog/tasks/task-10 - gui-init-packaging.md +0 -23
  31. package/.backlog/tasks/task-11 - gui-kanban-board.md +0 -26
  32. package/.backlog/tasks/task-12 - gui-advanced.md +0 -25
  33. package/.backlog/tasks/task-13 - cli-add-agent-instruction-prompt.md +0 -53
  34. package/.backlog/tasks/task-13.1 - cli-agent-instruction-file-selection.md +0 -40
  35. package/.backlog/tasks/task-14 - gui-introduction-screens.md +0 -21
  36. package/.backlog/tasks/task-15 - improve-tasks-readme-with-generic-example-and-cli-reference.md +0 -20
  37. package/.backlog/tasks/task-16 - improve-docs-readme-with-generic-example-and-cli-reference.md +0 -20
  38. package/.backlog/tasks/task-17 - improve-drafts-readme-with-generic-example-and-cli-reference.md +0 -20
  39. package/.backlog/tasks/task-18 - improve-decisions-readme-with-generic-example-and-cli-reference.md +0 -20
  40. package/.backlog/tasks/task-19 - cli-fix-default-task-status-and-remove-draft-from-statuses.md +0 -55
  41. package/.backlog/tasks/task-2 - cli-core-logic-library.md +0 -28
  42. package/.backlog/tasks/task-20 - add-agent-guideline-to-mark-tasks-in-progress-on-start.md +0 -32
  43. package/.backlog/tasks/task-21 - kanban-board-vertical-layout.md +0 -31
  44. package/.backlog/tasks/task-22 - cli-prevent-double-dash-in-task-filenames.md +0 -24
  45. package/.backlog/tasks/task-23 - cli-kanban-board-order-tasks-by-id-asc.md +0 -30
  46. package/.backlog/tasks/task-24 - handle-subtasks-in-the-kanban-view.md +0 -38
  47. package/.backlog/tasks/task-24.1 - cli-kanban-board-milestone-view.md +0 -19
  48. package/.backlog/tasks/task-25 - cli-export-kanban-board-to-readme.md +0 -28
  49. package/.backlog/tasks/task-27 - add-contributing-guidelines.md +0 -27
  50. package/.backlog/tasks/task-29 - add-github-templates.md +0 -28
  51. package/.backlog/tasks/task-3 - cli-implement-backlog-init.md +0 -63
  52. package/.backlog/tasks/task-31 - update-readme-for-open-source.md +0 -26
  53. package/.backlog/tasks/task-32 - cli-hide-empty-'no-status'-column.md +0 -31
  54. package/.backlog/tasks/task-33 - cli-export-milestones-board-as-roadmap.md +0 -20
  55. package/.backlog/tasks/task-34 - split-readme.md-for-users-and-contributors.md +0 -26
  56. package/.backlog/tasks/task-35 - finalize-package.json-metadata-for-publishing.md +0 -24
  57. package/.backlog/tasks/task-36 - cli-prompt-for-project-name-in-init.md +0 -24
  58. package/.backlog/tasks/task-37 - cli-board-view-open-tasks-in-ide.md +0 -19
  59. package/.backlog/tasks/task-38 - cli-improved-agent-selection-for-init.md +0 -25
  60. package/.backlog/tasks/task-39 - cli-fix-empty-agent-instruction-files-on-init.md +0 -31
  61. package/.backlog/tasks/task-4 - cli-task-management-commands.md +0 -28
  62. package/.backlog/tasks/task-4.1 - cli-task-create.md +0 -27
  63. package/.backlog/tasks/task-4.10 - use-cli-to-mark-tasks-done.md +0 -51
  64. package/.backlog/tasks/task-4.11 - docs-add-definition-of-done-to-agent-guidelines.md +0 -23
  65. package/.backlog/tasks/task-4.12 - cli-handle-task-id-conflicts-across-branches.md +0 -53
  66. package/.backlog/tasks/task-4.13 - cli-fix-config-command-local-global-logic.md +0 -58
  67. package/.backlog/tasks/task-4.2 - cli-task-list-view.md +0 -25
  68. package/.backlog/tasks/task-4.3 - cli-task-edit.md +0 -24
  69. package/.backlog/tasks/task-4.4 - cli-task-archive-transition.md +0 -27
  70. package/.backlog/tasks/task-4.5 - cli-init-prompts-for-reporter-name-and-global-local-config.md +0 -28
  71. package/.backlog/tasks/task-4.6 - cli-add-empty-assignee-array-field-for-new-tasks.md +0 -35
  72. package/.backlog/tasks/task-4.7 - cli-parse-unquoted-created_date.md +0 -40
  73. package/.backlog/tasks/task-4.8 - cli-enforce-description-header.md +0 -48
  74. package/.backlog/tasks/task-4.9 - cli-normalize-task-id-inputs.md +0 -66
  75. package/.backlog/tasks/task-40 - cli-board-command-defaults-to-view.md +0 -38
  76. package/.backlog/tasks/task-41 - cli-migrate-terminal-ui-to-bblessed.md +0 -93
  77. package/.backlog/tasks/task-41.1 - cli-bblessed-init-wizard.md +0 -42
  78. package/.backlog/tasks/task-41.2 - cli-bblessed-task-view.md +0 -44
  79. package/.backlog/tasks/task-41.3 - cli-bblessed-doc-view.md +0 -45
  80. package/.backlog/tasks/task-41.4 - cli-bblessed-board-view.md +0 -49
  81. package/.backlog/tasks/task-41.5 - cli-audit-remaining-ui-for-bblessed.md +0 -55
  82. package/.backlog/tasks/task-42 - visual-hierarchy.md +0 -54
  83. package/.backlog/tasks/task-43 - remove-duplicate-acceptance-criteria-and-style-metadata.md +0 -56
  84. package/.backlog/tasks/task-44 - checklist-alignment.md +0 -24
  85. package/.backlog/tasks/task-45 - safe-line-wrapping.md +0 -23
  86. package/.backlog/tasks/task-46 - split-pane-layout.md +0 -24
  87. package/.backlog/tasks/task-47 - sticky-header-in-detail-view.md +0 -43
  88. package/.backlog/tasks/task-48 - footer-hint-line.md +0 -21
  89. package/.backlog/tasks/task-49 - status-styling.md +0 -53
  90. package/.backlog/tasks/task-5 - cli-docs-decisions.md +0 -57
  91. package/.backlog/tasks/task-50 - borders-&-padding.md +0 -22
  92. package/.backlog/tasks/task-51 - code-path-styling.md +0 -23
  93. package/.backlog/tasks/task-52 - cli-filter-tasks-list-by-status-or-assignee.md +0 -29
  94. package/.backlog/tasks/task-6 - cli-packaging.md +0 -65
  95. package/.backlog/tasks/task-6.1 - cli-local-installation-support-for-bunx-npx.md +0 -49
  96. package/.backlog/tasks/task-6.2 - cli-github-actions-for-build-&-publish.md +0 -64
  97. package/.backlog/tasks/task-7 - cli-kanban-view.md +0 -60
  98. package/.backlog/tasks/task-7.1 - cli-kanban-board-detect-remote-task-status.md +0 -62
  99. package/.backlog/tasks/task-8 - gui-project-setup.md +0 -21
  100. package/.backlog/tasks/task-9 - gui-task-crud.md +0 -24
  101. package/.cursorrules +0 -223
  102. package/.gitattributes +0 -2
  103. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -25
  104. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -15
  105. package/.github/PULL_REQUEST_TEMPLATE.md +0 -8
  106. package/.github/workflows/ci.yml +0 -36
  107. package/.husky/pre-commit +0 -1
  108. package/AGENTS.md +0 -65
  109. package/CLAUDE.md +0 -87
  110. package/CONTRIBUTING.md +0 -19
  111. package/DEVELOPMENT.md +0 -37
  112. package/biome.json +0 -31
  113. package/bun.lock +0 -152
  114. package/cli/.cursorrules-xh86jabm.md +0 -82
  115. package/cli/AGENTS-xh86jabm.md +0 -82
  116. package/cli/CLAUDE-xh86jabm.md +0 -82
  117. package/cli/cli.js +0 -19622
  118. package/cli/index.js +0 -2
  119. package/docs/npm-publishing.md +0 -69
  120. package/scripts/build.js +0 -73
  121. package/src/agent-instructions.ts +0 -54
  122. package/src/board.ts +0 -263
  123. package/src/cli.ts +0 -806
  124. package/src/constants/index.ts +0 -48
  125. package/src/core/backlog.ts +0 -183
  126. package/src/core/remote-tasks.ts +0 -168
  127. package/src/file-system/operations.ts +0 -515
  128. package/src/git/operations.ts +0 -189
  129. package/src/guidelines/.cursorrules.md +0 -82
  130. package/src/guidelines/AGENTS.md +0 -82
  131. package/src/guidelines/CLAUDE.md +0 -82
  132. package/src/guidelines/index.ts +0 -7
  133. package/src/index.ts +0 -30
  134. package/src/markdown/parser.ts +0 -145
  135. package/src/markdown/serializer.ts +0 -71
  136. package/src/test/agent-instructions.test.ts +0 -62
  137. package/src/test/board.test.ts +0 -291
  138. package/src/test/build.test.ts +0 -28
  139. package/src/test/checklist.test.ts +0 -273
  140. package/src/test/cli.test.ts +0 -1300
  141. package/src/test/code-path.test.ts +0 -204
  142. package/src/test/core.test.ts +0 -330
  143. package/src/test/filesystem.test.ts +0 -435
  144. package/src/test/git.test.ts +0 -26
  145. package/src/test/heading.test.ts +0 -102
  146. package/src/test/line-wrapping.test.ts +0 -252
  147. package/src/test/local-install.test.ts +0 -34
  148. package/src/test/markdown.test.ts +0 -526
  149. package/src/test/parallel-loading.test.ts +0 -160
  150. package/src/test/parent-id-normalization.test.ts +0 -48
  151. package/src/test/remote-id-conflict.test.ts +0 -60
  152. package/src/test/status-icon.test.ts +0 -93
  153. package/src/types/blessed.d.ts +0 -14
  154. package/src/types/index.ts +0 -55
  155. package/src/types/raw.d.ts +0 -4
  156. package/src/ui/board.ts +0 -322
  157. package/src/ui/checklist.ts +0 -103
  158. package/src/ui/code-path.ts +0 -113
  159. package/src/ui/heading.ts +0 -121
  160. package/src/ui/loading.ts +0 -216
  161. package/src/ui/status-icon.ts +0 -53
  162. package/src/ui/task-list.ts +0 -168
  163. package/src/ui/task-viewer.ts +0 -640
  164. package/src/ui/tui.ts +0 -301
  165. 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
- }