diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..42e452e --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @Spielewoy diff --git a/.github/ISSUE_TEMPLATE/adapter.yml b/.github/ISSUE_TEMPLATE/adapter.yml new file mode 100644 index 0000000..6b245e6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/adapter.yml @@ -0,0 +1,43 @@ +name: Adapter request +description: Request support for another coding CLI or IDE +title: "[Adapter]: " +labels: + - "type: adapter" + - "status: needs triage" +body: + - type: input + id: product + attributes: + label: Product + placeholder: Product name and official website + validations: + required: true + - type: input + id: docs + attributes: + label: Authentication documentation + description: Link to the vendor's current authentication or configuration documentation. + validations: + required: true + - type: textarea + id: boundary + attributes: + label: Known account boundary + description: Where does the product store credentials, sessions, and normal configuration? + validations: + required: true + - type: checkboxes + id: platforms + attributes: + label: Platforms + options: + - label: Windows + - label: macOS + - label: Linux + - type: textarea + id: use-case + attributes: + label: Concurrent use case + description: Explain why two or more accounts must run at the same time. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..72c4a54 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,79 @@ +name: Bug report +description: Report reproducible Multi-CLI behavior +title: "[Bug]: " +labels: + - "type: bug" + - "status: needs triage" +body: + - type: markdown + attributes: + value: Check existing issues and remove all credentials, account identifiers, and private paths before posting. + - type: input + id: version + attributes: + label: Multi-CLI version + placeholder: multi-cli version + validations: + required: true + - type: dropdown + id: operating-system + attributes: + label: Operating system + options: + - Windows + - macOS + - Linux + validations: + required: true + - type: input + id: shell + attributes: + label: Shell and version + placeholder: PowerShell 7.5, Bash 5.2, or Zsh 5.9 + validations: + required: true + - type: input + id: adapter + attributes: + label: Tool or adapter + placeholder: codex, claude-cli, cursor, or not adapter-specific + validations: + required: true + - type: textarea + id: steps + attributes: + label: Reproduction + description: List the shortest commands that reproduce the problem. + placeholder: | + 1. Run ... + 2. Select ... + 3. Observe ... + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + validations: + required: true + - type: textarea + id: diagnostics + attributes: + label: Sanitized diagnostics + description: Paste relevant doctor output or logs after removing secrets and private data. + render: shell + - type: checkboxes + id: checks + attributes: + label: Safety check + options: + - label: I removed tokens, credentials, account identifiers, and private paths. + required: true + - label: I checked for an existing issue. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..79e634a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Security report + url: https://github.com/Spielewoy/multi-cli/security/advisories/new + about: Report vulnerabilities privately. Do not open a public issue. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 0000000..cb45de4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,37 @@ +name: Feature request +description: Propose a focused improvement +title: "[Feature]: " +labels: + - "type: feature" + - "status: needs triage" +body: + - type: textarea + id: problem + attributes: + label: Problem + description: What is difficult today, and who encounters it? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed behavior + description: Describe the smallest useful outcome. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + - type: dropdown + id: platform + attributes: + label: Scope + options: + - Cross-platform + - Windows + - macOS + - Linux + - Documentation only + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 0000000..3be0b67 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,34 @@ +name: Usage question +description: Ask for help using Multi-CLI +title: "[Question]: " +labels: + - "type: question" + - "status: needs triage" +body: + - type: input + id: goal + attributes: + label: What are you trying to do? + validations: + required: true + - type: textarea + id: tried + attributes: + label: What have you tried? + description: Include sanitized commands and output. Never post credentials. + validations: + required: true + - type: input + id: environment + attributes: + label: Version and environment + placeholder: Multi-CLI 1.0.0, Windows 11, PowerShell 7.5 + validations: + required: true + - type: checkboxes + id: checks + attributes: + label: Safety check + options: + - label: I removed credentials and private account data. + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..7af103d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 + +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + groups: + github-actions: + patterns: + - "*" + labels: + - dependencies + - "area: ci" + open-pull-requests-limit: 2 diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..0d5cb6a --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,144 @@ +- name: "type: bug" + color: "d73a4a" + description: Something is broken or behaves incorrectly +- name: "type: feature" + color: "0e8a16" + description: New behavior or capability +- name: "type: adapter" + color: "00a6a6" + description: New or changed coding tool support +- name: "type: documentation" + color: "1d76db" + description: Documentation change +- name: "type: question" + color: "d876e3" + description: Usage or support question +- name: "type: security" + color: "b60205" + description: Security hardening without vulnerability details +- name: "type: maintenance" + color: "cfd3d7" + description: Maintenance, cleanup, or dependency work +- name: "status: needs triage" + color: "fbca04" + description: Needs an initial maintainer review +- name: "status: blocked" + color: "bfd4f2" + description: Cannot proceed until a dependency is resolved +- name: "status: confirmed" + color: "0e8a16" + description: Reproduced or accepted for implementation +- name: "status: duplicate" + color: "cfd3d7" + description: Already tracked elsewhere +- name: "status: wontfix" + color: "ffffff" + description: Not planned for implementation +- name: "good first issue" + color: "7057ff" + description: Suitable for a first contribution +- name: "help wanted" + color: "008672" + description: Community help is welcome +- name: "priority: p0" + color: "7a0000" + description: Release blocker or active security impact +- name: "priority: p1" + color: "d93f0b" + description: High impact and should be handled next +- name: "priority: p2" + color: "fbca04" + description: Normal priority +- name: "priority: p3" + color: "c5def5" + description: Low urgency improvement +- name: "area: cli" + color: "0052cc" + description: Main command line behavior +- name: "area: installer" + color: "5319e7" + description: Install, update, or uninstall behavior +- name: "area: adapters" + color: "00a6a6" + description: Adapter contracts and integrations +- name: "area: profiles" + color: "006b75" + description: Profile lifecycle and isolation +- name: "area: sessions" + color: "0366d6" + description: Session continuation and transfer +- name: "area: docs" + color: "1d76db" + description: Guides, examples, and translations +- name: "area: ci" + color: "6f42c1" + description: Tests and GitHub Actions +- name: "area: release" + color: "006b75" + description: Versioning and release assets +- name: release + color: "006b75" + description: Included in an upcoming release +- name: "platform: windows" + color: "0078d4" + description: Windows specific +- name: "platform: macos" + color: "555555" + description: macOS specific +- name: "platform: linux" + color: "f9d0c4" + description: Linux specific +- name: dependencies + color: "0366d6" + description: Dependency update +- name: claude-cli + color: "d4c5f9" + description: Claude Code CLI adapter +- name: codex + color: "d4c5f9" + description: Codex CLI adapter +- name: codex-gui + color: "d4c5f9" + description: Codex desktop adapter +- name: gemini-cli + color: "d4c5f9" + description: Gemini CLI adapter +- name: opencode + color: "d4c5f9" + description: OpenCode adapter +- name: commandcode + color: "d4c5f9" + description: Command Code adapter +- name: cursor + color: "d4c5f9" + description: Cursor desktop adapter +- name: cursor-cli + color: "d4c5f9" + description: Cursor CLI adapter +- name: copilot-cli + color: "d4c5f9" + description: GitHub Copilot CLI adapter +- name: copilot-vscode + color: "d4c5f9" + description: GitHub Copilot in VS Code adapter +- name: kimi-cli + color: "d4c5f9" + description: Kimi Code CLI adapter +- name: grok-cli + color: "d4c5f9" + description: Grok Build CLI adapter +- name: antigravity + color: "d4c5f9" + description: Antigravity IDE adapter +- name: agy-cli + color: "d4c5f9" + description: Antigravity CLI adapter +- name: kiro + color: "d4c5f9" + description: Kiro adapter +- name: windsurf + color: "d4c5f9" + description: Windsurf adapter +- name: zed + color: "d4c5f9" + description: Zed adapter diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..8188b72 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,15 @@ +## What changed + + + +## Verification + + + +## Checklist + +- [ ] Tests cover the changed behavior. +- [ ] Adapter validation passes when an adapter changed. +- [ ] Documentation matches the implementation. +- [ ] No credentials, account identifiers, local paths, or test evidence are included. +- [ ] The change works on every platform it claims to support. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03b98d4..2150f8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,23 +9,22 @@ on: permissions: contents: read +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: - # The important one: prove that a clean machine can install multi-cli from - # scratch and immediately run its core commands. This is the check that would - # have caught the install failure (missing jq / broken launcher). install-smoke: name: install + run (${{ matrix.os }}) runs-on: ${{ matrix.os }} + timeout-minutes: 20 strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - # Force the installer's own jq-resolution path: both runner images ship - # jq pre-installed, so we remove it first. The installer must put jq back - # (apt-get on Linux, brew on macOS) or the whole CLI is dead on arrival. - name: Remove pre-installed jq so the installer must provide it run: | if command -v apt-get >/dev/null 2>&1; then @@ -48,7 +47,6 @@ jobs: command -v jq jq --version - # The launcher lands in ~/.local/bin (see install.sh BIN_LINK default). - name: doctor / tools / new must all exit 0 run: | export PATH="$HOME/.local/bin:$PATH" @@ -56,34 +54,25 @@ jobs: multi-cli tools multi-cli new codex/ciprofile - # Shell correctness for every .sh and the main launcher. Run at error - # severity: the current tree has only style-level warnings (SC2155 "declare - # and assign separately" x24, SC2115 x1 in `multi-cli`) and zero errors, so - # error severity keeps CI green while still failing on real bugs (parse - # errors, undefined behavior, CRLF/SC1017, bad redirects, etc.). shellcheck: name: shellcheck runs-on: ubuntu-latest + timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - name: Install shellcheck run: sudo apt-get update -y && sudo apt-get install -y shellcheck - name: Lint shell scripts - run: shellcheck --severity=error multi-cli scripts/install.sh scripts/uninstall.sh + run: shellcheck --severity=error multi-cli scripts/install.sh scripts/uninstall.sh scripts/release-build.sh - # PowerShell static analysis for the Windows scripts. Run at Error severity - # and exclude the rules that flag accepted design choices, not bugs: - # PSAvoidUsingConvertToSecureStringWithPlainText (Error-severity, fires on - # multi-cli.ps1's credential handling) and PSUseShouldProcessForStateChanging- - # Functions. Excluding these keeps CI green while still catching genuine - # parse/syntax failures and other error-severity rules. pwsh-lint: name: PSScriptAnalyzer runs-on: windows-latest + timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - name: Install PSScriptAnalyzer shell: pwsh @@ -97,6 +86,7 @@ jobs: $targets = @( 'scripts/install.ps1', 'scripts/uninstall.ps1', + 'scripts/release-build.ps1', 'multi-cli.ps1' ) $excludedRules = @( @@ -112,28 +102,21 @@ jobs: } Write-Host "No error-severity findings." - # The bash session-continuation suite (bats). Runs the REAL launcher against - # real fixture trees on both Linux and macOS. bats-core and jq are fetched - # fresh by the runner (never committed): jq via the system package manager, - # bats-core via the system package manager when available, otherwise - # tests/run-bats.sh clones the pinned v1.11.0 into tests/vendor on demand. bats: name: bats (${{ matrix.os }}) runs-on: ${{ matrix.os }} + timeout-minutes: 45 strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - name: Install bats + jq run: | if command -v apt-get >/dev/null 2>&1; then sudo apt-get update -y - # libsecret-tools + gnome-keyring + dbus-x11: the auth/processSecret - # tests exercise the real Linux Secret Service backend (secret-tool), - # which needs both the CLI and a running keyring daemon. sudo apt-get install -y bats jq libsecret-tools gnome-keyring dbus-x11 acl elif command -v brew >/dev/null 2>&1; then brew install bats-core jq @@ -147,10 +130,6 @@ jobs: - name: Validate adapter contracts run: bash scripts/validate-adapters.sh - # macOS: `security` against the default login keychain can block on a GUI - # unlock/access prompt on a headless runner, hanging the whole suite. - # Give the run a dedicated ephemeral keychain with a known password, - # unlocked, partition-listed, and made default so no prompt can appear. - name: Prepare an ephemeral CI keychain (macOS) if: runner.os == 'macOS' run: | @@ -169,9 +148,6 @@ jobs: - name: Run the bats suite run: | if [ "$(uname -s)" = "Linux" ]; then - # Secret Service needs a session bus and an unlocked keyring. - # Smoke-check the store first so a broken keyring setup fails here - # with a clear error instead of obscure test failures. dbus-run-session -- bash -c ' set -euo pipefail printf "\n" | gnome-keyring-daemon --unlock --components=secrets >/dev/null @@ -184,11 +160,6 @@ jobs: env MULTICLI_MACOS_KEYCHAIN="$HOME/Library/Keychains/$MULTICLI_CI_KEYCHAIN-db" bash tests/run-bats.sh fi - - name: Run the real POSIX OS-user lifecycle - if: runner.os == 'Windows' - timeout-minutes: 10 - run: bash tests/e2e/posix-osuser.sh - - name: Remove the ephemeral CI keychain (macOS) if: runner.os == 'macOS' && always() run: | @@ -202,8 +173,9 @@ jobs: bash-coverage: name: bash coverage (ubuntu-latest) runs-on: ubuntu-latest + timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with: fetch-depth: 2 - name: Install coverage dependencies @@ -233,14 +205,12 @@ jobs: exec env COVERAGE_BASELINE="$COVERAGE_BASELINE" bash tests/coverage/run-bash-coverage.sh ' - # The PowerShell session-continuation suite (Pester). Uses the Pester 3.4 - # shipped with Windows PowerShell 5.1 (the suite is 3.4-compatible). The - # PowerShell launcher parses JSON natively, so this suite needs no jq. pester: name: pester (windows-latest) runs-on: windows-latest + timeout-minutes: 45 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with: fetch-depth: 2 @@ -269,8 +239,9 @@ jobs: windows-install-smoke: name: install + run (windows-latest) runs-on: windows-latest + timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - name: Install from working tree shell: powershell run: powershell -NoProfile -ExecutionPolicy Bypass -File scripts/install.ps1 -Local @@ -279,3 +250,15 @@ jobs: run: | powershell -NoProfile -ExecutionPolicy Bypass -File multi-cli.ps1 doctor powershell -NoProfile -ExecutionPolicy Bypass -File multi-cli.ps1 tools + + release-metadata: + name: release metadata + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + - name: Verify embedded versions + run: | + bash scripts/release-build.sh --check + pwsh -NoProfile -File scripts/release-build.ps1 -Check + python3 scripts/validate-docs.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8f23746 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,101 @@ +name: Release + +on: + push: + tags: + - "v*.*.*" + +permissions: {} + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + build: + name: Build release assets + runs-on: ubuntu-latest + timeout-minutes: 15 + permissions: + contents: read + steps: + - name: Check out tagged source + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + + - name: Verify tag and embedded versions + shell: bash + run: | + version="$(tr -d '[:space:]' < release/VERSION)" + test "$GITHUB_REF_NAME" = "v$version" + bash scripts/release-build.sh --check --version "$version" + pwsh -NoProfile -File scripts/release-build.ps1 -Check -ExpectedVersion "$version" + + - name: Validate adapters + shell: bash + run: | + bash scripts/validate-adapters.sh + pwsh -NoProfile -File scripts/Validate-Adapters.ps1 + + - name: Build archives + shell: bash + run: | + version="$(tr -d '[:space:]' < release/VERSION)" + bash scripts/release-build.sh --output dist --version "$version" + pwsh -NoProfile -File scripts/release-build.ps1 -OutputDirectory dist -ExpectedVersion "$version" + (cd dist && sha256sum *.tar.gz *.zip > SHA256SUMS) + + - name: Inspect archives + shell: bash + run: | + version="$(tr -d '[:space:]' < release/VERSION)" + tar -tzf "dist/multi-cli-v$version-linux-macos.tar.gz" | grep -Fx "multi-cli-v$version/multi-cli" + tar -tzf "dist/multi-cli-v$version-linux-macos.tar.gz" | grep -Fx "multi-cli-v$version/assets/banner.svg" + unzip -Z1 "dist/multi-cli-v$version-windows.zip" | tr '\\' '/' | grep -Fx "multi-cli-v$version/multi-cli.ps1" + unzip -Z1 "dist/multi-cli-v$version-windows.zip" | tr '\\' '/' | grep -Fx "multi-cli-v$version/assets/banner.svg" + (cd dist && sha256sum --check SHA256SUMS) + + - name: Upload release assets + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: release-assets + path: dist/ + if-no-files-found: error + retention-days: 7 + + publish: + name: Publish GitHub release + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + attestations: write + contents: write + id-token: write + steps: + - name: Check out release notes + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + + - name: Download release assets + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + name: release-assets + path: dist + + - name: Record build provenance + uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 + with: + subject-path: | + dist/*.tar.gz + dist/*.zip + dist/SHA256SUMS + + - name: Create release + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + version="$(tr -d '[:space:]' < release/VERSION)" + gh release create "$GITHUB_REF_NAME" dist/* \ + --verify-tag \ + --title "Multi-CLI v$version" \ + --notes-file release/NOTES.md diff --git a/.github/workflows/vendor-e2e.yml b/.github/workflows/vendor-e2e.yml index d2bbb51..25c56b1 100644 --- a/.github/workflows/vendor-e2e.yml +++ b/.github/workflows/vendor-e2e.yml @@ -20,12 +20,16 @@ on: permissions: contents: read +concurrency: + group: vendor-e2e-${{ inputs.tool }} + cancel-in-progress: false + jobs: offline-real-binary: runs-on: [self-hosted, windows, multi-cli-vendor-test] timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - name: Run real binary offline smoke shell: powershell run: >- @@ -34,7 +38,7 @@ jobs: -Tool '${{ inputs.tool }}' -EvidenceDirectory "$env:RUNNER_TEMP\multi-cli-evidence" - name: Upload secret-scanned evidence - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: vendor-smoke-${{ inputs.tool }} path: ${{ runner.temp }}\multi-cli-evidence\${{ inputs.tool }}-offline.json diff --git a/README.ar.md b/README.ar.md deleted file mode 100644 index 5718490..0000000 --- a/README.ar.md +++ /dev/null @@ -1,315 +0,0 @@ -[English](README.md) | [Español](README.es.md) | **العربية** | [中文](README.zh.md) | [Русский](README.ru.md) | [עברית](README.he.md) - -
- -# multi-cli - -**شغّل عدة ملفات تعريف لحسابات أدوات البرمجة بالذكاء الاصطناعي في وقت واحد.** - -يعزل ملف schema-v2 بيانات اعتماد الحساب وحصته، ويشارك المحادثات والإعدادات والإضافات عندما يكون الحد آمنًا. إذا دمج المورّد المصادقة مع الجلسات، يستخدم multi-cli مستخدم نظام تشغيل مستقلًا أو ملف جذر كاملًا عبر `--isolated`. توضّح [مصفوفة الدعم](docs/support-matrix.md) الوضع والمتطلبات الدقيقة لكل منصة. - -تظل ملفات التعريف schema-v1 الحالية ملفات تعريف قديمة ذات جذر كامل حتى يتم ترحيلها — راجع [ملفات التعريف القديمة](#legacy-profiles). - -[![GitHub repository](https://img.shields.io/badge/GitHub-Repository-blue?logo=github)](https://github.com/Spielewoy/multi-cli) -[![GitHub profile](https://img.shields.io/badge/GitHub-Spielewoy-lightgrey?logo=github)](https://github.com/Spielewoy) -[![GitHub stars](https://img.shields.io/github/stars/Spielewoy/multi-cli?style=social)](https://github.com/Spielewoy/multi-cli/stargazers) -[![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey)](#install) -[![License](https://img.shields.io/badge/license-MIT-green)](#license) - ---- - -## الأدوات المدعومة - -يتضمن هذا المستودع 17 محوّلًا. تعني `supported` أن multi-cli يوفر وضع عزل عاملًا واحدًا على الأقل في ذلك النظام، وتعني `unsupported` أن المنتج أو وضع العزل غير متاح هناك. المصدر المعتمد هو [docs/support-matrix.md](docs/support-matrix.md). - -| الأداة | النوع | Windows | macOS | Linux | -|------|------|---------|-------|-------| -| [Claude Code](claude-cli/) | CLI | supported (file overlay) | supported for API-key profiles only; subscription OAuth is unsupported | supported (file overlay) | -| [OpenAI Codex CLI](codex/) | CLI | supported (file overlay; file credential store mode) | supported | supported | -| [Gemini CLI](gemini-cli/) | CLI | supported (file overlay) | supported | supported | -| [OpenCode](opencode/) | CLI | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Command Code](commandcode/) | CLI | supported (file overlay; use `commandcode`, bare `cmd` collides with cmd.exe) | supported | supported | -| [Cursor Desktop](cursor/) | IDE | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Cursor CLI](cursor-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Antigravity](antigravity/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [AGY CLI](agy-cli/) | CLI | supported (OS-user isolation; elevated terminal) | unsupported (owned-user Keychain isolation not proven) | unsupported (owned-user Secret Service session not implemented) | -| [Kiro](kiro/) | IDE | supported (OS-user isolation) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Zed](zed/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Devin Desktop / Windsurf](windsurf/) | IDE | supported (OS-user isolation; elevated terminal) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [GitHub Copilot CLI](copilot-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Copilot in VS Code](copilot-vscode/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Kimi Code CLI](kimi-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Codex Desktop App](codex-gui/) | GUI | supported (owned Windows user and Store AppX activation) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (no desktop app) | -| [Grok Build CLI](grok-cli/) | CLI/TUI | supported (process token via `multi-cli auth set`) | supported | supported | - -لكل أداة مجلد خاص بها في جذر المستودع يحتوي على ملف `adapter.json` يصف حد الحساب والحالة العادية المشتركة والأدلة المطلوبة للترقية إلى حالة موثَّقة. - ---- - - - -## التثبيت - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.sh | bash -``` - -**Windows** — افتح PowerShell: - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.ps1 | iex -``` - -> بعد التثبيت، **أعد تشغيل الطرفية** لتسري التغييرات على PATH. - -### من المصدر - -```bash -git clone https://github.com/Spielewoy/multi-cli.git -cd multi-cli -./scripts/install.sh --local # macOS/Linux -.\scripts\install.ps1 -Local # Windows -``` - -> بعد التثبيت، **أعد تشغيل الطرفية** لتسري التغييرات على PATH. - -> يتم **تثبيت** [jq](https://jqlang.github.io/jq/) **تلقائيًا** بواسطة المثبِّت على جميع المنصات — لا حاجة لأي إعداد يدوي. - ---- - -## البدء السريع - -```bash -# Create a profile -multi-cli new claude-cli/work - -# Launch it -multi-cli launch claude-cli/work - -# Or use the shorthand -multi-cli claude-cli/work -``` - -يحصل كل ملف تعريف على اسم مستعار تلقائي في الصدفة: - -| المنصة | الموقع | -|----------|----------| -| macOS / Linux | `~/MultiCliProfiles/bin/` (أضِفه إلى `PATH`) | -| Windows | تُنشأ اختصارات قائمة ابدأ تلقائيًا | - ---- - -## الأوامر - -### إدارة ملفات التعريف - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli new /` | إنشاء ملف تعريف حساب (بيانات اعتماد منفصلة وحالة عادية مشتركة) | -| `multi-cli new / --isolated` | إنشاء ملف جذر كامل بلا حالة مشتركة | -| `multi-cli new / --shared` | ملف مشترك قديم من schema-v1؛ تشارك ملفات schema-v2 الحالة العادية المعلنة افتراضيًا | -| `multi-cli new / --from ` | الإنشاء من قالب محفوظ | -| `multi-cli /` | تشغيل ملف تعريف (صيغة مختصرة) | -| `multi-cli launch /` | تشغيل ملف تعريف | -| `multi-cli list []` | عرض جميع ملفات التعريف | -| `multi-cli status` | List profiles with their type and disk size | -| `multi-cli clone / /` | نسخ ملف تعريف موجود | -| `multi-cli rename / /` | إعادة تسمية ملف تعريف | -| `multi-cli delete /` | حذف ملف تعريف وجميع بياناته | - -### مصادقة الحسابات والترحيل - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli auth set /` | تخزين بيانات اعتماد السر التشغيلي لملف التعريف في مخزن بيانات الاعتماد الخاص بنظام التشغيل (يسأل تفاعليًا أو يقرأ سطرًا واحدًا من stdin) | -| `multi-cli auth status /` | الإبلاغ عما إذا كانت بيانات الاعتماد مخزنة لملف التعريف | -| `multi-cli auth clear /` | إزالة بيانات الاعتماد المخزنة | -| `multi-cli migrate / [--dry-run] [--prefer-profile]` | ترحيل ملف تعريف قديم schema-v1 إلى schema-v2 | - -ينطبق `auth` فقط على المحوّلات التي تستخدم آلية `processSecret` ‏(`cursor-cli` و`copilot-cli` و`kimi-cli` و`grok-cli`). يظل التشغيل معطَّلًا حتى يتم تخزين بيانات الاعتماد. راجع [ملفات التعريف القديمة](#legacy-profiles) للاطلاع على `migrate`. - -### القوالب - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli template save / ` | حفظ ملف تعريف كقالب قابل لإعادة الاستخدام | -| `multi-cli template list` | عرض القوالب المحفوظة | -| `multi-cli template delete ` | إزالة قالب | - -### النسخ الاحتياطي والنقل - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli export / [path]` | أرشفة ملف تعريف إلى `.tar.gz` ‏(`.zip` على Windows) | -| `multi-cli import /` | استعادة ملف تعريف من أرشيف | - -### الجلسات - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli continue ` | نسخ حالة المحادثة (الجلسات/النصوص/السجل) من ملف تعريف إلى آخر — لا تُنسخ بيانات الاعتماد أبدًا | -| `multi-cli continue --no-merge` | استبدال ملفات الوجهة بدلًا من الاحتفاظ بالأحدث | -| `multi-cli continue --dry-run` | معاينة ما سيتم نسخه دون تغيير أي شيء | - -يعمل `base` كاسم ملف تعريف في أي من الطرفين ويعني مجلد المنزل الحقيقي للأداة (`~/.codex` و`~/.claude` و…). مدعوم لـ `codex` و`claude-cli` و`gemini-cli` و`commandcode`. راجع [متابعة محادثة عبر الحسابات](#continue-a-chat-across-accounts). - -### الأدوات المساعدة - -| الأمر | الوصف | -|---------|-------------| -| `multi-cli tools` | عرض جميع الأدوات المدعومة وحالة تثبيتها | -| `multi-cli stats` | عرض استخدام القرص لكل ملف تعريف | -| `multi-cli doctor` | تشخيص بيئتك | -| `multi-cli completion {bash\|zsh\|powershell}` | إعداد الإكمال التلقائي للصدفة | -| `multi-cli help` | عرض المساعدة | -| `multi-cli version` | عرض الإصدار | - ---- - -## كيف يعمل العزل - -تعلن محوّلات schema-v2 عن آلية حساب منفصلة عن الحالة العادية: - -| الآلية | كيف تعمل | -|-----------|--------------| -| `fileOverlay` | تبقى بيانات الاعتماد داخل ملف التعريف؛ وترتبط الحالة العادية المعلنة بمنزل الأداة الأصلي المشترك. | -| `processSecret` | تُحقن بيانات اعتماد خاصة بكل ملف تعريف وذات أولوية قصوى في العملية الفرعية فقط. يظل التشغيل معطَّلًا حتى يتم تكوين تخزين آمن للأسرار. | -| `osUserCredentialStore` | تُفصل الهويات الثابتة في سلسلة المفاتيح بمستخدم نظام تشغيل مملوك لـ multi-cli. يظل هذا معطَّلًا حتى يتم التحقق من الملكية والتنظيف. | -| `inseparable` | يدمج المورّد المصادقة والحالة العادية؛ يفشل التشغيل المتوافق بشكل مغلق وتُعرَض المحدودية. | - -تحتفظ ملفات تعريف الإصدار 1 بالسلوك السابق ذي الجذر الكامل (`env` و`userDataDir` و`redirectHome` و`appdata` و`sandboxUser`) للتوافق. يحدد كل `/adapter.json` قدرات المنتج/المنصة ومتطلبات الأدلة. - ---- - - - -## متابعة محادثة عبر الحسابات - -هل بلغت حد المعدل على الحساب A في منتصف محادثة؟ بدّل إلى ملف تعريف مسجَّل الدخول بالحساب B واستأنف المحادثة من حيث توقفت. ينسخ `multi-cli continue` حالة المحادثة القابلة للنقل — الجلسات والنصوص والسجل — بين ملفات التعريف. **لا تُنسخ بيانات الاعتماد أبدًا.** - -```bash -# You were working in codex/work (account A) and got rate-limited. -# codex/personal is logged into account B. -multi-cli continue codex work personal # copy the conversation state -multi-cli continue codex work personal --dry-run # preview first, if you like - -codex-personal # launch account B's profile -codex resume # resume the same chat (codex ≥ 0.30) -``` - -شغّل `codex resume` دون وسيطة لفتح منتقي تفاعلي للجلسات السابقة، فلن تحتاج أبدًا إلى البحث عن معرّف. وإذا احتجته، فمعرّف الجلسة هو UUID الموجود في اسم ملف rollout ضمن `sessions/YYYY/MM/DD/`. - -`base` اسم ملف تعريف صالح في أي من الطرفين ويشير إلى مجلد المنزل الحقيقي للأداة (`~/.codex` و`~/.claude` و…)، لذا يمكنك المتابعة من تثبيتك الافتراضي أو إليه. - -افتراضيًا، يتم **دمج** الملفات — تُحتفظ بالملفات الأحدث في الوجهة. مرّر `--no-merge` لاستبدال الوجهة بدلًا من ذلك، أو `--dry-run` للمعاينة دون تغيير أي شيء. - -بعد النسخ، استأنف داخل ملف التعريف الوجهة باستخدام أمر الأداة نفسه: - -| الأداة | أمر الاستئناف | -|------|----------------| -| codex | `codex resume ` ‏(≥ 0.30) | -| claude-cli | `claude --resume ` (يُشغَّل من نفس مجلد المشروع) | -| gemini-cli | `gemini --resume` (آخر جلسة محفوظة تلقائيًا) أو `/chat resume ` لنقاط التفتيش المحفوظة | -| commandcode | التشغيل من نفس مجلد العمل | - -**غير مدعوم:** `opencode` (الجلسات وبيانات الاعتماد في قاعدة بيانات SQLite واحدة مشتركة) و`cursor` (تُخزَّن المحادثات في SQLite مفهرسة بمسار مساحة العمل). - -> تُبذَر ملفات تعريف schema-v1 القديمة من `base` افتراضيًا. تقرأ ملفات تعريف حساب schema-v2 المحادثات والإعدادات المعلنة من الجذر الأصلي المشترك، بينما تبدأ الملفات المعزولة فارغة. استخدم `multi-cli continue` لنسخ المحادثات المدعومة إلى ملف معزول أو منه. - ---- - -## أنواع ملفات التعريف - -| العلامة | المعنى | -|------|---------| -| *(لا شيء)* | **مشترك افتراضيًا** — بيانات الاعتماد منفصلة، وتُشارك المحادثات والإعدادات عندما يسمح المحوّل. | -| `-i` أو `--isolate` أو `--isolated` | **معزول** — يعيش جذر الأداة كاملًا داخل ملف التعريف ولا يُشارك شيء. | -| `--shared` | اسم قديم للوضع المشترك عندما يدعمه المحوّل. | -| `--cli` | **CLI** — تشغيل من الطرفية فقط. | -| `--from ` | الاستنساخ من قالب محفوظ. | - ---- - -## متغيرات البيئة - -| المتغير | الافتراضي | الغرض | -|----------|---------|---------| -| `MULTICLI_HOME` | `~/MultiCliProfiles` | مكان تخزين جميع ملفات التعريف | -| `MULTICLI_OVERRIDE_BINARY` | *(غير معيَّن)* | فرض مسار ثنائي محدد للتشغيل التالي | -| `MULTICLI_REPO` | *(غير معيَّن)* | رابط Git للتثبيت عن بُعد | -| `MULTICLI_PLATFORM` | *(تلقائي)* | تجاوز كشف المنصة (`darwin` و`linux`) | - ---- - - - -## ملفات التعريف القديمة - -ملفات التعريف التي أُنشئت قبل schema-v2 هي ملفات تعريف قديمة ذات جذر كامل: تحتفظ بالسلوك السابق لـ `env` و`userDataDir` و`redirectHome` و`appdata` و`sandboxUser` للتوافق. يُعامَل مجلد ملف التعريف الذي لا يحتوي على ملف `.profile.json` كملف قديم. - -يحوّل `multi-cli migrate /` ملف التعريف القديم إلى schema-v2: تنتقل بيانات الاعتماد المعلنة إلى ملف التعريف، وترتبط الحالة العادية المعلنة بمنزل الأداة المشترك. استخدم `--dry-run` لمعاينة خطة النقل دون تغيير أي شيء، و`--prefer-profile` لاستبدال الملفات المشتركة المتعارضة بنسخة ملف التعريف — لا تُستبدَل أهداف بيانات الاعتماد أبدًا. يجب أن يكون تخزين ملفات التعريف وجذر الحالة المشتركة على نفس وحدة التخزين، لأن الترحيل يستخدم نقلًا ذريًا ضمن نفس وحدة التخزين. - ---- - -## التشخيص - -```bash -multi-cli doctor -``` - -يتحقق من وجود تخزين ملفات التعريف، وأن مجلد الأسماء المستعارة موجود في PATH، وأن ثنائي كل أداة مكتشَف (أو يعرض تلميح تثبيت). - ---- - -## الإكمال التلقائي للصدفة - -```bash -multi-cli completion bash # or zsh, powershell -``` - -اتبع التعليمات لإضافته إلى `.zshrc` أو `.bashrc` أو `$PROFILE` في PowerShell. - ---- - -## إلغاء التثبيت - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.sh | bash -``` - -**Windows** - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.ps1 | iex -``` - -سُتسأل عمّا إذا كنت تريد إزالة بيانات ملفات التعريف — لا يُحذَف أي شيء دون تأكيد. - ---- - -## روابط - -- [مصفوفة الدعم](docs/support-matrix.md) — حالة العزل لكل منتج ونظام تشغيل وبوابة التحقق -- [سياسة الأمان](SECURITY.md) -- [الرخصة](LICENSE) -- [مستودع GitHub](https://github.com/Spielewoy/multi-cli) - ---- - -## شكر وتقدير - -- **المؤلف** — [Spielewoy](https://github.com/Spielewoy) - ---- - - - -## الرخصة - -[MIT](LICENSE) - -
diff --git a/README.es.md b/README.es.md deleted file mode 100644 index 12f367d..0000000 --- a/README.es.md +++ /dev/null @@ -1,305 +0,0 @@ -[English](README.md) | **Español** | [العربية](README.ar.md) | [中文](README.zh.md) | [Русский](README.ru.md) | [עברית](README.he.md) - -# multi-cli - -**Ejecuta varios perfiles de cuenta de herramientas de programación con IA de forma simultánea.** - -Un perfil schema-v2 aísla la credencial y la cuota de la cuenta mientras comparte las conversaciones, la configuración y las extensiones cuando existe un límite seguro. Si el proveedor combina autenticación y sesiones, usa un usuario del sistema operativo o `--isolated` para un perfil de raíz completa. La [matriz de compatibilidad](docs/support-matrix.md) indica el modo exacto y los requisitos de cada plataforma. - -Los perfiles schema-v1 existentes siguen siendo perfiles heredados de raíz completa hasta que se migren — consulta [Perfiles heredados](#perfiles-heredados). - -[![GitHub repository](https://img.shields.io/badge/GitHub-Repository-blue?logo=github)](https://github.com/Spielewoy/multi-cli) -[![GitHub profile](https://img.shields.io/badge/GitHub-Spielewoy-lightgrey?logo=github)](https://github.com/Spielewoy) -[![GitHub stars](https://img.shields.io/github/stars/Spielewoy/multi-cli?style=social)](https://github.com/Spielewoy/multi-cli/stargazers) -[![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey)](#instalación) -[![License](https://img.shields.io/badge/license-MIT-green)](#licencia) - ---- - -## Herramientas compatibles - -Este repositorio incluye 17 adaptadores. `supported` significa que multi-cli ofrece al menos un modo de aislamiento funcional en ese sistema; `unsupported` significa que el producto o el modo no está disponible allí. La fuente autorizada es [docs/support-matrix.md](docs/support-matrix.md). - -| Herramienta | Tipo | Windows | macOS | Linux | -|------|------|---------|-------|-------| -| [Claude Code](claude-cli/) | CLI | supported (file overlay) | supported for API-key profiles only; subscription OAuth is unsupported | supported (file overlay) | -| [OpenAI Codex CLI](codex/) | CLI | supported (file overlay; file credential store mode) | supported | supported | -| [Gemini CLI](gemini-cli/) | CLI | supported (file overlay) | supported | supported | -| [OpenCode](opencode/) | CLI | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Command Code](commandcode/) | CLI | supported (file overlay; use `commandcode`, bare `cmd` collides with cmd.exe) | supported | supported | -| [Cursor Desktop](cursor/) | IDE | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Cursor CLI](cursor-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Antigravity](antigravity/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [AGY CLI](agy-cli/) | CLI | supported (OS-user isolation; elevated terminal) | unsupported (owned-user Keychain isolation not proven) | unsupported (owned-user Secret Service session not implemented) | -| [Kiro](kiro/) | IDE | supported (OS-user isolation) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Zed](zed/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Devin Desktop / Windsurf](windsurf/) | IDE | supported (OS-user isolation; elevated terminal) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [GitHub Copilot CLI](copilot-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Copilot in VS Code](copilot-vscode/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Kimi Code CLI](kimi-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Codex Desktop App](codex-gui/) | GUI | supported (owned Windows user and Store AppX activation) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (no desktop app) | -| [Grok Build CLI](grok-cli/) | CLI/TUI | supported (process token via `multi-cli auth set`) | supported | supported | - -Cada herramienta tiene su propia carpeta en la raíz del repositorio con un `adapter.json` que describe el límite de la cuenta, el estado normal compartido y la evidencia necesaria para ser promovido a verificado. - ---- - -## Instalación - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.sh | bash -``` - -**Windows** — abre PowerShell: - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.ps1 | iex -``` - -> Después de la instalación, **reinicia tu terminal** para que los cambios en el PATH surtan efecto. - -### Desde el código fuente - -```bash -git clone https://github.com/Spielewoy/multi-cli.git -cd multi-cli -./scripts/install.sh --local # macOS/Linux -.\scripts\install.ps1 -Local # Windows -``` - -> Después de la instalación, **reinicia tu terminal** para que los cambios en el PATH surtan efecto. - -> [jq](https://jqlang.github.io/jq/) se **instala automáticamente** con el instalador en todas las plataformas — no se requiere configuración manual. - ---- - -## Inicio rápido - -```bash -# Create a profile -multi-cli new claude-cli/work - -# Launch it -multi-cli launch claude-cli/work - -# Or use the shorthand -multi-cli claude-cli/work -``` - -Cada perfil obtiene un alias de shell automático: - -| Plataforma | Ubicación | -|----------|----------| -| macOS / Linux | `~/MultiCliProfiles/bin/` (añadir al `PATH`) | -| Windows | Accesos directos del menú Inicio creados automáticamente | - ---- - -## Comandos - -### Gestión de perfiles - -| Comando | Descripción | -|---------|-------------| -| `multi-cli new /` | Crear un perfil de cuenta (credenciales separadas; estado normal compartido) | -| `multi-cli new / --isolated` | Crear un perfil de raíz completa sin estado compartido | -| `multi-cli new / --shared` | Perfil compartido heredado de schema-v1; los perfiles schema-v2 ya comparten por defecto el estado normal declarado | -| `multi-cli new / --from ` | Crear a partir de una plantilla guardada | -| `multi-cli /` | Lanzar un perfil (abreviatura) | -| `multi-cli launch /` | Lanzar un perfil | -| `multi-cli list []` | Listar todos los perfiles | -| `multi-cli status` | List profiles with their type and disk size | -| `multi-cli clone / /` | Copiar un perfil existente | -| `multi-cli rename / /` | Renombrar un perfil | -| `multi-cli delete /` | Eliminar un perfil y todos sus datos | - -### Autenticación de cuentas y migración - -| Comando | Descripción | -|---------|-------------| -| `multi-cli auth set /` | Guardar la credencial de secreto de proceso del perfil en el almacén de credenciales del sistema operativo (pregunta interactivamente o lee una línea desde stdin) | -| `multi-cli auth status /` | Indicar si hay una credencial guardada para el perfil | -| `multi-cli auth clear /` | Eliminar la credencial guardada | -| `multi-cli migrate / [--dry-run] [--prefer-profile]` | Migrar un perfil heredado schema-v1 a schema-v2 | - -`auth` solo se aplica a los adaptadores que usan el mecanismo `processSecret` (`cursor-cli`, `copilot-cli`, `kimi-cli`, `grok-cli`). El lanzamiento permanece deshabilitado hasta que se guarde una credencial. Consulta [Perfiles heredados](#perfiles-heredados) para `migrate`. - -### Plantillas - -| Comando | Descripción | -|---------|-------------| -| `multi-cli template save / ` | Guardar un perfil como plantilla reutilizable | -| `multi-cli template list` | Listar las plantillas guardadas | -| `multi-cli template delete ` | Eliminar una plantilla | - -### Copia de seguridad y transferencia - -| Comando | Descripción | -|---------|-------------| -| `multi-cli export / [path]` | Archivar un perfil en `.tar.gz` (`.zip` en Windows) | -| `multi-cli import /` | Restaurar un perfil desde un archivo | - -### Sesiones - -| Comando | Descripción | -|---------|-------------| -| `multi-cli continue ` | Copiar el estado de la conversación (sesiones/transcripciones/historial) de un perfil a otro — nunca las credenciales | -| `multi-cli continue --no-merge` | Sobrescribir los archivos de destino en lugar de conservar los más recientes | -| `multi-cli continue --dry-run` | Previsualizar lo que se copiaría, sin cambiar nada | - -`base` funciona como nombre de perfil en cualquiera de los extremos y significa el directorio home real de la herramienta (`~/.codex`, `~/.claude`, …). Compatible con `codex`, `claude-cli`, `gemini-cli` y `commandcode`. Consulta [Continuar un chat entre cuentas](#continuar-un-chat-entre-cuentas). - -### Utilidades - -| Comando | Descripción | -|---------|-------------| -| `multi-cli tools` | Listar todas las herramientas compatibles y su estado de instalación | -| `multi-cli stats` | Mostrar el uso de disco por perfil | -| `multi-cli doctor` | Diagnosticar tu entorno | -| `multi-cli completion {bash\|zsh\|powershell}` | Configurar el autocompletado del shell | -| `multi-cli help` | Mostrar ayuda | -| `multi-cli version` | Mostrar la versión | - ---- - -## Cómo funciona el aislamiento - -Los adaptadores schema-v2 declaran un mecanismo de cuenta separado del estado normal: - -| Mecanismo | Cómo funciona | -|-----------|--------------| -| `fileOverlay` | Las credenciales permanecen dentro del perfil; el estado normal declarado enlaza con el home compartido nativo de la herramienta. | -| `processSecret` | Una credencial por perfil, de máxima precedencia, se inyecta únicamente en el proceso hijo. El lanzamiento permanece deshabilitado hasta que se configure un almacenamiento seguro de secretos. | -| `osUserCredentialStore` | Las identidades fijas del llavero se separan con un usuario del sistema operativo propiedad de multi-cli. Permanece deshabilitado hasta que se verifiquen la propiedad y la limpieza. | -| `inseparable` | El proveedor combina la autenticación y el estado normal; el lanzamiento conforme falla de forma cerrada y se muestra la limitación. | - -Los perfiles de la versión 1 conservan el comportamiento anterior de raíz completa (`env`, `userDataDir`, `redirectHome`, `appdata` y `sandboxUser`) por compatibilidad. Cada `/adapter.json` indica las capacidades por producto/plataforma y los requisitos de evidencia. - ---- - - - -## Continuar un chat entre cuentas - -¿Alcanzaste un límite de velocidad en la cuenta A a mitad de una conversación? Cambia a un perfil con sesión iniciada en la cuenta B y retoma el chat donde se quedó. `multi-cli continue` copia el estado portable de la conversación — sesiones, transcripciones, historial — entre perfiles. **Las credenciales nunca se copian.** - -```bash -# You were working in codex/work (account A) and got rate-limited. -# codex/personal is logged into account B. -multi-cli continue codex work personal # copy the conversation state -multi-cli continue codex work personal --dry-run # preview first, if you like - -codex-personal # launch account B's profile -codex resume # resume the same chat (codex ≥ 0.30) -``` - -Ejecuta `codex resume` sin argumentos para abrir un selector interactivo de sesiones anteriores, así nunca tendrás que buscar un id. Si lo necesitas, el id de sesión es el UUID del nombre de archivo de rollout bajo `sessions/YYYY/MM/DD/`. - -`base` es un nombre de perfil válido en cualquiera de los extremos y se refiere al directorio home real de la herramienta (`~/.codex`, `~/.claude`, …), por lo que puedes continuar hacia o desde tu instalación predeterminada. - -Por defecto, los archivos se **fusionan** — se conservan los archivos más recientes del destino. Pasa `--no-merge` para sobrescribir el destino, o `--dry-run` para previsualizar sin cambiar nada. - -Después de copiar, reanuda dentro del perfil de destino con el comando propio de la herramienta: - -| Herramienta | Comando de reanudación | -|------|----------------| -| codex | `codex resume ` (≥ 0.30) | -| claude-cli | `claude --resume ` (ejecutar desde el mismo directorio de proyecto) | -| gemini-cli | `gemini --resume` (última sesión guardada automáticamente) o `/chat resume ` para puntos de control guardados | -| commandcode | lanzar desde el mismo directorio de trabajo | - -**No compatible:** `opencode` (las sesiones y las credenciales viven en una única base de datos SQLite compartida) y `cursor` (los chats se almacenan en SQLite indexados por la ruta del espacio de trabajo). - -> Los perfiles heredados de esquema v1 se siembran desde `base` por defecto. Los perfiles de cuenta de esquema v2 ya leen las conversaciones y la configuración declaradas desde la raíz nativa compartida; los perfiles aislados empiezan vacíos. Usa `multi-cli continue` para copiar conversaciones compatibles hacia o desde un perfil aislado. - ---- - -## Tipos de perfil - -| Opción | Significado | -|------|---------| -| *(ninguno)* | **Compartido por defecto** — credenciales separadas; conversaciones y configuración compartidas cuando el adaptador lo permite. | -| `-i`, `--isolate`, `--isolated` | **Aislado** — toda la raíz de la herramienta vive dentro del perfil; no se comparte nada. | -| `--shared` | Alias heredado para el modo compartido cuando el adaptador lo admite. | -| `--cli` | **CLI** — marca el perfil para lanzamiento solo en terminal. | -| `--from ` | Clonar desde una plantilla guardada. | - ---- - -## Variables de entorno - -| Variable | Valor por defecto | Propósito | -|----------|---------|---------| -| `MULTICLI_HOME` | `~/MultiCliProfiles` | Dónde se almacenan todos los perfiles | -| `MULTICLI_OVERRIDE_BINARY` | *(sin definir)* | Forzar una ruta de binario específica para el próximo lanzamiento | -| `MULTICLI_REPO` | *(sin definir)* | URL de Git para la instalación remota | -| `MULTICLI_PLATFORM` | *(automático)* | Anular la detección de plataforma (`darwin`, `linux`) | - ---- - -## Perfiles heredados - -Los perfiles creados antes de schema-v2 son perfiles heredados de raíz completa: conservan el comportamiento anterior de `env`, `userDataDir`, `redirectHome`, `appdata` y `sandboxUser` por compatibilidad. Un directorio de perfil sin archivo `.profile.json` se trata como heredado. - -`multi-cli migrate /` convierte un perfil heredado a schema-v2: las credenciales declaradas se mueven al perfil y el estado normal declarado se enlaza con el home compartido de la herramienta. Usa `--dry-run` para previsualizar el plan de movimiento sin cambiar nada, y `--prefer-profile` para reemplazar los archivos compartidos en conflicto con la copia del perfil — los destinos de credenciales nunca se sobrescriben. El almacenamiento de perfiles y la raíz de estado compartido deben estar en el mismo volumen, porque la migración usa movimientos atómicos dentro del mismo volumen. - ---- - -## Diagnóstico - -```bash -multi-cli doctor -``` - -Comprueba que el almacenamiento de perfiles existe, que el directorio de alias está en el PATH y que el binario de cada herramienta se detecta (o muestra una sugerencia de instalación). - ---- - -## Autocompletado del shell - -```bash -multi-cli completion bash # or zsh, powershell -``` - -Sigue las instrucciones para añadirlo a tu `.zshrc`, `.bashrc` o `$PROFILE` de PowerShell. - ---- - -## Desinstalación - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.sh | bash -``` - -**Windows** - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.ps1 | iex -``` - -Se te preguntará si deseas eliminar los datos de tus perfiles — nada se borra sin confirmación. - ---- - -## Enlaces - -- [Matriz de compatibilidad](docs/support-matrix.md) — estado de aislamiento por producto y por SO, y los criterios de verificación -- [Política de seguridad](SECURITY.md) -- [Licencia](LICENSE) -- [Repositorio en GitHub](https://github.com/Spielewoy/multi-cli) - ---- - -## Créditos - -- **Creador** — [Spielewoy](https://github.com/Spielewoy) - ---- - -## Licencia - -[MIT](LICENSE) diff --git a/README.he.md b/README.he.md deleted file mode 100644 index d946ef7..0000000 --- a/README.he.md +++ /dev/null @@ -1,315 +0,0 @@ -[English](README.md) | [Español](README.es.md) | [العربية](README.ar.md) | [中文](README.zh.md) | [Русский](README.ru.md) | **עברית** - -
- -# multi-cli - -**הפעלת מספר פרופילי חשבון של כלי תכנות מבוססי AI בו-זמנית.** - -פרופיל schema-v2 מבודד את אישורי החשבון והמכסה, ומשתף שיחות, הגדרות והרחבות כאשר הגבול בטוח. כאשר הספק משלב אימות עם סשנים, multi-cli משתמש במשתמש מערכת הפעלה נפרד או בפרופיל שורש מלא באמצעות `--isolated`. [מטריצת התמיכה](docs/support-matrix.md) מפרטת את המצב והדרישות המדויקים לכל פלטפורמה. - -פרופילי schema-v1 קיימים נשארים פרופילים מדור קודם בעלי שורש מלא עד שיועברו — ראו [פרופילים מדור קודם](#legacy-profiles). - -[![GitHub repository](https://img.shields.io/badge/GitHub-Repository-blue?logo=github)](https://github.com/Spielewoy/multi-cli) -[![GitHub profile](https://img.shields.io/badge/GitHub-Spielewoy-lightgrey?logo=github)](https://github.com/Spielewoy) -[![GitHub stars](https://img.shields.io/github/stars/Spielewoy/multi-cli?style=social)](https://github.com/Spielewoy/multi-cli/stargazers) -[![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey)](#install) -[![License](https://img.shields.io/badge/license-MIT-green)](#license) - ---- - -## כלים נתמכים - -המאגר כולל 17 מתאמים. `supported` פירושו ש-multi-cli מספק לפחות מצב בידוד עובד אחד במערכת זו; `unsupported` פירושו שהמוצר או מצב הבידוד אינם זמינים בה. המקור הסמכותי הוא [docs/support-matrix.md](docs/support-matrix.md). - -| כלי | סוג | Windows | macOS | Linux | -|------|------|---------|-------|-------| -| [Claude Code](claude-cli/) | CLI | supported (file overlay) | supported for API-key profiles only; subscription OAuth is unsupported | supported (file overlay) | -| [OpenAI Codex CLI](codex/) | CLI | supported (file overlay; file credential store mode) | supported | supported | -| [Gemini CLI](gemini-cli/) | CLI | supported (file overlay) | supported | supported | -| [OpenCode](opencode/) | CLI | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Command Code](commandcode/) | CLI | supported (file overlay; use `commandcode`, bare `cmd` collides with cmd.exe) | supported | supported | -| [Cursor Desktop](cursor/) | IDE | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Cursor CLI](cursor-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Antigravity](antigravity/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [AGY CLI](agy-cli/) | CLI | supported (OS-user isolation; elevated terminal) | unsupported (owned-user Keychain isolation not proven) | unsupported (owned-user Secret Service session not implemented) | -| [Kiro](kiro/) | IDE | supported (OS-user isolation) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Zed](zed/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Devin Desktop / Windsurf](windsurf/) | IDE | supported (OS-user isolation; elevated terminal) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [GitHub Copilot CLI](copilot-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Copilot in VS Code](copilot-vscode/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Kimi Code CLI](kimi-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Codex Desktop App](codex-gui/) | GUI | supported (owned Windows user and Store AppX activation) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (no desktop app) | -| [Grok Build CLI](grok-cli/) | CLI/TUI | supported (process token via `multi-cli auth set`) | supported | supported | - -לכל כלי תיקייה משלו בשורש המאגר עם קובץ `adapter.json` שמתאר את גבול החשבון, את המצב הרגיל המשותף ואת הראיות הנדרשות לקידום לסטטוס מאומת. - ---- - - - -## התקנה - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.sh | bash -``` - -**Windows** — פתחו PowerShell: - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.ps1 | iex -``` - -> לאחר ההתקנה, **הפעילו מחדש את הטרמינל** כדי ששינויי ה-PATH ייכנסו לתוקף. - -### מקוד המקור - -```bash -git clone https://github.com/Spielewoy/multi-cli.git -cd multi-cli -./scripts/install.sh --local # macOS/Linux -.\scripts\install.ps1 -Local # Windows -``` - -> לאחר ההתקנה, **הפעילו מחדש את הטרמינל** כדי ששינויי ה-PATH ייכנסו לתוקף. - -> [jq](https://jqlang.github.io/jq/) **מותקן אוטומטית** על ידי תוכנית ההתקנה בכל הפלטפורמות — אין צורך בהגדרה ידנית. - ---- - -## התחלה מהירה - -```bash -# Create a profile -multi-cli new claude-cli/work - -# Launch it -multi-cli launch claude-cli/work - -# Or use the shorthand -multi-cli claude-cli/work -``` - -כל פרופיל מקבל כינוי shell אוטומטי: - -| פלטפורמה | מיקום | -|----------|----------| -| macOS / Linux | `~/MultiCliProfiles/bin/` (הוסיפו ל-`PATH`) | -| Windows | קיצורי דרך בתפריט ההתחלה נוצרים אוטומטית | - ---- - -## פקודות - -### ניהול פרופילים - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli new /` | יצירת פרופיל חשבון (אישורים נפרדים ומצב רגיל משותף) | -| `multi-cli new / --isolated` | יצירת פרופיל שורש מלא ללא מצב משותף | -| `multi-cli new / --shared` | פרופיל משותף ישן של schema-v1; פרופילי schema-v2 כבר משתפים את המצב הרגיל המוצהר כברירת מחדל | -| `multi-cli new / --from ` | יצירה מתבנית שמורה | -| `multi-cli /` | הפעלת פרופיל (קיצור) | -| `multi-cli launch /` | הפעלת פרופיל | -| `multi-cli list []` | הצגת כל הפרופילים | -| `multi-cli status` | List profiles with their type and disk size | -| `multi-cli clone / /` | העתקת פרופיל קיים | -| `multi-cli rename / /` | שינוי שם של פרופיל | -| `multi-cli delete /` | מחיקת פרופיל וכל הנתונים שלו | - -### אימות חשבונות והעברה - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli auth set /` | שמירת אישור הסוד התהליכי של הפרופיל במאגר האישורים של מערכת ההפעלה (שואל באופן אינטראקטיבי או קורא שורה אחת מ-stdin) | -| `multi-cli auth status /` | דיווח האם מאוחסנים אישורים עבור הפרופיל | -| `multi-cli auth clear /` | הסרת האישורים המאוחסנים | -| `multi-cli migrate / [--dry-run] [--prefer-profile]` | העברת פרופיל schema-v1 מדור קודם ל-schema-v2 | - -`auth` חל רק על מתאמים המשתמשים במנגנון `processSecret` ‏(`cursor-cli`, `copilot-cli`, `kimi-cli`, `grok-cli`). ההפעלה נשארת מושבתת עד שמאוחסנים אישורים. ראו [פרופילים מדור קודם](#legacy-profiles) לגבי `migrate`. - -### תבניות - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli template save / ` | שמירת פרופיל כתבנית לשימוש חוזר | -| `multi-cli template list` | הצגת תבניות שמורות | -| `multi-cli template delete ` | הסרת תבנית | - -### גיבוי והעברה - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli export / [path]` | ארכוב פרופיל ל-`.tar.gz` ‏(`.zip` ב-Windows) | -| `multi-cli import /` | שחזור פרופיל מארכיון | - -### סשנים - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli continue ` | העתקת מצב השיחה (סשנים/תמלילים/היסטוריה) מפרופיל אחד לאחר — אישורים לעולם אינם מועתקים | -| `multi-cli continue --no-merge` | דריסת קבצי היעד במקום שמירת החדשים יותר | -| `multi-cli continue --dry-run` | תצוגה מקדימה של מה שיועתק, ללא שינוי דבר | - -`base` עובד כשם פרופיל בכל אחד מהצדדים ומשמעותו תיקיית הבית האמיתית של הכלי (`~/.codex`, `~/.claude`, …). נתמך עבור `codex`, `claude-cli`, `gemini-cli` ו-`commandcode`. ראו [המשך שיחה בין חשבונות](#continue-a-chat-across-accounts). - -### כלי עזר - -| פקודה | תיאור | -|---------|-------------| -| `multi-cli tools` | הצגת כל הכלים הנתמכים וסטטוס ההתקנה שלהם | -| `multi-cli stats` | הצגת שימוש בדיסק לכל פרופיל | -| `multi-cli doctor` | אבחון הסביבה שלך | -| `multi-cli completion {bash\|zsh\|powershell}` | הגדרת השלמה אוטומטית ל-shell | -| `multi-cli help` | הצגת עזרה | -| `multi-cli version` | הצגת גרסה | - ---- - -## איך הבידוד עובד - -מתאמי schema-v2 מצהירים על מנגנון חשבון בנפרד מהמצב הרגיל: - -| מנגנון | איך זה עובד | -|-----------|--------------| -| `fileOverlay` | האישורים נשארים בתוך הפרופיל; המצב הרגיל המוצהר מקושר לבית המשותף המקורי של הכלי. | -| `processSecret` | אישור ייחודי לפרופיל, בעל קדימות עליונה, מוזרק רק לתהליך הבן. ההפעלה נשארת מושבתת עד שמוגדר אחסון סודות מאובטח. | -| `osUserCredentialStore` | זהויות קבועות של צרור המפתחות מופרדות באמצעות משתמש מערכת הפעלה בבעלות multi-cli. נשאר מושבת עד שאומתו הבעלות והניקוי. | -| `inseparable` | הספק משלב אימות ומצב רגיל; הפעלה תקינה נכשלת באופן סגור והמגבלה מוצגת. | - -פרופילי גרסה 1 שומרים על התנהגות השורש המלא הקודמת (`env`, `userDataDir`, `redirectHome`, `appdata` ו-`sandboxUser`) לצורך תאימות. כל `/adapter.json` מציין את יכולות המוצר/הפלטפורמה ואת דרישות הראיות. - ---- - - - -## המשך שיחה בין חשבונות - -נתקלתם במגבלת קצב בחשבון A באמצע שיחה? עברו לפרופיל המחובר לחשבון B והמשיכו את השיחה מהנקודה שבה היא נעצרה. `multi-cli continue` מעתיק את מצב השיחה הנייד — סשנים, תמלילים, היסטוריה — בין פרופילים. **אישורים לעולם אינם מועתקים.** - -```bash -# You were working in codex/work (account A) and got rate-limited. -# codex/personal is logged into account B. -multi-cli continue codex work personal # copy the conversation state -multi-cli continue codex work personal --dry-run # preview first, if you like - -codex-personal # launch account B's profile -codex resume # resume the same chat (codex ≥ 0.30) -``` - -הריצו `codex resume` ללא ארגומנט כדי לפתוח בורר אינטראקטיבי של סשנים קודמים, כך שלעולם לא תצטרכו לחפש מזהה. אם בכל זאת צריך, מזהה הסשן הוא ה-UUID בשם קובץ ה-rollout תחת `sessions/YYYY/MM/DD/`. - -`base` הוא שם פרופיל חוקי בכל אחד מהצדדים ומתייחס לתיקיית הבית האמיתית של הכלי (`~/.codex`, `~/.claude`, …), כך שאפשר להמשיך אל ההתקנה ברירת המחדל או ממנה. - -כברירת מחדל, הקבצים **ממוזגים** — הקבצים החדשים יותר ביעד נשמרים. העבירו `--no-merge` כדי לדרוס את היעד במקום, או `--dry-run` לתצוגה מקדימה ללא שינוי דבר. - -לאחר ההעתקה, המשיכו בתוך פרופיל היעד עם הפקודה של הכלי עצמו: - -| כלי | פקודת המשך | -|------|----------------| -| codex | `codex resume ` ‏(≥ 0.30) | -| claude-cli | `claude --resume ` (להריץ מאותה תיקיית פרויקט) | -| gemini-cli | `gemini --resume` (הסשן האחרון שנשמר אוטומטית) או `/chat resume ` לנקודות ביקורת שמורות | -| commandcode | הפעלה מאותה תיקיית עבודה | - -**לא נתמך:** `opencode` (סשנים ואישורים חיים במסד נתונים SQLite משותף אחד) ו-`cursor` (שיחות מאוחסנות ב-SQLite עם מפתח לפי נתיב סביבת העבודה). - -> פרופילי schema-v1 ישנים מאותחלים מ-`base` כברירת מחדל. פרופילי חשבון schema-v2 כבר קוראים שיחות ותצורה מוצהרות מהשורש המקומי המשותף, ופרופילים מבודדים מתחילים ריקים. השתמשו ב-`multi-cli continue` כדי להעתיק שיחות נתמכות אל פרופיל מבודד או ממנו. - ---- - -## סוגי פרופילים - -| דגל | משמעות | -|------|---------| -| *(ללא)* | **משותף כברירת מחדל** — אישורים נפרדים; שיחות והגדרות משותפות כאשר המתאם מאפשר זאת. | -| `-i`, `--isolate`, `--isolated` | **מבודד** — כל שורש הכלי נמצא בפרופיל; דבר אינו משותף. | -| `--shared` | כינוי ישן למצב המשותף, כאשר המתאם תומך בו. | -| `--cli` | **CLI** — הפעלה מהטרמינל בלבד. | -| `--from ` | שיבוט מתבנית שמורה. | - ---- - -## משתני סביבה - -| משתנה | ברירת מחדל | מטרה | -|----------|---------|---------| -| `MULTICLI_HOME` | `~/MultiCliProfiles` | היכן מאוחסנים כל הפרופילים | -| `MULTICLI_OVERRIDE_BINARY` | *(לא מוגדר)* | כפיית נתיב בינארי ספציפי להפעלה הבאה | -| `MULTICLI_REPO` | *(לא מוגדר)* | כתובת Git להתקנה מרחוק | -| `MULTICLI_PLATFORM` | *(אוטומטי)* | עקיפת זיהוי הפלטפורמה (`darwin`, `linux`) | - ---- - - - -## פרופילים מדור קודם - -פרופילים שנוצרו לפני schema-v2 הם פרופילים מדור קודם בעלי שורש מלא: הם שומרים על ההתנהגות הקודמת של `env`, `userDataDir`, `redirectHome`, `appdata` ו-`sandboxUser` לצורך תאימות. תיקיית פרופיל ללא קובץ `.profile.json` נחשבת לדור קודם. - -`multi-cli migrate /` ממיר פרופיל מדור קודם ל-schema-v2: האישורים המוצהרים עוברים לתוך הפרופיל, והמצב הרגיל המוצהר מקושר לבית המשותף של הכלי. השתמשו ב-`--dry-run` כדי לראות את תוכנית ההעברה מבלי לשנות דבר, וב-`--prefer-profile` כדי להחליף קבצים משותפים מתנגשים בעותק של הפרופיל — יעדי אישורים לעולם אינם נדרסים. אחסון הפרופילים ושורש המצב המשותף חייבים להיות באותו כרך, מכיוון שההעברה משתמשת בהעברות אטומיות בתוך אותו כרך. - ---- - -## אבחון - -```bash -multi-cli doctor -``` - -בודק שאחסון הפרופילים קיים, שתיקיית הכינויים נמצאת ב-PATH, ושהבינארי של כל כלי מזוהה (או מציג רמז להתקנה). - ---- - -## השלמה אוטומטית ל-shell - -```bash -multi-cli completion bash # or zsh, powershell -``` - -עקבו אחר ההוראות כדי להוסיף זאת ל-`.zshrc`, ל-`.bashrc` או ל-`$PROFILE` של PowerShell. - ---- - -## הסרת התקנה - -**macOS / Linux** - -```bash -curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.sh | bash -``` - -**Windows** - -```powershell -irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/uninstall.ps1 | iex -``` - -תישאלו אם להסיר את נתוני הפרופילים — דבר לא נמחק ללא אישור. - ---- - -## קישורים - -- [מטריצת תמיכה](docs/support-matrix.md) — סטטוס בידוד לפי מוצר ומערכת הפעלה, ושער האימות -- [מדיניות אבטחה](SECURITY.md) -- [רישיון](LICENSE) -- [מאגר GitHub](https://github.com/Spielewoy/multi-cli) - ---- - -## קרדיטים - -- **יוצר** — [Spielewoy](https://github.com/Spielewoy) - ---- - - - -## רישיון - -[MIT](LICENSE) - -
diff --git a/README.md b/README.md index fa8625a..c39f4ab 100644 --- a/README.md +++ b/README.md @@ -1,314 +1,243 @@ -**English** | [Español](README.es.md) | [العربية](README.ar.md) | [中文](README.zh.md) | [Русский](README.ru.md) | [עברית](README.he.md) +

