Honor project and member auto-merge consent consistently throughout shared-branch integration. - Apply project autoMerge settings and explicit member overrides to shared-member hold decisions. - Expose shared-member integration hold state and controls in branch-group dashboard and lifecycle APIs. - Add regression coverage, operator documentation, and a patch changeset. Files changed: .changeset/fn-8823-shared-member-consent.md | 7 ++ docs/dashboard-guide.md | 4 +- packages/core/src/__tests__/task-merge.test.ts | 57 +++++++++++++++ packages/core/src/index.gate.ts | 3 + packages/core/src/index.ts | 3 + packages/core/src/merge/task-merge.ts | 81 ++++++++++++++++++--- .../dashboard/app/api/tasks/tasks-lifecycle.ts | 11 +++ .../dashboard/app/components/BranchGroupCard.css | 84 ++++++++++++++++++++++ .../dashboard/app/components/BranchGroupCard.tsx | 58 ++++++++++++++- packages/dashboard/app/components/ListView.tsx | 14 +++- .../dashboard/app/components/TaskDetailModal.tsx | 20 +++++- .../components/__tests__/BranchGroupCard.test.tsx | 44 +++++++++++- .../components/__tests__/TaskDetailModal.test.tsx | 24 ++++++- .../app/components/dashboard/MainContent.tsx | 2 +- .../app/components/useRightDockController.tsx | 2 +- packages/dashboard/app/hooks/useModalManager.ts | 6 ++ .../src/__tests__/routes-branch-groups.test.ts | 42 ++++++----- .../src/routes/register-branch-groups-routes.ts | 9 ++- ...cutor-live-branch-group-auto-merge-hold.test.ts | 21 +++--- .../src/__tests__/group-merge-coordinator.test.ts | 7 +- .../workflow-graph-executor-handlers.test.ts | 33 ++++++--- packages/engine/src/executor.ts | 27 ++++--- packages/engine/src/project-engine.ts | 9 ++- packages/engine/src/self-healing.ts | 16 ++--- .../src/workflow-node-runners/merge-runner.ts | 13 ++-- 25 files changed, 503 insertions(+), 94 deletions(-) Fusion-Task-Id: FN-8823 Fusion-Task-Lineage: 19a8ed3f-26e1-4c8e-8782-ca366718a3f2 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
236 lines
4.8 KiB
CSS
236 lines
4.8 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;
|
|
}
|
|
|
|
/*
|
|
FNXC:SharedBranchPromotionAdvisories 2026-08-08-03:03:
|
|
FN-8823 manual promotion must expose every persisted advisory finding, not only
|
|
review notes. Keep long advisory lists independently scrollable so the confirm
|
|
and cancel controls remain reachable at the existing mobile breakpoint without
|
|
adding another modal primitive.
|
|
*/
|
|
.branch-group-card-confirm-backdrop {
|
|
position: fixed;
|
|
inset: 0;
|
|
display: grid;
|
|
place-items: center;
|
|
padding: var(--space-md);
|
|
background: color-mix(in srgb, var(--surface-0) 70%, transparent);
|
|
z-index: var(--z-modal);
|
|
}
|
|
|
|
.branch-group-card-confirm {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-sm);
|
|
width: 100%;
|
|
max-width: 100%;
|
|
max-block-size: calc(100dvh - var(--space-lg));
|
|
overflow: hidden;
|
|
}
|
|
|
|
.branch-group-card-confirm h3,
|
|
.branch-group-card-confirm p {
|
|
margin: 0;
|
|
}
|
|
|
|
.branch-group-card-advisories {
|
|
display: flex;
|
|
flex: 1 1 auto;
|
|
flex-direction: column;
|
|
gap: var(--space-xs);
|
|
min-block-size: 0;
|
|
margin: 0;
|
|
padding-inline-start: var(--space-lg);
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.branch-group-card-advisories > li {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: flex-start;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.branch-group-card-advisory-heading {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.branch-group-card-advisory-notes,
|
|
.branch-group-card-advisory-findings p {
|
|
margin: 0;
|
|
}
|
|
|
|
.branch-group-card-advisory-findings {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: calc(var(--space-xs) / 2);
|
|
margin: 0;
|
|
padding-inline-start: var(--space-lg);
|
|
}
|
|
|
|
.branch-group-card-advisory-findings li {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: calc(var(--space-xs) / 2);
|
|
}
|
|
|
|
.branch-group-card-advisory-findings span {
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.branch-group-card-review {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
@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);
|
|
}
|
|
}
|