Skip to main content

install-script-generator

Generate cross-platform install scripts for any software or library — a standalone install.sh runnable via a curl/wget one-liner with OS, arch, and package manager detection. Don't use for Dockerfiles, CI/CD pipelines, or one-off shell scripts.

ソース情報

リポジトリ
luongnv89/skills
ソースの最終更新活動
2026年10月6日 18:18
検出された SKILL.md の言語
英語
スター
131
フォーク
18

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

ファイルエクスプローラー
11 ファイル

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
install-script-generator
description
Generate cross-platform install scripts for any software or library — a standalone install.sh runnable via a curl/wget one-liner with OS, arch, and package manager detection. Don't use for Dockerfiles, CI/CD pipelines, or one-off shell scripts.
license
MIT
effort
high
metadata
{"version":"2.3.0","author":"Luong NGUYEN <luongnv89@gmail.com>"}
# Install Script Generator Generate robust, cross-platform installation scripts that users can run with a **single bash command** via GitHub raw URLs. This SKILL.md is a lean index — long templates and tables live under `references/` to protect the agent's context budget. ## When to Use - The user asks for a `curl | bash` one-liner for their project. - A repo needs a `install.sh` that auto-detects OS, arch, and package manager. - A Python/Go/Node/Rust module should be installable in one command from a fresh machine. Skip this skill for Dockerfiles, CI/CD pipelines, or one-off local shell scripts. ## Prerequisites - The repo has a known `<owner>/<repo>` (check `git remote -v`) and a default branch. - The target software's build system is identifiable (`Makefile`, `package.json`, `setup.py`, `Cargo.toml`, `go.mod`, etc.). - `python3` is available locally for the helper scripts under `scripts/`. If `python3` is missing, skip each helper-script step, record it as `not run (python3 not found)`, and continue; the run then ends `PARTIAL`. ## Reference Files (read on demand to save tokens) | File | When to read | |------|--------------| | `references/install-template.md` | When generating `install.sh` — full bash template with detection helpers, dependency installer, and main entry point | | `references/readme-snippet.md` | When updating the README — copy-paste install block plus URL format notes | | `references/edge-cases.md` | When handling unusual OS/sudo/path scenarios and writing step reports | | `references/final-report.md` | When writing the final report — the four parts, status rules, outcome table, examples, reader checks | | `scripts/env_explorer.py` | Local environment probe (OS, arch, package managers, sudo) | | `scripts/plan_generator.py` | Generates `installation_plan.yaml` from env + target | | `scripts/executor.py` | Dry-runs `installation_plan.yaml` with rollback, before Phase 3 generation | | `scripts/doc_generator.py` | Renders user-facing `USAGE_GUIDE.md` | Do not inline these contents into the conversation; link to them to preserve the context window. ## Repo Sync Before Edits (mandatory) Run this once, before Phase 1. Before creating, updating, or deleting files in an existing repo, sync the current branch with remote: ```bash branch="$(git rev-parse --abbrev-ref HEAD)" git fetch origin git pull --rebase origin "$branch" ``` If the working tree is dirty, `git stash push -u -m pre-sync` first, sync, then `git stash pop`. If `origin` is missing or rebase/stash conflicts occur, stop and ask the user before continuing. ## Workflow A **fix attempt** is one edit followed by a rerun of the failed check. Stop after 3 fix attempts on the same check, record the check as failed, and continue to the next phase. To **stop with `BLOCKED`**, skip the remaining phases and print the final report. ### Phase 1 — Exploration 1. Identify the target software/module/tool. If the user did not name it and the repo holds more than one buildable project, ask which one. 2. Inspect the repo for build files (`Makefile`, `package.json`, `setup.py`, `Cargo.toml`, `go.mod`, ...). 3. Record the install method: the package name, if the target is published in a package manager, or the build-and-copy commands from its build file. If neither exists, ask the user. If the user gives no install method, stop with `BLOCKED`. 4. List dependencies the software needs to build and run. 5. Run `git remote get-url origin` to read `<owner>/<repo>`. 6. Run `git symbolic-ref --short refs/remotes/origin/HEAD` and strip `origin/` to read the default branch. 7. If step 5 or step 6 fails, ask the user for the value. If the user gives no answer, stop with `BLOCKED`. 8. Run `python3 scripts/env_explorer.py` to capture OS, arch, package managers, shell, and sudo availability into `env_info.json`. ### Phase 2 — Planning 1. Order the dependencies so each one installs before anything that needs it. 2. For each dependency, note the `command -v <dep>` check `install.sh` uses to skip one that is already installed. 3. Run `python3 scripts/plan_generator.py --target "<name>" --env-file env_info.json --deps <dep1> <dep2> ...` (dependencies from step 1, space-separated; omit `--deps` only if there are none) to emit `installation_plan.yaml`. 4. If the target is not published in the detected package manager, edit the `Install <name>` step in `installation_plan.yaml`: set `command`, `verify`, and `rollback` to the commands `install_<tool>` will run. 5. Replace every `# TODO` placeholder in the plan. Add a step for each dependency that `plan_generator.py` warned it left out. 6. Run `python3 scripts/executor.py --plan installation_plan.yaml --dry-run`. 7. Check the dry run: it exits 0, its last summary line starts `DRY RUN:`, stderr has no `placeholder command` warning, the steps follow the step 1 order, and every `Install ...` step has a non-null `rollback`. The package-manager check and final verify steps carry `rollback: null` by design. If a check fails, fix the plan and rerun step 6. The dry run skips execution, so it checks the plan's shape, not that installation or rollback actually works. ### Phase 3 — Generation (primary output) If `install.sh` already exists at the repo root, show the user the planned changes and ask before overwriting it. If the user declines, stop with `BLOCKED`. Generate `install.sh` at the repo root using `references/install-template.md`. The template contains four sections you compose: 1. Header + colour helpers (`info`, `ok`, `warn`, `err`, `die`). 2. Detection helpers (`detect_os`, `detect_arch`, `detect_package_manager`, `need_sudo`). 3. `install_deps` switch covering apt/dnf/yum/pacman/brew/zypper. 4. `install_<tool>` (customised per target), `verify_installation`, and `main`. Read `references/install-template.md` for the exact code; do not paste it into chat. If Windows support is needed, also generate `install.ps1` (one-liner: `irm <raw_url> | iex`). Then check the script. If a check fails, fix `install.sh` and rerun that check: 1. `bash -n install.sh` exits 0. 2. `grep -nE '<owner>|<repo>|<branch>|<software_name>|<Software Name>|install_<tool>' install.sh` prints nothing. 3. If `shellcheck` is on PATH, `shellcheck -S error install.sh` exits 0. Otherwise record `shellcheck not run (not on PATH)`. Do not run `install.sh` on the user's machine: it installs software and may call `sudo`. Run it only when the user asks for a local run or approves a disposable container. When it runs, its last line must be `[ OK ] Installation complete!`. ### Phase 4 — Documentation 1. Insert the install block from `references/readme-snippet.md` into the project README, substituting `<owner>/<repo>/<branch>`. If the repo has no README, create `README.md` holding only that block. 2. Run `python3 scripts/doc_generator.py --target "<name>" --plan installation_plan.yaml` to emit `USAGE_GUIDE.md`. 3. Run `grep -n "raw.githubusercontent.com/<owner>/<repo>/<branch>/install.sh" <README>` with the real values; it must print one or more lines. 4. If `git ls-tree --name-only origin/<branch> install.sh` prints `install.sh`, run `curl -fsSI <raw-url>` and record the HTTP status. Otherwise record `raw URL not live until install.sh is pushed`. 5. Print the final report. ## Final Report Print it once, as plain text in the chat, after the last Step Completion Report. Four parts, in order: `Result:` (status, target, one-liner), `Evidence:` (only checks that ran, with results), `Uncertainty:` (untested behavior, including `install.sh was not executed`), and `Decision:` (the approval needed, or `No approval needed.`, then the push and cleanup actions). Read `references/final-report.md` for each part's contents, the outcome table, and examples. Apply the first status rule that matches: 1. `BLOCKED — <reason>` — `install.sh` was not written. 2. `PARTIAL — <reason>` — `install.sh` was written, and a required check failed or did not run: `bash -n`, the placeholder `grep`, `shellcheck -S error` (when on PATH), the Phase 2 dry run, the README one-liner, `USAGE_GUIDE.md`, or an approved run of `install.sh` that did not end with `[ OK ] Installation complete!`. 3. `COMPLETE` — every required check passed. `COMPLETE` does not mean `install.sh` ran. ## Output Files | File | Description | |------|-------------| | `install.sh` | Primary output — standalone installer for `curl \| bash` | | `install.ps1` | Optional Windows PowerShell installer | | `USAGE_GUIDE.md` | User-facing docs | | `env_info.json` | Local environment probe (working file) | | `installation_plan.yaml` | Ordered install steps (working file) | | `install_report.md` | Dry-run report from `executor.py` (working file) | The three working files hold this machine's home path and `PATH`. Do not commit them unless the user asks; list them under `Decision:` for cleanup. ## Acceptance Criteria - `install.sh` exists at repo root, starts with `#!/usr/bin/env bash` and `set -euo pipefail`, and passes the three Phase 3 checks. - Auto-detects OS, architecture, and package manager; exits non-zero with a clear message on unsupported targets. - Handles `sudo` gracefully (root, sudo, or fail-fast). - Verifies the installation at the end (`command -v $TOOL_NAME` plus `--version` when available). - README contains a `curl -sSL ... | bash` one-liner that points at the raw GitHub URL for `<owner>/<repo>/<branch>`. - When `install.sh` runs successfully, its last line is `[ OK ] Installation complete!`. - The final report opens with `Result:` and a status from the rules above, and meets the four reader checks in `references/final-report.md`: result findable, facts apart from assumptions, claims traceable, next decision clear. ## Edge Cases See `references/edge-cases.md` for the full list. Highlights: - **Unsupported OS / architecture** — `die` with the detected value; user sees what failed. - **No package manager** — `install_deps` aborts with `Unsupported package manager 'unknown'`. - **No sudo** — `need_sudo` exits with `Requires root. Run as root or install sudo.` - **Windows native** — generate `install.ps1` separately; `install.sh` warns under MSYS/Cygwin. - **Script in subdirectory** — adjust the raw URL path; note it in the README snippet. - **Target not in a package manager** — edit its plan step (Phase 2 step 4) and write `install_<tool>` from the build file. ## Step Completion Reports After each phase, emit a `◆` block with `√`/`×` checks and a `Result: PASS | FAIL | PARTIAL` line; the format and per-phase checks are in `references/edge-cases.md`. ## Expected Output The final report for a complete run (full example in `references/final-report.md`): ```text Result: COMPLETE — mytool installer curl -sSL https://raw.githubusercontent.com/owner/mytool/main/install.sh | bash Evidence: bash -n install.sh: exit 0; placeholder grep: no matches; shellcheck -S error: exit 0 executor.py --dry-run: "DRY RUN: 5 step(s) listed for mytool; nothing was executed." Uncertainty: install.sh was not executed. Raw URL not live until install.sh is pushed to main. Decision: No approval needed. Remaining action: commit and push install.sh; delete the three working files. ``` When a user later runs the one-liner, the script's banner ends: ``` [INFO] OS: linux | Arch: x86_64 | Package Manager: apt [ OK ] Dependencies installed [ OK ] mytool 1.2.0 installed [ OK ] Installation complete! ```
GitHubで見る