diff --git a/README.md b/README.md index 5fc2e41..f17ea56 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@

English · 中文 · + Website · Commands · Development

@@ -19,6 +20,7 @@ Platform License CLI + Website

@@ -39,6 +41,8 @@ `conda-helper` is a small, cross-platform command-line companion for native [`conda`](https://docs.conda.io/). It wraps frequent but fiddly environment tasks into readable one-liners, adds safer defaults, and translates common failures into actionable hints. +Project website: [`wellkilo.github.io/conda-helper`](https://wellkilo.github.io/conda-helper/) +
@@ -70,6 +74,8 @@ `conda-helper` 是一个轻量、跨平台的 Conda 命令行增强工具。它基于原生 [`conda`](https://docs.conda.io/) 封装常用环境管理动作,把繁琐命令变成清晰的一行命令,并提供更友好的错误提示与交互式面板。 +项目介绍网站:[`wellkilo.github.io/conda-helper`](https://wellkilo.github.io/conda-helper/) +
diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d1dfb9c --- /dev/null +++ b/docs/index.html @@ -0,0 +1,196 @@ + + + + + + + conda-helper · Beautiful Conda environment workflows + + + + + + +
+ + +
+
+
+

Python CLI · Conda · Cross-platform

+

Make Conda environment operations beautiful, safe, and repeatable.

+

+ conda-helper wraps frequent environment tasks into readable one-liners, + adds safer defaults, and turns common Conda failures into actionable + hints for research, data science, and local development workflows. +

+ +
+
8+CLI commands
+
3platform families
+
MITopen source
+
+
+ +
+
+ +

workflow.sh

+
+
$ conda-helper ls
+NAME                     SIZE  PREFIX
+base                   4.2 GB  /opt/miniconda3
+vision-lab             9.8 GB  /envs/vision-lab
+
+$ conda-helper backup vision-lab --from-history
+backup written: vision-lab-20260601-101530-history.yml
+
+$ conda-helper pack vision-lab -o ./dist
+archive ready: dist/vision-lab-20260601-101630.tar.gz
+
+
+ +
+ Backup + Restore + Clone + Pack + Clean + Doctor + Panel +
+ +
+
+

Feature map

+

Everything you need for daily Conda environment operations.

+

+ Designed for users who manage many local environments and want a safer, + more memorable interface on top of native Conda. +

+
+
+
+ 01 +

Versioned backups

+

Export environments to timestamped YAML files, with history-only mode for portable migrations.

+
+
+ 02 +

Restore and rename

+

Rebuild from any backup and override the target environment name during restore.

+
+
+ 03 +

One-command cloning

+

Wrap native conda create --clone into a compact, easy-to-remember command.

+
+
+ 04 +

Offline archives

+

Prefer conda-pack for relocatable archives and fall back to metadata-rich tarballs.

+
+
+ 05 +

Safe cleanup

+

Batch-remove stale environments and preview cache cleanup with dry-run support.

+
+
+ 06 +

Friendly diagnostics

+

Run health checks and translate network, disk, channel, and permission problems into practical hints.

+
+
+
+ +
+
+

Workflow design

+

A CLI that follows how environments actually move.

+

+ conda-helper organizes Conda operations around a repeatable lifecycle: + inspect, preserve, move, deploy, and clean. Each command has clear output + and conservative behavior by default. +

+
+
+
Inspectconda-helper ls shows size and prefix.
+
Preservebackup --from-history keeps migrations portable.
+
Moverestore, clone, and pack cover common transfer paths.
+
Recoverdoctor and friendly errors guide next actions.
+
+
+ +
+
+

Technical design

+

Small modules, testable boundaries, native Conda underneath.

+
+
+
+

Click-based interface

+

The command layer provides ergonomic flags, aliases, validation, and terminal-friendly output.

+
+
+

Command service layer

+

High-level operations return plain Python data so core behavior can be unit-tested independently.

+
+
+

Conda wrapper

+

A focused adapter delegates to the real Conda executable instead of reimplementing package logic.

+
+
+

Actionable error model

+

Known Conda failure patterns are mapped to friendly explanations and next-step suggestions.

+
+
+
+ +
+
+

Install

+

Start from PyPI or source.

+

Requires Python 3.8+ and an available Conda installation.

+
+
pip install conda-helper
+conda-helper doctor
+
+# or install from source
+git clone https://github.com/wellkilo/conda-helper.git
+cd conda-helper
+pip install -e .
+
+
+ + +
+ + diff --git a/docs/site.css b/docs/site.css new file mode 100644 index 0000000..87eab3e --- /dev/null +++ b/docs/site.css @@ -0,0 +1,475 @@ +:root { + color-scheme: dark; + --bg: #06111f; + --bg-soft: #0a1728; + --panel: rgba(13, 29, 50, 0.78); + --panel-strong: rgba(17, 39, 67, 0.92); + --line: rgba(148, 163, 184, 0.18); + --text: #e5edf7; + --muted: #9fb1c8; + --primary: #4ade80; + --primary-strong: #22c55e; + --cyan: #38bdf8; + --purple: #a78bfa; + --shadow: 0 24px 80px rgba(0, 0, 0, 0.38); + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + min-width: 320px; + margin: 0; + color: var(--text); + background: + radial-gradient(circle at top left, rgba(74, 222, 128, 0.18), transparent 32rem), + radial-gradient(circle at 80% 10%, rgba(56, 189, 248, 0.16), transparent 34rem), + radial-gradient(circle at 55% 55%, rgba(167, 139, 250, 0.12), transparent 36rem), + var(--bg); +} + +a { + color: inherit; + text-decoration: none; +} + +code, +pre { + font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; +} + +pre { + overflow-x: auto; + margin: 0; + white-space: pre-wrap; +} + +.page-shell { + width: min(1180px, calc(100% - 40px)); + margin: 0 auto; +} + +.site-header { + position: sticky; + top: 16px; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin: 16px 0 56px; + padding: 12px; + border: 1px solid var(--line); + border-radius: 28px; + background: rgba(6, 17, 31, 0.76); + backdrop-filter: blur(18px); + box-shadow: 0 12px 42px rgba(0, 0, 0, 0.22); +} + +.brand { + display: inline-flex; + align-items: center; + gap: 12px; +} + +.brand-mark { + display: grid; + width: 48px; + height: 48px; + place-items: center; + border-radius: 16px; + color: #04101d; + background: linear-gradient(135deg, var(--primary), var(--cyan)); + font-weight: 800; + letter-spacing: -0.06em; +} + +.brand strong, +.brand small { + display: block; +} + +.brand small { + margin-top: 2px; + color: var(--muted); + font-size: 0.78rem; +} + +.site-nav { + display: flex; + gap: 8px; + color: var(--muted); + font-size: 0.94rem; +} + +.site-nav a, +.header-cta { + padding: 10px 14px; + border-radius: 999px; +} + +.site-nav a:hover, +.header-cta:hover { + background: rgba(148, 163, 184, 0.12); + color: var(--text); +} + +.header-cta { + color: #04101d; + background: var(--text); + font-weight: 700; +} + +.section { + margin: 86px 0; +} + +.section-grid { + display: grid; + grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.95fr); + gap: 36px; + align-items: center; +} + +.hero { + min-height: 620px; +} + +.eyebrow { + margin: 0 0 14px; + color: var(--primary); + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; + font-size: 0.78rem; +} + +h1, +h2, +h3, +p { + margin-top: 0; +} + +h1 { + max-width: 820px; + margin-bottom: 24px; + font-size: clamp(3.2rem, 9vw, 6.8rem); + line-height: 0.9; + letter-spacing: -0.08em; +} + +h2 { + margin-bottom: 16px; + font-size: clamp(2rem, 4vw, 3.6rem); + line-height: 1; + letter-spacing: -0.055em; +} + +h3 { + margin-bottom: 10px; + font-size: 1.18rem; +} + +.hero-lede, +.section-heading p, +.workflow-section p, +.install-card p, +.feature-card p, +.architecture-grid p, +.timeline span, +.site-footer { + color: var(--muted); + line-height: 1.72; +} + +.hero-lede { + max-width: 690px; + font-size: 1.12rem; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin: 34px 0; +} + +.button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 48px; + padding: 0 18px; + border: 1px solid var(--line); + border-radius: 999px; + font-weight: 800; +} + +.button.primary { + color: #04101d; + background: linear-gradient(135deg, var(--primary), var(--cyan)); + border: 0; +} + +.button.ghost { + color: var(--text); + background: rgba(255, 255, 255, 0.04); +} + +.stats { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; + max-width: 620px; +} + +.stats div { + padding: 18px; + border: 1px solid var(--line); + border-radius: 22px; + background: rgba(255, 255, 255, 0.04); +} + +.stats strong, +.stats span { + display: block; +} + +.stats strong { + font-size: 1.6rem; +} + +.stats span { + margin-top: 4px; + color: var(--muted); + font-size: 0.88rem; +} + +.terminal-card, +.install-card, +.feature-card, +.architecture-grid article, +.timeline, +.logo-strip { + border: 1px solid var(--line); + background: var(--panel); + box-shadow: var(--shadow); +} + +.terminal-card { + overflow: hidden; + border-radius: 30px; + transform: rotate(1.5deg); +} + +.terminal-titlebar { + display: flex; + align-items: center; + gap: 8px; + padding: 16px 18px; + border-bottom: 1px solid var(--line); + background: rgba(255, 255, 255, 0.04); +} + +.terminal-titlebar span { + width: 12px; + height: 12px; + border-radius: 999px; + background: #fb7185; +} + +.terminal-titlebar span:nth-child(2) { + background: #facc15; +} + +.terminal-titlebar span:nth-child(3) { + background: var(--primary); +} + +.terminal-titlebar p { + margin: 0 0 0 8px; + color: var(--muted); + font-family: "JetBrains Mono", monospace; + font-size: 0.82rem; +} + +.terminal-card pre { + padding: 24px; + color: #d9f99d; + font-size: 0.95rem; + line-height: 1.74; +} + +.logo-strip { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 10px; + margin: 24px 0 90px; + padding: 18px; + border-radius: 24px; +} + +.logo-strip span { + padding: 10px 14px; + border-radius: 999px; + color: var(--muted); + background: rgba(255, 255, 255, 0.05); + font-weight: 800; +} + +.section-heading { + max-width: 760px; + margin-bottom: 34px; +} + +.feature-grid, +.architecture-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.feature-card, +.architecture-grid article { + padding: 24px; + border-radius: 28px; +} + +.feature-card .icon { + display: inline-grid; + width: 44px; + height: 44px; + place-items: center; + margin-bottom: 24px; + border-radius: 14px; + color: #04101d; + background: linear-gradient(135deg, var(--primary), var(--cyan)); + font-family: "JetBrains Mono", monospace; + font-weight: 800; +} + +.feature-card code, +.timeline code { + color: #d9f99d; +} + +.timeline { + display: grid; + gap: 12px; + padding: 20px; + border-radius: 30px; +} + +.timeline div { + display: grid; + grid-template-columns: 110px 1fr; + gap: 18px; + padding: 18px; + border-radius: 20px; + background: rgba(255, 255, 255, 0.045); +} + +.timeline strong { + color: var(--primary); +} + +.install-card { + display: grid; + grid-template-columns: minmax(0, 0.9fr) minmax(320px, 1.1fr); + gap: 28px; + align-items: center; + padding: 34px; + border-radius: 34px; + background: + linear-gradient(135deg, rgba(74, 222, 128, 0.12), rgba(56, 189, 248, 0.08)), + var(--panel-strong); +} + +.install-card pre { + padding: 22px; + border: 1px solid var(--line); + border-radius: 24px; + background: rgba(0, 0, 0, 0.28); + color: #d9f99d; + line-height: 1.7; +} + +.site-footer { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 16px; + padding: 34px 0 48px; + border-top: 1px solid var(--line); +} + +.site-footer p { + margin: 0; +} + +.site-footer a { + color: var(--text); + font-weight: 800; +} + +@media (max-width: 880px) { + .site-header { + position: static; + align-items: flex-start; + border-radius: 24px; + } + + .site-nav { + display: none; + } + + .section-grid, + .feature-grid, + .architecture-grid, + .install-card { + grid-template-columns: 1fr; + } + + .hero { + min-height: auto; + padding-top: 42px; + } + + .terminal-card { + transform: none; + } +} + +@media (max-width: 560px) { + .page-shell { + width: min(100% - 24px, 1180px); + } + + .brand small, + .header-cta { + display: none; + } + + h1 { + font-size: 3.35rem; + } + + .stats, + .timeline div { + grid-template-columns: 1fr; + } + + .install-card, + .feature-card, + .architecture-grid article { + padding: 22px; + } +} diff --git a/pyproject.toml b/pyproject.toml index 59c7ab9..3a0e08e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ dev = [ [project.urls] Homepage = "https://github.com/wellkilo/conda-helper" +Documentation = "https://wellkilo.github.io/conda-helper/" Issues = "https://github.com/wellkilo/conda-helper/issues" [project.scripts]