tasku 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd2fbd40e27817e56591b3a6ff769c59b109de5e34f2a09b416e38008de1428f
4
- data.tar.gz: 787ea03c2a16d886bf62869d8e5174f28e5be667822e113fc248b32135e175bd
3
+ metadata.gz: d18e6bd1dfa0e69dc685364eb89aaf5a77ea20536179bb635fe5cabf419b7296
4
+ data.tar.gz: 2d37502dcef646ec9f7d5b8805ee266759e3414e6768abfc3e0393b0193c5a1e
5
5
  SHA512:
6
- metadata.gz: 3998485e4d8369986f96db7ab64330e1f9b19993c025288899920fb02f6c6670fd0e9980cfcd881a755c00118e5ea002a980b3ca543d094f15d750c8cb86fb46
7
- data.tar.gz: 3c7a5a32c70554e2824ba41d7cc8197669c57ff63e339cc0e7c9a0b5b40606018ba181c6baea59bf4cf1de777740148660d3bd2dbcfe241cd4498aff78dd34f0
6
+ metadata.gz: 4d90b603cc137e7a1a296d808bfae2287d7bb3a111942a5ead559bb67684bf1a24c30a0b5a03afdced036b60eaebc2a50c4293aead2af7eb6e6caac21a39b49a
7
+ data.tar.gz: fb33681495b68a02ed4a5b82dc1b9cb04da5409d48bb90a5e6cc70128e8b8e8417b839b4b74d4e86f3ececa9bbf8d89b96f7705b14f20cd2326ce1615cd70777
data/CHANGELOG.md ADDED
@@ -0,0 +1,108 @@
1
+ # Changelog
2
+
3
+ All notable changes to Tasku are documented here.
4
+
5
+ ## [0.4.2] - 2026-10-29
6
+
7
+ ### Added
8
+ - **Auto branch checkout** — when a task is set to `in_progress` via `tasku edit ID --status in_progress`, Tasku automatically creates and checks out a git branch named `CODE-ID-name-slug` in the linked repo. If the branch already exists it switches to it instead. Configure with `tasku git link CODE PATH`, remove with `tasku git unlink CODE`, and inspect with `tasku git list`.
9
+ - **Mado: confirm before delete** — pressing `d` in the interactive task list now shows a confirmation prompt; press `y` to confirm, any other key cancels
10
+
11
+ ### Security
12
+ - All `system()` and `exec()` calls in `MadoList` now use the array form (via
13
+ `Shellwords.shellsplit`) instead of a shell string, preventing shell
14
+ interpretation of metacharacters in command arguments
15
+
16
+ ## [0.4.1] - 2026-09-29
17
+
18
+ ### Fixed
19
+ - **Cloud sync: project colours now sync down** — `tasku cloud sync` applied only the tasks from the server's response and ignored its `projects`, so colours set on another machine never arrived. They are now created or updated locally, and the sync summary reports how many changed. In Mado this also restores project colours and workspaces on a freshly synced machine
20
+
21
+ ## [0.4.0] - 2026-09-23
22
+
23
+ ### Added
24
+ - **Tasku Cloud sync** — two-way sync with `tasku cloud sync`; authenticate with `tasku cloud login <token>`, check status with `tasku cloud status`, and revoke with `tasku cloud logout`
25
+ - **`tasku config open`** — opens the config file in `$EDITOR` pre-seeded with all available keys and their defaults
26
+ - **Numeric range preferences** — config keys that accept a numeric range (e.g. column minimum widths) now show their valid range in `tasku config list`
27
+ - **`--code` flag** on `add` and `edit` — attach a short code to a task (e.g. `MDO-42`)
28
+ - **`tasku sql`** — run a raw SQL `SELECT` query against the local database
29
+ - **Category filtering** — `tasku list --category` and category column in list output
30
+ - **Column visibility preferences** — `col_project`, `col_category`, `col_priority`, `col_status`, `col_due` can each be toggled `on`/`off` via `tasku config set`
31
+ - **Column minimum width preferences** — `col_name_min`, `col_priority_min`, `col_status_min`, `col_due_min` for fine-tuning layout
32
+ - **`tasku config open`** — open the config JSON in `$EDITOR` (pre-seeded with defaults)
33
+ - **UUID field** on tasks for stable cross-device identity during cloud sync
34
+
35
+ ### Fixed
36
+ - **Mado: status filter preserved after add/edit/delete** — `MadoList` now receives the full `list_cmd` (including `--status`, `--today`, `--overdue`, etc.) and passes it to `exec` on return, so the active view is restored correctly after an interactive command
37
+ - **Mado: project filter preserved after add/edit/delete** — the inline-exec protocol (`\x02`) now replaces the MadoList process via `exec` instead of nesting it in a `system()` call, so the new MadoList inherits the correct `@list_cmd` and filter is preserved when navigating back from an interactive command
38
+ - **Mado: project filter lost on workspace switch** — the open-panel flag is now tracked correctly for sidebar-positioned Tasku (not just the top-bar overlay), so switching workspace reliably refreshes the task list with the new project filter
39
+ - **Mado: terminal left in raw mode after inline exec** — `$stdin.cooked!` is now called before `exec` when handling a `\x02tasku list` command, preventing the shell from inheriting raw-mode terminal attributes
40
+ - **Due date column truncation** — `DUE_COL_MIN_WIDTH` raised to 17 to accommodate the longest possible due cell (`"Mmm DD (NNNd ago)"`)
41
+ - **MadoList row overflow** — row prefix accounting corrected to 6 characters (`" [>] "`), matching the actual rendered prefix; was previously 4, causing rows to exceed terminal width and wrap
42
+ - **Name truncation** — task names that exceed available space are now truncated with `…`; names that fit are never truncated, fixing cases where the due-date column wrapped to the next line
43
+ - **Column auto-drop on narrow terminals** — optional columns (project → category → priority → status) are dropped one at a time until at least 15 characters are available for task names, rather than wrapping or clipping
44
+
45
+ ### Changed
46
+ - `tasku list` output uses a consistent `│`-separated column layout with a header row
47
+ - `tasku config set` validates values via `ArgumentError` rather than a plain string comparison, supporting range constraints
48
+ - `tasku stats` includes a "By Project" section sorted by task count
49
+ - Sort defaults to `id` (ascending) when no `--sort` flag is given
50
+ - `id` added as an explicit `--sort` option
51
+
52
+ ---
53
+
54
+ ## [0.3.9] - 2026-09-04
55
+
56
+ ### Added
57
+ - **Mado TUI list mode** — `tasku list` launches an interactive cursor-driven list when `MADO=1` is set in the environment, designed for embedding in the Mado terminal multiplexer sidebar
58
+ - Arrow-key navigation, selected task ID written to `TASKU_SEL_FILE` for Mado button integration
59
+ - Inline-exec protocol (`\x02`) for receiving filter and display commands from Mado without shell round-trips
60
+ - `build_mado_rows` and `ansi_ljust` helpers exposed on `Output::Terminal` for Mado's renderer
61
+
62
+ ---
63
+
64
+ ## [0.3.1] - 2026-08-29
65
+
66
+ ### Fixed
67
+ - Terminal width was capped at 80 columns regardless of actual PTY size, severely truncating the name column in wider terminals — now uses the real terminal width
68
+
69
+ ### Changed
70
+ - `tasku list` sorts by `id` by default
71
+ - `exit_on_failure?` enabled on the CLI so bad subcommands exit with a non-zero status
72
+
73
+ ---
74
+
75
+ ## [0.3.0] - 2026-07-24
76
+
77
+ ### Added
78
+ - **Project colours** — `tasku colour PROJECT #HEX` stores a hex colour per project; project names are tinted throughout `list`, `show`, and `stats`
79
+ - **Colour bar** — three-segment bar in `tasku list` showing project, priority, and status at a glance (toggle each segment with `tasku config set bar_project on/off` etc.)
80
+ - **User preferences** — `tasku config list` / `tasku config set KEY VALUE` / `tasku config get KEY`, backed by `~/.tasku/config.json`
81
+ - `list_spacing` preference (`compact` / `spacious`)
82
+ - **"By Project" section** in `tasku stats` sorted by task count
83
+ - Logo restored on `tasku help` and bare `tasku` invocation
84
+
85
+ ---
86
+
87
+ ## [0.2.0] - 2026-07-01
88
+
89
+ ### Added
90
+ - `tasku projects` — list all projects with task counts and colour swatches
91
+ - `tasku categories` — list all categories
92
+ - `tasku done ID` — shorthand to mark a task done
93
+ - `--overdue`, `--today`, `--tomorrow` filter flags on `tasku list`
94
+ - `--sort` and `--order` flags on `tasku list`
95
+ - `--priority`, `--status`, `--tags` filter flags on `tasku list`
96
+ - `--force` / `-f` flag on `tasku delete` to skip confirmation
97
+
98
+ ---
99
+
100
+ ## [0.1.0] - 2026-06-29
101
+
102
+ Initial release.
103
+
104
+ - `tasku add`, `tasku list`, `tasku show`, `tasku edit`, `tasku delete`
105
+ - SQLite-backed storage at `~/.tasku/tasks.db`
106
+ - Task fields: name, description, project, category, priority, status, start date, due date, tags, estimated hours
107
+ - `tasku stats` — task breakdown by priority and status
108
+ - Interactive add/edit with `-i` flag (TTY::Prompt)
data/lib/tasku/cli.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "fileutils"
4
4
  require "json"
5
5
  require "net/http"
6
+ require "shellwords"
6
7
  require "uri"
7
8
 
8
9
  module Tasku
@@ -69,6 +70,48 @@ module Tasku
69
70
  end
70
71
  end
71
72
 
73
+ class GitApp < Thor
74
+ desc "link CODE PATH", "Link a project code to a git repo path (enables auto branch checkout)"
75
+ def link(code, path)
76
+ pastel = Pastel.new
77
+ expanded = File.expand_path(path)
78
+ unless Dir.exist?(expanded)
79
+ abort pastel.red(" Path does not exist: #{expanded}")
80
+ end
81
+ unless Dir.exist?(File.join(expanded, ".git"))
82
+ abort pastel.red(" Not a git repository: #{expanded}")
83
+ end
84
+ Tasku::Config.set_git_path(code, expanded)
85
+ puts pastel.green(" ✓ #{code.upcase} linked to #{expanded}")
86
+ puts pastel.dim(" Setting a task to in_progress will now auto-checkout a branch.")
87
+ end
88
+
89
+ desc "unlink CODE", "Remove a project code's git repo link"
90
+ def unlink(code)
91
+ pastel = Pastel.new
92
+ unless Tasku::Config.git_path_for(code)
93
+ abort pastel.yellow(" #{code.upcase} is not linked to any repo.")
94
+ end
95
+ Tasku::Config.unset_git_path(code)
96
+ puts pastel.green(" ✓ #{code.upcase} unlinked.")
97
+ end
98
+
99
+ desc "list", "List all project code → repo path links"
100
+ def list
101
+ pastel = Pastel.new
102
+ projects = Tasku::Config.all_git_projects
103
+ if projects.empty?
104
+ puts pastel.dim(" No git links configured. Use `tasku git link CODE PATH` to add one.")
105
+ return
106
+ end
107
+ puts ""
108
+ projects.each do |code, path|
109
+ puts " #{pastel.bold(code.ljust(8))} #{path}"
110
+ end
111
+ puts ""
112
+ end
113
+ end
114
+
72
115
  class CloudApp < Thor
73
116
  desc "login TOKEN", "Authenticate with Tasku Cloud using an API token"
74
117
  option :url, type: :string, desc: "Tasku Cloud URL (default: #{Tasku::Config::CLOUD_URL_DEFAULT})"
@@ -196,9 +239,10 @@ module Tasku
196
239
  abort pastel.red(" Sync failed (HTTP #{res.code}).")
197
240
  end
198
241
 
199
- body = JSON.parse(res.body)
200
- server_tasks = body["tasks"] || []
201
- synced_at = body["synced_at"]
242
+ body = JSON.parse(res.body)
243
+ server_tasks = body["tasks"] || []
244
+ server_projects = body["projects"] || []
245
+ synced_at = body["synced_at"]
202
246
 
203
247
  created = updated = conflicts = 0
204
248
 
@@ -261,6 +305,21 @@ module Tasku
261
305
  end
262
306
  end
263
307
 
308
+ # Local projects were pushed above, so the server's list already reflects
309
+ # them — adopt it wholesale so colours set on other machines come down.
310
+ projects_pulled = 0
311
+ (body["projects"] || []).each do |sp|
312
+ name = sp["name"].to_s.strip
313
+ colour = sp["colour"].to_s.strip
314
+ next if name.empty? || colour !~ /\A#[0-9A-Fa-f]{6}\z/
315
+
316
+ proj = Tasku::Project.find_or_create(name: name)
317
+ next if proj.colour == colour
318
+
319
+ proj.update(colour: colour)
320
+ projects_pulled += 1
321
+ end
322
+
264
323
  Tasku::Config.last_synced_at = synced_at ? Time.parse(synced_at).utc : Time.now.utc
265
324
 
266
325
  puts ""
@@ -268,6 +327,7 @@ module Tasku
268
327
  puts " #{pastel.bold(local_tasks.count.to_s)} #{local_tasks.count == 1 ? "task" : "tasks"} pushed to cloud."
269
328
  puts " #{pastel.bold(created.to_s)} #{created == 1 ? "task" : "tasks"} pulled from cloud." if created > 0
270
329
  puts " #{pastel.bold(updated.to_s)} #{updated == 1 ? "task" : "tasks"} updated from cloud." if updated > 0
330
+ puts " #{pastel.bold(projects_pulled.to_s)} #{projects_pulled == 1 ? "project colour" : "project colours"} updated from cloud." if projects_pulled > 0
271
331
  if conflicts > 0
272
332
  puts " #{pastel.yellow("⚠")} #{conflicts} #{conflicts == 1 ? "conflict" : "conflicts"} — visit #{pastel.bold(url)} to resolve."
273
333
  end
@@ -302,6 +362,9 @@ module Tasku
302
362
  desc "config SUBCOMMAND", "Manage user preferences"
303
363
  subcommand "config", ConfigApp
304
364
 
365
+ desc "git SUBCOMMAND", "Manage git repo links for auto branch checkout"
366
+ subcommand "git", GitApp
367
+
305
368
  desc "cloud SUBCOMMAND", "Sync tasks with Tasku Cloud"
306
369
  subcommand "cloud", CloudApp
307
370
 
@@ -470,7 +533,15 @@ module Tasku
470
533
  "col_due_min" => Config.get("col_due_min")
471
534
  }
472
535
  if ENV["MADO"] == "1"
473
- Tasku::TUI::MadoList.new(tasks, colour_map: Project.colour_map, bar: bar, cols_cfg: cols_cfg, project: options[:project]).run
536
+ list_cmd = "tasku list"
537
+ list_cmd += " --status #{Shellwords.shellescape(options[:status])}" if options[:status]
538
+ list_cmd += " --priority #{Shellwords.shellescape(options[:priority])}" if options[:priority]
539
+ list_cmd += " --project #{Shellwords.shellescape(options[:project])}" if options[:project]
540
+ list_cmd += " --category #{Shellwords.shellescape(options[:category])}" if options[:category]
541
+ list_cmd += " --today" if options[:today]
542
+ list_cmd += " --tomorrow" if options[:tomorrow]
543
+ list_cmd += " --overdue" if options[:overdue]
544
+ Tasku::TUI::MadoList.new(tasks, colour_map: Project.colour_map, bar: bar, cols_cfg: cols_cfg, project: options[:project], list_cmd: list_cmd).run
474
545
  else
475
546
  terminal.render_list(tasks, colour_map: Project.colour_map, spacing: Config.get("list_spacing"), bar: bar, cols_cfg: cols_cfg)
476
547
  end
@@ -537,6 +608,7 @@ module Tasku
537
608
 
538
609
  task.update(attrs)
539
610
  terminal.render_updated(task)
611
+ auto_checkout_branch(task, attrs) if attrs[:status] == "in_progress"
540
612
  rescue Sequel::ValidationFailed => e
541
613
  abort pastel.red("Validation error: #{e.message}")
542
614
  end
@@ -672,7 +744,7 @@ module Tasku
672
744
  category = nil if category&.empty?
673
745
 
674
746
  priority = prompt.select("Priority?", %w[none low medium high urgent], default: 1)
675
- status = prompt.select("Status?", %w[backlog todo in_progress], default: 2)
747
+ status = prompt.select("Status?", Task::VALID_STATUSES, default: 2)
676
748
 
677
749
  start_day = prompt.ask("Start date (YYYY-MM-DD, optional):", default: "")
678
750
  start_day = nil if start_day&.empty?
@@ -860,6 +932,34 @@ module Tasku
860
932
  "\e[1;38;2;#{r};#{g};#{b}m#{text}\e[0m"
861
933
  end
862
934
 
935
+ def auto_checkout_branch(task, attrs)
936
+ return unless task.code && !task.code.empty?
937
+
938
+ repo_path = Tasku::Config.git_path_for(task.code)
939
+ return unless repo_path
940
+
941
+ slug = task.name.downcase.gsub(/[^a-z0-9]+/, "-").gsub(/\A-|-\z/, "")
942
+ branch = "#{task.code}-#{task.id}-#{slug}"
943
+
944
+ # Check if the branch already exists locally.
945
+ existing = `git -C #{repo_path.shellescape} branch --list #{branch.shellescape} 2>/dev/null`.strip
946
+ if existing.empty?
947
+ result = system("git", "-C", repo_path, "checkout", "-b", branch, out: :close, err: :close)
948
+ if result
949
+ puts pastel.dim(" git: created and switched to branch #{branch}")
950
+ else
951
+ puts pastel.yellow(" git: could not create branch #{branch} — is the working tree clean?")
952
+ end
953
+ else
954
+ result = system("git", "-C", repo_path, "checkout", branch, out: :close, err: :close)
955
+ if result
956
+ puts pastel.dim(" git: switched to existing branch #{branch}")
957
+ else
958
+ puts pastel.yellow(" git: could not switch to branch #{branch}")
959
+ end
960
+ end
961
+ end
962
+
863
963
  def colour_cell(col, padded_val, row)
864
964
  case col.to_s
865
965
  when "priority"
data/lib/tasku/config.rb CHANGED
@@ -104,6 +104,40 @@ module Tasku
104
104
  !cloud_token.nil?
105
105
  end
106
106
 
107
+ # ── Git project paths ──────────────────────────────────────────────────
108
+ # Maps a 3-char project code (e.g. "TAS") to an absolute repo path.
109
+ # Stored under the "git_projects" key in config.json.
110
+
111
+ def self.git_path_for(code)
112
+ git_projects[code.to_s.upcase]
113
+ end
114
+
115
+ def self.set_git_path(code, path)
116
+ current = all
117
+ current["git_projects"] ||= {}
118
+ current["git_projects"][code.to_s.upcase] = File.expand_path(path)
119
+ FileUtils.mkdir_p(File.dirname(CONFIG_PATH))
120
+ File.write(CONFIG_PATH, JSON.pretty_generate(current))
121
+ end
122
+
123
+ def self.unset_git_path(code)
124
+ current = all
125
+ return unless current["git_projects"]
126
+
127
+ current["git_projects"].delete(code.to_s.upcase)
128
+ current.delete("git_projects") if current["git_projects"].empty?
129
+ File.write(CONFIG_PATH, JSON.pretty_generate(current))
130
+ end
131
+
132
+ def self.all_git_projects
133
+ git_projects
134
+ end
135
+
136
+ def self.git_projects
137
+ all["git_projects"] || {}
138
+ end
139
+ private_class_method :git_projects
140
+
107
141
  def self.get(key)
108
142
  all[key] || VALID_KEYS.dig(key, :default)
109
143
  end
@@ -13,15 +13,16 @@ module Tasku
13
13
  # button handlers can inject it into commands like `tasku edit <id>`.
14
14
  class MadoList
15
15
  HINT = " ↑↓ navigate a add e/↵ edit d delete s stats q quit"
16
+ HINT_CONFIRM = " Delete task? Press y to confirm, any other key to cancel"
16
17
 
17
- def initialize(tasks, colour_map: {}, bar: {}, cols_cfg: {}, project: nil)
18
+ def initialize(tasks, colour_map: {}, bar: {}, cols_cfg: {}, project: nil, list_cmd: nil)
18
19
  @tasks = tasks
19
20
  @cursor = 0
20
21
  @pastel = Pastel.new
21
22
  @sel_file = ENV["TASKU_SEL_FILE"]
22
23
  @running = true
23
24
  @inline_cmd = nil
24
- @list_cmd = project ? "tasku list --project #{Shellwords.shellescape(project)}" : "tasku list"
25
+ @list_cmd = list_cmd || (project ? "tasku list --project #{Shellwords.shellescape(project)}" : "tasku list")
25
26
 
26
27
  # Pre-render row content once so key-press redraws are cheap.
27
28
  table = Output::Terminal.new.build_mado_rows(tasks, colour_map, bar, cols_cfg)
@@ -156,7 +157,7 @@ module Tasku
156
157
  run_command("tasku edit #{@tasks[@cursor].id} -i")
157
158
  when :delete
158
159
  return if @tasks.empty?
159
- run_command("tasku delete #{@tasks[@cursor].id} -f")
160
+ confirm_delete
160
161
  when :stats
161
162
  run_and_show("tasku stats")
