taskledger 0.3.1__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. taskledger-0.4.1/.archledger.toml +62 -0
  2. {taskledger-0.3.1 → taskledger-0.4.1}/.taskledger.toml +3 -3
  3. {taskledger-0.3.1 → taskledger-0.4.1}/AGENTS.md +4 -45
  4. {taskledger-0.3.1 → taskledger-0.4.1}/API.md +18 -2
  5. {taskledger-0.3.1 → taskledger-0.4.1}/CHANGELOG.md +69 -0
  6. {taskledger-0.3.1/taskledger.egg-info → taskledger-0.4.1}/PKG-INFO +149 -20
  7. {taskledger-0.3.1 → taskledger-0.4.1}/README.md +147 -19
  8. {taskledger-0.3.1 → taskledger-0.4.1}/docs/command_contract.rst +72 -4
  9. {taskledger-0.3.1 → taskledger-0.4.1}/docs/full_task_cycle.rst +19 -0
  10. {taskledger-0.3.1 → taskledger-0.4.1}/docs/index.rst +1 -0
  11. {taskledger-0.3.1 → taskledger-0.4.1}/docs/public_surface.rst +8 -0
  12. taskledger-0.4.1/docs/sync.rst +166 -0
  13. {taskledger-0.3.1 → taskledger-0.4.1}/docs/transfer.rst +3 -1
  14. {taskledger-0.3.1 → taskledger-0.4.1}/docs/usage.rst +139 -10
  15. {taskledger-0.3.1 → taskledger-0.4.1}/pyproject.toml +2 -2
  16. {taskledger-0.3.1 → taskledger-0.4.1}/skills/taskledger/SKILL.md +36 -13
  17. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/_version.py +3 -3
  18. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/__init__.py +1 -0
  19. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/handoff.py +30 -19
  20. taskledger-0.4.1/taskledger/api/storage.py +44 -0
  21. taskledger-0.4.1/taskledger/api/sync.py +300 -0
  22. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli.py +75 -8
  23. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_implement.py +1 -1
  24. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_misc.py +26 -1
  25. taskledger-0.4.1/taskledger/cli_pipeline.py +166 -0
  26. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_plan.py +8 -0
  27. taskledger-0.4.1/taskledger/cli_report.py +171 -0
  28. taskledger-0.4.1/taskledger/cli_storage.py +115 -0
  29. taskledger-0.4.1/taskledger/cli_sync.py +926 -0
  30. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/command_inventory.py +254 -0
  31. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/handoff.py +6 -1
  32. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/sidecars.py +6 -1
  33. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/doctor_checks/task_checks.py +134 -1
  34. taskledger-0.4.1/taskledger/services/git_sync.py +1018 -0
  35. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/handoff.py +72 -140
  36. taskledger-0.4.1/taskledger/services/html_reports.py +331 -0
  37. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/navigation.py +55 -0
  38. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/plan_editing.py +2 -0
  39. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/plan_materialization.py +1 -1
  40. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/planning_flow.py +1 -1
  41. taskledger-0.4.1/taskledger/services/storage_locations.py +482 -0
  42. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_reports.py +2 -0
  43. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/tasks.py +102 -2
  44. taskledger-0.4.1/taskledger/services/web_dashboard.py +239 -0
  45. taskledger-0.4.1/taskledger/services/worker_context.py +208 -0
  46. taskledger-0.4.1/taskledger/services/worker_pipeline.py +216 -0
  47. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/project_config.py +191 -0
  48. taskledger-0.4.1/taskledger/storage/worker_pipeline_config.py +419 -0
  49. taskledger-0.4.1/taskledger/templates/__init__.py +1 -0
  50. taskledger-0.4.1/taskledger/templates/base.html +64 -0
  51. taskledger-0.4.1/taskledger/templates/error.html +6 -0
  52. taskledger-0.4.1/taskledger/templates/site_index.html +42 -0
  53. taskledger-0.4.1/taskledger/templates/task_report.html +218 -0
  54. {taskledger-0.3.1 → taskledger-0.4.1/taskledger.egg-info}/PKG-INFO +149 -20
  55. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger.egg-info/SOURCES.txt +28 -3
  56. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger.egg-info/requires.txt +1 -0
  57. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_cli_command_contract.py +19 -4
  58. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_command_inventory.py +47 -11
  59. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_docs_and_skill.py +33 -0
  60. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_doctor.py +79 -0
  61. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_help_subprocess.py +31 -0
  62. taskledger-0.4.1/tests/test_html_reports.py +95 -0
  63. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_json_contracts.py +174 -0
  64. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_project_root_config.py +48 -0
  65. taskledger-0.4.1/tests/test_serve_dashboard.py +188 -0
  66. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_service_boundaries.py +17 -8
  67. taskledger-0.4.1/tests/test_storage_sync.py +311 -0
  68. taskledger-0.4.1/tests/test_sync_git.py +372 -0
  69. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_task_report.py +78 -0
  70. taskledger-0.4.1/tests/test_worker_pipeline_cli.py +556 -0
  71. taskledger-0.4.1/tests/test_worker_pipeline_config.py +279 -0
  72. taskledger-0.4.1/tests/test_worker_pipeline_context.py +210 -0
  73. taskledger-0.4.1/tests/test_worker_pipeline_handoff.py +163 -0
  74. taskledger-0.4.1/tests/test_worker_pipeline_plan_template.py +158 -0
  75. taskledger-0.4.1/tests/test_worker_pipeline_todos.py +241 -0
  76. taskledger-0.3.1/taskledger/services/web_dashboard.py +0 -529
  77. taskledger-0.3.1/taskledger/web_assets/dashboard.css +0 -491
  78. taskledger-0.3.1/taskledger/web_assets/dashboard.js +0 -1448
  79. taskledger-0.3.1/tests/__init__.py +0 -0
  80. taskledger-0.3.1/tests/test_serve_dashboard.py +0 -626
  81. {taskledger-0.3.1 → taskledger-0.4.1}/.codecrate.toml +0 -0
  82. {taskledger-0.3.1 → taskledger-0.4.1}/.github/workflows/codecov.yml +0 -0
  83. {taskledger-0.3.1 → taskledger-0.4.1}/.github/workflows/pre-commit.yml +0 -0
  84. {taskledger-0.3.1 → taskledger-0.4.1}/.github/workflows/python-publish.yml +0 -0
  85. {taskledger-0.3.1 → taskledger-0.4.1}/.github/workflows/tests.yml +0 -0
  86. {taskledger-0.3.1 → taskledger-0.4.1}/.gitignore +0 -0
  87. {taskledger-0.3.1 → taskledger-0.4.1}/.pre-commit-config.yaml +0 -0
  88. {taskledger-0.3.1 → taskledger-0.4.1}/.readthedocs.yaml +0 -0
  89. {taskledger-0.3.1 → taskledger-0.4.1}/.ruff.toml +0 -0
  90. {taskledger-0.3.1 → taskledger-0.4.1}/LICENSE +0 -0
  91. {taskledger-0.3.1 → taskledger-0.4.1}/Makefile +0 -0
  92. {taskledger-0.3.1 → taskledger-0.4.1}/docs/Makefile +0 -0
  93. {taskledger-0.3.1 → taskledger-0.4.1}/docs/api.rst +0 -0
  94. {taskledger-0.3.1 → taskledger-0.4.1}/docs/architecture_taskledger_split.rst +0 -0
  95. {taskledger-0.3.1 → taskledger-0.4.1}/docs/build.sh +0 -0
  96. {taskledger-0.3.1 → taskledger-0.4.1}/docs/conf.py +0 -0
  97. {taskledger-0.3.1 → taskledger-0.4.1}/docs/multi_repo.rst +0 -0
  98. {taskledger-0.3.1 → taskledger-0.4.1}/docs/requirements.txt +0 -0
  99. {taskledger-0.3.1 → taskledger-0.4.1}/docs/service_boundary_whitelist.rst +0 -0
  100. {taskledger-0.3.1 → taskledger-0.4.1}/setup.cfg +0 -0
  101. {taskledger-0.3.1 → taskledger-0.4.1}/setup.py +0 -0
  102. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/__init__.py +0 -0
  103. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/__main__.py +0 -0
  104. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/introductions.py +0 -0
  105. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/locks.py +0 -0
  106. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/plans.py +0 -0
  107. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/project.py +0 -0
  108. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/questions.py +0 -0
  109. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/releases.py +0 -0
  110. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/search.py +0 -0
  111. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/task_runs.py +0 -0
  112. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/api/tasks.py +0 -0
  113. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_actor.py +0 -0
  114. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_common.py +0 -0
  115. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_ledger.py +0 -0
  116. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_migrate.py +0 -0
  117. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_question.py +0 -0
  118. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_release.py +0 -0
  119. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_task.py +0 -0
  120. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/cli_validate.py +0 -0
  121. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/__init__.py +0 -0
  122. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/_model_utils.py +0 -0
  123. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/active_state.py +0 -0
  124. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/actor.py +0 -0
  125. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/change.py +0 -0
  126. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/check.py +0 -0
  127. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/event.py +0 -0
  128. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/lock.py +0 -0
  129. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/models.py +0 -0
  130. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/plan.py +0 -0
  131. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/policies.py +0 -0
  132. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/question.py +0 -0
  133. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/release.py +0 -0
  134. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/run.py +0 -0
  135. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/states.py +0 -0
  136. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/domain/task.py +0 -0
  137. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/errors.py +0 -0
  138. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/exchange.py +0 -0
  139. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/ids.py +0 -0
  140. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/launcher.py +0 -0
  141. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/py.typed +0 -0
  142. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/search.py +0 -0
  143. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/__init__.py +0 -0
  144. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/actors.py +0 -0
  145. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/agent_logging.py +0 -0
  146. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/agent_transcripts.py +0 -0
  147. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/change_tracking.py +0 -0
  148. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/check_tracking.py +0 -0
  149. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/command_runner.py +0 -0
  150. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/dashboard.py +0 -0
  151. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/doctor.py +0 -0
  152. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/doctor_checks/migration_checks.py +0 -0
  153. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/doctor_checks/project_scan.py +0 -0
  154. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/handoff_lifecycle.py +0 -0
  155. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/implementation_flow.py +0 -0
  156. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/next_action_model.py +0 -0
  157. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/phase5_lock_transfer.py +0 -0
  158. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/plan_hash.py +0 -0
  159. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/plan_lint.py +0 -0
  160. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/plan_review.py +0 -0
  161. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/releases.py +0 -0
  162. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/run_store.py +0 -0
  163. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/serve_read_model.py +0 -0
  164. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_archive.py +0 -0
  165. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_collections.py +0 -0
  166. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_lifecycle.py +0 -0
  167. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_queries.py +0 -0
  168. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/task_repair.py +0 -0
  169. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/tree.py +0 -0
  170. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/validation.py +0 -0
  171. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/validation_flow.py +0 -0
  172. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/services/workflow_guidance.py +0 -0
  173. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/__init__.py +0 -0
  174. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/agent_logs.py +0 -0
  175. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/atomic.py +0 -0
  176. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/common.py +0 -0
  177. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/events.py +0 -0
  178. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/frontmatter.py +0 -0
  179. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/indexes.py +0 -0
  180. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/init.py +0 -0
  181. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/ledger_config.py +0 -0
  182. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/locks.py +0 -0
  183. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/meta.py +0 -0
  184. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/migrations.py +0 -0
  185. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/paths.py +0 -0
  186. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/project_identity.py +0 -0
  187. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/repos.py +0 -0
  188. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/storage/task_store.py +0 -0
  189. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger/timeutils.py +0 -0
  190. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger.egg-info/dependency_links.txt +0 -0
  191. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger.egg-info/entry_points.txt +0 -0
  192. {taskledger-0.3.1 → taskledger-0.4.1}/taskledger.egg-info/top_level.txt +0 -0
  193. {taskledger-0.3.1/taskledger/web_assets → taskledger-0.4.1/tests}/__init__.py +0 -0
  194. {taskledger-0.3.1 → taskledger-0.4.1}/tests/conftest.py +0 -0
  195. {taskledger-0.3.1 → taskledger-0.4.1}/tests/support/__init__.py +0 -0
  196. {taskledger-0.3.1 → taskledger-0.4.1}/tests/support/builders.py +0 -0
  197. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_active_task.py +0 -0
  198. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_actor_harness_state.py +0 -0
  199. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_agent_command_logging.py +0 -0
  200. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_agent_session_protocol.py +0 -0
  201. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_atomic_fast_io.py +0 -0
  202. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_cli_import_resilience.py +0 -0
  203. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_command_example_linter.py +0 -0
  204. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_compact_mutation_output.py +0 -0
  205. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_delta_remaining_contracts.py +0 -0
  206. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_domain_policies.py +0 -0
  207. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_events.py +0 -0
  208. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_handoff_lifecycle.py +0 -0
  209. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_implementation_change_scan.py +0 -0
  210. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_implementation_checks.py +0 -0
  211. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_legacy_cleanup_contracts.py +0 -0
  212. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_lifecycle_policies.py +0 -0
  213. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_locks_audit.py +0 -0
  214. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_models_v1_schema.py +0 -0
  215. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_next_action_expired_lock.py +0 -0
  216. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_no_log_feature.py +0 -0
  217. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_plan_approval_contract.py +0 -0
  218. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_plan_lint.py +0 -0
  219. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_plan_review.py +0 -0
  220. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_plan_revision_workflow.py +0 -0
  221. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_plan_todo_materialization.py +0 -0
  222. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_question_add_many.py +0 -0
  223. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_question_filter_answers.py +0 -0
  224. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_question_plan_regeneration.py +0 -0
  225. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_release_changelog.py +0 -0
  226. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_search.py +0 -0
  227. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_services_dashboard.py +0 -0
  228. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_sidecar_collections.py +0 -0
  229. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_storage_bundle_layout.py +0 -0
  230. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_storage_common.py +0 -0
  231. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_storage_init.py +0 -0
  232. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_storage_migration.py +0 -0
  233. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_storage_repos.py +0 -0
  234. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_task_archive.py +0 -0
  235. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_task_events.py +0 -0
  236. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_taskledger_branch_scoped_ledgers.py +0 -0
  237. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_taskledger_cli_api_parity.py +1 -1
  238. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_taskledger_v2_cli.py +0 -0
  239. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_taskledger_v2_exchange.py +0 -0
  240. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_tasks_service_static.py +0 -0
  241. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_todo_implementation_gate.py +0 -0
  242. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_tree_command.py +0 -0
  243. {taskledger-0.3.1 → taskledger-0.4.1}/tests/test_workflow_guidance.py +0 -0
