generated from coulomb/repo-seed
feat(CUST-WP-0014): repo sync automation & Gitea inventory
- Migration e2f3a4b5c6d7: add last_state_synced_at to managed_repos
- consistency_check.py: PATCH last_state_synced_at after fix run;
fix ~ treated as non-empty state_hub_task_id (C-03 vs C-11);
fix _inject_task_id_into_block skipping injection when field exists
with null value
- install_hooks.sh: idempotent post-commit hook installer for all
registered repos (make install-hooks REPO= / install-hooks-all)
- gitea_inventory.py: compare coulomb Gitea org against state-hub
registered repos — registered / unregistered / hub-only sections
- infra/README.md: document systemd user timer + crontab fallback
- systemd user timer: custodian-sync.{service,timer} runs
fix-consistency-all every 15 min (enabled)
- dashboard/src/repo-sync.md: Repo Sync Health page — sync age table,
unregistered Gitea repos, hub-only repos
- api/routers/repos.py: GET /repos/{slug}/dispatch endpoint returning
active goal, pending tasks per workstream, human interventions
- mcp_server/server.py: get_repo_dispatch() MCP tool
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
33
dashboard/src/data/gitea-inventory.json.py
Normal file
33
dashboard/src/data/gitea-inventory.json.py
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Observable data loader: runs gitea_inventory.py and returns JSON output."""
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
SCRIPTS_DIR = os.path.join(os.path.dirname(__file__), "..", "..", "..", "scripts")
|
||||
SCRIPTS_DIR = os.path.normpath(SCRIPTS_DIR)
|
||||
PYTHON = os.path.join(os.path.dirname(sys.executable), "python")
|
||||
if not os.path.exists(PYTHON):
|
||||
PYTHON = sys.executable
|
||||
|
||||
API_BASE = os.environ.get("API_BASE", "http://127.0.0.1:8000")
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[PYTHON, os.path.join(SCRIPTS_DIR, "gitea_inventory.py"), "--json",
|
||||
"--api-base", API_BASE],
|
||||
capture_output=True, text=True, timeout=30,
|
||||
)
|
||||
if result.returncode == 0 and result.stdout.strip():
|
||||
print(result.stdout)
|
||||
else:
|
||||
print(json.dumps({
|
||||
"error": result.stderr or "empty output",
|
||||
"registered": [], "unregistered": [], "hub_only": [],
|
||||
}))
|
||||
except Exception as exc:
|
||||
print(json.dumps({
|
||||
"error": str(exc),
|
||||
"registered": [], "unregistered": [], "hub_only": [],
|
||||
}))
|
||||
Reference in New Issue
Block a user