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.
Files changed (189) hide show
  1. taskdog_ui-0.18.1/PKG-INFO +190 -0
  2. taskdog_ui-0.18.1/README.md +157 -0
  3. taskdog_ui-0.18.1/pyproject.toml +108 -0
  4. taskdog_ui-0.18.1/setup.cfg +4 -0
  5. taskdog_ui-0.18.1/src/taskdog/__init__.py +8 -0
  6. taskdog_ui-0.18.1/src/taskdog/cli/__init__.py +1 -0
  7. taskdog_ui-0.18.1/src/taskdog/cli/commands/__init__.py +1 -0
  8. taskdog_ui-0.18.1/src/taskdog/cli/commands/add.py +148 -0
  9. taskdog_ui-0.18.1/src/taskdog/cli/commands/add_dependency.py +40 -0
  10. taskdog_ui-0.18.1/src/taskdog/cli/commands/audit_logs.py +226 -0
  11. taskdog_ui-0.18.1/src/taskdog/cli/commands/cancel.py +29 -0
  12. taskdog_ui-0.18.1/src/taskdog/cli/commands/common_options.py +116 -0
  13. taskdog_ui-0.18.1/src/taskdog/cli/commands/done.py +30 -0
  14. taskdog_ui-0.18.1/src/taskdog/cli/commands/export.py +155 -0
  15. taskdog_ui-0.18.1/src/taskdog/cli/commands/fix_actual.py +187 -0
  16. taskdog_ui-0.18.1/src/taskdog/cli/commands/gantt.py +153 -0
  17. taskdog_ui-0.18.1/src/taskdog/cli/commands/note.py +218 -0
  18. taskdog_ui-0.18.1/src/taskdog/cli/commands/optimize.py +152 -0
  19. taskdog_ui-0.18.1/src/taskdog/cli/commands/pause.py +36 -0
  20. taskdog_ui-0.18.1/src/taskdog/cli/commands/remove_dependency.py +40 -0
  21. taskdog_ui-0.18.1/src/taskdog/cli/commands/reopen.py +40 -0
  22. taskdog_ui-0.18.1/src/taskdog/cli/commands/restore.py +29 -0
  23. taskdog_ui-0.18.1/src/taskdog/cli/commands/rm.py +56 -0
  24. taskdog_ui-0.18.1/src/taskdog/cli/commands/show.py +31 -0
  25. taskdog_ui-0.18.1/src/taskdog/cli/commands/start.py +32 -0
  26. taskdog_ui-0.18.1/src/taskdog/cli/commands/stats.py +65 -0
  27. taskdog_ui-0.18.1/src/taskdog/cli/commands/table.py +96 -0
  28. taskdog_ui-0.18.1/src/taskdog/cli/commands/table_helpers.py +27 -0
  29. taskdog_ui-0.18.1/src/taskdog/cli/commands/tags.py +95 -0
  30. taskdog_ui-0.18.1/src/taskdog/cli/commands/timeline.py +90 -0
  31. taskdog_ui-0.18.1/src/taskdog/cli/commands/tui.py +64 -0
  32. taskdog_ui-0.18.1/src/taskdog/cli/commands/update.py +128 -0
  33. taskdog_ui-0.18.1/src/taskdog/cli/commands/update_helpers.py +45 -0
  34. taskdog_ui-0.18.1/src/taskdog/cli/context.py +34 -0
  35. taskdog_ui-0.18.1/src/taskdog/cli/error_handler.py +98 -0
  36. taskdog_ui-0.18.1/src/taskdog/cli_main.py +187 -0
  37. taskdog_ui-0.18.1/src/taskdog/console/__init__.py +1 -0
  38. taskdog_ui-0.18.1/src/taskdog/console/console_writer.py +139 -0
  39. taskdog_ui-0.18.1/src/taskdog/console/rich_console_writer.py +212 -0
  40. taskdog_ui-0.18.1/src/taskdog/constants/__init__.py +102 -0
  41. taskdog_ui-0.18.1/src/taskdog/constants/ascii_art.py +13 -0
  42. taskdog_ui-0.18.1/src/taskdog/constants/audit_log.py +41 -0
  43. taskdog_ui-0.18.1/src/taskdog/constants/colors.py +33 -0
  44. taskdog_ui-0.18.1/src/taskdog/constants/common.py +39 -0
  45. taskdog_ui-0.18.1/src/taskdog/constants/formatting.py +15 -0
  46. taskdog_ui-0.18.1/src/taskdog/constants/gantt.py +33 -0
  47. taskdog_ui-0.18.1/src/taskdog/constants/icons.py +7 -0
  48. taskdog_ui-0.18.1/src/taskdog/constants/symbols.py +18 -0
  49. taskdog_ui-0.18.1/src/taskdog/constants/task_table.py +59 -0
  50. taskdog_ui-0.18.1/src/taskdog/constants/timeline.py +14 -0
  51. taskdog_ui-0.18.1/src/taskdog/exporters/__init__.py +13 -0
  52. taskdog_ui-0.18.1/src/taskdog/exporters/csv_task_exporter.py +54 -0
  53. taskdog_ui-0.18.1/src/taskdog/exporters/json_task_exporter.py +22 -0
  54. taskdog_ui-0.18.1/src/taskdog/exporters/markdown_table_exporter.py +154 -0
  55. taskdog_ui-0.18.1/src/taskdog/exporters/task_exporter.py +47 -0
  56. taskdog_ui-0.18.1/src/taskdog/formatters/__init__.py +1 -0
  57. taskdog_ui-0.18.1/src/taskdog/formatters/date_time_formatter.py +195 -0
  58. taskdog_ui-0.18.1/src/taskdog/formatters/duration_formatter.py +76 -0
  59. taskdog_ui-0.18.1/src/taskdog/infrastructure/__init__.py +12 -0
  60. taskdog_ui-0.18.1/src/taskdog/infrastructure/cli_config_manager.py +234 -0
  61. taskdog_ui-0.18.1/src/taskdog/presenters/__init__.py +18 -0
  62. taskdog_ui-0.18.1/src/taskdog/presenters/gantt_presenter.py +87 -0
  63. taskdog_ui-0.18.1/src/taskdog/presenters/statistics_presenter.py +137 -0
  64. taskdog_ui-0.18.1/src/taskdog/presenters/table_presenter.py +59 -0
  65. taskdog_ui-0.18.1/src/taskdog/presenters/timeline_presenter.py +191 -0
  66. taskdog_ui-0.18.1/src/taskdog/py.typed +0 -0
  67. taskdog_ui-0.18.1/src/taskdog/renderers/__init__.py +1 -0
  68. taskdog_ui-0.18.1/src/taskdog/renderers/gantt_cell_formatter.py +749 -0
  69. taskdog_ui-0.18.1/src/taskdog/renderers/rich_detail_renderer.py +148 -0
  70. taskdog_ui-0.18.1/src/taskdog/renderers/rich_gantt_renderer.py +361 -0
  71. taskdog_ui-0.18.1/src/taskdog/renderers/rich_renderer_base.py +23 -0
  72. taskdog_ui-0.18.1/src/taskdog/renderers/rich_statistics_renderer.py +413 -0
  73. taskdog_ui-0.18.1/src/taskdog/renderers/rich_table_renderer.py +415 -0
  74. taskdog_ui-0.18.1/src/taskdog/renderers/rich_timeline_renderer.py +248 -0
  75. taskdog_ui-0.18.1/src/taskdog/renderers/timeline_cell_formatter.py +131 -0
  76. taskdog_ui-0.18.1/src/taskdog/services/__init__.py +1 -0
  77. taskdog_ui-0.18.1/src/taskdog/services/task_data_loader.py +109 -0
  78. taskdog_ui-0.18.1/src/taskdog/shared/__init__.py +0 -0
  79. taskdog_ui-0.18.1/src/taskdog/shared/click_types/__init__.py +5 -0
  80. taskdog_ui-0.18.1/src/taskdog/shared/click_types/field_list.py +87 -0
  81. taskdog_ui-0.18.1/src/taskdog/shared/click_types/positive_number.py +95 -0
  82. taskdog_ui-0.18.1/src/taskdog/tui/__init__.py +1 -0
  83. taskdog_ui-0.18.1/src/taskdog/tui/app.py +523 -0
  84. taskdog_ui-0.18.1/src/taskdog/tui/commands/__init__.py +44 -0
  85. taskdog_ui-0.18.1/src/taskdog/tui/commands/add.py +65 -0
  86. taskdog_ui-0.18.1/src/taskdog/tui/commands/audit.py +15 -0
  87. taskdog_ui-0.18.1/src/taskdog/tui/commands/base.py +235 -0
  88. taskdog_ui-0.18.1/src/taskdog/tui/commands/batch_command_base.py +141 -0
  89. taskdog_ui-0.18.1/src/taskdog/tui/commands/cancel.py +24 -0
  90. taskdog_ui-0.18.1/src/taskdog/tui/commands/decorators.py +37 -0
  91. taskdog_ui-0.18.1/src/taskdog/tui/commands/done.py +16 -0
  92. taskdog_ui-0.18.1/src/taskdog/tui/commands/edit.py +188 -0
  93. taskdog_ui-0.18.1/src/taskdog/tui/commands/export.py +93 -0
  94. taskdog_ui-0.18.1/src/taskdog/tui/commands/factory.py +74 -0
  95. taskdog_ui-0.18.1/src/taskdog/tui/commands/fix_actual.py +53 -0
  96. taskdog_ui-0.18.1/src/taskdog/tui/commands/hard_delete.py +28 -0
  97. taskdog_ui-0.18.1/src/taskdog/tui/commands/help.py +14 -0
  98. taskdog_ui-0.18.1/src/taskdog/tui/commands/note.py +69 -0
  99. taskdog_ui-0.18.1/src/taskdog/tui/commands/optimize.py +121 -0
  100. taskdog_ui-0.18.1/src/taskdog/tui/commands/pause.py +16 -0
  101. taskdog_ui-0.18.1/src/taskdog/tui/commands/refresh.py +12 -0
  102. taskdog_ui-0.18.1/src/taskdog/tui/commands/reopen.py +24 -0
  103. taskdog_ui-0.18.1/src/taskdog/tui/commands/rm.py +28 -0
  104. taskdog_ui-0.18.1/src/taskdog/tui/commands/show.py +74 -0
  105. taskdog_ui-0.18.1/src/taskdog/tui/commands/start.py +16 -0
  106. taskdog_ui-0.18.1/src/taskdog/tui/commands/stats.py +13 -0
  107. taskdog_ui-0.18.1/src/taskdog/tui/constants/__init__.py +1 -0
  108. taskdog_ui-0.18.1/src/taskdog/tui/constants/command_mapping.py +21 -0
  109. taskdog_ui-0.18.1/src/taskdog/tui/constants/export_config.py +9 -0
  110. taskdog_ui-0.18.1/src/taskdog/tui/constants/keybindings.py +92 -0
  111. taskdog_ui-0.18.1/src/taskdog/tui/constants/ui_settings.py +45 -0
  112. taskdog_ui-0.18.1/src/taskdog/tui/context.py +35 -0
  113. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/__init__.py +11 -0
  114. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/algorithm_selection_dialog.py +217 -0
  115. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/base_dialog.py +119 -0
  116. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/confirmation_dialog.py +73 -0
  117. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/fix_actual_dialog.py +248 -0
  118. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/form_dialog.py +88 -0
  119. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/help_dialog.py +171 -0
  120. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/scrollable_dialog.py +86 -0
  121. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/stats_dialog.py +528 -0
  122. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/task_detail_dialog.py +397 -0
  123. taskdog_ui-0.18.1/src/taskdog/tui/dialogs/task_form_dialog.py +176 -0
  124. taskdog_ui-0.18.1/src/taskdog/tui/events.py +135 -0
  125. taskdog_ui-0.18.1/src/taskdog/tui/forms/__init__.py +3 -0
  126. taskdog_ui-0.18.1/src/taskdog/tui/forms/suggesters/__init__.py +9 -0
  127. taskdog_ui-0.18.1/src/taskdog/tui/forms/suggesters/comma_separated_suggester.py +58 -0
  128. taskdog_ui-0.18.1/src/taskdog/tui/forms/task_form_fields.py +224 -0
  129. taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/__init__.py +11 -0
  130. taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/datetime_validator.py +87 -0
  131. taskdog_ui-0.18.1/src/taskdog/tui/forms/validators/optimization_validators.py +66 -0
  132. taskdog_ui-0.18.1/src/taskdog/tui/messages.py +143 -0
  133. taskdog_ui-0.18.1/src/taskdog/tui/palette/__init__.py +13 -0
  134. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/__init__.py +27 -0
  135. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/audit_provider.py +13 -0
  136. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/base.py +122 -0
  137. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/export_providers.py +54 -0
  138. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/help_provider.py +13 -0
  139. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/optimize_providers.py +13 -0
  140. taskdog_ui-0.18.1/src/taskdog/tui/palette/providers/sort_providers.py +57 -0
  141. taskdog_ui-0.18.1/src/taskdog/tui/screens/__init__.py +1 -0
  142. taskdog_ui-0.18.1/src/taskdog/tui/screens/audit_log_screen.py +66 -0
  143. taskdog_ui-0.18.1/src/taskdog/tui/screens/main_screen.py +218 -0
  144. taskdog_ui-0.18.1/src/taskdog/tui/selection.py +69 -0
  145. taskdog_ui-0.18.1/src/taskdog/tui/services/__init__.py +7 -0
  146. taskdog_ui-0.18.1/src/taskdog/tui/services/connection_monitor.py +42 -0
  147. taskdog_ui-0.18.1/src/taskdog/tui/services/event_handler_registry.py +212 -0
  148. taskdog_ui-0.18.1/src/taskdog/tui/services/task_ui_manager.py +245 -0
  149. taskdog_ui-0.18.1/src/taskdog/tui/services/websocket_handler.py +37 -0
  150. taskdog_ui-0.18.1/src/taskdog/tui/state/__init__.py +7 -0
  151. taskdog_ui-0.18.1/src/taskdog/tui/state/connection_status.py +19 -0
  152. taskdog_ui-0.18.1/src/taskdog/tui/state/connection_status_manager.py +84 -0
  153. taskdog_ui-0.18.1/src/taskdog/tui/state/tui_state.py +257 -0
  154. taskdog_ui-0.18.1/src/taskdog/tui/styles/components.tcss +149 -0
  155. taskdog_ui-0.18.1/src/taskdog/tui/styles/dialogs.tcss +254 -0
  156. taskdog_ui-0.18.1/src/taskdog/tui/styles/main.tcss +74 -0
  157. taskdog_ui-0.18.1/src/taskdog/tui/styles/theme.tcss +8 -0
  158. taskdog_ui-0.18.1/src/taskdog/tui/utils/__init__.py +1 -0
  159. taskdog_ui-0.18.1/src/taskdog/tui/utils/css_loader.py +32 -0
  160. taskdog_ui-0.18.1/src/taskdog/tui/widgets/__init__.py +15 -0
  161. taskdog_ui-0.18.1/src/taskdog/tui/widgets/audit_log_entry_builder.py +184 -0
  162. taskdog_ui-0.18.1/src/taskdog/tui/widgets/audit_log_table.py +153 -0
  163. taskdog_ui-0.18.1/src/taskdog/tui/widgets/base_widget.py +60 -0
  164. taskdog_ui-0.18.1/src/taskdog/tui/widgets/custom_footer.py +251 -0
  165. taskdog_ui-0.18.1/src/taskdog/tui/widgets/gantt_data_table.py +652 -0
  166. taskdog_ui-0.18.1/src/taskdog/tui/widgets/gantt_widget.py +412 -0
  167. taskdog_ui-0.18.1/src/taskdog/tui/widgets/search_query_parser.py +127 -0
  168. taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_search_filter.py +238 -0
  169. taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_table.py +423 -0
  170. taskdog_ui-0.18.1/src/taskdog/tui/widgets/task_table_row_builder.py +229 -0
  171. taskdog_ui-0.18.1/src/taskdog/tui/widgets/vi_navigation_mixin.py +134 -0
  172. taskdog_ui-0.18.1/src/taskdog/tui/widgets/vi_select.py +77 -0
  173. taskdog_ui-0.18.1/src/taskdog/utils/__init__.py +0 -0
  174. taskdog_ui-0.18.1/src/taskdog/utils/editor.py +38 -0
  175. taskdog_ui-0.18.1/src/taskdog/utils/note_editor.py +211 -0
  176. taskdog_ui-0.18.1/src/taskdog/utils/notes_template.py +57 -0
  177. taskdog_ui-0.18.1/src/taskdog/utils/template_loader.py +86 -0
  178. taskdog_ui-0.18.1/src/taskdog/view_models/__init__.py +26 -0
  179. taskdog_ui-0.18.1/src/taskdog/view_models/base.py +25 -0
  180. taskdog_ui-0.18.1/src/taskdog/view_models/gantt_view_model.py +87 -0
  181. taskdog_ui-0.18.1/src/taskdog/view_models/statistics_view_model.py +108 -0
  182. taskdog_ui-0.18.1/src/taskdog/view_models/task_view_model.py +60 -0
  183. taskdog_ui-0.18.1/src/taskdog/view_models/timeline_view_model.py +68 -0
  184. taskdog_ui-0.18.1/src/taskdog_ui.egg-info/PKG-INFO +190 -0
  185. taskdog_ui-0.18.1/src/taskdog_ui.egg-info/SOURCES.txt +187 -0
  186. taskdog_ui-0.18.1/src/taskdog_ui.egg-info/dependency_links.txt +1 -0
  187. taskdog_ui-0.18.1/src/taskdog_ui.egg-info/entry_points.txt +2 -0
  188. taskdog_ui-0.18.1/src/taskdog_ui.egg-info/requires.txt +17 -0
  189. 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,8 @@
1
+ """taskdog - CLI task management tool"""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version("taskdog-ui")
7
+ except PackageNotFoundError:
8
+ __version__ = "unknown"
@@ -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}")