Files
fusion/packages/dashboard/app/components/BranchGroupCard.css
gsxdsm aa8f1f32ee FN-7438: recover stale branch-group references
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>
2026-07-02 13:07:16 -07:00

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);
}
}