Skip to content

feat(installer): report command instead of editing shell files - #1

Merged
ShulhaOleh merged 4 commits into
mainfrom
feat/installer-architecture
Sep 20, 2026
Merged

ShulhaOleh merged 4 commits into
mainfrom
feat/installer-architecture

Conversation

@ShulhaOleh

Copy link
Copy Markdown
Member

The engine no longer detects the user's shell or edits startup files. After an install it reports the installed path, whether the canonical command resolves in the current environment, any other copy on PATH, and the optional sudo ln -s <path> /usr/local/bin/<command> when the command is not reachable.

  • command_name (default project_name) names the AppImage/macOS entry and every lookup
  • macOS executable read from Info.plist; macos_executable_name is now an override
  • native installs report what the package put in /usr/bin; a package without the command is reported, not rejected (CI enforces packaging via tests/check-consumer.sh / consumer-check.yml)
  • the uninstall manifest accumulates mget-owned installs, prunes vanished targets, removes all on --uninstall, and lists leftovers including a dangling /usr/local/bin symlink
  • sudo refused before network; --dry-run never prompts; add_to_path accepted and ignored
  • deferred cleanup recorded in docs/planned-breaking-changes.md

No CFG_* removed, no flag changed, -y removes nothing new, old manifests still uninstall.

Tests: tests/run.sh (12 cases) on Ubuntu and a Fedora container on every push; passed locally on Debian 13 and Fedora 43. macOS is covered by the existing macos-integration job. refract-packaging stays continue-on-error until Refract ships the renamed executable.

… files

The engine no longer detects the user's shell or appends to any startup
file. After installing it reports the installed path, whether the
canonical command resolves in the current environment and to what, any
other copy on PATH, and, when the command is not reachable, the optional
system-wide symlink the user can create themselves.

- add command_name (defaults to project_name) as the public command; the
  AppImage/macOS entry in install_dir is named after it
- derive the macOS executable from Info.plist; macos_executable_name
  becomes an optional override
- report the executables a .deb/.rpm actually placed in /usr/bin, and say
  so when the package does not provide the command
- accumulate every mget-owned install in the uninstall manifest, prune
  entries whose target is gone, remove all of them on --uninstall,
  tolerate already-removed entries, and list what still answers to the
  command afterwards, including a dangling /usr/local/bin symlink
- compare command copies by file identity so merged-usr aliases are one copy
- refuse to run under sudo before any network access
- --dry-run never prompts and no longer claims a package installs into
  install_dir
- warn when no fusermount is available for an AppImage
- add_to_path is accepted and ignored
- force LF for shell scripts on every checkout
tests/run.sh drives the real engine against the modrex release and a
pinned Refract release with a throwaway HOME per case: no shell startup
file changes, availability and shadowing reports, accumulated installs,
uninstall leftovers, dangling symlink reporting, manifests from earlier
releases, a package without the canonical command, sudo refusal and
non-interactive dry runs. It runs on Ubuntu and in a Fedora container on
every push.

tests/check-consumer.sh verifies a consumer release ships the canonical
executable in every Linux and macOS artifact; ci.yml runs it for modrex
and Refract, and consumer-check.yml exposes it as a reusable workflow.
…changes

Describe what the engine reports instead of shell configuration, the
command_name field, the deprecated add_to_path and macos_executable_name
fields, accumulated uninstall semantics, the sudo refusal, the generic
CFG_* forwarding contract for bootstraps, the new test jobs and the
consumer packaging check. Add docs/planned-breaking-changes.md for
cleanup deferred to the next major.
Merge earlier manifest entries only when the previous record has the same
project and install_dir; otherwise the new install starts a fresh record,
as before. Label a copy as recorded only when the manifest lists its path
or the package that owns it (dpkg -S / rpm -qf), read CFBundleExecutable
with defaults(1) where plutil has no raw output, tolerate a failing
AppImage extraction in the consumer check, pin the reusable workflow to
its own commit, and send GITHUB_TOKEN to the GitHub API when present.
@ShulhaOleh ShulhaOleh changed the title feat(installer): report command availability instead of editing shell files feat(installer): report command instead of editing shell files Sep 20, 2026
@ShulhaOleh
ShulhaOleh merged commit dba54aa into main Sep 20, 2026
9 of 10 checks passed
@ShulhaOleh
ShulhaOleh deleted the feat/installer-architecture branch September 20, 2026 01:08
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.

1 participant