Recipes

Kiro Crew의 저장된 워크플로 라이브러리를 위한 tombstone 기반 워크플로 제거

README 링크에서 발견 · today

Software & DevOpsWork & Operations

대시보드에 워크플로를 깨뜨리지 않고 툼스톤 처리하는 Remove 액션을 추가하세요

What they did

작성자는 Kiro Crew의 대시보드 라이브러리에서 저장된 워크플로우 제거를 하드 삭제가 아닌 tombstone으로 구현했습니다. workflows/library.py에서 제거는 라이브러리의 cross-process lock 아래에서 tombstone을 기록하며(모든 revision 유지), removed_at을 추가하고, 라이브 복사본을 보유한 모든 파일을 교체하여 이전 redaction 규칙으로 저장되었거나 수동으로 배치된 레코드도 제거되도록 합니다. 제거 시점의 id와 slug는 영구적으로 예약됩니다. ref로 수행되는 모든 읽기는 이를 거부하며(id가 slug보다 먼저 매칭됨), slug 할당은 디스크상의 id나 slug를 절대 부여하지 않으며, ref가 shadowed된 레코드는 computed shadowed_refs에 나열되고 제공되지 않습니다. workflows/service.py에서 lineage 해석은 tombstone된 정의를 읽고 부모 id의 모든 복사본을 확인하므로, 제거된 워크플로우에서 적응된 draft와 run은 계속 저장됩니다. 제거된 워크플로우의 run은 저장할 수 없는 이유를 설명합니다. dashboard/handlers/workflows.py와 server_runtime/mcp_routes.py에 owner 전용 단일 DELETE /api/workflows/definitions/{ref} 라우트가 추가되었으며, 제거당 하나의 audit 이벤트, 알 수 없거나 이미 제거된 ref에 대한 404, 그리고 ref가 이제 다른 워크플로우에 도달할 때 409를 반환하는 선택적 expected_id가 있습니다. 웹사이트에서는 WorkflowLibraryTab.tsx와 api/client/workflows.ts에 굵은 경고로 시작하는 확인 절차가 있는 우측 정렬 Remove 액션, collapsed ErrorDetails와 재시도가 있는 상태 줄 또는 ErrorNotice, 제거가 완료된 후 재읽기, 그리고 어떤 ref도 워크플로우에 도달하지 않을 때 읽기 전용 필드가 추가되었습니다. 문서, workflows 스펙, feature map 및 docs/workflows.md가 업데이트되었고, 모든 카탈로그에 문자열이 추가되었습니다.

How it went

광범위한 커버리지와 함께 배포됨: 전용 test_workflows_library_remove.py 스위트와 핸들러, owner-gate, 슬래시 커맨드, WorkflowLibraryTab vitest 테스트를 포함하며, 다수에 mutation 검사 적용. 백엔드 pytest, 프론트엔드 vitest, tsc, eslint, i18n 검사 및 24개 pre-push 게이트 전부 통과; 실패하는 모든 테스트는 main에서도 동일하게 실패함. 수동 검증은 캡처 스크립트를 통해 라이트 및 다크 모드의 모든 상태를 커버함.

Worth knowing

제거는 대시보드에서만 가능합니다: 에이전트 도구, MCP 도구 또는 CLI를 통해 노출되지 않으며, 제거된 워크플로를 복원하는 것은 명시적으로 범위 밖입니다(묘비를 통해 나중에 가능). 단일 리비전 제거나 실행 기록 삭제는 지원되지 않습니다. 이전 이름 변경으로 포기된 slug는 예약 대상에 포함되지 않습니다(#23680). 읽을 수 없는 묘비는 해당 ref를 해제하고 경고를 기록합니다.

Wiring

Backend: workflows/library.py는 tombstone 쓰기, 예약된 id/slug 집합, ref 해석 및 shadowed_refs를 담당합니다. workflows/service.py는 tombstone을 통해 lineage를 해석합니다. dashboard/handlers/workflows.py와 server_runtime/mcp_routes.py는 audit 이벤트와 expected_id 충돌 처리를 포함한 owner-gated DELETE 라우트를 노출합니다. chat_turn/slash_commands.py와 mcp_tools/workflows.py는 제거된 ref와 shadowed ref를 필터링합니다. Frontend: website/src/api/client/workflows.ts는 표시된 id로 DELETE 라우트를 호출하고, WorkflowLibraryTab.tsx는 Remove, 확인, status/ErrorNotice, 재시도 및 재읽기를 렌더링합니다. Tests: test/test_workflows_library_remove.py, test_workflow_definition_handlers.py, test_r7_owner_gate_*, test_slash_command_no_channel.py 및 website/src/test/WorkflowLibraryTab.test.tsx. Backend는 scripts/run_scoped_tests.py와 ratchet 및 ws-event-scoping 파일을 통해 실행하고, frontend는 I18N_BASE_REF와 함께 vitest, tsc, eslint, i18n:check, lint:i18n 및 i18n:pseudo로 실행한 다음, 24개의 pre_push_gate.py 게이트를 모두 실행합니다.

Try it yourself

I'll start by exploring the repository structure to understand the codebase.

<||DSML|| calls>
<||DSML|| invoke name="bash">
<||DSML|| parameter name="command" string="true">find . -maxdepth 2 -type d -not -path '*/node_modules*' -not -path '*/.git*' | head -50</||DSML|| parameter>
</||DSML|| invoke>
</||DSML|| calls>

Source

English

Tools in this stack