stack: Provider-Schicht für Aufgaben-Tracker mit Super-Productivity-Adapter (#124)
CI / verify (push) Successful in 48s
Release / release (push) Successful in 35s

Files changed:
- .gitignore
- CHANGES.md
- VERSION
- tools/CONTRACT.md
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/commands/doctor.py
- tools/chemenu/config.py
- tools/chemenu/errors.py
- tools/chemenu/tasks/__init__.py
- tools/chemenu/tasks/config.py
- tools/chemenu/tasks/protocol.py
- tools/chemenu/tasks/superproductivity.py
- tools/chemenu/tests/test_doctor.py
- tools/chemenu/tests/test_superproductivity.py
- tools/chemenu/tests/test_tasks_config.py
- tools/chemenu/tests/test_tasks_protocol.py
This commit is contained in:
torben committed 2026-09-19 21:46:56 +02:00
1 parent ee24b6e5b8
commit 1875449b31
16 files changed
+1193 -6

No files matched your search

+3
View File
@@ -152,6 +152,9 @@ REQUIRED_IGNORE_CANARIES = (
# `.wikitool-telemetry.json` a few lines below - per-checkout, never
# committed.
".wikitool-upload.json",
# The task-tracker provider opt-in (Gitea #124) - same shape again:
# per-checkout, never committed, once a credential lands in it.
".wikitool-tasks.json",
)
REQUIRED_TRACKED_PATHS = (
"reports/CONTRACT.md",
+60 -3
View File
@@ -414,6 +414,61 @@ def check_upload_intake() -> Check:
)
def check_tasks_provider() -> Check:
"""Whether a task-tracker provider is configured for the GTD review
(Gitea #124), and whether it looks reachable.
Absent is `OK`, the same posture `check_upload_intake` takes on its own
config file: an instance with no tracker configured is legitimate, it
just cannot run the weekly review (#125) yet. A malformed config is a
`FAIL` for the same reason a malformed upload config is - it decides
which provider real credentials flow to, so a broken one must not read as
"nothing configured". Provider reachability itself never affects the
exit code, same as `check_git_repo`'s remote check: the app being closed
is normal, not a fault.
"""
from chemenu import config
from chemenu.errors import ValidationError
from chemenu.tasks import config as tasks_config
try:
cfg = tasks_config.read_config(config.ROOT)
except ValidationError as exc:
return Check(
"tasks-provider", "FAIL", str(exc),
f"Fix or delete {config.TASKS_CONFIG_FILENAME} - a broken one is not treated as "
"'no tracker configured'",
)
if cfg is None:
return Check(
"tasks-provider", "OK",
f"No {config.TASKS_CONFIG_FILENAME} - no task tracker configured (the weekly "
"review needs one, everything else does not)",
)
if cfg.provider == "superproductivity":
from chemenu.tasks import superproductivity as sp
try:
sp_cfg = sp.SuperProductivityConfig.from_dict(cfg.provider_config)
except ValidationError as exc:
return Check(
"tasks-provider", "FAIL", str(exc),
f"Fix the 'superproductivity' section of {config.TASKS_CONFIG_FILENAME}",
)
try:
snapshot_path = sp.latest_snapshot_path(sp_cfg)
read_state = f"read path OK, newest snapshot {rel_path(snapshot_path)}"
except ValidationError as exc:
read_state = f"read path not ready ({exc})"
api_state = "API reachable" if sp.health(sp_cfg) else "API not reachable (app not running?)"
return Check(
"tasks-provider", "OK", f"superproductivity: {read_state}; {api_state}",
)
return Check("tasks-provider", "OK", f"provider '{cfg.provider}' configured")
def check_session_id() -> Check:
"""Three-valued, not two: an explicit `WIKITOOL_SESSION_ID` and a
recognised harness variable (see `chemenu.session.HARNESS_ENV_VARS`) both
@@ -528,6 +583,7 @@ def run_doctor() -> list[Check]:
check_environment(),
check_publish_remotes(),
check_upload_intake(),
check_tasks_provider(),
check_generated_files(),
check_session_id(),
check_telemetry(),
@@ -540,9 +596,10 @@ def doctor_command(
):
"""Check that this instance is correctly configured: dependencies, author,
git identity/remote, published skills, structure, personalization, KB
conventions, generated files, session scoping, telemetry state, and
whether the MCP `submit` tool is armed. Read-only. Exits 1 only
if a check FAILs."""
conventions, generated files, session scoping, telemetry state, whether
the MCP `submit` tool is armed, and which task-tracker provider (if any)
is configured for the GTD review. Read-only. Exits 1 only if a check
FAILs."""
checks = run_doctor()
if json_out: