taskledger 0.1.2__tar.gz → 0.3.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 (229) hide show
  1. {taskledger-0.1.2 → taskledger-0.3.0}/.codecrate.toml +1 -1
  2. taskledger-0.3.0/.github/workflows/pre-commit.yml +31 -0
  3. {taskledger-0.1.2 → taskledger-0.3.0}/.pre-commit-config.yaml +10 -13
  4. taskledger-0.3.0/.taskledger.toml +30 -0
  5. {taskledger-0.1.2 → taskledger-0.3.0}/API.md +24 -0
  6. {taskledger-0.1.2 → taskledger-0.3.0}/CHANGELOG.md +55 -0
  7. taskledger-0.3.0/Makefile +9 -0
  8. {taskledger-0.1.2/taskledger.egg-info → taskledger-0.3.0}/PKG-INFO +155 -20
  9. {taskledger-0.1.2 → taskledger-0.3.0}/README.md +153 -19
  10. {taskledger-0.1.2 → taskledger-0.3.0}/docs/api.rst +22 -0
  11. {taskledger-0.1.2 → taskledger-0.3.0}/docs/command_contract.rst +195 -6
  12. {taskledger-0.1.2 → taskledger-0.3.0}/docs/full_task_cycle.rst +8 -5
  13. {taskledger-0.1.2 → taskledger-0.3.0}/docs/index.rst +1 -0
  14. {taskledger-0.1.2 → taskledger-0.3.0}/docs/public_surface.rst +6 -0
  15. taskledger-0.3.0/docs/service_boundary_whitelist.rst +57 -0
  16. taskledger-0.3.0/docs/transfer.rst +49 -0
  17. {taskledger-0.1.2 → taskledger-0.3.0}/docs/usage.rst +197 -9
  18. {taskledger-0.1.2 → taskledger-0.3.0}/pyproject.toml +9 -1
  19. {taskledger-0.1.2 → taskledger-0.3.0}/skills/taskledger/SKILL.md +104 -29
  20. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/_version.py +3 -3
  21. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/plans.py +19 -0
  22. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/project.py +155 -8
  23. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/tasks.py +16 -0
  24. taskledger-0.3.0/taskledger/cli.py +1412 -0
  25. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_common.py +178 -4
  26. taskledger-0.3.0/taskledger/cli_implement.py +507 -0
  27. taskledger-0.3.0/taskledger/cli_ledger.py +511 -0
  28. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_migrate.py +11 -2
  29. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_misc.py +180 -19
  30. taskledger-0.3.0/taskledger/cli_plan.py +711 -0
  31. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_question.py +128 -15
  32. taskledger-0.3.0/taskledger/cli_task.py +886 -0
  33. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_validate.py +5 -0
  34. taskledger-0.3.0/taskledger/command_inventory.py +1176 -0
  35. taskledger-0.3.0/taskledger/domain/_model_utils.py +164 -0
  36. taskledger-0.3.0/taskledger/domain/active_state.py +144 -0
  37. taskledger-0.3.0/taskledger/domain/actor.py +119 -0
  38. taskledger-0.3.0/taskledger/domain/change.py +241 -0
  39. taskledger-0.3.0/taskledger/domain/event.py +69 -0
  40. taskledger-0.3.0/taskledger/domain/handoff.py +168 -0
  41. taskledger-0.3.0/taskledger/domain/lock.py +128 -0
  42. taskledger-0.3.0/taskledger/domain/models.py +69 -0
  43. taskledger-0.3.0/taskledger/domain/plan.py +146 -0
  44. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/domain/policies.py +28 -0
  45. taskledger-0.3.0/taskledger/domain/question.py +103 -0
  46. taskledger-0.3.0/taskledger/domain/release.py +65 -0
  47. taskledger-0.3.0/taskledger/domain/run.py +142 -0
  48. taskledger-0.3.0/taskledger/domain/sidecars.py +468 -0
  49. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/domain/states.py +11 -1
  50. taskledger-0.3.0/taskledger/domain/task.py +255 -0
  51. taskledger-0.3.0/taskledger/exchange.py +980 -0
  52. taskledger-0.3.0/taskledger/ids.py +40 -0
  53. taskledger-0.3.0/taskledger/services/agent_logging.py +620 -0
  54. taskledger-0.3.0/taskledger/services/agent_transcripts.py +540 -0
  55. taskledger-0.3.0/taskledger/services/change_tracking.py +251 -0
  56. taskledger-0.3.0/taskledger/services/command_runner.py +22 -0
  57. taskledger-0.3.0/taskledger/services/doctor.py +309 -0
  58. taskledger-0.3.0/taskledger/services/doctor_checks/migration_checks.py +64 -0
  59. taskledger-0.3.0/taskledger/services/doctor_checks/project_scan.py +122 -0
  60. taskledger-0.3.0/taskledger/services/doctor_checks/task_checks.py +408 -0
  61. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/handoff.py +38 -1
  62. taskledger-0.3.0/taskledger/services/implementation_flow.py +541 -0
  63. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/navigation.py +269 -124
  64. taskledger-0.3.0/taskledger/services/next_action_model.py +140 -0
  65. taskledger-0.3.0/taskledger/services/plan_editing.py +114 -0
  66. taskledger-0.3.0/taskledger/services/plan_hash.py +23 -0
  67. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/plan_lint.py +24 -13
  68. taskledger-0.3.0/taskledger/services/plan_materialization.py +305 -0
  69. taskledger-0.3.0/taskledger/services/planning_flow.py +585 -0
  70. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/releases.py +11 -0
  71. taskledger-0.3.0/taskledger/services/run_store.py +149 -0
  72. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/serve_read_model.py +9 -47
  73. taskledger-0.3.0/taskledger/services/task_archive.py +205 -0
  74. taskledger-0.3.0/taskledger/services/task_collections.py +498 -0
  75. taskledger-0.3.0/taskledger/services/task_lifecycle.py +940 -0
  76. taskledger-0.3.0/taskledger/services/task_queries.py +81 -0
  77. taskledger-0.3.0/taskledger/services/task_repair.py +246 -0
  78. taskledger-0.3.0/taskledger/services/task_reports.py +1108 -0
  79. taskledger-0.3.0/taskledger/services/tasks.py +3158 -0
  80. taskledger-0.3.0/taskledger/services/tree.py +519 -0
  81. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/validation.py +6 -6
  82. taskledger-0.3.0/taskledger/services/validation_flow.py +397 -0
  83. taskledger-0.3.0/taskledger/services/web_dashboard.py +529 -0
  84. taskledger-0.3.0/taskledger/services/workflow_guidance.py +162 -0
  85. taskledger-0.3.0/taskledger/storage/agent_logs.py +151 -0
  86. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/atomic.py +26 -2
  87. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/init.py +36 -16
  88. taskledger-0.3.0/taskledger/storage/ledger_config.py +278 -0
  89. taskledger-0.3.0/taskledger/storage/migrations.py +509 -0
  90. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/paths.py +13 -3
  91. taskledger-0.3.0/taskledger/storage/project_config.py +852 -0
  92. taskledger-0.3.0/taskledger/storage/project_identity.py +216 -0
  93. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/task_store.py +115 -27
  94. taskledger-0.3.0/taskledger/web_assets/__init__.py +0 -0
  95. taskledger-0.3.0/taskledger/web_assets/dashboard.css +491 -0
  96. taskledger-0.3.0/taskledger/web_assets/dashboard.js +1407 -0
  97. {taskledger-0.1.2 → taskledger-0.3.0/taskledger.egg-info}/PKG-INFO +155 -20
  98. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/SOURCES.txt +63 -1
  99. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/requires.txt +1 -0
  100. taskledger-0.3.0/tests/__init__.py +0 -0
  101. taskledger-0.3.0/tests/conftest.py +13 -0
  102. taskledger-0.3.0/tests/support/__init__.py +1 -0
  103. taskledger-0.3.0/tests/support/builders.py +231 -0
  104. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_active_task.py +48 -6
  105. taskledger-0.3.0/tests/test_agent_command_logging.py +657 -0
  106. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_agent_session_protocol.py +171 -12
  107. taskledger-0.3.0/tests/test_atomic_fast_io.py +30 -0
  108. taskledger-0.3.0/tests/test_cli_command_contract.py +301 -0
  109. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_command_example_linter.py +2 -0
  110. taskledger-0.3.0/tests/test_command_inventory.py +291 -0
  111. taskledger-0.3.0/tests/test_compact_mutation_output.py +331 -0
  112. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_delta_remaining_contracts.py +57 -207
  113. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_docs_and_skill.py +54 -0
  114. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_doctor.py +4 -0
  115. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_handoff_lifecycle.py +9 -1
  116. taskledger-0.3.0/tests/test_help_subprocess.py +57 -0
  117. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_implementation_change_scan.py +108 -0
  118. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_json_contracts.py +101 -1
  119. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_locks_audit.py +10 -2
  120. taskledger-0.3.0/tests/test_next_action_expired_lock.py +115 -0
  121. taskledger-0.3.0/tests/test_no_log_feature.py +442 -0
  122. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_plan_approval_contract.py +127 -1
  123. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_plan_lint.py +283 -0
  124. taskledger-0.3.0/tests/test_plan_revision_workflow.py +388 -0
  125. taskledger-0.3.0/tests/test_project_root_config.py +537 -0
  126. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_question_filter_answers.py +10 -1
  127. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_question_plan_regeneration.py +236 -24
  128. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_release_changelog.py +40 -312
  129. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_serve_dashboard.py +46 -14
  130. taskledger-0.3.0/tests/test_service_boundaries.py +445 -0
  131. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_services_dashboard.py +31 -4
  132. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_sidecar_collections.py +1 -1
  133. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_bundle_layout.py +219 -5
  134. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_common.py +11 -9
  135. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_init.py +2 -2
  136. taskledger-0.3.0/tests/test_storage_migration.py +965 -0
  137. taskledger-0.3.0/tests/test_task_archive.py +220 -0
  138. taskledger-0.3.0/tests/test_task_report.py +397 -0
  139. taskledger-0.3.0/tests/test_taskledger_branch_scoped_ledgers.py +145 -0
  140. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_taskledger_cli_api_parity.py +4 -0
  141. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_taskledger_v2_cli.py +339 -202
  142. taskledger-0.3.0/tests/test_taskledger_v2_exchange.py +1258 -0
  143. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_todo_implementation_gate.py +47 -170
  144. taskledger-0.3.0/tests/test_tree_command.py +657 -0
  145. taskledger-0.3.0/tests/test_workflow_guidance.py +111 -0
  146. taskledger-0.1.2/.github/workflows/pre-commit.yml +0 -13
  147. taskledger-0.1.2/.taskledger.toml +0 -20
  148. taskledger-0.1.2/taskledger/cli.py +0 -750
  149. taskledger-0.1.2/taskledger/cli_implement.py +0 -467
  150. taskledger-0.1.2/taskledger/cli_plan.py +0 -510
  151. taskledger-0.1.2/taskledger/cli_task.py +0 -403
  152. taskledger-0.1.2/taskledger/command_inventory.py +0 -135
  153. taskledger-0.1.2/taskledger/domain/models.py +0 -1777
  154. taskledger-0.1.2/taskledger/exchange.py +0 -370
  155. taskledger-0.1.2/taskledger/ids.py +0 -19
  156. taskledger-0.1.2/taskledger/services/doctor.py +0 -479
  157. taskledger-0.1.2/taskledger/services/tasks.py +0 -5098
  158. taskledger-0.1.2/taskledger/services/web_dashboard.py +0 -1742
  159. taskledger-0.1.2/taskledger/storage/migrations.py +0 -207
  160. taskledger-0.1.2/taskledger/storage/project_config.py +0 -393
  161. taskledger-0.1.2/tests/conftest.py +0 -8
  162. taskledger-0.1.2/tests/test_cli_command_contract.py +0 -151
  163. taskledger-0.1.2/tests/test_command_inventory.py +0 -78
  164. taskledger-0.1.2/tests/test_project_root_config.py +0 -202
  165. taskledger-0.1.2/tests/test_storage_migration.py +0 -429
  166. taskledger-0.1.2/tests/test_taskledger_v2_exchange.py +0 -373
  167. {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/codecov.yml +0 -0
  168. {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/python-publish.yml +0 -0
  169. {taskledger-0.1.2 → taskledger-0.3.0}/.github/workflows/tests.yml +0 -0
  170. {taskledger-0.1.2 → taskledger-0.3.0}/.gitignore +0 -0
  171. {taskledger-0.1.2 → taskledger-0.3.0}/.readthedocs.yaml +0 -0
  172. {taskledger-0.1.2 → taskledger-0.3.0}/.ruff.toml +0 -0
  173. {taskledger-0.1.2 → taskledger-0.3.0}/AGENTS.md +0 -0
  174. {taskledger-0.1.2 → taskledger-0.3.0}/LICENSE +0 -0
  175. {taskledger-0.1.2 → taskledger-0.3.0}/docs/Makefile +0 -0
  176. {taskledger-0.1.2 → taskledger-0.3.0}/docs/architecture_taskledger_split.rst +0 -0
  177. {taskledger-0.1.2 → taskledger-0.3.0}/docs/build.sh +0 -0
  178. {taskledger-0.1.2 → taskledger-0.3.0}/docs/conf.py +0 -0
  179. {taskledger-0.1.2 → taskledger-0.3.0}/docs/multi_repo.rst +0 -0
  180. {taskledger-0.1.2 → taskledger-0.3.0}/docs/requirements.txt +0 -0
  181. {taskledger-0.1.2 → taskledger-0.3.0}/setup.cfg +0 -0
  182. {taskledger-0.1.2 → taskledger-0.3.0}/setup.py +0 -0
  183. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/__init__.py +0 -0
  184. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/__main__.py +0 -0
  185. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/__init__.py +0 -0
  186. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/handoff.py +0 -0
  187. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/introductions.py +0 -0
  188. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/locks.py +0 -0
  189. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/questions.py +0 -0
  190. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/releases.py +0 -0
  191. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/search.py +0 -0
  192. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/api/task_runs.py +0 -0
  193. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_actor.py +0 -0
  194. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/cli_release.py +0 -0
  195. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/domain/__init__.py +0 -0
  196. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/errors.py +0 -0
  197. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/launcher.py +0 -0
  198. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/py.typed +0 -0
  199. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/search.py +0 -0
  200. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/__init__.py +0 -0
  201. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/actors.py +0 -0
  202. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/dashboard.py +0 -0
  203. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/handoff_lifecycle.py +0 -0
  204. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/services/phase5_lock_transfer.py +0 -0
  205. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/__init__.py +0 -0
  206. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/common.py +0 -0
  207. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/events.py +0 -0
  208. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/frontmatter.py +0 -0
  209. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/indexes.py +0 -0
  210. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/locks.py +0 -0
  211. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/meta.py +0 -0
  212. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/storage/repos.py +0 -0
  213. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger/timeutils.py +0 -0
  214. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/dependency_links.txt +0 -0
  215. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/entry_points.txt +0 -0
  216. {taskledger-0.1.2 → taskledger-0.3.0}/taskledger.egg-info/top_level.txt +0 -0
  217. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_actor_harness_state.py +0 -0
  218. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_cli_import_resilience.py +0 -0
  219. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_domain_policies.py +0 -0
  220. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_events.py +0 -0
  221. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_legacy_cleanup_contracts.py +0 -0
  222. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_lifecycle_policies.py +0 -0
  223. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_models_v1_schema.py +0 -0
  224. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_plan_todo_materialization.py +0 -0
  225. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_question_add_many.py +0 -0
  226. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_search.py +0 -0
  227. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_storage_repos.py +0 -0
  228. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_task_events.py +0 -0
  229. {taskledger-0.1.2 → taskledger-0.3.0}/tests/test_tasks_service_static.py +0 -0
@@ -6,7 +6,7 @@ respect_gitignore = true
6
6
  # exclude = ["*/.venv/*", "integration_tests", "examples", "docs"]
7
7
  gitignore_allow = ["taskledger/_version.py"]
8
8
  exclude = ["*/.venv/*", "integration_tests", "todo.md"]
9
- include = ["**/*.py", "**/*.toml", "**/*.rst", "**/*.md", "**/*.typed"]
9
+ include = ["**/*.py", "**/*.toml", "**/*.rst", "**/*.md", "**/*.typed", "**/*.js", "**/*.css"]
10
10
  split_max_chars = 0
11
11
  manifest = false
12
12
  layout = "full"
@@ -0,0 +1,31 @@
1
+ name: pre-commit
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+
7
+ jobs:
8
+ pre-commit:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.13"
17
+
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: "20"
21
+
22
+ - name: Install Python tools
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ python -m pip install "ruff==0.15.12"
26
+
27
+ - name: Install Node tools
28
+ run: |
29
+ npm install -g prettier@2.7.1 @prettier/plugin-xml@2.2.0 eslint
30
+
31
+ - uses: pre-commit/action@v3.0.1
@@ -17,14 +17,19 @@ exclude: |
17
17
  (LICENSE.*|COPYING.*)|
18
18
  default_language_version:
19
19
  python: python3
20
- node: "16.17.0"
21
20
  repos:
22
- - repo: https://github.com/astral-sh/ruff-pre-commit
23
- rev: v0.15.12
21
+ - repo: local
24
22
  hooks:
25
- - id: ruff
26
- args: [--fix, --exit-non-zero-on-fix, --config=.ruff.toml]
23
+ - id: ruff-check
24
+ name: ruff check
25
+ entry: ruff check --fix --exit-non-zero-on-fix --config=.ruff.toml --force-exclude
26
+ language: system
27
+ types_or: [python, pyi]
27
28
  - id: ruff-format
29
+ name: ruff format
30
+ entry: ruff format --force-exclude
31
+ language: system
32
+ types_or: [python, pyi]
28
33
  - repo: https://github.com/asottile/pyupgrade
29
34
  rev: v3.21.2
30
35
  hooks:
@@ -59,11 +64,3 @@ repos:
59
64
  args:
60
65
  - --plugin=@prettier/plugin-xml
61
66
  files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
62
- - repo: https://github.com/pre-commit/mirrors-eslint
63
- rev: v10.2.1
64
- hooks:
65
- - id: eslint
66
- verbose: true
67
- args:
68
- - --color
69
- - --fix
@@ -0,0 +1,30 @@
1
+ # Project-local taskledger configuration.
2
+ # This file lives in the source project root.
3
+ config_version = 2
4
+ taskledger_dir = '.taskledger'
5
+
6
+ # Stable project identity. Commit this with your source tree.
7
+ project_uuid = "081c7c05-2d10-42b7-9b37-3d814c2f400a"
8
+
9
+ # Taskledger branch-scoped state. This block is intentionally safe to commit.
10
+ ledger_ref = "main"
11
+ ledger_parent_ref = ""
12
+ ledger_next_task_number = 81
13
+ ledger_branch_guard = "off"
14
+
15
+ [prompt_profiles.planning]
16
+ profile = "balanced"
17
+ question_policy = "ask_when_missing"
18
+ max_required_questions = 5
19
+ min_acceptance_criteria = 1
20
+ todo_granularity = "implementation_steps"
21
+ require_files = true
22
+ require_test_commands = true
23
+ require_expected_outputs = true
24
+ require_validation_hints = true
25
+ plan_body_detail = "normal"
26
+ required_question_topics = []
27
+ extra_guidance = ""
28
+
29
+ [agent_logging]
30
+ enabled = true
@@ -53,11 +53,15 @@ from taskledger.errors import (
53
53
  - `project_doctor`
54
54
  - `project_export`
55
55
  - `project_import`
56
+ - `project_export_archive`
57
+ - `project_import_archive`
56
58
  - `project_snapshot`
59
+ - `project_tree`
57
60
 
58
61
  ### `taskledger.api.tasks`
59
62
 
60
63
  - `create_task`
64
+ - `record_completed_task`
61
65
  - `show_active_task`
62
66
  - `activate_task`
63
67
  - `deactivate_task`
@@ -69,7 +73,10 @@ from taskledger.errors import (
69
73
  - `cancel_task`
70
74
  - `uncancel_task`
71
75
  - `close_task`
76
+ - `archive_task`
77
+ - `unarchive_task`
72
78
  - `create_follow_up_task`
79
+ - `list_archived_task_summaries`
73
80
  - `add_requirement`
74
81
  - `remove_requirement`
75
82
  - `waive_requirement`
@@ -82,11 +89,14 @@ from taskledger.errors import (
82
89
  - `todo_status`
83
90
  - `next_todo`
84
91
  - `task_dossier`
92
+ - `render_task_report`
93
+ - `TaskReportOptions`
85
94
  - `next_action`
86
95
  - `can_perform`
87
96
  - `reindex`
88
97
  - `repair_task_record`
89
98
  - `repair_orphaned_planning_run`
99
+ - `repair_planning_command_changes`
90
100
 
91
101
  ### `taskledger.api.plans`
92
102
 
@@ -94,17 +104,31 @@ from taskledger.errors import (
94
104
  - `propose_plan`
95
105
  - `plan_template`
96
106
  - `upsert_plan`
107
+ - `export_plan`
108
+ - `amend_plan`
97
109
  - `regenerate_plan_from_answers`
98
110
  - `materialize_plan_todos`
99
111
  - `list_plan_versions`
100
112
  - `show_plan`
101
113
  - `diff_plan`
102
114
  - `lint_plan`
115
+ - `plan_guidance`
103
116
  - `approve_plan`
104
117
  - `reject_plan`
105
118
  - `revise_plan`
106
119
  - `run_planning_command`
107
120
 
121
+ Planning guidance API example:
122
+
123
+ ```python
124
+ from pathlib import Path
125
+
126
+ from taskledger.api.plans import plan_guidance
127
+
128
+ payload = plan_guidance(Path.cwd(), "task-0001")
129
+ # payload includes: kind, task_id, has_project_guidance, guidance, profile, question_policy
130
+ ```
131
+
108
132
  ### `taskledger.api.questions`
109
133
 
110
134
  - `add_question`
@@ -1,5 +1,60 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.2.0 - 2026-05-03
4
+
5
+ ### Added
6
+
7
+ - Added `taskledger task record` for creating done tasks that represent manually completed work, with change records, evidence, and implementation summaries. Does not acquire locks or activate the task. Recorded tasks are included in release changelogs.
8
+ - Added branch-scoped ledger state with `taskledger ledger` command group (`status`, `list`, `fork`, `switch`, `adopt`, `doctor`). Each git branch can maintain its own isolated task ledger, with `adopt` for copying branch-local task history into the current ledger.
9
+ - Added `taskledger tree` command to render ledger and task structure with follow-up nesting, subtree filtering, release boundaries, and per-ledger release counts in both human and JSON output.
10
+ - Added compressed export/import with a project UUID guard to prevent importing archives into the wrong project, plus archive member-count and manifest/payload size limits for safety.
11
+ - Added `taskledger status --check` to run doctor diagnostics alongside status, keeping the default `status` fast by avoiding full record parsing.
12
+ - Added structured diagnostics to `taskledger doctor` JSON output with task IDs, change IDs, run IDs, types, relative paths, and actionable repair hints.
13
+ - Added explicit `repair` command for existing planning-command change records that were incorrectly persisted as code changes.
14
+ - Added a top-level `Makefile` with a `release-check` automation target (compile, test, lint, type-check, build, twine check).
15
+ - Added AST-based service boundary guardrail tests with explicit whitelists and documented rationale.
16
+
17
+ ### Changed
18
+
19
+ - Split core plan/implement/validate service entrypoints from `tasks.py` into dedicated `planning_flow.py`, `implementation_flow.py`, and `validation_flow.py` modules. `tasks.py` remains a compatibility facade.
20
+ - Decoupled validation service from private task helpers by extracting shared query logic into a new `task_queries` module.
21
+ - Planning commands are now persisted as planning-run evidence (worklog/artifacts/event) instead of creating `CodeChangeRecord` entries.
22
+ - Replaced chmod-dependent storage write failure test with a deterministic synthetic `OSError` monkeypatch.
23
+ - Sped up test suite with test-only fast fsync bypass, command-runner seam, and reduced subprocess-heavy setup.
24
+
25
+ ### Fixed
26
+
27
+ - Fixed import replace so it no longer restores stale locks across machines.
28
+
29
+ ### Documentation
30
+
31
+ - Documented branch-scoped ledger workflow, `task record` usage and warnings, `tree` command, and `make release-check` across README, RST docs, API docs, and the taskledger skill.
32
+ - Added `docs/service_boundary_whitelist.md` documenting temporary module/function boundary whitelist entries and split targets.
33
+
34
+ ### Quality
35
+
36
+ - Expanded regression coverage for branch-scoped ledgers, task record, tree command, compressed export/import, doctor diagnostics, status performance, service boundaries, and planning command persistence. Repo-wide pytest, ruff, and mypy passed.
37
+
38
+ ## v0.1.2 - 2026-04-30
39
+
40
+ ### Fixed
41
+
42
+ - Fixed orphaned planning run lifecycle recovery so plan regeneration safely finishes the latest orphaned planning run with audit evidence, plan approval rejects tasks with any running run, and `implement start` reports structured conflict details including run id, run type, lock match status, and suggested diagnostic command.
43
+ - Aligned `next-action` and `can implement` so they never recommend `implement start` when a running run or run/lock mismatch blocks implementation.
44
+ - Expanded `taskledger doctor` and `taskledger doctor locks` to report run/lock mismatches with specific repair guidance.
45
+
46
+ ### Added
47
+
48
+ - Added `taskledger repair run` for guarded, reasoned, audited repair of orphaned running planning runs.
49
+
50
+ ### Documentation
51
+
52
+ - Updated taskledger skill, command contract, and API docs with running-run conflict protocol and `repair run` usage.
53
+
54
+ ### Quality
55
+
56
+ - Expanded regression coverage for plan regeneration recovery, approval guards, next-action alignment, doctor diagnostics, and repair lifecycle. Targeted pytest, ruff, format, and mypy passed.
57
+
3
58
  ## v0.1.1 - 2026-04-29
4
59
 
5
60
  ### Added
@@ -0,0 +1,9 @@
1
+ .PHONY: release-check
2
+
3
+ release-check:
4
+ python3 -m compileall -q taskledger tests
5
+ PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest -q
6
+ python3 -m ruff check --config=.ruff.toml .
7
+ python3 -m mypy taskledger
8
+ python3 -m build
9
+ python3 -m twine check dist/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.1.2
3
+ Version: 0.3.0
4
4
  Summary: Durable project-state storage and CLI for coding workflows
5
5
  Author: Taskledger Contributors
6
6
  Maintainer: Holger Nahrstaedt
@@ -33,6 +33,7 @@ Provides-Extra: dev
33
33
  Requires-Dist: build; extra == "dev"
34
34
  Requires-Dist: mypy; extra == "dev"
35
35
  Requires-Dist: pytest; extra == "dev"
36
+ Requires-Dist: pytest-xdist; extra == "dev"
36
37
  Requires-Dist: ruff; extra == "dev"
37
38
  Requires-Dist: twine; extra == "dev"
38
39
  Requires-Dist: types-PyYAML; extra == "dev"
@@ -81,6 +82,53 @@ The supported command surface is organized as:
81
82
 
82
83
  - `init`, `status`, `export`, `import`, `snapshot`, `release`
83
84
 
85
+ ### Which read command to use
86
+
87
+ | Need | Command |
88
+ | -------------------------- | --------------------------------------------------- |
89
+ | Next step | `next-action` |
90
+ | Next implementation item | `todo next` |
91
+ | Active task summary | `task show` |
92
+ | Specific task summary | `task show TASK_REF` or `task show --task TASK_REF` |
93
+ | Project/ledger overview | `status`, `tree` |
94
+ | Human dashboard | `serve` |
95
+ | Reviewable markdown report | `task report` |
96
+ | Fresh worker context | `context` or durable `handoff show` |
97
+ | Command audit | `task transcript` |
98
+
99
+ ## Planning guidance profiles
100
+
101
+ Taskledger supports project-local advisory planning guidance under
102
+ `[prompt_profiles.planning]` in the active project config file (`taskledger.toml`
103
+ or `.taskledger.toml` when legacy config is still present).
104
+
105
+ ```toml
106
+ [prompt_profiles.planning]
107
+ profile = "strict"
108
+ question_policy = "always_before_plan"
109
+ max_required_questions = 3
110
+ min_acceptance_criteria = 2
111
+ todo_granularity = "atomic"
112
+ require_files = true
113
+ require_test_commands = true
114
+ require_expected_outputs = true
115
+ require_validation_hints = true
116
+ plan_body_detail = "detailed"
117
+ required_question_topics = ["scope", "compatibility", "test strategy"]
118
+ extra_guidance = "Every plan must mention docs, tests, and rollback or repair behavior."
119
+ ```
120
+
121
+ Inspect guidance for the active task:
122
+
123
+ ```bash
124
+ taskledger plan guidance
125
+ taskledger --json plan guidance
126
+ ```
127
+
128
+ This guidance is advisory and cannot override lifecycle gates, user approval,
129
+ validation requirements, lock rules, or higher-priority harness instructions.
130
+ See `docs/usage.rst` for the full key reference and workflow details.
131
+
84
132
  ## Install
85
133
 
86
134
  ```bash
@@ -136,14 +184,36 @@ taskledger validate check --criterion ac-0001 --status pass --evidence "pytest -
136
184
  taskledger validate finish --result passed --summary "Validated the rewrite."
137
185
  ```
138
186
 
139
- If validation finds an implementation bug, keep the accepted plan and restart
140
- implementation explicitly:
187
+ To revise a proposed plan, re-enter planning and edit an exported workspace
188
+ copy. Never edit `.taskledger/` files directly:
141
189
 
142
190
  ```bash
143
- taskledger validate finish --result failed --summary "Parser edge case still fails."
144
- taskledger next-action
145
- taskledger context --for implementation --format markdown
146
- taskledger implement restart --summary "Fix failed validation findings."
191
+ taskledger plan revise
192
+ taskledger plan export --version latest --file ./plan.md
193
+ # edit ./plan.md
194
+ taskledger plan upsert --file ./plan.md
195
+ ```
196
+
197
+ For manually completed work (e.g., manual testing, operations tasks, or work
198
+ completed outside the task-first lifecycle), use `task record` to create a
199
+ done task directly without acquiring lifecycle locks. **Note**: `task record`
200
+ does not replace the normal task lifecycle; it is for recording work already
201
+ completed, not as a shortcut for active task management.
202
+
203
+ ```bash
204
+ taskledger task record "Deploy to production" --summary "Deployed v0.4.1 to prod" --change "infra/deploy.sh:run:Updated prod config" --evidence "Monitoring shows no errors"
205
+ taskledger task record "Manual API testing" --summary "Tested new endpoints" --allow-empty-record --reason "Exploratory testing, no formal changes tracked"
206
+ ```
207
+
208
+ Archive is a visibility operation: it hides tasks from default list/tree/dashboard
209
+ views without deleting history. Task ids stay monotonic and are never reused.
210
+ Slugs can be reused after archive.
211
+
212
+ ```bash
213
+ taskledger task archive task-0030 --reason "Hide historical task"
214
+ taskledger task list --archived
215
+ taskledger task unarchive task-0030 --reason "Need to continue work" --slug task-0030-reopened
216
+ taskledger tree --include-archived
147
217
  ```
148
218
 
149
219
  If validation finds an implementation bug, keep the accepted plan and restart
@@ -270,21 +340,47 @@ fresh-context transfer.
270
340
  ## Storage layout
271
341
 
272
342
  `taskledger` keeps project-local configuration in the workspace root and durable
273
- records under the configured storage root:
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>/`:
274
346
 
275
347
  ```text
276
- taskledger.toml
348
+ .taskledger.toml
277
349
  .taskledger/
278
- intros/
279
- releases/
280
- tasks/
281
- events/
282
- indexes/ # optional derived caches and registries
350
+ storage.yaml
351
+ ledgers/
352
+ main/
353
+ intros/
354
+ releases/
355
+ tasks/
356
+ events/
357
+ indexes/ # optional derived caches and registries
283
358
  ```
284
359
 
285
- Markdown files are canonical. Task, plan, and run listings scan those records
286
- directly. JSON files under `.taskledger/indexes/` are optional derived caches or
287
- registries and are not required for task correctness.
360
+ Markdown files are canonical. Task, plan, and run listings scan only the current
361
+ ledger by default. JSON files under the current ledger's `indexes/` directory are
362
+ optional derived caches or registries and are not required for task correctness.
363
+
364
+ ### Branch-scoped ledgers
365
+
366
+ `.taskledger/` stays ignored and local. `.taskledger.toml` is safe to commit and
367
+ contains the current `ledger_ref`, optional parent ref, and the next logical task
368
+ number for the checked-out source branch.
369
+
370
+ When starting long-lived branch-local work, fork the ledger pointer after creating
371
+ the Git branch:
372
+
373
+ ```bash
374
+ git checkout -b feature-a
375
+ taskledger ledger fork feature-a
376
+ git add .taskledger.toml
377
+ ```
378
+
379
+ Returning to a branch whose `.taskledger.toml` points back to `main` hides the
380
+ feature branch's active task and task list. Two ledgers may both contain a logical
381
+ `task-0030`; this is expected because task IDs are scoped by `ledger_ref`. Use
382
+ `taskledger ledger adopt --from REF TASK_REF` when branch-local task history
383
+ should be copied into the current ledger.
288
384
 
289
385
  You can also point `taskledger.toml` at an external storage root:
290
386
 
@@ -312,6 +408,7 @@ Use `--json` for machine-readable payloads:
312
408
  taskledger --json status --full
313
409
  taskledger --json task active
314
410
  taskledger --json task show
411
+ taskledger --json task show task-0001
315
412
  taskledger --json context --for validation --format json
316
413
  ```
317
414
 
@@ -352,6 +449,7 @@ taskledger context --for planning --format markdown
352
449
  taskledger context --for implementation --format markdown
353
450
  taskledger context --for validation --format json
354
451
  taskledger task dossier --format markdown
452
+ taskledger task report --task task-0030 -o task30.md
355
453
  taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
356
454
  taskledger handoff claim handoff-0001
357
455
  taskledger handoff close handoff-0001 --reason "Implementation started."
@@ -412,11 +510,39 @@ for task-first handoff guidance.
412
510
  ## Export, import, and snapshots
413
511
 
414
512
  ```bash
415
- taskledger --json export
416
- taskledger import ./taskledger-export.json --replace
513
+ taskledger init --project-name "Taskledger"
514
+ taskledger export
515
+ taskledger import ./taskledger-transfer.tar.gz --dry-run
516
+ taskledger import ./taskledger-transfer.tar.gz --replace
417
517
  taskledger snapshot ./artifacts
418
518
  ```
419
519
 
520
+ Default export filenames use this policy:
521
+
522
+ ```text
523
+ taskledger-export-{project_slug}-{ledger_ref}-{timestamp}.tar.gz
524
+ ```
525
+
526
+ `project_slug` is derived from `project_name` in `taskledger.toml`. If
527
+ `project_name` is missing, taskledger falls back to the workspace directory name.
528
+ Import safety still relies on `project_uuid`, not the name/slug.
529
+
530
+ `--include-bodies` and `--include-run-artifacts` now change archive content:
531
+
532
+ - `--no-include-bodies` strips record body text (`body` / `context_body`) from exported payloads.
533
+ - `--include-run-artifacts` embeds task and agent-log artifact files under `artifacts/` in the archive.
534
+
535
+ Cross-machine imports preserve durable task/run data, but imported runtime locks
536
+ are quarantined by default. After importing an in-progress implementation,
537
+ run:
538
+
539
+ ```bash
540
+ taskledger next-action
541
+ taskledger implement resume --reason "Continue imported implementation."
542
+ ```
543
+
544
+ Use `--lock-policy keep` only for diagnostic full-fidelity lock restoration.
545
+
420
546
  ## Skill packaging
421
547
 
422
548
  Agent workflows work best when the `taskledger` skill is installed in the
@@ -436,6 +562,15 @@ Keep this skill outside the Python package. No additional
436
562
  ## Development
437
563
 
438
564
  ```bash
439
- pytest -q
565
+ python -m pytest -m "not slow"
566
+ python -m pytest -m "not slow" -n auto
567
+ python -m pytest -n auto
568
+ python -m pytest
440
569
  ruff check .
441
570
  ```
571
+
572
+ Full release-readiness sweep:
573
+
574
+ ```bash
575
+ make release-check
576
+ ```