@@ -0,0 +1,62 @@
1
+ # Project-local archledger configuration.
2
+ # This file lives in the source project root.
3
+ config_version = 5
4
+ archledger_dir = "../archledger-state/taskledger"
5
+
6
+ # Stable project identity. Commit this with your source tree.
7
+ project_uuid = "5d87017e-db40-4c72-90c8-5d3753e13f43"
8
+ project_name = "taskledger"
9
+
10
+ [source]
11
+ format = "markdown"
12
+ front_matter = "yaml"
13
+ section_extension = ".md"
14
+ record_extension = ".md"
15
+ schema_version = 2
16
+
17
+ [build]
18
+ default_format = "markdown"
19
+ default_output_dir = "build"
20
+ include_draft = false
21
+ include_superseded = false
22
+ strict = false
23
+ keep_intermediate = false
24
+ converter = "auto"
25
+
26
+ [arc42]
27
+ template_version = "9.0-EN"
28
+ language = "en"
29
+ title = "Architecture Documentation"
30
+ include_help = false
31
+
32
+ [skill]
33
+ installed = true
34
+ path = "skills/archledger/SKILL.md"
35
+
36
+ [tracking]
37
+ enabled = true
38
+ state_file = "source-state.json"
39
+ scanner = "auto"
40
+ include = [
41
+ "**/*.py",
42
+ "**/*.toml",
43
+ "**/*.md",
44
+ "**/*.adoc",
45
+ "**/*.rst",
46
+ "**/*.j2",
47
+ "**/*.yaml",
48
+ "**/*.yml",
49
+ "**/*.json",
50
+ ]
51
+ exclude = [
52
+ ".git/**",
53
+ ".venv/**",
54
+ "**/__pycache__/**",
55
+ ".mypy_cache/**",
56
+ ".pytest_cache/**",
57
+ ".ruff_cache/**",
58
+ "dist/**",
59
+ "build/**",
60
+ ]
61
+ max_file_bytes = 1000000
62
+ hash_algorithm = "sha256"
@@ -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 = 90
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
@@ -356,10 +356,7 @@ Docs, examples, command inventory, and skill files must agree.
356
356
  When changing commands or workflow behavior, update as needed:
357
357
 
358
358
  - `README.md`
359
- - `docs/command_contract.rst`
360
- - `docs/full_task_cycle.rst`
361
- - `docs/usage.rst`
362
- - `docs/public_surface.rst`
359
+ - rst files in `docs/`
363
360
  - `API.md`
364
361
  - `skills/taskledger/SKILL.md`
365
362
  - `taskledger/command_inventory.py`
@@ -375,23 +372,7 @@ Do not package skills inside `taskledger/`.
375
372
 
376
373
  Every non-trivial behavior change needs verification.
377
374
 
378
- Prefer the test closest to the changed logic:
379
-
380
- - policy/gate change -> `tests/test_domain_policies.py` or lifecycle tests
381
- - task lifecycle change -> `tests/test_taskledger_v2_cli.py`, `tests/test_delta_remaining_contracts.py`, or service tests
382
- - active-task behavior -> `tests/test_active_task.py`
383
- - CLI grammar -> `tests/test_cli_command_contract.py`, `tests/test_taskledger_cli_api_parity.py`
384
- - JSON envelope -> `tests/test_json_contracts.py`
385
- - docs/skill command examples -> `tests/test_docs_and_skill.py`, `tests/test_command_example_linter.py`
386
- - plan approval -> `tests/test_plan_approval_contract.py`
387
- - plan todos -> `tests/test_plan_todo_materialization.py`
388
- - questions/regeneration -> `tests/test_question_filter_answers.py`, `tests/test_question_plan_regeneration.py`
389
- - todo gates -> `tests/test_todo_implementation_gate.py`
390
- - locks -> `tests/test_locks_audit.py`, doctor tests
391
- - storage -> `tests/test_storage_*.py`, `tests/test_storage_bundle_layout.py`, `tests/test_sidecar_collections.py`
392
- - handoff -> `tests/test_handoff_lifecycle.py`
393
- - search -> `tests/test_search.py`
394
- - export/import -> `tests/test_taskledger_v2_exchange.py`
375
+ Prefer the test closest to the changed logic.
395
376
 
