All checks were successful
Deploy Development / deploy (push) Successful in 47s
Test Suite / pytest-backend (push) Successful in 4m11s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 15s
Erweitert evaluate_steering um read_models und proposals, migriert epic_rollup auf Registry, liefert sprint_commit-Vorschlaege und UI auf Plan-Sprint. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
2.3 KiB
JavaScript
67 lines
2.3 KiB
JavaScript
import { proposalReasonLabel, sprintProposalsForCycle } from '../utils/sprintCommitProposal.js'
|
|
import { backlogKindLabel, resolveBacklogVocabulary } from '../utils/resolveBacklogVocabulary.js'
|
|
import { PriorityBadge } from './PriorityBadge.jsx'
|
|
|
|
export function SprintCommitProposalPanel({
|
|
proposals = [],
|
|
selectedWorkCycleId = '',
|
|
backlogVocabulary = null,
|
|
canManage = false,
|
|
onAcceptProposal,
|
|
busy = false,
|
|
}) {
|
|
const filtered = sprintProposalsForCycle(proposals, selectedWorkCycleId)
|
|
const vocabulary = resolveBacklogVocabulary(backlogVocabulary)
|
|
|
|
if (!selectedWorkCycleId || filtered.length === 0) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<section className="card sprint-commit-proposals">
|
|
<div className="section-header">
|
|
<div>
|
|
<h2>Sprint-Vorschläge</h2>
|
|
<p className="section-lead muted">
|
|
Vom Steuerungskern priorisiert — Accept committet ins Sprint-Backlog (kein Auto-Commit).
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<ol className="item-list sprint-commit-proposals__list">
|
|
{filtered.map((proposal) => (
|
|
<li key={proposal.scope_id} className="list-item card-list-item sprint-commit-proposal">
|
|
<div className="list-item-main">
|
|
<strong>
|
|
{proposal.rank}. {proposal.title}
|
|
</strong>
|
|
<p className="list-item-sub muted">{proposalReasonLabel(proposal)}</p>
|
|
</div>
|
|
<div className="list-item-meta action-controls">
|
|
{proposal.item_kind && (
|
|
<span className="badge badge--kind muted">
|
|
{backlogKindLabel(vocabulary, proposal.item_kind)}
|
|
</span>
|
|
)}
|
|
<PriorityBadge priority={proposal.priority} />
|
|
{canManage && (
|
|
<button
|
|
type="button"
|
|
className="btn btn-primary btn-sm"
|
|
disabled={busy}
|
|
onClick={() =>
|
|
onAcceptProposal?.(proposal.scope_id, {
|
|
work_cycle_id: proposal.work_cycle_id,
|
|
})
|
|
}
|
|
>
|
|
In Sprint planen
|
|
</button>
|
|
)}
|
|
</div>
|
|
</li>
|
|
))}
|
|
</ol>
|
|
</section>
|
|
)
|
|
}
|