feat: Projects tab, 4-tab dashboard, full knowledge browser
All checks were successful
Build and Deploy DevOpsDash / build-image (push) Successful in 8s

- Add projects router (Redis projects + workcontexts merged)
- Register projects router in main.py
- Extend knowledge router: howtos, agents, skills via MCP proxy
- Extend mcp_client: list/get howtos, agents, skills
- Rewrite dashboard.html: 4 tabs (Taskz/Worklog/Projects/Knowledge)
  - Taskz: sidebar board list + Kanban columns with task modal
  - Worklog: context/days picker + standup button
  - Projects: context filter sidebar + work context display
  - Knowledge: 6 sub-tabs (docs/howtos/agents/skills/adrs/memories)
    with markdown rendering via marked.js
This commit is contained in:
Henrik Jess Nielsen
2026-05-09 16:54:30 +02:00
parent 70418bc45b
commit fa4534bfb2
6 changed files with 829 additions and 769 deletions

View File

@@ -21,6 +21,8 @@ MEMORY_KEY_PREFIX = "devops-mcp:memory:"
PROJECT_KEY_PREFIX = "devops-mcp:projects:"
PROJECT_INDEX_KEY = "devops-mcp:projects:_index"
WORKCONTEXT_KEY_PREFIX = "devops-mcp:workcontext:"
def get_redis() -> redis.Redis:
url = os.environ.get("REDIS_URL", "redis://localhost:6379")
@@ -130,3 +132,19 @@ def list_projects(r: redis.Redis, context: Optional[str] = None) -> List[Dict[st
continue
projects.append(proj)
return projects
def list_workcontexts(r: redis.Redis) -> List[Dict[str, Any]]:
keys = r.keys(f"{WORKCONTEXT_KEY_PREFIX}*")
contexts = []
for key in keys:
raw = r.get(key)
if raw:
try:
ctx = json.loads(raw)
ctx["path"] = key[len(WORKCONTEXT_KEY_PREFIX):]
contexts.append(ctx)
except json.JSONDecodeError:
pass
contexts.sort(key=lambda c: c.get("saved_at", ""), reverse=True)
return contexts