396
377
  ### 12.2 Regression paths to test
397
378
 
@@ -416,33 +397,11 @@ Include error paths when relevant:
416
397
 
417
398
  ### 12.3 Verification command progression
418
399
 
419
- Start narrow. Expand only when needed.
400
+ Start narrow. Expand only when needed. Try to run specific test files first,
401
+ only one example for a single pytest is given, figure it out which test to run.
420
402
 
421
403
  ```bash
422
- python -m pip install -e .
423
- python -m pip install -e ".[dev]"
424
-
425
404
  pytest tests/test_domain_policies.py
426
- pytest tests/test_active_task.py
427
- pytest tests/test_taskledger_v2_cli.py
428
- pytest tests/test_delta_remaining_contracts.py
429
- pytest tests/test_plan_approval_contract.py
430
- pytest tests/test_plan_todo_materialization.py
431
- pytest tests/test_question_filter_answers.py
432
- pytest tests/test_question_plan_regeneration.py
433
- pytest tests/test_todo_implementation_gate.py
434
- pytest tests/test_locks_audit.py
435
- pytest tests/test_handoff_lifecycle.py
436
- pytest tests/test_json_contracts.py
437
- pytest tests/test_docs_and_skill.py
438
- pytest tests/test_command_example_linter.py
439
- pytest tests/test_storage_bundle_layout.py
440
- pytest tests/test_storage_common.py
441
- pytest tests/test_storage_contexts.py
442
- pytest tests/test_storage_items.py
443
- pytest tests/test_storage_memories.py
444
- pytest tests/test_storage_repos.py
445
- pytest tests/test_storage_validation.py
446
405
  pytest
447
406
 
448
407
  ruff check --config=.ruff.toml .
@@ -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
@@ -197,6 +198,7 @@ render_handoff(
197
198
  *,
198
199
  mode: str | None = None,
199
200
  context_for: str | None = None,
201
+ worker_step_id: str | None = None,
200
202
  scope: str | None = None,
201
203
  todo_id: str | None = None,
202
204
  focus_run_id: str | None = None,
@@ -207,8 +209,9 @@ create_handoff(
207
209
  workspace_root: Path,
208
210
  task_ref: str,
209
211
  *,
210
- mode: str,
212
+ mode: str | None = None,
211
213
  context_for: str | None = None,
214
+ worker_step_id: str | None = None,
212
215
  scope: str | None = None,
213
216
  todo_id: str | None = None,
214
217
  focus_run_id: str | None = None,
@@ -224,7 +227,10 @@ create_handoff(
224
227
 
225
228
  Focused handoffs store the generated Markdown context snapshot in the handoff
226
229
  record body and return compact metadata, including `context_hash` and
227
- `context_path`.
230
+ `context_path`. When `worker_step_id` is supplied, taskledger derives the
231
+ handoff mode and context from the configured worker step, persists
232
+ `worker_step_id` in the handoff record, and includes the resolved worker-step
233
+ details in JSON context payloads.
228
234
 
229
235
  ### `taskledger.api.releases`
230
236
 
@@ -233,6 +239,14 @@ record body and return compact metadata, including `context_hash` and
233
239
  - `show_release`
234
240
  - `tag_release`
235
241
 
242
+ ### `taskledger.api.storage`
243
+
244
+ - `storage_where`
245
+ - `storage_move`
246
+ - `sync_preflight`
247
+ - `sync_status`
248
+ - `sync_commit`
249
+
236
250
  ### `taskledger.api.search`
237
251
 
238
252
  - `search_workspace`
@@ -256,6 +270,8 @@ The public task-first CLI surface is organized around these command groups:
256
270
  - `require`
257
271
  - `release`
258
272
  - `lock`
273
+ - `storage`
274
+ - `sync`
259
275
  - `context`
260
276
  - `handoff`
261
277
  - `repair`
@@ -1,5 +1,74 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.4.1 - 2026-05-22
4
+
5
+ ### Added
6
+
7
+ - Added optional configurable worker pipeline overlay: opt-in `[worker_pipeline]` project config, read-only `pipeline show`, `pipeline list`, and `pipeline next` commands, worker-aware `context --worker` and `handoff create --worker` support, and worker-tagged plan todos with materialization and template hints.
8
+ - Added guided worker-pipeline next-action metadata and command hints in `next-action` output for `guided` mode projects.
9
+ - Added worker-pipeline config extraction into `taskledger/storage/worker_pipeline_config.py` and worker-only context rendering into `taskledger/services/worker_context.py`.
10
+ - Added doctor warning diagnostics for stale worker-step todo and handoff references.
11
+ - Added shell completion support: root Typer app now enables completion options, with `--install-completion` and `--show-completion` available.
12
+
13
+ ### Changed
14
+
15
+ - Worker handoff defaults now derive from configured pipeline steps when `--worker` is specified.
16
+ - Worker step metadata is rendered in task reports when present.
17
+ - Review-stage worker routing advances from closed worker handoffs.
18
+ - Plan template and todo parsing preserve `worker_step` metadata across export, regeneration, and materialization.
19
+ - Updated service boundary whitelists for worker-pipeline and doctor scan import sites.
20
+
21
+ ### Documentation
22
+
23
+ - Documented worker pipeline configuration, commands, guided workflow, and config fields in README, `docs/usage.rst`, `docs/full_task_cycle.rst`, and `docs/command_contract.rst`.
24
+ - Updated `skills/taskledger/SKILL.md` with optional worker pipeline protocol guidance and guided next-action hints.
25
+ - Updated `API.md` for public handoff API signatures with `worker_step_id`.
26
+ - Added shell completion install and show command documentation in README and `docs/usage.rst`.
27
+
28
+ ### Quality
29
+
30
+ - Added regression test modules for worker pipeline config, CLI commands, worker context, worker handoffs, worker todo materialization, guided next-action, and doctor warnings.
31
+ - Expanded command inventory, JSON contract, docs/skill, and service boundary tests for the new surface.
32
+ - Full suite: ruff and mypy clean.
33
+
34
+ ## v0.4.0 - 2026-05-19
35
+
36
+ ### Added
37
+
38
+ - 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.
39
+ - 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.
40
+ - 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.
41
+ - Added `taskledger sync preflight` read-only check combining doctor health, active-lock warnings, tracked in-repo state warnings, and local Git status.
42
+ - Added `taskledger sync status` and `taskledger sync commit` local Git helper commands for committing taskledger state without network operations.
43
+ - Added `taskledger sync export` and `taskledger sync import` as aliases for the existing archive transfer commands.
44
+ - 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.
45
+ - Added project-scoped `sync git status` that separates current-project changes from outside-project changes in JSON payloads, safe with dirty sibling directories.
46
+ - Added `sync git cd` helper returning the configured sync repo path for shell use.
47
+ - Added `sync git commit` for committing only the configured project path while ignoring dirty sibling paths.
48
+ - Added `[sync.git]` project config section with strict validation and documented defaults.
49
+ - Added `taskledger/services/storage_locations.py` for storage reporting, migration, and sync helper services.
50
+ - Added `taskledger/services/git_sync.py` for git sync orchestration.
51
+ - Added `taskledger/cli_sync.py` as a dedicated sync CLI group.
52
+ - Added `taskledger/api/sync.py` with public sync API wrappers.
53
+
54
+ ### Changed
55
+
56
+ - 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.
57
+ - 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`.
58
+ - Fixed stale config filename references so docs no longer claim init writes `.taskledger.toml` when `taskledger.toml` is canonical.
59
+ - Updated external storage examples to use the current `ledgers/<ledger_ref>/...` layout.
60
+
61
+ ### Documentation
62
+
63
+ - Added `docs/sync.rst` with cross-PC sync workflow, daily protocol, and multi-writer conflict avoidance guidance.
64
+ - 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.
65
+
66
+ ### Quality
67
+
68
+ - 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.
69
+ - Expanded command inventory, CLI contract, and docs/skill tests for the new command surface.
70
+ - Full suite: 897 tests passing, ruff and mypy clean.
71
+
3
72
  ## v0.3.1 - 2026-05-12
4
73
 
5
74
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.3.1
3
+ Version: 0.4.1
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`, `pipeline`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`, `storage`, `sync`
76
77
 
77
78
  **Repair and inspection:**
78
79
 
@@ -129,6 +130,73 @@ This guidance is advisory and cannot override lifecycle gates, user approval,
129
130
  validation requirements, lock rules, or higher-priority harness instructions.
130
131
  See `docs/usage.rst` for the full key reference and workflow details.
131
132
 
133
+ ## Optional worker pipelines
134
+
135
+ Projects may optionally configure worker pipelines in `taskledger.toml` to guide
136
+ fresh-context handoffs. Worker pipelines are advisory overlays on the existing
137
+ planning, implementation, and validation lifecycle. They can be three steps,
138
+ four steps, five steps, or custom. When no worker pipeline is configured, the
139
+ default taskledger behavior is unchanged.
140
+
141
+ ```toml
142
+ [worker_pipeline]
143
+ enabled = true
144
+ name = "tdd-four-context"
145
+ mode = "guided"
146
+
147
+ [[worker_pipeline.steps]]
148
+ id = "planner"
149
+ lifecycle_stage = "planning"
150
+ base_context = "planner"
151
+
152
+ [[worker_pipeline.steps]]
153
+ id = "tester"
154
+ label = "Test Writer"
155
+ lifecycle_stage = "implementation"
156
+ base_context = "implementer"
157
+ actor_role = "implementer"
158
+ kind = "check"
159
+ description = "Add or update failing tests before code changes."
160
+ required_output = ["New or updated failing tests with a short summary."]
161
+ must_not = ["Do not change production code in this step."]
162
+ todo_tag = "tests"
163
+ test_command_policy = "may_fail"
164
+
165
+ [[worker_pipeline.steps]]
166
+ id = "coder"
167
+ lifecycle_stage = "implementation"
168
+ base_context = "implementer"
169
+ kind = "todo"
170
+ description = "Implement the approved change and make the tests pass."
171
+ required_output = ["Code changes plus passing targeted checks."]
172
+ must_not = ["Do not skip required validation evidence."]
173
+ todo_tag = "implementation"
174
+ test_command_policy = "must_pass"
175
+
176
+ [[worker_pipeline.steps]]
177
+ id = "reviewer"
178
+ lifecycle_stage = "review"
179
+ base_context = "code-reviewer"
180
+ kind = "review"
181
+ ```
182
+
183
+ Supported top-level keys are `enabled`, `name`, `mode`, and `steps`. Supported
184
+ step keys are `id`, `label`, `lifecycle_stage`, `base_context`, `actor_role`,
185
+ `kind`, `description`, `required_output`, `must_not`, `todo_tag`, and
186
+ `test_command_policy`. `mode = "guided"` does not add lifecycle gates; it adds
187
+ worker-step hints to `taskledger next-action`, including the pending step id plus
188
+ ready-to-run worker context and handoff commands.
189
+
190
+ ```bash
191
+ taskledger pipeline show
192
+ taskledger pipeline next
193
+ taskledger next-action
194
+ taskledger context --worker tester
195
+ taskledger pipeline context tester
196
+ taskledger handoff create --worker tester --summary "Add failing tests only."
197
+ taskledger plan template --with-worker-pipeline --file ./plan.md
198
+ ```
199
+
132
200
  ## Install
