Skip to content

Add delete_child command for prefab manage_contents action#980

Open
darkdread wants to merge 1 commit intoCoplayDev:betafrom
darkdread:feature/modify-contents/delete-child
Open

Add delete_child command for prefab manage_contents action#980
darkdread wants to merge 1 commit intoCoplayDev:betafrom
darkdread:feature/modify-contents/delete-child

Conversation

@darkdread
Copy link

@darkdread darkdread commented Mar 24, 2026

Regarding documentation, I don't see tools/UPDATE_DOCS.md. Also I couldn't find tools/check_docs_sync.py mentioned in UPDATE_DOCS_PROMPT.md.

Description

Added delete_child parameter to manage_prefabs tool and CLI command for batch removal of child GameObjects from prefabs.

Type of Change

  • New feature (non-breaking change that adds functionality)

Changes Made

CLI (Server/src/cli/commands/prefab.py)

  • Added new prefab modify command for headless prefab editing (+121 lines)
  • Added helper functions: _parse_vector3(), _parse_property() for CLI argument parsing
  • CLI options: --target, --position, --rotation, --scale, --name, --tag, --layer, --active/--inactive, --parent, --add-component, --remove-component, --set-property, --delete-child, --create-child

Python MCP Tool (Server/src/services/tools/manage_prefabs.py)

  • Added delete_child: str | list[str] parameter
  • Updated tool description to document the new parameter

C# Implementation (MCPForUnity/Editor/Tools/Prefabs/ManagePrefabs.cs)

  • Added deleteChild/delete_child parameter handling in ApplyModificationsToPrefabObject()
  • Added RemoveChildren() method (+41 lines) using Transform.Find() for child lookup
  • Supports single string or array of child paths

Tests

Python CLI tests (+8): test_prefab_modify_* covering delete_child, transform, set_property, components, create_child, active_state

Unity tests (+4): ModifyContents_DeleteChild_* for single, nested, multiple, and nonexistent child scenarios

Testing/Screenshots/Recordings

image

Documentation Updates

  • I have added/removed/modified tools or resources
  • If yes, I have updated all documentation files using:
    • The LLM prompt at tools/UPDATE_DOCS_PROMPT.md (recommended)
    • Manual updates following the guide at tools/UPDATE_DOCS.md

Related Issues

Fixes #979

Additional Notes

  • CLI examples:
    unity-mcp prefab modify "Assets/Prefabs/Player.prefab" --delete-child Child1
    unity-mcp prefab modify "Assets/Prefabs/Player.prefab" --target Weapon --position "0,1,2"

Summary by Sourcery

Add support for headless modification of prefab contents, including deleting child GameObjects, via both the CLI and the manage_prefabs tool.

New Features:

  • Introduce a prefab modify CLI command to edit prefab contents without opening the Unity editor, including transforms, components, properties, child creation, and child deletion.
  • Extend the manage_prefabs tool API with a delete_child parameter for removing child GameObjects by name or path from prefabs.

Tests:

  • Add Python CLI tests covering the new prefab modify command options including delete-child, transform updates, property setting, component add/remove, child creation, and active state toggling.
  • Add Unity edit mode tests validating delete_child behavior for single, nested, multiple, and nonexistent child paths in prefabs.

Summary by CodeRabbit

  • New Features

    • Added ability to delete child objects from prefabs via the prefab modify CLI command, supporting single or multiple child removals by name or path.
  • Tests

    • Added comprehensive tests for child deletion functionality, including single/nested child removal and error handling for nonexistent children.

Also updated unity-mcp prefab cli command to include modify command
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Mar 24, 2026

Reviewer's Guide

Adds a new headless prefab modify CLI command and corresponding manage_prefabs tool / Unity implementation to support batch modification of prefab contents, including a new delete_child capability for removing child GameObjects, plus tests covering the new behaviors.

Sequence diagram for prefab modify delete_child flow

