taskledger 0.3.1__tar.gz → 0.4.0__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 (232) hide show
  1. {taskledger-0.3.1 → taskledger-0.4.0}/.taskledger.toml +3 -3
  2. {taskledger-0.3.1 → taskledger-0.4.0}/API.md +11 -0
  3. {taskledger-0.3.1 → taskledger-0.4.0}/CHANGELOG.md +38 -0
  4. {taskledger-0.3.1/taskledger.egg-info → taskledger-0.4.0}/PKG-INFO +66 -20
  5. {taskledger-0.3.1 → taskledger-0.4.0}/README.md +64 -19
  6. {taskledger-0.3.1 → taskledger-0.4.0}/docs/command_contract.rst +59 -4
  7. {taskledger-0.3.1 → taskledger-0.4.0}/docs/index.rst +1 -0
  8. {taskledger-0.3.1 → taskledger-0.4.0}/docs/public_surface.rst +8 -0
  9. taskledger-0.4.0/docs/sync.rst +166 -0
  10. {taskledger-0.3.1 → taskledger-0.4.0}/docs/transfer.rst +3 -1
  11. {taskledger-0.3.1 → taskledger-0.4.0}/docs/usage.rst +28 -10
  12. {taskledger-0.3.1 → taskledger-0.4.0}/pyproject.toml +2 -2
  13. {taskledger-0.3.1 → taskledger-0.4.0}/skills/taskledger/SKILL.md +23 -13
  14. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/_version.py +3 -3
  15. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/__init__.py +1 -0
  16. taskledger-0.4.0/taskledger/api/storage.py +44 -0
  17. taskledger-0.4.0/taskledger/api/sync.py +300 -0
  18. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli.py +60 -5
  19. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_implement.py +1 -1
  20. taskledger-0.4.0/taskledger/cli_report.py +171 -0
  21. taskledger-0.4.0/taskledger/cli_storage.py +115 -0
  22. taskledger-0.4.0/taskledger/cli_sync.py +926 -0
  23. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/command_inventory.py +220 -0
  24. taskledger-0.4.0/taskledger/services/git_sync.py +1018 -0
  25. taskledger-0.4.0/taskledger/services/html_reports.py +331 -0
  26. taskledger-0.4.0/taskledger/services/storage_locations.py +482 -0
  27. taskledger-0.4.0/taskledger/services/web_dashboard.py +239 -0
  28. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/project_config.py +170 -0
  29. taskledger-0.4.0/taskledger/templates/__init__.py +1 -0
  30. taskledger-0.4.0/taskledger/templates/base.html +64 -0
  31. taskledger-0.4.0/taskledger/templates/error.html +6 -0
  32. taskledger-0.4.0/taskledger/templates/site_index.html +42 -0
  33. taskledger-0.4.0/taskledger/templates/task_report.html +218 -0
  34. {taskledger-0.3.1 → taskledger-0.4.0/taskledger.egg-info}/PKG-INFO +66 -20
  35. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger.egg-info/SOURCES.txt +17 -3
  36. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger.egg-info/requires.txt +1 -0
  37. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_cli_command_contract.py +19 -4
  38. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_command_inventory.py +47 -11
  39. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_docs_and_skill.py +15 -0
  40. taskledger-0.4.0/tests/test_html_reports.py +95 -0
  41. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_project_root_config.py +48 -0
  42. taskledger-0.4.0/tests/test_serve_dashboard.py +188 -0
  43. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_service_boundaries.py +10 -7
  44. taskledger-0.4.0/tests/test_storage_sync.py +311 -0
  45. taskledger-0.4.0/tests/test_sync_git.py +372 -0
  46. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_task_report.py +78 -0
  47. taskledger-0.3.1/taskledger/services/web_dashboard.py +0 -529
  48. taskledger-0.3.1/taskledger/web_assets/dashboard.css +0 -491
  49. taskledger-0.3.1/taskledger/web_assets/dashboard.js +0 -1448
  50. taskledger-0.3.1/tests/__init__.py +0 -0
  51. taskledger-0.3.1/tests/test_serve_dashboard.py +0 -626
  52. {taskledger-0.3.1 → taskledger-0.4.0}/.codecrate.toml +0 -0
  53. {taskledger-0.3.1 → taskledger-0.4.0}/.github/workflows/codecov.yml +0 -0
  54. {taskledger-0.3.1 → taskledger-0.4.0}/.github/workflows/pre-commit.yml +0 -0
  55. {taskledger-0.3.1 → taskledger-0.4.0}/.github/workflows/python-publish.yml +0 -0
  56. {taskledger-0.3.1 → taskledger-0.4.0}/.github/workflows/tests.yml +0 -0
  57. {taskledger-0.3.1 → taskledger-0.4.0}/.gitignore +0 -0
  58. {taskledger-0.3.1 → taskledger-0.4.0}/.pre-commit-config.yaml +0 -0
  59. {taskledger-0.3.1 → taskledger-0.4.0}/.readthedocs.yaml +0 -0
  60. {taskledger-0.3.1 → taskledger-0.4.0}/.ruff.toml +0 -0
  61. {taskledger-0.3.1 → taskledger-0.4.0}/AGENTS.md +0 -0
  62. {taskledger-0.3.1 → taskledger-0.4.0}/LICENSE +0 -0
  63. {taskledger-0.3.1 → taskledger-0.4.0}/Makefile +0 -0
  64. {taskledger-0.3.1 → taskledger-0.4.0}/docs/Makefile +0 -0
  65. {taskledger-0.3.1 → taskledger-0.4.0}/docs/api.rst +0 -0
  66. {taskledger-0.3.1 → taskledger-0.4.0}/docs/architecture_taskledger_split.rst +0 -0
  67. {taskledger-0.3.1 → taskledger-0.4.0}/docs/build.sh +0 -0
  68. {taskledger-0.3.1 → taskledger-0.4.0}/docs/conf.py +0 -0
  69. {taskledger-0.3.1 → taskledger-0.4.0}/docs/full_task_cycle.rst +0 -0
  70. {taskledger-0.3.1 → taskledger-0.4.0}/docs/multi_repo.rst +0 -0
  71. {taskledger-0.3.1 → taskledger-0.4.0}/docs/requirements.txt +0 -0
  72. {taskledger-0.3.1 → taskledger-0.4.0}/docs/service_boundary_whitelist.rst +0 -0
  73. {taskledger-0.3.1 → taskledger-0.4.0}/setup.cfg +0 -0
  74. {taskledger-0.3.1 → taskledger-0.4.0}/setup.py +0 -0
  75. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/__init__.py +0 -0
  76. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/__main__.py +0 -0
  77. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/handoff.py +0 -0
  78. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/introductions.py +0 -0
  79. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/locks.py +0 -0
  80. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/plans.py +0 -0
  81. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/project.py +0 -0
  82. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/questions.py +0 -0
  83. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/releases.py +0 -0
  84. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/search.py +0 -0
  85. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/task_runs.py +0 -0
  86. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/api/tasks.py +0 -0
  87. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_actor.py +0 -0
  88. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_common.py +0 -0
  89. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_ledger.py +0 -0
  90. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_migrate.py +0 -0
  91. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_misc.py +0 -0
  92. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_plan.py +0 -0
  93. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_question.py +0 -0
  94. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_release.py +0 -0
  95. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_task.py +0 -0
  96. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/cli_validate.py +0 -0
  97. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/__init__.py +0 -0
  98. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/_model_utils.py +0 -0
  99. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/active_state.py +0 -0
  100. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/actor.py +0 -0
  101. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/change.py +0 -0
  102. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/check.py +0 -0
  103. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/event.py +0 -0
  104. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/handoff.py +0 -0
  105. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/lock.py +0 -0
  106. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/models.py +0 -0
  107. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/plan.py +0 -0
  108. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/policies.py +0 -0
  109. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/question.py +0 -0
  110. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/release.py +0 -0
  111. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/run.py +0 -0
  112. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/sidecars.py +0 -0
  113. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/states.py +0 -0
  114. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/domain/task.py +0 -0
  115. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/errors.py +0 -0
  116. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/exchange.py +0 -0
  117. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/ids.py +0 -0
  118. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/launcher.py +0 -0
  119. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/py.typed +0 -0
  120. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/search.py +0 -0
  121. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/__init__.py +0 -0
  122. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/actors.py +0 -0
  123. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/agent_logging.py +0 -0
  124. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/agent_transcripts.py +0 -0
  125. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/change_tracking.py +0 -0
  126. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/check_tracking.py +0 -0
  127. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/command_runner.py +0 -0
  128. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/dashboard.py +0 -0
  129. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/doctor.py +0 -0
  130. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/doctor_checks/migration_checks.py +0 -0
  131. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/doctor_checks/project_scan.py +0 -0
  132. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/doctor_checks/task_checks.py +0 -0
  133. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/handoff.py +0 -0
  134. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/handoff_lifecycle.py +0 -0
  135. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/implementation_flow.py +0 -0
  136. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/navigation.py +0 -0
  137. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/next_action_model.py +0 -0
  138. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/phase5_lock_transfer.py +0 -0
  139. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/plan_editing.py +0 -0
  140. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/plan_hash.py +0 -0
  141. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/plan_lint.py +0 -0
  142. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/plan_materialization.py +0 -0
  143. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/plan_review.py +0 -0
  144. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/planning_flow.py +0 -0
  145. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/releases.py +0 -0
  146. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/run_store.py +0 -0
  147. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/serve_read_model.py +0 -0
  148. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_archive.py +0 -0
  149. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_collections.py +0 -0
  150. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_lifecycle.py +0 -0
  151. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_queries.py +0 -0
  152. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_repair.py +0 -0
  153. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/task_reports.py +0 -0
  154. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/tasks.py +0 -0
  155. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/tree.py +0 -0
  156. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/validation.py +0 -0
  157. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/validation_flow.py +0 -0
  158. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/services/workflow_guidance.py +0 -0
  159. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/__init__.py +0 -0
  160. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/agent_logs.py +0 -0
  161. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/atomic.py +0 -0
  162. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/common.py +0 -0
  163. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/events.py +0 -0
  164. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/frontmatter.py +0 -0
  165. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/indexes.py +0 -0
  166. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/init.py +0 -0
  167. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/ledger_config.py +0 -0
  168. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/locks.py +0 -0
  169. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/meta.py +0 -0
  170. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/migrations.py +0 -0
  171. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/paths.py +0 -0
  172. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/project_identity.py +0 -0
  173. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/repos.py +0 -0
  174. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/storage/task_store.py +0 -0
  175. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger/timeutils.py +0 -0
  176. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger.egg-info/dependency_links.txt +0 -0
  177. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger.egg-info/entry_points.txt +0 -0
  178. {taskledger-0.3.1 → taskledger-0.4.0}/taskledger.egg-info/top_level.txt +0 -0
  179. {taskledger-0.3.1/taskledger/web_assets → taskledger-0.4.0/tests}/__init__.py +0 -0
  180. {taskledger-0.3.1 → taskledger-0.4.0}/tests/conftest.py +0 -0
  181. {taskledger-0.3.1 → taskledger-0.4.0}/tests/support/__init__.py +0 -0
  182. {taskledger-0.3.1 → taskledger-0.4.0}/tests/support/builders.py +0 -0
  183. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_active_task.py +0 -0
  184. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_actor_harness_state.py +0 -0
  185. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_agent_command_logging.py +0 -0
  186. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_agent_session_protocol.py +0 -0
  187. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_atomic_fast_io.py +0 -0
  188. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_cli_import_resilience.py +0 -0
  189. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_command_example_linter.py +0 -0
  190. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_compact_mutation_output.py +0 -0
  191. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_delta_remaining_contracts.py +0 -0
  192. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_doctor.py +0 -0
  193. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_domain_policies.py +0 -0
  194. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_events.py +0 -0
  195. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_handoff_lifecycle.py +0 -0
  196. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_help_subprocess.py +0 -0
  197. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_implementation_change_scan.py +0 -0
  198. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_implementation_checks.py +0 -0
  199. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_json_contracts.py +0 -0
  200. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_legacy_cleanup_contracts.py +0 -0
  201. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_lifecycle_policies.py +0 -0
  202. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_locks_audit.py +0 -0
  203. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_models_v1_schema.py +0 -0
  204. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_next_action_expired_lock.py +0 -0
  205. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_no_log_feature.py +0 -0
  206. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_plan_approval_contract.py +0 -0
  207. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_plan_lint.py +0 -0
  208. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_plan_review.py +0 -0
  209. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_plan_revision_workflow.py +0 -0
  210. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_plan_todo_materialization.py +0 -0
  211. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_question_add_many.py +0 -0
  212. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_question_filter_answers.py +0 -0
  213. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_question_plan_regeneration.py +0 -0
  214. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_release_changelog.py +0 -0
  215. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_search.py +0 -0
  216. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_services_dashboard.py +0 -0
  217. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_sidecar_collections.py +0 -0
  218. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_storage_bundle_layout.py +0 -0
  219. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_storage_common.py +0 -0
  220. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_storage_init.py +0 -0
  221. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_storage_migration.py +0 -0
  222. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_storage_repos.py +0 -0
  223. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_task_archive.py +0 -0
  224. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_task_events.py +0 -0
  225. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
  226. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_taskledger_cli_api_parity.py +1 -1
  227. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_taskledger_v2_cli.py +0 -0
  228. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_taskledger_v2_exchange.py +0 -0
  229. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_tasks_service_static.py +0 -0
  230. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_todo_implementation_gate.py +0 -0
  231. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_tree_command.py +0 -0
  232. {taskledger-0.3.1 → taskledger-0.4.0}/tests/test_workflow_guidance.py +0 -0
@@ -1,7 +1,7 @@
1
1
  # Project-local taskledger configuration.
2
2
  # This file lives in the source project root.
3
3
  config_version = 2
4
- taskledger_dir = '.taskledger'
4
+ taskledger_dir = '../taskledger-state/taskledger'
5
5
 
6
6
  # Stable project identity. Commit this with your source tree.
7
7
  project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
@@ -9,7 +9,7 @@ project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
9
9
  # Taskledger branch-scoped state. This block is intentionally safe to commit.
10
10
  ledger_ref = "main"
11
11
  ledger_parent_ref = ""
12
- ledger_next_task_number = 84
12
+ ledger_next_task_number = 87
13
13
  ledger_branch_guard = "off"
14
14
 
15
15
  [prompt_profiles.planning]
@@ -27,4 +27,4 @@ required_question_topics = []
27
27
  extra_guidance = ""
28
28
 
29
29
  [agent_logging]
30
- enabled = true
30
+ enabled = false
@@ -12,6 +12,7 @@ This repository exposes a task-first public API. The supported modules are:
12
12
  - `taskledger.api.locks`
13
13
  - `taskledger.api.handoff`
14
14
  - `taskledger.api.releases`
15
+ - `taskledger.api.storage`
15
16
  - `taskledger.api.search`
