A file-based task manager
1tsk
2===
3
4A fast & simple CLI task manager
5--------------------------------
6
7The motivation for tsk is simple: make managing tasks as fast and easy as
8possible with a focus on small, ephemeral tasks.
9
10Secondary goals include:
11
12- Provide the minimum amount of features necessary to be usable by a team
13- Support local and non-local workspaces
14- Be adaptable to almost any environment, even employer-mandated JIRA use
15- Be flexible, within reason
16
17tsk takes inspiration from git and FORTH and is expected to be used alongside
18the former.
19
20Dependencies
21------------
22
23tsk is written in Rust. To compile from source, a recent Rust toolchain is
24required. As of now, it is developed using Rust 1.81.0.
25
26Additionally, for fuzzy-finding functionality, the fzf command must be installed
27and in the shell's PATH.
28
29 https://github.com/junegunn/fzf
30
31tsk workspaces must be created on filesystems that support symlinking.
32
33Task-level metadata requires Linux's xattr(7) API and a filesystem that supports
34it. Patches that implement this for other operating systems are welcome.
35
36tsk expects to run on POSIX-like systems. Microsoft Windows and other
37non-UNIX-ey operating systems will never be directly supported.
38
39Building
40--------
41
42```sh
43cargo install --path .
44```
45
46Make sure ~/.cargo/bin is in your PATH.
47
48Overview
49--------
50
51A summary of commands and their functionality can be seen with:
52
53 tsk help
54
55tsk uses plain text files for all of its functionality. A workspace is a folder
56that contains a .tsk/ directory created with the `tsk init` command. The
57presence of a .tsk/ folder is searched recursively upwards until a filesystem
58boundary or root is encountered. This means you can nest workspaces and use
59folders to namespace tasks while also using tsk commands at any location within
60a workspace.
61
62New tasks are created with the `tsk push` command. A title is always required,
63but can be modified later. A unique identifier is selected automatically and a
64file with the title and any body contents supplied are stored in the
65.tsk/archive folder. A symlink is then created in the .tsk/tasks folder marking
66the task as "open." The task is then added to the top of the "stack" by having
67its tsk-ID and title added to the .tsk/index file.
68
69The contents of the stack may be printed using the `tsk list` command.
70
71Tasks are marked as "completed" and removed from the index with the `tsk drop`
72command. They will remain in the .tsk/archive folder, but are excluded from
73fuzzy searches by default.
74
75The priority of a task may be manipulated in any of several ways:
76
77`tsk swap` swaps the top two task on the stack
78
79 ┌─────────┐ ┌─────────┐
80 │ tsk-100 │ │ tsk-102 │
81 └─────────┘ └─┬─────▲─┘
82 │ │
83 ┌─────────┐ ┌─▼─────┴─┐
84 │ tsk-102 │ ───────► │ tsk-100 │
85 └─────────┘ └─────────┘
86
87 ┌─────────┐ ┌─────────┐
88 │ tsk-108 │ │ tsk-108 │
89 └─────────┘ └─────────┘
90
91`tsk rot` moves the 3rd task on the stack to the top of the stack and shifts
92the first and second down
93
94 ┌─────────┐ ┌─────────┐
95 │ tsk-100 │ │ tsk-108 ◄─┐
96 └─────────┘ └────┬────┘ │
97 │ │
98 ┌─────────┐ ┌────▼────┐ │
99 │ tsk-102 │ ───────► │ tsk-100 │ │
100 └─────────┘ └────┬────┘ │
101 │ │
102 ┌─────────┐ ┌────▼────┐ │
103 │ tsk-108 │ │ tsk-102 ├─┘
104 └─────────┘ └─────────┘
105
106`tsk tor` moves the task on the top of the stack behind the third, shifting the
107second and third tasks up.
108
109 ┌─────────┐ ┌─────────┐
110 │ tsk-100 │ │ tsk-102 ├─┐
111 └─────────┘ └────▲────┘ │
112 │ │
113 ┌─────────┐ ┌────┴────┐ │
114 │ tsk-102 │ ───────► │ tsk-108 │ │
115 └─────────┘ └────▲────┘ │
116 │ │
117 ┌─────────┐ ┌────┴────┐ │
118 │ tsk-108 │ │ tsk-100 ◄─┘
119 └─────────┘ └─────────┘
120
121`tsk prioritize` will take a selected task and move it to the top of the stack
122from any other position in the stack. It is selected either by ID or using fuzzy
123finding.
124
125`tsk deprioritize` moves a selected task to the bottom of the stack from any
126position.
127
128Roadmap
129-------
130
131- Configurable workspace-scoped prefix tags (tsk- vs example-)
132- Extended Attribute-based Metadata
133- Task Linking
134- IMAP4/SMTP-based synchronization and sharing
135- Export + sync with external task managers
136 - GitLab
137 - GitHub
138 - JIRA
139 - Obsidian
140 - More?
141- tsk -> html export
142- Editor plugins
143 - nvim-telescope
144 - nvim
145 - others?
146- Man page
147
148Format
149------
150
151The tsk text format can be thought of as a derivative of Markdown and scdoc, but
152not quite either. Markdown is a great baseline for rich-text while scdoc
153restricts itself to rich text formatting that can be displayed effectively in a
154terminal. As tsk's primary goal is to be a fast, terminal-centric task manager,
155this property is a *must.*
156
157Additionally, it should be similar enough to Markdown such that it is easy to
158export to other applications, as outlined above in the roadmap.
159
160Meanwhile, both Markdown and scdoc have some limitations and make choices that,
161while appropriate for their domain, are not appropriate for tsk. Some notable
162differences from both:
163
164- There is only one way to do any type of formatting
165- Hard line breaks are real, not imaginary
166- Inline formatting control characters must be surrounded by space, newline, or
167 common punctuation
168
169A core feature of the format is *linking*. That is, references to other tasks
170utilizing wiki-link style links: `[[]]`. The content within the link is mapped
171to the local workspace if the `tsk-` prefix is used, or a mapped non-local
172workspace if another prefix is used. These mappings are specified using a text
173file within the .tsk folder.
174
175A quick overview of the format:
176
177!Bolded! text is surrounded by exclamation marks (!)
178*Italicized* text is surrouneded by single asterists (*)
179_Underlined_ text is surrounded by underscores (_)
180~Strikenthrough~ text is surrounded by tildes (~)
181
182Links like in Markdown, along with the wiki-style links documented above.
183
184Misc
185----
186
187tsk is heavily inspired by git. It mimics its folder structure and some
188commands. The concept of the stack is inspired by FORTH and the observation that
189most of the time, only the top 3 priorities at any given moment matter and tasks
190tend to be created when they are most important. This facilitates small,
191frequent creation of tasks that help both document problems and manage
192fast-paced work environments.
193
194tsk is not intended to be checked into git, however there is not a reason that it
195cannot be. This repository's development is managed using tsk itself.
196
197Git does *not* track extended filesystem attributes. If you wish to avoid constantly
198re-indexing, use something like metastore:
199
200 https://github.com/przemoc/metastore