taskops-cli 0.5.5__tar.gz → 0.5.6__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 (295) hide show
  1. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/CHANGELOG.md +26 -0
  2. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/PKG-INFO +1 -1
  3. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_version.py +1 -1
  4. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/handler.py +17 -2
  5. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/ui/app.js +7 -7
  6. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/actors-window-filter.tsx +26 -22
  7. taskops_cli-0.5.6/ui/smoke/sections/daysheet-midnight-spill.tsx +103 -0
  8. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/actors/Daysheet.tsx +26 -8
  9. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/hoursWindow.ts +10 -4
  10. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.claude/settings.json +0 -0
  11. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.gitattributes +0 -0
  12. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.github/workflows/ci.yml +0 -0
  13. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.github/workflows/workflow.yml +0 -0
  14. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.gitignore +0 -0
  15. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.mcp.json +0 -0
  16. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite +0 -0
  17. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite-shm +0 -0
  18. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite-wal +0 -0
  19. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/events.jsonl +0 -0
  20. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/live.sqlite +0 -0
  21. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/live.sqlite-shm +0 -0
  22. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board/live.sqlite-wal +0 -0
  23. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/board.json +0 -0
  24. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/reports/lifecycle-chapter.html +0 -0
  25. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/reports/reports-chapter.html +0 -0
  26. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/.taskops/ui.lock +0 -0
  27. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ARCHITECTURE.md +0 -0
  28. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/CLAUDE.md +0 -0
  29. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/README.md +0 -0
  30. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/pyproject.toml +0 -0
  31. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/smoke.sh +0 -0
  32. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/__init__.py +0 -0
  33. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_clock.py +0 -0
  34. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_errors.py +0 -0
  35. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_ids.py +0 -0
  36. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_json.py +0 -0
  37. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_locate.py +0 -0
  38. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/_wire.py +0 -0
  39. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/board.py +0 -0
  40. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/__init__.py +0 -0
  41. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/__main__.py +0 -0
  42. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/admin.py +0 -0
  43. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/claude.py +0 -0
  44. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/commands.py +0 -0
  45. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/enrol.py +0 -0
  46. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/github.py +0 -0
  47. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/gitremote.py +0 -0
  48. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/grants.py +0 -0
  49. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/hooks.py +0 -0
  50. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/main.py +0 -0
  51. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/operate.py +0 -0
  52. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/paging.py +0 -0
  53. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/parser.py +0 -0
  54. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/pull.py +0 -0
  55. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/push.py +0 -0
  56. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/remote.py +0 -0
  57. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/rm.py +0 -0
  58. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/serving.py +0 -0
  59. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/team.py +0 -0
  60. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/watch.py +0 -0
  61. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/window.py +0 -0
  62. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/cli/wording.py +0 -0
  63. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/__init__.py +0 -0
  64. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/actors.py +0 -0
  65. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/challenge.py +0 -0
  66. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/chapters.py +0 -0
  67. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/event.py +0 -0
  68. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/forge.py +0 -0
  69. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/graph.py +0 -0
  70. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/holding.py +0 -0
  71. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/hours.py +0 -0
  72. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/kinds.py +0 -0
  73. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/machine.py +0 -0
  74. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/mentions.py +0 -0
  75. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/replay.py +0 -0
  76. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/reports.py +0 -0
  77. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/review.py +0 -0
  78. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/scope.py +0 -0
  79. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/seams.py +0 -0
  80. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/core/types.py +0 -0
  81. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/__init__.py +0 -0
  82. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/bare.py +0 -0
  83. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/bind.py +0 -0
  84. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/catchup.py +0 -0
  85. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/claudefiles.py +0 -0
  86. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/diff.py +0 -0
  87. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/install.py +0 -0
  88. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/landing.py +0 -0
  89. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/onward.py +0 -0
  90. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/patch.py +0 -0
  91. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/remote.py +0 -0
  92. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/run.py +0 -0
  93. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/sig.py +0 -0
  94. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/trailer.py +0 -0
  95. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/gitwork/trees.py +0 -0
  96. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/__init__.py +0 -0
  97. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/admin.py +0 -0
  98. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/auth.py +0 -0
  99. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/feed.py +0 -0
  100. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/gitbody.py +0 -0
  101. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/gitdoor.py +0 -0
  102. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/gitpack.py +0 -0
  103. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/grants.py +0 -0
  104. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/ingest.py +0 -0
  105. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/login.py +0 -0
  106. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/members.py +0 -0
  107. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/mounts.py +0 -0
  108. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/page.py +0 -0
  109. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/removal.py +0 -0
  110. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/repos.py +0 -0
  111. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/routes.py +0 -0
  112. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/rpc.py +0 -0
  113. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/scoped.py +0 -0
  114. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/server.py +0 -0
  115. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/stale.py +0 -0
  116. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/static.py +0 -0
  117. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/upstream.py +0 -0
  118. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/http/watcher.py +0 -0
  119. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/identity.py +0 -0
  120. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/__init__.py +0 -0
  121. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/__main__.py +0 -0
  122. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/activity.py +0 -0
  123. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/before.py +0 -0
  124. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/boards.py +0 -0
  125. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/boardview.py +0 -0
  126. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/brief.py +0 -0
  127. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/chapter.py +0 -0
  128. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/dossier.py +0 -0
  129. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/fields.py +0 -0
  130. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/gitmoves.py +0 -0
  131. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/hello.py +0 -0
  132. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/integrate.py +0 -0
  133. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/orders.py +0 -0
  134. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/render.py +0 -0
  135. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/schema.py +0 -0
  136. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/server.py +0 -0
  137. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/thread.py +0 -0
  138. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/mcp/tools.py +0 -0
  139. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/py.typed +0 -0
  140. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/session.py +0 -0
  141. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/__init__.py +0 -0
  142. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/cache.py +0 -0
  143. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/creds.py +0 -0
  144. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/handover.py +0 -0
  145. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/live.py +0 -0
  146. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/log.py +0 -0
  147. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/mirroring.py +0 -0
  148. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/pubkeys.py +0 -0
  149. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/reviews.py +0 -0
  150. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/server.py +0 -0
  151. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/store/stores.py +0 -0
  152. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/ui/index.html +0 -0
  153. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/ui/style.css +0 -0
  154. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/__init__.py +0 -0
  155. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_args.py +0 -0
  156. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_cards.py +0 -0
  157. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_chapter.py +0 -0
  158. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_context.py +0 -0
  159. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_facts.py +0 -0
  160. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_mentions.py +0 -0
  161. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_rows.py +0 -0
  162. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_stories.py +0 -0
  163. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_waiting.py +0 -0
  164. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/_windows.py +0 -0
  165. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/activity.py +0 -0
  166. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/assign.py +0 -0
  167. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/card.py +0 -0
  168. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/events.py +0 -0
  169. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/filed.py +0 -0
  170. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/plan.py +0 -0
  171. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/project.py +0 -0
  172. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/pulse.py +0 -0
  173. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/record.py +0 -0
  174. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/report.py +0 -0
  175. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/review.py +0 -0
  176. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/take.py +0 -0
  177. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/src/taskops/verbs/update.py +0 -0
  178. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/__init__.py +0 -0
  179. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/conftest.py +0 -0
  180. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_architecture.py +0 -0
  181. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_claude.py +0 -0
  182. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_core.py +0 -0
  183. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_git.py +0 -0
  184. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_mcp.py +0 -0
  185. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_mirror.py +0 -0
  186. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_report.py +0 -0
  187. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_store.py +0 -0
  188. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_topology.py +0 -0
  189. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_ui.py +0 -0
  190. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_verbs.py +0 -0
  191. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/test_window.py +0 -0
  192. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/tests/ui_harness.js +0 -0
  193. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/build.mjs +0 -0
  194. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/index.html +0 -0
  195. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/package-lock.json +0 -0
  196. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/package.json +0 -0
  197. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/fixture.json +0 -0
  198. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/main.tsx +0 -0
  199. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/run.mjs +0 -0
  200. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/actors.tsx +0 -0
  201. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/all-chapters-scope.tsx +0 -0
  202. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/board-columns.tsx +0 -0
  203. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/board-flow-view.tsx +0 -0
  204. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/board-motion-and-avatars.tsx +0 -0
  205. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/board-root-mount.tsx +0 -0
  206. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/card-diff-range.tsx +0 -0
  207. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-completion-derivation.tsx +0 -0
  208. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-landed.tsx +0 -0
  209. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-story-grid.tsx +0 -0
  210. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/chapters-open.tsx +0 -0
  211. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/comment-box.tsx +0 -0
  212. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/comment-toasts-model.tsx +0 -0
  213. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/comment-toasts-stack.tsx +0 -0
  214. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/diff-page.tsx +0 -0
  215. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/dossier.tsx +0 -0
  216. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/event-stream.tsx +0 -0
  217. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/feed-reconnect.tsx +0 -0
  218. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/forge-links.tsx +0 -0
  219. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/forge-opens-the-board.tsx +0 -0
  220. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/git-diff.tsx +0 -0
  221. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/hosted-window.tsx +0 -0
  222. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/monitor-panes.tsx +0 -0
  223. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/overlay-escape.tsx +0 -0
  224. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/report-markdown.tsx +0 -0
  225. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/report-sandbox.tsx +0 -0
  226. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/reviewing-skew.tsx +0 -0
  227. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/section.ts +0 -0
  228. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/swarm-topology.tsx +0 -0
  229. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/thread-closing-note.tsx +0 -0
  230. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/worktree-page-range.tsx +0 -0
  231. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections/worktrees-index.tsx +0 -0
  232. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/smoke/sections.mjs +0 -0
  233. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/App.tsx +0 -0
  234. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/client.ts +0 -0
  235. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/completed.ts +0 -0
  236. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/actors/DevPanel.tsx +0 -0
  237. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/board/CardTile.tsx +0 -0
  238. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/board/Column.tsx +0 -0
  239. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/board/ViewToggle.tsx +0 -0
  240. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/board/flip.ts +0 -0
  241. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/board/useFlip.ts +0 -0
  242. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/CommentBox.tsx +0 -0
  243. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/Drawer.tsx +0 -0
  244. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/Patch.tsx +0 -0
  245. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/Sections.tsx +0 -0
  246. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/Thread.tsx +0 -0
  247. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/split.ts +0 -0
  248. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/card/tokens.ts +0 -0
  249. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/chrome/AvatarStack.tsx +0 -0
  250. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/chrome/Header.tsx +0 -0
  251. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/chrome/KpiRail.tsx +0 -0
  252. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/chrome/MilestonePicker.tsx +0 -0
  253. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/chrome/TabNav.tsx +0 -0
  254. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/flow/FlowView.tsx +0 -0
  255. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/flow/layout.ts +0 -0
  256. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/Chapter.tsx +0 -0
  257. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/DependencyChain.tsx +0 -0
  258. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/EditSurface.tsx +0 -0
  259. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/EventStream.tsx +0 -0
  260. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/LeaseHealth.tsx +0 -0
  261. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/LiveLeases.tsx +0 -0
  262. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/Mentions.tsx +0 -0
  263. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/Pane.tsx +0 -0
  264. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/Swarm.tsx +0 -0
  265. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/Throughput.tsx +0 -0
  266. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/monitor/panels.ts +0 -0
  267. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/reports/ReportFrame.tsx +0 -0
  268. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/shared/Avatar.tsx +0 -0
  269. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/shared/Markdown.tsx +0 -0
  270. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/shared/Overlay.tsx +0 -0
  271. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/shared/Segmented.tsx +0 -0
  272. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/shared/overlayStack.ts +0 -0
  273. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/story/ChapterStory.tsx +0 -0
  274. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/story/stats.ts +0 -0
  275. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/toasts/ToastStack.tsx +0 -0
  276. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/toasts/model.ts +0 -0
  277. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/components/toasts/useToasts.ts +0 -0
  278. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/format.ts +0 -0
  279. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/links.tsx +0 -0
  280. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/main.tsx +0 -0
  281. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/markdown.ts +0 -0
  282. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/Actors.tsx +0 -0
  283. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/Board.tsx +0 -0
  284. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/Monitor.tsx +0 -0
  285. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/Reports.tsx +0 -0
  286. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/WorktreeDiff.tsx +0 -0
  287. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/pages/Worktrees.tsx +0 -0
  288. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/theme/theme.ts +0 -0
  289. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/theme/tokens.css +0 -0
  290. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/types.ts +0 -0
  291. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/useBoard.ts +0 -0
  292. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/src/useEvents.ts +0 -0
  293. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/styles/index.css +0 -0
  294. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/ui/tsconfig.json +0 -0
  295. {taskops_cli-0.5.5 → taskops_cli-0.5.6}/uv.lock +0 -0
@@ -3,6 +3,32 @@
3
3
  The source of truth for release notes — GitHub Releases are extracted from
4
4
  here, never written twice.
5
5
 
6
+ ## 0.5.6 — the hours page draws every hour of a day that opened before midnight
7
+
8
+ Reported live on `/convo/`: the hours breakdown was empty. Monday said
9
+ 17h 13m and drew a single `23:00` row; Tuesday said 3h 32m and drew nothing
10
+ at all. Only Sunday — the one day nobody had worked across its opening
11
+ midnight — rendered. Every session was in the payload the whole time; the
12
+ client had no row to put them in.
13
+
14
+ - **`components/actors/Daysheet.tsx` walks hour SLOTS, not hour NUMBERS.**
15
+ `core/hours.py`'s edge rule credits an interval to the day its CLOSING
16
+ stamp falls in, so a session opened at 23:5x and closed past midnight is
17
+ filed under the NEXT day — and that day's local hours stop being monotone.
18
+ The old `for (h = first; h <= last; h += 1)` then walked `23..23` (one row)
19
+ or `23..10` (no rows). A slot is the local hour's own floor as a timestamp:
20
+ monotone across any midnight, advanced through its successor's floor so a
21
+ DST-stretched hour is one slot and a skipped one is none. The fold's
22
+ identity is the slot too — such a pane can hold two rows labelled `23:00`.
23
+ - **Verified against the live `/convo/` payload**, not a fixture: Monday now
24
+ draws 25 rows holding all 286 sessions, Tuesday 12 rows holding all 19, and
25
+ each pane's total is exactly the sum of its rows. Sunday is unchanged.
26
+ - **Pinned by `ui/smoke/sections/daysheet-midnight-spill.tsx`**, with the old
27
+ walk restored as a mutation and measured red.
28
+ - **`ui/smoke/sections/actors-window-filter.tsx` repaired** — it still pinned
29
+ the calendar-month default that 0.5.5's successor replaced with the sliding
30
+ 30 days, and was red on master.
31
+
6
32
  ## 0.5.5 — the Worktrees page renders too (it was never the drawer)
