@@ -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
+
3 platform families
+
MIT open source
+
+
+
+
+
+
$ 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.
+
+
+
+
Inspect conda-helper ls shows size and prefix.
+
Preserve backup --from-history keeps migrations portable.
+
Move restore, clone, and pack cover common transfer paths.
+
Recover doctor 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]