7.9 KiB
PR-09 Asset Move Action and Relocate Wizard
Domain owner: docs/studio
Briefing
Adicionar a action Move na área de actions do asset selecionado e conectá-la a um wizard de relocação explícita.
O usuário deve escolher o destino do asset e revisar um resumo antes da execução. Depois da confirmação, o Studio não move diretórios localmente. Ele apenas envia um comando de relocação para o packer, que passa a ser o owner completo da mudança:
- atualiza o estado interno necessário;
- move o diretório do asset dentro da árvore
assetsdo projeto; - emite eventos operacionais até a conclusão.
Este plano também fecha uma regra operacional que precisa existir nas duas pontas:
- o diretório destino final do asset não pode já ser um root de asset;
- portanto, o root destino não pode conter
asset.json.
Após a confirmação do resumo, o modal deve entrar em estado de espera com spinner, escutando o evento operacional do packer. Quando a operação terminar:
- sucesso: o Studio dispara refresh, fecha o modal e reposiciona a seleção;
- falha: o modal sai do estado de espera e mostra a falha sem fechar silenciosamente.
Objective
Entregar um fluxo de Move que seja explícito, previsível e compatível com o modelo em que o packer executa a mutação real e o Studio apenas comanda e observa.
Após este PR:
- a seção
Actionsdo selected asset expõeMove; - clicar em
Moveabre um wizard dedicado; - o wizard coleta o parent de destino e o nome final do diretório;
- o wizard mostra um passo final de resumo antes do comando final;
- o Studio não aceita um destino cujo root já contenha
asset.json; - o packer também rejeita esse destino como regra de segurança e conformance;
- a confirmação final envia um comando de relocation para o packer via API;
- o modal entra em espera com spinner até receber o evento terminal da operação;
- o refresh estrutural só ocorre depois do evento de conclusão do packer.
Dependencies
./PR-05e-assets-staged-mutations-preview-and-apply.md./PR-07c-asset-details-and-form-lifecycle.md./PR-07d-asset-mutation-and-structural-sync-orchestration.md../specs/4. Assets Workspace Specification.md- cross-domain reference:
../../packer/pull-requests/PR-05-sensitive-mutations-preview-apply-and-studio-write-adapter.md - cross-domain reference:
../../packer/pull-requests/PR-09-event-lane-progress-and-studio-operational-integration.md
Scope
- adicionar a action
Movena seçãoActionsdo details - introduzir um
Relocate Wizardefetivamente utilizável pelo selected asset atual - coletar destino por:
- parent directory
- destination name
- target root derivado
- mostrar passo final de resumo antes da confirmação
- enviar um comando
RELOCATE_ASSETcomtargetRootexplícito para o packer - abrir estado modal de espera com spinner após confirmação
- correlacionar a operação via
operationId - escutar o evento operacional do packer até
ACTION_APPLIEDouACTION_FAILED - publicar structural sync explícito apenas após conclusão bem-sucedida
- validar no Studio que
targetRoot/asset.jsonnão exista - validar no packer que
targetRoot/asset.jsonnão exista, mesmo se o Studio falhar em bloquear antes
Non-Goals
- não redesenhar o mutation preview panel inteiro
- não introduzir rename inline fora do wizard
- não adicionar batch move
- não redefinir semântica de identidade do asset
- não permitir fallback para target automático quando o usuário iniciou
Move - não mover diretórios diretamente pelo Studio fora do comando ao packer
Execution Method
-
Expor
Movena seçãoActions. O botão deve existir apenas quando houver asset selecionado e deve abrir o wizard a partir doAssetReferenceatual. -
Implementar o wizard de relocação como fluxo explícito de destino. O wizard deve reutilizar a linguagem já existente de
relocateWizarde coletar:- root atual
- diretório parent de destino
- nome final do diretório
- target root calculado
-
Adicionar validação local de destino. O wizard deve bloquear avanço/confirmação quando:
- o target root for igual ao root atual;
- o target root sair da área válida esperada;
- o target root já contiver
asset.json.
-
Adicionar passo final de resumo. Antes do comando final, o usuário deve ver um resumo do:
- asset atual
- root atual
- parent de destino
- nome final
- target root resultante
-
Integrar o wizard ao fluxo de comando assíncrono do packer. A saída do wizard deve virar
PackerMutationRequest(RELOCATE_ASSET, ..., targetRoot), sem usar target automático. Depois doOK, o Studio inicia a operação, captura ooperationIdretornado e coloca o modal em estado de espera. -
Esperar conclusão por evento, não por refresh cego. O modal deve escutar
StudioPackerOperationEventcorrelacionado poroperationId. Regras:ACTION_APPLIED: disparar refresh estrutural, fechar modal e reselecionar o asset relocado;ACTION_FAILED: sair do spinner, manter modal aberto e mostrar a falha;- eventos intermediários como
PROGRESS_UPDATEDpodem atualizar a mensagem/estado visual, mas não fecham o modal.
-
Endurecer a regra no packer. O preview/apply de relocation deve recusar destino cujo root já contenha
asset.json, produzindo blocker claro e estável. -
Orquestrar o pós-conclusão como mudança estrutural. Relocation bem-sucedida deve acionar sync estrutural explícito e reposicionar a seleção para o asset movido no novo root.
Acceptance Criteria
Moveaparece na seçãoActionsdo asset selecionado- clicar em
Moveabre wizard dedicado em vez de mutação imediata - o wizard exige destino explícito escolhido pelo usuário
- existe passo final de resumo antes da conclusão
targetRoot/asset.jsonbloqueia o fluxo já no Studio- o packer também bloqueia
targetRoot/asset.jsoncomo regra de segurança - o
OKfinal envia o comando ao packer e coloca o modal em espera com spinner - o modal só fecha depois de
ACTION_APPLIEDpara a mesma operação - falha operacional não fecha o modal silenciosamente
- sucesso operacional executa structural sync explícito
- a seleção final aponta para o asset já movido, não para o root antigo
Validation
- unit tests para validação de target root no wizard
- unit tests para derivação de
targetRoota partir de parent + destination name - unit tests para correlação
operationId -> modal state - unit tests para sucesso/falha dirigidos por
StudioPackerOperationEvent - unit tests para publication/orchestration de relocation como structural sync
- packer tests para blocker quando
targetRoot/asset.jsonjá existe - smoke test de UI para:
- abrir
Move - editar destino
- ver resumo final
- bloquear destino inválido
- confirmar operação
- ver spinner de espera
- fechar no evento de sucesso
- manter aberto no evento de falha
- abrir
Affected Artifacts
docs/studio/specs/4. Assets Workspace Specification.mdse a regra de destino inválido precisar ser tornada mais explícitaprometeu-studio/src/main/java/p/studio/workspaces/assets/details/actions/...prometeu-studio/src/main/java/p/studio/workspaces/assets/wizards/...prometeu-studio/src/main/java/p/studio/workspaces/assets/...mutation orchestration wiringprometeu-studio/src/main/java/p/studio/events/...prometeu-studio/src/main/resources/i18n/messages.propertiesprometeu-packer/src/main/java/p/packer/mutations/...- testes de Studio para wizard/flow
- testes de packer para relocation target validation