taskops-cli 0.5.4__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 (296) hide show
  1. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/CHANGELOG.md +51 -0
  2. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/PKG-INFO +1 -1
  3. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_version.py +1 -1
  4. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/handler.py +17 -2
  5. taskops_cli-0.5.6/src/taskops/ui/app.js +61 -0
  6. {taskops_cli-0.5.4 → 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.6/ui/smoke/sections/worktree-page-range.tsx +73 -0
  9. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/actors/Daysheet.tsx +26 -8
  10. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/hoursWindow.ts +10 -4
  11. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/WorktreeDiff.tsx +25 -7
  12. taskops_cli-0.5.4/src/taskops/ui/app.js +0 -61
  13. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.claude/settings.json +0 -0
  14. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.gitattributes +0 -0
  15. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.github/workflows/ci.yml +0 -0
  16. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.github/workflows/workflow.yml +0 -0
  17. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.gitignore +0 -0
  18. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.mcp.json +0 -0
  19. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite +0 -0
  20. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite-shm +0 -0
  21. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/cache.sqlite-wal +0 -0
  22. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/events.jsonl +0 -0
  23. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/live.sqlite +0 -0
  24. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/live.sqlite-shm +0 -0
  25. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board/live.sqlite-wal +0 -0
  26. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/board.json +0 -0
  27. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/reports/lifecycle-chapter.html +0 -0
  28. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/reports/reports-chapter.html +0 -0
  29. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/.taskops/ui.lock +0 -0
  30. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ARCHITECTURE.md +0 -0
  31. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/CLAUDE.md +0 -0
  32. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/README.md +0 -0
  33. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/pyproject.toml +0 -0
  34. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/smoke.sh +0 -0
  35. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/__init__.py +0 -0
  36. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_clock.py +0 -0
  37. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_errors.py +0 -0
  38. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_ids.py +0 -0
  39. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_json.py +0 -0
  40. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_locate.py +0 -0
  41. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/_wire.py +0 -0
  42. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/board.py +0 -0
  43. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/__init__.py +0 -0
  44. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/__main__.py +0 -0
  45. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/admin.py +0 -0
  46. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/claude.py +0 -0
  47. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/commands.py +0 -0
  48. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/enrol.py +0 -0
  49. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/github.py +0 -0
  50. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/gitremote.py +0 -0
  51. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/grants.py +0 -0
  52. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/hooks.py +0 -0
  53. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/main.py +0 -0
  54. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/operate.py +0 -0
  55. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/paging.py +0 -0
  56. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/parser.py +0 -0
  57. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/pull.py +0 -0
  58. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/push.py +0 -0
  59. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/remote.py +0 -0
  60. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/rm.py +0 -0
  61. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/serving.py +0 -0
  62. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/team.py +0 -0
  63. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/watch.py +0 -0
  64. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/window.py +0 -0
  65. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/cli/wording.py +0 -0
  66. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/__init__.py +0 -0
  67. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/actors.py +0 -0
  68. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/challenge.py +0 -0
  69. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/chapters.py +0 -0
  70. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/event.py +0 -0
  71. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/forge.py +0 -0
  72. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/graph.py +0 -0
  73. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/holding.py +0 -0
  74. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/hours.py +0 -0
  75. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/kinds.py +0 -0
  76. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/machine.py +0 -0
  77. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/mentions.py +0 -0
  78. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/replay.py +0 -0
  79. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/reports.py +0 -0
  80. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/review.py +0 -0
  81. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/scope.py +0 -0
  82. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/seams.py +0 -0
  83. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/core/types.py +0 -0
  84. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/__init__.py +0 -0
  85. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/bare.py +0 -0
  86. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/bind.py +0 -0
  87. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/catchup.py +0 -0
  88. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/claudefiles.py +0 -0
  89. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/diff.py +0 -0
  90. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/install.py +0 -0
  91. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/landing.py +0 -0
  92. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/onward.py +0 -0
  93. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/patch.py +0 -0
  94. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/remote.py +0 -0
  95. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/run.py +0 -0
  96. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/sig.py +0 -0
  97. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/trailer.py +0 -0
  98. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/gitwork/trees.py +0 -0
  99. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/__init__.py +0 -0
  100. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/admin.py +0 -0
  101. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/auth.py +0 -0
  102. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/feed.py +0 -0
  103. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/gitbody.py +0 -0
  104. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/gitdoor.py +0 -0
  105. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/gitpack.py +0 -0
  106. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/grants.py +0 -0
  107. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/ingest.py +0 -0
  108. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/login.py +0 -0
  109. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/members.py +0 -0
  110. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/mounts.py +0 -0
  111. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/page.py +0 -0
  112. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/removal.py +0 -0
  113. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/repos.py +0 -0
  114. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/routes.py +0 -0
  115. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/rpc.py +0 -0
  116. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/scoped.py +0 -0
  117. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/server.py +0 -0
  118. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/stale.py +0 -0
  119. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/static.py +0 -0
  120. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/upstream.py +0 -0
  121. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/http/watcher.py +0 -0
  122. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/identity.py +0 -0
  123. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/__init__.py +0 -0
  124. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/__main__.py +0 -0
  125. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/activity.py +0 -0
  126. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/before.py +0 -0
  127. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/boards.py +0 -0
  128. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/boardview.py +0 -0
  129. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/brief.py +0 -0
  130. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/chapter.py +0 -0
  131. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/dossier.py +0 -0
  132. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/fields.py +0 -0
  133. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/gitmoves.py +0 -0
  134. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/hello.py +0 -0
  135. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/integrate.py +0 -0
  136. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/orders.py +0 -0
  137. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/render.py +0 -0
  138. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/schema.py +0 -0
  139. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/server.py +0 -0
  140. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/thread.py +0 -0
  141. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/mcp/tools.py +0 -0
  142. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/py.typed +0 -0
  143. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/session.py +0 -0
  144. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/__init__.py +0 -0
  145. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/cache.py +0 -0
  146. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/creds.py +0 -0
  147. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/handover.py +0 -0
  148. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/live.py +0 -0
  149. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/log.py +0 -0
  150. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/mirroring.py +0 -0
  151. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/pubkeys.py +0 -0
  152. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/reviews.py +0 -0
  153. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/server.py +0 -0
  154. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/store/stores.py +0 -0
  155. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/ui/index.html +0 -0
  156. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/ui/style.css +0 -0
  157. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/__init__.py +0 -0
  158. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_args.py +0 -0
  159. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_cards.py +0 -0
  160. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_chapter.py +0 -0
  161. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_context.py +0 -0
  162. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_facts.py +0 -0
  163. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_mentions.py +0 -0
  164. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_rows.py +0 -0
  165. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_stories.py +0 -0
  166. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_waiting.py +0 -0
  167. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/_windows.py +0 -0
  168. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/activity.py +0 -0
  169. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/assign.py +0 -0
  170. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/card.py +0 -0
  171. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/events.py +0 -0
  172. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/filed.py +0 -0
  173. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/plan.py +0 -0
  174. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/project.py +0 -0
  175. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/pulse.py +0 -0
  176. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/record.py +0 -0
  177. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/report.py +0 -0
  178. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/review.py +0 -0
  179. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/take.py +0 -0
  180. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/src/taskops/verbs/update.py +0 -0
  181. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/__init__.py +0 -0
  182. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/conftest.py +0 -0
  183. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_architecture.py +0 -0
  184. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_claude.py +0 -0
  185. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_core.py +0 -0
  186. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_git.py +0 -0
  187. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_mcp.py +0 -0
  188. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_mirror.py +0 -0
  189. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_report.py +0 -0
  190. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_store.py +0 -0
  191. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_topology.py +0 -0
  192. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_ui.py +0 -0
  193. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_verbs.py +0 -0
  194. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/test_window.py +0 -0
  195. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/tests/ui_harness.js +0 -0
  196. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/build.mjs +0 -0
  197. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/index.html +0 -0
  198. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/package-lock.json +0 -0
  199. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/package.json +0 -0
  200. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/fixture.json +0 -0
  201. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/main.tsx +0 -0
  202. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/run.mjs +0 -0
  203. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/actors.tsx +0 -0
  204. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/all-chapters-scope.tsx +0 -0
  205. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/board-columns.tsx +0 -0
  206. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/board-flow-view.tsx +0 -0
  207. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/board-motion-and-avatars.tsx +0 -0
  208. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/board-root-mount.tsx +0 -0
  209. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/card-diff-range.tsx +0 -0
  210. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-completion-derivation.tsx +0 -0
  211. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-landed.tsx +0 -0
  212. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/chapter-story-grid.tsx +0 -0
  213. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/chapters-open.tsx +0 -0
  214. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/comment-box.tsx +0 -0
  215. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/comment-toasts-model.tsx +0 -0
  216. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/comment-toasts-stack.tsx +0 -0
  217. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/diff-page.tsx +0 -0
  218. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/dossier.tsx +0 -0
  219. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/event-stream.tsx +0 -0
  220. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/feed-reconnect.tsx +0 -0
  221. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/forge-links.tsx +0 -0
  222. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/forge-opens-the-board.tsx +0 -0
  223. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/git-diff.tsx +0 -0
  224. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/hosted-window.tsx +0 -0
  225. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/monitor-panes.tsx +0 -0
  226. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/overlay-escape.tsx +0 -0
  227. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/report-markdown.tsx +0 -0
  228. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/report-sandbox.tsx +0 -0
  229. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/reviewing-skew.tsx +0 -0
  230. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/section.ts +0 -0
  231. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/swarm-topology.tsx +0 -0
  232. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/thread-closing-note.tsx +0 -0
  233. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections/worktrees-index.tsx +0 -0
  234. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/smoke/sections.mjs +0 -0
  235. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/App.tsx +0 -0
  236. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/client.ts +0 -0
  237. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/completed.ts +0 -0
  238. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/actors/DevPanel.tsx +0 -0
  239. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/board/CardTile.tsx +0 -0
  240. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/board/Column.tsx +0 -0
  241. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/board/ViewToggle.tsx +0 -0
  242. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/board/flip.ts +0 -0
  243. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/board/useFlip.ts +0 -0
  244. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/CommentBox.tsx +0 -0
  245. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/Drawer.tsx +0 -0
  246. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/Patch.tsx +0 -0
  247. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/Sections.tsx +0 -0
  248. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/Thread.tsx +0 -0
  249. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/split.ts +0 -0
  250. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/card/tokens.ts +0 -0
  251. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/chrome/AvatarStack.tsx +0 -0
  252. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/chrome/Header.tsx +0 -0
  253. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/chrome/KpiRail.tsx +0 -0
  254. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/chrome/MilestonePicker.tsx +0 -0
  255. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/chrome/TabNav.tsx +0 -0
  256. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/flow/FlowView.tsx +0 -0
  257. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/flow/layout.ts +0 -0
  258. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/Chapter.tsx +0 -0
  259. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/DependencyChain.tsx +0 -0
  260. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/EditSurface.tsx +0 -0
  261. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/EventStream.tsx +0 -0
  262. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/LeaseHealth.tsx +0 -0
  263. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/LiveLeases.tsx +0 -0
  264. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/Mentions.tsx +0 -0
  265. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/Pane.tsx +0 -0
  266. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/Swarm.tsx +0 -0
  267. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/Throughput.tsx +0 -0
  268. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/monitor/panels.ts +0 -0
  269. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/reports/ReportFrame.tsx +0 -0
  270. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/shared/Avatar.tsx +0 -0
  271. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/shared/Markdown.tsx +0 -0
  272. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/shared/Overlay.tsx +0 -0
  273. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/shared/Segmented.tsx +0 -0
  274. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/shared/overlayStack.ts +0 -0
  275. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/story/ChapterStory.tsx +0 -0
  276. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/story/stats.ts +0 -0
  277. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/toasts/ToastStack.tsx +0 -0
  278. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/toasts/model.ts +0 -0
  279. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/components/toasts/useToasts.ts +0 -0
  280. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/format.ts +0 -0
  281. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/links.tsx +0 -0
  282. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/main.tsx +0 -0
  283. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/markdown.ts +0 -0
  284. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/Actors.tsx +0 -0
  285. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/Board.tsx +0 -0
  286. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/Monitor.tsx +0 -0
  287. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/Reports.tsx +0 -0
  288. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/pages/Worktrees.tsx +0 -0
  289. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/theme/theme.ts +0 -0
  290. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/theme/tokens.css +0 -0
  291. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/types.ts +0 -0
  292. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/useBoard.ts +0 -0
  293. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/src/useEvents.ts +0 -0
  294. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/styles/index.css +0 -0
  295. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/ui/tsconfig.json +0 -0
  296. {taskops_cli-0.5.4 → taskops_cli-0.5.6}/uv.lock +0 -0
@@ -3,6 +3,57 @@
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
+
32
+ ## 0.5.5 — the Worktrees page renders too (it was never the drawer)
33
+
34
+ The failure reported since 0.5.0 was always on the WORKTREES page, and three
35
+ chapters fixed the card drawer instead — the drawer was verified, declared
36
+ working, and the page nobody had rendered kept asking
37
+ `compare/ms%2F<chapter>...tk-<id>`. Both branches of a landed card are pruned
38
+ when its chapter lands, so on every landed card the page drew a refusal over
39
+ work sitting in the trunk. Verifying a neighbour is not verifying.
40
+
41
+ - **`pages/WorktreeDiff.tsx` takes its range from `links.tsx::cardRange`** — the
42
+ same rule the drawer uses, never a second one that can drift: the card's
43
+ recorded commits, base = the oldest commit's PARENT. A tree with nothing
44
+ recorded keeps the two branch tips, which is right for a live tree whose work
45
+ is not committed yet and where the branch is the only handle there is.
46
+ - **Pinned on the rendered PAGE** (`ui/smoke/sections/worktree-page-range.tsx`),
47
+ read off its `data-range`, with the call-site mutation measured red — the
48
+ previous section pinned the rule one layer below the call site and a call-site
49
+ mutation was green while production stayed broken.
50
+ - **The history that was missing is on the host now**: 91 card branches and 19
51
+ chapter branches, pushed at the tips the board recorded, plus two cards whose
52
+ oldest commit was not an ancestor of their newest (rebased in their day) and
53
+ so needed its own ref. Audited across every card on the board: 87 of 89 render
54
+ a real diff on both surfaces, and the two that do not have no commit recorded
55
+ at all — there is nothing to diff, and their refusal is literally true.
56
+
6
57
  ## 0.5.4 — the Files-changed pane renders for a landed card
7
58
 
8
59
  **0.5.3 is withdrawn in all but name.** It carries this release's source fix but
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: taskops-cli
3
- Version: 0.5.4
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.4" # 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."""