doingapp 0.5.0__tar.gz → 0.5.1__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: doingapp
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A fast CLI task tracker — track what you're doing from the terminal.
5
5
  Author-email: Parker Grimes <parker@altellus.com>
6
6
  License-Expression: MIT
@@ -62,27 +62,55 @@ doing # See what's on your plate
62
62
  doing done 1 # Mark task #1 as done
63
63
  ```
64
64
 
65
+ Or authenticate with an API key (get one from the web UI at Settings → API Keys):
66
+
67
+ ```bash
68
+ doing apikey --key doing_xxxxx
69
+ ```
70
+
65
71
  ## Commands
66
72
 
67
73
  | Command | Description |
68
74
  |---------|-------------|
69
75
  | `doing` | Show active tasks (same as `doing ls`) |
70
76
  | `doing add <title>` | Add a task (`-n` notes, `-c` context ID) |
77
+ | `doing get <id>` | Get a single task by ID |
71
78
  | `doing done <id>` | Mark a task as done |
72
79
  | `doing pause <id>` | Pause a task |
73
80
  | `doing resume <id>` | Resume a paused task |
74
81
  | `doing reopen <id>` | Reopen a completed task |
75
82
  | `doing edit <id>` | Edit a task (`-t` title, `-n` notes, `-c` context, `--no-context`) |
76
83
  | `doing rm <id>` | Delete a task |
77
- | `doing ls` | List active tasks |
78
- | `doing log` | Show tasks done today (`-d YYYY-MM-DD` for other dates) |
79
- | `doing today` | Show all tasks grouped by status |
84
+ | `doing ls` | List active tasks (`-c` context ID) |
85
+ | `doing log` | Show tasks done today (`-d YYYY-MM-DD`, `-c` context ID) |
86
+ | `doing today` | Show all tasks grouped by status (`-c` context ID) |
80
87
  | `doing clear` | Mark all active tasks as done |
81
88
  | `doing contexts` | List contexts |
82
89
  | `doing context add <name>` | Create a context |
83
90
  | `doing context rm <id>` | Delete a context |
91
+ | `doing me` | Show current user info |
84
92
  | `doing login` | Log in |
85
93
  | `doing logout` | Log out |
94
+ | `doing apikey` | Save an API key (`-k` key) |
95
+
96
+ ## JSON output
97
+
98
+ Every command supports `--json` (or `-j`) for machine-readable output. This is useful for scripting and AI coding agents like Claude Code or Codex CLI.
99
+
100
+ ```bash
101
+ doing --json ls # [{"id": 1, "title": "...", ...}]
102
+ doing --json add "New task" # {"id": 2, "title": "New task", ...}
103
+ doing --json done 2 # {"id": 2, "status": "done", ...}
104
+ doing --json contexts # [{"id": 1, "name": "Work", ...}]
105
+ doing --json get 2 # {"id": 2, "title": "...", ...}
106
+ doing --json me # {"id": 1, "email": "...", ...}
107
+ ```
108
+
109
+ Errors also return structured JSON with a non-zero exit code:
110
+
111
+ ```bash
112
+ doing --json done 99999 # {"error": true, "status": 404, "detail": "Task not found"}
113
+ ```
86
114
 
87
115
  ## Configuration
88
116
 
@@ -37,27 +37,55 @@ doing # See what's on your plate
37
37
  doing done 1 # Mark task #1 as done
38
38
  ```
39
39
 
40
+ Or authenticate with an API key (get one from the web UI at Settings → API Keys):
41
+
42
+ ```bash
43
+ doing apikey --key doing_xxxxx
44
+ ```
45
+
40
46
  ## Commands
41
47
 
42
48
  | Command | Description |
43
49
  |---------|-------------|
44
50
  | `doing` | Show active tasks (same as `doing ls`) |
45
51
  | `doing add <title>` | Add a task (`-n` notes, `-c` context ID) |
52
+ | `doing get <id>` | Get a single task by ID |
46
53
  | `doing done <id>` | Mark a task as done |
47
54
  | `doing pause <id>` | Pause a task |
48
55
  | `doing resume <id>` | Resume a paused task |
49
56
  | `doing reopen <id>` | Reopen a completed task |