sequenceDiagram
    actor Developer
    participant CLI_prefab_modify as CLI_prefab_modify
    participant manage_prefabs_tool as manage_prefabs_tool
    participant Unity_ManagePrefabs as Unity_ManagePrefabs
    participant RemoveChildren as RemoveChildren

    Developer->>CLI_prefab_modify: unity-mcp prefab modify path --delete-child Child1 --delete-child Turret/Barrel
    CLI_prefab_modify->>CLI_prefab_modify: _parse_vector3 / _parse_property (if used)
    CLI_prefab_modify->>CLI_prefab_modify: build params with action=modify_contents
    CLI_prefab_modify->>CLI_prefab_modify: params[deleteChild] = ["Child1","Turret/Barrel"]
    CLI_prefab_modify->>manage_prefabs_tool: run_command manage_prefabs(params)

    manage_prefabs_tool->>manage_prefabs_tool: manage_prefabs(..., delete_child)
    manage_prefabs_tool->>manage_prefabs_tool: if delete_child is not None
    manage_prefabs_tool->>manage_prefabs_tool: params[deleteChild] = delete_child
    manage_prefabs_tool->>Unity_ManagePrefabs: async_send_command_with_retry("manage_prefabs", params)

    Unity_ManagePrefabs->>Unity_ManagePrefabs: ApplyModificationsToPrefabObject(@params, targetGo, prefabRoot)
    Unity_ManagePrefabs->>Unity_ManagePrefabs: read deleteChildToken = @params[deleteChild] or @params[delete_child]
    Unity_ManagePrefabs->>RemoveChildren: RemoveChildren(deleteChildToken, targetGo, prefabRoot)

    alt error while removing
        RemoveChildren-->>Unity_ManagePrefabs: (removedCount, error)
        Unity_ManagePrefabs-->>manage_prefabs_tool: ErrorResponse
        manage_prefabs_tool-->>CLI_prefab_modify: error result
        CLI_prefab_modify-->>Developer: formatted error output
    else removed one or more children
        RemoveChildren-->>Unity_ManagePrefabs: (removedCount>0, null)
        Unity_ManagePrefabs->>Unity_ManagePrefabs: modified = true
        Unity_ManagePrefabs-->>manage_prefabs_tool: success result
        manage_prefabs_tool-->>CLI_prefab_modify: success result
        CLI_prefab_modify-->>Developer: "Modified prefab: path"
    end
Loading

Sequence diagram for set_property mapping to componentProperties

sequenceDiagram
    actor Developer
    participant CLI_prefab_modify as CLI_prefab_modify
    participant manage_prefabs_tool as manage_prefabs_tool
    participant Unity_ManagePrefabs as Unity_ManagePrefabs

    Developer->>CLI_prefab_modify: unity-mcp prefab modify path --set-property "Rigidbody.mass=5"
    CLI_prefab_modify->>CLI_prefab_modify: _parse_property("Rigidbody.mass=5") -> ("Rigidbody","mass",5)
    CLI_prefab_modify->>CLI_prefab_modify: build component_properties = {Rigidbody: {mass: 5}}
    CLI_prefab_modify->>manage_prefabs_tool: run_command manage_prefabs(params with componentProperties)

    manage_prefabs_tool->>Unity_ManagePrefabs: send manage_prefabs with componentProperties
    Unity_ManagePrefabs->>Unity_ManagePrefabs: ApplyModificationsToPrefabObject reads componentProperties
    Unity_ManagePrefabs->>Unity_ManagePrefabs: set serialized fields on existing components
    Unity_ManagePrefabs-->>manage_prefabs_tool: success result
    manage_prefabs_tool-->>CLI_prefab_modify: success result
    CLI_prefab_modify-->>Developer: "Modified prefab: path"
Loading

Class diagram for updated ManagePrefabs delete_child support