133
201
 
134
202
  ```bash
@@ -136,6 +204,22 @@ python -m pip install -e .
136
204
  python -m pip install -e ".[dev]"
137
205
  ```
138
206
 
207
+ ### Shell completion
208
+
209
+ After installing `taskledger`, install completion for your current shell:
210
+
211
+ ```bash
212
+ taskledger --install-completion
213
+ ```
214
+
215
+ To inspect the generated completion script instead of installing it:
216
+
217
+ ```bash
218
+ taskledger --show-completion
219
+ ```
220
+
221
+ Restart your shell session after installation.
222
+
139
223
  ## Quick start
140
224
 
141
225
  Initialize durable state in the current workspace:
@@ -321,16 +405,18 @@ Rules for agents:
321
405
 
322
406
  ## Human monitoring UI
323
407
 
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.
408
+ `taskledger serve` starts a read-only local server-rendered HTML dashboard for
409
+ human monitoring. It emphasizes the active task, next action, progress, and
410
+ task browsing while staying local-only and read-only.
329
411
 
330
412
  ```bash
331
- taskledger serve
413
+ taskledger report html task-0040 --output task-0040.html
414
+ taskledger report html --active --output active-task.html
415
+ taskledger report site --output .taskledger-report/
416
+
417
+ taskledger serve --refresh-seconds 2
332
418
  taskledger serve --open
333
- taskledger serve --task rewrite-v2 --refresh-ms 2000
419
+ taskledger serve --task task-0040 --refresh-seconds 2
334
420
  ```
