taskdog-ui 0.18.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.
- taskdog_ui-0.18.1/PKG-INFO +190 -0
- taskdog_ui-0.18.1/README.md +157 -0
- taskdog_ui-0.18.1/pyproject.toml +108 -0
- taskdog_ui-0.18.1/setup.cfg +4 -0
- taskdog_ui-0.18.1/src/taskdog/__init__.py +8 -0
- taskdog_ui-0.18.1/src/taskdog/cli/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/add.py +148 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/add_dependency.py +40 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/audit_logs.py +226 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/cancel.py +29 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/common_options.py +116 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/done.py +30 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/export.py +155 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/fix_actual.py +187 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/gantt.py +153 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/note.py +218 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/optimize.py +152 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/pause.py +36 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/remove_dependency.py +40 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/reopen.py +40 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/restore.py +29 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/rm.py +56 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/show.py +31 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/start.py +32 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/stats.py +65 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/table.py +96 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/table_helpers.py +27 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/tags.py +95 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/timeline.py +90 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/tui.py +64 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/update.py +128 -0
- taskdog_ui-0.18.1/src/taskdog/cli/commands/update_helpers.py +45 -0
- taskdog_ui-0.18.1/src/taskdog/cli/context.py +34 -0
- taskdog_ui-0.18.1/src/taskdog/cli/error_handler.py +98 -0
- taskdog_ui-0.18.1/src/taskdog/cli_main.py +187 -0
- taskdog_ui-0.18.1/src/taskdog/console/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/console/console_writer.py +139 -0
- taskdog_ui-0.18.1/src/taskdog/console/rich_console_writer.py +212 -0
- taskdog_ui-0.18.1/src/taskdog/constants/__init__.py +102 -0
- taskdog_ui-0.18.1/src/taskdog/constants/ascii_art.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/constants/audit_log.py +41 -0
- taskdog_ui-0.18.1/src/taskdog/constants/colors.py +33 -0
- taskdog_ui-0.18.1/src/taskdog/constants/common.py +39 -0
- taskdog_ui-0.18.1/src/taskdog/constants/formatting.py +15 -0
- taskdog_ui-0.18.1/src/taskdog/constants/gantt.py +33 -0
- taskdog_ui-0.18.1/src/taskdog/constants/icons.py +7 -0
- taskdog_ui-0.18.1/src/taskdog/constants/symbols.py +18 -0
- taskdog_ui-0.18.1/src/taskdog/constants/task_table.py +59 -0
- taskdog_ui-0.18.1/src/taskdog/constants/timeline.py +14 -0
- taskdog_ui-0.18.1/src/taskdog/exporters/__init__.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/exporters/csv_task_exporter.py +54 -0
- taskdog_ui-0.18.1/src/taskdog/exporters/json_task_exporter.py +22 -0
- taskdog_ui-0.18.1/src/taskdog/exporters/markdown_table_exporter.py +154 -0
- taskdog_ui-0.18.1/src/taskdog/exporters/task_exporter.py +47 -0
- taskdog_ui-0.18.1/src/taskdog/formatters/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/formatters/date_time_formatter.py +195 -0
- taskdog_ui-0.18.1/src/taskdog/formatters/duration_formatter.py +76 -0
- taskdog_ui-0.18.1/src/taskdog/infrastructure/__init__.py +12 -0
- taskdog_ui-0.18.1/src/taskdog/infrastructure/cli_config_manager.py +234 -0
- taskdog_ui-0.18.1/src/taskdog/presenters/__init__.py +18 -0
- taskdog_ui-0.18.1/src/taskdog/presenters/gantt_presenter.py +87 -0
- taskdog_ui-0.18.1/src/taskdog/presenters/statistics_presenter.py +137 -0
- taskdog_ui-0.18.1/src/taskdog/presenters/table_presenter.py +59 -0
- taskdog_ui-0.18.1/src/taskdog/presenters/timeline_presenter.py +191 -0
- taskdog_ui-0.18.1/src/taskdog/py.typed +0 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/gantt_cell_formatter.py +749 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_detail_renderer.py +148 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_gantt_renderer.py +361 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_renderer_base.py +23 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_statistics_renderer.py +413 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_table_renderer.py +415 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/rich_timeline_renderer.py +248 -0
- taskdog_ui-0.18.1/src/taskdog/renderers/timeline_cell_formatter.py +131 -0
- taskdog_ui-0.18.1/src/taskdog/services/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/services/task_data_loader.py +109 -0
- taskdog_ui-0.18.1/src/taskdog/shared/__init__.py +0 -0
- taskdog_ui-0.18.1/src/taskdog/shared/click_types/__init__.py +5 -0
- taskdog_ui-0.18.1/src/taskdog/shared/click_types/field_list.py +87 -0
- taskdog_ui-0.18.1/src/taskdog/shared/click_types/positive_number.py +95 -0
- taskdog_ui-0.18.1/src/taskdog/tui/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/tui/app.py +523 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/__init__.py +44 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/add.py +65 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/audit.py +15 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/base.py +235 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/batch_command_base.py +141 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/cancel.py +24 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/decorators.py +37 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/done.py +16 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/edit.py +188 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/export.py +93 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/factory.py +74 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/fix_actual.py +53 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/hard_delete.py +28 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/help.py +14 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/note.py +69 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/optimize.py +121 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/pause.py +16 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/refresh.py +12 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/reopen.py +24 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/rm.py +28 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/show.py +74 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/start.py +16 -0
- taskdog_ui-0.18.1/src/taskdog/tui/commands/stats.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/tui/constants/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/tui/constants/command_mapping.py +21 -0
- taskdog_ui-0.18.1/src/taskdog/tui/constants/export_config.py +9 -0
- taskdog_ui-0.18.1/src/taskdog/tui/constants/keybindings.py +92 -0
- taskdog_ui-0.18.1/src/taskdog/tui/constants/ui_settings.py +45 -0
- taskdog_ui-0.18.1/src/taskdog/tui/context.py +35 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/__init__.py +11 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/algorithm_selection_dialog.py +217 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/base_dialog.py +119 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/confirmation_dialog.py +73 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/fix_actual_dialog.py +248 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/form_dialog.py +88 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/help_dialog.py +171 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/scrollable_dialog.py +86 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/stats_dialog.py +528 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/task_detail_dialog.py +397 -0
- taskdog_ui-0.18.1/src/taskdog/tui/dialogs/task_form_dialog.py +176 -0
- taskdog_ui-0.18.1/src/taskdog/tui/events.py +135 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/__init__.py +3 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/suggesters/__init__.py +9 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/suggesters/comma_separated_suggester.py +58 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/task_form_fields.py +224 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/__init__.py +11 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/datetime_validator.py +87 -0
- taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/optimization_validators.py +66 -0
- taskdog_ui-0.18.1/src/taskdog/tui/messages.py +143 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/__init__.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/__init__.py +27 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/audit_provider.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/base.py +122 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/export_providers.py +54 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/help_provider.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/optimize_providers.py +13 -0
- taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/sort_providers.py +57 -0
- taskdog_ui-0.18.1/src/taskdog/tui/screens/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/tui/screens/audit_log_screen.py +66 -0
- taskdog_ui-0.18.1/src/taskdog/tui/screens/main_screen.py +218 -0
- taskdog_ui-0.18.1/src/taskdog/tui/selection.py +69 -0
- taskdog_ui-0.18.1/src/taskdog/tui/services/__init__.py +7 -0
- taskdog_ui-0.18.1/src/taskdog/tui/services/connection_monitor.py +42 -0
- taskdog_ui-0.18.1/src/taskdog/tui/services/event_handler_registry.py +212 -0
- taskdog_ui-0.18.1/src/taskdog/tui/services/task_ui_manager.py +245 -0
- taskdog_ui-0.18.1/src/taskdog/tui/services/websocket_handler.py +37 -0
- taskdog_ui-0.18.1/src/taskdog/tui/state/__init__.py +7 -0
- taskdog_ui-0.18.1/src/taskdog/tui/state/connection_status.py +19 -0
- taskdog_ui-0.18.1/src/taskdog/tui/state/connection_status_manager.py +84 -0
- taskdog_ui-0.18.1/src/taskdog/tui/state/tui_state.py +257 -0
- taskdog_ui-0.18.1/src/taskdog/tui/styles/components.tcss +149 -0
- taskdog_ui-0.18.1/src/taskdog/tui/styles/dialogs.tcss +254 -0
- taskdog_ui-0.18.1/src/taskdog/tui/styles/main.tcss +74 -0
- taskdog_ui-0.18.1/src/taskdog/tui/styles/theme.tcss +8 -0
- taskdog_ui-0.18.1/src/taskdog/tui/utils/__init__.py +1 -0
- taskdog_ui-0.18.1/src/taskdog/tui/utils/css_loader.py +32 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/__init__.py +15 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/audit_log_entry_builder.py +184 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/audit_log_table.py +153 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/base_widget.py +60 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/custom_footer.py +251 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/gantt_data_table.py +652 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/gantt_widget.py +412 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/search_query_parser.py +127 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_search_filter.py +238 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_table.py +423 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_table_row_builder.py +229 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/vi_navigation_mixin.py +134 -0
- taskdog_ui-0.18.1/src/taskdog/tui/widgets/vi_select.py +77 -0
- taskdog_ui-0.18.1/src/taskdog/utils/__init__.py +0 -0
- taskdog_ui-0.18.1/src/taskdog/utils/editor.py +38 -0
- taskdog_ui-0.18.1/src/taskdog/utils/note_editor.py +211 -0
- taskdog_ui-0.18.1/src/taskdog/utils/notes_template.py +57 -0
- taskdog_ui-0.18.1/src/taskdog/utils/template_loader.py +86 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/__init__.py +26 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/base.py +25 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/gantt_view_model.py +87 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/statistics_view_model.py +108 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/task_view_model.py +60 -0
- taskdog_ui-0.18.1/src/taskdog/view_models/timeline_view_model.py +68 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/PKG-INFO +190 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/SOURCES.txt +187 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/dependency_links.txt +1 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/entry_points.txt +2 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/requires.txt +17 -0
- taskdog_ui-0.18.1/src/taskdog_ui.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: taskdog-ui
|
|
3
|
+
Version: 0.18.1
|
|
4
|
+
Summary: CLI and TUI for Taskdog task management system
|
|
5
|
+
Author: Kohei Wada
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Kohei-Wada/taskdog
|
|
8
|
+
Project-URL: Repository, https://github.com/Kohei-Wada/taskdog
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/Kohei-Wada/taskdog/issues
|
|
10
|
+
Keywords: task,management,cli,tui
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Python: >=3.12
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
Requires-Dist: taskdog-core==0.18.1
|
|
19
|
+
Requires-Dist: taskdog-client==0.18.1
|
|
20
|
+
Requires-Dist: click>=8.3.0
|
|
21
|
+
Requires-Dist: rich>=14.2.0
|
|
22
|
+
Requires-Dist: textual>=8.0.0
|
|
23
|
+
Requires-Dist: python-dateutil>=2.8.0
|
|
24
|
+
Requires-Dist: websockets>=14.0
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-asyncio>=1.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: ruff>=0.7.0; extra == "dev"
|
|
31
|
+
Provides-Extra: server
|
|
32
|
+
Requires-Dist: taskdog-server==0.18.1; extra == "server"
|
|
33
|
+
|
|
34
|
+
# taskdog-ui
|
|
35
|
+
|
|
36
|
+
Command-line interface and terminal user interface for Taskdog task management system.
|
|
37
|
+
|
|
38
|
+
## Overview
|
|
39
|
+
|
|
40
|
+
This package provides two user interfaces for Taskdog:
|
|
41
|
+
|
|
42
|
+
### CLI (Command-Line Interface)
|
|
43
|
+
|
|
44
|
+
- 30+ commands for task management
|
|
45
|
+
- Rich terminal output with colors and formatting
|
|
46
|
+
- Batch operations support
|
|
47
|
+
- Export capabilities (JSON, CSV, Markdown)
|
|
48
|
+
|
|
49
|
+
### TUI (Terminal User Interface)
|
|
50
|
+
|
|
51
|
+
- Full-screen interactive interface powered by Textual
|
|
52
|
+
- Real-time task table with filtering and search
|
|
53
|
+
- Gantt chart visualization
|
|
54
|
+
- Vi-style keyboard navigation
|
|
55
|
+
- Modal dialogs for task creation and editing
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
Basic installation (CLI and TUI):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pip install taskdog-ui
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
With server support (includes taskdog-server):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install taskdog-ui[server]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
For development:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install -e ".[dev]"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Prerequisites
|
|
78
|
+
|
|
79
|
+
**IMPORTANT**: The CLI and TUI require a running API server. All commands will fail without it.
|
|
80
|
+
|
|
81
|
+
### 1. Install the Server
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Server should be installed via workspace
|
|
85
|
+
cd /path/to/taskdog
|
|
86
|
+
make install
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2. Start the Server
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Start the server (required before any CLI/TUI usage)
|
|
93
|
+
taskdog-server --host 127.0.0.1 --port 8000
|
|
94
|
+
|
|
95
|
+
# Or use systemd for auto-start (recommended)
|
|
96
|
+
systemctl --user start taskdog-server
|
|
97
|
+
systemctl --user enable taskdog-server
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 3. Configure API Connection
|
|
101
|
+
|
|
102
|
+
Edit `~/.config/taskdog/cli.toml`:
|
|
103
|
+
|
|
104
|
+
```toml
|
|
105
|
+
[api]
|
|
106
|
+
enabled = true
|
|
107
|
+
host = "127.0.0.1"
|
|
108
|
+
port = 8000
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Or set environment variables:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
export TASKDOG_API_HOST=127.0.0.1
|
|
115
|
+
export TASKDOG_API_PORT=8000
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 4. Verify Connection
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Test that CLI can connect to server
|
|
122
|
+
taskdog table
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Usage
|
|
126
|
+
|
|
127
|
+
**Note**: All commands below require the server to be running (see Prerequisites above).
|
|
128
|
+
|
|
129
|
+
### CLI Examples
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Add a task
|
|
133
|
+
taskdog add "Implement feature" --priority 3
|
|
134
|
+
|
|
135
|
+
# View tasks
|
|
136
|
+
taskdog table
|
|
137
|
+
taskdog gantt
|
|
138
|
+
|
|
139
|
+
# Task lifecycle
|
|
140
|
+
taskdog start 1
|
|
141
|
+
taskdog done 1
|
|
142
|
+
|
|
143
|
+
# Optimization
|
|
144
|
+
taskdog optimize --algorithm balanced
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### TUI
|
|
148
|
+
|
|
149
|
+
Launch the interactive interface:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
taskdog tui
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Keyboard shortcuts:
|
|
156
|
+
|
|
157
|
+
- `a`: Add task
|
|
158
|
+
- `s`: Start task
|
|
159
|
+
- `d`: Complete task
|
|
160
|
+
- `e`: Edit task
|
|
161
|
+
- `/`: Search
|
|
162
|
+
- `q`: Quit
|
|
163
|
+
|
|
164
|
+
## Architecture
|
|
165
|
+
|
|
166
|
+
The UI uses:
|
|
167
|
+
|
|
168
|
+
- **Click**: CLI framework
|
|
169
|
+
- **Rich**: Terminal formatting and rendering
|
|
170
|
+
- **Textual**: TUI framework
|
|
171
|
+
- **httpx**: API client (for client-server mode)
|
|
172
|
+
- **taskdog-core**: Core business logic and infrastructure
|
|
173
|
+
|
|
174
|
+
## Dependencies
|
|
175
|
+
|
|
176
|
+
- `taskdog-core`: Core business logic
|
|
177
|
+
- `click`: CLI framework
|
|
178
|
+
- `rich`: Terminal formatting
|
|
179
|
+
- `textual`: TUI framework
|
|
180
|
+
- `httpx`: HTTP client
|
|
181
|
+
|
|
182
|
+
## Testing
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
pytest tests/
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# taskdog-ui
|
|
2
|
+
|
|
3
|
+
Command-line interface and terminal user interface for Taskdog task management system.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This package provides two user interfaces for Taskdog:
|
|
8
|
+
|
|
9
|
+
### CLI (Command-Line Interface)
|
|
10
|
+
|
|
11
|
+
- 30+ commands for task management
|
|
12
|
+
- Rich terminal output with colors and formatting
|
|
13
|
+
- Batch operations support
|
|
14
|
+
- Export capabilities (JSON, CSV, Markdown)
|
|
15
|
+
|
|
16
|
+
### TUI (Terminal User Interface)
|
|
17
|
+
|
|
18
|
+
- Full-screen interactive interface powered by Textual
|
|
19
|
+
- Real-time task table with filtering and search
|
|
20
|
+
- Gantt chart visualization
|
|
21
|
+
- Vi-style keyboard navigation
|
|
22
|
+
- Modal dialogs for task creation and editing
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
Basic installation (CLI and TUI):
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install taskdog-ui
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
With server support (includes taskdog-server):
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install taskdog-ui[server]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
For development:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install -e ".[dev]"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Prerequisites
|
|
45
|
+
|
|
46
|
+
**IMPORTANT**: The CLI and TUI require a running API server. All commands will fail without it.
|
|
47
|
+
|
|
48
|
+
### 1. Install the Server
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Server should be installed via workspace
|
|
52
|
+
cd /path/to/taskdog
|
|
53
|
+
make install
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. Start the Server
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Start the server (required before any CLI/TUI usage)
|
|
60
|
+
taskdog-server --host 127.0.0.1 --port 8000
|
|
61
|
+
|
|
62
|
+
# Or use systemd for auto-start (recommended)
|
|
63
|
+
systemctl --user start taskdog-server
|
|
64
|
+
systemctl --user enable taskdog-server
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Configure API Connection
|
|
68
|
+
|
|
69
|
+
Edit `~/.config/taskdog/cli.toml`:
|
|
70
|
+
|
|
71
|
+
```toml
|
|
72
|
+
[api]
|
|
73
|
+
enabled = true
|
|
74
|
+
host = "127.0.0.1"
|
|
75
|
+
port = 8000
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or set environment variables:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
export TASKDOG_API_HOST=127.0.0.1
|
|
82
|
+
export TASKDOG_API_PORT=8000
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4. Verify Connection
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Test that CLI can connect to server
|
|
89
|
+
taskdog table
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Usage
|
|
93
|
+
|
|
94
|
+
**Note**: All commands below require the server to be running (see Prerequisites above).
|
|
95
|
+
|
|
96
|
+
### CLI Examples
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Add a task
|
|
100
|
+
taskdog add "Implement feature" --priority 3
|
|
101
|
+
|
|
102
|
+
# View tasks
|
|
103
|
+
taskdog table
|
|
104
|
+
taskdog gantt
|
|
105
|
+
|
|
106
|
+
# Task lifecycle
|
|
107
|
+
taskdog start 1
|
|
108
|
+
taskdog done 1
|
|
109
|
+
|
|
110
|
+
# Optimization
|
|
111
|
+
taskdog optimize --algorithm balanced
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### TUI
|
|
115
|
+
|
|
116
|
+
Launch the interactive interface:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
taskdog tui
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Keyboard shortcuts:
|
|
123
|
+
|
|
124
|
+
- `a`: Add task
|
|
125
|
+
- `s`: Start task
|
|
126
|
+
- `d`: Complete task
|
|
127
|
+
- `e`: Edit task
|
|
128
|
+
- `/`: Search
|
|
129
|
+
- `q`: Quit
|
|
130
|
+
|
|
131
|
+
## Architecture
|
|
132
|
+
|
|
133
|
+
The UI uses:
|
|
134
|
+
|
|
135
|
+
- **Click**: CLI framework
|
|
136
|
+
- **Rich**: Terminal formatting and rendering
|
|
137
|
+
- **Textual**: TUI framework
|
|
138
|
+
- **httpx**: API client (for client-server mode)
|
|
139
|
+
- **taskdog-core**: Core business logic and infrastructure
|
|
140
|
+
|
|
141
|
+
## Dependencies
|
|
142
|
+
|
|
143
|
+
- `taskdog-core`: Core business logic
|
|
144
|
+
- `click`: CLI framework
|
|
145
|
+
- `rich`: Terminal formatting
|
|
146
|
+
- `textual`: TUI framework
|
|
147
|
+
- `httpx`: HTTP client
|
|
148
|
+
|
|
149
|
+
## Testing
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
pytest tests/
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## License
|
|
156
|
+
|
|
157
|
+
MIT
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "taskdog-ui"
|
|
3
|
+
version = "0.18.1"
|
|
4
|
+
description = "CLI and TUI for Taskdog task management system"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
authors = [
|
|
8
|
+
{ name = "Kohei Wada" }
|
|
9
|
+
]
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
keywords = ["task", "management", "cli", "tui"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 4 - Beta",
|
|
14
|
+
"License :: OSI Approved :: MIT License",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.12",
|
|
17
|
+
"Programming Language :: Python :: 3.13",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
dependencies = [
|
|
21
|
+
"taskdog-core==0.18.1",
|
|
22
|
+
"taskdog-client==0.18.1",
|
|
23
|
+
"click>=8.3.0",
|
|
24
|
+
"rich>=14.2.0",
|
|
25
|
+
"textual>=8.0.0",
|
|
26
|
+
"python-dateutil>=2.8.0",
|
|
27
|
+
"websockets>=14.0",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.optional-dependencies]
|
|
31
|
+
dev = [
|
|
32
|
+
"pytest>=7.0.0",
|
|
33
|
+
"pytest-cov>=4.0.0",
|
|
34
|
+
"pytest-asyncio>=1.0.0",
|
|
35
|
+
"mypy>=1.0.0",
|
|
36
|
+
"ruff>=0.7.0",
|
|
37
|
+
]
|
|
38
|
+
server = [
|
|
39
|
+
"taskdog-server==0.18.1",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[project.scripts]
|
|
43
|
+
taskdog = "taskdog.cli_main:cli"
|
|
44
|
+
|
|
45
|
+
[project.urls]
|
|
46
|
+
Homepage = "https://github.com/Kohei-Wada/taskdog"
|
|
47
|
+
Repository = "https://github.com/Kohei-Wada/taskdog"
|
|
48
|
+
"Bug Tracker" = "https://github.com/Kohei-Wada/taskdog/issues"
|
|
49
|
+
|
|
50
|
+
[build-system]
|
|
51
|
+
requires = ["setuptools>=68.0.0", "wheel"]
|
|
52
|
+
build-backend = "setuptools.build_meta"
|
|
53
|
+
|
|
54
|
+
[tool.setuptools]
|
|
55
|
+
packages = [
|
|
56
|
+
"taskdog",
|
|
57
|
+
"taskdog.formatters",
|
|
58
|
+
"taskdog.services",
|
|
59
|
+
"taskdog.cli",
|
|
60
|
+
"taskdog.cli.commands",
|
|
61
|
+
"taskdog.tui",
|
|
62
|
+
"taskdog.tui.commands",
|
|
63
|
+
"taskdog.tui.constants",
|
|
64
|
+
"taskdog.tui.palette",
|
|
65
|
+
"taskdog.tui.palette.providers",
|
|
66
|
+
"taskdog.tui.services",
|
|
67
|
+
"taskdog.tui.utils",
|
|
68
|
+
"taskdog.tui.screens",
|
|
69
|
+
"taskdog.tui.dialogs",
|
|
70
|
+
"taskdog.tui.widgets",
|
|
71
|
+
"taskdog.tui.forms",
|
|
72
|
+
"taskdog.tui.forms.suggesters",
|
|
73
|
+
"taskdog.tui.forms.validators",
|
|
74
|
+
"taskdog.tui.state",
|
|
75
|
+
"taskdog.tui.styles",
|
|
76
|
+
"taskdog.console",
|
|
77
|
+
"taskdog.renderers",
|
|
78
|
+
"taskdog.exporters",
|
|
79
|
+
"taskdog.constants",
|
|
80
|
+
"taskdog.presenters",
|
|
81
|
+
"taskdog.view_models",
|
|
82
|
+
"taskdog.utils",
|
|
83
|
+
"taskdog.shared",
|
|
84
|
+
"taskdog.shared.click_types",
|
|
85
|
+
"taskdog.infrastructure",
|
|
86
|
+
]
|
|
87
|
+
package-dir = { "" = "src" }
|
|
88
|
+
|
|
89
|
+
[tool.setuptools.package-data]
|
|
90
|
+
taskdog = ["py.typed"]
|
|
91
|
+
"taskdog.tui.styles" = ["*.tcss"]
|
|
92
|
+
|
|
93
|
+
[tool.mypy]
|
|
94
|
+
python_version = "3.13"
|
|
95
|
+
strict = true
|
|
96
|
+
# Disable unused-ignore warnings (environment-dependent)
|
|
97
|
+
warn_unused_ignores = false
|
|
98
|
+
|
|
99
|
+
# Ignore missing imports for taskdog_client (installed separately)
|
|
100
|
+
[[tool.mypy.overrides]]
|
|
101
|
+
module = "taskdog_client"
|
|
102
|
+
ignore_missing_imports = true
|
|
103
|
+
|
|
104
|
+
[tool.pytest.ini_options]
|
|
105
|
+
testpaths = ["tests"]
|
|
106
|
+
python_files = ["test_*.py"]
|
|
107
|
+
python_classes = ["Test*"]
|
|
108
|
+
python_functions = ["test_*"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""CLI interface."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""CLI commands."""
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Add command - Add a new task."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from taskdog.cli.error_handler import handle_task_errors
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
from taskdog.cli.context import CliContext
|
|
15
|
+
from taskdog_core.domain.exceptions.task_exceptions import TaskValidationError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.command(name="add", help="Add a new task.")
|
|
19
|
+
@click.argument("name", type=str)
|
|
20
|
+
@click.option(
|
|
21
|
+
"--priority",
|
|
22
|
+
"-p",
|
|
23
|
+
type=int,
|
|
24
|
+
default=None,
|
|
25
|
+
help="Task priority (default: from config or 5, higher value = higher priority)",
|
|
26
|
+
)
|
|
27
|
+
@click.option(
|
|
28
|
+
"--fixed",
|
|
29
|
+
"-f",
|
|
30
|
+
is_flag=True,
|
|
31
|
+
help="Mark task as fixed (won't be rescheduled by optimizer)",
|
|
32
|
+
)
|
|
33
|
+
@click.option(
|
|
34
|
+
"--depends-on",
|
|
35
|
+
"-d",
|
|
36
|
+
multiple=True,
|
|
37
|
+
type=int,
|
|
38
|
+
help="Task IDs this task depends on (can be specified multiple times)",
|
|
39
|
+
)
|
|
40
|
+
@click.option(
|
|
41
|
+
"--tag",
|
|
42
|
+
"-t",
|
|
43
|
+
multiple=True,
|
|
44
|
+
type=str,
|
|
45
|
+
help="Tags for categorization and filtering (can be specified multiple times)",
|
|
46
|
+
)
|
|
47
|
+
@click.option(
|
|
48
|
+
"--deadline",
|
|
49
|
+
"-D",
|
|
50
|
+
type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S"]),
|
|
51
|
+
default=None,
|
|
52
|
+
help="Task deadline (format: YYYY-MM-DD HH:MM:SS)",
|
|
53
|
+
)
|
|
54
|
+
@click.option(
|
|
55
|
+
"--estimate",
|
|
56
|
+
"-e",
|
|
57
|
+
type=float,
|
|
58
|
+
default=None,
|
|
59
|
+
help="Estimated duration in hours (must be > 0)",
|
|
60
|
+
)
|
|
61
|
+
@click.option(
|
|
62
|
+
"--start",
|
|
63
|
+
"-s",
|
|
64
|
+
type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S"]),
|
|
65
|
+
default=None,
|
|
66
|
+
help="Planned start time (format: YYYY-MM-DD HH:MM:SS)",
|
|
67
|
+
)
|
|
68
|
+
@click.option(
|
|
69
|
+
"--end",
|
|
70
|
+
"-E",
|
|
71
|
+
type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S"]),
|
|
72
|
+
default=None,
|
|
73
|
+
help="Planned end time (format: YYYY-MM-DD HH:MM:SS)",
|
|
74
|
+
)
|
|
75
|
+
@click.pass_context
|
|
76
|
+
@handle_task_errors("adding task")
|
|
77
|
+
def add_command(
|
|
78
|
+
ctx: click.Context,
|
|
79
|
+
name: str,
|
|
80
|
+
priority: int,
|
|
81
|
+
fixed: bool,
|
|
82
|
+
depends_on: tuple[int, ...],
|
|
83
|
+
tag: tuple[str, ...],
|
|
84
|
+
deadline: datetime | None,
|
|
85
|
+
estimate: float | None,
|
|
86
|
+
start: datetime | None,
|
|
87
|
+
end: datetime | None,
|
|
88
|
+
) -> None:
|
|
89
|
+
"""Add a new task.
|
|
90
|
+
|
|
91
|
+
You can set all task properties at creation time, or use dedicated commands
|
|
92
|
+
after creation (deadline, estimate, schedule) for updates.
|
|
93
|
+
|
|
94
|
+
Usage:
|
|
95
|
+
# Basic task
|
|
96
|
+
taskdog add "Task name"
|
|
97
|
+
|
|
98
|
+
# With priority and tags
|
|
99
|
+
taskdog add "Task name" --priority 3 --tag backend
|
|
100
|
+
|
|
101
|
+
# Full task with all properties
|
|
102
|
+
taskdog add "Implement auth" -p 5 -D "2025-12-01" -e 8 -s "2025-11-20" -t backend
|
|
103
|
+
|
|
104
|
+
Examples:
|
|
105
|
+
# Simple task
|
|
106
|
+
taskdog add "Implement authentication"
|
|
107
|
+
|
|
108
|
+
# With priority
|
|
109
|
+
taskdog add "Fix login bug" -p 5
|
|
110
|
+
|
|
111
|
+
# With deadline and estimate
|
|
112
|
+
taskdog add "Add unit tests" --deadline "2025-12-15" --estimate 4
|
|
113
|
+
|
|
114
|
+
# Complete task with schedule
|
|
115
|
+
taskdog add "Code review" -p 3 -s "2025-11-20 09:00" -e "2025-11-20 12:00"
|
|
116
|
+
|
|
117
|
+
# With dependencies and tags
|
|
118
|
+
taskdog add "Deploy feature" -d 123 -t deployment -p 5
|
|
119
|
+
"""
|
|
120
|
+
ctx_obj: CliContext = ctx.obj
|
|
121
|
+
console_writer = ctx_obj.console_writer
|
|
122
|
+
|
|
123
|
+
# Create task via API client
|
|
124
|
+
task = ctx_obj.api_client.create_task(
|
|
125
|
+
name=name,
|
|
126
|
+
priority=priority,
|
|
127
|
+
is_fixed=fixed,
|
|
128
|
+
tags=list(tag) if tag else None,
|
|
129
|
+
deadline=deadline,
|
|
130
|
+
estimated_duration=estimate,
|
|
131
|
+
planned_start=start,
|
|
132
|
+
planned_end=end,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Add dependencies if specified
|
|
136
|
+
if depends_on:
|
|
137
|
+
for dep_id in depends_on:
|
|
138
|
+
try:
|
|
139
|
+
task = ctx_obj.api_client.add_dependency(task.id, dep_id)
|
|
140
|
+
except TaskValidationError as e:
|
|
141
|
+
console_writer.validation_error(str(e))
|
|
142
|
+
# Continue adding other dependencies even if one fails
|
|
143
|
+
|
|
144
|
+
console_writer.task_success("Added", task)
|
|
145
|
+
if task.depends_on:
|
|
146
|
+
console_writer.info(f"Dependencies: {task.depends_on}")
|
|
147
|
+
if task.tags:
|
|
148
|
+
console_writer.info(f"Tags: {', '.join(task.tags)}")
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Add-dependency command - Add a task dependency."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from taskdog.cli.error_handler import handle_task_errors
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from taskdog.cli.context import CliContext
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@click.command(name="add-dependency", help="Add a dependency to a task.")
|
|
16
|
+
@click.argument("task_id", type=int)
|
|
17
|
+
@click.argument("depends_on_id", type=int)
|
|
18
|
+
@click.pass_context
|
|
19
|
+
@handle_task_errors("adding dependency")
|
|
20
|
+
def add_dependency_command(
|
|
21
|
+
ctx: click.Context, task_id: int, depends_on_id: int
|
|
22
|
+
) -> None:
|
|
23
|
+
"""Add a dependency to a task.
|
|
24
|
+
|
|
25
|
+
Usage:
|
|
26
|
+
taskdog add-dependency <TASK_ID> <DEPENDS_ON_ID>
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
taskdog add-dependency 5 3 # Task 5 depends on task 3
|
|
30
|
+
"""
|
|
31
|
+
ctx_obj: CliContext = ctx.obj
|
|
32
|
+
console_writer = ctx_obj.console_writer
|
|
33
|
+
|
|
34
|
+
# Add dependency via API client
|
|
35
|
+
task = ctx_obj.api_client.add_dependency(task_id, depends_on_id)
|
|
36
|
+
|
|
37
|
+
console_writer.success(
|
|
38
|
+
f"Added dependency: Task {task_id} now depends on task {depends_on_id}"
|
|
39
|
+
)
|
|
40
|
+
console_writer.info(f"Task {task_id} dependencies: {task.depends_on}")
|