--- name: common-daemon-cli-skill description: Use this skill whenever you need to implement a system daemon mode in your CLI application. --- # The "daemon" Subcommand Every CLI daemon must have a `daemon` subcommand with the following nested subcommands: * logs - view logs of the active daemon * enable - enable the daemon, copy configuration files and the executable itself to system directories * disable - disable the daemon; if executable files or config were copied to a system directory, do not touch them * status - show the daemon's status. Is it enabled? If it crashed, what error? The last 50 lines of logs if it crashed. * env - allows modifying the environment variables with which the daemon runs. * restart - restarts the daemon For example: ```shell myrootcommand daemon [ enable / disable / logs / status / env ] ``` # Enabling the Daemon Enabling the daemon must support the following operating systems: * Linux-based * \+ Systemd * \+ OpenRC * \+ Init.D * FreeBSD * Windows * MacOS (The method by which the application is added to autostart is displayed in `status`) Enabling includes: * Copying the configuration file and the application executable to a location where the user won't accidentally delete them. For example, to `/var/lib/*` on Linux. If the `--no-copy` flag is provided, copying is skipped and files remain in their original locations. * Adding the application to autostart with the specified config (if there is a config at all) * Storing information somewhere publicly accessible that the daemon is enabled. # Disabling When disabling, check whether the daemon exists or not. If the daemon does not exist, simply inform the user. If the daemon is in autostart, remove it from there. # Removing Copies Removes any copies made during enabling, if they were created. Activated by the `--remove` flag. In this case, a random number between 1000 and 2000 is generated, which must be entered into an interactive input field to confirm. The CLI explicitly and clearly notifies the user about this. # Environment Configuration (env) Allows editing / adding / deleting the daemon's environment variables. Subcommands: * add - adds a new value; overwrites the old one if it exists * remove - removes an environment variable * append - appends to an environment variable using the path separator — for example, on Linux: `$PATH:new_value` and so on. ```shell myrootcommand daemon env append PATH /path/to/my/external/files myrootcommand daemon restart ```