Recover branch-group detail views after restarts and let operators clear stale per-task group context safely. - Add Task Detail stale branch-group recovery UI that clears only the current task via the assign API. - Verify durable branch groups and members survive TaskStore/API restarts, while stale references can be reset without losing unrelated metadata. - Improve integration-branch fallback diagnostics for repositories that use non-origin remotes. - Document the recovery path, durable branch-group storage expectations, and release the fix as a patch. Files changed: .../fn-7438-branch-group-restart-recovery.md | 7 ++ docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 2 +- docs/storage.md | 2 +- .../core/src/__tests__/branch-group-store.test.ts | 43 +++++++++++- .../dashboard/app/components/BranchGroupCard.css | 9 +++ .../dashboard/app/components/BranchGroupCard.tsx | 49 +++++++++++++- .../dashboard/app/components/TaskDetailModal.tsx | 14 +++- .../components/__tests__/BranchGroupCard.test.tsx | 40 +++++++++++ .../components/__tests__/TaskDetailModal.test.tsx | 11 ++- .../src/__tests__/routes-branch-groups.test.ts | 79 +++++++++++++++++++++- .../src/__tests__/integration-branch.test.ts | 41 +++++++++++ packages/engine/src/integration-branch.ts | 54 ++++++++++++++- 13 files changed, 343 insertions(+), 13 deletions(-) Fusion-Task-Id: FN-7438 Fusion-Task-Lineage: 09ef3dc3-8319-49a7-9f4d-c95a3e069d39 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
152 lines
3.0 KiB
CSS
152 lines
3.0 KiB
CSS
.branch-group-card {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
/*
|
|
FNXC:BranchGroupDetails 2026-06-30-00:00:
|
|
Collapsed branch-group details must consume less task-detail space with token-based typography and spacing while keeping the expand button large enough to remain usable.
|
|
*/
|
|
.branch-group-card--collapsed {
|
|
gap: calc(var(--space-xs) / 2);
|
|
padding: var(--space-sm);
|
|
}
|
|
|
|
.branch-group-card-error {
|
|
color: var(--color-error);
|
|
}
|
|
|
|
.branch-group-card-error-title {
|
|
font-weight: var(--font-weight-semibold);
|
|
}
|
|
|
|
.branch-group-card-error-copy {
|
|
margin: 0;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.branch-group-card-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.branch-group-card-title {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-title {
|
|
font-size: var(--font-size-xs);
|
|
line-height: var(--line-height-tight);
|
|
}
|
|
|
|
.branch-group-card-header-meta {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-header,
|
|
.branch-group-card--collapsed .branch-group-card-header-meta {
|
|
gap: calc(var(--space-xs) / 2);
|
|
}
|
|
|
|
.branch-group-card-badge {
|
|
background: var(--surface-1);
|
|
}
|
|
|
|
.branch-group-card-header-meta .btn {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.branch-group-card-header-meta .btn-icon {
|
|
padding: calc(var(--space-xs) / 2);
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-header-meta .btn-icon {
|
|
padding: 0;
|
|
}
|
|
|
|
.branch-group-card-header-meta .btn-icon svg {
|
|
display: block;
|
|
}
|
|
|
|
.branch-group-card-progress-text {
|
|
color: var(--text-muted);
|
|
font-size: calc(var(--font-size-base) * 0.875);
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-progress-text {
|
|
font-size: var(--font-size-xs);
|
|
line-height: var(--line-height-tight);
|
|
}
|
|
|
|
.branch-group-card-progress {
|
|
width: 100%;
|
|
height: var(--space-xs);
|
|
border-radius: var(--radius-pill);
|
|
background: var(--surface-1);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-progress {
|
|
height: calc(var(--space-xs) / 2);
|
|
}
|
|
|
|
.branch-group-card-progress-fill {
|
|
display: block;
|
|
height: 100%;
|
|
background: var(--color-info);
|
|
}
|
|
|
|
.branch-group-card-members {
|
|
list-style: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: calc(var(--space-xs) / 2);
|
|
}
|
|
|
|
.branch-group-card-member {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.branch-group-card-member-title {
|
|
flex: 1;
|
|
}
|
|
|
|
.branch-group-card-member-status {
|
|
color: var(--text-muted);
|
|
display: inline-flex;
|
|
}
|
|
|
|
.branch-group-card-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--space-sm);
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.branch-group-card-header {
|
|
flex-direction: column;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.branch-group-card-header-meta {
|
|
width: 100%;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.branch-group-card--collapsed .branch-group-card-header {
|
|
gap: calc(var(--space-xs) / 2);
|
|
}
|
|
}
|