162
163
  when :inline_exec
@@ -164,6 +165,18 @@ module Tasku
164
165
  MadoLog.log("inline_exec cmd=#{cmd.inspect}")
165
166
  if cmd == "SQL"
166
167
  run_sql
168
+ elsif cmd.start_with?("tasku list")
169
+ # exec directly so the new MadoList initialises with the correct
170
+ # @list_cmd (project filter, status filter, etc.). Using
171
+ # run_command would nest a subprocess and then re-exec @list_cmd
172
+ # (no filter) when the subprocess exits — losing the filter.
173
+ # Must restore terminal + cooked mode before exec so the new
174
+ # process doesn't inherit raw-mode terminal attributes.
175
+ @running = false
176
+ restore_terminal
177
+ $stdin.cooked!
178
+ MadoLog.log("inline_exec tasku list → exec #{cmd.inspect}")
179
+ exec(*Shellwords.shellsplit(cmd))
167
180
  else
168
181
  run_command(cmd)
169
182
  end
@@ -177,9 +190,9 @@ module Tasku
177
190
  @running = false
178
191
  restore_terminal
179
192
  $stdin.cooked!
180
- system(cmd)
193
+ system(*Shellwords.shellsplit(cmd))
181
194
  MadoLog.log("run_command finished cmd=#{cmd.inspect} → exec #{@list_cmd}")
182
- exec(@list_cmd)
195
+ exec(*Shellwords.shellsplit(@list_cmd))
183
196
  end
184
197
 
185
198
  # Run a non-interactive display command, wait for any keypress via
@@ -190,12 +203,12 @@ module Tasku
190
203
  @running = false
191
204
  restore_terminal
192
205
  $stdin.cooked!
193
- system(cmd)
206
+ system(*Shellwords.shellsplit(cmd))
194
207
  $stdout.print "\r\n\e[2m Press any key to return to list…\e[0m\r\n"
195
208
  $stdout.flush
196
209
  $stdin.getch
197
210
  MadoLog.log("run_and_show keypress received → exec #{@list_cmd}")
198
- exec(@list_cmd)
211
+ exec(*Shellwords.shellsplit(@list_cmd))
199
212
  end
200
213
 
201
214
  # Show a SQL prompt, run the query, wait for keypress, then re-exec list.
@@ -215,7 +228,24 @@ module Tasku
215
228
  $stdin.getch
216
229
  end
217
230
  MadoLog.log("run_sql done → exec #{@list_cmd}")
218
- exec(@list_cmd)
231
+ exec(*Shellwords.shellsplit(@list_cmd))
232
+ end
233
+
234
+ def confirm_delete
235
+ task = @tasks[@cursor]
236
+ name_preview = task.name.length > 40 ? "#{task.name[0, 39]}…" : task.name
237
+ border = @pastel.dim(" " + "─" * (@row_width + 4))
238
+ $stdout.print "\r\n#{border}\r\n"
239
+ $stdout.print " #{@pastel.yellow("Delete: ")}#{name_preview}\r\n"
240
+ $stdout.print "#{border}\r\n"
241
+ $stdout.print "#{@pastel.dim(HINT_CONFIRM)}\r\n"
242
+ $stdout.flush
243
+ byte = $stdin.getbyte
244
+ if byte == 0x79 || byte == 0x59 # y / Y
245
+ run_command("tasku delete #{task.id} -f")
246
+ else
247
+ full_render
248
+ end
219
249
  end
220
250
 
221
251
  def restore_terminal
data/lib/tasku/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tasku
4
- VERSION = "0.4.0"
4
+ VERSION = "0.4.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tasku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Dringer
@@ -86,6 +86,7 @@ executables:
86
86
  extensions: []
87
87
  extra_rdoc_files: []
88
88
  files:
89
+ - CHANGELOG.md
89
90
  - exe/tasku
90
91
  - lib/tasku.rb
91
92
  - lib/tasku/cli.rb
@@ -103,7 +104,7 @@ licenses:
103
104
  metadata:
104
105
  homepage_uri: https://github.com/tomdringer/tasku
105
106
  source_code_uri: https://github.com/tomdringer/tasku
106
- changelog_uri: https://github.com/tomdringer/tasku/releases
107
+ changelog_uri: https://github.com/tomdringer/tasku/blob/main/CHANGELOG.md
107
108
  rdoc_options: []
108
109
  require_paths:
109
110
  - lib