taskledger 0.1.0__py3-none-any.whl

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 (67) hide show
  1. taskledger/__init__.py +5 -0
  2. taskledger/__main__.py +6 -0
  3. taskledger/_version.py +24 -0
  4. taskledger/api/__init__.py +13 -0
  5. taskledger/api/handoff.py +247 -0
  6. taskledger/api/introductions.py +9 -0
  7. taskledger/api/locks.py +4 -0
  8. taskledger/api/plans.py +31 -0
  9. taskledger/api/project.py +185 -0
  10. taskledger/api/questions.py +19 -0
  11. taskledger/api/search.py +87 -0
  12. taskledger/api/task_runs.py +38 -0
  13. taskledger/api/tasks.py +61 -0
  14. taskledger/cli.py +600 -0
  15. taskledger/cli_actor.py +196 -0
  16. taskledger/cli_common.py +617 -0
  17. taskledger/cli_implement.py +409 -0
  18. taskledger/cli_migrate.py +328 -0
  19. taskledger/cli_misc.py +984 -0
  20. taskledger/cli_plan.py +478 -0
  21. taskledger/cli_question.py +350 -0
  22. taskledger/cli_task.py +257 -0
  23. taskledger/cli_validate.py +285 -0
  24. taskledger/command_inventory.py +125 -0
  25. taskledger/domain/__init__.py +2 -0
  26. taskledger/domain/models.py +1697 -0
  27. taskledger/domain/policies.py +542 -0
  28. taskledger/domain/states.py +320 -0
  29. taskledger/errors.py +165 -0
  30. taskledger/exchange.py +343 -0
  31. taskledger/ids.py +19 -0
  32. taskledger/py.typed +0 -0
  33. taskledger/search.py +349 -0
  34. taskledger/services/__init__.py +1 -0
  35. taskledger/services/actors.py +245 -0
  36. taskledger/services/dashboard.py +306 -0
  37. taskledger/services/doctor.py +435 -0
  38. taskledger/services/handoff.py +1029 -0
  39. taskledger/services/handoff_lifecycle.py +154 -0
  40. taskledger/services/navigation.py +930 -0
  41. taskledger/services/phase5_lock_transfer.py +96 -0
  42. taskledger/services/plan_lint.py +397 -0
  43. taskledger/services/serve_read_model.py +852 -0
  44. taskledger/services/tasks.py +4224 -0
  45. taskledger/services/validation.py +221 -0
  46. taskledger/services/web_dashboard.py +1742 -0
  47. taskledger/storage/__init__.py +39 -0
  48. taskledger/storage/atomic.py +57 -0
  49. taskledger/storage/common.py +90 -0
  50. taskledger/storage/events.py +98 -0
  51. taskledger/storage/frontmatter.py +57 -0
  52. taskledger/storage/indexes.py +42 -0
  53. taskledger/storage/init.py +187 -0
  54. taskledger/storage/locks.py +83 -0
  55. taskledger/storage/meta.py +103 -0
  56. taskledger/storage/migrations.py +207 -0
  57. taskledger/storage/paths.py +166 -0
  58. taskledger/storage/project_config.py +393 -0
  59. taskledger/storage/repos.py +256 -0
  60. taskledger/storage/task_store.py +836 -0
  61. taskledger/timeutils.py +7 -0
  62. taskledger-0.1.0.dist-info/METADATA +411 -0
  63. taskledger-0.1.0.dist-info/RECORD +67 -0
  64. taskledger-0.1.0.dist-info/WHEEL +5 -0
  65. taskledger-0.1.0.dist-info/entry_points.txt +2 -0
  66. taskledger-0.1.0.dist-info/licenses/LICENSE +201 -0
  67. taskledger-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime, timezone