16
17
 
17
18
  ## Import boundary
@@ -233,6 +234,14 @@ record body and return compact metadata, including `context_hash` and
233
234
  - `show_release`
234
235
  - `tag_release`
235
236
 
237
+ ### `taskledger.api.storage`
238
+
239
+ - `storage_where`
240
+ - `storage_move`
241
+ - `sync_preflight`
242
+ - `sync_status`
243
+ - `sync_commit`
244
+
236
245
  ### `taskledger.api.search`
237
246
 
238
247
  - `search_workspace`
@@ -256,6 +265,8 @@ The public task-first CLI surface is organized around these command groups:
256
265
  - `require`
257
266
  - `release`
258
267
  - `lock`
268
+ - `storage`
269
+ - `sync`
259
270
  - `context`
260
271
  - `handoff`
261
272
  - `repair`
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.4.0 - 2026-05-18
4
+
5
+ ### Added
6
+
7
+ - Added storage sync documentation (`docs/sync.rst`) explaining how to keep taskledger state outside the source repo, sync across PCs with a private Git repo, bootstrap a second machine, follow a daily sync protocol, and avoid active multi-writer conflicts.
8
+ - Added `taskledger storage where` command reporting resolved project and storage location details in human and JSON output, including whether storage lives inside the workspace, is a Git repo, or has active locks.
9
+ - Added `taskledger storage move` for safely migrating storage to a new `taskledger_dir` with atomic config updates, unsafe-target refusal, and follow-up command hints.
10
+ - Added `taskledger sync preflight` read-only check combining doctor health, active-lock warnings, tracked in-repo state warnings, and local Git status.
11
+ - Added `taskledger sync status` and `taskledger sync commit` local Git helper commands for committing taskledger state without network operations.
12
+ - Added `taskledger sync export` and `taskledger sync import` as aliases for the existing archive transfer commands.
13
+ - Added `taskledger sync git` command group for live external-state synchronization: `init`, `status`, `commit`, `cd`, `import-local`, `export-local`, `pull`, `push`, `sync`, and `hooks` subcommands with conservative lock/dirty checks.
14
+ - Added project-scoped `sync git status` that separates current-project changes from outside-project changes in JSON payloads, safe with dirty sibling directories.
15
+ - Added `sync git cd` helper returning the configured sync repo path for shell use.
16
+ - Added `sync git commit` for committing only the configured project path while ignoring dirty sibling paths.
17
+ - Added `[sync.git]` project config section with strict validation and documented defaults.
18
+ - Added `taskledger/services/storage_locations.py` for storage reporting, migration, and sync helper services.
19
+ - Added `taskledger/services/git_sync.py` for git sync orchestration.
20
+ - Added `taskledger/cli_sync.py` as a dedicated sync CLI group.
21
+ - Added `taskledger/api/sync.py` with public sync API wrappers.
22
+
23
+ ### Changed
24
+
25
+ - Demoted whole-repo `sync git pull`, `push`, `sync`, and unsafe hook installation from recommended workflow to advanced/deprecated status in help, docs, and skill guidance.
26
+ - Reframed docs, README, and skill around the project-scoped local helper workflow: `sync git status`, `sync git commit`, then manual Git via `sync git cd`.
27
+ - Fixed stale config filename references so docs no longer claim init writes `.taskledger.toml` when `taskledger.toml` is canonical.
28
+ - Updated external storage examples to use the current `ledgers/<ledger_ref>/...` layout.
29
+
30
+ ### Documentation
31
+
32
+ - Added `docs/sync.rst` with cross-PC sync workflow, daily protocol, and multi-writer conflict avoidance guidance.
33
+ - Updated README, `docs/usage.rst`, `docs/transfer.rst`, `docs/command_contract.rst`, `docs/public_surface.rst`, `API.md`, and `skills/taskledger/SKILL.md` for the new storage and sync command surface.
34
+
35
+ ### Quality
36
+
37
+ - Added `tests/test_storage_sync.py` and `tests/test_sync_git.py` covering storage migration, sync commands, git sync workflows, shared dirty state, project-scoped commits, and JSON result kinds.
38
+ - Expanded command inventory, CLI contract, and docs/skill tests for the new command surface.
39
+ - Full suite: 897 tests passing, ruff and mypy clean.
40
+
3
41
  ## v0.3.1 - 2026-05-12