335
421
 
336
422
  Agents should keep using `taskledger next-action`, `taskledger todo next`, and
@@ -341,12 +427,13 @@ fresh-context transfer.
341
427
  ## Storage layout
342
428
 
343
429
  `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>/`:
430
+ records under the configured storage root. The checked-in `taskledger.toml`
431
+ stores project identity plus the current branch-scoped ledger pointer and next
432
+ task number. Operational task state remains ignored under
433
+ `.taskledger/ledgers/<ledger_ref>/`:
347
434
 
348
435
  ```text
349
- .taskledger.toml
436
+ taskledger.toml
350
437
  .taskledger/
351
438
  storage.yaml
352
439
  ledgers/
@@ -364,7 +451,7 @@ optional derived caches or registries and are not required for task correctness.
364
451
 
365
452
  ### Branch-scoped ledgers
366
453
 
367
- `.taskledger/` stays ignored and local. `.taskledger.toml` is safe to commit and
454
+ `.taskledger/` stays ignored and local. `taskledger.toml` is safe to commit and
368
455
  contains the current `ledger_ref`, optional parent ref, and the next logical task
369
456
  number for the checked-out source branch.
370
457
 
@@ -374,10 +461,10 @@ the Git branch:
374
461
  ```bash
375
462
  git checkout -b feature-a
