taskledger 0.3.0__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 (233) hide show
  1. {taskledger-0.3.0 → taskledger-0.4.0}/.taskledger.toml +3 -3
  2. {taskledger-0.3.0 → taskledger-0.4.0}/API.md +14 -0
  3. {taskledger-0.3.0 → taskledger-0.4.0}/CHANGELOG.md +101 -0
  4. {taskledger-0.3.0/taskledger.egg-info → taskledger-0.4.0}/PKG-INFO +86 -20
  5. {taskledger-0.3.0 → taskledger-0.4.0}/README.md +84 -19
  6. {taskledger-0.3.0 → taskledger-0.4.0}/docs/api.rst +3 -0
  7. {taskledger-0.3.0 → taskledger-0.4.0}/docs/command_contract.rst +89 -4
  8. {taskledger-0.3.0 → taskledger-0.4.0}/docs/index.rst +1 -0
  9. {taskledger-0.3.0 → taskledger-0.4.0}/docs/public_surface.rst +9 -1
  10. taskledger-0.4.0/docs/sync.rst +166 -0
  11. taskledger-0.4.0/docs/transfer.rst +83 -0
  12. {taskledger-0.3.0 → taskledger-0.4.0}/docs/usage.rst +53 -12
  13. {taskledger-0.3.0 → taskledger-0.4.0}/pyproject.toml +3 -3
  14. {taskledger-0.3.0 → taskledger-0.4.0}/skills/taskledger/SKILL.md +29 -15
  15. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/_version.py +3 -3
  16. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/__init__.py +1 -0
  17. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/plans.py +8 -0
  18. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/project.py +7 -0
  19. taskledger-0.4.0/taskledger/api/storage.py +44 -0
  20. taskledger-0.4.0/taskledger/api/sync.py +300 -0
  21. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli.py +157 -10
  22. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_implement.py +5 -1
  23. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_plan.py +84 -3
  24. taskledger-0.4.0/taskledger/cli_report.py +171 -0
  25. taskledger-0.4.0/taskledger/cli_storage.py +115 -0
  26. taskledger-0.4.0/taskledger/cli_sync.py +926 -0
  27. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/command_inventory.py +229 -0
  28. taskledger-0.4.0/taskledger/domain/check.py +111 -0
  29. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/models.py +1 -0
  30. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/run.py +3 -0
  31. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/exchange.py +415 -22
  32. taskledger-0.4.0/taskledger/services/check_tracking.py +126 -0
  33. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/dashboard.py +43 -5
  34. taskledger-0.4.0/taskledger/services/git_sync.py +1018 -0
  35. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/handoff.py +40 -5
  36. taskledger-0.4.0/taskledger/services/html_reports.py +331 -0
  37. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/implementation_flow.py +13 -7
  38. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/navigation.py +12 -9
  39. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_materialization.py +4 -0
  40. taskledger-0.4.0/taskledger/services/plan_review.py +429 -0
  41. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/planning_flow.py +4 -0
  42. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/serve_read_model.py +4 -0
  43. taskledger-0.4.0/taskledger/services/storage_locations.py +482 -0
  44. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_reports.py +70 -2
  45. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/tasks.py +12 -9
  46. taskledger-0.4.0/taskledger/services/web_dashboard.py +239 -0
  47. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/project_config.py +170 -0
  48. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/task_store.py +42 -0
  49. taskledger-0.4.0/taskledger/templates/__init__.py +1 -0
  50. taskledger-0.4.0/taskledger/templates/base.html +64 -0
  51. taskledger-0.4.0/taskledger/templates/error.html +6 -0
  52. taskledger-0.4.0/taskledger/templates/site_index.html +42 -0
  53. taskledger-0.4.0/taskledger/templates/task_report.html +218 -0
  54. {taskledger-0.3.0 → taskledger-0.4.0/taskledger.egg-info}/PKG-INFO +86 -20
  55. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/SOURCES.txt +22 -3
  56. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/requires.txt +1 -0
  57. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_cli_command_contract.py +19 -4
  58. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_command_inventory.py +55 -11
  59. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_docs_and_skill.py +19 -0
  60. taskledger-0.4.0/tests/test_html_reports.py +95 -0
  61. taskledger-0.4.0/tests/test_implementation_checks.py +349 -0
  62. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_no_log_feature.py +6 -0
  63. taskledger-0.4.0/tests/test_plan_review.py +267 -0
  64. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_revision_workflow.py +6 -0
  65. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_project_root_config.py +48 -0
  66. taskledger-0.4.0/tests/test_serve_dashboard.py +188 -0
  67. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_service_boundaries.py +12 -9
  68. taskledger-0.4.0/tests/test_storage_sync.py +311 -0
  69. taskledger-0.4.0/tests/test_sync_git.py +372 -0
  70. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_report.py +78 -0
  71. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_v2_cli.py +22 -3
  72. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_v2_exchange.py +549 -1
  73. taskledger-0.3.0/docs/transfer.rst +0 -49
  74. taskledger-0.3.0/taskledger/services/web_dashboard.py +0 -529
  75. taskledger-0.3.0/taskledger/web_assets/dashboard.css +0 -491
  76. taskledger-0.3.0/taskledger/web_assets/dashboard.js +0 -1407
  77. taskledger-0.3.0/tests/__init__.py +0 -0
  78. taskledger-0.3.0/tests/test_serve_dashboard.py +0 -626
  79. {taskledger-0.3.0 → taskledger-0.4.0}/.codecrate.toml +0 -0
  80. {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/codecov.yml +0 -0
  81. {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/pre-commit.yml +0 -0
  82. {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/python-publish.yml +0 -0
  83. {taskledger-0.3.0 → taskledger-0.4.0}/.github/workflows/tests.yml +0 -0
  84. {taskledger-0.3.0 → taskledger-0.4.0}/.gitignore +0 -0
  85. {taskledger-0.3.0 → taskledger-0.4.0}/.pre-commit-config.yaml +0 -0
  86. {taskledger-0.3.0 → taskledger-0.4.0}/.readthedocs.yaml +0 -0
  87. {taskledger-0.3.0 → taskledger-0.4.0}/.ruff.toml +0 -0
  88. {taskledger-0.3.0 → taskledger-0.4.0}/AGENTS.md +0 -0
  89. {taskledger-0.3.0 → taskledger-0.4.0}/LICENSE +0 -0
  90. {taskledger-0.3.0 → taskledger-0.4.0}/Makefile +0 -0
  91. {taskledger-0.3.0 → taskledger-0.4.0}/docs/Makefile +0 -0
  92. {taskledger-0.3.0 → taskledger-0.4.0}/docs/architecture_taskledger_split.rst +0 -0
  93. {taskledger-0.3.0 → taskledger-0.4.0}/docs/build.sh +0 -0
  94. {taskledger-0.3.0 → taskledger-0.4.0}/docs/conf.py +0 -0
  95. {taskledger-0.3.0 → taskledger-0.4.0}/docs/full_task_cycle.rst +0 -0
  96. {taskledger-0.3.0 → taskledger-0.4.0}/docs/multi_repo.rst +0 -0
  97. {taskledger-0.3.0 → taskledger-0.4.0}/docs/requirements.txt +0 -0
  98. {taskledger-0.3.0 → taskledger-0.4.0}/docs/service_boundary_whitelist.rst +0 -0
  99. {taskledger-0.3.0 → taskledger-0.4.0}/setup.cfg +0 -0
  100. {taskledger-0.3.0 → taskledger-0.4.0}/setup.py +0 -0
  101. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/__init__.py +0 -0
  102. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/__main__.py +0 -0
  103. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/handoff.py +0 -0
  104. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/introductions.py +0 -0
  105. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/locks.py +0 -0
  106. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/questions.py +0 -0
  107. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/releases.py +0 -0
  108. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/search.py +0 -0
  109. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/task_runs.py +0 -0
  110. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/api/tasks.py +0 -0
  111. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_actor.py +0 -0
  112. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_common.py +0 -0
  113. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_ledger.py +0 -0
  114. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_migrate.py +0 -0
  115. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_misc.py +0 -0
  116. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_question.py +0 -0
  117. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_release.py +0 -0
  118. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_task.py +0 -0
  119. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/cli_validate.py +0 -0
  120. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/__init__.py +0 -0
  121. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/_model_utils.py +0 -0
  122. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/active_state.py +0 -0
  123. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/actor.py +0 -0
  124. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/change.py +0 -0
  125. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/event.py +0 -0
  126. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/handoff.py +0 -0
  127. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/lock.py +0 -0
  128. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/plan.py +0 -0
  129. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/policies.py +0 -0
  130. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/question.py +0 -0
  131. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/release.py +0 -0
  132. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/sidecars.py +0 -0
  133. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/states.py +0 -0
  134. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/domain/task.py +0 -0
  135. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/errors.py +0 -0
  136. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/ids.py +0 -0
  137. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/launcher.py +0 -0
  138. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/py.typed +0 -0
  139. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/search.py +0 -0
  140. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/__init__.py +0 -0
  141. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/actors.py +0 -0
  142. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/agent_logging.py +0 -0
  143. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/agent_transcripts.py +0 -0
  144. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/change_tracking.py +0 -0
  145. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/command_runner.py +0 -0
  146. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor.py +0 -0
  147. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/migration_checks.py +0 -0
  148. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/project_scan.py +0 -0
  149. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/doctor_checks/task_checks.py +0 -0
  150. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/handoff_lifecycle.py +0 -0
  151. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/next_action_model.py +0 -0
  152. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/phase5_lock_transfer.py +0 -0
  153. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_editing.py +0 -0
  154. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_hash.py +0 -0
  155. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/plan_lint.py +0 -0
  156. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/releases.py +0 -0
  157. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/run_store.py +0 -0
  158. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_archive.py +0 -0
  159. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_collections.py +0 -0
  160. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_lifecycle.py +0 -0
  161. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_queries.py +0 -0
  162. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/task_repair.py +0 -0
  163. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/tree.py +0 -0
  164. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/validation.py +0 -0
  165. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/validation_flow.py +0 -0
  166. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/services/workflow_guidance.py +0 -0
  167. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/__init__.py +0 -0
  168. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/agent_logs.py +0 -0
  169. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/atomic.py +0 -0
  170. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/common.py +0 -0
  171. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/events.py +0 -0
  172. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/frontmatter.py +0 -0
  173. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/indexes.py +0 -0
  174. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/init.py +0 -0
  175. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/ledger_config.py +0 -0
  176. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/locks.py +0 -0
  177. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/meta.py +0 -0
  178. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/migrations.py +0 -0
  179. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/paths.py +0 -0
  180. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/project_identity.py +0 -0
  181. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/storage/repos.py +0 -0
  182. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger/timeutils.py +0 -0
  183. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/dependency_links.txt +0 -0
  184. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/entry_points.txt +0 -0
  185. {taskledger-0.3.0 → taskledger-0.4.0}/taskledger.egg-info/top_level.txt +0 -0
  186. {taskledger-0.3.0/taskledger/web_assets → taskledger-0.4.0/tests}/__init__.py +0 -0
  187. {taskledger-0.3.0 → taskledger-0.4.0}/tests/conftest.py +0 -0
  188. {taskledger-0.3.0 → taskledger-0.4.0}/tests/support/__init__.py +0 -0
  189. {taskledger-0.3.0 → taskledger-0.4.0}/tests/support/builders.py +0 -0
  190. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_active_task.py +0 -0
  191. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_actor_harness_state.py +0 -0
  192. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_agent_command_logging.py +0 -0
  193. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_agent_session_protocol.py +0 -0
  194. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_atomic_fast_io.py +0 -0
  195. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_cli_import_resilience.py +0 -0
  196. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_command_example_linter.py +0 -0
  197. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_compact_mutation_output.py +0 -0
  198. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_delta_remaining_contracts.py +0 -0
  199. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_doctor.py +0 -0
  200. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_domain_policies.py +0 -0
  201. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_events.py +0 -0
  202. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_handoff_lifecycle.py +0 -0
  203. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_help_subprocess.py +0 -0
  204. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_implementation_change_scan.py +0 -0
  205. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_json_contracts.py +0 -0
  206. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_legacy_cleanup_contracts.py +0 -0
  207. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_lifecycle_policies.py +0 -0
  208. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_locks_audit.py +0 -0
  209. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_models_v1_schema.py +0 -0
  210. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_next_action_expired_lock.py +0 -0
  211. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_approval_contract.py +0 -0
  212. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_lint.py +0 -0
  213. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_plan_todo_materialization.py +0 -0
  214. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_add_many.py +0 -0
  215. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_filter_answers.py +0 -0
  216. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_question_plan_regeneration.py +0 -0
  217. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_release_changelog.py +0 -0
  218. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_search.py +0 -0
  219. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_services_dashboard.py +0 -0
  220. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_sidecar_collections.py +0 -0
  221. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_bundle_layout.py +0 -0
  222. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_common.py +0 -0
  223. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_init.py +0 -0
  224. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_migration.py +0 -0
  225. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_storage_repos.py +0 -0
  226. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_archive.py +0 -0
  227. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_task_events.py +0 -0
  228. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
  229. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_taskledger_cli_api_parity.py +1 -1
  230. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_tasks_service_static.py +0 -0
  231. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_todo_implementation_gate.py +0 -0
  232. {taskledger-0.3.0 → taskledger-0.4.0}/tests/test_tree_command.py +0 -0
  233. {taskledger-0.3.0 → 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 = 81
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
@@ -104,6 +105,9 @@ from taskledger.errors import (
104
105
  - `propose_plan`
105
106
  - `plan_template`
106
107
  - `upsert_plan`
108
+ - `PlanReviewOptions`
109
+ - `build_plan_review_payload`
110
+ - `render_plan_review`
107
111
  - `export_plan`
108
112
  - `amend_plan`
109
113
  - `regenerate_plan_from_answers`
@@ -230,6 +234,14 @@ record body and return compact metadata, including `context_hash` and
230
234
  - `show_release`
231
235
  - `tag_release`
232
236
 
237
+ ### `taskledger.api.storage`
238
+
239
+ - `storage_where`
240
+ - `storage_move`
241
+ - `sync_preflight`
242
+ - `sync_status`
243
+ - `sync_commit`
244
+
233
245
  ### `taskledger.api.search`
234
246
 
235
247
  - `search_workspace`
@@ -253,6 +265,8 @@ The public task-first CLI surface is organized around these command groups:
253
265
  - `require`
254
266
  - `release`
255
267
  - `lock`
268
+ - `storage`
269
+ - `sync`
256
270
  - `context`
257
271
  - `handoff`
258
272
  - `repair`
@@ -1,5 +1,106 @@
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
+
41
+ ## v0.3.1 - 2026-05-12
42
+
43
+ ### Added
44
+
45
+ - Added task-scoped export/import with `--task` positional ref on export, safe ID remapping (`--id-policy preserve|renumber`), counter repair, and artifact path remapping on import. Full-ledger export remains the default; single-task archives filter task-scoped records and clear `active_task`.
46
+ - Added `taskledger plan review` command to show the current or specified plan version with structured JSON output and content rendering.
47
+ - Added `next-action` routing to recommend `plan review --version N` when a plan is awaiting approval.
48
+
49
+ ### Documentation
50
+
51
+ - Updated README, command contract, and SKILL.md for task-scoped transfer workflow and `plan review` command.
52
+
53
+ ### Quality
54
+
55
+ - Added regression coverage for task-scoped export/import ID mapping, conflict policy, counter repair, artifact remap, and plan review end-to-end.
56
+ - Full suite: 878 tests passing, ruff and mypy clean.
57
+
58
+ ## v0.3.0 - 2026-05-05
59
+
60
+ ### Added
61
+
62
+ - Added agent command transcript logging: opt-in config, append-only NDJSON storage, CLI stdout/stderr tee capture, managed-shell capture, `task transcript` command, and `task report --include command-log` section. Export/import preserves transcript archives.
63
+ - Added planning guidance profiles: `plan guidance` command, `--include-guidance` plan template injection, and `prompt_profiles.planning` config with advisory required-fields rendering.
64
+ - Added transcript review mode as the default `task transcript` output, with `--raw` flag for the original table view, duplicate log ID warnings, and logical-row grouping for wrapper/managed-shell pairs.
65
+ - Added enriched command metadata: tier, deprecated, replaced_by, ledger_effect, workspace_effect, external_effect, and agent_safe fields on CommandSpec. Added `--tier` and `--include-deprecated` CLI filters. Deprecated `lock break` in favor of `repair lock`.
66
+ - Added first-class expired-lock resume path: `implement resume --repair-expired-lock` releases expired implementation locks with audit trail, and `next-action` emits `expired-lock-resume` when applicable.
67
+ - Added task-resource positional refs for read-only commands (`task show`, `task view`, etc.) with explicit `--task` required for destructive commands (`task cancel`, `task uncancel`, `task edit`).
68
+ - Added JSON usage-error envelopes for workflow positional-ref rejection and CLI parse errors.
69
+ - Added soft task archive: `task archive`/`task unarchive` commands, archived-task visibility filtering across list/tree/status, and slug reuse semantics.
70
+ - Added export/import project metadata guard, dry-run safety, and include-flag controls.
71
+ - Added plan revision workflow: `plan export`, `plan amend`, and `--auto-revise` with safe plan input path guard and plan.amended audit events.
72
+ - Added plan approval provenance: approval_source and approved_plan_hash stored on acceptance, with hash-mismatch warnings in reports.
73
+ - Added implement finish warning for missing git change scans.
74
+
75
+ ### Changed
76
+
77
+ - Split run/lock helpers into `services/run_store.py` from the tasks.py monolith; `tasks.py` re-exports for backward compatibility.
78
+ - Wrapper commands now mirror inner exit status by default instead of always succeeding.
79
+ - Planning guidance recommendation is now integrated into `plan start` and `next-action` with a one-time viewed marker.
80
+ - Plan lint human output now renders summary and issue details instead of bare pass/fail.
81
+ - Question `answer-many` now validates repeat inputs, aliases, and provenance.
82
+ - Doctor mismatch guidance and verbose output improved with actionable repair hints.
83
+
84
+ ### Fixed
85
+
86
+ - Fixed task report Plans section so non-accepted plans show reviewable details instead of being omitted.
87
+ - Fixed pre-commit `--all-files` regressions across test files.
88
+
89
+ ### Documentation
90
+
91
+ - Documented planning guidance profiles in README, usage, command contract, API, and skill.
92
+ - Documented transcript logging, managed command capture, and review mode in usage and skill.
93
+ - Documented expired-lock-resume path and `--repair-expired-lock` in SKILL.md.
94
+ - Documented command-surface safety guidance, task-resource positional refs, and destructive-target rules in SKILL.md and command contract.
95
+ - Documented plan revision workflow commands and safety semantics in SKILL.md and command examples.
96
+ - Updated failure-review remediation hints for known mistakes in docs and skill.
97
+
98
+ ### Quality
99
+
100
+ - Added regression test modules for agent command logging, expired-lock resume, task archive, and plan revision workflow.
101
+ - Expanded command inventory, CLI contract, JSON contract, and docs/skill tests for metadata enrichment, deprecation, targeting, and envelope behavior.
102
+ - Full suite: 770+ tests passing, ruff and mypy clean.
103
+
3
104
  ## v0.2.0 - 2026-05-03
4
105
 
5
106
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.3.0
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
 
@@ -164,6 +165,7 @@ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
164
165
  taskledger question status
165
166
  taskledger plan template --from-answers --file ./plan.md
166
167
  taskledger plan upsert --from-answers --file ./plan.md
168
+ taskledger plan review --version 1
167
169
  taskledger plan lint --version 1
168
170
  taskledger plan accept --version 1 --note "Ready."
169
171
 
@@ -320,16 +322,18 @@ Rules for agents:
320
322
 
321
323
  ## Human monitoring UI
322
324
 
323
- `taskledger serve` starts a read-only local dashboard for humans monitoring task
324
- state. It now emphasizes the active task, next action, progress, blockers, and
325
- compact task browsing while staying local-only, read-only, and dependency-free.
326
- The MVP still binds to localhost only, refreshes with read-only JSON polling,
327
- 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.
328
328
 
329
329
  ```bash
330
- 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
331
335
  taskledger serve --open
332
- taskledger serve --task rewrite-v2 --refresh-ms 2000
336
+ taskledger serve --task task-0040 --refresh-seconds 2
333
337
  ```
334
338
 
335
339
  Agents should keep using `taskledger next-action`, `taskledger todo next`, and
@@ -340,12 +344,13 @@ fresh-context transfer.
340
344
  ## Storage layout
341
345
 
342
346
  `taskledger` keeps project-local configuration in the workspace root and durable
343
- records under the configured storage root. The checked-in `.taskledger.toml`
344
- stores only a branch-scoped ledger pointer and next task number. Operational task
345
- 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>/`:
346
351
 
347
352
  ```text
348
- .taskledger.toml
353
+ taskledger.toml
349
354
  .taskledger/
350
355
  storage.yaml
351
356
  ledgers/
@@ -363,7 +368,7 @@ optional derived caches or registries and are not required for task correctness.
363
368
 
364
369
  ### Branch-scoped ledgers
365
370
 
366
- `.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
367
372
  contains the current `ledger_ref`, optional parent ref, and the next logical task
368
373
  number for the checked-out source branch.
369
374
 
@@ -373,10 +378,10 @@ the Git branch:
373
378
  ```bash
374
379
  git checkout -b feature-a
375
380
  taskledger ledger fork feature-a
376
- git add .taskledger.toml
381
+ git add taskledger.toml
377
382
  ```
378
383
 
379
- 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
380
385
  feature branch's active task and task list. Two ledgers may both contain a logical
381
386
  `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
382
387
  `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
@@ -391,15 +396,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
391
396
  ```text
392
397
  /home/me/src/project-a/taskledger.toml
393
398
  /mnt/cloud/taskledger/project-a/storage.yaml
394
- /mnt/cloud/taskledger/project-a/releases/
395
- /mnt/cloud/taskledger/project-a/tasks/
396
- /mnt/cloud/taskledger/project-a/events/
397
- /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/
398
403
  ```
399
404
 
400
405
  Use one `taskledger_dir` per source project. Do not share one storage directory
401
406
  across unrelated repositories.
402
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
+
403
449
  ## JSON output
404
450
 
405
451
  Use `--json` for machine-readable payloads:
@@ -450,6 +496,7 @@ taskledger context --for implementation --format markdown
450
496
  taskledger context --for validation --format json
451
497
  taskledger task dossier --format markdown
452
498
  taskledger task report --task task-0030 -o task30.md
499
+ taskledger report html task-0030 --output task30.html
453
500
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
454
501
  taskledger handoff claim handoff-0001
455
502
  taskledger handoff close handoff-0001 --reason "Implementation started."
@@ -512,7 +559,10 @@ for task-first handoff guidance.
512
559
  ```bash
513
560
  taskledger init --project-name "Taskledger"
514
561
  taskledger export
562
+ taskledger export --task task-0040
563
+ taskledger export task-0040
515
564
  taskledger import ./taskledger-transfer.tar.gz --dry-run
565
+ taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
516
566
  taskledger import ./taskledger-transfer.tar.gz --replace
517
567
  taskledger snapshot ./artifacts
518
568
  ```
@@ -521,6 +571,7 @@ Default export filenames use this policy:
521
571
 
522
572
  ```text
523
573
  taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
574
+ taskledger-task-{project_slug}-{ledger_ref}-{task_id}-{timestamp}.tar.gz
524
575
  ```
525
576
 
526
577
  `project_slug` is derived from `project_name` in `taskledger.toml`. If
@@ -543,6 +594,21 @@ taskledger implement resume --reason "Continue imported implementation."
543
594
 
544
595
  Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
545
596
 
597
+ Single-task transfer from a config-only checkout:
598
+
599
+ ```bash
600
+ # fresh checkout on another PC
601
+ taskledger init
602
+ taskledger task create "Fix import edge case" --slug fix-import-edge-case --description "..."
603
+ # ... normal plan / implementation / validation lifecycle ...
604
+ taskledger export task-0040
605
+
606
+ # main dev repo
607
+ taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
608
+ taskledger task list
609
+ taskledger task show task-0040
610
+ ```
611
+
546
612
  ## Skill packaging
547
613
 
548
614
  Agent workflows work best when the `taskledger` skill is installed in the
@@ -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
 
@@ -121,6 +121,7 @@ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
121
121
  taskledger question status
122
122
  taskledger plan template --from-answers --file ./plan.md
123
123
  taskledger plan upsert --from-answers --file ./plan.md
124
+ taskledger plan review --version 1
124
125
  taskledger plan lint --version 1
125
126
  taskledger plan accept --version 1 --note "Ready."
126
127
 
@@ -277,16 +278,18 @@ Rules for agents:
277
278
 
278
279
  ## Human monitoring UI
279
280
 
280
- `taskledger serve` starts a read-only local dashboard for humans monitoring task
281
- state. It now emphasizes the active task, next action, progress, blockers, and
282
- compact task browsing while staying local-only, read-only, and dependency-free.
283
- The MVP still binds to localhost only, refreshes with read-only JSON polling,
284
- 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.
285
284
 
286
285
  ```bash
287
- 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
288
291
  taskledger serve --open
289
- taskledger serve --task rewrite-v2 --refresh-ms 2000
292
+ taskledger serve --task task-0040 --refresh-seconds 2
290
293
  ```
291
294
 
292
295
  Agents should keep using `taskledger next-action`, `taskledger todo next`, and
@@ -297,12 +300,13 @@ fresh-context transfer.
297
300
  ## Storage layout
298
301
 
299
302
  `taskledger` keeps project-local configuration in the workspace root and durable
300
- records under the configured storage root. The checked-in `.taskledger.toml`
301
- stores only a branch-scoped ledger pointer and next task number. Operational task
302
- 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>/`:
303
307
 
304
308
  ```text
305
- .taskledger.toml
309
+ taskledger.toml
306
310
  .taskledger/
307
311
  storage.yaml
308
312
  ledgers/
@@ -320,7 +324,7 @@ optional derived caches or registries and are not required for task correctness.
320
324
 
321
325
  ### Branch-scoped ledgers
322
326
 
323
- `.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
324
328
  contains the current `ledger_ref`, optional parent ref, and the next logical task
325
329
  number for the checked-out source branch.
326
330
 
@@ -330,10 +334,10 @@ the Git branch:
330
334
  ```bash
331
335
  git checkout -b feature-a
332
336
  taskledger ledger fork feature-a
333
- git add .taskledger.toml
337
+ git add taskledger.toml
334
338
  ```
335
339
 
336
- 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
337
341
  feature branch's active task and task list. Two ledgers may both contain a logical
338
342
  `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
339
343
  `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
@@ -348,15 +352,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
348
352
  ```text
349
353
  /home/me/src/project-a/taskledger.toml
350
354
  /mnt/cloud/taskledger/project-a/storage.yaml
351
- /mnt/cloud/taskledger/project-a/releases/
352
- /mnt/cloud/taskledger/project-a/tasks/
353
- /mnt/cloud/taskledger/project-a/events/
354
- /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/
355
359
  ```
356
360
 
357
361
  Use one `taskledger_dir` per source project. Do not share one storage directory
358
362
  across unrelated repositories.
359
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
+
360
405
  ## JSON output
361
406
 
362
407
  Use `--json` for machine-readable payloads:
@@ -407,6 +452,7 @@ taskledger context --for implementation --format markdown
407
452
  taskledger context --for validation --format json
408
453
  taskledger task dossier --format markdown
409
454
  taskledger task report --task task-0030 -o task30.md
455
+ taskledger report html task-0030 --output task30.html
410
456
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
411
457
  taskledger handoff claim handoff-0001
412
458
  taskledger handoff close handoff-0001 --reason "Implementation started."
@@ -469,7 +515,10 @@ for task-first handoff guidance.
469
515
  ```bash
470
516
  taskledger init --project-name "Taskledger"
471
517
  taskledger export
518
+ taskledger export --task task-0040
519
+ taskledger export task-0040
472
520
  taskledger import ./taskledger-transfer.tar.gz --dry-run
521
+ taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
473
522
  taskledger import ./taskledger-transfer.tar.gz --replace
474
523
  taskledger snapshot ./artifacts
475
524
  ```
@@ -478,6 +527,7 @@ Default export filenames use this policy:
478
527
 
479
528
  ```text
480
529
  taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
530
+ taskledger-task-{project_slug}-{ledger_ref}-{task_id}-{timestamp}.tar.gz
481
531
  ```
482
532
 
483
533
  `project_slug` is derived from `project_name` in `taskledger.toml`. If
@@ -500,6 +550,21 @@ taskledger implement resume --reason "Continue imported implementation."
500
550
 
501
551
  Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
502
552
 
553
+ Single-task transfer from a config-only checkout:
554
+
555
+ ```bash
556
+ # fresh checkout on another PC
557
+ taskledger init
558
+ taskledger task create "Fix import edge case" --slug fix-import-edge-case --description "..."
559
+ # ... normal plan / implementation / validation lifecycle ...
560
+ taskledger export task-0040
561
+
562
+ # main dev repo
563
+ taskledger import ./taskledger-task-planledger-main-task-0040-20260509T101500Z.tar.gz
564
+ taskledger task list
565
+ taskledger task show task-0040
566
+ ```
567
+
503
568
  ## Skill packaging
504
569
 
505
570
  Agent workflows work best when the `taskledger` skill is installed in the
@@ -85,6 +85,9 @@ Plan API
85
85
  - ``propose_plan``
86
86
  - ``plan_template``
87
87
  - ``upsert_plan``
88
+ - ``PlanReviewOptions``
89
+ - ``build_plan_review_payload``
90
+ - ``render_plan_review``
88
91
  - ``export_plan``
89
92
  - ``amend_plan``
90
93
  - ``list_plan_versions``