4
42
 
5
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.3.1
3
+ Version: 0.4.0
4
4
  Summary: Durable project-state storage and CLI for coding workflows
5
5
  Author: Taskledger Contributors
6
6
  Maintainer: Holger Nahrstaedt
@@ -28,6 +28,7 @@ Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
29
29
  Requires-Dist: typer
30
30
  Requires-Dist: PyYAML
31
+ Requires-Dist: Jinja2>=3.1
31
32
  Requires-Dist: tomli; python_version < "3.11"
32
33
  Provides-Extra: dev
33
34
  Requires-Dist: build; extra == "dev"
@@ -72,7 +73,7 @@ The supported command surface is organized as:
72
73
 
73
74
  **Operations:**
74
75
 
75
- - `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`
76
+ - `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`, `storage`, `sync`
76
77
 
77
78
  **Repair and inspection:**
78
79
 
@@ -321,16 +322,18 @@ Rules for agents:
321
322
 
322
323
  ## Human monitoring UI
323
324
 
324
- `taskledger serve` starts a read-only local dashboard for humans monitoring task
325
- state. It now emphasizes the active task, next action, progress, blockers, and
326
- compact task browsing while staying local-only, read-only, and dependency-free.
327
- The MVP still binds to localhost only, refreshes with read-only JSON polling,
328
- and exposes no browser mutation endpoints.
325
+ `taskledger serve` starts a read-only local server-rendered HTML dashboard for
326
+ human monitoring. It emphasizes the active task, next action, progress, and
327
+ task browsing while staying local-only and read-only.
329
328
 
330
329
  ```bash
331
- taskledger serve
330
+ taskledger report html task-0040 --output task-0040.html
331
+ taskledger report html --active --output active-task.html
332
+ taskledger report site --output .taskledger-report/
333
+
334
+ taskledger serve --refresh-seconds 2
332
335
  taskledger serve --open
333
- taskledger serve --task rewrite-v2 --refresh-ms 2000
336
+ taskledger serve --task task-0040 --refresh-seconds 2
334
337
  ```
335
338
 
336
339
  Agents should keep using `taskledger next-action`, `taskledger todo next`, and
@@ -341,12 +344,13 @@ fresh-context transfer.
341
344
  ## Storage layout
342
345
 
343
346
  `taskledger` keeps project-local configuration in the workspace root and durable
344
- records under the configured storage root. The checked-in `.taskledger.toml`
345
- stores only a branch-scoped ledger pointer and next task number. Operational task
346
- state remains ignored under `.taskledger/ledgers/<ledger_ref>/`:
347
+ records under the configured storage root. The checked-in `taskledger.toml`
348
+ stores project identity plus the current branch-scoped ledger pointer and next
349
+ task number. Operational task state remains ignored under
350
+ `.taskledger/ledgers/<ledger_ref>/`:
347
351
 
348
352
  ```text
349
- .taskledger.toml
353
+ taskledger.toml
350
354
  .taskledger/
351
355
  storage.yaml
352
356
  ledgers/
@@ -364,7 +368,7 @@ optional derived caches or registries and are not required for task correctness.
364
368
 
365
369
  ### Branch-scoped ledgers
366
370
 
367
- `.taskledger/` stays ignored and local. `.taskledger.toml` is safe to commit and
371
+ `.taskledger/` stays ignored and local. `taskledger.toml` is safe to commit and
368
372
  contains the current `ledger_ref`, optional parent ref, and the next logical task
369
373
  number for the checked-out source branch.
370
374
 
@@ -374,10 +378,10 @@ the Git branch:
374
378
  ```bash
375
379
  git checkout -b feature-a
376
380
  taskledger ledger fork feature-a
377
- git add .taskledger.toml
381
+ git add taskledger.toml
378
382
  ```
379
383
 
380
- Returning to a branch whose `.taskledger.toml` points back to `main` hides the
384
+ Returning to a branch whose `taskledger.toml` points back to `main` hides the
381
385
  feature branch's active task and task list. Two ledgers may both contain a logical
382
386
  `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
383
387
  `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
@@ -392,15 +396,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
392
396
  ```text
393
397
  /home/me/src/project-a/taskledger.toml
394
398
  /mnt/cloud/taskledger/project-a/storage.yaml
