From e94acecd2082a0a700b344f7a62abe2cd71b9cb6 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 10:01:07 -0400 Subject: [PATCH 01/50] content: Move all HTML files under content folder --- {html => content}/.htaccess | 0 {html => content}/_redirects | 0 {html => content}/about.html | 0 {html => content}/bootstrap/css/bootstrap-theme.css | 0 .../bootstrap/css/bootstrap-theme.css.map | 0 .../bootstrap/css/bootstrap-theme.min.css | 0 {html => content}/bootstrap/css/bootstrap.css | 0 {html => content}/bootstrap/css/bootstrap.css.map | 0 {html => content}/bootstrap/css/bootstrap.min.css | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin {html => content}/bootstrap/js/bootstrap.js | 0 {html => content}/bootstrap/js/bootstrap.min.js | 0 {html => content}/conduct.html | 0 {html => content}/docs/.htaccess | 0 {html => content}/docs/30second.html | 0 {html => content}/docs/3rd-party.html | 0 {html => content}/docs/advice.html | 0 {html => content}/docs/best-practices.html | 0 {html => content}/docs/branching.html | 0 {html => content}/docs/bugs.html | 0 {html => content}/docs/build.html | 0 {html => content}/docs/clog/actions.html | 0 {html => content}/docs/clog/clone.html | 0 {html => content}/docs/clog/color.html | 0 {html => content}/docs/clog/download.html | 0 {html => content}/docs/clog/example_apache.html | 0 {html => content}/docs/clog/example_syslog.html | 0 {html => content}/docs/clog/help.html | 0 {html => content}/docs/clog/how.html | 0 {html => content}/docs/clog/images/action1.png | Bin {html => content}/docs/clog/images/action2.png | Bin {html => content}/docs/clog/images/action3.png | Bin {html => content}/docs/clog/images/color1.png | Bin {html => content}/docs/clog/images/color2.png | Bin {html => content}/docs/clog/images/color3.png | Bin {html => content}/docs/clog/images/color4.png | Bin {html => content}/docs/clog/images/color5.png | Bin {html => content}/docs/clog/images/option1.png | Bin {html => content}/docs/clog/images/option2.png | Bin {html => content}/docs/clog/images/option3.png | Bin {html => content}/docs/clog/images/option4.png | Bin {html => content}/docs/clog/images/option5.png | Bin {html => content}/docs/clog/images/pattern1.png | Bin {html => content}/docs/clog/images/pattern2.png | Bin {html => content}/docs/clog/images/pattern3.png | Bin {html => content}/docs/clog/images/section1.png | Bin {html => content}/docs/clog/images/section2.png | Bin {html => content}/docs/clog/images/section3.png | Bin {html => content}/docs/clog/index.html | 0 {html => content}/docs/clog/options.html | 0 {html => content}/docs/clog/patterns.html | 0 {html => content}/docs/clog/sections.html | 0 {html => content}/docs/clog/setup.html | 0 {html => content}/docs/clog/syntax.html | 0 {html => content}/docs/clog/what.html | 0 {html => content}/docs/coding_style.html | 0 {html => content}/docs/commands/_get.html | 0 {html => content}/docs/commands/_unique.html | 0 {html => content}/docs/commands/add.html | 0 {html => content}/docs/commands/append.html | 0 {html => content}/docs/commands/burndown.html | 0 {html => content}/docs/commands/calc.html | 0 {html => content}/docs/commands/columns.html | 0 {html => content}/docs/commands/count.html | 0 {html => content}/docs/commands/done.html | 0 {html => content}/docs/commands/export.html | 0 {html => content}/docs/commands/index.html | 0 {html => content}/docs/commands/info.html | 0 {html => content}/docs/commands/list.html | 0 {html => content}/docs/commands/log.html | 0 {html => content}/docs/commands/missing.html | 0 {html => content}/docs/commands/modify.html | 0 {html => content}/docs/commands/prepend.html | 0 {html => content}/docs/commands/synchronize.html | 0 {html => content}/docs/commands/template.html | 0 {html => content}/docs/configuration.html | 0 {html => content}/docs/context.html | 0 {html => content}/docs/contribute.html | 0 {html => content}/docs/dates.html | 0 {html => content}/docs/deprecated.html | 0 {html => content}/docs/design/cli.html | 0 {html => content}/docs/design/client.html | 0 {html => content}/docs/design/dom.html | 0 {html => content}/docs/design/index.html | 0 {html => content}/docs/design/plans.html | 0 {html => content}/docs/design/protocol.html | 0 {html => content}/docs/design/recurrence.html | 0 {html => content}/docs/design/request.html | 0 {html => content}/docs/design/rules.html | 0 {html => content}/docs/design/sync.html | 0 {html => content}/docs/design/task.html | 0 {html => content}/docs/design/week.png | Bin {html => content}/docs/design/workweek.html | 0 {html => content}/docs/design/year.png | Bin {html => content}/docs/docs.css | 0 {html => content}/docs/dom.html | 0 {html => content}/docs/durations.html | 0 {html => content}/docs/escapes.html | 0 {html => content}/docs/examples.html | 0 {html => content}/docs/features.html | 0 {html => content}/docs/filter.html | 0 {html => content}/docs/first_time.html | 0 {html => content}/docs/help.html | 0 {html => content}/docs/history.html | 0 {html => content}/docs/history_td.html | 0 {html => content}/docs/hooks.html | 0 {html => content}/docs/hooks2.html | 0 {html => content}/docs/hooks_guide.html | 0 {html => content}/docs/ids.html | 0 {html => content}/docs/images/completion.png | Bin {html => content}/docs/images/dark-16.png | Bin {html => content}/docs/images/dark-256.png | Bin {html => content}/docs/images/dark-blue-256.png | Bin {html => content}/docs/images/dark-gray-256.png | Bin .../docs/images/dark-gray-blue-256.png | Bin {html => content}/docs/images/dark-green-256.png | Bin {html => content}/docs/images/dark-red-256.png | Bin {html => content}/docs/images/dark-violets-256.png | Bin .../docs/images/dark-yellow-green-256.png | Bin {html => content}/docs/images/day8.png | Bin {html => content}/docs/images/dev.png | Bin {html => content}/docs/images/dev2.png | Bin {html => content}/docs/images/filter.png | Bin {html => content}/docs/images/fixrate.png | Bin {html => content}/docs/images/light-16.png | Bin {html => content}/docs/images/light-256.png | Bin {html => content}/docs/images/master.png | Bin {html => content}/docs/images/miscellaneous.png | Bin {html => content}/docs/images/modification.png | Bin {html => content}/docs/images/nofixrate.png | Bin {html => content}/docs/images/obfuscate.png | Bin {html => content}/docs/images/override.png | Bin {html => content}/docs/images/release.png | Bin .../docs/images/solarized-dark-256.png | Bin .../docs/images/solarized-light-256.png | Bin {html => content}/docs/images/syntax.png | Bin {html => content}/docs/images/syntaxes.png | Bin {html => content}/docs/images/topic.png | Bin {html => content}/docs/index.html | 0 {html => content}/docs/introduction.html | 0 {html => content}/docs/jobs.html | 0 {html => content}/docs/license.html | 0 {html => content}/docs/named_dates.html | 0 {html => content}/docs/philosophy.html | 0 {html => content}/docs/priority.html | 0 {html => content}/docs/recurrence.html | 0 {html => content}/docs/report.html | 0 {html => content}/docs/review.html | 0 {html => content}/docs/searching.html | 0 {html => content}/docs/start.html | 0 {html => content}/docs/syntax.html | 0 {html => content}/docs/tags.html | 0 {html => content}/docs/taskserver/ciphers.html | 0 {html => content}/docs/taskserver/configure.html | 0 {html => content}/docs/taskserver/control.html | 0 {html => content}/docs/taskserver/git.html | 0 {html => content}/docs/taskserver/package.html | 0 {html => content}/docs/taskserver/prep.html | 0 {html => content}/docs/taskserver/protocol.html | 0 {html => content}/docs/taskserver/setup.html | 0 {html => content}/docs/taskserver/sync.html | 0 {html => content}/docs/taskserver/tarball.html | 0 {html => content}/docs/taskserver/taskwarrior.html | 0 .../docs/taskserver/troubleshooting-sync.html | 0 {html => content}/docs/taskserver/upgrade.html | 0 {html => content}/docs/taskserver/user.html | 0 {html => content}/docs/taskserver/why.html | 0 {html => content}/docs/template.html | 0 {html => content}/docs/terminology.html | 0 {html => content}/docs/themes.html | 0 {html => content}/docs/triage.html | 0 {html => content}/docs/udas.html | 0 {html => content}/docs/unicode.html | 0 {html => content}/docs/urgency.html | 0 {html => content}/docs/using_dates.html | 0 {html => content}/docs/verbosity.html | 0 {html => content}/docs/workflow.html | 0 {html => content}/download/clog-1.1.0.tar.gz | Bin {html => content}/download/export-csv.pl | 0 {html => content}/download/export-html.pl | 0 {html => content}/download/export-ical.pl | 0 {html => content}/download/export-sql.py | 0 {html => content}/download/export-tsv.pl | 0 {html => content}/download/export-xml.pl | 0 {html => content}/download/export-xml.py | 0 {html => content}/download/export-xml.rb | 0 {html => content}/download/export-yad.pl | 0 {html => content}/download/export-yaml.pl | 0 {html => content}/download/gtdnext.sh | 0 {html => content}/download/import-todo.sh.pl | 0 {html => content}/download/import-yaml.pl | 0 {html => content}/download/index.html | 0 {html => content}/download/logo.tar.gz | Bin {html => content}/download/on-modify.timetrack.pl | 0 {html => content}/download/task-2.3.0.ref.pdf | Bin {html => content}/download/task-2.3.0.tar.gz | Bin {html => content}/download/task-2.4.0.ref.pdf | Bin {html => content}/download/task-2.4.0.tar.gz | Bin {html => content}/download/task-2.4.1.ref.pdf | Bin {html => content}/download/task-2.4.1.tar.gz | Bin {html => content}/download/task-2.4.2.ref.pdf | Bin {html => content}/download/task-2.4.2.tar.gz | Bin {html => content}/download/task-2.4.3.ref.pdf | Bin {html => content}/download/task-2.4.3.tar.gz | Bin {html => content}/download/task-2.4.4.ref.pdf | Bin {html => content}/download/task-2.4.4.tar.gz | Bin {html => content}/download/task-2.5.0.ref.pdf | Bin {html => content}/download/task-2.5.0.tar.gz | Bin {html => content}/download/task-2.5.1.ref.pdf | Bin {html => content}/download/task-2.5.1.tar.gz | Bin {html => content}/download/task-2.5.3.ref.pdf | Bin {html => content}/download/task-2.5.3.tar.gz | Bin {html => content}/download/task-2.6.0.tar.gz | Bin {html => content}/download/task-2.6.1.tar.gz | Bin {html => content}/download/task-2.6.2.tar.gz | Bin {html => content}/download/task-latest.ref.pdf | 0 {html => content}/download/task-latest.tar.gz | 0 {html => content}/download/taskd-1.0.0.tar.gz | Bin {html => content}/download/taskd-1.1.0.tar.gz | Bin {html => content}/download/taskd-latest.tar.gz | 0 {html => content}/download/tasksh-1.0.0.tar.gz | Bin {html => content}/download/tasksh-1.1.0.tar.gz | Bin {html => content}/download/tasksh-1.2.0.tar.gz | Bin {html => content}/download/tasksh-latest.tar.gz | 0 {html => content}/download/timew-1.0.0.tar.gz | Bin {html => content}/download/timew-1.1.0.tar.gz | Bin {html => content}/download/timew-1.1.1.tar.gz | Bin {html => content}/download/timew-dbcorrection.py | 0 {html => content}/download/timew-latest.tar.gz | 0 {html => content}/download/tw-ubcde11.pdf | Bin {html => content}/download/vit-1.1.tar.gz | Bin {html => content}/download/vit-1.2.tar.gz | Bin {html => content}/download/vit-latest.tar.gz | 0 {html => content}/download/vramsteg-1.0.1.tar.gz | Bin {html => content}/feed.rss | 0 {html => content}/images/digitalocean.png | Bin {html => content}/images/dnsimple.png | Bin {html => content}/images/email_dark.png | Bin {html => content}/images/favicon.ico | Bin {html => content}/images/flattr_logo_16.png | Bin {html => content}/images/flod-s.png | Bin {html => content}/images/gbf.png | Bin {html => content}/images/logoAtlassianPNG.png | Bin {html => content}/images/paypal.jpg | Bin {html => content}/images/pingdom3.png | Bin {html => content}/images/rackspace.png | Bin {html => content}/images/rss.gif | Bin {html => content}/images/statuspage.png | Bin {html => content}/images/swatch.png | Bin {html => content}/images/tw-m.png | Bin {html => content}/images/tw-s.png | Bin {html => content}/images/twitter_dark.png | Bin {html => content}/images/wordpress.png | Bin {html => content}/index.html | 0 {html => content}/news/images/answers.png | Bin {html => content}/news/images/central.png | Bin {html => content}/news/images/fish.gif | Bin {html => content}/news/images/froscon.jpg | Bin {html => content}/news/images/hellotux.gif | Bin {html => content}/news/images/iso_date.png | Bin {html => content}/news/images/live_demo-thumb.png | Bin {html => content}/news/images/live_demo.png | Bin {html => content}/news/images/meetup.jpg | Bin {html => content}/news/images/perbacco.png | Bin {html => content}/news/images/qanda.png | Bin {html => content}/news/images/ref230-thumb.png | Bin {html => content}/news/images/ref230.png | Bin {html => content}/news/images/shirt.png | Bin {html => content}/news/images/sort.png | Bin {html => content}/news/images/tasksh.png | Bin {html => content}/news/images/ti.png | Bin {html => content}/news/images/tng.png | Bin {html => content}/news/images/tw.png | Bin {html => content}/news/images/twa1.png | Bin {html => content}/news/images/twa2.png | Bin {html => content}/news/images/twa3.png | Bin {html => content}/news/images/twa4.png | Bin {html => content}/news/images/twa5.png | Bin {html => content}/news/images/win10-thumb.png | Bin {html => content}/news/images/win10.png | Bin {html => content}/news/index.html | 0 {html => content}/news/news.20140212.html | 0 {html => content}/news/news.20140217.html | 0 {html => content}/news/news.20140220.html | 0 {html => content}/news/news.20140226.html | 0 {html => content}/news/news.20140227.html | 0 {html => content}/news/news.20140303.html | 0 {html => content}/news/news.20140309.html | 0 {html => content}/news/news.20140406.html | 0 {html => content}/news/news.20140407.html | 0 {html => content}/news/news.20140412.html | 0 {html => content}/news/news.20140429.html | 0 {html => content}/news/news.20140510.html | 0 {html => content}/news/news.20140524.html | 0 {html => content}/news/news.20140607.html | 0 {html => content}/news/news.20140704.html | 0 {html => content}/news/news.20140816.html | 0 {html => content}/news/news.20140906.html | 0 {html => content}/news/news.20140915.html | 0 {html => content}/news/news.20140928.html | 0 {html => content}/news/news.20141011.html | 0 {html => content}/news/news.20141025.html | 0 {html => content}/news/news.20141111.html | 0 {html => content}/news/news.20141221.html | 0 {html => content}/news/news.20150101.html | 0 {html => content}/news/news.20150103.html | 0 {html => content}/news/news.20150207.html | 0 {html => content}/news/news.20150216.html | 0 {html => content}/news/news.20150228.html | 0 {html => content}/news/news.20150301.html | 0 {html => content}/news/news.20150315.html | 0 {html => content}/news/news.20150331.html | 0 {html => content}/news/news.20150419.html | 0 {html => content}/news/news.20150430.html | 0 {html => content}/news/news.20150504.html | 0 {html => content}/news/news.20150509.html | 0 {html => content}/news/news.20150510.html | 0 {html => content}/news/news.20150511.html | 0 {html => content}/news/news.20150524.html | 0 {html => content}/news/news.20150601.html | 0 {html => content}/news/news.20150627.html | 0 {html => content}/news/news.20150701.html | 0 {html => content}/news/news.20150801.html | 0 {html => content}/news/news.20150901.html | 0 {html => content}/news/news.20150907.html | 0 {html => content}/news/news.20150916.html | 0 {html => content}/news/news.20150926.html | 0 {html => content}/news/news.20150927.html | 0 {html => content}/news/news.20150929.html | 0 {html => content}/news/news.20151001.html | 0 {html => content}/news/news.20151012.html | 0 {html => content}/news/news.20151017.html | 0 {html => content}/news/news.20151021.html | 0 {html => content}/news/news.20151029.html | 0 {html => content}/news/news.20151101.2.html | 0 {html => content}/news/news.20151101.html | 0 {html => content}/news/news.20151201.html | 0 {html => content}/news/news.20160101.html | 0 {html => content}/news/news.20160201.html | 0 {html => content}/news/news.20160205.html | 0 {html => content}/news/news.20160209.html | 0 {html => content}/news/news.20160224.html | 0 {html => content}/news/news.20160225.html | 0 {html => content}/news/news.20160301.html | 0 {html => content}/news/news.20160401.html | 0 {html => content}/news/news.20160407.html | 0 {html => content}/news/news.20160501.html | 0 {html => content}/news/news.20160514.html | 0 {html => content}/news/news.20160522.html | 0 {html => content}/news/news.20160604.html | 0 {html => content}/news/news.20160620.html | 0 {html => content}/news/news.20160627.html | 0 {html => content}/news/news.20160707.html | 0 {html => content}/news/news.20160725.html | 0 {html => content}/news/news.20160810.html | 0 {html => content}/news/news.20160813.html | 0 {html => content}/news/news.20160821.html | 0 {html => content}/news/news.20160824.html | 0 {html => content}/news/news.20160905.2.html | 0 {html => content}/news/news.20160905.html | 0 {html => content}/news/news.20161002.html | 0 {html => content}/news/news.20161102.html | 0 {html => content}/news/news.20161116.html | 0 {html => content}/news/news.20161203.html | 0 {html => content}/news/news.20161209.html | 0 {html => content}/news/news.20170102.html | 0 {html => content}/news/news.20170113.html | 0 {html => content}/news/news.20170208.html | 0 {html => content}/news/news.20170209.html | 0 {html => content}/news/news.20170301.html | 0 {html => content}/news/news.20170308.html | 0 {html => content}/news/news.20170401.html | 0 {html => content}/news/news.20170402.html | 0 {html => content}/news/news.20170509.html | 0 {html => content}/news/news.20170510.html | 0 {html => content}/news/news.20170510_2.html | 0 {html => content}/news/news.20180113.html | 0 {html => content}/news/news.20180114.html | 0 {html => content}/news/news.20180129.html | 0 {html => content}/news/news.20180203.2.html | 0 {html => content}/news/news.20180203.html | 0 {html => content}/news/news.20180204.html | 0 {html => content}/news/news.20191123.html | 0 {html => content}/news/news.20210125.html | 0 {html => content}/site.css | 0 {html => content}/support/authors.html | 0 {html => content}/support/faq.html | 0 {html => content}/support/index.html | 0 {html => content}/tools/filter-ko.js | 0 {html => content}/tools/index.html | 0 {html => content}/tools/site.css | 0 {html => content}/tools/tools-data.json | 0 {html => content}/tools/tools.css | 0 396 files changed, 0 insertions(+), 0 deletions(-) rename {html => content}/.htaccess (100%) rename {html => content}/_redirects (100%) rename {html => content}/about.html (100%) rename {html => content}/bootstrap/css/bootstrap-theme.css (100%) rename {html => content}/bootstrap/css/bootstrap-theme.css.map (100%) rename {html => content}/bootstrap/css/bootstrap-theme.min.css (100%) rename {html => content}/bootstrap/css/bootstrap.css (100%) rename {html => content}/bootstrap/css/bootstrap.css.map (100%) rename {html => content}/bootstrap/css/bootstrap.min.css (100%) rename {html => content}/bootstrap/fonts/glyphicons-halflings-regular.eot (100%) rename {html => content}/bootstrap/fonts/glyphicons-halflings-regular.svg (100%) rename {html => content}/bootstrap/fonts/glyphicons-halflings-regular.ttf (100%) rename {html => content}/bootstrap/fonts/glyphicons-halflings-regular.woff (100%) rename {html => content}/bootstrap/js/bootstrap.js (100%) rename {html => content}/bootstrap/js/bootstrap.min.js (100%) rename {html => content}/conduct.html (100%) rename {html => content}/docs/.htaccess (100%) rename {html => content}/docs/30second.html (100%) rename {html => content}/docs/3rd-party.html (100%) rename {html => content}/docs/advice.html (100%) rename {html => content}/docs/best-practices.html (100%) rename {html => content}/docs/branching.html (100%) rename {html => content}/docs/bugs.html (100%) rename {html => content}/docs/build.html (100%) rename {html => content}/docs/clog/actions.html (100%) rename {html => content}/docs/clog/clone.html (100%) rename {html => content}/docs/clog/color.html (100%) rename {html => content}/docs/clog/download.html (100%) rename {html => content}/docs/clog/example_apache.html (100%) rename {html => content}/docs/clog/example_syslog.html (100%) rename {html => content}/docs/clog/help.html (100%) rename {html => content}/docs/clog/how.html (100%) rename {html => content}/docs/clog/images/action1.png (100%) rename {html => content}/docs/clog/images/action2.png (100%) rename {html => content}/docs/clog/images/action3.png (100%) rename {html => content}/docs/clog/images/color1.png (100%) rename {html => content}/docs/clog/images/color2.png (100%) rename {html => content}/docs/clog/images/color3.png (100%) rename {html => content}/docs/clog/images/color4.png (100%) rename {html => content}/docs/clog/images/color5.png (100%) rename {html => content}/docs/clog/images/option1.png (100%) rename {html => content}/docs/clog/images/option2.png (100%) rename {html => content}/docs/clog/images/option3.png (100%) rename {html => content}/docs/clog/images/option4.png (100%) rename {html => content}/docs/clog/images/option5.png (100%) rename {html => content}/docs/clog/images/pattern1.png (100%) rename {html => content}/docs/clog/images/pattern2.png (100%) rename {html => content}/docs/clog/images/pattern3.png (100%) rename {html => content}/docs/clog/images/section1.png (100%) rename {html => content}/docs/clog/images/section2.png (100%) rename {html => content}/docs/clog/images/section3.png (100%) rename {html => content}/docs/clog/index.html (100%) rename {html => content}/docs/clog/options.html (100%) rename {html => content}/docs/clog/patterns.html (100%) rename {html => content}/docs/clog/sections.html (100%) rename {html => content}/docs/clog/setup.html (100%) rename {html => content}/docs/clog/syntax.html (100%) rename {html => content}/docs/clog/what.html (100%) rename {html => content}/docs/coding_style.html (100%) rename {html => content}/docs/commands/_get.html (100%) rename {html => content}/docs/commands/_unique.html (100%) rename {html => content}/docs/commands/add.html (100%) rename {html => content}/docs/commands/append.html (100%) rename {html => content}/docs/commands/burndown.html (100%) rename {html => content}/docs/commands/calc.html (100%) rename {html => content}/docs/commands/columns.html (100%) rename {html => content}/docs/commands/count.html (100%) rename {html => content}/docs/commands/done.html (100%) rename {html => content}/docs/commands/export.html (100%) rename {html => content}/docs/commands/index.html (100%) rename {html => content}/docs/commands/info.html (100%) rename {html => content}/docs/commands/list.html (100%) rename {html => content}/docs/commands/log.html (100%) rename {html => content}/docs/commands/missing.html (100%) rename {html => content}/docs/commands/modify.html (100%) rename {html => content}/docs/commands/prepend.html (100%) rename {html => content}/docs/commands/synchronize.html (100%) rename {html => content}/docs/commands/template.html (100%) rename {html => content}/docs/configuration.html (100%) rename {html => content}/docs/context.html (100%) rename {html => content}/docs/contribute.html (100%) rename {html => content}/docs/dates.html (100%) rename {html => content}/docs/deprecated.html (100%) rename {html => content}/docs/design/cli.html (100%) rename {html => content}/docs/design/client.html (100%) rename {html => content}/docs/design/dom.html (100%) rename {html => content}/docs/design/index.html (100%) rename {html => content}/docs/design/plans.html (100%) rename {html => content}/docs/design/protocol.html (100%) rename {html => content}/docs/design/recurrence.html (100%) rename {html => content}/docs/design/request.html (100%) rename {html => content}/docs/design/rules.html (100%) rename {html => content}/docs/design/sync.html (100%) rename {html => content}/docs/design/task.html (100%) rename {html => content}/docs/design/week.png (100%) rename {html => content}/docs/design/workweek.html (100%) rename {html => content}/docs/design/year.png (100%) rename {html => content}/docs/docs.css (100%) rename {html => content}/docs/dom.html (100%) rename {html => content}/docs/durations.html (100%) rename {html => content}/docs/escapes.html (100%) rename {html => content}/docs/examples.html (100%) rename {html => content}/docs/features.html (100%) rename {html => content}/docs/filter.html (100%) rename {html => content}/docs/first_time.html (100%) rename {html => content}/docs/help.html (100%) rename {html => content}/docs/history.html (100%) rename {html => content}/docs/history_td.html (100%) rename {html => content}/docs/hooks.html (100%) rename {html => content}/docs/hooks2.html (100%) rename {html => content}/docs/hooks_guide.html (100%) rename {html => content}/docs/ids.html (100%) rename {html => content}/docs/images/completion.png (100%) rename {html => content}/docs/images/dark-16.png (100%) rename {html => content}/docs/images/dark-256.png (100%) rename {html => content}/docs/images/dark-blue-256.png (100%) rename {html => content}/docs/images/dark-gray-256.png (100%) rename {html => content}/docs/images/dark-gray-blue-256.png (100%) rename {html => content}/docs/images/dark-green-256.png (100%) rename {html => content}/docs/images/dark-red-256.png (100%) rename {html => content}/docs/images/dark-violets-256.png (100%) rename {html => content}/docs/images/dark-yellow-green-256.png (100%) rename {html => content}/docs/images/day8.png (100%) rename {html => content}/docs/images/dev.png (100%) rename {html => content}/docs/images/dev2.png (100%) rename {html => content}/docs/images/filter.png (100%) rename {html => content}/docs/images/fixrate.png (100%) rename {html => content}/docs/images/light-16.png (100%) rename {html => content}/docs/images/light-256.png (100%) rename {html => content}/docs/images/master.png (100%) rename {html => content}/docs/images/miscellaneous.png (100%) rename {html => content}/docs/images/modification.png (100%) rename {html => content}/docs/images/nofixrate.png (100%) rename {html => content}/docs/images/obfuscate.png (100%) rename {html => content}/docs/images/override.png (100%) rename {html => content}/docs/images/release.png (100%) rename {html => content}/docs/images/solarized-dark-256.png (100%) rename {html => content}/docs/images/solarized-light-256.png (100%) rename {html => content}/docs/images/syntax.png (100%) rename {html => content}/docs/images/syntaxes.png (100%) rename {html => content}/docs/images/topic.png (100%) rename {html => content}/docs/index.html (100%) rename {html => content}/docs/introduction.html (100%) rename {html => content}/docs/jobs.html (100%) rename {html => content}/docs/license.html (100%) rename {html => content}/docs/named_dates.html (100%) rename {html => content}/docs/philosophy.html (100%) rename {html => content}/docs/priority.html (100%) rename {html => content}/docs/recurrence.html (100%) rename {html => content}/docs/report.html (100%) rename {html => content}/docs/review.html (100%) rename {html => content}/docs/searching.html (100%) rename {html => content}/docs/start.html (100%) rename {html => content}/docs/syntax.html (100%) rename {html => content}/docs/tags.html (100%) rename {html => content}/docs/taskserver/ciphers.html (100%) rename {html => content}/docs/taskserver/configure.html (100%) rename {html => content}/docs/taskserver/control.html (100%) rename {html => content}/docs/taskserver/git.html (100%) rename {html => content}/docs/taskserver/package.html (100%) rename {html => content}/docs/taskserver/prep.html (100%) rename {html => content}/docs/taskserver/protocol.html (100%) rename {html => content}/docs/taskserver/setup.html (100%) rename {html => content}/docs/taskserver/sync.html (100%) rename {html => content}/docs/taskserver/tarball.html (100%) rename {html => content}/docs/taskserver/taskwarrior.html (100%) rename {html => content}/docs/taskserver/troubleshooting-sync.html (100%) rename {html => content}/docs/taskserver/upgrade.html (100%) rename {html => content}/docs/taskserver/user.html (100%) rename {html => content}/docs/taskserver/why.html (100%) rename {html => content}/docs/template.html (100%) rename {html => content}/docs/terminology.html (100%) rename {html => content}/docs/themes.html (100%) rename {html => content}/docs/triage.html (100%) rename {html => content}/docs/udas.html (100%) rename {html => content}/docs/unicode.html (100%) rename {html => content}/docs/urgency.html (100%) rename {html => content}/docs/using_dates.html (100%) rename {html => content}/docs/verbosity.html (100%) rename {html => content}/docs/workflow.html (100%) rename {html => content}/download/clog-1.1.0.tar.gz (100%) rename {html => content}/download/export-csv.pl (100%) rename {html => content}/download/export-html.pl (100%) rename {html => content}/download/export-ical.pl (100%) rename {html => content}/download/export-sql.py (100%) rename {html => content}/download/export-tsv.pl (100%) rename {html => content}/download/export-xml.pl (100%) rename {html => content}/download/export-xml.py (100%) rename {html => content}/download/export-xml.rb (100%) rename {html => content}/download/export-yad.pl (100%) rename {html => content}/download/export-yaml.pl (100%) rename {html => content}/download/gtdnext.sh (100%) rename {html => content}/download/import-todo.sh.pl (100%) rename {html => content}/download/import-yaml.pl (100%) rename {html => content}/download/index.html (100%) rename {html => content}/download/logo.tar.gz (100%) rename {html => content}/download/on-modify.timetrack.pl (100%) rename {html => content}/download/task-2.3.0.ref.pdf (100%) rename {html => content}/download/task-2.3.0.tar.gz (100%) rename {html => content}/download/task-2.4.0.ref.pdf (100%) rename {html => content}/download/task-2.4.0.tar.gz (100%) rename {html => content}/download/task-2.4.1.ref.pdf (100%) rename {html => content}/download/task-2.4.1.tar.gz (100%) rename {html => content}/download/task-2.4.2.ref.pdf (100%) rename {html => content}/download/task-2.4.2.tar.gz (100%) rename {html => content}/download/task-2.4.3.ref.pdf (100%) rename {html => content}/download/task-2.4.3.tar.gz (100%) rename {html => content}/download/task-2.4.4.ref.pdf (100%) rename {html => content}/download/task-2.4.4.tar.gz (100%) rename {html => content}/download/task-2.5.0.ref.pdf (100%) rename {html => content}/download/task-2.5.0.tar.gz (100%) rename {html => content}/download/task-2.5.1.ref.pdf (100%) rename {html => content}/download/task-2.5.1.tar.gz (100%) rename {html => content}/download/task-2.5.3.ref.pdf (100%) rename {html => content}/download/task-2.5.3.tar.gz (100%) rename {html => content}/download/task-2.6.0.tar.gz (100%) rename {html => content}/download/task-2.6.1.tar.gz (100%) rename {html => content}/download/task-2.6.2.tar.gz (100%) rename {html => content}/download/task-latest.ref.pdf (100%) rename {html => content}/download/task-latest.tar.gz (100%) rename {html => content}/download/taskd-1.0.0.tar.gz (100%) rename {html => content}/download/taskd-1.1.0.tar.gz (100%) rename {html => content}/download/taskd-latest.tar.gz (100%) rename {html => content}/download/tasksh-1.0.0.tar.gz (100%) rename {html => content}/download/tasksh-1.1.0.tar.gz (100%) rename {html => content}/download/tasksh-1.2.0.tar.gz (100%) rename {html => content}/download/tasksh-latest.tar.gz (100%) rename {html => content}/download/timew-1.0.0.tar.gz (100%) rename {html => content}/download/timew-1.1.0.tar.gz (100%) rename {html => content}/download/timew-1.1.1.tar.gz (100%) rename {html => content}/download/timew-dbcorrection.py (100%) rename {html => content}/download/timew-latest.tar.gz (100%) rename {html => content}/download/tw-ubcde11.pdf (100%) rename {html => content}/download/vit-1.1.tar.gz (100%) rename {html => content}/download/vit-1.2.tar.gz (100%) rename {html => content}/download/vit-latest.tar.gz (100%) rename {html => content}/download/vramsteg-1.0.1.tar.gz (100%) rename {html => content}/feed.rss (100%) rename {html => content}/images/digitalocean.png (100%) rename {html => content}/images/dnsimple.png (100%) rename {html => content}/images/email_dark.png (100%) rename {html => content}/images/favicon.ico (100%) rename {html => content}/images/flattr_logo_16.png (100%) rename {html => content}/images/flod-s.png (100%) rename {html => content}/images/gbf.png (100%) rename {html => content}/images/logoAtlassianPNG.png (100%) rename {html => content}/images/paypal.jpg (100%) rename {html => content}/images/pingdom3.png (100%) rename {html => content}/images/rackspace.png (100%) rename {html => content}/images/rss.gif (100%) rename {html => content}/images/statuspage.png (100%) rename {html => content}/images/swatch.png (100%) rename {html => content}/images/tw-m.png (100%) rename {html => content}/images/tw-s.png (100%) rename {html => content}/images/twitter_dark.png (100%) rename {html => content}/images/wordpress.png (100%) rename {html => content}/index.html (100%) rename {html => content}/news/images/answers.png (100%) rename {html => content}/news/images/central.png (100%) rename {html => content}/news/images/fish.gif (100%) rename {html => content}/news/images/froscon.jpg (100%) rename {html => content}/news/images/hellotux.gif (100%) rename {html => content}/news/images/iso_date.png (100%) rename {html => content}/news/images/live_demo-thumb.png (100%) rename {html => content}/news/images/live_demo.png (100%) rename {html => content}/news/images/meetup.jpg (100%) rename {html => content}/news/images/perbacco.png (100%) rename {html => content}/news/images/qanda.png (100%) rename {html => content}/news/images/ref230-thumb.png (100%) rename {html => content}/news/images/ref230.png (100%) rename {html => content}/news/images/shirt.png (100%) rename {html => content}/news/images/sort.png (100%) rename {html => content}/news/images/tasksh.png (100%) rename {html => content}/news/images/ti.png (100%) rename {html => content}/news/images/tng.png (100%) rename {html => content}/news/images/tw.png (100%) rename {html => content}/news/images/twa1.png (100%) rename {html => content}/news/images/twa2.png (100%) rename {html => content}/news/images/twa3.png (100%) rename {html => content}/news/images/twa4.png (100%) rename {html => content}/news/images/twa5.png (100%) rename {html => content}/news/images/win10-thumb.png (100%) rename {html => content}/news/images/win10.png (100%) rename {html => content}/news/index.html (100%) rename {html => content}/news/news.20140212.html (100%) rename {html => content}/news/news.20140217.html (100%) rename {html => content}/news/news.20140220.html (100%) rename {html => content}/news/news.20140226.html (100%) rename {html => content}/news/news.20140227.html (100%) rename {html => content}/news/news.20140303.html (100%) rename {html => content}/news/news.20140309.html (100%) rename {html => content}/news/news.20140406.html (100%) rename {html => content}/news/news.20140407.html (100%) rename {html => content}/news/news.20140412.html (100%) rename {html => content}/news/news.20140429.html (100%) rename {html => content}/news/news.20140510.html (100%) rename {html => content}/news/news.20140524.html (100%) rename {html => content}/news/news.20140607.html (100%) rename {html => content}/news/news.20140704.html (100%) rename {html => content}/news/news.20140816.html (100%) rename {html => content}/news/news.20140906.html (100%) rename {html => content}/news/news.20140915.html (100%) rename {html => content}/news/news.20140928.html (100%) rename {html => content}/news/news.20141011.html (100%) rename {html => content}/news/news.20141025.html (100%) rename {html => content}/news/news.20141111.html (100%) rename {html => content}/news/news.20141221.html (100%) rename {html => content}/news/news.20150101.html (100%) rename {html => content}/news/news.20150103.html (100%) rename {html => content}/news/news.20150207.html (100%) rename {html => content}/news/news.20150216.html (100%) rename {html => content}/news/news.20150228.html (100%) rename {html => content}/news/news.20150301.html (100%) rename {html => content}/news/news.20150315.html (100%) rename {html => content}/news/news.20150331.html (100%) rename {html => content}/news/news.20150419.html (100%) rename {html => content}/news/news.20150430.html (100%) rename {html => content}/news/news.20150504.html (100%) rename {html => content}/news/news.20150509.html (100%) rename {html => content}/news/news.20150510.html (100%) rename {html => content}/news/news.20150511.html (100%) rename {html => content}/news/news.20150524.html (100%) rename {html => content}/news/news.20150601.html (100%) rename {html => content}/news/news.20150627.html (100%) rename {html => content}/news/news.20150701.html (100%) rename {html => content}/news/news.20150801.html (100%) rename {html => content}/news/news.20150901.html (100%) rename {html => content}/news/news.20150907.html (100%) rename {html => content}/news/news.20150916.html (100%) rename {html => content}/news/news.20150926.html (100%) rename {html => content}/news/news.20150927.html (100%) rename {html => content}/news/news.20150929.html (100%) rename {html => content}/news/news.20151001.html (100%) rename {html => content}/news/news.20151012.html (100%) rename {html => content}/news/news.20151017.html (100%) rename {html => content}/news/news.20151021.html (100%) rename {html => content}/news/news.20151029.html (100%) rename {html => content}/news/news.20151101.2.html (100%) rename {html => content}/news/news.20151101.html (100%) rename {html => content}/news/news.20151201.html (100%) rename {html => content}/news/news.20160101.html (100%) rename {html => content}/news/news.20160201.html (100%) rename {html => content}/news/news.20160205.html (100%) rename {html => content}/news/news.20160209.html (100%) rename {html => content}/news/news.20160224.html (100%) rename {html => content}/news/news.20160225.html (100%) rename {html => content}/news/news.20160301.html (100%) rename {html => content}/news/news.20160401.html (100%) rename {html => content}/news/news.20160407.html (100%) rename {html => content}/news/news.20160501.html (100%) rename {html => content}/news/news.20160514.html (100%) rename {html => content}/news/news.20160522.html (100%) rename {html => content}/news/news.20160604.html (100%) rename {html => content}/news/news.20160620.html (100%) rename {html => content}/news/news.20160627.html (100%) rename {html => content}/news/news.20160707.html (100%) rename {html => content}/news/news.20160725.html (100%) rename {html => content}/news/news.20160810.html (100%) rename {html => content}/news/news.20160813.html (100%) rename {html => content}/news/news.20160821.html (100%) rename {html => content}/news/news.20160824.html (100%) rename {html => content}/news/news.20160905.2.html (100%) rename {html => content}/news/news.20160905.html (100%) rename {html => content}/news/news.20161002.html (100%) rename {html => content}/news/news.20161102.html (100%) rename {html => content}/news/news.20161116.html (100%) rename {html => content}/news/news.20161203.html (100%) rename {html => content}/news/news.20161209.html (100%) rename {html => content}/news/news.20170102.html (100%) rename {html => content}/news/news.20170113.html (100%) rename {html => content}/news/news.20170208.html (100%) rename {html => content}/news/news.20170209.html (100%) rename {html => content}/news/news.20170301.html (100%) rename {html => content}/news/news.20170308.html (100%) rename {html => content}/news/news.20170401.html (100%) rename {html => content}/news/news.20170402.html (100%) rename {html => content}/news/news.20170509.html (100%) rename {html => content}/news/news.20170510.html (100%) rename {html => content}/news/news.20170510_2.html (100%) rename {html => content}/news/news.20180113.html (100%) rename {html => content}/news/news.20180114.html (100%) rename {html => content}/news/news.20180129.html (100%) rename {html => content}/news/news.20180203.2.html (100%) rename {html => content}/news/news.20180203.html (100%) rename {html => content}/news/news.20180204.html (100%) rename {html => content}/news/news.20191123.html (100%) rename {html => content}/news/news.20210125.html (100%) rename {html => content}/site.css (100%) rename {html => content}/support/authors.html (100%) rename {html => content}/support/faq.html (100%) rename {html => content}/support/index.html (100%) rename {html => content}/tools/filter-ko.js (100%) rename {html => content}/tools/index.html (100%) rename {html => content}/tools/site.css (100%) rename {html => content}/tools/tools-data.json (100%) rename {html => content}/tools/tools.css (100%) diff --git a/html/.htaccess b/content/.htaccess similarity index 100% rename from html/.htaccess rename to content/.htaccess diff --git a/html/_redirects b/content/_redirects similarity index 100% rename from html/_redirects rename to content/_redirects diff --git a/html/about.html b/content/about.html similarity index 100% rename from html/about.html rename to content/about.html diff --git a/html/bootstrap/css/bootstrap-theme.css b/content/bootstrap/css/bootstrap-theme.css similarity index 100% rename from html/bootstrap/css/bootstrap-theme.css rename to content/bootstrap/css/bootstrap-theme.css diff --git a/html/bootstrap/css/bootstrap-theme.css.map b/content/bootstrap/css/bootstrap-theme.css.map similarity index 100% rename from html/bootstrap/css/bootstrap-theme.css.map rename to content/bootstrap/css/bootstrap-theme.css.map diff --git a/html/bootstrap/css/bootstrap-theme.min.css b/content/bootstrap/css/bootstrap-theme.min.css similarity index 100% rename from html/bootstrap/css/bootstrap-theme.min.css rename to content/bootstrap/css/bootstrap-theme.min.css diff --git a/html/bootstrap/css/bootstrap.css b/content/bootstrap/css/bootstrap.css similarity index 100% rename from html/bootstrap/css/bootstrap.css rename to content/bootstrap/css/bootstrap.css diff --git a/html/bootstrap/css/bootstrap.css.map b/content/bootstrap/css/bootstrap.css.map similarity index 100% rename from html/bootstrap/css/bootstrap.css.map rename to content/bootstrap/css/bootstrap.css.map diff --git a/html/bootstrap/css/bootstrap.min.css b/content/bootstrap/css/bootstrap.min.css similarity index 100% rename from html/bootstrap/css/bootstrap.min.css rename to content/bootstrap/css/bootstrap.min.css diff --git a/html/bootstrap/fonts/glyphicons-halflings-regular.eot b/content/bootstrap/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from html/bootstrap/fonts/glyphicons-halflings-regular.eot rename to content/bootstrap/fonts/glyphicons-halflings-regular.eot diff --git a/html/bootstrap/fonts/glyphicons-halflings-regular.svg b/content/bootstrap/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from html/bootstrap/fonts/glyphicons-halflings-regular.svg rename to content/bootstrap/fonts/glyphicons-halflings-regular.svg diff --git a/html/bootstrap/fonts/glyphicons-halflings-regular.ttf b/content/bootstrap/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from html/bootstrap/fonts/glyphicons-halflings-regular.ttf rename to content/bootstrap/fonts/glyphicons-halflings-regular.ttf diff --git a/html/bootstrap/fonts/glyphicons-halflings-regular.woff b/content/bootstrap/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from html/bootstrap/fonts/glyphicons-halflings-regular.woff rename to content/bootstrap/fonts/glyphicons-halflings-regular.woff diff --git a/html/bootstrap/js/bootstrap.js b/content/bootstrap/js/bootstrap.js similarity index 100% rename from html/bootstrap/js/bootstrap.js rename to content/bootstrap/js/bootstrap.js diff --git a/html/bootstrap/js/bootstrap.min.js b/content/bootstrap/js/bootstrap.min.js similarity index 100% rename from html/bootstrap/js/bootstrap.min.js rename to content/bootstrap/js/bootstrap.min.js diff --git a/html/conduct.html b/content/conduct.html similarity index 100% rename from html/conduct.html rename to content/conduct.html diff --git a/html/docs/.htaccess b/content/docs/.htaccess similarity index 100% rename from html/docs/.htaccess rename to content/docs/.htaccess diff --git a/html/docs/30second.html b/content/docs/30second.html similarity index 100% rename from html/docs/30second.html rename to content/docs/30second.html diff --git a/html/docs/3rd-party.html b/content/docs/3rd-party.html similarity index 100% rename from html/docs/3rd-party.html rename to content/docs/3rd-party.html diff --git a/html/docs/advice.html b/content/docs/advice.html similarity index 100% rename from html/docs/advice.html rename to content/docs/advice.html diff --git a/html/docs/best-practices.html b/content/docs/best-practices.html similarity index 100% rename from html/docs/best-practices.html rename to content/docs/best-practices.html diff --git a/html/docs/branching.html b/content/docs/branching.html similarity index 100% rename from html/docs/branching.html rename to content/docs/branching.html diff --git a/html/docs/bugs.html b/content/docs/bugs.html similarity index 100% rename from html/docs/bugs.html rename to content/docs/bugs.html diff --git a/html/docs/build.html b/content/docs/build.html similarity index 100% rename from html/docs/build.html rename to content/docs/build.html diff --git a/html/docs/clog/actions.html b/content/docs/clog/actions.html similarity index 100% rename from html/docs/clog/actions.html rename to content/docs/clog/actions.html diff --git a/html/docs/clog/clone.html b/content/docs/clog/clone.html similarity index 100% rename from html/docs/clog/clone.html rename to content/docs/clog/clone.html diff --git a/html/docs/clog/color.html b/content/docs/clog/color.html similarity index 100% rename from html/docs/clog/color.html rename to content/docs/clog/color.html diff --git a/html/docs/clog/download.html b/content/docs/clog/download.html similarity index 100% rename from html/docs/clog/download.html rename to content/docs/clog/download.html diff --git a/html/docs/clog/example_apache.html b/content/docs/clog/example_apache.html similarity index 100% rename from html/docs/clog/example_apache.html rename to content/docs/clog/example_apache.html diff --git a/html/docs/clog/example_syslog.html b/content/docs/clog/example_syslog.html similarity index 100% rename from html/docs/clog/example_syslog.html rename to content/docs/clog/example_syslog.html diff --git a/html/docs/clog/help.html b/content/docs/clog/help.html similarity index 100% rename from html/docs/clog/help.html rename to content/docs/clog/help.html diff --git a/html/docs/clog/how.html b/content/docs/clog/how.html similarity index 100% rename from html/docs/clog/how.html rename to content/docs/clog/how.html diff --git a/html/docs/clog/images/action1.png b/content/docs/clog/images/action1.png similarity index 100% rename from html/docs/clog/images/action1.png rename to content/docs/clog/images/action1.png diff --git a/html/docs/clog/images/action2.png b/content/docs/clog/images/action2.png similarity index 100% rename from html/docs/clog/images/action2.png rename to content/docs/clog/images/action2.png diff --git a/html/docs/clog/images/action3.png b/content/docs/clog/images/action3.png similarity index 100% rename from html/docs/clog/images/action3.png rename to content/docs/clog/images/action3.png diff --git a/html/docs/clog/images/color1.png b/content/docs/clog/images/color1.png similarity index 100% rename from html/docs/clog/images/color1.png rename to content/docs/clog/images/color1.png diff --git a/html/docs/clog/images/color2.png b/content/docs/clog/images/color2.png similarity index 100% rename from html/docs/clog/images/color2.png rename to content/docs/clog/images/color2.png diff --git a/html/docs/clog/images/color3.png b/content/docs/clog/images/color3.png similarity index 100% rename from html/docs/clog/images/color3.png rename to content/docs/clog/images/color3.png diff --git a/html/docs/clog/images/color4.png b/content/docs/clog/images/color4.png similarity index 100% rename from html/docs/clog/images/color4.png rename to content/docs/clog/images/color4.png diff --git a/html/docs/clog/images/color5.png b/content/docs/clog/images/color5.png similarity index 100% rename from html/docs/clog/images/color5.png rename to content/docs/clog/images/color5.png diff --git a/html/docs/clog/images/option1.png b/content/docs/clog/images/option1.png similarity index 100% rename from html/docs/clog/images/option1.png rename to content/docs/clog/images/option1.png diff --git a/html/docs/clog/images/option2.png b/content/docs/clog/images/option2.png similarity index 100% rename from html/docs/clog/images/option2.png rename to content/docs/clog/images/option2.png diff --git a/html/docs/clog/images/option3.png b/content/docs/clog/images/option3.png similarity index 100% rename from html/docs/clog/images/option3.png rename to content/docs/clog/images/option3.png diff --git a/html/docs/clog/images/option4.png b/content/docs/clog/images/option4.png similarity index 100% rename from html/docs/clog/images/option4.png rename to content/docs/clog/images/option4.png diff --git a/html/docs/clog/images/option5.png b/content/docs/clog/images/option5.png similarity index 100% rename from html/docs/clog/images/option5.png rename to content/docs/clog/images/option5.png diff --git a/html/docs/clog/images/pattern1.png b/content/docs/clog/images/pattern1.png similarity index 100% rename from html/docs/clog/images/pattern1.png rename to content/docs/clog/images/pattern1.png diff --git a/html/docs/clog/images/pattern2.png b/content/docs/clog/images/pattern2.png similarity index 100% rename from html/docs/clog/images/pattern2.png rename to content/docs/clog/images/pattern2.png diff --git a/html/docs/clog/images/pattern3.png b/content/docs/clog/images/pattern3.png similarity index 100% rename from html/docs/clog/images/pattern3.png rename to content/docs/clog/images/pattern3.png diff --git a/html/docs/clog/images/section1.png b/content/docs/clog/images/section1.png similarity index 100% rename from html/docs/clog/images/section1.png rename to content/docs/clog/images/section1.png diff --git a/html/docs/clog/images/section2.png b/content/docs/clog/images/section2.png similarity index 100% rename from html/docs/clog/images/section2.png rename to content/docs/clog/images/section2.png diff --git a/html/docs/clog/images/section3.png b/content/docs/clog/images/section3.png similarity index 100% rename from html/docs/clog/images/section3.png rename to content/docs/clog/images/section3.png diff --git a/html/docs/clog/index.html b/content/docs/clog/index.html similarity index 100% rename from html/docs/clog/index.html rename to content/docs/clog/index.html diff --git a/html/docs/clog/options.html b/content/docs/clog/options.html similarity index 100% rename from html/docs/clog/options.html rename to content/docs/clog/options.html diff --git a/html/docs/clog/patterns.html b/content/docs/clog/patterns.html similarity index 100% rename from html/docs/clog/patterns.html rename to content/docs/clog/patterns.html diff --git a/html/docs/clog/sections.html b/content/docs/clog/sections.html similarity index 100% rename from html/docs/clog/sections.html rename to content/docs/clog/sections.html diff --git a/html/docs/clog/setup.html b/content/docs/clog/setup.html similarity index 100% rename from html/docs/clog/setup.html rename to content/docs/clog/setup.html diff --git a/html/docs/clog/syntax.html b/content/docs/clog/syntax.html similarity index 100% rename from html/docs/clog/syntax.html rename to content/docs/clog/syntax.html diff --git a/html/docs/clog/what.html b/content/docs/clog/what.html similarity index 100% rename from html/docs/clog/what.html rename to content/docs/clog/what.html diff --git a/html/docs/coding_style.html b/content/docs/coding_style.html similarity index 100% rename from html/docs/coding_style.html rename to content/docs/coding_style.html diff --git a/html/docs/commands/_get.html b/content/docs/commands/_get.html similarity index 100% rename from html/docs/commands/_get.html rename to content/docs/commands/_get.html diff --git a/html/docs/commands/_unique.html b/content/docs/commands/_unique.html similarity index 100% rename from html/docs/commands/_unique.html rename to content/docs/commands/_unique.html diff --git a/html/docs/commands/add.html b/content/docs/commands/add.html similarity index 100% rename from html/docs/commands/add.html rename to content/docs/commands/add.html diff --git a/html/docs/commands/append.html b/content/docs/commands/append.html similarity index 100% rename from html/docs/commands/append.html rename to content/docs/commands/append.html diff --git a/html/docs/commands/burndown.html b/content/docs/commands/burndown.html similarity index 100% rename from html/docs/commands/burndown.html rename to content/docs/commands/burndown.html diff --git a/html/docs/commands/calc.html b/content/docs/commands/calc.html similarity index 100% rename from html/docs/commands/calc.html rename to content/docs/commands/calc.html diff --git a/html/docs/commands/columns.html b/content/docs/commands/columns.html similarity index 100% rename from html/docs/commands/columns.html rename to content/docs/commands/columns.html diff --git a/html/docs/commands/count.html b/content/docs/commands/count.html similarity index 100% rename from html/docs/commands/count.html rename to content/docs/commands/count.html diff --git a/html/docs/commands/done.html b/content/docs/commands/done.html similarity index 100% rename from html/docs/commands/done.html rename to content/docs/commands/done.html diff --git a/html/docs/commands/export.html b/content/docs/commands/export.html similarity index 100% rename from html/docs/commands/export.html rename to content/docs/commands/export.html diff --git a/html/docs/commands/index.html b/content/docs/commands/index.html similarity index 100% rename from html/docs/commands/index.html rename to content/docs/commands/index.html diff --git a/html/docs/commands/info.html b/content/docs/commands/info.html similarity index 100% rename from html/docs/commands/info.html rename to content/docs/commands/info.html diff --git a/html/docs/commands/list.html b/content/docs/commands/list.html similarity index 100% rename from html/docs/commands/list.html rename to content/docs/commands/list.html diff --git a/html/docs/commands/log.html b/content/docs/commands/log.html similarity index 100% rename from html/docs/commands/log.html rename to content/docs/commands/log.html diff --git a/html/docs/commands/missing.html b/content/docs/commands/missing.html similarity index 100% rename from html/docs/commands/missing.html rename to content/docs/commands/missing.html diff --git a/html/docs/commands/modify.html b/content/docs/commands/modify.html similarity index 100% rename from html/docs/commands/modify.html rename to content/docs/commands/modify.html diff --git a/html/docs/commands/prepend.html b/content/docs/commands/prepend.html similarity index 100% rename from html/docs/commands/prepend.html rename to content/docs/commands/prepend.html diff --git a/html/docs/commands/synchronize.html b/content/docs/commands/synchronize.html similarity index 100% rename from html/docs/commands/synchronize.html rename to content/docs/commands/synchronize.html diff --git a/html/docs/commands/template.html b/content/docs/commands/template.html similarity index 100% rename from html/docs/commands/template.html rename to content/docs/commands/template.html diff --git a/html/docs/configuration.html b/content/docs/configuration.html similarity index 100% rename from html/docs/configuration.html rename to content/docs/configuration.html diff --git a/html/docs/context.html b/content/docs/context.html similarity index 100% rename from html/docs/context.html rename to content/docs/context.html diff --git a/html/docs/contribute.html b/content/docs/contribute.html similarity index 100% rename from html/docs/contribute.html rename to content/docs/contribute.html diff --git a/html/docs/dates.html b/content/docs/dates.html similarity index 100% rename from html/docs/dates.html rename to content/docs/dates.html diff --git a/html/docs/deprecated.html b/content/docs/deprecated.html similarity index 100% rename from html/docs/deprecated.html rename to content/docs/deprecated.html diff --git a/html/docs/design/cli.html b/content/docs/design/cli.html similarity index 100% rename from html/docs/design/cli.html rename to content/docs/design/cli.html diff --git a/html/docs/design/client.html b/content/docs/design/client.html similarity index 100% rename from html/docs/design/client.html rename to content/docs/design/client.html diff --git a/html/docs/design/dom.html b/content/docs/design/dom.html similarity index 100% rename from html/docs/design/dom.html rename to content/docs/design/dom.html diff --git a/html/docs/design/index.html b/content/docs/design/index.html similarity index 100% rename from html/docs/design/index.html rename to content/docs/design/index.html diff --git a/html/docs/design/plans.html b/content/docs/design/plans.html similarity index 100% rename from html/docs/design/plans.html rename to content/docs/design/plans.html diff --git a/html/docs/design/protocol.html b/content/docs/design/protocol.html similarity index 100% rename from html/docs/design/protocol.html rename to content/docs/design/protocol.html diff --git a/html/docs/design/recurrence.html b/content/docs/design/recurrence.html similarity index 100% rename from html/docs/design/recurrence.html rename to content/docs/design/recurrence.html diff --git a/html/docs/design/request.html b/content/docs/design/request.html similarity index 100% rename from html/docs/design/request.html rename to content/docs/design/request.html diff --git a/html/docs/design/rules.html b/content/docs/design/rules.html similarity index 100% rename from html/docs/design/rules.html rename to content/docs/design/rules.html diff --git a/html/docs/design/sync.html b/content/docs/design/sync.html similarity index 100% rename from html/docs/design/sync.html rename to content/docs/design/sync.html diff --git a/html/docs/design/task.html b/content/docs/design/task.html similarity index 100% rename from html/docs/design/task.html rename to content/docs/design/task.html diff --git a/html/docs/design/week.png b/content/docs/design/week.png similarity index 100% rename from html/docs/design/week.png rename to content/docs/design/week.png diff --git a/html/docs/design/workweek.html b/content/docs/design/workweek.html similarity index 100% rename from html/docs/design/workweek.html rename to content/docs/design/workweek.html diff --git a/html/docs/design/year.png b/content/docs/design/year.png similarity index 100% rename from html/docs/design/year.png rename to content/docs/design/year.png diff --git a/html/docs/docs.css b/content/docs/docs.css similarity index 100% rename from html/docs/docs.css rename to content/docs/docs.css diff --git a/html/docs/dom.html b/content/docs/dom.html similarity index 100% rename from html/docs/dom.html rename to content/docs/dom.html diff --git a/html/docs/durations.html b/content/docs/durations.html similarity index 100% rename from html/docs/durations.html rename to content/docs/durations.html diff --git a/html/docs/escapes.html b/content/docs/escapes.html similarity index 100% rename from html/docs/escapes.html rename to content/docs/escapes.html diff --git a/html/docs/examples.html b/content/docs/examples.html similarity index 100% rename from html/docs/examples.html rename to content/docs/examples.html diff --git a/html/docs/features.html b/content/docs/features.html similarity index 100% rename from html/docs/features.html rename to content/docs/features.html diff --git a/html/docs/filter.html b/content/docs/filter.html similarity index 100% rename from html/docs/filter.html rename to content/docs/filter.html diff --git a/html/docs/first_time.html b/content/docs/first_time.html similarity index 100% rename from html/docs/first_time.html rename to content/docs/first_time.html diff --git a/html/docs/help.html b/content/docs/help.html similarity index 100% rename from html/docs/help.html rename to content/docs/help.html diff --git a/html/docs/history.html b/content/docs/history.html similarity index 100% rename from html/docs/history.html rename to content/docs/history.html diff --git a/html/docs/history_td.html b/content/docs/history_td.html similarity index 100% rename from html/docs/history_td.html rename to content/docs/history_td.html diff --git a/html/docs/hooks.html b/content/docs/hooks.html similarity index 100% rename from html/docs/hooks.html rename to content/docs/hooks.html diff --git a/html/docs/hooks2.html b/content/docs/hooks2.html similarity index 100% rename from html/docs/hooks2.html rename to content/docs/hooks2.html diff --git a/html/docs/hooks_guide.html b/content/docs/hooks_guide.html similarity index 100% rename from html/docs/hooks_guide.html rename to content/docs/hooks_guide.html diff --git a/html/docs/ids.html b/content/docs/ids.html similarity index 100% rename from html/docs/ids.html rename to content/docs/ids.html diff --git a/html/docs/images/completion.png b/content/docs/images/completion.png similarity index 100% rename from html/docs/images/completion.png rename to content/docs/images/completion.png diff --git a/html/docs/images/dark-16.png b/content/docs/images/dark-16.png similarity index 100% rename from html/docs/images/dark-16.png rename to content/docs/images/dark-16.png diff --git a/html/docs/images/dark-256.png b/content/docs/images/dark-256.png similarity index 100% rename from html/docs/images/dark-256.png rename to content/docs/images/dark-256.png diff --git a/html/docs/images/dark-blue-256.png b/content/docs/images/dark-blue-256.png similarity index 100% rename from html/docs/images/dark-blue-256.png rename to content/docs/images/dark-blue-256.png diff --git a/html/docs/images/dark-gray-256.png b/content/docs/images/dark-gray-256.png similarity index 100% rename from html/docs/images/dark-gray-256.png rename to content/docs/images/dark-gray-256.png diff --git a/html/docs/images/dark-gray-blue-256.png b/content/docs/images/dark-gray-blue-256.png similarity index 100% rename from html/docs/images/dark-gray-blue-256.png rename to content/docs/images/dark-gray-blue-256.png diff --git a/html/docs/images/dark-green-256.png b/content/docs/images/dark-green-256.png similarity index 100% rename from html/docs/images/dark-green-256.png rename to content/docs/images/dark-green-256.png diff --git a/html/docs/images/dark-red-256.png b/content/docs/images/dark-red-256.png similarity index 100% rename from html/docs/images/dark-red-256.png rename to content/docs/images/dark-red-256.png diff --git a/html/docs/images/dark-violets-256.png b/content/docs/images/dark-violets-256.png similarity index 100% rename from html/docs/images/dark-violets-256.png rename to content/docs/images/dark-violets-256.png diff --git a/html/docs/images/dark-yellow-green-256.png b/content/docs/images/dark-yellow-green-256.png similarity index 100% rename from html/docs/images/dark-yellow-green-256.png rename to content/docs/images/dark-yellow-green-256.png diff --git a/html/docs/images/day8.png b/content/docs/images/day8.png similarity index 100% rename from html/docs/images/day8.png rename to content/docs/images/day8.png diff --git a/html/docs/images/dev.png b/content/docs/images/dev.png similarity index 100% rename from html/docs/images/dev.png rename to content/docs/images/dev.png diff --git a/html/docs/images/dev2.png b/content/docs/images/dev2.png similarity index 100% rename from html/docs/images/dev2.png rename to content/docs/images/dev2.png diff --git a/html/docs/images/filter.png b/content/docs/images/filter.png similarity index 100% rename from html/docs/images/filter.png rename to content/docs/images/filter.png diff --git a/html/docs/images/fixrate.png b/content/docs/images/fixrate.png similarity index 100% rename from html/docs/images/fixrate.png rename to content/docs/images/fixrate.png diff --git a/html/docs/images/light-16.png b/content/docs/images/light-16.png similarity index 100% rename from html/docs/images/light-16.png rename to content/docs/images/light-16.png diff --git a/html/docs/images/light-256.png b/content/docs/images/light-256.png similarity index 100% rename from html/docs/images/light-256.png rename to content/docs/images/light-256.png diff --git a/html/docs/images/master.png b/content/docs/images/master.png similarity index 100% rename from html/docs/images/master.png rename to content/docs/images/master.png diff --git a/html/docs/images/miscellaneous.png b/content/docs/images/miscellaneous.png similarity index 100% rename from html/docs/images/miscellaneous.png rename to content/docs/images/miscellaneous.png diff --git a/html/docs/images/modification.png b/content/docs/images/modification.png similarity index 100% rename from html/docs/images/modification.png rename to content/docs/images/modification.png diff --git a/html/docs/images/nofixrate.png b/content/docs/images/nofixrate.png similarity index 100% rename from html/docs/images/nofixrate.png rename to content/docs/images/nofixrate.png diff --git a/html/docs/images/obfuscate.png b/content/docs/images/obfuscate.png similarity index 100% rename from html/docs/images/obfuscate.png rename to content/docs/images/obfuscate.png diff --git a/html/docs/images/override.png b/content/docs/images/override.png similarity index 100% rename from html/docs/images/override.png rename to content/docs/images/override.png diff --git a/html/docs/images/release.png b/content/docs/images/release.png similarity index 100% rename from html/docs/images/release.png rename to content/docs/images/release.png diff --git a/html/docs/images/solarized-dark-256.png b/content/docs/images/solarized-dark-256.png similarity index 100% rename from html/docs/images/solarized-dark-256.png rename to content/docs/images/solarized-dark-256.png diff --git a/html/docs/images/solarized-light-256.png b/content/docs/images/solarized-light-256.png similarity index 100% rename from html/docs/images/solarized-light-256.png rename to content/docs/images/solarized-light-256.png diff --git a/html/docs/images/syntax.png b/content/docs/images/syntax.png similarity index 100% rename from html/docs/images/syntax.png rename to content/docs/images/syntax.png diff --git a/html/docs/images/syntaxes.png b/content/docs/images/syntaxes.png similarity index 100% rename from html/docs/images/syntaxes.png rename to content/docs/images/syntaxes.png diff --git a/html/docs/images/topic.png b/content/docs/images/topic.png similarity index 100% rename from html/docs/images/topic.png rename to content/docs/images/topic.png diff --git a/html/docs/index.html b/content/docs/index.html similarity index 100% rename from html/docs/index.html rename to content/docs/index.html diff --git a/html/docs/introduction.html b/content/docs/introduction.html similarity index 100% rename from html/docs/introduction.html rename to content/docs/introduction.html diff --git a/html/docs/jobs.html b/content/docs/jobs.html similarity index 100% rename from html/docs/jobs.html rename to content/docs/jobs.html diff --git a/html/docs/license.html b/content/docs/license.html similarity index 100% rename from html/docs/license.html rename to content/docs/license.html diff --git a/html/docs/named_dates.html b/content/docs/named_dates.html similarity index 100% rename from html/docs/named_dates.html rename to content/docs/named_dates.html diff --git a/html/docs/philosophy.html b/content/docs/philosophy.html similarity index 100% rename from html/docs/philosophy.html rename to content/docs/philosophy.html diff --git a/html/docs/priority.html b/content/docs/priority.html similarity index 100% rename from html/docs/priority.html rename to content/docs/priority.html diff --git a/html/docs/recurrence.html b/content/docs/recurrence.html similarity index 100% rename from html/docs/recurrence.html rename to content/docs/recurrence.html diff --git a/html/docs/report.html b/content/docs/report.html similarity index 100% rename from html/docs/report.html rename to content/docs/report.html diff --git a/html/docs/review.html b/content/docs/review.html similarity index 100% rename from html/docs/review.html rename to content/docs/review.html diff --git a/html/docs/searching.html b/content/docs/searching.html similarity index 100% rename from html/docs/searching.html rename to content/docs/searching.html diff --git a/html/docs/start.html b/content/docs/start.html similarity index 100% rename from html/docs/start.html rename to content/docs/start.html diff --git a/html/docs/syntax.html b/content/docs/syntax.html similarity index 100% rename from html/docs/syntax.html rename to content/docs/syntax.html diff --git a/html/docs/tags.html b/content/docs/tags.html similarity index 100% rename from html/docs/tags.html rename to content/docs/tags.html diff --git a/html/docs/taskserver/ciphers.html b/content/docs/taskserver/ciphers.html similarity index 100% rename from html/docs/taskserver/ciphers.html rename to content/docs/taskserver/ciphers.html diff --git a/html/docs/taskserver/configure.html b/content/docs/taskserver/configure.html similarity index 100% rename from html/docs/taskserver/configure.html rename to content/docs/taskserver/configure.html diff --git a/html/docs/taskserver/control.html b/content/docs/taskserver/control.html similarity index 100% rename from html/docs/taskserver/control.html rename to content/docs/taskserver/control.html diff --git a/html/docs/taskserver/git.html b/content/docs/taskserver/git.html similarity index 100% rename from html/docs/taskserver/git.html rename to content/docs/taskserver/git.html diff --git a/html/docs/taskserver/package.html b/content/docs/taskserver/package.html similarity index 100% rename from html/docs/taskserver/package.html rename to content/docs/taskserver/package.html diff --git a/html/docs/taskserver/prep.html b/content/docs/taskserver/prep.html similarity index 100% rename from html/docs/taskserver/prep.html rename to content/docs/taskserver/prep.html diff --git a/html/docs/taskserver/protocol.html b/content/docs/taskserver/protocol.html similarity index 100% rename from html/docs/taskserver/protocol.html rename to content/docs/taskserver/protocol.html diff --git a/html/docs/taskserver/setup.html b/content/docs/taskserver/setup.html similarity index 100% rename from html/docs/taskserver/setup.html rename to content/docs/taskserver/setup.html diff --git a/html/docs/taskserver/sync.html b/content/docs/taskserver/sync.html similarity index 100% rename from html/docs/taskserver/sync.html rename to content/docs/taskserver/sync.html diff --git a/html/docs/taskserver/tarball.html b/content/docs/taskserver/tarball.html similarity index 100% rename from html/docs/taskserver/tarball.html rename to content/docs/taskserver/tarball.html diff --git a/html/docs/taskserver/taskwarrior.html b/content/docs/taskserver/taskwarrior.html similarity index 100% rename from html/docs/taskserver/taskwarrior.html rename to content/docs/taskserver/taskwarrior.html diff --git a/html/docs/taskserver/troubleshooting-sync.html b/content/docs/taskserver/troubleshooting-sync.html similarity index 100% rename from html/docs/taskserver/troubleshooting-sync.html rename to content/docs/taskserver/troubleshooting-sync.html diff --git a/html/docs/taskserver/upgrade.html b/content/docs/taskserver/upgrade.html similarity index 100% rename from html/docs/taskserver/upgrade.html rename to content/docs/taskserver/upgrade.html diff --git a/html/docs/taskserver/user.html b/content/docs/taskserver/user.html similarity index 100% rename from html/docs/taskserver/user.html rename to content/docs/taskserver/user.html diff --git a/html/docs/taskserver/why.html b/content/docs/taskserver/why.html similarity index 100% rename from html/docs/taskserver/why.html rename to content/docs/taskserver/why.html diff --git a/html/docs/template.html b/content/docs/template.html similarity index 100% rename from html/docs/template.html rename to content/docs/template.html diff --git a/html/docs/terminology.html b/content/docs/terminology.html similarity index 100% rename from html/docs/terminology.html rename to content/docs/terminology.html diff --git a/html/docs/themes.html b/content/docs/themes.html similarity index 100% rename from html/docs/themes.html rename to content/docs/themes.html diff --git a/html/docs/triage.html b/content/docs/triage.html similarity index 100% rename from html/docs/triage.html rename to content/docs/triage.html diff --git a/html/docs/udas.html b/content/docs/udas.html similarity index 100% rename from html/docs/udas.html rename to content/docs/udas.html diff --git a/html/docs/unicode.html b/content/docs/unicode.html similarity index 100% rename from html/docs/unicode.html rename to content/docs/unicode.html diff --git a/html/docs/urgency.html b/content/docs/urgency.html similarity index 100% rename from html/docs/urgency.html rename to content/docs/urgency.html diff --git a/html/docs/using_dates.html b/content/docs/using_dates.html similarity index 100% rename from html/docs/using_dates.html rename to content/docs/using_dates.html diff --git a/html/docs/verbosity.html b/content/docs/verbosity.html similarity index 100% rename from html/docs/verbosity.html rename to content/docs/verbosity.html diff --git a/html/docs/workflow.html b/content/docs/workflow.html similarity index 100% rename from html/docs/workflow.html rename to content/docs/workflow.html diff --git a/html/download/clog-1.1.0.tar.gz b/content/download/clog-1.1.0.tar.gz similarity index 100% rename from html/download/clog-1.1.0.tar.gz rename to content/download/clog-1.1.0.tar.gz diff --git a/html/download/export-csv.pl b/content/download/export-csv.pl similarity index 100% rename from html/download/export-csv.pl rename to content/download/export-csv.pl diff --git a/html/download/export-html.pl b/content/download/export-html.pl similarity index 100% rename from html/download/export-html.pl rename to content/download/export-html.pl diff --git a/html/download/export-ical.pl b/content/download/export-ical.pl similarity index 100% rename from html/download/export-ical.pl rename to content/download/export-ical.pl diff --git a/html/download/export-sql.py b/content/download/export-sql.py similarity index 100% rename from html/download/export-sql.py rename to content/download/export-sql.py diff --git a/html/download/export-tsv.pl b/content/download/export-tsv.pl similarity index 100% rename from html/download/export-tsv.pl rename to content/download/export-tsv.pl diff --git a/html/download/export-xml.pl b/content/download/export-xml.pl similarity index 100% rename from html/download/export-xml.pl rename to content/download/export-xml.pl diff --git a/html/download/export-xml.py b/content/download/export-xml.py similarity index 100% rename from html/download/export-xml.py rename to content/download/export-xml.py diff --git a/html/download/export-xml.rb b/content/download/export-xml.rb similarity index 100% rename from html/download/export-xml.rb rename to content/download/export-xml.rb diff --git a/html/download/export-yad.pl b/content/download/export-yad.pl similarity index 100% rename from html/download/export-yad.pl rename to content/download/export-yad.pl diff --git a/html/download/export-yaml.pl b/content/download/export-yaml.pl similarity index 100% rename from html/download/export-yaml.pl rename to content/download/export-yaml.pl diff --git a/html/download/gtdnext.sh b/content/download/gtdnext.sh similarity index 100% rename from html/download/gtdnext.sh rename to content/download/gtdnext.sh diff --git a/html/download/import-todo.sh.pl b/content/download/import-todo.sh.pl similarity index 100% rename from html/download/import-todo.sh.pl rename to content/download/import-todo.sh.pl diff --git a/html/download/import-yaml.pl b/content/download/import-yaml.pl similarity index 100% rename from html/download/import-yaml.pl rename to content/download/import-yaml.pl diff --git a/html/download/index.html b/content/download/index.html similarity index 100% rename from html/download/index.html rename to content/download/index.html diff --git a/html/download/logo.tar.gz b/content/download/logo.tar.gz similarity index 100% rename from html/download/logo.tar.gz rename to content/download/logo.tar.gz diff --git a/html/download/on-modify.timetrack.pl b/content/download/on-modify.timetrack.pl similarity index 100% rename from html/download/on-modify.timetrack.pl rename to content/download/on-modify.timetrack.pl diff --git a/html/download/task-2.3.0.ref.pdf b/content/download/task-2.3.0.ref.pdf similarity index 100% rename from html/download/task-2.3.0.ref.pdf rename to content/download/task-2.3.0.ref.pdf diff --git a/html/download/task-2.3.0.tar.gz b/content/download/task-2.3.0.tar.gz similarity index 100% rename from html/download/task-2.3.0.tar.gz rename to content/download/task-2.3.0.tar.gz diff --git a/html/download/task-2.4.0.ref.pdf b/content/download/task-2.4.0.ref.pdf similarity index 100% rename from html/download/task-2.4.0.ref.pdf rename to content/download/task-2.4.0.ref.pdf diff --git a/html/download/task-2.4.0.tar.gz b/content/download/task-2.4.0.tar.gz similarity index 100% rename from html/download/task-2.4.0.tar.gz rename to content/download/task-2.4.0.tar.gz diff --git a/html/download/task-2.4.1.ref.pdf b/content/download/task-2.4.1.ref.pdf similarity index 100% rename from html/download/task-2.4.1.ref.pdf rename to content/download/task-2.4.1.ref.pdf diff --git a/html/download/task-2.4.1.tar.gz b/content/download/task-2.4.1.tar.gz similarity index 100% rename from html/download/task-2.4.1.tar.gz rename to content/download/task-2.4.1.tar.gz diff --git a/html/download/task-2.4.2.ref.pdf b/content/download/task-2.4.2.ref.pdf similarity index 100% rename from html/download/task-2.4.2.ref.pdf rename to content/download/task-2.4.2.ref.pdf diff --git a/html/download/task-2.4.2.tar.gz b/content/download/task-2.4.2.tar.gz similarity index 100% rename from html/download/task-2.4.2.tar.gz rename to content/download/task-2.4.2.tar.gz diff --git a/html/download/task-2.4.3.ref.pdf b/content/download/task-2.4.3.ref.pdf similarity index 100% rename from html/download/task-2.4.3.ref.pdf rename to content/download/task-2.4.3.ref.pdf diff --git a/html/download/task-2.4.3.tar.gz b/content/download/task-2.4.3.tar.gz similarity index 100% rename from html/download/task-2.4.3.tar.gz rename to content/download/task-2.4.3.tar.gz diff --git a/html/download/task-2.4.4.ref.pdf b/content/download/task-2.4.4.ref.pdf similarity index 100% rename from html/download/task-2.4.4.ref.pdf rename to content/download/task-2.4.4.ref.pdf diff --git a/html/download/task-2.4.4.tar.gz b/content/download/task-2.4.4.tar.gz similarity index 100% rename from html/download/task-2.4.4.tar.gz rename to content/download/task-2.4.4.tar.gz diff --git a/html/download/task-2.5.0.ref.pdf b/content/download/task-2.5.0.ref.pdf similarity index 100% rename from html/download/task-2.5.0.ref.pdf rename to content/download/task-2.5.0.ref.pdf diff --git a/html/download/task-2.5.0.tar.gz b/content/download/task-2.5.0.tar.gz similarity index 100% rename from html/download/task-2.5.0.tar.gz rename to content/download/task-2.5.0.tar.gz diff --git a/html/download/task-2.5.1.ref.pdf b/content/download/task-2.5.1.ref.pdf similarity index 100% rename from html/download/task-2.5.1.ref.pdf rename to content/download/task-2.5.1.ref.pdf diff --git a/html/download/task-2.5.1.tar.gz b/content/download/task-2.5.1.tar.gz similarity index 100% rename from html/download/task-2.5.1.tar.gz rename to content/download/task-2.5.1.tar.gz diff --git a/html/download/task-2.5.3.ref.pdf b/content/download/task-2.5.3.ref.pdf similarity index 100% rename from html/download/task-2.5.3.ref.pdf rename to content/download/task-2.5.3.ref.pdf diff --git a/html/download/task-2.5.3.tar.gz b/content/download/task-2.5.3.tar.gz similarity index 100% rename from html/download/task-2.5.3.tar.gz rename to content/download/task-2.5.3.tar.gz diff --git a/html/download/task-2.6.0.tar.gz b/content/download/task-2.6.0.tar.gz similarity index 100% rename from html/download/task-2.6.0.tar.gz rename to content/download/task-2.6.0.tar.gz diff --git a/html/download/task-2.6.1.tar.gz b/content/download/task-2.6.1.tar.gz similarity index 100% rename from html/download/task-2.6.1.tar.gz rename to content/download/task-2.6.1.tar.gz diff --git a/html/download/task-2.6.2.tar.gz b/content/download/task-2.6.2.tar.gz similarity index 100% rename from html/download/task-2.6.2.tar.gz rename to content/download/task-2.6.2.tar.gz diff --git a/html/download/task-latest.ref.pdf b/content/download/task-latest.ref.pdf similarity index 100% rename from html/download/task-latest.ref.pdf rename to content/download/task-latest.ref.pdf diff --git a/html/download/task-latest.tar.gz b/content/download/task-latest.tar.gz similarity index 100% rename from html/download/task-latest.tar.gz rename to content/download/task-latest.tar.gz diff --git a/html/download/taskd-1.0.0.tar.gz b/content/download/taskd-1.0.0.tar.gz similarity index 100% rename from html/download/taskd-1.0.0.tar.gz rename to content/download/taskd-1.0.0.tar.gz diff --git a/html/download/taskd-1.1.0.tar.gz b/content/download/taskd-1.1.0.tar.gz similarity index 100% rename from html/download/taskd-1.1.0.tar.gz rename to content/download/taskd-1.1.0.tar.gz diff --git a/html/download/taskd-latest.tar.gz b/content/download/taskd-latest.tar.gz similarity index 100% rename from html/download/taskd-latest.tar.gz rename to content/download/taskd-latest.tar.gz diff --git a/html/download/tasksh-1.0.0.tar.gz b/content/download/tasksh-1.0.0.tar.gz similarity index 100% rename from html/download/tasksh-1.0.0.tar.gz rename to content/download/tasksh-1.0.0.tar.gz diff --git a/html/download/tasksh-1.1.0.tar.gz b/content/download/tasksh-1.1.0.tar.gz similarity index 100% rename from html/download/tasksh-1.1.0.tar.gz rename to content/download/tasksh-1.1.0.tar.gz diff --git a/html/download/tasksh-1.2.0.tar.gz b/content/download/tasksh-1.2.0.tar.gz similarity index 100% rename from html/download/tasksh-1.2.0.tar.gz rename to content/download/tasksh-1.2.0.tar.gz diff --git a/html/download/tasksh-latest.tar.gz b/content/download/tasksh-latest.tar.gz similarity index 100% rename from html/download/tasksh-latest.tar.gz rename to content/download/tasksh-latest.tar.gz diff --git a/html/download/timew-1.0.0.tar.gz b/content/download/timew-1.0.0.tar.gz similarity index 100% rename from html/download/timew-1.0.0.tar.gz rename to content/download/timew-1.0.0.tar.gz diff --git a/html/download/timew-1.1.0.tar.gz b/content/download/timew-1.1.0.tar.gz similarity index 100% rename from html/download/timew-1.1.0.tar.gz rename to content/download/timew-1.1.0.tar.gz diff --git a/html/download/timew-1.1.1.tar.gz b/content/download/timew-1.1.1.tar.gz similarity index 100% rename from html/download/timew-1.1.1.tar.gz rename to content/download/timew-1.1.1.tar.gz diff --git a/html/download/timew-dbcorrection.py b/content/download/timew-dbcorrection.py similarity index 100% rename from html/download/timew-dbcorrection.py rename to content/download/timew-dbcorrection.py diff --git a/html/download/timew-latest.tar.gz b/content/download/timew-latest.tar.gz similarity index 100% rename from html/download/timew-latest.tar.gz rename to content/download/timew-latest.tar.gz diff --git a/html/download/tw-ubcde11.pdf b/content/download/tw-ubcde11.pdf similarity index 100% rename from html/download/tw-ubcde11.pdf rename to content/download/tw-ubcde11.pdf diff --git a/html/download/vit-1.1.tar.gz b/content/download/vit-1.1.tar.gz similarity index 100% rename from html/download/vit-1.1.tar.gz rename to content/download/vit-1.1.tar.gz diff --git a/html/download/vit-1.2.tar.gz b/content/download/vit-1.2.tar.gz similarity index 100% rename from html/download/vit-1.2.tar.gz rename to content/download/vit-1.2.tar.gz diff --git a/html/download/vit-latest.tar.gz b/content/download/vit-latest.tar.gz similarity index 100% rename from html/download/vit-latest.tar.gz rename to content/download/vit-latest.tar.gz diff --git a/html/download/vramsteg-1.0.1.tar.gz b/content/download/vramsteg-1.0.1.tar.gz similarity index 100% rename from html/download/vramsteg-1.0.1.tar.gz rename to content/download/vramsteg-1.0.1.tar.gz diff --git a/html/feed.rss b/content/feed.rss similarity index 100% rename from html/feed.rss rename to content/feed.rss diff --git a/html/images/digitalocean.png b/content/images/digitalocean.png similarity index 100% rename from html/images/digitalocean.png rename to content/images/digitalocean.png diff --git a/html/images/dnsimple.png b/content/images/dnsimple.png similarity index 100% rename from html/images/dnsimple.png rename to content/images/dnsimple.png diff --git a/html/images/email_dark.png b/content/images/email_dark.png similarity index 100% rename from html/images/email_dark.png rename to content/images/email_dark.png diff --git a/html/images/favicon.ico b/content/images/favicon.ico similarity index 100% rename from html/images/favicon.ico rename to content/images/favicon.ico diff --git a/html/images/flattr_logo_16.png b/content/images/flattr_logo_16.png similarity index 100% rename from html/images/flattr_logo_16.png rename to content/images/flattr_logo_16.png diff --git a/html/images/flod-s.png b/content/images/flod-s.png similarity index 100% rename from html/images/flod-s.png rename to content/images/flod-s.png diff --git a/html/images/gbf.png b/content/images/gbf.png similarity index 100% rename from html/images/gbf.png rename to content/images/gbf.png diff --git a/html/images/logoAtlassianPNG.png b/content/images/logoAtlassianPNG.png similarity index 100% rename from html/images/logoAtlassianPNG.png rename to content/images/logoAtlassianPNG.png diff --git a/html/images/paypal.jpg b/content/images/paypal.jpg similarity index 100% rename from html/images/paypal.jpg rename to content/images/paypal.jpg diff --git a/html/images/pingdom3.png b/content/images/pingdom3.png similarity index 100% rename from html/images/pingdom3.png rename to content/images/pingdom3.png diff --git a/html/images/rackspace.png b/content/images/rackspace.png similarity index 100% rename from html/images/rackspace.png rename to content/images/rackspace.png diff --git a/html/images/rss.gif b/content/images/rss.gif similarity index 100% rename from html/images/rss.gif rename to content/images/rss.gif diff --git a/html/images/statuspage.png b/content/images/statuspage.png similarity index 100% rename from html/images/statuspage.png rename to content/images/statuspage.png diff --git a/html/images/swatch.png b/content/images/swatch.png similarity index 100% rename from html/images/swatch.png rename to content/images/swatch.png diff --git a/html/images/tw-m.png b/content/images/tw-m.png similarity index 100% rename from html/images/tw-m.png rename to content/images/tw-m.png diff --git a/html/images/tw-s.png b/content/images/tw-s.png similarity index 100% rename from html/images/tw-s.png rename to content/images/tw-s.png diff --git a/html/images/twitter_dark.png b/content/images/twitter_dark.png similarity index 100% rename from html/images/twitter_dark.png rename to content/images/twitter_dark.png diff --git a/html/images/wordpress.png b/content/images/wordpress.png similarity index 100% rename from html/images/wordpress.png rename to content/images/wordpress.png diff --git a/html/index.html b/content/index.html similarity index 100% rename from html/index.html rename to content/index.html diff --git a/html/news/images/answers.png b/content/news/images/answers.png similarity index 100% rename from html/news/images/answers.png rename to content/news/images/answers.png diff --git a/html/news/images/central.png b/content/news/images/central.png similarity index 100% rename from html/news/images/central.png rename to content/news/images/central.png diff --git a/html/news/images/fish.gif b/content/news/images/fish.gif similarity index 100% rename from html/news/images/fish.gif rename to content/news/images/fish.gif diff --git a/html/news/images/froscon.jpg b/content/news/images/froscon.jpg similarity index 100% rename from html/news/images/froscon.jpg rename to content/news/images/froscon.jpg diff --git a/html/news/images/hellotux.gif b/content/news/images/hellotux.gif similarity index 100% rename from html/news/images/hellotux.gif rename to content/news/images/hellotux.gif diff --git a/html/news/images/iso_date.png b/content/news/images/iso_date.png similarity index 100% rename from html/news/images/iso_date.png rename to content/news/images/iso_date.png diff --git a/html/news/images/live_demo-thumb.png b/content/news/images/live_demo-thumb.png similarity index 100% rename from html/news/images/live_demo-thumb.png rename to content/news/images/live_demo-thumb.png diff --git a/html/news/images/live_demo.png b/content/news/images/live_demo.png similarity index 100% rename from html/news/images/live_demo.png rename to content/news/images/live_demo.png diff --git a/html/news/images/meetup.jpg b/content/news/images/meetup.jpg similarity index 100% rename from html/news/images/meetup.jpg rename to content/news/images/meetup.jpg diff --git a/html/news/images/perbacco.png b/content/news/images/perbacco.png similarity index 100% rename from html/news/images/perbacco.png rename to content/news/images/perbacco.png diff --git a/html/news/images/qanda.png b/content/news/images/qanda.png similarity index 100% rename from html/news/images/qanda.png rename to content/news/images/qanda.png diff --git a/html/news/images/ref230-thumb.png b/content/news/images/ref230-thumb.png similarity index 100% rename from html/news/images/ref230-thumb.png rename to content/news/images/ref230-thumb.png diff --git a/html/news/images/ref230.png b/content/news/images/ref230.png similarity index 100% rename from html/news/images/ref230.png rename to content/news/images/ref230.png diff --git a/html/news/images/shirt.png b/content/news/images/shirt.png similarity index 100% rename from html/news/images/shirt.png rename to content/news/images/shirt.png diff --git a/html/news/images/sort.png b/content/news/images/sort.png similarity index 100% rename from html/news/images/sort.png rename to content/news/images/sort.png diff --git a/html/news/images/tasksh.png b/content/news/images/tasksh.png similarity index 100% rename from html/news/images/tasksh.png rename to content/news/images/tasksh.png diff --git a/html/news/images/ti.png b/content/news/images/ti.png similarity index 100% rename from html/news/images/ti.png rename to content/news/images/ti.png diff --git a/html/news/images/tng.png b/content/news/images/tng.png similarity index 100% rename from html/news/images/tng.png rename to content/news/images/tng.png diff --git a/html/news/images/tw.png b/content/news/images/tw.png similarity index 100% rename from html/news/images/tw.png rename to content/news/images/tw.png diff --git a/html/news/images/twa1.png b/content/news/images/twa1.png similarity index 100% rename from html/news/images/twa1.png rename to content/news/images/twa1.png diff --git a/html/news/images/twa2.png b/content/news/images/twa2.png similarity index 100% rename from html/news/images/twa2.png rename to content/news/images/twa2.png diff --git a/html/news/images/twa3.png b/content/news/images/twa3.png similarity index 100% rename from html/news/images/twa3.png rename to content/news/images/twa3.png diff --git a/html/news/images/twa4.png b/content/news/images/twa4.png similarity index 100% rename from html/news/images/twa4.png rename to content/news/images/twa4.png diff --git a/html/news/images/twa5.png b/content/news/images/twa5.png similarity index 100% rename from html/news/images/twa5.png rename to content/news/images/twa5.png diff --git a/html/news/images/win10-thumb.png b/content/news/images/win10-thumb.png similarity index 100% rename from html/news/images/win10-thumb.png rename to content/news/images/win10-thumb.png diff --git a/html/news/images/win10.png b/content/news/images/win10.png similarity index 100% rename from html/news/images/win10.png rename to content/news/images/win10.png diff --git a/html/news/index.html b/content/news/index.html similarity index 100% rename from html/news/index.html rename to content/news/index.html diff --git a/html/news/news.20140212.html b/content/news/news.20140212.html similarity index 100% rename from html/news/news.20140212.html rename to content/news/news.20140212.html diff --git a/html/news/news.20140217.html b/content/news/news.20140217.html similarity index 100% rename from html/news/news.20140217.html rename to content/news/news.20140217.html diff --git a/html/news/news.20140220.html b/content/news/news.20140220.html similarity index 100% rename from html/news/news.20140220.html rename to content/news/news.20140220.html diff --git a/html/news/news.20140226.html b/content/news/news.20140226.html similarity index 100% rename from html/news/news.20140226.html rename to content/news/news.20140226.html diff --git a/html/news/news.20140227.html b/content/news/news.20140227.html similarity index 100% rename from html/news/news.20140227.html rename to content/news/news.20140227.html diff --git a/html/news/news.20140303.html b/content/news/news.20140303.html similarity index 100% rename from html/news/news.20140303.html rename to content/news/news.20140303.html diff --git a/html/news/news.20140309.html b/content/news/news.20140309.html similarity index 100% rename from html/news/news.20140309.html rename to content/news/news.20140309.html diff --git a/html/news/news.20140406.html b/content/news/news.20140406.html similarity index 100% rename from html/news/news.20140406.html rename to content/news/news.20140406.html diff --git a/html/news/news.20140407.html b/content/news/news.20140407.html similarity index 100% rename from html/news/news.20140407.html rename to content/news/news.20140407.html diff --git a/html/news/news.20140412.html b/content/news/news.20140412.html similarity index 100% rename from html/news/news.20140412.html rename to content/news/news.20140412.html diff --git a/html/news/news.20140429.html b/content/news/news.20140429.html similarity index 100% rename from html/news/news.20140429.html rename to content/news/news.20140429.html diff --git a/html/news/news.20140510.html b/content/news/news.20140510.html similarity index 100% rename from html/news/news.20140510.html rename to content/news/news.20140510.html diff --git a/html/news/news.20140524.html b/content/news/news.20140524.html similarity index 100% rename from html/news/news.20140524.html rename to content/news/news.20140524.html diff --git a/html/news/news.20140607.html b/content/news/news.20140607.html similarity index 100% rename from html/news/news.20140607.html rename to content/news/news.20140607.html diff --git a/html/news/news.20140704.html b/content/news/news.20140704.html similarity index 100% rename from html/news/news.20140704.html rename to content/news/news.20140704.html diff --git a/html/news/news.20140816.html b/content/news/news.20140816.html similarity index 100% rename from html/news/news.20140816.html rename to content/news/news.20140816.html diff --git a/html/news/news.20140906.html b/content/news/news.20140906.html similarity index 100% rename from html/news/news.20140906.html rename to content/news/news.20140906.html diff --git a/html/news/news.20140915.html b/content/news/news.20140915.html similarity index 100% rename from html/news/news.20140915.html rename to content/news/news.20140915.html diff --git a/html/news/news.20140928.html b/content/news/news.20140928.html similarity index 100% rename from html/news/news.20140928.html rename to content/news/news.20140928.html diff --git a/html/news/news.20141011.html b/content/news/news.20141011.html similarity index 100% rename from html/news/news.20141011.html rename to content/news/news.20141011.html diff --git a/html/news/news.20141025.html b/content/news/news.20141025.html similarity index 100% rename from html/news/news.20141025.html rename to content/news/news.20141025.html diff --git a/html/news/news.20141111.html b/content/news/news.20141111.html similarity index 100% rename from html/news/news.20141111.html rename to content/news/news.20141111.html diff --git a/html/news/news.20141221.html b/content/news/news.20141221.html similarity index 100% rename from html/news/news.20141221.html rename to content/news/news.20141221.html diff --git a/html/news/news.20150101.html b/content/news/news.20150101.html similarity index 100% rename from html/news/news.20150101.html rename to content/news/news.20150101.html diff --git a/html/news/news.20150103.html b/content/news/news.20150103.html similarity index 100% rename from html/news/news.20150103.html rename to content/news/news.20150103.html diff --git a/html/news/news.20150207.html b/content/news/news.20150207.html similarity index 100% rename from html/news/news.20150207.html rename to content/news/news.20150207.html diff --git a/html/news/news.20150216.html b/content/news/news.20150216.html similarity index 100% rename from html/news/news.20150216.html rename to content/news/news.20150216.html diff --git a/html/news/news.20150228.html b/content/news/news.20150228.html similarity index 100% rename from html/news/news.20150228.html rename to content/news/news.20150228.html diff --git a/html/news/news.20150301.html b/content/news/news.20150301.html similarity index 100% rename from html/news/news.20150301.html rename to content/news/news.20150301.html diff --git a/html/news/news.20150315.html b/content/news/news.20150315.html similarity index 100% rename from html/news/news.20150315.html rename to content/news/news.20150315.html diff --git a/html/news/news.20150331.html b/content/news/news.20150331.html similarity index 100% rename from html/news/news.20150331.html rename to content/news/news.20150331.html diff --git a/html/news/news.20150419.html b/content/news/news.20150419.html similarity index 100% rename from html/news/news.20150419.html rename to content/news/news.20150419.html diff --git a/html/news/news.20150430.html b/content/news/news.20150430.html similarity index 100% rename from html/news/news.20150430.html rename to content/news/news.20150430.html diff --git a/html/news/news.20150504.html b/content/news/news.20150504.html similarity index 100% rename from html/news/news.20150504.html rename to content/news/news.20150504.html diff --git a/html/news/news.20150509.html b/content/news/news.20150509.html similarity index 100% rename from html/news/news.20150509.html rename to content/news/news.20150509.html diff --git a/html/news/news.20150510.html b/content/news/news.20150510.html similarity index 100% rename from html/news/news.20150510.html rename to content/news/news.20150510.html diff --git a/html/news/news.20150511.html b/content/news/news.20150511.html similarity index 100% rename from html/news/news.20150511.html rename to content/news/news.20150511.html diff --git a/html/news/news.20150524.html b/content/news/news.20150524.html similarity index 100% rename from html/news/news.20150524.html rename to content/news/news.20150524.html diff --git a/html/news/news.20150601.html b/content/news/news.20150601.html similarity index 100% rename from html/news/news.20150601.html rename to content/news/news.20150601.html diff --git a/html/news/news.20150627.html b/content/news/news.20150627.html similarity index 100% rename from html/news/news.20150627.html rename to content/news/news.20150627.html diff --git a/html/news/news.20150701.html b/content/news/news.20150701.html similarity index 100% rename from html/news/news.20150701.html rename to content/news/news.20150701.html diff --git a/html/news/news.20150801.html b/content/news/news.20150801.html similarity index 100% rename from html/news/news.20150801.html rename to content/news/news.20150801.html diff --git a/html/news/news.20150901.html b/content/news/news.20150901.html similarity index 100% rename from html/news/news.20150901.html rename to content/news/news.20150901.html diff --git a/html/news/news.20150907.html b/content/news/news.20150907.html similarity index 100% rename from html/news/news.20150907.html rename to content/news/news.20150907.html diff --git a/html/news/news.20150916.html b/content/news/news.20150916.html similarity index 100% rename from html/news/news.20150916.html rename to content/news/news.20150916.html diff --git a/html/news/news.20150926.html b/content/news/news.20150926.html similarity index 100% rename from html/news/news.20150926.html rename to content/news/news.20150926.html diff --git a/html/news/news.20150927.html b/content/news/news.20150927.html similarity index 100% rename from html/news/news.20150927.html rename to content/news/news.20150927.html diff --git a/html/news/news.20150929.html b/content/news/news.20150929.html similarity index 100% rename from html/news/news.20150929.html rename to content/news/news.20150929.html diff --git a/html/news/news.20151001.html b/content/news/news.20151001.html similarity index 100% rename from html/news/news.20151001.html rename to content/news/news.20151001.html diff --git a/html/news/news.20151012.html b/content/news/news.20151012.html similarity index 100% rename from html/news/news.20151012.html rename to content/news/news.20151012.html diff --git a/html/news/news.20151017.html b/content/news/news.20151017.html similarity index 100% rename from html/news/news.20151017.html rename to content/news/news.20151017.html diff --git a/html/news/news.20151021.html b/content/news/news.20151021.html similarity index 100% rename from html/news/news.20151021.html rename to content/news/news.20151021.html diff --git a/html/news/news.20151029.html b/content/news/news.20151029.html similarity index 100% rename from html/news/news.20151029.html rename to content/news/news.20151029.html diff --git a/html/news/news.20151101.2.html b/content/news/news.20151101.2.html similarity index 100% rename from html/news/news.20151101.2.html rename to content/news/news.20151101.2.html diff --git a/html/news/news.20151101.html b/content/news/news.20151101.html similarity index 100% rename from html/news/news.20151101.html rename to content/news/news.20151101.html diff --git a/html/news/news.20151201.html b/content/news/news.20151201.html similarity index 100% rename from html/news/news.20151201.html rename to content/news/news.20151201.html diff --git a/html/news/news.20160101.html b/content/news/news.20160101.html similarity index 100% rename from html/news/news.20160101.html rename to content/news/news.20160101.html diff --git a/html/news/news.20160201.html b/content/news/news.20160201.html similarity index 100% rename from html/news/news.20160201.html rename to content/news/news.20160201.html diff --git a/html/news/news.20160205.html b/content/news/news.20160205.html similarity index 100% rename from html/news/news.20160205.html rename to content/news/news.20160205.html diff --git a/html/news/news.20160209.html b/content/news/news.20160209.html similarity index 100% rename from html/news/news.20160209.html rename to content/news/news.20160209.html diff --git a/html/news/news.20160224.html b/content/news/news.20160224.html similarity index 100% rename from html/news/news.20160224.html rename to content/news/news.20160224.html diff --git a/html/news/news.20160225.html b/content/news/news.20160225.html similarity index 100% rename from html/news/news.20160225.html rename to content/news/news.20160225.html diff --git a/html/news/news.20160301.html b/content/news/news.20160301.html similarity index 100% rename from html/news/news.20160301.html rename to content/news/news.20160301.html diff --git a/html/news/news.20160401.html b/content/news/news.20160401.html similarity index 100% rename from html/news/news.20160401.html rename to content/news/news.20160401.html diff --git a/html/news/news.20160407.html b/content/news/news.20160407.html similarity index 100% rename from html/news/news.20160407.html rename to content/news/news.20160407.html diff --git a/html/news/news.20160501.html b/content/news/news.20160501.html similarity index 100% rename from html/news/news.20160501.html rename to content/news/news.20160501.html diff --git a/html/news/news.20160514.html b/content/news/news.20160514.html similarity index 100% rename from html/news/news.20160514.html rename to content/news/news.20160514.html diff --git a/html/news/news.20160522.html b/content/news/news.20160522.html similarity index 100% rename from html/news/news.20160522.html rename to content/news/news.20160522.html diff --git a/html/news/news.20160604.html b/content/news/news.20160604.html similarity index 100% rename from html/news/news.20160604.html rename to content/news/news.20160604.html diff --git a/html/news/news.20160620.html b/content/news/news.20160620.html similarity index 100% rename from html/news/news.20160620.html rename to content/news/news.20160620.html diff --git a/html/news/news.20160627.html b/content/news/news.20160627.html similarity index 100% rename from html/news/news.20160627.html rename to content/news/news.20160627.html diff --git a/html/news/news.20160707.html b/content/news/news.20160707.html similarity index 100% rename from html/news/news.20160707.html rename to content/news/news.20160707.html diff --git a/html/news/news.20160725.html b/content/news/news.20160725.html similarity index 100% rename from html/news/news.20160725.html rename to content/news/news.20160725.html diff --git a/html/news/news.20160810.html b/content/news/news.20160810.html similarity index 100% rename from html/news/news.20160810.html rename to content/news/news.20160810.html diff --git a/html/news/news.20160813.html b/content/news/news.20160813.html similarity index 100% rename from html/news/news.20160813.html rename to content/news/news.20160813.html diff --git a/html/news/news.20160821.html b/content/news/news.20160821.html similarity index 100% rename from html/news/news.20160821.html rename to content/news/news.20160821.html diff --git a/html/news/news.20160824.html b/content/news/news.20160824.html similarity index 100% rename from html/news/news.20160824.html rename to content/news/news.20160824.html diff --git a/html/news/news.20160905.2.html b/content/news/news.20160905.2.html similarity index 100% rename from html/news/news.20160905.2.html rename to content/news/news.20160905.2.html diff --git a/html/news/news.20160905.html b/content/news/news.20160905.html similarity index 100% rename from html/news/news.20160905.html rename to content/news/news.20160905.html diff --git a/html/news/news.20161002.html b/content/news/news.20161002.html similarity index 100% rename from html/news/news.20161002.html rename to content/news/news.20161002.html diff --git a/html/news/news.20161102.html b/content/news/news.20161102.html similarity index 100% rename from html/news/news.20161102.html rename to content/news/news.20161102.html diff --git a/html/news/news.20161116.html b/content/news/news.20161116.html similarity index 100% rename from html/news/news.20161116.html rename to content/news/news.20161116.html diff --git a/html/news/news.20161203.html b/content/news/news.20161203.html similarity index 100% rename from html/news/news.20161203.html rename to content/news/news.20161203.html diff --git a/html/news/news.20161209.html b/content/news/news.20161209.html similarity index 100% rename from html/news/news.20161209.html rename to content/news/news.20161209.html diff --git a/html/news/news.20170102.html b/content/news/news.20170102.html similarity index 100% rename from html/news/news.20170102.html rename to content/news/news.20170102.html diff --git a/html/news/news.20170113.html b/content/news/news.20170113.html similarity index 100% rename from html/news/news.20170113.html rename to content/news/news.20170113.html diff --git a/html/news/news.20170208.html b/content/news/news.20170208.html similarity index 100% rename from html/news/news.20170208.html rename to content/news/news.20170208.html diff --git a/html/news/news.20170209.html b/content/news/news.20170209.html similarity index 100% rename from html/news/news.20170209.html rename to content/news/news.20170209.html diff --git a/html/news/news.20170301.html b/content/news/news.20170301.html similarity index 100% rename from html/news/news.20170301.html rename to content/news/news.20170301.html diff --git a/html/news/news.20170308.html b/content/news/news.20170308.html similarity index 100% rename from html/news/news.20170308.html rename to content/news/news.20170308.html diff --git a/html/news/news.20170401.html b/content/news/news.20170401.html similarity index 100% rename from html/news/news.20170401.html rename to content/news/news.20170401.html diff --git a/html/news/news.20170402.html b/content/news/news.20170402.html similarity index 100% rename from html/news/news.20170402.html rename to content/news/news.20170402.html diff --git a/html/news/news.20170509.html b/content/news/news.20170509.html similarity index 100% rename from html/news/news.20170509.html rename to content/news/news.20170509.html diff --git a/html/news/news.20170510.html b/content/news/news.20170510.html similarity index 100% rename from html/news/news.20170510.html rename to content/news/news.20170510.html diff --git a/html/news/news.20170510_2.html b/content/news/news.20170510_2.html similarity index 100% rename from html/news/news.20170510_2.html rename to content/news/news.20170510_2.html diff --git a/html/news/news.20180113.html b/content/news/news.20180113.html similarity index 100% rename from html/news/news.20180113.html rename to content/news/news.20180113.html diff --git a/html/news/news.20180114.html b/content/news/news.20180114.html similarity index 100% rename from html/news/news.20180114.html rename to content/news/news.20180114.html diff --git a/html/news/news.20180129.html b/content/news/news.20180129.html similarity index 100% rename from html/news/news.20180129.html rename to content/news/news.20180129.html diff --git a/html/news/news.20180203.2.html b/content/news/news.20180203.2.html similarity index 100% rename from html/news/news.20180203.2.html rename to content/news/news.20180203.2.html diff --git a/html/news/news.20180203.html b/content/news/news.20180203.html similarity index 100% rename from html/news/news.20180203.html rename to content/news/news.20180203.html diff --git a/html/news/news.20180204.html b/content/news/news.20180204.html similarity index 100% rename from html/news/news.20180204.html rename to content/news/news.20180204.html diff --git a/html/news/news.20191123.html b/content/news/news.20191123.html similarity index 100% rename from html/news/news.20191123.html rename to content/news/news.20191123.html diff --git a/html/news/news.20210125.html b/content/news/news.20210125.html similarity index 100% rename from html/news/news.20210125.html rename to content/news/news.20210125.html diff --git a/html/site.css b/content/site.css similarity index 100% rename from html/site.css rename to content/site.css diff --git a/html/support/authors.html b/content/support/authors.html similarity index 100% rename from html/support/authors.html rename to content/support/authors.html diff --git a/html/support/faq.html b/content/support/faq.html similarity index 100% rename from html/support/faq.html rename to content/support/faq.html diff --git a/html/support/index.html b/content/support/index.html similarity index 100% rename from html/support/index.html rename to content/support/index.html diff --git a/html/tools/filter-ko.js b/content/tools/filter-ko.js similarity index 100% rename from html/tools/filter-ko.js rename to content/tools/filter-ko.js diff --git a/html/tools/index.html b/content/tools/index.html similarity index 100% rename from html/tools/index.html rename to content/tools/index.html diff --git a/html/tools/site.css b/content/tools/site.css similarity index 100% rename from html/tools/site.css rename to content/tools/site.css diff --git a/html/tools/tools-data.json b/content/tools/tools-data.json similarity index 100% rename from html/tools/tools-data.json rename to content/tools/tools-data.json diff --git a/html/tools/tools.css b/content/tools/tools.css similarity index 100% rename from html/tools/tools.css rename to content/tools/tools.css From 21ff9c973d2b3a6aa1edb732b0784ba630761004 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 10:02:59 -0400 Subject: [PATCH 02/50] hugo: Add archetypes folder with initial content --- archetypes/default.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 archetypes/default.md diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 00000000..00e77bd7 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + From 71b2bec8bf4fafa5e6c64a44fafe0669fb531de2 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 10:04:46 -0400 Subject: [PATCH 03/50] hugo: Add config.toml --- config.toml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 config.toml diff --git a/config.toml b/config.toml new file mode 100644 index 00000000..b4bfe98d --- /dev/null +++ b/config.toml @@ -0,0 +1,8 @@ +baseURL = "https://taskwarrior.org" +languageCode = "en-us" +title = "Taskwarrior" +theme = "bootstrap" +publishDir = "html" + +[params] +description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line." From 212c7ef06b4f35b82ce8d59e7539dfd67c97a087 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 10:06:59 -0400 Subject: [PATCH 04/50] meta: Add netlify configuration --- netlify.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 netlify.toml diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..e0e84168 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,10 @@ +[build] +HUGO_VERSION = "0.80.0" +publish = "html" +command = "git submodule update -f --init && hugo --gc --minify" + +[context.production.environment] +HUGO_VERSION = "0.80.0" + +[context.branch-deploy.environment] +HUGO_VERSION = "0.80.0" From 4a9e7026df6d17d05ab3de00b19cee84e723fb17 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 11:31:40 -0400 Subject: [PATCH 05/50] meta: Rename all .html files to .html.old to prevent them from being rendered --- content/{about.html => about.html.old} | 0 content/{conduct.html => conduct.html.old} | 0 content/docs/{30second.html => 30second.html.old} | 0 content/docs/{3rd-party.html => 3rd-party.html.old} | 0 content/docs/{advice.html => advice.html.old} | 0 content/docs/{best-practices.html => best-practices.html.old} | 0 content/docs/{branching.html => branching.html.old} | 0 content/docs/{bugs.html => bugs.html.old} | 0 content/docs/{build.html => build.html.old} | 0 content/docs/clog/{actions.html => actions.html.old} | 0 content/docs/clog/{clone.html => clone.html.old} | 0 content/docs/clog/{color.html => color.html.old} | 0 content/docs/clog/{download.html => download.html.old} | 0 .../docs/clog/{example_apache.html => example_apache.html.old} | 0 .../docs/clog/{example_syslog.html => example_syslog.html.old} | 0 content/docs/clog/{help.html => help.html.old} | 0 content/docs/clog/{how.html => how.html.old} | 0 content/docs/clog/{index.html => index.html.old} | 0 content/docs/clog/{options.html => options.html.old} | 0 content/docs/clog/{patterns.html => patterns.html.old} | 0 content/docs/clog/{sections.html => sections.html.old} | 0 content/docs/clog/{setup.html => setup.html.old} | 0 content/docs/clog/{syntax.html => syntax.html.old} | 0 content/docs/clog/{what.html => what.html.old} | 0 content/docs/{coding_style.html => coding_style.html.old} | 0 content/docs/commands/{_get.html => _get.html.old} | 0 content/docs/commands/{_unique.html => _unique.html.old} | 0 content/docs/commands/{add.html => add.html.old} | 0 content/docs/commands/{append.html => append.html.old} | 0 content/docs/commands/{burndown.html => burndown.html.old} | 0 content/docs/commands/{calc.html => calc.html.old} | 0 content/docs/commands/{columns.html => columns.html.old} | 0 content/docs/commands/{count.html => count.html.old} | 0 content/docs/commands/{done.html => done.html.old} | 0 content/docs/commands/{export.html => export.html.old} | 0 content/docs/commands/{index.html => index.html.old} | 0 content/docs/commands/{info.html => info.html.old} | 0 content/docs/commands/{list.html => list.html.old} | 0 content/docs/commands/{log.html => log.html.old} | 0 content/docs/commands/{missing.html => missing.html.old} | 0 content/docs/commands/{modify.html => modify.html.old} | 0 content/docs/commands/{prepend.html => prepend.html.old} | 0 content/docs/commands/{synchronize.html => synchronize.html.old} | 0 content/docs/commands/{template.html => template.html.old} | 0 content/docs/{configuration.html => configuration.html.old} | 0 content/docs/{context.html => context.html.old} | 0 content/docs/{contribute.html => contribute.html.old} | 0 content/docs/{dates.html => dates.html.old} | 0 content/docs/{deprecated.html => deprecated.html.old} | 0 content/docs/design/{cli.html => cli.html.old} | 0 content/docs/design/{client.html => client.html.old} | 0 content/docs/design/{dom.html => dom.html.old} | 0 content/docs/design/{index.html => index.html.old} | 0 content/docs/design/{plans.html => plans.html.old} | 0 content/docs/design/{protocol.html => protocol.html.old} | 0 content/docs/design/{recurrence.html => recurrence.html.old} | 0 content/docs/design/{request.html => request.html.old} | 0 content/docs/design/{rules.html => rules.html.old} | 0 content/docs/design/{sync.html => sync.html.old} | 0 content/docs/design/{task.html => task.html.old} | 0 content/docs/design/{workweek.html => workweek.html.old} | 0 content/docs/{dom.html => dom.html.old} | 0 content/docs/{durations.html => durations.html.old} | 0 content/docs/{escapes.html => escapes.html.old} | 0 content/docs/{examples.html => examples.html.old} | 0 content/docs/{features.html => features.html.old} | 0 content/docs/{filter.html => filter.html.old} | 0 content/docs/{first_time.html => first_time.html.old} | 0 content/docs/{help.html => help.html.old} | 0 content/docs/{history.html => history.html.old} | 0 content/docs/{history_td.html => history_td.html.old} | 0 content/docs/{hooks.html => hooks.html.old} | 0 content/docs/{hooks2.html => hooks2.html.old} | 0 content/docs/{hooks_guide.html => hooks_guide.html.old} | 0 content/docs/{ids.html => ids.html.old} | 0 content/docs/{index.html => index.html.old} | 0 content/docs/{introduction.html => introduction.html.old} | 0 content/docs/{jobs.html => jobs.html.old} | 0 content/docs/{license.html => license.html.old} | 0 content/docs/{named_dates.html => named_dates.html.old} | 0 content/docs/{philosophy.html => philosophy.html.old} | 0 content/docs/{priority.html => priority.html.old} | 0 content/docs/{recurrence.html => recurrence.html.old} | 0 content/docs/{report.html => report.html.old} | 0 content/docs/{review.html => review.html.old} | 0 content/docs/{searching.html => searching.html.old} | 0 content/docs/{start.html => start.html.old} | 0 content/docs/{syntax.html => syntax.html.old} | 0 content/docs/{tags.html => tags.html.old} | 0 content/docs/taskserver/{ciphers.html => ciphers.html.old} | 0 content/docs/taskserver/{configure.html => configure.html.old} | 0 content/docs/taskserver/{control.html => control.html.old} | 0 content/docs/taskserver/{git.html => git.html.old} | 0 content/docs/taskserver/{package.html => package.html.old} | 0 content/docs/taskserver/{prep.html => prep.html.old} | 0 content/docs/taskserver/{protocol.html => protocol.html.old} | 0 content/docs/taskserver/{setup.html => setup.html.old} | 0 content/docs/taskserver/{sync.html => sync.html.old} | 0 content/docs/taskserver/{tarball.html => tarball.html.old} | 0 .../docs/taskserver/{taskwarrior.html => taskwarrior.html.old} | 0 .../{troubleshooting-sync.html => troubleshooting-sync.html.old} | 0 content/docs/taskserver/{upgrade.html => upgrade.html.old} | 0 content/docs/taskserver/{user.html => user.html.old} | 0 content/docs/taskserver/{why.html => why.html.old} | 0 content/docs/{template.html => template.html.old} | 0 content/docs/{terminology.html => terminology.html.old} | 0 content/docs/{themes.html => themes.html.old} | 0 content/docs/{triage.html => triage.html.old} | 0 content/docs/{udas.html => udas.html.old} | 0 content/docs/{unicode.html => unicode.html.old} | 0 content/docs/{urgency.html => urgency.html.old} | 0 content/docs/{using_dates.html => using_dates.html.old} | 0 content/docs/{verbosity.html => verbosity.html.old} | 0 content/docs/{workflow.html => workflow.html.old} | 0 content/download/{index.html => index.html.old} | 0 content/{index.html => index.html.old} | 0 content/news/{index.html => index.html.old} | 0 content/news/{news.20140212.html => news.20140212.html.old} | 0 content/news/{news.20140217.html => news.20140217.html.old} | 0 content/news/{news.20140220.html => news.20140220.html.old} | 0 content/news/{news.20140226.html => news.20140226.html.old} | 0 content/news/{news.20140227.html => news.20140227.html.old} | 0 content/news/{news.20140303.html => news.20140303.html.old} | 0 content/news/{news.20140309.html => news.20140309.html.old} | 0 content/news/{news.20140406.html => news.20140406.html.old} | 0 content/news/{news.20140407.html => news.20140407.html.old} | 0 content/news/{news.20140412.html => news.20140412.html.old} | 0 content/news/{news.20140429.html => news.20140429.html.old} | 0 content/news/{news.20140510.html => news.20140510.html.old} | 0 content/news/{news.20140524.html => news.20140524.html.old} | 0 content/news/{news.20140607.html => news.20140607.html.old} | 0 content/news/{news.20140704.html => news.20140704.html.old} | 0 content/news/{news.20140816.html => news.20140816.html.old} | 0 content/news/{news.20140906.html => news.20140906.html.old} | 0 content/news/{news.20140915.html => news.20140915.html.old} | 0 content/news/{news.20140928.html => news.20140928.html.old} | 0 content/news/{news.20141011.html => news.20141011.html.old} | 0 content/news/{news.20141025.html => news.20141025.html.old} | 0 content/news/{news.20141111.html => news.20141111.html.old} | 0 content/news/{news.20141221.html => news.20141221.html.old} | 0 content/news/{news.20150101.html => news.20150101.html.old} | 0 content/news/{news.20150103.html => news.20150103.html.old} | 0 content/news/{news.20150207.html => news.20150207.html.old} | 0 content/news/{news.20150216.html => news.20150216.html.old} | 0 content/news/{news.20150228.html => news.20150228.html.old} | 0 content/news/{news.20150301.html => news.20150301.html.old} | 0 content/news/{news.20150315.html => news.20150315.html.old} | 0 content/news/{news.20150331.html => news.20150331.html.old} | 0 content/news/{news.20150419.html => news.20150419.html.old} | 0 content/news/{news.20150430.html => news.20150430.html.old} | 0 content/news/{news.20150504.html => news.20150504.html.old} | 0 content/news/{news.20150509.html => news.20150509.html.old} | 0 content/news/{news.20150510.html => news.20150510.html.old} | 0 content/news/{news.20150511.html => news.20150511.html.old} | 0 content/news/{news.20150524.html => news.20150524.html.old} | 0 content/news/{news.20150601.html => news.20150601.html.old} | 0 content/news/{news.20150627.html => news.20150627.html.old} | 0 content/news/{news.20150701.html => news.20150701.html.old} | 0 content/news/{news.20150801.html => news.20150801.html.old} | 0 content/news/{news.20150901.html => news.20150901.html.old} | 0 content/news/{news.20150907.html => news.20150907.html.old} | 0 content/news/{news.20150916.html => news.20150916.html.old} | 0 content/news/{news.20150926.html => news.20150926.html.old} | 0 content/news/{news.20150927.html => news.20150927.html.old} | 0 content/news/{news.20150929.html => news.20150929.html.old} | 0 content/news/{news.20151001.html => news.20151001.html.old} | 0 content/news/{news.20151012.html => news.20151012.html.old} | 0 content/news/{news.20151017.html => news.20151017.html.old} | 0 content/news/{news.20151021.html => news.20151021.html.old} | 0 content/news/{news.20151029.html => news.20151029.html.old} | 0 content/news/{news.20151101.2.html => news.20151101.2.html.old} | 0 content/news/{news.20151101.html => news.20151101.html.old} | 0 content/news/{news.20151201.html => news.20151201.html.old} | 0 content/news/{news.20160101.html => news.20160101.html.old} | 0 content/news/{news.20160201.html => news.20160201.html.old} | 0 content/news/{news.20160205.html => news.20160205.html.old} | 0 content/news/{news.20160209.html => news.20160209.html.old} | 0 content/news/{news.20160224.html => news.20160224.html.old} | 0 content/news/{news.20160225.html => news.20160225.html.old} | 0 content/news/{news.20160301.html => news.20160301.html.old} | 0 content/news/{news.20160401.html => news.20160401.html.old} | 0 content/news/{news.20160407.html => news.20160407.html.old} | 0 content/news/{news.20160501.html => news.20160501.html.old} | 0 content/news/{news.20160514.html => news.20160514.html.old} | 0 content/news/{news.20160522.html => news.20160522.html.old} | 0 content/news/{news.20160604.html => news.20160604.html.old} | 0 content/news/{news.20160620.html => news.20160620.html.old} | 0 content/news/{news.20160627.html => news.20160627.html.old} | 0 content/news/{news.20160707.html => news.20160707.html.old} | 0 content/news/{news.20160725.html => news.20160725.html.old} | 0 content/news/{news.20160810.html => news.20160810.html.old} | 0 content/news/{news.20160813.html => news.20160813.html.old} | 0 content/news/{news.20160821.html => news.20160821.html.old} | 0 content/news/{news.20160824.html => news.20160824.html.old} | 0 content/news/{news.20160905.2.html => news.20160905.2.html.old} | 0 content/news/{news.20160905.html => news.20160905.html.old} | 0 content/news/{news.20161002.html => news.20161002.html.old} | 0 content/news/{news.20161102.html => news.20161102.html.old} | 0 content/news/{news.20161116.html => news.20161116.html.old} | 0 content/news/{news.20161203.html => news.20161203.html.old} | 0 content/news/{news.20161209.html => news.20161209.html.old} | 0 content/news/{news.20170102.html => news.20170102.html.old} | 0 content/news/{news.20170113.html => news.20170113.html.old} | 0 content/news/{news.20170208.html => news.20170208.html.old} | 0 content/news/{news.20170209.html => news.20170209.html.old} | 0 content/news/{news.20170301.html => news.20170301.html.old} | 0 content/news/{news.20170308.html => news.20170308.html.old} | 0 content/news/{news.20170401.html => news.20170401.html.old} | 0 content/news/{news.20170402.html => news.20170402.html.old} | 0 content/news/{news.20170509.html => news.20170509.html.old} | 0 content/news/{news.20170510.html => news.20170510.html.old} | 0 content/news/{news.20170510_2.html => news.20170510_2.html.old} | 0 content/news/{news.20180113.html => news.20180113.html.old} | 0 content/news/{news.20180114.html => news.20180114.html.old} | 0 content/news/{news.20180129.html => news.20180129.html.old} | 0 content/news/{news.20180203.2.html => news.20180203.2.html.old} | 0 content/news/{news.20180203.html => news.20180203.html.old} | 0 content/news/{news.20180204.html => news.20180204.html.old} | 0 content/news/{news.20191123.html => news.20191123.html.old} | 0 content/news/{news.20210125.html => news.20210125.html.old} | 0 content/support/{authors.html => authors.html.old} | 0 content/support/{faq.html => faq.html.old} | 0 content/support/{index.html => index.html.old} | 0 content/tools/{index.html => index.html.old} | 0 224 files changed, 0 insertions(+), 0 deletions(-) rename content/{about.html => about.html.old} (100%) rename content/{conduct.html => conduct.html.old} (100%) rename content/docs/{30second.html => 30second.html.old} (100%) rename content/docs/{3rd-party.html => 3rd-party.html.old} (100%) rename content/docs/{advice.html => advice.html.old} (100%) rename content/docs/{best-practices.html => best-practices.html.old} (100%) rename content/docs/{branching.html => branching.html.old} (100%) rename content/docs/{bugs.html => bugs.html.old} (100%) rename content/docs/{build.html => build.html.old} (100%) rename content/docs/clog/{actions.html => actions.html.old} (100%) rename content/docs/clog/{clone.html => clone.html.old} (100%) rename content/docs/clog/{color.html => color.html.old} (100%) rename content/docs/clog/{download.html => download.html.old} (100%) rename content/docs/clog/{example_apache.html => example_apache.html.old} (100%) rename content/docs/clog/{example_syslog.html => example_syslog.html.old} (100%) rename content/docs/clog/{help.html => help.html.old} (100%) rename content/docs/clog/{how.html => how.html.old} (100%) rename content/docs/clog/{index.html => index.html.old} (100%) rename content/docs/clog/{options.html => options.html.old} (100%) rename content/docs/clog/{patterns.html => patterns.html.old} (100%) rename content/docs/clog/{sections.html => sections.html.old} (100%) rename content/docs/clog/{setup.html => setup.html.old} (100%) rename content/docs/clog/{syntax.html => syntax.html.old} (100%) rename content/docs/clog/{what.html => what.html.old} (100%) rename content/docs/{coding_style.html => coding_style.html.old} (100%) rename content/docs/commands/{_get.html => _get.html.old} (100%) rename content/docs/commands/{_unique.html => _unique.html.old} (100%) rename content/docs/commands/{add.html => add.html.old} (100%) rename content/docs/commands/{append.html => append.html.old} (100%) rename content/docs/commands/{burndown.html => burndown.html.old} (100%) rename content/docs/commands/{calc.html => calc.html.old} (100%) rename content/docs/commands/{columns.html => columns.html.old} (100%) rename content/docs/commands/{count.html => count.html.old} (100%) rename content/docs/commands/{done.html => done.html.old} (100%) rename content/docs/commands/{export.html => export.html.old} (100%) rename content/docs/commands/{index.html => index.html.old} (100%) rename content/docs/commands/{info.html => info.html.old} (100%) rename content/docs/commands/{list.html => list.html.old} (100%) rename content/docs/commands/{log.html => log.html.old} (100%) rename content/docs/commands/{missing.html => missing.html.old} (100%) rename content/docs/commands/{modify.html => modify.html.old} (100%) rename content/docs/commands/{prepend.html => prepend.html.old} (100%) rename content/docs/commands/{synchronize.html => synchronize.html.old} (100%) rename content/docs/commands/{template.html => template.html.old} (100%) rename content/docs/{configuration.html => configuration.html.old} (100%) rename content/docs/{context.html => context.html.old} (100%) rename content/docs/{contribute.html => contribute.html.old} (100%) rename content/docs/{dates.html => dates.html.old} (100%) rename content/docs/{deprecated.html => deprecated.html.old} (100%) rename content/docs/design/{cli.html => cli.html.old} (100%) rename content/docs/design/{client.html => client.html.old} (100%) rename content/docs/design/{dom.html => dom.html.old} (100%) rename content/docs/design/{index.html => index.html.old} (100%) rename content/docs/design/{plans.html => plans.html.old} (100%) rename content/docs/design/{protocol.html => protocol.html.old} (100%) rename content/docs/design/{recurrence.html => recurrence.html.old} (100%) rename content/docs/design/{request.html => request.html.old} (100%) rename content/docs/design/{rules.html => rules.html.old} (100%) rename content/docs/design/{sync.html => sync.html.old} (100%) rename content/docs/design/{task.html => task.html.old} (100%) rename content/docs/design/{workweek.html => workweek.html.old} (100%) rename content/docs/{dom.html => dom.html.old} (100%) rename content/docs/{durations.html => durations.html.old} (100%) rename content/docs/{escapes.html => escapes.html.old} (100%) rename content/docs/{examples.html => examples.html.old} (100%) rename content/docs/{features.html => features.html.old} (100%) rename content/docs/{filter.html => filter.html.old} (100%) rename content/docs/{first_time.html => first_time.html.old} (100%) rename content/docs/{help.html => help.html.old} (100%) rename content/docs/{history.html => history.html.old} (100%) rename content/docs/{history_td.html => history_td.html.old} (100%) rename content/docs/{hooks.html => hooks.html.old} (100%) rename content/docs/{hooks2.html => hooks2.html.old} (100%) rename content/docs/{hooks_guide.html => hooks_guide.html.old} (100%) rename content/docs/{ids.html => ids.html.old} (100%) rename content/docs/{index.html => index.html.old} (100%) rename content/docs/{introduction.html => introduction.html.old} (100%) rename content/docs/{jobs.html => jobs.html.old} (100%) rename content/docs/{license.html => license.html.old} (100%) rename content/docs/{named_dates.html => named_dates.html.old} (100%) rename content/docs/{philosophy.html => philosophy.html.old} (100%) rename content/docs/{priority.html => priority.html.old} (100%) rename content/docs/{recurrence.html => recurrence.html.old} (100%) rename content/docs/{report.html => report.html.old} (100%) rename content/docs/{review.html => review.html.old} (100%) rename content/docs/{searching.html => searching.html.old} (100%) rename content/docs/{start.html => start.html.old} (100%) rename content/docs/{syntax.html => syntax.html.old} (100%) rename content/docs/{tags.html => tags.html.old} (100%) rename content/docs/taskserver/{ciphers.html => ciphers.html.old} (100%) rename content/docs/taskserver/{configure.html => configure.html.old} (100%) rename content/docs/taskserver/{control.html => control.html.old} (100%) rename content/docs/taskserver/{git.html => git.html.old} (100%) rename content/docs/taskserver/{package.html => package.html.old} (100%) rename content/docs/taskserver/{prep.html => prep.html.old} (100%) rename content/docs/taskserver/{protocol.html => protocol.html.old} (100%) rename content/docs/taskserver/{setup.html => setup.html.old} (100%) rename content/docs/taskserver/{sync.html => sync.html.old} (100%) rename content/docs/taskserver/{tarball.html => tarball.html.old} (100%) rename content/docs/taskserver/{taskwarrior.html => taskwarrior.html.old} (100%) rename content/docs/taskserver/{troubleshooting-sync.html => troubleshooting-sync.html.old} (100%) rename content/docs/taskserver/{upgrade.html => upgrade.html.old} (100%) rename content/docs/taskserver/{user.html => user.html.old} (100%) rename content/docs/taskserver/{why.html => why.html.old} (100%) rename content/docs/{template.html => template.html.old} (100%) rename content/docs/{terminology.html => terminology.html.old} (100%) rename content/docs/{themes.html => themes.html.old} (100%) rename content/docs/{triage.html => triage.html.old} (100%) rename content/docs/{udas.html => udas.html.old} (100%) rename content/docs/{unicode.html => unicode.html.old} (100%) rename content/docs/{urgency.html => urgency.html.old} (100%) rename content/docs/{using_dates.html => using_dates.html.old} (100%) rename content/docs/{verbosity.html => verbosity.html.old} (100%) rename content/docs/{workflow.html => workflow.html.old} (100%) rename content/download/{index.html => index.html.old} (100%) rename content/{index.html => index.html.old} (100%) rename content/news/{index.html => index.html.old} (100%) rename content/news/{news.20140212.html => news.20140212.html.old} (100%) rename content/news/{news.20140217.html => news.20140217.html.old} (100%) rename content/news/{news.20140220.html => news.20140220.html.old} (100%) rename content/news/{news.20140226.html => news.20140226.html.old} (100%) rename content/news/{news.20140227.html => news.20140227.html.old} (100%) rename content/news/{news.20140303.html => news.20140303.html.old} (100%) rename content/news/{news.20140309.html => news.20140309.html.old} (100%) rename content/news/{news.20140406.html => news.20140406.html.old} (100%) rename content/news/{news.20140407.html => news.20140407.html.old} (100%) rename content/news/{news.20140412.html => news.20140412.html.old} (100%) rename content/news/{news.20140429.html => news.20140429.html.old} (100%) rename content/news/{news.20140510.html => news.20140510.html.old} (100%) rename content/news/{news.20140524.html => news.20140524.html.old} (100%) rename content/news/{news.20140607.html => news.20140607.html.old} (100%) rename content/news/{news.20140704.html => news.20140704.html.old} (100%) rename content/news/{news.20140816.html => news.20140816.html.old} (100%) rename content/news/{news.20140906.html => news.20140906.html.old} (100%) rename content/news/{news.20140915.html => news.20140915.html.old} (100%) rename content/news/{news.20140928.html => news.20140928.html.old} (100%) rename content/news/{news.20141011.html => news.20141011.html.old} (100%) rename content/news/{news.20141025.html => news.20141025.html.old} (100%) rename content/news/{news.20141111.html => news.20141111.html.old} (100%) rename content/news/{news.20141221.html => news.20141221.html.old} (100%) rename content/news/{news.20150101.html => news.20150101.html.old} (100%) rename content/news/{news.20150103.html => news.20150103.html.old} (100%) rename content/news/{news.20150207.html => news.20150207.html.old} (100%) rename content/news/{news.20150216.html => news.20150216.html.old} (100%) rename content/news/{news.20150228.html => news.20150228.html.old} (100%) rename content/news/{news.20150301.html => news.20150301.html.old} (100%) rename content/news/{news.20150315.html => news.20150315.html.old} (100%) rename content/news/{news.20150331.html => news.20150331.html.old} (100%) rename content/news/{news.20150419.html => news.20150419.html.old} (100%) rename content/news/{news.20150430.html => news.20150430.html.old} (100%) rename content/news/{news.20150504.html => news.20150504.html.old} (100%) rename content/news/{news.20150509.html => news.20150509.html.old} (100%) rename content/news/{news.20150510.html => news.20150510.html.old} (100%) rename content/news/{news.20150511.html => news.20150511.html.old} (100%) rename content/news/{news.20150524.html => news.20150524.html.old} (100%) rename content/news/{news.20150601.html => news.20150601.html.old} (100%) rename content/news/{news.20150627.html => news.20150627.html.old} (100%) rename content/news/{news.20150701.html => news.20150701.html.old} (100%) rename content/news/{news.20150801.html => news.20150801.html.old} (100%) rename content/news/{news.20150901.html => news.20150901.html.old} (100%) rename content/news/{news.20150907.html => news.20150907.html.old} (100%) rename content/news/{news.20150916.html => news.20150916.html.old} (100%) rename content/news/{news.20150926.html => news.20150926.html.old} (100%) rename content/news/{news.20150927.html => news.20150927.html.old} (100%) rename content/news/{news.20150929.html => news.20150929.html.old} (100%) rename content/news/{news.20151001.html => news.20151001.html.old} (100%) rename content/news/{news.20151012.html => news.20151012.html.old} (100%) rename content/news/{news.20151017.html => news.20151017.html.old} (100%) rename content/news/{news.20151021.html => news.20151021.html.old} (100%) rename content/news/{news.20151029.html => news.20151029.html.old} (100%) rename content/news/{news.20151101.2.html => news.20151101.2.html.old} (100%) rename content/news/{news.20151101.html => news.20151101.html.old} (100%) rename content/news/{news.20151201.html => news.20151201.html.old} (100%) rename content/news/{news.20160101.html => news.20160101.html.old} (100%) rename content/news/{news.20160201.html => news.20160201.html.old} (100%) rename content/news/{news.20160205.html => news.20160205.html.old} (100%) rename content/news/{news.20160209.html => news.20160209.html.old} (100%) rename content/news/{news.20160224.html => news.20160224.html.old} (100%) rename content/news/{news.20160225.html => news.20160225.html.old} (100%) rename content/news/{news.20160301.html => news.20160301.html.old} (100%) rename content/news/{news.20160401.html => news.20160401.html.old} (100%) rename content/news/{news.20160407.html => news.20160407.html.old} (100%) rename content/news/{news.20160501.html => news.20160501.html.old} (100%) rename content/news/{news.20160514.html => news.20160514.html.old} (100%) rename content/news/{news.20160522.html => news.20160522.html.old} (100%) rename content/news/{news.20160604.html => news.20160604.html.old} (100%) rename content/news/{news.20160620.html => news.20160620.html.old} (100%) rename content/news/{news.20160627.html => news.20160627.html.old} (100%) rename content/news/{news.20160707.html => news.20160707.html.old} (100%) rename content/news/{news.20160725.html => news.20160725.html.old} (100%) rename content/news/{news.20160810.html => news.20160810.html.old} (100%) rename content/news/{news.20160813.html => news.20160813.html.old} (100%) rename content/news/{news.20160821.html => news.20160821.html.old} (100%) rename content/news/{news.20160824.html => news.20160824.html.old} (100%) rename content/news/{news.20160905.2.html => news.20160905.2.html.old} (100%) rename content/news/{news.20160905.html => news.20160905.html.old} (100%) rename content/news/{news.20161002.html => news.20161002.html.old} (100%) rename content/news/{news.20161102.html => news.20161102.html.old} (100%) rename content/news/{news.20161116.html => news.20161116.html.old} (100%) rename content/news/{news.20161203.html => news.20161203.html.old} (100%) rename content/news/{news.20161209.html => news.20161209.html.old} (100%) rename content/news/{news.20170102.html => news.20170102.html.old} (100%) rename content/news/{news.20170113.html => news.20170113.html.old} (100%) rename content/news/{news.20170208.html => news.20170208.html.old} (100%) rename content/news/{news.20170209.html => news.20170209.html.old} (100%) rename content/news/{news.20170301.html => news.20170301.html.old} (100%) rename content/news/{news.20170308.html => news.20170308.html.old} (100%) rename content/news/{news.20170401.html => news.20170401.html.old} (100%) rename content/news/{news.20170402.html => news.20170402.html.old} (100%) rename content/news/{news.20170509.html => news.20170509.html.old} (100%) rename content/news/{news.20170510.html => news.20170510.html.old} (100%) rename content/news/{news.20170510_2.html => news.20170510_2.html.old} (100%) rename content/news/{news.20180113.html => news.20180113.html.old} (100%) rename content/news/{news.20180114.html => news.20180114.html.old} (100%) rename content/news/{news.20180129.html => news.20180129.html.old} (100%) rename content/news/{news.20180203.2.html => news.20180203.2.html.old} (100%) rename content/news/{news.20180203.html => news.20180203.html.old} (100%) rename content/news/{news.20180204.html => news.20180204.html.old} (100%) rename content/news/{news.20191123.html => news.20191123.html.old} (100%) rename content/news/{news.20210125.html => news.20210125.html.old} (100%) rename content/support/{authors.html => authors.html.old} (100%) rename content/support/{faq.html => faq.html.old} (100%) rename content/support/{index.html => index.html.old} (100%) rename content/tools/{index.html => index.html.old} (100%) diff --git a/content/about.html b/content/about.html.old similarity index 100% rename from content/about.html rename to content/about.html.old diff --git a/content/conduct.html b/content/conduct.html.old similarity index 100% rename from content/conduct.html rename to content/conduct.html.old diff --git a/content/docs/30second.html b/content/docs/30second.html.old similarity index 100% rename from content/docs/30second.html rename to content/docs/30second.html.old diff --git a/content/docs/3rd-party.html b/content/docs/3rd-party.html.old similarity index 100% rename from content/docs/3rd-party.html rename to content/docs/3rd-party.html.old diff --git a/content/docs/advice.html b/content/docs/advice.html.old similarity index 100% rename from content/docs/advice.html rename to content/docs/advice.html.old diff --git a/content/docs/best-practices.html b/content/docs/best-practices.html.old similarity index 100% rename from content/docs/best-practices.html rename to content/docs/best-practices.html.old diff --git a/content/docs/branching.html b/content/docs/branching.html.old similarity index 100% rename from content/docs/branching.html rename to content/docs/branching.html.old diff --git a/content/docs/bugs.html b/content/docs/bugs.html.old similarity index 100% rename from content/docs/bugs.html rename to content/docs/bugs.html.old diff --git a/content/docs/build.html b/content/docs/build.html.old similarity index 100% rename from content/docs/build.html rename to content/docs/build.html.old diff --git a/content/docs/clog/actions.html b/content/docs/clog/actions.html.old similarity index 100% rename from content/docs/clog/actions.html rename to content/docs/clog/actions.html.old diff --git a/content/docs/clog/clone.html b/content/docs/clog/clone.html.old similarity index 100% rename from content/docs/clog/clone.html rename to content/docs/clog/clone.html.old diff --git a/content/docs/clog/color.html b/content/docs/clog/color.html.old similarity index 100% rename from content/docs/clog/color.html rename to content/docs/clog/color.html.old diff --git a/content/docs/clog/download.html b/content/docs/clog/download.html.old similarity index 100% rename from content/docs/clog/download.html rename to content/docs/clog/download.html.old diff --git a/content/docs/clog/example_apache.html b/content/docs/clog/example_apache.html.old similarity index 100% rename from content/docs/clog/example_apache.html rename to content/docs/clog/example_apache.html.old diff --git a/content/docs/clog/example_syslog.html b/content/docs/clog/example_syslog.html.old similarity index 100% rename from content/docs/clog/example_syslog.html rename to content/docs/clog/example_syslog.html.old diff --git a/content/docs/clog/help.html b/content/docs/clog/help.html.old similarity index 100% rename from content/docs/clog/help.html rename to content/docs/clog/help.html.old diff --git a/content/docs/clog/how.html b/content/docs/clog/how.html.old similarity index 100% rename from content/docs/clog/how.html rename to content/docs/clog/how.html.old diff --git a/content/docs/clog/index.html b/content/docs/clog/index.html.old similarity index 100% rename from content/docs/clog/index.html rename to content/docs/clog/index.html.old diff --git a/content/docs/clog/options.html b/content/docs/clog/options.html.old similarity index 100% rename from content/docs/clog/options.html rename to content/docs/clog/options.html.old diff --git a/content/docs/clog/patterns.html b/content/docs/clog/patterns.html.old similarity index 100% rename from content/docs/clog/patterns.html rename to content/docs/clog/patterns.html.old diff --git a/content/docs/clog/sections.html b/content/docs/clog/sections.html.old similarity index 100% rename from content/docs/clog/sections.html rename to content/docs/clog/sections.html.old diff --git a/content/docs/clog/setup.html b/content/docs/clog/setup.html.old similarity index 100% rename from content/docs/clog/setup.html rename to content/docs/clog/setup.html.old diff --git a/content/docs/clog/syntax.html b/content/docs/clog/syntax.html.old similarity index 100% rename from content/docs/clog/syntax.html rename to content/docs/clog/syntax.html.old diff --git a/content/docs/clog/what.html b/content/docs/clog/what.html.old similarity index 100% rename from content/docs/clog/what.html rename to content/docs/clog/what.html.old diff --git a/content/docs/coding_style.html b/content/docs/coding_style.html.old similarity index 100% rename from content/docs/coding_style.html rename to content/docs/coding_style.html.old diff --git a/content/docs/commands/_get.html b/content/docs/commands/_get.html.old similarity index 100% rename from content/docs/commands/_get.html rename to content/docs/commands/_get.html.old diff --git a/content/docs/commands/_unique.html b/content/docs/commands/_unique.html.old similarity index 100% rename from content/docs/commands/_unique.html rename to content/docs/commands/_unique.html.old diff --git a/content/docs/commands/add.html b/content/docs/commands/add.html.old similarity index 100% rename from content/docs/commands/add.html rename to content/docs/commands/add.html.old diff --git a/content/docs/commands/append.html b/content/docs/commands/append.html.old similarity index 100% rename from content/docs/commands/append.html rename to content/docs/commands/append.html.old diff --git a/content/docs/commands/burndown.html b/content/docs/commands/burndown.html.old similarity index 100% rename from content/docs/commands/burndown.html rename to content/docs/commands/burndown.html.old diff --git a/content/docs/commands/calc.html b/content/docs/commands/calc.html.old similarity index 100% rename from content/docs/commands/calc.html rename to content/docs/commands/calc.html.old diff --git a/content/docs/commands/columns.html b/content/docs/commands/columns.html.old similarity index 100% rename from content/docs/commands/columns.html rename to content/docs/commands/columns.html.old diff --git a/content/docs/commands/count.html b/content/docs/commands/count.html.old similarity index 100% rename from content/docs/commands/count.html rename to content/docs/commands/count.html.old diff --git a/content/docs/commands/done.html b/content/docs/commands/done.html.old similarity index 100% rename from content/docs/commands/done.html rename to content/docs/commands/done.html.old diff --git a/content/docs/commands/export.html b/content/docs/commands/export.html.old similarity index 100% rename from content/docs/commands/export.html rename to content/docs/commands/export.html.old diff --git a/content/docs/commands/index.html b/content/docs/commands/index.html.old similarity index 100% rename from content/docs/commands/index.html rename to content/docs/commands/index.html.old diff --git a/content/docs/commands/info.html b/content/docs/commands/info.html.old similarity index 100% rename from content/docs/commands/info.html rename to content/docs/commands/info.html.old diff --git a/content/docs/commands/list.html b/content/docs/commands/list.html.old similarity index 100% rename from content/docs/commands/list.html rename to content/docs/commands/list.html.old diff --git a/content/docs/commands/log.html b/content/docs/commands/log.html.old similarity index 100% rename from content/docs/commands/log.html rename to content/docs/commands/log.html.old diff --git a/content/docs/commands/missing.html b/content/docs/commands/missing.html.old similarity index 100% rename from content/docs/commands/missing.html rename to content/docs/commands/missing.html.old diff --git a/content/docs/commands/modify.html b/content/docs/commands/modify.html.old similarity index 100% rename from content/docs/commands/modify.html rename to content/docs/commands/modify.html.old diff --git a/content/docs/commands/prepend.html b/content/docs/commands/prepend.html.old similarity index 100% rename from content/docs/commands/prepend.html rename to content/docs/commands/prepend.html.old diff --git a/content/docs/commands/synchronize.html b/content/docs/commands/synchronize.html.old similarity index 100% rename from content/docs/commands/synchronize.html rename to content/docs/commands/synchronize.html.old diff --git a/content/docs/commands/template.html b/content/docs/commands/template.html.old similarity index 100% rename from content/docs/commands/template.html rename to content/docs/commands/template.html.old diff --git a/content/docs/configuration.html b/content/docs/configuration.html.old similarity index 100% rename from content/docs/configuration.html rename to content/docs/configuration.html.old diff --git a/content/docs/context.html b/content/docs/context.html.old similarity index 100% rename from content/docs/context.html rename to content/docs/context.html.old diff --git a/content/docs/contribute.html b/content/docs/contribute.html.old similarity index 100% rename from content/docs/contribute.html rename to content/docs/contribute.html.old diff --git a/content/docs/dates.html b/content/docs/dates.html.old similarity index 100% rename from content/docs/dates.html rename to content/docs/dates.html.old diff --git a/content/docs/deprecated.html b/content/docs/deprecated.html.old similarity index 100% rename from content/docs/deprecated.html rename to content/docs/deprecated.html.old diff --git a/content/docs/design/cli.html b/content/docs/design/cli.html.old similarity index 100% rename from content/docs/design/cli.html rename to content/docs/design/cli.html.old diff --git a/content/docs/design/client.html b/content/docs/design/client.html.old similarity index 100% rename from content/docs/design/client.html rename to content/docs/design/client.html.old diff --git a/content/docs/design/dom.html b/content/docs/design/dom.html.old similarity index 100% rename from content/docs/design/dom.html rename to content/docs/design/dom.html.old diff --git a/content/docs/design/index.html b/content/docs/design/index.html.old similarity index 100% rename from content/docs/design/index.html rename to content/docs/design/index.html.old diff --git a/content/docs/design/plans.html b/content/docs/design/plans.html.old similarity index 100% rename from content/docs/design/plans.html rename to content/docs/design/plans.html.old diff --git a/content/docs/design/protocol.html b/content/docs/design/protocol.html.old similarity index 100% rename from content/docs/design/protocol.html rename to content/docs/design/protocol.html.old diff --git a/content/docs/design/recurrence.html b/content/docs/design/recurrence.html.old similarity index 100% rename from content/docs/design/recurrence.html rename to content/docs/design/recurrence.html.old diff --git a/content/docs/design/request.html b/content/docs/design/request.html.old similarity index 100% rename from content/docs/design/request.html rename to content/docs/design/request.html.old diff --git a/content/docs/design/rules.html b/content/docs/design/rules.html.old similarity index 100% rename from content/docs/design/rules.html rename to content/docs/design/rules.html.old diff --git a/content/docs/design/sync.html b/content/docs/design/sync.html.old similarity index 100% rename from content/docs/design/sync.html rename to content/docs/design/sync.html.old diff --git a/content/docs/design/task.html b/content/docs/design/task.html.old similarity index 100% rename from content/docs/design/task.html rename to content/docs/design/task.html.old diff --git a/content/docs/design/workweek.html b/content/docs/design/workweek.html.old similarity index 100% rename from content/docs/design/workweek.html rename to content/docs/design/workweek.html.old diff --git a/content/docs/dom.html b/content/docs/dom.html.old similarity index 100% rename from content/docs/dom.html rename to content/docs/dom.html.old diff --git a/content/docs/durations.html b/content/docs/durations.html.old similarity index 100% rename from content/docs/durations.html rename to content/docs/durations.html.old diff --git a/content/docs/escapes.html b/content/docs/escapes.html.old similarity index 100% rename from content/docs/escapes.html rename to content/docs/escapes.html.old diff --git a/content/docs/examples.html b/content/docs/examples.html.old similarity index 100% rename from content/docs/examples.html rename to content/docs/examples.html.old diff --git a/content/docs/features.html b/content/docs/features.html.old similarity index 100% rename from content/docs/features.html rename to content/docs/features.html.old diff --git a/content/docs/filter.html b/content/docs/filter.html.old similarity index 100% rename from content/docs/filter.html rename to content/docs/filter.html.old diff --git a/content/docs/first_time.html b/content/docs/first_time.html.old similarity index 100% rename from content/docs/first_time.html rename to content/docs/first_time.html.old diff --git a/content/docs/help.html b/content/docs/help.html.old similarity index 100% rename from content/docs/help.html rename to content/docs/help.html.old diff --git a/content/docs/history.html b/content/docs/history.html.old similarity index 100% rename from content/docs/history.html rename to content/docs/history.html.old diff --git a/content/docs/history_td.html b/content/docs/history_td.html.old similarity index 100% rename from content/docs/history_td.html rename to content/docs/history_td.html.old diff --git a/content/docs/hooks.html b/content/docs/hooks.html.old similarity index 100% rename from content/docs/hooks.html rename to content/docs/hooks.html.old diff --git a/content/docs/hooks2.html b/content/docs/hooks2.html.old similarity index 100% rename from content/docs/hooks2.html rename to content/docs/hooks2.html.old diff --git a/content/docs/hooks_guide.html b/content/docs/hooks_guide.html.old similarity index 100% rename from content/docs/hooks_guide.html rename to content/docs/hooks_guide.html.old diff --git a/content/docs/ids.html b/content/docs/ids.html.old similarity index 100% rename from content/docs/ids.html rename to content/docs/ids.html.old diff --git a/content/docs/index.html b/content/docs/index.html.old similarity index 100% rename from content/docs/index.html rename to content/docs/index.html.old diff --git a/content/docs/introduction.html b/content/docs/introduction.html.old similarity index 100% rename from content/docs/introduction.html rename to content/docs/introduction.html.old diff --git a/content/docs/jobs.html b/content/docs/jobs.html.old similarity index 100% rename from content/docs/jobs.html rename to content/docs/jobs.html.old diff --git a/content/docs/license.html b/content/docs/license.html.old similarity index 100% rename from content/docs/license.html rename to content/docs/license.html.old diff --git a/content/docs/named_dates.html b/content/docs/named_dates.html.old similarity index 100% rename from content/docs/named_dates.html rename to content/docs/named_dates.html.old diff --git a/content/docs/philosophy.html b/content/docs/philosophy.html.old similarity index 100% rename from content/docs/philosophy.html rename to content/docs/philosophy.html.old diff --git a/content/docs/priority.html b/content/docs/priority.html.old similarity index 100% rename from content/docs/priority.html rename to content/docs/priority.html.old diff --git a/content/docs/recurrence.html b/content/docs/recurrence.html.old similarity index 100% rename from content/docs/recurrence.html rename to content/docs/recurrence.html.old diff --git a/content/docs/report.html b/content/docs/report.html.old similarity index 100% rename from content/docs/report.html rename to content/docs/report.html.old diff --git a/content/docs/review.html b/content/docs/review.html.old similarity index 100% rename from content/docs/review.html rename to content/docs/review.html.old diff --git a/content/docs/searching.html b/content/docs/searching.html.old similarity index 100% rename from content/docs/searching.html rename to content/docs/searching.html.old diff --git a/content/docs/start.html b/content/docs/start.html.old similarity index 100% rename from content/docs/start.html rename to content/docs/start.html.old diff --git a/content/docs/syntax.html b/content/docs/syntax.html.old similarity index 100% rename from content/docs/syntax.html rename to content/docs/syntax.html.old diff --git a/content/docs/tags.html b/content/docs/tags.html.old similarity index 100% rename from content/docs/tags.html rename to content/docs/tags.html.old diff --git a/content/docs/taskserver/ciphers.html b/content/docs/taskserver/ciphers.html.old similarity index 100% rename from content/docs/taskserver/ciphers.html rename to content/docs/taskserver/ciphers.html.old diff --git a/content/docs/taskserver/configure.html b/content/docs/taskserver/configure.html.old similarity index 100% rename from content/docs/taskserver/configure.html rename to content/docs/taskserver/configure.html.old diff --git a/content/docs/taskserver/control.html b/content/docs/taskserver/control.html.old similarity index 100% rename from content/docs/taskserver/control.html rename to content/docs/taskserver/control.html.old diff --git a/content/docs/taskserver/git.html b/content/docs/taskserver/git.html.old similarity index 100% rename from content/docs/taskserver/git.html rename to content/docs/taskserver/git.html.old diff --git a/content/docs/taskserver/package.html b/content/docs/taskserver/package.html.old similarity index 100% rename from content/docs/taskserver/package.html rename to content/docs/taskserver/package.html.old diff --git a/content/docs/taskserver/prep.html b/content/docs/taskserver/prep.html.old similarity index 100% rename from content/docs/taskserver/prep.html rename to content/docs/taskserver/prep.html.old diff --git a/content/docs/taskserver/protocol.html b/content/docs/taskserver/protocol.html.old similarity index 100% rename from content/docs/taskserver/protocol.html rename to content/docs/taskserver/protocol.html.old diff --git a/content/docs/taskserver/setup.html b/content/docs/taskserver/setup.html.old similarity index 100% rename from content/docs/taskserver/setup.html rename to content/docs/taskserver/setup.html.old diff --git a/content/docs/taskserver/sync.html b/content/docs/taskserver/sync.html.old similarity index 100% rename from content/docs/taskserver/sync.html rename to content/docs/taskserver/sync.html.old diff --git a/content/docs/taskserver/tarball.html b/content/docs/taskserver/tarball.html.old similarity index 100% rename from content/docs/taskserver/tarball.html rename to content/docs/taskserver/tarball.html.old diff --git a/content/docs/taskserver/taskwarrior.html b/content/docs/taskserver/taskwarrior.html.old similarity index 100% rename from content/docs/taskserver/taskwarrior.html rename to content/docs/taskserver/taskwarrior.html.old diff --git a/content/docs/taskserver/troubleshooting-sync.html b/content/docs/taskserver/troubleshooting-sync.html.old similarity index 100% rename from content/docs/taskserver/troubleshooting-sync.html rename to content/docs/taskserver/troubleshooting-sync.html.old diff --git a/content/docs/taskserver/upgrade.html b/content/docs/taskserver/upgrade.html.old similarity index 100% rename from content/docs/taskserver/upgrade.html rename to content/docs/taskserver/upgrade.html.old diff --git a/content/docs/taskserver/user.html b/content/docs/taskserver/user.html.old similarity index 100% rename from content/docs/taskserver/user.html rename to content/docs/taskserver/user.html.old diff --git a/content/docs/taskserver/why.html b/content/docs/taskserver/why.html.old similarity index 100% rename from content/docs/taskserver/why.html rename to content/docs/taskserver/why.html.old diff --git a/content/docs/template.html b/content/docs/template.html.old similarity index 100% rename from content/docs/template.html rename to content/docs/template.html.old diff --git a/content/docs/terminology.html b/content/docs/terminology.html.old similarity index 100% rename from content/docs/terminology.html rename to content/docs/terminology.html.old diff --git a/content/docs/themes.html b/content/docs/themes.html.old similarity index 100% rename from content/docs/themes.html rename to content/docs/themes.html.old diff --git a/content/docs/triage.html b/content/docs/triage.html.old similarity index 100% rename from content/docs/triage.html rename to content/docs/triage.html.old diff --git a/content/docs/udas.html b/content/docs/udas.html.old similarity index 100% rename from content/docs/udas.html rename to content/docs/udas.html.old diff --git a/content/docs/unicode.html b/content/docs/unicode.html.old similarity index 100% rename from content/docs/unicode.html rename to content/docs/unicode.html.old diff --git a/content/docs/urgency.html b/content/docs/urgency.html.old similarity index 100% rename from content/docs/urgency.html rename to content/docs/urgency.html.old diff --git a/content/docs/using_dates.html b/content/docs/using_dates.html.old similarity index 100% rename from content/docs/using_dates.html rename to content/docs/using_dates.html.old diff --git a/content/docs/verbosity.html b/content/docs/verbosity.html.old similarity index 100% rename from content/docs/verbosity.html rename to content/docs/verbosity.html.old diff --git a/content/docs/workflow.html b/content/docs/workflow.html.old similarity index 100% rename from content/docs/workflow.html rename to content/docs/workflow.html.old diff --git a/content/download/index.html b/content/download/index.html.old similarity index 100% rename from content/download/index.html rename to content/download/index.html.old diff --git a/content/index.html b/content/index.html.old similarity index 100% rename from content/index.html rename to content/index.html.old diff --git a/content/news/index.html b/content/news/index.html.old similarity index 100% rename from content/news/index.html rename to content/news/index.html.old diff --git a/content/news/news.20140212.html b/content/news/news.20140212.html.old similarity index 100% rename from content/news/news.20140212.html rename to content/news/news.20140212.html.old diff --git a/content/news/news.20140217.html b/content/news/news.20140217.html.old similarity index 100% rename from content/news/news.20140217.html rename to content/news/news.20140217.html.old diff --git a/content/news/news.20140220.html b/content/news/news.20140220.html.old similarity index 100% rename from content/news/news.20140220.html rename to content/news/news.20140220.html.old diff --git a/content/news/news.20140226.html b/content/news/news.20140226.html.old similarity index 100% rename from content/news/news.20140226.html rename to content/news/news.20140226.html.old diff --git a/content/news/news.20140227.html b/content/news/news.20140227.html.old similarity index 100% rename from content/news/news.20140227.html rename to content/news/news.20140227.html.old diff --git a/content/news/news.20140303.html b/content/news/news.20140303.html.old similarity index 100% rename from content/news/news.20140303.html rename to content/news/news.20140303.html.old diff --git a/content/news/news.20140309.html b/content/news/news.20140309.html.old similarity index 100% rename from content/news/news.20140309.html rename to content/news/news.20140309.html.old diff --git a/content/news/news.20140406.html b/content/news/news.20140406.html.old similarity index 100% rename from content/news/news.20140406.html rename to content/news/news.20140406.html.old diff --git a/content/news/news.20140407.html b/content/news/news.20140407.html.old similarity index 100% rename from content/news/news.20140407.html rename to content/news/news.20140407.html.old diff --git a/content/news/news.20140412.html b/content/news/news.20140412.html.old similarity index 100% rename from content/news/news.20140412.html rename to content/news/news.20140412.html.old diff --git a/content/news/news.20140429.html b/content/news/news.20140429.html.old similarity index 100% rename from content/news/news.20140429.html rename to content/news/news.20140429.html.old diff --git a/content/news/news.20140510.html b/content/news/news.20140510.html.old similarity index 100% rename from content/news/news.20140510.html rename to content/news/news.20140510.html.old diff --git a/content/news/news.20140524.html b/content/news/news.20140524.html.old similarity index 100% rename from content/news/news.20140524.html rename to content/news/news.20140524.html.old diff --git a/content/news/news.20140607.html b/content/news/news.20140607.html.old similarity index 100% rename from content/news/news.20140607.html rename to content/news/news.20140607.html.old diff --git a/content/news/news.20140704.html b/content/news/news.20140704.html.old similarity index 100% rename from content/news/news.20140704.html rename to content/news/news.20140704.html.old diff --git a/content/news/news.20140816.html b/content/news/news.20140816.html.old similarity index 100% rename from content/news/news.20140816.html rename to content/news/news.20140816.html.old diff --git a/content/news/news.20140906.html b/content/news/news.20140906.html.old similarity index 100% rename from content/news/news.20140906.html rename to content/news/news.20140906.html.old diff --git a/content/news/news.20140915.html b/content/news/news.20140915.html.old similarity index 100% rename from content/news/news.20140915.html rename to content/news/news.20140915.html.old diff --git a/content/news/news.20140928.html b/content/news/news.20140928.html.old similarity index 100% rename from content/news/news.20140928.html rename to content/news/news.20140928.html.old diff --git a/content/news/news.20141011.html b/content/news/news.20141011.html.old similarity index 100% rename from content/news/news.20141011.html rename to content/news/news.20141011.html.old diff --git a/content/news/news.20141025.html b/content/news/news.20141025.html.old similarity index 100% rename from content/news/news.20141025.html rename to content/news/news.20141025.html.old diff --git a/content/news/news.20141111.html b/content/news/news.20141111.html.old similarity index 100% rename from content/news/news.20141111.html rename to content/news/news.20141111.html.old diff --git a/content/news/news.20141221.html b/content/news/news.20141221.html.old similarity index 100% rename from content/news/news.20141221.html rename to content/news/news.20141221.html.old diff --git a/content/news/news.20150101.html b/content/news/news.20150101.html.old similarity index 100% rename from content/news/news.20150101.html rename to content/news/news.20150101.html.old diff --git a/content/news/news.20150103.html b/content/news/news.20150103.html.old similarity index 100% rename from content/news/news.20150103.html rename to content/news/news.20150103.html.old diff --git a/content/news/news.20150207.html b/content/news/news.20150207.html.old similarity index 100% rename from content/news/news.20150207.html rename to content/news/news.20150207.html.old diff --git a/content/news/news.20150216.html b/content/news/news.20150216.html.old similarity index 100% rename from content/news/news.20150216.html rename to content/news/news.20150216.html.old diff --git a/content/news/news.20150228.html b/content/news/news.20150228.html.old similarity index 100% rename from content/news/news.20150228.html rename to content/news/news.20150228.html.old diff --git a/content/news/news.20150301.html b/content/news/news.20150301.html.old similarity index 100% rename from content/news/news.20150301.html rename to content/news/news.20150301.html.old diff --git a/content/news/news.20150315.html b/content/news/news.20150315.html.old similarity index 100% rename from content/news/news.20150315.html rename to content/news/news.20150315.html.old diff --git a/content/news/news.20150331.html b/content/news/news.20150331.html.old similarity index 100% rename from content/news/news.20150331.html rename to content/news/news.20150331.html.old diff --git a/content/news/news.20150419.html b/content/news/news.20150419.html.old similarity index 100% rename from content/news/news.20150419.html rename to content/news/news.20150419.html.old diff --git a/content/news/news.20150430.html b/content/news/news.20150430.html.old similarity index 100% rename from content/news/news.20150430.html rename to content/news/news.20150430.html.old diff --git a/content/news/news.20150504.html b/content/news/news.20150504.html.old similarity index 100% rename from content/news/news.20150504.html rename to content/news/news.20150504.html.old diff --git a/content/news/news.20150509.html b/content/news/news.20150509.html.old similarity index 100% rename from content/news/news.20150509.html rename to content/news/news.20150509.html.old diff --git a/content/news/news.20150510.html b/content/news/news.20150510.html.old similarity index 100% rename from content/news/news.20150510.html rename to content/news/news.20150510.html.old diff --git a/content/news/news.20150511.html b/content/news/news.20150511.html.old similarity index 100% rename from content/news/news.20150511.html rename to content/news/news.20150511.html.old diff --git a/content/news/news.20150524.html b/content/news/news.20150524.html.old similarity index 100% rename from content/news/news.20150524.html rename to content/news/news.20150524.html.old diff --git a/content/news/news.20150601.html b/content/news/news.20150601.html.old similarity index 100% rename from content/news/news.20150601.html rename to content/news/news.20150601.html.old diff --git a/content/news/news.20150627.html b/content/news/news.20150627.html.old similarity index 100% rename from content/news/news.20150627.html rename to content/news/news.20150627.html.old diff --git a/content/news/news.20150701.html b/content/news/news.20150701.html.old similarity index 100% rename from content/news/news.20150701.html rename to content/news/news.20150701.html.old diff --git a/content/news/news.20150801.html b/content/news/news.20150801.html.old similarity index 100% rename from content/news/news.20150801.html rename to content/news/news.20150801.html.old diff --git a/content/news/news.20150901.html b/content/news/news.20150901.html.old similarity index 100% rename from content/news/news.20150901.html rename to content/news/news.20150901.html.old diff --git a/content/news/news.20150907.html b/content/news/news.20150907.html.old similarity index 100% rename from content/news/news.20150907.html rename to content/news/news.20150907.html.old diff --git a/content/news/news.20150916.html b/content/news/news.20150916.html.old similarity index 100% rename from content/news/news.20150916.html rename to content/news/news.20150916.html.old diff --git a/content/news/news.20150926.html b/content/news/news.20150926.html.old similarity index 100% rename from content/news/news.20150926.html rename to content/news/news.20150926.html.old diff --git a/content/news/news.20150927.html b/content/news/news.20150927.html.old similarity index 100% rename from content/news/news.20150927.html rename to content/news/news.20150927.html.old diff --git a/content/news/news.20150929.html b/content/news/news.20150929.html.old similarity index 100% rename from content/news/news.20150929.html rename to content/news/news.20150929.html.old diff --git a/content/news/news.20151001.html b/content/news/news.20151001.html.old similarity index 100% rename from content/news/news.20151001.html rename to content/news/news.20151001.html.old diff --git a/content/news/news.20151012.html b/content/news/news.20151012.html.old similarity index 100% rename from content/news/news.20151012.html rename to content/news/news.20151012.html.old diff --git a/content/news/news.20151017.html b/content/news/news.20151017.html.old similarity index 100% rename from content/news/news.20151017.html rename to content/news/news.20151017.html.old diff --git a/content/news/news.20151021.html b/content/news/news.20151021.html.old similarity index 100% rename from content/news/news.20151021.html rename to content/news/news.20151021.html.old diff --git a/content/news/news.20151029.html b/content/news/news.20151029.html.old similarity index 100% rename from content/news/news.20151029.html rename to content/news/news.20151029.html.old diff --git a/content/news/news.20151101.2.html b/content/news/news.20151101.2.html.old similarity index 100% rename from content/news/news.20151101.2.html rename to content/news/news.20151101.2.html.old diff --git a/content/news/news.20151101.html b/content/news/news.20151101.html.old similarity index 100% rename from content/news/news.20151101.html rename to content/news/news.20151101.html.old diff --git a/content/news/news.20151201.html b/content/news/news.20151201.html.old similarity index 100% rename from content/news/news.20151201.html rename to content/news/news.20151201.html.old diff --git a/content/news/news.20160101.html b/content/news/news.20160101.html.old similarity index 100% rename from content/news/news.20160101.html rename to content/news/news.20160101.html.old diff --git a/content/news/news.20160201.html b/content/news/news.20160201.html.old similarity index 100% rename from content/news/news.20160201.html rename to content/news/news.20160201.html.old diff --git a/content/news/news.20160205.html b/content/news/news.20160205.html.old similarity index 100% rename from content/news/news.20160205.html rename to content/news/news.20160205.html.old diff --git a/content/news/news.20160209.html b/content/news/news.20160209.html.old similarity index 100% rename from content/news/news.20160209.html rename to content/news/news.20160209.html.old diff --git a/content/news/news.20160224.html b/content/news/news.20160224.html.old similarity index 100% rename from content/news/news.20160224.html rename to content/news/news.20160224.html.old diff --git a/content/news/news.20160225.html b/content/news/news.20160225.html.old similarity index 100% rename from content/news/news.20160225.html rename to content/news/news.20160225.html.old diff --git a/content/news/news.20160301.html b/content/news/news.20160301.html.old similarity index 100% rename from content/news/news.20160301.html rename to content/news/news.20160301.html.old diff --git a/content/news/news.20160401.html b/content/news/news.20160401.html.old similarity index 100% rename from content/news/news.20160401.html rename to content/news/news.20160401.html.old diff --git a/content/news/news.20160407.html b/content/news/news.20160407.html.old similarity index 100% rename from content/news/news.20160407.html rename to content/news/news.20160407.html.old diff --git a/content/news/news.20160501.html b/content/news/news.20160501.html.old similarity index 100% rename from content/news/news.20160501.html rename to content/news/news.20160501.html.old diff --git a/content/news/news.20160514.html b/content/news/news.20160514.html.old similarity index 100% rename from content/news/news.20160514.html rename to content/news/news.20160514.html.old diff --git a/content/news/news.20160522.html b/content/news/news.20160522.html.old similarity index 100% rename from content/news/news.20160522.html rename to content/news/news.20160522.html.old diff --git a/content/news/news.20160604.html b/content/news/news.20160604.html.old similarity index 100% rename from content/news/news.20160604.html rename to content/news/news.20160604.html.old diff --git a/content/news/news.20160620.html b/content/news/news.20160620.html.old similarity index 100% rename from content/news/news.20160620.html rename to content/news/news.20160620.html.old diff --git a/content/news/news.20160627.html b/content/news/news.20160627.html.old similarity index 100% rename from content/news/news.20160627.html rename to content/news/news.20160627.html.old diff --git a/content/news/news.20160707.html b/content/news/news.20160707.html.old similarity index 100% rename from content/news/news.20160707.html rename to content/news/news.20160707.html.old diff --git a/content/news/news.20160725.html b/content/news/news.20160725.html.old similarity index 100% rename from content/news/news.20160725.html rename to content/news/news.20160725.html.old diff --git a/content/news/news.20160810.html b/content/news/news.20160810.html.old similarity index 100% rename from content/news/news.20160810.html rename to content/news/news.20160810.html.old diff --git a/content/news/news.20160813.html b/content/news/news.20160813.html.old similarity index 100% rename from content/news/news.20160813.html rename to content/news/news.20160813.html.old diff --git a/content/news/news.20160821.html b/content/news/news.20160821.html.old similarity index 100% rename from content/news/news.20160821.html rename to content/news/news.20160821.html.old diff --git a/content/news/news.20160824.html b/content/news/news.20160824.html.old similarity index 100% rename from content/news/news.20160824.html rename to content/news/news.20160824.html.old diff --git a/content/news/news.20160905.2.html b/content/news/news.20160905.2.html.old similarity index 100% rename from content/news/news.20160905.2.html rename to content/news/news.20160905.2.html.old diff --git a/content/news/news.20160905.html b/content/news/news.20160905.html.old similarity index 100% rename from content/news/news.20160905.html rename to content/news/news.20160905.html.old diff --git a/content/news/news.20161002.html b/content/news/news.20161002.html.old similarity index 100% rename from content/news/news.20161002.html rename to content/news/news.20161002.html.old diff --git a/content/news/news.20161102.html b/content/news/news.20161102.html.old similarity index 100% rename from content/news/news.20161102.html rename to content/news/news.20161102.html.old diff --git a/content/news/news.20161116.html b/content/news/news.20161116.html.old similarity index 100% rename from content/news/news.20161116.html rename to content/news/news.20161116.html.old diff --git a/content/news/news.20161203.html b/content/news/news.20161203.html.old similarity index 100% rename from content/news/news.20161203.html rename to content/news/news.20161203.html.old diff --git a/content/news/news.20161209.html b/content/news/news.20161209.html.old similarity index 100% rename from content/news/news.20161209.html rename to content/news/news.20161209.html.old diff --git a/content/news/news.20170102.html b/content/news/news.20170102.html.old similarity index 100% rename from content/news/news.20170102.html rename to content/news/news.20170102.html.old diff --git a/content/news/news.20170113.html b/content/news/news.20170113.html.old similarity index 100% rename from content/news/news.20170113.html rename to content/news/news.20170113.html.old diff --git a/content/news/news.20170208.html b/content/news/news.20170208.html.old similarity index 100% rename from content/news/news.20170208.html rename to content/news/news.20170208.html.old diff --git a/content/news/news.20170209.html b/content/news/news.20170209.html.old similarity index 100% rename from content/news/news.20170209.html rename to content/news/news.20170209.html.old diff --git a/content/news/news.20170301.html b/content/news/news.20170301.html.old similarity index 100% rename from content/news/news.20170301.html rename to content/news/news.20170301.html.old diff --git a/content/news/news.20170308.html b/content/news/news.20170308.html.old similarity index 100% rename from content/news/news.20170308.html rename to content/news/news.20170308.html.old diff --git a/content/news/news.20170401.html b/content/news/news.20170401.html.old similarity index 100% rename from content/news/news.20170401.html rename to content/news/news.20170401.html.old diff --git a/content/news/news.20170402.html b/content/news/news.20170402.html.old similarity index 100% rename from content/news/news.20170402.html rename to content/news/news.20170402.html.old diff --git a/content/news/news.20170509.html b/content/news/news.20170509.html.old similarity index 100% rename from content/news/news.20170509.html rename to content/news/news.20170509.html.old diff --git a/content/news/news.20170510.html b/content/news/news.20170510.html.old similarity index 100% rename from content/news/news.20170510.html rename to content/news/news.20170510.html.old diff --git a/content/news/news.20170510_2.html b/content/news/news.20170510_2.html.old similarity index 100% rename from content/news/news.20170510_2.html rename to content/news/news.20170510_2.html.old diff --git a/content/news/news.20180113.html b/content/news/news.20180113.html.old similarity index 100% rename from content/news/news.20180113.html rename to content/news/news.20180113.html.old diff --git a/content/news/news.20180114.html b/content/news/news.20180114.html.old similarity index 100% rename from content/news/news.20180114.html rename to content/news/news.20180114.html.old diff --git a/content/news/news.20180129.html b/content/news/news.20180129.html.old similarity index 100% rename from content/news/news.20180129.html rename to content/news/news.20180129.html.old diff --git a/content/news/news.20180203.2.html b/content/news/news.20180203.2.html.old similarity index 100% rename from content/news/news.20180203.2.html rename to content/news/news.20180203.2.html.old diff --git a/content/news/news.20180203.html b/content/news/news.20180203.html.old similarity index 100% rename from content/news/news.20180203.html rename to content/news/news.20180203.html.old diff --git a/content/news/news.20180204.html b/content/news/news.20180204.html.old similarity index 100% rename from content/news/news.20180204.html rename to content/news/news.20180204.html.old diff --git a/content/news/news.20191123.html b/content/news/news.20191123.html.old similarity index 100% rename from content/news/news.20191123.html rename to content/news/news.20191123.html.old diff --git a/content/news/news.20210125.html b/content/news/news.20210125.html.old similarity index 100% rename from content/news/news.20210125.html rename to content/news/news.20210125.html.old diff --git a/content/support/authors.html b/content/support/authors.html.old similarity index 100% rename from content/support/authors.html rename to content/support/authors.html.old diff --git a/content/support/faq.html b/content/support/faq.html.old similarity index 100% rename from content/support/faq.html rename to content/support/faq.html.old diff --git a/content/support/index.html b/content/support/index.html.old similarity index 100% rename from content/support/index.html rename to content/support/index.html.old diff --git a/content/tools/index.html b/content/tools/index.html.old similarity index 100% rename from content/tools/index.html rename to content/tools/index.html.old From 67d109779d66fb1434d65157bf26199d3b70c96e Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 14 Aug 2021 16:51:59 -0400 Subject: [PATCH 06/50] docs: Convert advice.html to advice.md --- content/docs/advice.html.old | 482 ----------------------------------- content/docs/advice.md | 127 +++++++++ 2 files changed, 127 insertions(+), 482 deletions(-) delete mode 100644 content/docs/advice.html.old create mode 100644 content/docs/advice.md diff --git a/content/docs/advice.html.old b/content/docs/advice.html.old deleted file mode 100644 index 569a85a5..00000000 --- a/content/docs/advice.html.old +++ /dev/null @@ -1,482 +0,0 @@ - - - - - - - - - - - Taskwarrior - What Have We Learned From This Open Source Project? - - - - - - - - - - - - - - -
-
-
-
- -
-
-

What Have We Learned From This Open Source Project?

-

- Here is the collected wisdom that we have gained from running the - Taskwarrior project for more than a decade. It has been rewarding, - enjoyable, and sometimes frustrating. We learned a lot about - users and Open Source expectations. -

- -

Advice To Open Source Project Contributors

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Start an open source project if you want to learn all you can about - software design, development, planning, testing, documenting, and - delivery; enjoy technical challenges, administrative challenges, - compromise, and will be satisfied hoping that someone out there is - benefitting from your work. - - Do not start an open source project if you need praise, warmth and - love from your fellow human beings. -

-
-

- If you could draw a boundary between that which is already - supported, and that which is not, you would find that all - the activity, discussion and drama occurs at that boundary. - - Feature requests only nibble at the periphery. - Bold changes originate elsewhere. -

-
-

- People will get excited about something a project doesn't yet - support. Deliver it, and they will get excited about the next - thing. -

-
-

- If a feature works well, you’ll never hear about it again. -

-
-

- There is a fine line between "richly-featured" and "bloated". - There may not be a line at all. -

-
-

- If you demo two features, and talk about twenty more, users still - only know about the two. Visual demonstrations have far greater impact. -

-
-

- Every change will ruin someone’s day. They will be sure to tell - you about it. - - The same change will improve someone's day. You will not hear of this. -

-
-

- People will disguise feature requests as bugs, which means either - they consider difference of opinion a defect, or believe that - calling it a flaw will force implementation, but hopefully they - just forgot to set the issue type to 'enhancement'. -

-
-

- Some people find it very difficult to articulate what they want. - It's worth being patient and finding out what they need. -

-
-

- What you keep out of a project is just as important as what you - allow in to a project. -

-
-

- Many new users will submit feature requests, just to show that they - are knowledgeable and clever. They don't really want that feature, - it's a form of positive feedback. -

-
-

- Beware of suggestions from users who have used your software for - only a day or so. Be equally aware of suggestions from users who - have used your software for a long, long time. -

-
-

- People will threaten to not use open source software because it lacks - a feature, thereby mistaking themselves for paying customers. -

-
-

- Many believe that if a change is small, it deserves to be in the - project, regardless of whether it makes sense for it to be there. -

-
-

- Users will go to the effort of seeking you out online, to directly - ask you a question that is answered two clicks from the front page - of a website. -

-
-

- A looping, animated GIF will be watched over and over, scrutinized - and understood. A paragraph of text will be ignored. -

-
-

- Man pages are too densely crammed with information, and too lengthy, - for most modern humans to ingest. -

-
-

- "What have you tried so far?" is the best question to identify - time wasters. -

-
-

- People will pick a fight with you about all your incidental choices. - Your issue tracker, your branching strategy, your version numbers, - the text editor you use, and so on. -

-
-

- You can choose the most permissive software license, and people will - still argue with you about your choice. -

-
-

- SEO consultants are not very good at searching the web, and learning - that you operate an open source, non-profit project. It says a lot. -

-
-

- No one has ever complained about an algorithm choice, code - structure, or code comments, but dozens have told us that - our use of whitespace is wrong. - - Complaints have not been about the code, but the gaps between code. - - Prioritize the complaints. -

-
-

- We hard-coded XTerm color control sequences, bypassing termcap. - That was ten years ago. No one has noticed. - - Sometimes, what looks like an expedient shortcut is perfectly - good. -

-
-

- We had a very long and detailed tutorial page on the site - for years. To go through and read it all would have taken - at least an hour. - - At the very bottom, was a video of a band playing the Mexican - Hat Dance using only hand-fart noises. - - No one ever mentioned this. Keep your tutorials short. -

-
-

- Presence at industry events is important. Offering talks and - workshops helps make people aware of your project. -

-
-

- "Virtual teams" work well, but it gets even better after - meeting in real life. -

-
-

- It is good if the members of your team share the same sense of humor. - If not, be careful writing messages with an ironic tone. -

-
-

- A development-class machine is no indication of the kind of - hardware and software your users are running. Dependencies and - tools are often far behind the latest versions. -

-
-

- Respond to every means of communication. It is worth it. -

-
-

- Have a recognizable logo. - - Do not make the logo yourself, if you are not a designer. - If you have no budget, ask a designer to judge your work. -

-
-

- Offering gratis stickers is great, having SWAG - Souvenirs, Wearables - And Gifts - users can choose from is even better. -

-
-

- People love to make mashups of two things, or add - an extension to a thing. Very few contributors - want to work on the thing. -

-
-

- Calm down, take a deep breath and look back at what you achieved. - - Details, mistakes, compromises, incomplete plans and unfulfilled wishes - are only visible from inside the project. Be proud, and make new - plans. -

-
-

- Create a website containing the philosophy behind your project to - help people understand what your project is about. -

-
-
- -
-
-
-
-
- - -
-
-
-
- - - - - - - diff --git a/content/docs/advice.md b/content/docs/advice.md new file mode 100644 index 00000000..37083c84 --- /dev/null +++ b/content/docs/advice.md @@ -0,0 +1,127 @@ +--- +title: 'Taskwarrior - What Have We Learned From This Open Source Project?' +--- + +### What Have We Learned From This Open Source Project? + +Here is the collected wisdom that we have gained from running the Taskwarrior +project for more than a decade. It has been rewarding, enjoyable, and sometimes +frustrating. We learned a lot about users and Open Source expectations. + +### Advice To Open Source Project Contributors + +Start an open source project if you want to learn all you can about software +design, development, planning, testing, documenting, and delivery; enjoy +technical challenges, administrative challenges, compromise, and will be +satisfied hoping that someone out there is benefitting from your work. Do not +start an open source project if you need praise, warmth and love from your +fellow human beings. + +If you could draw a boundary between that which is already supported, and that +which is not, you would find that all the activity, discussion and drama occurs +at that boundary. Feature requests only nibble at the periphery. Bold changes +originate elsewhere. + +People will get excited about something a project doesn\'t yet support. Deliver +it, and they will get excited about the next thing. + +If a feature works well, you'll never hear about it again. + +There is a fine line between \"richly-featured\" and \"bloated\". There may not +be a line at all. + +If you demo two features, and talk about twenty more, users still only know +about the two. Visual demonstrations have far greater impact. + +Every change will ruin someone's day. They will be sure to tell you about it. +The same change will improve someone\'s day. You will not hear of this. + +People will disguise feature requests as bugs, which means either they consider +difference of opinion a defect, or believe that calling it a flaw will force +implementation, but hopefully they just forgot to set the issue type to +\'enhancement\'. + +Some people find it very difficult to articulate what they want. It\'s worth +being patient and finding out what they need. + +What you keep out of a project is just as important as what you allow in to a +project. + +Many new users will submit feature requests, just to show that they are +knowledgeable and clever. They don\'t really want that feature, it\'s a form of +positive feedback. + +Beware of suggestions from users who have used your software for only a day or +so. Be equally aware of suggestions from users who have used your software for a +long, long time. + +People will threaten to not use open source software because it lacks a feature, +thereby mistaking themselves for paying customers. + +Many believe that if a change is small, it deserves to be in the project, +regardless of whether it makes sense for it to be there. + +Users will go to the effort of seeking you out online, to directly ask you a +question that is answered two clicks from the front page of a website. + +A looping, animated GIF will be watched over and over, scrutinized and +understood. A paragraph of text will be ignored. + +Man pages are too densely crammed with information, and too lengthy, for most +modern humans to ingest. + +*\"What have you tried so far?\"* is the best question to identify time wasters. + +People will pick a fight with you about all your incidental choices. Your issue +tracker, your branching strategy, your version numbers, the text editor you use, +and so on. + +You can choose the most permissive software license, and people will still argue +with you about your choice. + +SEO consultants are not very good at searching the web, and learning that you +operate an open source, non-profit project. It says a lot. + +No one has ever complained about an algorithm choice, code structure, or code +comments, but dozens have told us that our use of whitespace is wrong. +Complaints have not been about the code, but the gaps between code. Prioritize +the complaints. + +We hard-coded XTerm color control sequences, bypassing termcap. That was ten +years ago. No one has noticed. Sometimes, what looks like an expedient shortcut +is perfectly good. + +We had a very long and detailed tutorial page on the site for years. To go +through and read it all would have taken at least an hour. At the very bottom, +was a video of a band playing the Mexican Hat Dance using only hand-fart noises. +No one ever mentioned this. Keep your tutorials short. + +Presence at industry events is important. Offering talks and workshops helps +make people aware of your project. + +\"Virtual teams\" work well, but it gets even better after meeting in real life. + +It is good if the members of your team share the same sense of humor. If not, be +careful writing messages with an ironic tone. + +A development-class machine is no indication of the kind of hardware and +software your users are running. Dependencies and tools are often far behind the +latest versions. + +Respond to every means of communication. It is worth it. + +Have a recognizable logo. Do not make the logo yourself, if you are not a +designer. If you have no budget, ask a designer to judge your work. + +Offering gratis stickers is great, having SWAG \- Souvenirs, Wearables And Gifts +\- users can choose from is even better. + +People love to make mashups of two `things`, or add an extension to a `thing`. +Very few contributors want to work on the `thing`. + +Calm down, take a deep breath and look back at what you achieved. Details, +mistakes, compromises, incomplete plans and unfulfilled wishes are only visible +from inside the project. Be proud, and make new plans. + +Create a website containing the philosophy behind your project to help people +understand what your project is about. From 079c8053ba49748fb45d47a60113672994f48fae Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 21 Aug 2021 21:11:27 -0400 Subject: [PATCH 07/50] content: Add docs/design/recurrence.md --- content/docs/design/recurrence.md | 206 ++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 content/docs/design/recurrence.md diff --git a/content/docs/design/recurrence.md b/content/docs/design/recurrence.md new file mode 100644 index 00000000..93260d53 --- /dev/null +++ b/content/docs/design/recurrence.md @@ -0,0 +1,206 @@ +--- +title: "Taskwarrior - Recurrence" +--- + +### Draft + +This is a draft design document. Your +[feedback](mailto:support@taskwarrior.org?Subject=Feedback) is welcomed. + +Recurrence +---------- + +Recurrence needs an overhaul to improve weaknesses and add new features. + +### Terminology + +- The hidden \'parent\' task is called the template. +- Synthesis is the name for the generation of new recurring task instances + when necessary. +- The synthesized tasks are called instances. +- The index is the zero-based monotonically increasing number of the instance. +- Drift is the accumulated errors in time that cause a due date to slowly + change for each recurring task. + +### Criticism of Current Implementation + +- The `mask` attribute grows unbounded. +- Only strict recurrence cycles are supported. The example of mowing the lawn + is that you want to mow the lawn every seven days, but when you are four + days late mowing the lawn, the next mowing should be in seven days, not in + three. +- Intances generated on one machine and then synced, may collide with + equivalent unsynced instances tasks on another device, because the UUIDs are + different. +- You cannot `wait` a recurring task and have that wait period propagate to + all other child tasks. +- Task instances cannot individually expire. + +### Proposals + +#### Proposal: Eliminate `mask`, `imaѕk` Attributes + +The `mask` attribute in the template is replaced by `last`, which indicates the +most recent instance index synthesized. Because instances are never synthesized +out of order, we only need to store the most recent index. The `imask` attribute +in the instance is no longer needed. + +#### Proposal: Rename `parent` to `template` + +The name `parent` implies subtasks, and confuses those who inspect the +internals. The value remains the UUID of the template. This frees up the +namespace for future use with subtasks. + +#### Proposal: New \'rtype\' attribute + +To indicate the flavor of recurrence, support the following values: + + ------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + `periodic` Instances are created on a regular schedule. Example: send birthday flowers. It must occur on a regular schedule, and doesn\'t matter if you were late last year. This is the default value. + `chained` Instances are created back to back, so when one instance ends, the next begins, with the same recurrence. Example: mow the lawn. If you mow two days late, the next instance is not two days early to compensate. + ------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +#### Proposal: Use relative offsets + +The delta between `wait` and `due` date in the template should be reflected in +the delta between `wait` and `due` date in the instance. Similarly, +\'scheduled\' must be handled the same way. + +#### Proposal: On load, auto-upgrade legacy tasks + +Upgrade template: + +- Add `rtype:periodic` +- Add `last:N` where `N` is the length of `mask` +- Delete `mask` + +Upgrade instance: + +- Rename `parent` to `template` +- Delete `imask` +- Update `wait` if not set to: `wait:due + (template.due - template.wait)` +- Update `scheduled` if not set to: + `scheduled:due + (template.due - template.scheduled)` + +#### Proposal: Deleting a chained instance + +Deleting a `rtype:chained` instance causes the next chained instance to be +synthesized. This gives the illusion that the due date is simply pushed out to +`(now + template.recur)`. + +#### Proposal: Modification Propagation + +TBD + +#### Proposal: Exotic Dates + +Expand date specifications to use pattern phrases: + +- `4th thursday in November` +- `4th thursday of November` +- `Friday before easter` +- `next Tuesday` +- `last Tuesday` +- `last July` +- `weekend` +- `3 days before eom` +- `in the morning` +- `4pm` +- `noon` +- `midnight` + +Got suggestions? + +#### Proposal: User-Defined Week Start + +TBD + +### Implementation + +#### Implementation: Adding a new `periodic` template + +When adding a new periodic template: + + task add ... due:D recur:R wait:D-1wk scheduled:D-1wk until:U + +Creates: + + template.uuid: NEW_UUID + template.description: ... + template.entry: now + template.modified: now + template.due: D + template.recur: R (stored in raw form, ie 'P14D') + template.wait: D-1wk + template.scheduled: D-1wk + template.until: U + template.rtype: periodic + template.last: + +Creating the Nth instance (index N): + + Clone instance from template. + + instance.uuid: NEW_UUID + instance.modified: now + instance.due: template.due + (N * template.recur) + instance.wait: instance.due + (template.due - template.wait) + instance.scheduled: instance.due + (template.due - template.scheduled) + instance.start: + + template.last: N + +#### Implementation: Adding a new `chained` template + +When adding a new chained template: + + task add ... due:D recur:R wait:D-1wk scheduled:D-1wk until:U rtype:chained + +Creates: + + template.uuid: NEW_UUID + template.description: ... + template.entry: now + template.modified: now + template.due: D + template.recur: R (stored in raw form, ie 'P14D') + template.wait: D-1wk + template.scheduled: D-1wk + template.until: U + template.rtype: chained + +Creating the Nth instance (index N): + + Clone instance from template. + + instance.uui d: NEW_UUID + instance.mod ified: now + instance.due : instance[N-1].end + template.recur + instance.wai t: instance.due + (template.due - template.wait) + instance.sch eduled: instance.due + (template.due - template.scheduled) + instance.sta rt: + +Chained tasks do not obey `rc.recurrence.limit`, and show only one pending task +at a time. + +#### Implementation: Special handling for months + +Certain recurrence periods are inexact: + +- P1M +- P1Y +- P1D + +When the recurrence period is `P1M` the number of days in a month varies and +causes drift. + +When the recurrence period is `P1Y` the number of days in a year varies and +causes drift. + +When the recurrence period is `P1D` the number of hours in a day varies due to +daylight savings, and causes drift. + +Drift should be avoided by carefully implementing: + + instance.due: template.due + (N * template.recur) +::: From 71604737a010a14d2e032d04075c50de31308744 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 2 Oct 2021 22:56:16 -0400 Subject: [PATCH 08/50] defaults: Do not make articles draft by default --- archetypes/default.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archetypes/default.md b/archetypes/default.md index 00e77bd7..3ecdc760 100644 --- a/archetypes/default.md +++ b/archetypes/default.md @@ -1,6 +1,6 @@ --- title: "{{ replace .Name "-" " " | title }}" date: {{ .Date }} -draft: true +lang: en --- From 3512025342467cf1476396279b9c82deae28291f Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Wed, 22 Dec 2021 10:32:31 -0500 Subject: [PATCH 09/50] md: Add all pandoc-converted markdown files --- content/_index.md | 252 ++++ content/about.md | 7 + content/backup | 54 + content/conduct.md | 13 + content/docs/30second.md | 63 + content/docs/3rd-party.md | 82 ++ content/docs/_index.md | 226 ++++ content/docs/best-practices.md | 185 +++ content/docs/branching.md | 96 ++ content/docs/bugs.md | 39 + content/docs/build.md | 113 ++ content/docs/clog/actions.md | 54 + content/docs/clog/clone.md | 109 ++ content/docs/clog/color.md | 164 +++ content/docs/clog/download.md | 50 + content/docs/clog/example_apache.md | 15 + content/docs/clog/example_syslog.md | 16 + content/docs/clog/help.md | 21 + content/docs/clog/how.md | 28 + content/docs/clog/index.md | 9 + content/docs/clog/options.md | 41 + content/docs/clog/patterns.md | 41 + content/docs/clog/sections.md | 43 + content/docs/clog/setup.md | 34 + content/docs/clog/syntax.md | 25 + content/docs/clog/what.md | 55 + content/docs/coding_style.md | 46 + content/docs/commands/_get.md | 42 + content/docs/commands/_unique.md | 59 + content/docs/commands/add.md | 68 + content/docs/commands/append.md | 32 + content/docs/commands/burndown.md | 76 ++ content/docs/commands/calc.md | 219 ++++ content/docs/commands/columns.md | 142 ++ content/docs/commands/count.md | 29 + content/docs/commands/done.md | 77 ++ content/docs/commands/export.md | 63 + content/docs/commands/index.md | 141 ++ content/docs/commands/info.md | 98 ++ content/docs/commands/list.md | 91 ++ content/docs/commands/log.md | 33 + content/docs/commands/missing.md | 14 + content/docs/commands/modify.md | 105 ++ content/docs/commands/prepend.md | 34 + content/docs/commands/synchronize.md | 75 ++ content/docs/commands/template.md | 34 + content/docs/configuration.md | 108 ++ content/docs/context.md | 133 ++ content/docs/contribute.md | 52 + content/docs/dates.md | 482 +++++++ content/docs/deprecated.md | 135 ++ content/docs/design/cli.md | 168 +++ content/docs/design/client.md | 473 +++++++ content/docs/design/dom.md | 271 ++++ content/docs/design/index.md | 179 +++ content/docs/design/plans.md | 226 ++++ content/docs/design/protocol.md | 223 ++++ content/docs/design/request.md | 233 ++++ content/docs/design/rules.md | 248 ++++ content/docs/design/sync.md | 268 ++++ content/docs/design/task.md | 554 ++++++++ content/docs/design/workweek.md | 39 + content/docs/dom.md | 232 ++++ content/docs/durations.md | 223 ++++ content/docs/escapes.md | 92 ++ content/docs/examples.md | 363 ++++++ content/docs/features.md | 97 ++ content/docs/filter.md | 178 +++ content/docs/first_time.md | 253 ++++ content/docs/help.md | 88 ++ content/docs/history.md | 57 + content/docs/history_td.md | 4 + content/docs/hooks.md | 227 ++++ content/docs/hooks2.md | 118 ++ content/docs/hooks_guide.md | 241 ++++ content/docs/ids.md | 73 ++ content/docs/introduction.md | 76 ++ content/docs/jobs.md | 210 +++ content/docs/license.md | 26 + content/docs/named_dates.md | 130 ++ content/docs/philosophy.md | 139 ++ content/docs/priority.md | 75 ++ content/docs/recurrence.md | 102 ++ content/docs/report.md | 294 +++++ content/docs/review.md | 98 ++ content/docs/searching.md | 109 ++ content/docs/start.md | 215 +++ content/docs/syntax.md | 108 ++ content/docs/tags.md | 118 ++ content/docs/taskserver/ciphers.md | 241 ++++ content/docs/taskserver/configure.md | 121 ++ content/docs/taskserver/control.md | 87 ++ content/docs/taskserver/git.md | 180 +++ content/docs/taskserver/package.md | 22 + content/docs/taskserver/prep.md | 60 + content/docs/taskserver/protocol.md | 51 + content/docs/taskserver/setup.md | 4 + content/docs/taskserver/sync.md | 77 ++ content/docs/taskserver/tarball.md | 111 ++ content/docs/taskserver/taskwarrior.md | 70 + .../docs/taskserver/troubleshooting-sync.md | 213 +++ content/docs/taskserver/upgrade.md | 79 ++ content/docs/taskserver/user.md | 79 ++ content/docs/taskserver/why.md | 31 + content/docs/template.md | 4 + content/docs/terminology.md | 952 ++++++++++++++ content/docs/themes.md | 111 ++ content/docs/triage.md | 63 + content/docs/udas.md | 132 ++ content/docs/unicode.md | 15 + content/docs/urgency.md | 117 ++ content/docs/using_dates.md | 203 +++ content/docs/verbosity.md | 54 + content/docs/workflow.md | 248 ++++ content/download/index.md | 239 ++++ content/news/index.md | 1151 +++++++++++++++++ content/news/news.20140212.md | 25 + content/news/news.20140217.md | 12 + content/news/news.20140220.md | 50 + content/news/news.20140226.md | 22 + content/news/news.20140227.md | 24 + content/news/news.20140303.md | 18 + content/news/news.20140309.md | 19 + content/news/news.20140406.md | 33 + content/news/news.20140407.md | 22 + content/news/news.20140412.md | 25 + content/news/news.20140429.md | 27 + content/news/news.20140510.md | 27 + content/news/news.20140524.md | 44 + content/news/news.20140607.md | 25 + content/news/news.20140704.md | 133 ++ content/news/news.20140816.md | 82 ++ content/news/news.20140906.md | 16 + content/news/news.20140915.md | 42 + content/news/news.20140928.md | 13 + content/news/news.20141011.md | 11 + content/news/news.20141025.md | 18 + content/news/news.20141111.md | 11 + content/news/news.20141221.md | 26 + content/news/news.20150101.md | 63 + content/news/news.20150103.md | 14 + content/news/news.20150207.md | 188 +++ content/news/news.20150216.md | 29 + content/news/news.20150228.md | 4 + content/news/news.20150301.md | 168 +++ content/news/news.20150315.md | 31 + content/news/news.20150331.md | 30 + content/news/news.20150419.md | 45 + content/news/news.20150430.md | 268 ++++ content/news/news.20150504.md | 58 + content/news/news.20150509.md | 30 + content/news/news.20150510.md | 28 + content/news/news.20150511.md | 64 + content/news/news.20150524.md | 10 + content/news/news.20150601.md | 43 + content/news/news.20150627.md | 24 + content/news/news.20150701.md | 198 +++ content/news/news.20150801.md | 313 +++++ content/news/news.20150901.md | 280 ++++ content/news/news.20150907.md | 68 + content/news/news.20150916.md | 11 + content/news/news.20150926.md | 14 + content/news/news.20150927.md | 14 + content/news/news.20150929.md | 13 + content/news/news.20151001.md | 230 ++++ content/news/news.20151012.md | 14 + content/news/news.20151017.md | 11 + content/news/news.20151021.md | 67 + content/news/news.20151029.md | 23 + content/news/news.20151101.2.md | 17 + content/news/news.20151101.md | 129 ++ content/news/news.20151201.md | 162 +++ content/news/news.20160101.md | 119 ++ content/news/news.20160201.md | 177 +++ content/news/news.20160205.md | 14 + content/news/news.20160209.md | 26 + content/news/news.20160224.md | 20 + content/news/news.20160225.md | 29 + content/news/news.20160301.md | 166 +++ content/news/news.20160401.md | 132 ++ content/news/news.20160407.md | 15 + content/news/news.20160501.md | 202 +++ content/news/news.20160514.md | 7 + content/news/news.20160522.md | 18 + content/news/news.20160604.md | 347 +++++ content/news/news.20160620.md | 27 + content/news/news.20160627.md | 17 + content/news/news.20160707.md | 208 +++ content/news/news.20160725.md | 24 + content/news/news.20160810.md | 127 ++ content/news/news.20160813.md | 65 + content/news/news.20160821.md | 50 + content/news/news.20160824.md | 25 + content/news/news.20160905.2.md | 17 + content/news/news.20160905.md | 104 ++ content/news/news.20161002.md | 112 ++ content/news/news.20161102.md | 137 ++ content/news/news.20161116.md | 12 + content/news/news.20161203.md | 126 ++ content/news/news.20161209.md | 22 + content/news/news.20170102.md | 153 +++ content/news/news.20170113.md | 16 + content/news/news.20170208.md | 37 + content/news/news.20170209.md | 201 +++ content/news/news.20170301.md | 280 ++++ content/news/news.20170308.md | 32 + content/news/news.20170401.md | 137 ++ content/news/news.20170402.md | 35 + content/news/news.20170509.md | 95 ++ content/news/news.20170510.md | 15 + content/news/news.20170510_2.md | 12 + content/news/news.20180113.md | 112 ++ content/news/news.20180114.md | 185 +++ content/news/news.20180129.md | 20 + content/news/news.20180203.2.md | 31 + content/news/news.20180203.md | 56 + content/news/news.20180204.md | 66 + content/news/news.20191123.md | 19 + content/news/news.20210125.md | 32 + content/support/authors.md | 82 ++ content/support/faq.md | 614 +++++++++ content/support/index.md | 160 +++ content/tools/index.md | 139 ++ 223 files changed, 24026 insertions(+) create mode 100644 content/_index.md create mode 100644 content/about.md create mode 100644 content/backup create mode 100644 content/conduct.md create mode 100644 content/docs/30second.md create mode 100644 content/docs/3rd-party.md create mode 100644 content/docs/_index.md create mode 100644 content/docs/best-practices.md create mode 100644 content/docs/branching.md create mode 100644 content/docs/bugs.md create mode 100644 content/docs/build.md create mode 100644 content/docs/clog/actions.md create mode 100644 content/docs/clog/clone.md create mode 100644 content/docs/clog/color.md create mode 100644 content/docs/clog/download.md create mode 100644 content/docs/clog/example_apache.md create mode 100644 content/docs/clog/example_syslog.md create mode 100644 content/docs/clog/help.md create mode 100644 content/docs/clog/how.md create mode 100644 content/docs/clog/index.md create mode 100644 content/docs/clog/options.md create mode 100644 content/docs/clog/patterns.md create mode 100644 content/docs/clog/sections.md create mode 100644 content/docs/clog/setup.md create mode 100644 content/docs/clog/syntax.md create mode 100644 content/docs/clog/what.md create mode 100644 content/docs/coding_style.md create mode 100644 content/docs/commands/_get.md create mode 100644 content/docs/commands/_unique.md create mode 100644 content/docs/commands/add.md create mode 100644 content/docs/commands/append.md create mode 100644 content/docs/commands/burndown.md create mode 100644 content/docs/commands/calc.md create mode 100644 content/docs/commands/columns.md create mode 100644 content/docs/commands/count.md create mode 100644 content/docs/commands/done.md create mode 100644 content/docs/commands/export.md create mode 100644 content/docs/commands/index.md create mode 100644 content/docs/commands/info.md create mode 100644 content/docs/commands/list.md create mode 100644 content/docs/commands/log.md create mode 100644 content/docs/commands/missing.md create mode 100644 content/docs/commands/modify.md create mode 100644 content/docs/commands/prepend.md create mode 100644 content/docs/commands/synchronize.md create mode 100644 content/docs/commands/template.md create mode 100644 content/docs/configuration.md create mode 100644 content/docs/context.md create mode 100644 content/docs/contribute.md create mode 100644 content/docs/dates.md create mode 100644 content/docs/deprecated.md create mode 100644 content/docs/design/cli.md create mode 100644 content/docs/design/client.md create mode 100644 content/docs/design/dom.md create mode 100644 content/docs/design/index.md create mode 100644 content/docs/design/plans.md create mode 100644 content/docs/design/protocol.md create mode 100644 content/docs/design/request.md create mode 100644 content/docs/design/rules.md create mode 100644 content/docs/design/sync.md create mode 100644 content/docs/design/task.md create mode 100644 content/docs/design/workweek.md create mode 100644 content/docs/dom.md create mode 100644 content/docs/durations.md create mode 100644 content/docs/escapes.md create mode 100644 content/docs/examples.md create mode 100644 content/docs/features.md create mode 100644 content/docs/filter.md create mode 100644 content/docs/first_time.md create mode 100644 content/docs/help.md create mode 100644 content/docs/history.md create mode 100644 content/docs/history_td.md create mode 100644 content/docs/hooks.md create mode 100644 content/docs/hooks2.md create mode 100644 content/docs/hooks_guide.md create mode 100644 content/docs/ids.md create mode 100644 content/docs/introduction.md create mode 100644 content/docs/jobs.md create mode 100644 content/docs/license.md create mode 100644 content/docs/named_dates.md create mode 100644 content/docs/philosophy.md create mode 100644 content/docs/priority.md create mode 100644 content/docs/recurrence.md create mode 100644 content/docs/report.md create mode 100644 content/docs/review.md create mode 100644 content/docs/searching.md create mode 100644 content/docs/start.md create mode 100644 content/docs/syntax.md create mode 100644 content/docs/tags.md create mode 100644 content/docs/taskserver/ciphers.md create mode 100644 content/docs/taskserver/configure.md create mode 100644 content/docs/taskserver/control.md create mode 100644 content/docs/taskserver/git.md create mode 100644 content/docs/taskserver/package.md create mode 100644 content/docs/taskserver/prep.md create mode 100644 content/docs/taskserver/protocol.md create mode 100644 content/docs/taskserver/setup.md create mode 100644 content/docs/taskserver/sync.md create mode 100644 content/docs/taskserver/tarball.md create mode 100644 content/docs/taskserver/taskwarrior.md create mode 100644 content/docs/taskserver/troubleshooting-sync.md create mode 100644 content/docs/taskserver/upgrade.md create mode 100644 content/docs/taskserver/user.md create mode 100644 content/docs/taskserver/why.md create mode 100644 content/docs/template.md create mode 100644 content/docs/terminology.md create mode 100644 content/docs/themes.md create mode 100644 content/docs/triage.md create mode 100644 content/docs/udas.md create mode 100644 content/docs/unicode.md create mode 100644 content/docs/urgency.md create mode 100644 content/docs/using_dates.md create mode 100644 content/docs/verbosity.md create mode 100644 content/docs/workflow.md create mode 100644 content/download/index.md create mode 100644 content/news/index.md create mode 100644 content/news/news.20140212.md create mode 100644 content/news/news.20140217.md create mode 100644 content/news/news.20140220.md create mode 100644 content/news/news.20140226.md create mode 100644 content/news/news.20140227.md create mode 100644 content/news/news.20140303.md create mode 100644 content/news/news.20140309.md create mode 100644 content/news/news.20140406.md create mode 100644 content/news/news.20140407.md create mode 100644 content/news/news.20140412.md create mode 100644 content/news/news.20140429.md create mode 100644 content/news/news.20140510.md create mode 100644 content/news/news.20140524.md create mode 100644 content/news/news.20140607.md create mode 100644 content/news/news.20140704.md create mode 100644 content/news/news.20140816.md create mode 100644 content/news/news.20140906.md create mode 100644 content/news/news.20140915.md create mode 100644 content/news/news.20140928.md create mode 100644 content/news/news.20141011.md create mode 100644 content/news/news.20141025.md create mode 100644 content/news/news.20141111.md create mode 100644 content/news/news.20141221.md create mode 100644 content/news/news.20150101.md create mode 100644 content/news/news.20150103.md create mode 100644 content/news/news.20150207.md create mode 100644 content/news/news.20150216.md create mode 100644 content/news/news.20150228.md create mode 100644 content/news/news.20150301.md create mode 100644 content/news/news.20150315.md create mode 100644 content/news/news.20150331.md create mode 100644 content/news/news.20150419.md create mode 100644 content/news/news.20150430.md create mode 100644 content/news/news.20150504.md create mode 100644 content/news/news.20150509.md create mode 100644 content/news/news.20150510.md create mode 100644 content/news/news.20150511.md create mode 100644 content/news/news.20150524.md create mode 100644 content/news/news.20150601.md create mode 100644 content/news/news.20150627.md create mode 100644 content/news/news.20150701.md create mode 100644 content/news/news.20150801.md create mode 100644 content/news/news.20150901.md create mode 100644 content/news/news.20150907.md create mode 100644 content/news/news.20150916.md create mode 100644 content/news/news.20150926.md create mode 100644 content/news/news.20150927.md create mode 100644 content/news/news.20150929.md create mode 100644 content/news/news.20151001.md create mode 100644 content/news/news.20151012.md create mode 100644 content/news/news.20151017.md create mode 100644 content/news/news.20151021.md create mode 100644 content/news/news.20151029.md create mode 100644 content/news/news.20151101.2.md create mode 100644 content/news/news.20151101.md create mode 100644 content/news/news.20151201.md create mode 100644 content/news/news.20160101.md create mode 100644 content/news/news.20160201.md create mode 100644 content/news/news.20160205.md create mode 100644 content/news/news.20160209.md create mode 100644 content/news/news.20160224.md create mode 100644 content/news/news.20160225.md create mode 100644 content/news/news.20160301.md create mode 100644 content/news/news.20160401.md create mode 100644 content/news/news.20160407.md create mode 100644 content/news/news.20160501.md create mode 100644 content/news/news.20160514.md create mode 100644 content/news/news.20160522.md create mode 100644 content/news/news.20160604.md create mode 100644 content/news/news.20160620.md create mode 100644 content/news/news.20160627.md create mode 100644 content/news/news.20160707.md create mode 100644 content/news/news.20160725.md create mode 100644 content/news/news.20160810.md create mode 100644 content/news/news.20160813.md create mode 100644 content/news/news.20160821.md create mode 100644 content/news/news.20160824.md create mode 100644 content/news/news.20160905.2.md create mode 100644 content/news/news.20160905.md create mode 100644 content/news/news.20161002.md create mode 100644 content/news/news.20161102.md create mode 100644 content/news/news.20161116.md create mode 100644 content/news/news.20161203.md create mode 100644 content/news/news.20161209.md create mode 100644 content/news/news.20170102.md create mode 100644 content/news/news.20170113.md create mode 100644 content/news/news.20170208.md create mode 100644 content/news/news.20170209.md create mode 100644 content/news/news.20170301.md create mode 100644 content/news/news.20170308.md create mode 100644 content/news/news.20170401.md create mode 100644 content/news/news.20170402.md create mode 100644 content/news/news.20170509.md create mode 100644 content/news/news.20170510.md create mode 100644 content/news/news.20170510_2.md create mode 100644 content/news/news.20180113.md create mode 100644 content/news/news.20180114.md create mode 100644 content/news/news.20180129.md create mode 100644 content/news/news.20180203.2.md create mode 100644 content/news/news.20180203.md create mode 100644 content/news/news.20180204.md create mode 100644 content/news/news.20191123.md create mode 100644 content/news/news.20210125.md create mode 100644 content/support/authors.md create mode 100644 content/support/faq.md create mode 100644 content/support/index.md create mode 100644 content/tools/index.md diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 00000000..29163d90 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,252 @@ +--- +title: "Taskwarrior - Random shit" +--- + +--- +lang: en +title: "Taskwarrior - What's next?" +viewport: 'width=device-width, initial-scale=1' +layout: single +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![Taskwarrior brand](/images/tw-s.png) TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.banner style="background-color:#619693;"} +::: {.container style="color:#cccccc; padding-top:32px;"} +Welcome to Taskwarrior {#welcome-to-taskwarrior style="color:white; margin-top:0px"} +====================== + +Taskwarrior is Free and Open Source Software that manages your TODO list from +the command line. It is flexible, fast, and unobtrusive. It does its job then +gets out of your way. + +![Taskwarrior samples.](/images/swatch.png)\ +\ + +New User?   [Start here\...](/docs/start.html){.btn .btn-success .btn-lg} +::: +::: + +::: {.container style="padding-top:16px;"} +::: {.col-md-9 .main} +::: {.row} +**News** + +[![RSS Feed](/images/rss.gif)](/feed.rss) +::: +::: +::: + ++-------------------------------------------------------------------------------+ +| ::: {.text-muted} | +| #### [New | +| s: Taskwarrior 2.5.3 released](/news/news.20210125.html) [2021-01-03]{.small} | +| | +| Taskwarrior 2.5.3 is released! Too much has happened over the past two years, | +| adding up to over 900 commits between 2.5.2 and 2.5.3. | +| | +| The [full | +| changelog](https://github.com/GothenburgBi | +| tFactory/taskwarrior/blob/2f47226f91f0b02f7617912175274d9eed85924f/ChangeLog) | +| is a *very* impressive read. [Download here](/download/). | +| | +| This is a recommended upgrade for all Taskwarrior users. | +| ::: | +| | +| ::: {.text-muted} | +| #### [New | +| s: Timewarrior 1.2.0 released](/news/news.20191123.html) [2019-11-23]{.small} | +| | +| Timewarrior 1.2.0 is released! Here are the highlights: | +| | +| - Print warning when a new tag is entered (\#2) | +| - New command \'undo\' (\#9) | +| - New command \'annotate\' (\#68) | +| - Bash completion (\#96) | +| - Show man pages with \--help option | +| | +| The [full | +| changelo | +| g](https://github.com/GothenburgBitFactory/timewarrior/blob/v1.2.0/ChangeLog) | +| is an impressive read. [Download here.](https://timewarrior.net/) | +| | +| This is a recommended upgrade for all Timewarrior users. | +| ::: | +| | +| ::: {.text-muted} | +| #### [2018 Plans](/news/news.20180204.html) [2018-02-04]{.small} | +| | +| We have made good use of beer time at FOSDEM to lay out our plans for 2018. | +| Here is what we are doing, starting immediately in most cases. | +| | +| \... | +| ::: | +| | +| ::: {.text-muted} | +| #### | +| [Timewarrior 1.1.1 released](/news/news.20180203.2.html) [2018-02-03]{.small} | +| | +| Timewarrior 1.1.1 is released. This is a bug fix release and we recommend | +| that everyone upgrade to 1.1.1. | +| | +| There is one bug fix in this release, and it\'s an important one that fixes a | +| long-standing problem that has been there from the begining. | +| | +| \... | +| | +| There is a script prepared that will fix your timewarrior data, and the | +| download and description is found on the [DB Correction | +| Script](https://timewarrior.net/docs/dbcorrection.html) page. | +| | +| The release is immediately available as a source | +| [tarball](/download/timew-1.1.1.tar.gz). Binary packages for your OS may | +| appear soon. | +| ::: | +| | +| ::: {.text-muted} | +| #### [Services Migration](/news/news.20180203.html) [2018-02-03]{.small} | +| | +| We are migrating services, and there will be a lot of changes. Here is what | +| is happening right now: | +| | +| We have a new support email address that should be used for all support | +| requests: | +| | +| | +| | +| \... | +| ::: | +| | +| ::: {.text-muted} | +| #### [FOSD | +| EM 2018: Taskwarrior Presence](/news/news.20180129.html) [2018-01-29]{.small} | +| | +| The Taskwarrior Team will be attending [FOSDEM | +| 2018](https://archive.fosdem.org/2018/) on February 3rd and 4th in Brussels. | +| This is the second annual carbon-space meetup. | +| | +| What will the focus be this time? Are we traveling all this way and meeting | +| up to give talks and demos? Will be sharing ideas and collaborating? Will we | +| be planning features and releases? | +| | +| \... | +| ::: | +| | +| ::: {.text-muted} | +| #### [Activit | +| y Digest: May - December 2017](/news/news.20180114.html) [2018-01-14]{.small} | +| | +| This is an ongoing series of activity reports, published monthly, to | +| highlight activity in our projects. Here is what happened between May and | +| December 2017. This is not a complete list of all activity, just work that | +| results in a non-trivial change. For a full list, see the git history of all | +| the projects. | +| | +| This covers a seven month period. Due to unforeseen circumstances, there was | +| a lengthy break in 2017. We\'re back. | +| | +| \... | +| ::: | ++-------------------------------------------------------------------------------+ + +\ +[More news\...](/news/) + +**Help** + +Need help? Take a look at our [support page](/support/). + +Looking to learn? Take a look at our [online documentation](/docs/). + +::: {.col-md-3} +::: {.alert .alert-success} +#### [Questions?](#){.alert-link} + +::: {.small} +Try our [FAQ](/support/faq.html), a growing list of curated questions and +answers. + +[Taskserver Setup +Guide](https://gothenburgbitfactory.github.io/taskserver-setup/)\ +[Taskserver Troubleshooting +Guide](https://gothenburgbitfactory.github.io/taskserver-troubleshooting/). +::: +::: + +::: {.alert .alert-danger} +#### Get the Code + +::: {.small} +Stable: [Taskwarrior 2.5.3](/download/task-2.5.3.tar.gz){.alert-link}\ +Stable: [Taskserver 1.1.0](/download/taskd-1.1.0.tar.gz){.alert-link}\ +Stable: [Tasksh 1.2.0](/download/tasksh-1.2.0.tar.gz){.alert-link}\ +Stable: [Timewarrior 1.4.3](https://timewarrior.net/){.alert-link}\ +\ +Dev: [Taskwarrior +2.6.0](https://github.com/GothenburgBitFactory/taskwarrior/tree/2.6.0){.alert-link}\ +Dev: [Taskserver +1.2.0](https://github.com/GothenburgBitFactory/taskserver/tree/1.2.0){.alert-link}\ +Dev: [Tasksh +1.3.0](https://github.com/GothenburgBitFactory/taskshell/tree/1.3.0){.alert-link}\ +Dev: [Timewarrior +dev](https://github.com/GothenburgBitFactory/timewarrior){.alert-link}\ +::: +::: +::: + +::: {.container} +::: {.col-md-3 .main} +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![twitter logo](/images/twitter_dark.png) +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +::: {.text-muted} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/about.md b/content/about.md new file mode 100644 index 00000000..13fa35d9 --- /dev/null +++ b/content/about.md @@ -0,0 +1,7 @@ +--- +title: "Taskwarrior - About" +--- + +![Infrastructure provided by Göteborg Bit Factory.](/images/gbf.png){width="12" +height="18"} Göteborg Bit Factory is the organization that pays the bills, and +supports all our Open Source projects. diff --git a/content/backup b/content/backup new file mode 100644 index 00000000..b1b7dd87 --- /dev/null +++ b/content/backup @@ -0,0 +1,54 @@ +### Rule Actions + +When a rules matches, an action is taken. There are currently four supported +actions: + +- `line` +- `match` +- `blank` +- `suppress` + +#### The `line` Action + +The `line` action instructs Clog to color the entire line. This makes the whole +line more visible. An example might be to color a line in a log file if that +line reports a critical error. + +#### The `match` Action + +The `match` action instructs clog to only color the matching pattern and not the +entire line. This make individual keywords more visible. An example might be to +highlight simply an error code, or server name. + +#### The `blank` Action + +The `blank` action causes a blank line to be written both before and after the +matching line. This is another form of emphasis. + +#### The `suppress` Action + +The `suppress` action causes the whole line to be removed from the output. You +will not see a suppressed line at all. This is useful for stripping out noise +from a log file. + +#### Example + +Here is a default rule set that includes all the different actions. The first +rule will make any line completely blue if it contains the word \'blue\'. The +second rule colors the word \'red\' red. The third puts blank lines around any +line containing the word \'emphasize\'. The fourth rule suppresses any line +containing the word \'ignore\'. + +![](/docs/clog/images/action1.png){.img-responsive} + +Here is a sample file that triggers every rule, so we shoud see the actions of +all rules taken. Can you predict what will happen? + +![](/docs/clog/images/action2.png){.img-responsive} + +Here is the output: + +![](/docs/clog/images/action3.png){.img-responsive} + +This shows rules precedence also - the second rule finds the word \'red\' in the +blue line. diff --git a/content/conduct.md b/content/conduct.md new file mode 100644 index 00000000..22594530 --- /dev/null +++ b/content/conduct.md @@ -0,0 +1,13 @@ +--- +title: "Taskwarrior - Code of Conduct" +--- + +### Taskwarrior Code of Conduct + +We are here to improve the software. There is no agenda. + +Be respectful of all contributors, all contributions, and everyone\'s time, in +all project-related forums. No exceptions. + +To report violations, please contact and we will do +the right thing. diff --git a/content/docs/30second.md b/content/docs/30second.md new file mode 100644 index 00000000..ec14349b --- /dev/null +++ b/content/docs/30second.md @@ -0,0 +1,63 @@ +--- +title: "Taskwarrior - 30-Second Tutorial" +--- + +### 30-Second Tutorial + +Let\'s get started. Here\'s a quick demonstration showing how to perform basic +task management. + +Here is an explanation of what is happening. First add two tasks. + + $ task add Read Taskwarrior documents later + Created task 1. + + $ task add priority:H Pay bills + Created task 2. + +Easy. Do you see that second one has a High priority? Now look at those tasks, +using the report `next`. Notice that the two tasks are ordered by urgency, and +the urgency is affected by the priority, among other things. + + $ task next + + ID Age P Description Urg + -- --- - -------------------------------- ---- + 2 10s H Pay bills 6 + 1 20s Read Taskwarrior documents later 0 + +Suppose the bills are paid and we wish to mark task 2 as completed. + + $ task 2 done + Completed task 2 'Pay bills'. + Completed 1 task. + +Now we can omit the `next` command, because it is the default command. + + $ task + + ID Age Description Urg + -- --- -------------------------------- ---- + 1 5m Read Taskwarrior documents later 0 + +Task 2 is now gone. Notice that no visible tasks have a priority set, and so the +priority column is not shown. Now we can delete that remaining task, because we +are already using the tutorial. + + $ task 1 delete + Permanently delete task 1 'Read Taskwarrior documents later'? (yes/no) y + Deleting task 1 'Read Taskwarrior documents later'. + Deleted 1 task. + + $ task + No matches. + +That is all you *need* to know. These four commands (add, done, delete, next) +will allow you to use Taskwarrior effectively. If you are new to Taskwarrior, it +is recommended that you stop here, go and start to manage your task list for a +while. We don\'t want you to be overwhelmed at a time when you just need a way +to organize and get things done. + +When you are comfortable with basic Taskwarrior usage, there are many other +features you can learn about. While you are not expected to learn all of them, +or even find them useful, you might just find exactly what you need. diff --git a/content/docs/3rd-party.md b/content/docs/3rd-party.md new file mode 100644 index 00000000..65278534 --- /dev/null +++ b/content/docs/3rd-party.md @@ -0,0 +1,82 @@ +--- +title: "Taskwarrior - 3rd-Party Application Guidelines" +--- + +[]{#3p} + +### 3rd-Party Application Guidelines + +Taskwarrior can be extended by means of a third-party application, which can be +a wrapper, or hook script. There are script examples of import and export +add-ons that support many different formats (clone the repository, look in +`taskwarrior.git/scripts/add-ons`). Then there are more sophisticated +applications such as [Vit](https://gothenburgbitfactory.org/projects/vit.html) +that provide a complete replacement UI. + +All of these provide interesting new features and improve ease of use for +different kinds of users. We encourage you to create such add-ons, but in doing +so, there are some rules that must be followed, which will not only protect the +users data from mistreatment, but also your application from being sensitive to +changes in Taskwarrior. + +[]{#rules} + +#### Rules + +- Produce, consume and handle UTF8 text properly. UTF8 is the only text + encoding supported by Taskwarrior. +- Don\'t attempt to parse the pending.data file. Here\'s why: the `.data` file + format is currently on its fourth version. The very first version was never + released, so if you want to read Taskwarrior data properly, you will need to + parse the three supported formats. Those formats are not documented. + Additionally, you will need to handle the GC operations, implement the task + \"unwait\" feature, observe user defined attribute handling restrictions, + and implement recurring task synthesis all of which require .taskrc and + default value access. You would essentially be rewriting the data access and + configuration portion of Taskwarrior, which is a major undertaking. To + support filters you would also need to evaluate the supported clauses, + provide DOM access and implement aliases. Then there is also the fifth data + format, which is planned\... +- Use the `export` command to query data from Taskwarrior. The `export` + command implements filters which you can use, or you can omit a filter, get + all the data, and implement your own filtering. JSON parsing is very well + supported in all relevant programming languages, which means you should be + using Taskwarrior itself to query the data, with a commodity JSON parser in + conjunction. While the JSON format will be tweaked over time, the general + form will not. +- Beginning with version [2.4.5]{.label .label-success}, use the `import` + command to import modified JSON back into Taskwarrior. +- Older versions: Use the command line interface to put data into Taskwarrior. + Composing a valid command line is a simple way to put data in to + Taskwarrior. +- Use the `_get` helper command to access individual data items. Note that + multiple items can be retrieved by one command. If accessing more than just + a few items, use the `export` command. +- Verify feature support by running `task --version`. This command returns the + version number, which will help you determine whether or not a particular + feature is supported. Note that this command does not scan for a + configuration file, and is therefore safe to run if Taskwarrior is not yet + set up. +- UDAs (User Defined Attributes) must be preserved in the data. When reading + the JSON for a task, there may be attributes that you have never encountered + before. If this is the case, you must not modify them in any way. This not + only makes your application future-proof, but allows it to tolerate UDAs + from other data sources. It also prevents the Taskserver from stripping out + *your* data. + +[]{#guidelines} + +#### Guidelines + +- If you need to store additional data, consider putting your own data file in + the `~/.task` directory. Just don\'t use the file names `pending.data`, + `completed.data`, `backlog.data`, or `undo.data`. +- There are many helper commands designed to assist add-on scripts such as + shell completion scripts. These commands all begin with an underscore, see + them with this command: `task help | grep ' _'`. +- Familiarize yourself with the means of forcing color on or off, disabling + word wrapping, disabling bulk operation limitations, disabling confirmation, + disabling gc, modifying verbosity and so on. There are ways around almost + all the restrictions, and while these don\'t make sense for regular users, + they can be critical for add-on authors. +::: diff --git a/content/docs/_index.md b/content/docs/_index.md new file mode 100644 index 00000000..5a4acd72 --- /dev/null +++ b/content/docs/_index.md @@ -0,0 +1,226 @@ +--- +lang: en +title: 'Taskwarrior - Documentation' +viewport: 'width=device-width, initial-scale=1' +layout: single +--- + +# Test +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +Here is the complete set of Taskwarrior and Taskserver documentation. +::: + +::: {.col-md-10 .main} +::: {.row} ++---------------------------------------+---------------------------------------+ +| **Getting Started** | - | +| | [Introduction](/docs/start.html) - | +| | What to do first | +| | - [Conf | +| | iguration](/docs/introduction.html) - | +| | Creating a `.taskrc` file | +| | - [30-Second | +| | Tutorial](/docs/30second.html) - | +| | all you need to begin using | +| | Taskwarrior | +| | - [Getting Help](/docs/help.html) | ++---------------------------------------+---------------------------------------+ +| **Basic Usage** | - [Command Line | +| | Syntax](/docs/syntax.html) | +| | - [Best | +| | | +| | Practices](/docs/best-practices.html) | +| | - [Example | +| | Commands](/docs/examples.html) - | +| | Commonly asked questions | +| | - [Example | +| | Workflows](/docs/workflow.html) - | +| | Everyone uses Taskwarrior | +| | differently | +| | - [All the | +| | Commands](/docs/commands/) | +| | - [Using Dates | +| | | +| | Effectively](/docs/using_dates.html) | +| | - [Unicode](/docs/unicode.html) | +| | [2.5.0]{.label .label-success} | +| | - [Searching](/docs/searching.html) | +| | - [Reports](/docs/report.html) | +| | - [Filters](/docs/filter.html) | +| | - [Priority](/docs/priority.html) | +| | [2.4.3]{.label .label-success} | +| | - [Tags & Virtual | +| | Tags](/docs/tags.html) | +| | - [Date & Time](/docs/dates.html) | +| | [2.4.0]{.label .label-success} | +| | - [Named | +| | Dates](/docs/named_dates.html) | +| | [2.4.0]{.label .label-success} | +| | - [Duration | +| | Values](/docs/durations.html) | +| | [2.4.0]{.label .label-success} | +| | | +| | **Configuring Taskwarrior** | +| | | +| | - [Con | +| | figuration](/docs/configuration.html) | +| | - [Verbosity](/docs/verbosity.html) | +| | - [Color Themes](/docs/themes.html) | +| | | +| | ```{=html} | +| | | +| | ``` | +| | - [T | +| | erminology](/docs/terminology.html) - | +| | a glossary of terms | ++---------------------------------------+---------------------------------------+ +| **Advanced Topics** | - [Urgency](/docs/urgency.html) | +| | - [ID Numbers](/docs/ids.html) | +| | - [Context](/docs/context.html) | +| | [2.4.2]{.label .label-success} | +| | - [How Recurrence | +| | Works](/docs/recurrence.html) | +| | - [User Defined Attributes | +| | (UDAs)](/docs/udas.html) | +| | - [External Scripts](/tools/) | +| | - [Escaping Command Line | +| | Characters](/docs/escapes.html) | +| | - [DOM - Document Object | +| | Model](/docs/dom.html) | +| | - [JSON Import/Export | +| | Format](/docs/design/task.html) | +| | - [Deprecated | +| | Features](/docs/deprecated.html) | +| | - | +| | [Philosophy](/docs/philosophy.html) | ++---------------------------------------+---------------------------------------+ +| **Taskserver** | - [Why do I need a | +| | Ta | +| | skserver?](/docs/taskserver/why.html) | +| | - [Taskserver Setup | +| | Guide](https://gothenburgbi | +| | tfactory.github.io/taskserver-setup/) | +| | - [Taskserver Troubleshooting | +| | | +| | Guide](https://gothenburgbitfactory.g | +| | ithub.io/taskserver-troubleshooting/) | ++---------------------------------------+---------------------------------------+ +| **Tasksh** | - [Reviewing tasks using | +| | tasksh](/docs/review.html) | +| | [1.1.0]{.label .label-success} | ++---------------------------------------+---------------------------------------+ +| **Other Projects** | - [Timewarrior Home | +| | Page](https://timewarrior.net) | +| | - [Clog Home | +| | Page](/docs/clog/index.html) | ++---------------------------------------+---------------------------------------+ +| **Contributors** | - [Hooks API](/docs/hooks.html) | +| | [2.4.0]{.label .label-success} | +| | - [Hooks v2 API](/docs/hooks2.html) | +| | [2.4.3]{.label .label-success} | +| | - [Hook Author\'s | +| | Guide](/docs/hooks_guide.html) | +| | [2.4.0]{.label .label-success} | +| | - [How To Build | +| | Taskwarrior](/docs/build.html) | +| | - [Contributing to the | +| | Project](/docs/contribute.html) | +| | - [How to become an Open Source | +| | | +| | Contributor](/docs/first_time.html) | +| | - [Coding | +| | Style](/docs/coding_style.html) | +| | - [Branching | +| | Model](/docs/branching.html) | +| | - [3rd Party Application | +| | Guidelines](/docs/3rd-party.html) | +| | - [Design Documents | +| | (RFCs)](/docs/design/index.html) | ++---------------------------------------+---------------------------------------+ +| **Feedback** | - [How to Report a | +| | Bug](/docs/bugs.html) | +| | - [How to Request a | +| | Feature](/docs/features.html) | +| | - [How to ask a | +| | question](http://www.ca | +| | tb.org/esr/faqs/smart-questions.html) | ++---------------------------------------+---------------------------------------+ +| **About** | - [Taskwarrior Release | +| | History](/docs/history.html) | +| | - [Taskserver Release | +| | History](/docs/history_td.html) | +| | - [MIT License](/docs/license.html) | ++---------------------------------------+---------------------------------------+ + +\ +\ +::: +::: + +::: {.col-md-2} +::: {.alert .alert-warning} +- [Getting Started](#start){.alert-link} +- [Basic](#basic){.alert-link} +- [Advanced](#advanced){.alert-link} +- [Taskserver](#taskd){.alert-link} +- [Tasksh](#tasksh){.alert-link} +- [Other Projects](#other){.alert-link} +- [Contributors](#contrib){.alert-link} +- [Feedback](#feedback){.alert-link} +- [About](#about){.alert-link} +::: +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/docs/best-practices.md b/content/docs/best-practices.md new file mode 100644 index 00000000..39ba0367 --- /dev/null +++ b/content/docs/best-practices.md @@ -0,0 +1,185 @@ +--- +title: "Taskwarrior - Best Practices" +--- + +### Best Practices + +If you have installed Taskwarrior and gone through the intro and some of the +tutorials, you may be wondering how to start using some features to help you +organize your work. This is a simple tutorial, not intended to be complete, or +methodology-specific, but just a start, to get you thinking about your task +list, and how you might better rely on it. + +The default report (the report that runs when you just enter `task`) is the +`next` report. This is a report where the tasks are sorted by urgency, with the +most urgent at the top. The report cuts off after one page, so it is really just +a list of the most urgent tasks. With a few tips to follow, the `next` report +can be your most valuable resource. Here are the tips for making the `next` +report work in your favor. + +#### Tips + +You\'ll notice that these tips are all about providing more context and metadata +for tasks. If all you need is a simple shopping list, then switch back to pencil +and paper, you\'ll be happier. But if you want some sophistication and the +ability to manipulate and view the data\... + +- Capture all the tasks and details that you can. Getting the information off + your mind and onto the list reduces the amount of details you need to + remember, and reduces the things you might forget. + +- Assign a project to your tasks if possible: + + task ID modify project:Home + +- Assign due dates where appropriate, for the important tasks: + + task ID modify due:31st + + Don\'t overdo this though, as a delay might force you to spend too much time + reorganizing everything. + +- When you start working on a task, mark it started: + + task ID start + + This is a great reminder after a weekend, of what you were doing on Friday + that should be continued. + +- If you know the priority of a task: + + task ID modify priority:M + + But don\'t fall into the trap of shifting the priorities too often, as + you\'ll waste a lot of time. + +- Add useful tags to a task: + + task ID modify +problem +house + + This is very useful for filtering. + +- Add the special tag +next to a task, to boost its urgency: + + task ID modify +next + +- Represent dependencies, where appropriate, because there is a big difference + in the urgency of a blocking task, than that of a blocked task: + + task ID modify depends:OTHER_ID + +- Try not to have large, long-term tasks that will sit on your list forever. + It can be very satisfying and motivating to complete tasks, so create more, + but smaller, tasks. Don\'t have a \'learn Japanese\' task, instead have a + \'Complete chapter 1\' task instead, it\'s more readily achievable, and you + can more easily see progress, which can be motivating. + +#### How That Helps + +The `next` report is sorted by urgency. Urgency is just a number, but a number +calculated using a polynomial that considers many aspects of your tasks. What +this means is that the more information you provide with your tasks, the more +accurate the `next` report becomes, and the more closely it approximates your +own notion of urgency. + +If you follow the above tips, your `next` report output should be starting to +get useful. Furthermore, by modifying the urgency coefficients, you can make the +`next` report adopt your own notion of whether, for example, a priority setting +is more important than a specific project. Here are some changes you could make: + + task config urgency.user.tag.problem.coefficient 4.5 + +This means that any task having the `+problem` tag gets an urgency boost. +Conversely, you can reduce the urgency for unimportant things, using negative +coefficients: + + task config urgency.user.tag.later.coefficient -6.0 + +If you have a project that is more important, you can boost the whole project: + + task config urgency.user.project.Home.coefficient 2.9 + +Suppose you do not agree that a blocked task should have a reduced urgency. +Override it: + + task config urgency.blocked.coefficient 0.0 + +A zero coefficient means that blocked tasks now have *no* effect on the urgency. + +#### Describe Carefully + +Providing good descriptions for your tasks is enormously helpful. Here is a very +bad example of a task: + + task add Renovate the kitchen + +While that may well be a perfect description of what you will be doing at the +highest level, it is potentially an open-ended task, for which progress will be +very hard to assess. This will be a task that sits on your task list for some +time, and is not very helpful - you learn nothing from it, and its presence on +the list will become demotivating. + +A much better approach would be this: + + task add project:Kitchen Select floor tiles + task add project:Kitchen Measure counter-top + task add project:Kitchen Design placement of electrical outlets + task add project:Kitchen Locate ideal placement for extractor duct + task add project:Kitchen Select and order counter-top material + task add project:Kitchen Talk to the Electrician about when the work can start + ... + +Here `Kitchen` is now a project name, and the tasks represent smaller units of +work. While this means more time will be spent breaking down the larger tasks, +but planning is important. + +With smaller tasks, you have the opportunity to establish links between your +tasks. For example, it would be wise to plan the placement of electrical outlets +before asking the Electrician to start work. Measuring the counter-top is also +needed before ordering the material. These are examples where you could use task +dependencies to formalize the sequence. + +If you are wanting to estimate the completion of the project, having more tasks +and more details will improve your ability to estimate. With enough detail in +the tasks, you are more likely to be able to estimate the work. + +Break down tasks into smaller tasks - the extra effort required to be more +precise can pay off in terms of efficiently performing the work in the right +sequence, at the right time. + +#### Review Your Tasks + +Go over your list periodically and correct any erroneous data, like an incorrect +due date, or a priority that no longer applies because of external factors, or +even delete tasks that are no longer relevant. This keeps your list current and +up to date, more accurately reflecting the work you need to accomplish. Accurate +metadata and good urgency coefficients mean that Taskwarrior\'s idea of urgency +more closely matches yours. That will be a big help. + +Consider installing and using the Taskwarrior Shell +([tasksh](https://taskwarrior.org/news/news.20160905.2.html)) program, which +among a few other things provides a `review` command that helps you cycle +through your task list and keep it current. + +Some would argue that spending as little time on your task list as possible +means more time for doing work. While this is true, it does assume that you are +doing the *right* work. Good advice would be to spend as little time as you can +on the task list, but enough to make sure that it is up to date, correct and +complete. Then rely on the tools, and go get some work done. + +#### Common Sense + +Use a task list, look at it often, correct any mistakes and remove items that no +longer apply. Choose a methodology that works for you (GTD, Pomodoro \...) or +devise your own - it\'s not complicated. Be consistent. Backup your data. + +#### Future Enhancements + +We are always looking into better ways to represent your task list, better ways +to display it, and better ways to support methodologies that work. We will be +adding features that help in some way, for some people, and we will be +correcting what is not working. Taskwarrior is a toolkit, and a comprehensive +one, intended to support the different ways people do work. You will not need +every feature, but everyone uses a different set of features, according to their +own approach. But every feature that you do use will help you work with your +list better. diff --git a/content/docs/branching.md b/content/docs/branching.md new file mode 100644 index 00000000..487a4f96 --- /dev/null +++ b/content/docs/branching.md @@ -0,0 +1,96 @@ +--- +title: "Taskwarrior - Branching Model" +--- + +### Branching Model + +Software development typically requires a standardized branching model, to +manage complexity and parallel efforts. The branching model can be a source of +confusion for developers, so this document describes how branching is used. + +Taskwarrior and Taskserver use the same branching model. + +[]{#git} + +#### Git Branching + +Git allows arbitrary and low-cost branching, which means that any branching +model can be used. A new Git repository has one branch, the default branch, +named `master`, but even this is not required. + +[![master](/docs/images/master.png){.img-thumbnail}](/docs/images/master.png) + +No development occurs on the `master` branch. + +[]{#dev} + +#### Development Branch + +A development branch is created from the `master` branch, and work proceeds on +the development branch. Development branches are pushed to the server. Note that +there are no changes on `master` - all work is done on dev branches. + +[![dev](/docs/images/dev.png){.img-thumbnail}](/docs/images/dev.png) + +All work on dev branches is pushed to the server. + +[]{#topic} + +#### Topic Branch + +A topic branch is created from a dev branch. This can be a useful way to manage +parallel efforts on a single development machine. Topic branches are also useful +for merging in submitted patches, because the patch can be merged, tested and +corrected independently of other efforts before being merged and pushed. A topic +branch is ideal for storage of changes before an eventual merge back to the +development branch. + +[![topic](/docs/images/topic.png){.img-thumbnail}](/docs/images/topic.png) + +No topic branches are pushed to the server, they are kept local to the +development machine. They are private, and therefore hidden from the server. + +[]{#release} + +#### Release + +When a release is made, the development branch is merged back to the `master` +branch, and a tag is applied that indicates which commit represents the release. + +[![release](/docs/images/release.png){.img-thumbnail}](/docs/images/release.png) + +Because only releases are merged back, the `master` branch always represent the +stable release. + +[]{#newdev} + +#### New Development Branches + +Immediately after a release, one or more new branches are created. Typically +after a major \'1.0.0\' release, there will be two branches created. First the +\'1.0.1\' branch is a patch development branch, intended to be used if an +emergency patch is required. It therefore sits unused until an emergency arises. +No work is performed on a patch development branch. + +The second branch, with the higher release number is the development branch for +fixes and features. This is where all the work occurs. Any fix made on the +development branch can be cherry-picked onto the patch branch, if necessary. + +[![dev2](/docs/images/dev2.png){.img-thumbnail}](/docs/images/dev2.png) + +To address the confusion around branching, namely determining which branch is +active. the answer is that the highest numbered branch is the one that patches +should be applied to. + +[]{#old} + +#### Old Branches + +Old branches are not retained, but there are tags marking the beginning and end +of development on a branch. + +[]{#rebase} + +#### Rebasing + +No. diff --git a/content/docs/bugs.md b/content/docs/bugs.md new file mode 100644 index 00000000..3fe46a44 --- /dev/null +++ b/content/docs/bugs.md @@ -0,0 +1,39 @@ +--- +title: "Taskwarrior - How to report a bug" +--- + +[]{#how} + +### How to Report a Bug + +Please report bugs and odd behavior when you see it. We don\'t necessarily know +it\'s broken, unless you tell us. A good bug description improves response time +and reduces the burden on the developers. + +It helps if you first determine whether this is a known bug. To do this, you +will need to look at the current list of bugs here: + + + +If you don\'t see the bug listed, sign up for an account at the link above, and +create a new issue. Please include the following information, as it helps us +categorize, prioritize and replicate the problem: + +- Tell us *exactly* what command you ran + +- Tell us what happened + +- Tell us what you expected to happen + +- Tell us about your installation, by running the command `task diagnostics` + and including the output in the issue description. Notice that the + `diagnostics` command was added specifically for reporting issues, and it + gives us information about your operating system, libraries, compiler and so + on. If you feel some of the information is personal, then remove that line. + +- If you need to demonstrate a problem with a screenshot, you can hide your + private data with the `rc.obfuscate=1` configuration override: + + [![Data + Obfuscation](/docs/images/obfuscate.png){.img-thumbnail}](/docs/images/obfuscate.png) +::: diff --git a/content/docs/build.md b/content/docs/build.md new file mode 100644 index 00000000..dd00b88d --- /dev/null +++ b/content/docs/build.md @@ -0,0 +1,113 @@ +--- +title: "Taskwarrior - How to build" +--- + +[]{#how} + +### How To Build Taskwarrior + +This is for developers. Specifically those who know how to use tools, satisfy +dependencies, and want to set up a development environment. It is not +user-friendly. + +You\'ll need these tools: + +- [git](https://git-scm.com/) +- [cmake](https://cmake.org) +- make +- C++ compiler, currently gcc 4.7+ or clang 3.3+ for full C++11 support +- Python 2.7 or later (for tests) +- Bash (for tests) + +You\'ll need these libraries: + +- [GnuTLS](https://www.gnutls.org/) +- libuuid (unless on Darwin/BSD) + +Specifically the development versions, `uuid-dev` on Debian, for example. + +[]{#clone} + +### Cloning the Repo + + $ git clone https://github.com/GothenburgBitFactory/taskwarrior.git taskwarrior.git + +[]{#stable} + +### Building the Stable Version + +The master always represents the more recently released version, and should be +your preferred choice. + + $ cd taskwarrior.git + $ git checkout master # Master is the stable branch. + $ cmake -DCMAKE_BUILD_TYPE=release . # 'release' for performance. + $ make # Just build it. + +[]{#build} + +### Building the Dev Branch + +The dev branch is always the highest numbered branch, in this example, `2.6.0`. + + $ cd taskwarrior.git + $ git checkout 2.6.0 # Dev branch + $ git submodule init # Register submodule + $ git submodule update # Get the submodule + $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release, default: neither + $ make VERBOSE=1 # Shows details + +Build the debug type if you want symbols in the binary. + +[]{#tests} + +### Running the Test Suite + +There are scripts to facilitate running the test suite. In particular, the +[vramsteg](https://gothenburgbitfactory.org/projects/vramsteg.html) utility +provides blinkenlights for test progress. + + $ cd taskwarrior.git/test + $ make VERBOSE=1 # Shows details + $ ./run_all # Runs all tests silently > all.log + $ ./problems # Find errors in all.log + +[]{#patch} + +### Submitting a Patch + +Talk to us first - make sure you are working on something that is wanted. +Patches will not be applied simply because you did the work. Remember the +various forms of documentation involved, and the test suite. Work on the dev +branch, not `master`. When you are are ready to submit, do this: + + $ git commit + +Follow the standard form for commit messages, which looks like this: + + Category: Short message + + - Details + - Details + +Here is a good example: + + TW-1636: UUID with numeric-only first segment is not parsed properly + + - Switched Nibbler::getUUID to Nibbler::getPartialUUID, which caused partial + UUID matching to fail sometimes. + - Changed precedence to search for UUID before ID, which solves the numeric + UUID problem. + +Create the patch using this: + + $ git format-patch HEAD^ + +Mail the patch to or attach it to the +appropriate ticket in the [bug +tracker](https://github.com/GothenburgBitFactory/taskwarrior/issues). If you do +the latter, make sure someone knows about it, or it could go unnoticed. + +Expect feedback. It is unlikely your patch will be accepted unmodified. Usually +this is because you violated the coding style, worked in the wrong branch, or +*forgot* about documentation and unit tests. diff --git a/content/docs/clog/actions.md b/content/docs/clog/actions.md new file mode 100644 index 00000000..44263f72 --- /dev/null +++ b/content/docs/clog/actions.md @@ -0,0 +1,54 @@ +--- +title: "Clog - Rule Actions" +--- + + +- `line` +- `match` +- `blank` +- `suppress` + +#### The `line` Action + +The `line` action instructs Clog to color the entire line. This makes the whole +line more visible. An example might be to color a line in a log file if that +line reports a critical error. + +#### The `match` Action + +The `match` action instructs clog to only color the matching pattern and not the +entire line. This make individual keywords more visible. An example might be to +highlight simply an error code, or server name. + +#### The `blank` Action + +The `blank` action causes a blank line to be written both before and after the +matching line. This is another form of emphasis. + +#### The `suppress` Action + +The `suppress` action causes the whole line to be removed from the output. You +will not see a suppressed line at all. This is useful for stripping out noise +from a log file. + +#### Example + +Here is a default rule set that includes all the different actions. The first +rule will make any line completely blue if it contains the word \'blue\'. The +second rule colors the word \'red\' red. The third puts blank lines around any +line containing the word \'emphasize\'. The fourth rule suppresses any line +containing the word \'ignore\'. + +![](/docs/clog/images/action1.png){.img-responsive} + +Here is a sample file that triggers every rule, so we shoud see the actions of +all rules taken. Can you predict what will happen? + +![](/docs/clog/images/action2.png){.img-responsive} + +Here is the output: + +![](/docs/clog/images/action3.png){.img-responsive} + +This shows rules precedence also - the second rule finds the word \'red\' in the +blue line. diff --git a/content/docs/clog/clone.md b/content/docs/clog/clone.md new file mode 100644 index 00000000..fd38da3a --- /dev/null +++ b/content/docs/clog/clone.md @@ -0,0 +1,109 @@ +--- +title: "Clog - Clone" +--- + +[]{#how} + +### How To Build Clog + +This is for developers. Specifically those who know how to use tools, satisfy +dependencies, and want to set up a development environment. It is not +user-friendly. + +You\'ll need these tools: + +- [git](https://git-scm.com/) +- [cmake](https://cmake.org) +- make +- C++ compiler, currently gcc 4.7+ or clang 3.3+ for full C++11 support +- Python 2.7 or later (for tests) + +[]{#clone} + +### Cloning the Repo + + $ git clone --recursive https://github.com/GothenburgBitFactory/clog.git clog.git + +[]{#stable} + +### Building the Stable Version + +The master branch always represents the more recently released version, and +should be your preferred choice. + + $ cd clog.git + $ git checkout master # Master is the stable branch. + $ cmake -DCMAKE_BUILD_TYPE=release . # 'release' for performance. + $ make # Just build it. + +[]{#build} + +### Building the Dev Branch + +The dev branch is always the highest numbered branch, in this example, `1.4.0`. + + $ cd clog.git + $ git checkout 1.4.0 # Dev branch + $ git submodule init && git submodule update # Fetch the submodule + $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither. + $ make VERBOSE=1 # Shows details + +Build the debug type if you want symbols in the binary for debugging. + +Note: the development branch is not always stable, doesn\'t always pass tests, +and sometimes doesn\'t even compile. Choose wisely. + +[]{#tests} + +### Running the Test Suite + +There are C++ and Python, build and run them: + + $ cd clog.git/test + $ make VERBOSE=1 # Shows details + $ ./run_all # Runs all tests silently > all.log + $ ./problems # Find errors in all.log + +[]{#patch} + +### Submitting a Patch + +Talk to us first - make sure you are working on something that is wanted. +Patches will not be applied simply because you did the work, or because it was +easy, or because you want it. Instead, the change has to be considered right for +the project. + +Remember the various forms of documentation involved, and the test suite. Work +on the dev branch, not `master`. When you are are ready to submit, do this: + + $ git commit + +Follow the standard form for commit messages, which looks like this: + + Category: Short message + + - Details + - Details + +Here is a good example: + + TW-1636: UUID with numeric-only first segment is not parsed properly + + - Switched Nibbler::getUUID to Nibbler::getPartialUUID, which caused partial + UUID matching to fail sometimes. + - Changed precedence to search for UUID before ID, which solves the numeric + UUID problem. + +Create the patch using this: + + $ git format-patch HEAD^ + +Mail the patch to or attach it to the +appropriate ticket in the [bug +tracker](https://github.com/GothenburgBitFactory/clog/issues). If you do the +latter, make sure someone knows about it, or it could go unnoticed. + +Expect feedback. It is unlikely your patch will be accepted unmodified. Usually +this is because you violated the coding style, worked in the wrong branch, or +*forgot* about documentation and unit tests. +::: diff --git a/content/docs/clog/color.md b/content/docs/clog/color.md new file mode 100644 index 00000000..4ab76fd4 --- /dev/null +++ b/content/docs/clog/color.md @@ -0,0 +1,164 @@ +--- +title: "Clog - Color" +--- + +### Color + +Clog uses the same color model as Taskwarrior. A color iѕ described with one or +more words. You can specify the foreground color, the background color, and some +text effects. + +Color can be both simple and complex. You can completely ignore the color models +below, and just use color in one of these ways: + + red + white on red + on red + bold blue + bold yellow on bright green underline + +Or you can have full control using a 256-color model. But sometimes all you need +is red and green. + +#### 16-Color Model + +The basic color support is provided through named colors: + + black, red, blue, green, magenta, cyan, yellow, white + +Shown here used as foreground and background colors: + +![](/docs/clog/images/color1.png){.img-responsive} + +Foreground color (for text) is simply specified as one of the above colors, or +not specified at all to use the default terminal text color. + +Background color is specified by using the word `on`, and one of the above +colors. Some examples: + + green + green on yellow + on yellow + +![](/docs/clog/images/color2.png){.img-responsive} + +These colors can be modified further, by making the foreground `bold`, or by +making the background `bright`. Some examples: + + bold green + bold white on bright red + on bright cyan + +Bold is not uniformly supported by all terminal emulators. Sometimes it results +in a slightly brighter color, a lightly heavier typeface, or no difference. + +The order of the words is not important, so the following are equivalent: + + bold green + green bold + +But the `on` is important - colors before the `on` are foreground, and colors +after `on` are background. + +There is an additional `underline` attribute that may be used: + + underline bold red on black + +Much like `bold`, you may see different behavior among different terminal +emulators. There is also an `inverse` attribute that flips foreground and +background colors: + + inverse red + +Some combinations look very nice, some look terrible. Different terminal +programs do implement slightly different versions of \'red\', for example, so +you may see some unexpected variation across machines. The brightness of your +display is also a factor. + +#### 256-Color Model + +Using 256 colors follows the same form, but the names are different, and some +colors can be referenced in different ways. First there is by color ordinal, +which is like this: + + color0 + color1 + color2 + ... + color255 + +![](/docs/clog/images/color3.png){.img-responsive} + +This gives you access to all 256 colors, but doesn\'t help you much. This range +is a combination of 8 basic colors (color0 - color7), then 8 brighter variations +(color8 - color15). Then a block of 216 colors (color16 - color231). Then a +block of 24 gray colors (color232 - color255). + +![](/docs/clog/images/color4.png){.img-responsive} + +The large block of 216 colors (6x6x6 = 216) represents a color cube, which can +be addressed via RGB values from 0 to 5 for each component color. A value of 0 +means none of this component color, and a value of 5 means the most intense +component color. For example, a bright red is specified as: + + rgb500 + +And a darker red would be: + + rgb300 + +Note that the three digits represent the three component values, so in this +example the 5, 0 and 0 represent red=5, green=0, blue=0. Combining intense red +with no green and no blue yields red. Similarly, blue and green are: + + rgb005 + rgb050 + +Another example - bright yellow - is a mix of bright red and bright green, but +no blue component, so bright yellow is addressed as: + + rgb550 + +A soft pink would be specified as: + + rgb515 + +You may notice that the large color block is represented as 6 squares. All +colors in the first square have a red value of 0. All colors in the 6th square +have a red value of 5. Within each square, blue ranges from 0 to 5 left to +right, and within each square green ranges from 0 to 5, top to bottom. This +scheme takes some getting used to. + +![](/docs/clog/images/color5.png){.img-responsive} + +The block of 24 gray colors can also be accessed as gray0 - gray23, in a +continuous ramp from black to white. + +#### True Color Model + +This is true 24-bit color, and is not yet supported. + +#### Mixing Color Models + +If you specify 16-color colors, and view on a 256-color terminal, no problem. If +you try the reverse, specifying 256-color colors and viewing on a 16-color +terminal, you will be disappointed, perhaps even appalled. The results are +usually that only the 16-color model is shown, and the rest is just blank. + +There is some limited color mapping - for example, if you were to specify this +combination: + + red on gray3 + +Then you are mixing a 16-color and 256-color specifications. Taskwarrior will +map `red` to `color1`, and proceed. Note that `red` and `color1` are not quite +the same tone. + +Note also that there are no `bold` or `bright` attributes when dealing with 256 +colors, but there is still underline available. + +#### Terminal Settings + +All of the above directly emit Xterm escape sequences to control color and have +absolutely nothing to do with your `$TERM` setting. +::: diff --git a/content/docs/clog/download.md b/content/docs/clog/download.md new file mode 100644 index 00000000..ef3252a2 --- /dev/null +++ b/content/docs/clog/download.md @@ -0,0 +1,50 @@ +--- +title: "Clog - Download" +--- + +[]{#how} + +### How To Build Clog + +This is for developers. Specifically those who know how to use tools, satisfy +dependencies, and want to set up a development environment. It is not +user-friendly. + +You\'ll need these tools: + +- [git](https://git-scm.com/) +- [cmake](https://cmake.org) +- make +- C++ compiler, currently gcc 4.7+ or clang 3.3+ for full C++11 support + +[]{#download} + +### Downloading the Repo + +The next step is to obtain the code. This means getting the released tarball. +You can download the tarball with `curl`, as an example of just one of many ways +to download the tarball. + + $ curl -L -O https://gothenburgbitfactory.org/download/clog-1.3.0.tar.gz + +[]{#build} + +### Building the Tarball + +Expand the tarball, build Clog, and install it. This copies files into the right +place, and installs the man page. + + $ tar xzf clog-1.3.0.alpha.tar.gz + $ cd clog-1.3.0.alpha + $ cmake -DCMAKE_BUILD_TYPE=release . + ... + $ make + ... + $ sudo make install + +[]{#patch} + +### Submitting a Patch + +[See here for details](/docs/clog/clone.html#patch). +::: diff --git a/content/docs/clog/example_apache.md b/content/docs/clog/example_apache.md new file mode 100644 index 00000000..7540498c --- /dev/null +++ b/content/docs/clog/example_apache.md @@ -0,0 +1,15 @@ +--- +title: "Clog - Apache Rules" +--- + +### Apache Rules + +This example shows color highlighting for HTTP status code. + + # Apache access.log status codes + + apache rule / 2[0-9][0-9] / --> green match + apache rule / 3[0-9][0-9] / --> yellow match + apache rule / 4[0-9][0-9] / --> red match + apache rule / 5[0-9][0-9] / --> bold red match +::: diff --git a/content/docs/clog/example_syslog.md b/content/docs/clog/example_syslog.md new file mode 100644 index 00000000..c65ecb18 --- /dev/null +++ b/content/docs/clog/example_syslog.md @@ -0,0 +1,16 @@ +--- +title: "Clog - Syslog Rules" +--- + +### Syslog Rules + +This example shows color highlighting for `syslog` severities. + + # Standard syslog entries. + + default rule /warn|debug/ --> yellow line + default rule /error|severe/ --> red line + default rule "critical" --> bold red line + default rule "critical" --> blank + default rule "ignore" --> suppress +::: diff --git a/content/docs/clog/help.md b/content/docs/clog/help.md new file mode 100644 index 00000000..27a151f3 --- /dev/null +++ b/content/docs/clog/help.md @@ -0,0 +1,21 @@ +--- +title: "Clog - Help" +--- + +### Getting Help + +There are three source of help for Timewarrior: + +- Man page: `$ man clog` +- Online help that you are reading now + +The recommendation is that you go to the [Online Documentation](/docs/clog) and +read all of it, in order. This will give you the most thorough explanation of +what Clog does. + +The online documentation will likely always be more complete and correct, and +will be updated between releases. + +When you become more familiar with Clog, you will probably refer to the man page +or built-in help, which is a more concise reference. +::: diff --git a/content/docs/clog/how.md b/content/docs/clog/how.md new file mode 100644 index 00000000..297e1ca9 --- /dev/null +++ b/content/docs/clog/how.md @@ -0,0 +1,28 @@ +--- +title: "Clog - How does it work?" +--- + +### How does it work? + +Clog is a filter, which means it reads standard input, and writes that input to +standard output. Here is an example of a filter that does nothing: + + $ echo 'Hello Clog' | clog + Hello Clog + $ + +The input passed through Clog unchanged. This is because the input matched no +default rules. + +When you define rules in your `~/.clogrc` file, those rules are matched against +the input, and if a rule matches, the action defined by the rule is performed. + +When no `section` is ѕpecified, as in the example above, the \'`default`\' +section is used. When a section is ѕpecified, then the named section is used. +You can specify multiple sections if you wish to combined rule sets. + +The rules are applied to the input, in the order in which they are defined in +the `~/.clogrc` file. The first rule is run first, and so on. This can mean that +some rules are eclipsed by others, and you can modify the behavior by reordering +the rules. +::: diff --git a/content/docs/clog/index.md b/content/docs/clog/index.md new file mode 100644 index 00000000..a6e2a7aa --- /dev/null +++ b/content/docs/clog/index.md @@ -0,0 +1,9 @@ +--- +title: "Clog - Online Docs" +--- + +--- +title: Clog - Online Docs +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} diff --git a/content/docs/clog/options.md b/content/docs/clog/options.md new file mode 100644 index 00000000..057bb2da --- /dev/null +++ b/content/docs/clog/options.md @@ -0,0 +1,41 @@ +--- +title: "Clog - Options" +--- + +### Options + +In addition to the rules, Clog supports these command line options which also +affect the output. + +#### The `--file` Option + +When specified, the `--file` option is an override for the default `~/.clogrc` +file. You can use this option to select from several different rule files. + +#### The `--date` Option + +When the `--date` option is specified, the current date in the form `YYYY-MM-DD` +is written before every line. Using this rule set: + +![](/docs/clog/images/option1.png){.img-responsive} + +Then applying it to this sample input (which contains no matches): + +![](/docs/clog/images/option2.png){.img-responsive} + +This is the result: + +![](/docs/clog/images/option3.png){.img-responsive} + +#### The `--time` Option + +Similarly, when the `--time` option is used, the current time, in the form +`HH:MM:SS` is written before every line. Here is an an example: + +![](/docs/clog/images/option4.png){.img-responsive} + +Note that both `--date` and `--time` can be specified, yielding a complete +timestamp: + +![](/docs/clog/images/option5.png){.img-responsive} +::: diff --git a/content/docs/clog/patterns.md b/content/docs/clog/patterns.md new file mode 100644 index 00000000..e8ba8b78 --- /dev/null +++ b/content/docs/clog/patterns.md @@ -0,0 +1,41 @@ +--- +title: "Clog - Rule Patterns" +--- + +### Rule Patterns + +Rules apply when their pattern matches the input, then the actions are +performed. Here is an example: + +![](/docs/clog/images/pattern1.png){.img-responsive} + +When the pattern is quoted as above, `"blue"`, then the pattern is interpreted +as a direct match, character-for-character. This means the input must contain +exactly `blue` for a match. + +Alternately, a regular expression may be used, by enclising the pattern in slash +characters like `/blue/`. This is a bad example of a regular expression because +it is also simply character-for-character match. This example will likely just +run slower. + +But regular expressions have capabilities that go beyond simple patterns. Here +is an example that allows for capitalization of the color names: + +![](/docs/clog/images/pattern2.png){.img-responsive} + +Here is a regular expression that makes sure that the word \'blue\' is a +complete word, and not merely part of a bigger word. It does this by requiring +that the \'b\' is preceded by a wo└d boundary, and the \'e\' is followed by a +word boundary: + +![](/docs/clog/images/pattern3.png){.img-responsive} + +Note that regular expression can become arbitrarily complex, and correspondingly +slow. If you can use a simple pattern, it is recommended for performance +reasons. + +For a full explanation of regular expression support, see your system\'s +relevant man page: + + $ man re_format +::: diff --git a/content/docs/clog/sections.md b/content/docs/clog/sections.md new file mode 100644 index 00000000..a0d9c404 --- /dev/null +++ b/content/docs/clog/sections.md @@ -0,0 +1,43 @@ +--- +title: "Clog - Rule Sections" +--- + +### Rule Sections + +Each rule belongs to a `section`. A section is just a simple grouping mechanism +so you can have multiple rules sets in one rule file. If a rules belongs to the +`default` section, then it applies when no section is specified on the command +line. + +Here is an example rule file, containing two rules: + +![](/docs/clog/images/section1.png){.img-responsive} + +The first rule is in the \'`default`\' section, and looks for the word \'red\', +and colors it red. The second rule is in the \'`special`\' section, and also +looks for the word \'red\', and colors it as white on a red background. + +Without the difference in sections, these rules conflict. Here is a +demonstration of these rules being used: + +![](/docs/clog/images/section2.png){.img-responsive} + +Clog is invoked four times. In the first command, no section is ѕpecified, so +the \'`default`\' section is used, and you can see that the word \'red\' in the +input is colored red. The second command explicitly uses the \'`default`\' +section, and the result is the same. + +Next the \'`special`\' section is specified, and the corresponding rule applies, +yielding a different result. + +Finally a missing section name is specified, and nothing happens. + +If multiple sections are specified, then the rules are applied in that order. In +the example, the \'`default`\' section is specified before the \'`special`\' +section. Both rules apply, but because the \'`special`\' section is specifed +*last*, it takes precedence. + +. When the order of sections is reversed, the other rule has precedence. + +![](/docs/clog/images/section3.png){.img-responsive} +::: diff --git a/content/docs/clog/setup.md b/content/docs/clog/setup.md new file mode 100644 index 00000000..927cc05c --- /dev/null +++ b/content/docs/clog/setup.md @@ -0,0 +1,34 @@ +--- +title: "Clog - Setup" +--- + +### Setup + +Clog needs a rules file before it can do anything. If you run `clog` before +creating a rules file, you see this: + + $ clog + Cannot open /home/xxx/.clogrc + See 'man clog' for details, and a sample file. + +Clog allows you to specify a rules files on the command line, and if that +doesn\'t exist, you get the same error: + + $ clog -f asdf + Cannot open asdf + See 'man clog' for details, and a sample file. + +Creating a rules file is as simple as creating an empty file: + + $ touch ~/.clogrc + $ + +Comments in the rule files begin with the \'`#`\' character, so you can also +create a rule file like this: + + $ echo '# Clog Rules' > ~/.clogrc + $ + +Examples of what should be in your rules files are discussed in subsequent +documents. +::: diff --git a/content/docs/clog/syntax.md b/content/docs/clog/syntax.md new file mode 100644 index 00000000..f6d80c8d --- /dev/null +++ b/content/docs/clog/syntax.md @@ -0,0 +1,25 @@ +--- +title: "Clog - Rule Syntax" +--- + +### Rules Syntax + +Clog rules have a very simple syntax, which is this: + + # +
rule --> ... + +A rule must occupy one and only one line. You cannot break rules over several +lines, or combined two rules on one line. + +#### Comments + +A comment begins with the \'`#`\' character, and continues until the end of the +line. You can add arbitrary descriptions using comments, or you can disable a +rule by putting a \'`#`\' at the beginning of the line. Example rule file +fragment: + + # This is a rule that finds lines containing the word 'ignore' + # and removes them from the output. + default rule "ignore" --> suppress # Does not check for word boundaries +::: diff --git a/content/docs/clog/what.md b/content/docs/clog/what.md new file mode 100644 index 00000000..154b00dd --- /dev/null +++ b/content/docs/clog/what.md @@ -0,0 +1,55 @@ +--- +title: "Clog - What is it?" +--- + +### What is Clog? + +Clog is a filter that colorizes log files. Have you ever done something like +this: + + $ tail -f /var/log/something.log + +Then left that running in a terminal while you debug or run some program. Were +you able to spot details as they scrolled by? Depending on the volume of data +scrolling by, it can be difficult to spot important information. + +Clog is a filter, that you run like this: + + $ tail -f /var/log/something.log | clog something + +The \'something\' argument to clog is a section, which refers to a section in +\~/.clogrc with a distinct set of rules. Those rules list patterns to look for, +and actions to take when the pattern is matched by a line. A typical example +might be that you want to highlight any line that contains the pattern +\'severe\'. This entry in \~/clogrc achieves this: + + something rule /severe/ --> bold line + +This rule is in the \'something\' section, the pattern is \'severe\', and the +action taken is to embolden the whole line. Pattern \'severe\' should probably +be more restrictive, because it will also match words like \'persevered\', but +that is optional. + +Full 16- and 256-color support is included, for the colorization of the log +entries. See [Color Specification](/docs/clog/color.html) for full details. + +Instead of coloring the whole line, specifying \'match\' instead will only color +the parts of the line that match. + +The format of the rules is: + +
rule // --> + +The section is simply a way to allow multiple rules sets, so that one .clogrc +file can serve multiple uses. The pattern is any supported Standard C Library +regular expression. Action must be one of \'line\', \'match\', \'suppress\' or +\'blank\'. + +Rules are processed in order, from top to bottom. This means that a rule defined +lower in the rc file gets to apply it\'s color later, and therefore \'on top +of\' that of an earlier rule. + +Note that there is a default section, called \'default\'. Putting rules in the +default section means that no section need be specified on the command line. +Multiple sections may be specified, and the rules are combined. +::: diff --git a/content/docs/coding_style.md b/content/docs/coding_style.md new file mode 100644 index 00000000..a92e1f51 --- /dev/null +++ b/content/docs/coding_style.md @@ -0,0 +1,46 @@ +--- +title: "Taskwarrior - Coding Style" +--- + +[]{#style} + +### Coding Style + +The coding style used for the Taskwarrior, Taskserver, and other codebases is +deliberately kept simple and a little vague. This is because there are many +languages involved (C++, C, Python, sh, bash, HTML, troff and more), and +specіfying those would be a major effort that detracts from the main focus which +is improving the software. + +Instead, the general guideline is simply this: +::: + +::: {.row} +::: {.callout .callout-info} +Make all changes and additions such that they blend in perfectly with the +surrounding code, so it looks like only one person worked on the source, and +that person is rigidly consistent. +::: +::: + +::: {.row} +To be a little more explicit, the common elements across the languages are: + +- Indent code using two spaces, no tabs +- With Python, follow [PEP8](https://www.python.org/dev/peps/pep-0008/) as + much as possible +- Surround operators and expression terms with a space +- No cuddled braces +- Class names are capitalized, variable names are not +::: + +::: {.row} +We target Python 2.7 so that our test suite runs on the broadest set of +platforms. This will likely change in the future and 2.7 will be dropped. +::: + +::: {.row} +We can safely target C++11 because all the default compilers on our supported +platforms are ready. Feel free to use C++14 and C++17 provided that all build +platforms support this. +::: diff --git a/content/docs/commands/_get.md b/content/docs/commands/_get.md new file mode 100644 index 00000000..358b8132 --- /dev/null +++ b/content/docs/commands/_get.md @@ -0,0 +1,42 @@ +--- +title: "Taskwarrior - _get" +--- + +[]{#_get} + +### \_get + +The `_get` command is a [DOM](/docs/dom.html) accessor. You can use this command +to extract any piece of information stored by taskwarrior. For example to obtain +the description of task 12: + + $ task _get 12.description + Buy some milk + +You can specify multiple data items: + + $ task _get 12.description 12.project + Buy some milk Kitchen + +You can use UUIDs: + + $ task _get a360fc44-315c-4366-b70c-ea7e7520b749.description + Buy some milk + +The `_get` command makes it easy to map between ID and UUID: + + $ task _get 12.uuid + a360fc44-315c-4366-b70c-ea7e7520b749 + $ task _get a360fc44-315c-4366-b70c-ea7e7520b749.id + 12 + +The `_get` command is a helper command, which means it is more useful for +scripts and extensions than command line use. + +[]{#also} + +#### See Also + +- [DOM](/docs/dom.html) +- [`export`{.sample}](/docs/commands/export.html) command +::: diff --git a/content/docs/commands/_unique.md b/content/docs/commands/_unique.md new file mode 100644 index 00000000..9a0b7139 --- /dev/null +++ b/content/docs/commands/_unique.md @@ -0,0 +1,59 @@ +--- +title: "Taskwarrior - _unique" +--- + +[]{#_unique} + +### \_unique + +The `_unique` command generates a filtered list of unique values for a given +attribute. For example, to generate the list project names: + + $ task _unique project + Home + Home.Garden + Work + +In addition to `project`, any attribute can be specified, for example, task +`status`: + + $ task _unique status + pending + deleted + completed + +There + +[]{#filter} + +#### Filters + +You can specify a filter, to consider a subset of tasks, for example, here we +see that the `Home.Garden` project has only pending tasks: + + $ task project:Home.Garden _unique status + pending + +[]{#limitations} + +#### Limitations + +- Date attributes are presented in raw epoch form. This is a helper command, + after all. + +[]{#also} + +#### See Also + +Other ways of generating unique lists include: + +- `_aliases`{.sample .text-muted} command +- `_config`{.sample .text-muted} command +- `_context`{.sample .text-muted} command +- `_ids`{.sample .text-muted} command +- `_projects`{.sample .text-muted} command +- `_show`{.sample .text-muted} command +- `_tags`{.sample .text-muted} command +- `_udas`{.sample .text-muted} command +- `_uuids`{.sample .text-muted} command +::: diff --git a/content/docs/commands/add.md b/content/docs/commands/add.md new file mode 100644 index 00000000..e2feb168 --- /dev/null +++ b/content/docs/commands/add.md @@ -0,0 +1,68 @@ +--- +title: "Taskwarrior - Add Command" +--- + +[]{#add} + +### add + +The `add` command is the primary means of creating tasks. The simplest task +requires only a description: + + $ task add Fix the leaky plumbing + +You can enter the description as above, just by including the words as command +line arguments. You can also provide quoted strings: + + $ task add "Don't forget to shut off the main water valve first" + +In this example the double-quotes hide the single unclosed quote in \"Don\'t\". +It is a good idea to quote task descriptions to avoid some problems with the +shell, although not necessary. The (outer) quotes are not considered part of the +description, in fact Taskwarrior never sees them because the shell removes them +first. Dealing with shell issues is covered in detail in the [Escaping Shell +Characters](#) page. + +[]{#atts} + +#### Other Attributes + +In addition to a description, other attributes may be provided in the following +manner: + + $ task add Find the adjustable wrench project:Home priority:H + +This example sets a project and a priority, to a new task. Note that the order +of the words in the task description are preserved, but there is no need to put +the project and priority at the end of the command - they may appear anywhere on +the line. Here are two equivalent commands to illustrate this: + + $ task add Find the project:Home adjustable priority:H wrench + $ task add project:Home priority:H Find the adjustable wrench + +In addition to project and priority, you may set the entry timestamp, start +timestamp, due date, tags, recurrence frequency, until date, and status. You +cannot add annotations while creating a task because it interferes with the task +description. You may specify anything else except the ID and UUID. These are +created automatically. + +[]{#limitations} + +#### Limitations + +- Task descriptions may only contain one line of text. Taskwarrior will wrap + that text when it is displayed, but there is no means of entering multi-line + tasks. +- There is no way to simultaneously add a task and annotate it. Annotations + must be applied to existing tasks. + +[]{#also} + +#### See Also + +Other ways of creating tasks include: + +- [`log`{.sample}](/docs/commands/log.html) command +- `duplicate`{.sample} command +- `import`{.sample} command +::: diff --git a/content/docs/commands/append.md b/content/docs/commands/append.md new file mode 100644 index 00000000..ed75dc12 --- /dev/null +++ b/content/docs/commands/append.md @@ -0,0 +1,32 @@ +--- +title: "Taskwarrior - Append Command" +--- + +[]{#append} + +### append + +The `append` command is a way to add words to the end of a task description: + + $ task add Fix plumbing + $ task 1 append before the house floods + +While adding words to the end of the description, the `append` command can also +update other attributes: + + $ task 1 append and before winter project:Home +repair + $ task 1 list + + ID Age Project Tags Description Urg + -- ---- ------- ------ ------------------------------------------------------ ---- + 1 4min Home repair Fix plumbing before the house floods and before winter 1.8 + +[]{#also} + +#### See Also + +Other ways of modifying task descriptions include: + +- [`modify`{.sample}](/docs/commands/modify.html) command +- [`prepend`{.sample}](/docs/commands/prepend.html) command +::: diff --git a/content/docs/commands/burndown.md b/content/docs/commands/burndown.md new file mode 100644 index 00000000..39ba91cc --- /dev/null +++ b/content/docs/commands/burndown.md @@ -0,0 +1,76 @@ +--- +title: "Taskwarrior - Burndown Command" +--- + +[]{#burndown} + +### burndown.weekly (or .daily or .monthly) + +The `burndown` command shows a chart that depicts the number of pending, active +and completed tasks over different time periods. + +This report makes it easy to gauge progress on a project, if a project is +specified in the filter. With a filter, you can see the chart for any set of +tasks. + +[]{#alias} + +#### Alias + +There is an alias specified, by default, named `burndown` that expands to +`burndown.weekly`. This could be overridden to show either `burndown.monthly` or +`burndown.daily` reports instead. + +[]{#convergence} + +#### Convergence + +The `burndown` report tries to predict when the tasks matching the filter will +all be completed. With version [2.5.1]{.label .label-success} the following +approach is used: + +The filtered tasks are scanned to see if a peak number of pending tasks exists. +If the peak number of pending tasks is any time in the last three days, then +more tasks are being added than are being completed. In this case, it is not +possible to predict when that will change, and therefore when the tasks will all +be completed. + +![](/docs/images/nofixrate.png){.img-responsive} + +In the case where a peak has occurred more than three days ago, and the number +of pending tasks has been dropping since, a *net fix rate* can be determined, +which is the average number of tasks completed per day. This rate is shown on +the chart. + +![](/docs/images/fixrate.png){.img-responsive} + +If a *net fix rate* is known, then it can be determined how long it might take +to complete all the remaining matching tasks. This duration is added to the +current date, and a predicted completion date can be calculated. This date is +shown on the chart. + +![](/docs/images/completion.png){.img-responsive} + +This approach is based on a common pattern, which is that projects tend to move +from a planning phase to an execution phase. This simply means that tasks tend +to be created earlier in the process, and completed later in the process. This +tends to create a peak number of pending tasks. + +With the convergence date based on a recent completion rate and count, the +estimated completion date is just an estimate, and it\'s accuracy is unknown, +but is related to consistency in the size of tasks, consistency in your time +spent completing tasks. A more sophisticated approach such as [Evidence-Based +Scheduling](https://www.joelonsoftware.com/items/2007/10/26.html) (EBS) would +take into consideration estimates, actual time, and your task history. + +In earlier releases, the convergence algorithm tried too hard and got it wrong +too often. Let\'s not mention that. + +[]{#also} + +#### See Also + +Related topics include: + +- `history`{.sample} command +::: diff --git a/content/docs/commands/calc.md b/content/docs/commands/calc.md new file mode 100644 index 00000000..1f93cd82 --- /dev/null +++ b/content/docs/commands/calc.md @@ -0,0 +1,219 @@ +--- +title: "Taskwarrior - Calc Command" +--- + +[]{#calc} + +### calc + +Taskwarrior has a `calc` command that exposes the algebraic expression evaluator +used by all other commands and filters. This is handy for quick calculations +from the command line, but combined with DOM access, can be very useful. + +[]{#numbers} + +#### Numbers + +This can be used to perform basic mathematics using the `+`, `-`, `*` and `/` +operators: + + $ task calc 1+2*3 + 7 + +In the above example, care was taken to not allow that `*` operator to be +expanded by the shell into a list of file in the current directory. The best +solution to this is to simply quote the expression. + +In addition to integers, you can use real numbers and scientific notation: + + $ task calc '1.23e-4.5 ^ 2' + 1.5129e-8 + +In addition to exponentiation, `^`, there is the `%` modulus operator. + +[]{#boolean} + +#### Boolean + +The `and`, `or`, `xor`, `==`, `!==`, `=`, `!=`, `!`, `~`, `!~`, `<=`, `<`, `>=`, +and `>` operators allow Boolean expressions: + + $ task calc true and false + false + $ calc true or false + true + $ calc true xor true + false + $ calc '1 < 2 and -1 < 0' + true + +A number can be converted to a Boolean value with a double negative: + + $ task calc '!!3' + true + +Otherwise, type conversions are automatic. + +[]{#text} + +#### Text + +Text, or strings, can be manipulated in more limited ways, for example there is +concatenation: + + $ task calc foo + bar + foobar + +Multiplication is supported in the form of replication: + + $ task calc 'x * 40' + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +There is support for regular expressions, using the `~` match and `!~ ` no-match +operator: + + $ task calc 'foo ~ f' + true + $ task calc 'foo !~ z' + true + $ task calc '"The quick brown fox" ~ "q"' + true + +Again, you\'ll need to protect the `~` and `!~` characters from interpretation +by the shell, and in the last example, to protect the spaces in the sentence. + +[]{#dates} + +#### Dates + +With date support, basic date synonyms like `now`, `today`, `yesterday` and +`tomorrow` are supported: + + $ task calc now + 2014-06-28T12:44:07 + $ task calc today + 2014-06-28T00:00:00 + +Dates can be added, subtracted and compared, and combined with durations: + + $ task calc tomorrow + 2 weeks - 1d + 2014-07-12T00:00:00 + +The expression evaluator understand ISO-8601 date formats, and in fact supports +over 40 of them. For example when does week 40 start in 2014? + + $ task calc 2014W40 + 2014-09-28T00:00:00 + +When is the FIFA Word Cup final, which starts at 4pm in Brasil local time, shown +in the EST (local) time zone? + + $ task calc 2014-07-13T16:00:00-03:00 + 2014-07-13T15:00:00 + +[]{#durations} + +#### Durations + +A duration is either the difference between dates, or a specified interval. +Durations can be summed: + + $ task calc 12h + 25m +30s + PT12H25mPT30S + +Subtracting dates yields a duration, here answering the question of how much +time is there between the end of this month (June 2014) and the end of the year: + + $ task calc eoy-eom + P184DT1H + +Note that the \'1H\' corresponds to the extra hour gained when summer time ends. + +When does the 32-bit `time_t` problem (Unix Epoch, Y2K38) arrive? + + $ task calc later-now + P23Y209DT11H55M11S + +Looks like we have 23 years to deal with that. More importantly though, how long +until the FIFA World Cup final? + + $ task calc 2014-07-13T15:00:00-03:00 - now + P15DT1H11M46S + +Durations are shown using the ISO-8601 designated format, using only prescise +units, that is, not in years or months. + +[]{#dom} + +#### DOM Access + +The expression evaluator has access to the Taskwarrior DOM, which is a complete +source of task information. This information can be accessed and used in an +expression using regular Taskwarrior DOM references: + + $ task calc '1.urgency > 2.urgency' + false + +Because of DOM access, the `calc` command can mimic the `_get` helper command. +In what year did I enter task 100? + + $ task calc 100.entry.year + 2012 + +What week was that? + + $ task calc 100.entry.week + 30 + +[]{#utility} + +#### Calc Utility + +Taskwarrior has a standalone `calc` utility that has the same features, with the +exception of DOM access. This utility is used for testing, but has a few +interesting features of its own. + +[]{#postfix} + +#### Calc Postfix + +Internally, the expression evaluator converts infix expressions (1 + 2 \* 3) to +postfix (1 2 3 \* +), which is easier to implement and optimize, but `calc` +exposes this: + + $ calc --postfix '1 2 3 * +' + 7 + +[]{#debug} + +#### Calc Debugging + +There is also support for a `--debug` commadn line option, which displays the +stack operations as the expression is evaluated in postfix form. + + $ calc --postfix --debug '1 2 3 * +' + [0] eval push '1' + [1] eval push '2' + [2] eval push '3' + [3] eval pop '3' + [2] eval pop '2' + [1] eval operator '*' + [1] eval result push '6' + [2] eval pop '6' + [1] eval pop '1' + [0] eval operator '+' + [0] eval result push '7' + 7 + +You can see that the processing begins by pushing the three values on to the +stack, then two are popped when the `*` binary operator is encountered. The two +value are multiplied, and the result, 6 is pushed back. + +Next the `+` binary operator is encountered, which pops two values off the +stack, the sum, 7, is pushed back. + +The number in brackets is the stack ѕize before the operation is performed. + +If there is a problem found with the Taskwarrior expression evaluator, it can be +verified and tested in this way, using the `calc` utility. +::: diff --git a/content/docs/commands/columns.md b/content/docs/commands/columns.md new file mode 100644 index 00000000..9d110866 --- /dev/null +++ b/content/docs/commands/columns.md @@ -0,0 +1,142 @@ +--- +title: "Taskwarrior - Columns Command" +--- + +[]{#columns} + +### columns + +The `columns` command shows a list of all the supported columns available for +inclusion in a custom report. Each column may have multiple formats, and there +are examples shown of each of those formats. + +As an example, a `due` date can be shown in various ways. It can be formatted +according to the `dateformat` configuration setting. It can also be shown as a +Julian date, a POSIX epoch, in ISO-8601 format, as an \'age\' value or as a +\'countdown\' value. + +Each column has a default format, so if the custom report specifies: + + report.my_list.columns=...,due,... + +Then the default format is used. Other formats can be used like this: + + report.my_list.columns=...,due.iso,... + +Here is sample output for the `columns` command: + + Columns Type Modifiable Supported Formats Example + component string Modifiable default* + indicator + depends string Modifiable list* 1 2 10 + count [3] + indicator D + description string Modifiable combined* Move your clothes down on to the lower peg + 2015-12-28 Immediately before your lunch + 2015-12-28 If you are playing in the match this afternoon + 2015-12-28 Before you write your letter home + 2015-12-28 If you're not getting your hair cut + desc Move your clothes down on to the lower peg + oneline Move your clothes down on to the lower peg 2015-12-28 Immediately before your lunch 2015-12-28 If you are playing in the match this afternoon 2015-12-28 Before you write your letter home 2015-12-28 If you're not getting your hair cut + truncated Move your clothes do... + count Move your clothes down on to the lower peg [4] + truncated_count Move your clothes do... [4] + due date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + end date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + entry date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + estimate string Modifiable default* + indicator + id numeric Read Only number* 123 + imask numeric Read Only number* 12 + mask string Read Only default* ++++--- + modified date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + parent string Read Only long* f30cb9c3-3fc0-483f-bfb2-3bf134f00694 + short f30cb9c3 + priority string Modifiable default* + indicator + project string Modifiable full* home.garden + parent home + indented home.garden + recur string Modifiable duration* weekly + indicator R + scheduled date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + start date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + active * + status string Modifiable long* Pending + short P + tags string Modifiable list* home @chore next + indicator + + count [2] + tracnumber numeric Modifiable default* + indicator + tracsummary string Modifiable default* + indicator + tracurl string Modifiable default* + indicator + until date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + urgency numeric Modifiable real* 4.6 + integer 4 + uuid string Read Only long* f30cb9c3-3fc0-483f-bfb2-3bf134f00694 + short f30cb9c3 + wait date Modifiable formatted* 2015-12-28 + julian 2457385.04894 + epoch 1451308228 + iso 20151228T131028Z + age 2min + relative -2min + remaining + countdown PT2M5S + Modifiable default* + indicator + + * Means default format, and therefore optional. For example, 'due' and 'due.formatted' are equivalent. +::: diff --git a/content/docs/commands/count.md b/content/docs/commands/count.md new file mode 100644 index 00000000..d12b68cf --- /dev/null +++ b/content/docs/commands/count.md @@ -0,0 +1,29 @@ +--- +title: "Taskwarrior - Count Command" +--- + +[]{#count} + +### count + +The `count` command simply counts tasks: + + $ task count + 249 + +By default, all tasks are counted, which includes completed, deleted and +pending. If you want to count just the pending tasks, add a filter: + + $ task status:pending count + 32 + +If a [context](/docs/context.html) is active, the `count` command obeys it. + +[]{#also} + +#### See Also + +Other ways of counting tasks include: + +- [`_unique`{.sample}](/docs/commands/_unique.html) command +::: diff --git a/content/docs/commands/done.md b/content/docs/commands/done.md new file mode 100644 index 00000000..14007944 --- /dev/null +++ b/content/docs/commands/done.md @@ -0,0 +1,77 @@ +--- +title: "Taskwarrior - Done Command" +--- + +[]{#done} + +### done + +The `done` command is how tasks are marked as completed. + + $ task add Paint the door + Created task 1. + + $ task 1 done + Completed task 1 'Paint the door'. + Completed 1 task. + +This sets the task status to `completed`, adds an `end` date and updates the +`modified` date. + +[]{#enpassant} + +#### En Passant + +There is a feature shared by several commands, named *en passant*, which allows +further changes, above and beyond the command to be made. An example would be to +remove the `important` tag while completing a task: + + $ task 1 done -important + +Here the tag removal is the *en passant* move made while completing the task. +Different kinds of modifications may be made when completing a task: + + $ task 1 done -important /teh/the/ project: +tag + +One special case is that text provided *en passant* is added to the task as an +annotation: + + $ task 1 done Paint dried overnight + +Here the text `Paint dried overnight` is added as an annotation. + +[]{#uuid} + +#### UUID + +Once a task is completed, it can be referred to by its UUID, because it no +longer has an ID: + + $ task 937bb9e4-25df-42a7-a52e-bd47edb23ccd info + + Name Value + ------------- --------------------------------------------------- + ID - + Description Paint the door + Status Completed + Entered 2015-09-01 23:08:22 (22s) + End 2015-09-01 23:08:27 + Last modified 2015-09-01 23:08:27 (17s) + Virtual tags COMPLETED UNBLOCKED LATEST + UUID 937bb9e4-25df-42a7-a52e-bd47edb23ccd + Urgency 0 + + Date Modification + 2015-09-01 23:08:27 End set to '2015-09-01 23:08:27'. + Status changed from 'pending' to 'completed'. + +[]{#also} + +#### See Also + +Related topics include: + +- [`log`{.sample}](/docs/commands/log.html) command +- `delete`{.sample} command +- `undo`{.sample} command +::: diff --git a/content/docs/commands/export.md b/content/docs/commands/export.md new file mode 100644 index 00000000..ce1f0ccc --- /dev/null +++ b/content/docs/commands/export.md @@ -0,0 +1,63 @@ +--- +title: "Taskwarrior - Export Command" +--- + +[]{#export} + +### export + +The `export` command accepts a filter, and generates a JSON formatted text +output. For example: + + $ task 1 export + {"id":1,"description":"Buy milk","entry":"20141018T050231Z","modified":"20141018T050231Z","status":"pending","uuid":"a360fc44-315c-4366-b70c-ea7e7520b749","urgency":"2"} + +This command allows you to extract all data from Taskwarrior, in a +machine-readable, standard format. The `export` command is used by many +Taskwarrior extensions to gain access to the data. + +[]{#format} + +#### JSON Format + +The JSON is formatted according to the [Taskwarrior JSON +Format](/docs/design/task.html), which consists of one JSON object per line, +where one object represents one task. + +[]{#config} + +#### Configuration + +There is a configuration setting `json.array` which defaults to \'off\', but +when set to \'on\' generates a single JSON array, rather than a set of +individual JSON objects. In the example below you see a set of JSON objects +(`{...}`), one per line: + + $ task 1-2 export rc.json.array=off + {"id":1,"description":"Buy milk", ...} + {"id":2,"description":"Buy potatoes" ...} + +Setting `json.array` to \'on\', a similar structure is emitted but the task +objects are presented in a list, one per line: + + $ task 1-2 export rc.json.array=on + [{"id":1,"description":"Buy milk", ...}, + {"id":2,"description":"Buy potatoes" ...}] + +Which setting you use depends on how you handle the JSON. + +[]{#limitations} + +#### Limitations + +The `export` command JSON includes metadata that is not stored. The `id` and +`urgency` values are included because some external programs want to see this, +but are derived values, not stored values. + +[]{#also} + +#### See Also + +- [`_get`{.sample}](/docs/commands/_get.html) command +- `import`{.sample} command +::: diff --git a/content/docs/commands/index.md b/content/docs/commands/index.md new file mode 100644 index 00000000..c3acef5e --- /dev/null +++ b/content/docs/commands/index.md @@ -0,0 +1,141 @@ +--- +title: "Taskwarrior - What's next?" +--- + +[]{#commands} + +### Commands + +Here are the commands alphabetically. Version-specific features are labelled +with the version in which they were first available. + + ---------------------------------------------------------------------------- ------------------------------------------------------------------ + [`add`{.sample}](/docs/commands/add.html) Add a new task + `annotate`{.sample .text-muted} Add an annotation to a task + [`append`{.sample}](/docs/commands/append.html) Append words to a task description + [`calc`{.sample}](/docs/commands/calc.html) [2.4.0]{.label .label-success} Expression calculator + `config`{.sample .text-muted} Modify configuration settings + `context`{.sample .text-muted} Manage contexts + [`count`{.sample}](/docs/commands/count.html) Count the tasks matching a filter + `delete`{.sample .text-muted} Mark a task as deleted + `denotate`{.sample .text-muted} Remove an annotation from a task + [`done`{.sample}](/docs/commands/done.html) Complete a task + `duplicate`{.sample .text-muted} Clone an existing task + `edit`{.sample .text-muted} Launch your text editor to modify a task + `execute`{.sample .text-muted} Execute an external command + [`export`{.sample}](/docs/commands/export.html) Export tasks in JSON format + `help`{.sample .text-muted} Show high-level help, a cheat-sheet + `import`{.sample .text-muted} Import tasks in JSON form + [`log`{.sample}](/docs/commands/log.html) Record an already-completed task + `logo`{.sample .text-muted} Show the Taskwarrior logo + [`modify`{.sample}](/docs/commands/modify.html) Modify one or more tasks + [`prepend`{.sample}](/docs/commands/prepend.html) Prepend words to a task description + `purge`{.sample .text-muted} [2.6.0]{.label .label-success} Completely removes tasks, rather than change status to `deleted` + `start`{.sample .text-muted} Start working on a task, make active + `stop`{.sample .text-muted} Stop working on a task, no longer active + [`synchronize`{.sample}](/docs/commands/synchronize.html) Syncs tasks with Taskserver + `undo`{.sample .text-muted} Revert last change + `version`{.sample .text-muted} Version details and copyright + ---------------------------------------------------------------------------- ------------------------------------------------------------------ + +[]{#custom} + +### Customizable Reports + +[Customizable reports](/docs/report.html) can be modified to suit your needs. +They all work in same manner, and mostly differ by the +[columns](/docs/commands/columns.html) shown, the [filter](/docs/filter.html) +applied, and the sorting performed. + +Because all the customizable reports work in the same way, [the `list` +report](/docs/commands/list.html) is the only report discussed. + + --------------------------------------------- --------------------------------------- + `active`{.sample .text-muted} Started tasks + `all`{.sample .text-muted} Pending, completed and deleted tasks + `blocked`{.sample .text-muted} Tasks that are blocked by other tasks + `blocking`{.sample .text-muted} Tasks that block other tasks + `completed`{.sample .text-muted} Tasks that have been completed + [`list`{.sample}](/docs/commands/list.html) Pending tasks + `long`{.sample .text-muted} Pending tasks, long form + `ls`{.sample .text-muted} Pending tasks, short form + `minimal`{.sample .text-muted} Pending tasks, minimal form + `newest`{.sample .text-muted} Most recent pending tasks + `next`{.sample .text-muted} Most urgent tasks + `oldest`{.sample .text-muted} Oldest pending tasks + `overdue`{.sample .text-muted} Overdue tasks + `ready`{.sample .text-muted} Pending, unblocked, scheduled tasks + `recurring`{.sample .text-muted} Pending recurring tasks + `unblocked`{.sample .text-muted} Tasks that are not blocked + `waiting`{.sample .text-muted} Hidden, waiting tasks + --------------------------------------------- --------------------------------------- + +[]{#fixed} + +### Fixed Reports + +The fixed reports have minimal customization, typically only color. + + ----------------------------------------------------------------------- ---------------------------------------------- + [`burndown.daily`{.sample}](/docs/commands/burndown.html) Burndown chart, by day + [`burndown.monthly`{.sample}](/docs/commands/burndown.html) Burndown chart, by month + [`burndown.weekly`{.sample}](/docs/commands/burndown.html) Burndown chart, by week + `calendar`{.sample .text-muted} Calendar and holidays + `colors`{.sample .text-muted} Demonstrates all supported colors + [`columns`{.sample}](/docs/commands/columns.html) List of report columns and supported formats + `commands`{.sample .text-muted} [2.5.0]{.label .label-success} List of commands, with their behaviors + `diagnostics`{.sample .text-muted} Show diagnostics, for troubleshooting + `ghistory.annual`{.sample .text-muted} History graph, by year + `ghistory.monthly`{.sample .text-muted} History graph, by month + `ghistory.weekly`{.sample .text-muted} [2.6.0]{.label .label-success} History graph, by week + `ghistory.daily`{.sample .text-muted} [2.6.0]{.label .label-success} History graph, by day + `history.annual`{.sample .text-muted} History report, by year + `history.monthly`{.sample .text-muted} History report, by month + `history.weekly`{.sample .text-muted} [2.6.0]{.label .label-success} History report, by week + `history.daily`{.sample .text-muted} [2.6.0]{.label .label-success} History report, by day + `ids`{.sample .text-muted} Filtered list of task IDs + [`information`{.sample}](/docs/commands/info.html) All attributes shown + `projects`{.sample .text-muted} Filtered list of projects, with task counts + `reports`{.sample .text-muted} List of available reports + `show`{.sample .text-muted} Filtered list of configuration settings + `stats`{.sample .text-muted} Filtered statistics + `summary`{.sample .text-muted} Filtered project summary + `tags`{.sample .text-muted} Filtered list of tags + `timesheet`{.sample .text-muted} Weekly timesheet report + `udas`{.sample .text-muted} Details of all defined UDAs + `uuids`{.sample .text-muted} Filtered list of UUIDs + ----------------------------------------------------------------------- ---------------------------------------------- + +[]{#helpers} + +### Helper Commands + +Helper commands all begin with an underscore and they exist to provide support +for third party add-ons, such as shell completion scripts. + +Helper commands generate no extraneous output, and are therefore easy to parse. +Helper commands are not intended for regular use, but there is no reason for +that to stop you. + + ---------------------------------------------------------------------------------- --------------------------------------------------- + `_aliases`{.sample .text-muted} List of active aliases + `_columns`{.sample .text-muted} List of supported columns + `_commands`{.sample .text-muted} List of supported commands + `_config`{.sample .text-muted} List of confguration setting names + `_context`{.sample .text-muted} List of defined context names + [`_get`{.sample}](/docs/commands/_get.html) DOM accessor + `_ids`{.sample .text-muted} Filtered list of task IDs + `_projects`{.sample .text-muted} Filtered list of project names + `_show`{.sample .text-muted} List of `name=value` configuration settings + `_tags`{.sample .text-muted} Filtered list of tags in use + `_udas`{.sample .text-muted} List of configured UDA names + [`_unique`{.sample}](/docs/commands/_unique.html) [2.5.0]{.label .label-success} List of unique values for the specified attribute + `_urgency`{.sample .text-muted} Filtered list of task urgencies + `_uuids`{.sample .text-muted} Filtered list of pending UUIDs + `_version`{.sample .text-muted} Task version (and optional git commit) + `_zshattributes`{.sample .text-muted} Zsh formatted task attribute list + `_zshcommands`{.sample .text-muted} Zsh formatted command list + `_zshids`{.sample .text-muted} Zsh formatted ID list + `_zshuuids`{.sample .text-muted} Zsh formatted UUID list + ---------------------------------------------------------------------------------- --------------------------------------------------- +::: diff --git a/content/docs/commands/info.md b/content/docs/commands/info.md new file mode 100644 index 00000000..7b6ea2ed --- /dev/null +++ b/content/docs/commands/info.md @@ -0,0 +1,98 @@ +--- +title: "Taskwarrior - Info Command" +--- + +[]{#add} + +### info + +The `info` command (the full command name is `information`) is a way to display +all the task metadata in human-readable form. This includes +[UDAs](/docs/udas.html). + + $ task 1 info + + Name Value + ------------- ------------------------------------------------------------------ + ID 241 + Description Need to map stored duration values to the supported subset on load + Status Pending + Project tw.240 + Entered 2014-09-19 11:32:22 (2 weeks) + Last modified 2014-09-19 11:32:22 (2 weeks) + Tags bug + Virtual tags PENDING READY TAGGED UNBLOCKED + UUID 91bbb01f-4a43-42bd-a7a3-03ce3a2451ff + Urgency 4.882 + project 1 * 1 = 1 + tags 0.8 * 1 = 0.8 + age 0.041 * 2 = 0.082 + TAG bug 1 * 3 = 3 + + Date Modification + ------------------- ------------------ + 2014-09-27 11:01:02 Tags set to 'bug'. + +Taskwarrior [2.4.0]{.label .label-success} will also show a detailed breakdown +of the urgency calculation, as shown. + +Taskwarrior [2.4.2]{.label .label-success} will also show a list of valid +[Virtual Tags](/docs/tags.html). + +The `info` command also accepts `UUID`s to identify tasks, so you can inspect +completed and deleted tasks also. + + $ task 91bbb01f-4a43-42bd-a7a3-03ce3a2451ff + info + + Name Value + ------------- ------------------------------------------------------------------ + ID 241 + Description Need to map stored duration values to the supported subset on load + Status Pending + Project tw.240 + Entered 2014-09-19 11:32:22 (2 weeks) + Last modified 2014-09-19 11:32:22 (2 weeks) + Tags bug + Virtual tags PENDING READY TAGGED UNBLOCKED + UUID 91bbb01f-4a43-42bd-a7a3-03ce3a2451ff + Urgency 4.882 + project 1 * 1 = 1 + tags 0.8 * 1 = 0.8 + age 0.041 * 2 = 0.082 + TAG bug 1 * 3 = 3 + + Date Modification + ------------------- ------------------ + 2014-09-27 11:01:02 Tags set to 'bug'. + +The `info` command also accepts filters, for example searching: + + $ task /duration\ values/ info + ... + +Taskwarrior [2.4.0]{.label .label-success} will use the `info` command in cases +when no command is specified, and the only arguments are IDs or UUIDs, for +example: + + $ task 242 + ... + +[]{#config} + +#### Configuration + +The date format can be overridden using `dateformat.info`. + +Setting `journal.info` to \'yes\' will show a change log for the task, as seen +in the examples above. + +[]{#also} + +#### See Also + +Other ways of inspecting tasks include: + +- [`edit`{.sample}](#) command +- [`export`{.sample}](#) command +::: diff --git a/content/docs/commands/list.md b/content/docs/commands/list.md new file mode 100644 index 00000000..3b249ccc --- /dev/null +++ b/content/docs/commands/list.md @@ -0,0 +1,91 @@ +--- +title: "Taskwarrior - List Report" +--- + +### list + +The `list` report is a customizable report, which means that many aspects of the +report is configurable. You may override any of these aspects by modifyign the +Taskwarrior configuration. The definition of the `list` report can be shown +using the `show` command like this: + + $ task show report.list + + Config Variable Value + ----------------------- -------------------------------------------------------------- + report.list.columns id,start.age,entry.age,depends.indicator,priority,project, + tags,recur.indicator,scheduled.countdown,due,until.age, + description.count,urgency + report.list.description Most details of tasks + report.list.filter status:pending + report.list.labels ID,Active,Age,D,P,Project,Tags,R,Sch,Due,Until,Description,Urg + report.list.sort start-,due+,project+/,urgency- + +These are five settings that define the report. The description and labels are +straightforward text. + +[]{#columns} + +#### Columns + +The columns are the task metadata, with optional format specifiers. For example, +the `description.count` column means the description column, but not the +annotations; instead show a count of the annotations, if any. You can see the +supported columns and formats using the [`columns` +command](/docs/commands/columns.html). + +[]{#filter} + +#### Filter + +The filter is automatically applied when you run this report. In this case the +filter shows only pending tasks, using `status:pending`. This can cause some +confusion, because if you were to run this command: + + $ task status:completed list + +Then the filter `status:pending`, when combined with the command line filter +`status:completed` defines two non-intersecting sets and no result is shown. +This is because filter terms are assumed to be combined with `and` operators, +unless otherwise specified. Instead, to see completed tasks, you would need to +use a report that does not filter on status, and the `all` report does just +that, so you get the expected results by running: + + $ task status:completed all + +[]{#sort} + +#### Sort + +The sort setting is a list of columns, with an optional direction (ascending or +descending), and an optional break indicator. A sort column need not be one that +is included in the report. + +There are four sort keys, which are applied in order, so the report is sorted by +start date, then due date, then project, then urgency. From the example, one the +third sort key is: + + project+/ + +Breaking this down, it means the `project` attribute is sorted in ascendign +collating sequence (hence the `+`), and the solidus (`/`) indicates that this is +a break column, which means a blank line is inserted before every unique value. + +[]{#config} + +#### Configuration + +There is a configuration option, named `print.empty.columns`, which defaults to +`off`. This means that if a report has a column where no task shown has a value, +then do not display this empty column. This results in much narrower reports. + +The `list` report has thirteen columns, but due to this setting, it is rare to +see more than six or seven columns in the output. + +[]{#also} + +#### See Also + +- [Reports](/docs/report.html) +- [`columns`{.sample}](/docs/commands/columns.html) command +::: diff --git a/content/docs/commands/log.md b/content/docs/commands/log.md new file mode 100644 index 00000000..ba4c4e0c --- /dev/null +++ b/content/docs/commands/log.md @@ -0,0 +1,33 @@ +--- +title: "Taskwarrior - Log Command" +--- + +[]{#log} + +### log + +The `log` command is the ѕame as the [`add`](/docs/commands/add.html) command, +with one difference - the task is added in the completed state. Sometimes it is +necessary to record tasks that are already completed, if you are faithfully +tracking work. For example: + + $ task log Order the materials +home +construction + +This task is immediately recorded as completed, which means it will not be +displayed on any report that shows pending tasks. + + $ task log Order the materials start:2017-02-05 end:2017-02-06 + +This task is immediately recorded as completed with a beginning and an ending +date. + +[]{#also} + +#### See Also + +Other ways of creating tasks include: + +- [`add`{.sample}](/docs/commands/add.html) command +- `duplicate`{.sample} command +- `import`{.sample} command +::: diff --git a/content/docs/commands/missing.md b/content/docs/commands/missing.md new file mode 100644 index 00000000..88d61aa5 --- /dev/null +++ b/content/docs/commands/missing.md @@ -0,0 +1,14 @@ +--- +title: "Taskwarrior - Missing Documentation" +--- + +[]{#add} + +### Missing Documentation + +You found a broken link in the documentation. There are many of these because +the documentation is a work in progress, so you don\'t get a prize. + +Please bear with us as the pages are slowly being written, by unpaid volunteers, +in poor working conditions, against their better judgment, uphill, in the rain. +::: diff --git a/content/docs/commands/modify.md b/content/docs/commands/modify.md new file mode 100644 index 00000000..9a58e8c8 --- /dev/null +++ b/content/docs/commands/modify.md @@ -0,0 +1,105 @@ +--- +title: "Taskwarrior - Modify Command" +--- + +[]{#modify} + +### modify + +The `modify` command is the most direct way to change a task, for example, +replacing a description: + + $ task 1 modify This is the new description + +Here a tag is added, and another removed from a task: + + $ task 1 modify -home +garden + +The same change, but to several tasks: + + $ task 1 3 5-10 modify -home +garden + +The same change, but to a set of tasks matching the filter: + + $ task \( project:outdoors or /planting/ \) modify -home +garden + +Correcting a spelling error in a task description: + + $ task 1 modify /teh/the/ + +Changing just about everything about a task: + + $ task 1 modify +tag /from/to/ project:New priority:H depends:2 due:tomorrow recur:weekly New description + +[]{#config} + +#### Configuration + +Taskwarrior has a \'bulk\' threshold, which defaults to three tasks. If you +attempt to modify more than three tasks in one command, then additional +confirmation is needed: + + $ task 1-100 modify +later + - Tags will be set to 'later'. + Modify task 1 'Buy a new dog collar'? (yes/no/all/quit) + +The `rc.bulk` configuration setting can be modified to raise the threshold, with +a value of `0` meaning infinity. The bulk threshold is intended to protect +against commands that have an incorrect filter. + +[]{#recur} + +#### Recurrence + +If you modify a recurring task, you will be asked whether you want the changes +propagated to the other instances: + + $ task add pay the rent recur:monthly due:2015-01-01 + $ task list + + ID R Due Description + -- - ---------- ------------ + 2 R 2015-01-01 pay the rent + 3 R 2015-02-01 pay the rent + 4 R 2015-03-01 pay the rent + 5 R 2015-04-01 pay the rent + 6 R 2015-05-01 pay the rent + 7 R 2015-06-01 pay the rent + 8 R 2015-07-01 pay the rent + 9 R 2015-08-01 pay the rent + + $ task 2 modify /pay/Pay/ + Modifying task 2 'Pay the rent'. + This is a recurring task. Do you want to modify all pending recurrences of this same task? (yes/no) yes + Modifying recurring task 2 'Pay the rent'. + Modifying recurring task 3 'Pay the rent'. + Modifying recurring task 4 'Pay the rent'. + Modifying recurring task 5 'Pay the rent'. + Modifying recurring task 6 'Pay the rent'. + Modifying recurring task 7 'Pay the rent'. + Modifying recurring task 8 'Pay the rent'. + Modifying recurring task 9 'Pay the rent'. + Modified 9 tasks. + +Declining the modification will affect only the specified task. + +[]{#limitations} + +#### Limitations + +- When modifying tasks using a filter, it is easy to forget to limit the + changes to just the pending tasks, requiring `status:pending` to be added to + the filter. Otherwise it will change all completed and deleted tasks. +- With `rc.confirmation=off`, `rc.bulk=0`, `rc.recurrence.confirmation=off`, + and no filter, it is possible to cause great damage. + +[]{#also} + +#### See Also + +Other ways of modifying tasks include: + +- [`append`{.sample}](/docs/commands/append.html) command +- `edit`{.sample} command +- [`prepend`{.sample}](/docs/commands/prepend.html) command +::: diff --git a/content/docs/commands/prepend.md b/content/docs/commands/prepend.md new file mode 100644 index 00000000..6af9fac0 --- /dev/null +++ b/content/docs/commands/prepend.md @@ -0,0 +1,34 @@ +--- +title: "Taskwarrior - Prepend" +--- + +[]{#prepend} + +### prepend + +The `prepend` command is a way to add words to the beginning of a task +description, and it mirrors the [`append`{.sample}](/docs/commands/append.html) +command: + + $ task add sandwich + $ task 1 prepend make me a + +While adding words to the beginning of the description, the `prepend` command +can also update other attributes: + + $ task 1 prepend sudo project:Food + $ task 1 list + + ID Age Project Description Urg + -- ---- ------- ----------------------- ---- + 1 4min Food sudo make me a sandwich 1.8 + +[]{#also} + +#### See Also + +Other ways of modifying task descriptions include: + +- [`modify`{.sample}](/docs/commands/modify.html) command +- [`append`{.sample}](/docs/commands/append.html) command +::: diff --git a/content/docs/commands/synchronize.md b/content/docs/commands/synchronize.md new file mode 100644 index 00000000..d6d4f543 --- /dev/null +++ b/content/docs/commands/synchronize.md @@ -0,0 +1,75 @@ +--- +title: "Taskwarrior - Synchronize" +--- + +[]{#synchronize} + +### synchronize + +The `synchronize` command, which first appeared in version [2.3.0]{.label +.label-success}, connects your Taskwarrior client to a +[Taskserver](/docs/#taskd) instance, uploads local changes, downloads remote +changes, and merges the results. You can have several clients making local +changes all of which sync to a single server instance, and they will all be kept +up to date. + +The Taskserver is designed to handle multiple clients that may not have +synchronized recently, all with local changes, with only temporary network +connectivity, and still do the right thing. + +With a [correctly configured](/docs/taskserver/taskwarrior.html) client, adding +a task, or modifying an existing task, creates a local change that needs to be +synced. Taskwarrior will add a footnote to all output if a `synchronize` is +needed. + + $ task add Check the six hydrocoptic marzlevanes in the panametric fam + Created task 1. + + $ task list + + ID Age Description Urg + -- --- ----------------------------------------------------------- ---- + 1 4s Check the six hydrocoptic marzlevanes in the panametric fam 0 + + 1 task + There are local changes. Sync required. + +Note that this is only a local check - Taskwarrior knows about the local change, +but not any remote changes. + +There is no requirement that you immediately synchronize when you see this +message, and it causes no harm to ignore it, but you may choose to, in which +case you run the `synchronize` command, commonly abbreviated to `sync`: + + $ task sync + Syncing with foo.example.com:53589 + + Sync successful. 1 changes uploaded. + +This shows a successful sync, uploading our one change. If there were remote +changes to download, the message would include that. It is safe to sync as often +as you wish, although it does waste some bandwidth setting up a TLS connection +with the Taskserver. + + $ task sync + Syncing with foo.example.com:53589 + + Sync successful. No changes. + +[]{#limitations} + +#### Limitations + +- Network connectivity is required in order to sync. +- Taskwarrior must be [correctly + configured](/docs/taskserver/taskwarrior.html) to connect to a Taskserver. + +[]{#also} + +#### See Also + +Other ways of moving tasks around include: + +- [`export`{.sample}](/docs/commands/export.html) command +- `import`{.sample} command +::: diff --git a/content/docs/commands/template.md b/content/docs/commands/template.md new file mode 100644 index 00000000..7440ffb8 --- /dev/null +++ b/content/docs/commands/template.md @@ -0,0 +1,34 @@ +--- +title: "Taskwarrior - Template" +--- + +[]{#add} + +### add + +The `add` command is the primary means of creating tasks. The simplest task +requires only a description: + + $ task add Fix the leaky plumbing + +[]{#config} + +#### Configuration + +[]{#limitations} + +#### Limitations + +- +- + +[]{#also} + +#### See Also + +Related topics include: + +- [`log`{.sample}](/docs/commands/log.html) command +- [`duplicate`{.sample}](/docs/commands/duplicate.html) command +- [`import`{.sample}](/docs/commands/import.html) command +::: diff --git a/content/docs/configuration.md b/content/docs/configuration.md new file mode 100644 index 00000000..1e3d508e --- /dev/null +++ b/content/docs/configuration.md @@ -0,0 +1,108 @@ +--- +title: "Taskwarrior - Configuration" +--- + +[]{#config} + +### Configuration + +Taskwarrior stores all configuration information in a file in your home +directory, named `.taskrc`. The default `.taskrc` file contains a minimal set of +entries, with only one required setting, which is: + + data.location=~/.task + +This is the only setting you need because Taskwarrior has senѕible defaults for +all the settings. This file is really just a list of settings for which you wish +to override those defaults. + +[]{#config_cmd} + +#### Config Command + +The `config` command can be used to modify your `.taskrc` file. In this example +we enable regular expression support in filters, by doing this: + + $ task config regex on + Are you sure you want to change the value of 'regex' from 'off' to 'on'? (yes/no) yes + Config file ~/.taskrc modified. + +You can use \'on\', or \'1\', \'yes\' or \'true\', all of which are synonyms +which will enable the feature. You are asked to confirm the change, which is +controlled by the `confirmation` setting which of course you can disable with: + + $ task config confirmation off + +The general form of the command can be either of these: + + task config name value + task config name '' + task config name + +These three example show, respectively, setting `name` to `value`, setting +`name` to an empty value, and deleting the setting. Note that only deleting the +setting removes the override and therefore restores the default. + +[]{#show_cmd} + +#### Show Command + +The `show` command displays all the current configuration settings, which is a +list of all the settings and default values, with your local settings overriding +those, and furthermore with any command line overrides. The show command will +also filter the settings by a keyword you specify, so to look at the `minimal` +report definition, you can run this: + + $ task show report.minimal + + Config Variable Value + -------------------------- ---------------------------------------- + report.minimal.columns id,project,tags.count,description.count + report.minimal.description Pending tasks by project and description + report.minimal.filter ( status:pending or status:waiting ) + report.minimal.labels ID,Project,Tags,Description + report.minimal.sort project+,description+,entry+ + +The `show` command will highlight values that differ from the defaults, and will +also tell you if there are settings which are not recognized. This might +indicate ѕpelling mistakes or obsolete settings. + +[]{#include} + +#### Includes + +The `.taskrc` file supports inclusion, which is used for example, for theme +files. + + include ~/themes/solarized-dark-256.theme + +The file included is expected to contain Taskwarrior configuration settings, or +nested includes. + +[]{#override} + +#### Command Line Override + +The `config` command makes permanent changes to your `.taskrc` files, but you +can temporarily override these settings for a single command, using this +technique: + + $ task rc.regex=on /[Tt]otal/ list + +One possible use of this feature is to override the `data.location` setting to +use an alternate task list: + + $ task rc.data.location=/alternate/path/.task ... + +[]{#env} + +#### Environment Variables + +There are two environment variables that can be used to specify an alternate +configuration file, and an alternate data location. + + TASKRC=~/.taskrc TASKDATA=~/.task task list + +This example uses environment variables to specify both the configuration file +and the data directory. +::: diff --git a/content/docs/context.md b/content/docs/context.md new file mode 100644 index 00000000..b4620cb0 --- /dev/null +++ b/content/docs/context.md @@ -0,0 +1,133 @@ +--- +title: "Taskwarrior - Context" +--- + +[]{#context} + +### Context + +A context is associated with a location. An example of this might be that you +perform tasks in three locations: + +- At the office +- At home +- Study + +The tasks that pertain to your time in the office are meaningless if you are at +home, and vice versa. This is just an example, and your contexts will likely be +very different. + +If Taskwarrior allowed you to specify which context is currently active, then +the tasks listed could be filtered accordingly. You would then be working within +a context. A context is therefore a named filter, and the current context is a +form of default filter. + +[]{#define} + +#### Defining a Context + +In order to work within a context, you first need to define that context. +Because a context is essentially a task filter, defining a context is really +defining a named filter. In this example, we define our contexts from the list +above using the new `context define` command: + + $ task context define work +work or +freelance + $ task context define study +school or +homework or +lab + $ task context define home -work -freelance -school -homework -lab + +The context definition may contain any form of algebraic expression just like a +filter. In the example, the contexts are based entirely on tags. Notice that +`home` is defined as neither `work` nor `study`. This means that every task is +accounted for, although this is not necessary. + +It is an error to try to define a context with the names `define`, `list`, +`show`, `none`, or `delete`. + +[]{#set} + +#### Setting the Context + +To set or switch the current context, simply: + + $ task context home + $ task list + ... + +If you try to use an undefined context, Taskwarrior will report an error. + +Now with the context set to `home`, all the tasks listed will pertain to the +`home` context, as defined. There will be a footnote after every report that +reminds you of the current context. + +[]{#show} + +#### Showing the Context + +Although the current context is included in a footnote after every report, this +can be disabled with the verbosity controls. To show the current context: + + $ task context show + home + +This can also be obtained using `_get`: + + $ task _get rc.context + home + +[]{#list} + +#### Listing All Contexts + +You can list all the contexts using the new `context list` command: + + $ task context list + Context Filter + ------- ---------------------------------- + home -work -freelance -school -homework + study +school or +homework + work +work or +freelance + +[]{#clear} + +#### Clearing the Context + +To clear the current context: + + $ task context none + +The context `none` has special meaning. All subsequent commands will not have +any implicit context filters applied. + +[]{#delete} + +#### Deleting a Context + +To delete one of the contexts: + + $ task context delete study + +Now you can no longer set the context to `study`. If the current context was +already `study` when you deleted it, the context is cleared. + +[]{#impact} + +#### Impact on Commands + +All reports that accept filters will use the context if one is defined and set. + +[]{#related} + +#### Related Support + +The `tasksh` program will show the current context in its prompt. + +[]{#implementation} + +#### Implementation Details + +Context will be stored in `rc.context` and defined contexts will be stored as +`rc.context.` in the `.taskrc` file. + +When a context filter is used, it will be implicitly surrounded by parentheses, +so that it may contain arbitrary logic. +::: diff --git a/content/docs/contribute.md b/content/docs/contribute.md new file mode 100644 index 00000000..eb017e39 --- /dev/null +++ b/content/docs/contribute.md @@ -0,0 +1,52 @@ +--- +title: "Taskwarrior - Contribute?" +--- + +[]{#want} + +### Want to Contribute? + +Help is needed in all areas of Taskwarrior development - design, coding, +testing, support and marketing. Applicants must be friendly. Perhaps you are +looking to help, but don\'t know where to start. You can of course [email +us](mailto:taskwarrior-dev@googlegroups.com) but take a look at this list. +Perhaps you have skills we are looking for, here are ways you may be able to +help: + +- Use Taskwarrior, become familiar with it, and make suggestions. We get great + feedback from both new users and veteran users. New users have a fresh + approach that we can no longer achieve, while veteran users develop clever + and crafty ways to use the product. +- Report bugs and odd behavior when you see it. We don\'t necessarily know + it\'s broken, unless you tell us. +- Suggest enhancements. We get lots of these, and it\'s great. Some really + good ideas have been suggested and implemented. Sure, some are out of scope, + or plain crazy, but the stream of suggestions is fascinating to think about. +- Participate in the [bug + tracking](https://github.com/GothenburgBitFactory/taskwarrior/issues) + database, to help others and maybe learn something yourself. +- Help [triage](/docs/triage.html) the issues list. +- Join the IRC channel \#taskwarrior on freenode.net and help answer some + questions. +- Join either the + [developer-mailinglist](https://groups.google.com/forum/#!forum/taskwarrior-dev) + or + [user-mailinglist](https://groups.google.com/forum/#!forum/taskwarrior-user) + (or both) and participate. +- Proofread the documentation and man pages. +- Improve the documentation. +- Improve the man pages. +- Help improve the tutorials. Make your own tutorial. +- Confirm a bug. Nothing gets fixed without confirmation. +- Refine a bug. Provide relevant details, elaborate on the behavior. +- Fix a bug. Send a patch. You\'ll need C++ skills for this. +- Write a unit test. Improve an existing unit test. +- Spread the word. Help others become more effective at managing tasks. Share + your methodology, to inspire others. +- Encouragement. Tell us what works for you, and what doesn\'t. It\'s all + good. +- Donate! Help offset costs. + +Please remember that we need contributions from all skillsets, however small. +Every contribution helps. +::: diff --git a/content/docs/dates.md b/content/docs/dates.md new file mode 100644 index 00000000..c48bd91a --- /dev/null +++ b/content/docs/dates.md @@ -0,0 +1,482 @@ +--- +title: "Taskwarrior - Date & Time" +--- + +### Date & Time + +Taskwarrior supports date and time values. Date fields are used to track task +creation, due date, scheduled date, end date and so on, as well as providing a +date type for use with [UDA](/docs/udas.html) fields. + +Whichever format is used to accept and display date and time, Taskwarrior +resolves it to a UTC epoch value, accurate to one second. This is called Unix +Time, POSIX time, or Epoch time. + +But you have full control over the format entered and the format displayed, and +this document is a demonstration of this. + +[]{#due} + +#### Due Date Example + +Let us begin with an example of specifying a due date when the task is created: + + $ task add Pay the rent due:2015-01-31 + +Or adding a due date to an existing task: + + $ task add Pay the rent + $ task 1 modify due:2015-01-31 + +Finally removing a due date from a task: + + $ task 1 modify due: + +This examples uses the default `rc.dateformat`, which is `Y-M-D`, to read the +date from the command line. + +[]{#dateformat} + +#### rc.dateformat + +The `rc.dateformat` setting allows you to specify other formats for date input. +An example is the default, `Y-M-D`, which means a date is: + +- a 4-digit year (\'Y\') +- followed by a hyphen (\'-\') +- followed by a 2-digit month (\'M\') +- followed by a hyphen (\'-\') +- followed by a 2-digit day (\'D\') + +Here are the possible elements of `rc.dateformat`: + + ------------------- ---------------------------------------------------------------------------------------- + `m` 1 or 2 digit month number, eg \'1\', \'12\' + `M` 2 digit month number, eg \'01\', \'12\' + `d` 1 or 2 digit day of month number¸ eg \'1\', \'12\' + `D` 2 digit day of month number, eg \'01\', \'30\' + `y` 2 digit year, eg \'12\', where the century is assumed to be \'20\', therefore \'2012\' + `Y` 4 digit year, eg \'2015\' + `h` 1 or 2 digit hours, eg \'1\', \'23\' + `H` 2 digit hours, eg \'01\', \'23\' + `n` 1 or 2 digit minutes, eg \'1\', \'59\' + `N` 2 digit minutes, eg \'01\', \'59\' + `s` 1 or 2 digit seconds, eg \'1\', \'59\' + `S` 2 digit seconds, eg \'01\', \'59\' + `v` 1 or 2 digit week number, eg \'1\', \'52\' + `V` 2 digit week number, eg \'01\', \'52\' + `a` 3-character English day name abbreviation, eg \'mon\', \'tue\' + `A` Complete English day name, eg \'monday\', \'tuesday\' + `b` 3-character English month name abbreviation, eg \'jan\', \'feb\' + `B` Complete English month name, eg \'january\', \'february\' + `Everything else` All other format characters are taken as literals + ------------------- ---------------------------------------------------------------------------------------- + +[]{#time} + +#### Including Time + +Using `rc.dateformat` you can specify a date with or without elements that +include time. If your dateformat omits any time elements, then you just specify +the date, and the time defaults to `00:00:00`. + +An example shows this using a temporary override: + + $ task add Pay the rent due:2015-01-01 + $ task 1 + + Name Value + ------------- ------------------------------------------ + ID 1 + Description Pay the rent + Status Pending + Entered 2015-01-02 16:57:44 (8 seconds) + Due 2015-01-01 00:00:00 + Last modified 2015-01-02 16:57:44 (8 seconds) + UUID 6eb7c4d7-6323-4ee3-bf13-63c580de3712 + Urgency 9.58 + + $ task add Open the store due:2015-01-01T08:30:00 rc.dateformat:Y-M-DTH:N:S + $ task 2 + + Name Value + ------------- ------------------------------------------ + ID 2 + Description Open the store + Status Pending + Entered 2015-01-02 16:58:15 (6 seconds) + Due 2015-01-01 08:30:00 + Last modified 2015-01-02 16:58:15 (6 seconds) + UUID bc8f9b89-8dea-4dae-87e5-b320b651c25c + Urgency 9.419 + +The first task added used the default `rc.dateformat` value of `Y-M-D`. You can +see that the `due` date was recorded with time `00:00:00`. + +The second task added specified an `rc.dateformat` override value of +`Y-M-DTH:N:S`. You can see that the `due` date was recorded with time +`08:30:00`, as specified. + +You can specify date, or date + time, but whatever you specify must match your +`rc.dateformat` setting. + +[]{#reports} + +#### Reports + +The `rc.dateformat` setting is used for both specifying dates on the command +line, and displaying them in reports. Most reports allow a further override, for +report-specific display formats, such as `rc.report.REPORT.dateformat`, but +there are others. See `man taskrc` for a complete list. + +For display purposes, there are two additional elements: + + ----- ---------------------------------------------------------------------------------------------------------- + `j` 1, 2 or 3 digit day-of-year number, sometimes referred to as a Julian date, eg \'1\', \'11\', or \'365\' + `J` 3 digit day of year number, sometimes referred to as a Julian date, eg \'001\', \'011\', or \'365\' + ----- ---------------------------------------------------------------------------------------------------------- + +[]{#names} + +#### Synonyms [2.4.0]{.label .label-success} + +In addition to formatted dates, you can use a date synonym instead: + + $ task add Pay the rent due:eom + +Here the synonym `eom` means \'end of the month\'. Synonyms are a useful +shortcut to entering lengthy dates. Here is the full set: + + ---------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + `now` Current local date and time. + `today` Current local date, with time 00:00:00. + `sod` Local date of the start of the next day, with time 00:00:00. Same as `tomorrow`. + `eod` Current local date, with time 23:59:59. + `yesterday` Local date for yesterday, with time 00:00:00. + `tomorrow` Local date for tomorrow, with time 00:00:00. Same as `sod`. + `monday`, `tuesday` \... Local date for the specified day, after today, with time 00:00:00. Can be shortened, e.g. `mon`, `tue` [2.6.0]{.label .label-success} Can be capitalized, e.g. `Monday`, `Tue` + `january`, `february` \... Local date for the specified month, 1st day, with time 00:00:00. Can be shortened, e.g. `jan`, `feb`. [2.6.0]{.label .label-success} Can be capitalized, e.g. `January`, `Feb`. + `later`, `someday` Local 2038-01-18, with time 00:00:00. A date far away, with semantically meaningful to GTD users. + `soy` Local date for the next year, January 1st, with time 00:00:00. + `eoy` Local date for this year, December 31st, with time 00:00:00. + `soq` Local date for the start of the next quarter (January, April, July, October), 1st, with time 00:00:00. + `eoq` Local date for the end of the current quarter (March, June, September, December), last day of the month, with time 23:59:59. + `som` Local date for the 1st day of the next month, with time 00:00:00. + `socm` Local date for the 1st day of the current month, with time 00:00:00. + `eom`, `eocm` Local date for the last day of the current month, with time 23:59:59. + `sow` Local date for the next Sunday, with time 00:00:00. + `socw` Local date for the last Sunday, with time 00:00:00. + `eow`, `eocw` Local date for the end of the week, Saturday night, with time 00:00:00. + `soww` Local date for the start of the work week, next Monday, with time 00:00:00. + `eoww` Local date for the end of the work week, Friday night, with time 23:59:59. + `1st`, `2nd`, \... Local date for the next Nth day, with time 00:00:00. + `goodfriday` Local date for the next Good Friday, with time 00:00:00. + `easter` Local date for the next Easter Sunday, with time 00:00:00. + `eastermonday` Local date for the next Easter Monday, with time 00:00:00. + `ascension` Local date for the next Ascension (39 days after Easter Sunday), with time 00:00:00. + `pentecost` Local date for the next Pentecost (40 days after Easter Sunday), with time 00:00:00. + `midsommar` Local date for the Saturday after June 20th, with time 00:00:00. Swedish. + `midsommarafton` Local date for the Friday after June 19th, with time 00:00:00. Swedish. + ---------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +The synonyms are supported in addition to `rc.dateformat` + +[]{#iso} + +#### ISO-8601 Format [2.4.0]{.label .label-success} + +The ISO-8601 standard defines an unambiguous format for specifying date and time +around the world. Taskwarrior supports the following formats defined by +ISO-8601: + +`YYYY-MM-DDThh:mm:ssZ` +::: +::: +::: +::: + +`2015-06-15T12:34:56Z` + +Year, month, day, hours, minutes, seconds in UTC. + +`YYYY-MM-DDThh:mmZ` + +`2015-06-15T12:34Z` + +Year, month, day, hours, minutes, 00 seconds in UTC. + +`YYYY-DDDThh:mm:ssZ` + +`2015-166T12:34:56Z` + +Year, day ordinal, hours, minutes, seconds in UTC. + +`YYYY-DDDThh:mmZ` + +`2015-166T12:34Z` + +Year, day ordinal, hours, minutes, 00 seconds in UTC. + +`YYYY-Www-DThh:mm:ssZ` + +`2015-W24-1T12:34:56Z` + +Year, week number, day of week, hours, minutes, seconds, UTC. + +`YYYY-Www-DThh:mmZ` + +`2015-W24-1T12:34Z` + +Year, week number, day of week, hours, minutes, 00 seconds, UTC. + +`YYYY-WwwThh:mm:ssZ` + +`2015-W24T12:34:56Z` + +Year, week number, first day of week, hours, minutes, seconds, UTC. + +`YYYY-WwwThh:mmZ` + +`2015-W24T12:34Z` + +Year, week number, first day of week, hours, minutes, 00 seconds, UTC. + +`YYYY-MM-DDThh:mm:ss+hh:mm`\ +`YYYY-MM-DDThh:mm:ss-hh:mm` + +`2015-06-15T12:34:56+05:00`\ +`2015-06-15T12:34:56-05:00` + +Year, month, day, hours, minutes, seconds, positive or negative offset from UTC +of hours, minutes. + +`YYYY-MM-DDThh:mm+hh:mm`\ +`YYYY-MM-DDThh:mm-hh:mm` + +`2015-06-15T12:34+05:00`\ +`2015-06-15T12:34-05:00` + +Year, month, day, hours, minutes, 00 seconds, positive or negative offset from +UTC of hours, minutes. + +`YYYY-DDDThh:mm:ss+hh:mm`\ +`YYYY-DDDThh:mm:ss-hh:mm` + +`2015-166T12:34:56+05:00`\ +`2015-166T12:34:56-05:00` + +Year, day ordinal, hours, minutes, seconds, positive or negative offset from UTC +of hours, minutes. + +`YYYY-DDDThh:mm+hh:mm`\ +`YYYY-DDDThh:mm-hh:mm` + +`2015-166T12:34+05:00`\ +`2015-166T12:34-05:00` + +Year, day ordinal, hours, minutes, 00 seconds, positive or negative offset from +UTC of hours, minutes. + +`YYYY-Www-DThh:mm:ss+hh:mm`\ +`YYYY-Www-DThh:mm:ss-hh:mm` + +`2015-W24-1T12:34:56+05:00`\ +`2015-W24-1T12:34:56-05:00` + +Year, week number, day number, hours, minutes, seconds, positive or negative +offset from UTC of hours, minutes. + +`YYYY-Www-DThh:mm+hh:mm`\ +`YYYY-Www-DThh:mm-hh:mm` + +`2015-W24-1T12:34+05:00`\ +`2015-W24-1T12:34-05:00` + +Year, week number, day number, hours, minutes, 00 seconds, positive or negative +offset from UTC of hours, minutes. + +`YYYY-WwwThh:mm:ss+hh:mm`\ +`YYYY-WwwThh:mm:ss-hh:mm` + +`2015-W24T12:34:56+05:00`\ +`2015-W24T12:34:56-05:00` + +Year, week number, first day of week, hours, minutes, seconds, positive or +negative offset from UTC of hours, minutes. + +`YYYY-WwwThh:mm+hh:mm`\ +`YYYY-WwwThh:mm-hh:mm` + +`2015-W24T12:34+05:00`\ +`2015-W24T12:34-05:00` + +Year, week number, first day of week, hours, minutes, 00 seconds, positive or +negative offset from UTC of hours, minutes. + +`YYYY-MM-DDThh:mm:ss` + +`2015-06-15T12:34:56` + +Year, month, day, hours, minutes, seconds, local time. + +`YYYY-MM-DDThh:mm` + +`2015-06-15T12:34` + +Year, month, day, hours, minutes, 00 seconds, local time. + +`YYYY-DDDThh:mm:ss` + +`2015-166T12:34:56` + +Year, day ordinal, hours, minutes, seconds, local time. + +`YYYY-DDDThh:mm` + +`2015-166T12:34` + +Year, day ordinal, hours, minutes, 00 seconds, local time. + +`YYYY-Www-DThh:mm:ss` + +`2015-W24-1T12:34:56` + +Year, week number, day number, hours, minutes, seconds, local time. + +`YYYY-Www-DThh:mm` + +`2015-W24-1T12:34` + +Year, week number, day number, hours, minutes, 00 seconds, local time. + +`YYYY-WwwThh:mm:ss` + +`2015-W24T12:34:56` + +Year, week number, first day of week, hours, minutes, seconds, local time. + +`YYYY-WwwThh:mm` + +`2015-W24T12:34` + +Year, week number, first day of week, hours, minutes, 00 seconds, local time. + +`YYYY-MM-DD` + +`2015-06-15` + +Year, month, day, 00:00:00 local time. Note that this format is the same as the +`rc.dateformat` default. + +`YYYY-DDD` + +`2015-166` + +Year, day ordinal, 00 hours, 00:00:00 local time. + +`YYYY-Www-D` + +`2015-W24-1` + +Year, week number, day number, 00:00:00 local time. + +`YYYY-Www` + +`2015-W24` + +Year, week number, first day of week, 00:00:00 local time. + +`YYYYWwwD` + +`2015W241` + +Year, week number, day number, 00:00:00 local time. + +`YYYYWww` + +`2015W24` + +Year, week number, first day of week, 00:00:00 local time. + +`YYYY-MM` + +`2015-06` + +Year, month, first day of month, 00:00:00 local time. + +`hh:mm:ssZ` + +`12:34:56Z` + +Today, hours, minutes, seconds in UTC. + +`hh:mmZ` + +`12:34Z` + +Today, hours, minutes, 00 seconds in UTC. + +`hh:mm:ss+hh:mm`\ +`hh:mm:ss-hh:mm` + +`12:34:56+05:00`\ +`12:34:56-05:00` + +Today, hours, minutes, seconds, positive or negative offset from UTC. + +`hh:mm+hh:mm`\ +`hh:mm-hh:mm` + +`12:34+05:00`\ +`12:34-05:00` + +Today, hours, minutes, 00 seconds, positive or negative offset from UTC. + +`hh:mm:ss` + +`12:34:56` + +Today, hours, minutes, seconds, local time. + +`hh:mm` + +`12:34` + +Today, hours, minutes, 00 seconds, local time. + +ISO dates are comprised of standard elements: + + -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + `YYYY` Only four-digit years are supported by ISO-8601, no abbreviations. + `MM` Two-digit, zero-padded month numbers range from `01` to `12`. + `DD` Two-digit, zero-padded day numbers range from `01` to `31`, depending on month and year. + `Www` Week number `W01` is defined as the first week of the year with a Thursday in it. `W01` sometimes starts at the end of December of the previous year. Some years range from `W01` up to `W53` + `D` Day of week is 1-7, Monday-Sunday. + `DDD` Day ordinal is 001 for January 1st, 365 for December 31st, or 366 in a leap year. + `T` A separator between date elements and time elements. + `Z` Indicates UTC time, the \'Z\' means \'Zulu\', a military format. + `+/-` Positive offset is *East* of UTC. Negative offset is *West* of UTC. + `hh` Two-digit, zero-padded hours, between `00` and `23`. + `mm` Two-digit, zero-padded minutes, between `00` and `59`. + `ss` Two-digit, zero-padded seconds, between `00` and `59`. + -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +You can use any of the ISO formats, independent from your `rc.dateformat` +setting. Future releases of taskwarrior will not need `rc.dateformat` for +date/time input. + +[]{#warning} + +#### Warning + +It is possible to set a `dateformat` that conflicts with a built-in format, or +with other parsed lex types from the command line. Date formats are high on the +lexer precedence list, and therefore able to eclipse other types. + +As an example a `dateformat` of `m-d` means that this command: + + $ task 1-5 list + +is interpreted as this meaningless filter that always succeeds: + + $ task 2016-01-05 list diff --git a/content/docs/deprecated.md b/content/docs/deprecated.md new file mode 100644 index 00000000..2793375b --- /dev/null +++ b/content/docs/deprecated.md @@ -0,0 +1,135 @@ +--- +title: "Taskwarrior - Deprecated Features" +--- + +### Deprecated Features + +Taskwarrior, Taskserver, Tasksh and Timewarrior have many features. With each +release new features are added, and sometimes features are removed. A feature +may be removed if it has been superseded by something better, is no longer +relevant, or is very troublesome. + +With the Taskwarrior command line syntax becoming more formal and regular with +every release, there will be a corresponding set of changes that remove +ambiguous command line syntax, and add consistent syntax. + +Before a feature is removed, it is deprecated, where possible. This means that +it will appear on this list, in one release, and be removed in an unspecified +later release. Deprecation acts as an early warning for disappearing +functionality, giving users time to adapt or complain. + +When a feature is removed, any related configuration settings are also removed. +You can see if your `.taskrc` contains any obsolete settings by using the `show` +command: + + $ task show + ... + +The `show` command highlights various problems. + +### Taskwarrior + +[]{#sync} + +#### Push/Pull/Merge [deprecated since 2.3.0]{.label .label-info} [removed in 2.4.0]{.label .label-danger} + +Starting with Taskwarrior 2.3.0, the `push`, `pull` and `merge` commands are +deprecated, and gone from 2.4.0. The `sync` command in 2.3.0 replaces this +functionality. + +[]{#shadow} + +#### Shadow Files [deprecated since 2.4.0]{.label .label-info} [removed in 2.4.0]{.label .label-danger} + +Starting in 2.4.0, shadow files are replaced by an equivalent hook mechanism. + +[]{#attmods} + +#### Attribute Modifiers [deprecated since 2.4.0]{.label .label-info} + +Attribute modifiers such as `project.startswith:Ab` are all deprecated starting +with version 2.4.0. In the example above, the replacement is an algebraic +expression, `project ~ ^ab`, which uses the `~` regex match operator, and `^Ab` +which is a regular expression. + +[]{#search} + +#### Bare Word Search Terms [deprecated since 2.4.0]{.label .label-info} + +Simple words being interpreted as search terms is deprecated in 2.4.0 and will +be removed in a future release. The preferred syntax is `task /pattern/ ...`. + +[]{#limit} + +#### The \'limit\' Pseudo Attribute [deprecated since 2.4.0]{.label .label-info} + +The `limit:20` pseudo attribute looks like a task attribute, but is just +syntactic sugar. It is deprecated and will be replaced by `rc.limit` in a future +release. + +[]{#inherit} + +#### The \'urgency.inherit.coefficient\' Setting [deprecated since 2.4.5]{.label .label-info} + +Urgency inheritance changes with 2.4.5, and this settings will no longer be +used. + +[]{#iso} + +#### ISO Date and Time non-extended formats. [deprecated since 2.4.5]{.label .label-info} + +The non-extended formats are just strings of numbers without separators. Here is +an extended date `2015-06-25` and here is the unextended date `20150625`, which +looks like a number or even an abbreviated UUID. Here is an extended time +`12:34:56`, and an unextended time `123456`, with the same issue. The +non-extended forms will be removed. + +[]{#unique} + +#### Helper commands for unique lists [deprecated since 2.4.5]{.label .label-info} + +The `_ids`, `_projects`, `_tags`, and `_uuids` helper commands are deprecated in +favor of the new `_unique` command. + +[]{#duetoday} + +#### Virtual tag `DUETODAY` [deprecated since 2.6.0]{.label .label-info} + +The `DUETODAY` virtual tag is a synonym for the more consistently named `TODAY` +virtual tag. + +[]{#boolean} + +#### Use of Boolean configuration values other than `0` or `1` [deprecated since 2.6.0]{.label .label-info} + +Deprecated use of alternate Boolean configuration settings. Use values \"0\" for +off, and \"1\" for on. Avoid used of \"on\", \"off\", \"true\", \"t\", +\"false\", \"f\", \"yes\", \"y\", \"no\", \"n\". + +[]{#dom} + +#### DOM references: context.\* [deprecated since 2.6.0]{.label .label-info} + +The dom references `context.program`, `context.args`, `context.width`, and +`context.height` are replaced by `tw.program`, `tw.args`, `tw.width`, and +`tw.height`. + +### Tasksh + +None yet. + +### Taskserver + +[]{#deny} + +#### Client Allow/Deny List [removed in 1.1.0]{.label .label-danger} + +Taskserver initially supported the `client.allow` and `client.deny` settings +which filtered connections. The intention was to be able to decline misbehaving +clients. This has proved to be a configuration problem for some, and the +mechanism is easily spoofed, so it will be removed. + +### Timewarrior + +None yet. +::: diff --git a/content/docs/design/cli.md b/content/docs/design/cli.md new file mode 100644 index 00000000..09ead42a --- /dev/null +++ b/content/docs/design/cli.md @@ -0,0 +1,168 @@ +--- +title: "Taskwarrior - Command Line Interface" +--- + +#### Work in Progress + +This design document is a work in progress, and subject to change. Once +finalized, the feature will be scheduled for an upcoming release. +::: + +[]{#cli} + +### CLI Syntax Update + +The Taskwarrior command line syntax is being updated to allow more consistent +and predictable results, while making room for new features. + +Adding support for arbitrary expressions on the command line has become +complicated because of the relaxed syntax of Taskwarrior. While the relaxed +syntax allows for a very expressive command line, it also creates ambiguity for +the parser, which needs to be reduced. + +With some limited and careful changes it will be possible to have a clear and +unambiguous command line syntax, which means a predictable and deterministic +experience. + +It should be stated that for straightforward and even current usage patterns, +the command line will likely not change for you. Another goal is to not require +changes to 3rd-party software, where possible. Only the more advanced and as-yet +unintroduced features will require a more strict syntax. This is why now is an +ideal time to tighten the requirements. + +[]{#types} + +#### Argument Types + +The argument types supported remain the same, adding some new constructs. + + --------------------------------------- --------------------------------------- + Config file override `rc:` + + Configuration override `rc::` Literal value\ + `rc:=` Literal value\ + `rc::=` Calculated value + + Tag `+`\ + `-`\ + `'+tag one'` Multi-word tag + + Attribute modifier `rc:.:`\ + Modifier is one of:\ + `before`\ + `after`\ + `under`\ + `over`\ + `above`\ + `below`\ + `none`\ + `any`\ + `is`\ + `isnt`\ + `equals`\ + `not`\ + `contains`\ + `has`\ + `hasnt`\ + `left`\ + `right`\ + `startswith`\ + `endswith`\ + `word`\ + `noword` + + Search pattern `//` + + Substitution `///`\ + `///g` + + Command `add`\ + `done`\ + `delete`\ + `list`\ + etc. + + Separator `--` + + ID Ranges `[-<id>][,[-<id>]...]` + + UUID `` + + Everything Else ``\ + `' ...'` + --------------------------------------- --------------------------------------- + +[]{#rules} + +#### New Command Line Rules + +Certain command line constructs will no longer be supported, and this is imposed +by the new rules: + +1. Each command line argument may contain only one instance of one argument + type, unless that type is ``. + + task add project:Home +tag Repair the thing # Good + task add project:Home +tag 'Repair the thing' # Good + task add 'project:Home +tag Repair the thing' # Bad + + Putting two arguments into one quoted arg makes that arg a ``. + +2. If an argument type contains spaces, it must either be quoted or escaped. + + task add project:'Home & Garden' ... # Good + task add 'project:Home & Garden' ... # Good + task add project:Home\ \&\ Garden ... # Good + task add project:Home' & 'Garden ... # Good + task add project:Home \& Garden ... # Bad + + The parser will not combine multiple arguments, for example: + + task '/one two/' list # Good + task /one two/ list # Bad + task /'one two'/ list # Bad, unless ' is part of the pattern + +3. By default, *no* calculations are made, unless the `:=` eval operator is + used, and if so, the whole argument may need to be quoted or escaped to + satisfy Rule 1. + + task add project:3.project+x # Literal + task add project:=3.project+x # DOM reference + concatenation + +4. Bare word search terms are no longer supported. Use the pattern type + argument instead. + + task /foo/ list # Good + task foo list # Bad + +5. Expressions must be a series of arguments, not a quoted string. + + task urgency \< 5.0 list # Good + task 'urgency < 5.0 list' # Bad + +[]{#other} + +#### Other Changes + +Aside from the command line parser, there are other changes needed: + +- Many online documents will need to be modified. + +- Filters will be automatically parenthesized, so that every command line will + now looke like: + + task [overrides] [(cli-filter)] [(context-filter)] [(report-filter)] command [modifications] + +- There will be more errors when the command line is not understood. + +- Ambiguous ISO date formats are dropped. + + YYYYMMDD # Bad + YYYY-MM-DD # Good + + hhmmss # Bad + hh:mm:ss # Good + +- The tutorial videos will be even more out of date, and will be replaced by a + large number of smaller demo \'movies\'. +::: diff --git a/content/docs/design/client.md b/content/docs/design/client.md new file mode 100644 index 00000000..eb83a63c --- /dev/null +++ b/content/docs/design/client.md @@ -0,0 +1,473 @@ +--- +title: "Taskwarrior - Creating a Taskserver Client" +--- + +[]{#client} + +### Creating a Taskserver Client + +A Taskserver client is a todo-list manager. It may be as simple as a program +that captures a single task, as complex as Taskwarrior, or anything in between. +It can be a mobile client, a web application, or any other type of program. + +This document describes how such a client would interact with the server. + +A client to the Taskserver is a program that manages a task list, and wishes to +exchange data with the server so that the task list may be shared. + +In order to do this, a client must store tasks locally, upload local changes, +download remote changes, and apply remote changes to the local tasks. + +The client must consider that there may be no network connectivity, or no desire +by the user to synchronize. + +The client will need proper credentials to talk to the server. + +[]{#req} + +#### Requirements + +In this document, we adopt the convention discussed in Section 1.3.2 of +[RFC1122](https://tools.ietf.org/html/rfc1122#page-16) of using the capitalized +words MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, and OPTIONAL to define the +significance of each particular requirement specified in this document. + +In brief: \"MUST\" (or \"REQUIRED\") means that the item is an absolute +requirement of the specification; \"SHOULD\" (or \"RECOMMENDED\") means there +may exist valid reasons for ignoring this item, but the full implications should +be understood before doing so; and \"MAY\" (or \"OPTIONAL\") means that this +item is optional, and may be omitted without careful consideration. + +[]{#account} + +#### Taskserver Account + +A Taskserver account must be created. This process creates a storage area, and +generates the necessary credentials. + +[]{#credentials} + +#### Credentials + +A Taskserver client needs the following credentials in order to communicate with +a server: + +- Server address and port +- Organization name +- User name +- Password +- Certificate +- Key + +The server address and port are the network location of the server. An example +of this value is: + + foo.example.com:53589 + +In addition to a DNS name, this can be an IPv4 or IPv6 address. + +The organization name is an arbitrary grouping, and is typically \'PUBLIC\', +reflecting the individual nature of server accounts. Future capabilities will +provide functionality that support groups of users, called an organization. + +The user name is the full name. This will be the name used to identify other +users in an organization, in a future release. Example \'John Doe\'. + +The password is a text string generated by the server at account creation time. +It should be considered a secret. + +The certificate is an X.509 PEM file generated by the server at account creation +time. This is used for authentication. It should be considered a secret. + +The key is an X.509 PEM file generated by the server at account creation time. +This is used for encryption. It should be considered a secret. + +These credentials need to be stored on the client, and used during the sync +operation. + +[]{#client_desc} + +#### Description of a Taskserver Client + +This section describes how a client might behave in order to facilitate +integration with the Taskserver. + +[]{#encryption} + +#### Encryption + +The Taskserver only communicates using encryption. Therefore all user data is +encrypted while in transit. The Taskserver currently uses +[GnuTLS](https://gnutls.org) to support this encryption, and therefore supports +the following protocols: + +- SSL 3.0 +- TLS 1.0 +- TLS 1.1 +- TLS 1.2 + +The client may use any library that supports the above. + +[]{#config} + +#### Configuration + +The client needs to store configuration, which matches the credentials needed +for Taskserver communication. See section 2.1 \"Credentials\". + +The credentials may not be modified by the user without losing server access. + +The server:port data may need to be changed automatically following a redirect +response from the server. See section 5 \"Server Errors\". + +[]{#storage} + +#### Local Storage + +The client needs to store task data locally. The client will need to be able to +find tasks by their UUID and overwrite them. Uploaded and downloaded task +changes will use the [Taskwarrior Data Interchange +Format](/docs/design/task.html). + +[]{#changes} + +#### Local Changes + +Whenever local data is modified, that change MUST be synced with the server. But +this does not have to occur immediately, in fact the client SHOULD NOT assume +connectivity at any time. + +A client SHOULD NOT also assume that the server is available. If the server is +not available, the local changes should be retained, and the sync operation +repeated later. + +Ideally the client will give the user full control over sync operations. +Automatically syncing after all local modifications is not recommended. If a +client performs too many sync operations, the server MAY revoke the certificate. + +Effectively, the client should maintain a separate list of tasks changed since +the last successful sync operation. + +Note that tasks have a \"modified\" attribute, which should be updated whenever +a change is made. This attribute contributes to conflict resolution on the +server. + +[]{#remote} + +#### Remote Changes + +When a server sends remote changes to a client, in the response to a sync +request, the changes have already been merged by the server, and therefore the +client should simply store them intact. + +Based on the UUID in the task, the client can determine whether a task is new +(and should be added to the local list of tasks), or whether it represents a +modification (and should overwrite it\'s existing entry). + +The client MUST NOT perform any merges. + +[]{#sync_key} + +#### Sync Key + +Whenever a sync is performed, the server responds by sending a sync key and any +remote changes. The sync key is important, and should be included in the next +sync request. The client is REQUIRED to store the sync key in every server +response message. + +If a client omits the sync key in a sync message, the response will be a +complete set of all tasks and modifications. + +[]{#integrity} + +#### Data Integrity + +Although a task is guaranteed to contain at least \'entry\', \'description\' and +\'uuid\' attributes, it may also contain other known fields, and unknown +user-defined fields. An example might be an attribute named \'estimate\'. + +If a task is received via sync that contains an attribute named \'estimate\', +then a client has the responsibility of preserving the attribute intact. If that +data is shown, then it is assumed to be of type \'string\', which is the format +used by JSON for all values. + +Conversely, if a client wishes to add a custom attribute, it is guaranteed that +the server and other clients will preserve that attribute. + +Using this rule, two clients of differing capabilities can exchange data and +still maintain custom attributes. + +This is a requirement. Any client that does not obey this requirement is broken. + +[]{#synchronizing} + +#### Synchronizing + +Synchronizing with the Taskserver consists of a single transaction. Once an +encrypted connection is made with the server, the client MUST compose a [sync +request message](/docs/design/request.html). This message includes credentials +and local changes. The response message contains status and remote changes, +which MUST be stored locally. + +[]{#connect} + +#### Establishing Encrypted Connection + +All communication with the Taskserver is encrypted using the certificate and key +provided to each user. Using the \'server\' configuration setting, establish a +connection. + +[]{#sync_request} + +#### Sync Request + +See [sync request message](/docs/design/request.html). A sync request MUST +contain a sync key if one was provided by a previous sync. A sync request MUST +contain a list of modified tasks, in JSON format (see [Task +JSON](/docs/design/task.html)), if local modifications have been made. + +[]{#sync_response} + +#### Sync Response + +A sync response WILL contain a \'code\' and \'status\' header variable, WILL +contain a sync key in the payload, and MAY contain a list of tasks from the +server in JSON format (see [Task JSON](/docs/design/task.html)). + +[]{#server_messages} + +#### Server Messages + +There are cases when the server needs to inform the user of some condition. This +may be anticipated server downtime, for example. The response message is +typically not present, but may be present in the header, containing a string: + + ... + message: Scheduled maintenance 2013-07-14 08:00UTC for 10 minutes. + ... + +If such a message is returned by the server, it SHOULD be made available to the +user. This is a recommendation, not a requirement. + +[]{#errors} + +#### Server Errors + +The server may generate many errors (See +[Protocol](/docs/design/protocol.html)), but the following is a list of the ones +most in need of special handling: + +- 200 Success +- 201 No change +- 301 Redirect +- 430 Access denied +- 431 Account suspended +- 432 Account terminated +- 5xx Error + +The 200 indicates success, and that a change was recorded. The 201 indicates +success but no changes were necessary. The 301 is a redirect message indicating +that the client MUST re-request from a new server. The 43x series messages are +account-related. Any 5xx series code is a server error of some kind. All errors +consist of a code and a status message: + + code: 200 + status: Success + +[]{#examples} + +#### Examples + +Here are examples of properly formatted request and response messages. Note that +the messages are indented for clarity in this document, but is not the case in a +properly formatted message. Also note that newline characters U+000D are not +shown, but are implied by the separate lines. Because some messages have +trailing newline characters, the text is delimited by the \'cut\' markers: + + foo + +The example above illustrates text consisting of: + + U+0066 f + U+006F o + U+006F o + U+000D newline + U+000D newline + +Note that these values are left unspecified, but should be clear from the +context, and the [message format](/docs/design/request.html) spec: + + + + + + +[]{#first} + +#### First Sync + +The first time a client syncs, there is (perhaps) no data to upload, and no sync +key from a previous sync. + + type: sync + org: + user: + key: + client: task 2.3.0 + protocol: v1 + +Note the double newline character separating header from payload, with an empty +payload. + +[]{#sync_no_data} + +#### Request: Sync No Data + +Ordinarily when a client syncs, there is a sync key from the previous sync +response to send. This example shows a sync with no local changes, but a sync +key from a previous sync. + + type: sync + org: + user: + key: + client: task 2.3.0 + protocol: v1 + + 2e4685f8-34bc-4f9b-b7ed-399388e182e1 + +[]{#sync_data} + +#### Request: Sync Data + +This sync request shows a sync key from the previous sync, and a locally +modified task. + + type: sync + org: + user: + key: + client: task 2.3.0 + protocol: v1 + + 2e4685f8-34bc-4f9b-b7ed-399388e182e1 + {"description":"An example","uuid":"8ad2e3db-914d-4832-b0e6-72fa04f6e331",...} + +[]{#resp_no_data} + +#### Response: No Data + +If a sync results in no downloads to the client, the response will look like +this. + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 200 + status: Ok + + 45da7110-1bcc-4318-d33e-12267a774e0f + +Note that there is a sync key which must be stored and used in the next sync +request, but there are no remote changes to store. + +[]{#resp_data} + +#### Response: Remote Data + +This shows a sync response providing a new sync key, and a remote change to two +tasks. + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 200 + status: Ok + + 45da7110-1bcc-4318-d33e-12267a774e0f + {"description":"Test data","uuid":"8ad2e3db-914d-4832-b0e6-72fa04f6e331",...} + {"description":"Test data2","uuid":"3b6218f9-726a-44fc-aa63-889ff52be442",...} + +Note that the sync key must be stored for the next sync request. + +Note that the two changed tasks must be stored locally, and if the UUID in the +tasks matches local tasks, then the local tasks must be overwritten. + +[]{#resp_error} + +#### Response: Error + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 431 + status: Account suspended + +Note the double newline character separating header from payload, with an empty +payload. + +[]{#resp_relocate} + +#### Response: Relocate + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 301 + status: Redirect + info: + +Note the \'info\' field will contain a \':\' string that should be used for all +future sync requests. This indicates that a user account was moved to another +server. + +Note the double newline character separating header from payload, with an empty +payload. + +[]{#resp_message} + +#### Response: Message + +Occasionally the server will need to convey a message, and will include an +additional header variable containing that message. + +The server [protocol](/docs/design/protocol.html) states that the message SHOULD +be shown to the user. This message will be used for system event messages, used +rarely, and never used for advertising or promotion. + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 200 + status: Ok + message: Scheduled maintenance 2013-07-14 08:00UTC for 10 minutes. + + 45da7110-1bcc-4318-d33e-12267a774e0f + +Note that the same message will likely be included in consecutive responses. + +[]{#reference} + +#### Reference Implementation + +The Taskserver 1.1.0 codebase contains a reference implementation of an SSL/TLS +client and server program, which communicate text strings. + + taskd.git/src/tls/Makefile # To build the example + taskd.git/src/tls/README # How to run the example + taskd.git/src/tls/TLSClient.cpp # TLS client code + taskd.git/src/tls/TLSClient.h + taskd.git/src/tls/TLSServer.cpp # TLS Server code + taskd.git/src/tls/TLSServer.h + taskd.git/src/tls/c.cpp # Client program + taskd.git/src/tls/s.cpp # Server program + taskd.git/src/tls/text.cpp # Text manipulation + taskd.git/src/tls/text.h # Text manipulation + +The Taskwarrior codebase, version 2.4.0, is the reference implementation. + + task.git/src/TLSClient.cpp # TLS client code + task.git/src/TLSClient.h + task.git/src/commands/CmdSync.cpp # Sync implementation + task.git/src/commands/CmdSync.h +::: diff --git a/content/docs/design/dom.md b/content/docs/design/dom.md new file mode 100644 index 00000000..d26bbe94 --- /dev/null +++ b/content/docs/design/dom.md @@ -0,0 +1,271 @@ +--- +title: "Taskwarrior - Full DOM Support" +--- + +#### Work in Progress + +This design document is a work in progress, and subject to change. Once +finalized, the feature will be scheduled for an upcoming release. +::: + +[]{#current} + +### Full DOM Support + +Taskwarrior currently supports DOM references that can access any stored data +item. The general forms supported are: + + [ | ] [ ] + +Examples include: + + due + 123.uuid + entry.month + 123.annotations.0.entry.year + a87bc10f-931b-4558-a44a-e901a77db011.description + +Additionally there are references for accessing configuration and system/program +level items. + + rc. + context.program + context.args + context.width + context.height + system.version + system.os + +While this is adequate for data retrieval, we have the possibility of extending +it further to include data formats, higher-level constructs, and then to make +use of DOM references in more locations. This contributes to our goal of +simplifying Taskwarrior. + +[]{#format} + +#### Proposed Format Support + +When defining a custom report, the columns shown are defined like this: + + report.x.columns=uuid.short,description.oneline ... + +This syntax is: + + [ . ] + +If no `format` is specified, then `default` is assumed. The src/columns/ColΧ\* +objects are responsible for supporting and rendering these formats. There is +currently no consistency among these formats based on data type. + +By incorporating formats into DOM references, we eliminate the need for a +separate syntax for custom reports, and provide this: + + 123.due.iso + 123.due.month.short + 123.uuid.short + +A standard set of formats per data type would be: + +Type +::: +::: +::: +::: + +Formats + +Example + +Numeric + +default + +`123 ` + +indicator + +Based on `rc..indicator` which overrides `rc.numeric.indicator`. + +json + +`"":""` + +String + +default + +Buy milk + +short + +Feb + +indicator + +Based on `rc..indicator` which overrides `rc.string.indicator`. + +json + +`"":""` + +Date + +default + +Based on `rc.dateformat` + +iso + +2017-02-20T09:02:12 + +julian + +2457805.12858 + +epoch + +1234567890 + +age + +2min + +relative + +-2min + +remaining + +0:02:04 + +countdown + +0:02:04 + +indicator + +Based on `rc..indicator` which overrides `rc.date.indicator`. + +json + +`"":""` + +Duration + +default + +1wk + +iso + +P1W + +indicator + +Based on `rc..indicator` which overrides `rc.duration.indicator`. + +json + +`"":""` + +There will also be a set of attribute-specific formats, similar to the currently +supported set: + + depends.list + depends.count + description.combined + description.desc + description.oneline + description.truncated + description.count + description.truncated_count + parent.default|long + parent.short + project.full + project.parent + project.indented + status.default|long + status.short + tags.default|list + tags.count + urgency.default|real + urgency.integer + uuid.default|long + uuid.short + +Custom report sort criteria will also use DOM references. This will be augmented +by the `+`/`-` sort direction and `/` break indicator, which are not part of the +DOM. + +[]{#high} + +#### High Level Construct Support + +There need to be read-only DOM references that do not correspond directly to +stored attributes. Tasks have emergent properties represented by virtual tags, +which will be accessible, in this case returning a `0` or `1`: + + 123.tags.OVERDUE + +Using `rc.due` and the `due` attribute, the `OVERDUE` virtual tag is a +combination of the two. Other examples may include: + + task.syncneeded + task.pending.count + task.hooks.installed + +[]{#writable} + +#### Writable References + +When a DOM reference refers to an attribute or RC setting, and does not extend +further and reference a component or format, it may be writable. For example: + + rc.hooks # writable + 123.description # writable + 123.entry.month # not writable, not an attribute + +[]{#interchange} + +#### Data Interchange + +The export command can be used to show a filtered set of tasks in JSON format, +and this will also be available as a DOM format: + + 123.json + a87bc10f-931b-4558-a44a-e901a77db011.json + +[]{#rc} + +#### RC File Support + +The RC file (`~/.taskrc`) will support DOM references in values. This will form +a late-bound reference, which is evaluated at runtime, every time. + +An example is to make two reports share the same description: + + $ task config -- report.ls.description rc.report.list.description + +This sets the description for the `ls` report to be a reference to the +description of the `list` report. This reference is not evaluated when the entry +is written, but is evaluated every time the value is read, thus providing +late-bound behavior. Then if the description of the `list` report changes, so +does that of the `ls` report automatically. + +[]{#dev} + +#### Implementation Details + +These notes list a series of anticipated changes to the codebase. + +- The `src/columns/Col*` objects will implement type-specific and + attribute-specific DOM support. DOM reference lookup will defer to the + column objects first. +- Some DOM references will be writable, permitting a `_set` command to + complement the `_get` command. +- The `Config` object will recognize DOM references in values and perform + lookup at read time. This will require circularity detection. +- `src/DOM.cpp` will provide a memoized function to determine whether a DOM + reference is valid. +- `src/DOM.cpp` will provide a function to obtain a DOM reference value, with + supporting metadata (type, writable). diff --git a/content/docs/design/index.md b/content/docs/design/index.md new file mode 100644 index 00000000..660540ae --- /dev/null +++ b/content/docs/design/index.md @@ -0,0 +1,179 @@ +--- +title: "Taskwarrior - What's next?" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +::: {.col-md-10} +This is where design documents (RFCs) are kept. + +Although these documents are less formal than [IETF +RFCs](https://www.ietf.org/rfc.html) they serve a similar purpose. These +documents apply only to the Taskwarrior family of products, and are placed here +to invite comment before designs finalize. +::: +::: + +::: {.col-md-10 .main} +::: {.row} ++---------------------------------------+---------------------------------------+ +| []{#rfc} | - [Task | +| | warrior/Taskserver/Tasksh/Timewarrior | +| **Plans** | Plans]( | +| | /docs/design/plans.html){.alert-link} | ++---------------------------------------+---------------------------------------+ +| []{#rfc} | #### Taskwarrior | +| | | +| **RFCs** | - [Rules | +| | System]( | +| | /docs/design/rules.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://githu | +| | b.com/GothenburgBitFactory/tw.org/blo | +| | b/master/html/docs/design/rules.html) | +| | - [Full DOM | +| | Support | +| | ](/docs/design/dom.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://git | +| | hub.com/GothenburgBitFactory/tw.org/b | +| | lob/master/html/docs/design/dom.html) | +| | - [Work Week | +| | Support](/do | +| | cs/design/workweek.html){.alert-link} | +| | [[]{.glyphicon | +| | .g | +| | lyphicon-info-sign}](https://github.c | +| | om/GothenburgBitFactory/tw.org/blob/m | +| | aster/html/docs/design/workweek.html) | +| | - [Recurrence](/docs | +| | /design/recurrence.html){.alert-link} | +| | [[]{.glyphicon | +| | .gly | +| | phicon-info-sign}](https://github.com | +| | /GothenburgBitFactory/tw.org/blob/mas | +| | ter/html/docs/design/recurrence.html) | +| | - [Taskwarrior JSON | +| | Format] | +| | (/docs/design/task.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://gith | +| | ub.com/GothenburgBitFactory/tw.org/bl | +| | ob/master/html/docs/design/task.html) | +| | - [CLI | +| | Updates | +| | ](/docs/design/cli.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://git | +| | hub.com/GothenburgBitFactory/tw.org/b | +| | lob/master/html/docs/design/cli.html) | +| | | +| | #### Taskserver | +| | | +| | - [Taskserver Sync | +| | Protocol](/do | +| | cs/design/protocol.html){.alert-link} | +| | [[]{.glyphicon | +| | .g | +| | lyphicon-info-sign}](https://github.c | +| | om/GothenburgBitFactory/tw.org/blob/m | +| | aster/html/docs/design/protocol.html) | +| | - [Taskserver Message | +| | Format](/d | +| | ocs/design/request.html){.alert-link} | +| | [[]{.glyphicon | +| | . | +| | glyphicon-info-sign}](https://github. | +| | com/GothenburgBitFactory/tw.org/blob/ | +| | master/html/docs/design/request.html) | +| | - [Taskserver Sync | +| | Algorithm] | +| | (/docs/design/sync.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://gith | +| | ub.com/GothenburgBitFactory/tw.org/bl | +| | ob/master/html/docs/design/sync.html) | +| | - [Taskserver | +| | Client](/ | +| | docs/design/client.html){.alert-link} | +| | [[]{.glyphicon | +| | | +| | .glyphicon-info-sign}](https://github | +| | .com/GothenburgBitFactory/tw.org/blob | +| | /master/html/docs/design/client.html) | +| | | +| | #### Tasksh | +| | | +| | - (No announced plans) | +| | | +| | #### Timewarrior | +| | | +| | - (No announced plans) | ++---------------------------------------+---------------------------------------+ +| []{#upcoming} | - Lazy Dates (Deferred Evaluation) | +| | | +| **Upcoming RFCs** | | ++---------------------------------------+---------------------------------------+ +::: + +\ +\ +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/docs/design/plans.md b/content/docs/design/plans.md new file mode 100644 index 00000000..8f67c0f5 --- /dev/null +++ b/content/docs/design/plans.md @@ -0,0 +1,226 @@ +--- +title: "Plans" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +::: {.col-md-10} +There are many interconnected features and technologies in Taskwarrior, +Taskserver, Tasksh and Timewarrior, each piece having it\'s own goals. + +This matrix allows a simple reading of where things are, and where they are +going. This is a low-resolution time line. It is subject to change. It does not +constitute a concrete plan. This is an all-volunteer effort, and scheduling is +difficult. + +[Last updated 2016-08-08.]{.small}\ +\ + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Taskwarrior\ [2.5.1]{.label .label-success}\ [2.6.0]{.label .label-danger}\ [2.x]{.label .label-info}\ + Technology/Feature Current\ Next\ Future + \ \ + Released 2016-02-24 2017 + ------------------------- --------------------------------------------- --------------------------------------------- --------------------------------------------------- + Core [DOM](/docs/dom.html)\ [Recurrence](/docs/design/recurrence.html)\ True Color + Filters\ Shared library\ + Expressions\ `purge` command\ + Color Rules\ + Custom Reports\ + Annotations\ + Tags / Virtual Tags\ + [Context](/docs/context.html)\ + + API [JSON](/docs/design/task.html)\ `on-sync` hook\ + Import\ Full DOM\ + Export\ DOM access in rc\ + [Hooks](/docs/hooks.html)\ `$ENV` access in rc\ + [Hooks v2](/docs/hooks2.html)\ Report columns as DOM refs\ + [DOM](/docs/dom.html)\ + Helper commands\ + + Attributes\ `modified`\ `template`\ `org`\ + [User Defined Attributes `priority` as a UDA\ `rtype`\ `group`\ + (UDA)](/docs/udas.html) Remove `mask`\ + Remove `imask`\ + Remove `parent`\ + + Reports Improved layouts\ Daily, Weekly reports (history, ghistory)\ + Improved Themes + + Synchronization `task sync`\ `task sync reset`\ + `task sync init` (all tasks)\ + + TDB (task database) Local file locking\ Threaded file load\ + Single file set\ Read-only mode + Single user + + I18N / L10N UTF-8 support\ No I18N / L10N Migrate to + `deu-DEU`\ [gettext](https://www.gnu.org/software/gettext/)\ + `eng-USA`\ + `epo-RUS`\ + `esp-ESP`\ + `fra-FRA`\ + `ita-ITA`\ + `pol-POL`\ + `por-PRT`\ + + Documentation man: task\ New video tutorials\ + man: taskrc\ + man: task-color\ + man: task-sync\ + youtube: various\ + [taskwarrior.org](https://taskwarrior.org)\ + taskwarrior.com: Support Site\ + + Testing C++ tests\ Migration to Flod2\ + Python tests\ + Sync tests\ + Parallel tests\ + + Tool Chain GCC 4.7 / Clang 3.3\ GCC 4.9 / Clang 3.4\ Full C++14 support\ + C++11 support\ Full C++11 support\ Full C++17 support\ + CMake\ + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +\ +\ +\ +\ + + ------------------------------------------------------------------------------------------- + Tasksh\ [1.1.0]{.label [1.2.0]{.label [1.x]{.label + Technology/Feature .label-success}\ .label-danger}\ .label-info}\ + Current\ Next\ Future + \ \ + Released 2016-09-05 2017 + -------------------- ------------------------------ ------------------- ------------------- + Core [Review](/docs/review.html)\ Pomodoro timer\ + libreadline\ + Shared library\ + + Tool Chain CMake\ GCC 4.9 / Clang Full C++14 support\ + GCC 4.7 / Clang 3.3\ 3.4\ Full C++17 support\ + Full C++11 support\ + ------------------------------------------------------------------------------------------- + +\ +\ +\ +\ + + -------------------------------------------------------------------------------- + Taskserver\ [1.1.0]{.label [1.2.0]{.label [1.x]{.label + Technology/Feature .label-success}\ .label-danger}\ .label-info}\ + Current\ Next\ Future + \ \ + Released 2015-05-10 2017 + -------------------- ------------------- ------------------- ------------------- + Core Serial server Shared library\ Threaded server + + Protocol v1 v1.1 - client reset v1.2 + request\ + + DB (Data Storage) GC + + Security Validation UUID:Cert + Verification\ + Combined Certs + + Tool Chain GCC 4.7 / Clang GCC 4.9 / Clang Full C++14 support\ + 3.3\ 3.4\ Full C++17 support\ + CMake\ Full C++11 support\ + -------------------------------------------------------------------------------- + +\ +\ +\ +\ + + -------------------------------------------------------------------------------- + Timewarrior\ [1.0.0]{.label [1.1.0]{.label [1.x]{.label + Technology/Feature .label-success}\ .label-danger}\ .label-info}\ + Current\ Next\ Future + \ \ + Released 2016-08-20 2017 + -------------------- ------------------- ------------------- ------------------- + Core Shared library\ True Color + + Reports `summary` report\ + `gaps` report\ + `day` chart\ + `week` chart\ + `month` chart\ + `totals.py` + extension\ + + Rules Simple Rule System\ + configuration rules + + Integration Taskwarrior + `on-modify` hook + script + + Tool Chain CMake\ GCC 4.9 / Clang Full C++14 support\ + GCC 4.7 / Clang 3.4\ Full C++17 support\ + 3.3\ Full C++11 support\ + C++11 support\ + -------------------------------------------------------------------------------- + +\ +\ +::: +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/docs/design/protocol.md b/content/docs/design/protocol.md new file mode 100644 index 00000000..b91919a5 --- /dev/null +++ b/content/docs/design/protocol.md @@ -0,0 +1,223 @@ +--- +title: "Taskwarrior - Sync Protocol" +--- + +[]{#sync} + +### Sync Protocol + +[]{#intro} + +#### Introduction + +Taskwarrior data has typically been shared in several ways. Those include SCM +(source code management) systems, directory synchronizing software (such as +DropBox), and by use of the \'push\', \'pull\' and \'merge\' commands introduced +in version 1.9.3. + +While these methods work, they each have problems associated with the merging of +data. In the case of directory synchronizing software, there is no merging at +all - just simple file overwrite, despite many people believing that the data is +somehow combined and preserved. + +The Taskserver is a solution. It is an online/cloud storage and sync service for +taskwarrior data. It performs conflict-free data merging, and minimizes +bandwidth use. + +The Taskserver also provides multi-client access, so that a task added using a +web client could be immediately viewed using a mobile client, or modified using +taskwarrior. Choice of clients is important - people have widely varying +behaviors and tastes. + +The Taskserver also provides multi-user access, which introduces new +capabilities, such as list sharing and delegation. These will require later +modification to this protocol. + +The Taskserver protocol will be implemented by the taskd project and first used +in taskwarrior 2.3.0. Other clients will follow. + +[]{#req} + +#### Requirements + +In this document, we adopt the convention discussed in Section 1.3.2 of +[RFC1122](https://tools.ietf.org/html/rfc1122#page-16) of using the capitalized +words MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, and OPTIONAL to define the +significance of each particular requirement specified in this document. + +In brief: \"MUST\" (or \"REQUIRED\") means that the item is an absolute +requirement of the specification; \"SHOULD\" (or \"RECOMMENDED\") means there +may exist valid reasons for ignoring this item, but the full implications should +be understood before doing so; and \"MAY\" (or \"OPTIONAL\") means that this +item is optional, and may be omitted without careful consideration. + +[]{#link} + +#### Link Level + +The Taskserver protocol assumes a reliable data stream such as provided by TCP. +When TCP is used, a Taskserver listens on a single predetermined port *for the +given client* only. This means the server may be using multiple ports to serve +distinct sets of clients. + +This server is only an interface between programs and the task data. It does not +perform any user interaction or presentation-level functions. + +[]{#tx} + +#### Transactions + +Each transaction is a single incoming message, with a single response message. +All communication therefore consists of a single \'send\', followed by a single +\'receive\', then termination. There are no sessions, and no continuously open +connections. The message format is described in the [Taskserver Message +Format](/docs/design/request.html) document. + +[]{#server} + +#### Responsibilities of the Server + +The server will maintain a set of transactions, in the original sequence, +punctuated by sync keys which are UUIDs. Each sync key represents a non- trivial +sync operation by a client. Each transaction is a [JSON-formatted +task](/docs/design/task.html), followed by a newline (\\n) character. The result +is a single file that contains interleaved lines of two types: tasks and sync +keys. + +This design allows the server to maintain a set of deltas such that multiple +clients may request a minimal set of changes since their last sync. + +[]{#client} + +#### Responsibilities of the Client + +This describes how Taskwarrior implements sync. + +All modifications to tasks (add, modify, done, delete \...) are recorded in the +form of a fully-composed [JSON-formatted task](/docs/design/task.html). The +formatted task is added to a local backlog.data file. If a task is modified a +second time, it is added again to the backlog.data file - the lines are not +combined. Each task SHALL have a \'modified\' date attribute that will help +resolve conflicts. + +On sync: + +- Send a \'sync\' type message with the entire contents of the backlog.data, + unmodified, as the message payload. +- Receive one of the following response codes: + - 201: This means \'no change\', and there is no further action to be + taken. + - 200: This means \'success\', and the message payload contains a set of + tasks and a sync key: + - The formatted tasks are to be stored as-is. These tasks will either + be appended to the client data or will overwrite existing client + data, based on the UUID of the task. No merge logic is necessary. + - The sync key will be written to the backlog.data file, overwriting + the previous contents, such that it will now contain only one line. + - 301: Redirect to : found in the \'info\' response header, will force the + client to resubmit the request to the new server. + - 3xx, 4xx, 5xx: The \'status\' field contains an error message. +- If the response contained any error or warning, the error should be shown to + the user. This provides an opportunity for the server to announce downtime, + or relocation. + +If no sync key is sent, the server cannot provide an incremental delta, and so +will send all task data, which should be stored as above. This should be the +case for a client making its first sync call. + +If an unrecognized attribute is present in the task data, the client MUST +preserve the attribute unmodified, and assume it is of type \'string\'. This +permits individual clients to augment the task data without other clients +stripping it meaningful data. This is how UDAs (user defined attributes) are +handled. + +[]{#ext} + +#### Extensions + +This protocol was designed so that extensions to the protocol will take the form +of additional message types and status codes. + +[]{#status} + +#### Summary of Response Codes + +Status responses indicate the server\'s response to the last command received +from the client. The codes consist of a 3 digit numeric code. + +The first digit of the response broadly indicates the success, failure, or +progress of the previous command (based generally on +[RFC640](https://tools.ietf.org/html/rfc640) +[RFC821](https://tools.ietf.org/html/rfc821)): + + ----- ------------------------------------- + 1yz Positive Preliminary reply + 2yz Positive Completion reply + 3yz Positive Intermediate reply + 4yz Transient Negative Completion reply + 5yz Permanent Negative Completion reply + ----- ------------------------------------- + +The next digit in the code indicates the response category: + + ----- ------------------------------------------------- + x0z Syntax + x1z Information (e.g., help) + x2z Connections + x3z Authentication + x4z Unspecified as yet + x5z Taskd System (\...) + x8z Nonstandard (private implementation) extensions + ----- ------------------------------------------------- + +A summary of all status response are: + + ----- ----------- + 200 Success + 201 No change + ----- ----------- + + ----- ---------------------------------------------------------------------------------------------------------------------------------------------- + 300 Deprecated message type. This message will not be supported in future Taskserver releases. + 301 Redirect. Further requests should be made to the specified server/port. + 302 Retry. The client is requested to wait and retry the same request. The wait time is not specified, and further retry responses are possible. + ----- ---------------------------------------------------------------------------------------------------------------------------------------------- + + ----- ------------------------------------------ + 400 Malformed data + 401 Unsupported encoding + 420 Server temporarily unavailable + 421 Server shutting down at operator request + 430 Access denied + 431 Account suspended + 432 Account terminated + ----- ------------------------------------------ + + ----- ----------------------------------- + 500 Syntax error in request + 501 Syntax error, illegal parameters + 502 Not implemented + 503 Command parameter not implemented + 504 Request too big + ----- ----------------------------------- + +[]{#security} + +#### Security Considerations + +All communication with the Taskserver uses SSL 3.0 or TLS 1.0, 1.1 or 1.2. +Encryption is mandatory. Data is never transmitted in plain text. + +[]{#limitations} + +#### Limitations and Guidelines + +Some limitations exists to reduce bandwidth and load on the server. They are: + +- A client may only connect to a single server. Synchronization among a set of + servers is not supported. +- A client should attempt to minimize data bandwidth usage by maintaining a + local data store, and properly using sync keys. +- A client should minimize data transfers by limiting the frequency of sync + requests. +::: diff --git a/content/docs/design/request.md b/content/docs/design/request.md new file mode 100644 index 00000000..1bf66245 --- /dev/null +++ b/content/docs/design/request.md @@ -0,0 +1,233 @@ +--- +title: "Taskwarrior - Request" +--- + +[]{#message} + +### Taskserver Message Format + +The Taskserver accepts and emits only messages. These messages look somewhat +like email, as defined in [RFC821](https://tools.ietf.org/html/rfc821), +[RFC2822](https://tools.ietf.org/html/rfc2822). + +The message format allows for data, metadata, and extensibility. This +combination allows the Taskserver to accommodate current and future needs. This +document describes the message format, and the supported message types. + +[]{#req} + +#### Requirements + +In this document, we adopt the convention discussed in Section 1.3.2 of +[RFC1122](https://tools.ietf.org/html/rfc1122#page-16) of using the capitalized +words MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, and OPTIONAL to define the +significance of each particular requirement specified in this document. + +In brief: \"MUST\" (or \"REQUIRED\") means that the item is an absolute +requirement of the specification; \"SHOULD\" (or \"RECOMMENDED\") means there +may exist valid reasons for ignoring this item, but the full implications should +be understood before doing so; and \"MAY\" (or \"OPTIONAL\") means that this +item is optional, and may be omitted without careful consideration. + +[]{#encoding} + +#### Encoding + +All messages are UTF8-encoded text. + +[]{#format} + +#### Message Format + +This format is based on [RFC2822](https://tools.ietf.org/html/rfc2822), +\'Internet Message Format\'. Here is an example of the format: + + + name: value + name2: value2 + + payload + +There are three sections. The first is the size, which is a 4-byte, big- Endian, +binary byte count of the length of the message, including the 4 bytes for the +size. + +The header section is a set of name/value pairs separated by newline characters +(U+000D). The name is separated from the value by \': \' (colon U+003A, space +U+0020) The header section is terminated by two consecutive newline (U+000D) +characters. All text is UTF8-encoded. + +The payload section is arbitrary, and message type-specific. However, it is +still UTF8-encoded text. + +[]{#msgreq} + +#### Message Requirements + +Messages SHALL contain particular headers. Those are: + +- type +- protocol +- client + +The \'type\' value is what determines the interpretation of the payload. + +The \'protocol\' value should be \'v1\', or any subsequently published protocol +version. + +The \'client\' represent the client identifier, so that any special cases can be +handled. For example, an emergency fix that is client version-specific could be +released, to support users that have not updated their client, or perhaps the +client has not released a fix. The form of the \'version\' value is: + + + +As an example: + + taskwarrior 2.3.0 + +DO NOT spoof any other software using this client value. If another client is +spoofed, then patches addressing protocol errors may break working software. + +[]{#auth} + +#### Auth Data + +Every request from the client SHALL contain \"auth\" information, which involves +these header entries: + + org: + user: + key: + +The user and org fields uniquely identify a user. + +The key field is generated when a new server account is set up. It is a shared +secret, equivalent to a password, and should be protected. + +Authentication failure can result in these errors: + +- 430 Authentication failed +- 431 Account suspended + +[]{#status} + +#### Status Data + +Every response from the Taskserver SHALL contain status data: + + code: + status: + +The code is a numeric status indicator defined in the [Sync +Protocol](/docs/design/protocol.html). + +[]{#payload} + +#### Payload Data + +Payload data is optional, arbitrary and message type dependent. It is always +UTF8-encoded text. + +[]{#types} + +#### Message Types + +The Taskserver supports several message types, thus providing a set of +primitives for use by clients. + +It is expected that the number of supported ticket types will increase over +time. + +[]{#sync} + +#### Sync Message + +The \"sync\" message always originates from the client, but the response will +contain data from the server. A sync is therefore a single request with a single +response. + +The \"sync\" message type MUST contain the following headers: + +- type +- org +- user +- key +- client +- protocol + +The \"sync\" message payload has this format: + + + + + ... + + +Here is an example of a sync message: + + type: sync + org: + user: + key: + client: task 2.3.0 + protocol: v1 + + 2e4685f8-34bc-4f9b-b7ed-399388e182e1 + {"description":"Test data","entry":"20130602T002341Z","status":"pending"} + +The request contains the proper auth section, and the body contains the current +sync key followed by a newline characters (U+000D), then a list of +JSON-formatted tasks \[2\] each separated by a newline character (U+000D). + +An example response message might be: + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 200 + status: Ok + + 45da7110-1bcc-4318-d33e-12267a774e0f + +The status indicates success, and the payload contains zero remote task +modifications, followed by a sync key. + +[]{#stats} + +#### Statistics Message + +The message format іs simply: + + type: statistics + org: + user: + key: + client: taskd 1.0.0 + protocol: v1 + +There is no payload. An example response message might be: + + type: response + client: taskd 1.0.0 + protocol: v1 + code: 200 + status: Ok + average request bytes: 0 + average response bytes: 0 + average response time: 0.000000 + errors: 0 + idle: 1.000000 + maximum response time: 0.000000 + total bytes in: 0 + total bytes out: 0 + tps: 0.000000 + transactions: 1 + uptime: 28 + +There is no payload, and the results are in the header variables. + +Note that the statistics gathered by the server are growing, which means new +values are occasionally added to the response message. Existing values will not +be removed. +::: diff --git a/content/docs/design/rules.md b/content/docs/design/rules.md new file mode 100644 index 00000000..72894bb7 --- /dev/null +++ b/content/docs/design/rules.md @@ -0,0 +1,248 @@ +--- +title: "Taskwarrior - Rule System" +--- + +#### Work in Progress + +This design document is a work in progress, and subject to change. Once +finalized, the feature will be scheduled for an upcoming release. +::: + +[]{#rules} + +### Rule System + +The rule system is a framework that supports highly configurable features, with +runtime evaluation, DOM access and an internal API. Implementing a rule system +meets the goal of shrinking and stabilizing the product core, while adding new +features, and enabling many more. + +[]{#requirements} + +#### Required Enhancements + +To prepare for a Rules System, various subsystems must first be enhanced: + +- DOM references need to be unambiguous, and will all have the `dom.` prefix. + +- DOM references need to be able to access any Taskwarrior data, in any + +- Custom reports will change from referencing `[.]` to simply + `` + +- RC file syntax needs to be enhanced, so support rule definitions, which are + multi-line blocks that are indentation-sensitive + +- RC file syntax will support two ways of specifying the same data: + + a.b.c=... + + a: + b: + c=... + +- RC file syntax will allow the use of environment variables inline: + + name=${TERM} + include ${HOME}/.taskrc_local + +- The `Variant` object will migrate to `libshared` + +- The expression evaluator `Eval` object will migrate to `libshared` + +- The column objects will gain a more structured base class, and will serve as + providers for DOM references + +- The \'exec\' command will be able to run a rule, if the reference is correct + +- Taskwarrior will store state data in a new `state.data` file + +- `Config` object needs to use the `rat` parser, to tackle the more complex + syntax + +- The RC file will support environment variable expansion, where `${NAME}` + will be replaced by its corresponding value at launch time + +At that point, the rules system can be implemented in `libshared`, and will use +a pluggable architecture to allow its integration into several projects. + +[]{#dom} + +#### DOM Enhancements + +DOM references will be enhanced, with many more references supported. All DOM +references will begin with `dom.`, yielding unambiguous references. References +will have a type. Types will support sub-references (`.`, +`.`, `.`), and display formats included. + + dom . [ .] [. ] . + + dom . 123 . entry . year . yyyy + dom . 123 . entry + dom . 123 . tags + dom . 123 . tags . count + dom . 123 . tags . 1 + +In addition to direct attribute access, DOM references will also support tw +references beyond the current set: + + dom.rc. + dom.cli.args + dom.terminal.width + dom.terminal.height + dom.system.version + dom.system.oѕ + +And will also support higher-level constructs that do not directly correlate to +attributes, for example: + + dom.active Boolean indicator of any active tasks + dom.synced Boolean indicator of the need to sync + dom.rc.path String path of .taskrc file (or override) + dom.data.path String path of data directory + dom.hooks.path String path of hooks directory + +Finally, access to state: + + dom.state.program + dom.state.sync.last + dom.state.sync.configured + dom.state.run.last + dom.state.context + +[]{#syntax} + +#### RC Syntax Changes + +The current configuration system supports only two different forms of syntax: + + = [ ] + + include + +A rule is a new form of syntax that consists of the rule keyword, a name, +optional trigger, followed by indented actions in the form of API calls and flow +control. For example: + + rule myRule() on_launch: + # Some code here + +A rule definition will appear in the RC file, alongside all the existing +settings. The rule syntax will require a blank line to terminate the rule +definition, the result being that the RC file should be quite readable, although +it will look like Python. + +[]{#hooks} + +#### Hook Scripts + +While this functionality can also be implemented using hook scripts, rules will +run in-process, and therefore do not require external interpreters to be +launched every time. This creates the potential to run faster than a hook +script. + +For complex processing, hook scripts will be the preferred mechanism, but as the +rules system matures, rules will be made to run more quickly. With adequate +performance, a rule will be the preferred implementation over a hook script. +This is not expected to be the case at first. + +Hook scripts are not likely to be extended beyond their current form, and with +greater DOM access and a growing API, rules should be able to supplant most hook +script use cases. + +[]{#triggers} + +#### Rule Triggers + +The set of supported rule types will include: + + --------------- ---------------------------------------------------------------------------------------------------------------------------------------------- + `on_launch` Triggered on program launch. + `on_add` Triggered when a task is added. A context task will be provided. The rule can modify the task, and approve or reject it. + `on_modify` Triggered when a task is modified. A before and after context task will be provided. The rule can modify the task, and approve or reject it. + `on_exit` Triggered on program exit. + `color` Triggered when colors are being determined. + `virtual tag` Defines a new virtual tag. + `format` Triggered when an attribute needs formatting, defines are new format. + --------------- ---------------------------------------------------------------------------------------------------------------------------------------------- + +More rules types will be added for more capabilities in future releases. + +[]{#api} + +#### API + +The API is a simple set of actions that may be taken by a rule. + + --------------------------------- --------------------------------------------------------------------------------------------------------------------------------- + `debug()` Displays the string in debug mode only and continues processing. + `warn()` Displays the string as a warning continues processing. + `error()` Displays the string as an error and terminates processing. + `exec( [ ... ])` Executes the external program and passes arguments to it. If the program exits with non-zero status, it is treated as an error. + `return ` Provides a result value for the rule, when necessary. + --------------------------------- --------------------------------------------------------------------------------------------------------------------------------- + +This is a very limited set at first, and more API calls will be added to support +capabilities in future releases. + +[]{#grammar} + +#### Grammar + +The grammar closely tracks that of Python. Blocks are indented consistently. + + -------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + `if : ... else: ... ` The condition is a full Algebraic expression, and supports none of the command line conveniences. Terms must be combined with logical operators. The condition is an expression that is evaluated and converted to a Boolean value. + `for in : ` There is no native type for a collection, but there are DOM references (`tags` \...) that reference collections. This provides a way to iterate. + `set = ` Writes to a named type. The name may be a writable DOM object (`dom...`) or temporary variable storage (`tmp...`). Writing to a read-only DOM reference is an error. + `([]) ` A function is either a rule or an API call. Calling an undefined function is an error. + -------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +[]{#examples} + +#### Examples + +Here are some example rules which illustrate the syntax and API. + +The replacement for the nag feature: + + rule Nag(before, after) on-modify: + if before.urgency < tasks.max.urgency: + warn ‘You have more urgent tasks’ + + if after.status == 'completed' and before.urgency < (dom.urgency.max - 2.0): + warn 'You have more urgent tasks!' + +Correct commonly misspelled word: + + rule CorrectSpelling(task) on_add: + set task.description = substitute(task.description, 'teh', 'the') + +Abbreviation expansion: + + rule ExpandAbbreviation(task) on_modify: + set task.description = substitute(task.description, '/TW-\d+/', 'https:\/\/github.com\/GothenburgBitFactory\/taskwarrior\/issues\/\1') + +Warn on missing project: + + rule WarnOnMissingProject(task) on_add: + if task.project == ‘’: + warn(‘Project not specified’) + +Color rule: + + rule ColorizeDue(task) color: + if task.due > now: + if task.due < (now + 5d): + return dom.rc.color.due + else: + return dom.rc.color.due.later + +Policy: + + rule policyProject(task) on_add: + if task.project == '': + if rc.default.project == '': + error('You must specify a project') + set task.project = rc.default.project +::: diff --git a/content/docs/design/sync.md b/content/docs/design/sync.md new file mode 100644 index 00000000..0133ac15 --- /dev/null +++ b/content/docs/design/sync.md @@ -0,0 +1,268 @@ +--- +title: "Taskwarrior - Taskserver Sync Algorithm" +--- + +[]{#algorithm} + +### Taskserver Sync Algorithm + +This document describes how task changes are merged by the Taskserver. It does +not describe [the protocol](/docs/design/protocol.html) used by the Taskserver. + +The Taskserver merges tasks from multiple sources, resulting in conflict- free +syncing of data. The algorithm used to achieve this is simple and effective, +paralleling what SCM systems do to perform a rebase. + +[]{#req} + +#### Requirements + +In this document, we adopt the convention discussed in Section 1.3.2 of +[RFC1122](https://tools.ietf.org/html/rfc1122#page-16) of using the capitalized +words MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, and OPTIONAL to define the +significance of each particular requirement specified in this document. + +In brief: \"MUST\" (or \"REQUIRED\") means that the item is an absolute +requirement of the specification; \"SHOULD\" (or \"RECOMMENDED\") means there +may exist valid reasons for ignoring this item, but the full implications should +be understood before doing so; and \"MAY\" (or \"OPTIONAL\") means that this +item is optional, and may be omitted without careful consideration. + +[]{#problem} + +#### Problem Definition + +The sync algorithm considers a single task, with multiple changes occurring in +two separate locations that must be resolved. The two locations are the local +machine and the server. This results in two parallel change sequences. + +Examples using multiple clients collapse down to the simple two-branch case +because the clients are merged serially. + +[]{#change_sequence} + +#### Change Sequence + +A sequence of changes to the same task is represented as: + + T0 --> T1 --> T2 + +Although all examples are of the two-branch variety, some involve trivial +branches. Going through these examples will illustrate the algorithm. First the +legend: + + T0 Represents the original task, the base. + T1 Represents the task with a non-trivial set of changes. + T2 Represents the task with further changes. + +[]{#deltas} + +#### Deltas + +The transition from T0 \--\> T1 can be seen as a transform applied to T0, +resulting in T1. That transform is the delta (d1) between T0 and T1, which is a +subtractive term: + + d1 = (T1 - T0) + +Therefore: + + T0 --> T1 = T0 + d1 + = T0 + (T1 - T0) + +This states that the transition from T0 to T1 is the application of a delta to +the original, T0, which results in T1. Applying this to the whole change +sequence yields: + + T0 --> T1 --> T2 = T0 + d1 + d2 + = T0 + (T1 - T0) + (T2 - T1) + +[]{#use_case_types} + +#### Use Case Classification + +Because clients sync requests are processed serially, there is no need to +consider the multiple client cases. This means there is only ever the case with +two parallel change sequences = the two branch case. + +[]{#two_branch} + +#### Two Branch Case + +The two branch case represents changes made to the same task in two locations, +resulting in two deltas that must be applied to the same base. + + T0 --> T1 + T0 --> T2 + +This reduces to a base with two deltas, but the order in which the deltas are +applied is important. For example: + + T0 + d1 + d2 =/= T0 + d2 + d1 + +The application of deltas is not commutative, except in the trivial case where +the two deltas are identical, or the deltas do not overlap. The deltas therefore +need to be applied in the correct sequence. Tasks have metadata that indicates +the last modified time, which dictates the sequence. Assuming d1 occurred before +d2, this neatly collapses down to a single branch sequence: + + T0 + d1 + d2 = T3 + +Note that the result in this case is T3, because it will be neither T1 nor T2, +unless the deltas are identical. + +[]{#two_branch_changes} + +#### Two Branch, Multiple Changes Case + +The two branch case can be complicated by multiple changes per branch: + + T0 --> T1 --> T3 --> T5 + T0 --> T2 --> T4 + +Note that the numbers were chosen to represent the order in which the changes +were made. First a list of deltas is generated: + + T0 --> T1 = d1 + T1 --> T3 = d3 + T3 --> T5 = d5 + T0 --> T2 = d2 + T0 --> T4 = d4 + + d1, d3, d5, d2, d4 + +Then the deltas are sorted by modified time: + + d1, d2, d3, d4, d5 + +Then epplied to the base, yielding T6: + + T0 + d1 + d2 + d3 + d4 +d5 = T6 + +[]{#ex_two_branch} + +#### Two Branch Case Example + +Suppose the base task looks like this: + + T0 project:ONE due:tomorrow priority:H +tag1 Original description + +The first branch looks like this: + + T1 project:TWO due:23rd priority:H +tag1 Original description + +The second branch looks like this: + + T2 project:ONE due:tomorrow priority:H +tag1 Modified description + +Delta d1 is: + + T0 project:ONE due:tomorrow priority:H +tag1 Original description + T1 project:TWO due:23rd priority:H +tag1 Original description + ---------------------------------------------------------------------- + d1 project:TWO due:23rd + +Delta d2 is: + + T0 project:ONE due:tomorrow priority:H +tag1 Original description + T2 project:ONE due:tomorrow priority:H +tag1 Modified description + ---------------------------------------------------------------------- + d2 Modified description + +If d1 occurred before d2, the result is: + + T3 = T0 + d1 + d2 + = T0 + (project:TWO due:23rd) + (Modified description) + + T3 = project:TWO due:23rd priority:H +tag1 Modified description + +[]{#use_cases} + +#### Use Cases + +A range of illustrated use cases, from the trivial to the complex will show the +algorithm in use. + +[]{#use_case_1} + +#### Use Case 1: New Local Task + +Initial state: + + Server: - + Client: T0 + +The server has no data, and so T0 is stored. The result is now: + + Server: T0 + Client: T0 + +[]{#use_case_2} + +#### Use Case 2: Local Change + +Initial state: + + Server: T0 + Client: T0 --> T1 + +The server resolves the change: + + T0 --> T1 = T0 + d1 + = T1 + +T1 is stored. The result is now: + + Server: T0 --> T1 + Client: T1 + +[]{#use_case_3} + +#### Use Case 3: Local and Remote Change + +Initial state: + + Server: T0 --> T1 + Client: T0 --> T2 + +This is the two branch case, and the deltas are generated: + + T0 --> T1 = T0 + d1 + T0 --> T2 = T0 + d2 + +The order of change is determine to be d1, d2, yielding T3: + + T3 = T0 + d1 + d2 + +T3 is stored on the server, and returned to the client. The result is now: + + Server: T0 --> T1 --> T2 --> T3 + Client: T3 + +[]{#use_case_4} + +#### Use Case 4: Multiple Local and Remote Changes + +Initial state: + + Server: T0 --> T1 --> T3 + Client: T0 --> T2 --> T4 + +This is the two branch case, and the deltas are generated: + + T0 --> T1 = T0 + d1 + T1 --> T3 = T0 + d3 + T0 --> T2 = T0 + d2 + T2 --> T4 = T0 + d4 + + d1, d3, d2, d4 + +The order of change is determine to be d1, d2, d3, d4, yielding T5: + + T5 = T0 + d1 + d2 + d3 + d4 + +T5 is stored on the server, and returned to the client. The result is now: + + Server: T0 --> T1 --> T2 --> T3 --> T4 --> T5 + Client: T5 +::: diff --git a/content/docs/design/task.md b/content/docs/design/task.md new file mode 100644 index 00000000..803c5b3b --- /dev/null +++ b/content/docs/design/task.md @@ -0,0 +1,554 @@ +--- +title: "Taskwarrior - Taskwarrior JSON Format" +--- + +[]{#json} + +### Taskwarrior JSON Format + +When Taskwarrior exchanges data, it uses [JSON](https://www.json.org/). This +document describes the structure and semantics for tasks exported from +Taskwarrior, imported to Taskwarrior, or synced with the Taskserver. + +Any client of the Taskserver will need to communicate task information. This +document describes the format of a single task. It does not describe the +communication and sync protocol between client and server. + +This document is subject to change. The data attributes are also subject to +change. + +[]{#req} + +#### Requirements + +In this document, we adopt the convention discussed in Section 1.3.2 of +[RFC1122](https://tools.ietf.org/html/rfc1122#page-16) of using the capitalized +words MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, and OPTIONAL to define the +significance of each particular requirement specified in this document. + +In brief: \"MUST\" (or \"REQUIRED\") means that the item is an absolute +requirement of the specification; \"SHOULD\" (or \"RECOMMENDED\") means there +may exist valid reasons for ignoring this item, but the full implications should +be understood before doing so; and \"MAY\" (or \"OPTIONAL\") means that this +item is optional, and may be omitted without careful consideration. + +[]{#general} + +#### General Format + +The format is JSON, specifically a JSON object as a single line of text, +terminated by a newline (U+000D). + +The JSON looks like this: + + {"description":"One two three","status":"pending", ... } + +While this is not a valid task (there are missing fields), the format is +illustrated. + +All attribute names are quoted with \" (U+0022). A name will always have a +corresponding value, and if a value is blank, then the name/value pair is +omitted from the line. Newline characters are not permitted within the value, +meaning that a task consists of a single line of text. + +All data is UTF8. + +[]{#types} + +#### Data Types + +There are five data types used in the task format. + +[]{#type_string} + +#### Data Type: String + +Strings may consist of any UTF8 encoded characters. + +[]{#type_fixedstring} + +#### Data Type: Fixed String + +A fixed string is one value from a set of acceptable values, such as a priority +level, where the values may only be \"\", \"L\", \"M\" or \"H\". + +[]{#type_uuid} + +#### Data Type: UUID + +A UUID is a 32-hex-character lower case string, formatted in this way: + + xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + +An example: + + 296d835e-8f85-4224-8f36-c612cad1b9f8 + +[]{#type_int} + +#### Data Type: Integer + +Integers are rendered in a simple fashion: + + 123 + +[]{#type_date} + +#### Data Type: Date + +Dates are rendered in ISO 8601 combined date and time in UTC format using the +template: + + YYYYMMDDTHHMMSSZ + +An example: + + 20120110T231200Z + +No other formats are supported. + +[]{#type_duration} + +#### Data Type: Duration + +Duration values represent a time period. They take the form: + + [[] ] + +Some examples include: + +- -3days +- annual +- 4hrs + +The supported units are: + +- annual +- biannual +- bimonthly +- biweekly +- biyearly +- daily +- days +- day +- d +- fortnight +- hours +- hour +- hrs +- hr +- h +- minutes +- mins +- min +- monthly +- months +- month +- mnths +- mths +- mth +- mos +- mo +- quarterly +- quarters +- qrtrs +- qtrs +- qtr +- q +- seconds +- secs +- sec +- s +- semiannual +- sennight +- weekdays +- weekly +- weeks +- week +- wks +- wk +- w +- yearly +- years +- year +- yrs +- yr +- y + +Note that some values lack precision, for example \"2q\" means two quarters, or +half a year. + +Note that not all combinations of and make sense, for example \"3annual\" makes +no sense, but evaluates to \"3years\". + +[]{#atts} + +#### The Attributes + +Here are the standard attributes that may comprise a task: + + Name Type + --------------- --------- + status String + uuid UUID + entry Date + description String + start Date + end Date + due Date + until Date + wait Date + modified Date + scheduled Date + recur String + mask String + imask Integer + parent UUID + project String + priority String + depends String + tags \* String + annotation \* String + ? + +\* Both tags and annotations are lists of strings and objects. + +Any UDA fields are assumed to be of type string. + +There are other forms, which are conditional upon the state of a task: + + Status Value Pending Deleted Completed Waiting Recurring Parent Recurring Child + -------------- --------- --------- ----------- --------- ------------------ ----------------- + status Reqd Reqd Reqd Reqd Reqd Reqd + uuid Reqd Reqd Reqd Reqd Reqd Reqd + entry Reqd Reqd Reqd Reqd Reqd Reqd + description Reqd Reqd Reqd Reqd Reqd Reqd + start Opt Opt Opt Opt Opt Opt + end Reqd Reqd + due Opt Opt Opt Opt Reqd Opt + until Opt Opt Opt Opt Opt Opt + scheduled Opt Opt Opt Opt Opt Opt + wait Reqd + recur Reqd Reqd + mask Intrn + imask Intrn + parent Reqd + annotation Opt Opt Opt Opt Opt Opt + project Opt Opt Opt Opt Opt Opt + tags Opt Opt Opt Opt Opt Opt + priority Opt Opt Opt Opt Opt Opt + depends Opt Opt Opt Opt Opt Opt + modified Intrn Intrn Intrn Intrn Intrn Intrn + UDA Opt Opt Opt Opt Opt Opt + +(Legend: Reqd = required, Opt = optional, Intrn = Internally generated) + +All tasks have four required fields. There are other states in which a task may +exist, and the requirements change. At a minimum, a valid task contains: + +- uuid +- status +- entry +- description + +*Deleted*\ +A deleted task MUST also have \"status\":\"deleted\", an \"end\" date and a +\"modified\" date. + +*Completed*\ +A completed task MUST also have \"status\":\"completed\", an \"end\" date and a +\"modified\" date. + +*Waiting*\ +A waiting task MUST also have \"status\":\"waiting\" and a \"wait\" date. The +task is hidden from the user, until that \"wait\" date has passed, whereupon the +status reverts to \"pending\", and the \"wait\" date is removed. + +*Recurring Parent*\ +When a recurring task is entered, it MUST have \"status\":\"recurring\", a +\"recur\" period and a \"due\" date. It MAY also have an \"until\" date. +Recurring parent tasks are hidden from the user. + +*Recurring Child*\ +A recurring child task is not created by the user, but is cloned from the +recurring parent task by the Taskserver. It may be modified by the user. On +completion, there is special handling to be done. See section 3.11. + +[]{#additional} + +#### Additional Attributes + +There MAY be other fields than those listed above in a task definition. Such +fields MUST be preserved intact by any client, which means that if a task is +downloaded that contains an unrecognized field, that field MUST not be modified, +and MUST continue to exist in the task.. + +User Defined Attributes (UDAs) are additional fields. + +[]{#details} + +#### Attribute Details + +The individual fields convey important information about a task, and in some +cases work only in collusion with other fields. All such details are listed +here. + +[]{#attr_status} + +#### Attribute: status + +The status field describes the state of the task, which may ONLY be one of these +literal strings: + + "status":"pending" + "status":"deleted" + "status":"completed" + "status":"waiting" + "status":"recurring" + +A pending task is a task that has not yet been completed or deleted. This is the +typical state for a task. + +A deleted task is one that has been removed from the pending state, and MUST +have an \"end\" field specified. Given the required \"entry\" and \"end\" field, +it can be determined how long the task was pending. + +A completed task is one that has been removed from the pending state by +completion, and MUST have an \"end\" field specified. Given the required +\"entry\" and \"end\" fields, it can be determine how long the task was pending. + +A waiting task is ostensibly a pending task that has been hidden from typical +view, and MUST have a \"wait\" field containing the date when the task is +automatically returned to the pending state. If a client sees a task that is in +the waiting state, and the \"wait\" field is earlier than the current date and +time, the client MUST remove the \"wait\" field and set the \"status\" field to +\"pending\". + +A recurring task is essentially a parent template task from which child tasks +are cloned. The parent remains hidden from view, and contains a \"mask\" field +that represents the recurrences. Each cloned child task has an \"imask\" field +that indexes into the parent \"mask\" field, as well as a \"parent\" field that +lists the UUID of the parent. + +[]{#attr_uuid} + +#### Attribute: uuid + +When a task is created, it MUST be assigned a new UUID by the client. Once +assigned, a UUID field MUST NOT be modified. UUID fields are permanent. + +[]{#attr_entry} + +#### Attribute: entry + +When a task is created, it MUST be assigned an \"entry\" date by the client. +This is the creation date of the task. + +[]{#attr_description} + +#### Attribute: description + +When a task is created, it MUST have a \"description\" field value, which +contains UTF8 characters. A \"description\" field may not contain newline +characters, but may contain other characters, properly escaped. See + for details. + +[]{#attr_start} + +#### Attribute: start + +To indicate that a task is being worked on, it MAY be assigned a \"start\" +field. Such a task is then considered Active. + +[]{#attr_end} + +#### Attribute: end + +When a task is deleted or completed, is MUST be assigned an \"end\" field. It is +not valid for a task to have an \"end\" field unless the status is also +\"completed\" or \"deleted\". If a completed task is restored to the \"pending\" +state, the \"end\" field is removed. + +[]{#attr_due} + +#### Attribute: due + +A task MAY have a \"due\" field, which indicates when the task should be +completed. + +[]{#attr_until} + +#### Attribute: until + +A recurring task MAY have an \"until\" field, which is the date after which no +more recurring tasks should be generated. At that time, the parent recurring +task is set to \"completed\". + +[]{#attr_wait} + +#### Attribute: wait + +A task MAY have a \"wait\" field date, in conjunction with a \"status\" of +\"waiting\". A waiting task is one that is not typically shown on reports until +it is past the wait date. + +An example of this is a birthday reminder. A task may be entered for a birthday +reminder in 10 months time, but can have a \"wait\" date 9 months from now, +which means the task remains hidden until 1 month before the due date. This +prevents long-term tasks from cluttering reports until they become relevant. + +[]{#attr_recur} + +#### Attribute: recur + +The \"recur\" field is for recurring tasks, and specifies the period between +child tasks, in the form of a duration value. The value is kept in the raw state +(such as \"3wks\") as a string, so that it may be evaluated each time it is +needed. + +[]{#attr_mask} + +#### Attribute: mask + +A parent recurring task has a \"mask\" field that is an array of child status +indicators. Suppose a task is created that is due every week for a month. The +\"mask\" field will look like: + + "----" + +This mask has four slots, indicating that there are four child tasks, and each +slot indicates, in this case, that the child tasks are pending (\"-\"). The +possible slot indicators are: + + ---- ----------- + \- Pending + \+ Completed + X Deleted + W Waiting + ---- ----------- + +Suppose the first three tasks has been completed, the mask would look like this: + + "+++-" + +If there were only three indicators in the mask: + + "+-+" + +This would indicate that the second task is pending, the first and third are +complete, and the fourth has not yet been generated. + +[]{#attr_imask} + +#### Attribute: imask + +Child recurring tasks have an \"imask\" field instead of a \"mask\" field like +their parent. The \"imask\" field is a zero-based integer offset into the +\"mask\" field of the parent. + +If a child task is completed, one of the changes that MUST occur is to look up +the parent task, and using \"imask\" set the \"mask\" of the parent to the +correct indicator. This prevents recurring tasks from being generated twice. + +[]{#attr_parent} + +#### Attribute: parent + +A recurring task instance MUST have a \"parent\" field, which is the UUID of the +task that has \"status\" of \"recurring\". This linkage between tasks, +established using \"parent\", \"mask\" and \"imask\" is used to track the need +to generate more recurring tasks. + +[]{#attr_annotation} + +#### Attribute: annotation\_\... + +Annotations are strings with timestamps. Each annotation itself has an \"entry\" +field and a \"description\" field, similar to the task itself. Annotations form +an array named \"annotations\". For example (lines broken for clarity): + + "annotations":[ + {"entry":"20120110T234212Z","description":"Remember to get the mail"}, + {"entry":"20120110T234559Z","description":"Pay the bills"} + ] + +[]{#attr_project} + +#### Attribute: project + +A project is a single string. For example: + + "project":"Personal Taxes" + +Note that projects receive special handling, so that when a \".\" (U+002E) is +used, it implies a hierarchy, which means the following two projects: + + "Home.Kitchen" + "Home.Garden" + +are both considered part of the \"Home\" project. + +[]{#attr_tags} + +#### Attribute: tags + +The \"tags\" field is an array of string, where each string is a single word +containing no spaces. For example: + + "tags":["home","garden"] + +[]{#attr_priority} + +#### Attribute: priority + +The \"priority\" field, if present, MAY contain one of the following strings: + + "priority":"H" + "priority":"M" + "priority":"L" + +These represent High, Medium and Low priorities. An absent priority field +indicates no priority. + +[]{#attr_depends} + +#### Attribute: depends + +The \"depends\" field is a string containing a comma-separated unique set of +UUIDs. If task 2 depends on task 1, then it is task 1 that must be completed +first. Task 1 is considered a \"blocking\" tasks, and task 2 is considered a +\"blocked\" task. For example: + + "depends":",, ..." + +Note that in a future version of this specification, this will be changed to a +JSON array of strings, like the \"tags\" field. + +[]{#attr_modified} + +#### Attribute: modified + +A task MUST have a \"modified\" field set if it is modified. This field is of +type \"date\", and is used as a reference when merging tasks. + +[]{#attr_scheduled} + +#### Attribute: scheduled + +A task MAY have a \"scheduled\" field, which indicates when the task should be +available to start. A task that has passed its \"scheduled\" data is said to be +\"ready\". + +[]{#udas} + +#### User Defined Attributes + +A User Defined Attribute (UDA) is a field that is defined via configuration. +Given that the configuration is not present in the JSON format of a task, any +fields that are not recognized are to be treated as UDAs. This means that if a +task contains a UDA, unless the meaning of it is understood, it MUST be +preserved. + +UDAs may have one of four types: string, numeric, date and duration. +::: + diff --git a/content/docs/design/workweek.md b/content/docs/design/workweek.md new file mode 100644 index 00000000..f4bbe081 --- /dev/null +++ b/content/docs/design/workweek.md @@ -0,0 +1,39 @@ +--- +title: "Taskwarrior - Work Week Support" +--- + +#### Work in Progress + +This design document is a work in progress, and subject to change. Once +finalized, the feature will be scheduled for an upcoming release. +::: + +[]{#current} + +### Work Week Support + +Taskwarrior supports the idea that a week starts on either a Sunday or a Monday, +as determined by configuration. This was added eight years ago, simply for +display purposes in the `calendar` report. Since then its use has propagated and +it influences the `sow` date reference.0 + +Further requests have been made to make this more flexible, so that the notion +of \'weekend\' can be defined. Furthermore, the idea that every week has a +weekend has also been questioned. + +It has become clear that a `weekstart` setting, and the notion of a weekend are +no longer useful. + +[]{#proposed} + +#### Proposed Support + +One option is to allow the user to completely define a work week in the +following way: + + workweek=1,2,3,4,5 + +With Sunday as day zero, this states that the work week is the typical Monday - +Friday. From this setting, the meaning of `soww` and `eoww` can be determined, +as well as `recur:weekday`. +::: diff --git a/content/docs/dom.md b/content/docs/dom.md new file mode 100644 index 00000000..fa5b0b5d --- /dev/null +++ b/content/docs/dom.md @@ -0,0 +1,232 @@ +--- +title: "Taskwarrior - DOM - Document Object Model" +--- + +--- +lang: en +title: 'Taskwarrior - DOM' +viewport: 'width=device-width, initial-scale=1' +--- + +### DOM - Document Object Model + +Taskwarrior has a Document Object Model, or DOM, which defines a way to +reference all the data managed by taskwarrior. You may be familiar with the DOM +implemented by web browsers that let you access details on a page +programmatically. For example: + + document.getElementById("myAnchor").href + +Taskwarrior allows the same kind of data access in a similar form, for example: + + 1.description + +This references the description text of task 1. There is a [`_get` helper +command](/docs/commands/_get.html) that queries data using a DOM reference. +Let\'s see it in action, by first creating a detailed task. + + $ task add Buy milk due:tomorrow +store project:Home pri:H + $ task 1 info + + Name Value + ------------- ------------------------------------------ + ID 1 + Description Buy milk + Status Pending + Project Home + Priority H + Entered 2014-09-28 21:53:59 (4 seconds) + Due 2014-09-29 00:00:00 + Last modified 2014-09-28 21:53:59 (4 seconds) + Tags store + UUID c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7 + Urgency 16.56 + project 1 * 1 = 1 + priority 1 * 6 = 6 + tags 0.8 * 1 = 0.8 + due 0.73 * 12 = 8.76 + +All the attributes of that task are available via DOM references. Here are some +examples: + + $ task _get 1.description + Buy milk + + $ task _get 1.uuid + c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7 + + $ task _get c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7.id + 1 + + $ task _get 1.due.year + 2014 + + $ task _get 1.due.julian + 272 + +[]{#supported} + +#### Supported References + +`system.version` +::: +::: +::: +::: + +The version of taskwarrior, for example: + + $ task _get system.version + 2.4.0 + +`system.os` + +The operating system, for example: + + $ task _get system.os + FreeBSD + +`rc.` + +Any configuration value default, with any overrides from the `.taskrc` applied, +then with any command line overrides applied last. For example: + + $ task _get rc.data.location + ~/.task + +`` + +Any task attribute. Note that no task ID or UUID is specified, so this variant +is only useful on the command line like this: + + $ task add Pay rent due:eom wait:'due - 3days' + +Note that \'due\' is a DOM reference from earlier on the command line. + +`.` + +Any attribute of the specified task ID. For example: + + $ task add Fix the leak depends:3 scheduled:3.due + +This makes the new task dependent on task 3, and scheduled on the due date of +task 3. Note that \'3.due\' is a DOM reference of a specific task. + +`.` + +Any attribute of the specified task UUID, as above. + +Any attribute that is of type `date` can be directly accessed as a date, or it +can be accessed by the elements of that date. For example: + ++---------------------------------------+---------------------------------------+ +| `.year` | [2.4.0]{.label .label-success} The | +| | year, for example: | +| | | +| | $ task _get 1.due.year | +| | 2014 | ++---------------------------------------+---------------------------------------+ +| `.month` | [2.4.0]{.label .label-success} The | +| | month, for example: | +| | | +| | $ task _get 1.due.month | +| | 9 | ++---------------------------------------+---------------------------------------+ +| `.day` | [2.4.0]{.label .label-success} The | +| | day of the month, for example: | +| | | +| | $ task _get 1.due.day | +| | 29 | ++---------------------------------------+---------------------------------------+ +| `.week` | [2.4.0]{.label .label-success} The | +| | week number of the date, for example: | +| | | +| | $ task _get 1.due.week | +| | 40 | ++---------------------------------------+---------------------------------------+ +| `.weekday` | [2.4.0]{.label .label-success} The | +| | numbered weekday of the date, where 0 | +| | is Sunday and 6 is Saturday. For | +| | example: | +| | | +| | $ task _get 1.due.weekday | +| | 1 | ++---------------------------------------+---------------------------------------+ +| `.julian` | [2.4.0]{.label .label-success} The | +| | Julian day of the date, which is the | +| | day number of the date in the year. | +| | For example, January 1st is 1, | +| | February 10th is 41. For example: | +| | | +| | $ task _get 1.due.julian | +| | 272 | ++---------------------------------------+---------------------------------------+ +| `.hour` | [2.4.0]{.label .label-success} The | +| | hour of the day, for example: | +| | | +| | $ task _get 1.due.hour | +| | 0 | ++---------------------------------------+---------------------------------------+ +| `.minute` | [2.4.0]{.label .label-success} The | +| | minute of the hour, for example: | +| | | +| | $ task _get 1.due.minute | +| | 0 | ++---------------------------------------+---------------------------------------+ +| `.second` | [2.4.0]{.label .label-success} The | +| | seconds of the minute, for example: | +| | | +| | $ task _get 1.due.second | +| | 0 | ++---------------------------------------+---------------------------------------+ + +Tags can be accessed as a single item as an ``, of the individual +tags can be accessed: + ++---------------------------------------+---------------------------------------+ +| `tags.` | [2.4.0]{.label .label-success} Direct | +| | access, per-tag, for example: | +| | | +| | $ task _get 1.tag.home | +| | home | +| | | +| | If the tag is present, it is shown, | +| | otherwise the result is blank, and | +| | Taskwarrior exits with a non-zero | +| | status. | +| | | +| | $ task _get 1.tag.DUE | +| | DUE | +| | $ task _get 1.tag.OVERDUE | +| | | +| | Workѕ for virtual tags too, in the | +| | same manner. | ++---------------------------------------+---------------------------------------+ + +Annotations are compound data structures, with two elements, which are +`description` and `entry`. Annotations are accessed by an ordinal. + ++---------------------------------------+---------------------------------------+ +| `annotations..description` | [2.4.0]{.label .label-success} The | +| | description of the Nth annotation, | +| | for example: | +| | | +| | $ | +| | task _get 1.annotations.0.description | ++---------------------------------------+---------------------------------------+ +| `annotations..entry` | [2.4.0]{.label .label-success} The | +| | creation timestamp of the Nth | +| | annotation, for example: | +| | | +| | $ task _get 1.annotations.0.entry | +| | | +| | Note that because `entry` is of type | +| | `date`, the individual elements can | +| | be addressed, as above, for example: | +| | | +| | $ | +| | task _get 1.annotations.0.entry.year | +| | 2014 | ++---------------------------------------+---------------------------------------+ + +UDA values can be accessed in the same manner. diff --git a/content/docs/durations.md b/content/docs/durations.md new file mode 100644 index 00000000..8abc4402 --- /dev/null +++ b/content/docs/durations.md @@ -0,0 +1,223 @@ +--- +title: "Taskwarrior - Durations" +--- + +### Durations + +Taskwarrior supports duration values. In the core, durations are used directly +in one place - the `recur` attribute, used for recurring tasks. For example, +here is a recurring task that recurs every monday: + + $ task add Take out the trash due:monday recur:weekly + +The value `monday` is interpreted as \'next monday\', and the value `weekly` is +interpreted as a 7-day duration. + +The other place where durations are supported directly is with [UDA +attributes](/docs/udas.html) of type `duration`. + +[]{#relative} + +#### Relative Date + +There is indirect support for durations everywhere that a date value is +expected. For example, here is a task due in two days: + + $ task add Birthday party due:2days + +Whenever Taskwarrior expects a date (due date in this example) but instead finds +a duration, it is interpreted as a relative duration added to the current +date/time, in this example `now + 2days`. + +[]{#dur} + +#### Duration Format + + ------------------------------------------------------------------------------- + Example Meaning + --------------------------------------- --------------------------------------- + `5 seconds`\ Five seconds. + `5 second`\ + `5 secs`\ + `5 sec`\ + `5 s`\ + `5seconds`\ + `5second`\ + `5secs`\ + `5sec`\ + `5s`\ + + `second`\ One second. Missing ordinal implies one + `sec`\ second. + + `5 minutes`\ Five minutes. + `5 minute`\ + `5 mins`\ + `5 min`\ + `5minutes`\ + `5minute`\ + `5mins`\ + `5min`\ + + `minute`\ One minute. Missing ordinal implies one + `min`\ minute. + + `3 hours`\ Three hours. + `3 hour`\ + `3 hrs`\ + `3 hr`\ + `3 h`\ + `3hours`\ + `3hour`\ + `3hrs`\ + `3hr`\ + `3h`\ + + `hour`\ One hour. Missing ordinal implies one + `hr`\ hour. + + `2 days`\ Two days. + `2 day`\ + `2 d`\ + `2days`\ + `2day`\ + `2d`\ + + `daily`\ One day. Missing ordinal implies one + `day`\ day. + + `3 weeks`\ Three weeks. + `3 week`\ + `3 wks`\ + `3 wk`\ + `3 w`\ + `3weeks`\ + `3week`\ + `3wks`\ + `3wk`\ + `3w`\ + + `weekly`\ One week. Missing ordinal implies one + `week`\ week. + `wk`\ + + `weekdays`\ Every weekday, Monday to Friday. + + `2 fortnight`\ Twenty eight days. + `2 sennight`\ + `2fortnight`\ + `2sennight`\ + + `biweekly`\ Fourteen days. Missing ordinal implies + `fortnight`\ fourteen days. + `sennight`\ + + `5 months`\ Five months. + `5 month`\ + `5 mnths`\ + `5 mths`\ + `5 mth`\ + `5 mo`\ + `5 m`\ + `5months`\ + `5month`\ + `5mnths`\ + `5mths`\ + `5mth`\ + `5mo`\ + `5m`\ + + `monthly`\ 30 days. Missing ordinal implies one + `month`\ month. This is an imprecise value. + `mth`\ + `mo`\ + + `bimonthly`\ Sixty one days. Missing ordinal implies + two months. This is an imprecise value. + + `1 quarterly`\ Ninety one days. + `1 quarters`\ + `1 quarter`\ + `1 qrtrs`\ + `1 qrtr`\ + `1 qtr`\ + `1 q`\ + `1quarterly`\ + `1quarters`\ + `1quarter`\ + `1qrtrs`\ + `1qrtr`\ + `1qtr`\ + `1q`\ + + `quarterly`\ Ninety one days. Missing ordinal + `quarter`\ implies three months. This is an + `qrtr`\ imprecise value. + `qtr`\ + + `semiannual`\ One hundred and eighty three days. + Missing ordinal implies six months. + This is an imprecise value. + + `1 years`\ One year. + `1 year`\ + `1 yrs`\ + `1 yr`\ + `1 y`\ + `1years`\ + `1year`\ + `1yrs`\ + `1yr`\ + `1y`\ + + `annual`\ Three hundred and sixty five days. + `yearly`\ Missing ordinal implies one year. This + `year`\ is an imprecise value. + `yr`\ + + `biannual`\ Seven hundred and thirty days. Missing + `biyearly`\ ordinal implies two years. This is an + imprecise value. + ------------------------------------------------------------------------------- + +[]{#iso} + +#### ISO-8601 Format + +ISO-8601 defines a duration format which is supported by Taskwarrior. The format +looks like this: + + P[nY][nM][nD][T[nH][nM][nS]] + +The format always begins with a \'P\' (period). The date elements +(`[nY][nM][nD]`) are optional, as are the time elements (`[nH][nM][nS]`), but +there must be one element specified. + +Even though the month and minute values use the character \'M\', there is no +ambiguity because of the placement of the character \'T\' which delineates date +from time elements. + +Here is a list of examples: + + Example Meaning + --------------------- -------------------------------------------------------------------------------------------------------------- + `P3D` Three days. + `P1000D` One thousand days. + `P2M` Two months. This is an imprecise value. + `P2M3D` Two months and three days. This is an imprecise value. + `P1Y` One year. This is an imprecise value. + `P1Y3D` One year and three days. This is an imprecise value. + `P1Y2M` One year and two months. This is an imprecise value. + `P1Y2M3D` One year, two months and three days. This is an imprecise value. + `PT50S` Fifty seconds. + `PT40M` Forty minutes. + `PT40M50S` Forty minutes and fifty seconds. + `PT12H` Twelve hours. + `PT12H50S` Twelve hours and fifty seconds. + `PT12H40M` Twelve hours and forty minutes. + `PT12H40M50S` Twelve hours, forty minutes and fifty seconds. + `P1Y2M3DT12H40M50S` One year, two months, three days, twelve hours, forty minutes and fifty seconds. This is an imprecise value. + +Precise values include days, hours, minutes, seconds. Year and month are not +precise because they vary, and can only be made precise if the duration is +anchored to a known date. diff --git a/content/docs/escapes.md b/content/docs/escapes.md new file mode 100644 index 00000000..329816ad --- /dev/null +++ b/content/docs/escapes.md @@ -0,0 +1,92 @@ +--- +title: "Taskwarrior - Escaping Command Line Characters" +draft: false +--- + +### Escaping Command Line Characters + +Certain characters are interpreted by the shell. For example, the `&`. If you +wish to include the `&` in a task description, you need to escape it, so the +shell doesn\'t interpret it. For example: + + $ task add Buy bread & milk + +This command is an error because of the `&`. The shell will consider this to be +two commands: + + $ task add Buy bread & + $ milk + +The shell treats the `&` character as an indicator that the command is complete +and should be run in the background. Then the shell considers \"milk\" to be a +command all by itself, which it is not. One way to get around this is to +individually escape the `&` character: + + $ task add Buy bread \& milk + +Another is to quote the entire description, with either `'` or `"` characters: + + $ task add "Buy bread & milk" + +If you wish to use quotes in the task description itself, you can individually +escape them: + + $ task add Don\'t forget eggs + +In other situations, the shell sees spaces and breaks up arguments. For example, +this command: + + $ task 123 modify /from this/to that/ + +is broken up into several arguments, which is corrected with quotes: + + $ task 123 modify "/from this/to that/" + +[]{#projects} + +#### Projects with Spaces + +Suppose you want to use a project name that contains spaces. This requires +escaped quotes: + + $ task add Buy potatoes project:\'Food and Groceries\' + +The reason for this is that when the shell sees quotes, it preserves the +contents between the quotes as a single argument, but does not preserve the +quotes themselves. By adding the backslash to the quotes, you guarantee that +taskwarrior gets to see the quotes. This is an unfortunate situation, but a +common one for programs that accept a wide variety of command line characters. + +[]{#noparse} + +#### Shutting Off Parsing + +There is a special command line argument which is two hyphens `--`, and when +this is used, special command line handling is disabled from that point onwards, +which means all subsequent arguments are considered part of a task description: + + $ task add -- project:Home needs scheduling + +[]{#silver_bullet} + +#### When All Else Fails\... + +There is a solution. We don\'t like it, but it exists for difficult cases. The +[`edit` command](#) is a way to bypass all the shell problems. Simply do this: + + $ task add placeholder + $ task 1 edit + +The [`edit` command](#) drops you into a text editor where you can compose +arbitrarily complex task descriptions and annotations without the need to +consider quoting and escapes. + +[]{#characters} + +#### Special Shell Characters + +There are many characters that are considered special by the shell, and may need +to be escaped in order that they may be used on the taskwarrior command line. +Those characters include: + + $ ! ' " ( ) ; \ ` * ? { } [ ] < > | & % # ~ @ diff --git a/content/docs/examples.md b/content/docs/examples.md new file mode 100644 index 00000000..c9b08d7e --- /dev/null +++ b/content/docs/examples.md @@ -0,0 +1,363 @@ +--- +title: "Taskwarrior - Usage Examples" +--- + +### Usage Examples + +Here are some Taskwarrior command line examples that cover a variety of topics. +While this is not a reference for the features and command line, perhaps you +will learn something new\... + +Some of the example are deliberately chosen because there is more than one +solution, in which case all are presented, for comparison. + +[]{#30sec} + +#### 30 Second Tutorial + ++---------------------------------------+---------------------------------------+ +| Basic usage from the [30-Second | $ task | +| Tutorial](/docs/30second.html). | add Read Taskwarrior documents later | +| | $ task add priority:H Pay bills | +| | $ task next | +| | $ task 2 done | +| | $ task | +| | $ task 1 delete | ++---------------------------------------+---------------------------------------+ + +[]{#create} + +#### Creating Tasks + +Creating tasks is straightforward, but here are some tips: + ++---------------------------------------+---------------------------------------+ +| Create a task with due date. | $ task add Pay the rent due:eom | ++---------------------------------------+---------------------------------------+ +| Create a task, then add a due date | $ task add Pay the rent | +| later. | Created task 12 | +| | $ task 12 modify due:eom | ++---------------------------------------+---------------------------------------+ +| Remove a due date from a task. | $ task 12 modify due: | ++---------------------------------------+---------------------------------------+ +| Create a task with a multi-line | $ task add "Five syllables here | +| description. | Seven more syllables there | +| | Are you happy now?" | ++---------------------------------------+---------------------------------------+ + +[]{#filters} + +#### Filters + +A filter is how you restrict the tasks to just those that you want to see or +modify. + ++---------------------------------------+---------------------------------------+ +| Show tasks I added in the last 4 | | +| days. | $ task entry.after:today-4days list | ++---------------------------------------+---------------------------------------+ +| Show tasks I added yesterday. | $ task entry:yesterday list | ++---------------------------------------+---------------------------------------+ +| Show tasks I added in the last hour. | $ task entry.after:now-1hour list | ++---------------------------------------+---------------------------------------+ +| Show tasks I completed between a date | $ task end.after:2015-05-0 | +| range. | 1 and end.before:2015-05-31 completed | ++---------------------------------------+---------------------------------------+ +| Show tasks I completed in the last | | +| week. | $ task end.after:today-1wk completed | ++---------------------------------------+---------------------------------------+ +| Show tasks in `This` project or | $ t | +| `That` project. | ask project:This or project:That list | ++---------------------------------------+---------------------------------------+ +| More complex algebraic filters. | $ task project:This an | +| | d \( priority:H or priority:M \) list | ++---------------------------------------+---------------------------------------+ +| Search for `pattern` in description | $ task | +| and annotations: | /pattern/ list | +| | $ task rc.sea | +| | rch.case.sensitive:yes /pattern/ list | +| | $ task rc.sea | +| | rch.case.sensitive:no /pattern/ list | ++---------------------------------------+---------------------------------------+ +| Search for tasks with no project. | $ task project: list | ++---------------------------------------+---------------------------------------+ + +[]{#reports} + +#### Reports + +Reports are simply a colllection of configuration settings that specify display +attributes, sorting, filter and a name. + ++---------------------------------------+---------------------------------------+ +| Temporarily changing the sorting of a | $ task r | +| report. | c.report.next.sort=due-,urgency- next | ++---------------------------------------+---------------------------------------+ + +[]{#projects} + +#### Projects + +A single project may be assigned to a task, and that project may be multiple +words. + ++---------------------------------------+---------------------------------------+ +| Assign a long project name. | $ task add Ra | +| | ke the leaves project:'Home & Garden' | ++---------------------------------------+---------------------------------------+ +| Moving all tasks to a new project. | $ task p | +| | roject:OLDNAME modify project:NEWNAME | ++---------------------------------------+---------------------------------------+ +| Moving all pending tasks to a new | $ task project:OLDNAME and | +| project. | status:pending modify project:NEWNAME | ++---------------------------------------+---------------------------------------+ +| Using a project hierarchy. | $ task add | +| | project:Home.Kitchen Clean the floor | +| | $ task add project:H | +| | ome.Kitchen Replace broken light bulb | +| | $ task ad | +| | d project:Home.Garden Plant the bulbs | +| | | +| | $ task project:Home.Kitchen count | +| | 2 | +| | | +| | $ task project:Home.Garden count | +| | 1 | +| | | +| | $ task project:Home count | +| | 3 | ++---------------------------------------+---------------------------------------+ +| What projects are currently used? | $ task projects | +| | $ task _projects | ++---------------------------------------+---------------------------------------+ +| What are all the projects I have ever | $ | +| used? | task rc.list.all.projects=1 projects | +| | $ | +| | task rc.list.all.projects=1 _projects | +| | $ task _unique projects | ++---------------------------------------+---------------------------------------+ + +[]{#tags} + +#### Tags + +Tags are simply one-word alpha-numeric labels, and a task may have any number of +them. + ++---------------------------------------+---------------------------------------+ +| List tasks that have a specific tag. | $ task +home list | ++---------------------------------------+---------------------------------------+ +| List tasks that do not have a | $ task -home list | +| specific tag. | | ++---------------------------------------+---------------------------------------+ +| List tasks that have any tags. | $ task tags.any: list | +| | $ task +TAGGED list | ++---------------------------------------+---------------------------------------+ +| List tasks that have no tags. | $ task tags.none: list | ++---------------------------------------+---------------------------------------+ +| List tasks that have two specific | $ task +this +that list | +| tags. | $ task +this and +that list | ++---------------------------------------+---------------------------------------+ +| List tasks that have either of two | $ task +this or +that list | +| specific tags. | | ++---------------------------------------+---------------------------------------+ +| List tasks that have just one of two | $ task +this xor +that list | +| specific tags. | | ++---------------------------------------+---------------------------------------+ +| What tags am I currently using? | $ task tags | ++---------------------------------------+---------------------------------------+ +| What are all the tags I have ever | $ task rc.list.all.tags=1 tags | +| used? | $ task _tags | ++---------------------------------------+---------------------------------------+ + +[]{#specialtags} + +#### Special Tags + +A special tag is one with a specific name, that can influence behavior. + ++---------------------------------------+---------------------------------------+ +| Modify a task to boost it\'s urgency, | $ task 1 modify +next | +| and probably cause it to show up on | | +| the `next` report. | | ++---------------------------------------+---------------------------------------+ + +[]{#virtualtags} + +#### Virtual Tags + +A virtual tag is a tag that doesn\'t actually exist, but the tag filter syntax +is used to simulate the tag, providing a very convenient shortcut. After all, +composing a filter to match the tasks due today is not straightforward. + ++---------------------------------------+---------------------------------------+ +| List tasks due today. | $ task due.after:y | +| | esterday and due.before:tomorrow list | +| | $ task +DUETODAY list | ++---------------------------------------+---------------------------------------+ +| List tasks that are due, but not | $ task +DUE -DUETODAY list | +| today. | | ++---------------------------------------+---------------------------------------+ +| List tasks that are due this week. | $ task +WEEK list | ++---------------------------------------+---------------------------------------+ +| List task that are overdue. | $ task +OVERDUE list | ++---------------------------------------+---------------------------------------+ +| What virtual tags are present for | $ task 1 info | +| this task? | | ++---------------------------------------+---------------------------------------+ + +[]{#recur} + +#### Recurring Tasks + +Recurring tasks are tasks that you need to do again and again. + ++---------------------------------------+---------------------------------------+ +| I want to make a task that is due at | $ task add Do the th | +| 9:00am every Monday, starting this | ing due:2015-06-08T09:00 recur:weekly | +| coming Monday. | | ++---------------------------------------+---------------------------------------+ +| I want a reminder to pay the rent | $ task add Pay rent | +| every month, but only for a year. | due:28th recur:monthly until:now+1yr | ++---------------------------------------+---------------------------------------+ + +[]{#pri} + +#### Priority + +Priority is now a [User Defined Attribute](/docs/udas.html) since version 2.4.3, +and as such can be configured. + ++---------------------------------------+---------------------------------------+ +| Make priority `L` sort lower than no | $ task | +| priority. | config -- uda.priority.values H,M,,L | ++---------------------------------------+---------------------------------------+ +| I need more priority values for my | $ task config -- uda.pr | +| workflow. | iority.values OMG,DoIt,Meh,Phfh,Nope, | ++---------------------------------------+---------------------------------------+ +| How do I remove the priority from a | $ task 1 modify priority: | +| task? | | ++---------------------------------------+---------------------------------------+ + +[]{#color} + +#### Color + ++---------------------------------------+---------------------------------------+ +| I\'m using a color theme, but I | $ task color | +| don\'t see any colors. This is | $ task color legend | +| usually because your tasks do not | | +| contain due dates, priorities etc. | | +| Prove color is working with these | | +| commands. | | ++---------------------------------------+---------------------------------------+ +| When task output goes to a file or | $ task rc._forcecolor:on rc. | +| pipe, all color is lost. Force color | defaultwidth:120 rc.detection:off ... | +| with: | | ++---------------------------------------+---------------------------------------+ + +[]{#dom} + +#### DOM + +The Taskwarrior DOM is an addressing mechanism to provide access to all stored +data. It can be used in your scripts, or when manipulating tasks at the command +line. + ++---------------------------------------+---------------------------------------+ +| Get just the description for task 12. | $ task _get 12.description | +| | Rake the leaves | ++---------------------------------------+---------------------------------------+ +| Show the creation timestamp, and last | | +| modification date for task 12. | $ task _get 12.entry 12.modification | +| | 20 | +| | 10-04-04T01:02:31 2014-08-24T13:31:43 | ++---------------------------------------+---------------------------------------+ +| Get the dimensions of my terminal | $ t | +| window. | ask _get context.width context.height | ++---------------------------------------+---------------------------------------+ +| Add a task, and set the wait date to | $ task ad | +| 4 days before the due date. | d Pay the rent due:eom wait:due-4days | ++---------------------------------------+---------------------------------------+ +| Add a task, and use the same due date | $ task | +| as task 12. | add Buy wine for the party due:12.due | ++---------------------------------------+---------------------------------------+ +| Get the week number on which task 12 | $ task _get 12.due.week | +| due. | | ++---------------------------------------+---------------------------------------+ +| Get the columns used in the next | | +| report. | $ task _get rc.report.next.columns | +| | $ task show report.next.columns | ++---------------------------------------+---------------------------------------+ + +[]{#config} + +#### Configuration + +Although you can interactively edit your `.taskrc` file using any text editor, +there is also a command for doing this. Furthermore you can temporarily override +these settings on the command line. + ++---------------------------------------+---------------------------------------+ +| Set the `default.command` to a | | +| different report. | $ task config default.command long | ++---------------------------------------+---------------------------------------+ +| Restore the `default.command` to its | $ task config default.command | +| original setting. | | ++---------------------------------------+---------------------------------------+ +| Set the `default.command` to a blank | $ task config default.command '' | +| value. | | ++---------------------------------------+---------------------------------------+ +| Temporarily override default.command. | $ task rc.default.command:long | ++---------------------------------------+---------------------------------------+ +| Show sort order of all reports. | | +| | $ task show | grep report | grep sort | ++---------------------------------------+---------------------------------------+ + +[]{#misc} + +#### Miscellaneous + +Script writers often need access to assorted data, and it can all be obtained, +but sometimes through odd mechanisms\... + ++---------------------------------------+---------------------------------------+ +| What is the most recent task ID? | $ task newest rc.ve | +| | rbose=nothing limit:1 | cut -f1 -d' ' | +| | $ task rc.verbo | +| | se=nothing rc.report.foo.columns:id \ | +| | | +| | rc.report.foo.sort:id- foo limit:1 | ++---------------------------------------+---------------------------------------+ +| What is the minimum necessary data | $ echo '{"descri | +| for a task? | ption":"A new task"}' | task import - | +| | $ task add A new task | ++---------------------------------------+---------------------------------------+ + +[]{#trouble} + +#### Troubleshooting + +Taskwarrior has some built-in functionality to help you get past obstacles. + ++---------------------------------------+---------------------------------------+ +| Show the runtime diagnostics, to see | $ task diagnostics | +| if anything is wrong. | | ++---------------------------------------+---------------------------------------+ +| Determine which version of GnuTLS is | $ task diagnostics | grep gnutls | +| used by Taskwarrior. | | ++---------------------------------------+---------------------------------------+ +| Just let me brute-force change a | $ task 12 edit | +| task. Using Vim. | $ EDITOR=vim task 12 edit | ++---------------------------------------+---------------------------------------+ +| I can\'t list my completed tasks, | | +| because the `list` report has a | $ task rc.report.list.filter: list | +| filter that shows only pending tasks. | $ task all | ++---------------------------------------+---------------------------------------+ +| Do I have the latest released | $ curl https:/ | +| version? | /gothenburgbitfactory.org/latest/task | +| | 2.5.3 | +| | $ task --version | +| | 2.5.3 | ++---------------------------------------+---------------------------------------+ +::: diff --git a/content/docs/features.md b/content/docs/features.md new file mode 100644 index 00000000..a3e3d4f5 --- /dev/null +++ b/content/docs/features.md @@ -0,0 +1,97 @@ +--- +title: "Taskwarrior - How to Request a Feature" +--- + +[]{#request} + +### How to Request a Feature + +We encourage you to request features. + +You can submit a feature request using our [issue tracking +system](https://github.com/GothenburgBitFactory/taskwarrior/issues). Simply +create an account, create an issue, and set the type to either \'improvement\' +or \'feature\', at your discretion. But there is a little more to it than that. +After all, wouldn\'t you like to see your request implemented? + +[]{#good} + +#### What Makes a Good Feature Request? + +Requesting a feature is easy, but you must remember that it doesn\'t mean it +will get done. It may be a simple or vague request. It may be a complex request +that needs some analysis, and we will want to discuss it first. Sometimes we +even go so far as to write up an RFC before doing any work. Here are some tips +for making a good feature request: + +- Describe a compelling feature, and make us really *want* it. What we find + most convincing is a statement that illustrates what having the new feature + would mean, or would enable. What new things could you do if you had this + feature? How would you be more effective at managing tasks with this + feature? +- Describe how the feature might interact with existing features. We prefer it + when a new feature is more than simply storing a new piece of data, for + later retrieval - we have [UDAs](/docs/udas.html) for that. +- Describe any new reports that may be needed. +- Describe who might benefit from this feature. +- Describe a feature that doesn\'t impose a cost on users that choose not to + use it. We want the basic usage (add, list, done) to remain simple and + effective. + +One thing to bear in mind is that we have a long term goal of simplifying the +way we manage tasks, simplifying Taskwarrior, and improving consistency. + +[]{#avoid} + +#### Things to Avoid + +- If your suggestion affects basic usage (add, list, done) then it will not be + implemented. +- Don\'t bother inventing syntax, or coming up with an unused character on + your keyboard. We would much rather you put your effort into thinking about + the feature and the benefits. Syntax is our problem. Focus on making others + wonder how they could possibly live without the feature. +- Don\'t bother suggesting features that lead Taskwarrior away from its + intended purpose - managing tasks. We have no intention of adding + time-tracking to the Taskwarrior core. +- If you have a suggestion that can be implemented as a hook script, or + add-on, please do that instead. If the result is compelling enough, we may + want to migrate the functionality in-core, but it\'s not likely. +- Don\'t tell us how easy something would be, or how quickly you could add it. + Ease of implementation has nothing to do with whether an idea is good. + Instead, convince everyone that the idea is great. + +::: {.row} +[]{#examples} + +::: {.callout .callout-info} +#### A Good Example + +I think dependencies would be a great feature, because it would help me organize +tasks and know which ones I need to work on first. It would also tell me which +ones I cannot work on now. Tasks that are depended upon could affect the +\'next\' report, because those tasks need to be done first. Ideally a task could +depend on multiple other tasks. I would need to both add and remove a +dependency. Dependencies are a commonly understood concept, and so would be +useful to many users. +::: +::: + +::: {.row} +::: {.callout .callout-info} +#### Another Good Example + +I should be allowed to use \'status\' field in a report. It doesn\'t make sense +to withhold just this one field. For the sake of consistency, please add this as +a reportable, sortable field. +::: +::: + +::: {.row} +::: {.callout .callout-danger} +#### A Bad Example + +Why can\'t we just make the @ character mean \.....? How hard can that be? +::: +::: +::: diff --git a/content/docs/filter.md b/content/docs/filter.md new file mode 100644 index 00000000..c0cd3b23 --- /dev/null +++ b/content/docs/filter.md @@ -0,0 +1,178 @@ +--- +title: "Taskwarrior - Filters" +--- + +[]{#filters} + +### Filters + +A filter is a set of command line arguments that specify a set of tasks and +filters can range from being simple to very complex. The simplest filter is an +empty filter, and we can illustrate this with the `count`. + + $ task count + 100 + +These 100 tasks are the tasks, pending and completed, which represent are all +the tasks known to Taskwarrior. Any command that accepts a filter also accepts +no filter, as shown above. Now we introduce a filter with one term. + + $ task status:pending count + 38 + +This is an example of the `name : value` form for specifying attribute values. +This filter shows that there are 38 pending tasks, and therefore 62 that are not +pending in some way. This form of filter also works for other attributes: + + $ task project:Home count + 19 + +There are 19 tasks in the \'Home\' project. + +The `value` parameter can be left empty in order to match only the items that do +not have a value of the relevant kind assigned to them. For example, you can +count the tasks that are not assigned to any project, like this: + + $ task project: count + 81 + +In this example, we can see that the tasks not assigned \'Home\' project have +not yet been assigned to any project at all. + +Taskwarrior has other filters besides `name : value` filters. Here are two +examples, filtering on the presence and absence of a tag. + + $ task +work count + 14 + $ task -work count + 86 + +This shows us that 14 tasks have the \'work\' tag, and 86 do not have the tag. +To search for a word in the description or annotation: + + $ task /m..ting/ count + 3 + +Here we see that 3 tasks have the word \'m..ting\' in the description. This is a +regular expression, although it can also be just a simple word. + +This assumes you have enabled regular expression support, using the `rc.regex` +configuration setting. + +[]{#complex} + +#### Complex Filters + +Filters gain complexity by adding more filter terms and logic. Suppose we want +to see the number of tasks that have the \'Home\' project, and do not have the +\'work\' tag. Simply put both terms on the command line. + + $ task project:Home -work count + 18 + +The two terms in the filter are both applied to the set of all tasks, or in +other words, a task must have both the \'Home\' project and not have the +\'work\' tag to be counted. + +When a filter contains multiple terms like this, they are treated as a logical +conjunction, which is to say that both terms must match for a task to be +selected by the filter. If there were three terms in the filter, then all three +must match. + +This assumed conjunction is another command line syntax shortcut. The long form +of this command line is: + + $ task project:Home and -work count + 18 + +See the `and` operator between the filter terms? That is assumed to be there if +not specfically stated. The unstated implication is that the disjunction +(\'or\') is also supported. + + $ task project:Home or -work count + 90 + +This example asks how many tasks are part of the \'Home\' project, or do not +have the \'work\' tag - either is a match. + +[]{#prec} + +#### Precedence + +It was mentioned earlier that the simplest filter was an empty filter, such as +in use by the `count` command. Now we shall consider the `ls` report, which has +a filter of: + + $ task show report.ls.filter + + Config Variable Value + ---------------- -------------- + report.ls.filter status:pending + +This report filter is combined with the command line filter that you specify: + + $ task project:Home ls + +This yields a combined filter of: + + status:pending project:Home + +Which has an implicit conjunction: + + status:pending and project:Home + +Now suppose we wanted to use a disjunction filter with the `ls` command: + + $ task project:Home or project:Garden list + +This is interpreted as: + + status:pending and project:Home or project:Garden + +Do you see the precedence problem? The intended filter is this: + + status:pending and (project:Home or project:Garden) + +which includes the parentheses to group the disjunction. Going back to the +original filter, we now know that it needs this form: + + $ task (project:Home or project:Garden) list + ... + +Except now we have one more problem - those parentheses have special meaning to +the shell, and must be escaped in one of the following ways: + + $ task \(project:Home or project:Garden\) list + ... + $ task '(project:Home or project:Garden)' list + ... + $ task "(project:Home or project:Garden)" list + +Note that there are many characters used by the taskwarrior command line that +have special meaning to the shell, and as such must be properly escaped, as +[described here](/docs/escapes.html). + +Also note that when searching for tasks without the specified entry at the end +of the parenthesis, you need to add a space, otherwise you\'ll get \"Mismatched +parentheses in expression\". + + # This + $ task '(project: )' + # Not that + $ task '(project:)' + +[]{#config} + +#### Configuration + +Regular expressions in pattern filters are only used when enabled with: + + regex=on + +This is the default in 2.4.0+. If not enabled, the patterns are literal strings +to be matched. Case sensitivity for string searches and regular expressions is +controlled by: + + search.case.sensitive=yes + +The default is \'yes\'. diff --git a/content/docs/first_time.md b/content/docs/first_time.md new file mode 100644 index 00000000..3fd00b98 --- /dev/null +++ b/content/docs/first_time.md @@ -0,0 +1,253 @@ +--- +title: "Taskwarrior - How to become an Open Source Contributor" +--- + +### How to become an Open Source Contributor + +Welcome, potential new Open Source contributor! This is a guide to show you +exactly how to make a contribution, and will lead you through the entire +process. + +There are many people who wish to start contributing, but don\'t know how or +where to start. If this might be the case, then please read on, this guide is +for you. Because we want you to join in the fun with Open Source - it can be fun +and rewarding, improve your skills, or just give you a way to contribute back to +a project. + +Where else can you combine the thrill of typing in a darkened room with the +kindhearted love of an internet forum? Just kidding! + +The goal of this document is to give you the ability to make your first +contribution, and encourage you to make a second, by showing you how simple it +is. Perhaps confidence and a little familiarity with the process are all you +need to get started. + +We\'re going to pick the smallest contribution of all - a typo fix. While this +may be a very small improvement, it is nevertheless a wanted improvement, and +will be welcomed. Fixes such as this happen many times a day. Similar work on +new features, new documents, rewriting help, refactoring code, fixing bugs and +improving performance all combine to make a project grow and improve. + +Making a bigger change also is certainly an option, but the focus here is on +going through the procedure, which is somewhat independent from the nature of +the change. The steps are numbered, and it all fits on this one page. Get all +the way to the end, and you will be an open source contributor. + +[]{#setup} + +#### [1]{.label .label-success} Development Environment Setup + +In order to build and test software, you need a development environment. That\'s +just a term that means you need certain tools installed before proceeding. Here +are the tools that Taskwarrior needs: + +- Compiler: GCC 4.7 or newer, or Clang 3.4 or newer. +- Libraries: GnuTLS, and libuuid +- Tools: Git, CMake, make, Python + +The procedure for installing this software is OS-dependent, but here are the +commands you would use on Debian: + + $ sudo apt-get install gcc + $ sudo apt-get install libgnutls28-dev + $ sudo apt-get install uuid-dev + $ sudo apt-get install git + $ sudo apt-get install cmake + $ sudo apt-get install make + +[]{#clone} + +#### [2]{.label .label-success} Get the Code + +Now you have the tools, next you need the code. This involves cloning the +repository using git and looking at the development branch: + + $ git clone --recursive -b 2.6.0 https://github.com/GothenburgBitFactory/taskwarrior.git taskwarrior.git + Cloning into 'taskwarrior.git'... + remote: Counting objects: 55345, done. + remote: Compressing objects: 100% (12655/12655), done. + remote: Total 55345 (delta 44868), reused 52340 (delta 42437) + Receiving objects: 100% (55345/55345), 25.04 MiB | 7.80 MiB/s, done. + Resolving deltas: 100% (44868/44868), done. + Checking connectivity... done. + $ + +The URL for the repository was obtained from looking around on + where several repositories are public, +including the one for this web site. + +The clone command above puts you on the right branch, so no need to switch. But +it\'s a good idea to check anyway, so do this: + + $ cd taskwarrior.git + $ git branch -a + * 2.6.0 + remotes/origin/2.6.0 + remotes/origin/HEAD -> origin/2.6.0 + remotes/origin/master + $ + +Here we see that 2.6.0 is the highest-numbered branch, and therefore the current +development branch. If there were a higher numbered branch, you would want to +use that by doing this: + + $ git checkout 2.7.0 + +Here\'s a thought - if this page does not show the latest branch names, then, +you know, you could fix that\... + +[]{#fix} + +#### [3]{.label .label-success} Fix Something + +Now that you have the code, find something to fix. This may be the hardest step, +but knowing how many typos there are in the source code and docs, it shouldn\'t +take long to find one. Try looking in the files in these directories: + +- `taskwarrior.git/doc/man` +- `taskwarrior.git/scripts` +- `taskwarrior.git/src` +- `taskwarrior.git/test` + +It also doesn\'t need to be a typo, it can instead be a poorly-worded sentence, +or one that could be more clear. You\'ll find something, whether it is jargon, +mixed tenses, mistakes, or just plain wrong. + +Then fix it, using a text editor. Try to make the smallest possible change to +achieve what you want, because smaller changeѕ are easier to verify and approve, +and no reviewer wants to receive a large change to approve. + +[]{#test} + +#### [4]{.label .label-success} Run the Test Suite + +Taskwarrior has an extensive test suite to prove that things are still working +as expected. You\'ll need to build the program and run this test suite in order +to prove to yourself that your fix is good. It may seem like building the +program is overkill, if you only make a small change, but no, it is not. The +test suite is there to save you from submitting a bad change, and to save +Taskwarrior from any mistakes you make. + +First you have to build the program. Do this: + + $ cd taskwarrior.git + $ cmake . + -- The C compiler identification is ... + -- The CXX compiler identification is ... + -- Check for working C compiler: ... + + ... + + -- Configuring done + -- Generating done + -- Build files have been written to: /home/user/taskwarrior.git + $ + $ make + Scanning dependencies of target columns + Scanning dependencies of target task + Scanning dependencies of target commands + [ 2%] Building CXX object src/columns/CMakeFiles/columns.dir/ColDepends.cpp.o + [ 2%] Building CXX object src/columns/CMakeFiles/columns.dir/Column.cpp.o + [ 2%] Building CXX object src/CMakeFiles/task.dir/CLI2.cpp.o + + ... + + [100%] Linking CXX executable task + [100%] Linking CXX executable lex + [100%] Linking CXX executable calc + [100%] Built target lex_executable + [100%] Built target task_executable + [100%] Built target calc_executable + $ + +If the above commands worked, there will be a binary, which you can find: + + $ ls -l src/task + -rwxr-xr-x 1 user group Mar 25 18:43 src/task + +The next step is to build the test suite. Do this: + + $ cd test + $ make + [ 14%] Built target task + [ 25%] Built target columns + [ 45%] Built target commands + Scanning dependencies of target variant_subtract.t + Scanning dependencies of target variant_partial.t + Scanning dependencies of target variant_or.t + + ... + + [ 98%] Built target i18n.t + [100%] Linking CXX executable view.t + [100%] Built target view.t + +Now run the test suite, which can take anywhere from 10 - 500 seconds, depending +on your hardware and OS: + + $ ./run_all + Passed: 8300 + Failed: 0 + Unexpected successes: 0 + Skipped: 3 + Expected failures: 5 + Runtime: 32.50 seconds + +We are looking for zero failed tests, as shown. This means all is well. + +[]{#commit} + +#### [5]{.label .label-success} Commit the Change + +Now you\'ve made a change, built and tested the code. The next step is to commit +the change locally. This example assumes you fixed a typo in the man page. Check +to see which file you changed, stage that file, then commit it: + + $ cd taskwarrior.git + $ git status + On branch 2.6.0 + Your branch is up-to-date with 'origin/2.6.0'. + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + + modified: doc/man/task.1.in + + no changes added to commit (use "git add" and/or "git commit -a") + $ git add doc/man/task.1.in + $ git commit -m 'Docs: corrected typo in the main man page' + [2.6.0 ddbb07e] Docs: corrected typo in the main man page + 1 file changed, 1 insertion(+) + $ + +Notice how the commit message looks like this: `Category: Brief description`, +which is how the commit messages should look. + +[]{#patch} + +#### [6]{.label .label-success} Make a Patch + +Once the commit is made, making a patch is simple: + + $ git format-patch HEAD^ + 0001-Docs-corrected-typo-in-the-main-man-page.patch + $ + +[]{#submit} + +#### [7]{.label .label-success} Submit the Patch + +Finally you just need to email that patch file to +`taskwarrior-dev@googlegroups.com`. You will need to attach it to an email, and +not just paste it in, because the mail client will probably mess with the +contents, wrapping lines etc, which can make it unusable. + +What happens next is that a developer will take your patch and study it, to +ascertain whether it really does fix something that is broken. If there is a +problem, you\'ll hear back with some gentle, constructive criticism. If the +problem is small, it might just get fixed. Then your patch is applied, tested, +and if all looks well, pushed to the public repository, and included in the the +next release. Your name will go into the AUTHORS file, and you will be thanked. + +Congratulations! Welcome to the wonderful world of open source involvement. Now +do it again\... diff --git a/content/docs/help.md b/content/docs/help.md new file mode 100644 index 00000000..c1677008 --- /dev/null +++ b/content/docs/help.md @@ -0,0 +1,88 @@ +--- +title: "Taskwarrior - Getting Help" +--- + +[]{#help} + +### Getting Help + +There are several forms of help available. All support avenues are listed at the +[Support](/support) page. + +[]{#tworg} + +#### + +If you find you have any questions, you can get answers in several ways. The +website has user forums, issue tracking and online documentation, including this +tutorial. + +There is also a [Command reference PDF](/download/task-latest.ref.pdf) that we +recommend you download and use. It shows all the supported commands and options +at a glance. + +[]{#faq} + +#### FAQ + +Take a look at the [FAQ](/support/faq.html) - you may find your question has +already been asked and answered. + +[]{#irc} + +#### IRC \#taskwarrior on freenode + +You can join the Taskwarrior IRC channel to pose questions, or join in the +discussion. + +[]{#email} + +#### Email + +You can submit your request by email. If you have a problem, please run the +diagnostic command (below) and include that output, as it helps with the +analysis. Please also describe what you expected and what you saw. + +[]{#taskhelp} + +#### `task help` + +There is a built in help page which summarizes commands, reports and other +details. + +[]{#mantask} + +#### `man task` + +Finally, you have several man pages installed that contain all the written +documentation, including this tutorial. The main man page offers syntax and +command help. + +[]{#mantaskrc} + +#### `man taskrc` + +The taskrc page describes all the supported configuration options (and there are +many), which you can use to customize the behavior of taskwarrior. + +[]{#mantaskcolor} + +#### `man task-color` + +Use of color, color rules and themes are described in the task color page. + +[]{#mantasksync} + +#### `man task-sync` + +This page describes the various sync alternatives, with examples to help you +keep your tasks lists up to date. + +[]{#taskdiag} + +#### `task diagnostics` + +If you find a bug, or even suspect you found a bug, please let us know. Ideally +you would send an email to , describe the problem, and +include information about your installation. The `diagnostics` command provides +the details needed to diagnose the problem. diff --git a/content/docs/history.md b/content/docs/history.md new file mode 100644 index 00000000..6e9713fd --- /dev/null +++ b/content/docs/history.md @@ -0,0 +1,57 @@ +--- +title: "Taskwarrior - Release History" +--- + +[]{#history} + +### Release History + +This is a summary of the Taskwarrior +[ChangeLog](https://github.com/GothenburgBitFactory/taskwarrior/blob/master/ChangeLog) +file. + + Release Date Description + -------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ? 2.6.0 will overhaul recurrence and add more flavors of recurring tasks. + 2021-01-03 2.5.3 is a bug fix, code cleanup, performance release only - no features. + 2020-12-05 2.5.2 is a bug fix, code cleanup, performance release only - no features. + 2016-02-24 2.5.1 is a bug fix, code cleanup, performance release only - no features. + 2015-10-21 2.5.0 is a major release. Improved command line parser. Unicode U+NNNN \\uNNNN support. New `UDA`, `ORPHAN` virtual tags. New `_unique` helper command. New `commands` command. Free-form JSON input supported. + 2015-05-10 2.4.4 is an important bug fix release. 32-bit builds now work. There is the start of a jpn-JPN localization. The `rc.obfuscate` setting is added, for support. + 2015-04-19 2.4.3 adds the Hooks v2 API (backwards compatible), replaces `priority` with a more capable UDA. + 2015-03-16 2.4.2 adds a new set of `context` commands, perfomance improvements, important Hooks API fixes. + 2015-02-16 2.4.1 adds a German localization, stricter hooks API, hook scripts are now under much stricter control, ability to disable ISO-8601 date parsing, ability to disable recurrence. + 2015-01-01 2.4.0 adds hook support, `show` command displays defaults, Portuguese (por-PRT), French (fra-FRA), Esperanto (epo-RUS) and Polish (pol-POL) localizations, new virtual tags: YESTERDAY TOMORROW READY PENDING COMPLETED DELETED TAGGED, regular expressions enabled by default, the \'filter\' verbosity token shows the complete filter used for the last command, the \'new-uuid\' verbosity token shows the UUID of newly created tasks, the \'info\' report now breaks down urgency values, additional color rules, tasks can inherit the urgency values of the dependency chain, listing breaks, new fish shell completion script, the filter form \'name:value\' maps to the partial match operator (=) and not the exact match operator (==), UDA indicator format. + 2014-01-15 2.3.0 contains Task Server support, more virtual tags, the \"\_get\" DOM accessor, new tasksh binary, unicode \\uNNNN support in .taskrc, it-IT localization, libuuid requirement, \'remaining\' format for all date columns. + 2013-04-07 2.2.0 contains blocking report, \_show, \_aliases helper commands, virtual tags, \'modified\' attribute, empty column skipping. + 2012-09-18 2.1.2 contains bugs fixes for \'merge\' command and shadow files. First release making use of Flod testing. + 2012-07-24 2.1.1 contains JSON syntax fixes. + 2012-07-23 2.1.0 contains UDA support, performance improvements. + 2012-03-17 2.0.0 before [Ubucon](https://www.ubucon.de/), advanced filters, stdin support, improved sorting, new table rendering, \'inverse\' color support, multiple column formats, script to update holiday data, html export, new verbose controls, \'execute\' command, enhanced aliases, \'ids\' command, \'reports\' command \... + 2011-03-03 1.9.4 released, taskwarrior.org relocated to gothenburgbitfactory.org server, burndown charts, change log in \'info\' command, JSON export, XML export, ncurses eliminated, xterm title, \'count\' command + 2010-11-08 1.9.3 released, start/stop annotations, YAML import/export, dependencies, sync using push/pull/merge, special tags, color rule precedence + 2010-07-10 1.9.2 released with color themes, \'denotate\' command, limit:page support, \'show\' command, annual history reports, \'log\'. + 2010-05-22 1.9.1 released with easter date calculations and bug fixes. + 2010-02-22 1.9.0 released with 256 color support, alternate line coloring, vim syntax highlighting, \'prepend\' command, \'config\' command, time support, verbosity, config includes. + 2009-12-05 1.8.5 released with confirmation, error cleanup and bug fixes. + 2009-11-17 1.8.4 released with bug fixes. + 2009-10-21 1.8.3 released, with Haiku support + 2009-09-07 1.8.2 released with bug fixes. + 2009-08-20 1.8.1 released with bug fixes. + 2009-07-21 1.8.0 released with attribute modifiers, many components rewritten, \'\--\' support, rc overrides, \'shell\' command, \'undo\' command, waiting, aliases, test suite. Hosting shifted to gothenburgbitfactory.org for git and tinderbox. + 2009-06-08 1.7.1 released with taskwarrior.org references, redmine. Taskwarrior name conceived by David J Patrick + 2009-05-14 1.7.0 released with duplicate, en-passant, timesheet, edit, completion scripts. + 2009-04-24 1.6.1 released with bug fixes. + 2009-04-12 1.6.0 released with utf8 support, annotations, append, recurrence modfiication propagation, custom column labels. + 2009-03-15 1.5.0 released with custom reports, start, stop. + 2008-11-01 1.4.3 released with shadow files. + 2008-09-18 1.4.2 released with undo, sorting, defaults, word-wrapping, modifications, relative dates. + 2008-07-18 1.4.1 released with bug fixes. + 2008-07-10 1.4.0 released with recurring tasks, rc overrides. + 2008-06-21 1.3.1 released with bug fixes. + 2008-06-13 1.3.0 released with filters and new reports. + 2008-06-13 1.2.0 released with sub-projects. + 2008-06-07 1.1.0 released with dateformat support. + 2008-06-04 1.0.1 released with bug fixes. + 2008-06-03 1.0.0 released, ported to Fedora Core 8 & 9, Ubuntu 8, Mac OS X 10.5. Suported \'add\', .taskrc, \'find\', \'projects\', \'tags\', \'start\', \'done\', \'delete\', \'history\', summary\', \'calendar\', due dates, \'info\', age column, substitution, \'overdue\', \'stats\', \'export\', color rules, man pages, tutorial. + 2006-11-29 0.0.1 Project began as enhancement to [todo.txt](https://todotxt.org/). diff --git a/content/docs/history_td.md b/content/docs/history_td.md new file mode 100644 index 00000000..a3565e0f --- /dev/null +++ b/content/docs/history_td.md @@ -0,0 +1,4 @@ +--- +title: "Taskwarrior - Taskserver Release History" +--- + diff --git a/content/docs/hooks.md b/content/docs/hooks.md new file mode 100644 index 00000000..51dc0547 --- /dev/null +++ b/content/docs/hooks.md @@ -0,0 +1,227 @@ +--- +title: "Taskwarrior - Hooks v1" +--- + +#### Hooks v1 + +The API defined here is the [Hooks v1]{.kbd} API. Later versions will allow a +script to determine which version of the Hooks API is being used. +::: + +[]{#hooks} + +### Hooks + +A hook system is a way to run other programs/scripts at certain points in +Taskwarrior\'s execution, so that processing can be influenced. These callout +points correspond to locations in the code where some critical processing is +occurring. These are called *events*. + +Hook scripts are associated with events. When that event occurs, all associated +hooks scripts are run. Data is exchanged between Taskwarrior and the hook +scripts. + +The hook scripts may be written in any suitable programming language. A typical +hook script will read data, perform some function, then write data and +diagnostics and exit with a status code. + +There is no configuration required for the hook scripts - their presence, +accessibility and execute permission is all that is required. + +[]{#events} + +#### Events + +Hooks are triggered by events, and the list of supported events is kept short. + + ------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + `on-launch` This event is triggered at launch, after the initialization of all data structures, but before any processing. This event provides an opportunity to prevent launch. + `on-exit` This event is triggered after all processing, but immediately before output is displayed, which is the last opportunity to contribute footnotes/errors. This event has no opportunity to modify tasks. + `on-add` This event is triggered when a new task is created, after the data has been processed, but before the task is saved. This event provides an opportunity to approve, deny or or modify the task being created. + `on-modify` This event is triggered when an existing task is modified, after the data has been read and processed, but before the task is saved. This event provides an opportunity to approve, deny, or further change the modification of the task. + ------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Task completion and deletion are considered modifications, indicated by the +change to the \'status\' attribute. + +[]{#git} + +#### The Git Model + +Following the Git model, a hook script need only exist in a specific location, +possess a recognizable name, and have execute permission, in order for it to be +run. + +The location for hooks scripts is by default `~/.task/hooks`, which is itself +defined by the `rc.data.location` setting, and a `hooks` subdirectory. A hook +script must either reside in this location, or be symbolically linked into this +location. The location itself may be a symbolic link. The name of the hook +script should be of the form: + + [] + +Some examples being: + + on-add + on-add.01 + on-add-require-project + +The event at the start of the script name associates the script with that event. +The optional identifier allows for multiple scripts associated with the same +event. + +When there are multiple scripts associated with the same event, the order of +execution is the collating sequence of the script name. A hook script can be +disabled by either removing execute permission, renaming it, or moving it to +another location. + +[]{#input} + +#### Input + +Input to hook scripts consists of JSON-formatted objects, one per line, in the +[Taskwarrior JSON Format](/docs/design/task.html) which is also used by the +[`export`{.sample} command](/docs/commands/export.html). + + $ task 1 export + {"description":"Buy some milk","entry":"20141118T050231Z","status":"pending","uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"} + +The above example may wrap over several lines, but exported JSON always contains +1 object per line. Whitespace within the line is permitted, per the JSON +standard, but the task *must* occupy only one line of output. + +[]{#output} + +#### Output + +Output from a hook script is a combination of a JSON-formatted task and text. +Just as the JSON for a task must occupy a single line, so must a single feedback +message. Feedback text is optional for a successful hook script, but required +for a failing script. If provided it will be displayed by Taskwarrior according +to the [verbosity setting](/docs/verbosity.html). + +Here is sample output from a hypothetical spell-checking hook script: + + {"description":"Buy some milk","entry":"20141118T050231Z","status":"pending","uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"} + Spell checking found no errors. + +The output is a single line JSON object which represents an optionally modified +task, and a single line of feedback text to be displayed. + +There may only be one line of JSON, and it must be for the same task that was +provided as input. + +[]{#status} + +#### Exit Status + +A hook script may exit with a zero status which signals that all is well. A +tasks emitted will be added/modified, and any feedback will be shown as a +footnote. + +A hook script may exit with a non-zero status which signals a problem. This +terminates processing. All tasks emitted will be ignored. Feedback is required +in this case, and will be shown as an error. + +[]{#interfaces} + +#### Interfaces + +The hook scripts have different responsibilities, depending on the type of hook. +Some are provided with JSON input, some are expected to indicate that processing +should continue or stop. All may provide error messages. + ++---------------+---------------+---------------+---------------+---------------+ +| Event | Input | Output | Status\ | Status\ | +| | | | Zero 0 | Non-Zero | ++===============+===============+===============+===============+===============+ +| `on-launch` | - None | - No JSON | - Optional | - Required | +| | | - Feedback | feedback | feedback | +| | | | becomes | becomes | +| | | | footnotes | errors | +| | | | - | - | +| | | | Processing | Processing | +| | | | continues | | +| | | | | terminates | ++---------------+---------------+---------------+---------------+---------------+ +| `on-exit` | - JSON for | - No JSON | - Optional | - Required | +| | a | - Feedback | feedback | feedback | +| | dded/modified | | becomes | becomes | +| | tasks | | footnotes | errors | ++---------------+---------------+---------------+---------------+---------------+ +| `on-add` | - JSON for | - JSON for | - JSON for | - JSON | +| | added | added | added | ignored | +| | task | task | task | - Required | +| | | - Feedback | - Optional | feedback | +| | | | feedback | becomes | +| | | | becomes | errors | +| | | | footnotes | - | +| | | | - | Processing | +| | | | Processing | | +| | | | continues | terminates | ++---------------+---------------+---------------+---------------+---------------+ +| `on-modify` | - JSON for | - JSON for | - JSON for | - JSON | +| | original | modified | modified | ignored | +| | task | tasks | task | - Required | +| | - JSON for | - Feedback | - Optional | feedback | +| | modified | | feedback | becomes | +| | task | | becomes | errors | +| | | | footnotes | - | +| | | | - | Processing | +| | | | Processing | | +| | | | continues | terminates | ++---------------+---------------+---------------+---------------+---------------+ + +This means that on-launch hooks should expect 0 lines of input, on-exit 0 to +many, on-add 1, and on-modify 2. + +[]{#impact} + +#### Impact + +The hook system is visible in several places: + +- The `diagnostics` command will enumerate hook scripts, indicating whether + the script is executable. This helps diagnosing hook problems. +- In debug mode (`rc.debug=1`) the hook debug mode (`rc.debug.hooks=1`) is + automatically set. +- Hooks have their own debug mode. Setting `rc.debug.hooks=1` will show which + hook scripts are called, and run time. This will help hook script authors to + minimize their runtime. +- Setting `rc.debug.hooks=2` will also show the input, output and exit status + of the hook scripts. + +[]{#safety} + +#### Safety + +With any hook system there are potential problems which involve race conditions, +infinite loops and runaway cascading effects. Various measures are taken to +mitigate these problems: + +- Malformed JSON is rejected +- Correct JSON that is not a task is simply ignored by Taskwarrior + +Please note: installing hook scripts can be as dangerous as installing any +software, and if you are unsure of what the script does, don\'t install it. + +[]{#examples} + +#### Examples + +Here are some example uses for hooks. This list is intended as inspiration, and +may not represent actual scripts that exist. + +- Policy enforcement: referencing issues, description length, project values +- Shadow files +- User defined special tags +- Automatic priority escalation +- Automated data backup +- Making certain tasks read-only +- Disabling features like recurrence or priorities +- Spell-checking +- Preventing use of profanity +- Performing a sync on launch + +There are example hook scripts installed with Taskwarrior. +::: diff --git a/content/docs/hooks2.md b/content/docs/hooks2.md new file mode 100644 index 00000000..0aab01cd --- /dev/null +++ b/content/docs/hooks2.md @@ -0,0 +1,118 @@ +--- +title: "Taskwarrior - Hooks v2" +--- + +#### Hooks v2 + +The API defined here is the [Hooks v2]{.kbd} API. This API is part of the +TaskWarrior 2.4.3 release. +::: + +[]{#hooks} + +### Hooks v2 + +[]{#events} + +#### Events + +No change. + +[]{#input} + +#### Input + +No change. + +[]{#output} + +#### Output + +No change. + +[]{#status} + +#### Exit Status + +No change. + +[]{#interfaces} + +#### Interfaces + +No change. + +[]{#args} + +#### Command Line Arguments + +To support an evolving Hooks API, Taskwarrior must provide hook scripts with a +mechanism for determining which version of the Hooks API is providing the +context for the script. It is anticipated that in future versions, new events +will be added, and changes to the interfaces will occur. A hook script needs to +act according to the API version, otherwise it risks incompatibility with +Taskwarrior. + +The interfaces define what is provided as standard input, and what is expected +on standard output. With `v2` there will also be command line arguments provided +to the script. + +A script may take advantage of the `v2` enhancements though, to extend its +capabilities. + ++---------------------------------------+---------------------------------------+ +| Argument | Meaning | ++=======================================+=======================================+ +| `api:2` | The `2` specified means Hooks API | +| | `v2`. This will be a monotonically | +| | increasing number, as the Hooks API | +| | evolves. | +| | | +| | The only possible value for this | +| | argument is currently `2`, because | +| | the `v1` API does not provide command | +| | line arguments. | ++---------------------------------------+---------------------------------------+ +| `args:task ...` | The script has read-only access to | +| | the command line that Taskwarrior | +| | received. | ++---------------------------------------+---------------------------------------+ +| `command:add|done|sync|...` | The command Taskwarrior recognized in | +| | its command line arguments. | ++---------------------------------------+---------------------------------------+ +| `rc:/path/to/.taskrc` | Absolute path of rc file used by | +| | Taskwarrior after all overrides have | +| | been applied. | ++---------------------------------------+---------------------------------------+ +| `data:/path/to/task/folder` | Absolute path of folder containing | +| | Taskwarrior\'s \*.data files. | ++---------------------------------------+---------------------------------------+ +| `version:x.y.z` | Taskwarrior version calling the hook. | +| | Same as the one reported by \"task | +| | \--version\", e.g. \"2.4.3\" | ++---------------------------------------+---------------------------------------+ + +Here is a contrived example simulating how a hook script will be invoked: + + $ ~/.task/hooks/on-xxx.yyy \ + api:2 \ + args:'task rc:~/mytaskrc list' \ + command:add \ + rc:/home/foo/mytaskrc \ + data:/home/foo/.task \ + version:2.4.3 \ + output.txt + +This information can be used by the script to see that an alternate `rc` file +was specified on the command line. + +[]{#compat} + +#### Backward Compatibility + +The `v1` and `v2` API is identical, so any hook script will run unmodified in +both scenarios. This may not be true for future versions. + +A script that requires `v2` but is run in a `v1` context should issue a warning +that it is not able to perform its function, but it should not fail. diff --git a/content/docs/hooks_guide.md b/content/docs/hooks_guide.md new file mode 100644 index 00000000..6329fd0d --- /dev/null +++ b/content/docs/hooks_guide.md @@ -0,0 +1,241 @@ +--- +title: "Taskwarrior - Hook Author's Guide" +--- + +[]{#guide} + +### Hook Author\'s Guide + +This guide walks through the process of writing and testing a Taskwarrior hook +script. While this is a simple and straightforward process for developers, there +are still many considerations. A hooks script will be developed, and the various +concerns discussed. + +[]{#example} + +#### Example Hook Script + +As an example, we\'re going to create a hook script that detects tasks that +refer to Taskwarrior bug numbers (ie \'TW-179\') in the description, and +replaces the bug number with a URL that links to the bug. Whenever the pattern +`tw-179` is found in a task description, it should change to +`https://github.com/GothenburgBitFactory/taskwarrior/issues/179`. + +This script will simply need to search for a pattern, and perform a replacement, +for new tasks only. This will be a very simple hook script. + +[]{#language} + +#### Choosing a Language + +You can write a hook script in any language you wish. But there is more to +consider: + +- Is performance an issue? It is not likely that you need to worry about + performance, because the time spent adding or modifying tasks is a one-time + cost. Performance would be more important if it affected a report. +- Does your language have a readily available JSON parser? Most likely it + does, but is it installed on the users machine? Are you going to be + requiring that the user install additional software? +- If you are considering a compiled language, will you ship source or + binaries? Developers typically have compilers installed, but regular users + do not. Shipping binaries means you\'ll need to provide them for different + OSes and versions. + +This example will be written in Python 2.6+, because Python is well known, +modern, and commonly available. It has a built-in JSON parser. It is ideal for +this task. + +[]{#api} + +#### Hooks API + +Read and understand the [Hooks API](/docs/hooks.html). This is important because +the hook script must comply with the API requirements. Taskwarrior is strict +about compliance. Hook scripts have the ability to harm data, so they are +carefully monitored. + +[]{#framework} + +#### Framework + +From the API, we know that an `on-add` hook script will need to read a line of +JSON from standard input, and emit an optionally modified line of JSON, +optionally include feedback, and exit with a zero status indicating success. + +To begin with, here is a compliant `on-add` hook script that does nothing, *but +does it properly*. It can be the basis for any `on-add` script. + + #!/usr/bin/env python + + import sys + import json + + added_task = json.loads(sys.stdin.readline()) + print(json.dumps(added_task)) + sys.exit(0) + +This script reads a line of JSON from input and parses it. This JSON represents +the task being added. The JSON is then serialized and written to output, without +modification. An exit code of zero indicates that the added task is accepted. + +Although this script does nothing to the task, it only requires a few more lines +added to be complete. + +[]{#testing} + +#### Testing + +You can test your hook script independently from Taskwarrior, which is a good +idea. First we make our script executable, then we simply run it from the +command line and feed it sample JSON. Here is an example test run, using valid +JSON, but it is not a valid task - it\'s just a test. + + $ chmod +x hook.py + $ echo '{"name":"value"}' | ./hook.py + {"name": "value"} + $ echo $? + 0 + +Here the hook script was made executable, then sample JSON `{"name":"value"}` is +provided as input. The script emits the JSON unmodified as output, and the exit +code is zero. This script works. + +Now we add logic to the script to make it do something. + +[]{#implementation} + +#### Implementation + +For the implementation, the script needs to look for bug numbers. Taskwarrior +bug numbers can be represented with a regular expression like this: + + \b(tw-\d+)\b + +The script is now modified to `import re`, and perform the substitution on the +description attribute. By comparing the original description to the modified +description, the script knows when to provide feedback. Here is the updated +script: + + #!/usr/bin/env python + + import sys + import re + import json + + added_task = json.loads(sys.stdin.readline()) + original = added_task['description'] + added_task['description'] = re.sub(r'\b(tw-\d+)\b', + r'https://github.com/GothenburgBitFactory/taskwarrior/issues/\1', + original, + flags=re.IGNORECASE) + print(json.dumps(added_task)) + + if original != added_task['description']: + print 'Link added' + + sys.exit(0) + +Testing the script again with better input yields this: + + $ echo '{"description":"foo tw-179 bar"}' | ./hook.py + {"description": "foo https://github.com/GothenburgBitFactory/taskwarrior/issues/179 bar"} + Link added + $ + $ echo $? + 0 + +The script has correctly identified the bug number, and replaced it with the +correct URL. The feedback message indicates this. We are ready to install this +hook script and test it using Taskwarrior. + +[]{#install} + +#### Install and Enable + +To install the script, copy it to the `~/.task/hooks` directory, creating that +directory if necessary, and make sure the script is executable. It must also be +associated with an event, which is done by naming it `on-add*`. + + $ mkdir -p ~/.task/hooks + $ cp hook.py ~/.task/hooks/on-add-bug-link.py + $ chmod +x ~/.task/hooks/on-add-bug-link.py + +There is a configuration setting that enables/disables hooks and you\'ll need to +make sure hooks are enabled, although this is the default value: + + $ task _get rc.hooks + on + +Now run the `diagnostics` command, which will summarize the hooks it finds: + + $ task diag + ... + Hooks + Scripts: Enabled + /.task/hooks/on-add-bug-link.py (executable) + ... + +We see that the hook script is found by Taskwarrior. Now let\'s see it in +action, and note that the `--` terminator is being used so that `tw-179` is not +perceived as a mathematical expression: + + $ task add -- Contains no bug number + Created task 181. + $ task add -- Fix tw-179 + Created task 182. + Link added + $ + $ task _get 182.description + Fix https://github.com/GothenburgBitFactory/taskwarrior/issues/179 + +It works, but we have done minimal testing here. If you write a hook script with +any non-trivial capabilities, your testing should be much more thorough. This is +only an example. + +[]{#debugging} + +#### Debugging + +Taskwarrior has a hook debug configuration setting, which will show you how +Taskwarrior processes the hook input and output, what happened, and how long it +took. Here a similar task is added with debug information requested. The output +is edited to show just the relevant hook information. + + $ task rc.debug.hooks=2 add -- Fix tw-98765 + ... + Found hook script /.task/hooks/on-add-bug-link.py + ... + Hook: Calling /.task/hooks/on-add-bug-link.py + Hook: input + {"description":"Fix tw-98765","entry":"20150301T154518Z","modified":"20150301T154518Z","status":"pending","uuid":"daa3ff05-f716-482e-bc35-3e1601e50778"} + Timer Hooks::execute (/.task/hooks/on-add-bug-link.py) 0.031061 sec + Hook: output + {"status": "pending", "entry": "20150301T154518Z", "uuid": "daa3ff05-f716-482e-bc35-3e1601e50778", "description": "Fix https://github.com/GothenburgBitFactory/taskwarrior/issues/98765", "modified": "20150301T154518Z"} + Link added + Hook: Completed with status 0 + ... + Perf task 2.4.2 f0cc015 20150301T154759Z init:3388 load:2001 gc:0 filter:0 commit:230 sort:0 render:0 hooks:33565 total:39184 + + Created task 183. + Configuration override rc.debug.hooks:2 + Link added + +The output shows that the hook script was found and run, the input and output is +show, along with timing information, feedback and the status. + +In this case the hook script ran in 31ms, which is certainly fast enough to not +cause the user to wonder what is happening. In this example all hook processing +was completed in 33ms. + +[]{#dist} + +#### Distribute + +With your hook script complete, will you be sharing your script? It\'s optional +of course, but if you do, consider a license and copyright, establish a web +presence so it can be found and downloaded, perhaps put contact info in the +script so you can be told of problems, then tell people about it. + +You can tell us about your hook script, because we\'d like to list it on the +[Tools](/tools) page, along with many others. diff --git a/content/docs/ids.md b/content/docs/ids.md new file mode 100644 index 00000000..2714d387 --- /dev/null +++ b/content/docs/ids.md @@ -0,0 +1,73 @@ +--- +title: "Taskwarrior - ID Numbers" +--- + +### ID Numbers + +Taskwarrior assigns ID numbers to tasks. The ID number is actually a simple line +count of the entries in the `pending.data` file. When a task is completed or +deleted, it is moved to the `completed.data` file, and loses the ID. All tasks, +pending or otherwise, have a UUID, and are always addressable by UUID. + +By keeping the tasks in two separate files, average performance is improved. +This works because most of the commands and reports are based on only the +pending tasks, which are in the `pending.data` file. This file tends to +stabilize at a constant size, regardless of the amount of work you are getting +done \[1\]. The `completed.data` file, on the other hand, grows unbounded. This +means that some reports, such as the `completed` or `all` report will run slower +over time because there is more data to read and display. + +One nice side effect of this mechanism is that the ID numbers of pending tasks +remain small, and less prone to error during data entry. + +One downside is that ID numbers change occasionally, although in a predictable +way. + +[]{#gc} + +#### Garbage Collection + +When a task is marked as deleted, it gets a new status, and an `end` attribute, +among other things. The task is written back into the `pending.data` file, but +it doesn\'t belong there - it belongs in the `completed.data` file. There is an +operation called Garbage Collection (gc) that is automatically run by +taskwarrior to move tasks into the correct files. When moving tasks between the +files, ID numbers are affected, because they are simply line numbers in the +`pending.data` file. + +But gc is only run occasionally: it is run immediately before any command that +displays ID numbers, such as a report, but not when a task is modified in any +way. The reason is concerned with general usage. Here is a typical taskwarrior +usage scenario for a few commands: + + $ task list + ... + $ task 34 done + $ task 45 modify priority:H + $ task 56 delete + $ task list + ... + +The first command shows a report that contains ID numbers. The next three +commands use the ID numbers shown in the report. The last command shows ID +numbers again. Clearly, while the middle three commands are being run, it would +be a mistake to renumber any tasks. When the last command is run, new ID numbers +are shown, and any subsequent commands would use those. This is why only +commands that display ID numbers perform a gc first. + +[]{#config} + +#### Configuration + +The `gc` configuration setting may be set to \'off\' to disable the gc +operation. This has the effect of letting data accumulate in the `pending.data` +file, and effectively making the ID numbers static. This slows down almost every +command. Disabling gc should be used on a per-command basis, if at all, in this +way: + + $ task rc.gc=off list + ... + +The setting can be made permanent, but this is not recommended. + +[\[1\] Based on more than 7 years of monitored usage.]{.small} diff --git a/content/docs/introduction.md b/content/docs/introduction.md new file mode 100644 index 00000000..806c9952 --- /dev/null +++ b/content/docs/introduction.md @@ -0,0 +1,76 @@ +--- +title: "Taskwarrior - Introduction" +--- + +### Introduction + +Hello, and welcome to Taskwarrior. This is the first of many tutorials, and +covers first-time use. + +[]{#first} + +#### First Time Use + +As a first-time user, you are going to need a configuration file and a data +directory. Taskwarrior will create both of these for you, in your home +directory, the first time you run Taskwarrior. Here is an example: + + $ task version + A configuration file could not be found in ~ + + Would you like a sample /home/alice/.taskrc created, so taskwarrior can + proceed? (yes/no) yes + + task 2.4.4 built for linux + Copyright (C) 2006 - 2016 P. Beckingham, F. Hernandez. + + Taskwarrior may be copied only under the terms of the MIT license, which may + be found in the taskwarrior source kit. + + Documentation for taskwarrior can be found using 'man task', 'man taskrc', + 'man task-color', 'man task-sync' or at https://taskwarrior.org + +Answer `yes` to the question. After creating the missing file and directory, +you\'ll see the current version displayed. The configuration file that was just +created contains very little. + + $ cat ~/.taskrc + # [Created by task 2.4.4.dev 7/12/2015 09:09:09] + # Taskwarrior program configuration file. + # For more documentation, see https://taskwarrior.org or try 'man task', + # 'man task-color', 'man task-sync' or 'man taskrc' + + # Here is an example of entries that use the default, override and blank values + # variable=foo -- By specifying a value, this overrides the default + # variable= -- By specifying no value, this means no default + # #variable=foo -- By commenting out the line, or deleting it, this uses the default + + # Use the command 'task show' to see all defaults and overrides + + # Files + data.location=~/.task + + # Color theme (uncomment one to use) + #include /usr/local/share/doc/task/rc/light-16.theme + #include /usr/local/share/doc/task/rc/light-256.theme + #include /usr/local/share/doc/task/rc/dark-16.theme + #include /usr/local/share/doc/task/rc/dark-256.theme + #include /usr/local/share/doc/task/rc/dark-red-256.theme + #include /usr/local/share/doc/task/rc/dark-green-256.theme + #include /usr/local/share/doc/task/rc/dark-blue-256.theme + #include /usr/local/share/doc/task/rc/dark-violets-256.theme + #include /usr/local/share/doc/task/rc/dark-yellow-green.theme + #include /usr/local/share/doc/task/rc/dark-gray-256.theme + +There is only one entry in this file for `data.location`. This is because +Taskwarrior has a built-in set of sensible defaults, and this configuration file +only contains overrides to those defaults. + +That configuration variable named `data.location` points to your task data +directory, which is currently empty: + + $ ls ~/.task + $ + +This is because there are no tasks yet. Typically you won\'t need to look in +that directory. diff --git a/content/docs/jobs.md b/content/docs/jobs.md new file mode 100644 index 00000000..0d3cf7c8 --- /dev/null +++ b/content/docs/jobs.md @@ -0,0 +1,210 @@ +--- +title: "Taskwarrior - Job Openings" +--- + +Job Openings +------------ + +With a family of Open Source projects, there is always work to be done. We need +help, in all kinds of areas, for all skill levels. + +This is Open Source volunteer work. The pay is zero, but you\'ll get your hands +dirty in a set of active projects that need all different kinds of help. Perhaps +you\'re a professional with a little time here and there to donate to the +projects. Perhaps you\'re new to this, and would like to be active in Open +Source, in a friendly community where you can get lots of help, make much-needed +contributions, and maybe learn something. + +We believe a lot of you would like to join in, but don\'t know where to start. +We\'ll guide you and teach you what you need. [Talk to +us](mailto:support@taskwarrior.org). + +Open Source: Good for the software. Good for the résumé/c.v. Good for the soul. + +-------------------------------------------------------------------------------- + +[]{#issue_manager} + +### [Issue Manager]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | You own the Jira databases for all | +| | projects. This involves: | +| | | +| | - Process new issues: fill in | +| | blanks, ask for more details, | +| | reject the crazy. | +| | - Reproduce problems. | +| | - Combine the duplicates. | +| | - Assess old issues for relevance. | +| | - Assign priorities and fix | +| | version, where possible. | +| | - Keeps the tags and versions up to | +| | date. | +| | - Link the related issues. | +| | - Help with version planning. | +| | - Advise development on patterns | +| | and weaknesses found. | +| | - Veto for project releases. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Attention to detail. Organization. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | An hour or two a week minimum. Maybe | +| | more. | ++---------------------------------------+---------------------------------------+ + +-------------------------------------------------------------------------------- + +[]{#test_automation} + +### [Test Automation]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | You own the test suites for all the | +| | projects. This involves: | +| | | +| | - Creating new Python unit tests | +| | where necessary. | +| | - Create new tests from tags in | +| | Jira. | +| | - Refactor bad tests. | +| | - Combining/reducing existing | +| | duplicate tests. | +| | - Improving test coverage. | +| | Taskwarrior was at 90% some time | +| | ago, the others we don\'t have | +| | time to check. | +| | - Improve release quality. | +| | - Improve test suite speed. | +| | - Veto for project releases. | +| | - Advise development about areas of | +| | weakness, feature asymmetry. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Python. Attention to detail. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | Minimally an hour or two a week. | ++---------------------------------------+---------------------------------------+ + +-------------------------------------------------------------------------------- + +[]{#sound_and_fury} + +### [Sound and Fury]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | Everyone loves a live demo, but we | +| | have five year old tutorials online, | +| | which are not only out of date, but | +| | way too long. You own the visual | +| | demos and tutorials. This involves: | +| | | +| | - Create good feature-specific | +| | demos for YouTube and/or | +| | Asciinema. | +| | - Create demos of interesting new | +| | use cases. | +| | - Organize the demos. | +| | - Show off the demos on the site | +| | and social media. | +| | - Establish a visual changelog for | +| | each release. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Video capture. Narration where | +| | needed. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | We don\'t know. Demos are hard work. | ++---------------------------------------+---------------------------------------+ + +-------------------------------------------------------------------------------- + +[]{#tech_community_liaison} + +### [Technical Community Liaison]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | You own the relationships with | +| | downstream clients. This involves: | +| | | +| | - Work with distro package | +| | maintainers to pull patches | +| | upstream. | +| | - Nudge distros to update the | +| | packages. | +| | - Make sure distros are doing the | +| | right thing with dev/alpha/beta | +| | versions. | +| | - Help us find a Cygwin package | +| | maintainer. | +| | - Advise distros with their | +| | documentation. | +| | - Identify missing distros and make | +| | noise. | +| | - Solve some problems: Debian | +| | won\'t use our PDFs, or update | +| | old GnuTLS libs. | +| | - Advise development on distro | +| | issues, improvements. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Communication, fearlessness. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | An hour or two a week. | ++---------------------------------------+---------------------------------------+ + +-------------------------------------------------------------------------------- + +[]{#doc_manager} + +### [Documentation Manager]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | You own all the documentation for all | +| | the projects. This involves: | +| | | +| | - The structure and organization of | +| | all the existing documents. | +| | - The rewriting and combination of | +| | existing documents. | +| | - Consistency issues between man | +| | pages and online documents. | +| | - Visual presentation of the | +| | documents. | +| | - Appropriate examples and | +| | screenshots. | +| | - Remove/replace obsolete | +| | documentation. | +| | - Veto for project releases. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Clear communication. Organization. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | We don\'t know. More at first, less | +| | over time. | ++---------------------------------------+---------------------------------------+ + +-------------------------------------------------------------------------------- + +[]{#publishing} + +### [Publishing]{.kbd} + ++---------------------------------------+---------------------------------------+ +| Responsibilities | The websites are currently | +| | hand-written HTML using templates. We | +| | wish to move to a markdown-based | +| | system, to generate a variety of | +| | document types. You own the site | +| | publishing infrastructure decision. | +| | This involves: | +| | | +| | - Work with us to define | +| | requirements for static site | +| | generator. | +| | - Evaluate and select static | +| | content generator. | +| | - Proof of concept. | +| | - Establish page templates. | +| | - Migrate site to Markdown. | ++---------------------------------------+---------------------------------------+ +| Skills Needed | Document management. | ++---------------------------------------+---------------------------------------+ +| Time Commitment | A few hours a week at first. | ++---------------------------------------+---------------------------------------+ diff --git a/content/docs/license.md b/content/docs/license.md new file mode 100644 index 00000000..b1e318ed --- /dev/null +++ b/content/docs/license.md @@ -0,0 +1,26 @@ +--- +title: "Taskwarrior - License" +--- + +### The MIT License (MIT) + +Copyright 2006 - 2017, Paul Beckingham, Federico Hernandez. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the \"Software\"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/content/docs/named_dates.md b/content/docs/named_dates.md new file mode 100644 index 00000000..1dde321d --- /dev/null +++ b/content/docs/named_dates.md @@ -0,0 +1,130 @@ +--- +title: "Taskwarrior - Named Dates" +--- + +### Named Dates + +The term \'date\' is used here to describe a timestamp of varying precision and +specificity. The terms \'timestamp\', or \'datetime\' also apply. + +Taskwarrior supports the notion of specifying dates in several ways. There are +ISO-8601 dates: + + 2014-06-07T16:55:04-05:00 + 2014-W23 + 20140607 + +There are `rc.dateformat` dates, the default being `Y-M-D`: + + 2014-06-07 + +This document enumerates and defines other dates, such as `tomorrow` and many +others. + +[]{#days} + +#### Days of the Week + +The days of the week are interpreted as the next day in the future. To specify a +day in the past, use a different date format. + + ----------------- --------------------------------------------------------- + `mon`, `monday` The date of the nearest future monday at 0:00:00 local. + ----------------- --------------------------------------------------------- + +The days are recognized in three-letter abbreviated form and the full day name +only. + +[]{#ordinals} + +#### Day Ordinals + +Day ordinals are the days in the month, numbered starting from 1, to either the +28th, 29th, 30th or 31st, depending on the current month. + + -------------------------- ---------------------------------------------------------- + `1st`, `2nd`, `3rd` \... The date of the nearest future Nth day at 0:00:00 local. + -------------------------- ---------------------------------------------------------- + +Note that if today is February 20th, specifying `31st` is an error, and does not +mean March 31. For this, use a precise date format. + +[]{#months} + +#### Months of the Year + +The months of the year are interpreted as the first day of the next month of +that name in the future. To specify a month in the past, use a different date +format. + + ------------------ --------------------------------------------------------------- + `jan`, `january` The date of the nearest future January 1st, at 0:00:00 local. + ------------------ --------------------------------------------------------------- + +The months are recognized in three-letter abbreviated form and the full month +name only. + +[]{#year} + +#### Year Dates + +Year dates are abbreviated names for dates within the year, that occur at +various boundaries. The abbreviations use \'s\' to mean the start, and \'e\' to +mean the end of the period. The periods are indicated using \'m\' (month), \'q\' +(quarter) and \'y\' (year). So the date \'socy\' means \'start of current +year\'. + + ---------------- ---------------------------------------------------------------------------------- + `socy`, `eocy` Start of the current year. End of the current year. Time is 0:00:00 local. + `socq`, `eocq` Start of the current quarter. End of the current quarter. Time is 0:00:00 local. + `socm`, `eocm` Start of the current month. End of the current month. Time is 0:00:00 local. + `soy`, `eoy` Start of the next year. End of the year. Time is 0:00:00 local. + `soq`, `eoq` Start of the next quarter. End of the quarter. Time is 0:00:00 local. + `som`, `eom` Start of the next month. End of the month. Time is 0:00:00 local. + ---------------- ---------------------------------------------------------------------------------- + +There is redundancy in this table, and it exists for the sake of symmetry. For +example, \'eom\' and \'eocm\' are always the same, but exist so that every date +has a matching pair. + +::: {.col-xs-12 .col-sm-12} +[![](/docs/design/year.png)](/docs/design/year.png){.thumbnail} +::: + +[]{#week} + +#### Week Dates + +Week dates are abbreviated names for dates within the week, that occur at +various boundaries. The abbreviations use \'s\' to mean the start, and \'e\' to +mean the end of the period. The periods are indicated using \'d\' (day), \'w\' +(week). + + ---------------- ---------------------------------------------------------------------------- + `socw`, `eocw` Start of the current week. End of the current week. Time is 0:00:00 local. + `sow`, `eow` Start of the next week. End of the week. Time is 0:00:00 local. + `soww`, `eoww` Start of the next work week. End of the work week. Time is 0:00:00 local. + `sod`, `eod` Start of today. End of today. Time is 0:00:00 local. + `yesterday` Start of yesterday. Time is 0:00:00 local. + `today` Start of today. Time is 0:00:00 local. + `now` Right now. + `tomorrow` Start of tomorrow. Time is 0:00:00 local. + ---------------- ---------------------------------------------------------------------------- + +Again, there is redundancy in the table, for the sake of symmetry. + +::: {.col-xs-12 .col-sm-12} +[![](/docs/design/week.png)](/docs/design/week.png){.thumbnail} +::: + +[]{#calculated} + +#### Calculated Dates + +These dates are from algorithms, and easily calculated. + + ------------------------------------------------------------------ ------------------------------------------------------------------- + `later`, `someday` January 18th, 2038 - the end of time. Time is 0:00:00 local. + `easter`, `eastermonday`, `pentecost`, `ascension`, `goodfriday` Time is 0:00:00 local. + `midsommarafton`, `midsommar` First Friday and Saturday after 19th June. Time is 0:00:00 local. + ------------------------------------------------------------------ ------------------------------------------------------------------- diff --git a/content/docs/philosophy.md b/content/docs/philosophy.md new file mode 100644 index 00000000..eeb237cb --- /dev/null +++ b/content/docs/philosophy.md @@ -0,0 +1,139 @@ +--- +title: "Taskwarrior - Philosophy" +--- + +### Taskwarrior Philosophy + +Taskwarrior is developed using a philosophy that explains a lot about why +certain decisions have been made, and will continue to be made. All Taskwarrior +family projects follow this same philosophy. + +[]{#open} + +#### Openness + +The [source code](https://github.com/GothenburgBitFactory/taskwarrior), +[plans](/docs/design/plans.html), [designs](/docs/design), +[bugs](https://github.com/GothenburgBitFactory/taskwarrior/issues), +[testing](https://github.com/GothenburgBitFactory/taskwarrior/actions), +[docs](/docs), and [website](https://github.com/GothenburgBitFactory/tw.org) are +all free and open source. Your data is kept as plain text, and never held +hostage by a proprietary format. You are welcome to contribute and identify +improvements in all aspects of the project. There is no hidden agenda. + +The goals of the project are to support all workflows at minimal friction and +minimal complexity, while improving list management. + +[]{#friction} + +#### Low Friction + +A tool that allows you to capture tasks needs to be low-friction. This means +that there should be no login authentication, lengthy launch delay, or +interactivity getting in the way of simply capturing information. It doesn\'t +get much easier than this: + + $ task add '...' + +Any tool that has friction will discourage its own use. + +[]{#penalty} + +#### No Penalty + +There should be no penalty for features that you don\'t use. As an example, +Taskwarrior supports recurrence and dependencies, but if you don\'t use those +features, there is no performance penalty or cost to that. + +But that also means the features are there if you need them. If you decide to +start using priorities, then you can, and having tasks where some have +priorities and some don\'t is fine. + +[]{#agnostic} + +#### Methodology Agnostic + +Productivity methodologies promote simple, habit-forming, repeatable processes +and workflow, combined with some discipline to give you an effective approach to +getting through your work. They tend to focus on maintaining a high quality +list, doing quickly that which can be done quickly, distinguishing between the +important and the unimportant, pacing yourself and not forgetting things. + +While methodologies are important, Taskwarrior doesn\'t impose or prefer any +methodology, and instead acknowledges that everyone works differently, placing +different emphasis on things like priorities, due dates, dependence and so on. + +You may start with a known methodology, but find that there will be parts that +work well and not so well for you, and you will likely evolve your own unique +methodology. This means Taskwarrior supports all of the above in some form, as +you develop your own working methodology. + +[]{#toolkit} + +#### Toolkit + +Supporting all methodologies and workflows means there are a lot of features, +but you are not expected to use or even be aware of them all. Think of +Taskwarrior as a toolkit that lets you follow any methodology you choose, and +any given methodology will only use a small subset of the features. + +Your kitchen has many tools and gadgets, but you likely only use a fraction of +them. They exist so that you have options. + +[]{#ext} + +#### Extension Friendly + +Import/export using industry-standard JSON allows you to move data into and out +of Taskwarrior, so you can provide a front end, or higher-order feature: + + $ task 1 export + [ + {"description":"Send Alice a birthday card","due":"20161108T000000Z", ...} + ] + +Hook scripts allow you to modify tasks on entry and on modification, or deny +changes to enforce policies. + + $ task add Paint the door + Warning: Task does not have an assigned project + +Helper commands allow you to extract metadata: + + $ task project:Home _ids + 36 + 77 + 89 + 122 + 123 + +A full DOM allows you to drill down to a single datum: + + $ task _get 123.entry.year + 2016 + + $ task _get rc.dateformat + Y-M-D + +[]{#community} + +#### Community + +Taskwarrior is greatly enhanced by the community that surrounds and supports it. +You\'ll find help, support, extensions, and more online. + +Talk to us. Join the community, help others, help yourself, and advance the +project. We welcome all of you into our community. + +Here is our [Code of Conduct](/conduct.html). + +[]{#focus} + +#### Focus + +Taskwarrior carefully limits the features it supports, in order to focus on +doing one thing well. It does not offer reminders and time tracking, because +there are other projects dedicated to implementing those features well. + +If a feature improves the way we manage task lists, then it belongs in +Taskwarrior, otherwise it belongs in some other software. diff --git a/content/docs/priority.md b/content/docs/priority.md new file mode 100644 index 00000000..257dcda8 --- /dev/null +++ b/content/docs/priority.md @@ -0,0 +1,75 @@ +--- +title: "Taskwarrior - Priority" +--- + +### Priority + +Taskwarrior has supported the notion of task priority since the beginning. +Priority was defined to have four allowable values, `H`, `M` and `L`, with the +additional option of having no priority at all. The values represent High, +Medium, Low and No priority. The `L` value is considered a higher priority than +no priority. Priority has been used to sort tasks in most built-in reports. + +Beginning with Taskwarrior 2.4.3, priority is no longer a core attribute, and is +replaced with an equivalent [User Defined Attribute](/docs/udas.html). This +offers several advantages, and users may now configure priority and attributes +that affect urgency to match their needs more closely. + +This change should go unnoticed, but there are some differences. This document +describes how you may further customize priority to match *your* notion of what +priority means. + +[]{#default} + +#### Default Configuration + +Here is the new default configuration for the UDA priority, which closely +matches the old core attribute priority. + + color.uda.priority.H=color255 + color.uda.priority.L=color245 + color.uda.priority.M=color250 + + uda.priority.label=Priority + uda.priority.type=string + uda.priority.values=H,M,L, + + urgency.uda.priority.H.coefficient=6.0 + urgency.uda.priority.L.coefficient=1.8 + urgency.uda.priority.M.coefficient=3.9 + +There are several points to note, the first of which is that the color rules are +now UDA color rules. The themes that are distributed with Taskwarrior have all +been updated to accomodate this change, but you may have local overrides that +have not yet been modified. + +The `uda.priority.values` setting specifies the possible values, which are `H`, +`M`, `L`, and no priority. Notice the comma at the end with no value after it - +that is how you specify that an empty value is allowed. + +[]{#custom} + +#### Custom Configuration + +If you believe that a priority level of `L` should be the lowest value, lower +even than no value, you can do this: + + $ task config -- uda.priority.values H,M,,L + +Those two commas indicate that the blank value lies between `M` and `L`. + +If you would like priorities that represent severity, then you can do something +like this: + + $ task config -- uda.priority.values Critical,Important, + +There is no practical limit on what values, or how many values you use. This +example suggests you might want to rename `priority` to be `severity` instead. + +[]{#warning} + +#### Warning + +If you sync tasks between different clients, you will need to configure those +clients in the same way, otherwise you\'ll find that Taskwarrior will enforce +the default configuration. diff --git a/content/docs/recurrence.md b/content/docs/recurrence.md new file mode 100644 index 00000000..6ef808f0 --- /dev/null +++ b/content/docs/recurrence.md @@ -0,0 +1,102 @@ +--- +title: "Taskwarrior - How Recurrence Works" +--- + +### How Recurrence Works + +A recurring task is a task with a due date that keeps coming back as a reminder. +Here is an example: + + task add Pay the rent due:1st recur:monthly until:2015-03-31 + Created task 123. + +This task has a due date, a monthly recurrence, and an optional until date +coinciding with the end of the lease. + +A recurring task is given a status of `recurring` which hides it from view, +although you can see it in the `all` report. The recurring task you create is +called the template task, from which recurring tasks instances are created. So +the template remains hidden, and the recurring instances that spawn from it are +the tasks that you will see and complete. + +Here is a look at the template task: + + $ task 123 info + + Name Value + ID 123 + Description Pay the rent + Status Recurring + Recurrence monthly + Entered 2014-03-01 12:13:28 (42 secs) + Due 2014-04-01 00:00:00 + Until 2015-03-31 00:00:00 + UUID 64bcf8fd-74d5-40d2-9e57-1d6a5922cdfc + Urgency 2.4 + +Now if you run a report, such as `task list`, you will see the first instance of +that recurring task generated. We can take a look at the instance: + + $ task 124 info + + Name Value + ID 124 + Description Pay the rent + Status Pending + Recurrence monthly + Parent task 64bcf8fd-74d5-40d2-9e57-1d6a5922cdfc + Mask Index 0 + Entered 2014-03-01 12:17:03 (15 secs) + Due 2014-04-01 00:00:00 + Until 2015-03-31 00:00:00 + UUID 29d2df7a-1165-4559-b974-a727519e00f1 + Urgency 2.4 + +Notice how the instance has a status `pending`, and a reference back to the +template task (Parent task). In addition you can see it inherited the recurrence +and description, and if there was a project, priority and tags, those would also +be inherited. + +The recurring instance has an attribute named \'Mask Index\', which is zero. +This indicates that it is the first of the many recurring task instances, the +counting being zero-based. + +Now if we look back at the template task, we see changes: + + $ task 123 info + + Name Value + ID 123 + Description Pay the rent + Status Recurring + Recurrence monthly + Mask - + Entered 2014-03-01 12:13:28 (3 mins) + Due 2014-04-01 00:00:00 + Until 2015-03-31 00:00:00 + Last modified 2014-03-01 12:17:03 (24 secs) + UUID 64bcf8fd-74d5-40d2-9e57-1d6a5922cdfc + Urgency 2.4 + + Date Modification + 2014-03-01 12:17:03 Mask set to '-'. + Modified set to '2014-03-01 12:17:03'. + +The template task now has a `mask` attribute, and some change history. That +`mask` is a string of task statuses. It has a value of `-` which indicates that +one instance was created, task 124, because it is one character long. The `-` +means that instance is still pending. This is how the template task keeps track +of what it does and does not need to generate. When the task instance changes +status that `-` becomes `+` (completed) or `X` (deleted) or `W` (waiting). + +Note that you never directly interact with task 123, the template task. It is +hidden for a reason. Instead, you interact with the recurring task instances, +and in most cases, changes are propagated to the template task and optionally +other sibling tasks. + +In this example one task instance is generated for the next due period. This is +because the configuration setting `recurrence.limit` is set to 1, the default. +If this number is increased to 2, then you would see the next 2 instances +generated. Note that this only generates two steps into the future, without +regard for whether those two instances are completed or not - don\'t expect to +complete the first task and see a new one pop up immediately. diff --git a/content/docs/report.md b/content/docs/report.md new file mode 100644 index 00000000..389d87bc --- /dev/null +++ b/content/docs/report.md @@ -0,0 +1,294 @@ +--- +title: "Taskwarrior - Reports" +--- + +### Reports + +Taskwarrior has three kinds of reports. There are built-in reports that cannot +be modified, such as `info` and `summary`. There are built-in reports which can +be redefined completely or eliminated, such as `list`, `next`. And finally there +are your own custom reports. To generate a list of \*all\* the reports, use the +`reports` command: + + $ task reports + + Report Description + active Active tasks + all All tasks + blocked Blocked tasks + blocking Blocking tasks + burndown.daily Shows a graphical burndown chart, by day + burndown.monthly Shows a graphical burndown chart, by month + burndown.weekly Shows a graphical burndown chart, by week + completed Completed tasks + ghistory.annual Shows a graphical report of task history, by year + ghistory.monthly Shows a graphical report of task history, by month + history.annual Shows a report of task history, by year + history.monthly Shows a report of task history, by month + information Shows all data and metadata + list Most details of tasks + long All details of tasks + ls Few details of tasks + minimal Minimal details of tasks + newest Newest tasks + next Most urgent tasks + oldest Oldest tasks + overdue Overdue tasks + projects Shows all project names used + ready Most urgent actionable tasks + recurring Recurring Tasks + summary Shows a report of task status by project + tags Shows a list of all tags used + unblocked Unblocked tasks + waiting Waiting (hidden) tasks + + 28 reports + +[]{#static} + +#### Built-In Static Reports + +Typically a report consists of a table of data, with one row of data +corresponding to a single task, with the task attributes represented as columns. +But there are other reports which do not conform to this structure. Those are +the built-in static reports, and they are not modifiable, because they are +quirky and require custom code. These reports are: + + burndown.daily + burndown.monthly + burndown.weekly + calendar + colors + export + ghistory.annual + ghistory.monthly + history.annual + history.monthly + information + summary + timesheet + +Each of these reports takes non-standard arguments, may or may not support +filters, and generates distinctive output. + +[]{#modifiable} + +#### Built-In Modifiable Reports + +These reports are standard format, using standard arguments, and are also +modifiable. + + active + all + blocked + blocking + completed + list + long + ls + minimal + newest + next + oldest + overdue + ready + recurring + unblocked + waiting + +Suppose you wanted to remove a column from one of these reports, for example +removing `tags` from the `minimal` report. First look at the existing columns +and labels of the `minimal` report: + + $ task show report.minimal.labels + + Config Variable Value + --------------------- --------------------------- + report.minimal.labels ID,Project,Tags,Description + + $ task show report.minimal.columns + + Config Variable Value + ---------------------- --------------------------------------- + report.minimal.columns id,project,tags.count,description.count + +Having determined what the current values are, simply override with the new +values: + + $ task config report.minimal.labels 'ID,Project,Description' + ... + $ task config report.minimal.columns 'id,project,description.count' + +You can think of the built-in modifiable reports as a set of default custom +reports. + +[]{#custom} + +#### Custom Reports + +Defining a custom report is straightforward. You have control over the data +shown, the sort order and the column labels. A custom report is simply a set of +configuration values, and those values include: + +- description +- columns +- labels +- sort +- filter + +Let us quickly create a custom report, which will be named `simple`. This report +will display the task ID, project name and description. We will need to gather +the five settings listed above. + +The description is the easiest, and in this case the report will be described: + + Simple list of open tasks by project + +This is just a descriptive label that will be used when the report is listed. +Next we need to specify the columns in the report, and the order in which those +are shown. Here the `_columns` helper command will show the columns available: + + $ task _columns + depends + description + due + end + entry + foo + id + imask + mask + modified + parent + priority + project + recur + scheduled + start + status + tags + until + urgency + uuid + wait + +That represents all the data that Taskwarrior stores, and therefore all the data +that may be shown in a report. Our `simple` report will show id, project and +description, which are all in the list. This means our column list is simply: + + id,project,description + +But there are also formats for each column, and the `columns` command shows +them, with examples. Here are the formats for our three columns: + + $ task columns id + + Columns Supported Formats Example + ------- ----------------- ------------------------------------ + id number* 123 + uuid long* f30cb9c3-3fc0-483f-bfb2-3bf134f00694 + short f30cb9c3 + +This is easy, because there is only one `id` format. + + $ task columns project + + Columns Supported Formats Example + ------- ----------------- ------------- + project full* home.garden + parent home + indented home.garden + +There are three formats for the `project` column, and the default, `full` is the +one we want. + + $ task columns description + + Columns Supported Formats Example + ----------- ----------------- ----------------------------------------------------------------------------- + description combined* Move your clothes down on to the lower peg + 2014-02-08 Immediately before your lunch + 2014-02-08 If you are playing in the match this afternoon + 2014-02-08 Before you write your letter home + 2014-02-08 If you're not getting your hair cut + desc Move your clothes down on to the lower peg + oneline Move your clothes down on to the lower peg 2014-02-08 Immediately before ... + this afternoon 2014-02-08 Before you write your letter home 2014-02-08 If ... + truncated Move your clothes do... + count Move your clothes down on to the lower peg [4] + +There are five formats for description. This time we prefer the `count` format, +so our columns list is now: + + id,project,description.count + +Labels are the column heading labels in the report. There are defaults, but we +wish to specify these like this: + + ID,Proj,Desc + +Sorting is also straightforward, and we want the tasks sorted by project, and +then by entry, which is the creation date for a task. This illustrates that a +task attribute that is not visible can be used in the sort. The sort order is +then: + + project+/,entry+ + +The `+` means an ascending order, but we could have used `-` for descending. The +`/` solidus indicates that `project` is a break column, which means a blank line +is inserted between unique values, for a visual grouping effect. [2.4.0]{.label +.label-success} + +Finally we need a filter, otherwise our report will just display all tasks, +which is rarely wanted. Here we wish to see only pending tasks, and that means +the filter is: + + status:pending + +Now we have our report definition, so we just create the five configuration +entries like this: + + $ task config report.simple.description 'Simple list of open tasks by project' + $ task config report.simple.columns 'id,project,description.count' + $ task config report.simple.labels 'ID,Proj,Desc' + $ task config report.simple.sort 'project+/,entry+' + $ task config report.simple.filter 'status:pending' + +Note the equivalent report directly from the config file would look like that: + + report.simple.description=Simple list of open tasks by project + report.simple.columns=id,project,description.count + report.simple.labels=ID,Proj,Desc + report.simple.sort=project+\/,entry+ + report.simple.filter=status:pending + +And it is finished. Run the report like this: + + $ task simple + + ID Proj Desc + -- ---- ----------------- + 1 Home Wash the windows + 3 Home Vacuum the floors + + 2 Food shopping + +Custom reports also show up in the help output. + + $ task help | grep simple + task sime Simple list of open tasks by project + +I can inspect the configuration. + + $ task show report.simple + + Config Variable Value + ------------------------- ------------------------------------ + report.simple.columns id,project,description.count + report.simple.description Simple list of open tasks by project + report.simple.filter status:pending + report.simple.labels ID,Proj,Desc + report.simple.sort project+/,entry+ + +Now the report is fully configured, it joins the others and is used in the same +way. diff --git a/content/docs/review.md b/content/docs/review.md new file mode 100644 index 00000000..7319b5e4 --- /dev/null +++ b/content/docs/review.md @@ -0,0 +1,98 @@ +--- +title: "Taskwarrior - Tasksh Review" +--- + +### Tasksh Review + +Beginning with release [1.1.0]{.label .label-success} the Taskwarrior shell +(`tasksh`) has a `review` command that lets you review your tasks. + +Reviewing your task list is important because you need to make sure you work on +the more urgent tasks first, and also make sure your list is up to date. Only +with accurate metadata (due dates, priorities \...) will your task list reflect +real world needs. Periodic review will help you maintain the right due dates, +priorities, dependencies, tags, project assignments and so on, while removing +tasks that are no longer needed. + +Here is a quick demo of the review feature: + +[]{#how} + +#### How it Works + +Ideally you would review your task list reguarly, once a week. If you find +yourself making no changes to the tasks, perhaps you should review less often. +The goal is for the review process to be effective at cleaning up the list, but +not a burden, or a waste of time. + +Tasksh implements the review by creating a Taskwarrior report just for this +purpose. It is named `_reviewed` and simply lists the UUID values of tasks that +need to be reviewed. This report then drives an interactive session where you go +through that list of tasks one at a time, and have the chance to modify, skip or +mark the task as reviewed. + +When you mark a task as reviewed, Tasksh adds a `reviewed` timestamp to the +task, as a [UDA](/docs/udas.html) defined for this purpose. This attribute is +used in the `_reviewed` report filter to make sure you don\'t review the same +task more often than weekly. + +The combination of the `reviewed` timestamp, and the `_reviewed` report means +that if you were to review all your tasks today, then immediately performing +another review would yields no tasks to review. After a week has passed, you +will be able to review all the tasks again. + +This ability to \'resume\' a review session means that you can stop a review +session at any time, and resume later. You can even specify how many tasks you +would like to review, which means you can review a small set of tasks more +frequently, making the review process shorter. + +When you first review, Tasksh will automatically configure Taskwarrior to create +the `_reviewed` report, and the `reviewed` UDA. Once the report is created, you +can modify it. Here is the report definition: + + $ task show report._reviewed + + Config Variable Value + ---------------------------- ------------------------------------------------------- + report._reviewed.columns uuid + report._reviewed.description Tasksh review report. Adjust the filter to your needs. + report._reviewed.filter ( reviewed.none: or reviewed.before:now-1week ) and + ( +PENDING or +WAITING ) + report._reviewed.sort reviewed+,modified+ + +The filter term `reviewed.before:now-1week` can be changed to suit your needs. + +[]{#tasksh} + +#### Launch Tasksh + +Launch tasksh, and you will immediately see a summary of available commands, +followed by a prompt: + + $ tasksh + + tasksh 1.1.0 + + tasksh> review [N] Task review session, with optional cutoff after N tasks + tasksh> list Or any other Taskwarrior command + tasksh> diagnostics Tasksh diagnostics + tasksh> help Tasksh help + tasksh> exec ls -al Any shell command. May also use '!ls -al' + tasksh> quit End of session. May also use 'exit' + + tasksh> + +You see here that `review` is one of the commands. You can simply start a review +session, which can be quit at any time: + + tasksh> review + ... + +Or you can review a fixed quantity of tasks: + + tasksh> review 12 + ... + +Reviewing a fixed quantity can help you iteratively review all your tasks at +convenient times, without having to go through the entire list at once. +::: diff --git a/content/docs/searching.md b/content/docs/searching.md new file mode 100644 index 00000000..dcd83f77 --- /dev/null +++ b/content/docs/searching.md @@ -0,0 +1,109 @@ +--- +title: "Taskwarrior - Searching" +--- + +### Searching + +Searching for keywords and patterns in tasks is straightforward, and uses the +`/pattern/` syntax. First we create some sample tasks, then we\'ll search them. + + $ task add foo + $ task add bar + $ task add baz + +In order to locate that first task, by the keyword `foo` we do this: + + $ task /foo/ list + + ID Age D Description Urg + -- ----- - ----------- ---- + 1 1min foo 0 + +The `/` characters delimit the search term, indicating what Taskwarrior should +do. Because task annotations are also searchable text, we can be sure that any +annotations containing the pattern `/foo/` will also be found. Let\'s add a task +with such an annotation: + + $ task 3 annotate footwear + $ task /foo/ long + + ID Created Mod Recur Description + -- ---------- ----- ----- --------------------- + 3 2014-09-28 2min baz + 2014-09-28 footwear + 1 2014-09-28 2min foo + +Here the `long` report is used so we can see the full annotation text. Notice +that the `foo` in the description of task 1, as well as the `footwear` in the +annotation of task 3 were both found. + +[]{#regexes} + +#### Regular Expressions + +Beginning in version [2.4.0]{.label .label-success} all search terms are by +default [regular expressions](/docs/terminology.html#regex). This means we could +have searched using this pattern, which means an `f` followed by two `o` +characters: + + $ task /fo{2}/ long + + ID Created Mod Recur Description + -- ---------- ----- ----- --------------------- + 3 2014-09-28 3min baz + 2014-09-28 footwear + 1 2014-09-28 3min foo + +In older versions, you would need to explicitly enable regex support like this: + + $ task rc.regex:on /fo{2}/ long + + ID Created Mod Recur Description + -- ---------- ----- ----- --------------------- + 3 2014-09-28 3min baz + 2014-09-28 footwear + 1 2014-09-28 3min foo + +Or you could put the setting in your `.taskrc` file. You can also turn off +regular expression support: + + $ task rc.regex:off /fo{2}/ long + + No matches. + +This fails because the search term `/fo{2}/` is this time considered just text, +not a regular expression and this term does not appear in any task. + +[]{#shell} + +#### Shell + +If your search term contains one or more spaces, then your +[shell](/docs/terminology.html#shell) is going to break the search pattern into +two arguments, and Taskwarrior will be confused. Solve this by either quoting or +escaping like these examples: + + $ task '/foo bar/' list + $ task /foo\ bar/ list + +This guarantees that Taskwarrior sees one argument, `/foo bar/` instead of two, +`/foo`, `bar/`. + +[]{#operators} + +#### Operators + +The search pattern syntax of `/pattern/` is there as a convenience, but there +are more powerful low-level operators, such that the above pattern is equivalent +to: + + $ task description~foo list + +Here the `~` match operator works much like that in Bash. To invert that, to +search for descriptions that *do not* contain the pattern, use the no-match +operator: + + $ task 'desc!~foo' list + +Here you see the `!~` no-match operator, an abbreviated `desc` attribute name, +and quoting, because Bash will interpret the `!` character in its own way. diff --git a/content/docs/start.md b/content/docs/start.md new file mode 100644 index 00000000..e975902f --- /dev/null +++ b/content/docs/start.md @@ -0,0 +1,215 @@ +--- +title: "Taskwarrior - What's next?" +--- + +::: {.banner style="background-color:#aab3ab; padding-top:32px;"} +::: {.container style="padding-top:16px;"} +::: {style="color:#ffffff; font-size:32px; font-weight:300;"} +What is Taskwarrior? +::: + +::: {.col-md-10} +::: {.col-md-1} +::: + +::: {.col-md-9 .main} +::: {.row} +Taskwarrior manages your TODO list from your command line. It is flexible, fast, +efficient, unobtrusive, does its job then gets out of your way. + +Taskwarrior scales to fit your workflow. Use it as a simple app that captures +tasks, shows you the list, and removes tasks from that list. Leverage its +capabilities though, and it becomes a sophisticated data query tool that can +help you stay organized, and get through your work. + +Taskwarrior is an active project, and we fix bugs, improve and add features +almost every day. +::: +::: +::: +::: +::: + +::: {.banner style="background-color:#c4cbb7;"} +::: {.container} +::: {style="color:#000000; font-size:32px; font-weight:300;"} +Why Choose Taskwarrior? +::: + +::: {.col-md-10} +::: {.col-md-1} +::: + +::: {.col-md-9 .main} +::: {.row} +Five good reasons to use Taskwarrior + +1. Are you a command line user looking for an unobtrusive, fast, efficient, + flexible tool to let you easily manage your task lists? Taskwarrior is + low-friction by design, allowing you to capture the details, and get right + back to work. + + $ task add Prepare the first draft of the proposal due:friday + + Taskwarrior uses a natural and expressive command line syntax.\ + \ + +2. Taskwarrior is methodology-neutral. Whether you follow + [GTD](https://gettingthingsdone.com/), use the [Pomodoro + technique](http://pomodorotechnique.com), or just do whatever works for you, + Taskwarrior provides capabilities to help you, not restrict you.\ + \ + +3. Taskwarrior has an active and friendly community, providing support and + various forms of help to new and experienced users. [Start here](/support) + for a list of support options. Need an immediate answer - check your man + pages and [online docs](/docs). Need to ask someone a question? try IRC + \#taskwarrior on freenode.\ + \ + +4. Taskwarrior is open in as many ways as it can be: + - It is [free and open + source](https://github.com/GothenburgBitFactory/taskwarrior), using the + MIT license + - It uses human-readable text files for storage. It imports and exports + [JSON](/docs/design/task.html), so your data is never held captive + - There is [DOM](/docs/dom.html) access and a [Hook script + API](/docs/hooks.html) + - There are many available free and open [extension scripts](/tools) + - There is [Vit](https://gothenburgbitfactory.org/projects/vit.html), a + curses-based UI + - There is [FreeCinc](https://freecinc.com/), a free online sync service + - There is [Inthe.AM](https://inthe.am/about), a free online sync service, + web UI and iOS client + - There is [BugWarrior](https://github.com/ralphbean/bugwarrior), so you + can import your bug issues from a dozen different bug systems + + \ + +5. Taskwarrior is an active, vibrant project. In the last year, it has averaged + 5.58 changes per day. Taskwarrior enjoys lively participation from many + contributors, with currently over 60 providers of code patches. But there + are even more contributors (252 of them) helping out with documentation, + bugs, support, ideas, requests and extensions. It\'s just going to keep + getting better.\ + \ +::: +::: +::: +::: +::: + +::: {.banner style="background-color:#ebefc9;"} +::: {.container} +::: {style="color:#000000; font-size:32px; font-weight:300;"} +A Quick Demonstration +::: + +::: {.col-md-10} +::: {.col-md-1} +::: + +::: {.col-md-9 .main} +::: {.row} +Let\'s see Taskwarrior in action. We\'ll first add a few tasks to our list. + + $ task add Buy milk + Created task 1. + + $ task add Buy eggs + Created task 2. + + $ task add Bake cake + Created task 3. + +Now let\'s see the list. + + $ task list + + ID Description + -- ----------- + 1 Buy milk + 2 Buy eggs + 3 Bake cake + + 3 tasks. + +Suppose we bought our ingredients and wish to mark the first two tasks as done. + + $ task 1 done + $ task 2 done + $ task list + + ID Description + -- ----------- + 1 Bake cake + + 1 task. + +Those are the first three features, the [add]{.kbd}, [list]{.kbd} and +[done]{.kbd} commands, but they represent all you really need to know, to get +started with Taskwarrior. + +But there are hundreds of other features, so if you learn more, you can do more. +It\'s entirely up to you to choose how you use Taskwarrior: stick to the simple +three commands above, or learn about sophisticated filtering, custom reports, +user-defined metadata, color rules, hook scripts, syncing and many more. +::: +::: +::: +::: +::: + +::: {.banner style="background-color:#eee0b7;"} +::: {.container} +::: {style="color:#000000; font-size:32px; font-weight:300;"} +Get your copy +::: + +::: {.col-md-10} +::: {.col-md-1} +::: + +::: {.col-md-9 .main} +::: {.row} +There are several ways for you to get a copy of Taskwarrior: + +- Install a binary package. Your operating system probably already has a + binary package available. These packages are usually named \'task\'. +- Download a release tarball, from [here](/download), then make sure you have + libuuid-dev (may be called uuid-dev) and gnutls-dev installed. Then using + cmake, GCC 4.7 / Clang 3.3, [build Taskwarrior](/docs/build.html). +- Using [git](https://git-scm.com/), clone the code repository, switch to the + current development branch, and [build Taskwarrior](/docs/build.html). +::: +::: +::: +::: +::: + +::: {.banner style="background-color:#e8caaf;"} +::: {.container} +::: {style="color:#000000; font-size:32px; font-weight:300;"} +What\'s next? +::: + +::: {.col-md-10} +::: {.col-md-1} +::: + +::: {.col-md-9 .main} +::: {.row} +Probably the most important next step is to simply start using Taskwarrior. +Capture your tasks, don\'t try to remember them. Review your task list to keep +it current. Consult your task list to guide your actions. Develop the habit. + +It doesn\'t take long until you realize that you might want to modify your +workflow. Perhaps you are missing due dates, and need more defined deadlines. +Perhaps you need to make greater use of tags to help you filter tasks +differently. You\'ll know if your workflow is not really helping you as much as +it could. + +This is when you might look closer at the [docs](/docs) and the recommended +[Best Practices](/docs/best-practices.html). + +Welcome to Taskwarrior. diff --git a/content/docs/syntax.md b/content/docs/syntax.md new file mode 100644 index 00000000..b3e1f0af --- /dev/null +++ b/content/docs/syntax.md @@ -0,0 +1,108 @@ +--- +title: "Taskwarrior - Command Line Syntax" +--- + +### Command Line Syntax + +Taskwarrior has a flexible command line syntax, but it may not be clear at first +what the underlying structure means. Here is the general form of the syntax: + +![](/docs/images/syntax.png){.img-responsive} + +There are four parts to the syntax (`filter`, `command`, `modifications`, and +`miscellaneous`), and each part is optional. + +[]{#command} + +### Command + +Each time you run Taskwarrior, you are issuing a `command` either explicitly, or +implicitly with the default command (the `default.command` configuration +setting). The command you specify determines how the command line is understood +by Taskwarrior. Here are some examples of that: + +![](/docs/images/syntaxes.png){.img-responsive} + +The first example, `task list` is a report with no filter, and the second, +`task +home list` is with a filter. The third, `task 12 modify project:Garden` +has both a filter and modifications. The last example, `task show editor` has a +miscellaneous argument. + +Taskwarrior looks for the first argument on the command line that looks like an +exact command name, and failing that, looks for an abbreviated command name. It +is better to use the full name of a command to avoid ambiguity. + +It is the position of the `command` argument, and the type of command that +determines how the arguments are understood. + +[]{#filter} + +### Filter + +A filter is a means of addressing a subset of tasks. Because filters are +optional, the simplest case is no filter. A command with no filter addresses all +tasks. + +Generally filter arguments appear before the command, so any arguments to the +left of the command are considered filter arguments. + +There is a special case, in which a command that does not support modifications +or miscellaneous arguments, expects only filter arguments, and so they can +appear before or after the command, without confusing Taskwarrior: + +![](/docs/images/filter.png){.img-responsive} + +[]{#mods} + +### Modifications + +If a command accepts modifications, they generally appear after the command. +Most commands that accept modifications also accept filters, and so the filter +arguments appear before the command, while the modifications appear after. Here +is an example: + +![](/docs/images/modification.png){.img-responsive} + +This command specifies a compound filter, consisting of more than one term. +These terms are logically combined with an `and` operator by default, unless +otherwise specified. In this case, tasks that have both the `home` tag, and a +`status` value of `pending` are to be modified. + +The modifications, appearing after the command, set the `priority` to `H`igh, +and the `due` date to the end of the month (`eom`). + +Because the filter is evaluated at runtime, we don\'t know how many tasks will +be modified. It could be none, one, many or all of the tasks. It could be +determined with: + + task +home status:pending count + +The user writing this command would have an idea of how many tasks this will +affect, but this is just an example, with no contextual data shown. + +[]{#misc} + +### Miscellaneous + +Some commands accept neither a filter, nor modifications, but do accept +miscellaneous arguments. An example is the `show` command, that queries +configuration settings, and does not accept a filter: + +![](/docs/images/miscellaneous.png){.img-responsive} + +This is another special case, in which the command only accepts miscellaneous +arguments, and so they can appear before or after the command. + +[]{#override} + +### Overrides + +Overrides are temporary values for configuration settings, and can be specified +anywhere on the command line, because they are not considered to be either +filter, modification or miscellaneous. In fact, the command itself doesn\'t see +the overrides, instead they are handled before the command runs. + +![](/docs/images/override.png){.img-responsive} + +There can be any number of overrides on the command line, and they have no +effect on the syntax. diff --git a/content/docs/tags.md b/content/docs/tags.md new file mode 100644 index 00000000..ce074c5d --- /dev/null +++ b/content/docs/tags.md @@ -0,0 +1,118 @@ +--- +title: "Taskwarrior - Tags & Virtual Tags" +--- + +### Tags & Virtual Tags + +The basic tag syntax is very powerful and simple to use. There are two ways to +use this, shown here: + + $ task +HOME list + $ task -WORK list + +These two commands illustrate the complete tag interface. The first command is a +filter that lists only tasks that have the `HOME` tag. The second command is a +filter that lists only tasks that *do not* have the `WORK` tag. The + and - +syntax therefore means presence and absence of a tag. This is simple to use, and +can be combined like this: + + $ task +HOME -WORK list + +This shows tasks that have the `HOME` tag, but do not have the `WORK` tag. This +is a very simple and easy to use mechanism, but it does require that your tasks +are properly tagged. In other words, it is based directly on task metadata. + +A tag may be any single word that does not start with a digit, punctuation, or +mathematical operator. + +[]{#complex} + +#### Complex Filters + +Some Taskwarrior filters are simple in concept, but the syntax is not that +straightforward. For example, to determine whether a task has a due date that +falls on the current day, you need to use this filter: + + $ task due.after:yesterday and due.before:tomorrow list + +This filters tasks with a due date during the narrow time window of \'today\'. +Note that is is not sufficient to just specify the date, because due dates all +have associated times (defaulting to 0:00:00), and if you want to match the +date, you need to consider the time. So for example, this command *does not* +list tasks due today: + + $ task due:today list + +Instead, this filter matches tasks with a due date of today, and a time of 0:00. +In order to see all tasks due today, you need to provide proper range +bracketing. + +[]{#simplification} + +#### Simplification + +Here is where virtual tags can help, by providing a simple tag interface to more +complex state conditions of the task. There is a virtual tag, named `TODAY` that +can be used in filters, and it means that instead of this filter: + + $ task due.after:yesterday and due.before:tomorrow list + +We can now use this: + + $ task +TODAY list + +Which is a much simpler way of filtering tasks due today. Because this is a tag +interface, we can also invert it: + + $ task -TODAY list + +This shows only tasks that are not due today. + +Virtual tags are built in to Taskwarrior. They are evaluated at run time, which +means they do not require direct metadata, and therefore do not occupy space in +the data files, but are determined according to the state of the task in the +same way that the complex filter example above is determined. + +Thus virtual tags combine the simplicity of the tag interface with more complex +defined conditions, for convenience. + +[]{#supported} + +#### Supported Virtual Tags + +Since version 2.2.0, Taskwarrior has supported virtual tags, and the list will +continue to grow. Here is the full list of supported virtual tags: + + ------------- --------------------------------------------------------------------------------------------------------------------- + `BLOCKED` Is the task dependent on another incomplete task? + `UNBLOCKED` The opposite of BLOCKED, for convenience. Note +BLOCKED == -UNBLOCKED and vice versa. + `BLOCKING` Does another task depend on this incomplete task? + `DUE` Is this task due within 7 days? Determined by rc.due + `DUETODAY` Is this task due sometime today? + `TODAY` Is this task due sometime today? + `OVERDUE` Is this task past it's due date? + `WEEK` Is this task due this week? [2.3.0]{.label .label-success} + `MONTH` Is this task due this month? [2.3.0]{.label .label-success} + `QUARTER` Is this task due this quarter? [2.6.0]{.label .label-success} + `YEAR` Is this task due this year? [2.3.0]{.label .label-success} + `ACTIVE` Is the task active, ie does it have a start date? + `SCHEDULED` Is the task scheduled, ie does it have a scheduled date? + `PARENT` Is the task a hidden parent recurring task? [2.3.0]{.label .label-success} + `CHILD` Is the task a recurring child task? + `UNTIL` Does the task expire, ie does it have an until date? + `WAITING` Is the task hidden, ie does it have a wait date? + `ANNOTATED` Does the task have any annotations? + `READY` Is the task pending, not blocked, and either not scheduled, or scheduled before now. [2.4.0]{.label .label-success} + `YESTERDAY` Was the task due yesterday? [2.4.0]{.label .label-success} + `TOMORROW` Is the task due tomorrow? [2.4.0]{.label .label-success} + `TAGGED` Does the task have any tags? + `PENDING` Is the task in the pending state? [2.4.0]{.label .label-success} + `COMPLETED` Is the task in the completed state? [2.4.0]{.label .label-success} + `DELETED` Is the task in the deleted state? [2.4.0]{.label .label-success} + `UDA` Does the task contain any UDA values? [2.5.0]{.label .label-success} + `ORPHAN` Does the task contain any orphaned UDA values? [2.5.0]{.label .label-success} + `PRIORITY` Does the task have a priority? [2.5.0]{.label .label-success} + `PROJECT` Does the task have a project? [2.5.0]{.label .label-success} + `LATEST` Is the task the most recently added task? [2.5.0]{.label .label-success} + ------------- --------------------------------------------------------------------------------------------------------------------- +::: diff --git a/content/docs/taskserver/ciphers.md b/content/docs/taskserver/ciphers.md new file mode 100644 index 00000000..cd06d225 --- /dev/null +++ b/content/docs/taskserver/ciphers.md @@ -0,0 +1,241 @@ +--- +title: "Taskwarrior - Taskserver Ciphers" +--- + +[]{#cipher} + +### Cipher Selection + +By default, Taskserver [1.0.0]{.label .label-success} uses the GnuTLS cipher +set: + + PERFORMANCE:%SERVER_PRECEDENCE + +Taskserver [1.1.0]{.label .label-success} and later uses this GnuTLS cipher set: + + NORMAL + +Taskwarrior uses: + + NORMAL + +You may wish to override these ciphers with a set that satisfies your security +needs. A vigilant Taskserver administrator may wish to respond to news of +various cipher weaknesses. For example, a more secure set would be to use only +TLS 1.2 and these ciphers: + + ECDHE-ECDSA-AES256-GCM-SHA384 + +If AES is later compromised, perhaps use: + + DHE-RSA-CAMELLIA256-SHA + +Should elliptical curves later be compromised, perhaps use: + + DHE-RSA-AES256-SHA + +You should be aware that this is a dynamic and volatile subject, and for the +best security you need to be aware of vulnerabilities. + +[]{#installed} + +#### Installed Ciphers + +Use this command to see a list of installed ciphers, and run it on both the +cilent and server machine to confirm that there is overlapping support between +client and server. + + $ gnutls-cli --list + Cipher suites: + TLS_RSA_NULL_MD5 0x00, 0x01 SSL3.0 + TLS_RSA_NULL_SHA1 0x00, 0x02 SSL3.0 + TLS_RSA_NULL_SHA256 0x00, 0x3b TLS1.0 + TLS_RSA_ARCFOUR_128_SHA1 0x00, 0x05 SSL3.0 + TLS_RSA_ARCFOUR_128_MD5 0x00, 0x04 SSL3.0 + TLS_RSA_3DES_EDE_CBC_SHA1 0x00, 0x0a SSL3.0 + TLS_RSA_AES_128_CBC_SHA1 0x00, 0x2f SSL3.0 + TLS_RSA_AES_256_CBC_SHA1 0x00, 0x35 SSL3.0 + TLS_RSA_CAMELLIA_128_CBC_SHA256 0x00, 0xba TLS1.0 + TLS_RSA_CAMELLIA_256_CBC_SHA256 0x00, 0xc0 TLS1.0 + TLS_RSA_CAMELLIA_128_CBC_SHA1 0x00, 0x41 SSL3.0 + TLS_RSA_CAMELLIA_256_CBC_SHA1 0x00, 0x84 SSL3.0 + TLS_RSA_AES_128_CBC_SHA256 0x00, 0x3c TLS1.0 + TLS_RSA_AES_256_CBC_SHA256 0x00, 0x3d TLS1.0 + TLS_RSA_AES_128_GCM_SHA256 0x00, 0x9c TLS1.2 + TLS_RSA_AES_256_GCM_SHA384 0x00, 0x9d TLS1.2 + TLS_RSA_CAMELLIA_128_GCM_SHA256 0xc0, 0x7a TLS1.2 + TLS_RSA_CAMELLIA_256_GCM_SHA384 0xc0, 0x7b TLS1.2 + TLS_RSA_SALSA20_256_SHA1 0xe4, 0x11 SSL3.0 + TLS_RSA_SALSA20_256_UMAC96 0xe4, 0x31 SSL3.0 + TLS_RSA_ESTREAM_SALSA20_256_SHA1 0xe4, 0x10 SSL3.0 + TLS_RSA_ESTREAM_SALSA20_256_UMAC96 0xe4, 0x30 SSL3.0 + TLS_DHE_DSS_ARCFOUR_128_SHA1 0x00, 0x66 SSL3.0 + TLS_DHE_DSS_3DES_EDE_CBC_SHA1 0x00, 0x13 SSL3.0 + TLS_DHE_DSS_AES_128_CBC_SHA1 0x00, 0x32 SSL3.0 + TLS_DHE_DSS_AES_256_CBC_SHA1 0x00, 0x38 SSL3.0 + TLS_DHE_DSS_CAMELLIA_128_CBC_SHA256 0x00, 0xbd TLS1.0 + TLS_DHE_DSS_CAMELLIA_256_CBC_SHA256 0x00, 0xc3 TLS1.0 + TLS_DHE_DSS_CAMELLIA_128_CBC_SHA1 0x00, 0x44 SSL3.0 + TLS_DHE_DSS_CAMELLIA_256_CBC_SHA1 0x00, 0x87 SSL3.0 + TLS_DHE_DSS_AES_128_CBC_SHA256 0x00, 0x40 TLS1.0 + TLS_DHE_DSS_AES_256_CBC_SHA256 0x00, 0x6a TLS1.0 + TLS_DHE_DSS_AES_128_GCM_SHA256 0x00, 0xa2 TLS1.2 + TLS_DHE_DSS_AES_256_GCM_SHA384 0x00, 0xa3 TLS1.2 + TLS_DHE_DSS_CAMELLIA_128_GCM_SHA256 0xc0, 0x80 TLS1.2 + TLS_DHE_DSS_CAMELLIA_256_GCM_SHA384 0xc0, 0x81 TLS1.2 + TLS_DHE_RSA_3DES_EDE_CBC_SHA1 0x00, 0x16 SSL3.0 + TLS_DHE_RSA_AES_128_CBC_SHA1 0x00, 0x33 SSL3.0 + TLS_DHE_RSA_AES_256_CBC_SHA1 0x00, 0x39 SSL3.0 + TLS_DHE_RSA_CAMELLIA_128_CBC_SHA256 0x00, 0xbe TLS1.0 + TLS_DHE_RSA_CAMELLIA_256_CBC_SHA256 0x00, 0xc4 TLS1.0 + TLS_DHE_RSA_CAMELLIA_128_CBC_SHA1 0x00, 0x45 SSL3.0 + TLS_DHE_RSA_CAMELLIA_256_CBC_SHA1 0x00, 0x88 SSL3.0 + TLS_DHE_RSA_AES_128_CBC_SHA256 0x00, 0x67 TLS1.0 + TLS_DHE_RSA_AES_256_CBC_SHA256 0x00, 0x6b TLS1.0 + TLS_DHE_RSA_AES_128_GCM_SHA256 0x00, 0x9e TLS1.2 + TLS_DHE_RSA_AES_256_GCM_SHA384 0x00, 0x9f TLS1.2 + TLS_DHE_RSA_CAMELLIA_128_GCM_SHA256 0xc0, 0x7c TLS1.2 + TLS_DHE_RSA_CAMELLIA_256_GCM_SHA384 0xc0, 0x7d TLS1.2 + TLS_ECDHE_RSA_NULL_SHA1 0xc0, 0x10 SSL3.0 + TLS_ECDHE_RSA_3DES_EDE_CBC_SHA1 0xc0, 0x12 SSL3.0 + TLS_ECDHE_RSA_AES_128_CBC_SHA1 0xc0, 0x13 SSL3.0 + TLS_ECDHE_RSA_AES_256_CBC_SHA1 0xc0, 0x14 SSL3.0 + TLS_ECDHE_RSA_AES_256_CBC_SHA384 0xc0, 0x28 TLS1.0 + TLS_ECDHE_RSA_ARCFOUR_128_SHA1 0xc0, 0x11 SSL3.0 + TLS_ECDHE_RSA_CAMELLIA_128_CBC_SHA256 0xc0, 0x76 TLS1.0 + TLS_ECDHE_RSA_CAMELLIA_256_CBC_SHA384 0xc0, 0x77 TLS1.0 + TLS_ECDHE_ECDSA_NULL_SHA1 0xc0, 0x06 SSL3.0 + TLS_ECDHE_ECDSA_3DES_EDE_CBC_SHA1 0xc0, 0x08 SSL3.0 + TLS_ECDHE_ECDSA_AES_128_CBC_SHA1 0xc0, 0x09 SSL3.0 + TLS_ECDHE_ECDSA_AES_256_CBC_SHA1 0xc0, 0x0a SSL3.0 + TLS_ECDHE_ECDSA_ARCFOUR_128_SHA1 0xc0, 0x07 SSL3.0 + TLS_ECDHE_ECDSA_CAMELLIA_128_CBC_SHA256 0xc0, 0x72 TLS1.0 + TLS_ECDHE_ECDSA_CAMELLIA_256_CBC_SHA384 0xc0, 0x73 TLS1.0 + TLS_ECDHE_ECDSA_AES_128_CBC_SHA256 0xc0, 0x23 TLS1.0 + TLS_ECDHE_RSA_AES_128_CBC_SHA256 0xc0, 0x27 TLS1.0 + TLS_ECDHE_ECDSA_CAMELLIA_128_GCM_SHA256 0xc0, 0x86 TLS1.2 + TLS_ECDHE_ECDSA_CAMELLIA_256_GCM_SHA384 0xc0, 0x87 TLS1.2 + TLS_ECDHE_ECDSA_AES_128_GCM_SHA256 0xc0, 0x2b TLS1.2 + TLS_ECDHE_ECDSA_AES_256_GCM_SHA384 0xc0, 0x2c TLS1.2 + TLS_ECDHE_RSA_AES_128_GCM_SHA256 0xc0, 0x2f TLS1.2 + TLS_ECDHE_RSA_AES_256_GCM_SHA384 0xc0, 0x30 TLS1.2 + TLS_ECDHE_ECDSA_AES_256_CBC_SHA384 0xc0, 0x24 TLS1.0 + TLS_ECDHE_RSA_CAMELLIA_128_GCM_SHA256 0xc0, 0x8a TLS1.2 + TLS_ECDHE_RSA_CAMELLIA_256_GCM_SHA384 0xc0, 0x8b TLS1.2 + TLS_ECDHE_RSA_SALSA20_256_SHA1 0xe4, 0x13 SSL3.0 + TLS_ECDHE_RSA_SALSA20_256_UMAC96 0xe4, 0x33 SSL3.0 + TLS_ECDHE_ECDSA_SALSA20_256_SHA1 0xe4, 0x15 SSL3.0 + TLS_ECDHE_ECDSA_SALSA20_256_UMAC96 0xe4, 0x35 SSL3.0 + TLS_ECDHE_RSA_ESTREAM_SALSA20_256_SHA1 0xe4, 0x12 SSL3.0 + TLS_ECDHE_RSA_ESTREAM_SALSA20_256_UMAC96 0xe4, 0x32 SSL3.0 + TLS_ECDHE_ECDSA_ESTREAM_SALSA20_256_SHA1 0xe4, 0x14 SSL3.0 + TLS_ECDHE_ECDSA_ESTREAM_SALSA20_256_UMAC96 0xe4, 0x34 SSL3.0 + TLS_ECDHE_PSK_3DES_EDE_CBC_SHA1 0xc0, 0x34 SSL3.0 + TLS_ECDHE_PSK_AES_128_CBC_SHA1 0xc0, 0x35 SSL3.0 + TLS_ECDHE_PSK_AES_256_CBC_SHA1 0xc0, 0x36 SSL3.0 + TLS_ECDHE_PSK_AES_128_CBC_SHA256 0xc0, 0x37 TLS1.0 + TLS_ECDHE_PSK_AES_256_CBC_SHA384 0xc0, 0x38 TLS1.0 + TLS_ECDHE_PSK_ARCFOUR_128_SHA1 0xc0, 0x33 SSL3.0 + TLS_ECDHE_PSK_NULL_SHA256 0xc0, 0x3a TLS1.0 + TLS_ECDHE_PSK_NULL_SHA384 0xc0, 0x3b TLS1.0 + TLS_ECDHE_PSK_CAMELLIA_128_CBC_SHA256 0xc0, 0x9a TLS1.0 + TLS_ECDHE_PSK_CAMELLIA_256_CBC_SHA384 0xc0, 0x9b TLS1.0 + TLS_ECDHE_PSK_SALSA20_256_SHA1 0xe4, 0x19 SSL3.0 + TLS_ECDHE_PSK_SALSA20_256_UMAC96 0xe4, 0x39 SSL3.0 + TLS_ECDHE_PSK_ESTREAM_SALSA20_256_SHA1 0xe4, 0x18 SSL3.0 + TLS_ECDHE_PSK_ESTREAM_SALSA20_256_UMAC96 0xe4, 0x38 SSL3.0 + TLS_PSK_ARCFOUR_128_SHA1 0x00, 0x8a SSL3.0 + TLS_PSK_3DES_EDE_CBC_SHA1 0x00, 0x8b SSL3.0 + TLS_PSK_AES_128_CBC_SHA1 0x00, 0x8c SSL3.0 + TLS_PSK_AES_256_CBC_SHA1 0x00, 0x8d SSL3.0 + TLS_PSK_AES_128_CBC_SHA256 0x00, 0xae TLS1.0 + TLS_PSK_AES_256_GCM_SHA384 0x00, 0xa9 TLS1.2 + TLS_PSK_CAMELLIA_128_GCM_SHA256 0xc0, 0x8e TLS1.2 + TLS_PSK_CAMELLIA_256_GCM_SHA384 0xc0, 0x8f TLS1.2 + TLS_PSK_AES_128_GCM_SHA256 0x00, 0xa8 TLS1.2 + TLS_PSK_NULL_SHA256 0x00, 0xb0 TLS1.0 + TLS_PSK_CAMELLIA_128_CBC_SHA256 0xc0, 0x94 TLS1.0 + TLS_PSK_CAMELLIA_256_CBC_SHA384 0xc0, 0x95 TLS1.0 + TLS_PSK_SALSA20_256_SHA1 0xe4, 0x17 SSL3.0 + TLS_PSK_SALSA20_256_UMAC96 0xe4, 0x37 SSL3.0 + TLS_PSK_ESTREAM_SALSA20_256_SHA1 0xe4, 0x16 SSL3.0 + TLS_PSK_ESTREAM_SALSA20_256_UMAC96 0xe4, 0x36 SSL3.0 + TLS_PSK_AES_256_CBC_SHA384 0x00, 0xaf TLS1.0 + TLS_PSK_NULL_SHA384 0x00, 0xb1 TLS1.0 + TLS_RSA_PSK_ARCFOUR_128_SHA1 0x00, 0x92 SSL3.0 + TLS_RSA_PSK_3DES_EDE_CBC_SHA1 0x00, 0x93 SSL3.0 + TLS_RSA_PSK_AES_128_CBC_SHA1 0x00, 0x94 SSL3.0 + TLS_RSA_PSK_AES_256_CBC_SHA1 0x00, 0x95 SSL3.0 + TLS_RSA_PSK_CAMELLIA_128_GCM_SHA256 0xc0, 0x92 TLS1.2 + TLS_RSA_PSK_CAMELLIA_256_GCM_SHA384 0xc0, 0x93 TLS1.2 + TLS_RSA_PSK_AES_128_GCM_SHA256 0x00, 0xac TLS1.2 + TLS_RSA_PSK_AES_128_CBC_SHA256 0x00, 0xb6 TLS1.0 + TLS_RSA_PSK_NULL_SHA256 0x00, 0xb8 TLS1.0 + TLS_RSA_PSK_AES_256_GCM_SHA384 0x00, 0xad TLS1.2 + TLS_RSA_PSK_AES_256_CBC_SHA384 0x00, 0xb7 TLS1.0 + TLS_RSA_PSK_NULL_SHA384 0x00, 0xb9 TLS1.0 + TLS_RSA_PSK_CAMELLIA_128_CBC_SHA256 0xc0, 0x98 TLS1.0 + TLS_RSA_PSK_CAMELLIA_256_CBC_SHA384 0xc0, 0x99 TLS1.0 + TLS_DHE_PSK_ARCFOUR_128_SHA1 0x00, 0x8e SSL3.0 + TLS_DHE_PSK_3DES_EDE_CBC_SHA1 0x00, 0x8f SSL3.0 + TLS_DHE_PSK_AES_128_CBC_SHA1 0x00, 0x90 SSL3.0 + TLS_DHE_PSK_AES_256_CBC_SHA1 0x00, 0x91 SSL3.0 + TLS_DHE_PSK_AES_128_CBC_SHA256 0x00, 0xb2 TLS1.0 + TLS_DHE_PSK_AES_128_GCM_SHA256 0x00, 0xaa TLS1.2 + TLS_DHE_PSK_NULL_SHA256 0x00, 0xb4 TLS1.0 + TLS_DHE_PSK_NULL_SHA384 0x00, 0xb5 TLS1.0 + TLS_DHE_PSK_AES_256_CBC_SHA384 0x00, 0xb3 TLS1.0 + TLS_DHE_PSK_AES_256_GCM_SHA384 0x00, 0xab TLS1.2 + TLS_DHE_PSK_CAMELLIA_128_CBC_SHA256 0xc0, 0x96 TLS1.0 + TLS_DHE_PSK_CAMELLIA_256_CBC_SHA384 0xc0, 0x97 TLS1.0 + TLS_DHE_PSK_CAMELLIA_128_GCM_SHA256 0xc0, 0x90 TLS1.2 + TLS_DHE_PSK_CAMELLIA_256_GCM_SHA384 0xc0, 0x91 TLS1.2 + TLS_DH_ANON_ARCFOUR_128_MD5 0x00, 0x18 SSL3.0 + TLS_DH_ANON_3DES_EDE_CBC_SHA1 0x00, 0x1b SSL3.0 + TLS_DH_ANON_AES_128_CBC_SHA1 0x00, 0x34 SSL3.0 + TLS_DH_ANON_AES_256_CBC_SHA1 0x00, 0x3a SSL3.0 + TLS_DH_ANON_CAMELLIA_128_CBC_SHA256 0x00, 0xbf TLS1.0 + TLS_DH_ANON_CAMELLIA_256_CBC_SHA256 0x00, 0xc5 TLS1.0 + TLS_DH_ANON_CAMELLIA_128_CBC_SHA1 0x00, 0x46 SSL3.0 + TLS_DH_ANON_CAMELLIA_256_CBC_SHA1 0x00, 0x89 SSL3.0 + TLS_DH_ANON_AES_128_CBC_SHA256 0x00, 0x6c TLS1.0 + TLS_DH_ANON_AES_256_CBC_SHA256 0x00, 0x6d TLS1.0 + TLS_DH_ANON_AES_128_GCM_SHA256 0x00, 0xa6 TLS1.2 + TLS_DH_ANON_AES_256_GCM_SHA384 0x00, 0xa7 TLS1.2 + TLS_DH_ANON_CAMELLIA_128_GCM_SHA256 0xc0, 0x84 TLS1.2 + TLS_DH_ANON_CAMELLIA_256_GCM_SHA384 0xc0, 0x85 TLS1.2 + TLS_ECDH_ANON_NULL_SHA1 0xc0, 0x15 SSL3.0 + TLS_ECDH_ANON_3DES_EDE_CBC_SHA1 0xc0, 0x17 SSL3.0 + TLS_ECDH_ANON_AES_128_CBC_SHA1 0xc0, 0x18 SSL3.0 + TLS_ECDH_ANON_AES_256_CBC_SHA1 0xc0, 0x19 SSL3.0 + TLS_ECDH_ANON_ARCFOUR_128_SHA1 0xc0, 0x16 SSL3.0 + TLS_SRP_SHA_3DES_EDE_CBC_SHA1 0xc0, 0x1a SSL3.0 + TLS_SRP_SHA_AES_128_CBC_SHA1 0xc0, 0x1d SSL3.0 + TLS_SRP_SHA_AES_256_CBC_SHA1 0xc0, 0x20 SSL3.0 + TLS_SRP_SHA_DSS_3DES_EDE_CBC_SHA1 0xc0, 0x1c SSL3.0 + TLS_SRP_SHA_RSA_3DES_EDE_CBC_SHA1 0xc0, 0x1b SSL3.0 + TLS_SRP_SHA_DSS_AES_128_CBC_SHA1 0xc0, 0x1f SSL3.0 + TLS_SRP_SHA_RSA_AES_128_CBC_SHA1 0xc0, 0x1e SSL3.0 + TLS_SRP_SHA_DSS_AES_256_CBC_SHA1 0xc0, 0x22 SSL3.0 + TLS_SRP_SHA_RSA_AES_256_CBC_SHA1 0xc0, 0x21 SSL3.0 + + Certificate types: CTYPE-X.509, CTYPE-OPENPGP + Protocols: VERS-SSL3.0, VERS-TLS1.0, VERS-TLS1.1, VERS-TLS1.2, VERS-DTLS0.9, VERS-DTLS1.0, VERS-DTLS1.2 + Ciphers: AES-256-CBC, AES-192-CBC, AES-128-CBC, AES-128-GCM, AES-256-GCM, ARCFOUR-128, ESTREAM-SALSA20-256, SALSA20-256, CAMELLIA-256-CBC, CAMELLIA-192-CBC, CAMELLIA-128-CBC, CAMELLIA-128-GCM, CAMELLIA-256-GCM, 3DES-CBC, DES-CBC, ARCFOUR-40, RC2-40 + MACs: SHA1, MD5, SHA256, SHA384, SHA512, SHA224, UMAC-96, UMAC-128, AEAD + Digests: SHA1, MD5, SHA256, SHA384, SHA512, SHA224 + Key exchange algorithms: ANON-DH, ANON-ECDH, RSA, DHE-RSA, DHE-DSS, ECDHE-RSA, ECDHE-ECDSA, SRP-DSS, SRP-RSA, SRP, PSK, RSA-PSK, DHE-PSK, ECDHE-PSK + Compression: COMP-DEFLATE, COMP-NULL + Elliptic curves: CURVE-SECP192R1, CURVE-SECP224R1, CURVE-SECP256R1, CURVE-SECP384R1, CURVE-SECP521R1 + Public Key Systems: RSA, DSA, EC + PK-signatures: SIGN-RSA-SHA1, SIGN-RSA-SHA1, SIGN-RSA-SHA224, SIGN-RSA-SHA256, SIGN-RSA-SHA384, SIGN-RSA-SHA512, SIGN-RSA-RMD160, SIGN-DSA-SHA1, SIGN-DSA-SHA1, SIGN-DSA-SHA224, SIGN-DSA-SHA256, SIGN-RSA-MD5, SIGN-RSA-MD5, SIGN-RSA-MD2, SIGN-ECDSA-SHA1, SIGN-ECDSA-SHA224, SIGN-ECDSA-SHA256, SIGN-ECDSA-SHA384, SIGN-ECDSA-SHA512 + +This is example output, and it changes with GnuTLS releases. Choose well. + +[]{#config} + +#### Configuration + +Taskserver supports the `ciphers` configuration setting and Taskwarrior supports +`taskd.ciphers` as a means to override the default set. +::: diff --git a/content/docs/taskserver/configure.md b/content/docs/taskserver/configure.md new file mode 100644 index 00000000..de61da2e --- /dev/null +++ b/content/docs/taskserver/configure.md @@ -0,0 +1,121 @@ +--- +title: "Taskwarrior - Taskserver Configuration" +--- + +[]{#config} + +### [3]{.label .label-success} Server Configuration + +Configuring the server is straightforward, but needs a little planning. + +[]{#location} + +#### Choose a Data Location + +A location for the data must be chosen and created. The `TASKDDATA` environment +variable will be used to indicate that location to all the `taskd` commands. + + $ export TASKDDATA=/var/taskd + $ mkdir -p $TASKDDATA + +If the `TASKDDATA` variable is not set, then most `taskd` commands require the +`--data ...` argument, otherwise the commands rely on the `TASKDDATA` value to +indicate the location. Everything the server does will be confined to that +directory. + +Note that there are two \'D\'s in `TASKDDATA`, and omitting one is a common +mistake to make. + +Note that there must be write permission in the directory for the user that will +run the server. + +[]{#init} + +#### Initialization + +Now we let the server initialize that directory: + + $ taskd init + You must specify the 'server' variable, for example: + taskd config server localhost:53589 + + Created /var/taskd + +[]{#keys} + +#### Keys & Certificates + +Now we create certificates and keys. The command below will generate all the +certs and keys for the server, but this uses self-signed certificates, and this +is not recommended for production use. This is for personal use, and this may be +acceptable for you, but if not, you will need to purchase a proper certificate +and key, backed by a certificate authority. + +The certificate and key generation scripts make assumptions ***that are +guaranteed to be wrong for you***. Specifically the `generate.server` script has +a hard-coded `CN` entry that is not going to work. You ***need*** to edit the +`vars` file. + + ... + CN=localhost + ... + +You will need to modify this value to match your server. It is this value +against which Taskwarrior validates the server name, so use a value similar to +`foo.example.com`, but of course don\'t expect that to work for you. If you do +not change this value, the only option for the client is to skip some or all +certificate validation, ***which is a bad idea.*** + +Go to your `taskd` directory, which depends on which installation method you +chose. Here is is assumed that you installed from the source tarball. + + $ cd ~/taskd-1.1.0/pki + $ ./generate + ... + $ + $ cp client.cert.pem $TASKDDATA + $ cp client.key.pem $TASKDDATA + $ cp server.cert.pem $TASKDDATA + $ cp server.key.pem $TASKDDATA + $ cp server.crl.pem $TASKDDATA + $ cp ca.cert.pem $TASKDDATA + $ + $ taskd config --force client.cert $TASKDDATA/client.cert.pem + $ taskd config --force client.key $TASKDDATA/client.key.pem + $ taskd config --force server.cert $TASKDDATA/server.cert.pem + $ taskd config --force server.key $TASKDDATA/server.key.pem + $ taskd config --force server.crl $TASKDDATA/server.crl.pem + $ taskd config --force ca.cert $TASKDDATA/ca.cert.pem + +There are three classes of key/cert here. There is the CA (Certificate +Authority) cert, which has cert signing capabilities and is used to sign and +verify the other certs. There are the server key/certs, which are used to +authenticate the server and encrypt. Finally there are client key/certs, which +are not what you might expect. These are for API access, and not for your +Taskwarrior client. Those are created later. + +[]{#other} + +#### Configuration + +Now we configure some basic details for the server. The chosen port is 53589. +Note that we allow Taskwarrior clients specifically. + + $ cd $TASKDDATA/.. + $ taskd config --force log $PWD/taskd.log + $ taskd config --force pid.file $PWD/taskd.pid + $ taskd config --force server localhost:53589 + +Note that we have chosen `localhost:53589`, but this choice has consequences. +The name `localhost` is not network visible, which limits the server to only +serving clients on the same machine. Use your full machine name for proper +network addressability. + +You can look at all the configuration settings: + + $ taskd config + +You can view all the supported settings with: + + $ man taskdrc +::: diff --git a/content/docs/taskserver/control.md b/content/docs/taskserver/control.md new file mode 100644 index 00000000..9bfc07bf --- /dev/null +++ b/content/docs/taskserver/control.md @@ -0,0 +1,87 @@ +--- +title: "Taskwarrior - Control Tasksserver" +--- + +[]{#control} + +### [3]{.label .label-success} Server Start/Stop + +You can now to launch the server: + + $ taskdctl start + +This command launched the server as a daemon process. This command requires the +`TASKDDATA` variable. Your server is now running, and ready for syncing. Note +that to stop the server, you use: + + $ taskdctl stop + +Check that your server is running by looking in the `taskd.log` file, or running +this: + + $ ps -leaf | grep taskd + +[]{#interactive} + +#### Interactive or Non-Daemon Server + +A daemon server is typically how you would want to run Taskserver, but there may +be times when you need to run the server attached to a terminal. These two +commands are identical: + + $ taskdctl start + $ taskd server --data $TASKDDATA --daemon + +By omitting the `--daemon` option, the server remains attached to the terminal. +Then to stop the server you can enter `Ctrl-C`. + +The interactive mode is really only useful for debugging, in conjunction with +TLS debug mode, like this: + + $ taskd config debug.tls 3 + $ taskd server --data $TASKDDATA + ... + +With a `debug.tls` setting that is non-zero, you see lots of security-related +diagnostic output. + +[]{#systemd} + +#### Configure Taskserver to run with a systemd-unit-file + +You can start Taskserver using a systemd-unitfile like the following (please add +the contents of `$TASKDDATA` not the variable itself). Running the Taskserver as +root is not recommended, please add an appropriate user and group to run the +daemon with (`$TASKDUSER` and `$TASKDGROUP`). + + [Unit] + Description=Secure server providing multi-user, multi-client access to Taskwarrior data + Requires=network.target + After=network.target + Documentation=https://taskwarrior.org/docs/#taskd + + [Service] + ExecStart=/usr/local/bin/taskd server --data $TASKDDATA + Type=simple + User=$TASKDUSER + Group=$TASKDGROUP + WorkingDirectory=$TASKDDATA + PrivateTmp=true + InaccessibleDirectories=/home /root /boot /opt /mnt /media + ReadOnlyDirectories=/etc /usr + + [Install] + WantedBy=multi-user.target + +Afterwards prepare systemd to recognise the file. + + $ cp taskd.service /etc/systemd/system + $ systemctl daemon-reload + $ systemctl start taskd.service + $ systemctl status taskd.service + +In case everything is running fine, enable the script to start Taskserver on +every boot. + + $ systemctl enable taskd.service +::: diff --git a/content/docs/taskserver/git.md b/content/docs/taskserver/git.md new file mode 100644 index 00000000..5d686e0a --- /dev/null +++ b/content/docs/taskserver/git.md @@ -0,0 +1,180 @@ +--- +title: "Taskwarrior - Taskserver Installation from Git-Repository" +--- + +[]{#installation} + +### [2.3]{.label .label-success} Installation + +Installing Taskserver from git is a matter of cloning the git repository and +building the server. + +[]{#depends} + +#### Dependencies + +Before building the software, you will need to satisfy the dependencies by +installing the following: + +- `git` +- GnuTLS (likely `libgnutls-dev`, ideally version 3.2 or newer) +- `libuuid` +- CMake (2.8 or newer) +- `make` +- A C++ Compiler (GCC 4.7 or Clang 3.0 or newer) + +Note that some OSes (Darwin, FreeBSD \...) include `libuuid` functionality in +libc. + +You don\'t necessarily need the latest version of all components, but it is a +good idea if you can. GnuTLS is a security component, and as such, it is very +important that it is current. Using GnuTLS version 2.12.x is neither adequately +secure, nor production quality. + +[]{#clone} + +#### Clone + +Now clone the repository like this: + + $ git clone https://github.com/GothenburgBitFactory/taskserver.git taskserver.git + ... + +::: {.alert .alert-info} +It is hightly recommended that you build the stable version. This involves +simply moving on to the next step, [\'Build\'](#build). Only under special +circumstances should you build the unstable development version. + +The unstable development version is at no point guaranteed to work or even +compile. The only time it does ѕtabilize is right at the end of the development +cycle, and in that case, you should wait until the release, so you are running a +supported version. + +The stable version is always merged to the `master` branch, which is the default +branch, so ordinarily nothing needs to be done. To build an unstable branch, +first determine which branch by looking at the available branches: + + $ cd taskd.git + $ git branch -a + * master + remotes/origin/1.1.0 + remotes/origin/1.1.1 + remotes/origin/1.2.0 + remotes/origin/HEAD -> origin/master + remotes/origin/master + +The convention we use is that `master` represents the stable release. The +numbered branches represent the latest development (1.2.0, the \'highest\' +branch number, ending in \'.0\') and a patch branch (1.1.1, ending in a non-zero +number). + +Patch branches are reserved for emeergency releases, so in this example you +would choose to build 1.2.0 as the latest development branch like this: + + $ git checkout 1.2.0 + Branch 1.2.0 set up to track remote branch 1.2.0 from origin. + Switched to a new branch '1.2.0' + + $ git submodule init + Submodule 'src/libshared' (https://github.com/GothenburgBitFactory/libshared.git) registered for path 'src/libshared' + + $ git submodule update + Cloning into 'src/libshared'... + remote: Counting objects: 2180, done. + remote: Compressing objects: 100% (1379/1379), done. + remote: Total 2180 (delta 1640), reused 1018 (delta 796) + Receiving objects: 100% (2180/2180), 373.50 KiB | 244.00 KiB/s, done. + Resolving deltas: 100% (1640/1640), done. + Submodule path 'src/libshared': checked out '2b0b70d90acb9a3ff3548befab9db8beb85a0c2d' +::: + +[]{#build} + +#### Build + +Now build the Taskserver. + + $ cd taskd.git + $ cmake -DCMAKE_BUILD_TYPE=release . + ... + $ make + ... + +[]{#test} + +#### Test + +Having built the server, now build and run the unit tests. Although this is an +optional step, it is a good idea to know whether the build works on your +platform. + + $ cd test + $ make + ... + $ ./run_all + + Pass: 2920 + Fail: 0 + Skipped: 0 + Runtime: 1 seconds + + $ cd .. + $ + +This example shows that all 2,920 tests pass. If you see test failures, stop and +report them. Note that there are some unit tests that fail if you have not built +the latest commit. Seeing 4 test failures may mean all is well. Seeing 30 +failures does not. + +[]{#install} + +#### Install + +Now install Taskserver. This copies files into the right place, and installs man +pages. + + $ sudo make install + ... + +[]{#verify} + +#### Verify + +Run the `taskd` command to verify that the server is installed, and the location +is in your `$PATH`. You should see something like this: + + $ taskd + + Usage: taskd -v|--version + taskd -h|--help + taskd diagnostics + taskd validate + taskd help [] + + Commands run only on server: + taskd add [options] org + taskd add [options] group + taskd add [options] user + taskd config [options] [--force] [ []] + taskd init [options] + taskd remove [options] org + taskd remove [options] group + taskd remove [options] user + taskd resume [options] org + taskd resume [options] group + taskd resume [options] user + taskd server [options] [--daemon] + taskd status [options] + taskd suspend [options] org + taskd suspend [options] group + taskd suspend [options] user + + Commands run remotely: + taskd client [options] [ ...] + + Common Options: + --quiet Turns off verbose output + --debug Generates debugging diagnostics + --data Data directory, otherwise $TASKDDATA + --NAME=VALUE Temporary configuration override +::: diff --git a/content/docs/taskserver/package.md b/content/docs/taskserver/package.md new file mode 100644 index 00000000..7817db5c --- /dev/null +++ b/content/docs/taskserver/package.md @@ -0,0 +1,22 @@ +--- +title: "Taskwarrior - Taskserver Installation from Package" +--- + +[]{#installation} + +### [2.1]{.label .label-success} Installation + +Installing Taskserver from a binary package is the simplest option, but you will +need to refer to your package manager\'s documentation and procedures for doing +this. + +Take a look at the [Download](/download/#dist) page for examples. Generally +there are too many package managers to make a complete list with instructions +here. + +Most importantly, for now, Taskserver is a new product, and there are very few +packages available. It is expected that this situation will change soon. When it +does, this page will be updated. + +Meanwhile, there is installation from either git or tarball. +::: diff --git a/content/docs/taskserver/prep.md b/content/docs/taskserver/prep.md new file mode 100644 index 00000000..1c639585 --- /dev/null +++ b/content/docs/taskserver/prep.md @@ -0,0 +1,60 @@ +--- +title: "Taskwarrior - Taskserver Preparation" +--- + +[]{#prepare} + +### [1]{.label .label-success} Preparation + +Installing and operating a server is not a casual task. You need to prepare. + +[]{#backup} + +#### Backup Your Data + +Let\'s reinforce a good habit and make a backup copy of your data first. Here is +a very easy way to backup your data: + + $ cd ~/.task + $ tar czf task-backup-$(date +'%Y%m%d').tar.gz * + +Now move that file somewhere safe. All software contains bugs, so make regular +backups. + +[]{#machine} + +#### Choose a Machine + +A suitable machine to run your Taskserver is one that is always available. If +you have such a machine, or have access to a hosted machine, that is ideal. + +If your machine is not continuously available, it can still be a suitable +Taskserver because the sync mechanism doesn\'t require continuous access. When a +client cannot sync, it simply accumulates local, unpropagated changes until it +can sync. + +A laptop is a poor choice for a Taskserver host. + +[]{#port} + +#### Choose a Port + +By default, Taskserver uses port 53589. You can choose any port you wish, +provided it is unused. If you choose a port number that is under 1024, then +Taskserver must run as root, which is not recommended. + +[]{#user} + +#### User/Group + +Ideally you will create a new user and group solely to run the Taskserver. This +helps you keep the data secure from other users on the machine, as well as +controlling the privileges of Taskserver. + +[]{#firewall} + +#### Firewall + +Depending on what devices you use to access your server, you may need to +configure the firewall to allow incoming TCP/IP traffic on your chosen port. +::: diff --git a/content/docs/taskserver/protocol.md b/content/docs/taskserver/protocol.md new file mode 100644 index 00000000..349ad357 --- /dev/null +++ b/content/docs/taskserver/protocol.md @@ -0,0 +1,51 @@ +--- +title: "Taskwarrior - Taskserver Protocol" +--- + +### Protocol Selection + +Taskserver [1.1.0]{.label .label-success} ordinarily binds to the first +interface that matches the hostname and port, regardless of whether that is an +IPv4 or IPv6 interface. You have several options to control this. + +The server can be configured to bind to the hostname and port in several ways: + + $ taskd config server localhost:53589 + $ taskd config server 127.0.0.1:53589 + $ taskd config server ::1:53589 + +The first is the most typical way to setup the server, and is protocol agnostic, +in that `localhost` is usually defined for all interfaces. + +The `127.0.0.1` host is an IPv4 address, and the `::1` host is an IPv6 short +address. These settings cause the server to bind to IPv4 and IPv6 addresses +respectively. + +[]{#family} + +#### Address Family + +There is also the option of specifying the address family: + + $ taskd config family IPv4 + $ taskd config family IPv6 + +This restricts the server to only bind using the named address family. By +default, no family is specified, which does not restrict the binding. + +[]{#tw} + +#### Taskwarrior + +Similarly, Taskwarrior [2.4.0]{.label .label-success} can specify the server +host and port in several ways, which restrict the interfaces used: + + $ task config taskd.server localhost:53589 + $ task config taskd.server 127.0.0.1:53589 + $ task config taskd.server ::1:53589 + $ task config taskd.server fe80::1:53589 + +The \'localhost\' uses whichever your system is set to use. The \'127.0.0.1\' s +an IPv4 address, and therefore uses IPv4. The last two are IPv6 addresses, and +therefore use IPv6. +::: diff --git a/content/docs/taskserver/setup.md b/content/docs/taskserver/setup.md new file mode 100644 index 00000000..972e8a19 --- /dev/null +++ b/content/docs/taskserver/setup.md @@ -0,0 +1,4 @@ +--- +title: "Taskwarrior - Taskserver Setup" +--- + diff --git a/content/docs/taskserver/sync.md b/content/docs/taskserver/sync.md new file mode 100644 index 00000000..69fa081f --- /dev/null +++ b/content/docs/taskserver/sync.md @@ -0,0 +1,77 @@ +--- +title: "Taskwarrior - Taskserver Syncing" +--- + +[]{#sync} + +### [5]{.label .label-success} Syncing Taskwarrior + +You are now ready to sync your Taskwarrior client. You will do this differently +depending on whether this is the first sync per device, or one of the many +subsequent syncs. + +[]{#first} + +#### First Time Sync + +The first time you sync is special - the client sends all your pending tasks to +the server. This is something you should only do once. Run this: + + $ task sync init + Please confirm that you wish to upload all your pending tasks to the Task Server (yes/no) yes + Syncing with host.domain:53589 + + Sync successful. 2 changes uploaded. + +You should get an indication that tasks were uploaded, in this case 2 of them. + +[]{#general} + +#### General Sync + +After the first time sync, you switch and just use this command: + + $ task sync + Syncing with host.domain:53589 + + Sync successful. No changes. + +This will give you feedback about what happened. Please note that it is +perfectly safe to run this command as often as you wish. Syncing is safe and +does not consume great system resources. + +Note that if your client is a mobile device, a sync command may consume some of +your data usage. Act accordingly. + +But it does require network connectivity, and if there is no connectivity you +will be notified. It is not a problem if a sync fails because of this, because +the next sync that works will catch up with all the changes, and do the right +merging. + +Taskwarrior and Taskserver were designed to work together, and tolerate +intermittent connectivity. + +[]{#reminder} + +#### Sync Reminder + +After you modify data locally, Taskwarrior will start notifying you that you +need to sync, after commands, like this: + + $ task project:foo list + No matches. + There are local changes. Sync required. + +This is just a reminder to sync. Respond with a sync, and the reminder goes +away: + + $ task sync + Syncing with : + + Sync successful. 1 changes uploaded. + +If you do not respond with a sync, then local changes accumulate unseen by other +clients. When you do eventually sync, the data will be properly propagated, so +it is a question of whether you *need* current data on the server. It is +perfectly fine to allow *weeks* to go by without a sync. +::: diff --git a/content/docs/taskserver/tarball.md b/content/docs/taskserver/tarball.md new file mode 100644 index 00000000..6078f4a4 --- /dev/null +++ b/content/docs/taskserver/tarball.md @@ -0,0 +1,111 @@ +--- +title: "Taskwarrior - Taskserver Installation from Tarball" +--- + +[]{#installation} + +### [2.2]{.label .label-success} Installation + +Installing Taskserver from a tarball is a matter of downloading the tarball, +extracting it, satisfying dependencies and building the server. + +[]{#depends} + +#### Dependencies + +Before building the software, you will need to satisfy the dependencies by +installing the following: + +- GnuTLS (likely `libgnutls-dev`, ideally version 3.2 or newer) +- `libuuid` +- CMake (2.8 or newer) +- `make` +- A C++ Compiler (GCC 4.7 or Clang 3.0 or newer) + +Note that some OSes (Darwin, FreeBSD \...) include `libuuid` functionality in +libc. + +You don\'t necessarily need the latest version of all components, but it is a +good idea if you can. GnuTLS is a security component, and as such, it is very +important that it is current. Using GnuTLS version 2.12.x is neither adequately +secure, nor production quality. + +[]{#download} + +#### Download + +The next step is to obtain the code. This means getting the Task Server 1.0.0 +(or newer) source tarball. You should check for the latest stable release here: + + + +You can download the tarball with `curl`, as an example of just one of many ways +to download the tarball. + + $ curl -LO https://taskwarrior.org/download/taskd-latest.tar.gz + +[]{#build} + +#### Build + +Expand the tarball, and build the Taskserver. + + $ tar xzf taskd-latest.tar.gz + $ cd taskd-1.1.0 + $ cmake -DCMAKE_BUILD_TYPE=release . + ... + $ make + ... + +[]{#install} + +#### Install + +Now install Taskserver. This copies files into the right place, and installs man +pages. + + $ sudo make install + ... + +[]{#verify} + +#### Verify + +Run the `taskd` command to verify that the server is installed, and the location +is in your `$PATH`. You should see something like this: + + $ taskd + + Usage: taskd -v|--version + taskd -h|--help + taskd diagnostics + taskd validate + taskd help [] + + Commands run only on server: + taskd add [options] org + taskd add [options] group + taskd add [options] user + taskd config [options] [--force] [ []] + taskd init [options] + taskd remove [options] org + taskd remove [options] group + taskd remove [options] user + taskd resume [options] org + taskd resume [options] group + taskd resume [options] user + taskd server [options] [--daemon] + taskd status [options] + taskd suspend [options] org + taskd suspend [options] group + taskd suspend [options] user + + Commands run remotely: + taskd client [options] [ ...] + + Common Options: + --quiet Turns off verbose output + --debug Generates debugging diagnostics + --data Data directory, otherwise $TASKDDATA + --NAME=VALUE Temporary configuration override +::: diff --git a/content/docs/taskserver/taskwarrior.md b/content/docs/taskserver/taskwarrior.md new file mode 100644 index 00000000..3615d629 --- /dev/null +++ b/content/docs/taskserver/taskwarrior.md @@ -0,0 +1,70 @@ +--- +title: "Taskwarrior - Taskserver, Configure Taskwarrior" +--- + +[]{#config} + +### [4]{.label .label-success} Configure Taskwarrior + +If you have configured Taskserver and created a user account (or better yet, +someone created an account for you) then you now have details needed in the +configuration of your Taskwarrior client. You should have these files and this +information: + +- CA `ca.cert.pem` +- Client certificate: `first_last.cert.pem` +- Client key: `first_last.key.pem` +- User key (yours will be different): `cf31f287-ee9e-43a8-843e-e8bbd5de4294` +- Organization: `Public` +- Account name: `First Last` +- Server:port `host.domain:53589`. In the [server + configuration](/docs/taskserver/configure.html) we used `localhost` as an + example. Whatever you actually used there, should be used here. + +Now we feed this information to Taskwarrior. + +Copy the Cert, Key and CA to your \~/.task directory. The reason we are copying +the CA cert is because this is a self-signed cert, and we need the CA to +validate against. Alternately we could force Taskwarrior to trust all certs, but +that is not recommended. + + $ cp first_last.cert.pem ~/.task + $ cp first_last.key.pem ~/.task + $ cp ca.cert.pem ~/.task + +Now we need to make Taskwarrior aware of these certs: + + $ task config taskd.certificate -- ~/.task/first_last.cert.pem + $ task config taskd.key -- ~/.task/first_last.key.pem + $ task config taskd.ca -- ~/.task/ca.cert.pem + +Now set the server info: + + $ task config taskd.server -- host.domain:53589 + +Finally we provide the credentials, which combine the organization, account name +and user key: + + $ task config taskd.credentials -- Public/First Last/cf31f287-ee9e-43a8-843e-e8bbd5de4294 + +::: {.callout .callout-danger} +#### Trust + +It is possible to configure Taskwarrior\'s trust level, which determines how the +server certificate is treated. + +For Taskwarrior [2.3.0]{.label .label-success} you can specify `taskd.trust=yes` +in order to skip certificate validation. ***This is a bad idea.*** The default +is `taskd.trust=no`, which does not trust the server certificate, which is more +secure. + +For Taskwarrior [2.4.0]{.label .label-success} you must specify +`taskd.trust=ignore hostname` in order to skip certificate hostname validation. +***This is a bad idea.*** You can also specify `taskd.trust=allow all` to +perform no validation. ***This is a worse idea.*** The default value is +`taskd.trust=strict` which performs the most stringent verification, and is more +secure. +::: + +Your Taskwarrior is now ready to sync. +::: diff --git a/content/docs/taskserver/troubleshooting-sync.md b/content/docs/taskserver/troubleshooting-sync.md new file mode 100644 index 00000000..0d351391 --- /dev/null +++ b/content/docs/taskserver/troubleshooting-sync.md @@ -0,0 +1,213 @@ +--- +title: "Taskwarrior - Troubleshooting Sync" +--- + +### Troubleshooting Sync + +Here is a list of problems you may encounter, with the most common ones listed +first. The single most common problem has been that the [Taskserver Setup +Instructions](/docs/taskserver/setup.html) were not properly followed. Please +review the steps you took. + +It is always a good idea to make sure that you are using the latest release of +Taskwarrior and Taskserver, not just because bugs are fixed that may help you, +but also because the solutions below are geared toward the current releases. + +If you upgrade from an older release of Taskserver, you will need to follow the +[upgrade instructions](/docs/taskserver/upgrade.html). + +[]{#problems} + +#### Problems + ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} You tried `task sync` but Taskwarrior | +| showed you a task list instead | +| | +| You have a version of Taskwarrior older than `2.3.0`, which means there was | +| no `sync` command, and you are seeing a list filtered by the search term | +| \'sync\'. Upgrading is the only solution. | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} You tried `task sync` and saw | +| \'Taskwarrior was built without GnuTLS support. Sync is not available.\' | +| | +| You are using version `2.3.0` or later, but the Taskwarrior binary was | +| compiled without [GnuTLS](https://www.gnutls.org) support. | +| | +| If you installed Taskwarrior using your OS\'s package manager, you may be | +| suffering from an out of date package. Prod your OS\'s package maintainer for | +| an update. | +| | +| Recent releases make GnuTLS support opt-out instead of opt-in, so upgrading | +| to the latest version may help. Otherwise, you will need to build Taskwarrior | +| from the [latest source tarball](/download/task-latest.tar.gz), following the | +| instructions in the `INSTALL` file. If you are a developer, do that. If you | +| are not, then installing a development environment is probably not something | +| you want to do, in which case contact your OS\'s package maintainer. | +| | +| Verify that your Taskwarrior was built with GnuTLS support by running | +| `task diagnostics`: | +| | +| $ task diagnostics | grep libgnutls | +| libgnutls: 3.3.18 | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} nodename nor servname provided, or | +| not known | +| | +| Despite the terrible wording, this means the Taskwarrior setting | +| `taskd.server=:` refers to a host name that cannot be seen by | +| Taskwarrior. | +| | +| Is it spelled correctly? Is the domain correct? Is there a valid DNS | +| resolution for the name? Is there a firewall between Taskwarrior and | +| Taskserver that is not letting through `` traffic? | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} Could not connect to \ | +| \ | +| | +| Taskserver may not be running on ``. Check with | +| `ps -leaf | grep taskd`. | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} Unable to use port 53589? | +| | +| By default, port `53589` is used, but whichever you chose must be open on the | +| server. | +| | +| If you are unable to open firewall ports, you can use an SSH Tunnel to route | +| port `53589` traffic over port `22`: | +| | +| $ ssh -L localport:dsthost:dstport user@example.com | +| | +| Then try: | +| | +| task rc.taskd.server:localhost:localport | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} Certificate fails validation, | +| Handshake failed | +| | +| There are many reasons that the TLS handshake can fail. | +| | +| When you generated certificates, you modified a `vars` file, in particular | +| the `CN=` setting. That name must match the output of `$ hostname -f` | +| on the server for the certificate to validate. | +| | +| Additionally, that name must also be used in the `taskd.server=:` | +| setting for Taskwarrior. Otherwise you\'ll need | +| `taskd.trust=ignore hostname`. | +| | +| If you are using a self-signed certificate, did you specify it using the | +| `taskd.ca` setting? | +| | +| Setting `taskd.ciphers` can force the use of different ciphers. Use | +| `gnutls-cli --list` to see a list of installed ciphers, and confirm that | +| there is overlap between client and server. There needs to be a cipher that | +| is available to both, otherwise they cannot communicate. | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} Is your certificate still valid? | +| | +| Certificates have expiration dates, and if you followed our instructions, you | +| created a certificate that is valid for one year. Check your certificate with | +| this command: | +| | +| $ certtool -i --infile ~/.task/.cert.pem | +| | +| If your certificate has expired, you need a new one. You may also need to | +| regenerate expired server certificates. | +| | +| Note that creating certificates that never expire is a bad idea. Certificates | +| may be compromised. A certificate that is considered secure today, may not be | +| considered secure in a year. Is the key length you chose something that will | +| remain suitable in the future? Will the algorithms you chose remain secure? | +| For these reasons, choose an expiration date that lets you reevaluate your | +| choices in the relatively near future. | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} Is your GnuTLS library up to date? | +| | +| As a [security product](https://gnutls.org/security.html), it is imperative | +| that you keep your GnuTLS up to date. | +| | +| As with many security products, GnuTLS is maintained by a responsible and | +| quick-responding team that takes security very seriously. Benefit from their | +| diligence by keeping your GnuTLS up to date. | +| | +| We have received reports of issues with older GnuTLS releases. Specifically, | +| version 2.12.20 has problems validating certificates under certain | +| conditions. Newer releases have addressed memory leaks that were able to take | +| down Taskserver. | ++-------------------------------------------------------------------------------+ +| []{.glyphicon .glyphicon-question-sign} ERROR: Could not find common ancestor | +| for \...\ | +| Client sync key not found. | +| | +| You skipped the important step of running: | +| | +| $ task sync init | +| | +| This performs an initial upload of your pending tasks, and sets up a local | +| sync key, which identifies the last sync transaction. | ++-------------------------------------------------------------------------------+ + +[]{#debug} + +#### Debugging + +You may wish to try and debug the problem yourself. You will probably not. But +if you do, here is how. + +Both Taskwarrior and Taskserver have a `diagnostics` command, the purpose of +which is to show you relevant troubleshooting details. Additionally it will +indicate problems directly, for example, it will tell you if your cert/key files +are not readable. The output from `diagnostics` is intended to be included in +bug reports, and doing so saves you a lot of time, because it\'s the first thing +we\'ll ask for. + + $ task diagnostics + ... + $ taskd diagnostics + ... + +Read the output of the `diagnostics` commands carefully, there may be several +types of problems mentioned, which need to be addressed before going further. + +The next step would be to run the server in debug mode. First shutdown your +Taskserver, then launch it interactively: + + $ taskdctl stop + ... + $ taskd server + ... + +You can hit `Ctrl-C` to stop this server. For highly verbose output, try this: + + $ taskd server --debug --debug.tls=2 + ... + +Similarly, Taskwarrior has a verbose debug mode, and debug TLS mode: + + $ task rc.debug=1 rc.debug.tls=2 sync + ... + +[]{#help} + +#### Getting Help + +As a last resort, ask for help. But please make sure you have carefully reviewed +your setup, and gone through the checks above before asking. No one wants to +lead you through the steps above to discover that you didn\'t. + +We\'ll ask you to provide the `diagnostics` output for both Taskwarrior and +Taskserver, then we\'re going to go through the steps above, because this is our +checklist also. + +Impress us and mention the codeword \'Weasel\', to prove that you at least read +this page all the way to the end. + +There are several ways of getting help: + +- Check the FAQ (coming soon). +- Email us at , then wait patiently for a + volunteer to respond. +- Join us IRC in the \#taskwarrior channel on Freenode.net, and get a quick + response from the community, where, as you have anticipated, we will walk + you through the checklist above. +::: diff --git a/content/docs/taskserver/upgrade.md b/content/docs/taskserver/upgrade.md new file mode 100644 index 00000000..2c028ad0 --- /dev/null +++ b/content/docs/taskserver/upgrade.md @@ -0,0 +1,79 @@ +--- +title: "Taskwarrior - Upgrading Taskserver" +--- + +### Upgrading Taskserver + +Upgrading to Taskserver [1.1.0]{.label .label-success} requires some +configuration changes. The required changes are mostly concerned with +improvements to security and encryption. Updating the software itself is +straightforward. + +[]{#software} + +#### Upgrade the Software + +This is simply a matter of shutting down the server, installing the new +software, modifying the configuration as discussed below, and restarting the +server. Before doing this, please read the issues below, so that you will be +prepared, and more secure. + +[]{#pki} + +#### PKI + +If you used self-signed certificates, and the scripts provided with Taskserver +1.0.0, then you will want to regenerate all your CA, CRL, server, client and +user certificates using the updated scripts. + +The scripts now properly use the `CN` field, and no longer use `SAN`s. This is +important for hostname verification, and required for `strict` validation. + +Please note also that the PKI scripts provided use a certificate expiration of +365 days. This means no certificate is valid after a year. If you used the +default scripts when you installed Taskserver 1.0.0, you may have already +discovered this. + +It is generally a good idea to expire and renew certificates. Long-term +certificates may need to be revoked using the CRL, so short-term certificates +provide a dead-man\'s switch approach. + +[]{#allowdeny} + +#### Allow/Deny + +The `client.allow` and `client.deny` configuration settings should be removed, +as this feature has been removed from the server. As it is easy to spoof a valid +client, this technique offered no security. + +[]{#trust} + +#### Trust + +The new `trust` configuration setting determines how client certificates are +validated. Values maybe either `allow all` or `strict`. The value `allow all` +performs no client certificate validation. This is not recommended. The value +`strict` causes the client certificate to be validated against a CA. + +Note that using the `strict` value may require that your server certificates be +replaced. This depends on the data used to create your original certificates. +Taskserver PKI scripts now create certificates with a proper CN value. + +[]{#gnutls} + +#### GnuTLS + +Please bear in mind that [GnuTLS](https://gnutls.org/) is a security product, +and it is important that you use the most recent version available. Please +upgrade GnuTLS before building Taskwarrior and Taskserver. + +We have received many reports of problems with older GnuTLS releases, +specifically version 2.12.20 and earlier cannot complete handshake with a CRL. + +Versions prior to 3.2 also suffer from significant memory leaks, which will take +down your Taskserver over time. + +In addition to benefiting from bug fixes and leak fixes, newer GnuTLS versions +include new and more secure default ciphers and algorithms. Security is +important. +::: diff --git a/content/docs/taskserver/user.md b/content/docs/taskserver/user.md new file mode 100644 index 00000000..20934877 --- /dev/null +++ b/content/docs/taskserver/user.md @@ -0,0 +1,79 @@ +--- +title: "Taskwarrior - Add a User to Server" +--- + +[]{#add} + +### [4]{.label .label-success} Add User to Server + +A user account must be created, along with a key, cert and ID, before syncing +may occur. + +[]{#org} + +#### Create Organization + +Before creating a user account, you may need to create an organization. An +organization consists of a group of zero or more users. You can get away with +just one organization, and in this example, we will create just one, named +\'Public\'. + +You can create as many organizations as you wish (even one per user), and the +purpose is simply to group users together. Future features will utilize this. + + $ taskd add org Public + Created organization 'Public' + +Now the organization \'Public\' exists, we can add users to that organization. + +[]{#user} + +#### Create User + +Now we add a new user, named \'First Last\' as an example. You can use any name +you wish, and if it contains spaces, quote the name as shown. + + $ taskd add user 'Public' 'First Last' + New user key: cf31f287-ee9e-43a8-843e-e8bbd5de4294 + Created user 'First Last' for organization 'Public' + +Note that you will get a different \'New user key\' than is shown here, and you +will need to retain it, to be used later for client configuration. Note that the +key is just a unique id, because your name alone is not necessarily unique. + +[]{#cert} + +#### Create Cert/Key + +Go to your `taskd` directory, which depends on which installation method you +chose. Here it is assumed that you installed from the source tarball. + + $ cd ~/taskd-1.1.0/pki + $ ./generate.client first_last + ... + +This will generate a new key and cert, named `first_last.cert.pem` and +`first_last.key.pem`. It is not important that \'first\_last\' was used here, +just that it is something unique, and valid for use in a file name. It has no +bearing on security. + +[]{#client} + +#### Client + +You have now created a new user account on the server, created a new client cert +and key, and have details that need to be transferred to the user, to set up a +sync client. The details needed are: + +- `ca.cert.pem` is the certificate authority, and the only way to validate + self-signed certs such as the ones we have created here. +- `first_last.cert.pem` is the client certificate. +- `first_last.key.pem` is the client key. +- The new user key (yours will be different): + `cf31f287-ee9e-43a8-843e-e8bbd5de4294` +- The organization, `Public`. +- The full and proper user name, `First Last`. +- The server address and port, `host.domain:53589`. In the [server + configuration](/docs/taskserver/configure.html) we used `localhost` as an + example. Whatever you actually used there, should be used here. +::: diff --git a/content/docs/taskserver/why.md b/content/docs/taskserver/why.md new file mode 100644 index 00000000..2afd8c18 --- /dev/null +++ b/content/docs/taskserver/why.md @@ -0,0 +1,31 @@ +--- +title: "Taskwarrior - Taskserver Why?" +--- + +[]{#why} + +### Why Do I Need a Taskserver? + +You may not need a Taskserver. You may be content with using Taskwarrior on a +single device. But if you wish to share tasks between several clients, the +Taskserver is the only option that properly syncs data. + +With a Taskserver, you can share tasks between clients/devices, eliminating the +need to keep your data up to date on multiple clients, reducing data entry. + +One nice side effect of using a Taskserver is an automatic backup of your tasks. + +[]{#personal} + +#### Why Would I Want a *Personal* Taskserver? + +Setting up your own Taskserver means having complete control and privacy. + +[]{#hosted} + +#### Hosted Taskserver Accounts + +There are now hosted Taskserver accounts where you can sync your tasks without +needing to set up and maintain a personal Taskserver. See our [tools +services](/tools/#services) section. +::: diff --git a/content/docs/template.md b/content/docs/template.md new file mode 100644 index 00000000..e1a9d0ba --- /dev/null +++ b/content/docs/template.md @@ -0,0 +1,4 @@ +--- +title: "Taskwarrior - Template" +--- + diff --git a/content/docs/terminology.md b/content/docs/terminology.md new file mode 100644 index 00000000..f8fe6b72 --- /dev/null +++ b/content/docs/terminology.md @@ -0,0 +1,952 @@ +--- +title: "Taskwarrior - Terminology" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +Taskwarrior and Taskserver use a lot of terminology that is not obvious. Those +terms are defined here. +::: + +::: {.col-md-10 .main} + +[]{#active}active + +: When a task is started, like this: + + $ task 1 start + + It gains a `start` attribute, which is a date. When started, a task is + considered *active*, until completed, deleted or stopped. + + ####   + +[]{#alias}alias + +: An alias is name that can be used on the command line, which is replaced by + its definition at run time. For example, you can use an alias to create a + synonym for a command, like this: + + $ task config alias.rm delete + + Then whenever the `rm` alias is encountered, it is replaced by `delete`, + making these two commands equivalent: + + $ task 1 delete + $ task 2 rm + + An alias can appear elsewhere on the command line, and is not limited to + command synonyms. + + ####   + +[]{#annotation}annotation + +: An `annotation` is a note added to an existing task, and is in the form of a + text string. There can be any number of annotations to a task. + + $ task add Buy the milk + $ task 1 annotate and Bread + $ task 1 annotate and Cheese + + Some reports show the annotations in full, some show an annotation count, + and some simply show an indicator that there are annotations. + + ####   + +[]{#attribute}attribute + +: A task is comprised of a set of attrbitutes, which are simply name/value + pairs. As an example, `project` is an attribute, the name being `project`, + and the value being what you assign to that project. + + $ task add project:Home Rake the leaves + + Here you see the `project` attribute being directly set to `Home`, and the + `description` attribute indirectly set to `Rake the leaves`. + + ####   + +[]{#calc}calc [2.4.0]{.label .label-success} + +: Taskwarrior includes a small utility program named `calc` that uses the + Taskwarrior expression engine to calculate values. This utility mirrors the + `calc` command. Here is an example: + + $ calc '1 + 2 * 3' + 7 + + The `calc` utility is mostly for testing, and allows access to internal + features, such as postfix expressions: + + $ calc --postfix '1 2 3 * +' + 7 + + While this is just a simple example, there is also support for dates, + durations, Boolean operations and many operators. + + See [Calc Command](/docs/commands/calc.html) for full details. + + ####   + +[]{#certificate}certificate + +: A certificate is a document that identifies an entity. A certificate is an + X.509 PEM file, part of [PKI](#pki). + + ####   + +[]{#command}command + +: A Taskwarrior command can be a read-only command, wherein data is not + modified: + + list, info, calendar ... + + Or it can be a write command, where data is modified: + + add, modify, done, delete ... + + The distinction is important because it dictates how the command line + arguments are interpreted. + + ####   + +[]{#completed}completed + +: `Completed` is one of several states a task can be in. The others are + `pending`, `waiting`, `deleted` and `recurring`. + + The `completed` state indicates the successful completion of a task‥ + + ####   + +[]{#custom_report}custom report + +: Taskwarrior has several built-in reports, some of which are modifiable via + configuration. + + Additionally, you can create your own Custom Reports, where you can define + the command, attributes show, length, filter, sorting and breaks. + + The [Report](/docs/report.html) gives a detailed explanation of how to use, + modify and create reports. + + ####   + +[]{#daemon}daemon + +: A daemon is the name given to a process that runs without interaction as a + background process. Various server products are run as daemons, and are + automatically launched on startup. Typically daemons are named ending with + \'d\'. + + Taskserver (taskd) can be run as a daemon, using the `--daemon` command line + argument. + + ####   + +[]{#dateformat}dateformat + +: [TBD]{.label .label-info} + + ####   + +[]{#default_command}default command + +: Taskwarrior supports the notion of a default command, which is used when no + other command is specified on the command line. Suppose you have this + setting: + + $ task config default.command list + $ task +tag + + Then the default command above of `list` would be used in the subsequent + command, to effectively become: + + $ task +tag list + + [2.4.0]{.label .label-success} When no command is specified, and the only + arguments are task `ID` or `UUID` values, the `info` command is assumed, + regardless of the `rc.default.command` setting. + + ####   + +[]{#deleted}deleted + +: `Deleted` is one of several states a task can be in. The others are + `pending`, `waiting`, `completed` and `recurring`. + + The `deleted` state indicates an incomplete task that is removed from the + list, perhaps because it is no longer relevant, or someone else completed + it. + + ####   + +[]{#dogfood}dogfood + +: Refers to the phrase \"eating one\'s own dogfood\". This describes the + practice of using a product while developing that product. This encourages + improvements in the product right from the start. + +[]{#dependency}dependency + +: [TBD]{.label .label-info} + + ####   + +[]{#due}due + +: A due date may be applied to a task, like this: + + $ task 1 modify due:25th + + A task with a due date has a higher urgency value, and generally sorts + higher in reports. The due date is considered the date on which the task + must be completed. + + A task is consided due, if the due date is within 7 days in the future. The + \'7\' is configurable via the `due` configuration setting. If a due date is + further into the future it is not considered due. If the due date is in the + past, it is considered overdue, and these tasks are shown in the `overdue` + report. + + ####   + +[]{#end}end + +: When a task is completed or deleted, it is given an `end` date. + + ####   + +[]{#entry}entry + +: When a task is first created, it is automatically assigned an `entry` date. + This attribute is used to calculate the age of a task. This date is + modifiable, should you wish to enter an old task. + + ####   + +[]{#en_passant}en-passant + +: *En-passant* is used to describe the action of annotating or otherwise + modifying a task while making some other change to it. An example is + deleting a task, and adding an explanatory note at the ѕame time. Instead of + doing this: + + $ task 123 annotate Could not reproduce bug + $ task 123 modify +cannot_reproduce + $ task 123 delete + + Those three actions can be combined: + + $ task 123 delete Could not reproduce bug +cannot_reproduce + + For every write command, except `modify`, you can perform *en-passant* + modifications. The `modify` is different, and updates the task description + instead of annotating. + + ####   + +[]{#export}export + +: Task can be exported from Taskwarrior, using the `export` command. You can + apply a filter to the export command to control which tasks are exported. + + Tasks are exported using the [Taskwarrior JSON + Format](/docs/design/task.html). + + $ task add Buy milk + $ task /milk/ export + {"description":"Buy milk","entry":"20140928T211124Z","status":"pending","uuid":"2e17b750-c137-4ddd-b6dd-c63e272107f4"} + + Exported tasks may be imported. This is the recommended mechanism for + writing add-on scripts and programs. + + ####   + +[]{#expression}expression [2.4.0]{.label .label-success} + +: An algebraic expression is a mathematical expression comprised of constants, + operators and symbols. Here are some examples of expressions in the context + of a Taskwarrior command line: + + 1 + 1 + 2 + 1 2 + + 123.due + 4 weeks + pi * r^2 + + Expressions of this kind can appear in filters or modifications. + + ####   + +[]{#extension}extension [2.4.0]{.label .label-success} + +: An extension is a program that adds functionality to Taskwarrior. This could + be in the form of a wrapper + ([Vit](https://gothenburgbitfactory.org/projects/vit.html)), or an aliased + script, or a [hook](/docs/terminology.html#hooks) script. + + ####   + +[]{#filter}filter + +: A filter is a set of command line arguments used to restrict the number of + tasks shown. For example, this command uses three filter terms: + + $ task project:Home +kitchen +weekend list + + This command will show a report that contains tasks that have the project + value \'Home\', and have the `kitchen` and `weekend` tags. The three terms + are combined with an implicit `AND` operator. + + In addition, the command above combines the three terms in the filter with + the implicit filter of the `list` command, which is: + + status:pending + + So in total, the command has four filter terms, that restrict the tasks + shown. A filter is essentially an ælgebraic expression that must evalute to + `True` for each task, for it to be included in the result. + + Most commands accept filters. See [Filters](/docs/filter.html) for a more + complete discussion. + + ####   + +[]{#gc}gc + +: Taskwarrior performs a Garbage Collect (gc) operation whenever it is + necessary. Tasks that are deleted and completed are moved from the + `pending.data` file to the `completed.data` file. This process keeps the + `pending.data` file compact and fast to read, and keeps the ID numbers as + low as possible. + + Although gc can be disabled, to keep the ID numbers static, [this is + considered a bad idea](/docs/ids.html). + + ####   + +[]{#holiday_file}holiday file + +: [TBD]{.label .label-info} + + ####   + +[]{#hooks}hooks [2.4.0]{.label .label-success} + +: Hooks are a mechanism that allows other programs/scripts to run at certain + points in Taskwarrior\'s execution, so that processing can be influenced. + This is an extension mechanism. + + See the [Hooks Design](/docs/hooks.html) document. + + ####   + +[]{#import}import + +: [TBD]{.label .label-info} + + ####   + +[]{#infix}Infix + +: Infix is a mathematical notation for expressions where the operator appears + between its operands. This example: + + 1 + 2 + + Represents the sum of two digits, with the `+` operator in the infix + position, between the numbers. + + ####   + +[]{#info}info + +: The `info` report (actual full name `information`) is a report that shows + *all* task metadata in a human-readble form. Additionally, when a task ID + (or UUID) is provided, and no command is specified, the `info` command is + assumed: + + $ task 123 + + \... + + ####   + +[]{#iso}ISO-8601 + +: [TBD]{.label .label-info} + + ####   + +[]{#json}JSON + +: JSON (JavaScript Object Notation) is an industry-standard, lightweight, + data-interchange format. It is easy for humans and machines to read and + write. It is well supported by most languages. + + JSON is the only import/export format supported by Taskwarrior. Support for + any other format requires conversion between JSON and the other format. + There are several examples of this provided with Taskwarrior, in the + `scripts/add-ons` directory. + + See [www.json.org](https://www.json.org) for a full definition. + + ####   + +[]{#key}key + +: A key is a document that specifies an encryption key. A key is an X.509 PEM + file, part of [PKI](#pki). + + ####   + +[]{#listbreak}list break [2.4.0]{.label .label-success} + +: A list break is associated with report sorting, such that when a report is + sorted on an attribute, a list break for that attribute causes a blank line + to be inserted between unique values of that attribute. For example, the + sort definition: + + $ task show report.list.sort + + Config Variable Value + ---------------- ------------------------------------ + report.list.sort start-,due+,project+/,urgency- + + Here the `project` attribute is sorted ascending and also has a list break, + indicated by `/`. + + ####   + +[]{#override}override + +: An override refers to the action of superceding a configuration setting at + runtime. For example, support for `rc.color` is \'on\' by default, but at + runtime, you can override this: + + $ task rc.color=off list + + This runs the `list` report but does not use color. + + Any number of settings can be overridden at runtime, and overrides can also + appear in the `rc.report..filter` setting for a report, so that you + can have a report run without color, for example. + + ####   + +[]{#pending}pending + +: `Pending` is one of several states a task can be in. The others are + `deleted`, `waiting`, `completed` and `recurring`. + + The `pending` state indicates an incomplete task that is yet to be completed + or deleted. + + ####   + +[]{#pki}PKI + +: PKI (Public Key Infrastructure) is the set of mechanisms and policies built + around certificates, including their creation, validation and handling. + + [See PKI](https://en.wikipedia.org/wiki/Public_key_infrastructure) + + ####   + +[]{#rc}rc + +: [TBD]{.label .label-info} + + ####   + +[]{#ready}ready + +: Ready is the name of a report that shows ready tasks. A task is considered + *ready* if it is pending, is not blocked, and either has no + [scheduled](#scheduled) date, or has one that is before now. + + ####   + +[]{#regex}regex + +: A regex, or **Reg**ular **Ex**pression is a very powerful mechanism for + searching and matching text. It is a complex language that describes search + patterns, and allows for sophisticated searching. + + Suppose you were solving a crossword puzzle, and needed a five letter word + that started and ended in a vowel, you could represent that in regex, and it + could look something like: + + [aeiou]...[aeiou] + + See [Wikipedia: Regular + expression](https://en.wikipedia.org/wiki/Regular_expression). Taskwarrior + uses [POSIX Extended Regular + Expressions](https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions). + + ####   + +[]{#report}Report + +: [TBD]{.label .label-info} + + ####   + +[]{#rpn}RPN + +: **R**everse **P**olish **N**otation, or postfix notation is a mathematical + notation. This example: + + 1 2 + + + Represents the sum of two digits, with the `+` operator in the postfix + position, last. + + Writing software to evaluate postfix expressions is significantly easier + than for infix notation, which is easier for humans to read. + + ####   + +[]{#scheduled}scheduled + +: The `scheduled` date represents the first opportunity to begin work on a + task, and therefore typically is set to be on or after the [wait](#wait) + date, but before the [due](#due) date. + + If you add a scheduled date to a task, like this: + + $ task 1 modify scheduled:2014-12-31 + + Then this task will be considered *ready* after that date. The [virtual + tag](#vtag) `READY` reflects this, and the report `ready` shows such tasks. + + ####   + +[]{#shell}shell + +: The shell is your command interpreter. Most likely you are using the `bash` + shell, but there are many others. + + Any program that has complex argument processing will likely face several + problems that are shell-related. The shell modifies the entered text before + passing it on to the program. For example, consider these two commands: + + $ ls my_file + $ ls 'my_file' + + In both cases, the `ls` command sees the same command line argument, + `my_file`, because the shell removes the quotes. There are many other cases + to be aware of also. + + ####   + +[]{#shadow_file}shadow file + +: The shadow file is an old feature of Taskwarrior, which automatically ran a + report whenever the data changed. That report was configurable, and the + output placed in a text file. This was typically used to display a task list + on the desktop using [Conky](https://github.com/brndnmtthws/conky), or + similar tools. + + Starting with version 2.4.0, shadow file support has been removed, in favor + of a hook-based solution, an example of which is provided with the source. + + ####   + +[]{#stag}special tag + +: A special tag is one that, when applied to a task, changes the behavior of + Taskwarrior for that task. There are several special tags supported: + + ---------- ----------------------------------------------------- + +nocolor Disable color rules processing for this task + +nonag Completion of this task suppresses all nag messages + +nocal This task will not appear on the calendar + +next Elevates task so it appears on \'next\' report + ---------- ----------------------------------------------------- + + See [Tag](#tag), [Virtual Tags](#vtag). + + ####   + +[]{#start}start + +: If you apply a `start` date to a task, then the task is considered *active*. + Active tasks have a higher urgency value, and can be listed using the + `active` command. There are two ways to apply a start date, the latter + giving you control over the recorded start date: + + $ task 1 start + $ task 1 modify start:now + + If the configuration setting `journal.info` is on, then when a task is + started or stopped, an [annotation](#annotation) is made to that effect. The + cumulative start/stop times can be viewed in the [info](#info) report. + + Note that this does not imply there is time tracking in Taskwarrior, this is + simply a log of start/stop times, and is not modifiable. Many users confuse + this log with legitimate time tracking capabilities. Don\'t make this + mistake. + + ####   + +[]{#substitution}substitution + +: Taskwarrior can make command line substitutions like this: + + $ task 123 modify /this/that/ + + The substitution syntax allows text replacement in task description and + annotations. + + ####   + +[]{#sync}sync + +: Synchronization is a service provided by the Taskserver, and allows multiple + sync clients to share data. The Taskserver knows how to merge tasks and + handle incremental updateѕ to minimize bandwidth used. + + Although you can achieve a similar capability using one of the many + file-sharing services, the merging that happens is not aware of how to merge + tasks. + + Starting with Taskwarrior 2.3.0, there is a `sync` command that can be + configured to talk to a Taskserver. + + ####   + +[]{#tag}tag + +: A task may have any number of tags attached to it. A tag is a single word + (no spaces), and can be included when the task is created: + + $ task add Paint the walls +home +weekend + + This adds two tags `home` and `weekend` to the task. You can modify a task + to add a `renovate` tag: + + $ task 1 modify +renovate + + Or remove a `weekend` tag: + + $ task 1 modify -weekend + + See [Special Tags](#stag), [Virtual Tags](#vtag). + + ####   + +[]{#theme}theme + +: A taskwarrior theme is a file containing color definitions. There are + several themes provided with Taskwarrior, and these are listed in your + `.taskrc` file, and if you uncomment one of these lines, then the them is + included, and you see a set of chosen and thematic colors. Your `.taskrc` + file should contain this section: + + # Color theme (uncomment one to use) + #include /usr/local/share/doc/task/rc/light-16.theme + #include /usr/local/share/doc/task/rc/light-256.theme + #include /usr/local/share/doc/task/rc/dark-16.theme + #include /usr/local/share/doc/task/rc/dark-256.theme + #include /usr/local/share/doc/task/rc/dark-red-256.theme + #include /usr/local/share/doc/task/rc/dark-green-256.theme + #include /usr/local/share/doc/task/rc/dark-blue-256.theme + #include /usr/local/share/doc/task/rc/dark-violets-256.theme + #include /usr/local/share/doc/task/rc/dark-yellow-green.theme + #include /usr/local/share/doc/task/rc/dark-gray-256.theme + #include /usr/local/share/doc/task/rc/dark-default-16.theme + #include /usr/local/share/doc/task/rc/dark-gray-blue-256.theme + + All of these lines are said to be \'commented out\', which means the \'\#\' + symbol at the beginning of the line prevents Taskwarrior from reading the + rest of the line. Removing a \'\#\' enables the color theme. For example, to + enable the `dark-violets-256.theme` file, change the above to look like + this: + + # Color theme (uncomment one to use) + #include /usr/local/share/doc/task/rc/light-16.theme + #include /usr/local/share/doc/task/rc/light-256.theme + #include /usr/local/share/doc/task/rc/dark-16.theme + #include /usr/local/share/doc/task/rc/dark-256.theme + #include /usr/local/share/doc/task/rc/dark-red-256.theme + #include /usr/local/share/doc/task/rc/dark-green-256.theme + #include /usr/local/share/doc/task/rc/dark-blue-256.theme + include /usr/local/share/doc/task/rc/dark-violets-256.theme + #include /usr/local/share/doc/task/rc/dark-yellow-green.theme + #include /usr/local/share/doc/task/rc/dark-gray-256.theme + #include /usr/local/share/doc/task/rc/dark-default-16.theme + #include /usr/local/share/doc/task/rc/dark-gray-blue-256.theme + + ####   + +[]{#uda}UDA + +: Taskwarrior supports a set of about 20 or so core attributes, which include + ID, descriptions, tags, due date and so on. These attributes are necessary + for the basic features provided. + + But suppose you wanted to track a time estimate. There is no attribute for + that, although you could store data in an attribute. A better solution is a + User Defined Attribute, named `estimate`, of type `numeric`, that you define + via configuration like this: + + $ task config uda.estimate.label Estimate + $ task config uda.estimate.type duration + + Once you have defined a UDA, you use it just like you would use any other + core attribute, like this: + + $ task add Paint the door due:eom estimate:4hours + + Taskwarrior will faithfully store, report, sort and filter UDA attributes, + but of course their true meaning is not understood, and so there are no + features surrounding these values. + + UDAs may contribute to the urgency calculation, using: + + urgency.uda..coefficient + + UDAs may have default values (`uda..default`), allowable values + (`uda..values`), types (`string`, `date`, `duration`, and `numeric`) + and finally a label for report headers (`uda..label`). + + See [User Defined Attributes (UDAs)](/docs/udas.html) for more details. + + ####   + +[]{#until}until + +: The `until` date represents the date that a task is automatically deleted. + It is an expiration date. If you add an until date like this: + + $ task 1 modify until:eoy + + Then this task will expire and disappear at the end of the year. + + ####   + +[]{#urgency}urgency + +: The urgency of a task is a numeric quantity that represents task attributes + that convey importance. Consider these two tasks: + + $ task add Buy the paint due:saturday +home +renovate +store + $ task add Paint the walls due:sunday +home +renovate + + The first task is due sooner, and there is no question that it is more + important than the second, after all, the second is blocked by the first. + Dependencies could be used here to represent this, but this is just an + example. + + We would like the first task to sort higher than the second task, in this + case because of the due date. But not every task has (or needs) a due date. + Urgency is therefore a way to raise and lower tasks in the sorted list. This + cannot be achieved by simply providing a complex sort order, because usage + patterns are different for everyone. + + Urgency is implemented as a polynomial, where the term weights are + configurable to make an attribute an important contributor to urgency (high + positive number), a marginal contributor (low positive number), a detractor + (negative number) or have no influence at all (zero). + + While the urgency value in isolation is meaningless, when compared to that + of other tasks, helps order the tasks by importance. + + The `urgency` attribute is featured in the `next` report, although can be + used in any report. + + As the polynomial term weights (coefficients) are all modifiable, you can + tweak them to make the urgency value more closely match your own notions of + importance. Provided you understand the way the coefficients are used, this + can be very beneficial. + + See [Urgency](/docs/urgency.html). + + ####   + +[]{#uuid}UUID + +: A **U**niversally **U**nique **ID**entifier is a 128-bit number used to + uniquely identify a task. Whereas the ID of a task is simply a line number + in the `pending.data` file, the UUID is permanent. + + You can use ID and UUID interchangeably, although the ID is much more + convenient. + + $ task _get 1.uuid + 8ad2e3db-914d-4832-b0e6-72fa04f6e331 + $ task _get 8ad2e3db-914d-4832-b0e6-72fa04f6e331.id + 1 + + A UUID never changes, and is not modifiable. + + ####   + +[]{#verbosity}verbosity + +: Verbosity refers to the output Taskwarrior generates. For example if you run + a report, the output might looks like this (data excluded for clarity): + + $ task next rc.color=off + + ID Age Project Tag Description Urg + --- ---- ------- --- ------------------------ ---- + 1 2wks Home Paint the walls 1.2 + ... + + 31 tasks + Configuration override rc.color:off + Filter: ( ( status == pending ) ) + + Aside from the actual data, there is an initial blank line, a set of column + headers, another blank line, the summary \'31 tasks\', the configuration + override, and the filter used. All of these decorative elements, and more, + are controlled by the verbosity settings in the `verbose` configuration + setting. + + See [Verbosity](/docs/verbosity.html). + + ####   + +[]{#vtag}virtual tag + +: The tag notation for filters is convenient and simple, for example: + + $ task +HOME list + ... + $ task -HOME list + + The first lists only tasks that have the `HOME` tag, and the second lists + only tasks that do not have the `HOME` tag. + + A virtual tag is a means of performing simple filtering, using tags that are + synthesized at run time, and represent the complex internal state of a task. + For example the virtual tag `ACTIVE` is an easy way to filter tasks that + have been started, so that this command: + + $ task +ACTIVE list + + Is a more friendly and simple way to represent this equivalent command: + + $ task start.any: list + + See [Tag](#tag), [Special Tags](#stag). + + ####   + +[]{#wait}wait + +: If you add a `wait` date to a task like this: + + $ task 1 modify wait:30th + + Then the task is hidden from reports until the 30th of the month, whereupon + the wait date is removed, and the task becomes visible. + + This is useful for tasks that are far into the future, where you may not + appreciate seeing that task on every list, at least until it gets closer to + the due date. + + Note that a due date is not required to use this feature. + + ####   + +[]{#waiting}waiting + +: The `waiting` command is a report that shows tasks that are currently hidden + because they have a future `wait` date. + + `Waiting` is also one of several states a task can be in. The others are + `pending`, `completed`, `deleted` and `recurring`. + + The `waiting` state indicates a pending task that is hidden from view. + + ####   +::: + +::: {.col-md-2} +::: {.alert .alert-warning} +- [active](#active){.alert-link} +- [alias](#alias){.alert-link} +- [annotation](#annotation){.alert-link} +- [attribute](#attribute){.alert-link} +- [calc](#calc){.alert-link} +- [certificate](#certificate){.alert-link} +- [command](#command){.alert-link} +- [completed](#completed){.alert-link} +- [custom report](#custom_report){.alert-link} +- [daemon](#daemon){.alert-link} +- [dateformat](#dateformat){.alert-link} +- [default command](#default_command){.alert-link} +- [deleted](#deleted){.alert-link} +- [dependency](#dependency){.alert-link} +- [dogfood](#dogfood){.alert-link} +- [due](#due){.alert-link} +- [end](#end){.alert-link} +- [entry](#entry){.alert-link} +- [en-passant](#en_passant){.alert-link} +- [export](#export){.alert-link} +- [expression](#expression){.alert-link} +- [extension](#extension){.alert-link} +- [filter](#filter){.alert-link} +- [gc](#gc){.alert-link} +- [holiday file](#holiday_file){.alert-link} +- [hooks](#hooks){.alert-link} +- [import](#import){.alert-link} +- [Infix](#infix){.alert-link} +- [info](#info){.alert-link} +- [ISO-8601](#iso){.alert-link} +- [JSON](#json){.alert-link} +- [key](#key){.alert-link} +- [list break](#listbreak){.alert-link} +- [override](#override){.alert-link} +- [pending](#pending){.alert-link} +- [PKI](#pki){.alert-link} +- [rc](#rc){.alert-link} +- [ready](#ready){.alert-link} +- [regex](#regex){.alert-link} +- [Report](#report){.alert-link} +- [RPN](#rpn){.alert-link} +- [scheduled](#scheduled){.alert-link} +- [shadow file](#shadow_file){.alert-link} +- [shell](#shell){.alert-link} +- [special tag](#stag){.alert-link} +- [start](#start){.alert-link} +- [substitution](#substitution){.alert-link} +- [sync](#sync){.alert-link} +- [tag](#tag){.alert-link} +- [theme](#theme){.alert-link} +- [UDA](#uda){.alert-link} +- [until](#until){.alert-link} +- [urgency](#urgency){.alert-link} +- [UUID](#uuid){.alert-link} +- [verbosity](#verbosity){.alert-link} +- [virtual tag](#vtag){.alert-link} +- [wait](#wait){.alert-link} +- [waiting](#waiting){.alert-link} +::: +::: +::: diff --git a/content/docs/themes.md b/content/docs/themes.md new file mode 100644 index 00000000..aaef622a --- /dev/null +++ b/content/docs/themes.md @@ -0,0 +1,111 @@ +--- +title: "Taskwarrior - Color Themes" +--- + +### Color Themes + +Taskwarrior supports color themes. These are simply configuration files with +defined color rules and rule precedence, which can be included in your `.taskrc` +file like this: + + include /path/to/dark-blue-256.theme + +There are several themes included with the distribution, and the default +`.taskrc` file you have references all of them, but these lines are commented +out. Uncomment one line to use the theme. + +[]{#override} + +#### Overriding Colors + +You can override the color settings by placing changes *after* the include: + + include /path/to/dark-blue-256.theme + color.overdue=bold white on red + +In this way, themes are the basis upon which you specify your color preferences. + +[]{#default} + +#### Default Theme + +By default, without any selected theme, Taskwarrior uses a simple dark theme +(`dark-16.theme` or `dark-256.theme` depending on your system). This means there +is the assumption of a dark-background in your terminal. If you use a light +background this will look bad, and you should select a light theme instead. + +There is a `no-color.theme` file that has no color at all, and while this sounds +useless, it allows you to start with no color, and add your own. If you are +building your own theme, this is what you would start with. + +[]{#swatches} + +#### Theme Swatches + +Below are examples of each of the provided themes. + +#### dark-16.theme + +[![Theme +swatch](/docs/images/dark-16.png){.img-thumbnail}](/docs/images/dark-16.png) + +#### dark-256.theme + +[![Theme +swatch](/docs/images/dark-256.png){.img-thumbnail}](/docs/images/dark-256.png) + +#### dark-blue-256.theme + +[![Theme +swatch](/docs/images/dark-blue-256.png){.img-thumbnail}](/docs/images/dark-blue-256.png) + +#### dark-gray-256.theme + +[![Theme +swatch](/docs/images/dark-gray-256.png){.img-thumbnail}](/docs/images/dark-gray-256.png) + +#### dark-gray-blue-256.theme + +[![Theme +swatch](/docs/images/dark-gray-blue-256.png){.img-thumbnail}](/docs/images/dark-gray-blue-256.png) + +#### dark-green-256.theme + +[![Theme +swatch](/docs/images/dark-green-256.png){.img-thumbnail}](/docs/images/dark-green-256.png) + +#### dark-red-256.theme + +[![Theme +swatch](/docs/images/dark-red-256.png){.img-thumbnail}](/docs/images/dark-red-256.png) + +#### dark-violets-256.theme + +[![Theme +swatch](/docs/images/dark-violets-256.png){.img-thumbnail}](/docs/images/dark-violets-256.png) + +#### dark-yellow-green-256.theme + +[![Theme +swatch](/docs/images/dark-yellow-green-256.png){.img-thumbnail}](/docs/images/dark-yellow-green-256.png) + +#### light-16.theme + +[![Theme +swatch](/docs/images/light-16.png){.img-thumbnail}](/docs/images/light-16.png) + +#### light-256.theme + +[![Theme +swatch](/docs/images/light-256.png){.img-thumbnail}](/docs/images/light-256.png) + +#### solarized-dark-256.theme + +[![Theme +swatch](/docs/images/solarized-dark-256.png){.img-thumbnail}](/docs/images/solarized-dark-256.png) + +#### solarized-light-256.theme + +[![Theme +swatch](/docs/images/solarized-light-256.png){.img-thumbnail}](/docs/images/solarized-light-256.png) +::: diff --git a/content/docs/triage.md b/content/docs/triage.md new file mode 100644 index 00000000..3a365001 --- /dev/null +++ b/content/docs/triage.md @@ -0,0 +1,63 @@ +--- +title: "Taskwarrior - Triage" +--- + +### Triage + +This is the initial assessment of an issue. The purpose is to get it moving in +the right direction and make sure it gets noticed in the right context, which +means making sure that every issue has a suitable category and version. New +issues are reported all the time, sometimes the submitter fills in fields, +sometimes not. That cannot be controlled. Everything else can. + +#### Initial Assessment + +- Move the issue to the correct project. Sometimes an issue is reported as a + Taskserver bug, but it is a sync issue with Taskwarrior. +- Move the issue to the correct type, which means bug, feature or improvement. + Sometimes it is not easy to distinguish, and some folks are clever about + reporting a feature request in the form of a bug, assuming that bugs gets + more attention than feature requests. We\'re not fooled by that. + +#### Bugs + +- All bugs should have the \"Target version\" set to the current development + effort. This reflects the need to fix as many bugs in a release as practical + because bugs are a priority. +- The \"To\" field should be blank. This indicates that no one is currently + working on it. +- \"Category\" is usually set to \"core\" unless there is a more relevant + category. +- \"Priority\" should be \"Normal\" unless the bug causes crashes, lack of + functionality, or the worst possible: data corruption. Whatever the + submitter sets priority to, reassess it, because it will not influence + anything. Only the true nature of the bug influences priority. +- \"Status\" should stay as \"New\". +- \"Due date\", nope. We don\'t work that way. +- \"Target version\" has only two alternatives. Either it is a Taskwarrior bug + in which case the version should be the current development effort + (\"2.4.0\"), or it refers to an external script, and should be + \"extension\". +- If the bug looks like a duplicate, try to find the other bug and link the + two. It is not necessary to reject the bug. Sometimes duplicate bug reports + contain complementary information, which is useful. +- If the bug can be replicated, please do so, and add your finding to the + issue. More evidence is better, and often helps to narrow down the cause. +- If there is a clear workaround to the bug, add the information to the issue, + so the submitter can continue to work. Helping the submitter work around the + problem is important, because the eventual fix will take time, perhaps + months. Always try to educate the user and don\'t forget that these issues + are permanent and therefore searchable and useful to everyone. +- If a bug looks like a really big problem, tell people, make a noise. + +#### Features + +Same as \"Bugs\" above , but with these differences: + +- \"Target version\" should always be \"BACKLOG\". This is a non-specific + future release. Features should be cherry-picked out of the \"BACKLOG\" + version and moved to the current development version. They should not + default to the current development version, where we have to defer them + constantly. It gives the wrong impression to have a giant list of features + under the current development effort - it makes people think the next + release is going to be huge, which is rarely the case. diff --git a/content/docs/udas.md b/content/docs/udas.md new file mode 100644 index 00000000..a4b893db --- /dev/null +++ b/content/docs/udas.md @@ -0,0 +1,132 @@ +--- +title: "Taskwarrior - User Defined Attributes (UDA)" +--- + +### User Defined Attributes (UDA) + +Taskwarrior supports a set of standard attributes for a task, known as the core +attributes. These include `project`, `description`, `due` and so on. There are +more than 20 standard attributes (see [columns](/docs/commands/columns.html) for +a full list). They are necessary to provide all the functionality of +Taskwarrior. For example, the `project` attribute is used to provide feedback on +completion of a project, the `projects` command itself, and project hierarchy +filtering. The `project` attribute has a lot of functionality associated with +it, and this is why `project` is a core attribute. + +Other attributes, such as `priority` do not have much associated functionality. +In fact, beyond storing the value, allowing modification, sorting and inclusion +in reports, the `priority` field contributes nothing. This is why `priority` is +not really a core attribute, and will be migrated out of the code and into +configuration. + +Occasionally people will ask for new attributes, because their workflow includes +more metadata than Taskwarrior supports. A very common request is for an +`estimate` attribute, which would store a scalar quantity of some kind, perhaps +a number of days, or large/medium/small. Until now, the answer to most of these +requests is to use tags or annotations to approximate the storage of the +metadata. Now we have UDAs to achieve this. + +#### What is a UDA? + +A UDA is a new metadata item that you define, and taskwarrior faithfully stores, +displays, and modifies. But that is the extent of it, because Taskwarrior does +not leverage it for functionality like the `project` attribute, but simply +treats it as a data value with a name, allowing you to sort by it, use it in a +report, import and export it. + +It is intended that, once configured, a UDA is indistinguishable from core +attributes, and will not impart performance penalties. + +#### Data Types + +A UDA has a type, which may be one `string`, `numeric`, `date` or `duration`. If +a UDA has type `date`, then it will naturally only accept date values, just like +the core attribute `due`. The `string` UDA type is special, in that a list of +acceptable values may also be provided, and taskwarrior will only allow +modifications if the new value is in the list. + +#### Example: estimate + +A UDA is created by modifying configuration. There are two or three +configuration settings involved. Let\'s create an `estimate` UDA that is +numeric: + + $ task config uda.estimate.type numeric + $ task config uda.estimate.label Est + +That\'s all - but note there are three pieces of information there: first there +is \"estimate\", which is the attribute name, then \"numeric\" which is the +type, and finally \"Est\", which is the default label used when the UDA is +included in a report. Now you can add or modify a task to include an estimate. + + $ task add "Paint the door" project:Home estimate:4 + ... + +#### Example: size + +Now suppose you are developing software in an Agile environment. You may wish to +have a `size` attribute that may contain a fixed set of values, such as +\"large\", \"medium\" or \"small\". This is achieved using an additional +configuration setting: + + $ task config uda.size.type string + $ task config uda.size.label Size + $ task config uda.size.values large,medium,small + +Now if you attempt to store a value such as \"tiny\", taskwarrior will disallow +it. + +#### Default Values + +Default values may be defined. Continuing the example above, to specify a +`medium` size default for each task, use this setting: + + uda.size.default=medium + +This default value will be applied to any task that does not otherwise have a +`size` value. + +#### Urgency + +You can specify that a UDA contributes to the urgency calculation of a task. As +an example, the above `size` UDA could be given an urgency coefficient like +this: + + urgency.uda.size.coefficient=2.8 + +Then whenever a task has a non-trivial value in the `size` UDA, the urgency is +boosted by 2.8. + +To assign an urgency coefficient that has an empty value leave no space between +the attribute and the coefficient. As an example, to match urgency to an empty +priority, the coefficient can be assigned like this: + + urgency.uda.priority..coefficient=2.5 + +#### Orphaned UDAs + +Suppose you define an `estimate` UDA and use it. Then you remove the +configuration for the UDA. You have just created a situation where the data is +stored, but is no longer something that can be used in a report or a filter. +This is an orphan UDA. + +You might think this is an unusual situation, but it is exactly what happens if +you sync data with UDAs to a taskwarrior installation that does not have the UDA +configured. Data loss would be unacceptable, so taskwarrior will preserve all +orphan UDA data, but will not let you manipulate it. Only defined UDAs can be +manipulated. There is one exception - the `edit` command will let you remove UDA +orphans by making their values blank, which eliminates any attribute. + +#### Custom Reports + +UDA fields may be used in custom reports, just like any other attribute. A +report containing an attribute that is an orphan UDA is not a valid report. + +#### Other UDA Uses + +The `priority` attribute is soon to be replaced by a UDA equivalent. This is not +something that anyone will notice, but it will make for a smaller, more stable +core product. UDAs are useful for other capabilities though. An example would be +the import of bugs from a Request Tracker. The additional metadata in the +Request Tracker could be created as UDAs in taskwarrior, which will then allow +for a full import without data loss. diff --git a/content/docs/unicode.md b/content/docs/unicode.md new file mode 100644 index 00000000..47901bed --- /dev/null +++ b/content/docs/unicode.md @@ -0,0 +1,15 @@ +--- +title: "Taskwarrior - Unicode" +--- + +### Unicode + +All text in Taskwarrior is UTF8, which means any Unicode characters can be +entered and stored. Here is a demo: + +Both the `U+NNNN` and `\\uNNNN` specifiers are supported, but it is usually +simpler to use the first, which does not require the backslashes to be escaped +in shells and scripts. + +Note that the font you use in your terminal determines whether those characters +are rendered, so it is possible to enter characters for which there is no glyph. diff --git a/content/docs/urgency.md b/content/docs/urgency.md new file mode 100644 index 00000000..4d489103 --- /dev/null +++ b/content/docs/urgency.md @@ -0,0 +1,117 @@ +--- +title: "Taskwarrior - Urgency" +--- + +### Urgency + +Taskwarrior has a `next` report, which is sorted by decreasing urgency. If that +measure of urgency represents or approximates your idea of what is important, +then the tasks you should start next will appear near the top of that list. But +what is *urgency*? + +Sometimes a task list is driven by dependency, due date or perhaps priority. In +these situations it is relatively easy to select a task to work on next. There +are times however, when this is less clear and you would like to see tasks +listed in some kind of common-sense order that embodies several factors. + +Urgency is a numeric score Taskwarrior assigns to each task. It is based on a +dozen or more factors that combine to form an overall urgency score. Now this is +not going to be a complete and accurate representation of urgency for many +reasons, primarily because each of us has different criteria when judging the +importance of a task. But it will *approximate* urgency, and that is the goal. + +There are many other real-life examples of algorithms that are used to +approximate qualities: the Apgar Score that assesses the health of newborns, +Google\'s Page Rank that measures the importance of a web link, or credit +ratings. These examples all approximate, but cannot perfectly represent, a +complex concept. + +Taskwarrior uses a polynomial expression to calculate urgency. This is a simple +sum of terms, where each term represents some measurable quality of a task. For +example, the priority of a task is an indicator of its urgency. A high priority +is more urgent than a medium priority and so on. Even a low priority is more +urgent than no priority. Priority settings should therefore contribute to the +urgency score. + +Similarly, if a task is `waiting`, the urgency score should be reduced. If a +task has a due date, then the closeness of that deadline should affect urgency. +If a task is overdue, it should have a greater impact on urgency. + +In this way, the different terms can each contribute to the overall score, but +there is a further need to identify which terms are important to you. This is +achieved with configurable coefficients for each term. The urgency coefficients +and their default values are: + + urgency.user.tag.next.coefficient 15.0 # +next tag + urgency.due.coefficient 12.0 # overdue or near due date + urgency.blocking.coefficient 8.0 # blocking other tasks + urgency.uda.priority.H.coefficient 6.0 # high Priority + urgency.uda.priority.M.coefficient 3.9 # medium Priority + urgency.uda.priority.L.coefficient 1.8 # low Priority + urgency.scheduled.coefficient 5.0 # scheduled tasks + urgency.active.coefficient 4.0 # already started tasks + urgency.age.coefficient 2.0 # coefficient for age + urgency.annotations.coefficient 1.0 # has annotations + urgency.tags.coefficient 1.0 # has tags + urgency.project.coefficient 1.0 # assigned to any project + urgency.user.project.My Project.coefficient 5.0 # assigned to project:"My Project" + urgency.waiting.coefficient -3.0 # waiting task + urgency.blocked.coefficient -5.0 # blocked by other tasks + +The first coefficient has a value of 15.0, which is the highest value. This +means that any task with the `+next` tag has an urgency score of at least 15.0. +The `+next` tag is known as a \'special tag\', which is simply a tag that +triggers some behavior in taskwarrior - in this case it elevates the urgency +score. Because the coefficient has the largest value, it indicates that the +`+next` tag has the greatest influence on urgency. + +The next most significant term is for tasks with a due date, then blocking tasks +and so on. Note that blocked tasks have a coefficient of -5.0, which means that +they reduce the urgency score. + +The lowest coefficient, that of annotations, has a value of 1.0. This means that +a task with more annotations is more urgent than a task with fewer. The value of +1.0 means this is a weak contributor to urgency, but nevertheless means that +tasks with lots of annotations are an indicator of some kind of focus of +activity. You may not agree with this assessment however, and so you might set +this coefficient to 0, which means you want the term to have no effect on +urgency. + +The urgency caused by tags and annotations is further modified by the number of +tags/annotations present: The factor is 0.8 for one, 0.9 for two and 1.0 for +more. + +[]{#custom} + +#### Customizing Coefficients + +The default coefficients have been chosen to represent all of the terms in a +simple, common-sense way. While these do not necessarily reflect your own +judgement, they should be considered a decent starting point. + +Before you make adjustments to these values, it is recommended that you use the +next report as-is for a while. This will let you evaluate how effective the +values are for your particular style. For example you might realize that tasks +that are already started contribute unfairly to the urgency score. But it is +useful to arrive at this conclusion based on usage, rather than simply reading +the coefficient values above. But once you are familiar with the urgency scores +and have developed a sense that things need to be tweaked, go ahead and change +the values. + +Suppose you consider priority to be the most important factor. You might want to +simply increase the value from 6.0 to 10.0. You might also want to reduce +several other coefficients. Of course you are free to do anything you choose, +but it is important to bear in mind that any one term in the polynomial should +not dominate the expression. For example, setting a value of 30.0 while all the +other values are under 10.0 would be a mistake, because then there is really +only one factor influencing urgency, and it will likely not reflect any +subtleties. + +A more extreme example would be to set the coefficient for priority to 1.0, and +all the other values to 0. This would result in a next report that is identical +to one sorted only on priority. + +Adjustments to the coefficients should also be small. A good approach is to make +all adjustments either the addition or subtraction of 1.0 to a value, thus +limiting the effects of a change. The urgency algorithm is a subtle interplay of +several factors, and that is one of its main strengths. diff --git a/content/docs/using_dates.md b/content/docs/using_dates.md new file mode 100644 index 00000000..a671e167 --- /dev/null +++ b/content/docs/using_dates.md @@ -0,0 +1,203 @@ +--- +title: "Taskwarrior - Using Dates Effectively" +--- + +### Using Dates Effectively + +A task does not require a due date, and can simply be a statement of need: + + $ task add Send Alice a birthday card + +However this is exactly the kind of task can benefit from having a due date, and +perhaps several other dates also. + +There are several dates that can decorate a task, each with its own meaning and +effects. You can choose to use some, all or none of these, but like all +Taskwarrior features, they are there in case your needs require it, but you do +not pay a performance or friction penalty by not using them. + +[]{#due} + +#### The `due` Date + +Use a `due` date to specify the exact date by which a task must be completed. +This corresponds to the last possible moment when the task can be considered +on-time. Using our example, we can set the `due` date to be Alice\'s birthday +(line breaks added for clarity): + + $ task add Send Alice a birthday card \ + due:2016-11-08 + +Now your task has an associated `due` date, to help you determine when you need +to work on it. But what effect does this have on Taskwarrior? How can it be used +to best advantage? + +We call the `due` date of a task \'metadata\'. As such, it is just a piece of +data associated with the task, and therefore it can become part of a filter: + + $ task due:today list + ... + +This is one way to find out if any of your tasks are due today. You could also +use: + + $ task +TODAY list + ... + +That is an example of a virtual tag, `TODAY`, which is not a real tag, but is +something you can query, and is equivalent to the previous example. Additionally +you can use `DUE` which filters tasks that have a due date in the next week, or +`WEEK` for all tasks due this week, including `YESTERDAY`, `TOMORROW`, `MONTH` +and `YEAR`. + +You can find tasks that have any due date at all: + + $ task due.any: list + ... + +Or no due date: + + $ task due.none: list + ... + +There is also an `overdue` report that makes use of the `OVERDUE` virtual tag, +to show you what is already late. If you run the `calendar` report, your due +date will be highlighted on it. + +What we see here is that Taskwarrior leverages the metadata to drive various +features. Several reports will sort by `due` date, and as we see above, a task +that has a due date now belongs on your schedule. + +[]{#scheduled} + +#### The `scheduled` Date + +A `scheduled` date is different from a `due` date, and represents the earliest +opportunity to work on a task. Let\'s continue with the same example above. You +need to send a brithday card to Alice, but her birthday isn\'t until November, +so it\'s not the kind of task that can be done in advance. Ideally this would be +done a few days ahead of the `due` date: + + $ task add Send Alice a birthday card \ + due:2016-11-08 \ + scheduled:2016-11-04 + +This means that you need to send Alice a birthday card, no later than +2016-11-08, and no earlier than 2016-11-04. + +If a task has a `scheduled` date, then once that date passes, the task is +considered ready, and there is a `ready` report and a `READY` virtual tag for +this: + + $ task ready + ... + $ task +READY list + ... + +Tasks that have no `scheduled` date are considered always ready. Again, metadata +drives the sophistication of your task list. + +[]{#wait} + +#### The `wait` Date + +Many people do not like to look at long task lists, finding them daunting, or +just distracting. You can add a `wait` date to a task, which has the effect of +hiding the task from you until that date. In our example, Alice\'s birthday +isn\'t close yet, so we applied a `scheduled` date to indicate that we should +not begin the task yet, as it is not ready. Now let\'s add a `wait` date to the +task: + + $ task add Send Alice a birthday card \ + due:2016-11-08 \ + scheduled:2016-11-04 \ + wait:november + +Here the task is given a `wait` date of 2016-11-01, via the useful shortcut +\'november\', which means the task will not appear on lists until November. At +that time, it will reappear, but it will still not be ready until 2016-11-04. + +You can view all the hidden waiting tasks using the `waiting` report: + + $ task waiting + ... + +There is a `WAITING` virtual tag to select these tasks, but note that you have +to use the `all` report with it, otherwise you get conflicts with the other +reports that specify a \'pending\' status, because a waiting task is not +pending. + +[]{#until} + +#### The `until` Date + +Now suppose I miss Alice\'s birthday completely. Shame on me. The task would be +overdue, but this is the kind of task where I don\'t want to complete it late, +I\'d rather just forget it, and wish Alice a belated happy birthday in person. I +could simple delete or complete the task, but there is another option, which is +to add an `until` date: + + $ task add Send Alice a birthday card \ + due:2016-11-08 \ + scheduled:2016-11-04 \ + wait:november \ + until:2016-11-10 + +This means that on 2016-11-10, the task self destructs, and is automatically +deleted. This might be the right thing to do for a birthday card task, but is +not suitable for a \"Pay the rent\" task. Beware! + +There is a DOM-based shortcut you can use, to make the command above a ittle +more formulaic: + + $ task add Send Alice a birthday card \ + due:2016-11-08 \ + scheduled:due-4d \ + wait:due-7d \ + until:due+2d + +This are evaluated only at task creation time, so if you change the due date, +you also need to change the other dates. Note there is an `UNTIL` virtual tag to +show you all tasks that are set to auto-expire. + +[]{#other} + +#### Other Dates + +There are other dates associated with a task, but these are more for internal +use, and are less useful for you. + +Each task has an `entry` date which records when it was created. Each completed +or deleted task has an `end` date, which records when it was completed or +deleted. An active, or started task has a `start` date, but only while it is in +the active state. Finally, every task has a `modification` date, which records +when it was last modified. This is used as a hint when tasks are being synced. + +In addition, you may find you have a use case for a different kind of date for +your task lists. For example, you may adhere to an agile development process, +and a task may be assigned to a sprint, and that sprint may be identified by its +end date. You can add arbitrary dates like this to Taskwarrior by defining a +[User Defined Attribute](/docs/udas.html) (UDA) and then storing that metadata +with your tasks. In this case, Taskwarrior will do nothing with your UDA but +store it, and let you use it in reports and filters. + +[]{#urgency} + +#### Urgency + +The presence and values of date metadata in your tasks affects the urgency +calculations. For example, if a task is blocked by a dependency, the urgency is +reduced. Similarly tasks that are ready have an elevated urgency. + +[]{#also} + +#### See Also + +For other discussions of dates see: + +- [Date & Time](/docs/dates.html) +- [Named Dates](/docs/named_dates.html) +- [User Defined Attributes](/docs/udas.html) +- [Best Practices](/docs/best-practices.html) +- [Urgency](/docs/urgency.html) +::: diff --git a/content/docs/verbosity.md b/content/docs/verbosity.md new file mode 100644 index 00000000..14bb1ddb --- /dev/null +++ b/content/docs/verbosity.md @@ -0,0 +1,54 @@ +--- +title: "Taskwarrior - Verbosity" +--- + +### Verbosity + +Taskwarrior provides feedback when commands are run, the amount of which can be +controlled. There is a configuration variable named `verbose` that can be set to +different values to control verbosity. By default, the value is: + + verbose=yes + +This value causes Taskwarrior to show all feedback. Conversely it can be set to: + + verbose=no + +This restricts the amount of feedback, but still retains useful information. To +remove all feedback, use the setting: + + verbose=nothing + +[]{#control} + +#### Fine Control + +Individual verbosity settings can be specified, in this form: + + verbose=footnote,label + +The value in this case consists of two tokens which cause footnotes to be shown +after the tasks in a report, and table column labels. + +[]{#tokens} + +#### Verbosity Tokens + + Token Meaning + ---------- ---------------------------------------------------------------------------------------------------------------------- + blank Inserts blank lines in the output to separate the task lists from other feedback. + header Shows information before the task list, regarding aliases or the default command. + footnote Shows information after the task list, such as configuration overrides. + label Shows column labels for tabular output. + new-id Provides feedback on any new task with IDs (and UUIDs for new deleted or completed tasks). + new-uuid Provides feedback on any new task with UUIDs. Overrides new-id. Useful for automation.[2.6.0]{.label .label-success} + affected Shows how many tasks were affected by a bulk modification. + edit Shows a preamble and additional text in the template when using the `edit` command. + special Shows feedback when special tags are used. + project Shows feedback on project status changes. + sync Shows feedback during sync. + filter Shows the complete filter used. [2.4.0]{.label .label-success} + override Shows in the header if TASKDATA or TASKRC are overriden. [2.6.0]{.label .label-success} + unwait Notification whe a task leaves the \`waiting\` state. Displayed in the footnote.[2.5.0]{.label .label-success} + context Show the current context. Displayed in footnote. [2.5.0]{.label .label-success} +::: diff --git a/content/docs/workflow.md b/content/docs/workflow.md new file mode 100644 index 00000000..3678a1c4 --- /dev/null +++ b/content/docs/workflow.md @@ -0,0 +1,248 @@ +--- +title: "Taskwarrior - Workflow Examples" +--- + +### Workflow Examples + +Everyone uses Taskwarrior differently. Here are some example workflows, to make +you think about your own particular approach. + +[]{#joshua} + +::: {.panel .panel-primary} +::: {.panel-heading} +### Joshua {#joshua .panel-title} +::: + +- **Where do you use Taskwarrior?**\ + Everywhere to get track of things. I keep my personal thing separated and + two zones for work projects each on it\'s own git repository. +- **For what kind of work do you use Taskwarrior?**\ + At work to organize my projects, chop them into small tasks have a log of + what I am doing, and log of how did I solved problems. +- **How do you sync? What kind of devices do you use?**\ + I use a custom git hook that commits only `pending.data` and + `completed.data` and push to a local private repository where the team also + commits, The script also detects completed tasks and the latest version of + the task in case multiple versions of the same tasks are found. Currently + i\'m implementing an annotator to document projects. +- **Which is your default report?**\ + Task next, with customized filter and sort order: + `rc.report.next.filter=status:pending,+UNBLOCKED`\ + `report.next.sort=status-,start-,priority-,project+,due+` +- **Do you use a standard or customized methodology?**\ + Mostly GTD, but will try to add kanban elements. +- **Do you use extensions? Hook scripts?**\ + Custom git synchronization script. Posibly custom git editor script. +- **What features do you rely on most?**\ + I use start to see what I\'m doing, but i\'d like to use it to keep track of + the time, so I\'ll need another mecanism to use kanban like «In progress». I + use annotations to document procedures or important things. I also use + projects, tags, scheduled and due dates to classify tasks. +- **What features do you deliberately not use?**\ + No urgency. No undo (as that goes in git). +- **How do you review your list?**\ + I usually use `task` to see what\'s in progress and continue doing that. I + have my tasks sorted by projects and priority, so I\'ll seek the project + that needs to advance and check the most important task for that. +- **Other Notes**\ + I\'d like an easy to deploy kanban like project visualization tool. +::: + +[]{#paul} + +::: {.panel .panel-primary} +::: {.panel-heading} +### Paul {#paul .panel-title} +::: + +- **Where do you use Taskwarrior?**\ + I use Taskwarrior at home. +- **For what kind of work do you use Taskwarrior?**\ + I mostly use it for software development projects, but there are some other + projects including training. Taskwarrior was mostly developed using + Taskwarrior to track features and bugs. +- **How do you sync? What kind of devices do you use?**\ + I use Taskserver, set up on a VPS, to sync two clients, a laptop and + desktop. I am one of several people using that Taskserver. +- **Which is your default report?**\ + I use the `next` report most often, and have tweaked the coefficients to + represent my definition of urgent. The `next` report doesn\'t yield + surprises, so I can rely on it. I don\'t have any of my own custom reports. +- **Do you use a standard or customized methodology?**\ + I don\'t follow any standard methodology. I use project hierarchies (tw, + tw.242, tw.250 \...) so I can look at projects at different levels. +- **Do you use extensions? Hook scripts?**\ + I have two hook scripts active. One is an on-add hook script that converts + \'tw-179\' to + \'https://github.com/GothenburgBitFactory/taskwarrior/issues/179\'. The + other is also an on-add hook that warns me when I add a task without a + project. +- **What features do you rely on most?**\ + I rely on `sync`, `next` and virtual tags a lot. I use \'wait\' to hide + things. This is because I prefer to look at shorter lists. +- **What features do you deliberately not use?**\ + I do not use priorities at all. I did use them, but found that I spent too + much time fiddling with the values. I think priority is a fluid thing, + shifting a lot, and having these values assigned just means a lot of + maintenance work. +- **How do you review your list?**\ + I use a new review feature in tasksh, which is not completed yet but is + proving effective already. This will be released in early 2016. I have not + yet developed good review habits, so it happens less often that it should. +- **Other Notes** + - I don\'t use due dates unless there really is a hard, real-world due + date. + - I use dependencies when there are several related tasks and a clear + sequence, but there aren\'t that many. + - I use `start` and `stop` to indicate what I am currently working on, so + I can remember where to pick up the next day. + - I use a few keyword-based color rules so that groups of things I care + about stand out in lists. I color the `Documentation` and `Performance` + keywords, and the`+bug` tag. + - My list is mainly things I don\'t want to forget, not a list of things I + need to do today. +::: + +[]{#tomas} + +::: {.panel .panel-primary} +::: {.panel-heading} +### Tomas {#tomas .panel-title} +::: + +- **Where do you use Taskwarrior?**\ + I use a separate Taskwarrior database for tracking of my daily habits. This + is achieved by setting `alias habit="task rc.data.location=~/.habit"` in my + .bashrc. +- **For what kind of work do you use Taskwarrior?**\ +- **How do you sync? What kind of devices do you use?**\ + Currently, I am using only one laptop, so I am not using sync. Nevertheless, + in the past I did use sync. +- **Which is your default report?**\ +- **Do you use a standard or customized methodology?**\ + I have a default.project set to Inbox, where every task goes initially, + unless I assign its particular project directly when adding it. Every task + belongs to a project. Project hierarchy corresponds to different areas of my + life, and I use subprojects a lot. Project examples include + \'Work.Tickets\', \'Home\' or \'Volunteering.Floss.Taskwarrior\'. +- **Do you use extensions? Hook scripts?**\ +- **What features do you rely on most?**\ + Since I use projects to distinguish areas in which the tasks fall, I tend to + use tags to distinguish what kind of a task it is. Currently, I only use + this consistently for programming-related activities (+bug, +rfe, +test, + etc.), but I plan to expand that in the future. I try to not add new tags + carelessly. I use new tags only after careful consideration. I use due dates + both for real-world deadlines and self-imposed deadlines. This is probably + wrong, since I tend to shift tasks a lot then, and I treat the \'due date\' + with much less importance than it deserves. I should move to scheduled for + self-imposed deadlines. I use dependencies for enumerating sub-tasks of any + bigger tasks that need to be broken down into individual steps. Since + entering dependencies requires more work (enumerating IDs), I usually do + this step in taskwiki, which can set dependencies by indentation. I do not + have multiple blocked task for one task, so my task lists can be shown in + the form of a dependency tree. +- **What features do you deliberately not use?**\ + I do not use priorities much. I just never felt the need to. I do not use + reports very often. This is due to the fact that Taskwarrior currently + cannot display dependency trees, which coupled with my habit of breaking + down tasks into small subtasks makes the task lists often confusing. I + suppose I could try configuring Taskwarrior to exclude the child tasks by + default, but it only occurred to me now. I do not use any custom color rules + yet. +- **How do you review your list?**\ +- **Other Notes** + - When deciding how to continue with a given project, I open the + corresponding taskwiki file, which serves as a permanent dynamic report + coupled with project-related notes. + - I use simple contexts that usually are just implicit project selectors, + such as `project:Work`. + - I use `start` and `stop` to indicate what I am currently working on. I + have a little tmux powerline plugin, which displays the description of + the currently active task (within the selected context), which helps me + to focus back on the currently active task if I manage to distract + myself. + - I use taskwiki to generate a daily journal of tasks that need to be + completed on the given day. I also use this file to review my day in few + lines. This gives me an ability to quickly see what I did on an + particular day. + - My list attempts to be not only a list of tasks I must remember, but a + somewhat accurate description of what I did. I even tend to create and + log new completed tasks for stuff that was not planned, but was achieved + on any given day. +::: + +[]{#dirk} + +::: {.panel .panel-primary} +::: {.panel-heading} +### Dirk {#dirk .panel-title} +::: + +- **Where do you use Taskwarrior?**\ + I do not use Taskwarrior at work, because my work systems are behind strict + proxies, but I manage my work tasks with private devices to have all + todo-items in one solution. I experimented a lot with nearly each and every + features of Taskwarrior and came back to the basics recently. +- **For what kind of work do you use Taskwarrior?**\ +- **How do you sync? What kind of devices do you use?**\ + I use Taskwarrior on every device with a full, non-proxied internet + connection and sync those installations with a self-hosted Taskserver on the + net. All devices have the same configuration. \"Every device\" includes my + notebook (Fedora Linux), a fix home-based computer (CentOS), four servers on + the net (CentOS) and my mobile phone and my tablet as well (both Android). +- **Which is your default report?**\ +- **Do you use a standard or customized methodology?**\ +- **Do you use extensions? Hook scripts?**\ +- **What features do you rely on most?**\ + Nearly all of my tasks have due dates, even though I am not able to do some + of them in time. My most important modifier is wait. This is how I keep my + todolist clean. I am using projects and subprojects to organize my tasks. + That makes filtering easy for me. On the other hand I do not use any tags + apart from virtual tags. To do work in a specific area I filter my tasks + with projects, but I think I will change to use contexts instead. I like + annotations and use them a lot. On the one hand to set my longterm goals + (private and business wise), on the other hand I annotate tasks with links. + To make handling of annotations easier, I love + [taskopen](https://github.com/ValiValpas/taskopen) on my desktop and + strictly recommend this to everyone. +- **What features do you deliberately not use?**\ + Very seldom I use dependencies, mostly I steer that with time constraints. + Task B has a due date end-of-work-week and task B has a wait-date till + beginning of next work-week. I do not use priorities at all. +- **How do you review your list?**\ +- **Other Notes** + - I run a minimal configuration, choosing a theme that pleases me, Monday + as weekstart, `calendar.details=full` and `calendar.holidays=sparse`. + - Even though that does not make much sense I use `wait:someday` sometimes + to move tasks completely out of the way. (Hint: you can find them with + `task waiting`). + - I do not write everything into Taskwarrior. I have a brain and I am + willing to use it ;-) +::: + +[]{#Fredde} + +::: {.panel .panel-primary} +::: {.panel-heading} +### Fredde {#fredde .panel-title} +::: + +- **Where do you use Taskwarrior?**\ +- **For what kind of work do you use Taskwarrior?**\ +- **How do you sync? What kind of devices do you use?**\ + Taskserver for \"backup\" - have used git on the task folder previously. Two + separate (logical and physical (different computers/servers)) task + installations - one for work, one for private tasks. +- **Which is your default report?**\ +- **Do you use a standard or customized methodology?**\ +- **Do you use extensions? Hook scripts?**\ +- **What features do you rely on most?**\ + Projects and tags to simulate state of tasks like in Kanban. Easy basic + reports to filter on project and then on \"state tags\". Annotations to + record information or refer to my big-arse-text-file-from-hell. Task + calendar is used a lot to find out about calendar weeks and dates at work. +- **What features do you deliberately not use?**\ + No due dates at all. No urgency; I read through the list and decide on the + most \"obvious" task (whatever that means). +- **How do you review your list?**\ diff --git a/content/download/index.md b/content/download/index.md new file mode 100644 index 00000000..ca2c8ffc --- /dev/null +++ b/content/download/index.md @@ -0,0 +1,239 @@ +--- +title: "Taskwarrior - What's next?" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +Download source tarball or access code repository here. +::: + +::: {.col-md-10 .main} +::: {.row} +::: {.col-md-2 .main} +**Download** +::: + +::: {.col-md-10 .main} +**Latest stable release:** + +**taskwarrior 2.5.3** (Released 2021-01-03): +[task-2.5.3.tar.gz](/download/task-2.5.3.tar.gz){.piwik_download}\ +SHA1 ba1a3cbc5903979755d47f724d14ebeff40b6c81\ +[Changelog](https://github.com/GothenburgBitFactory/taskwarrior/blob/master/ChangeLog) + +**taskd server 1.1.0** (Released 2015-05-10): +[taskd-1.1.0.tar.gz](/download/taskd-1.1.0.tar.gz)\ +SHA1 ded339deeee65277e4712f71a9159502f8b20b52\ +[Changelog](https://github.com/GothenburgBitFactory/taskserver/blob/master/ChangeLog) + +Command reference taskwarrior 2.5.3: +[task-2.5.3.ref.pdf](/download/task-2.5.3.ref.pdf) + +See [supported platforms](#dist) for operating systems. +::: +::: + +::: {.row} +### + +::: {.col-md-2 .main} +**Quick Setup** +::: + +::: {.col-md-10 .main} +Build the task program according to the directions in the INSTALL file. This +transcript illustrates a typical installation: + + $ ls + task-2.5.3.tar.gz + $ tar xzvf task-2.5.3.tar.gz + $ cd task-2.5.3 + $ cmake -DCMAKE_BUILD_TYPE=release . + ... + $ make + ... + $ sudo make install + +(Please note, that Cygwin is not supported anymore. Please use the Windows +Subsystem for Linux to use Taskwarrior on Windows). + +Ensure that the installed task program is in your PATH environment variable. On +startup, task will check to see if it can find the configuration file and task +directory, and if not found, will ask you whether it may create both. +::: +::: + +::: {.row} +### + +::: {.col-md-2 .main} +**Distributions** +::: + +::: {.col-md-10 .main} + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Distribution Command Available since + --------------------------------------------------------------------------------------- ------------------------------------------------------------------ -------------------------- + [Debian sid](https://packages.debian.org/sid/utils/taskwarrior) `sudo apt-get install taskwarrior` Debian sid + + [Debian](https://backports.debian.org/Instructions/) `sudo apt-get install taskwarrior` 7.x Wheezy + + [Ubuntu](https://packages.ubuntu.com/search?keywords=taskwarrior) `sudo apt-get install taskwarrior` 10.10 Maverick Meerkat + + [Fedora](https://apps.fedoraproject.org/packages/task) `yum install task` Fedora 18 + + Red Hat Enterprise Linux task has been submitted to the EPEL repositories of Fedora. Please \- + refer to the [EPEL + documentation](https://fedoraproject.org/wiki/EPEL/FAQ#howtouse) + + [OpenSUSE](https://software.opensuse.org/package/taskwarrior?search_term=taskwarrior) `zypper install taskwarrior` openSUSE 12.2 + + [Archlinux](https://www.archlinux.org/packages/community/x86_64/task/) `pacman -S task` \- + + [Slackware](https://slackbuilds.org/repository/14.0/office/task/) `sbopkg -i task` 13.0 + + [Gentoo](https://packages.gentoo.org/package/app-misc/task) `emerge task` \- + + [Sabayon](https://www.sabayon.org/) `sudo equo install task` \- + + [FreeBSD](https://www.freshports.org/deskutils/taskwarrior) To install the port:\ \- + `cd /usr/ports/deskutils/taskwarrior/`\ + `make install clean`\ + To add the package:\ + `pkg_add -r taskwarrior` (Deprecated)\ + `pkg install taskwarrior` (Newer releases) + + [OpenBSD](https://www.openbsd.org/cgi-bin/cvsweb/ports/productivity/taskwarrior/) Before 5.8\ \- + `sudo pkg_add -i taskwarrior`\ + Version 5.8+\ + `doas pkg_add -i taskwarrior` + + [Mac OS X](https://github.com/Homebrew/homebrew-core/blob/master/Formula/task.rb) [Homebrew](https://brew.sh/): `brew install task`\ \- + [Homebrew](https://brew.sh/): `brew install taskd`\ + [Homebrew](https://brew.sh/): `brew install tasksh`\ + [MacPorts](https://www.macports.org/): `port install task` + + [Cygwin](https://cygwin.com/cgi-bin2/package-grep.cgi?grep=task%2F) Add it during setup Windows XP SP3 + + [Windows 10](https://www.microsoft.com/en-us/software-download/windows10/) Bash on Ubuntu on Windows 10:\ Windows 10 Insider Preview + `apt-get install task` + + [MSYS2](https://msys2.github.io) `pacman -S task` \- + + [NixOS](https://nixos.org/) `nix-env -i taskwarrior` \- + + [Void](https://voidlinux.org/) `xbps-install task` \- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +::: +::: + +::: {.row} +### + +::: {.col-md-2 .main} +**Git Repository** +::: + +::: {.col-md-10 .main} +Get the whole source and history from our git repository. You will need +[git](https://git-scm.com) installed. + +##### Disclaimer: + +The `master` branch represents the latest stable release. + +All other branches are development branches, and are works in progress and may +not pass all quality tests, therefore may harm your data. While we welcome bug +reports from the development branch, we do not guarantee proper or timely fixes. + +- Broken functionality may arise from ongoing development work +- Make proper backups +- Be aware that using the development branch involves risks + +```{=html} + +``` + git clone https://github.com/GothenburgBitFactory/taskwarrior.git + +Example backup command: + + $ tar czf ~/.task/task-backup-$(date +'%Y%m%d').tar.gz ~/.task/* +::: +::: + +::: {.row} +### + +::: {.col-md-2 .main} +**Older Versions** +::: + +::: {.col-md-10 .main} +Please [contact us](mailto:support@taskwarrior.org) if you wish to download +prior versions. +::: +::: +::: + +::: {.col-md-2 .main} +::: {.alert .alert-warning} +- [Download](#download){.alert-link} +- [Quick Setup](#setup){.alert-link} +- [Distributions](#dist){.alert-link} +- [Git Repository](#git){.alert-link} +- [Older Versions](#older){.alert-link} +::: +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/news/index.md b/content/news/index.md new file mode 100644 index 00000000..045d768f --- /dev/null +++ b/content/news/index.md @@ -0,0 +1,1151 @@ +--- +title: "Taskwarrior - What's next?" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-12} +The latest news and blog articles.\ +[![RSS Feed](/images/rss.gif){width="36px" height="14px"}](/feed.rss) +::: + +::: {.col-md-10 .main} +::: {.row} +#### [News: Taskwarrior 2.5.3 released](/news/news.20210125.html) [2021-01-03]{.small} + +Taskwarrior 2.5.3 is released! Too much has happened over the past two years, +adding up to over 900 commits between 2.5.2 and 2.5.3. + +The [full +changelog](https://github.com/GothenburgBitFactory/taskwarrior/blob/2f47226f91f0b02f7617912175274d9eed85924f/ChangeLog) +is a *very* impressive read. [Download here](/download/). + +This is a recommended upgrade for all Taskwarrior users. +::: +::: +::: + +#### [News: Timewarrior 1.2.0 released](/news/news.20180204.html) [2019-11-23]{.small} + +Timewarrior 1.2.0 is released! Here are the highlights: + +- Print warning when a new tag is entered (\#2) +- New command \'undo\' (\#9) +- New command \'annotate\' (\#68) +- Bash completion (\#96) +- Show man pages with \--help option + +The [full +changelog](https://github.com/GothenburgBitFactory/timewarrior/blob/v1.2.0/ChangeLog) +is an impressive read. [Download here.](https://timewarrior.net/) + +This is a recommended upgrade for all Timewarrior users. + +#### [2018 Plans](/news/news.20180204.html) [2018-02-04]{.small} + +We have made good use of beer time at FOSDEM to lay out our plans for 2018. Here +is what we are doing, starting immediately in most cases. + +\... + +#### [Timewarrior 1.1.1 released](/news/news.20180203.2.html) [2018-02-03]{.small} + +Timewarrior 1.1.1 is released. This is a bug fix release and we recommend that +everyone upgrade to 1.1.1. + +There is one bug fix in this release, and it\'s an important one that fixes a +long-standing problem that has been there from the begining. + +\... + +There is a script prepared that will fix your timewarrior data, and the download +and description is found on the [DB Correction +Script](https://timewarrior.net/docs/dbcorrection.html) page. + +The release is immediately available as a source +[tarball](/download/timew-1.1.1.tar.gz). Binary packages for your OS may appear +soon. + +#### [Services Migration](/news/news.20180203.html) [2018-02-03]{.small} + +We are migrating services, and there will be a lot of changes. Here is what is +happening right now: + +We have a new support email address that should be used for all support +requests: + + + +\... + +#### [FOSDEM 2018: Taskwarrior Presence](/news/news.20180129.html) [2018-01-29]{.small} + +The Taskwarrior Team will be attending [FOSDEM +2018](https://archive.fosdem.org/2018/) on February 3rd and 4th in Brussels. +This is the second annual carbon-space meetup. + +What will the focus be this time? Are we traveling all this way and meeting up +to give talks and demos? Will be sharing ideas and collaborating? Will we be +planning features and releases? + +\... + +#### [Activity Digest: May - December 2017](/news/news.20180114.html) [2018-01-14]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in our projects. Here is what happened between May and December 2017. +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the git history of all the projects. + +This covers a seven month period. Due to unforeseen circumstances, there was a +lengthy break in 2017. We\'re back. + +\... + +#### [Timewarrior 1.1.0 Released](/news/news.20180113.html) [2018-01-13]{.small} + +Timewarrior 1.1.0 is released. With 18 months of updates, many bugs fixed, and +new convenience features added, Timewarrior 1.1.0 is stable and ready. + +Timewarrior tracks your time from the command line and generates reports. Your +data is stored locally in clear text. It integrates well with Taskwarrior. + +![](/news/images/ti.png){.img-responsive} + +Here are the changes in 1.1.0: + +\... + +#### [BYOP MeetUp in Gothenburg](/news/news.20170510_2.html) [2017-05-10]{.small} + +A BYOP (Bring Your Own Project) MeetUp was held in Gothenburg. We had the chance +to present FLOD2 - our own CI, and distribute Taskwarrior stickers. The MeetUp +presentation was followed by sitting together, hacking away and having a couple +of beers. + +![](/news/images/meetup.jpg){.img-responsive} + +#### [Activity Digest: April 2017](/news/news.20170509.html) [2017-05-09]{.small} + +April was a relatively quiet month, but with two main efforts: Timewarrior 1.1.0 +bug fixing, and deployment of our Flod CI system for all projects. + +Flod CI is now operating on five platforms (more coming soon), for every commit +on every branch for every project. This transition allowed us to decommission +several old machines. + +![](/news/images/tw.png){.img-responsive} + +#### [Code Repositories Moved](/news/news.20170402.html) [2017-04-02]{.small} + +The code repositories have been relocated to our new +[Gitea](https://gitea.io/en-US/) server. + +Gitea is a community managed fork of Gogs, lightweight code hosting solution +written in Go and published under the MIT license. We like all of those things. + +You can browse all our repositories here: + +~~`https://git.tasktools.org`~~ + +##### Update [2018-02-18]{.small} + +The code repositories have been relocated to our new +[GitHub](https://github.com). + +You can browse all our repositories here: + +[`https://github.com/GothenburgBitFactory`](https://github.com/GothenburgBitFactory) + +#### [Activity Digest: March 2017](/news/news.20170401.html) [2017-04-01]{.small} + +Timewarrior bug fixes are bringing the 1.1.0 release closer. We are down to 7 +open issues currently needing to be fixed. + +Taskwarrior is undergoing big changes to incorporate the new recurrence +features. This leads to instability, so if anyone is using the 2.6.0 development +branch, this would be a good time to stop. + +The Taskwarrior 2.6.0 branch has a `stable` tag which indicates the last commit +where all tests passed on all platforms. + +The libshared project got a major update to the date and duration handling +features, fixing bugs and providing a consistent implementation for Taskwarrior +and Timewarrior to use. + +#### [HELLOTUX Shirts](/news/news.20170308.html) [2017-03-08]{.small} + +We\'d like to thank [HELLOTUX](https://www.hellotux.com/) for doing a fantastic +job designing embroidered apparel for Taskwarrior fans. This is the real thing - +quality embroidery, not merely printed. + +![](/news/images/shirt.png){.img-responsive} + +The Taskwarrior project receives some money for each item sold. + +#### [Activity Digest: February 2017](/news/news.20170301.html) [2017-03-01]{.small} + +![](/news/images/perbacco.png){.img-responsive} + +[The team attended FOSDEM](news.20170208.html) in Brussels, all meeting for the +first time. No one was hurt. Although we had hoped to accomplish a lot during +this time, we instead fell in love with a certain restaurant and Belgian beer. + +We would like to welcome Thomas Lauf, who is now pushing to the Timewarrior +repository, and Timewarrior is now being fixed and improved at a much faster +rate. Welcome, Thomas. + +The flod2 CI system is coming online, which means that Taskwarrior is now being +built in parallel by two CI systems as we prepare for a more general transition. + +- ~~Taskwarrior 2.6.0 on Flod~~ + +A generous donation from [DigitalOcean](https://www.digitalocean.com) is making +this possible. + +#### [Activity Digest: January 2017](/news/news.20170209.html) [2017-02-09]{.small} + +The rat parser is now mostly complete, and ready to take on the syntax of the +rules system. + +The [Taskwarrior bug +database](https://github.com/GothenburgBitFactory/taskwarrior/issues) haѕ had +another cleanup pass that removed obsolete or accidentally fixed issues. + +The flod2 CI system is now online and is about to begin processing builds +instead of the old flod system. Both system will be online until the switchover +is complete. + +Finally, the team spent a little time getting ready for FOSDEM. + +[FOSDEM 2017: Reprise](/news/news.20170208.html) [2017-02-08]{.small} + +It was the first time the whole Taskwarrior Team met in carbon space. + +What do you get when people from the US, the Czech Republic, Germany, Sweden und +Switzerland meet for the first time? + +[FOSDEM 2017: Taskwarrior Presence](/news/news.20170113.html) +[2017-01-13]{.small} + +The Taskwarrior Team will be attending [FOSDEM 2017](https://fosdem.org/2017/) +on February 4th and 5th in Brussels. + +There is no better opportunity to register your complaints directly and receive +your own personalized sincere apology and refund. + +We should be easily recognizable: that far-away look in our eyes, logo stickers, +beer and of course, no mouse. + +Find us, talk to us. We\'d love to hear what you think. + +#### [Activity Digest: December 2016](/news/news.20170102.html) [2017-01-02]{.small} + +Both Taskwarrior and Taskserver improved GnuTLS support, in particular with more +robust certificate validation, and error reporting/logging. + +The rat parser is now handling complex grammars, such as the clog configuration +file, and will later be used to handle command line parsing in all projects. + +The Taskwarrior overhaul of recurrence features has begun, which will culminate +in the 2.6.0 release with new types of recurring tasks. + +\... + +#### [In-House Talk and Workshop at TNG Technology Consulting](/news/news.20161209.html) [2016-12-09]{.small} + +\ +[![TNG Technology +Consulting](/news/images/tng.png){.img-repsonsive}](https://www.tngtech.com)\ +\ + +TNG Technology Consulting GmbH, of Unterföhring Germany, hosted an internal +event \"Techday\" on December 9th, which is a regular occurrence at TNG. + +TNG invited Dirk Deimeke to attend and give a talk and workshop, where he +discussed Taskwarrior and related projects, with a workshop that covered a lot +of functionality. + +\... + +#### [Activity Digest: November 2016](/news/news.20161203.html) [2016-12-03]{.small} + +The focus has been on migrating code back to libshared.git, and in turn making +use of that code. This not only shrinks the size of the projects, but means that +bug fixes in libshared.git benefit all projects, and reduces effort. + +\... + +#### [Resolving with dnsimple](/news/news.20161116.html) [2016-11-16]{.small} + +Since a couple of weeks ago the resolving of our hostnames and domains is +handled via services of dnsimple. They are kindly enough to sponsor the +taskwarrior project. We will not only profit from the *developer friendly* +management console but in particular from the powerful API to handle our DNS +tasks when we move towards our new CI system *flod2*. Please check them out +under [dnsimple.com](https://dnsimple.link/resolving-taskwarrior). + +#### [Activity Digest: October 2016](/news/news.20161102.html) [2016-11-02]{.small} + +Flod2 is now being rolled out for testing. This is a CI system rewrite that +eliminates build server daemons and the pull model. This will allow greater use +of virtual machines, and more automation. For example, we will now be able to +automatically generate coverage reports and snapshot tarballs, based on build +characteristics. + +\... + +#### [Activity Digest: September 2016](/news/news.20161002.html) [2016-10-02]{.small} + +Tasksh 1.1.0 released, Anomaly 1.1.0 released. Flod2 is a major update that +greatly improves speed and reliability of the CI system. It is working well, and +will be rolled out in October, with new features and greater automation. + +\... + +#### [Tasksh 1.1.0 Released](news.20160905.2.html) [2016-09-05]{.small} + +Tasksh 1.1.0 is release, with an interactive review feature, ability to execute +shell commands, and bug fixes. This release is a recommended upgrade. + +Here is a quick demo of the review feature: + +\... + +#### [Activity Digest: August 2016](/news/news.20160905.html) [2016-09-05]{.small} + +August saw a lot of documentation updates and preparation for the release of +Timewarrior 1.0.0 and FrOSCon 2016. Focus then shifted to finishing up Tasksh +1.1.0 work. + +\... + +#### [FrOSCon 2016 Materials Online](/news/news.20160824.html) [2016-08-24]{.small} + +![](/news/images/froscon.jpg){.img-responsive} [Photo: [Sujeevan +Vijayakumaran](https://twitter.com/svijee)]{.small} + +Materials presented by [Dirk Deimeke](https://www.deimeke.net/dirk/blog/) at +[FrOSCon 2016](https://www.froscon.de/) are now online, as promised: + +\... + +#### [Timewarrior 1.0.0 Released](/news/news.20160821.html) [2016-08-21]{.small} + +Timewarrior 1.0.0 is released. Timewarrior tracks your time from the command +line, and generates reports. Your data is stored locally in clear text. +Integrates with Taskwarrior. + +![](/news/images/ti.png){.img-responsive} + +\... + +#### [FrOSCon 2016 - Taskwarrior Coverage](/news/news.20160813.html) [2016-08-13]{.small} + +Taskwarrior will be well-represented at [FrOSCon 2016](https://www.froscon.de), +on August 20th and 21st, at the Bonn-Rhein-Sieg University of Applied Sciences. + +Dirk Deimeke will be presenting a series of related workshops and lectures: + +**August 20th**\ +Project Room\ +C130 + +10:00 - 12:30 + +Workshop: [Compile Taskwarrior and +Taskserver](https://programm.froscon.de/2016/events/1876.html) + +14:00 - 15:00 + +Lecture: [Introduction to +Timewarrior](https://programm.froscon.de/2016/events/1877.html) + +15:15 - 16:15 + +Lecture: [Taskwarrior +Universe](https://programm.froscon.de/2016/events/1878.html) + +16:30 - 17:30 + +Lecture: [Contribute to +Taskwarrior](https://programm.froscon.de/2016/events/1879.html) (including FAQ, +FOQ, Lessons learned) + +**August 21st**\ +Main Workshop Room\ +C115 + +10:00 - 12:00 + +Workshop: [Introduction to +Taskwarrior](https://programm.froscon.de/2016/events/1702.html) + +\... + +#### [Activity Digest: July 2016](/news/news.20160810.html) [2016-08-10]{.small} + +July was spent mostly getting Timewarrior ready for beta. + +\... + +#### [Timewarrior 1.0.0 Beta Release](/news/news.20160725.html) [2016-07-25]{.small} + +Timewarrior 1.0.0 is in beta! Please download and give us feedback. + +Download here:\ +[timew-1.0.0.tar.gz](/download/timew-1.0.0.tar.gz)\ + +Online documentation here:\ +[Timewarrior Documentation Home](https://timewarrior.net/docs.html) + +\... + +#### [Activity Digest: June 2016](/news/news.20160707.html) [2016-07-07]{.small} + +The main focus for June is getting [Timewarrior](https://timewarrior.net) ready +for an alpha, and subsequent beta release. The purpose of an alpha release is to +gather feedback that guides the subsequent beta release. Timewarrior is a new +project that introduces new concepts. This new functionality needs to be refined +before a beta release. + +The [Timewarrior bug +tracker](https://github.com/GothenburgBitFactory/timewarrior/issues) is now open +for business. + +\... + +#### [Clog 1.3.0 Release](/news/news.20160627.html) [2016-06-27]{.small} + +Clog 1.3.0 is released, with regular expression improvements, bug fixes, rule +precedence and overlapping match support. This release is a recommended upgrade. + +The release is immediately available as a source tarball +[clog-1.3.0.tar.gz](https://gothenburgbitfactory.org/download/clog-1.3.0.tar.gz). + +Clog has a full set of [online documentation](/docs/clog). + +\... + +#### [Timewarrior 0.9.5 Alpha Release](/news/news.20160620.html) [2016-06-20]{.small} + +Timewarrior 0.9.5 is in alpha! Please download and give us feedback. + +Download here:\ +[timew-1.0.0.tar.gz](/download/timew-1.0.0.tar.gz)\ +(Edit: Updated to beta tarball) + +Online documentation here:\ +[Timewarrior Documentation Home](https://timewarrior.net/docs.html) + +#### [Activity Digest: May 2016](/news/news.20160604.html) [2016-06-04]{.small} + +The main focus for May is getting [Timewarrior](https://timewarrior.net) ready +for an alpha release. The purpose of an alpha release is to gather feedback that +guides the subsequent release. Timewarrior is a new project that introduces new +concepts. This new functionality needs to be refined before a beta release. + +The [Timewarrior bug +tracker](https://github.com/GothenburgBitFactory/timewarrior/issues) is now open +for business. + +Additionally the `libshared` library is being improved. This is a Git submodule +that nearly all the projects share, and helps with code reuse. Most importantly, +fixing bugs in `libshared` will fix bugs in all projects, without a lot of +manual patching. + +\... + +#### [Taskwarrior Tools Search](/news/news.20160522.html) [2016-05-22]{.small} + +The [Taskwarrior Tools page](/tools/) now has interactive categorized search +capabilities, thanks to a significant contribution by Bruno Vernay. We encourage +you to take a look. + +This feature is driven by automated [Github](https://github.com) data +extraction, which identifies taskwarrior-related projects and finds their +metadata. + +\... + +#### [Timewarrior Preview](/news/news.20160514.html) [2016-05-14]{.small} + +Timewarrior is coming soon. Here is a peek at the work in progress. + +#### [Activity Digest: April 2016](/news/news.20160501.html) [2016-05-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in April 2016. + +\... + +#### [Taskwarrior running under \"Bash on Ubuntu on Windows\"](/news/news.20160407.html) [2016-04-07]{.small} + +Today we could verify that Taskwarrior works out of the box under \"Bash on +Ubuntu on Windows 10\". Either by installing it via apt-get (which pulls the +regular Ubuntu package) or by compiling it. No changes needed to the source +code. You compile it as you would do it on native Ubuntu. A few tests were +failing. But no major ones. Enjoy the screenshot and enjoy the thoughts of being +able to abandon Cygwin soon, if you are using Taskwarrior on Windows. + +[![Bash on Ubuntu on +Windows](/news/images/win10-thumb.png){.img-thumbnail}](/news/images/win10.png) + +\... + +#### [Activity Digest: March 2016](/news/news.20160401.html) [2016-04-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in March 2016. + +\... + +#### [Activity Digest: February 2016](/news/news.20160301.html) [2016-03-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in February 2016. + +\... + +#### [Taskwarrior for Android Released](/news/news.20160225.html) [2016-02-25]{.small} + +Author Konstantin Vorobyev has created an Android client with Syncing and many +other features. + +[![Taskwarrior for +Android](/news/images/twa1.png){.img-thumbnail}](/news/images/twa1.png) + +\... + +#### [Taskwarrior 2.5.1 Released](/news/news.20160224.html) [2016-02-24]{.small} + +Taskwarrior 2.5.1 is released. Although this is a minor release, it contains +many bug fixes and performance enhancements. There have been a lot of changes. +Here are the new features: + +- Nope + +There aren\'t any, this is a bug fix and performance release. + +\... + +#### [Taskwarrior Workflow Study](/news/news.20160209.html) [2016-02-09]{.small} + +Taskwarrior aims to provide a toolkit of various capabilities, which can be +cherry-picked to support many custom methodologies. + +We have learned over the years that everyone uses it differently, and for +different things. There is a lot to be learned from how someone uses software, +the features they use, and the ones they do not. + +\... + +#### [Taskwarrior 2.5.1 Beta Released](/news/news.20160205.html) [2016-02-05]{.small} + +This release is a bug-fix, code cleanup and performance release only. There are +no new features, but the existing features all work a little more reliably, and +a lot faster. + +\... + +#### [Activity Digest: January 2016](/news/news.20160201.html) [2016-02-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in January 2016. + +\... + +#### [Activity Digest: December 2015](/news/news.20160101.html) [2016-01-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in December 2015. + +\... + +#### [Activity Digest: November 2015](/news/news.20151201.html) [2015-12-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in November 2015. + +\... + +#### [Cygwin Package Maintainer Needed](/news/news.20151101.2.html) [2015-11-01]{.small} + +We're looking for someone to assume the responsibility of packaging Taskwarrior +etc for Cygwin. + +Cygwin doesn't get the care and attention from us that it should. We often skip +releasing on Cygwin because we don't have the equipment and must borrow it, and +furthermore don't use Cygwin day to day, so every package update involves a full +install, and it takes hours. + +\... + +#### [Activity Digest: October 2015](/news/news.20151101.html) [2015-11-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in October 2015. + +\... + +#### [Taskwarrior Mailing Lists](/news/news.20151029.html) [2015-10-29]{.small} + +The Taskwarrior user and developer mailing lists are back in play. Subscribe and +talk to us: + +- User Discussions: + . +- Developer Discussions: + . + +#### [Taskwarrior 2.5.0 Released](/news/news.20151021.html) [2015-10-21]{.small} + +After an intense five months which focused mainly on a more capable command-line +parser, more extension-friendly behavior, and significant improvements to +testing, Taskwarrior 2.5.0 is now released. + +This is a major release, with 1300+ code changes and well over a hundred bug +fixes. We recommend all users upgrade, this release represents a significant +increase in quality. + +#### [Taskwarrior 2.5.0 beta3 Released](/news/news.20151017.html) [2015-10-17]{.small} + +A new beta3 is available for the upcoming 2.5.0 release. + +#### [Clog 1.2.1 Released](/news/news.20151012.html) [2015-10−12]{.small} + +Clog 1.2.1 is released, due to a problem with OSX and Xcode 7. + +The release is immediately available as a source tarball +[clog-1.2.1.tar.gz](https://gothenburgbitfactory.org/download/clog-1.2.1.tar.gz). + +Clog is a colorized log tail utility. It can spot patterns in an input stream +and colorize or suppress the lines. It can also decorate the lines with time- or +date-stamps. + +#### [Activity Digest: September 2015](/news/news.20151001.html) [2015-10-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in September 2015. + +\... + +#### [answers.tasktools.org Online](/news/news.20150929.html) [2015-09-29]{.small} + +The ~~`answers.tasktools.org`~~ site is online, and providing not only the +answer to your question, but those of many before you. It is becoming a valuable +resource for both beginners and experienced users. + +[![answers.tasktools.org](/news/images/answers.png){.img-thumbnail}](/news/images/answers.png) + +#### [Clog 1.2.0 Released](/news/news.20150927.html) [2015-09−27]{.small} + +Clog 1.2.0 is released, with regular expression improvements and bug fixes. + +The release is immediately available as a source tarball +[clog-1.2.0.tar.gz](https://gothenburgbitfactory.org/download/clog-1.2.0.tar.gz). + +Clog is a colorized log tail utility. It can spot patterns in an input stream +and colorize or suppress the lines. It can also decorate the lines with time- or +date-stamps. + +#### [Vramsteg 1.1.0 Released](/news/news.20150926.html) [2015-09-26]{.small} + +Vramsteg 1.1.0 is released, with bug fixes and 64-bit value support. + +The release is immediately available as a source tarball +[vramsteg-1.1.0.tar.gz](https://gothenburgbitfactory.org/download/vramsteg-1.1.0.tar.gz). + +Vramsteg, from the Swedish framsteg (progress), is a CLI progress bar that can +be used from any script language. It supports color, labels, percentage +completion, elapsed time and estimates. + +#### [Taskwarrior 2.5.0 beta2 Released](/news/news.20150916.html) [2015-09-16]{.small} + +A new beta2 is available for the upcoming 2.5.0 release. + +#### [Taskwarrior 2.5.0 beta1 Released](/news/news.20150907.html) [2015-09-07]{.small} + +After an intense four month effort, which focused mainly on a more capable +command-line parser, more extension-friendly behavior, and significant +improvements to testing, Taskwarrior 2.5.0 beta1 is now released. + +We are asking you to please [build](/docs/build.html) and test this release in +your environment. + +This is a major release, with about 1100 code changes and a hundred or so bug +fixes, but still resulting in a smaller codebase. + +There have been a lot of changes. Here are the highlights: + +\... + +#### [Activity Digest: August 2015](/news/news.20150901.html) [2015-09-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in August 2015. + +\... + +#### [Activity Digest: July 2015](/news/news.20150801.html) [2015-08-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in July 2015. + +\... + +#### [Activity Digest: June 2015](/news/news.20150701.html) [2015-07-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in June 2015. + +\... + +#### [GTD With Taskwarrior - a tutorial series](/news/news.20150627.html) [2015-06-27]{.small} + +Tom Sydney Kerckhove is writing a series of articles, explaining how he uses GTD +with Taskwarrior. The first three articles are up: + +[Part1 - +Intro](https://cs-syd.eu/posts/2015-06-14-gtd-with-taskwarrior-part-1-intro.html)\ +[Part2 - +Collection](https://cs-syd.eu/posts/2015-06-21-gtd-with-taskwarrior-part-2-collection.html)\ +[Part3 - +Tickling](https://cs-syd.eu/posts/2015-06-28-gtd-with-taskwarrior-part-3-tickling.html)\ +[Part4 - +Processing](https://cs-syd.eu/posts/2015-07-05-gtd-with-taskwarrior-part-4-processing.html)\ +[Part5 - +Doing](https://cs-syd.eu/posts/2015-07-12-gtd-with-taskwarrior-part-5-doing.html) + +\... + +#### [Activity Digest: May 2015](/news/news.20150601.html) [2015-06-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in May 2015. + +\... + +#### [Taskwarrior Live Demo](/news/news.20150524.html) [2015-05-24]{.small} + +Try Taskwarrior [live in your browser](https://wbsch.de/jswarrior/). + +[![Live +Demo](/news/images/live_demo-thumb.png){.img-thumbnail}](/news/images/live_demo.png) + +#### [Taskserver 1.1.0 Released](/news/news.20150511.html) [2015-05-11]{.small} + +After more than a year of improvements, Taskserver 1.1.0 is released. + +This is a major release, with greatly improved setup, security and logging, +which make this a recommended upgrade. Changes include: + +#### Configuration + +- New setup helper script, `setup_server.bash`, which interactively leads the + whole setup and configuration process. +- When hosting, the configured server name is no longer ignored. +- Taskserver can now be restricted to IPv4 or IPv6. +- New man page for `taskdctl`. +- Server now supports a configuration setting `trust`, which can be either + `strict` or `allow all`, and defaults to `strict`. + +\... + +#### [Taskwarrior 2.4.4 Released](/news/news.20150510.html) [2015-05-10]{.small} + +Taskwarrior 2.4.4 is released. Although a minor release, there are significant +bug fixes which make this a recommended upgrade. Changes include: + +- Fixed a problem where the wrong task may be updated, if GC is disabled. This + is the primary reason for the release. +- Fixed a problem where filters including parenthesized tags + (`... and (+DUE or +OVERDUE)`) were incorrectly handled. +- 32-bit platform support. +- The `obfuscate` configuration setting will hide private data, intended for + bug reporting. +- An early Japanese localization. +- Several bug fixes. + +For full details, see the ChangeLog file included in the release. + +\... + +#### [Tasksh in Homebrew](/news/news.20150509.html) [2015-05-09]{.small} + +Tasksh, the Taskwarrior Shell, can now be installed using +[Homebrew](https://brew.sh) on the Mac: + + $ brew install tasksh + +This means that all three related Taskwarrior family members can now be +installed via Homebrew: + + $ brew install task + ... + $ brew install taskd + ... + $ brew install tasksh + ... + +\... + +#### [Taskserver 1.1.0 beta1 Released](/news/news.20150504.html) [2015-05-04]{.small} + +Taskserver 1.1.0 is in beta, and we are asking you to please test this release +in your environment. See https://taskwarrior.org/docs/taskserver/upgrade.html +for instructions to upgrade your server. + +There have been a few changes: + +\... + +#### [Activity Digest: April 2015](/news/news.20150430.html) [2015-04-30]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in April 2015. + +\... + +#### [Taskwarrior 2.4.3 Released](/news/news.20150419.html) [2015-04-19]{.small} + +Taskwarrior 2.4.3 is released. This release contains the Hooks API v2, and +several bug fixes. This is a recommended upgrade. + +User Defined Attributes ([UDAs](/docs/udas.html)) have been enhanced so that +type `string` attributes may now designate the sort order of allowed values. +This enhancement permits the migration of the `priority` attribute to a UDA. +This means you may now define your own priority levels, sorting and urgency +coefficients. + +\... + +#### [Activity Digest: March 2015](/news/news.20150331.html) [2015-03-31]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in March 2015. + +\... + +#### [Taskwarrior 2.4.2 Released](/news/news.20150315.html) [2015-03-15]{.small} + +Taskwarrior 2.4.2 is released. This is primarily a bug fix release to address a +bad hook problem that prevented on-modify hooks from modifying tasks. + +Additionally the new `context` command is included, as are updated themes with +higher contrast. Although this is a minor release, there are significant bug +fixes and new features make this a recommended upgrade. Changes include: + +\... + +#### [Activity Digest: February 2015](/news/news.20150301.html) [2015-03-01]{.small} + +This is the second of an ongoing series of activity reports, published monthly, +to highlight activity in the Taskwarrior project. Here is what happened in +February 2015. + +\... + +#### [Taskwarrior 2.4.1 on Cygwin 32 and 64 bit](/news/news.20150228.html) [2015-02-28]{.small} + +Taskwarrior 2.4.1 is now available in binary and source package form for both +Cygwin 32-bit and 64-bit systems. + +This release represents the first sync-capable Taskwarrior release on the Cygwin +platform. This exposes our Cygwin users to new online services, such as: + +\... + +#### [Taskwarrior 2.4.1 Released](/news/news.20150216.html) [2015-02-16]{.small} + +Taskwarrior 2.4.1 is released. Although this is a minor release, there are +significant bug fixes and Hook support improvements that make this a recommended +upgrade. Changes include: + +\... + +#### [Activity Digest](/news/news.20150207.html) [2015-02-07]{.small} + +This is the first of an ongoing series of activity reports, published monthly, +to highlight activities in the Taskwarrior project. Here is what happened in +January 2015. + +\... + +#### [Date & Time Support](/news/news.20150103.html) [2015-01-03]{.small} + +Taskwarrior 2.4.0 supports many new date & time formatting options. These are +all documented in the new [Date & Time](/docs/dates.html) page. Here is a small +sample: + +[![ISO Date +Demo](/news/images/iso_date.png){.img-thumbnail}](/news/images/iso_date.png) + +#### [Taskwarrior 2.4.0 Released](/news/news.20150101.html) [2015-01-01]{.small} + +Taskwarrior 2.4.0 is released, it\'s a major release, and a recommended upgrade. +Happy new year. + +After almost a year of development, 108 bug fixes, 47 new/improved features, +1,750 code changes and over 50 community-provided patches, version 2.4.0 +represents a significant improvement to task list management. Changes include: + +\... + +#### [Tasksh 1.0.0 Released](/news/news.20141221.html) [2014-12-21]{.small} + +The taskwarrior shell, tasksh 1.0.0, is released. + +Up to, and including, Taskwarrior 2.3.0, the `shell` command implemented this +functionality. Starting with Taskwarrior 2.4.0, there is no `shell` command. +Instead there is the `tasksh` project. + +[![Tasksh +Demo](/news/images/tasksh.png){.img-thumbnail}](/news/images/tasksh.png) + +\... + +#### [Taskwarrior 2.4.0 beta3](/news/news.20141111.html) [2014-11-11]{.small} + +A new beta 3 for Taskwarrior 2.4.0 is now available as a source ~~tarball~~. + +\... + +#### [Sort Column Indicator](/news/news.20141025.html) [2014-10-25]{.small} + +In the upcoming Taskwarrior 2.4.0, there is now the ability to apply a different +color to the columns of a report that are part of the sort key. + +[![Sort Columns +Demo](/news/images/sort.png){.img-thumbnail}](/news/images/sort.png) + +\... + +#### [Taskwarrior 2.4.0 beta2](/news/news.20141011.html) [2014-10-11]{.small} + +A new beta 2 for Taskwarrior 2.4.0 is now available as a source ~~tarball~~. + +\... + +#### [Cloud Server Reboots](/news/news.20140928.html) [2014-09-28]{.small} + +Rackspace has announced that it will reboot all of its cloud server +infrastructure joining other hosting providers. The data center we are hosted in +is the third in the row of IAD, DFW and ORD. The announced maintenance window is +from 2014-09-28 1100 UTC to 2014-09-29 1101 UTC. This will cause interruptions +here at taskwarrior.org. You can follow the status at ~~`status.tasktools.org`~~ +and read more on global reboot at [Rackspace\' status +site](https://status.rackspace.com). + +#### [Taskwarrior 2.4.0 beta1](/news/news.20140915.html) [2014-09-15]{.small} + +Taskwarrior 2.4.0 is in beta, and available as a source ~~tarball~~. + +- Calc command `task calc '1 + 1'` Hint: it\'s \'2\', but it\'s a beta, so who + knows? And yes, it can do more than that. +- Enhanced DOM support `task add due:123.due` +- Date math `task add ... due:eom wait:'due - 1week'` +- Unicode: `task add \\u2615` +- \... + +#### [Fish Shell Completion Demo](/news/news.20140906.html) [2014-09-06]{.small} + +Taskwarrior 2.4.0 will be released with a new and fully updated Fish shell +completion script, from Roman Inflianskas. Here is a demo gif that Roman put +together. + +[![Fish Completion +Demo](/news/images/fish.gif){.img-thumbnail}](/news/images/fish.gif) + +\... + +#### [Development Status](/news/news.20140816.html) [2014-08-16]{.small} + +Development is shifting focus for Taskwarrior and Taskserver. No more features +will be added, and completeness, stability and testing become the new focus. + +The goal is to work towards good beta releases for Taskwarrior 2.4.0, Taskserver +1.1.0 and Tasksh 1.0.0. \... + +#### [Taskwarrior 2.4.0 Preview](/news/news.20140704.html) [2014-07-04]{.small} + +The Taskwarrior 2.4.0 development branch has been unusable for a a few weeks +([mentioned here](/news/news.20140524.html)) while new functionality was +integrated. It has been a long process, with about 750 commits made so far, but +now all the tests are passing again. + +Does this mean it\'s ready for alpha and beta? No, not yet, because now there is +a need for a lot of new tests to cover all the new functionality. This is the +next phase of cycle, improving tests, fixing open bugs, and updating +documentation. + +Now it\'s time for a preview of some of the new features\... + +#### [Vit 1.2 in homebrew](/news/news.20140607.html) [2014-06-07]{.small} + +The recently released [Vit 1.2](/news/news.20140406.html) is now available from +Homebrew. + +[Homebrew](https://brew.sh/) is \"The missing package manager for OSX\", and +includes recipes for several thousand packages. If you wish to install Vit +easily on OSX, you simply update your brew recipes and install Vit like this: + + $ brew update + ... + $ brew install vit + ... + +#### [Taskwarrior 2.4.0 Development Status](/news/news.20140524.html) [2014-05-24]{.small} + +Taskwarrior 2.4.0 is in development. The main feature of this release is a new +command line parser, and some related features such as expression evaluation and +ISO-8601 date support. This is a major undertaking, but the reward will be some +very nice new features. + +Until now this work, on the 2.4.0 branch in the code repository has been +carefully done so as to not completely break functionality. There are currently +24 failing tests, mostly regarding newly added capabilities. \... + +#### [Swiss Ubucon Taskwarrior Workshop](/news/news.20140510.html) [2014-05-10]{.small} + +On Saturday May 10th 2014, Dirk Deimeke presented a Taskwarrior workshop at +[Swiss Ubucon](https://wiki.ubuntu.com/SwissTeam/). + +Dirk presented a live demo, with a handout PDF (which we will link here soon) +that covers every aspect including downloading, building, installing, setup, +first use, all the way to some of the more complex use cases. \... + +#### [Teaching the Parser New Tricks](/news/news.20140429.html) [2014-04-29]{.small} + +With Taskwarrior version 2.4.0, we are building a better command line parser. In +addition to fixing a lot of annoying little bugs, we would like it to be more +flexible and robust. That means it will be able to handle more strange inputs +than before, but can it do better? + +#### [Taskserver Documentation Update](/news/news.20140412.html) [2014-04-12]{.small} + +The Taskserver setup documentation has been significantly improved. The main +setup page is: + +[Setting up your own Taskserver](/docs/taskserver/setup.html) + +The sub pages now cover single topics: \... + +#### [Q & A Site Launched](/news/news.20140407.html) [2014-04-07]{.small} + +The new Q & A site is live! Take a look at the site, which can be found here: + +~~`https://answers.tasktools.org`~~ + +There is a searchable knowledge base of community-provided questions and +answers. The answers are voted and selected, good answers becomes more +prominent, bad answers sink lower. You know how it works. \... + +#### [Vit 1.2 is released](/news/news.20140406.html) [2014-04-06]{.small} + +Version 1.2 of the VIT front-end for Taskwarrior is available for download now. + +Download here: [vit-1.2.tar.gz](/download/vit-latest.tar.gz). + +See the [VIT 1.2 beta1 +announcement](https://taskwarrior.org/news/news.20140220.html) for the features +introduced in 1.2. \... + +#### [System Status Pages](/news/news.20140309.html) [2014-03-09]{.small} + +New system status pages are online, which provide up to the minute status for +the various services now online. The first is a Pingdom public report showing +system status of the bug system, git hosting, web services and others. Check +this page for outages. + +The second is an operations information page from +[StatusPage.io](https://statuspage.io/) which shows status, uptime, response +time and incidents. \... + +#### [Atlassian Licences](/news/news.20140303.html) [2014-03-03]{.small} + +We have received the very generous donation of software licences from Atlassian. +This allows us to fully utilize Jira, Stash and Confluence Questions giving us +high quality, integrated infrastructure, which in \... + +#### [New Site Live](/news/news.20140227.html) [2014-02-27]{.small} + +We have shut off the old website, and replaced it with this. Although this site +is a fraction of the size, it nevertheless has much less redundancy, and no +obsolete documents. \... + +#### [Registrations Disabled](/news/news.20140226.html) [2014-02-26]{.small} + +We have shut off the registration of users on this site. This is part of our +ongoing migration to new systems. This taskwarrior.org site content will be +replaced soon, but the URLs will not change. \... + +#### [VIT 1.2 beta1 is available](/news/news.20140220.html) [2014-02-20]{.small} + +Beta1 of the VIT front-end for Taskwarrior is available for download now. +Download here: ~~vit-1.2.beta1.tar.gz~~. VIT 1.2 brings a customizable way to +interact with your tasks with user-defined shortcuts. You can now define keys to +launch external \... + +#### [Server Migration](/news/news.20140217.html) [2014-02-17]{.small} + +As we migrate to our new servers, you\'ll find that the services are being +migrated first, and the content follows after. We are taking this opportunity to +reorganize everything\... + +#### [Git Migration](/news/news.20140212.html) [2014-02-12]{.small} + +The new repository manager, Stash, is running on the new server +~~`https://git.gothenburgbitfactory.org`~~. The old server will still be active +for a little while longer, but \... + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/news/news.20140212.md b/content/news/news.20140212.md new file mode 100644 index 00000000..9ec1e6d5 --- /dev/null +++ b/content/news/news.20140212.md @@ -0,0 +1,25 @@ +--- +title: "News: Git Hosting has migrated" +--- + +### Git Hosting has migrated [2014-02-12]{.small} + +The new repository manager, Stash, is running on the new server: + +~~`https://git.tasktools.org`~~ + +The old server will still be active for a little while longer, but will not be +updated, so the repositories there are read-only and already out of date. You +can re-clone your Taskwarrior repository from the new server, or update the +origin URLs in your existing clone like this: + + $ cd task.git + $ git config remote.origin.url https://git.tasktools.org/TM/task.git + +Similarly for Taskserver: + + $ cd taskd.git + $ git config remote.origin.url https://git.tasktools.org/TM/taskd.git + +The continuous integration servers are currently offline, and will return +shortly. diff --git a/content/news/news.20140217.md b/content/news/news.20140217.md new file mode 100644 index 00000000..8ccb3447 --- /dev/null +++ b/content/news/news.20140217.md @@ -0,0 +1,12 @@ +--- +title: "News: Server Migration" +--- + +### Server Migration [2014-02-17]{.small} + +As we migrate to our new servers, you\'ll find that the services are being +migrated first, and the content follows after. We are taking this opportunity to +reorganize everything. + +This means there is a lot of missing content at the moment, please bear with us +as we gradually move everything into place. diff --git a/content/news/news.20140220.md b/content/news/news.20140220.md new file mode 100644 index 00000000..9f58e233 --- /dev/null +++ b/content/news/news.20140220.md @@ -0,0 +1,50 @@ +--- +title: "News: VIT 1.2 beta1 is available" +--- + +### VIT 1.2 beta1 is available [2014-02-20]{.small} + +Beta1 of the VIT front-end for Taskwarrior is available for download now. + +Download here: ~~vit-1.2.beta1.tar.gz~~. + +VIT 1.2 brings a customizable way to interact with your tasks with user-defined +shortcuts. You can now define keys to launch external commands with the +currently selected task as input. Keybinds can now be specified in \~/.vitrc. +For example, to use the external script [tasknote]() +(https://taskwarrior.org/projects/1/wiki/Tasknote) when you press \"ctrl + n\", +you can do: + + map \cn=:!wr tasknote %TASKID + +Suppose you currently have highlighted a task with ID 20. Then the command +`tasknote 20` would be run by your shell. `!:` is the VIT command to run +external commands; `w` tells VIT to wait until that process finishes and to show +you the result before going back to the VIT screen (this allows you to write the +note for tasknote in your editor); and `r` tells VIT to reread your task data +after the process finishes. + +See `man vitrc` for more information and examples. + +Navigation is improved: in the prompts, backspace now removes a character and +the arrow keys can be used. + +Key changes: + +- `gg` moves to the top of the task list +- `D` now deletes a task when not over an annotation +- `s` runs `task sync` (task \> 2.30 required) +- `!:` runs a command in the shell (and replaces %TASKID with the selected + task ID) +- `c` is renamed to `m` (for *modify* so more consistent with Taskwarrior) +- `P [hmln]` now sets priority +- `q` (`Q`) now quits with(out) confirmation + +Misc: + +- Fix freezing behavior (caused because Taskwarrior was waiting for input) +- Fix a bug where prompt text was invisible when switching tabs in + gnome-terminal +- Clear project prompt string with escape + +Please email if you have any problems or questions. diff --git a/content/news/news.20140226.md b/content/news/news.20140226.md new file mode 100644 index 00000000..697e2707 --- /dev/null +++ b/content/news/news.20140226.md @@ -0,0 +1,22 @@ +--- +title: "News: Registrations Disabled" +--- + +### Registrations Disabled [2014-02-26]{.small} + +No new users on the Redmine site. + +We have shut off the registration of users on this site. This is part of our +ongoing migration to new systems. This taskwarrior.org site content will be +replaced soon, but the URLs will not change. + +All user accounts created prior to 2014-02-09 are already migrated over to the +new issue tracking system. The newer accounts will be migrated shortly. To add +bugs and feature requests please use: + + + +We will be without forums while the new system is brought online, which may take +a little time. If you have questions, please use IRC \#taskwarrior at freenode, +or email in the meantime. We will be back online soon +with better support options. diff --git a/content/news/news.20140227.md b/content/news/news.20140227.md new file mode 100644 index 00000000..933f69a9 --- /dev/null +++ b/content/news/news.20140227.md @@ -0,0 +1,24 @@ +--- +title: "News: New Site Live" +--- + +### New Site Live [2014-02-27]{.small} + +We have shut off the old website, and replaced it with this. Although this site +is a fraction of the size, it nevertheless has much less redundancy, and no +obsolete documents. + +Take a look around, and hopefully you\'ll find that there is a more logical +structure, and clearer, updated documentation. It\'s also a little sparse at the +moment, but we are working on that. In addition to growing and completing the +documentation set, there will be a replacement for the Q&A forums coming soon. + +There are several efforts under way. First, the tutorials and help contained a +lot of overlapping, obsolete content. With this site, under the +\'[Docs](/docs/)\' tab above, all the old sources of content are being combined +into one set, and in the case of the tutorials, are being rewritten. The next +step will be to generate the documentation from Markdown and templates. + +All user accounts from the old site have been migrated to the new issue tracking +system which you can access after a password reset, for the purposes of creating +issues and feature requests, or commenting on existing ones. diff --git a/content/news/news.20140303.md b/content/news/news.20140303.md new file mode 100644 index 00000000..cb7ef774 --- /dev/null +++ b/content/news/news.20140303.md @@ -0,0 +1,18 @@ +--- +title: "News: Atlassian Licences" +--- + +### Atlassian Licences [2014-03-03]{.small} + +We have received the very generous donation of software licences from Atlassian. +This allows us to fully utilize Jira, Stash and Confluence Questions giving us +high quality, integrated infrastructure, which in turn lets us focus on our +goals of improving Taskwarrior and Taskserver. + +The Jira and Stash products are already in full use, with Confluence Questions +coming online soon. + +- Jira on ~~`bug.tasktools.org`~~ +- Stash on ~~`git.tasktools.org`~~ + +Thank you Atlassian. diff --git a/content/news/news.20140309.md b/content/news/news.20140309.md new file mode 100644 index 00000000..bacc6128 --- /dev/null +++ b/content/news/news.20140309.md @@ -0,0 +1,19 @@ +--- +title: "News: System Status Pages" +--- + +### System Status Pages [2014-03-09]{.small} + +New system status pages are online, which provide up to the minute status for +the various services now online. The first is a Pingdom public report showing +system status of the bug system, git hosting, web services and others. Check +this page for outages. + +The second is an operations information page from +[StatusPage.io](https://statuspage.io/) which shows status, uptime, response +time and incidents. + +You\'ll find links to the new status pages in the page footer on the front page. + +We would like to thank Pingdom and StatusPage.io for the generous donation of +their services. diff --git a/content/news/news.20140406.md b/content/news/news.20140406.md new file mode 100644 index 00000000..ed930698 --- /dev/null +++ b/content/news/news.20140406.md @@ -0,0 +1,33 @@ +--- +title: "News: Vit 1.2 is released" +--- + +### Vit 1.2 is released [2014-04-06]{.small} + +Version 1.2 of the VIT front-end for Taskwarrior is available for download now. + +Download here: [vit-1.2.tar.gz](/download/vit-1.2.tar.gz). + +See the [VIT 1.2 beta1 +announcement](https://taskwarrior.org/news/news.20140220.html) for the features +introduced in 1.2. + +The following are changes included since the beta release: + +- the key can now be used in shortcuts +- exit with informative error if shortcut too long (see + [\#42:](https://github.com/scottkosty/vit/issues/42)) +- fix colors for running VIT in tmux +- do not print control characters to prompts +- fix recognition of backspace in tmux +- fix a prompt bug that prevented editing +- \'vit -audit\' now creates a log with debug info + +Many thanks to Devendra Ghate and Nemo Inis, who provided quality feedback. + +For bug reports and feature requests, [please +register](https://github.com/GothenburgBitFactory/taskwarrior/issues) and create +an issue for the project \"VIT\". + +For any other questions, please email Scott Kostyshak at +skostysh\@princeton.edu. diff --git a/content/news/news.20140407.md b/content/news/news.20140407.md new file mode 100644 index 00000000..ee8e8d89 --- /dev/null +++ b/content/news/news.20140407.md @@ -0,0 +1,22 @@ +--- +title: "News: Q & A Site Launched" +--- + +### Q & A Site Launched [2014-04-07]{.small} + +The new Q & A site is live! Take a look at the site, which can be found here: + +~~`https://answers.tasktools.org`~~ + +There is a searchable knowledge base of community-provided questions and +answers. The answers are voted and selected, good answers becomes more +prominent, bad answers sink lower. You know how it works. + +As a brand new site, the content is a little light right now, but as the +questions come in, we believe this will grow into the primary resource for all +those situations you need a little help with. + +![](/news/images/qanda.png){.img-thumbnail width="250px"} + +The ~~`https://answers.tasktools.org`~~ site is powered by [Atlassian Confluence +Questions](https://www.atlassian.com/software/confluence/questions). diff --git a/content/news/news.20140412.md b/content/news/news.20140412.md new file mode 100644 index 00000000..be849d21 --- /dev/null +++ b/content/news/news.20140412.md @@ -0,0 +1,25 @@ +--- +title: "News: Taskserver Documentation Update" +--- + +### Taskserver Documentation Update [2014-04-12]{.small} + +The Taskserver setup documentation has been significantly improved. The setup +page is: + +[Setting up your own Taskserver](/docs/taskserver/setup.html) + +The sub pages now cover single topics: + +[Pre-Installation Preparation](/docs/taskserver/prep.html)\ +[Install binary package](/docs/taskserver/package.html)\ +[Install from tarball](/docs/taskserver/tarball.html)\ +[Install from git](/docs/taskserver/git.html)\ +[Server Configuration](/docs/taskserver/configure.html)\ +[Server Start/Stop](/docs/taskserver/control.html)\ +[Add User to Server](/docs/taskserver/user.html)\ +[Configure Taskwarrior](/docs/taskserver/taskwarrior.html)\ +[Syncing Taskwarrior](/docs/taskserver/sync.html)\ +[Troubleshooting](/docs/taskserver/troubleshooting-sync.html) + +Feedback on the new pages would be appreciated. diff --git a/content/news/news.20140429.md b/content/news/news.20140429.md new file mode 100644 index 00000000..ea4099db --- /dev/null +++ b/content/news/news.20140429.md @@ -0,0 +1,27 @@ +--- +title: "News: Teaching the Parser New Tricks" +--- + +### Teaching the Parser New Tricks [2014-04-29]{.small} + +With Taskwarrior version 2.4.0, we are building a better command line parser. In +addition to fixing a lot of annoying little bugs, we would like it to be more +flexible and robust. That means it will be able to handle more strange inputs +than before, but can it do better? + +We would like to see your most strange, supported or unsupported, twisted, +Taskwarrior command line that you think should *just work*. + +For example, we dislike escaping shell characters, so I want this to *just +work*: + + $ task "(project = foo or project = bar) and +tag" list + +We want to be able to quote the whole command line as one big argument, so the +parentheses don\'t need to be individually escaped. + +What do you want to *just work*? Please submit answers here: [Issues on +GitHub](https://github.com/GothenburgBitFactory/taskwarrior/issues) + +[Issues](https://github.com/GothenburgBitFactory/taskwarrior/issues) can be +submitted here. Thank you. diff --git a/content/news/news.20140510.md b/content/news/news.20140510.md new file mode 100644 index 00000000..49528554 --- /dev/null +++ b/content/news/news.20140510.md @@ -0,0 +1,27 @@ +--- +title: "News: Swiss Ubucon Taskwarrior Workshop" +--- + +### Swiss Ubucon Taskwarrior Workshop [2014-05-10]{.small} + +On Saturday May 10th 2014, Dirk Deimeke presented a Taskwarrior workshop at +[Swiss Ubucon](https://wiki.ubuntu.com/SwissTeam/). + +Dirk presented a live demo, with a handout PDF (which we will link here soon) +that covers every aspect including downloading, building, installing, setup, +first use, all the way to some of the more complex use cases. + +Take a look at [Dirk\'s +logbook](https://www.deimeke.net/dirk/blog/index.php?/archives/3401-Taskwarrior-Workshop-Ubucon-2014-Schweiz-....html) +for details. + +Dirk also previewed the new command reference shown here: + +::: {.col-xs-12 .col-sm-12} +::: {.col-xs-6 .col-sm-6} +[![](/news/images/ref230.png)](/news/images/ref230.png){.thumbnail} +::: +::: + +You can get the [Reference Sheet PDF](/download/task-latest.ref.pdf) from the +download page. diff --git a/content/news/news.20140524.md b/content/news/news.20140524.md new file mode 100644 index 00000000..e8c6eda6 --- /dev/null +++ b/content/news/news.20140524.md @@ -0,0 +1,44 @@ +--- +title: "News: Taskwarrior 2.4.0 Development Status" +--- + +### Taskwarrior 2.4.0 Development Status [2014-05-24]{.small} + +Taskwarrior 2.4.0 is in development. The main feature of this release is a new +command line parser, and some related features such as expression evaluation and +ISO-8601 date support. This is a major undertaking, but the reward will be some +very nice new features. + +Until now this work, on the 2.4.0 branch in the code repository has been +carefully done so as to not completely break functionality. There are currently +24 failing tests, mostly regarding newly added capabilities. + +Now it is time to make significant structural changes, and this is guaranteed to +break many more tests, and generally make Taskwarrior 2.4.0-dev unusable, for a +while. + +To make an analogy, we\'re renovating a house, while living in it. This involves +mere inconvenienceѕ some of the time, such as tools lying around, and some holes +in the walls. But there comes a point where the plumbing is disconnected and the +electrical system shut off. Perhaps the windows are missing. If the work is +extensive, this is unavoidable. + +This is Taskwarrior 2.4.0-dev right now - the plumbing is about to be shut off. +There is lots of instrumented code slowing things down, for example the command +line is parsed twice, by the old parser, and now the new one. Task filtering is +done twice - by the old filter mechanism and by the new expression evaluator. +Everything is currently running very slowly, with lots of debug output. But +it\'s about to get worse. + +::: {.callout .callout-danger} +We feel it is time to issue a warning, namely, please don\'t use version +2.4.0-dev for a while, and please don\'t report issues against it yet. There +will be an alpha release made when things are working again. + +You can track the decline and ultimate recovery of this process from our +continuous integration report: + +~~`https://central.gothenburgbitfactory.org/task-2.4.0.html`~~ +::: + +Meanwhile, Taskwarrior 2.3.1 is being prepared for release. diff --git a/content/news/news.20140607.md b/content/news/news.20140607.md new file mode 100644 index 00000000..66bb5d5a --- /dev/null +++ b/content/news/news.20140607.md @@ -0,0 +1,25 @@ +--- +title: "News: Vit 1.2 in Homebrew" +--- + +### Vit 1.2 in Homebrew [2014-06-07]{.small} + +The recently released [Vit 1.2](/news/news.20140406.html) is now available from +Homebrew. + +[Homebrew](https://brew.sh/) is \"The missing package manager for OSX\", and +includes recipes for several thousand packages. If you wish to install Vit +easily on OSX, you simply update your brew recipes and install Vit like this: + + $ brew update + ... + $ brew install vit + ... + +As any package manager should, this will resolve dependencies, which in this +case include Taskwarrior itself and the Curses module. + +Thanks to Benjamin Weber for creating the recipe, and Larry Hynes for bringing +this to our attention. + +Also available in Homebrew are `task` and `taskd` recipes. diff --git a/content/news/news.20140704.md b/content/news/news.20140704.md new file mode 100644 index 00000000..3f1dc98d --- /dev/null +++ b/content/news/news.20140704.md @@ -0,0 +1,133 @@ +--- +title: "News: Taskwarrior 2.4.0 Preview" +--- + +### Taskwarrior 2.4.0 Preview [2014-07-04]{.small} + +The Taskwarrior 2.4.0 development branch has been unusable for a a few weeks +([mentioned here](/news/news.20140524.html)) while new functionality was +integrated. It has been a long process, with about 750 code changes so far, but +now all the tests are passing again. + +Does this mean it\'s ready for alpha and beta? No, not yet, because now there is +a need for a lot of new tests to cover all the new functionality. This is the +next phase of cycle, improving tests, fixing open bugs, and updating +documentation. + +Now it\'s time for a preview of some of the new features\... + +#### Virtual Tags + +Lots of new virtual tags are added, including: `YESTERDAY`, `TOMORROW`, `READY`, +`PENDING`, `COMPLETED`, `DELETED` and `TAGGED`. Virtual tags run faster than +algebraic equivalents, so report filters have been updated. See the man page +(`man task`) for the complete set. + +#### Default `info` Command + +With the updated command line parser, an old favorite feature returns - when you +specify an ID but not command, the info command is assumed: + + $ task 243 + + Name Value + ------------­ ------------------------------------------ + ID 243 + Description Something is wrong with TDB2::dump + Status Pending + Project tw.240 + Entered 2014-05-25 13:06:47 (5 weeks) + Last modified 2014-05-25 13:06:52 (5 weeks) + Tags bug + UUID 9c2bfdd4-87d5-4396-97e2-ee1a980b9237 + Urgency 4.907 + project 1 * 1 = 1 + tags 0.8 * 1 = 0.8 + age 0.107 * 1 = 0.107 + TAG bug 1 * 3 = 3 + + Date Modification + ------------------- -------------------------------------- + 2014-05-25 13:06:52 Modified set to '2014-05-25 13:06:52'. + Tags set to 'bug'. + +This coexists with the `rc.default.command` feature. Additionally the `info` +command now shows how the urgency values are calculated. + +#### Hooks + +The new hook system will allow a new class of extensions and add-ons. Just copy +a script into your `~/.task/hooks` directory, give it the right name, and it +will be run. [Design details here](/docs/hooks.html). + +#### ISO-8601 Dates + +The `rc.dateformat` method of specifying dates is still supported, and used for +rendering dates in reports, but regardless of your settings, you can also +specify dates and times in the various ISO-8601 formats. Here are some: + + $ task add Buy lamp due:2014-W45 + $ task add Buy rug due:2014-W40-3 + $ task add Buy chair due:2014-154 + $ task add Buy table due:10:30 + +There is now a more comprehensive set of [named dates](/docs/dates.html). + +#### ISO-8601 Durations + +Dates and durations can be calculated: + + $ task calc eom + 3 weeks - 100 hours + 27 minutes -10 seconds + 2014-08-17T20:26:49 + +For example, how much time is left until the end of the month? + + $ task calc eocm - now + P27DT23H33M20S + +How long is a million seconds? + + $ task calc 1000000 seconds + P11DT13H46M40S + +#### Calc Command and Expressions + +Oh yes, there is a calc command also: + + $ task calc '(3 * 2) + 1' + 7 + +There is also a standalone `calc` utility, which can do more: + + $ calc --postfix '3 2 * 1 +' + 7 + +[Take a look here](/docs/commands/calc.html) at a more detailed look at the +`calc` capabilities. The `calc` command in Taskwarrior also has DOM access. + +#### Extended DOM + +The DOM has been extended so that *all* Taskwarrior data can now be externally +referenced: + + $ task calc 123.due + $ task calc 123.due.year + $ task calc 123.due.week + $ task calc 123.annotations.0.description + +Additionally attributes for a task can now be referenced on the command line +while a task is being created: + + $ task add Plan the party due:eoy wait:due-1month + +#### And more\... + +New and updated themes. New and updated report definitions. New `tasksh`. +Improved `sync` diagnostics. Better certificate validation. Portuguese and +French localizations. UUID abbreviations. The `show` command includes default +values. New command reference PDF. 60% more unit tests, and a new test +framework. Lots of bug fixes. + +Taskwarrior 2.4.0 is a major release, and although it still needs a lengthy +shakedown period, to fix all the bugs we can, it is going to provide a lot of +new capabilities. diff --git a/content/news/news.20140816.md b/content/news/news.20140816.md new file mode 100644 index 00000000..eed2dad0 --- /dev/null +++ b/content/news/news.20140816.md @@ -0,0 +1,82 @@ +--- +title: "News: Development Status" +--- + +### Development Status [2014-08-16]{.small} + +Development is shifting focus for Taskwarrior and Taskserver. No more features +will be added, and completeness, stability and testing become the new focus. + +The goal is to work towards good beta releases. There is no schedule for this +work for a couple of reasons; we are more concerned with quality than delivery +date, and as an all-volunteer organization, participation is not predictable +([you can help](/docs/contribute.html)). + +Although Taskwarrior 2.3.0, 2.4.0, and Taskserver 1.0.0, 1.1.0 are all +compatible with each other, there will be an almost simultaneous release of the +updates, as they work together better. + +The `tasksh` program, which was bundled with Taskwarrior, is now broken out as a +separate project, which allows it to follow its own release schedule and not be +slowed down by the less frequent Taskwarrior releases. This also allows it to +implement features that are a little outside the scope of Taskwarrior. + +#### Taskwarrior 2.4.0 + +This is a major update for Taskwarrior, probably the largest. The main focus is +a new command line parser, which brings with it new capabilities, mainly the +ability to perform calculations at the command line. + +- New command line parser, with fewer quirks and support for new features. +- New `calc` command, which shows off the expression evaluation capabilities + that are built in to many other commands. This allows you to refer to a + task\'s due date, for example, and add a week to it, in addition to basic + math. +- Lots of new virtual tags, which are now used in the custom report + definitions, for simpler filters. +- New report improvements and streamlining - the result of many years of use + and consideration by our designer, urgency calculation details, + configuration default values, listing breaks. +- Features: multiline task descriptions, UUID partial matching, default `info` + report when just an ID/UUID is specified, propagated urgency values, + improved color rules, new themes, default support for regular expressions. +- Documentation: new command reference design. +- I18N: more languages, better coverage. +- Add-ons: improved completion support. +- Portability: improvements for Solaris, NetBSD, fewer sh/bash assumptions, + musl C library support. +- Security: better GnuTLS support, better certificate verification and + handling, better sync diagnostics. +- Many documentation improvements, in both man pages and online. +- Bug fixes, currently around 100 issues resolved, with more coming. + +#### Taskserver 1.1.0 + +This is a much smaller release, which is focusing on improved security, +stability and diagnostics, with simplified setup. + +- Diagnostic improvements: can log to stdout, includes line numbers for data + issues, uses more consistent language, log indicates when server is ready, + shows data statistics with the diagnostic command is provided with + \'\--data\'. +- Portability fixes for NetBSD, Solaris, musl C library, fewer sh/bash + assumptions. +- Networking: Improved IPv6 support, now obeys hostname. +- Security: certificates are now validated for older GnuTLS versions. +- Configutaion: improved PKI scripts, CRL cert is now optional, optional + hostname verification, removed client.allow/client.deny confirugation, new + interactive script for easy setup. +- Documentation corrections, improvements. +- Add-ons: systemd startup script. +- Bug fixes, currently around 20 issues resolved, with more coming. + +#### Tasksh 1.0.0 + +The `tasksh` program has been rewritten. This gives it a more solid foundation, +and potential for future improvements that may include timing, reminders, +extensions and complementary features. Initially, `tasksh` will be a minimally +functional release. + +- Stability: as a standalone program with no dependency on Taskwarrior, the + shell is more lightweight and stable. +- libreadline support. diff --git a/content/news/news.20140906.md b/content/news/news.20140906.md new file mode 100644 index 00000000..9a0567e8 --- /dev/null +++ b/content/news/news.20140906.md @@ -0,0 +1,16 @@ +--- +title: "News: Fish Shell Completion Demo" +--- + +### Fish Shell Completion Demo [2014-09-06]{.small} + +Taskwarrior 2.4.0 will be released with a fully updated Fish Shell completion +script, from Roman Inflianskas. Here is a demo gif that Roman put together. + +[![Fish Completion +Demo](/news/images/fish.gif){.img-thumbnail}](/news/images/fish.gif) + +\ + +The Fish shell has sophisticated completion capabilities, and this update takes +full advantage of this. diff --git a/content/news/news.20140915.md b/content/news/news.20140915.md new file mode 100644 index 00000000..68bd34c8 --- /dev/null +++ b/content/news/news.20140915.md @@ -0,0 +1,42 @@ +--- +title: "News: Taskwarrior 2.4.0 beta1" +--- + +### Taskwarrior 2.4.0 beta1 [2014-09-15]{.small} + +Taskwarrior 2.4.0 is in beta, and available as a source ~~tarball~~. + +- Calc command `task calc '1 + 1'` Hint: it\'s \'2\', but it\'s a beta, so who + knows? And yes, it can do more than that. +- Enhanced DOM support `task add due:123.due` +- Date math `task add ... due:eom wait:'due - 1week'` +- Unicode: `task add \\u2615` +- New command line parser. Why would you care? You wouldn\'t. But we do, + because it lets us be creative and add more useful features. +- Better `task show` command, that includes default values. +- Hooks. Yeah. +- ISO-8601 date support `task add ... due:2014-09-15T18:59:00` and about 30 + other formats too, independent of `rc.dateformat`. +- The `task info` report now shows more \... stuff. +- More virtual tags. That work now. +- New localizations. Now there are eng-USA, esp-ESP, fra-FRA, ita-ITA, + por-PRT, epo-RUS. Dolphin and Klingon next. + +Tasksh 1.0.0 is also in beta, and available as a source +[tarball](/download/tasksh-latest.tar.gz). Features in tasksh include: + +- Libreadline support for command line history. So you can hit `Up-Arrow`, + which we know you\'ve dreamed of. +- Nothing else. Because this replaces the old one, which did nothing and also + crashed. +- It doesn\'t crash. Or does it? Let us know. +- It is a separate project now, and not bundled with Taskwarrior. + +Features are being planned for tasksh, and with subsequent releases you\'ll see +it grow into a useful addition. Or not. Who knows what future portends? + +But seriously, we need your help and feedback testing this. It\'s a big release. + +Please note that this is beta software, and not suitable for everyday use. We +welcome your feeback in the form of bug submissions, and general Questions & +Answers. diff --git a/content/news/news.20140928.md b/content/news/news.20140928.md new file mode 100644 index 00000000..6789293b --- /dev/null +++ b/content/news/news.20140928.md @@ -0,0 +1,13 @@ +--- +title: "News: Cloud Server Reboots" +--- + +### Cloud Server Reboots [2014-09-28]{.small} + +Rackspace has announced that it will reboot all of its cloud server +infrastructure joining other hosting providers. The data center we are hosted in +is the third in the row of IAD, DFW and ORD. The announced maintenance window is +from 2014-09-28 1100 UTC to 2014-09-29 1101 UTC. This will cause interruptions +here at taskwarrior.org. You can follow the status at ~~`status.tasktools.org`~~ +and read more on global reboot at [Rackspace\' status +site](https://status.rackspace.com). diff --git a/content/news/news.20141011.md b/content/news/news.20141011.md new file mode 100644 index 00000000..40c73b01 --- /dev/null +++ b/content/news/news.20141011.md @@ -0,0 +1,11 @@ +--- +title: "News: Taskwarrior 2.4.0 beta2" +--- + +### Taskwarrior 2.4.0 beta2 [2014-10-11]{.small} + +A new beta 2 for Taskwarrior 2.4.0 is now available as a source ~~tarball~~. + +Please note that this is beta software, and not suitable for everyday use. We +welcome your feeback in the form of bug submissions, and general Questions & +Answers. diff --git a/content/news/news.20141025.md b/content/news/news.20141025.md new file mode 100644 index 00000000..a516c0d2 --- /dev/null +++ b/content/news/news.20141025.md @@ -0,0 +1,18 @@ +--- +title: "News: Sort Column Indicator" +--- + +### Sort Column Indicator [2014-10-25]{.small} + +In the upcoming Taskwarrior 2.4.0, there is now the ability to apply a different +color to the columns of a report that are part of the sort key. + +[![Sort Columns +Demo](/news/images/sort.png){.img-thumbnail}](/news/images/sort.png) + +The report column headers are colored using the `color.label` setting, and the +sort columns are colored by `color.label.sort`, if the setting exists. If it +does not, `color.label` is used for all columns. + +The color themes are being updated, and some will take advantage of this new +setting. diff --git a/content/news/news.20141111.md b/content/news/news.20141111.md new file mode 100644 index 00000000..1734fba1 --- /dev/null +++ b/content/news/news.20141111.md @@ -0,0 +1,11 @@ +--- +title: "News: Taskwarrior 2.4.0 beta3" +--- + +### Taskwarrior 2.4.0 beta3 [2014-11-11]{.small} + +A new beta 3 for Taskwarrior 2.4.0 is now available as a source ~~tarball~~. + +Please note that this is beta software, and not suitable for everyday use. We +welcome your feeback in the form of bug submissions, and general Questions & +Answers. diff --git a/content/news/news.20141221.md b/content/news/news.20141221.md new file mode 100644 index 00000000..530945bb --- /dev/null +++ b/content/news/news.20141221.md @@ -0,0 +1,26 @@ +--- +title: "News: Tasksh 1.0.0 Released" +--- + +### Tasksh 1.0.0 Released [2014-12-21]{.small} + +The taskwarrior shell, tasksh 1.0.0, is released. + +Up to, and including, Taskwarrior 2.3.0, the `shell` command implemented this +functionality. Starting with Taskwarrior 2.4.0, there is no `shell` command. +Instead there is the `tasksh` project. + +[![Tasksh +Demo](/news/images/tasksh.png){.img-thumbnail}](/news/images/tasksh.png) + +The tasksh supports libreadline, although can be built without it. Libreadline +provides command history and command editing. + +As a separate project, tasksh can innovate and release on its own schedule, as +it remains independent of Taskwarrior, and supports all known releases. It +achieves this by having almost no features. + +The 1.0.0 release is a starting point, a platform on which we can build +interesting capabilities that are external to Taskwarrior. + +The release is available as a source [tarball](/download/tasksh-1.1.0.tar.gz). diff --git a/content/news/news.20150101.md b/content/news/news.20150101.md new file mode 100644 index 00000000..b8c925ee --- /dev/null +++ b/content/news/news.20150101.md @@ -0,0 +1,63 @@ +--- +title: "News: Taskwarrior 2.4.0 Released" +--- + +### Taskwarrior 2.4.0 Released [2015-01-01]{.small} + +Taskwarrior 2.4.0 is released, it\'s a major release, and a recommended upgrade. +Happy new year. + +After almost a year of development, 108 bug fixes, 47 new/improved features, +1,750 code changes and over 50 community-provided patches, version 2.4.0 +represents a significant improvement to task list management. Changes include: + +- New localization: Portuguese and Esperanto translations +- New `dateformat` space handling +- New date support: \'february\', extensive support for ISO-8601 +- New column formats: `description.truncated_count`, `uda.NAME.indicator`, + `recur.short`, tag sorting +- New color rules: `color.uda.NAME.VALUE`, `color.label.sort`, `color.until` +- New virtual tags: READY, YESTERDAY, TOMORROW, PENDING, DELETED, COMPLETED, + TAGGED +- New verbosity tokens: `new-uuid` +- New command: `calc`, `_zshattributes` +- New theme: dark-gray-blue­256.theme +- New report feature: listing breaks +- New Python testing framework for higher-level testing +- New DOM support: `ID.annotation.0.description`, `ID.due.month` \... +- New Hooks support: `on-add`, `on-modify`, `on-launch` and `on-exit` event + hook support +- New Regular Expression support enabled by default +- New algebraic expression support: date math, fuzzy matches +- Improved command line: handling of quoted and escaped content, partial + UUIDs, searching all attributes, projects with spaces +- Improved utilities: `l10n` +- Improved `show` command: displays default settings +- Improved `information` command: urgency calculation details, runs by default + when just an ID/UUID is specified +- Improved `diagnostics` command: shows environment variables, hooks, + indicates configuration errors +- Improved urgency calculations: inherited urgency via dependencies, UDA + participation, affects nag feature +- Improved documentation: redesigned reference PDF, man pages moved online +- Improved security: certificate validation, hostname validation +- Improved report filters +- Improved front-end support: file locking, confirmation suppression +- Improved debugging output, sync diagnostics +- Improved completion scripts: zsh, fish +- Improved Vim support files +- Updated holiday files +- Removed deprecated features: `push`, `pull`, `merge`, old file formats, + unused configuration settings +- Removed the misunderstood \'total active time\' feature, replaced by a 3rd + party hook script +- Removed the shadow file feature, replaced by a hook script example + +For full details, see the ChangeLog file included in the release. + +Look for a series of new online documents over the coming days, highlighting +some of the new functionality. + +The release is immediately available as a source +[tarball](/download/task-2.4.0.tar.gz). Binary packages will soon be available +via your Operating System\'s package manager. diff --git a/content/news/news.20150103.md b/content/news/news.20150103.md new file mode 100644 index 00000000..2c5596fb --- /dev/null +++ b/content/news/news.20150103.md @@ -0,0 +1,14 @@ +--- +title: "News: Date & Time Support" +--- + +### Date & Time Support [2015-01-03]{.small} + +Taskwarrior 2.4.0 supports many new date & time formatting options. These are +all documented in the new [Date & Time](/docs/dates.html) page. Here is a small +sample: + +[![ISO Date +Demo](/news/images/iso_date.png){.img-thumbnail}](/news/images/iso_date.png) + +[Read more](/docs/dates.html) about the extensive ISO-8601 support. diff --git a/content/news/news.20150207.md b/content/news/news.20150207.md new file mode 100644 index 00000000..4e763301 --- /dev/null +++ b/content/news/news.20150207.md @@ -0,0 +1,188 @@ +--- +title: "News: Activity Digest: January 2015" +--- + +::: {.navbar .navbar-default .navbar-inverse .navbar-fixed-top role="navigation"} +::: {.container} +[![](/images/tw-s.png){width="24" height="24"} TASKWARRIOR](/){.navbar-brand +.text-heavy} + +::: {.navbar-header} +[Toggle navigation]{.sr-only} []{.icon-bar} []{.icon-bar} []{.icon-bar} +::: + +::: {.collapse .navbar-collapse} +- [News](/news/) +- [Docs](/docs/) +- [Download](/download/) +- [Support](/support/) +- [Tools](/tools/) +::: +::: +::: + +::: {.container} +::: {.col-md-2 .main} +::: + +::: {.col-md-8 .main} +::: {.row} +### Activity Digest: January 2015 [2015-02-07]{.small} + +This is the first of an ongoing series of activity reports, published monthly, +to highlight activities in the Taskwarrior project. Here is what happened in +January 2015. + ++---------------------------------------+---------------------------------------+ +| [2015-01-01]{.small} | [Taskwarrior | +| | 2.4.0](https://tas | +| | kwarrior.org/news/news.20150101.html) | +| | released. Including ISO date support, | +| | algebraic expressions and more. | ++---------------------------------------+---------------------------------------+ +| [2015-01-02]{.small} | Some people are seeing unreadable | +| | color combination in 2.4.0 color | +| | themes. Some contrast and color | +| | improvements were made in the 2.4.1 | +| | branch. | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | People are finding that 2.4.0 | +| | introduces a tri-state | +| | \'taskd.trust\' setting, which needs | +| | to be updated with a good value. The | +| | [troubleshooting | +| | sync](https://taskwarrior.org/docs/ | +| | taskserver/troubleshooting-sync.html) | +| | docs are updated accordingly. | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | The Taskwarrior data anonymizer is | +| | now available for download. *Edit: | +| | The anoonymizer is now replaced by* | +| | | +| | task ... rc.obfuscate:1 | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | The `waiting` report is broken in | +| | 2.4.0, and shows all tasks that have | +| | the waiting attribute, past or | +| | future. | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | People are finding that the `due.age` | +| | column used in some reports is not | +| | showing data in the future, which | +| | makes it useless. Fixed in 2.4.1. | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | Tomas introduces | +| | [taskli | +| | b](https://github.com/tbabej/tasklib) | +| | which provides a Python API to access | +| | Taskwarrior data. | ++---------------------------------------+---------------------------------------+ +| [2015-01-03]{.small} | New documentation to help developers | +| | [build](htt | +| | ps://taskwarrior.org/docs/build.html) | +| | Taskwarrior is introduced. | ++---------------------------------------+---------------------------------------+ +| [2015-01-04]{.small} | [New | +| | documentation](htt | +| | ps://taskwarrior.org/docs/dates.html) | +| | listing the 47 new ISO date formats | +| | supported is added. | ++---------------------------------------+---------------------------------------+ +| [2015-01-04]{.small} | Changes made to support building with | +| | musl (libc) in 2.4.1. | ++---------------------------------------+---------------------------------------+ +| [2015-01-04]{.small} | A script to generate a test data | +| | file, that we could use as a common | +| | basis for checking functionality was | +| | discussed, but no one wants to do it. | ++---------------------------------------+---------------------------------------+ +| [2015-01-05]{.small} | The first step is take towards using | +| | modern C++11 features, where N1984 | +| | (auto type derivation) is used in one | +| | place, and implies a minimum gcc 4.4 | +| | or clang 2.9, both of which are | +| | several years old. | ++---------------------------------------+---------------------------------------+ +| [2015-01-08]{.small} | The `diag` command is improved so | +| | that it offers information when hook | +| | scripts are minamed, or not | +| | executable. | ++---------------------------------------+---------------------------------------+ +| [2015-01-08]{.small} | Jens contributes a German | +| | localization for Taskwarrior, | +| | included in 2.4.1. | ++---------------------------------------+---------------------------------------+ +| [2015-01-18]{.small} | Diagnostic and debug output is | +| | improved for authors of hook scripts. | ++---------------------------------------+---------------------------------------+ +| [2015-01-19]{.small} | Renato adds support to the test | +| | framework for hook script tests. | +| | These are needed before the 2.4.1 | +| | release. | ++---------------------------------------+---------------------------------------+ +| [2015-01-19]{.small} | Tomas makes several useful hook | +| | scripts available from the [tools | +| | p | +| | age](https://taskwarrior.org/tools/). | ++---------------------------------------+---------------------------------------+ +| [2015-01-28]{.small} | Leo announces | +| | [oclaunch | +| | ](https://gitlab.com/WzukW/oclaunch), | +| | which can be used to run commands at | +| | login. | ++---------------------------------------+---------------------------------------+ +| [2015-01-31]{.small} | Hook scripts which create additional | +| | tasks are causing problems, resulting | +| | in the hooks interface being | +| | restricted for 2.4.1. Hook scripts | +| | can no longer modify out-of-context | +| | tasks, or add arbitrary new tasks. | +| | Unit tests for hooks are introduced, | +| | which will lead to more stringent | +| | checking in Taskwarrior. | ++---------------------------------------+---------------------------------------+ +| [2015-01-31]{.small} | Downloads for January for the 2.4.0 | +| | source tarball: 1773. | ++---------------------------------------+---------------------------------------+ + +\ +\ +::: +::: + +::: {.col-md-2 .main} +::: +::: + +::: {#footer} +::: {.container} +::: {.col-md-2} +Get Involved\ +[Submit a bug](https://github.com/GothenburgBitFactory/taskwarrior/issues)\ +[Clone the code](https://github.com/GothenburgBitFactory/taskwarrior) +::: + +::: {.col-md-2} +Related Sites\ +[gothenburgbitfactory.org](https://gothenburgbitfactory.org)\ +[holidata.net](https://holidata.net) +::: + +::: {.col-md-2} +Contact\ +[[]{.glyphicon .glyphicon-envelope} Email](mailto:support@taskwarrior.org)\ +[![](/images/twitter_dark.png){width="16px" height="16px"} +Twitter](https://twitter.com/taskwarrior) +::: + +::: {.col-md-2} +Donate\ +[Sponsor us on Github +sponsors!](https://github.com/sponsors/GothenburgBitFactory) +::: + +::: {.col-md-2} +Copyright ©: 2018 [Göteborg Bit Factory](/about.html) +::: +::: +::: diff --git a/content/news/news.20150216.md b/content/news/news.20150216.md new file mode 100644 index 00000000..198555bd --- /dev/null +++ b/content/news/news.20150216.md @@ -0,0 +1,29 @@ +--- +title: "News: Taskwarrior 2.4.1 Released" +--- + +### Taskwarrior 2.4.1 Released [2015-02-16]{.small} + +Taskwarrior 2.4.1 is released. Although this is a minor release, there are +significant bug fixes and Hook support improvements that make this a recommended +upgrade. Changes include: + +- New German translation +- Hook scripts are now under much stricter control +- More feedback and help for Hook script authors +- The \'date.iso\' setting allows you to enable (default) or disable support + for ISO-8601 dates. This is because some of you have \'dateformat\' settings + that conflict +- The \'recurrence\' setting enables (default) or disables recurring task + instance generation +- Can now compile with musl(libc) +- Fixed assorted report definition problems +- Fixed assorted color theme problems +- Better color support in various places +- Lots of bug fixes + +For full details, see the ChangeLog file included in the release. + +The release is immediately available as a source +[tarball](/download/task-2.4.1.tar.gz). Binary packages will soon be available +via your Operating System\'s package manager. diff --git a/content/news/news.20150228.md b/content/news/news.20150228.md new file mode 100644 index 00000000..66685f1e --- /dev/null +++ b/content/news/news.20150228.md @@ -0,0 +1,4 @@ +--- +title: "News: Taskwarrior 2.4.1 on Cygwin 32 and 64 bit" +--- + diff --git a/content/news/news.20150301.md b/content/news/news.20150301.md new file mode 100644 index 00000000..91a65044 --- /dev/null +++ b/content/news/news.20150301.md @@ -0,0 +1,168 @@ +--- +title: "News: Activity Digest: February 2015" +--- + +### Activity Digest: February 2015 [2015-03-01]{.small} + +This is the second of an ongoing series of activity reports, published monthly, +to highlight activity in the Taskwarrior project. Here is what happened in +February 2015. + +[2015-02-01]{.small} +::: +::: +::: + +Renato adds a wrapper script that instruments all hooks scripts which gives the +test framework an inspectable data structure that details hook script activity. + +[2015-02-03]{.small} + +It was reiterated that there is a place to check, to see what latest release of +Taskwarrior is: ~~`https://tasktools.org/latest`~~. This is suitable for anyone +who needs to programmatically scan for notification of a release. + +[2015-02-07]{.small} + +A bug in the code that executes hook scripts is fixed, which allows hook script +testing on FreeBSD and Cygwin to proceed. + +[2015-02-07]{.small} + +A preliminary design for supporting the notion of active contexts was agreed +upon, written up and placed among the [design +docs](https://taskwarrior.org/docs/design/index.html). + +[2015-02-08]{.small} + +The document describing [future +plans](https://taskwarrior.org/docs/design/plans.html) was updated. This +document shows a high-level overview of what areas of Taskwarrior are planned +for future work. While there is minimal detail, it does represent all the +planning that exists. It lists the current release, the next release (short +term) and future releases (long term) milestones. + +[2015-02-09]{.small} + +More \"category\" values were addd to Jira to allow more useful grouping of +issues. + +[2015-02-13]{.small} + +Renato adds a `status` command to the Taskserver `taskdctl` launcher. + +[2015-02-14]{.small} + +The hook script interface is made much more strict, with lots more consistency +checking. This will help deal with non-compliant hook scripts, and scripts in +development. + +[2015-02-14]{.small} + +Taskwarrior 2.4.1 is ready to release, pending testing by +[Bugwarrior](https://github.com/ralphbean/bugwarrior), +[inthe.am](https://inthe.am/about), and +[tasklib](https://github.com/tbabej/tasklib). + +[2015-02-15]{.small} + +The [future plans](https://taskwarrior.org/docs/design/plans.html) document was +updated to include Taskserver plans (which are currently sparse). More details +were added to the Taskwarrior plans. + +[2015-02-15]{.small} + +Testing showed that 2.4.1 does not degrade performance any more than 2.4.0 did. +See the [Performance +Comparison](https://gothenburgbitfactory.org/projects/performance.html) for +charts. Note that 2.4.0 contains on-load legacy value mapping for durations, +which introduced a perofrmance hit. + +[2015-02-16]{.small} + +[Taskwarrior 2.4.1](/download/task-2.4.1.tar.gz) is released. Although a minor +release, there are significant bug fixes and improvements to the [Hook +system](/docs/hooks.html) that make this a recommended upgrade. + +[2015-02-16]{.small} + +Taskwarrior 2.4.2 work begins, with this effort being mostly concerned with bugs +and performance. Mostly. + +[2015-02-16]{.small} + +Ralph Bean releases [taskw](https://pypi.python.org/pypi/taskw) with support for +Taskwarrior 2.4.1. + +[2015-02-16]{.small} + +Renato doubles the speed of the test suite. We\'re not sure how. + +[2015-02-16]{.small} + +Taskwarrior 2.4.2 work begins, with this effort being mostly concerned with bugs +and performance. Mostly. + +[2015-02-17]{.small} + +The INSTALL file gets a fresh set of instructions which now mention the +dependencies and requirements. + +[2015-02-17]{.small} + +The website gains a page devoted to showing [Command Line +Examples](/docs/examples.html) intended to answer a few common questions and +showcase some tricks. + +[2015-02-19]{.small} + +Renato converts more Perl unit tests to Python, raising the percentage to 22.8% +Python. The goal is ultimately 100%. Additionally, some of the individual test +scripts are being merged into higher-level feature test scripts. + +[2015-02-21]{.small} + +Wim fixes C++11 build issues, which means Taskwarrior can begin to take +advantage of C++11 capabilities, after a 4 year grace period to let compilers +catch up. + +[2015-02-22]{.small} + +Wim fixes a dangling pipe problem that prevents forking hook scripts from +running. + +[2015-02-22]{.small} + +Taskserver gained a new man page for `taskdctl`. + +[2015-02-23]{.small} + +Tomas implements the new [context](/docs/context.html) feature and commands. + +[2015-02-24]{.small} + +The `list` report loses listing breaks by default. The `minimal` report shows +the feature. + +[2015-02-25]{.small} + +The Taskwarrior `info` command gains the ability to show virtual tags. + +[2015-02-25]{.small} + +Bash completion script learns about new `context` commands. + +[2015-02-28]{.small} + +Tomas added a GC call before the `projects` command runs, to make the output +current. + +[2015-02-28]{.small} + +Tomas added aggregated task counts to the `projects` reports, where sub-projects +contributed to the super-projects. + +[2015-02-28]{.small} + +Taskwarrior 2.4.1 is available in binary and source package form for Cygwin 32- +and 64-bit systems. diff --git a/content/news/news.20150315.md b/content/news/news.20150315.md new file mode 100644 index 00000000..2b380044 --- /dev/null +++ b/content/news/news.20150315.md @@ -0,0 +1,31 @@ +--- +title: "News: Taskwarrior 2.4.2 Released" +--- + +### Taskwarrior 2.4.2 Released [2015-03-15]{.small} + +Taskwarrior 2.4.2 is released. This is primarily a bug fix release to address a +bad hook problem that prevented on-modify hooks from modifying tasks. + +Additionally the new `context` command is included, as are updated themes with +higher contrast. Although this is a minor release, there are significant bug +fixes and new features make this a recommended upgrade. Changes include: + +- New `context` command. See the [online documentation](/docs/context.html) + for full details. +- Theme fixes, eliminating the very low contrast problems reported +- Minor built-in report changes +- Assorted color fixes +- Recur column now properly suppressed when there is no data +- UDA values now accessible via DOM reference +- Fixed some code that was not UTF8-aware +- Removed pthreads linkage +- Fixed hooks problem +- `info` command now shows virtual tags +- Several bug fixes + +For full details, see the ChangeLog file included in the release. + +The release is immediately available as a source +[tarball](/download/task-2.4.2.tar.gz). Binary packages will soon be available +via your Operating System\'s package manager. diff --git a/content/news/news.20150331.md b/content/news/news.20150331.md new file mode 100644 index 00000000..1d2b3409 --- /dev/null +++ b/content/news/news.20150331.md @@ -0,0 +1,30 @@ +--- +title: "News: Activity Digest: March 2015" +--- + +### Activity Digest: March 2015 [2015-03-31]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in March 2015. + + ---------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + [2015-03-01]{.small} The [Hooks Design](/docs/hooks.html) page was moved out of the design section onto the main page. + [2015-03-01]{.small} Scott pointed out that there is a performance drop since 2.3.0, which was fixed and further improved. The major cause of this was on-load recurrence value mapping, which was not being done efficiently. + [2015-03-01]{.small} A new [Hook Author\'s Guide](/docs/hooks_guide.html) shows how to write and test a hook script. + [2015-03-03]{.small} Renato gives the test suite the option to use task/taskd from \$PATH. + [2015-03-05]{.small} Wim finds an fixes a particularly nasty hook bug, that is causing `on-modify` hook scripts to fail to update the actual tasks. This also exposes a weakness in the unit testing. This find will likely lead to a release of 2.4.2. + [2015-03-07]{.small} The test suite undergoes reorganization, to combine like tests, remove redundant tests, and migrate bug tests into feature test scripts. While this is happening, tests are being converted from Perl to Python. + [2015-03-09]{.small} The `_version` command now shows both the version number and the commit hash all the time. Prior to this, the different information was shown depending on whether Taskwarrior was built from git or from a tarball. + [2015-03-12]{.small} Renato gives the Python unit tests some color, which makes the output more readable in a tty. + [2015-03-15]{.small} The color themes are updated to remove all the very-low contrast and inappropriate colors. The online theme swatches are updated. + [2015-03-16]{.small} Taskwarrior 2.4.2 released, mainly to address the hook problem, but has the nice side effect of releasing the context features and updated themes. + [2015-03-18]{.small} Tomas updates the bash completion script to solve a problem when it tries to get confirmation from the user. + [2015-03-18]{.small} Tomas adds the `calc` command to the man page, which was oddly missing. + [2015-03-21]{.small} Tomas gives the `bulk` setting a new meaning for the value zero - infinity, which means that Taskwarrior never considers an modification to be too big. + [2015-03-23]{.small} Wim fixes a bug so that all local modifications update the `modified` attribute, and these modifications are hidden from the journal. + [2015-03-26]{.small} Wim fixes a dependency chain urgency calculation bug, which was reporting the wrong value after a `done`/`delete` command. + [2015-03-28]{.small} The new Lexer gains a few hundred new tests, to make sure that all types are properly recognized. The full integration of the new Lexer begins soon. + [2015-03-29]{.small} Wim enables compiler warnings. The removal effort begins. + [2015-03-30]{.small} Wim fixes the export scripts, which has rotted, as software does, when ignored for long enough. + [2015-03-31]{.small} Wim improves the on-exit sample hook, which was misleading. + ---------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/content/news/news.20150419.md b/content/news/news.20150419.md new file mode 100644 index 00000000..b1fbcda2 --- /dev/null +++ b/content/news/news.20150419.md @@ -0,0 +1,45 @@ +--- +title: "News: Taskwarrior 2.4.3 Released" +--- + +### Taskwarrior 2.4.3 Released [2015-04-19]{.small} + +User Defined Attributes ([UDAs](/docs/udas.html)) have been enhanced so that +type `string` attributes may now designate the sort order of allowed values. +This enhancement permits the migration of the `priority` attribute to a UDA. +This means you may now define your own priority levels, sorting and urgency +coefficients. + +Although it may appear otherwise, there is no new monthly release cycle, it\'s +all a coincidence. The next release will likely take a little longer as we shift +focus to Taskserver improvements. + +Although this is a minor release, there are significant bug fixes and new +features make this a recommended upgrade. Changes include: + +- [Hooks API v2](/docs/hooks2.html), which is backwards compatible with v1. + This allows hooks to be more aware of the context in which they are run. +- Default values no longer are applied to recurring tasks. +- Default values no longer are applied to synced tasks. +- UDA sorting order can be defined. +- Priority attribute gone, replaced by a default UDA configuration. +- Command line lexer bugs fixed, which caused a hang. +- Urgency improvements for tasks with dependencies, which were repoting bad + values. +- The `isnt` and `not` attribute modifiers were mapped to hte wrong operator. +- Invalid IDs were displayed after a `done` or `delete` command. +- Example export scripts have been updated so they work again. +- The `summary` report can now be configured to show old projects, not just + current ones. +- The `info` report failed to show negative urgency values. +- Added a new `rc.bulk` value (0) that is interpreted as infinity. +- Minor command line parser improvements. +- Minor command performance improvements. +- Documentation improvements. +- Several bug fixes. + +For full details, see the ChangeLog file included in the release. + +The release is immediately available as a source +[tarball](/download/task-2.4.3.tar.gz). Binary packages will soon be available +via your Operating System\'s package manager. diff --git a/content/news/news.20150430.md b/content/news/news.20150430.md new file mode 100644 index 00000000..05a8892f --- /dev/null +++ b/content/news/news.20150430.md @@ -0,0 +1,268 @@ +--- +title: "News: Activity Digest: April 2015" +--- + +### Activity Digest: April 2015 [2015-04-30]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in April 2015. + ++---------------------------------------+---------------------------------------+ +| [2015-04-01]{.small} | The Hooks v2 API was implemented. | +| | While nothing changed with respect to | +| | the events or interfaces to the hooks | +| | scripts, there are now arguments | +| | passed to the hooks script. Whereas | +| | in the v1 Hooks API a hook script was | +| | effectively called like this: | +| | | +| | script \ | +| | output | +| | | +| | The v2 API now effectively does this: | +| | | +| | script \ | +| | 'api:v2' \ | +| | 'args:task list' \ | +| | 'command:list' \ | +| | 'rc:~/.taskrc' \ | +| | 'data:~/.task' \ | +| | 'version:2.4.3' \ | +| | output | +| | | +| | This allows a hook script to | +| | determine which API is in effect, and | +| | offers access to some important | +| | information. What will hook scripts | +| | do with this information? Who knows, | +| | let\'s see, and hope it isn\'t all | +| | used for evil purposes. | ++---------------------------------------+---------------------------------------+ +| [2015-04-01]{.small} | Taskwarrior learned that running | +| | hooks scripts while attempting to run | +| | shell completion is a bad idea. | ++---------------------------------------+---------------------------------------+ +| [2015-04-02]{.small} | The command line lexer was improved, | +| | or perhaps just made less awful, now | +| | allowing both | +| | `task calc now + 3 days` work as well | +| | as `task calc now+3days`, making | +| | whitespace irrelevant. | ++---------------------------------------+---------------------------------------+ +| [2015-04-02]{.small} | Recurring tasks now inherit more | +| | attributes from the parent task, and | +| | `rc.default.*` settings are no longer | +| | applied. | ++---------------------------------------+---------------------------------------+ +| [2015-04-02]{.small} | The `.isnt` and `.not` attribute | +| | modifiers are now the performing | +| | exact non-match, therefore providing | +| | symmetry to the `.is` modifier. | ++---------------------------------------+---------------------------------------+ +| [2015-04-03]{.small} | Tasks that are downloaded during a | +| | `sync` no longer get local default | +| | settings applied to them. | ++---------------------------------------+---------------------------------------+ +| [2015-04-03]{.small} | Taskwarrior learned that `\n` in a | +| | description does not have a character | +| | width of -1, which borked the | +| | formatting. | ++---------------------------------------+---------------------------------------+ +| [2015-04-04]{.small} | Objects returning `std::string`, now | +| | return `const std::string&`. This can | +| | reduce the number of data copies in | +| | memory, which makes things better on | +| | the inside. How about that for a | +| | crowd-pleasing improvement! | ++---------------------------------------+---------------------------------------+ +| [2015-04-04]{.small} | All task attributes are now sortable. | +| | \"Why weren\'t they before?\" you | +| | might ask. Umm\... | ++---------------------------------------+---------------------------------------+ +| [2015-04-04]{.small} | Task sorting duplicated code that was | +| | implemented better elsewhere, and so | +| | this was eliminated. | ++---------------------------------------+---------------------------------------+ +| [2015-04-04]{.small} | UDA `string` attributes that specify | +| | discrete values are now sorted | +| | (high-to-low) in the order that they | +| | are defined. If one day the priority | +| | attribute is removed, then this means | +| | the priority UDA that replaces it can | +| | now have an arbitrary set of priority | +| | values that sort properly. | ++---------------------------------------+---------------------------------------+ +| [2015-04-04]{.small} | The `priority` attribute is removed | +| | from the core, and reimplemented as a | +| | (standard) UDA. The change is made | +| | such that users should not notice. | +| | Unless they read. | ++---------------------------------------+---------------------------------------+ +| [2015-04-05]{.small} | The `info` command urgency display | +| | was cleaned up and fixed. | ++---------------------------------------+---------------------------------------+ +| [2015-04-05]{.small} | The `rc.debug.hooks=2` setting now | +| | shows the arguments that are passed | +| | to hook scripts. | ++---------------------------------------+---------------------------------------+ +| [2015-04-05]{.small} | The color themes were updated to | +| | accomodate the new form of the | +| | `priority` attribute. | ++---------------------------------------+---------------------------------------+ +| [2015-04-05]{.small} | When calculating report formatting, | +| | fixed-width columns are now only | +| | sized once, not once per task. | ++---------------------------------------+---------------------------------------+ +| [2015-04-05]{.small} | The `rc` file syntax was described in | +| | the man page, finally. | ++---------------------------------------+---------------------------------------+ +| [2015-04-06]{.small} | The test framework is updated to | +| | handle the Hooks v2 API. | ++---------------------------------------+---------------------------------------+ +| [2015-04-06]{.small} | The codebase took some early steps | +| | towards using C++11 features. It\'s | +| | been four years after all, and | +| | compilers have caught up, somewhat. | +| | Future releases will mandate newer | +| | Clang/GCC versions in order to use | +| | new features. | ++---------------------------------------+---------------------------------------+ +| [2015-04-06]{.small} | The `summary.all.projects` setting | +| | allows the summary report to consider | +| | all finished projects. | ++---------------------------------------+---------------------------------------+ +| [2015-04-06]{.small} | Some spa-ESP localization changes | +| | were made. The other languages are | +| | getting quite out of date. Any | +| | volunteers? | ++---------------------------------------+---------------------------------------+ +| [2015-04-12]{.small} | The `info` command now prints urgency | +| | details when the urgency values is | +| | negative. | ++---------------------------------------+---------------------------------------+ +| [2015-04-16]{.small} | Various text-themed helper code was | +| | migrated into the Lexer. | ++---------------------------------------+---------------------------------------+ +| [2015-04-18]{.small} | 32-bit systems have ambіguous | +| | `int`/`time_t` types, which are now | +| | disambiguated, which means | +| | Taskwarrior now builds for 32-bit | +| | OSes. | ++---------------------------------------+---------------------------------------+ +| [2015-04-19]{.small} | Taskwarrior 2.4.3 released, which | +| | includes the Hooks v2 API, and the | +| | conversion of `priority` from a core | +| | attribute to a UDA. | ++---------------------------------------+---------------------------------------+ +| [2015-04-21]{.small} | Starting with the 2.4.4 release, | +| | Taskwarrior will require a compiler | +| | that supports most of the C++11 | +| | standard, for example GCC 4.7 and | +| | Clang 3.3. | ++---------------------------------------+---------------------------------------+ +| [2015-04-21]{.small} | With Taskwarrior released, the | +| | development focus now shifts to | +| | Taskserver 1.1.0. Taskserver inherits | +| | a lot of code improvements from | +| | Taskwarrior because they share code. | +| | Obsolete code removed. | ++---------------------------------------+---------------------------------------+ +| [2015-04-24]{.small} | The Taskserver setup script is | +| | renamed to \'setup\_server.bash\', | +| | and walks the user through the whole | +| | setup process for a server, and | +| | users. Although not for advanced | +| | users, this script will automate the | +| | steps that cause much difficulty | +| | among Taskserver users. | ++---------------------------------------+---------------------------------------+ +| [2015-04-24]{.small} | Starting with the 1.1.0 release, | +| | Taskserver will require a compiler | +| | that supports most of the C++11 | +| | standard, for example GCC 4.7 and | +| | Clang 3.3. | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver inherits Taskwarrior\'s | +| | Python test framework, so future | +| | tests can be written in Python. | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver documentation begins to | +| | mention the new setup\_server.bash | +| | script, which, come to think of it, | +| | really ought to be tested. | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver documentation hallucinated | +| | functionality triggered by SIGHUP and | +| | SIGUSR1. The code was improved to the | +| | point where it now just looks like an | +| | omission. | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver inherits Taskwarrior\'s | +| | I18N/L10N framework, as the basis for | +| | possible localizations. | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver tests now include a | +| | \'statistics\' request that doesn\'t | +| | work. Progress! | ++---------------------------------------+---------------------------------------+ +| [2015-04-25]{.small} | Taskserver loses some vestigial | +| | (broken) code that supported hooks | +| | and extension scripts. Future | +| | releases will include a proper hook | +| | system, once we figure out what that | +| | is. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskwarrior and Taskserver no longer | +| | report \'pthreads\' linkage in | +| | diagnostic output. There will be no | +| | pthreads usage, instead the C++11 | +| | std::thread will be used, one day. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskwarrior gains a nearly useless | +| | feature: when using the new | +| | configuration setting: | +| | | +| | $ task rc.obfuscate=1 ... | +| | | +| | All output text is replaced by xxx, | +| | xxx xxxxxxx xx, so that we can share | +| | formatted output without revealing | +| | private task data. This eliminates | +| | the need to task-anon.pl. xxxx. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | The Taskserver PKI scripts now use CN | +| | properly, and no longer specify | +| | DNSNAMES and IPADDRS. This is better. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskserver reluctantly now provides | +| | more clues in debug mode as to why | +| | certificate validation failed. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskserver\'s malformed request tests | +| | now fail because they are | +| | deliberately malformed. They did fail | +| | because the `client` command was | +| | broken. Progress! | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Recent Taskserver fixes now allow | +| | tests to run with strict certificate | +| | validation. | ++---------------------------------------+---------------------------------------+ +| [2015-04-28]{.small} | The beginnings of a Japanese | +| | translation is submitted for | +| | Taskwarrior. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskwarrior displays more details in | +| | debug mode when sync fails | +| | certificate validation. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Reduced the number of segfaults in | +| | Taskserver when the incoming request | +| | contains incorrect types. For the | +| | children. | ++---------------------------------------+---------------------------------------+ +| [2015-04-26]{.small} | Taskserver statistics request is | +| | working again. | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20150504.md b/content/news/news.20150504.md new file mode 100644 index 00000000..9dca8e1e --- /dev/null +++ b/content/news/news.20150504.md @@ -0,0 +1,58 @@ +--- +title: "News: Taskserver 1.1.0 beta1 Released" +--- + +### Taskserver 1.1.0 beta1 Released [2015-04-04]{.small} + +Taskserver 1.1.0 is in beta, and we are asking you to please test this release +in your environment. See https://taskwarrior.org/docs/taskserver/upgrade.html +for instructions to upgrade your server. There have been a few changes: + +#### Configuration + +- New setup helper script, `setup_server.bash`, which interactively leads the + whole setup and configuration process. +- When hosting, the configured server name is no longer ignored. +- Taskserver can now be restricted to IPv4 or IPv6. +- New man page for `taskdctl`. +- Server now supports a configuration setting `trust`, which can be either + `strict` or `allow all`, and defaults to `strict`. + +#### Security + +- Configurable client certificate verification. +- Improved PKI scripts. +- Certificate examples now use CN, and not SANs. +- CRL certificate is now optional. +- Added certificate verification to GnuTLS versions older than 2.9.10. + +#### Features + +- The `statistics` request is now supported. +- `validate` command will parse/validate a JSON string or file. Used for + debugging Taskserver clients. +- If the `trust` setting contains a bad value, the `diagnostics` command will + indicate this, and the server will log it. +- Can log to STDOUT when configuration setting `log` is set to \'-\'. +- Improved `diagnostics` command output. +- Taskserver no longer ignore the host definition. +- Improved logging for erros, problems, data conflicts, JSON parsing \... +- Systemd script: `taskd.service`. + +#### Portability + +- Taskserver builds with the musl library +- Removed linking of pthreads. + +#### Miscellaneous + +- Improved I/O performance with better defaults for buffer sizes. +- Removed support for `client.allow`/`client.deny` settings. +- Documentation improvements. +- Most documentation moved online, to keep it more current and correct. +- Many bug fixes. + +For full details, see the ChangeLog file included in the release. The release is +immediately available as a source ~~tarball~~. + +This is a beta release, and is not recommended for stable environments. diff --git a/content/news/news.20150509.md b/content/news/news.20150509.md new file mode 100644 index 00000000..2e0c64f7 --- /dev/null +++ b/content/news/news.20150509.md @@ -0,0 +1,30 @@ +--- +title: "News: Tasksh in Homebrew" +--- + +### Tasksh in Homebrew [2015-05-09]{.small} + +Tasksh, the Taskwarrior Shell, can now be installed using +[Homebrew](https://brew.sh) on the Mac: + + $ brew install tasksh + +This means that all three related Taskwarrior family members can now be +installed via Homebrew: + + $ brew install task + ... + $ brew install taskd + ... + $ brew install tasksh + ... + +Existing Homebrew users can obtain the formulae: + + $ brew update + ... + +Then later upgrade their Task software easily: + + $ brew upgrade + ... diff --git a/content/news/news.20150510.md b/content/news/news.20150510.md new file mode 100644 index 00000000..35a5e20e --- /dev/null +++ b/content/news/news.20150510.md @@ -0,0 +1,28 @@ +--- +title: "News: Taskwarrior 2.4.4 Released" +--- + +### Taskwarrior 2.4.4 Released [2015-05-10]{.small} + +Taskwarrior 2.4.4 is released. Although a minor release, there are significant +bug fixes which make this a recommended upgrade. Changes include: + +- Fixed a problem where the wrong task may be updated, if GC is disabled. This + is the primary reason for the release. +- Fixed a problem where filters including parenthesized tags + (`... and (+DUE or +OVERDUE)`) were incorrectly handled. +- 32-bit platform support. +- The `obfuscate` configuration setting will hide private data, intended for + bug reporting. +- An early Japanese localization. +- Several bug fixes. + +For full details, see the ChangeLog file included in the release. + +Please bear in mind that [GnuTLS](https://gnutls.org/) is a security product, +and it is important that you use the most recent version available. Please +upgrde GnuTLS before building Taskwarrior and Taskserver. + +The release is immediately available as a source +[tarball](/download?pk_campaign=twitter&pk_kwd=task-2.4.4). Binary packages will +soon be available via your Operating System\'s package manager. diff --git a/content/news/news.20150511.md b/content/news/news.20150511.md new file mode 100644 index 00000000..fe1108e1 --- /dev/null +++ b/content/news/news.20150511.md @@ -0,0 +1,64 @@ +--- +title: "News: Taskserver 1.1.0 Released" +--- + +### Taskserver 1.1.0 Released [2015-05-11]{.small} + +After more than a year of improvements, Taskserver 1.1.0 is released. + +This is a major release, with greatly improved setup, security and logging, +which make this a recommended upgrade. Changes include: + +#### Configuration + +- New setup helper script, `setup_server.bash`, which interactively leads the + whole setup and configuration process. +- When hosting, the configured server name is no longer ignored. +- Taskserver can now be restricted to IPv4 or IPv6. +- New man page for `taskdctl`. +- Server now supports a configuration setting `trust`, which can be either + `strict` or `allow all`, and defaults to `strict`. + +#### Security + +- Configurable client certificate verification. +- Improved PKI scripts. +- Certificate examples now use CN, and not SANs. +- CRL certificate is now optional. +- Added certificate verification to GnuTLS versions older than 2.9.10. + +#### Features + +- The `statistics` request is now supported. +- `validate` command will parse/validate a JSON string or file. Used for + debugging Taskserver clients. +- If the `trust` setting contains a bad value, the `diagnostics` command will + indicate this, and the server will log it. +- Can log to STDOUT when configuration setting `log` is set to \'-\'. +- Improved `diagnostics` command output. +- Taskserver no longer ignore the host definition. +- Improved logging for erros, problems, data conflicts, JSON parsing \... +- Systemd script: `taskd.service`. + +#### Portability + +- Taskserver builds with the musl library +- Removed linking of pthreads. + +#### Miscellaneous + +- Improved I/O performance with better defaults for buffer sizes. +- Removed support for `client.allow`/`client.deny` settings. +- Documentation improvements. +- Most documentation moved online, to keep it more current and correct. +- Many bug fixes. + +Please bear in mind that [GnuTLS](https://gnutls.org/) is a security product, +and it is important that you use the most recent version available. Please +upgrde GnuTLS before building Taskwarrior and Taskserver. + +For full details, see the ChangeLog file included in the release. + +The release is immediately available as a source +[tarball](/download?pk_campaign=twitter&pk_kwd=taskd-1.1.0). Binary packages +will soon be available via your Operating System\'s package manager. diff --git a/content/news/news.20150524.md b/content/news/news.20150524.md new file mode 100644 index 00000000..9355a5d5 --- /dev/null +++ b/content/news/news.20150524.md @@ -0,0 +1,10 @@ +--- +title: "News: Taskwarrior Live Demo" +--- + +### Taskwarrior Live Demo [2015-05-24]{.small} + +Try Taskwarrior [live in your browser](https://wbsch.de/jswarrior/). + +[![Live +Demo](/news/images/live_demo-thumb.png){.img-thumbnail}](/news/images/live_demo.png) diff --git a/content/news/news.20150601.md b/content/news/news.20150601.md new file mode 100644 index 00000000..8bf606ad --- /dev/null +++ b/content/news/news.20150601.md @@ -0,0 +1,43 @@ +--- +title: "News: Activity Digest: May 2015" +--- + +### Activity Digest: May 2015 [2015-06-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in May 2015. + + ---------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [2015-05-02]{.small} Taskwarrior and Taskserver learned how to lock files the POSIX way, instead of a platform-specific implementation. This should have happened years ago. Moving on\... + [2015-05-02]{.small} The \'Taskwarrior\' name was standardized throughout the code. Something you would think had happened a long time ago. + [2015-05-02]{.small} Taskserver no longer misleads when asked to modify a configuration setting with a read-only config file. + [2015-05-02]{.small} Taskserver can now restrict itself to the IPv4 or IPv6 protocol. + [2015-05-02]{.small} Taskserver inherited Taskwarrior\'s `l10n` utility, and finds unused strings. + [2015-05-03]{.small} Taskwarrior documentation interchangeably used ambiguous terms to describe sync server configuration. + [2015-05-04]{.small} A problem was found, then fixed, with some write commands, when GC (Garbage Collection) was manually shut off. Although a bug, don\'t turn off GC. It has been harming the bee populations. This should help. + [2015-05-04]{.small} Taskserver now recognizes libc++ memory errors. It doesn\'t do anything about it, but at least it knows what\'s happening. + [2015-05-04]{.small} Taskserver 1.1.0 beta1 was released. + [2015-05-04]{.small} The fish completion script is improved. Yes, fish is a real shell name. + [2015-05-05]{.small} The `setup_server.bash` script is significantly improved for correctness and usability. It was much needed. + [2015-05-06]{.small} The Taskwarrior test suite is now parallelized, and runs in far less time than before. On some systems, `./run_all --fast` now runs in around 20 seconds. + [2015-05-09]{.small} Some old bugs are closed, because they were fixed a while ago, but not recorded. + [2015-05-09]{.small} Taskwarrior lexer is improved to better detect tags on the command line when there is preceding text, like `(+tag)`. + [2015-05-10]{.small} Example export scripts were not properly handling UTF-8, and were fixed. + [2015-05-10]{.small} Taskwarrior 2.4.4 was [released](/news/news.20150510.html). + [2015-05-11]{.small} Taskserver 1.1.0 was [released](/news/news.20150511.html). + [2015-05-13]{.small} Taskserver learns to listen on `::`, which means dual IPv4/IPv6 localhost. Obviously. + [2015-05-14]{.small} Taskserver learns to not fail silently on signal handler errors. + [2015-05-23]{.small} Tasksh lost it\'s rudimentary `context` feature, which was eclipsed by a much more powerful Taskwarrior equivalent. + [2015-05-24]{.small} Taskwarrior, Taskserver and Tasksh start using C++11 N1984 and N2672, and it feels oh, so good. + [2015-05-24]{.small} Through the power of copy/paste, Taskserver fixes bugs by inheriting fixed code from Taskwarrior. + [2015-05-24]{.small} Taskwarrior implements an experimental, recursive, O(N\^2) urgency inheritance algorithm that may cause your lights to dim and power utility bills to increase. It may also be killing the bee populations. + [2015-05-24]{.small} Tasksh is getting a `review` command. + [2015-05-25]{.small} Taskwarrior and Taskserver combined `Path`, `File` and `Directory` classes into one source file and test program named `FS`. While this has no benefit at all (you\'re welcome users!) it keeps the three together, as they are a hierarchy and cannot operate alone. + [2015-05-25]{.small} Test suite now better differentiate between tests that pass and tests that are skipped. It\'s important. + [2015-05-25]{.small} Taskwarrior can now import tasks from STDIN if `-` is specified as the input file. Or if nothing is specified. + [2015-05-25]{.small} Taskwarrior now has a `test/README` document that defines how unit tests should be written, in a desperate attempt to get more tests. + [2015-05-28]{.small} The test suite learns how to intrinsically support export. For the bees. + [2015-05-29]{.small} Taskwarrior `import` can now `add` or `update` a task as appropriate. Finally. + [2015-05-31]{.small} Task `modify` code got refactored nicely, which makes it easier for the developers to look at without convulsions. You\'re welcome users! + [2015-05-31]{.small} Some Taskwarrior code that was commented out a long time ago, that we subsequently forgot the intent thereof, was quietly and shamefully deleted. + ---------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/content/news/news.20150627.md b/content/news/news.20150627.md new file mode 100644 index 00000000..d1d133d3 --- /dev/null +++ b/content/news/news.20150627.md @@ -0,0 +1,24 @@ +--- +title: "News: GTD With Taskwarrior - a tutorial series" +--- + +### GTD With Taskwarrior - a tutorial series [2015-06-27]{.small} + +Tom Sydney Kerckhove is writing a series of articles, explaining how he uses GTD +with Taskwarrior. The first five articles are up: + +[Part1 - +Intro](https://cs-syd.eu/posts/2015-06-14-gtd-with-taskwarrior-part-1-intro.html)\ +[Part2 - +Collection](https://cs-syd.eu/posts/2015-06-21-gtd-with-taskwarrior-part-2-collection.html)\ +[Part3 - +Tickling](https://cs-syd.eu/posts/2015-06-28-gtd-with-taskwarrior-part-3-tickling.html)\ +[Part4 - +Processing](https://cs-syd.eu/posts/2015-07-05-gtd-with-taskwarrior-part-4-processing.html)\ +[Part5 - +Doing](https://cs-syd.eu/posts/2015-07-12-gtd-with-taskwarrior-part-5-doing.html) + +The articles are well-written, and the material logically presented. We +recommend you read them, and check for the latest articles. + +This post will be updated as more articles are published. diff --git a/content/news/news.20150701.md b/content/news/news.20150701.md new file mode 100644 index 00000000..c09a04e5 --- /dev/null +++ b/content/news/news.20150701.md @@ -0,0 +1,198 @@ +--- +title: "News: Activity Digest: June 2015" +--- + +### Activity Digest: June 2015 [2015-06-30]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in June 2015. + ++---------------------------------------+---------------------------------------+ +| [2015-06-02]{.small} | Tasksh gains the ability to detect | +| | terminal width, and display colored | +| | banners. | ++---------------------------------------+---------------------------------------+ +| [2015-06-02]{.small} | Tasksh gains UTF-8 support. | ++---------------------------------------+---------------------------------------+ +| [2015-06-02]{.small} | Tasksh gains a more polished `review` | +| | command, which manages a GTD-like | +| | review session of your tasks, | +| | remembering where it left off, and | +| | not revisiting tasks too often. With | +| | upcoming Taskwarrior enhancements, | +| | this feature will be functional. | ++---------------------------------------+---------------------------------------+ +| [2015-06-03]{.small} | A JSON parser memory leak was fixed, | +| | which is likely the cause of the | +| | long-standing non-linear performance | +| | of the parser. | ++---------------------------------------+---------------------------------------+ +| [2015-06-03]{.small} | Tasksh gains a stub of a shell | +| | command, to run external software. | ++---------------------------------------+---------------------------------------+ +| [2015-06-04]{.small} | When listing contexts, the active | +| | context is now also shown. This is as | +| | close as Taskwarrior gets to being | +| | user-friendly. | ++---------------------------------------+---------------------------------------+ +| [2015-06-05]{.small} | The `task edit` command no longer | +| | borks annotations when newlines `\n` | +| | are found in the description. | ++---------------------------------------+---------------------------------------+ +| [2015-06-05]{.small} | The sin of modifying a task to depend | +| | on another, when it already does so, | +| | has been downgraded from error to | +| | NOP. | ++---------------------------------------+---------------------------------------+ +| [2015-06-05]{.small} | The unit test framework gains more | +| | capabilities, and more tests are | +| | migrated from Perl to Python. Why are | +| | we migrating? There are two main | +| | reason to move to Python: there is | +| | more enthusiasm for Python in the | +| | community, and our Python test | +| | framework is gaining some very | +| | powerful features. One in particular | +| | is the degree of isolation between | +| | test scripts, which is allowing us to | +| | parallelize the test suite. Although | +| | we could easily improve the Perl | +| | framework, we have decided not to. | ++---------------------------------------+---------------------------------------+ +| [2015-06-06]{.small} | The test framework gains the ability | +| | to do some very suspicious things | +| | like test the `task edit` feature. | +| | Magic. | ++---------------------------------------+---------------------------------------+ +| [2015-06-06]{.small} | Wisdom gained: Even the most trivial | +| | change needs to be tested for idiocy. | ++---------------------------------------+---------------------------------------+ +| [2015-06-06]{.small} | The command line parser, the darkest, | +| | most disturbing part of Taskwarrior, | +| | begins to be beaten into shape. First | +| | up: clean up the worst of the cruft. | ++---------------------------------------+---------------------------------------+ +| [2015-06-07]{.small} | The `project` verbosity token now | +| | implies the `footnote` token. This is | +| | the beginning of a more sensible | +| | cascading mechanism for verbosity. | ++---------------------------------------+---------------------------------------+ +| [2015-06-09]{.small} | Many polymorphic text formatting | +| | functions are converted to C++11 | +| | variadic templates. An exciting day | +| | for Taskwarrior users! | ++---------------------------------------+---------------------------------------+ +| [2015-06-09]{.small} | The unit test suite, with shocking | +| | honesty, now declares tests as not | +| | expected to pass, rather than | +| | commenting them out and pretending | +| | they don\'t exist. It\'s becoming | +| | harder to lie about features working. | ++---------------------------------------+---------------------------------------+ +| [2015-06-11]{.small} | The TAP output generated by the test | +| | suite becomes more verbose and | +| | useful. | ++---------------------------------------+---------------------------------------+ +| [2015-06-11]{.small} | The BY and RU holiday files now | +| | include International Women\'s Day, | +| | which was mistakenly ommitted. | ++---------------------------------------+---------------------------------------+ +| [2015-06-13]{.small} | Once again, there are two command | +| | line parsers in Taskwarrior, the | +| | current one, and a new shadow parser | +| | that will grow to become better than | +| | the current one, ultimately replace | +| | it. Why are we doing this? | +| | | +| | 1. Parsers are fun! | +| | 2. Destabilizing code is exciting | +| | 3. The command line evolves and the | +| | parser needs to catch up | +| | 4. Bugs, Bee populations | +| | 5. All of the above | +| | | +| | Correct answer is (5). | ++---------------------------------------+---------------------------------------+ +| [2015-06-19]{.small} | The command line parser learned to | +| | recognized ID ranges in a much better | +| | way. | ++---------------------------------------+---------------------------------------+ +| [2015-06-21]{.small} | Taskwarrior wasn\'t recognizing the | +| | form `due=now` and | +| | `due.before=today`, but no one | +| | appears to have noticed. | ++---------------------------------------+---------------------------------------+ +| [2015-06-22]{.small} | Fixed a bug where `proj` was neither | +| | recognized as the command `projects`, | +| | or the attribute `project`. | ++---------------------------------------+---------------------------------------+ +| [2015-06-22]{.small} | Fixed a bug where a second terminator | +| | `--` was considered to be another | +| | terminator, but it should have been | +| | considered just text. | ++---------------------------------------+---------------------------------------+ +| [2015-06-22]{.small} | The test suite now recognizes cases | +| | where tests pass, but were expected | +| | to fail, and flags this. Prior to | +| | this, these cases were hard to spot. | ++---------------------------------------+---------------------------------------+ +| [2015-06-22]{.small} | The library dependency GnuTLS is now | +| | required, unless the `cmake` option | +| | `-DENABLE_SYNC=OFF` is specified. | +| | There have just been too many folks | +| | installing binary packages with no | +| | sync capability, that then need to | +| | builds from source. That\'s just | +| | cruel. | ++---------------------------------------+---------------------------------------+ +| [2015-06-22]{.small} | Fixed bug where UUID\'s were | +| | considered string, and not properly | +| | filtered. | ++---------------------------------------+---------------------------------------+ +| [2015-06-24]{.small} | Fixed problem where \'pair\' type | +| | arguments (`name:value`) were not | +| | properly downgraded to \'text\' when | +| | they were not recognized. | ++---------------------------------------+---------------------------------------+ +| [2015-06-25]{.small} | The test suite overhaul, and Python | +| | conversion is now at the point where | +| | *most* of the tests are no longer | +| | Perl tests. | ++---------------------------------------+---------------------------------------+ +| [2015-06-25]{.small} | The test suite overhaul continues, | +| | and the old `--fast` option is now | +| | the default, and the whole test suite | +| | runs in under twenty seconds (on this | +| | arbitrary piece of hardward), because | +| | of parallelization. The `run_all` and | +| | `problems` scripts are updated with | +| | more details, options and | +| | easy-to-interpret color. The test | +| | suite is becoming a much more | +| | powerful debugging tool. | ++---------------------------------------+---------------------------------------+ +| [2015-06-27]{.small} | Taskwarrior loses support for | +| | ambiguous ISO-8601 date formats, such | +| | as `YYYYMMDD` and `hhmmss` for time. | +| | This leaves the clearer extended | +| | forms (`YYYY-MM-DD` and `hh:mm:ss`) | +| | intact, and the old forms still | +| | available via `rc.dateformat`. This | +| | reduces command line parser ambiguity | +| | - a good thing. | ++---------------------------------------+---------------------------------------+ +| [2015-06-27]{.small} | For years now, deleting a task has | +| | generated feedback that says it is | +| | \'permanently\' removed. This it not | +| | true, especially with the `undo` | +| | command. Fixed. | ++---------------------------------------+---------------------------------------+ +| [2015-06-27]{.small} | Taskwarrior now produces an error if | +| | you try to modify a virtual tag. | +| | Previously this succeeded, but the | +| | presence of the tag was hidden. | ++---------------------------------------+---------------------------------------+ +| [2015-06-30]{.small} | A sync error message was corrected to | +| | stop it from lying to users about | +| | account enabling. | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20150801.md b/content/news/news.20150801.md new file mode 100644 index 00000000..8b8f6123 --- /dev/null +++ b/content/news/news.20150801.md @@ -0,0 +1,313 @@ +--- +title: "News: Activity Digest: July 2015" +--- + +### Activity Digest: July 2015 [2015-08-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in July 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.0). + +[2015-07-01]{.small} +::: +::: +::: + +- Task: C++ unit tests now produce the same colorful output in TTY mode as the + Python tests. +- Task: The notion of \'ambiguity\' was dropped from Lexer, Eval, calc. It is + no longer needed. +- Flod: \'Prevent collapsible links to jump to top of page\' fixed + +[2015-07-03]{.small} + +- Task: Test assumed that if /foo/ appears in the output, all is well, but + there is a false positive case where \'foo\' is also in the path name of + unrelated output. +- Task: TAP: Show name of file containing the test(s) +- Task: TAP: Don\'t show `__main__` in output if description is undefined +- Task: TAP: self.t() single-arg call now propagated to self.t.runError() +- Task: `json.array` now defaults to `on`, which means `export` works + out-of-the-box with all JSON parser + +[2015-07-04]{.small} + +- Task: Lexer added look-behind rules to improve tag recognition +- Task: Lexer uses maximal matching for `pair` args +- Task: Oops, restored `YYYYMMDDThhmmssZ` and `YYYYMMDDThhmmss` ISO form + support, which should not have been removed +- Task: Lexer learned that when there are two `--` separators, the second one + is a literal `--`, not a separator + +[2015-07-05]{.small} + +- Task: Lexer dropped support for UUID lists +- Task: ISO8601 date parsing added range checking, preventing `25` as an hour, + for example +- Task: CLI2 refactoring removed lots of code and bugs + +[2015-07-06]{.small} + +- Task: Lexer learned to decompose `pair` arguments into their components, for + example `name.not:value` has a name, an attribute modifier, a separator `:` + and a value +- Task: CLI2 no longer attempts to canonicalize everything, just most things +- Task: Lexer learned how to read UTF8 words out of strings, taking into + consideration quotes, escaped characters and `U+NNNN`, `\uNNNN` Unicode + sequences +- Task: Fixed zsh completion autoload function boilerplate +- Task: The `_tags` helper command now also shows virtual tags + +[2015-07-07]{.small} + +- Task: The test suite now supports Python3 in addition to Python2.7 + +[2015-07-10]{.small} + +- Task: All `:` pairs now support escapes, quotes and Unicode + escapes for `` +- Clog: \'Blank input lines are silently eaten\' fixed + +[2015-07-11]{.small} + +- Task: Recurring template tasks are no longer include in the `+OVERDUE` + virtual tag +- Task: With patterns `/pattern/` and substitutions `/from/to/[g]`, there is + now the possibility of added other flags than `g` at the end +- Task: Removed a performance shortcut fir fixed-width columns that was + preventing `print.empty.columns` from working on indicator columns + +[2015-07-12]{.small} + +- Task: New command `_unique` queries unique values from the specified + attribute, which will ultimately replace several helper functions + +[2015-07-13]{.small} + +- Task: Test suite gained a `stress_test` tool to detect test result flapping +- [\#1351: UDA is NOT sorted corresponding to the order of UDA list + entries](https://github.com/GothenburgBitFactory/taskwarrior/issues/1351) + fixed +- [\#1416: tw will import same UUID n-times if part of same + import](https://github.com/GothenburgBitFactory/taskwarrior/issues/1416) + fixed +- [\#1446: On add \'-tag\' is considered a tag removal, which makes no + sense.](https://github.com/GothenburgBitFactory/taskwarrior/issues/1446) + fixed +- [\#1457: Slashes in project names don\'t + work](https://github.com/GothenburgBitFactory/taskwarrior/issues/1457) fixed +- [\#1481: Filter parser does not properly handle parentheses in + attributes](https://github.com/GothenburgBitFactory/taskwarrior/issues/1481) + fixed +- [\#1482: Filter parser does not always handle multiple arguments bundled + into one with + apostrophes](https://github.com/GothenburgBitFactory/taskwarrior/issues/1482) + fixed +- [\#1501: task config expands values with unnecessary + spaces](https://github.com/GothenburgBitFactory/taskwarrior/issues/1501) + fixed +- [\#1505: Task arguments not properly parsed if they contain a + space](https://github.com/GothenburgBitFactory/taskwarrior/issues/1505) + fixed +- [\#1506: Weird behaviour on redundant filter beginning with + number](https://github.com/GothenburgBitFactory/taskwarrior/issues/1506) + fixed +- [\#1514: You have more urgent + tasks](https://github.com/GothenburgBitFactory/taskwarrior/issues/1514) + fixed +- [\#1537: Project titles not properly parsed if they contain + hyphens](https://github.com/GothenburgBitFactory/taskwarrior/issues/1537) + fixed +- [\#1553: Extra spaces added around + slashes](https://github.com/GothenburgBitFactory/taskwarrior/issues/1553) + fixed +- [\#1555: Parser incorrectly inserting spaces into task + description](https://github.com/GothenburgBitFactory/taskwarrior/issues/1555) + fixed +- [\#1595: update wait: manpage + entry](https://github.com/GothenburgBitFactory/taskwarrior/issues/1595) + fixed +- [\#1601: `task log` mangles URLs when + quoted](https://github.com/GothenburgBitFactory/taskwarrior/issues/1601) + fixed +- [\#1624: Filtering \"regressions\"(?) in task-2.4.3, + task-2.4.4](https://github.com/GothenburgBitFactory/taskwarrior/issues/1624) + fixed +- [\#1633: In \'urgency\<10\', 10 is interpreted as an + ID](https://github.com/GothenburgBitFactory/taskwarrior/issues/1633) fixed +- [\#1636: Spurious whitespace added in task descriptions around certain + symbols](https://github.com/GothenburgBitFactory/taskwarrior/issues/1636) + fixed +- [\#1639: Japanese translation for + Taskwarrior(150513)](https://github.com/GothenburgBitFactory/taskwarrior/issues/1639) + fixed +- [\#1641: Can\'t search for multi-word + project](https://github.com/GothenburgBitFactory/taskwarrior/issues/1641) + fixed +- [\#1656: Japanese translation for + Taskwarrior(150713)](https://github.com/GothenburgBitFactory/taskwarrior/issues/1656) + fixed + +[2015-07-15]{.small} + +- [\#1618: Able to add duplicate tags using + \'tags:\'](https://github.com/GothenburgBitFactory/taskwarrior/issues/1618) + fixed +- [\#1650: Wrong wait + date](https://github.com/GothenburgBitFactory/taskwarrior/issues/1650) fixed + +[2015-07-16]{.small} + +- Task: Import now allows JSON arrays as input +- Task: Fixed bug where zero seconds was stored as `P0S`, which should be + `PT0S` +- Task: UDA values of type `duration` are now storeѕ as ISO8601 values +- [\#1646: Duration UDA can\'t take an algebraic + expression](https://github.com/GothenburgBitFactory/taskwarrior/issues/1646) + fixed + +[2015-07-17]{.small} + +- Task: Incorporated the latest `wcwidth.c` from Markus Kuhn +- Task: Fixed bug where two feedback messages were concatenated without + intervening space + +[2015-07-18]{.small} + +- Task: Fixed bug where the width of ID columns was mis-calculated for 5-digit + task IDs +- Task: Fixed bug where UDAs were missing from the `columns` command output +- Task: Fixed typos in translation files + +[2015-07-19]{.small} + +- [\#96: server\_setup.bash won\'t run on Mac OS X and + BSD](https://github.com/GothenburgBitFactory/taskserver/issues/96) fixed +- [\#99: Manual page of taskd has hyphen instead minus sign + \"-\"](https://github.com/GothenburgBitFactory/taskserver/issues/99) fixed +- [\#101: taskdrc man page says \"trust\" defaults to \"strict\", but server + complains if none + set](https://github.com/GothenburgBitFactory/taskserver/issues/101) fixed +- [\#1492: UDA with type duration is stored as + text/string](https://github.com/GothenburgBitFactory/taskwarrior/issues/1492) + fixed +- [\#1504: due:easter sets the easter of the current year regardless of the + date](https://github.com/GothenburgBitFactory/taskwarrior/issues/1504) fixed +- [\#1511: can\'t delete recurring tasks (except by + workaround)](https://github.com/GothenburgBitFactory/taskwarrior/issues/1511) + fixed +- [\#1541: abbreviation.minimum does not apply to date + recognition](https://github.com/GothenburgBitFactory/taskwarrior/issues/1541) + fixed +- [\#1547: task project!=PROJECTNAME does not work + (Regression)](https://github.com/GothenburgBitFactory/taskwarrior/issues/1547) + fixed +- [\#1569: cmake complains \"test\" is not a valid target (on arch + linux)](https://github.com/GothenburgBitFactory/taskwarrior/issues/1569) + fixed +- [\#1579: Setting defaultheight:0 makes burndown command + hang](https://github.com/GothenburgBitFactory/taskwarrior/issues/1579) fixed +- [\#1658: due.not:\ excludes only tasks scheduled at + mitnight](https://github.com/GothenburgBitFactory/taskwarrior/issues/1658) + fixed +- [\#1659: Running \"task anystringatall\" does not filter + anything](https://github.com/GothenburgBitFactory/taskwarrior/issues/1659) + fixed +- Task: Fish shell completion fixed for OSX +- Task: Day names and month names are now specifiable using abbreviations +- Task: Editing failure now stops all editing of multiple tasks + +[2015-07-20]{.small} + +- [\#1479: The uuid: filter does not + work](https://github.com/GothenburgBitFactory/taskwarrior/issues/1479) fixed +- [\#1498: Syntactic sugar morphs into regex expressions, even if turned + off](https://github.com/GothenburgBitFactory/taskwarrior/issues/1498) fixed +- [\#1662: Undo doesn\'t work when a context is + set](https://github.com/GothenburgBitFactory/taskwarrior/issues/1662) fixed +- Task: A Bash TAP library allows the rapid creation of simple tests +- Task: Bash test scripts now participate in parallelization +- Task: The example add-on scripts for import and export are relocated online +- Task: Renamed a report column named \'for\' + +[2015-07-22]{.small} + +- Task: Test Framework gained a MetaTest capability, which simplifies dynamic + test creation + +[2015-07-23]{.small} + +- [\#1559: dateformat confusion, regress + tests](https://github.com/GothenburgBitFactory/taskwarrior/issues/1559) + fixed +- [\#1592: Context is applied on \'task + export\'](https://github.com/GothenburgBitFactory/taskwarrior/issues/1592) + fixed +- [\#1664: \'\_get .start\' for an inactive tasks returns a date formatted + from + epoch 0.](https://github.com/GothenburgBitFactory/taskwarrior/issues/1664) + fixed +- Task: Bug that causes UDA orphans not to be shown in the \'info\' report + fixed +- Task: Tags: New \'UDA\' and \'ORPHAN\' virtual tags + +[2015-07-25]{.small} + +- [\#1665: \'edit\' should process or reject \ + arguments](https://github.com/GothenburgBitFactory/taskwarrior/issues/1665) + fixed +- Task: RX: Was missing REG\_ENHANCED, which omits \\d support +- Task: Commands that do not accept filters or modifications now generate an + error when extra arguments are specified +- Task: There are now a class of command to which `context` does not apply + +[2015-07-26]{.small} + +- Task: DOM references are now detected using precise templates, rather than + patterns, which makes them more reliable +- Task: zsh completion now categorizes commands + +[2015-07-27]{.small} + +- Task: The last traces of Perl in the test suite are removed. This concludes + the first phase of the test suite refactoring. Remaining is the effort to + organize tests in feature-specific scripts, which is not complete +- Task: Added support for free-form JSON input, as well as the traditional + one-line-per-task form + +[2015-07-28]{.small} + +- [\#1581: Project Names Converted to + Dates](https://github.com/GothenburgBitFactory/taskwarrior/issues/1581) + fixed +- [\#1651: \'mon\' is replaced with date in project + field](https://github.com/GothenburgBitFactory/taskwarrior/issues/1651) + fixed +- [\#1661: project name \"mod\" interpreted as + date](https://github.com/GothenburgBitFactory/taskwarrior/issues/1661) fixed +- [\#1666: After \"\--\", an apostrophe unexpectedly ends the task + description](https://github.com/GothenburgBitFactory/taskwarrior/issues/1666) + fixed +- Task: The test suite now reports when tests unexpectedly succeed +- Task: The test suite can now test all `confirmation` configurations +- Task: Dependencies are now exported as a JSON array, which can be disabled + with `rc.json.depends.array=off`. + +[2015-07-29]{.small} + +- [\#210: JSON export should model dependencies as + array](https://github.com/GothenburgBitFactory/taskwarrior/issues/210) fixed +- [\#1453: Adding a date in 1963 (why not?) stores a negative epoch, which + fails to + export](https://github.com/GothenburgBitFactory/taskwarrior/issues/1453) + fixed +- [\#1645: Recurrent parent tasks shouldn\'t be counted in + history](https://github.com/GothenburgBitFactory/taskwarrior/issues/1645) + fixed +- [\#1570: requested a \"Do you want to set context \$name now?\" prompt when + defining a context; this does the next best thing and shows how to activate + the context right + away](https://github.com/GothenburgBitFactory/taskwarrior/issues/1596) diff --git a/content/news/news.20150901.md b/content/news/news.20150901.md new file mode 100644 index 00000000..11839c5f --- /dev/null +++ b/content/news/news.20150901.md @@ -0,0 +1,280 @@ +--- +title: "News: Activity Digest: August 2015" +--- + +### Activity Digest: August 2015 [2015-09-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in August 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.0). + ++---------------------------------------+---------------------------------------+ +| [2015-08-01]{.small} | - Task: Commands now have \'DNA\', | +| | which determines how they behave, | +| | and allows more control than | +| | simply distinguishing between | +| | `read-only` and `write` commands. | +| | - Task: An ISO year is now valid | +| | beyond 2100. | +| | - Task: The new \'commands\' | +| | command shows information about | +| | how the commands behave. For | +| | debugging. | +| | - Task: Documentation now indicates | +| | the replacement for | +| | `report.X.annotations`. | ++---------------------------------------+---------------------------------------+ +| [2015-08-02]{.small} | - Task: Context filters now applied | +| | only when a command requests it. | +| | - Task: Time-sensitive, floating | +| | point representation-sensitive, | +| | and color-sensitive unit tests | +| | fixed, which yields more | +| | consistent results. | +| | - Task: When applying additional | +| | filters, the insertion occurs at | +| | the beginning, thus avoiding any | +| | `--` arguments. | +| | - Task: GC now only run when a | +| | command requests it. | ++---------------------------------------+---------------------------------------+ +| [2015-08-03]{.small} | - Task: `rc.debug=1` now shows the | +| | parse tree, before | +| | command-specific processing. | +| | - Task: Clarified DOM responses - | +| | it is an error to specify no | +| | reference, or a bad reference. It | +| | is not an error to specify a | +| | reference that yields no value. | +| | - [\#1653: Descriptions often get | +| | overwritten with \"( or | +| | )\"](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1653) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-04]{.small} | - Task: Man pages updated to cover | +| | the inequality operators. | +| | - [\#1672: Typo in | +| | Docum | +| | entation](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1672) | +| | fixed | +| | - [\#1671: descriptions that are | +| | stringified | +| | ids](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1671) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-05]{.small} | - [\#1374: Filter due:yyyy-mm-dd is | +| | failing to display daily | +| | recurring tasks if there is | +| | deleted task in the | +| | | +| | series](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1374) | +| | fixed | +| | - [\#1522: Translation manuals are | +| | outdated/mis | +| | inf | +| | ormation](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1522) | +| | fixed | +| | - [\#1525: Invalid due date | +| | produces jump to begining of the | +| | unix | +| | | +| | epoch](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1525) | +| | fixed | +| | - [\#1563: soww Synonym produces | +| | wrong | +| | date](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1563) | +| | fixed | +| | - [\#1619: context and description | +| | s | +| | ubstring](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1619) | +| | fixed | +| | - [\#1620: Filter \"due.before\" | +| | with relative dates stopped | +| | | +| | working](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1620) | +| | fixed | +| | - [\#1623: (Bulk) modification of | +| | tasks unintentionally overwrites | +| | description if a context is | +| | | +| | active](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1623) | +| | fixed | +| | - [\#1631: Theme Support for | +| | missing | +| | UDAs](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1631) | +| | fixed | +| | - [\#1635: soww | +| | w | +| | eirdness](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1635) | +| | fixed | +| | - [\#1648: Report filters combine | +| | incorrectly with command line | +| | with | +| | ter | +| | minator.](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1648) | +| | fixed | +| | - [\#1654: \"Due\" parsing behavior | +| | seems | +| | inco | +| | nsistent](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1654) | +| | fixed | +| | - [\#1667: Batch modifying tasks | +| | under context sets description to | +| | \'( | +| | )\'](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1667) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-06]{.small} | - TaskServer: The `diagnostics` | +| | commands now shows certificate | +| | file sizes. | +| | - Task: The `diagnostics` commands | +| | now shows certificate file sizes. | +| | - Task: Displays UUID instead of ID | +| | when completing a task. | +| | - Task: Documented that | +| | comma-separated UUIDs are not | +| | supported, and comma-separated | +| | IDs are deprecated. | ++---------------------------------------+---------------------------------------+ +| [2015-08-07]{.small} | - Task: Documented the `!` negation | +| | operator. | +| | - Task: `rc.sugar` enables/disables | +| | syntactic sugar for IDs and UUIDs | +| | only. | +| | - [\#1675: Provide opt-out of | +| | filter parser\'s id | +| | t | +| | reatment](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1675) | +| | fixed | +| | - [\#1676: task rm | +| | m | +| | isparsed](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1676) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-08]{.small} | - [\#1660: UUID with numeric-only | +| | first segment is not parsed | +| | | +| | properly](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1660) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-09]{.small} | - Task: UUID is now validated on | +| | import. | ++---------------------------------------+---------------------------------------+ +| [2015-08-11]{.small} | - [\#305: Unexpected zsh | +| | autocomplete | +| | | +| | behaviour](https://github.com/Gothenb | +| | urgBitFactory/taskwarrior/issues/305) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-12]{.small} | - Task: Merged Duration and | +| | ISO8601p objects. All durations | +| | are now ISO-centric. | +| | - Task: Improved documentation in | +| | sample hook script. | +| | - [\#1677: info report regression; | +| | shouldn\'t be context | +| | s | +| | ensitive](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1677) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-14]{.small} | - Task: Configuration: | +| | \'search.case.sensitive\' now | +| | defaults to \'yes\' on Cygwin | +| | - [\#1679: Inform \"No changes | +| | made.\" when quitting early due | +| | to | +| | | +| | signal](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1679) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-17]{.small} | - Task: The `is` and `isnt` | +| | attribute modifiers are now | +| | exact/inexact operators. | +| | - Task: Improved documentation for | +| | attribute modifiers in the `help` | +| | command. | ++---------------------------------------+---------------------------------------+ +| [2015-08-22]{.small} | - [\#1690: import should reject | +| | invalid | +| | data](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1690) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-23]{.small} | - Task: New `recur` verbosity | +| | token. | +| | - Task: New `unwait` verbosity | +| | token. | +| | - [\#1688: Notify of | +| | waiting→pending | +| | p | +| | romotion](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1688) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-27]{.small} | - [\#1694: Reversed ranges are | +| | parsed as a mathematician would | +| | | +| | expect](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1694) | +| | fixed | +| | - [\#1695: task add: segfault with | +| | f | +| | oo-bar:1](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1695) | +| | fixed | +| | - [\#1699: project.not:something | +| | doesn\'t exclude | +| | project:something.sub | +| | projects](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1699) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-08-28]{.small} | - Task: | +| | `rc.report..sort:none` now | +| | performs no sorting, and retains | +| | the order of all UUID values | +| | specified. | +| | - Task: the `columns` report gained | +| | a \'type\' field. | ++---------------------------------------+---------------------------------------+ +| [2015-08-29]{.small} | - Task: The `commands` report | +| | gained a \'description\' field. | ++---------------------------------------+---------------------------------------+ +| [2015-08-30]{.small} | - Task: The `TASKDATA` environment | +| | variable is now mandatory in Bash | +| | tests. | ++---------------------------------------+---------------------------------------+ +| [2015-08-31]{.small} | - Task: The `LATEST` virtual tag | +| | indicates the most recently added | +| | task. | +| | - Task: The `PROJECT` virtual tag | +| | indicates that a project is | +| | assigned. | +| | - Task: The `PRIORITY` virtual tag | +| | indicates that a priority is | +| | assigned. | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20150907.md b/content/news/news.20150907.md new file mode 100644 index 00000000..2e878b36 --- /dev/null +++ b/content/news/news.20150907.md @@ -0,0 +1,68 @@ +--- +title: "News: Taskwarrior 2.5.0 beta1 Released" +--- + +### Taskwarrior 2.5.0 beta1 Released [2015-09-07]{.small} + +After an intense four month effort, which focused mainly on a more capable +command-line parser, more extension-friendly behavior, and significant +improvements to testing, Taskwarrior 2.5.0 beta1 is now released. + +We are asking you to please [build](/docs/build.html) and test this release in +your environment. + +This is a major release, with about 1100 code changes and a hundred or so bug +fixes, but still resulting in a smaller codebase. + +There have been a lot of changes. Here are the highlights: + +- Improved command line parser: terminator `--` handling, UUID recognition, + DOM recognition, red-herring pairs (`foo:bar`), escaped slashes in patterns + (`/one\/two/`), substitutions (`/one\/two/one-two/`), Unicode `U+NNNN` and + `\uNNNN`, escaped entities (`\n`, `\t` etc) for use in + descriptions/annotations, abbreviated day and month names, ISO-8601 + durations (`PT4H`, `P1Y` etc). +- New [virtual tags](/docs/tags.html) `UDA`, `ORPHAN`, `PROJECT`, `PRIORITY`, + and `LATEST`. +- Improved support for DOM references in filters + `task 'due.year = 2015 and due.week > 20' list`. +- New configuration settings `urgency.inherit`, `rule.color.merge`, + `urgency.user.tag.next.coefficient`, `color.uda..none`, `sugar`, + `report..sort:none`, `json.depends.array`. +- Improved urgency: the `urgency.inherit` setting propagates urgency along + dependency chains. +- Improved searching: more powerful regular expressions. +- Improved attribute modifiers: `is`/`isnt` are now consistent exact match + operator equivalents to `==`/`!==`. +- New command [`_unique`{.sample}](/docs/commands/_unique.html), for + generating unique lists of values, and will ultimately replace several + helper commands. +- New command `commands`{.sample}, which lists commands and details about how + they affect [filters](/docs/filter.html), GC, context, and + [syntax](/docs/syntax.html). +- New verbosity tokens `recur` (feedback when a recurring task instance is + created), `unwait` (for when a waiting task becomes visible). +- Improved extensions: zsh completion, Fish shell completion, [add-on + scripts](/tools/#exts) now online. +- Improved documentation: `help` command, man pages, more online docs, + negation `!` operator, sample hook scripts. +- Improved sync: GnuTLS now mandatory, so everyone has the `sync` command. +- Improved JSON `import`/`export` support: free-format JSON, task arrays + assumed (which makes import/export work with out-of-the-box parsers), + dependencies optionally modeled as an array, UUIDs validated, tasks + added/updated without duplication, import from STDIN using `-`. +- Improved performance: less data is read from disk depending on the filter. +- Improved diagnostics: duplicate dependency warnings, multi-task edit + failures, changes to tasks without IDs, certificate file sizes. +- Improved testing: migrated all Perl tests to Python, parallelized test + suite, colorized output, detection of newly passing tests, Python 2.7 and 3 + support, better debug output, Bash test library, stress test tool, no more + disabled tests - everything runs, test coverage is now 87.8%. +- Widespread code cleanup, removal of dead code, C++11 enhancements, improved + portability, merged ISO-8601 and legacy durations, less code, happier + developers. + +For full details, see the ChangeLog file included in the release. The release is +immediately available as a source ~~tarball~~. + +This is a beta release, and is not recommended for stable environments. diff --git a/content/news/news.20150916.md b/content/news/news.20150916.md new file mode 100644 index 00000000..34457b18 --- /dev/null +++ b/content/news/news.20150916.md @@ -0,0 +1,11 @@ +--- +title: "News: Taskwarrior 2.5.0 beta2 Released" +--- + +### Taskwarrior 2.5.0 beta2 Released [2015-09-16]{.small} + +A new beta2 is available for the upcoming 2.5.0 release. + +The release is immediately available as a source ~~tarball~~. + +This is a beta release, and is not recommended for stable environments. diff --git a/content/news/news.20150926.md b/content/news/news.20150926.md new file mode 100644 index 00000000..642f9156 --- /dev/null +++ b/content/news/news.20150926.md @@ -0,0 +1,14 @@ +--- +title: "News: Vramsteg 1.1.0 Released" +--- + +### Vramsteg 1.1.0 Released [2015-09-26]{.small} + +Vramsteg 1.1.0 is released, with bug fixes and 64-bit value support. + +The release is immediately available as a source tarball +[vramsteg-1.1.0.tar.gz](https://gothenburgbitfactory.org/download/vramsteg-1.1.0.tar.gz). + +Vramsteg, from the Swedish framsteg (progress), is a CLI progress bar that can +be used from any script language. It supports color, labels, percentage +completion, elapsed time and estimates. diff --git a/content/news/news.20150927.md b/content/news/news.20150927.md new file mode 100644 index 00000000..a872bf2b --- /dev/null +++ b/content/news/news.20150927.md @@ -0,0 +1,14 @@ +--- +title: "News: Clog 1.2.0 Released" +--- + +### Clog 1.2.0 Released [2015-09-27]{.small} + +Clog 1.2.0 is released, with regular expression improvements and bug fixes. + +The release is immediately available as a source tarball +[clog-1.2.0.tar.gz](https://gothenburgbitfactory.org/download/clog-1.2.0.tar.gz). + +Clog is a colorized log tail utility. It can spot patterns in an input stream +and colorize or suppress the lines. It can also decorate the lines with time- or +date-stamps. diff --git a/content/news/news.20150929.md b/content/news/news.20150929.md new file mode 100644 index 00000000..9f0bc234 --- /dev/null +++ b/content/news/news.20150929.md @@ -0,0 +1,13 @@ +--- +title: "News: answers.tasktools.org Online" +--- + +### answers.tasktools.org Online [2015-09-29]{.small} + +The ~~`answers.tasktools.org`~~ site is online, and providing not only the +answer to your question, but those of many before you. It is becoming a valuable +resource for both beginners and experienced users. + +\ + +[![answers.gothenburgbitfactory.org](/news/images/answers.png){.img-thumbnail}](/news/images/answers.png) diff --git a/content/news/news.20151001.md b/content/news/news.20151001.md new file mode 100644 index 00000000..f0394b0b --- /dev/null +++ b/content/news/news.20151001.md @@ -0,0 +1,230 @@ +--- +title: "News: Activity Digest: September 2015" +--- + +### Activity Digest: September 2015 [2015-10-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in September 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.0). + ++---------------------------------------+---------------------------------------+ +| [2015-09-01]{.small} | - Task: Added | +| | `rc.rules.color.merge` to control | +| | whether combined colors are | +| | merged (default) or overwritten. | +| | This prevents some unusable color | +| | combinations. | +| | - Task: Replaced | +| | `rc.urgency.next.coefficient` | +| | with | +| | `r | +| | c.urgency.user.tag.next.coefficient`. | +| | - [\#1403: Use of \^ in regex | +| | parsed as exponentiate | +| | | +| | operator](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1403) | +| | fixed | +| | - [\#1475: Add possibility to | +| | modify newest | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1475) | +| | fixed | +| | - [\#1640: Intermittent lengthy | +| | delay when starting or completing | +| | a | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1640) | +| | fixed | +| | - [\#1684: Disabled sorting | +| | | +| | option](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1684) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-03]{.small} | - Task: Removed colors that use | +| | underscores (`on_blue`), a | +| | feature deprecated in 2009. | ++---------------------------------------+---------------------------------------+ +| [2015-09-04]{.small} | - Task: Added first man page | +| | references which are deliberately | +| | minimal, and refer to online | +| | resources. | ++---------------------------------------+---------------------------------------+ +| [2015-09-05]{.small} | - Task: Some unit tests were | +| | changed from being disabled to | +| | enabled and marked as \'exected | +| | to fail\'. This means the test | +| | are now run, instead of ignored. | ++---------------------------------------+---------------------------------------+ +| [2015-09-06]{.small} | - Task: If not explicitly stated on | +| | import, values with default | +| | dynamic values (such as modified, | +| | entry or end) can produce a false | +| | notion of incoming \'modified\' | +| | data, where the only difference | +| | between the data in the database | +| | and data being imported is that | +| | the dynamic defaults differ, | +| | which are now ignored. | +| | - Task: Not all commands were | +| | obeying the `rc.color` settng. | +| | - Task: The command line parser can | +| | now detect cases where unwanted | +| | arguments are provided on the | +| | command line. | +| | - [\#1711: task add due:som appears | +| | to be interpreted as | +| | \'s | +| | omeday\'](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1711) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-07]{.small} | - Task: `rc.debug.parser=2` now | +| | shows the full parse tree, | +| | whereas `rc.debug.parser=3` shows | +| | eval processing. | +| | - Task: The `2.4.5` development | +| | branch is renamed to `2.5.0`, | +| | reflecting the scope of the work. | +| | - Task: 2.5.0 beta1 released. | ++---------------------------------------+---------------------------------------+ +| [2015-09-08]{.small} | - Task: All date attributes now | +| | have the same sorting behavior as | +| | `due` dates. | +| | - [\#!708: make no-date \> has-date | +| | for all date | +| | at | +| | tributes](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1708) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-09]{.small} | - [\#1702: segfault in | +| | \~Vi | +| | ewTask()](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1702) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-10]{.small} | - Task: Removed the ability to | +| | build without color support. | +| | - [\#1707: Dom reference for | +| | project not properly | +| | e | +| | valuated](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1707) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-11]{.small} | - Task: The test suite exits with | +| | non-zero when any test fails. | +| | - [\#108: Circular dependency | +| | detection broken for missing | +| | tasks](https://github.com/Gothenb | +| | urgBitFactory/taskwarrior/issues/108) | +| | fixed | +| | - [\#1712: task fails to | +| | | +| | import](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1712) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-12]{.small} | - Task: The `limit:N` feature is no | +| | longer a pseudo-attribute (there | +| | are no others), but is syntactic | +| | sugar that maps to `rc.limit:N`. | +| | - [\#1680: Implicitly parenthesize | +| | argv | +| | | +| | filter](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1680) | +| | fixed | +| | - [\#1716: 42//\' | +| | s | +| | egfaults](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1716) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-13]{.small} | - [\#1710: Sorting not working on | +| | udas](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1710) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-15]{.small} | - Task: Data copying inefficiencies | +| | are fixed, yielding a dramatic | +| | improvement to `import` speed. | +| | - Task: Updated Unicode charcter | +| | list. | +| | - Task: Performance testing | +| | improved | +| | (https://gothenburgbitfa | +| | ctory.org/projects/performance.html). | ++---------------------------------------+---------------------------------------+ +| [2015-09-16]{.small} | - Task: 2.5.0 beta2 released. | +| | - [\#1719: edit: Concurrent | +| | | +| | edits](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1719) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-19]{.small} | - Vramsteg: Added 64-bit | +| | min/max/value support. | +| | - Task: When GC is turned off, | +| | disable the query shortcuts, | +| | which do not apply. | +| | - Task: Holiday files updated. | +| | - Task: The `filter` verbosity | +| | token was lost in the CLI2 | +| | upgrade. | +| | - [\#1723: Command interpretation | +| | displayed | +| | inc | +| | orrectly](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1723) | +| | fixed | +| | - [\#1725: Some generated UUIDs | +| | deemed | +| | | +| | invalid](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1725) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-20]{.small} | - Task: The `new-uuid` verbosity | +| | token is deprecated. | +| | - [\#1686: filter before add | +| | becomes | +| | des | +| | cription](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1686) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-21]{.small} | - [\#1724: modify tags behavior | +| | | +| | changed](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1724) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-22]{.small} | - Task: The `export` command no | +| | longer obeys context. | +| | - Task: TDB2 Task lookup code | +| | improvements yields another | +| | significant `import` speedup. | ++---------------------------------------+---------------------------------------+ +| [2015-09-24]{.small} | - [\#1731: Context can leak into | +| | modif | +| | ications](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1731) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-09-25]{.small} | - Task: Fixed segfault problem on | +| | exit. | ++---------------------------------------+---------------------------------------+ +| [2015-09-26]{.small} | - [Vramsteg: 1.1.0 | +| | | +| | released](/news/news.20150926.html). | +| | - [Clog: 1.2.0 | +| | | +| | released](/news/news.20150927.html). | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20151012.md b/content/news/news.20151012.md new file mode 100644 index 00000000..6af8bda0 --- /dev/null +++ b/content/news/news.20151012.md @@ -0,0 +1,14 @@ +--- +title: "News: Clog 1.2.1 Released" +--- + +### Clog 1.2.1 Released [2015-10-12]{.small} + +Clog 1.2.1 is released, due to a problem with OSX and Xcode 7. + +The release is immediately available as a source tarball +[clog-1.2.1.tar.gz](https://gothenburgbitfactory.org/download/clog-1.2.1.tar.gz). + +Clog is a colorized log tail utility. It can spot patterns in an input stream +and colorize or suppress the lines. It can also decorate the lines with time- or +date-stamps. diff --git a/content/news/news.20151017.md b/content/news/news.20151017.md new file mode 100644 index 00000000..b752e4d1 --- /dev/null +++ b/content/news/news.20151017.md @@ -0,0 +1,11 @@ +--- +title: "News: Taskwarrior 2.5.0 beta3 Released" +--- + +### Taskwarrior 2.5.0 beta3 Released [2015-10-17]{.small} + +A new beta3 is available for the upcoming 2.5.0 release. + +The release is immediately available as a source ~~tarball~~. + +This is a beta release, and is not recommended for stable environments. diff --git a/content/news/news.20151021.md b/content/news/news.20151021.md new file mode 100644 index 00000000..6a8fa7db --- /dev/null +++ b/content/news/news.20151021.md @@ -0,0 +1,67 @@ +--- +title: "News: Taskwarrior 2.5.0 Released" +--- + +### Taskwarrior 2.5.0 Released [2015-10-21]{.small} + +After an intense five months which focused mainly on a more capable command-line +parser, more extension-friendly behavior, and significant improvements to +testing, Taskwarrior 2.5.0 is now released. + +This is a major release, with 1300+ code changes and well over a hundred bug +fixes. We recommend all users upgrade, this release represents a significant +increase in quality. + +There have been a lot of changes. Here are the highlights: + +- Improved command line parser: terminator `--` handling, UUID recognition, + DOM recognition, red-herring pairs (`foo:bar`), escaped slashes in patterns + (`/one\/two/`), substitutions (`/one\/two/one-two/`), Unicode `U+NNNN` and + `\uNNNN`, escaped entities (`\n`, `\t` etc) for use in + descriptions/annotations, abbreviated day and month names, ISO-8601 + durations (`PT4H`, `P1Y` etc). +- New [virtual tags](/docs/tags.html) `UDA`, `ORPHAN`, `PROJECT`, `PRIORITY`, + and `LATEST`. +- Improved support for DOM references in filters + `task 'due.year = 2015 and due.week > 20' list`. +- New configuration settings `urgency.inherit`, `rule.color.merge`, + `urgency.user.tag.next.coefficient`, `color.uda..none`, `sugar`, + `report..sort:none`, `json.depends.array`. +- Improved urgency: the `urgency.inherit` setting propagates urgency along + dependency chains. +- Improved searching: more powerful regular expressions. +- Improved attribute modifiers: `is`/`isnt` are now consistent exact match + operator equivalents to `==`/`!==`. +- New command [`_unique`{.sample}](/docs/commands/_unique.html), for + generating unique lists of values, and will ultimately replace several + helper commands. +- New command `commands`{.sample}, which lists commands and details about how + they affect [filters](/docs/filter.html), GC, context, and + [syntax](/docs/syntax.html). +- New verbosity tokens `recur` (feedback when a recurring task instance is + created), `unwait` (for when a waiting task becomes visible). +- Improved extensions: zsh completion, Fish shell completion, [add-on + scripts](/tools/#exts) now online. +- Improved documentation: `help` command, man pages, more online docs, + negation `!` operator, sample hook scripts. +- Improved sync: GnuTLS now mandatory, so everyone has the `sync` command. +- Improved JSON `import`/`export` support: free-format JSON, task arrays + assumed (which makes import/export work with out-of-the-box parsers), + dependencies optionally modeled as an array, UUIDs validated, tasks + added/updated without duplication, import from STDIN using `-`. +- Improved performance: less data is read from disk depending on the filter. +- Improved diagnostics: duplicate dependency warnings, multi-task edit + failures, changes to tasks without IDs, certificate file sizes. +- Improved testing: migrated all Perl tests to Python, parallelized test + suite, colorized output, detection of newly passing tests, Python 2.7 and 3 + support, better debug output, Bash test library, stress test tool, no more + disabled tests - everything runs, test coverage is now 87.3%. +- Widespread code cleanup, removal of dead code, C++11 enhancements, improved + portability, merged ISO-8601 and legacy durations, less code, happier + developers. + +For full details, see the ChangeLog file included in the release. The release is +immediately available as a source [tarball](/download/task-2.5.0.tar.gz). Binary +packages for your OS will no doubt appear soon. + +Recommended for all users. diff --git a/content/news/news.20151029.md b/content/news/news.20151029.md new file mode 100644 index 00000000..35969575 --- /dev/null +++ b/content/news/news.20151029.md @@ -0,0 +1,23 @@ +--- +title: "News: Taskwarrior Mailing Lists" +--- + +### Taskwarrior Mailing Lists [2015-10-29]{.small} + +The Taskwarrior user and developer mailing lists are back in play. Subscribe and +talk to us: + +- User Discussions: + . +- Developer Discussions: + . + +The mailing lists are an additional communication channel, your original options +remain: + +- Email us at ~~`support@taskwarrior.org`~~. +- User Q & A at ~~`answers.tasktools.org`~~: Submit questions, receive + answers, better answers get voted up. Requires account created at + ~~`bug.tasktools.org`~~. +- IRC `#taskwarrior` on [freenode.net](https://freenode.net/). Publicly logged + on ~~`https://botbot.me/freenode/taskwarrior`~~. diff --git a/content/news/news.20151101.2.md b/content/news/news.20151101.2.md new file mode 100644 index 00000000..eba94ecd --- /dev/null +++ b/content/news/news.20151101.2.md @@ -0,0 +1,17 @@ +--- +title: "News: Cygwin Package Maintainer Needed" +--- + +### Cygwin Package Maintainer Needed [2015-11-01]{.small} + +We're looking for someone to assume the responsibility of packaging Taskwarrior +etc for Cygwin. + +Cygwin doesn't get the care and attention from us that it should. We often skip +releasing on Cygwin because we don't have the equipment and must borrow it, and +furthermore don't use Cygwin day to day, so every package update involves a full +install, and it takes hours. + +The folks who do rely on and enjoy Cygwin deserve timely updates for every +release. Can you do a better job that we have? Know someone who can? Please +[contact us](mailto:support@taskwarrior.org). diff --git a/content/news/news.20151101.md b/content/news/news.20151101.md new file mode 100644 index 00000000..a6e63f18 --- /dev/null +++ b/content/news/news.20151101.md @@ -0,0 +1,129 @@ +--- +title: "News: Activity Digest: October 2015" +--- + +### Activity Digest: October 2015 [2015-11-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in October 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.0). + ++---------------------------------------+---------------------------------------+ +| [2015-10-07]{.small} | - [\#1624: Dateformat wrongly | +| | int | +| | erpreted](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1644) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-10-10]{.small} | - [\#???: clog 1.2.0 fails to | +| | build](https://github. | +| | com/GothenburgBitFactory/clog/issues) | +| | fixed | +| | - Holidata: Added Ecuador dates | +| | - Holidata: Added Colombia dates | +| | - Task: Added Ecuador and Colombia | +| | holidays | +| | - Task: Fixed crash bug in regex | +| | support | +| | - Task: Allows zero-padded | +| | single-digit `rc.dateformat` | +| | elements | ++---------------------------------------+---------------------------------------+ +| [2015-10-11]{.small} | - Taskd: Improved error messages | +| | for the common case where | +| | `task sync init` was skipped | +| | - Taskd: User may now override | +| | `dh_bits`, which has a better | +| | default of 2048 | +| | - Taskd: Per Mozilla guidelines, | +| | now prefers server-side ordering | +| | of ciphers | +| | - Taskd: Removed default support | +| | for broken algorithms (SSLv3, | +| | TLSv1.0 (POODLE), 3DES in CBC | +| | mode, RC4, MD5) | ++---------------------------------------+---------------------------------------+ +| [2015-10-12]{.small} | - Clog: 1.2.1 released | +| | - Vramsteg: 1.1.1 released | ++---------------------------------------+---------------------------------------+ +| [2015-10-13]{.small} | - Task: Fixed very old bug in date | +| | coercion | ++---------------------------------------+---------------------------------------+ +| [2015-10-15]{.small} | - Task: The Bash test framework | +| | gets an update | ++---------------------------------------+---------------------------------------+ +| [2015-10-16]{.small} | - [\#1739: Dates misinterpreted | +| | when no dateformat | +| | | +| | active](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1739) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-10-17]{.small} | - Tasksh: Automatic report and UDA | +| | setup for `review` command | +| | - Tasksh: The `diag` command is now | +| | complete | +| | - Task: 2.5.0.beta3 released | ++---------------------------------------+---------------------------------------+ +| [2015-10-18]{.small} | - Tasksh: Inherits the parallel | +| | test framework from taskwarrior | +| | - Tasksh: The `exec` (or `!`) | +| | command is now complete | +| | - Tasksh: The `review` command now | +| | takes a numeric argument | +| | indicating how many tasks should | +| | be reviewed, e.g. `review 10` | +| | - [\#1740: on-modify hooks fail if | +| | `date.iso` is not | +| | set](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1740) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-10-21]{.small} | - [Task: 2.5.0 | +| | | +| | released](/news/news.20151021.html) | +| | - Task: 2.5.1 begins, which will be | +| | a bugfix and performance release | ++---------------------------------------+---------------------------------------+ +| [2015-10-24]{.small} | - Task: JSON decoder performance | +| | increased | ++---------------------------------------+---------------------------------------+ +| [2015-10-28]{.small} | - Task: Code test coverage raised | +| | to 90.6%, which helps find | +| | problems | +| | - Task: Lots of unused code removed | ++---------------------------------------+---------------------------------------+ +| [2015-10-29]{.small} | - Task: Now defaults to 256-colors | +| | on all platforms | +| | - Task: The `columns` command now | +| | shows whether an attribute is | +| | modifiable or read only | +| | - Task: Mailing list for user | +| | discussions back in use: | +| | . | +| | - Task: Mailing list for developer | +| | discussions back in use: | +| | . | ++---------------------------------------+---------------------------------------+ +| [2015-10-30]{.small} | - [\#1728: Task: Use | +| | Task::identifier to reference the | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1728) | +| | fixed | +| | - [\#1744: CmdContext uses a mix of | +| | both throw and std::cout to | +| | convey | +| | | +| | errors](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1744) | +| | fixed | +| | - Task: The `diagnostics` command | +| | now finds broken references | +| | between recurring task instances | +| | and templates | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20151201.md b/content/news/news.20151201.md new file mode 100644 index 00000000..d0b91485 --- /dev/null +++ b/content/news/news.20151201.md @@ -0,0 +1,162 @@ +--- +title: "News: Activity Digest: November 2015" +--- + +### Activity Digest: November 2015 [2015-12-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in November 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.0). + ++---------------------------------------+---------------------------------------+ +| [2015-11-01]{.small} | - Task: Migrated code from using | +| | C-style string formatting to | +| | C++11-style. | +| | - Task: Began resolving | +| | [Flint++](https: | +| | //github.com/L2Program/FlintPlusPlus) | +| | issues. | ++---------------------------------------+---------------------------------------+ +| [2015-11-02]{.small} | - Task: Significant performance | +| | enhancements (\~45-55%) in string | +| | colorization. | +| | - Task: Many C++11 changes reverted | +| | because it was discovered that | +| | Cygwin doesn\'t support several | +| | C++11 features with GCC 4.9 | ++---------------------------------------+---------------------------------------+ +| [2015-11-03]{.small} | - Task: Performance enhancements | +| | (\~3%) in JSON composition. | ++---------------------------------------+---------------------------------------+ +| [2015-11-04]{.small} | - Task: Performance enhancements | +| | (\~1-3%) in ID/UUID lookups. | +| | - Task: Performance enhancements | +| | (\~7-12%) by changing Task | +| | inheritance and enabling move | +| | semantics | ++---------------------------------------+---------------------------------------+ +| [2015-11-06]{.small} | - Task: Fixed broken build for | +| | older GCC on Cygwin | ++---------------------------------------+---------------------------------------+ +| [2015-11-07]{.small} | - [\#100: Dates in the far future | +| | give bad estimates in | +| | | +| | burndown](https://github.com/Gothenb | +| | urgBitFactory/taskwarrior/issues/100) | +| | fixed | +| | - [\#347: Estimated completion in | +| | burndown.daily shows impossible | +| | | +| | results](https://github.com/Gothenb | +| | urgBitFactory/taskwarrior/issues/347) | +| | fixed | +| | - [\#1345: some recurring intervals | +| | reset due time to | +| | | +| | midnight](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1345) | +| | fixed | +| | - [\#1473: Difference in how | +| | relative dates are specified in | +| | report filters since | +| | | +| | 2.3.0](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1473) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-08]{.small} | - Taskd: Inherited code fixes and | +| | enhancements from Taskwarrior | +| | codebase | +| | - Task: Performance enhancements | +| | (\~4-21%) gained from rRelocating | +| | TDB2::gc to TDB2::load\_tasks | +| | almost eliminates GC processing | +| | times, reducing them by \~96% | +| | - [\#106: The recurrence value | +| | \'2m\' is not | +| | valid](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/106) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-10]{.small} | - [\#1608: Wrong urgency for first | +| | report after reviving | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1608) | +| | fixed | +| | - Task: Performance enhancements | +| | (minimal) made by reordering date | +| | parsing formats, most common | +| | first | ++---------------------------------------+---------------------------------------+ +| [2015-11-11]{.small} | - Task: Performance enhancements | +| | (9-45%) with file writes on | +| | high-latency systems | ++---------------------------------------+---------------------------------------+ +| [2015-11-12]{.small} | - Task: Performance enhancements | +| | (\~20%) for data load by | +| | improving the quoted string | +| | parsing | ++---------------------------------------+---------------------------------------+ +| [2015-11-15]{.small} | - Task: Added missing colors from | +| | some themes | +| | - [\#1747: task info causes | +| | | +| | segfault](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1747) | +| | fixed | +| | - [\#1748: some commands show color | +| | codes when | +| | re | +| | directed](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1748) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-16]{.small} | - [\#1526: Dates formatted as | +| | \".age\", \".remaining\", or | +| | \".countdown\" often give blank | +| | | +| | results](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1526) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-17]{.small} | - Task: Fixed a race condition in | +| | the test suite that caused odd | +| | test failure counts | +| | - [\#1452: The \'age\' format | +| | rounds in odd | +| | ways](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1452) | +| | fixed | +| | - [\#1507: Unable to assign a | +| | completed task as | +| | de | +| | pendency](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1507) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-18]{.small} | - [\#1682: rc override to | +| | non-existent alternate rc quietly | +| | uses | +| | | +| | default](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1682) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-11-22]{.small} | - Task: Performance enhancements | +| | (\~2%) to JSON encoding, using | +| | lookup table | ++---------------------------------------+---------------------------------------+ +| [2015-11-24]{.small} | - Task: Performance enhancements by | +| | reducing string copies un | +| | `journal.info` lookups in | +| | `undo.data` | +| | - [\#1753: zsh completion: | +| | zregexparse:4: not enough regex | +| | | +| | argument](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1753) | +| | fixed | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160101.md b/content/news/news.20160101.md new file mode 100644 index 00000000..c0e07f49 --- /dev/null +++ b/content/news/news.20160101.md @@ -0,0 +1,119 @@ +--- +title: "News: Activity Digest: December 2015" +--- + +### Activity Digest: December 2015 [2016-01-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in December 2015. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.1). + ++---------------------------------------+---------------------------------------+ +| [2015-12-02]{.small} | - timewarrior: Work began on | +| | sketching out a time-tracking | +| | solution, to integrate with | +| | task - details coming soon | ++---------------------------------------+---------------------------------------+ +| [2015-12-07]{.small} | - taskwarrior.org: Updated | +| | [tools](/tools/index.html) page | +| | with taskwarrior-pomodoro | +| | compatibility information | ++---------------------------------------+---------------------------------------+ +| [2015-12-16]{.small} | - taskwarrior.org: Updated | +| | [tools](/support/index.html) page | +| | with IRC logging link | +| | - task: UDA indicator column did | +| | not properly default to \'U\' | +| | fixed | +| | - task: `make install` was not | +| | installing the `license.txt` file | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-12-18]{.small} | - Holidata: missing `de-AT` data | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-12-20]{.small} | - task: Removed task.fish arguments | +| | until TW-1404 is fixed | ++---------------------------------------+---------------------------------------+ +| [2015-12-21]{.small} | - Holidata: `de-DE` errors fixed | ++---------------------------------------+---------------------------------------+ +| [2015-12-22]{.small} | - [\#1762: add defined languages | +| | | +| | JAPANESE](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1762) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2015-12-23]{.small} | - [\#100: Log taskd messages to | +| | stdout if launched by | +| | | +| | systemd](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/100) | +| | fixed | +| | - [\#110: Question: About | +| | | +| | src/tls/\*](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/110) | +| | fixed | +| | - [\#1757: taskwarrior 2.5.0 can | +| | not compile FreeBSD | +| | 10.1](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1757) | +| | fixed | +| | - tasksh: Changed key assignments: | +| | `/r` for review, `s` for | +| | skip | +| | - taskd: Refactored list functions | +| | for efficiency | ++---------------------------------------+---------------------------------------+ +| [2015-12-25]{.small} | - taskwarrior.org: Updated | +| | [tools](/tools/index.html) page | +| | now that Mirakel no longer | +| | supports Taskserver | ++---------------------------------------+---------------------------------------+ +| [2015-12-26]{.small} | - [\#1766: Indian Holiday Calendar | +| | (Master | +| | Holi | +| | dayFile)](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1766) | +| | fixed | +| | - Holidata: Added `en-IN` data | ++---------------------------------------+---------------------------------------+ +| [2015-12-28]{.small} | - taskwarrior.org: Updated | +| | [ | +| | columns](/docs/commands/columns.html) | +| | page which was missing | +| | information | +| | - task: Date attributes now have a | +| | `relative` format, so address | +| | issues with `remaining` and | +| | `countdown` not providing | +| | complete coverage | ++---------------------------------------+---------------------------------------+ +| [2015-12-30]{.small} | - taskwarrior.org: Updated | +| | [urgency](/docs/urgency.html) | +| | page which was missing | +| | information | +| | - task: No longer hardcodes libc++ | +| | on Darwin for users still using | +| | GCC | +| | - task: Include sys/syslimits.h on | +| | OS X | ++---------------------------------------+---------------------------------------+ +| [2015-12-31]{.small} | - [\#1773: PATH\_MAX isn\'t defined | +| | in FS.cpp in some versions of OS | +| | X](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1773) | +| | fixed | +| | - [\#1774: REG\_ENHANCED, used in | +| | RX.cpp, isn\'t defined in all | +| | versions of | +| | | +| | Darwin](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1774) | +| | fixed | +| | - Task: Improved tests that always | +| | break at EOY | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160201.md b/content/news/news.20160201.md new file mode 100644 index 00000000..80ad4f01 --- /dev/null +++ b/content/news/news.20160201.md @@ -0,0 +1,177 @@ +--- +title: "News: Activity Digest: January 2016" +--- + +### Activity Digest: January 2016 [2016-02-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in January 2016. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.1). + ++---------------------------------------+---------------------------------------+ +| [2016-01-04]{.small} | - clog: Code cleanup, inherited | +| | fixes and tests from task | +| | - taskd: The pki scripts now | +| | respect expiration date | ++---------------------------------------+---------------------------------------+ +| [2016-01-05]{.small} | - flod: Began building on-demand | +| | system | +| | - taskwarrior.org: Added `systemd` | +| | integration to the [taskserver | +| | co | +| | ntrol](/docs/taskserver/control.html) | +| | page | ++---------------------------------------+---------------------------------------+ +| [2016-01-08]{.small} | - task: Fix invalid context command | +| | example in man page fixed | ++---------------------------------------+---------------------------------------+ +| [2016-01-09]{.small} | - task: Removed lots of obsolete | +| | and unused code | ++---------------------------------------+---------------------------------------+ +| [2016-01-11]{.small} | - [\#23: add review option | +| | (m)odify](https://github.com/Goth | +| | enburgBitFactory/taskshell/issues/23) | +| | fixed | +| | - [\#1729: Directories in | +| | .task/hooks should not be | +| | reported as invalid | +| | | +| | hooks](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1729) | +| | fixed | +| | - [\#1738: Starting recurring task | +| | starts all | +| | rec | +| | urrences](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1738) | +| | fixed | +| | - [\#1758: calendar gives an error | +| | when context is | +| | set](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1758) | +| | fixed | +| | - [\#1759: context with no | +| | subcommand should do | +| | s | +| | omething](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1759) | +| | fixed | +| | - [\#1760: Error on detection of | +| | BOM in | +| | | +| | files](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1760) | +| | fixed | +| | - [\#1765: Warning \"ignoring | +| | return value of 'int ftruncate\" | +| | while doing make on | +| | xubu | +| | ntu15.10](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1765) | +| | fixed | +| | - [\#1772: CMakeLists shouldn\'t | +| | hardcode libc++ on | +| | | +| | Darwin](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1772) | +| | fixed | +| | - [\#1776: cleanup of diag | +| | | +| | output](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1776) | +| | fixed | +| | - task: Logic that determined | +| | `BLOCKING` and `BLOCKED` tasks | +| | that was different in two | +| | locations fixed | +| | - taskwarrior.org: Added | +| | `on-modify.timetrack.pl` to the | +| | [tools](/tools/index.html) page | ++---------------------------------------+---------------------------------------+ +| [2016-01-12]{.small} | - [\#1743: Description cannot | +| | contain improper | +| | | +| | ordinals](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1743) | +| | fixed | +| | - taskd: New pki script for | +| | checking cert expiration | +| | - gothenburgbitfactory.org: Updated | +| | `clog` homebrew instructions | ++---------------------------------------+---------------------------------------+ +| [2016-01-15]{.small} | - task: OpenBSD also puts `libuuid` | +| | functions inside `libc` fixed | +| | - taskd: Large improvements to the | +| | pki scripts | +| | - taskwarrior.org: Better defaults | +| | for the [taskserver | +| | co | +| | ntrol](/docs/taskserver/control.html) | +| | page | ++---------------------------------------+---------------------------------------+ +| [2016-01-16]{.small} | - anomaly: The signal and system | +| | rections were switched fixed | +| | - anomaly: Incorrect error message | +| | wording | +| | - anomaly: Improved C++11 | +| | CppCoreGuidelines compliance | +| | - clog: Improved C++11 | +| | CppCoreGuidelines compliance | +| | - clog: Improved handling for | +| | suppressed lines, with | +| | documentation updates | +| | - task: Missing include that broke | +| | Cygwin fixed | +| | - vramsteg: Improved C++11 | +| | CppCoreGuidelines compliance | +| | - vramsteg: Cannot trap SIGKILL | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2016-01-18]{.small} | - common: Began work on breaking | +| | out code shared between projects | +| | into a separate repository, to | +| | reduce bug fix latency and | +| | duplication | +| | - task: Bad link in man pages fixed | ++---------------------------------------+---------------------------------------+ +| [2016-01-23]{.small} | - [\#107: Bash dependency not | +| | | +| | documented](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/107) | +| | fixed | +| | - task: The text certs all expired | +| | on the 19th fixed | +| | - task: Bug where | +| | \'rc.allow.empty.filter\' was not | +| | behaving properly fixed | +| | - task: The `task sync init` | +| | command now uploads all tasks, | +| | not just pending tasks | +| | - taskd: Modified code to allow a | +| | `subtype:` message header without | +| | ill effects, allowing for the | +| | `sync` message to have | +| | speicalized options | ++---------------------------------------+---------------------------------------+ +| [2016-01-27]{.small} | - task: Man page bugs fixed | ++---------------------------------------+---------------------------------------+ +| [2016-01-28]{.small} | - taskwrrior.org: Unique page | +| | titles for more readable | +| | bookmarking | ++---------------------------------------+---------------------------------------+ +| [2016-01-30]{.small} | - flod: Central dispatcher replaced | ++---------------------------------------+---------------------------------------+ +| [2016-01-31]{.small} | - [\#1780: The columns.t unit test | +| | fails two tests after 2300 | +| | | +| | local](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1780) | +| | fixed | +| | - task: Now delegates attribute | +| | modification to `Column` objects, | +| | which will allow a whole class of | +| | bugs to be fixed | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160205.md b/content/news/news.20160205.md new file mode 100644 index 00000000..dd43acb2 --- /dev/null +++ b/content/news/news.20160205.md @@ -0,0 +1,14 @@ +--- +title: "News: Activity Digest: January 2016" +--- + +### Taskwarrior 2.5.1 Beta Released [2016-02-05]{.small} + +This release is a bug-fix, code cleanup and performance release only. There are +no new features, but the existing features all work a little more reliably, and +a lot faster. + +For full details, see the ChangeLog file included in the release. The release is +immediately available as a source [tarball](/download/task-2.5.1.tar.gz). + +This is a beta release, and is not recommended for stable environments. diff --git a/content/news/news.20160209.md b/content/news/news.20160209.md new file mode 100644 index 00000000..9cbd453f --- /dev/null +++ b/content/news/news.20160209.md @@ -0,0 +1,26 @@ +--- +title: "News: Workflow Study" +--- + +### Taskwarrior Workflow Study [2016-02-09]{.small} + +Taskwarrior aims to provide a toolkit of various capabilities, which can be +cherry-picked to support many custom methodologies. + +We have learned over the years that everyone uses it differently, and for +different things. There is a lot to be learned from how someone uses software, +the features they use, and the ones they do not. + +So we are asking you to tell us how you use Taskwarrior, what for, which +features, but more importantly *why* your choices make sense to you. If you can +take a few minutes, please send a summary to +and we\'ll put it online with the others. Who knows what will emerge from this. + +Here are the first few workflow details. Clearly we have not learned what +questions are important yet, or how to present the information, but this will +change. + +[Taskwarrior workflow](/docs/workflow.html). + +Please tell us your workflow. It\'s alsmost certain that you have something +unique to share. diff --git a/content/news/news.20160224.md b/content/news/news.20160224.md new file mode 100644 index 00000000..bae441bd --- /dev/null +++ b/content/news/news.20160224.md @@ -0,0 +1,20 @@ +--- +title: "News: Taskwarrior 2.5.1 Released" +--- + +### Taskwarrior 2.5.1 Released [2016-02-24]{.small} + +Taskwarrior 2.5.1 is released. Although this is a minor release, it contains +many bug fixes and performance enhancements. There have been a lot of changes. +Here are the new features: + +- Nope + +There aren\'t any, this is a bug fix and performance release. We just wanted to +make it all work better. Don\'t you just wish everyone did this once in a while? + +For full details, see the ChangeLog file included in the release. The release is +immediately available as a source [tarball](/download/task-2.5.1.tar.gz). Binary +packages for your OS will no doubt appear soon. + +Recommended for all users, because it just works better. diff --git a/content/news/news.20160225.md b/content/news/news.20160225.md new file mode 100644 index 00000000..6c24f6d1 --- /dev/null +++ b/content/news/news.20160225.md @@ -0,0 +1,29 @@ +--- +title: "News: Taskwarrior for Android Released" +--- + +### Taskwarrior for Android Released [2016-02-25]{.small} + +Author Konstantin Vorobyev has created an Android client with Syncing and many +other features. + +[![Taskwarrior for +Android](/news/images/twa1.png){.img-thumbnail}](/news/images/twa1.png) +[![Taskwarrior for +Android](/news/images/twa2.png){.img-thumbnail}](/news/images/twa2.png) +[![Taskwarrior for +Android](/news/images/twa3.png){.img-thumbnail}](/news/images/twa3.png) +[![Taskwarrior for +Android](/news/images/twa4.png){.img-thumbnail}](/news/images/twa4.png) +[![Taskwarrior for +Android](/news/images/twa5.png){.img-thumbnail}](/news/images/twa5.png) + +Taskwarrior for Android has an embedded copy of Taskwarrior, and so inherits all +the behaviors. Take a look at [Taskwarrior for +Android](https://play.google.com/store/apps/details?id=kvj.taskw) on Google +Play. + +Taskwarrior for Android is open source, and can be found on +[bitbucket.org/kvorobyev/taskwarriorandroid](https://bitbucket.org/kvorobyev/taskwarriorandroid/wiki/Home). + +Congratulations Konstantin! diff --git a/content/news/news.20160301.md b/content/news/news.20160301.md new file mode 100644 index 00000000..6032a805 --- /dev/null +++ b/content/news/news.20160301.md @@ -0,0 +1,166 @@ +--- +title: "News: Activity Digest: February 2016" +--- + +### Activity Digest: February 2016 [2016-03-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in February 2016. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/v2.5.1). + ++---------------------------------------+---------------------------------------+ +| [2016-02-01]{.small} | - [\#236: short help | +| | text](https://github.com/Gothenb | +| | urgBitFactory/taskwarrior/issues/236) | +| | fixed | +| | - task: Attribute modification | +| | delegated to tpye-specific | +| | objects | +| | - task: UDA definitions made more | +| | robust | ++---------------------------------------+---------------------------------------+ +| [2016-02-02]{.small} | - [\#1721: Inconsistent failure | +| | mode on invalid task | +| | id](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1721) | +| | fixed | +| | - [\#1734: Setting wait date on | +| | status:completed / | +| | status | +| | :deleted](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1734) | +| | fixed | +| | - [\#1778: \'\\\' at end of | +| | description in \'task edit\' | +| | merges task with following | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1778) | +| | fixed | +| | - [\#1787: Removing the due date of | +| | a task with no due date modifies | +| | the | +| | task](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1787) | +| | fixed | +| | - task: Various attribute accessors | +| | were autovivifying, only to have | +| | the attribute removed later, | +| | which is silly | ++---------------------------------------+---------------------------------------+ +| [2016-02-03]{.small} | - libshared: FS gained automatic | +| | BOM-removal logic | +| | - task: Assorted C++11-isms | +| | embraced | +| | - task: DOM Object demoted to | +| | functions | ++---------------------------------------+---------------------------------------+ +| [2016-02-05]{.small} | - task: 2.5.1 beta1 released | ++---------------------------------------+---------------------------------------+ +| [2016-02-06]{.small} | - anomaly: Test scripts copied to | +| | build dir | +| | - clog: Test scripts copied to | +| | build dir | +| | - clog: Fixed broken `run_all` | +| | script | +| | - flod2: Test scripts copied to | +| | build dir | +| | - flod2: Fixed broken `run_all` | +| | script | +| | - libshared: Fixed broken `run_all` | +| | script | +| | - taskd: Fixed broken `run_all` | +| | script | +| | - tasksh: Fixed broken `run_all` | +| | script | +| | - timew: Fixed broken `run_all` | +| | script | +| | - vitapi: Fixed broken `run_all` | +| | script | +| | - vramsteg: Fixed broken `run_all` | +| | script | ++---------------------------------------+---------------------------------------+ +| [2016-02-07]{.small} | - Holidata.net: Added `sk-SK` | +| | locale | ++---------------------------------------+---------------------------------------+ +| [2016-02-08]{.small} | - [\#1792: Task sync failed: | +| | \"Either your credentials are | +| | incorrect, or your account | +| | doesn\'t exist on the | +| | Tasks | +| | erver.\"](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1792) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2016-02-13]{.small} | - task: Some dates were being | +| | parsed twice | ++---------------------------------------+---------------------------------------+ +| [2016-02-14]{.small} | - libshared: ISO8601 date handling | +| | now integrated and decoupled as | +| | Datetime | ++---------------------------------------+---------------------------------------+ +| [2016-02-16]{.small} | - libshared: ISO8601 duration | +| | handling now integrated and | +| | decoupled as Duration | ++---------------------------------------+---------------------------------------+ +| [2016-02-20]{.small} | - task: Dev meetup in NYC - liquids | +| | consumed | +| | - taskd: Inherited fixes and | +| | performance improvements from | +| | Taskwarrior | ++---------------------------------------+---------------------------------------+ +| [2016-02-21]{.small} | - [\#104: Unrecognized taskwarrior | +| | file | +| | format](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/104) | +| | fixed | +| | - taskd: Updated demo scripts | ++---------------------------------------+---------------------------------------+ +| [2016-02-22]{.small} | - task: Removed circularity | +| | checking on `add` | ++---------------------------------------+---------------------------------------+ +| [2016-02-23]{.small} | - [\#1733: Parsing bug when doing | +| | \"task | +| | | +| | undo\"](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1733) | +| | fixed | +| | - [\#1797: one task eaten all my | +| | RAM](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1797) | +| | fixed | +| | - task: Found that tag attribute | +| | column width was never actually | +| | calculated | +| | - task: Found that line hyphenation | +| | has been broken for a long time | ++---------------------------------------+---------------------------------------+ +| [2016-02-24]{.small} | - task: [2.5.1 | +| | | +| | released](/news/news.20160224.html) | +| | which focused entirely on bug | +| | fixes and performance | +| | - task: 2.6.0 development begins, | +| | intending to greatly improve | +| | recurrence | +| | - task: Removed deprecated | +| | `alias._query` default | ++---------------------------------------+---------------------------------------+ +| [2016-02-25]{.small} | - task: Eliminated `sprintf` | ++---------------------------------------+---------------------------------------+ +| [2016-02-28]{.small} | - [\#65: sync conflict deleted all | +| | annotations of the | +| | task](https://github.com/Gothe | +| | nburgBitFactory/taskserver/issues/65) | +| | fixed | +| | - [\#1765: Warning \"ignoring | +| | return value of 'int ftruncate\" | +| | while doing make on | +| | xubu | +| | ntu15.10](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1765) | +| | fixed | +| | - taskd: Updated expired test certs | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160401.md b/content/news/news.20160401.md new file mode 100644 index 00000000..38cd3c28 --- /dev/null +++ b/content/news/news.20160401.md @@ -0,0 +1,132 @@ +--- +title: "News: Activity Digest: March 2016" +--- + +### Activity Digest: March 2016 [2016-04-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in March 2016. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the [full Git +history](https://github.com/GothenburgBitFactory/taskwarrior/commits/2.6.0). + ++---------------------------------------+---------------------------------------+ +| [2016-03-01]{.small} | - libshared: Gained JSON parser | +| | from Taskwarrior | ++---------------------------------------+---------------------------------------+ +| [2016-03-02]{.small} | - Guides: New repo for Taskwarrior | +| | presentations online | ++---------------------------------------+---------------------------------------+ +| [2016-03-13]{.small} | - Timewarrior: Design outline | +| | complete | ++---------------------------------------+---------------------------------------+ +| [2016-03-16]{.small} | - libshared: Renamed from the older | +| | \'common\' - a git submodule to | +| | share code across projects | ++---------------------------------------+---------------------------------------+ +| [2016-03-17]{.small} | - Flod: Added support for | +| | submodules, using | +| | `git clone --recursive ...` | +| | - Flod2: Migrated to use | +| | `libshared.git` | +| | - libshared: Can now join strings | +| | - libshared: Log object added | +| | - Timewarrior: Migrated to use | +| | `libshared.git` | +| | - Timewarrior: Repo goes public | ++---------------------------------------+---------------------------------------+ +| [2016-03-19]{.small} | - Taskwarrior.org: Added | +| | ~~`estact`~~ to the | +| | [Tools](/tools/index.html) page | +| | - Timewarrior: Now has a working | +| | `help` command | ++---------------------------------------+---------------------------------------+ +| [2016-03-20]{.small} | - Task: Gained a new `purge` | +| | command to eliminate old data | +| | - Timewarrior: Can now load data | +| | - Timewarrior: Now has a working | +| | `extensions` command | ++---------------------------------------+---------------------------------------+ +| [2016-03-21]{.small} | - libshared: Duration class can now | +| | format in a human-readable way | +| | - Timewarrior: Now tracks time | +| | using a `start` and `stop` | +| | command | ++---------------------------------------+---------------------------------------+ +| [2016-03-22]{.small} | - [\#1796: Implementation of | +| | circular dependency detection is | +| | ine | +| | fficient](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1796) | +| | fixed | +| | - [\#1810: Closing a reopened task | +| | does not update the end | +| | time](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1810) | +| | fixed | +| | - Timewarrior: Now has a working | +| | `log` command | +| | - Timewarrior: Now has a working | +| | `export` command | +| | - Timewarrior: Now has a working | +| | `continue` command | +| | - Timewarrior: Now has a working | +| | default command | ++---------------------------------------+---------------------------------------+ +| [2016-03-23]{.small} | - [\#103: Incorrect error when org | +| | does not | +| | exists](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/103) | +| | fixed | +| | - Taskwarrior.org: Added mailing | +| | lists to the contribution page | ++---------------------------------------+---------------------------------------+ +| [2016-03-25]{.small} | - Timewarrior: Now has a working | +| | `stop` command | +| | - Timewarrior: Added the extension | +| | API | ++---------------------------------------+---------------------------------------+ +| [2016-03-26]{.small} | - [\#50: Log when file management | +| | fails](https://github.com/Gothe | +| | nburgBitFactory/taskserver/issues/50) | +| | fixed | +| | - [\#115: Throw error when config | +| | file is missing or not | +| | | +| | readable](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/115) | +| | fixed | +| | - Taskwarrior.org: Added [First | +| | Time | +| | | +| | Contributor](/docs/first_time.html) | +| | page/ | +| | - Timewarrior: Now has a working | +| | `diagnostics` command | +| | - Timewarrior: Added the first | +| | color theme | +| | - Timewarrior: Added the first | +| | holiday file | +| | - Timewarrior: Added a debug report | +| | to test the extension API | ++---------------------------------------+---------------------------------------+ +| [2016-03-27]{.small} | - Flod: Documentation fixes | +| | - libshared: Now has a split | +| | function that coallesces | +| | whitespace | +| | - task/libshared: Now knows when | +| | \'juhannus\' is | ++---------------------------------------+---------------------------------------+ +| [2016-03-28]{.small} | - libshared: Table now switches to | +| | hyphen underlines when output is | +| | not to a TTY | +| | - Timewarrior: Now colorizes tags | +| | - Timewarrior: Now has a working | +| | `tags` command | ++---------------------------------------+---------------------------------------+ +| [2016-03-29]{.small} | - All: Colored test script output | +| | propagated to all projects | +| | - Task: Deprecated the `DUETODAY` | +| | virtual tag | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160407.md b/content/news/news.20160407.md new file mode 100644 index 00000000..5930ab33 --- /dev/null +++ b/content/news/news.20160407.md @@ -0,0 +1,15 @@ +--- +title: "News: Taskwarrior running under \"Bash on Ubuntu on Windows\"" +--- + +### Taskwarrior running under \"Bash on Ubuntu on Windows\" [2016-04-07]{.small} + +Today we could verify that Taskwarrior works out of the box under \"Bash on +Ubuntu on Windows 10\". Either by installing it via apt-get (which pulls the +regular Ubuntu package) or by compiling it. No changes needed to the source +code. You compile it as you would do it on native Ubuntu. A few tests were +failing. But no major ones. Enjoy the screenshot and enjoy the thoughts of being +able to abandon Cygwin soon, if you are using Taskwarrior on Windows. + +[![Bash on Ubuntu on +Windows](/news/images/win10-thumb.png){.img-thumbnail}](/news/images/win10.png) diff --git a/content/news/news.20160501.md b/content/news/news.20160501.md new file mode 100644 index 00000000..b24081d9 --- /dev/null +++ b/content/news/news.20160501.md @@ -0,0 +1,202 @@ +--- +title: "News: Activity Digest: April 2016" +--- + +### Activity Digest: April 2016 [2016-05-01]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in the Taskwarrior project. Here is what happened in April 2016. + +This is not a complete list of all activity, just work that results in a +non-trivial change. For a full list, see the git history of all the projects. + ++---------------------------------------+---------------------------------------+ +| [2016-04-01]{.small} | - [\#1811: Support additional | +| | countable | +| | in | +| | finities](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1811) | +| | reported | +| | - [\#1812: Urgency computations | +| | involving NaN are | +| | i | +| | ncorrect](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1812) | +| | reported | ++---------------------------------------+---------------------------------------+ +| [2016-04-02]{.small} | - [\#1813: taskrc(5) manpage: | +| | spurious \"pri.\" in | +| | rule.preceden | +| | ce.color](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1813) | +| | fixed | +| | - libshared: Added support for | +| | informal time: `8am`, `2:34pm` | +| | \... | +| | - taskwarrior.org: Compressed all | +| | the images on the site. | +| | - taskwarrior.org: Replaced email | +| | addresses with mailing lists. | ++---------------------------------------+---------------------------------------+ +| [2016-04-03]{.small} | - [\#1814: The info command uses | +| | \'0\' to reference dependencies | +| | on non-pending | +| | | +| | tasks](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1814) | +| | fixed | +| | - Task: When a task ID is not | +| | available, a UUID is now used | +| | instead. | ++---------------------------------------+---------------------------------------+ +| [2016-04-04]{.small} | - libshared: Added JSON2 SAX | +| | parser. | ++---------------------------------------+---------------------------------------+ +| [2016-04-05]{.small} | - Timewarrior: Learns the `:quiet` | +| | hint. | ++---------------------------------------+---------------------------------------+ +| [2016-04-08]{.small} | - Guides: Added OpenRheinRuhr | +| | presentation. | +| | - Task: Runs under the Windows 10 | +| | Linux Subsystem. | ++---------------------------------------+---------------------------------------+ +| [2016-04-09]{.small} | - [\#42: Remove user command says | +| | user does not | +| | exist](https://github.com/Gothe | +| | nburgBitFactory/taskserver/issues/42) | +| | fixed | +| | - [\#102: After creating a user | +| | aparently successful taskd says: | +| | User does not | +| | exists](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/102) | +| | fixed | +| | - [\#117: Wrong systemd target, | +| | taskd can fail if | +| | multi-user.target is up earlier | +| | than the | +| | | +| | network](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/117) | +| | fixed | +| | - Task: Now uses the CMake | +| | CXXSniffer code. | +| | - Taskd: Now uses the CMake | +| | CXXSniffer code. | +| | - Taskd: Now builds all source as a | +| | temp library against which to | +| | link tests, for faster builds. | +| | - Timewarrior: Learned to parse | +| | it\'s own command line. | ++---------------------------------------+---------------------------------------+ +| [2016-04-10]{.small} | - Timewarrior: Gains an extension | +| | API. | ++---------------------------------------+---------------------------------------+ +| [2016-04-11]{.small} | - libshared: Added support for | +| | `socq`, `eocq`, `socy` and | +| | `eocy`. | +| | - libshared: Removed Datetime | +| | abbreviations for some dates, | +| | i.e. `socm`, `socy`. | +| | - Timewarrior: Gains a `continue` | +| | command. | ++---------------------------------------+---------------------------------------+ +| [2016-04-13]{.small} | - Guides: Added FOSS-GBG | +| | presentation. | ++---------------------------------------+---------------------------------------+ +| [2016-04-15]{.small} | - [\#1817: Calendar underline on | +| | Day | +| | | +| | padding](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1817) | +| | fixed | +| | - libshared: Datetime can now work | +| | in look-forward or look-behind | +| | mode, i.e. what does `Monday` | +| | mean? | +| | - libshared: Datetime disambiguated | +| | `som` from `someday`. | +| | - Task: Removed a broken flapping | +| | test. | +| | - Timewarrior: Defined what a | +| | filter is, and it\'s very simple. | ++---------------------------------------+---------------------------------------+ +| [2016-04-16]{.small} | - [\#118: Shebang | +| | issue](https://github.com/Gothen | +| | burgBitFactory/taskserver/issues/118) | +| | fixed | ++---------------------------------------+---------------------------------------+ +| [2016-04-17]{.small} | - Timewarrior: Data access resolved | +| | down to `addInterval` and | +| | `deleteInterval`. Simple. | +| | - Timewarrior: Properly handles | +| | intervals that span data files. | ++---------------------------------------+---------------------------------------+ +| [2016-04-18]{.small} | - Timewarrior: Learned that | +| | `day on` and `day off` are just | +| | holiday overrides. | ++---------------------------------------+---------------------------------------+ +| [2016-04-20]{.small} | - libshared: `Pig::getHMS` can now | +| | read formally-specified time. | +| | - Timewarrior: Learned how expand | +| | weekday exclusions into a set of | +| | date ranges. | ++---------------------------------------+---------------------------------------+ +| [2016-04-21]{.small} | - Guides: Taskserver setup PDF | +| | completed. | +| | - Timewarrior: Gained holiday file | +| | support. | ++---------------------------------------+---------------------------------------+ +| [2016-04-22]{.small} | - Timewarrior: Expanded set of | +| | report mockups for feedback. | ++---------------------------------------+---------------------------------------+ +| [2016-04-23]{.small} | - Clog: Migrated to use libshared, | +| | updated thecode base for C++11. | +| | - Flod2: Typo in build system | +| | linked to missing library that | +| | wasn\'t used. | +| | - libshared: Color can now emit raw | +| | codes. | +| | - Timewarrior: `diagnostics` now | +| | references the theme and shows | +| | swatches. | ++---------------------------------------+---------------------------------------+ +| [2016-04-24]{.small} | - Flod: Learned how to clone and | +| | switch branches in one step. | +| | - libshared: Switched all date | +| | arguments order to `Y`, `M`, `D`. | +| | The original US order of `M`, | +| | `D`, `Y` has caused unending | +| | confusion. | ++---------------------------------------+---------------------------------------+ +| [2016-04-25]{.small} | - libshared: Added `Composite` | +| | object from Timewarrior. | +| | - Timewarrior: Now has a default | +| | color palette, which is | +| | overridden by themes. | ++---------------------------------------+---------------------------------------+ +| [2016-04-28]{.small} | - Task: Fixed ambiguity in the | +| | spa-ESP localization for the | +| | `yes/no/all/cancel` string. | +| | - Timewarrior: The `track`, `stop` | +| | and `start` commands now properly | +| | split intervals that cross | +| | boundaries. | ++---------------------------------------+---------------------------------------+ +| [2016-04-29]{.small} | - Timewarrior: Gains a `cancel` | +| | command. | +| | - Timewarrior: Gains a `day` | +| | report. | +| | - Timewarrior: Each report now has | +| | a configuration rule. | +| | - Timewarrior: The `day` report now | +| | renders in different experimental | +| | styles. | +| | - Timewarrior: Gained bash unit | +| | test capability from Taskwarrior. | ++---------------------------------------+---------------------------------------+ +| [2016-04-30]{.small} | - libshared: Added `Palette` object | +| | from Timewarrior. | +| | - Timewarrior: Gains a `summary` | +| | report. | ++---------------------------------------+---------------------------------------+ diff --git a/content/news/news.20160514.md b/content/news/news.20160514.md new file mode 100644 index 00000000..8f4acb25 --- /dev/null +++ b/content/news/news.20160514.md @@ -0,0 +1,7 @@ +--- +title: "News: Taskwarrior running under \"Bash on Ubuntu on Windows\"" +--- + +### Timewarrior Preview [2016-05-14]{.small} + +Timewarrior is coming soon. Here is a peek at the work in progress. diff --git a/content/news/news.20160522.md b/content/news/news.20160522.md new file mode 100644 index 00000000..8d1e06f0 --- /dev/null +++ b/content/news/news.20160522.md @@ -0,0 +1,18 @@ +--- +title: "News: Taskwarrior Tools Search" +--- + +### Taskwarrior Tools Search [2016-05-22]{.small} + +The [Taskwarrior Tools page](/tools/) now has interactive categorized search +capabilities, thanks to a significant contribution by Bruno Vernay. We encourage +you to take a look. + +This feature is driven by automated [Github](https://github.com) data +extraction, which identifies taskwarrior-related projects and finds their +metadata. + +Future enhancements will likely include other sources of projects. + +Before today, the tools list was manually curated, and a fraction of the size. +It took many hours to update the list. Thank you Bruno. diff --git a/content/news/news.20160604.md b/content/news/news.20160604.md new file mode 100644 index 00000000..a794f8f6 --- /dev/null +++ b/content/news/news.20160604.md @@ -0,0 +1,347 @@ +--- +title: "News: Activity Digest: May 2016" +--- + +### Activity Digest: May 2016 [2016-06-04]{.small} + +This is an ongoing series of activity reports, published monthly, to highlight +activity in our projects. Here is what happened in May 2016. This is not a +complete list of all activity, just work that results in a non-trivial change. +For a full list, see the git history of all the projects. + +::: {.callout .callout-info} +#### Summary + +The main focus for May is getting [Timewarrior](https://timewarrior.net) ready +for an alpha release. The purpose of an alpha release is to gather feedback that +guides the subsequent release. Timewarrior is a new project that introduces new +concepts. This new functionality needs to be refined before a beta release. + +The [Timewarrior bug +tracker](https://github.com/GothenburgBitFactory/timewarrior/issues) is now open +for business. + +Additionally the `libshared` library is being improved. This is a Git submodule +that nearly all the projects share, and helps with code reuse. Most importantly, +fixing bugs in `libshared` will fix bugs in all projects, without a lot of +manual patching. +::: + ++---------------------------------------+---------------------------------------+ +| [2016-05-01]{.small} | - Task: Deprecated the `new-uuid` | +| | verbosity token | +| | - Timewarrior: Added the `+` | +| | indicator on charts, for open | +| | intervals | +| | - Timewarrior: Charts stop | +| | rendering at \'now\' instead of | +| | EOD | ++---------------------------------------+---------------------------------------+ +| [2016-05-02]{.small} | - Timewarrior: Added support for | +| | the `:lastweek` hint | +| | - Timewarrior: Corrected the `:day` | +| | hint | +| | - Timewarrior: Finalized the API | +| | document | ++---------------------------------------+---------------------------------------+ +| [2016-05-03]{.small} | - Timewarrior: Clarified the | +| | definition and added help for | +| | intervals | +| | - Timewarrior: Added `track` | +| | command | +| | - Timewarrior: The `track` command | +| | delegates to `start` when no | +| | range is specified | ++---------------------------------------+---------------------------------------+ +| [2016-05-05]{.small} | - Timewarrior: Added `config` | +| | command | +| | - Timewarrior: The `config` command | +| | supports the `:yes` hint for | +| | confirmation override | +| | - Timewarrior: The `config` command | +| | exits with code `1` when a change | +| | has no effect | +| | - Timewarrior: Rules parsing | +| | simplified - fewer special cases, | +| | simpler rule names | +| | - Timewarrior: Added summary report | +| | mockup | ++---------------------------------------+---------------------------------------+ +| [2016-05-06]{.small} | - Timewarrior: Added `show` | +| | command, for consistency with | +| | Taskwarrior, and soon Taskserver | +| | - Timewarrior: The command | +| | `timew config` with no arguments, | +| | delegates to the `show` command | ++---------------------------------------+---------------------------------------+ +| [2016-05-08]{.small} | - Task: Fixed the `countdown` | +| | format that was only showing | +| | dates in the past | ++---------------------------------------+---------------------------------------+ +| [2016-05-09]{.small} | - Timewarrior: Added | +| | `Range::encloses` to detect | +| | exclusions like \'lunch\' | ++---------------------------------------+---------------------------------------+ +| [2016-05-10]{.small} | - Timewarrior: Fixed bug where all | +| | command line arguments were | +| | tokenized, leading to extra | +| | spaces - a familiar Taskwarrior | +| | bug | ++---------------------------------------+---------------------------------------+ +| [2016-05-11]{.small} | - Timewarrior: Exclusions now | +| | properly anchor `<` and `>` at | +| | midnight | ++---------------------------------------+---------------------------------------+ +| [2016-05-12]{.small} | - Timewarrior: Added | +| | `Range::is_open` which simplifies | +| | a lot of code | ++---------------------------------------+---------------------------------------+ +| [2016-05-13]{.small} | - Timewarrior: Added `gaps` command | +| | - Timewarrior: Added assorted tests | +| | of the `gaps` command | +| | - Timewarrior: Now loads and uses | +| | custom tag colors | +| | - Timewarrior: Now that the | +| | `config` command is working, lots | +| | of new tests are possible, and | +| | were added | ++---------------------------------------+---------------------------------------+ +| [2016-05-14]{.small} | - libshared: `Duration` needed | +| | precision formatting that only | +| | showed hours | +| | - libshared: Bug fixed that allowed | +| | a time of `HH:MM:` | +| | - Timewarrior: When recorded time | +| | exceeds available time, do not | +| | report negative remaining time | +| | - Timewarrior: Default command now | +| | summarizes all contiguous open | +| | intervals | +| | - Timewarrior: In preparation for | +| | an `undo` command, now records | +| | all data-changing transactions in | +| | an `undo.data` file | +| | - Timewarrior: Fixed bug where | +| | total available time on a report | +| | didn\'t add up | +| | - Timewarrior: Now uses precision | +| | hour formatting | +| | - Timewarrior: Added range asserts | +| | for debugging | ++---------------------------------------+---------------------------------------+ +| [2016-05-16]{.small} | - Guides: [Taskserver | +| | Troubleshooting | +| | PDF](https: | +| | //github.com/GothenburgBitFactory/gui | +| | des/blob/master/taskserver-troublesho | +| | oting/taskserver-troubleshooting.pdf) | +| | updated | +| | - OSCON 2016: [Taskwarrior | +| | stickers](https://twitter.com/t | +| | askwarrior/status/732966869762637824) | +| | on the table (Want one? Ask) | +| | - Timewarrior: The `stop` command | +| | now accepts an override stop time | +| | - Timewarrior: Filter is now | +| | applied when loading data | ++---------------------------------------+---------------------------------------+ +| [2016-05-17]{.small} | - Timewarrior: Added proper | +| | argument scanning, instead of | +| | simply counting arguments, for | +| | identifying the default command | ++---------------------------------------+---------------------------------------+ +| [2016-05-18]{.small} | - libshared: `Datetime` was oddly | +| | missing accessors for days, | +| | hours, minutes, seconds | +| | - libshared: `Duration` wasn\'t | +| | consistent with `Datetime` | +| | - Timewarrior: Added a `refresh` | +| | script to update holiday files | +| | - Timewarrior: Documented how to | +| | update holiday files | ++---------------------------------------+---------------------------------------+ +| [2016-05-19]{.small} | - Timewarrior: Added `week` report | +| | - Timewarrior: Supports | +| | `reports..summary` to | +| | control display of the ѕummary | +| | data | +| | - Timewarrior: Supports | +| | `reports..lines` to control | +| | number of lines shown per day | ++---------------------------------------+---------------------------------------+ +| [2016-05-20]{.small} | - [\#1827: project:ide is not | +| | | +| | allowed](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1827) | +| | fixed | +| | - [\#1828: dateformat lacks a flag | +| | to display day of | +| | week](https://github.com/Gothenbu | +| | rgBitFactory/taskwarrior/issues/1828) | +| | fixed | +| | - Flod: Shrunk and simplified | +| | tinderbox report | +| | - Timewarrior: Charts now highlight | +| | current day, and current hour | +| | - Timewarrior: Added the `day`, | +| | `week` and `month` reports to the | +| | documentation, with examples | +| | - Timewarrior: Fixed bug where the | +| | `summary` report projected open | +| | intervals into the future | +| | - Timewarrior: Added mockup of | +| | `week` report | +| | - taskwarrior.org: Added | +| | `Windows 10` to the [download | +| | page](/download) | +| | - taskwarrior.org: Added [plan | +| | details](/docs/design/plans.html) | ++---------------------------------------+---------------------------------------+ +| [2016-05-21]{.small} | - libshared: Added `Datetime` | +| | support for `12am` which was | +| | oddly missing | +| | - Timewarrior: Supports | +| | `theme.colors.holiday` | +| | - Timewarrior: Added `csv.py` | +| | extension to export data in CSV | +| | format | +| | - Timewarrior: Fixed assorted | +| | quoting problems on the command | +| | line, and in the data files | +| | - Timewarrior: The `day` report not | +| | longer shows totals by default | +| | - Timewarrior: Supports | +| | `reports..totals` to | +| | control display of day totals | +| | - Timewarrior: Command line args | +| | like `9` are now assumed to be | +| | hours `9:00` | +| | - Timewarrior: Supports | +| | `report..