Adrien Ufferte 239643c325 Fix directory deletion failing on hidden files, breaking the pack swap
The new extract/verify/swap flow surfaced a long-standing bug in
Utils.clean_dir(). On macOS, browsing a folder in the Finder drops a
hidden .DS_Store file in it, and clean_dir() had two flaws around that:

- DirAccess listings skip hidden files by default, so .DS_Store was
  never listed nor removed and the directory was never actually empty.
- The return value of dir.remove(subfolder) was ignored, so the failed
  removal of a subdirectory (non-empty because of its own hidden file)
  was silently swallowed and clean_dir() still reported success.

As a result, delete_directory_recursive() emptied the old language pack
but could not delete its directory, the rename of the new pack onto
that still-existing directory failed, and the downloader showed the
download-error popup. Since the version on disk was never updated, the
app re-downloaded and failed again in a loop on every launch. The old
pre-swap flow had the same deletion failure but masked it: it extracted
directly into the existing directory and ignored rename errors.

- clean_dir() now lists hidden files (include_hidden) and checks every
  removal, trying to remove everything (best effort, so callers like
  clear_all_local_data still wipe as much as possible) and reporting
  the first error encountered instead of a false OK.
- The downloader verifies that the previous pack directory is really
  gone before renaming the new one into place; if not, it aborts the
  swap, keeps the temporary directory and shows the error instead of
  attempting a rename that cannot succeed.
- Add regression tests covering hidden-file deletion, full content
  cleanup and the missing-directory error path.

Verified with the GUT test suite (65/65 passing).
2026-06-11 10:15:40 +02:00
2026-04-17 10:10:58 +02:00
2026-04-16 13:54:16 +02:00
2025-08-18 13:44:37 +02:00
2026-06-08 17:51:11 +02:00
2026-01-26 13:48:59 +01:00
2025-01-13 17:04:35 +01:00
2025-09-05 15:55:48 +02:00
2026-01-27 14:52:22 +01:00
2026-04-02 16:46:44 +02:00
2026-04-02 16:46:44 +02:00
2026-04-02 16:46:44 +02:00
2026-04-02 16:46:44 +02:00
2025-04-09 16:56:40 +02:00

Godot Version

📖 Kalulu — Learn to Read, the Smart Way

🌍 Available Languages


📑 Table of Contents

🧠 Why Kalulu?

Kalulu is more than just a game — its an educational adventure grounded in scientific research that helps children learn to read through a decoding-based method.

Each lesson follows a structured sequence based on linguistic data drawn from children's literature. Learners start with vowels and gradually move on to more complex sounds.


Features

  • Interactive grapheme-phoneme reading lessons
  • Adaptive difficulty progression
  • Child-friendly interface with engaging visuals

🛠️ Installation

📥 Clone the Repository

We recommend forking the repository before cloning, so you can easily contribute or manage your own changes.

  1. Go to the Kalulu GitHub Repository.
  2. Click the Fork button at the top-right corner to create your own copy of the repo.
  3. Once forked, open your terminal and run the following commands:
# Clone your fork of the repository
git clone https://github.com/YOUR_USERNAME/Kalulu-Frontend.git
# Or
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git

# Navigate into the project directory
cd Kalulu-Frontend

🔁 Remember to replace YOUR_USERNAME with your actual GitHub username.


🎮 Install the Godot Engine

To run Kalulu, you need the Godot Engine installed on your machine.

  1. Visit the official Godot Engine website: https://godotengine.org/
  2. Click on Download and choose the version compatible with your operating system.
  3. Extract the downloaded file and run the Godot executable to launch the editor.

That's it! You're now ready to explore the Kalulu project in Godot.


🧩 Addons

Kalulu includes several useful addons to enhance development and streamline workflow:

🔄 EnvironmentSwitcher

A utility to easily switch between development and production environments.

📤 export_tool_manager

Facilitates export to various platforms and simplifies the export process for additional tools like prof_tools.

godot-form-validator

A plugin for Godot 4 that adds validation logic to any control element in your project.

🗃️ godot-sqlite

Provides SQLite integration for Godot projects.

Important: This addon must be downloaded manually from the Godot AssetLib. The folder addons/godot-sqlite/bin is excluded from version control due to its large size. Make sure to download and install it after cloning the repository.


🤝 Contributing

We welcome contributions from everyone! Whether it's fixing bugs, improving documentation, or suggesting new features, your help is greatly appreciated.

How to Contribute

  1. Set up the Project
    See the Installation section to learn how to fork and clone the repository.

  2. Create a New Branch

    git checkout -b feature/your-feature-name
    
  3. Make Your Changes
    Implement your changes or improvements.

  4. Commit and Push

    git add .
    git commit -m "Describe your changes"
    git push origin feature/your-feature-name
    
  5. Open a Pull Request
    Navigate to your forked repository on GitHub and click Compare & pull request to submit your changes for review.

Please make sure your code follows our coding conventions and includes relevant tests or documentation updates when appropriate.


FAQ

📱 Is Kalulu available on mobile?

Yes! Kalulu is available on:

  • Android
  • iOS

💻 Is Kalulu available on desktop?

Yes! Desktop versions for Windows, Mac, and Linux are available in the Releases section.

🌐 Is Kalulu available directly on the web?

We are working on it, stay tuned!


Repository Description
Kalulu Backend Serverless API — authentication, sync, dashboards, and data management
Kalulu Language Lambda Pipeline that processes language packs and updates the database
Kalulu Languages Linguistic data packs (French, Spanish, Portuguese etc...)

Built with care by Excello Recherche & Education

We also have a website

S
Description
Kalulu Web autonome en français pour Joy — Docker, Godot 4.6 et Nginx
Readme 394 MiB
Languages
GDScript 96.6%
Python 2.5%
GDShader 0.6%
Dockerfile 0.3%