7
33
 
8
34
  The failure reported since 0.5.0 was always on the WORKTREES page, and three
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: taskops-cli
3
- Version: 0.5.5
3
+ Version: 0.5.6
4
4
  Summary: A shared work board for teams of coding agents, with a human who decides.
5
5
  Project-URL: Repository, https://github.com/bernatch22/taskops
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  __title__ = "taskops"
4
- __version__ = "0.5.5" # single source of truth; pyproject reads it dynamically
4
+ __version__ = "0.5.6" # single source of truth; pyproject reads it dynamically
@@ -75,8 +75,16 @@ class Handler(BaseHTTPRequestHandler):
75
75
  elif tail.startswith("ui"):
76
76
  page.answer(self, board, tail[2:]) # 0.5.0's address, kept — links were pasted
77
77
  elif self.mounts.ui is None and NAME.match(board) and (not tail or static.asset(tail)):
78
- # the page at the board's OWN address; assets are a CLOSED set
79
- page.answer(self, board, tail)
78
+ if not tail and not self.path.partition("?")[0].endswith("/"):
79
+ # The page's assets are RELATIVE (./app.js — one bundle, three mounts),
80
+ # so the slashless /<board> resolves them against the root and renders
81
+ # blank: exactly the address people paste. One hop repairs them all —
82
+ # keeping the query, because ?token= is how a window authenticates.
83
+ _, sep, query = self.path.partition("?")
84
+ self._redirect(f"/{board}/{sep}{query}")
85
+ else:
86
+ # the page at the board's OWN address; assets are a CLOSED set
87
+ page.answer(self, board, tail)
80
88
  elif (found := static.at_root(self.mounts.ui, self.path)) is not None:
81
89
  self._send(200, *found) # a WINDOW serves its page at the ROOT
82
90
  else:
@@ -170,6 +178,13 @@ class Handler(BaseHTTPRequestHandler):
170
178
  def _json(self, status: int, body: dict[str, Any]) -> None:
171
179
  self._send(status, json.dumps(body).encode(), "application/json")
172
180
 
181
+ def _redirect(self, location: str) -> None:
182
+ """One permanent hop, no body — the only writer of a Location header."""
183
+ self.send_response(301)
184
+ self.send_header("Location", location)
185
+ self.send_header("Content-Length", "0")
186
+ self.end_headers()
187
+
173
188
  def _send(self, status: int, data: bytes, kind: str) -> None:
174
189
  """Content-Length on EVERY answer: this is HTTP/1.1 with keep-alive, and a body
175
190
  without one leaves the next request on the socket unparseable."""