diff --git a/.github/skills/zi-install/SKILL.md b/.github/skills/zi-install/SKILL.md index 983c90c..25ad850 100644 --- a/.github/skills/zi-install/SKILL.md +++ b/.github/skills/zi-install/SKILL.md @@ -2,10 +2,10 @@ description: Install or update the Zi plugin manager on a user's machine on their behalf, non-interactively, through the official installer and its flags, then verify the result. Never write .zshrc or the Zi configuration home directly. metadata: github-path: .github/skills/zi-install - github-pinned: c26699d42c1bb9152fc2a4f92d1872fec2430166 - github-ref: c26699d42c1bb9152fc2a4f92d1872fec2430166 + github-pinned: ce74af22db3af827eed9558596275cdf3fb07505 + github-ref: ce74af22db3af827eed9558596275cdf3fb07505 github-repo: https://github.com/z-shell/.github - github-tree-sha: 698e0845b8cfdd546f24d96cef706febaf3caec4 + github-tree-sha: c0115d60db843d3e53af79fb6a56106736231bc0 name: zi-install --- @@ -17,16 +17,15 @@ Canonical long-form user guidance lives in the [Z-Shell Wiki: Installation](http ## Choose the profile -The installer entrypoint defaults to the `loader` profile. Supported profiles for agent-driven installation: +The installer entrypoint defaults to the `loader` profile. Profiles offered for a new installation: | Profile | Command suffix | Effect on `.zshrc` | | ------------ | -------------- | -------------------------------------------------------------- | | Loader | `-a loader` | Adds the short managed block sourcing `setup.zsh` (default) | | Annex | `-a annex` | Adds the short managed block with recommended annexes deferred | -| ZUnit | `-a zunit` | Adds the short managed block with annexes and ZUnit deferred | | Install only | `-i skip` | No `.zshrc` change; the user integrates Zi themselves | -Prefer Loader for a new setup. Use `-i skip` when the user manages their dotfiles elsewhere; then hand them the block from the [installation page](https://wiki.zshell.dev/docs/getting_started/installation) instead of editing anything. `-b ` selects a Zi branch or tag (defaults to `main`). Note that the direct profile (`-a direct`) is deprecated and mapped to `loader`. +Prefer Loader for a new setup. Never offer the `zunit` profile (`-a zunit`) for a new setup; it is compatibility-only and retained strictly so existing installations can be migrated without data loss. Use `-i skip` when the user manages their dotfiles elsewhere; then hand them the block from the [installation page](https://wiki.zshell.dev/docs/getting_started/installation) instead of editing anything. `-b ` selects a Zi branch or tag (defaults to `main`). Note that the direct profile (`-a direct`) is deprecated and mapped to `loader`. ## Resolve the environment first @@ -69,7 +68,7 @@ Report a failed fetch or a failed verification as a failed install; never procee Read the result, do not assume it: - exit 0 and `Successfully installed at `: proceed to verification. The closing `Successfully installed Zi.` banner confirms completion; -- `Zi installer: recipe installation is deferred to the first shell start.`: expected output when installing with `-a annex` or `-a zunit`; recipes install on first shell launch; +- `Zi installer: recipe installation is deferred to the first shell start.`: expected output when installing with `-a annex` (or compatibility `-a zunit`); recipes install on first shell launch; - `Zi installer: the direct zi.zsh profile is deprecated; using the guided loader profile.`: informative notice if `-a direct` was passed; - `managed .zshrc block changed outside Zi setup; apply the printed patch manually or restore the receipt state`: the managed block was modified; show the printed patch to the user and stop, do not overwrite; - `unrecognised Zi integration remains in .zshrc; refusing to initialise Zi twice`: an existing unmanaged Zi integration was detected; report it as a conflict and let the user decide; do not edit `.zshrc` to force it; @@ -84,7 +83,7 @@ Rerunning the installer is the update path: it fetches and fast-forwards the exi ## The managed .zshrc block -For integrated profiles (`loader`, `annex`, `zunit`), the installer writes or updates a short 3-line marker-delimited block in `${ZDOTDIR:-$HOME}/.zshrc`: +For integrated profiles (`loader`, `annex`, or compatibility `zunit`), the installer writes or updates a short 3-line marker-delimited block in `${ZDOTDIR:-$HOME}/.zshrc`: ```zsh # >>> zi setup >>> @@ -94,6 +93,24 @@ source '/absolute/path/to/config/zi/setup.zsh' User dotfiles stay readable and minimal. Implementation details, path checks, error handling, loader startup (`init.zsh && zzinit`), and post-load recipes (`setup/shell.zsh`) are encapsulated in the generated `setup.zsh` entrypoint. +## Machine interface + +For a source revision that provides `zi-setup-describe-v1` and `zi-setup-result-v1` (introduced by [z-shell/src#224](https://github.com/z-shell/src/pull/224)), use the versioned machine interface rather than parsing human stdout or stderr. Routine installs and older source revisions continue to use the verified `install.sh` flow above; do not assume the machine artifacts exist. + +Drive the engine only from a local `src` tree or a same-revision companion bundle containing `setup.sh`, `init.zsh`, `profiles.tsv`, and `checksum.txt` after verifying the published checksums. For a fetched bundle, pass the explicit `--profiles` path to `describe`, and the explicit `--init`, `--profiles`, and `--checksum` paths to `plan`. + +- **Directory artifacts:** Commands communicate through private directory artifacts with fixed relative paths containing raw bytes or restricted tokens (avoiding shell-level JSON escaping). Each destination must not exist, and its immediate parent must already exist and be writable: + - `setup.sh describe --output DIR`: Publishes a `zi-setup-describe-v1` artifact containing `facts/` and `profiles/` (`loader` and `annex`; legacy `zunit` is marked `selectable=no` if detected). Exits 3 if all profiles are blocked. + - `setup.sh plan --plan DIR`: Publishes a deterministic `zi-setup-plan-v1` artifact containing `plan.id`, `plan.meta`, `checkout/`, `targets/`, `operations/`, and `warnings/`. + - `setup.sh apply --plan DIR --phase checkout|files [--expect SHA256] [--result DIR]`: Applies the plan phase-by-phase. +- **Exact plan-id approval:** The plan hash covers all artifact files except `plan.id`. Clients must record the reviewed `plan.id` and pass it via `--expect` for both checkout and files phases. Changed artifact content produces `plan-changed`; changed live checkout or file preconditions produce `checkout-drift` or `target-drift`. +- **Result artifacts:** Passing `--result DIR` to `apply` publishes a `zi-setup-result-v1` artifact containing `format`, `plan.id`, `phase`, `status` (`succeeded`, `failed`, `cancelled`), and `operations/`. Failures also contain `error/code` and `error/detail`, plus `error/operation` when attributable to one operation. A successful files phase contains `receipt/path`. +- **Stable exit statuses and error codes:** + - Exit statuses: `0` (success), `2` (invocation or unsupported version), `3` (non-actionable discovery/plan), `4` (reviewed state or lock precondition changed, including plan, checkout, target drift, or lock contention), `5` (apply operation began but did not complete), `6` (cancelled). + - Error codes (`error/code`): stable ASCII identifiers including `unsupported-version`, `plan-changed`, `target-drift`, `checkout-drift`, `lock-held`, `network-failed`, `checkout-failed`, `write-failed`, and `cancelled`. +- **Untrusted display text:** Operation summaries and warnings are display text. Clients must treat them as untrusted terminal content and strip or visibly escape control sequences. Decisions must rely solely on IDs and restricted tokens, never on display text. +- **Do not parse human stdout/stderr:** Engine stdout and stderr are strictly for user presentation or diagnostics; their wording carries no compatibility promise. Never parse human stdout or stderr to make decisions; consume only documented directory artifacts and exit statuses. + ## Verify Start a fresh interactive shell, the way the user will, and ask Zi for its help text: @@ -124,4 +141,4 @@ For `-i skip`, verify only that `zi.zsh` exists beneath the directory the instal ## Report -State the profile used, the exact files created or changed, what was preserved, any installer messages or refusals verbatim, and the next step for the user: `exec zsh` after integrated installation (`loader`, `annex`, `zunit`); or for `-i skip`, first add the integration block from the [installation page](https://wiki.zshell.dev/docs/getting_started/installation) to their own `.zshrc`, then `exec zsh`. +State the profile used, the exact files created or changed, what was preserved, any installer messages or refusals verbatim, and the next step for the user: `exec zsh` after integrated installation (`loader`, `annex`, or compatibility `zunit`); or for `-i skip`, first add the integration block from the [installation page](https://wiki.zshell.dev/docs/getting_started/installation) to their own `.zshrc`, then `exec zsh`. diff --git a/contracts/installer-contract-v1.json b/contracts/installer-contract-v1.json index e85a740..20c622d 100644 --- a/contracts/installer-contract-v1.json +++ b/contracts/installer-contract-v1.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "contract_version": 1, + "contract_version": 2, "evidence_reviewed": "2026-09-20", "renames": [], "surfaces": [ @@ -45,7 +45,7 @@ "path": "docs/getting_started/01_installation.mdx", "scope": "external", "evidence_status": "published", - "evidence": "https://github.com/z-shell/wiki/blob/2270e295dfa7a87f773009c374f76de61aa54e24/docs/getting_started/01_installation.mdx", + "evidence": "https://github.com/z-shell/wiki/blob/293d23e6238b50bda15ac85b7f8fa9bdbc95be66/docs/getting_started/01_installation.mdx", "surfaces": [ "cli-profile-behavior", "output-status-messages", @@ -59,7 +59,7 @@ "path": ".github/skills/zi-install/SKILL.md", "scope": "external", "evidence_status": "published", - "evidence": "https://github.com/z-shell/.github/blob/c26699d42c1bb9152fc2a4f92d1872fec2430166/.github/skills/zi-install/SKILL.md", + "evidence": "https://github.com/z-shell/.github/blob/ce74af22db3af827eed9558596275cdf3fb07505/.github/skills/zi-install/SKILL.md", "surfaces": [ "cli-profile-behavior", "output-status-messages", @@ -111,8 +111,8 @@ "repository": "z-shell/zi", "path": "README.md", "scope": "external", - "evidence_status": "pending", - "evidence": "https://github.com/z-shell/zi/blob/3e331cf715474b9066f1ff835b01e67035a38c15/README.md", + "evidence_status": "published", + "evidence": "https://github.com/z-shell/zi/blob/67fbb057fe05bc5664c0e558185a18b34a81defb/README.md", "surfaces": ["cli-profile-behavior", "companion-asset-checksum"] } ] diff --git a/docs/README.md b/docs/README.md index 9963c33..4c6ef45 100644 --- a/docs/README.md +++ b/docs/README.md @@ -49,6 +49,11 @@ reviewable plan, and applies the checkout and configuration as separate phases. The `loader`, `annex`, and `zunit` profiles all use that planner. The `-i skip` profile installs Zi without changing `.zshrc`. +The source-adjacent [Zi Setup TUI contract](zi-setup-tui-contract.md) defines +the machine interface and acceptance boundary for a future guided terminal +client. The client offers `loader` and `annex`; `zunit` remains +compatibility-only for existing installer output. + ## Repository layout | Path | Purpose | diff --git a/docs/zi-setup-tui-contract.md b/docs/zi-setup-tui-contract.md new file mode 100644 index 0000000..7f36c0a --- /dev/null +++ b/docs/zi-setup-tui-contract.md @@ -0,0 +1,212 @@ +# Zi Setup TUI contract + +## Status and purpose + +This document defines the engine contract and next terminal-interface milestone after the guided setup planner shipped in `src` pull request 221. It refines the broader Zi Setup product proposal into a bounded terminal interface that delegates all installation and configuration changes to `public/sh/setup.sh`. + +The terminal interface is a client of the setup engine. It does not resolve Zi paths independently, generate startup files, edit `.zshrc`, install recipes, or reinterpret a plan. Normal shell startup remains independent of the interface. + +[Issue 222](https://github.com/z-shell/src/issues/222) records the interface trigger required by [ADR-0025](https://github.com/z-shell/.github/blob/main/decisions/0025-guided-setup-planner-first.md): the planner's manual commands and artifact layout require installer knowledge that blocks the intended guided onboarding experience. + +## Revised implementation brief + +Build a local Zi Setup TUI pilot that guides a user through discovery, profile selection, review, apply, and results. Use the existing `src` planner as the only authority for resolved paths, generated Zsh, preconditions, file content, checkout operations, and receipts. + +The pilot supports two selectable profiles: + +- `loader`, presented as **Zi only**. +- `annex`, presented as **Zi with annexes**. + +The `zunit` profile is not a user-facing setup choice. The engine keeps support for it so existing installer output can be migrated without data loss. When discovery or planning retains a legacy `zunit` configuration, the interface identifies it as preserved compatibility content and does not recommend it to new users. + +The pilot must complete one real flow in a disposable home: + +`Discover -> Choose -> Review -> Apply -> Result` + +The Review screen shows the exact plan identity, checkout operation, target paths, generated Zsh, file diffs, deferred first-start work, warnings, and manual steps. Apply invokes the engine with the reviewed plan hash. Reopening the interface against the resulting home must report no content changes. The new plan hash may differ because current-file preconditions are part of the artifact. + +Use Go with Bubble Tea v2, Lip Gloss v2, and only the Bubbles components needed by the pilot. The interface must remain usable at 80x24, support keyboard-only navigation, restore the terminal after errors and signals, honor `NO_COLOR`, and provide a linear `--plain` presentation. Rich previews use deterministic sample data and are clearly labelled as simulations. + +The pilot does not include arbitrary plugin selection, a marketplace, prompt replacement, removal of another manager, system package installation, font changes, `chsh`, a background service, current-shell mutation, or automatic migration of unknown Zsh configuration. + +## Ownership + +`src` owns the setup engine, versioned interface artifacts, profile mapping, generated Zsh, plan validation, application, and receipts. The eventual `zi-setup` package owns terminal interaction, presentation state, synthetic previews, accessibility modes, and process orchestration. + +The interface may display engine output for diagnostics, but it must not parse human-readable stdout or stderr to make decisions. It consumes only documented interface artifacts and exit statuses. + +## Engine interface + +### Design rules + +The interface uses directory artifacts rather than JSON written by portable shell. Each field has a fixed relative path and contains raw bytes or one restricted token. This avoids shell-level JSON escaping and keeps paths with spaces unambiguous. Artifact directories are private temporary directories chosen by the caller. + +Each new artifact begins with a `format` file containing its exact schema identifier. The existing plan artifact keeps its `format` key in `plan.meta`. Consumers reject unknown major versions. The output, plan, and result destinations must not exist, and their immediate parents must already exist and be writable. Writers publish each artifact by creating a private staging directory beside the destination and renaming the completed directory into place. + +The engine owns validation of all user-controlled values. The client passes arguments as an argument array and never evaluates engine output. + +### Commands + +The existing `plan` and `apply` commands remain the mutation boundary. The engine exposes these machine-facing artifacts: + +```text +setup.sh describe --output DIR [--zi-home DIR] [--zi-bin-dir NAME] + [--config-home DIR] [--zshrc FILE] [--profiles FILE] + [--skip-zshrc] +setup.sh plan --plan DIR [existing options] +setup.sh apply --plan DIR --phase checkout|files [--expect SHA256] + [--result DIR] +``` + +`describe` performs bounded read-only discovery. It does not source `.zshrc`, `init.zsh`, Zi, or plugins. It still publishes a describe artifact when all profiles are blocked, then exits with status 3. `plan` remains deterministic for the same filesystem inputs and selected options. `apply` continues to validate the complete plan and relevant preconditions before mutation. When `--result` is present, it publishes a result for validation failures, completed phases, operation failures, and cancellation. Omitting `--result` preserves the existing shell interface. + +Human-readable stdout and stderr remain available for direct shell use. Their wording is not part of the interface contract. + +### Describe artifact + +`zi-setup-describe-v1` contains: + +```text +format +facts/order +facts//value +facts//source +facts//confidence +profiles/order +profiles//selectable +profiles//reason +profiles//title +``` + +Fact IDs and profile IDs use lowercase ASCII letters, digits, and hyphens. `source` is one of `observed`, `inferred`, `confirmed`, or `unknown`. `confidence` is one of `certain`, `likely`, or `unknown`. `selectable` is `yes` or `no`. + +Version 1 writes facts in this order: `config-home`, `zi-home`, `checkout-path`, `zi-home-state`, `zshrc-path`, `zshrc-state`, `git`, `zsh`, `tty`, and `existing-profile`. `zi-home-state` is `selected` or `ambiguous`. `zshrc-state` is `skipped`, `symlink`, `file`, `other`, or `missing`. The `git` and `zsh` values are `available` or `missing`, `tty` is `yes` or `no`, and `existing-profile` is `none`, `loader`, `annex`, or `zunit`. `zi-home` and `checkout-path` contain `unknown` when both supported Zi homes exist without one safe identity. + +Version 1 lists `loader` and `annex` in that order. They are selectable when the Zi home is unambiguous and both Git and Zsh are available. If an exact legacy `zunit` block or a `zunit` receipt is detected, `zunit` appears with `selectable=no` and a reason explaining its compatibility-only status. The interface must not synthesize choices absent from this artifact. + +### Plan artifact + +The shipped `zi-setup-plan-v1` directory is a documented read contract for the fields below. Existing content and precondition files remain engine-owned. + +```text +plan.id +plan.meta +checkout/kind +checkout/head +checkout/current-ref +checkout/origin +checkout/requested-ref +targets/order +targets//path +targets//kind +targets//expected +targets//mode +targets//content +targets//block-hash # only when applicable +operations/order +operations//phase +operations//kind +operations//summary +operations//interruptible +warnings/order +warnings//severity +warnings//summary +warnings//remediation +``` + +`plan.meta` remains restricted `key=value` data whose values cannot contain newline or tab. Version 1 writes `format`, `profile`, `ref`, `config_home`, `checkout_path`, `receipt_path`, and `skip_zshrc`. Other files contain raw bytes unless their values are explicitly restricted tokens. + +Version 1 always lists `checkout-sync` and `write-files` operations. `checkout-sync` has phase `checkout`, kind `clone` or `fast-forward`, and `interruptible=no`. `write-files` has phase `files`, kind `write-files`, and `interruptible=no`. Warning severity is one of `info`, `warning`, or `critical`. The current conditional warning IDs are `deferred-first-start`, `legacy-zunit`, and `zshrc-skipped`. + +Operation summaries and warnings are display text. The client treats them as untrusted terminal content and strips or visibly escapes control sequences. Decisions use IDs and restricted fields, never summary text. + +The plan hash covers every artifact file except `plan.id`, as it does today. Any field change produces a new plan identity. The TUI stores the reviewed `plan.id` and always passes it through `--expect` for both phases. + +### Apply result artifact + +`zi-setup-result-v1` contains: + +```text +format +plan.id +phase +status +operations/order +operations//status +operations//detail +error/code # present on failure +error/operation # present when attributable +error/detail # present on failure +receipt/path # present after successful files phase +``` + +`status` and operation status are restricted tokens: `pending`, `running`, `succeeded`, `failed`, `cancelled`, or `unknown`. A completed version 1 artifact uses `succeeded`, `failed`, or `cancelled`. Error codes are stable ASCII identifiers including `unsupported-version`, `plan-changed`, `target-drift`, `checkout-drift`, `lock-held`, `network-failed`, `checkout-failed`, `write-failed`, and `cancelled`. + +`operations/order` contains the phase operation when execution reached or completed that operation, and is empty for a global failure. `error/operation` is omitted when the failure is not attributable to an operation, including unsupported versions, changed plan content, and a lock already held before the operation begins. + +The first pilot may publish the result only when a phase exits. Streaming operation events are deferred until real UI testing shows they are needed. The TUI displays the planned operation name while a phase runs and shows sanitized subprocess logs in an optional details view. + +### Exit status contract + +- `0`: requested operation succeeded; its result artifact is complete when `--result` was requested. +- `2`: invocation or unsupported interface version. +- `3`: discovery or planning cannot produce an actionable artifact. +- `4`: a plan, checkout, or file precondition changed. +- `5`: an apply operation began but did not complete. +- `6`: the user or supervising process cancelled the operation. + +The result artifact carries the specific reason. The exit status only selects the broad recovery path. + +## TUI states + +The TUI owns presentation state and maps it to engine actions as follows: + +| State | Engine interaction | Required presentation | +| -------------- | ------------------------ | ------------------------------------------------------------------------------------------------ | +| Discover | `describe` | Observed paths, Zsh availability, existing Zi evidence, uncertainties, and blockers | +| Choose | None | Zi only and Zi with annexes; preserve a detected legacy choice | +| Review | `plan` | Plan hash, checkout operation, exact paths, generated Zsh, diffs, warnings, and first-start work | +| Apply checkout | `apply --phase checkout` | Named operation, cancellation boundary, sanitized details, and result | +| Apply files | `apply --phase files` | Named operation, changed targets, receipt path, and result | +| Result | Optional new `plan` | Completed work, deferred first-start work, manual steps, and no-content-change verification | + +Going backward discards the old plan and creates a new one after choices change. A plan is never edited in place. Resizing and theme changes preserve the selected profile and current review position. + +## Acceptance matrix + +| Scenario | Expected engine result | Expected TUI behavior | +| ---------------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| Fresh home, Zi only | `loader` plan with missing checkout and new managed files | Review all paths, apply both phases, show receipt, then reopen with no content changes | +| Fresh home, annexes | `annex` plan with deferred first-start recipes | Explain deferred work before approval and repeat it on the result screen | +| Exact legacy loader block | Safe migration plan | Show removed legacy block and new managed block in the diff | +| Exact legacy `zunit` block | Compatibility migration retains `zunit` | Identify preserved legacy content; do not present `zunit` as a selectable recommendation | +| Unknown Zi integration | No actionable plan | Preserve files and offer engine-produced remediation or patch guidance | +| Symlinked `.zshrc` | Files phase refuses with patch guidance | Show manual action; never imply partial success | +| Target changes after review | Files phase reports `target-drift` | Return to Review and require a new plan | +| Checkout HEAD changes after review | Checkout phase reports `checkout-drift` | Preserve checkout and require a new plan | +| Plan content changes | Apply reports `plan-changed` | Refuse apply and discard the plan | +| Network failure during checkout | Checkout result is failed; files phase has not run | Show the failed operation and safe retry path | +| Checkout succeeds, files fail | Separate phase results expose partial application | Report checkout success and file failure without claiming rollback | +| No TTY or `--plain` | Same choices and plan identity as TUI | Render a linear review and require explicit apply input | +| 80x24 terminal | Same model and choices as wide layout | Use one pane with switchable preview sections | +| `NO_COLOR` set | Same content and navigation | Disable color while retaining readable focus markers | +| Interrupt before apply | No mutation | Restore the terminal and retain or discard the plan according to the user's choice | + +## Verification required for the milestone + +- Contract tests for every documented artifact path, restricted token, plan hash input, and exit status. +- Golden fixtures for fresh `loader`, fresh `annex`, retained legacy `zunit`, safe migration, ambiguous integration, symlink refusal, and drift failures. +- Proof that TUI and plain mode produce the same planner arguments and approve the same plan hash. +- Pseudo-terminal tests for navigation, resize, signals, terminal restoration, monochrome mode, and control-sequence sanitization. +- Disposable-home integration tests that apply both phases, inspect the receipt, start the generated configuration with the supported Zsh, and reopen with no content changes. +- Existing `sh tests/installers.sh` coverage on Linux and macOS, plus the current Windows installer checks. + +## Delivery sequence + +1. Record the ADR-0025 interface trigger on [issue 222](https://github.com/z-shell/src/issues/222). +2. Implement and test the versioned engine artifacts in `src` without adding TUI code. +3. Create the local Go package and implement Discover, Choose, and Review against fixtures and the engine contract. +4. Add checkout and files application with exact plan-hash approval and result handling. +5. Validate the full flow in disposable homes, then decide whether streaming events or additional capabilities have earned their maintenance cost. + +No push, pull request, release, or distribution bootstrap is part of this milestone unless separately authorized. diff --git a/public/checksum.txt b/public/checksum.txt index ed2a4e1..7e6e3df 100644 --- a/public/checksum.txt +++ b/public/checksum.txt @@ -1,6 +1,6 @@ 6de66efba021ebcf462e7672577d9f6876f13db55691f04e7009ff7e78d658b8 public/sh/install_zpmod.sh e322f6aea1c7878bdf6d12032fbb83528f7bbccb4738748335373d0c8380cbe5 public/sh/install.sh -5fd4e53be0a80877afd504b6f707d998786c8ceb088b361c49eb5d4d401783eb public/sh/setup.sh +59307dc8e9aa43f35e137913cf41d8916acc6278a0e03ccb365a0ab01e003bae public/sh/setup.sh 08cc893ceb982fc99d17db1966c6c30790cc571e16e4f5392352d995f5252952 public/sh/sync-init.sh fff8d1c340fb1e87c76f80cac2224e28761ccc7e2b117839b7be6f5311a1ac11 public/setup/profiles.tsv c979e39748d1d86ace17a61ff2b1bf6e1224a43291c25bf7fad985d1e9e11af1 public/zsh/init.zsh diff --git a/public/index.html b/public/index.html index 617b8a9..c72ea38 100644 --- a/public/index.html +++ b/public/index.html @@ -262,7 +262,9 @@

Z-Shell / src

href="https://wiki.zshell.dev/docs/getting_started/installation" >Zi Installer - get.zshell.dev + get.zshell.dev ยท verified setup assets