50
57
  | `doing edit <id>` | Edit a task (`-t` title, `-n` notes, `-c` context, `--no-context`) |
51
58
  | `doing rm <id>` | Delete a task |
52
- | `doing ls` | List active tasks |
53
- | `doing log` | Show tasks done today (`-d YYYY-MM-DD` for other dates) |
54
- | `doing today` | Show all tasks grouped by status |
59
+ | `doing ls` | List active tasks (`-c` context ID) |
60
+ | `doing log` | Show tasks done today (`-d YYYY-MM-DD`, `-c` context ID) |
61
+ | `doing today` | Show all tasks grouped by status (`-c` context ID) |
55
62
  | `doing clear` | Mark all active tasks as done |
56
63
  | `doing contexts` | List contexts |
57
64
  | `doing context add <name>` | Create a context |
58
65
  | `doing context rm <id>` | Delete a context |
66
+ | `doing me` | Show current user info |
59
67
  | `doing login` | Log in |
60
68
  | `doing logout` | Log out |
69
+ | `doing apikey` | Save an API key (`-k` key) |
70
+
71
+ ## JSON output
72
+
73
+ Every command supports `--json` (or `-j`) for machine-readable output. This is useful for scripting and AI coding agents like Claude Code or Codex CLI.
74
+
75
+ ```bash
76
+ doing --json ls # [{"id": 1, "title": "...", ...}]
77
+ doing --json add "New task" # {"id": 2, "title": "New task", ...}
78
+ doing --json done 2 # {"id": 2, "status": "done", ...}
79
+ doing --json contexts # [{"id": 1, "name": "Work", ...}]
80
+ doing --json get 2 # {"id": 2, "title": "...", ...}
81
+ doing --json me # {"id": 1, "email": "...", ...}
82
+ ```
83
+
84
+ Errors also return structured JSON with a non-zero exit code:
85
+
86
+ ```bash
87
+ doing --json done 99999 # {"error": true, "status": 404, "detail": "Task not found"}
88
+ ```
61
89
 
62
90
  ## Configuration
63
91
 
@@ -75,6 +75,30 @@ def _handle_api_error(exc: Exception):
75
75
  raise typer.Exit(code=1)
76
76
 
77
77
 
78
+ def _validation_error(detail: str):
79
+ """Print a validation error (JSON or Rich) and exit with code 1."""
80
+ if _json_mode:
81
+ _output_json({"error": True, "detail": detail})
82
+ console.print(f"[bold red]{detail}[/bold red]")
83
+ raise typer.Exit(code=1)
84
+
85
+
86
+ def _validate_title(title: str) -> str:
87
+ """Strip whitespace and newlines from title, validate non-empty."""
88
+ cleaned = title.replace("\n", " ").replace("\r", " ").strip()
89
+ if not cleaned:
90
+ _validation_error("Title cannot be empty")
91
+ return cleaned
92
+
93
+
94
+ def _validate_name(name: str) -> str:
95
+ """Strip and validate non-empty name for contexts."""
96
+ cleaned = name.strip()
97
+ if not cleaned:
98
+ _validation_error("Name cannot be empty")
99
+ return cleaned
100
+
101
+
78
102
  def _print_notes(task: dict) -> None:
79
103
  if task.get("notes"):
80
104
  console.print(f" [dim]{task['notes']}[/dim]")
@@ -197,6 +221,7 @@ def add(
197
221
  context: int = typer.Option(None, "--context", "-c", help="Context ID"),
198
222
  ):
199
223
  """Add something to your plate."""
224
+ title = _validate_title(title)
200
225
  try:
201
226
  task = api.create_task(title, notes, context)
202
227
  except Exception as exc:
@@ -331,6 +356,16 @@ def edit(
331
356
  no_context: bool = typer.Option(False, "--no-context", help="Remove context"),
332
357
  ):
333
358
  """Edit a task's title, notes, or context."""
359
+ if no_context and context is not None:
360
+ _validation_error("--no-context and --context cannot be used together")
361
+
362
+ if title is None and notes is None and context is None and not no_context:
363
+ _validation_error("No changes specified. Use --title, --notes, --context, or --no-context.")
364
+
365
+ # BUG-8: Validate title if provided
366
+ if title is not None:
367
+ title = _validate_title(title)
368
+
334
369
  try:
335
370
  task = api.update_task(task_id, title=title, notes=notes,
336
371
  context_id=context, clear_context=no_context)
@@ -447,7 +482,7 @@ def context_add(
447
482
  name: str = typer.Argument(..., help="Context name"),
448
483
  ):
449
484
  """Create a new context."""
450
- _require_auth()
485
+ name = _validate_name(name)
451
486
  try:
452
487
  ctx = api.create_context(name)
453
488
  except Exception as exc:
@@ -462,7 +497,6 @@ def context_rm(
462
497
  context_id: int = typer.Argument(..., help="Context ID to delete"),
463
498
  ):
464
499
  """Delete a context (tasks keep their data, just lose the context)."""
465
- _require_auth()
466
500
  try:
467
501
  api.delete_context(context_id)
468
502
  except Exception as exc:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: doingapp
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A fast CLI task tracker — track what you're doing from the terminal.
5
5
  Author-email: Parker Grimes <parker@altellus.com>
6
6
  License-Expression: MIT
@@ -62,27 +62,55 @@ doing # See what's on your plate
62
62
  doing done 1 # Mark task #1 as done
63
63
  ```
64
64
 
65
+ Or authenticate with an API key (get one from the web UI at Settings → API Keys):
66
+
67
+ ```bash
68
+ doing apikey --key doing_xxxxx
69
+ ```
70
+
65
71
  ## Commands
66
72
 
67
73
  | Command | Description |
68
74
  |---------|-------------|
69
75
  | `doing` | Show active tasks (same as `doing ls`) |
70
76
  | `doing add <title>` | Add a task (`-n` notes, `-c` context ID) |
77
+ | `doing get <id>` | Get a single task by ID |
71
78
  | `doing done <id>` | Mark a task as done |
72
79
  | `doing pause <id>` | Pause a task |
73
80
  | `doing resume <id>` | Resume a paused task |
74
81
  | `doing reopen <id>` | Reopen a completed task |
75
82
  | `doing edit <id>` | Edit a task (`-t` title, `-n` notes, `-c` context, `--no-context`) |
76
83
  | `doing rm <id>` | Delete a task |
77
- | `doing ls` | List active tasks |
78
- | `doing log` | Show tasks done today (`-d YYYY-MM-DD` for other dates) |
79
- | `doing today` | Show all tasks grouped by status |
84
+ | `doing ls` | List active tasks (`-c` context ID) |
85
+ | `doing log` | Show tasks done today (`-d YYYY-MM-DD`, `-c` context ID) |
86
+ | `doing today` | Show all tasks grouped by status (`-c` context ID) |
80
87
  | `doing clear` | Mark all active tasks as done |
81
88
  | `doing contexts` | List contexts |
82
89
  | `doing context add <name>` | Create a context |
83
90
  | `doing context rm <id>` | Delete a context |
91
+ | `doing me` | Show current user info |
84
92
  | `doing login` | Log in |
85
93
  | `doing logout` | Log out |
94
+ | `doing apikey` | Save an API key (`-k` key) |
95
+
96
+ ## JSON output
97
+
98
+ Every command supports `--json` (or `-j`) for machine-readable output. This is useful for scripting and AI coding agents like Claude Code or Codex CLI.
99
+
100
+ ```bash
101
+ doing --json ls # [{"id": 1, "title": "...", ...}]
102
+ doing --json add "New task" # {"id": 2, "title": "New task", ...}
103
+ doing --json done 2 # {"id": 2, "status": "done", ...}
104
+ doing --json contexts # [{"id": 1, "name": "Work", ...}]
105
+ doing --json get 2 # {"id": 2, "title": "...", ...}
106
+ doing --json me # {"id": 1, "email": "...", ...}
107
+ ```
108
+
109
+ Errors also return structured JSON with a non-zero exit code:
110
+
111
+ ```bash
112
+ doing --json done 99999 # {"error": true, "status": 404, "detail": "Task not found"}
113
+ ```
86
114
 
87
115
  ## Configuration
88
116
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "doingapp"
7
- version = "0.5.0"
7
+ version = "0.5.1"
8
8
  description = "A fast CLI task tracker — track what you're doing from the terminal."
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes