taskledger 0.1.0__tar.gz → 0.1.2__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 (148) hide show
  1. {taskledger-0.1.0 → taskledger-0.1.2}/API.md +27 -1
  2. taskledger-0.1.2/CHANGELOG.md +63 -0
  3. {taskledger-0.1.0/taskledger.egg-info → taskledger-0.1.2}/PKG-INFO +35 -5
  4. {taskledger-0.1.0 → taskledger-0.1.2}/README.md +34 -4
  5. {taskledger-0.1.0 → taskledger-0.1.2}/docs/api.rst +15 -0
  6. {taskledger-0.1.0 → taskledger-0.1.2}/docs/architecture_taskledger_split.rst +4 -4
  7. {taskledger-0.1.0 → taskledger-0.1.2}/docs/command_contract.rst +56 -0
  8. {taskledger-0.1.0 → taskledger-0.1.2}/docs/full_task_cycle.rst +31 -4
  9. {taskledger-0.1.0 → taskledger-0.1.2}/docs/public_surface.rst +16 -5
  10. {taskledger-0.1.0 → taskledger-0.1.2}/docs/usage.rst +63 -1
  11. {taskledger-0.1.0 → taskledger-0.1.2}/pyproject.toml +1 -1
  12. {taskledger-0.1.0 → taskledger-0.1.2}/skills/taskledger/SKILL.md +50 -9
  13. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/__main__.py +2 -2
  14. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/_version.py +3 -3
  15. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/__init__.py +1 -0
  16. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/plans.py +2 -0
  17. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/questions.py +2 -0
  18. taskledger-0.1.2/taskledger/api/releases.py +15 -0
  19. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/task_runs.py +2 -0
  20. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/tasks.py +6 -0
  21. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli.py +156 -6
  22. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_implement.py +58 -0
  23. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_misc.py +46 -1
  24. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_plan.py +32 -0
  25. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_question.py +138 -9
  26. taskledger-0.1.2/taskledger/cli_release.py +162 -0
  27. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_task.py +153 -7
  28. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/command_inventory.py +10 -0
  29. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/domain/models.py +81 -1
  30. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/domain/states.py +3 -0
  31. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/errors.py +5 -0
  32. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/exchange.py +27 -0
  33. taskledger-0.1.2/taskledger/launcher.py +25 -0
  34. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/doctor.py +51 -7
  35. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/handoff.py +109 -1
  36. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/navigation.py +369 -58
  37. taskledger-0.1.2/taskledger/services/releases.py +560 -0
  38. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/serve_read_model.py +170 -59
  39. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/tasks.py +952 -78
  40. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/common.py +3 -3
  41. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/init.py +4 -1
  42. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/paths.py +2 -0
  43. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/task_store.py +61 -1
  44. {taskledger-0.1.0 → taskledger-0.1.2/taskledger.egg-info}/PKG-INFO +35 -5
  45. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger.egg-info/SOURCES.txt +8 -0
  46. taskledger-0.1.2/taskledger.egg-info/entry_points.txt +2 -0
  47. taskledger-0.1.2/tests/test_cli_import_resilience.py +162 -0
  48. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_command_inventory.py +4 -0
  49. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_delta_remaining_contracts.py +498 -0
  50. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_docs_and_skill.py +6 -0
  51. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_doctor.py +65 -0
  52. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_models_v1_schema.py +27 -0
  53. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_plan_approval_contract.py +42 -0
  54. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_plan_lint.py +162 -0
  55. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_project_root_config.py +3 -3
  56. taskledger-0.1.2/tests/test_question_add_many.py +160 -0
  57. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_question_plan_regeneration.py +114 -0
  58. taskledger-0.1.2/tests/test_release_changelog.py +675 -0
  59. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_storage_bundle_layout.py +1 -0
  60. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_storage_common.py +2 -1
  61. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_storage_init.py +1 -0
  62. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_taskledger_cli_api_parity.py +12 -1
  63. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_taskledger_v2_cli.py +843 -0
  64. taskledger-0.1.2/tests/test_taskledger_v2_exchange.py +373 -0
  65. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_todo_implementation_gate.py +80 -0
  66. taskledger-0.1.0/taskledger.egg-info/entry_points.txt +0 -2
  67. taskledger-0.1.0/tests/test_taskledger_v2_exchange.py +0 -143
  68. {taskledger-0.1.0 → taskledger-0.1.2}/.codecrate.toml +0 -0
  69. {taskledger-0.1.0 → taskledger-0.1.2}/.github/workflows/codecov.yml +0 -0
  70. {taskledger-0.1.0 → taskledger-0.1.2}/.github/workflows/pre-commit.yml +0 -0
  71. {taskledger-0.1.0 → taskledger-0.1.2}/.github/workflows/python-publish.yml +0 -0
  72. {taskledger-0.1.0 → taskledger-0.1.2}/.github/workflows/tests.yml +0 -0
  73. {taskledger-0.1.0 → taskledger-0.1.2}/.gitignore +0 -0
  74. {taskledger-0.1.0 → taskledger-0.1.2}/.pre-commit-config.yaml +0 -0
  75. {taskledger-0.1.0 → taskledger-0.1.2}/.readthedocs.yaml +0 -0
  76. {taskledger-0.1.0 → taskledger-0.1.2}/.ruff.toml +0 -0
  77. {taskledger-0.1.0 → taskledger-0.1.2}/.taskledger.toml +0 -0
  78. {taskledger-0.1.0 → taskledger-0.1.2}/AGENTS.md +0 -0
  79. {taskledger-0.1.0 → taskledger-0.1.2}/LICENSE +0 -0
  80. {taskledger-0.1.0 → taskledger-0.1.2}/docs/Makefile +0 -0
  81. {taskledger-0.1.0 → taskledger-0.1.2}/docs/build.sh +0 -0
  82. {taskledger-0.1.0 → taskledger-0.1.2}/docs/conf.py +0 -0
  83. {taskledger-0.1.0 → taskledger-0.1.2}/docs/index.rst +0 -0
  84. {taskledger-0.1.0 → taskledger-0.1.2}/docs/multi_repo.rst +0 -0
  85. {taskledger-0.1.0 → taskledger-0.1.2}/docs/requirements.txt +0 -0
  86. {taskledger-0.1.0 → taskledger-0.1.2}/setup.cfg +0 -0
  87. {taskledger-0.1.0 → taskledger-0.1.2}/setup.py +0 -0
  88. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/__init__.py +0 -0
  89. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/handoff.py +0 -0
  90. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/introductions.py +0 -0
  91. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/locks.py +0 -0
  92. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/project.py +0 -0
  93. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/api/search.py +0 -0
  94. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_actor.py +0 -0
  95. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_common.py +0 -0
  96. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_migrate.py +0 -0
  97. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/cli_validate.py +0 -0
  98. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/domain/__init__.py +0 -0
  99. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/domain/policies.py +0 -0
  100. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/ids.py +0 -0
  101. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/py.typed +0 -0
  102. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/search.py +0 -0
  103. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/__init__.py +0 -0
  104. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/actors.py +0 -0
  105. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/dashboard.py +0 -0
  106. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/handoff_lifecycle.py +0 -0
  107. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/phase5_lock_transfer.py +0 -0
  108. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/plan_lint.py +0 -0
  109. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/validation.py +0 -0
  110. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/services/web_dashboard.py +0 -0
  111. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/__init__.py +0 -0
  112. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/atomic.py +0 -0
  113. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/events.py +0 -0
  114. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/frontmatter.py +0 -0
  115. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/indexes.py +0 -0
  116. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/locks.py +0 -0
  117. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/meta.py +0 -0
  118. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/migrations.py +0 -0
  119. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/project_config.py +0 -0
  120. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/storage/repos.py +0 -0
  121. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger/timeutils.py +0 -0
  122. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger.egg-info/dependency_links.txt +0 -0
  123. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger.egg-info/requires.txt +0 -0
  124. {taskledger-0.1.0 → taskledger-0.1.2}/taskledger.egg-info/top_level.txt +0 -0
  125. {taskledger-0.1.0 → taskledger-0.1.2}/tests/conftest.py +0 -0
  126. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_active_task.py +0 -0
  127. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_actor_harness_state.py +0 -0
  128. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_agent_session_protocol.py +0 -0
  129. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_cli_command_contract.py +0 -0
  130. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_command_example_linter.py +0 -0
  131. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_domain_policies.py +0 -0
  132. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_events.py +0 -0
  133. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_handoff_lifecycle.py +0 -0
  134. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_implementation_change_scan.py +0 -0
  135. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_json_contracts.py +0 -0
  136. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_legacy_cleanup_contracts.py +0 -0
  137. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_lifecycle_policies.py +0 -0
  138. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_locks_audit.py +0 -0
  139. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_plan_todo_materialization.py +0 -0
  140. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_question_filter_answers.py +0 -0
  141. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_search.py +0 -0
  142. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_serve_dashboard.py +0 -0
  143. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_services_dashboard.py +0 -0
  144. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_sidecar_collections.py +0 -0
  145. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_storage_migration.py +0 -0
  146. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_storage_repos.py +0 -0
  147. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_task_events.py +0 -0
  148. {taskledger-0.1.0 → taskledger-0.1.2}/tests/test_tasks_service_static.py +0 -0
@@ -11,6 +11,7 @@ This repository exposes a task-first public API. The supported modules are:
11
11
  - `taskledger.api.introductions`
12
12
  - `taskledger.api.locks`
13
13
  - `taskledger.api.handoff`
14
+ - `taskledger.api.releases`
14
15
  - `taskledger.api.search`
15
16
 
16
17
  ## Import boundary
@@ -66,7 +67,9 @@ from taskledger.errors import (
66
67
  - `show_task`
67
68
  - `edit_task`
68
69
  - `cancel_task`
70
+ - `uncancel_task`
69
71
  - `close_task`
72
+ - `create_follow_up_task`
70
73
  - `add_requirement`
71
74
  - `remove_requirement`
72
75
  - `waive_requirement`
@@ -83,11 +86,13 @@ from taskledger.errors import (
83
86
  - `can_perform`
84
87
  - `reindex`
85
88
  - `repair_task_record`
89
+ - `repair_orphaned_planning_run`
86
90
 
87
91
  ### `taskledger.api.plans`
88
92
 
89
93
  - `start_planning`
90
94
  - `propose_plan`
95
+ - `plan_template`
91
96
  - `upsert_plan`
92
97
  - `regenerate_plan_from_answers`
93
98
  - `materialize_plan_todos`
@@ -103,6 +108,7 @@ from taskledger.errors import (
103
108
  ### `taskledger.api.questions`
104
109
 
105
110
  - `add_question`
111
+ - `add_questions`
106
112
  - `list_questions`
107
113
  - `list_open_questions`
108
114
  - `answer_question`
@@ -114,6 +120,7 @@ from taskledger.errors import (
114
120
 
115
121
  - `start_implementation`
116
122
  - `restart_implementation`
123
+ - `resume_implementation`
117
124
  - `log_implementation`
118
125
  - `add_implementation_deviation`
119
126
  - `add_implementation_artifact`
@@ -192,6 +199,13 @@ Focused handoffs store the generated Markdown context snapshot in the handoff
192
199
  record body and return compact metadata, including `context_hash` and
193
200
  `context_path`.
194
201
 
202
+ ### `taskledger.api.releases`
203
+
204
+ - `build_changelog_context`
205
+ - `list_release_records`
206
+ - `show_release`
207
+ - `tag_release`
208
+
195
209
  ### `taskledger.api.search`
196
210
 
197
211
  - `search_workspace`
@@ -213,6 +227,7 @@ The public task-first CLI surface is organized around these command groups:
213
227
  - `file`
214
228
  - `link`
215
229
  - `require`
230
+ - `release`
216
231
  - `lock`
217
232
  - `context`
218
233
  - `handoff`
@@ -243,12 +258,23 @@ structured `error` object on failure.
243
258
  Workflow additions:
244
259
 
245
260
  - `task create` creates a task. Use `task activate TASK_REF` to make it active.
261
+ - `task follow-up PARENT_REF TITLE` creates a new draft child task linked to a
262
+ completed parent. Use it for small post-completion deltas instead of
263
+ reopening the done task.
264
+ - `plan template` and `question add-many` support faster plan drafting and batch
265
+ planning setup.
246
266
  - `plan draft`, `plan upsert --from-answers`, and
247
267
  `plan materialize-todos` support the question-answer-regenerate loop.
248
268
  - `question status` reports required open questions and whether regeneration is
249
- needed.
269
+ needed, including plan-template hints when answered questions require a plan update.
250
270
  - `implement restart --summary ...` starts a new implementation run from
251
271
  `failed_validation` while preserving the prior failed validation history.
272
+ - `implement resume --reason ...` reacquires an implementation lock for an
273
+ existing running implementation run after a lock break or other orphaned-lock
274
+ recovery.
275
+ - `task uncancel --reason ... [--to STAGE]` restores truly cancelled tasks to a
276
+ safe durable non-active stage; active work still resumes through the normal
277
+ stage-specific commands.
252
278
  - `todo done` records evidence with `--evidence`, `--artifact`, and `--change`.
253
279
  - `handoff create|list|show|claim|close|cancel` are available on the main
254
280
  task-first handoff command group.
@@ -0,0 +1,63 @@
1
+ # Changelog
2
+
3
+ ## v0.1.1 - 2026-04-29
4
+
5
+ ### Added
6
+
7
+ - Added `task follow-up` to create linked post-completion child tasks, preserve closure metadata, and show parent and follow-up relationships in task and handoff views.
8
+ - Added durable release records and a new `taskledger release` command group with `tag`, `list`, `show`, and `changelog`, including export/import support and public API coverage.
9
+ - Added planning helpers with `question add-many`, `plan template`, richer regeneration hints in `next-action`, and recovery commands for orphaned implementation work with `implement resume`, `task uncancel`, and `can implement-resume`.
10
+
11
+ ### Changed
12
+
13
+ - Hardened CLI startup so optional command-group import failures no longer block core commands, and launcher failures return structured diagnostics.
14
+
15
+ ### Fixed
16
+
17
+ - Fixed recovery guidance for uncancelled tasks with orphaned implementation runs so `next-action` and `can implement` recommend `implement resume` instead of a fresh start.
18
+
19
+ ### Documentation
20
+
21
+ - Documented release tagging, changelog generation, planning helpers, follow-up task workflow, and recovery semantics across README, RST docs, API docs, and the taskledger skill.
22
+
23
+ ### Quality
24
+
25
+ - Expanded regression coverage for follow-up tasks, release workflow, CLI import resilience, planning helpers, and implementation recovery. Repo-wide pytest, ruff, and mypy passed.
26
+
27
+ ## v0.1.0 - 2026-04-29
28
+
29
+ ### Added
30
+
31
+ - Added initial unit test coverage for `storage/common`, `storage/init`, `storage/repos`, `domain/policies`, and `services/doctor_v2`, raising overall coverage from 62% to 65%.
32
+ - Added a second coverage pass for storage memories, items, contexts, validation, and dashboard services, raising overall coverage to 73%.
33
+ - Added question status filtering plus `taskledger question answers` with markdown and JSON output.
34
+ - Added `taskledger plan lint`, stricter executable-plan linting, and approval gating for lint failures.
35
+ - Added focused worker contexts and durable handoff snapshots for implementer and reviewer workflows.
36
+ - Added richer `next-action` output with next item, command hints, and progress details.
37
+ - Added project-root config discovery and external storage roots via `taskledger.toml`.
38
+ - Added the localhost-only read-only `taskledger serve` dashboard.
39
+ - Added an explicit failed-validation recovery path with `taskledger implement restart`.
40
+ - Added compact single-agent workflow guidance and richer `todo next` and `todo show` hints.
41
+
42
+ ### Changed
43
+
44
+ - Hardened agent guardrails by requiring reasons for approval escape hatches, blocking empty-todo approvals by default, and adding durable `plan command` execution.
45
+ - Finished agent-protocol hardening with stronger typed normalization, safer plan todo materialization, and automatic todo source inference from the active lock.
46
+ - Removed redundant derived task, plan-version, and latest-run indexes so Markdown bundles remain canonical and JSON indexes remain rebuildable caches.
47
+ - Completed the broader pre-release cleanup pass from `todo.md`, including public API export cleanup, stricter storage diagnostics, canonical module paths, normalized JSON command naming, and packaging cleanup.
48
+ - Extended the serve dashboard with a dedicated read model, recent-event tail loading, route caching, and non-overlapping partial refreshes for better hot-path performance.
49
+ - Redesigned the serve dashboard into a more human-focused layout with richer sidebar metadata, accessibility coverage, and updated docs.
50
+ - Improved dashboard review ergonomics and refresh stability with pause and resume controls, diffed rerenders, preserved details state, and lazy raw-payload rendering.
51
+ - Finished release-readiness cleanup by consolidating maintained docs under RST and keeping `skills/taskledger/SKILL.md` as the single canonical skill file.
52
+
53
+ ### Fixed
54
+
55
+ - Fixed `taskledger view` so todo counts and item lists reflect persisted todos instead of always showing `0/0`.
56
+ - Fixed orphan slug-directory creation under `.taskledger/tasks/` and added repair support for existing bad directories.
57
+ - Fixed repo-wide pre-commit and mypy failures across more than twenty files.
58
+ - Fixed serve response handling so client disconnects no longer produce `BrokenPipeError` tracebacks.
59
+ - Fixed the serve dashboard todo-renderer JavaScript regression that broke refresh parsing.
60
+
61
+ ### Quality
62
+
63
+ - Improved testing depth across storage, dashboard, lifecycle, and documentation surfaces to support release readiness and regression protection.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskledger
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Durable project-state storage and CLI for coding workflows
5
5
  Author: Taskledger Contributors
6
6
  Maintainer: Holger Nahrstaedt
@@ -40,6 +40,11 @@ Provides-Extra: rich
40
40
  Requires-Dist: rich; extra == "rich"
41
41
  Dynamic: license-file
42
42
 
43
+ [![PyPI - Version](https://img.shields.io/pypi/v/taskledger)](https://pypi.org/project/taskledger/)
44
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/taskledger)
45
+ ![PyPI - Downloads](https://img.shields.io/pypi/dm/taskledger)
46
+ [![codecov](https://codecov.io/gh/holgern/taskledger/graph/badge.svg?token=6usFHwM5Ul)](https://codecov.io/gh/holgern/taskledger)
47
+
43
48
  # taskledger
44
49
 
45
50
  `taskledger` is a task-first durable state layer for staged coding work. It keeps
@@ -74,7 +79,7 @@ The supported command surface is organized as:
74
79
 
75
80
  **Project lifecycle:**
76
81
 
77
- - `init`, `status`, `export`, `import`, `snapshot`
82
+ - `init`, `status`, `export`, `import`, `snapshot`, `release`
78
83
 
79
84
  ## Install
80
85
 
@@ -106,9 +111,10 @@ plan from answers, approve it, implement todos with evidence, and validate it:
106
111
  taskledger task create "Rewrite V2" --slug rewrite-v2 --description "Migrate to the task-first design."
107
112
  taskledger task activate rewrite-v2 --reason "Start planning"
108
113
  taskledger plan start
109
- taskledger question add --text "Should exports include the new state?" --required-for-plan
110
- taskledger question answer-many --text "q-0001: Yes."
114
+ taskledger question add-many --required-for-plan --text $'Should exports include the new state?\nShould snapshots include implementation artifacts?'
115
+ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
111
116
  taskledger question status
117
+ taskledger plan template --from-answers --file ./plan.md
112
118
  taskledger plan upsert --from-answers --file ./plan.md
113
119
  taskledger plan lint --version 1
114
120
  taskledger plan accept --version 1 --note "Ready."
@@ -150,6 +156,22 @@ taskledger context --for implementation --format markdown
150
156
  taskledger implement restart --summary "Fix failed validation findings."
151
157
  ```
152
158
 
159
+ ## Release tagging and changelog context
160
+
161
+ Use durable release tags to mark completed task boundaries and generate
162
+ provider-neutral changelog source packs from finished tasks:
163
+
164
+ ```bash
165
+ taskledger release tag 0.4.1 --at-task task-0030 --note "0.4.1 released"
166
+ taskledger release changelog 0.4.2 --since 0.4.1 --until-task task-0035 --output /tmp/taskledger-0.4.2-changelog-source.md
167
+ taskledger release show 0.4.1
168
+ taskledger release list
169
+ ```
170
+
171
+ `release changelog` does not call an LLM API. It renders compact Markdown or JSON
172
+ from done tasks, implementation logs, code changes, and validation evidence so a
173
+ separate coding harness can draft the final human changelog.
174
+
153
175
  `taskledger next-action` is the preferred fresh-context entrypoint. It stays
154
176
  read-only and points at the next concrete question, todo, criterion, or repair
155
177
  step.
@@ -254,6 +276,7 @@ records under the configured storage root:
254
276
  taskledger.toml
255
277
  .taskledger/
256
278
  intros/
279
+ releases/
257
280
  tasks/
258
281
  events/
259
282
  indexes/ # optional derived caches and registries
@@ -272,6 +295,7 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
272
295
  ```text
273
296
  /home/me/src/project-a/taskledger.toml
274
297
  /mnt/cloud/taskledger/project-a/storage.yaml
298
+ /mnt/cloud/taskledger/project-a/releases/
275
299
  /mnt/cloud/taskledger/project-a/tasks/
276
300
  /mnt/cloud/taskledger/project-a/events/
277
301
  /mnt/cloud/taskledger/project-a/indexes/
@@ -395,13 +419,19 @@ taskledger snapshot ./artifacts
395
419
 
396
420
  ## Skill packaging
397
421
 
422
+ Agent workflows work best when the `taskledger` skill is installed in the
423
+ coding harness. The CLI has a task-first lifecycle with explicit planning,
424
+ approval, implementation, validation, locks, and handoff gates; without the
425
+ skill, an agent may not know the intended command sequence or gate semantics.
426
+
398
427
  The canonical skill file lives at:
399
428
 
400
429
  ```text
401
430
  skills/taskledger/SKILL.md
402
431
  ```
403
432
 
404
- No additional `skills/taskledger/examples/` directory is required.
433
+ Keep this skill outside the Python package. No additional
434
+ `skills/taskledger/examples/` directory is required.
405
435
 
406
436
  ## Development
407
437
 
@@ -1,3 +1,8 @@
1
+ [![PyPI - Version](https://img.shields.io/pypi/v/taskledger)](https://pypi.org/project/taskledger/)
2
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/taskledger)
3
+ ![PyPI - Downloads](https://img.shields.io/pypi/dm/taskledger)
4
+ [![codecov](https://codecov.io/gh/holgern/taskledger/graph/badge.svg?token=6usFHwM5Ul)](https://codecov.io/gh/holgern/taskledger)
5
+
1
6
  # taskledger
2
7
 
3
8
  `taskledger` is a task-first durable state layer for staged coding work. It keeps
@@ -32,7 +37,7 @@ The supported command surface is organized as:
32
37
 
33
38
  **Project lifecycle:**
34
39
 
35
- - `init`, `status`, `export`, `import`, `snapshot`
40
+ - `init`, `status`, `export`, `import`, `snapshot`, `release`
36
41
 
37
42
  ## Install
38
43
 
@@ -64,9 +69,10 @@ plan from answers, approve it, implement todos with evidence, and validate it:
64
69
  taskledger task create "Rewrite V2" --slug rewrite-v2 --description "Migrate to the task-first design."
65
70
  taskledger task activate rewrite-v2 --reason "Start planning"
66
71
  taskledger plan start
67
- taskledger question add --text "Should exports include the new state?" --required-for-plan
68
- taskledger question answer-many --text "q-0001: Yes."
72
+ taskledger question add-many --required-for-plan --text $'Should exports include the new state?\nShould snapshots include implementation artifacts?'
73
+ taskledger question answer-many --text $'q-0001: Yes.\nq-0002: No.'
69
74
  taskledger question status
75
+ taskledger plan template --from-answers --file ./plan.md
70
76
  taskledger plan upsert --from-answers --file ./plan.md
71
77
  taskledger plan lint --version 1
72
78
  taskledger plan accept --version 1 --note "Ready."
@@ -108,6 +114,22 @@ taskledger context --for implementation --format markdown
108
114
  taskledger implement restart --summary "Fix failed validation findings."
109
115
  ```
110
116
 
117
+ ## Release tagging and changelog context
118
+
119
+ Use durable release tags to mark completed task boundaries and generate
120
+ provider-neutral changelog source packs from finished tasks:
121
+
122
+ ```bash
123
+ taskledger release tag 0.4.1 --at-task task-0030 --note "0.4.1 released"
124
+ taskledger release changelog 0.4.2 --since 0.4.1 --until-task task-0035 --output /tmp/taskledger-0.4.2-changelog-source.md
125
+ taskledger release show 0.4.1
126
+ taskledger release list
127
+ ```
128
+
129
+ `release changelog` does not call an LLM API. It renders compact Markdown or JSON
130
+ from done tasks, implementation logs, code changes, and validation evidence so a
131
+ separate coding harness can draft the final human changelog.
132
+
111
133
  `taskledger next-action` is the preferred fresh-context entrypoint. It stays
112
134
  read-only and points at the next concrete question, todo, criterion, or repair
113
135
  step.
@@ -212,6 +234,7 @@ records under the configured storage root:
212
234
  taskledger.toml
213
235
  .taskledger/
214
236
  intros/
237
+ releases/
215
238
  tasks/
216
239
  events/
217
240
  indexes/ # optional derived caches and registries
@@ -230,6 +253,7 @@ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
230
253
  ```text
231
254
  /home/me/src/project-a/taskledger.toml
232
255
  /mnt/cloud/taskledger/project-a/storage.yaml
256
+ /mnt/cloud/taskledger/project-a/releases/
233
257
  /mnt/cloud/taskledger/project-a/tasks/
234
258
  /mnt/cloud/taskledger/project-a/events/
235
259
  /mnt/cloud/taskledger/project-a/indexes/
@@ -353,13 +377,19 @@ taskledger snapshot ./artifacts
353
377
 
354
378
  ## Skill packaging
355
379
 
380
+ Agent workflows work best when the `taskledger` skill is installed in the
381
+ coding harness. The CLI has a task-first lifecycle with explicit planning,
382
+ approval, implementation, validation, locks, and handoff gates; without the
383
+ skill, an agent may not know the intended command sequence or gate semantics.
384
+
356
385
  The canonical skill file lives at:
357
386
 
358
387
  ```text
359
388
  skills/taskledger/SKILL.md
360
389
  ```
361
390
 
362
- No additional `skills/taskledger/examples/` directory is required.
391
+ Keep this skill outside the Python package. No additional
392
+ `skills/taskledger/examples/` directory is required.
363
393
 
364
394
  ## Development
365
395
 
@@ -14,6 +14,7 @@ Supported modules
14
14
  - ``taskledger.api.introductions``
15
15
  - ``taskledger.api.locks``
16
16
  - ``taskledger.api.handoff``
17
+ - ``taskledger.api.releases``
17
18
  - ``taskledger.api.search``
18
19
 
19
20
  Import boundary
@@ -46,7 +47,9 @@ Task API
46
47
  - ``show_task``
47
48
  - ``edit_task``
48
49
  - ``cancel_task``
50
+ - ``uncancel_task``
49
51
  - ``close_task``
52
+ - ``create_follow_up_task``
50
53
  - ``add_requirement``
51
54
  - ``remove_requirement``
52
55
  - ``waive_requirement``
@@ -63,12 +66,14 @@ Task API
63
66
  - ``can_perform``
64
67
  - ``reindex``
65
68
  - ``repair_task_record``
69
+ - ``repair_orphaned_planning_run``
66
70
 
67
71
  Plan API
68
72
  --------
69
73
 
70
74
  - ``start_planning``
71
75
  - ``propose_plan``
76
+ - ``plan_template``
72
77
  - ``upsert_plan``
73
78
  - ``list_plan_versions``
74
79
  - ``show_plan``
@@ -85,6 +90,7 @@ Question API
85
90
  ------------
86
91
 
87
92
  - ``add_question``
93
+ - ``add_questions``
88
94
  - ``answer_question``
89
95
  - ``answer_questions``
90
96
  - ``list_questions``
@@ -97,6 +103,7 @@ Run API
97
103
 
98
104
  - ``start_implementation``
99
105
  - ``restart_implementation``
106
+ - ``resume_implementation``
100
107
  - ``log_implementation``
101
108
  - ``add_implementation_deviation``
102
109
  - ``add_implementation_artifact``
@@ -143,6 +150,14 @@ Handoff API
143
150
  - ``close_handoff_api``
144
151
  - ``cancel_handoff_api``
145
152
 
153
+ Release API
154
+ ~~~~~~~~~~~
155
+
156
+ - ``build_changelog_context``
157
+ - ``list_release_records``
158
+ - ``show_release``
159
+ - ``tag_release``
160
+
146
161
  Search API
147
162
  ~~~~~~~~~~
148
163
 
@@ -32,7 +32,7 @@ Command surface
32
32
  ---------------
33
33
 
34
34
  The supported command groups are ``task``, ``plan``, ``question``, ``implement``,
35
- ``validate``, ``todo``, ``intro``, ``file``, ``link``, ``require``, ``lock``,
36
- ``handoff``, ``context``, ``actor``, ``view``, ``next-action``, ``can``, ``search``,
37
- ``grep``, ``symbols``, ``deps``, ``doctor``, ``repair``, ``reindex``, ``init``,
38
- ``status``, ``export``, ``import``, and ``snapshot``.
35
+ ``validate``, ``todo``, ``intro``, ``file``, ``link``, ``require``, ``release``,
36
+ ``lock``, ``handoff``, ``context``, ``actor``, ``view``, ``next-action``, ``can``,
37
+ ``search``, ``grep``, ``symbols``, ``deps``, ``doctor``, ``repair``, ``reindex``,
38
+ ``init``, ``status``, ``export``, ``import``, and ``snapshot``.
@@ -27,6 +27,7 @@ when explicitly targeting another task.
27
27
 
28
28
  taskledger plan start
29
29
  taskledger plan start --task task-0001
30
+ taskledger implement resume --task task-0001 --reason "Reacquire implementation lock."
30
31
  taskledger implement restart --task task-0001 --summary "Fix validation findings."
31
32
  taskledger implement finish --task task-0001 --summary "Implemented."
32
33
  taskledger validate status --task task-0001
@@ -41,10 +42,29 @@ Positional refs are reserved for the direct resource being changed or shown:
41
42
  .. code-block:: bash
42
43
 
43
44
  taskledger task activate TASK_REF
45
+ taskledger task follow-up PARENT_REF TITLE [options]
44
46
  taskledger todo done TODO_ID --task TASK_REF --evidence "pytest -q"
45
47
  taskledger question answer QUESTION_ID --task TASK_REF --text "Yes."
46
48
  taskledger handoff show HANDOFF_ID --task TASK_REF
47
49
  taskledger require add REQUIRED_TASK_REF --task TASK_REF
50
+ taskledger release show 0.4.1
51
+
52
+ Release commands
53
+ ----------------
54
+
55
+ Release boundaries are durable project records, not task lifecycle states:
56
+
57
+ .. code-block:: bash
58
+
59
+ taskledger release tag 0.4.1 --at-task task-0030 --note "0.4.1 released"
60
+ taskledger release list
61
+ taskledger release show 0.4.1
62
+ taskledger release changelog 0.4.2 --since 0.4.1 --until-task task-0035 --output /tmp/taskledger-0.4.2-changelog-source.md
63
+
64
+ ``release tag`` writes a durable release record under ``.taskledger/releases/``.
65
+ ``release changelog`` is read-oriented: it renders Markdown or JSON changelog
66
+ context from done tasks and may write an external output file, but it does not
67
+ mutate ledger state.
48
68
 
49
69
  ``next-action`` result contract
50
70
  -------------------------------
@@ -79,6 +99,9 @@ and may also include:
79
99
  * ``next_item`` for the concrete target
80
100
  * ``commands`` for ordered command hints with one primary command
81
101
  * ``progress`` for question, todo, or validation queues
102
+ * ``template_command`` plus ``required_plan_fields`` and
103
+ ``recommended_plan_fields`` when the next step is regenerating a plan from
104
+ answered questions
82
105
 
83
106
  Agents should inspect ``next_item``, prefer ``next_command`` when it is safe,
84
107
  avoid inventing question answers, and never mark todos done without evidence.
@@ -86,6 +109,39 @@ avoid inventing question answers, and never mark todos done without evidence.
86
109
  When a task is in ``failed_validation``, ``next-action`` should direct agents
87
110
  back to implementation with ``taskledger implement restart --summary SUMMARY``.
88
111
 
112
+ When a task persists ``planning``, ``implementing``, or ``validating`` as its
113
+ status but ``active_stage`` is missing, ``next-action`` must not report
114
+ ``The task is cancelled.`` For an orphaned implementation with a still-running
115
+ latest implementation run and no active lock, it should direct agents to
116
+ ``taskledger implement resume --task TASK_REF --reason "..."``.
117
+ For an approved task with a non-implementation run still marked running,
118
+ ``next-action`` must not direct agents to ``taskledger implement start``.
119
+ It should report a repair-oriented action and point to ``taskledger doctor``.
120
+ Truly cancelled tasks recover through ``taskledger task uncancel --reason "..."``
121
+ to a durable non-active stage rather than directly re-entering an active stage.
122
+
123
+ Run and lock repair
124
+ -------------------
125
+
126
+ ``taskledger doctor`` and ``taskledger doctor locks`` report running runs without
127
+ matching active locks. Orphaned running planning runs can be finished only
128
+ through an explicit repair command with a reason:
129
+
130
+ .. code-block:: bash
131
+
132
+ taskledger repair run --task TASK_REF --run RUN_ID --reason "Planning was already completed."
133
+
134
+ The repair command refuses to finish non-planning runs, non-running runs, or
135
+ runs that still have a matching active lock.
136
+
137
+ Post-completion follow-up deltas
138
+ --------------------------------
139
+
140
+ ``taskledger task follow-up PARENT_REF TITLE`` is the supported path for small
141
+ post-completion changes. It requires a ``done`` parent task, creates a new draft
142
+ child task with ``parent_task_id`` and ``parent_relation=follow_up``, and keeps
143
+ the parent task terminal.
144
+
89
145
  Human monitoring UI
90
146
  -------------------
91
147
 
@@ -279,13 +279,32 @@ After validation passes, close the task and inspect final state:
279
279
  taskledger task dossier --format markdown
280
280
  taskledger handoff create --mode validation --summary "Parser fix is implemented and validated."
281
281
  taskledger handoff show HANDOFF_ID --format text
282
- taskledger task close --summary "Fixed parser delimiter handling and validated parser regressions."
282
+ taskledger task close --note "Fixed parser delimiter handling and validated parser regressions."
283
+ taskledger release tag 0.4.2 --at-task parser-fix --note "0.4.2 released."
283
284
  taskledger task show
284
285
  taskledger status --full
285
286
  taskledger doctor
286
287
 
287
- ``task close`` marks the task done. The dossier and handoff commands preserve a
288
- fresh-context summary for future agents or reviewers.
288
+ After validation passes, the task is in ``done`` state. ``task close`` is a
289
+ final acknowledgement command for an already-done task. Release boundaries are
290
+ tracked by ``taskledger release tag``. The dossier and handoff commands preserve
291
+ a fresh-context summary for future agents or reviewers.
292
+
293
+ Post-completion follow-up deltas
294
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
295
+
296
+ When the original task is complete and a later small delta is needed, keep the
297
+ parent task closed and create a new follow-up child task:
298
+
299
+ .. code-block:: bash
300
+
301
+ taskledger task follow-up parser-fix "Rename parser error copy" --description "Small post-completion delta." --activate
302
+ taskledger plan start
303
+ taskledger plan upsert --file ./plan.md
304
+ taskledger plan accept --version 1 --note "Approved tiny follow-up delta."
305
+
306
+ Use the normal lifecycle on the follow-up task. Do not reopen the completed
307
+ parent task for ordinary deltas.
289
308
 
290
309
  11. Recovery And Maintenance Commands
291
310
  -------------------------------------
@@ -298,6 +317,8 @@ cycle:
298
317
  taskledger lock show
299
318
  taskledger doctor locks
300
319
  taskledger lock break --reason "Recover stale planning lock."
320
+ taskledger implement resume --reason "Reacquire implementation lock for existing running run."
321
+ taskledger task uncancel --reason "Restore the task to a safe durable stage."
301
322
  taskledger repair index
302
323
  taskledger repair task --reason "Inspect task record after manual edit."
303
324
  taskledger reindex
@@ -305,4 +326,10 @@ cycle:
305
326
  taskledger snapshot ./taskledger-snapshot --include-bodies --include-run-artifacts
306
327
 
307
328
  Locks are never cleared silently. Use ``lock break`` only after inspecting the
308
- lock and recording a reason.
329
+ lock and recording a reason. If a broken stale lock leaves an implementation run
330
+ still marked ``running``, continue with ``implement resume`` instead of starting a
331
+ new implementation run. If a task is truly ``cancelled``, use ``task uncancel``
332
+ to restore a safe durable stage before re-entering planning, implementation, or
333
+ validation through the normal stage-specific commands. After ``task uncancel``,
334
+ run ``next-action`` again; if it reports ``implement-resume``, reacquire the
335
+ existing implementation run rather than running ``implement start``.
@@ -11,7 +11,7 @@ Supported CLI groups
11
11
  --------------------
12
12
 
13
13
  - ``task``, ``plan``, ``question``, ``implement``, ``validate``, ``todo``
14
- - ``intro``, ``file``, ``link``, ``require``, ``lock``, ``handoff``
14
+ - ``intro``, ``file``, ``link``, ``require``, ``release``, ``lock``, ``handoff``
15
15
  - ``doctor``, ``repair``, ``next-action``, ``can``, ``reindex``
16
16
  - ``init``, ``status``, ``export``, ``import``, ``snapshot``
17
17
  - ``context``, ``view``, ``serve``, ``search``, ``grep``, ``symbols``, ``deps``
@@ -20,18 +20,26 @@ Supported CLI groups
20
20
  keep using the CLI and JSON command surface for automation.
21
21
 
22
22
  The supported implementation lifecycle includes ``implement restart --summary
23
- "..."`` when a task is in ``failed_validation``.
23
+ "..."`` when a task is in ``failed_validation`` and ``implement resume --reason
24
+ "..."`` when an existing running implementation run has lost its lock.
25
+
26
+ Small post-completion deltas use ``task follow-up PARENT_REF TITLE`` to create a
27
+ new child task instead of reopening a ``done`` task.
28
+
29
+ Release boundaries are tracked separately from task lifecycle state with
30
+ ``release tag`` and ``release changelog``.
24
31
 
25
32
  question subcommands
26
33
  --------------------
27
34
 
28
35
  - ``question add``, ``question list [--status STATUS]``, ``question answers [--format markdown|json]``
36
+ - ``question add-many [--text TEXT|--yaml-file PATH] [--required-for-plan]``
29
37
  - ``question answer``, ``question answer-many``, ``question dismiss``, ``question open``, ``question status``
30
38
 
31
39
  plan subcommands
32
40
  ----------------
33
41
 
34
- - ``plan start``, ``plan propose``, ``plan upsert``, ``plan lint``, ``plan approve``, ``plan accept``, ``plan reject``, ``plan show``, ``plan diff``
42
+ - ``plan start``, ``plan propose``, ``plan template``, ``plan upsert``, ``plan lint``, ``plan approve``, ``plan accept``, ``plan reject``, ``plan show``, ``plan diff``
35
43
  - ``plan regenerate --from-answers``, ``plan materialize-todos``, ``plan command -- ...``
36
44
 
37
45
  todo subcommands
@@ -51,11 +59,14 @@ Supported Python API modules
51
59
  - ``taskledger.api.introductions``
52
60
  - ``taskledger.api.locks``
53
61
  - ``taskledger.api.handoff``
62
+ - ``taskledger.api.releases``
54
63
  - ``taskledger.api.search``
55
64
 
56
65
  ``taskledger.api.task_runs`` includes the public lifecycle helpers
57
- ``start_implementation``, ``restart_implementation``, ``start_validation``, and
58
- ``finish_validation``.
66
+ ``start_implementation``, ``restart_implementation``, ``resume_implementation``,
67
+ ``start_validation``, and ``finish_validation``. ``taskledger.api.tasks`` also
68
+ exposes ``uncancel_task`` for restoring truly cancelled tasks to a safe durable
69
+ stage.
59
70
 
60
71
  Removed legacy surfaces
61
72
  -----------------------