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/cli_actor.py
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Actor identity CLI commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Annotated
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from taskledger.cli_common import (
|
|
10
|
+
cli_state_from_context,
|
|
11
|
+
emit_payload,
|
|
12
|
+
resolve_workspace_root,
|
|
13
|
+
)
|
|
14
|
+
from taskledger.domain.models import ActiveActorState, ActiveHarnessState
|
|
15
|
+
from taskledger.domain.states import (
|
|
16
|
+
normalize_actor_role,
|
|
17
|
+
normalize_actor_type,
|
|
18
|
+
normalize_harness_kind,
|
|
19
|
+
)
|
|
20
|
+
from taskledger.services.actors import resolve_actor, resolve_harness
|
|
21
|
+
from taskledger.storage.task_store import (
|
|
22
|
+
clear_actor_state,
|
|
23
|
+
clear_harness_state,
|
|
24
|
+
save_actor_state,
|
|
25
|
+
save_harness_state,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
app = typer.Typer(help="Actor identity commands.")
|
|
29
|
+
harness_app = typer.Typer(help="Harness identity commands.")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@app.command(name="whoami")
|
|
33
|
+
def whoami_cmd(ctx: typer.Context) -> None:
|
|
34
|
+
"""Show current actor and harness identity."""
|
|
35
|
+
state = cli_state_from_context(ctx)
|
|
36
|
+
workspace_root = resolve_workspace_root(state.cwd)
|
|
37
|
+
|
|
38
|
+
actor = resolve_actor(workspace_root=workspace_root)
|
|
39
|
+
harness = resolve_harness(workspace_root=workspace_root)
|
|
40
|
+
|
|
41
|
+
payload = {
|
|
42
|
+
"kind": "taskledger_actor_identity",
|
|
43
|
+
"actor": actor.to_dict(),
|
|
44
|
+
"harness": harness.to_dict(),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
human_lines = [
|
|
48
|
+
f"Actor: {actor.actor_type}:{actor.actor_name}",
|
|
49
|
+
]
|
|
50
|
+
if actor.role:
|
|
51
|
+
human_lines.append(f"Role: {actor.role}")
|
|
52
|
+
if actor.tool:
|
|
53
|
+
human_lines.append(f"Tool: {actor.tool}")
|
|
54
|
+
if actor.session_id:
|
|
55
|
+
human_lines.append(f"Session: {actor.session_id}")
|
|
56
|
+
human_lines.extend(
|
|
57
|
+
[
|
|
58
|
+
f"Harness: {harness.name} ({harness.kind})",
|
|
59
|
+
]
|
|
60
|
+
)
|
|
61
|
+
if harness.session_id:
|
|
62
|
+
human_lines.append(f"Harness Session: {harness.session_id}")
|
|
63
|
+
|
|
64
|
+
emit_payload(
|
|
65
|
+
ctx,
|
|
66
|
+
payload,
|
|
67
|
+
human="\n".join(human_lines),
|
|
68
|
+
result_type="actor_identity",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@app.command(name="set")
|
|
73
|
+
def actor_set_cmd(
|
|
74
|
+
ctx: typer.Context,
|
|
75
|
+
actor_type: Annotated[
|
|
76
|
+
str,
|
|
77
|
+
typer.Option("--type", help="Actor type: agent, user, or system."),
|
|
78
|
+
],
|
|
79
|
+
actor_name: Annotated[
|
|
80
|
+
str,
|
|
81
|
+
typer.Option("--name", help="Actor name."),
|
|
82
|
+
],
|
|
83
|
+
role: Annotated[
|
|
84
|
+
str | None,
|
|
85
|
+
typer.Option("--role", help="Actor role."),
|
|
86
|
+
] = None,
|
|
87
|
+
tool: Annotated[
|
|
88
|
+
str | None,
|
|
89
|
+
typer.Option("--tool", help="Tool name."),
|
|
90
|
+
] = None,
|
|
91
|
+
session_id: Annotated[
|
|
92
|
+
str | None,
|
|
93
|
+
typer.Option("--session-id", help="Session identifier."),
|
|
94
|
+
] = None,
|
|
95
|
+
) -> None:
|
|
96
|
+
"""Set the stored actor identity."""
|
|
97
|
+
state = cli_state_from_context(ctx)
|
|
98
|
+
workspace_root = resolve_workspace_root(state.cwd)
|
|
99
|
+
|
|
100
|
+
normalized_type = normalize_actor_type(actor_type)
|
|
101
|
+
normalized_role = normalize_actor_role(role) if role else None
|
|
102
|
+
|
|
103
|
+
actor_state = ActiveActorState(
|
|
104
|
+
actor_type=normalized_type,
|
|
105
|
+
actor_name=actor_name,
|
|
106
|
+
role=normalized_role,
|
|
107
|
+
tool=tool,
|
|
108
|
+
session_id=session_id,
|
|
109
|
+
)
|
|
110
|
+
save_actor_state(workspace_root, actor_state)
|
|
111
|
+
|
|
112
|
+
payload = {
|
|
113
|
+
"kind": "actor_set",
|
|
114
|
+
"actor": actor_state.to_dict(),
|
|
115
|
+
}
|
|
116
|
+
human_lines = [
|
|
117
|
+
f"Actor set: {actor_state.actor_type}:{actor_state.actor_name}",
|
|
118
|
+
]
|
|
119
|
+
if actor_state.role:
|
|
120
|
+
human_lines.append(f"Role: {actor_state.role}")
|
|
121
|
+
|
|
122
|
+
emit_payload(ctx, payload, human="\n".join(human_lines), result_type="actor_set")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@app.command(name="clear")
|
|
126
|
+
def actor_clear_cmd(ctx: typer.Context) -> None:
|
|
127
|
+
"""Clear the stored actor identity."""
|
|
128
|
+
state = cli_state_from_context(ctx)
|
|
129
|
+
workspace_root = resolve_workspace_root(state.cwd)
|
|
130
|
+
|
|
131
|
+
cleared = clear_actor_state(workspace_root)
|
|
132
|
+
|
|
133
|
+
payload = {
|
|
134
|
+
"kind": "actor_clear",
|
|
135
|
+
"cleared": cleared.to_dict() if cleared else None,
|
|
136
|
+
}
|
|
137
|
+
human = "Actor cleared." if cleared else "No stored actor to clear."
|
|
138
|
+
|
|
139
|
+
emit_payload(ctx, payload, human=human, result_type="actor_clear")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
@harness_app.command(name="set")
|
|
143
|
+
def harness_set_cmd(
|
|
144
|
+
ctx: typer.Context,
|
|
145
|
+
name: Annotated[
|
|
146
|
+
str,
|
|
147
|
+
typer.Option("--name", help="Harness name."),
|
|
148
|
+
],
|
|
149
|
+
kind: Annotated[
|
|
150
|
+
str | None,
|
|
151
|
+
typer.Option("--kind", help="Harness kind."),
|
|
152
|
+
] = None,
|
|
153
|
+
session_id: Annotated[
|
|
154
|
+
str | None,
|
|
155
|
+
typer.Option("--session-id", help="Session identifier."),
|
|
156
|
+
] = None,
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Set the stored harness identity."""
|
|
159
|
+
state = cli_state_from_context(ctx)
|
|
160
|
+
workspace_root = resolve_workspace_root(state.cwd)
|
|
161
|
+
|
|
162
|
+
normalized_kind = normalize_harness_kind(kind) if kind else "unknown"
|
|
163
|
+
|
|
164
|
+
harness_state = ActiveHarnessState(
|
|
165
|
+
name=name,
|
|
166
|
+
kind=normalized_kind,
|
|
167
|
+
session_id=session_id,
|
|
168
|
+
)
|
|
169
|
+
save_harness_state(workspace_root, harness_state)
|
|
170
|
+
|
|
171
|
+
payload = {
|
|
172
|
+
"kind": "harness_set",
|
|
173
|
+
"harness": harness_state.to_dict(),
|
|
174
|
+
}
|
|
175
|
+
human_lines = [
|
|
176
|
+
f"Harness set: {harness_state.name} ({harness_state.kind})",
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
emit_payload(ctx, payload, human="\n".join(human_lines), result_type="harness_set")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@harness_app.command(name="clear")
|
|
183
|
+
def harness_clear_cmd(ctx: typer.Context) -> None:
|
|
184
|
+
"""Clear the stored harness identity."""
|
|
185
|
+
state = cli_state_from_context(ctx)
|
|
186
|
+
workspace_root = resolve_workspace_root(state.cwd)
|
|
187
|
+
|
|
188
|
+
cleared = clear_harness_state(workspace_root)
|
|
189
|
+
|
|
190
|
+
payload = {
|
|
191
|
+
"kind": "harness_clear",
|
|
192
|
+
"cleared": cleared.to_dict() if cleared else None,
|
|
193
|
+
}
|
|
194
|
+
human = "Harness cleared." if cleared else "No stored harness to clear."
|
|
195
|
+
|
|
196
|
+
emit_payload(ctx, payload, human=human, result_type="harness_clear")
|