ad-si / tasklite Goto Github PK
View Code? Open in Web Editor NEWThe CLI task manager for power users
Home Page: https://tasklite.org
License: GNU Affero General Public License v3.0
The CLI task manager for power users
Home Page: https://tasklite.org
License: GNU Affero General Public License v3.0
Similar to Taskwarrior's hooks: https://taskwarrior.org/docs/hooks_guide.html
~/.tasklite
folder with git on launch (pull from remote)Support for hooks to be stored in the database in a scripting language which are then executed by TaskLite.
They could e.g. be written in Lua (https://hackage.haskell.org/package/hslua) or Nix (https://github.com/haskell-nix/hnix). (Dhall is unfortunately not ergonomic enough).
I always disliked the system for git hooks, in which they are not part of the project and everybody had to install them themselves.
It could then even be extended with custom functions.
This could lead to a collection of useful hook scripts that anyone can use, since they are executed by TaskLite and have no additional requirements for the system setup like installed interpreters and so on.
Use Nix as the basis for a TaskLite plugin manager
Tracking issue for @robwhitaker's request in #2 (comment)
Hi, how can I resolve this?
‘randomIO’ is not a (visible) method of class ‘R.Random’
|
98 | randomIO = getULID
| ^^^^^^^^
Thanks!
I built tasklite from source, following the instructions here:
https://tasklite.org/installation/cli.html
It says to test the installation run tasklite help
. I did so, and it failed:
jdietrch@saturn:~$ tasklite help
tasklite: /home/jdietrch/.config/tasklite: copyFile:atomicCopyFileContents:withReplacementFile:openBinaryTempFile: d
oes not exist (No such file or directory)
jdietrch@saturn:~$
Yes, a quick mkdir .config/tasklite/
solved that problem, but perhaps tasklite could create that directory itself if it doesn't exist?
This happens on the HEAD
of master
, and on the latest release Version 0.3.0.0+ed428cf2
.
tasklite --help
{{header}}
Usage: tasklite ([Basic Commands] | [Shortcuts to Add a Task] | [List Commands]
| [Visualizations] | [I/O Commands] | [Advanced Commands] |
[Unset Commands] | [Utils])
{{examples}}
Available options:
-h,--help Show this help text
{{basic_sec}}
add Add a new task
log Log an already completed task
...
vs
tasklite help
TaskLite 0.3.0.0
Task-list manager powered by Haskell and SQLite
Usage: tasklite ([Basic Commands] | [Shortcuts to Add a Task] | [List Commands]
| [Visualizations] | [I/O Commands] | [Advanced Commands] |
[Unset Commands] | [Utils])
Add an alias: `alias tl tasklite`
Add a task with a tag: `tl add Buy milk +groceries`
… or with the shortcut: `tl buy milk +groceries`
List most important tasks: `tl` (same as `tl ready`)
Complete it: `tl do <id>`
Available options:
-h,--help Show this help text
Basic Commands:
add Add a new task
log Log an already completed task
...
I'd find displaying the age of the task in this column much more useful than task creation date e.g. "2D". Maybe an option to switch this between the current opened/created date and task age?
I'm not quite sure if this is a bug or something that needs to be fixed, but I recently piped output of tasklite to a file with tasklite >> file
The file still contains the color symbols though:
�[0;92;1;4mId �[0m �[0;95;1;4mPrio�[0m �[0;30;1;4mOpened UTC�[0m �[0;97;1;4mBody �[0m
�[0;92mgq7�[0m �[0;95m 0 �[0m �[0;30m2020-11-20�[0m �[0;97mtest 2�[0m
�[0;92m15h�[0m �[0;95m 0 �[0m �[0;30m2020-11-20�[0m �[0;97mtest 1�[0m
I was able to fix this with a sed command I got, so if this is intended behaviour we can just close the issue (I'm also not sure how this can be fixed from the haskell side 😢 )
Hey there,
I just stumbled upon your project and wish to give it a try, but since the latest GH action builds are old, its artefacts are gone.
Would you mind trigger a fresh build ?
Also, I was wondering what's the roadmap for the near future, if any ? The FAQ mentions a Roadmap page but browsing it returns a 404.
Thanks in advance, and thank you anyway for your time and dedication into this nice project !
The default configuration contains the section
hooks:
#| Is per default the "hooks" directory in the `dataDir`
# directory: /custom/path/hooks
launch:
pre:
- interpreter: python3
body: print('Python test')
which will lead an “unconfigured” tasklite to always print Python test
when you call it.
https://tasklite.org/concepts.html describes the Recurring
secondary state, associated with the recurrence_duration
field:
Task which needs to be done every day, week, etc. I.e. missed
completions must be caught up immediately. (e.g. paying rent)
How can I set up a monthly paying rent task?
The repeat
command isn't suitable for at least two reasons:
1.) it sets repetition_duration
, and not recurrence_duration
2.) it takes a certain number of days, and a monthly interval cannot be represented that way
Hey @ad-si
The query command gives user the ability write a part of the sql query, everything after select * from tasks where ...
What would happen if I do tl query '; drop database;'
?
Any interest in packaging TaskLite for the AUR? 🙂
Unless I'm misunderstood, this data isn't exported when doing tasklite ndjson
.
As a consequence, the standard view is impossible to reproduce using external tools, as advised e.g. here.
TaskLite/tasklite-core/source/Lib.hs
Lines 503 to 520 in a721fdd
vs
TaskLite/tasklite-core/source/Lib.hs
Lines 444 to 453 in a721fdd
which uses
TaskLite/tasklite-core/source/Lib.hs
Lines 429 to 441 in a721fdd
You can bulk change the due dates on tasks which is great. Would be also nice to be able to bulk complete tasks e.g. tl do 4kd 32d tkd
Without having to edit SQLite directly Is there a way to edit a task? So far I have messed up the text of a task and wanted to retag a task
Hi, I've been using taskwarrior for a long time, but I'm tired of their stagnation, so your project looks awesome.
I was wondering if you will support user defined attributes, for example to define the Kanban state of backlog, todo and doing.
I know you can achieve that same thing with tags, but I think it's a nice way to represent in the cli reports. Furthermore I've got like 7 different UDAs that I wouldn't like to loose
Hi. If I want to simulate subtasks like I do with taskwarrior
, how can I do this with TaskLite?
e.g. with taskwarrior
I would:
task add Some parent task
task add Some child task
task <parent id> modify depends:<subtask id>
Ideally if I could do this in 2 commands that would be even better.
I experimented with rec(urrence)/rep(etition) a little bit, trying to figure out how they interact.
What I noted so far:
done
, according to this code:TaskLite/tasklite-core/source/Lib.hs
Lines 580 to 587 in a721fdd
No other code seems look at the rec/rep fields (apart from the info and unrecur stuff).
The code also suggests that if both fields are set, rec won’t be looked at because rep takes priority.
Is that the idea? What is the intended workflow/semantics here?
The manual describes rec as:
Recurring - Task which needs to be done every day, week, etc. I.e. missed completions must be caught up immediately. (e.g. paying rent) The number of tasks which will be created in advance can be set via a config.
But I don’t see any code which would create a number of tasks in advance, maybe I’m missing a detail here. There is only a createNextRecurrence
function, but none that would create multiple tasks. Also, there is no config option.
Comparing to taskwarrior (which I’m trying to migrate from), they do it a little bit differently. They don’t support repetition, rather recurrence with a config of how many tasks should be generated in advance; they run their task generation logic each time you run the command, regardless of whether that command changes something else. It’s certainly convenient, but not super easy to reason about (since random tasks could change at random times).
I don’t expect tl to be the same as tw, or even support recurrence feature that tw supports.
Probably more of a feature request, but I had quite a bit of recurring tasks in my taskwarrior db, yet after the import (via tasklite import task.json
as described in the manual), they are all imported like single (long overdue) tasks.
I guess it would require a special knowledge of taskwarrior’s data model to have a best-effort mapping of the supported recurrence features.
Hey, I really like the spirit of this project, a taskwarrior backed by SQLite and a reusable Haskell library. Thanks for working on this! I only read through the documentation so far, checking for taskwarrior features that I need, and have a question: In taskwarrior you can do something like due:2d
which translates to 2 days from now. I find this very useful because I don't need to think about dates as much then. Is this already supported by tasklite?
I'm running tasklite in an xterm, which supports 256 colors. Is there a way to specify colors other than the 8 ANSI terminal colors in tasklite's config.yaml
? If this is not currently possible, then this issue is a feature request to add 256-color support. I think this would be good because the 8 ANSI terminal colors is a rather limited selection.
Hey @ad-si
I am excited to see this project. I was thinking myself of re-implementing taskwarrior in a more safe language (Rust was on my mind) so this project makes me very curious. I am particularly interested in some architectural/design decisions.
What is your plan for sync between different devices? Is it planned? How do you plan to perform merging and conflict-resolution? Is it going to be client-server or p2p?
What is your plan about mobile devices? An app like this would benefit greatly from being present not only on desktop/web but on android (and maybe even iOS :) This is my main dissatisfaction with taskwarrior - absence of a supported mobile client. (And also a story around provisoning certs for mobile - PITA).
My knowledge of Haskell is near-zero (sadly), how is it suitable for mobile development? If it is not very well suited I'd imagine that you will need to write a separate client in different language and probably port the data structures (things like protobuf come to mind)...
The manual states that there is a tertiary state called Frozen
, which stops recurrence and repetition:
Frozen - Was previously repeating or recurring but has been stopped for the time being.
But looking through the commands and the source code the only mention of the word frozen
is in this section of the manual, not anywhere in the source code.
$ cat wop.txt
{
"body": "Buy milk",
"kanban-state": "backlog"
}
$ tl import < wop.txt
Importing … 📥 Imported task "Buy milk" with ulid "00000000000003nvz9b8xkqkr4"
$ tl
Id Prio Opened UTC Body
Id "00000000000003nvz9b8xkqkr4" is an invalid ulid and could not be converted to a datetime
While you wouldn't want to import 2 absolutely identical tasks, notes can be identically but for different tasks.
While using a floating window, the default of 20 leads to an overflow, where I can't see all the tasks with tasklite ready
because I have a limit of 18 lines.
╭─rookie@archlinux ~
╰─$ echo $LINES
18
I think the command tput lines
can be used to set the default headCount. Something like this in ghci:
Prelude> import System.Process
Prelude System.Process> z = readProcess "tput" ["lines"] ""
Prelude System.Process> z
"18\n"
and then set that value as the default headCount.
I get the below when trying to run tasklite version
after install using stack.
YAML exception:
Yaml file not found: /home/mac/.config/tasklite/config.yaml
What does a minimal config.yaml have to look like? I have searched the repo but have not been able to find any documentation.
Example session:
% tl prioritize -3 1a64
Invalid option `-3'
Did you mean this?
-h
Usage: tasklite prioritize VALUE TASK_ID ...
Adjust priority of specified tasks
Let me know in the comments if you have any more useful examples!
Hello,
ex-taskwarrior user here still looking for THE tool, but, imho, etm does deserve to be put on the list of related apps?
Currently, the definition for tasklite repeat
is "Repeat a task x days after its due UTC or after it gets closed (whichever occurs later)".
This definition works well if the task is completed on time or late, but it does not work well if the task is completed early.
Let's suppose I create a task "Take out the trash" and set it to repeat P7D because most of the time it takes about a week to fill up the trash can. Now suppose one week I'm gone for several days, so the trash doesn't need to be taken out until several days later than usual. When I finally do take out the trash and mark that task done, the next task is created with a due date seven days after that. This is just how it should be.
However, the reverse could also happen. Suppose that shortly after I take out the trash, I have a lot of people over to my house for a special meal. Having all those people over generates a lot of trash and so the trash needs to be taken out the next morning, five days before the due date. And so I do that and mark that task done. But because I'm completing the task early, the next task is created with a due date of twelve days from now. That isn't what I want, because if the upcoming week is a normal week, I'll need to take out the trash seven days from now and not twelve days from now. It would really be more appropriate to give the new task a due date of seven days from now.
Therefore, I propose that the definition for tasklite repeat
be changed to "Repeat a task x days after it gets closed", regardless of its due date, whether it's closed early or late.
I hope I've explained this clearly enough, but if not, please don't hesitate to ask for clarification.
Here is a list of all my personal tasks for TaskLite sorted by priority:
state:open
per default for the tl get
commandmodified
to list recently modified taskstagsViewQuery
and helper functions into a packagetl uninstall
commandtl infos
command to print infos about the installationtl do
.upsert
command to update task if exists during importstate
to final_state
or terminal_state
+dbcreation_utc
(to allow dates before 1970)Right now it states the following.
task export rc.json.array=off \
| while read -r task; do echo $task | tasklite import; done
It didn't work, until I changed import
to importjson
.
Just like they are supported by git
:
$ cat /usr/local/bin/git-grin
#! /usr/bin/env bash
echo '😁'
$ git grin
😁
Did you mean lts-13?
The versions of gi-haskell and gi-haskell-base in lts-14 are too new for gi-gtk-declarative.
In the dependencies
for gi-gtk-declarative-0.4.2:
haskell-gi-0.23.0 from stack
configuration does
not
match >=0.21 && <0.22
(latest matching
version is 0.21.5)
haskell-gi-base-0.23.0 from stack
configuration
does not
match >=0.21 && <0.22
(latest
matching
version
is 0.21.5)
needed due to tasklite-app-0.3.0.0
-> gi-gtk-declarative-0.4.2
Does tasklite plan to have a note taking system? In taskwarrior this is available through addons like hasknote.
I start with an empty database, add a task, view it with tasklite open
, and then mark it done. However, after that when I run tasklite open
again, it still shows the task, and running tasklite info
shows that the task is "Closed and Done".
Maybe I'm misunderstanding something, but the help for tasklite open
says "List all open tasks by priority desc", which makes me think it shouldn't show closed tasks.
The following demonstrates this issue:
jdietrch@arcturus:~$ tasklite
No tasks available. Run `tasklite help` to learn how to create tasks.
jdietrch@arcturus:~$ tasklite add Mow the lawn
🆕 Added task "Mow the lawn" with id "01eper15t77xcsq9078yv66h11"
jdietrch@arcturus:~$ tasklite open
Id Prio Opened UTC Body
h11 0 2020-11-06 Mow the lawn
jdietrch@arcturus:~$ tasklite do h11
✅ Finished task "Mow the lawn" with id "01eper15t77xcsq9078yv66h11"
jdietrch@arcturus:~$ tasklite open
Id Prio Opened UTC Body
h11 0 2020-11-06 Mow the lawn
jdietrch@arcturus:~$ tasklite info h11
Mow the lawn
State: Closed and Done
Priority: 0.0
ULID: 01eper15t77xcsq9078yv66h11
🆕 Created 2020-11-06 12:20:51
⬇
✏️ Modified 2020-11-06 12:20:51
User: jdietrch
jdietrch@arcturus:~$
I'm looking at the source code to better understand some things, and looking and listReady, the query's where clause is (
TaskLite/tasklite-core/source/Lib.hs
Line 1688 in e2bb3ad
\where (ready_utc is null \
\or (ready_utc is not null and ready_utc < datetime('now'))) \
\and closed_utc is null \
whereas the derived state of IsReady has the following (
TaskLite/tasklite-core/source/Task.hs
Line 179 in e2bb3ad
IsReady -> "(awake_utc is null or awake_utc < datetime('now')) \
\and ready_utc < datetime('now') \
\and closed_utc is null"
I think the derived option contains the appropriate query.
I can work on a PR that uses the IsReady Text as part of the listReady query if this is an actual bug.
I don't understand the meaning of the "Opened UTC" column in the default report.
The documentation doesn't discuss it (for instance, it doesn't appear in the State/Field table here).
Would it be possible to customize the reports that tasklite produces? When I run tasklite open
the third column is "Opened UTC". I think I would prefer to not show that and move the "Due UTC" information to that place instead.
Of course different people will have different opinions/preferences, and that's exactly why it would be good to have this aspect of tasklite customizeable.
I know you're not trying to make an exact duplicate of taskwarrior, but that program is quite flexible with its handling of reports:
https://taskwarrior.org/docs/report.html
Hi,
It seems that maxWidth
parameter, doesn't mater how high the value is, doesn't do anything?
I assume, when set, for example to 200, it should only wrap the line when combined line character count is larger then 200?
Because right now, even if the character count is lower then that value, the line is wrapped.
tl recur P1M nrt
gives output of invalid argument 'recur'
Has this command been removed? It's no longer shown via the help command but is listed in the online docs?
Do you have some more examples to get me started?
Say I want, for example, to add a tag to all the tasks that result from some search -- or any bulk action of the sort. How would you go about it?
(If this is not the medium to be asking these things, just let me know, sorry.)
File:
awake_utc: null
review_utc: null
state: null
repetition_duration: P10W
recurrence_duration: null
body: Check expenses at https://example.org
user: adrian
ulid: 01drhxt9zfc8g077db10gbmeme
modified_utc: 2020-03-15 11:22:26
group_ulid: 01da1s0y23t08jnnch667gjph1
closed_utc: null
priority_adjustment: 2
metadata: null
waiting_utc: null
ready_utc: null
due_utc: 2019-12-30 22:08:46
Error:
tasklite: unimplemened parsing format: Format_Spaces
CallStack (from HasCallStack):
error, called at ./Data/Hourglass/Format.hs:307:28 in hourglass-0.2.12-333qxqQQ3eK9Jo0nKcpgW5:Data.Hourglass.Format
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.