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
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Any, cast
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from taskledger.api.task_runs import (
|
|
8
|
+
add_validation_check,
|
|
9
|
+
finish_validation,
|
|
10
|
+
show_task_run,
|
|
11
|
+
start_validation,
|
|
12
|
+
validation_status,
|
|
13
|
+
waive_criterion,
|
|
14
|
+
)
|
|
15
|
+
from taskledger.cli_common import (
|
|
16
|
+
TaskOption,
|
|
17
|
+
cli_state_from_context,
|
|
18
|
+
emit_error,
|
|
19
|
+
emit_payload,
|
|
20
|
+
launch_error_exit_code,
|
|
21
|
+
resolve_cli_task,
|
|
22
|
+
)
|
|
23
|
+
from taskledger.errors import LaunchError
|
|
24
|
+
from taskledger.services.actors import resolve_actor, resolve_harness
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _render_validation_status(payload: dict[str, Any]) -> str:
|
|
28
|
+
"""Render validation gate report to human-readable text."""
|
|
29
|
+
lines = []
|
|
30
|
+
|
|
31
|
+
task_id = payload.get("task_id", "?")
|
|
32
|
+
task_slug = payload.get("task_slug", "?")
|
|
33
|
+
lines.append(f"Validation status for {task_slug} ({task_id})")
|
|
34
|
+
lines.append("")
|
|
35
|
+
|
|
36
|
+
run_id = payload.get("run_id", "?")
|
|
37
|
+
lines.append(f"Run: {run_id}")
|
|
38
|
+
lines.append("")
|
|
39
|
+
|
|
40
|
+
accepted_plan = payload.get("accepted_plan", {})
|
|
41
|
+
plan_version = accepted_plan.get("version", "none")
|
|
42
|
+
plan_status = accepted_plan.get("status", "none")
|
|
43
|
+
lines.append(f"Accepted plan: v{plan_version} {plan_status}")
|
|
44
|
+
|
|
45
|
+
implementation = payload.get("implementation", {})
|
|
46
|
+
impl_run_id = implementation.get("run_id", "none")
|
|
47
|
+
impl_status = implementation.get("status", "none")
|
|
48
|
+
lines.append(f"Implementation: {impl_run_id} {impl_status}")
|
|
49
|
+
lines.append("")
|
|
50
|
+
|
|
51
|
+
lines.append("Criteria:")
|
|
52
|
+
criteria = payload.get("criteria", [])
|
|
53
|
+
for crit in criteria:
|
|
54
|
+
crit_id = crit.get("id", "?")
|
|
55
|
+
mandatory = "[mandatory]" if crit.get("mandatory") else ""
|
|
56
|
+
latest_status = crit.get("latest_status", "not_run")
|
|
57
|
+
satisfied = crit.get("satisfied", False)
|
|
58
|
+
checkbox = "[x]" if satisfied else "[ ]"
|
|
59
|
+
text = crit.get("text", "")
|
|
60
|
+
lines.append(f" {checkbox} {crit_id} {mandatory} {latest_status}")
|
|
61
|
+
if text:
|
|
62
|
+
lines.append(f" {text}")
|
|
63
|
+
evidence = crit.get("evidence", [])
|
|
64
|
+
if evidence:
|
|
65
|
+
lines.append(f" evidence: {', '.join(evidence)}")
|
|
66
|
+
lines.append("")
|
|
67
|
+
|
|
68
|
+
todos = payload.get("todos", {})
|
|
69
|
+
open_todos = todos.get("open_mandatory", [])
|
|
70
|
+
if open_todos:
|
|
71
|
+
lines.append("Mandatory todos:")
|
|
72
|
+
for todo_id in open_todos:
|
|
73
|
+
lines.append(f" [ ] {todo_id}")
|
|
74
|
+
lines.append("")
|
|
75
|
+
|
|
76
|
+
dependencies = payload.get("dependencies", {})
|
|
77
|
+
dep_blockers = dependencies.get("blockers", [])
|
|
78
|
+
if dep_blockers:
|
|
79
|
+
lines.append("Dependencies:")
|
|
80
|
+
for blocker in dep_blockers:
|
|
81
|
+
lines.append(f" - {blocker}")
|
|
82
|
+
lines.append("")
|
|
83
|
+
|
|
84
|
+
can_finish = payload.get("can_finish_passed", False)
|
|
85
|
+
lines.append(f"Can finish passed: {'yes' if can_finish else 'no'}")
|
|
86
|
+
|
|
87
|
+
blockers = payload.get("blockers", [])
|
|
88
|
+
if blockers:
|
|
89
|
+
lines.append("")
|
|
90
|
+
lines.append("Blockers:")
|
|
91
|
+
for blocker in blockers:
|
|
92
|
+
kind = blocker.get("kind", "?")
|
|
93
|
+
ref = blocker.get("ref", "")
|
|
94
|
+
message = blocker.get("message", "")
|
|
95
|
+
hint = blocker.get("command_hint", "")
|
|
96
|
+
ref_str = f" {ref}" if ref else ""
|
|
97
|
+
lines.append(f" - {kind}{ref_str}: {message}")
|
|
98
|
+
if hint:
|
|
99
|
+
lines.append(f" {hint}")
|
|
100
|
+
|
|
101
|
+
return "\n".join(lines)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def register_validate_v2_commands(app: typer.Typer) -> None:
|
|
105
|
+
@app.command("start")
|
|
106
|
+
def start_command(
|
|
107
|
+
ctx: typer.Context,
|
|
108
|
+
task_ref: TaskOption = None,
|
|
109
|
+
actor: Annotated[
|
|
110
|
+
str | None,
|
|
111
|
+
typer.Option("--actor", help="Actor type: user, agent, or system."),
|
|
112
|
+
] = None,
|
|
113
|
+
actor_name: Annotated[
|
|
114
|
+
str | None,
|
|
115
|
+
typer.Option("--actor-name", help="Actor name."),
|
|
116
|
+
] = None,
|
|
117
|
+
actor_role: Annotated[
|
|
118
|
+
str | None,
|
|
119
|
+
typer.Option("--actor-role", help="Actor role in task lifecycle."),
|
|
120
|
+
] = None,
|
|
121
|
+
harness: Annotated[
|
|
122
|
+
str | None,
|
|
123
|
+
typer.Option("--harness", help="Harness name."),
|
|
124
|
+
] = None,
|
|
125
|
+
session_id: Annotated[
|
|
126
|
+
str | None,
|
|
127
|
+
typer.Option("--session-id", help="Session identifier."),
|
|
128
|
+
] = None,
|
|
129
|
+
) -> None:
|
|
130
|
+
state = cli_state_from_context(ctx)
|
|
131
|
+
try:
|
|
132
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
133
|
+
resolved_actor = resolve_actor(
|
|
134
|
+
actor_type=actor,
|
|
135
|
+
actor_name=actor_name,
|
|
136
|
+
role=actor_role,
|
|
137
|
+
session_id=session_id,
|
|
138
|
+
)
|
|
139
|
+
resolved_harness = resolve_harness(name=harness, session_id=session_id)
|
|
140
|
+
payload = start_validation(
|
|
141
|
+
state.cwd,
|
|
142
|
+
task.id,
|
|
143
|
+
actor=resolved_actor,
|
|
144
|
+
harness=resolved_harness,
|
|
145
|
+
)
|
|
146
|
+
except LaunchError as exc:
|
|
147
|
+
emit_error(ctx, exc)
|
|
148
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
149
|
+
emit_payload(ctx, payload, human=f"started validation {payload['run_id']}")
|
|
150
|
+
|
|
151
|
+
def _emit_check(
|
|
152
|
+
ctx: typer.Context,
|
|
153
|
+
*,
|
|
154
|
+
name: str | None,
|
|
155
|
+
criterion: str | None,
|
|
156
|
+
status: str,
|
|
157
|
+
details: str | None,
|
|
158
|
+
evidence: list[str] | None,
|
|
159
|
+
task_ref: str | None,
|
|
160
|
+
) -> None:
|
|
161
|
+
state = cli_state_from_context(ctx)
|
|
162
|
+
try:
|
|
163
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
164
|
+
run = add_validation_check(
|
|
165
|
+
state.cwd,
|
|
166
|
+
task.id,
|
|
167
|
+
name=name,
|
|
168
|
+
criterion_id=criterion,
|
|
169
|
+
status=status,
|
|
170
|
+
details=details,
|
|
171
|
+
evidence=tuple(evidence or ()),
|
|
172
|
+
)
|
|
173
|
+
except LaunchError as exc:
|
|
174
|
+
emit_error(ctx, exc)
|
|
175
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
176
|
+
emit_payload(ctx, run.to_dict(), human=f"added check to {run.run_id}")
|
|
177
|
+
|
|
178
|
+
@app.command("check")
|
|
179
|
+
def check_command(
|
|
180
|
+
ctx: typer.Context,
|
|
181
|
+
criterion: Annotated[str, typer.Option("--criterion")],
|
|
182
|
+
status: Annotated[str, typer.Option("--status")] = "pass",
|
|
183
|
+
evidence: Annotated[list[str] | None, typer.Option("--evidence")] = None,
|
|
184
|
+
name: Annotated[str | None, typer.Option("--name")] = None,
|
|
185
|
+
details: Annotated[str | None, typer.Option("--details")] = None,
|
|
186
|
+
task_ref: TaskOption = None,
|
|
187
|
+
) -> None:
|
|
188
|
+
_emit_check(
|
|
189
|
+
ctx,
|
|
190
|
+
name=name,
|
|
191
|
+
criterion=criterion,
|
|
192
|
+
status=status,
|
|
193
|
+
details=details,
|
|
194
|
+
evidence=evidence,
|
|
195
|
+
task_ref=task_ref,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
@app.command("finish")
|
|
199
|
+
def finish_command(
|
|
200
|
+
ctx: typer.Context,
|
|
201
|
+
result: Annotated[str, typer.Option("--result")],
|
|
202
|
+
summary: Annotated[str, typer.Option("--summary")],
|
|
203
|
+
recommendation: Annotated[str | None, typer.Option("--recommendation")] = None,
|
|
204
|
+
task_ref: TaskOption = None,
|
|
205
|
+
) -> None:
|
|
206
|
+
state = cli_state_from_context(ctx)
|
|
207
|
+
try:
|
|
208
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
209
|
+
payload = finish_validation(
|
|
210
|
+
state.cwd,
|
|
211
|
+
task.id,
|
|
212
|
+
result=result,
|
|
213
|
+
summary=summary,
|
|
214
|
+
recommendation=recommendation,
|
|
215
|
+
)
|
|
216
|
+
except LaunchError as exc:
|
|
217
|
+
emit_error(ctx, exc)
|
|
218
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
219
|
+
emit_payload(ctx, payload, human=f"finished validation {payload['run_id']}")
|
|
220
|
+
|
|
221
|
+
@app.command("show")
|
|
222
|
+
def show_command(
|
|
223
|
+
ctx: typer.Context,
|
|
224
|
+
run_id: Annotated[str | None, typer.Option("--run")] = None,
|
|
225
|
+
task_ref: TaskOption = None,
|
|
226
|
+
) -> None:
|
|
227
|
+
state = cli_state_from_context(ctx)
|
|
228
|
+
try:
|
|
229
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
230
|
+
payload = show_task_run(
|
|
231
|
+
state.cwd,
|
|
232
|
+
task.id,
|
|
233
|
+
run_id=run_id,
|
|
234
|
+
run_type="validation",
|
|
235
|
+
)
|
|
236
|
+
status_payload = validation_status(state.cwd, task.id, run_id=run_id)
|
|
237
|
+
except LaunchError as exc:
|
|
238
|
+
emit_error(ctx, exc)
|
|
239
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
240
|
+
run = payload["run"]
|
|
241
|
+
assert isinstance(run, dict)
|
|
242
|
+
status_result = cast(dict[str, Any], status_payload.get("result", {}))
|
|
243
|
+
human_output = _render_validation_status(status_result)
|
|
244
|
+
emit_payload(ctx, payload, human=human_output)
|
|
245
|
+
|
|
246
|
+
@app.command("status")
|
|
247
|
+
def status_command(
|
|
248
|
+
ctx: typer.Context,
|
|
249
|
+
task_ref: TaskOption = None,
|
|
250
|
+
run: Annotated[str | None, typer.Option("--run")] = None,
|
|
251
|
+
) -> None:
|
|
252
|
+
state = cli_state_from_context(ctx)
|
|
253
|
+
try:
|
|
254
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
255
|
+
payload = validation_status(state.cwd, task.id, run_id=run)
|
|
256
|
+
except LaunchError as exc:
|
|
257
|
+
emit_error(ctx, exc)
|
|
258
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
259
|
+
result = cast(dict[str, Any], payload.get("result", {}))
|
|
260
|
+
human_output = _render_validation_status(result)
|
|
261
|
+
emit_payload(ctx, payload, human=human_output)
|
|
262
|
+
|
|
263
|
+
@app.command("waive")
|
|
264
|
+
def waive_command(
|
|
265
|
+
ctx: typer.Context,
|
|
266
|
+
criterion: Annotated[str, typer.Option("--criterion")],
|
|
267
|
+
reason: Annotated[str, typer.Option("--reason")],
|
|
268
|
+
actor: Annotated[str, typer.Option("--actor")] = "user",
|
|
269
|
+
task_ref: TaskOption = None,
|
|
270
|
+
) -> None:
|
|
271
|
+
state = cli_state_from_context(ctx)
|
|
272
|
+
try:
|
|
273
|
+
if actor != "user":
|
|
274
|
+
raise LaunchError("Only user actors can waive criteria.")
|
|
275
|
+
task = resolve_cli_task(state.cwd, task_ref)
|
|
276
|
+
run = waive_criterion(
|
|
277
|
+
state.cwd,
|
|
278
|
+
task.id,
|
|
279
|
+
criterion_id=criterion,
|
|
280
|
+
reason=reason,
|
|
281
|
+
)
|
|
282
|
+
except LaunchError as exc:
|
|
283
|
+
emit_error(ctx, exc)
|
|
284
|
+
raise typer.Exit(code=launch_error_exit_code(exc)) from exc
|
|
285
|
+
emit_payload(ctx, run.to_dict(), human=f"waived criterion {criterion}")
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
STABLE_FOR_AGENTS = "stable_for_agents"
|
|
4
|
+
BETA_FOR_AGENTS = "beta_for_agents"
|
|
5
|
+
HUMAN_ORIENTED = "human_oriented"
|
|
6
|
+
REPAIR = "repair"
|
|
7
|
+
|
|
8
|
+
COMMAND_METADATA: dict[str, tuple[str, str]] = {
|
|
9
|
+
"init": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
10
|
+
"status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
11
|
+
"next-action": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
12
|
+
"view": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
13
|
+
"serve": (HUMAN_ORIENTED, "safe_read_only"),
|
|
14
|
+
"can": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
15
|
+
"reindex": (REPAIR, "ledger_mutation"),
|
|
16
|
+
"export": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
17
|
+
"import": (REPAIR, "ledger_mutation"),
|
|
18
|
+
"snapshot": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
19
|
+
"context": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
20
|
+
"search": (BETA_FOR_AGENTS, "safe_read_only"),
|
|
21
|
+
"grep": (BETA_FOR_AGENTS, "safe_read_only"),
|
|
22
|
+
"symbols": (BETA_FOR_AGENTS, "safe_read_only"),
|
|
23
|
+
"deps": (BETA_FOR_AGENTS, "safe_read_only"),
|
|
24
|
+
"task create": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
25
|
+
"task list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
26
|
+
"task active": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
27
|
+
"task activate": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
28
|
+
"task deactivate": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
29
|
+
"task show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
30
|
+
"task edit": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
31
|
+
"task cancel": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
32
|
+
"task close": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
33
|
+
"task dossier": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
34
|
+
"task events": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
35
|
+
"plan start": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
36
|
+
"plan propose": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
37
|
+
"plan draft": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
38
|
+
"plan regenerate": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
39
|
+
"plan upsert": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
40
|
+
"plan materialize-todos": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
41
|
+
"plan show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
42
|
+
"plan list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
43
|
+
"plan diff": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
44
|
+
"plan lint": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
45
|
+
"plan approve": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
46
|
+
"plan accept": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
47
|
+
"plan command": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
48
|
+
"plan reject": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
49
|
+
"plan revise": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
50
|
+
"question add": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
51
|
+
"question list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
52
|
+
"question answer": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
53
|
+
"question answer-many": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
54
|
+
"question dismiss": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
55
|
+
"question open": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
56
|
+
"question status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
57
|
+
"question answers": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
58
|
+
"implement start": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
59
|
+
"implement restart": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
60
|
+
"implement log": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
61
|
+
"implement change": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
62
|
+
"implement scan-changes": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
63
|
+
"implement command": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
64
|
+
"implement deviation": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
65
|
+
"implement artifact": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
66
|
+
"implement finish": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
67
|
+
"implement show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
68
|
+
"implement status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
69
|
+
"implement checklist": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
70
|
+
"validate start": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
71
|
+
"validate check": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
72
|
+
"validate finish": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
73
|
+
"validate status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
74
|
+
"validate waive": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
75
|
+
"validate show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
76
|
+
"todo add": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
77
|
+
"todo list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
78
|
+
"todo done": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
79
|
+
"todo undone": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
80
|
+
"todo show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
81
|
+
"todo status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
82
|
+
"todo next": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
83
|
+
"intro create": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
84
|
+
"intro list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
85
|
+
"intro show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
86
|
+
"intro link": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
87
|
+
"file add": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
88
|
+
"file remove": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
89
|
+
"file list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
90
|
+
"link add": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
91
|
+
"link list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
92
|
+
"link remove": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
93
|
+
"require add": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
94
|
+
"require list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
95
|
+
"require remove": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
96
|
+
"require waive": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
97
|
+
"lock show": (REPAIR, "safe_read_only"),
|
|
98
|
+
"lock break": (REPAIR, "ledger_mutation"),
|
|
99
|
+
"lock list": (REPAIR, "safe_read_only"),
|
|
100
|
+
"handoff show": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
101
|
+
"handoff create": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
102
|
+
"handoff list": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
103
|
+
"handoff claim": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
104
|
+
"handoff close": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
105
|
+
"handoff cancel": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
106
|
+
"handoff plan-context": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
107
|
+
"handoff implementation-context": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
108
|
+
"handoff validation-context": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
109
|
+
"actor whoami": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
110
|
+
"actor set": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
111
|
+
"actor clear": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
112
|
+
"harness set": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
113
|
+
"harness clear": (STABLE_FOR_AGENTS, "ledger_mutation"),
|
|
114
|
+
"doctor": (REPAIR, "safe_read_only"),
|
|
115
|
+
"doctor locks": (REPAIR, "safe_read_only"),
|
|
116
|
+
"doctor schema": (REPAIR, "safe_read_only"),
|
|
117
|
+
"doctor indexes": (REPAIR, "safe_read_only"),
|
|
118
|
+
"repair index": (REPAIR, "ledger_mutation"),
|
|
119
|
+
"repair lock": (REPAIR, "ledger_mutation"),
|
|
120
|
+
"repair task": (REPAIR, "ledger_mutation"),
|
|
121
|
+
"repair task-dirs": (REPAIR, "ledger_mutation"),
|
|
122
|
+
"migrate status": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
123
|
+
"migrate plan": (STABLE_FOR_AGENTS, "safe_read_only"),
|
|
124
|
+
"migrate apply": (REPAIR, "ledger_mutation"),
|
|
125
|
+
}
|