395
- /mnt/cloud/taskledger/project-a/releases/
396
- /mnt/cloud/taskledger/project-a/tasks/
397
- /mnt/cloud/taskledger/project-a/events/
398
- /mnt/cloud/taskledger/project-a/indexes/
399
+ /mnt/cloud/taskledger/project-a/ledgers/main/releases/
400
+ /mnt/cloud/taskledger/project-a/ledgers/main/tasks/
401
+ /mnt/cloud/taskledger/project-a/ledgers/main/events/
402
+ /mnt/cloud/taskledger/project-a/ledgers/main/indexes/
399
403
  ```
400
404
 
401
405
  Use one `taskledger_dir` per source project. Do not share one storage directory
402
406
  across unrelated repositories.
403
407
 
408
+ ### Sync across PCs without committing `.taskledger/`
409
+
410
+ Use a sibling private Git repository for the external storage root instead of
411
+ committing `.taskledger/` into the source repository:
412
+
413
+ ```toml
414
+ # /home/me/src/project-a/taskledger.toml
415
+ taskledger_dir = "../taskledger-state/project-a"
416
+ ```
417
+
418
+ ```text
419
+ /home/me/src/project-a/ # source repo
420
+ /home/me/src/taskledger-state/ # private state repo
421
+ /home/me/src/taskledger-state/project-a/ # taskledger_dir
422
+ ```
423
+
424
+ Keep one active writer at a time. Before starting on a PC, pull the private
425
+ state repo, then run `taskledger doctor` and `taskledger next-action`. After
426
+ stopping at a clean lifecycle boundary, commit and push the state repo. If work
427
+ must move mid-run, prefer `taskledger export TASK_REF` / `taskledger import ARCHIVE` because imported runtime locks are quarantined by default.
428
+
429
+ Helpful local commands:
430
+
431
+ ```bash
432
+ taskledger storage where
433
+ taskledger sync preflight
434
+ taskledger sync status
435
+ taskledger sync commit --message "Sync project-a taskledger state"
436
+ taskledger sync export --output ./taskledger-transfer.tar.gz
437
+ taskledger sync import ./taskledger-transfer.tar.gz --dry-run
438
+ taskledger sync git init --repo ../taskledger-state --project-path project-a
439
+ taskledger sync git status
440
+ taskledger sync git commit --message "Sync project-a taskledger state"
441
+ cd "$(taskledger sync git cd)"
442
+ git pull --ff-only
443
+ git push
444
+ ```
445
+
446
+ See `docs/sync.rst` for the full second-PC bootstrap, daily sync protocol, and
447
+ Syncthing/rclone caveats.
448
+
404
449
  ## JSON output
405
450
 
406
451
  Use `--json` for machine-readable payloads:
@@ -451,6 +496,7 @@ taskledger context --for implementation --format markdown
451
496
  taskledger context --for validation --format json
452
497
  taskledger task dossier --format markdown
453
498
  taskledger task report --task task-0030 -o task30.md
499
+ taskledger report html task-0030 --output task30.html
454
500
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
455
501
  taskledger handoff claim handoff-0001
456
502
  taskledger handoff close handoff-0001 --reason "Implementation started."
@@ -29,7 +29,7 @@ The supported command surface is organized as:
29
29
 
30
30
  **Operations:**
31
31
 
32
- - `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`
32
+ - `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`, `storage`, `sync`
33
33
 
34
34
  **Repair and inspection:**
35
35
 
@@ -278,16 +278,18 @@ Rules for agents:
278
278
 
279
279
  ## Human monitoring UI
280
280
 
281
- `taskledger serve` starts a read-only local dashboard for humans monitoring task
282
- state. It now emphasizes the active task, next action, progress, blockers, and
283
- compact task browsing while staying local-only, read-only, and dependency-free.
284
- The MVP still binds to localhost only, refreshes with read-only JSON polling,
285
- and exposes no browser mutation endpoints.
281
+ `taskledger serve` starts a read-only local server-rendered HTML dashboard for
282
+ human monitoring. It emphasizes the active task, next action, progress, and
283
+ task browsing while staying local-only and read-only.
286
284
 
287
285
  ```bash
288
- taskledger serve
286
+ taskledger report html task-0040 --output task-0040.html
287
+ taskledger report html --active --output active-task.html
288
+ taskledger report site --output .taskledger-report/
289
+
290
+ taskledger serve --refresh-seconds 2
289
291
  taskledger serve --open
290
- taskledger serve --task rewrite-v2 --refresh-ms 2000
292
+ taskledger serve --task task-0040 --refresh-seconds 2
291
293
  ```
292
294
 
293
295
  Agents should keep using `taskledger next-action`, `taskledger todo next`, and
@@ -298,12 +300,13 @@ fresh-context transfer.
298
300
  ## Storage layout
299
301
 
300
302
  `taskledger` keeps project-local configuration in the workspace root and durable
301
- records under the configured storage root. The checked-in `.taskledger.toml`
302
- stores only a branch-scoped ledger pointer and next task number. Operational task
303
- state remains ignored under `.taskledger/ledgers/<ledger_ref>/`:
303
+ records under the configured storage root. The checked-in `taskledger.toml`
304
+ stores project identity plus the current branch-scoped ledger pointer and next
305
+ task number. Operational task state remains ignored under
306
+ `.taskledger/ledgers/<ledger_ref>/`:
304
307
 
305
308
  ```text
306
- .taskledger.toml
309
+ taskledger.toml
307
310
  .taskledger/
308
311
  storage.yaml
309
312
  ledgers/
@@ -321,7 +324,7 @@ optional derived caches or registries and are not required for task correctness.
321
324
 
322
325
  ### Branch-scoped ledgers
323
326
 
324
- `.taskledger/` stays ignored and local. `.taskledger.toml` is safe to commit and
327
+ `.taskledger/` stays ignored and local. `taskledger.toml` is safe to commit and
325
328
  contains the current `ledger_ref`, optional parent ref, and the next logical task
326
329
  number for the checked-out source branch.
327
330
 
@@ -331,10 +334,10 @@ the Git branch:
331
334
  ```bash
332
335
  git checkout -b feature-a
333
336
  taskledger ledger fork feature-a
334
- git add .taskledger.toml
337
+ git add taskledger.toml
335
338
  ```
336
339
 
337
- Returning to a branch whose `.taskledger.toml` points back to `main` hides the
340
+ Returning to a branch whose `taskledger.toml` points back to `main` hides the
338
341
  feature branch's active task and task list. Two ledgers may both contain a logical
339
342
  `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
340
343
  `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
@@ -349,15 +352,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
349
352
  ```text
350
353
  /home/me/src/project-a/taskledger.toml
351
354
  /mnt/cloud/taskledger/project-a/storage.yaml
352
- /mnt/cloud/taskledger/project-a/releases/
353
- /mnt/cloud/taskledger/project-a/tasks/
354
- /mnt/cloud/taskledger/project-a/events/
355
- /mnt/cloud/taskledger/project-a/indexes/
355
+ /mnt/cloud/taskledger/project-a/ledgers/main/releases/
356
+ /mnt/cloud/taskledger/project-a/ledgers/main/tasks/
357
+ /mnt/cloud/taskledger/project-a/ledgers/main/events/
358
+ /mnt/cloud/taskledger/project-a/ledgers/main/indexes/
356
359
  ```
357
360
 
358
361
  Use one `taskledger_dir` per source project. Do not share one storage directory
359
362
  across unrelated repositories.
360
363
 
364
+ ### Sync across PCs without committing `.taskledger/`
365
+
366
+ Use a sibling private Git repository for the external storage root instead of
367
+ committing `.taskledger/` into the source repository:
368
+
369
+ ```toml
370
+ # /home/me/src/project-a/taskledger.toml
371
+ taskledger_dir = "../taskledger-state/project-a"
372
+ ```
373
+
374
+ ```text
375
+ /home/me/src/project-a/ # source repo
376
+ /home/me/src/taskledger-state/ # private state repo
377
+ /home/me/src/taskledger-state/project-a/ # taskledger_dir
378
+ ```
379
+
380
+ Keep one active writer at a time. Before starting on a PC, pull the private
381
+ state repo, then run `taskledger doctor` and `taskledger next-action`. After
382
+ stopping at a clean lifecycle boundary, commit and push the state repo. If work
383
+ must move mid-run, prefer `taskledger export TASK_REF` / `taskledger import ARCHIVE` because imported runtime locks are quarantined by default.
384
+
385
+ Helpful local commands:
386
+
387
+ ```bash
388
+ taskledger storage where
389
+ taskledger sync preflight
390
+ taskledger sync status
391
+ taskledger sync commit --message "Sync project-a taskledger state"
392
+ taskledger sync export --output ./taskledger-transfer.tar.gz
393
+ taskledger sync import ./taskledger-transfer.tar.gz --dry-run
394
+ taskledger sync git init --repo ../taskledger-state --project-path project-a
395
+ taskledger sync git status
396
+ taskledger sync git commit --message "Sync project-a taskledger state"
397
+ cd "$(taskledger sync git cd)"
398
+ git pull --ff-only
399
+ git push
400
+ ```
401
+
402
+ See `docs/sync.rst` for the full second-PC bootstrap, daily sync protocol, and
403
+ Syncthing/rclone caveats.
404
+
361
405
  ## JSON output
362
406
 
363
407
  Use `--json` for machine-readable payloads:
@@ -408,6 +452,7 @@ taskledger context --for implementation --format markdown
408
452
  taskledger context --for validation --format json
409
453
  taskledger task dossier --format markdown
410
454
  taskledger task report --task task-0030 -o task30.md
455
+ taskledger report html task-0030 --output task30.html
411
456
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
412
457
  taskledger handoff claim handoff-0001
413
458
  taskledger handoff close handoff-0001 --reason "Implementation started."
@@ -42,6 +42,21 @@ Task-resource commands accept the task as their direct positional resource:
42
42
  taskledger task unarchive task-0001 --reason "Restore task"
43
43
  taskledger task report task-0001
44
44
 
45
+ Root reporting commands render standalone HTML:
46
+
47
+ .. code-block:: bash
48
+
49
+ taskledger report html task-0040 --output task-0040.html
50
+ taskledger report html --active --output active-task.html
51
+ taskledger report site --output .taskledger-report/
52
+
53
+ Serve supports optional positional task selection and refresh in seconds:
54
+
55
+ .. code-block:: bash
56
+
57
+ taskledger serve --refresh-seconds 2
58
+ taskledger serve --task task-0040 --refresh-seconds 2
59
+
45
60
  Optional positional task refs are not supported for workflow commands.
46
61
 
47
62
  Plan guidance command
@@ -191,7 +206,7 @@ Ledger commands
191
206
  ---------------
192
207
 
193
208
  Branch-scoped ledgers isolate ignored local task state by the checked-in
194
- ``ledger_ref`` stored in ``.taskledger.toml``:
209
+ ``ledger_ref`` stored in ``taskledger.toml``:
195
210
 
196
211
  .. code-block:: bash
197
212
 
@@ -204,9 +219,49 @@ Branch-scoped ledgers isolate ignored local task state by the checked-in
204
219
 
205
220
  ``ledger fork`` creates a new local namespace under
206
221
  ``.taskledger/ledgers/<ref>/`` and updates only Taskledger-owned ledger keys in
207
- ``.taskledger.toml``. ``ledger switch`` changes the checked-in pointer to an
222
+ ``taskledger.toml``. ``ledger switch`` changes the checked-in pointer to an
208
223
  existing local ledger. ``ledger adopt`` copies a task from another local ledger
209
224
  into the current ledger and renumbers on collision.
225
+
226
+ Storage and sync helper commands
227
+ --------------------------------
228
+
229
+ Taskledger also exposes local storage discovery and sync helpers:
230
+
231
+ .. code-block:: bash
232
+
233
+ taskledger storage where
234
+ taskledger storage move --to ../taskledger-state/project-a --mode copy|move [--adopt-existing] [--force]
235
+ taskledger sync preflight
236
+ taskledger sync status
237
+ taskledger sync commit --message "Sync project-a taskledger state"
238
+ taskledger sync export --output ./taskledger-transfer.tar.gz
239
+ taskledger sync import ./taskledger-transfer.tar.gz --dry-run
240
+ taskledger sync git status
241
+ taskledger sync git init --repo ../taskledger-state --project-path project-a
242
+ taskledger sync git commit --message "Sync project-a taskledger state"
243
+ cd "$(taskledger sync git cd)"
244
+ git pull --ff-only
245
+ git push
246
+ taskledger sync git hooks install
247
+ taskledger sync git hooks status
248
+ taskledger sync git hooks uninstall
249
+
250
+ Rules:
251
+
252
+ * ``storage where`` is read-only and reports the resolved workspace root,
253
+ config path, ``taskledger_dir``, project identity, ledger ref, Git detection,
254
+ and active lock count.
255
+ * ``storage move`` updates ``taskledger.toml`` atomically after the target has
256
+ been copied or explicitly adopted.
257
+ * ``sync preflight`` performs only local checks. It must not perform network
258
+ push/pull operations.
259
+ * ``sync status`` and ``sync commit`` operate only on the Git repository that
260
+ contains the resolved ``taskledger_dir``.
261
+ * ``sync export`` and ``sync import`` are archive aliases for the root
262
+ ``export``/``import`` commands.
263
+ * ``sync git`` commands operate on a private external Git repository that stores
264
+ full project taskledger state under ``<repo>/<project_path>``.
210
265
  ``next-action`` result contract
211
266
  -------------------------------
212
267
 
@@ -356,12 +411,12 @@ Human monitoring UI
356
411
 
357
412
  .. code-block:: bash
358
413
 
359
- taskledger serve [--host 127.0.0.1] [--port 8765] [--task TASK_REF] [--refresh-ms 1000] [--open/--no-open]
414
+ taskledger serve [TASK_REF] [--host 127.0.0.1] [--port 8765] [--refresh-seconds 2] [--open/--no-open]
360
415
 
361
416
  Rules:
362
417
 
363
418
  * the MVP binds only to localhost;
364
- * it serves read-only HTML plus read-only JSON endpoints;
419
+ * it serves read-only server-rendered HTML pages;
365
420
  * browser actions are not part of the MVP;
366
421
  * agents should continue to use ``next-action``, ``context``, ``view``, and
367
422
  ``--json`` commands as the canonical automation interface.
@@ -18,6 +18,7 @@ Contents
18
18
  public_surface
19
19
  command_contract
20
20
  transfer
21
+ sync
21
22
 
22
23
  Indices and tables
23
24
  ------------------
@@ -12,6 +12,7 @@ Supported CLI groups
12
12
 
13
13
  - ``task``, ``plan``, ``question``, ``implement``, ``validate``, ``todo``
14
14
  - ``intro``, ``file``, ``link``, ``require``, ``release``, ``lock``, ``handoff``
15
+ - ``storage``, ``sync``
15
16
  - ``doctor``, ``repair``, ``next-action``, ``can``, ``reindex``
16
17
  - ``init``, ``status``, ``export``, ``import``, ``snapshot``
17
18
  - ``context``, ``view``, ``serve``, ``search``, ``grep``, ``symbols``, ``deps``
@@ -54,6 +55,12 @@ todo subcommands
54
55
  - ``todo add``, ``todo list``, ``todo done``, ``todo show``, ``todo status``, ``todo next``
55
56
  - Todo source is inferred from active lock: ``implementer`` during implementation, ``planner`` during planning, ``user`` otherwise.
56
57
 
58
+ storage and sync subcommands
59
+ ----------------------------
60
+
61
+ - ``storage where``, ``storage move --to PATH --mode copy|move [--adopt-existing] [--force]``
62
+ - ``sync preflight``, ``sync status``, ``sync commit --message "..."``
63
+
57
64
  Supported Python API modules
58
65
  ----------------------------
59
66
 
@@ -66,6 +73,7 @@ Supported Python API modules
66
73
  - ``taskledger.api.locks``
67
74
  - ``taskledger.api.handoff``
68
75
  - ``taskledger.api.releases``
76
+ - ``taskledger.api.storage``
69
77
  - ``taskledger.api.search``
70
78
 
71
79
  ``taskledger.api.task_runs`` includes the public lifecycle helpers