4
+
5
+
6
+ def utc_now_iso() -> str:
7
+ return datetime.now(timezone.utc).isoformat()
@@ -0,0 +1,411 @@
1
+ Metadata-Version: 2.4
2
+ Name: taskledger
3
+ Version: 0.1.0
4
+ Summary: Durable project-state storage and CLI for coding workflows
5
+ Author: Taskledger Contributors
6
+ Maintainer: Holger Nahrstaedt
7
+ License-Expression: Apache-2.0
8
+ Project-URL: Homepage, https://github.com/holgern/taskledger
9
+ Project-URL: Repository, https://github.com/holgern/taskledger
10
+ Project-URL: Issues, https://github.com/holgern/taskledger/issues
11
+ Project-URL: Changelog, https://github.com/holgern/taskledger/releases
12
+ Keywords: cli,durable-state,project-state,developer-tools,workflows
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Operating System :: MacOS :: MacOS X
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Software Development
25
+ Classifier: Topic :: Utilities
26
+ Requires-Python: >=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: typer
30
+ Requires-Dist: PyYAML
31
+ Requires-Dist: tomli; python_version < "3.11"
32
+ Provides-Extra: dev
33
+ Requires-Dist: build; extra == "dev"
34
+ Requires-Dist: mypy; extra == "dev"
35
+ Requires-Dist: pytest; extra == "dev"
36
+ Requires-Dist: ruff; extra == "dev"
37
+ Requires-Dist: twine; extra == "dev"
38
+ Requires-Dist: types-PyYAML; extra == "dev"
39
+ Provides-Extra: rich
40
+ Requires-Dist: rich; extra == "rich"
41
+ Dynamic: license-file
42
+
43
+ # taskledger
44
+
45
+ `taskledger` is a task-first durable state layer for staged coding work. It keeps
46
+ project-local configuration in `taskledger.toml` at the workspace root and stores
47
+ plans, approval state, implementation logs, validation results, locks, and
48
+ fresh-context handoffs under a configurable `taskledger_dir` (default:
49
+ `.taskledger/` beside that config file).
50
+
51
+ ## Canonical workflow
52
+
53
+ ```text
54
+ task -> plan -> approval -> implement -> validate -> done
55
+ ```
56
+
57
+ The supported command surface is organized as:
58
+
59
+ **Core workflow:**
60
+
61
+ - `task`, `plan`, `question`, `implement`, `validate`, `todo`
62
+
63
+ **Context and decision-making:**
64
+
65
+ - `intro`, `file`, `link`, `require`, `handoff`
66
+
67
+ **Operations:**
68
+
69
+ - `context`, `next-action`, `can`, `search`, `grep`, `symbols`, `deps`, `actor`, `view`, `serve`
70
+
71
+ **Repair and inspection:**
72
+
73
+ - `lock`, `doctor`, `repair`, `reindex`
74
+
75
+ **Project lifecycle:**
76
+
77
+ - `init`, `status`, `export`, `import`, `snapshot`
78
+
79
+ ## Install
80
+
81
+ ```bash
82
+ python -m pip install -e .
83
+ python -m pip install -e ".[dev]"
84
+ ```
85
+
86
+ ## Quick start
87
+
88
+ Initialize durable state in the current workspace:
89
+
90
+ ```bash
91
+ taskledger init
92
+ # or keep storage outside the source repo
93
+ taskledger init --taskledger-dir /mnt/cloud/taskledger/my-repo
94
+ # or point at another workspace explicitly
95
+ taskledger --root /path/to/repo init
96
+ ```
97
+
98
+ `init` writes `taskledger.toml` in the workspace root. By default that config
99
+ points at `.taskledger/`, but `--taskledger-dir` can move durable state to an
100
+ external directory without nesting another `.taskledger` inside it.
101
+
102
+ Create and activate a task, ask required planning questions, regenerate the
103
+ plan from answers, approve it, implement todos with evidence, and validate it:
104
+
105
+ ```bash
106
+ taskledger task create "Rewrite V2" --slug rewrite-v2 --description "Migrate to the task-first design."
107
+ taskledger task activate rewrite-v2 --reason "Start planning"
108
+ 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."
111
+ taskledger question status
112
+ taskledger plan upsert --from-answers --file ./plan.md
113
+ taskledger plan lint --version 1
114
+ taskledger plan accept --version 1 --note "Ready."
115
+
116
+ taskledger next-action
117
+ taskledger --json next-action
118
+
119
+ taskledger context --for implementation --format markdown
120
+ taskledger implement start
121
+ taskledger implement checklist
122
+ taskledger implement change --path taskledger/storage/task_store.py --kind edit --summary "Normalized v2 markdown storage."
123
+ taskledger todo done todo-0001 --evidence "Updated taskledger/storage/task_store.py"
124
+ taskledger implement finish --summary "Implemented the approved plan."
125
+
126
+ taskledger context --for validation --format markdown
127
+ taskledger validate start
128
+ taskledger validate status
129
+ taskledger validate check --criterion ac-0001 --status pass --evidence "pytest -q tests/test_taskledger_v2_cli.py"
130
+ taskledger validate finish --result passed --summary "Validated the rewrite."
131
+ ```
132
+
133
+ If validation finds an implementation bug, keep the accepted plan and restart
134
+ implementation explicitly:
135
+
136
+ ```bash
137
+ taskledger validate finish --result failed --summary "Parser edge case still fails."
138
+ taskledger next-action
139
+ taskledger context --for implementation --format markdown
140
+ taskledger implement restart --summary "Fix failed validation findings."
141
+ ```
142
+
143
+ If validation finds an implementation bug, keep the accepted plan and restart
144
+ implementation explicitly:
145
+
146
+ ```bash
147
+ taskledger validate finish --result failed --summary "Parser edge case still fails."
148
+ taskledger next-action
149
+ taskledger context --for implementation --format markdown
150
+ taskledger implement restart --summary "Fix failed validation findings."
151
+ ```
152
+
153
+ `taskledger next-action` is the preferred fresh-context entrypoint. It stays
154
+ read-only and points at the next concrete question, todo, criterion, or repair
155
+ step.
156
+
157
+ Human output example:
158
+
159
+ ```text
160
+ todo-work: Implementation is in progress; 1 todos remain.
161
+ Next todo: todo-0001 -- Update next-action JSON payload.
162
+ Command: taskledger todo show todo-0001
163
+ Mark todo done after evidence exists: taskledger todo done todo-0001 --evidence "..."
164
+ Progress: 0/1 todos done
165
+ ```
166
+
167
+ JSON result example:
168
+
169
+ ```json
170
+ {
171
+ "kind": "task_next_action",
172
+ "action": "todo-work",
173
+ "next_command": "taskledger todo show todo-0001",
174
+ "next_item": {
175
+ "kind": "todo",
176
+ "id": "todo-0001",
177
+ "text": "Update next-action JSON payload.",
178
+ "validation_hint": "Run: pytest tests/test_todo_implementation_gate.py -q; Expected: pass",
179
+ "done_command_hint": "taskledger todo done todo-0001 --evidence \"...\""
180
+ },
181
+ "commands": [
182
+ {
183
+ "kind": "inspect",
184
+ "label": "Show next todo",
185
+ "command": "taskledger todo show todo-0001",
186
+ "primary": true
187
+ },
188
+ {
189
+ "kind": "complete",
190
+ "label": "Mark todo done after evidence exists",
191
+ "command": "taskledger todo done todo-0001 --evidence \"...\"",
192
+ "primary": false
193
+ }
194
+ ],
195
+ "progress": {
196
+ "todos": {
197
+ "total": 1,
198
+ "done": 0,
199
+ "open": 1,
200
+ "open_ids": ["todo-0001"]
201
+ }
202
+ },
203
+ "blocking": []
204
+ }
205
+ ```
206
+
207
+ ## Compact implementation loop
208
+
209
+ For routine same-session implementation, prefer `next-action` and the single next
210
+ todo over broad generated context:
211
+
212
+ ```bash
213
+ taskledger --json next-action
214
+ taskledger --json todo next
215
+ taskledger todo show todo-0003
216
+ # implement only that todo
217
+ pytest tests/...
218
+ taskledger todo done todo-0003 --evidence "pytest tests/... passed"
219
+ taskledger --json next-action
220
+ ```
221
+
222
+ Rules for agents:
223
+
224
+ - Prefer `next-action` and `todo next` over generated context during normal work.
225
+ - Use the todo `validation_hint` before marking a todo done.
226
+ - Record concise evidence with `todo done`.
227
+ - Do not create handoffs or context bundles unless the user asked to switch harness or session.
228
+
229
+ ## Human monitoring UI
230
+
231
+ `taskledger serve` starts a read-only local dashboard for humans monitoring task
232
+ state. It now emphasizes the active task, next action, progress, blockers, and
233
+ compact task browsing while staying local-only, read-only, and dependency-free.
234
+ The MVP still binds to localhost only, refreshes with read-only JSON polling,
235
+ and exposes no browser mutation endpoints.
236
+
237
+ ```bash
238
+ taskledger serve
239
+ taskledger serve --open
240
+ taskledger serve --task rewrite-v2 --refresh-ms 2000
241
+ ```
242
+
243
+ Agents should keep using `taskledger next-action`, `taskledger todo next`, and
244
+ `--json` commands as the canonical automation interface for routine same-session
245
+ work. Reach for `context` or handoffs when the task actually needs a broader
246
+ fresh-context transfer.
247
+
248
+ ## Storage layout
249
+
250
+ `taskledger` keeps project-local configuration in the workspace root and durable
251
+ records under the configured storage root:
252
+
253
+ ```text
254
+ taskledger.toml
255
+ .taskledger/
256
+ intros/
257
+ tasks/
258
+ events/
259
+ indexes/ # optional derived caches and registries
260
+ ```
261
+
262
+ Markdown files are canonical. Task, plan, and run listings scan those records
263
+ directly. JSON files under `.taskledger/indexes/` are optional derived caches or
264
+ registries and are not required for task correctness.
265
+
266
+ You can also point `taskledger.toml` at an external storage root:
267
+
268
+ ```bash
269
+ taskledger init --taskledger-dir /mnt/cloud/taskledger/project-a
270
+ ```
271
+
272
+ ```text
273
+ /home/me/src/project-a/taskledger.toml
274
+ /mnt/cloud/taskledger/project-a/storage.yaml
275
+ /mnt/cloud/taskledger/project-a/tasks/
276
+ /mnt/cloud/taskledger/project-a/events/
277
+ /mnt/cloud/taskledger/project-a/indexes/
278
+ ```
279
+
280
+ Use one `taskledger_dir` per source project. Do not share one storage directory
281
+ across unrelated repositories.
282
+
283
+ ## JSON output
284
+
285
+ Use `--json` for machine-readable payloads:
286
+
287
+ ```bash
288
+ taskledger --json status --full
289
+ taskledger --json task active
290
+ taskledger --json task show
291
+ taskledger --json context --for validation --format json
292
+ ```
293
+
294
+ Example status payload:
295
+
296
+ ```json
297
+ {
298
+ "ok": true,
299
+ "command": "status",
300
+ "result": {
301
+ "kind": "taskledger_status",
302
+ "workspace_root": "/home/me/src/project-a",
303
+ "config_path": "/home/me/src/project-a/taskledger.toml",
304
+ "taskledger_dir": "/home/me/src/project-a/.taskledger",
305
+ "project_dir": "/home/me/src/project-a/.taskledger",
306
+ "counts": {
307
+ "tasks": 1,
308
+ "introductions": 0,
309
+ "plans": 1,
310
+ "questions": 1,
311
+ "runs": 2,
312
+ "changes": 1,
313
+ "locks": 0
314
+ },
315
+ "active_task": null,
316
+ "healthy": true
317
+ },
318
+ "events": []
319
+ }
320
+ ```
321
+
322
+ ## Handoff-driven work
323
+
324
+ Fresh-context handoff is a primary feature:
325
+
326
+ ```bash
327
+ taskledger context --for planning --format markdown
328
+ taskledger context --for implementation --format markdown
329
+ taskledger context --for validation --format json
330
+ taskledger task dossier --format markdown
331
+ taskledger handoff create --mode implementation --intended-actor agent --intended-harness codex
332
+ taskledger handoff claim handoff-0001
333
+ taskledger handoff close handoff-0001 --reason "Implementation started."
334
+ ```
335
+
336
+ ## Fresh-worker contexts
337
+
338
+ Use focused contexts when handing one todo or one review run to a fresh worker:
339
+
340
+ ```bash
341
+ taskledger context --for implementer --todo todo-0003
342
+ taskledger context --for spec-reviewer --run run-0008
343
+ taskledger context --for code-reviewer --run run-0008
344
+ taskledger handoff create --mode implementation --todo todo-0003
345
+ taskledger handoff show handoff-0001 --format markdown
346
+ ```
347
+
348
+ `handoff create` now stores the generated Markdown context snapshot in the handoff
349
+ record so another harness can continue from the exact same input.
350
+
351
+ ## Multi-Actor Handoff Protocol
352
+
353
+ The handoff protocol enables safe work transitions between human and agent actors across different harnesses:
354
+
355
+ ### Features
356
+
357
+ - **Actor Identity**: Track WHO performs each stage (human, agent, system)
358
+ - **Harness Tracking**: Record FROM WHERE each stage ran (manual, Codex, OpenCode, etc.)
359
+ - **Handoff Records**: Explicitly hand off work with context and intent
360
+ - **Claim Protocol**: New actors claim handoffs before starting work
361
+ - **Lock Management**: Transfer or release locks during handoffs
362
+ - **Event Trail**: Full audit trail recording all state changes
363
+ - **Durable Records**: Markdown-first storage with YAML metadata
364
+
365
+ ### Quick Start
366
+
367
+ ```bash
368
+ # See your current identity
369
+ $ taskledger actor whoami
370
+
371
+ # Create a handoff
372
+ $ taskledger handoff create --task task-0001 --mode implementation --todo todo-0003
373
+
374
+ # Claim it
375
+ $ taskledger handoff claim handoff-0001 --task task-0001
376
+
377
+ # Show details
378
+ $ taskledger handoff show handoff-0001 --task task-0001 --format text
379
+
380
+ # Close when done
381
+ $ taskledger handoff close handoff-0001 --task task-0001 --reason "Continued."
382
+ ```
383
+
384
+ See [docs/usage.rst](docs/usage.rst) and
385
+ [skills/taskledger/SKILL.md](skills/taskledger/SKILL.md)
386
+ for task-first handoff guidance.
387
+
388
+ ## Export, import, and snapshots
389
+
390
+ ```bash
391
+ taskledger --json export
392
+ taskledger import ./taskledger-export.json --replace
393
+ taskledger snapshot ./artifacts
394
+ ```
395
+
396
+ ## Skill packaging
397
+
398
+ The canonical skill file lives at:
399
+
400
+ ```text
401
+ skills/taskledger/SKILL.md
402
+ ```
403
+
404
+ No additional `skills/taskledger/examples/` directory is required.
405
+
406
+ ## Development
407
+
408
+ ```bash
409
+ pytest -q
410
+ ruff check .
411
+ ```
@@ -0,0 +1,67 @@
1
+ taskledger/__init__.py,sha256=mz00ypklNGoOef9Sh6Iak2wpVytIbeU2xoYAjGSONpI,107
2
+ taskledger/__main__.py,sha256=uc72I0AlS0BgV48SQJCJMNTbqFjeDGKt7hISsQy7VIg,124
3
+ taskledger/_version.py,sha256=n_5vdJsPNu7wZ57LGuRL585uvll-hiuvZUBWzdG0RQU,520
4
+ taskledger/cli.py,sha256=6C2ZpEfO4-U7MVbRiocHZ9Y3uVLh0uStGlU1NnrtWsg,18115
5
+ taskledger/cli_actor.py,sha256=I_0nDrNrb6f78H10FKduMb0YZTLCdqjTQsznAPyTw4w,5532
6
+ taskledger/cli_common.py,sha256=RtuLsgBa1fQoJrFEd7LSQmi28xnlXtmCCLddzeB1jBM,20077
7
+ taskledger/cli_implement.py,sha256=GrVHzeEOzevyGSCytWG8VNuAyMagRugphInTEMXwgqo,14433
8
+ taskledger/cli_migrate.py,sha256=uv-1Upwy35oov9zG2eq1QeK0nF8vUztmy1UShvAYkHE,10571
9
+ taskledger/cli_misc.py,sha256=ueEejA19O_59q3kfIe7K3H8TaL5-3BY2LxCz5bubZnY,33704
10
+ taskledger/cli_plan.py,sha256=75Sm8CdBwFbNl52Gn3oklp5FUPNUyLUeQ-dYVS5X_SY,17388
11
+ taskledger/cli_question.py,sha256=2C1fkcoAD7ckf2tAmWLUH_wWpwQ037uzz_aNPhwHM-E,11324
12
+ taskledger/cli_task.py,sha256=sxU7dR4o6vKFnzRejjwYB3SzCpEJplunijAnu3Gixfg,9584
13
+ taskledger/cli_validate.py,sha256=0f-yG2d3yEbTAAcXokuKNjiM8mipchxpPRenreqHkCY,10104
14
+ taskledger/command_inventory.py,sha256=oYMrZzcsAtT16JSqOFBM_glCcAmncZYY9X9ZMxBL1oI,6940
15
+ taskledger/errors.py,sha256=mGAF42EneOERNzW9kxoNl46pr6BqZH2GIWAYZEoZZsI,4763
16
+ taskledger/exchange.py,sha256=1XMGU9D1lMm5gMb-Tk4JwxHgVketib2kKDX4Ew0USiY,12179
17
+ taskledger/ids.py,sha256=etcKDswR_4gJ15aRLJ81Oe37f6eh0Dd8gYYayYW6AdI,573
18
+ taskledger/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ taskledger/search.py,sha256=wvOpdRLtaYQ90t198LVQvP5wgWLeD56Nt5Echau4ICU,10741
20
+ taskledger/timeutils.py,sha256=Y6ilKrtygIPJApUe-q2sNu0Fckcp9Q-Y0QWi_TH-IhM,154
21
+ taskledger/api/__init__.py,sha256=6P28iq9eTAfMc5iZMOaDpvooOZ50A8dPKk1ok9q2cfo,188
22
+ taskledger/api/handoff.py,sha256=nQtQ8g3kONbOpnK12UphBaO0ymtoS5xtJFGRCOK8QkA,7405
23
+ taskledger/api/introductions.py,sha256=q6mI-UmyxxemGeqTNfAfTdLIJDShCQYvFl5h9LJqemU,281
24
+ taskledger/api/locks.py,sha256=onGwS2F179tL84aqDVmy4uOehrOFIbvn0ip6dApGcBs,206
25
+ taskledger/api/plans.py,sha256=tkCXqRdoLONenyEc53UWGfwEC22SakI-HXilfnGhJjY,648
26
+ taskledger/api/project.py,sha256=F5D6H29WaRs17xybGD036hHjFr76ytzbeu1Br4J1UPk,5868
27
+ taskledger/api/questions.py,sha256=pA2zDwKxwo_Attcb5x8Q-4NGcI2sNiN1DSr3T5maWE4,406
28
+ taskledger/api/search.py,sha256=KeuKiAv8aQ47DZUeLc2s4EzSYbwuU_t0xeym2NfD9fQ,1834
29
+ taskledger/api/task_runs.py,sha256=wR5JLT_QiWG5H4gmokU7RSQmZZZkBhg8J93IJpHYFDI,934
30
+ taskledger/api/tasks.py,sha256=cyG0Q0vVcraEKOJC1G6bLze8QZyM6RHPaREQrBQIXIs,1175
31
+ taskledger/domain/__init__.py,sha256=fjiP5OfsfbA52cNphQPkXORszOTJa7g86h51DoF3U-w,116
32
+ taskledger/domain/models.py,sha256=dIDII19b-KZnckqIs8EvGIWFSwp0q6ZpofUqVx2RjCg,68067
33
+ taskledger/domain/policies.py,sha256=QSjR4UcvwZskl5ixn4IH94KEPFHTqvX-244LJZqYuY0,16034
34
+ taskledger/domain/states.py,sha256=9oBazNbV7gmnfk08Pj_tfgOhoL0S6Jd-jvVBVIfv2dY,10221
35
+ taskledger/services/__init__.py,sha256=ZdqtjyWlxYxZ90QKbvPwtdwIveDeulhCZIT1yyBP1Mw,42
36
+ taskledger/services/actors.py,sha256=-vsaBvR9v3O5T5N0qe6gHZpUa8xMp9vCCLvQCPgD9sQ,7349
37
+ taskledger/services/dashboard.py,sha256=VXaOqYMqq8qut7N7O1Hmwn6mlNIyca339iu_RsXPxZE,9762
38
+ taskledger/services/doctor.py,sha256=iknb7wiVW04ucYprkzwJX3wkrQ_FtxiH2_xAOCUZPro,16720
39
+ taskledger/services/handoff.py,sha256=IM6jGqFmdcsuAWgAtewOMTTCtqNIzR0Byh7R0AJRx-A,35626
40
+ taskledger/services/handoff_lifecycle.py,sha256=PH9sTIdfw-yuKPO0tlc0zGxzDrh6S3vlGLmeRUJtt6A,5010
41
+ taskledger/services/navigation.py,sha256=2EOBPtd0HH6KRCrW6MPet6ujdMr3gQOCYxj4-UdyIaE,32565
42
+ taskledger/services/phase5_lock_transfer.py,sha256=boHl4BTgL77TOKKdWvvXicdx3HPOzcIII5hMvyPkQA8,2895
43
+ taskledger/services/plan_lint.py,sha256=wrpSh4aqz337btWu3J_d44tn2NXxpGT6E9VRYDAH5uI,12188
44
+ taskledger/services/serve_read_model.py,sha256=045_FOu0_--UthERyGeNuXio75sPJrWC67F5Xevov-E,30222
45
+ taskledger/services/tasks.py,sha256=FUsAbvrG74x-kkuHJPISv6NlxKXnKFfqjXu0yJLEAro,133761
46
+ taskledger/services/validation.py,sha256=rTORiah-cWjgu53c0vujYzHIGR9AYLQxCSfl9XeL0EU,7879
47
+ taskledger/services/web_dashboard.py,sha256=VrpAujIrEbiP791vBtQSUc79Kxm7twqJs4Y8crMLCOw,74055
48
+ taskledger/storage/__init__.py,sha256=K9PgqJ9RfkbPms28y8A0VzSMGwRpoChnRckTETxAvg8,995
49
+ taskledger/storage/atomic.py,sha256=wbjz9x_XUMbrZfqHMV02ROVpy8yZDYEHxJeZrtqmhYM,1791
50
+ taskledger/storage/common.py,sha256=XnKnF67O5ZxF8BHodxNJEaZC8XtOe9lNAJFBYdzPbhg,2666
51
+ taskledger/storage/events.py,sha256=PMwHop3_Dq3noxNe7jAdq7j6r9B3fw1X0mOU5KWyvSQ,3283
52
+ taskledger/storage/frontmatter.py,sha256=MmaoFsUxYiobWV74-aF0BUt4qBPKc1T4X7eRpon_cjw,1910
53
+ taskledger/storage/indexes.py,sha256=PF1L_LySVqjMmQk21pv51yA2dGKv3Na5wtTN_addpxI,1226
54
+ taskledger/storage/init.py,sha256=EY1M6CI6qHvcbyhUkf2oD1H383XxkrUBuGsPae-yGAM,6253
55
+ taskledger/storage/locks.py,sha256=bxUpWG_RFqgH9HERv0YRKkQH7V4HTnQTypCs6CdFY-4,2417
56
+ taskledger/storage/meta.py,sha256=r9UNeb8m-nRx6pEnhgrtQUHGEao5d_Uz6w616ZV1fBw,3819
57
+ taskledger/storage/migrations.py,sha256=W8kpFtMM5fmiazNHrTCW2AuVSdWRt7rTVDQpf8fo5Fs,6252
58
+ taskledger/storage/paths.py,sha256=Sqc4Q1n1OZaIaN2LwSo3_k12dry0TQ-v4qQDyUvzKKg,5521
59
+ taskledger/storage/project_config.py,sha256=XKD0jxxZbaaHOSPYOQ4qLZGxvZV63I4Q8jrc1JO9_iI,15288
60
+ taskledger/storage/repos.py,sha256=Nj5yZN-mqPplcLRKnyq0-35V2hEqc5SeitvcNxewkiU,8672
61
+ taskledger/storage/task_store.py,sha256=AVNd8aeASE4I2OQXDTmOe_nt71eCAc8ySRxsj6xNXFs,28588
62
+ taskledger-0.1.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
63
+ taskledger-0.1.0.dist-info/METADATA,sha256=iOZ4wJIRAKsGtGGUld6EQbJ4Z1EyK42J6fvDq3hEOg8,12542
64
+ taskledger-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
65
+ taskledger-0.1.0.dist-info/entry_points.txt,sha256=j_uWEaPMblrudLEeVvxFEU5eBuPkJR2JeMfOOsCwOBU,55
66
+ taskledger-0.1.0.dist-info/top_level.txt,sha256=PEC4fvOzGkYVL55VpQUETk_wPjyZsR8av89sd65NnIg,11
67
+ taskledger-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ taskledger = taskledger.cli:cli_main