+ Multi-CLI. Use multiple accounts simultaneously without switching. +

-# multi-cli +

Use multiple accounts simultaneously without switching.

-**Run multiple account profiles for AI coding tools simultaneously.** +

+ 17 adapters + Version 1.0.0 + macOS, Linux, and Windows + License MIT +

-By default, each profile gets separate account credentials while conversations, configuration, agents, skills, and plugins stay shared where the tool allows it. Use `--isolated` when you want the entire tool home separated. Tools whose login cannot be separated safely use OS-user isolation instead. See the [support matrix](docs/support-matrix.md) for per-platform requirements. +

+ English | + Español | + العربية | + 中文 | + Русский | + עברית +

-Profiles created by older multi-cli versions keep their whole-root behavior until migrated — see [Legacy Profiles](#legacy-profiles). +## Contents -[![GitHub repository](https://img.shields.io/badge/GitHub-Repository-blue?logo=github)](https://github.com/Spielewoy/multi-cli) -[![GitHub profile](https://img.shields.io/badge/GitHub-Spielewoy-lightgrey?logo=github)](https://github.com/Spielewoy) -[![GitHub stars](https://img.shields.io/github/stars/Spielewoy/multi-cli?style=social)](https://github.com/Spielewoy/multi-cli/stargazers) -[![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey)](#install) -[![License](https://img.shields.io/badge/license-MIT-green)](#license) - ---- - -## Supported Tools - -17 adapters ship in this repository. Status is per operating system and binary: `supported` means multi-cli provides account isolation on that OS (any mode requirements are noted), and `unsupported` means no isolation mode works there. The authoritative source is [docs/support-matrix.md](docs/support-matrix.md). - -| Tool | Kind | Windows | macOS | Linux | -|------|------|---------|-------|-------| -| [Claude Code](claude-cli/) | CLI | supported (file overlay) | supported for API-key profiles only; subscription OAuth is unsupported | supported (file overlay) | -| [OpenAI Codex CLI](codex/) | CLI | supported (file overlay; file credential store mode) | supported | supported | -| [Gemini CLI](gemini-cli/) | CLI | supported (file overlay) | supported | supported | -| [OpenCode](opencode/) | CLI | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Command Code](commandcode/) | CLI | supported (file overlay; use `commandcode`, bare `cmd` collides with cmd.exe) | supported | supported | -| [Cursor Desktop](cursor/) | IDE | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Cursor CLI](cursor-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Antigravity](antigravity/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [AGY CLI](agy-cli/) | CLI | supported (OS-user isolation; elevated terminal) | unsupported (owned-user Keychain isolation not proven) | unsupported (owned-user Secret Service session not implemented) | -| [Kiro](kiro/) | IDE | supported (OS-user isolation) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [Zed](zed/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Devin Desktop / Windsurf](windsurf/) | IDE | supported (OS-user isolation; elevated terminal) | supported (`--isolated` whole-root) | supported (`--isolated` whole-root) | -| [GitHub Copilot CLI](copilot-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Copilot in VS Code](copilot-vscode/) | IDE | supported (OS-user isolation; elevated terminal) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (owned-user GUI/Secret Service session not implemented) | -| [Kimi Code CLI](kimi-cli/) | CLI | supported (process token via `multi-cli auth set`) | supported | supported | -| [Codex Desktop App](codex-gui/) | GUI | supported (owned Windows user and Store AppX activation) | unsupported (owned-user GUI/Keychain session not proven) | unsupported (no desktop app) | -| [Grok Build CLI](grok-cli/) | CLI/TUI | supported (process token via `multi-cli auth set`) | supported | supported | - -Each tool has its own folder at the repo root with an `adapter.json` describing the account boundary, the shared normal state, and the per-OS support status. - ---- +[Install](#install) · [Quick start](#quick-start) · [Supported tools](#supported-tools) · [Commands](#commands) · [Isolation](#how-isolation-works) · [Move sessions](#move-sessions-between-accounts) · [Troubleshooting](#troubleshooting) · [Uninstall](#uninstall) ## Install -**macOS / Linux** +Use the platform install script below, or download a packaged archive from [GitHub Releases](https://github.com/Spielewoy/multi-cli/releases). + +### macOS and Linux ```bash curl -fsSL https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.sh | bash ``` -**Windows** — open PowerShell: +### Windows + +Open PowerShell: ```powershell irm https://raw.githubusercontent.com/Spielewoy/multi-cli/main/scripts/install.ps1 | iex ``` -> After install, **restart your terminal** for PATH changes to take effect. +The installer clones or updates Multi-CLI and installs `jq` if needed. Rerun the same command to update. Restart your terminal after installation. On macOS and Linux, follow the printed PATH instruction if one appears. -### From source +
+Install from source ```bash git clone https://github.com/Spielewoy/multi-cli.git cd multi-cli -./scripts/install.sh --local # macOS/Linux -.\scripts\install.ps1 -Local # Windows +./scripts/install.sh --local ``` -> After install, **restart your terminal** for PATH changes to take effect. +Windows PowerShell: -> [jq](https://jqlang.github.io/jq/) is **installed automatically** by the installer on all platforms — no manual setup required. +```powershell +git clone https://github.com/Spielewoy/multi-cli.git +cd multi-cli +.\scripts\install.ps1 -Local +``` + +
---- +Requirements: Git, an internet connection, Bash on macOS or Linux, or PowerShell on Windows. The installer resolves the required `jq` binary automatically when possible. -## Quick Start +## Quick start ```bash -# Create a profile -multi-cli new claude-cli/work +# Check your setup and discover installed tools +multi-cli doctor +multi-cli tools -# Launch it +# Create and launch a profile +multi-cli new claude-cli/work multi-cli launch claude-cli/work -# Or use the shorthand +# Launch shorthand multi-cli claude-cli/work ``` -Each profile gets an automatic shell alias: - -| Platform | Location | -|----------|----------| -| macOS / Linux | `~/MultiCliProfiles/bin/` (add to `PATH`) | -| Windows | CLI aliases in `~/MultiCliProfiles/bin/`; Start Menu shortcuts for GUI profiles | - ---- +By default, credentials stay inside the profile while supported settings, conversations, agents, skills, and plugins remain shared. Use `--isolated` only with adapters that support whole-root isolation. OS-user adapters reject it because a redirected folder cannot isolate a fixed OS credential store. + +## Supported tools + +| Tool | Adapter | Platforms | Account boundary | +|---|---|---|---| +| AGY CLI | `agy-cli` | Windows | OS user | +| Antigravity | `antigravity` | Windows | OS user | +| Claude Code | `claude-cli` | Windows, Linux, macOS API keys | File overlay | +| Codex CLI | `codex` | Windows, macOS, Linux | File overlay | +| Codex Desktop | `codex-gui` | Windows | OS user | +| Command Code | `commandcode` | Windows, macOS, Linux | File overlay | +| GitHub Copilot CLI | `copilot-cli` | Windows, macOS, Linux | Process secret | +| GitHub Copilot in VS Code | `copilot-vscode` | Windows | OS user | +| Cursor CLI | `cursor-cli` | Windows, macOS, Linux | Process secret | +| Cursor Desktop | `cursor` | Windows, macOS, Linux | Isolated tool home | +| Gemini CLI | `gemini-cli` | Windows, macOS, Linux | File overlay | +| Grok Build CLI | `grok-cli` | Windows, macOS, Linux | Process secret | +| Kimi Code CLI | `kimi-cli` | Windows, macOS, Linux | Process secret | +| Kiro | `kiro` | Windows, macOS, Linux | OS user | +| OpenCode | `opencode` | Windows, macOS, Linux | Isolated tool home | +| Windsurf | `windsurf` | Windows, macOS, Linux | OS user | +| Zed | `zed` | Windows | OS user | + +Platform requirements and known limits are documented in the [support matrix](docs/support-matrix.md). Run `multi-cli tools` to see what is available on your machine. ## Commands -### Profile Management +### Profiles -| Command | Description | -|---------|-------------| +| Command | Action | +|---|---| | `multi-cli new /` | Create an account profile (credentials separate; normal state shared) | -| `multi-cli new / --isolated` | Fully isolated schema-v2 profile — shares nothing (whole tool root inside the profile) | -| `multi-cli new / --shared` | Legacy schema-v1 shared profile; schema-v2 profiles already share declared normal state by default | -| `multi-cli new / --from ` | Create from a saved template | -| `multi-cli /` | Launch a profile (shorthand) | -| `multi-cli launch /` | Launch a profile | -| `multi-cli list []` | List all profiles | -| `multi-cli status` | List profiles with their type and disk size | -| `multi-cli clone / /` | Copy an existing profile | +| `multi-cli new / --isolated` | Create a whole-root isolated profile when the adapter supports it; aliases: `--isolate`, `-i` | +| `multi-cli new / --from