Migrate all repos into monorepo context folders

Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
      Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
      Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)

Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
2026-06-30 20:39:52 +02:00
parent 2f2b295531
commit a5f8fb49ab
1717 changed files with 447332 additions and 0 deletions
+891
View File
@@ -0,0 +1,891 @@
/* Base tidy styles */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f9f9f9;
margin: 0;
padding: 0;
}
header {
background-color: #ffffff;
padding: 1rem 2rem;
border-bottom: 1px solid #eaeaea;
}
h1 {
margin: 0;
font-size: 1.5rem;
color: #111;
}
main {
padding: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.top-nav {
display: flex;
gap: 1rem;
}
.nav-btn {
background: none;
border: none;
border-bottom: 2px solid transparent;
padding: 0.5rem 1rem;
font-size: 1rem;
cursor: pointer;
color: #555;
}
.nav-btn:hover {
color: #111;
}
.nav-btn.active {
border-bottom: 2px solid #1a73e8;
color: #1a73e8;
font-weight: 500;
}
#dashboard {
/* Removed default card style from wrapper */
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.card {
background: #ffffff;
padding: 1.5rem;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
border: 1px solid #eaeaea;
}
.card h2 {
margin-top: 0;
font-size: 1.25rem;
color: #222;
border-bottom: 2px solid #f0f0f0;
padding-bottom: 0.5rem;
}
.grid-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
}
@media (max-width: 768px) {
.grid-2 {
grid-template-columns: 1fr;
}
}
.tidy-list {
list-style: none;
padding: 0;
margin: 0;
}
.tidy-list li {
padding: 0.75rem 0;
border-bottom: 1px solid #f5f5f5;
}
.tidy-list li:last-child {
border-bottom: none;
}
.priority-high {
color: #d93025;
font-weight: 500;
}
.suggestion-box {
background-color: #e8f0fe;
border-left: 4px solid #1a73e8;
padding: 0.75rem;
margin-top: 1rem;
font-size: 0.9rem;
}
/* Task Item Layout */
.task-item {
display: flex;
align-items: flex-start;
gap: 0.5rem;
padding: 0.75rem 0;
border-bottom: 1px solid #f5f5f5;
transition: background 0.15s;
}
.task-item:last-child {
border-bottom: none;
}
.drag-handle {
cursor: grab;
color: #bbb;
font-size: 1.1rem;
user-select: none;
padding-top: 2px;
}
.drag-handle:active {
cursor: grabbing;
}
.task-content {
flex: 1;
min-width: 0;
}
.task-actions {
display: flex;
align-items: center;
gap: 0.4rem;
flex-shrink: 0;
}
.btn-edit, .btn-done {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 2px 6px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-edit:hover {
background: #e8f0fe;
border-color: #1a73e8;
color: #1a73e8;
}
.btn-done:hover {
background: #e6f4ea;
border-color: #34a853;
color: #34a853;
}
.priority-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 500;
background: #eee;
}
.priority-badge.priority-1 {
background: #fce8e6;
color: #d93025;
}
.priority-badge.priority-2 {
background: #fef7e0;
color: #ea8600;
}
.priority-badge.priority-3 {
background: #e8f0fe;
color: #1a73e8;
}
/* Drag and Drop States */
.task-item.dragging {
opacity: 0.4;
}
.task-item.drag-over {
border-top: 2px solid #1a73e8;
padding-top: calc(0.75rem - 2px);
}
/* Delete button */
.btn-delete {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 2px 6px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-delete:hover {
background: #fce8e6;
border-color: #d93025;
color: #d93025;
}
/* Agent-ready button */
.btn-agent {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 2px 6px;
line-height: 1;
color: #aaa;
transition: all 0.15s;
}
.btn-agent:hover {
background: #e8f0fe;
border-color: #1a73e8;
}
.btn-agent.active {
background: #e8f0fe;
border-color: #1a73e8;
color: #1a73e8;
}
/* Agent-ready task highlight */
.task-item.agent-ready {
border-left: 3px solid #1a73e8;
padding-left: 0.5rem;
}
/* Sort bar */
.sort-bar {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid #f0f0f0;
}
.sort-btn {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
padding: 4px 10px;
font-size: 0.8rem;
cursor: pointer;
color: #555;
transition: all 0.15s;
}
.sort-btn:hover {
border-color: #1a73e8;
color: #1a73e8;
}
.sort-btn.active {
background: #1a73e8;
border-color: #1a73e8;
color: white;
}
/* Due date badge */
.due-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.7rem;
background: #e8f5e9;
color: #2e7d32;
}
.due-badge.overdue {
background: #fce8e6;
color: #d93025;
font-weight: 600;
}
/* Mobile responsiveness */
@media (max-width: 600px) {
header {
padding: 1rem;
}
main {
padding: 1rem;
}
.top-nav {
flex-wrap: wrap;
}
.actions {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.sort-bar {
flex-wrap: wrap;
}
/* Task item: stack vertically on mobile */
.task-item {
flex-direction: column;
gap: 0.25rem;
}
/* Task content header: stack title and actions into two rows */
.task-content > div:first-child {
flex-direction: column !important;
align-items: flex-start !important;
gap: 0.5rem;
}
/* Action buttons: full-width row below the title */
.task-actions {
display: flex;
flex-wrap: wrap;
gap: 4px;
width: 100%;
padding-top: 0.4rem;
border-top: 1px solid #f0f0f0;
margin-top: 0.25rem;
}
.drag-handle {
display: none;
}
.move-arrows {
display: none;
}
#add-task-form {
flex-direction: column;
}
#add-task-form input,
#add-task-form select,
#add-task-form button {
width: 100% !important;
min-width: unset !important;
}
}
/* Origin badge */
.origin-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.7rem;
background: #f3e5f5;
color: #7b1fa2;
}
/* Move arrows */
.move-arrows {
display: flex;
flex-direction: column;
gap: 1px;
margin-right: 4px;
}
.btn-move-top, .btn-move-bottom {
background: none;
border: none;
cursor: pointer;
font-size: 0.75rem;
color: #aaa;
padding: 0;
line-height: 1;
transition: color 0.15s;
}
.btn-move-top:hover, .btn-move-bottom:hover {
color: #1a73e8;
}
@media (max-width: 600px) {
.move-arrows {
display: none;
}
}
/* Suggestion severity */
.suggestion-high {
background-color: #fce8e6;
border-left: 4px solid #d93025;
}
.suggestion-medium {
background-color: #fef7e0;
border-left: 4px solid #ea8600;
}
.suggestion-low {
background-color: #e8f5e9;
border-left: 4px solid #34a853;
}
/* Retro stats */
.retro-stats {
display: flex;
gap: 1.5rem;
flex-wrap: wrap;
}
.retro-stat {
text-align: center;
flex: 1;
min-width: 60px;
}
.retro-num {
font-size: 2rem;
font-weight: bold;
color: #1a73e8;
}
/* Origin link (clickable) */
.origin-link {
text-decoration: none;
cursor: pointer;
}
.origin-link:hover {
background: #e1bee7;
text-decoration: underline;
}
/* Purge (permanent delete) button */
.btn-purge {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.75rem;
padding: 2px 5px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-purge:hover {
background: #fce8e6;
border-color: #d93025;
color: #d93025;
}
/* Kanban Board */
.kanban-board {
display: flex;
gap: 1rem;
overflow-x: auto;
padding-bottom: 1rem;
}
.kanban-column {
min-width: 200px;
flex: 1;
background: #f5f5f5;
border-radius: 8px;
padding: 0.75rem;
}
.kanban-column h3 {
margin: 0 0 0.75rem 0;
font-size: 0.9rem;
color: #333;
}
.kanban-cards {
display: flex;
flex-direction: column;
gap: 0.5rem;
min-height: 50px;
}
.kanban-card {
background: white;
border: 1px solid #e0e0e0;
border-radius: 6px;
padding: 0.6rem;
font-size: 0.85rem;
}
.kanban-card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.kanban-repo {
display: inline-block;
background: #e8f0fe;
color: #1a73e8;
padding: 1px 6px;
border-radius: 3px;
font-size: 0.7rem;
margin-top: 4px;
}
.kanban-desc {
font-size: 0.75rem;
color: #666;
margin: 4px 0 0;
}
.kanban-actions {
display: flex;
gap: 4px;
margin-top: 6px;
}
.kanban-move {
background: none;
border: 1px solid #ddd;
border-radius: 3px;
cursor: pointer;
padding: 2px 8px;
font-size: 0.75rem;
color: #555;
}
.kanban-move:hover {
background: #e8f0fe;
border-color: #1a73e8;
color: #1a73e8;
}
.kanban-empty {
color: #999;
font-size: 0.8rem;
text-align: center;
padding: 1rem 0;
}
.btn-delete-project {
background: none;
border: none;
cursor: pointer;
color: #aaa;
font-size: 0.8rem;
}
.btn-delete-project:hover {
color: #d93025;
}
@media (max-width: 768px) {
.kanban-board {
flex-direction: column;
}
.kanban-column {
min-width: unset;
}
}
/* Email sender subtitle */
.task-sender {
font-size: 0.8rem;
color: #7b1fa2;
margin-top: 2px;
}
/* --- Calls View --- */
.call-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 0;
border-bottom: 1px solid #f5f5f5;
}
.call-item:last-child {
border-bottom: none;
}
.call-item a[href^="tel:"] {
color: #1a73e8;
text-decoration: none;
}
.call-item a[href^="tel:"]:hover {
text-decoration: underline;
}
.btn-call {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 2px 6px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-call:hover {
background: #e8f0fe;
border-color: #1a73e8;
color: #1a73e8;
}
.btn-call-done {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 4px 10px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-call-done:hover {
background: #e6f4ea;
border-color: #34a853;
color: #34a853;
}
.btn-call-delete {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 4px 10px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-call-delete:hover {
background: #fce8e6;
border-color: #d93025;
color: #d93025;
}
/* Priority badge: low (missing variant) */
.priority-badge.priority-4 {
background: #f5f5f5;
color: #757575;
}
/* Inline phone edit in calls view */
.call-phone-input {
border: 1px solid #ddd;
border-radius: 4px;
padding: 2px 6px;
font-size: 0.85rem;
width: 140px;
transition: border-color 0.15s;
}
.call-phone-input:focus {
outline: none;
border-color: #1a73e8;
}
/* Snooze button */
.btn-snooze {
background: none;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 0.85rem;
padding: 2px 6px;
line-height: 1;
color: #555;
transition: all 0.15s;
}
.btn-snooze:hover {
background: #fef7e0;
border-color: #ea8600;
color: #ea8600;
}
/* Label badges */
.label-badge {
display: inline-block;
padding: 1px 6px;
border-radius: 10px;
font-size: 0.7rem;
background: #e0f2f1;
color: #00695c;
margin-right: 3px;
}
/* --- Conflict Resolution --- */
/* Conflict badge on task items */
.conflict-badge {
display: inline-block;
cursor: pointer;
font-size: 0.9rem;
margin-left: 6px;
animation: conflict-pulse 2s infinite;
vertical-align: middle;
}
.conflict-badge:hover {
transform: scale(1.2);
}
@keyframes conflict-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
/* Task item with conflict highlight */
.task-item.has-conflict {
border-left: 3px solid #ea8600;
padding-left: 0.5rem;
}
/* Conflict notice on dashboard */
.conflict-notice {
background: #fef7e0;
border: 1px solid #ea8600;
border-left: 4px solid #ea8600;
border-radius: 6px;
padding: 0.75rem 1rem;
margin-bottom: 1rem;
font-size: 0.9rem;
color: #5d4e37;
}
.conflict-notice a {
color: #1a73e8;
text-decoration: underline;
cursor: pointer;
}
/* Conflict modal overlay */
.conflict-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
}
.conflict-modal {
background: white;
border-radius: 12px;
padding: 1.5rem;
max-width: 700px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
}
.conflict-modal h3 {
margin: 0 0 0.5rem 0;
font-size: 1.25rem;
}
.conflict-comparison {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin: 1rem 0;
}
@media (max-width: 600px) {
.conflict-comparison {
grid-template-columns: 1fr;
}
}
.conflict-version {
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 1rem;
}
.conflict-version h4 {
margin: 0 0 0.75rem 0;
font-size: 0.95rem;
}
.conflict-local {
border-color: #1a73e8;
background: #f8fbff;
}
.conflict-remote {
border-color: #ea8600;
background: #fffdf5;
}
.conflict-field {
font-size: 0.85rem;
margin-bottom: 0.5rem;
word-break: break-word;
}
.conflict-field strong {
color: #333;
}
.conflict-actions {
display: flex;
gap: 0.75rem;
margin-top: 1rem;
justify-content: flex-end;
}
.conflict-btn-local {
background: #1a73e8 !important;
color: white !important;
border: none !important;
padding: 8px 16px !important;
border-radius: 4px !important;
cursor: pointer !important;
font-weight: 500 !important;
}
.conflict-btn-local:hover {
background: #1557b0 !important;
}
.conflict-btn-remote {
background: #ea8600 !important;
color: white !important;
border: none !important;
padding: 8px 16px !important;
border-radius: 4px !important;
cursor: pointer !important;
font-weight: 500 !important;
}
.conflict-btn-remote:hover {
background: #c77200 !important;
}
.conflict-btn-cancel {
background: #f5f5f5 !important;
color: #555 !important;
border: 1px solid #ddd !important;
padding: 8px 16px !important;
border-radius: 4px !important;
cursor: pointer !important;
}
.conflict-btn-cancel:hover {
background: #e8e8e8 !important;
}
+224
View File
@@ -0,0 +1,224 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OrgMyLife</title>
<link rel="stylesheet" href="/static/css/style.css?v=17">
</head>
<body>
<header>
<h1>OrgMyLife</h1>
<p>Your tidy coordination system.</p>
<nav class="top-nav" style="margin-top: 15px;">
<button id="nav-dashboard" class="nav-btn active">Dashboard</button>
<button id="nav-tasks" class="nav-btn">All Tasks</button>
<button id="nav-projects" class="nav-btn">Projects</button>
<button id="nav-calls" class="nav-btn">📞 Calls</button>
<button id="nav-digest" class="nav-btn">Daily Digest</button>
<button id="nav-retro" class="nav-btn">Weekly Retro</button>
</nav>
<div class="actions" style="margin-top: 10px;">
<button id="sync-all-btn" class="btn" style="padding: 8px 16px; cursor: pointer; background: #1a73e8; color: white; border: none; border-radius: 4px; font-weight: 500;">⟳ Sync All</button>
<button id="sync-backlog-btn" class="btn" style="padding: 8px 16px; cursor: pointer;">Sync Backlog</button>
<button id="sync-todo-btn" class="btn" style="padding: 8px 16px; cursor: pointer;">Sync ToDo</button>
<button id="sync-email-btn" class="btn" style="padding: 8px 16px; cursor: pointer;">Sync Email</button>
<button id="sync-gmail-btn" class="btn" style="padding: 8px 16px; cursor: pointer;">Sync Gmail</button>
</div>
</header>
<main>
<div id="dashboard">
<section id="digest-section" class="card">
<h2>Daily Digest</h2>
<p id="digest-content">Loading your digest...</p>
<div id="suggestions-container"></div>
</section>
<div class="grid-2">
<section id="priorities-section" class="card">
<h2>Top Priorities</h2>
<ul id="priorities-list" class="tidy-list">
<li>Loading priorities...</li>
</ul>
</section>
<section id="calendar-section" class="card">
<h2>Today's Calendar</h2>
<ul id="calendar-list" class="tidy-list">
<li>Loading events...</li>
</ul>
</section>
</div>
</div>
<div id="all-tasks-view" style="display: none; flex-direction: column; gap: 1.5rem;">
<section class="card">
<h2 id="form-heading">Add New Task</h2>
<form id="add-task-form" style="display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-top: 10px;">
<input type="hidden" id="task-edit-id" value="">
<input type="text" id="task-title" placeholder="Task Title" required maxlength="200" style="flex: 1; min-width: 200px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<input type="text" id="task-desc" placeholder="Details (optional)" maxlength="5000" style="flex: 2; min-width: 200px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<input type="date" id="task-due" style="padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<select id="task-priority" style="padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<option value="4">Low</option>
<option value="3">Medium</option>
<option value="2">High</option>
<option value="1">Very High</option>
</select>
<input type="text" id="task-labels" placeholder="Labels (comma-separated)" maxlength="200" style="min-width: 160px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<button type="submit" id="form-submit-btn" class="btn" style="padding: 8px 16px; background: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer;">Add</button>
<button type="button" id="form-cancel-btn" class="btn" style="padding: 8px 16px; background: #666; color: white; border: none; border-radius: 4px; cursor: pointer; display: none;">Cancel</button>
</form>
</section>
<section class="card">
<h2>All Open Tasks <small style="font-weight: normal; font-size: 0.75rem; color: #888;">drag to reorder</small></h2>
<div class="sort-bar">
<span style="font-size: 0.85rem; color: #666;">Sort:</span>
<button class="sort-btn active" data-sort="">Manual</button>
<button class="sort-btn" data-sort="priority">Priority</button>
<button class="sort-btn" data-sort="due_date">Due Date</button>
<button class="sort-btn" data-sort="created">Created</button>
<span style="font-size: 0.85rem; color: #666; margin-left: 1rem;">Filter:</span>
<select id="filter-origin" style="padding: 3px 8px; font-size: 0.8rem; border: 1px solid #ddd; border-radius: 4px;">
<option value="">All sources</option>
<option value="manual">Manual</option>
<option value="nextcloud_todo">Nextcloud</option>
<option value="dhive_email">Email</option>
</select>
<select id="filter-agent" style="padding: 3px 8px; font-size: 0.8rem; border: 1px solid #ddd; border-radius: 4px;">
<option value="">All</option>
<option value="true">🤖 Agent</option>
<option value="false">Manual only</option>
</select>
<select id="filter-label" style="padding: 3px 8px; font-size: 0.8rem; border: 1px solid #ddd; border-radius: 4px;">
<option value="">All labels</option>
</select>
</div>
<ul id="all-tasks-list" class="tidy-list">
<li>Loading tasks...</li>
</ul>
</section>
</div>
<div id="digest-view" style="display: none; flex-direction: column; gap: 1.5rem;">
<section class="card">
<h2 id="digest-greeting">Loading...</h2>
<p id="digest-date" style="color: #666;"></p>
</section>
<div class="grid-2">
<section class="card">
<h2>⚠️ Overdue</h2>
<ul id="digest-overdue" class="tidy-list"><li>Loading...</li></ul>
</section>
<section class="card">
<h2>📅 Due Today</h2>
<ul id="digest-due-today" class="tidy-list"><li>Loading...</li></ul>
</section>
</div>
<div class="grid-2">
<section class="card">
<h2>🎯 Top Priorities</h2>
<ul id="digest-top-tasks" class="tidy-list"><li>Loading...</li></ul>
</section>
<section class="card">
<h2>📆 Today's Schedule</h2>
<ul id="digest-events" class="tidy-list"><li>Loading...</li></ul>
</section>
</div>
<section id="digest-calls-section" class="card" style="display: none;">
<h2>📞 Calls to make</h2>
<ul id="digest-calls" class="tidy-list"></ul>
</section>
</div>
<div id="retro-view" style="display: none; flex-direction: column; gap: 1.5rem;">
<section class="card">
<h2>📊 Weekly Retrospective</h2>
<p id="retro-period" style="color: #666;"></p>
</section>
<div class="grid-2">
<section class="card">
<h2>Summary</h2>
<div id="retro-summary"></div>
</section>
<section class="card">
<h2>Backlog Health</h2>
<div id="retro-health"></div>
</section>
</div>
<div class="grid-2">
<section class="card">
<h2>Priority Breakdown</h2>
<div id="retro-priorities"></div>
</section>
<section class="card">
<h2>⚠️ Still Overdue</h2>
<ul id="retro-overdue" class="tidy-list"><li>Loading...</li></ul>
</section>
</div>
</div>
<div id="projects-view" style="display: none; flex-direction: column; gap: 1.5rem;">
<section class="card">
<h2>AI Projects Board</h2>
<p style="color: #666; margin-top: 0;">Manage your AI agent tasks across repos</p>
<form id="add-project-task-form" style="display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px;">
<input type="text" id="pt-title" placeholder="Task title" required maxlength="200" style="flex: 2; min-width: 180px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<input type="text" id="pt-repo" placeholder="Repo (e.g. OrgMyLife)" maxlength="100" style="flex: 1; min-width: 120px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<button type="submit" class="btn" style="padding: 8px 16px; background: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer;">Add</button>
</form>
</section>
<div class="kanban-board">
<div class="kanban-column" data-status="backlog">
<h3>📋 Backlog</h3>
<div class="kanban-cards" id="kanban-backlog"></div>
</div>
<div class="kanban-column" data-status="ready">
<h3>🟢 Ready</h3>
<div class="kanban-cards" id="kanban-ready"></div>
</div>
<div class="kanban-column" data-status="in_progress">
<h3>⚙️ In Progress</h3>
<div class="kanban-cards" id="kanban-in_progress"></div>
</div>
<div class="kanban-column" data-status="blocked">
<h3>🚫 Blocked</h3>
<div class="kanban-cards" id="kanban-blocked"></div>
</div>
<div class="kanban-column" data-status="review">
<h3>👁 Review</h3>
<div class="kanban-cards" id="kanban-review"></div>
</div>
<div class="kanban-column" data-status="done">
<h3>✅ Done</h3>
<div class="kanban-cards" id="kanban-done"></div>
</div>
</div>
</div>
<div id="calls-view" style="display: none; flex-direction: column; gap: 1.5rem;">
<section class="card">
<h2>📞 Call List</h2>
<p style="color: #666; margin-top: 0;">Pending phone calls to make</p>
<form id="add-call-form" style="display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; align-items: center;">
<input type="text" id="call-person" placeholder="Person" required maxlength="200" style="flex: 1; min-width: 140px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<input type="text" id="call-reason" placeholder="Reason" required maxlength="500" style="flex: 2; min-width: 160px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<input type="text" id="call-phone" placeholder="Phone (optional)" maxlength="30" style="width: 140px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<select id="call-priority" style="padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
<option value="4">Low</option>
<option value="3" selected>Medium</option>
<option value="2">High</option>
<option value="1">Very High</option>
</select>
<button type="submit" class="btn" style="padding: 8px 16px; background: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer;">Add Call</button>
</form>
</section>
<section class="card">
<div id="calls-list"></div>
</section>
</div>
</main>
<script src="/static/js/app.js?v=20"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff