tatr-ql 0.2.0 → 0.3.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tatr-ql",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Task Tracker (Nodejs Version)",
5
5
  "keywords": [
6
6
  "task",
@@ -30,6 +30,8 @@
30
30
  "tatr": "./bin/tatr.js"
31
31
  },
32
32
  "dependencies": {
33
+ "@b9g/termdom": "^0.1.6",
34
+ "vanjs-core": "^1.6.1",
33
35
  "ziko": "^2.0.0-beta.10",
34
36
  "zod": "^4.6.2"
35
37
  },
package/src/cli.js CHANGED
@@ -14,45 +14,21 @@ import { parseTags } from "./task.js";
14
14
  import { matchesQuery } from "./query.js";
15
15
  import packageJson from "../package.json" with { type: "json" };
16
16
 
17
- const {version : VERSION} = packageJson;
17
+ import {TermDOM} from "@b9g/termdom";
18
+ const term = new TermDOM();
19
+ term.attach();
20
+ const {document, window} = term;
21
+ globalThis.document = document
22
+ globalThis.window = window
23
+
24
+
25
+ import {
26
+ StartPager,
27
+ Help,
28
+ ShowTask
29
+ } from "./components/index.js";
18
30
 
19
- const help = () => console.log(`
20
- tatr ${VERSION} — filesystem task tracker
21
-
22
- Usage:
23
- tatr <command> [options]
24
-
25
- Commands:
26
- new <title> Create a task
27
- ls [query] List tasks, optionally filtered by TQL
28
- show <id> Show a task
29
- edit <id> Edit TASK.md in $EDITOR
30
- close <id> Mark a task CLOSED
31
- reopen <id> Mark a task OPEN
32
- rm <id> Delete a task
33
- tags Show tag descriptions
34
- init Create tasks/
35
- help Show this help
36
- version Show the version
37
-
38
- new options:
39
- --priority <n> Task priority (default: 0)
40
- --tags <a,b,c> Comma-separated tags
41
- --suffix <name> HUID suffix
42
- --description <x> Initial description
43
-
44
- ls options:
45
- --all Include CLOSED tasks (default is all; kept for compatibility)
46
- --open Only OPEN tasks
47
- --closed Only CLOSED tasks
48
-
49
- TQL examples:
50
- tatr ls :bug
51
- tatr ls ':bug and not :ui'
52
- tatr ls 'not tagged'
53
- tatr ls ':bug and priority lt 50'
54
- tatr ls '[:bug or :enhancement] and priority ge 10'
55
- `.trim());
31
+ const {version : VERSION} = packageJson;
56
32
 
57
33
  const parseFlags = (args) => {
58
34
  const positionals = [];
@@ -131,11 +107,25 @@ const commandShow = async (id) => {
131
107
 
132
108
  const task = await readTask(id);
133
109
 
134
- console.log(`ID: ${task.id}`);
135
- console.log(`TITLE: ${task.title}`);
136
- console.log(`STATUS: ${task.status}`);
137
- console.log(`PRIORITY: ${task.priority}`);
138
- console.log(`TAGS: ${task.tags.join(", ")}`);
110
+ const {title, status, priority, tags} = task
111
+
112
+ ShowTask({id, title, status, priority, tags}).mount(document.body)
113
+
114
+ // console.log(`ID: ${task.id}`);
115
+ // console.log(`TITLE: ${task.title}`);
116
+ // console.log(`STATUS: ${task.status}`);
117
+ // console.log(`PRIORITY: ${task.priority}`);
118
+ // console.log(`TAGS: ${task.tags.join(", ")}`);
119
+
120
+ // table(
121
+ // tbody(
122
+ // tr(td("ID"), td(task.id)),
123
+ // tr(td("TITLE"), td(task.title)),
124
+ // tr(td("STATUS"), td(task.status)),
125
+ // tr(td("PRIORITY"), td(task.priority)),
126
+ // tr(td("TAGS"), td(task.tags.join(", ")))
127
+ // )
128
+ // ).mount(document.body)
139
129
 
140
130
  if (task.description) console.log(`\n${task.description}`);
141
131
  };
@@ -193,10 +183,11 @@ export const main = async (argv = process.argv.slice(2)) => {
193
183
  const [command = "help", ...args] = argv;
194
184
 
195
185
  switch (command) {
196
- case "help":
186
+ case "help":
197
187
  case "-h":
198
188
  case "--help":
199
- help();
189
+ Help().mount(document.body);
190
+ await StartPager()
200
191
  break;
201
192
  case "version":
202
193
  case "-v":
@@ -0,0 +1,150 @@
1
+ import { tags } from "ziko/dom";
2
+ const {
3
+ div, h1, span, h2, section, pre, table, tbody, tr, td
4
+ } = tags
5
+ export const Help = ({ version = '0.1.0'} = {}) =>
6
+ div(
7
+ pre(`
8
+ -
9
+ `),
10
+ h1(
11
+ `tatr ${version}`,
12
+ span(" — filesystem task tracker")
13
+ ).style({
14
+ color : 'blue'
15
+ }),
16
+
17
+ section(
18
+ h2("Usage"),
19
+
20
+ pre(
21
+ "tatr <command> [options]"
22
+ )
23
+ ),
24
+
25
+ section(
26
+ h2("Commands"),
27
+
28
+ table(
29
+ tbody(
30
+ tr(
31
+ td("new <title>"),
32
+ td("Create a task")
33
+ ),
34
+
35
+ tr(
36
+ td("ls [query]"),
37
+ td("List tasks, optionally filtered by TQL")
38
+ ),
39
+
40
+ tr(
41
+ td("show <id>"),
42
+ td("Show a task")
43
+ ),
44
+
45
+ tr(
46
+ td("edit <id>"),
47
+ td("Edit TASK.md in $EDITOR")
48
+ ),
49
+
50
+ tr(
51
+ td("close <id>"),
52
+ td("Mark a task CLOSED")
53
+ ),
54
+
55
+ tr(
56
+ td("reopen <id>"),
57
+ td("Mark a task OPEN")
58
+ ),
59
+
60
+ tr(
61
+ td("rm <id>"),
62
+ td("Delete a task")
63
+ ),
64
+
65
+ tr(
66
+ td("tags"),
67
+ td("Show tag descriptions")
68
+ ),
69
+
70
+ tr(
71
+ td("init"),
72
+ td("Create tasks/")
73
+ ),
74
+
75
+ tr(
76
+ td("help"),
77
+ td("Show this help")
78
+ ),
79
+
80
+ tr(
81
+ td("version"),
82
+ td("Show the version")
83
+ )
84
+ )
85
+ )
86
+ ),
87
+
88
+ section(
89
+ h2("new options"),
90
+
91
+ table(
92
+ tbody(
93
+ tr(
94
+ td("--priority <n>"),
95
+ td("Task priority (default: 0)")
96
+ ),
97
+
98
+ tr(
99
+ td("--tags <a,b,c>"),
100
+ td("Comma-separated tags")
101
+ ),
102
+
103
+ tr(
104
+ td("--suffix <name>"),
105
+ td("HUID suffix")
106
+ ),
107
+
108
+ tr(
109
+ td("--description <x>"),
110
+ td("Initial description")
111
+ )
112
+ )
113
+ )
114
+ ),
115
+
116
+ section(
117
+ h2("ls options"),
118
+
119
+ table(
120
+ tbody(
121
+ tr(
122
+ td("--all"),
123
+ td("Include CLOSED tasks (default is all; kept for compatibility)")
124
+ ),
125
+
126
+ tr(
127
+ td("--open"),
128
+ td("Only OPEN tasks")
129
+ ),
130
+
131
+ tr(
132
+ td("--closed"),
133
+ td("Only CLOSED tasks")
134
+ )
135
+ )
136
+ )
137
+ ),
138
+
139
+ section(
140
+ h2("TQL examples"),
141
+
142
+ pre(
143
+ `tatr ls :bug
144
+ tatr ls ':bug and not :ui'
145
+ tatr ls 'not tagged'
146
+ tatr ls ':bug and priority lt 50'
147
+ tatr ls '[:bug or :enhancement] and priority ge 10'`
148
+ )
149
+ )
150
+ );
@@ -0,0 +1,11 @@
1
+ import { tags } from "ziko/dom"
2
+ const { table, tbody, tr, td} = tags
3
+ export const ShowTask = ({id, title, status, priority, tags} = {}) => table(
4
+ tbody(
5
+ tr(td("ID"), td(id)),
6
+ tr(td("TITLE"), td(title)),
7
+ tr(td("STATUS"), td(status)),
8
+ tr(td("PRIORITY"), td(priority)),
9
+ tr(td("TAGS"), td(tags.join(", ")))
10
+ )
11
+ )
@@ -0,0 +1,54 @@
1
+ export const StartPager = async () => {
2
+ // Let TermDOM finish its initial layout.
3
+ await new Promise((resolve) =>
4
+ window.requestAnimationFrame(resolve)
5
+ );
6
+
7
+ await new Promise((resolve) =>
8
+ window.requestAnimationFrame(resolve)
9
+ );
10
+
11
+ // Reset the camera after layout has settled.
12
+ window.scrollTo(0, 0);
13
+
14
+ const page = () => Math.max(1, window.innerHeight - 1);
15
+
16
+ const height = () =>
17
+ Math.max(
18
+ 0,
19
+ document.body.scrollHeight - window.innerHeight
20
+ );
21
+
22
+ const bindings = {
23
+ " ": () => window.scrollBy(0, page()),
24
+ f: () => window.scrollBy(0, page()),
25
+ PageDown: () => window.scrollBy(0, page()),
26
+
27
+ b: () => window.scrollBy(0, -page()),
28
+ PageUp: () => window.scrollBy(0, -page()),
29
+
30
+ j: () => window.scrollBy(0, 1),
31
+ ArrowDown: () => window.scrollBy(0, 1),
32
+
33
+ k: () => window.scrollBy(0, -1),
34
+ ArrowUp: () => window.scrollBy(0, -1),
35
+
36
+ g: () => window.scrollTo(0, 0),
37
+
38
+ G: () =>
39
+ window.scrollTo(
40
+ 0,
41
+ height()
42
+ ),
43
+
44
+ q: () =>
45
+ term.window.close()
46
+ };
47
+
48
+ document.addEventListener(
49
+ "keydown",
50
+ (event) => {
51
+ bindings[event.key]?.();
52
+ }
53
+ );
54
+ };
@@ -0,0 +1,3 @@
1
+ export * from './StartPager.js'
2
+ export * from './Help.js'
3
+ export * from './ShowTask.js'
@@ -0,0 +1,6 @@
1
+ # Task 1
2
+
3
+ - STATUS: OPEN
4
+ - PRIORITY: 0
5
+ - TAGS:
6
+