376
463
  taskledger ledger fork feature-a
377
- git add .taskledger.toml
464
+ git add taskledger.toml
378
465
  ```
379
466
 
380
- Returning to a branch whose `.taskledger.toml` points back to `main` hides the
467
+ Returning to a branch whose `taskledger.toml` points back to `main` hides the
381
468
  feature branch's active task and task list. Two ledgers may both contain a logical
382
469
  `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
383
470
  `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
@@ -392,15 +479,56 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
392
479
  ```text
393
480
  /home/me/src/project-a/taskledger.toml
394
481
  /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/
482
+ /mnt/cloud/taskledger/project-a/ledgers/main/releases/
483
+ /mnt/cloud/taskledger/project-a/ledgers/main/tasks/
484
+ /mnt/cloud/taskledger/project-a/ledgers/main/events/
485
+ /mnt/cloud/taskledger/project-a/ledgers/main/indexes/
399
486
  ```
400
487
 
401
488
  Use one `taskledger_dir` per source project. Do not share one storage directory
402
489
  across unrelated repositories.
403
490
 
491
+ ### Sync across PCs without committing `.taskledger/`
492
+
493
+ Use a sibling private Git repository for the external storage root instead of
494
+ committing `.taskledger/` into the source repository:
495
+
496
+ ```toml
497
+ # /home/me/src/project-a/taskledger.toml
498
+ taskledger_dir = "../taskledger-state/project-a"
499
+ ```
500
+
501
+ ```text
502
+ /home/me/src/project-a/ # source repo
503
+ /home/me/src/taskledger-state/ # private state repo
504
+ /home/me/src/taskledger-state/project-a/ # taskledger_dir
505
+ ```
506
+
507
+ Keep one active writer at a time. Before starting on a PC, pull the private
508
+ state repo, then run `taskledger doctor` and `taskledger next-action`. After
509
+ stopping at a clean lifecycle boundary, commit and push the state repo. If work
510
+ must move mid-run, prefer `taskledger export TASK_REF` / `taskledger import ARCHIVE` because imported runtime locks are quarantined by default.
511
+
512
+ Helpful local commands:
513
+
514
+ ```bash
515
+ taskledger storage where
516
+ taskledger sync preflight
517
+ taskledger sync status
518
+ taskledger sync commit --message "Sync project-a taskledger state"
519
+ taskledger sync export --output ./taskledger-transfer.tar.gz
520
+ taskledger sync import ./taskledger-transfer.tar.gz --dry-run
521
+ taskledger sync git init --repo ../taskledger-state --project-path project-a
522
+ taskledger sync git status
523
+ taskledger sync git commit --message "Sync project-a taskledger state"
524
+ cd "$(taskledger sync git cd)"
525
+ git pull --ff-only
526
+ git push
527
+ ```
528
+
529
+ See `docs/sync.rst` for the full second-PC bootstrap, daily sync protocol, and
530
+ Syncthing/rclone caveats.
531
+
404
532
  ## JSON output
405
533
 
406
534
  Use `--json` for machine-readable payloads:
@@ -451,6 +579,7 @@ taskledger context --for implementation --format markdown
451
579
  taskledger context --for validation --format json
452
580
  taskledger task dossier --format markdown
453
581
  taskledger task report --task task-0030 -o task30.md
582
+ taskledger report html task-0030 --output task30.html
454
583
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
455
584
  taskledger handoff claim handoff-0001
456
585
  taskledger handoff close handoff-0001 --reason "Implementation started."