Skip to content

Commit 2ff0f8f

Browse files
feat: Implement core application framework, comprehensive history management, Manim Command Protocol, and Python CI workflow.
1 parent 8acf950 commit 2ff0f8f

File tree

15 files changed

+3766
-457
lines changed

15 files changed

+3766
-457
lines changed

.github/workflows/python-validate.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ jobs:
6363
6464
- name: Auto-approve Dependabot PRs
6565
if: github.actor == 'dependabot[bot]' && steps.validate.outputs.valid == 'true'
66-
uses: hmarr/auto-approve-action@v2.1.0
66+
uses: hmarr/auto-approve-action@v4
6767
with:
6868
github-token: ${{ secrets.GITHUB_TOKEN }}
69+
review-message: "Auto-approved Dependabot PR ✅"
6970

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,13 @@ View the resulting output, demonstrating final rendering in the node canvas.
188188

189189
Made with lots of ❤️💚💙 by Soumalya a.k.a. @pro-grammer-SD
190190

191-
Discussions: https://www.reddit.com/r/manim/comments/1qck0ji/i_built_a_nodebased_manim_ide_with_ai_assistance/
191+
Discussions: https://www.reddit.com/r/manim/comments/1qck0ji/i_built_a_nodebased_manim_ide_with_ai_assistance/
192+
193+
### 🧭 Advanced MCP + History Control
194+
- All actions—including node edits, wires, VGroups, scenes, project I/O, rendering, assets, AI workflows, themes, keybindings, and TTS—are now available via `docs/mcp_commands.md` with consistent structured JSON responses.
195+
- The rewritten `HistoryManager` captures grouped atomic operations (AI merges/imports, property edits, motion, wiring) and exposes per-node undo/redo stacks plus project/scene/node checkpoints (`docs/history_system.md`).
196+
- Use the new `history.*` MCP commands (`undo_project`, `redo_node`, `restore_checkpoint`, `timeline`, `replay`, etc.) to inspect diffs, summaries, and timeline metadata before issuing state changes.
197+
198+
### 📚 Documentation Links
199+
- `docs/history_system.md` walks through the new history data model, checkpoint APIs, signals, and how to hook future actions into undo/redo.
200+
- `docs/mcp_commands.md` is the canonical MCP API reference listing every command, payload, metadata, and sample usage for AI agents.

app/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def show_editor(path: str | None = None, example: bool = False, new: bool = Fals
5555
elif example:
5656
_open_example(win)
5757
elif new:
58-
win.new_project()
58+
# Home screen always starts a fresh project; skip the confirm dialog.
59+
win.new_project(force=True)
5960
win.show()
6061
home_window.close()
6162

core/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from PySide6.QtCore import QObject, QSettings, QStandardPaths, Signal
1010

1111
APP_NAME = "EfficientManim"
12-
APP_VERSION = "2.1.0"
12+
APP_VERSION = "2.2.0"
1313
PROJECT_EXT = ".efp" # EfficientManim Project (Zip)
1414
LIGHT_MODE = True
1515

core/file_manager.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,29 @@ def clear(self) -> None:
218218
def get_list(self) -> list[Asset]:
219219
return list(self.assets.values())
220220

221+
def get_asset(self, asset_id: str) -> Asset | None:
222+
return self.assets.get(asset_id)
223+
224+
def delete_asset(self, asset_id: str) -> bool:
225+
if asset_id in self.assets:
226+
del self.assets[asset_id]
227+
self.assets_changed.emit()
228+
return True
229+
return False
230+
231+
def update_asset(
232+
self, asset_id: str, new_path: str | None = None, new_name: str | None = None
233+
) -> Asset | None:
234+
asset = self.assets.get(asset_id)
235+
if not asset:
236+
return None
237+
if new_path:
238+
asset.current_path = str(Path(new_path).resolve().as_posix())
239+
if new_name:
240+
asset.name = new_name
241+
self.assets_changed.emit()
242+
return asset
243+
221244
def get_asset_path(self, asset_id: str) -> str | None:
222245
if asset_id in self.assets:
223246
asset = self.assets[asset_id]

0 commit comments

Comments
 (0)