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.
- taskledger/__init__.py +5 -0
- taskledger/__main__.py +6 -0
- taskledger/_version.py +24 -0
- taskledger/api/__init__.py +13 -0
- taskledger/api/handoff.py +247 -0
- taskledger/api/introductions.py +9 -0
- taskledger/api/locks.py +4 -0
- taskledger/api/plans.py +31 -0
- taskledger/api/project.py +185 -0
- taskledger/api/questions.py +19 -0
- taskledger/api/search.py +87 -0
- taskledger/api/task_runs.py +38 -0
- taskledger/api/tasks.py +61 -0
- taskledger/cli.py +600 -0
- taskledger/cli_actor.py +196 -0
- taskledger/cli_common.py +617 -0
- taskledger/cli_implement.py +409 -0
- taskledger/cli_migrate.py +328 -0
- taskledger/cli_misc.py +984 -0
- taskledger/cli_plan.py +478 -0
- taskledger/cli_question.py +350 -0
- taskledger/cli_task.py +257 -0
- taskledger/cli_validate.py +285 -0
- taskledger/command_inventory.py +125 -0
- taskledger/domain/__init__.py +2 -0
- taskledger/domain/models.py +1697 -0
- taskledger/domain/policies.py +542 -0
- taskledger/domain/states.py +320 -0
- taskledger/errors.py +165 -0
- taskledger/exchange.py +343 -0
- taskledger/ids.py +19 -0
- taskledger/py.typed +0 -0
- taskledger/search.py +349 -0
- taskledger/services/__init__.py +1 -0
- taskledger/services/actors.py +245 -0
- taskledger/services/dashboard.py +306 -0
- taskledger/services/doctor.py +435 -0
- taskledger/services/handoff.py +1029 -0
- taskledger/services/handoff_lifecycle.py +154 -0
- taskledger/services/navigation.py +930 -0
- taskledger/services/phase5_lock_transfer.py +96 -0
- taskledger/services/plan_lint.py +397 -0
- taskledger/services/serve_read_model.py +852 -0
- taskledger/services/tasks.py +4224 -0
- taskledger/services/validation.py +221 -0
- taskledger/services/web_dashboard.py +1742 -0
- taskledger/storage/__init__.py +39 -0
- taskledger/storage/atomic.py +57 -0
- taskledger/storage/common.py +90 -0
- taskledger/storage/events.py +98 -0
- taskledger/storage/frontmatter.py +57 -0
- taskledger/storage/indexes.py +42 -0
- taskledger/storage/init.py +187 -0
- taskledger/storage/locks.py +83 -0
- taskledger/storage/meta.py +103 -0
- taskledger/storage/migrations.py +207 -0
- taskledger/storage/paths.py +166 -0
- taskledger/storage/project_config.py +393 -0
- taskledger/storage/repos.py +256 -0
- taskledger/storage/task_store.py +836 -0
- taskledger/timeutils.py +7 -0
- taskledger-0.1.0.dist-info/METADATA +411 -0
- taskledger-0.1.0.dist-info/RECORD +67 -0
- taskledger-0.1.0.dist-info/WHEEL +5 -0
- taskledger-0.1.0.dist-info/entry_points.txt +2 -0
- taskledger-0.1.0.dist-info/licenses/LICENSE +201 -0
- taskledger-0.1.0.dist-info/top_level.txt +1 -0
taskledger/timeutils.py
ADDED
|
@@ -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,,
|