classDiagram
    class PrefabCLICommands {
        +modify(path, target, position, rotation, scale, name, tag, layer, active, parent, add_component, remove_component, set_property, delete_child, create_child)
        -_parse_vector3(value)
        -_parse_property(prop_str)
    }

    class ManagePrefabsTool {
        +async manage_prefabs(action, prefab_path, target, include_inactive, unlink, source_prefab_path, source_scene_path, components_to_add, components_to_remove, create_child, delete_child, component_properties)
        +normalize_child_params(child, index)
    }

    class ManagePrefabs {
        +ApplyModificationsToPrefabObject(@params, targetGo, prefabRoot) (bool modified, ErrorResponse error)
        +CreateSingleChildInPrefab(childParams, targetGo, prefabRoot) (bool created, ErrorResponse error)
        -RemoveChildren(deleteChildToken, targetGo, prefabRoot) (int removedCount, ErrorResponse error)
    }

    PrefabCLICommands --> ManagePrefabsTool : uses manage_prefabs via run_command
    ManagePrefabsTool --> ManagePrefabs : sends params to manage_prefabs command
    ManagePrefabs ..> RemoveChildren : calls for deleteChild processing
Loading

File-Level Changes

Change Details Files
Introduce prefab modify CLI command for headless prefab content editing and map its options into manage_prefabs parameters.
  • Add _parse_vector3 helper to convert 'x,y,z' strings into float lists for position/rotation/scale options.
  • Add _parse_property helper to parse Component.prop=value strings into typed values (bool/int/float/fallback string).
  • Define prefab modify click command with options for target selection, transform, naming, tag/layer, active state, parenting, component add/remove, property setting, child deletion, and child creation.
  • Build the params dict for manage_prefabs with action="modify_contents", mapping CLI options to expected request keys (e.g., position, rotation, scale, componentsToAdd, componentProperties, deleteChild, createChild).
  • Validate and JSON-decode the --create-child argument and surface invalid JSON as a Click error.
  • Wire the command to run_command("manage_prefabs", params, config) and print success messaging.
Server/src/cli/commands/prefab.py
Extend manage_prefabs MCP tool to surface delete_child support to Unity and document it.
  • Update the manage_prefabs tool docstring/description to describe delete_child usage and examples alongside create_child and component_properties.
  • Add a delete_child parameter (str
list[str]) with a descriptive annotation for the modify_contents action.
  • Map delete_child into the outgoing Unity params payload as deleteChild when present.
  • Implement deleteChild handling in Unity ManagePrefabs and support deleting multiple/nested children with error feedback.
    • In ApplyModificationsToPrefabObject, read deleteChild/delete_child from @params, call RemoveChildren, and mark the prefab as modified if any children were removed; propagate errors immediately.
    • Implement RemoveChildren helper that normalizes the input token to an array, extracts a child path from either a string token or object-with-name, and validates input shape.
    • Use Transform.Find relative to the target GameObject to locate each child by path/name and destroy the child GameObject immediately if found.
    • Return an error if a requested child path is empty/invalid or not found under the target object, including the child path in the message; log successful removals via McpLog.
    • Return a tuple of removedCount and error so the caller can decide whether to mark modifications or abort.
    MCPForUnity/Editor/Tools/Prefabs/ManagePrefabs.cs
    Add CLI and Unity tests to cover new prefab modify behaviors, including delete_child, transforms, properties, components, child creation, and active state.
    • Add CLI tests that invoke prefab modify with delete-child, transform, set-property (including bool and float handling), add/remove components, create-child (valid and invalid JSON), and active/inactive flags, asserting that the constructed params match expectations.
    • Add Unity edit mode tests that call ManagePrefabs.HandleCommand with deleteChild as string and array, including nested child deletion and multiple deletions, and verify final prefab hierarchy via AssetDatabase and Transform.Find.
    • Add a negative Unity test asserting that deleting a nonexistent child returns an error message containing 'not found'.
    • Ensure test fixtures clean up created assets via SafeDeleteAsset to avoid polluting the test project.
    Server/tests/test_cli.py
    TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManagePrefabsCrudTests.cs

    Assessment against linked issues

    Issue Objective Addressed Explanation
    #979 Extend the modify_contents action in the Unity ManagePrefabs implementation to support a delete_child/deleteChild parameter that deletes one or more child GameObjects from a prefab.
    #979 Expose the delete_child capability through the manage_prefabs tool and CLI so callers can invoke delete_child when using the modify_contents action.
    #979 Document the new delete_child parameter in the manage_prefabs tool description so its usage is discoverable to tool users.

    Possibly linked issues


    Tips and commands

    Interacting with Sourcery

    • Trigger a new review: Comment @sourcery-ai review on the pull request.
    • Continue discussions: Reply directly to Sourcery's review comments.
    • Generate a GitHub issue from a review comment: Ask Sourcery to create an
      issue from a review comment by replying to it. You can also reply to a
      review comment with @sourcery-ai issue to create an issue from it.
    • Generate a pull request title: Write @sourcery-ai anywhere in the pull
      request title to generate a title at any time. You can also comment
      @sourcery-ai title on the pull request to (re-)generate the title at any time.
    • Generate a pull request summary: Write @sourcery-ai summary anywhere in
      the pull request body to generate a PR summary at any time exactly where you
      want it. You can also comment @sourcery-ai summary on the pull request to
      (re-)generate the summary at any time.
    • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
      request to (re-)generate the reviewer's guide at any time.
    • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
      pull request to resolve all Sourcery comments. Useful if you've already
      addressed all the comments and don't want to see them anymore.
    • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
      request to dismiss all existing Sourcery reviews. Especially useful if you
      want to start fresh with a new review - don't forget to comment
      @sourcery-ai review to trigger a new review!

    Customizing Your Experience

    Access your dashboard to:

    • Enable or disable review features such as the Sourcery-generated pull request
      summary, the reviewer's guide, and others.
    • Change the review language.
    • Add, remove or edit custom review instructions.
    • Adjust other review settings.

    Getting Help

    @coderabbitai
    Copy link
    Contributor

    coderabbitai bot commented Mar 24, 2026

    📝 Walkthrough

    Walkthrough

    This PR introduces a new deleteChild parameter to the modify_contents action, enabling deletion of child GameObjects from prefabs. Changes span the Unity editor implementation (ManagePrefabs.cs with a new RemoveChildren method), a new prefab modify CLI command with parsing helpers, server-side tool integration, and comprehensive test coverage across CLI and editor tests.

    Changes

    Cohort / File(s) Summary
    Unity Editor Implementation
    MCPForUnity/Editor/Tools/Prefabs/ManagePrefabs.cs
    Added RemoveChildren() method that normalizes deleteChild input into an array, resolves each child by string path/name or object with name field, destroys matches via DestroyImmediate(), and logs removals. Integrated into ApplyModificationsToPrefabObject() to invoke deletion before applying other modifications and set modified = true when children are removed.
    CLI Command Layer
    Server/src/cli/commands/prefab.py
    New prefab modify command with --delete-child flag. Introduced _parse_vector3() helper to convert "x,y,z" strings into float lists and _parse_property() helper to parse "Component.prop=value" with type coercion for booleans, integers, and floats. Command aggregates all parameter groups into a request sent via run_command().
    Service Layer
    Server/src/services/tools/manage_prefabs.py
    Added delete_child parameter to function signature with documentation. Passes value through to the Unity command payload as deleteChild without additional validation.
    Test Coverage
    Server/tests/test_cli.py, TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManagePrefabsCrudTests.cs
    CLI tests verify --delete-child flag aggregation into deleteChild array, transform field parsing, component property aggregation with type coercion, and error handling for invalid JSON. Editor tests add four NUnit test methods covering single child deletion by name, nested child deletion via target path, multiple children deletion from array, and error case for nonexistent child.

    Sequence Diagram

    sequenceDiagram
        actor User
        participant CLI as prefab modify<br/>(CLI Command)
        participant Server as manage_prefabs<br/>(Service)
        participant Editor as ManagePrefabs<br/>(Unity Editor)
        participant Scene as Scene/Prefab<br/>(GameObject)
    
        User->>CLI: prefab modify --delete-child "ChildName"
        CLI->>CLI: Parse --delete-child flags<br/>into deleteChild array
        CLI->>Server: run_command(action="modify_contents",<br/>deleteChild=[...])
        Server->>Server: Append deleteChild to<br/>command payload
        Server->>Editor: HandleCommand(action="modify_contents",<br/>deleteChild=[...])
        Editor->>Editor: RemoveChildren(deleteChild,<br/>targetGo, prefabRoot)
        Editor->>Editor: Normalize deleteChild to array<br/>Resolve each child path
        Editor->>Scene: DestroyImmediate(child)
        Scene-->>Editor: Child destroyed
        Editor->>Editor: Set modified = true
        Editor-->>Server: ErrorResponse (success)
        Server-->>CLI: Response
        CLI-->>User: Command result
    
    Loading

    Estimated code review effort

    🎯 3 (Moderate) | ⏱️ ~22 minutes

    Possibly related PRs

    Poem

    🐰 A prefab's children, too many in sight,
    But now with a hop, we delete them just right!
    The removeChildren dance, so precise and so clean,
    Gone are the clutters that once filled the scene! ✨
    From CLI to Unity, the message takes flight,
    Poof! 🎆 One less GameObject in our prefab's delight!

    🚥 Pre-merge checks | ✅ 4 | ❌ 1

    ❌ Failed checks (1 warning)

    Check name Status Explanation Resolution
    Docstring Coverage ⚠️ Warning Docstring coverage is 72.73% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
    ✅ Passed checks (4 passed)
    Check name Status Explanation
    Title check ✅ Passed The title clearly summarizes the main change: adding a delete_child command parameter to the manage_contents action for prefab modification.
    Description check ✅ Passed The description covers all major template sections including Type of Change, Changes Made (organized by component), Testing, Related Issues, and Additional Notes. However, Documentation Updates checkbox is incomplete—author notes tools/UPDATE_DOCS.md doesn't exist and didn't complete documentation updates.
    Linked Issues check ✅ Passed The PR implements the delete_child command feature across CLI, Python tool, C# implementation, and tests as required by issue #979, with no conflicting changes.
    Out of Scope Changes check ✅ Passed All changes are directly related to implementing delete_child functionality for the manage_contents action. Helper functions (_parse_vector3, _parse_property) are necessary for the CLI command implementation.

    ✏️ Tip: You can configure your own custom pre-merge checks in the settings.

    ✨ Finishing Touches
    🧪 Generate unit tests (beta)
    • Create PR with unit tests

    Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

    ❤️ Share

    Comment @coderabbitai help to get the list of available commands and usage tips.

    Copy link
    Contributor

    @sourcery-ai sourcery-ai bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Hey - I've found 1 issue, and left some high level feedback:

    • In the CLI _parse_vector3() helper, consider catching ValueError and re-raising a click.BadParameter with a clearer message so malformed numeric input (e.g. --position 1,foo,3) produces a friendly CLI error instead of a stack trace.
    • In RemoveChildren the error message mentions 'delete_child' while the code accepts both deleteChild and delete_child; it may be less confusing to align the wording with the accepted parameter names or explicitly mention both.
    Prompt for AI Agents
    Please address the comments from this code review:
    
    ## Overall Comments
    - In the CLI `_parse_vector3()` helper, consider catching `ValueError` and re-raising a `click.BadParameter` with a clearer message so malformed numeric input (e.g. `--position 1,foo,3`) produces a friendly CLI error instead of a stack trace.
    - In `RemoveChildren` the error message mentions `'delete_child'` while the code accepts both `deleteChild` and `delete_child`; it may be less confusing to align the wording with the accepted parameter names or explicitly mention both.
    
    ## Individual Comments
    
    ### Comment 1
    <location path="Server/src/cli/commands/prefab.py" line_range="252-257" />
    <code_context>
             print_success(f"Created prefab: {path}")
    +
    +
    +def _parse_vector3(value: str) -> list[float]:
    +    """Parse 'x,y,z' string to list of floats."""
    +    parts = value.split(",")
    +    if len(parts) != 3:
    +        raise click.BadParameter("Must be 'x,y,z' format")
    +    return [float(p.strip()) for p in parts]
    +
    +
    </code_context>
    <issue_to_address>
    **issue:** Handle non-numeric vector components with a clearer error instead of propagating ValueError.
    
    If any component in `value` isn’t numeric, `float(p.strip())` raises `ValueError`, which Click will show with its default messaging and stack trace. Consider wrapping the comprehension in try/except and raising `click.BadParameter` with a clearer message (e.g. including the original `value` and stating that all three components must be numeric).
    </issue_to_address>

    Sourcery is free for open source - if you like our reviews please consider sharing them ✨
    Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

    Comment on lines +252 to +257
    def _parse_vector3(value: str) -> list[float]:
    """Parse 'x,y,z' string to list of floats."""
    parts = value.split(",")
    if len(parts) != 3:
    raise click.BadParameter("Must be 'x,y,z' format")
    return [float(p.strip()) for p in parts]
    Copy link
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    issue: Handle non-numeric vector components with a clearer error instead of propagating ValueError.

    If any component in value isn’t numeric, float(p.strip()) raises ValueError, which Click will show with its default messaging and stack trace. Consider wrapping the comprehension in try/except and raising click.BadParameter with a clearer message (e.g. including the original value and stating that all three components must be numeric).

    Copy link
    Contributor

    @coderabbitai coderabbitai bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Actionable comments posted: 1

    🧹 Nitpick comments (1)
    Server/src/cli/commands/prefab.py (1)

    361-365: Chain the exception for better debugging.

    Per Python best practices, use raise ... from e to preserve the exception chain, which helps with debugging by showing both the original JSON error and the re-raised BadParameter.

    ♻️ Proposed fix
         if create_child:
             try:
                 params["createChild"] = json.loads(create_child)
             except json.JSONDecodeError as e:
    -            raise click.BadParameter(f"Invalid JSON for --create-child: {e}")
    +            raise click.BadParameter(f"Invalid JSON for --create-child: {e}") from e
    🤖 Prompt for AI Agents
    Verify each finding against the current code and only fix it if needed.
    
    In `@Server/src/cli/commands/prefab.py` around lines 361 - 365, The exception
    handling for JSON parsing of create_child should preserve the original
    JSONDecodeError; in the except block catching json.JSONDecodeError as e (around
    the code that sets params["createChild"] from json.loads(create_child)),
    re-raise the click.BadParameter using exception chaining (i.e., raise
    click.BadParameter(f"Invalid JSON for --create-child: {e}") from e) so the
    original error context is retained for debugging.
    
    🤖 Prompt for all review comments with AI agents
    Verify each finding against the current code and only fix it if needed.
    
    Inline comments:
    In `@Server/src/services/tools/manage_prefabs.py`:
    - Around line 32-34: The docstring describing the delete_child parameter in
    manage_prefabs.py has a missing closing parenthesis; update the string that
    contains "Use delete_child parameter to remove child GameObjects from the prefab
    (single name/path or array of paths for batch deletion. Example:
    delete_child=[\"Child1\", \"Child2/Grandchild\"]). " to include the missing
    closing parenthesis (so the parentheses around the phrase are balanced) — locate
    the delete_child description in the module or function docstring and append the
    closing ")" where the sentence ends.
    
    ---
    
    Nitpick comments:
    In `@Server/src/cli/commands/prefab.py`:
    - Around line 361-365: The exception handling for JSON parsing of create_child
    should preserve the original JSONDecodeError; in the except block catching
    json.JSONDecodeError as e (around the code that sets params["createChild"] from
    json.loads(create_child)), re-raise the click.BadParameter using exception
    chaining (i.e., raise click.BadParameter(f"Invalid JSON for --create-child:
    {e}") from e) so the original error context is retained for debugging.
    

    ℹ️ Review info
    ⚙️ Run configuration

    Configuration used: defaults

    Review profile: CHILL

    Plan: Pro

    Run ID: 16438862-91de-4ce2-823b-6e80b1729dd8

    📥 Commits

    Reviewing files that changed from the base of the PR and between 49b749a and 99ba2ad.

    📒 Files selected for processing (5)
    • MCPForUnity/Editor/Tools/Prefabs/ManagePrefabs.cs
    • Server/src/cli/commands/prefab.py
    • Server/src/services/tools/manage_prefabs.py
    • Server/tests/test_cli.py
    • TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManagePrefabsCrudTests.cs

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    None yet

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    Add delete_child command to modify_contents action

    1 participant