#pragma once #include "Common.h" #include "ScriptCompiler.h" #include struct PackageInfo { std::string id; std::string name; std::string description; bool builtIn = false; bool external = false; std::string gitUrl; fs::path localPath; // Absolute path for external packages fs::path includeHint; // Absolute include root for external packages std::vector includeDirs; std::vector defines; std::vector linuxLibs; std::vector windowsLibs; }; // Minimal package manager for script dependencies. Keeps a small registry of // known/bundled packages and a per-project manifest of which optional ones are // enabled. Installed packages augment the script build config (include dirs, // defines, link libs) before compilation. class PackageManager { public: PackageManager(); void setProjectRoot(const fs::path& root); const std::vector& getRegistry() const { return registry; } const std::vector& getInstalled() const { return installedIds; } bool isInstalled(const std::string& id) const; bool install(const std::string& id); bool installGitPackage(const std::string& url, const std::string& nameHint, const std::string& includeRel, std::string& outId); bool checkGitStatus(const std::string& id, std::string& outStatus); bool updateGitPackage(const std::string& id, std::string& outLog); bool remove(const std::string& id); void applyToBuildConfig(ScriptBuildConfig& config) const; const std::string& getLastError() const { return lastError; } private: void buildRegistry(); void loadManifest(); void saveManifest() const; const PackageInfo* findPackage(const std::string& id) const; bool isBuiltIn(const std::string& id) const; static std::string trim(const std::string& value); static std::string slugify(const std::string& value); static bool runCommand(const std::string& command, std::string& output); bool ensureProjectRoot() const; std::vector split(const std::string& input, char delim) const; std::string join(const std::vector& vals, char delim) const; fs::path packagesFolder() const; fs::path projectRoot; fs::path manifestPath; std::vector registry; std::vector installedIds; std::string lastError; };