Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 38 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Claude Code Best V5 (CCB)

[![GitHub Stars](https://img.shields.io/github/stars/claude-code-best/claude-code?style=flat-square&logo=github&color=yellow)](https://github.com/claude-code-best/claude-code/stargazers)
[![GitHub Contributors](https://img.shields.io/github/contributors/claude-code-best/claude-code?style=flat-square&color=green)](https://github.com/claude-code-best/claude-code/graphs/contributors)
[![GitHub Issues](https://img.shields.io/github/issues/claude-code-best/claude-code?style=flat-square&color=orange)](https://github.com/claude-code-best/claude-code/issues)
[![GitHub License](https://img.shields.io/github/license/claude-code-best/claude-code?style=flat-square)](https://github.com/claude-code-best/claude-code/blob/main/LICENSE)
[![Last Commit](https://img.shields.io/github/last-commit/claude-code-best/claude-code?style=flat-square&color=blue)](https://github.com/claude-code-best/claude-code/commits/main)
[![GitHub Stars](https://img.shields.io/github/stars/claude-code-best/claude-code-mix?style=flat-square&logo=github&color=yellow)](https://github.com/claude-code-best/claude-code-mix/stargazers)
[![GitHub Contributors](https://img.shields.io/github/contributors/claude-code-best/claude-code-mix?style=flat-square&color=green)](https://github.com/claude-code-best/claude-code-mix/graphs/contributors)
[![GitHub Issues](https://img.shields.io/github/issues/claude-code-best/claude-code-mix?style=flat-square&color=orange)](https://github.com/claude-code-best/claude-code-mix/issues)
[![GitHub License](https://img.shields.io/github/license/claude-code-best/claude-code-mix?style=flat-square)](https://github.com/claude-code-best/claude-code-mix/blob/main/LICENSE)
[![Last Commit](https://img.shields.io/github/last-commit/claude-code-best/claude-code-mix?style=flat-square&color=blue)](https://github.com/claude-code-best/claude-code-mix/commits/main)
Comment on lines +3 to +7
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

确认仓库 slug 是否应统一为 claude-code,避免文档链接失效。

当前 PR 目标仓库是 claude-code-best/claude-code,但这些位置都改成了 claude-code-mix。如果仓库未实际迁移,会导致徽章、DeepWiki、贡献者页、Star History 和源码安装路径指向错误。建议统一改为当前仓库 slug,或在 README 中明确“这是新仓库地址”。

Also applies to: 127-127, 246-246, 250-250, 256-260

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 3 - 7, Replace inconsistent repository slug
occurrences "claude-code-mix" in the README with the correct current slug (e.g.,
"claude-code") or explicitly state the repo moved; update all badge URLs,
contributor/graphs/stargazers/license/last-commit links and any
DeepWiki/source-install paths that reference "claude-code-mix" to the canonical
slug you want to use. Search for the literal string "claude-code-mix" (appears
in badges and other link anchors) and either replace it with "claude-code" or
add a short note at the top clarifying the new repository name, then verify each
badge and link (stars, contributors, issues, license, last-commit,
DeepWiki/installation references) resolves to the intended repo.

[![Bun](https://img.shields.io/badge/runtime-Bun-black?style=flat-square&logo=bun)](https://bun.sh/)
[![Discord](https://img.shields.io/badge/Discord-Join-5865F2?style=flat-square&logo=discord)](https://discord.gg/uApuzJWGKX)

Expand All @@ -27,6 +27,7 @@
| **Poor Mode** | 穷鬼模式,关闭记忆提取和键入建议,大幅度减少并发请求 | /poor 可以开关 |
| **Channels 频道通知** | MCP 服务器推送外部消息到会话(飞书/Slack/Discord/微信等),`--channels plugin:name@marketplace` 启用 | [文档](https://ccb.agent-aura.top/docs/features/channels) |
| **自定义模型供应商** | OpenAI/Anthropic/Gemini/Grok 兼容 (`/login`) | [文档](https://ccb.agent-aura.top/docs/features/all-features-guide) |
| **/mix 模型混合模式** | `/mix true` 启用独立 `ccbsettings.json`,Opus/Sonnet/Haiku 可分别配置 provider、Base URL、API Key 和模型名 | [使用说明](#mix-模型混合模式) |
| Voice Mode | 语音输入,支持豆包语言输入(`/voice doubao`) | [文档](https://ccb.agent-aura.top/docs/features/voice-mode) |
| Computer Use | 屏幕截图、键鼠控制 | [文档](https://ccb.agent-aura.top/docs/features/computer-use) |
| Chrome Use | 浏览器自动化、表单填写、数据抓取 | [自托管](https://ccb.agent-aura.top/docs/features/chrome-use-mcp) [原生版](https://ccb.agent-aura.top/docs/features/claude-in-chrome-mcp) |
Expand Down Expand Up @@ -123,7 +124,7 @@ powershell -c "irm bun.sh/install.ps1 | iex"
### 📥 安装

```bash
cd /path/to/claude-code
cd /path/to/claude-code-mix
bun install
```

Expand Down Expand Up @@ -161,6 +162,31 @@ bun run build

- ⌨️ **Tab / Shift+Tab** 切换字段,**Enter** 确认并跳到下一个,最后一个字段按 Enter 保存

### `/mix` 模型混合模式

默认情况下,`/login` 配置会保存到原版共享配置文件 `settings.json`,Opus、Sonnet、Haiku 三种模型共用同一组 provider、API URL 和 API Key。

如果你希望三种模型分别使用不同的 API 地址、密钥或协议,先在 REPL 中开启混合模式:

```text
/mix true
```

开启后:

- 配置会保存到独立的 `ccbsettings.json`,不再写入共享的 `settings.json`
- 再运行 `/login` 时,会先选择要配置的模型族:`Opus`、`Sonnet` 或 `Haiku`
- 选择模型族后,再进入原来的 provider 类型选择菜单,例如 Anthropic Compatible、OpenAI Compatible、Gemini API
- 每个模型族都可以单独保存自己的 provider、Base URL、API Key 和模型名

常用命令:

```text
/mix true # 开启模型混合模式,使用独立 ccbsettings.json
/mix status # 查看当前是否开启 mix 模式以及正在使用的配置文件
/mix false # 关闭模型混合模式,恢复使用原版共享 settings.json
```
Comment on lines +167 to +188
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

ccbsettings.json 增加 API Key 安全提示(必补)。

这里明确会把 API Key 写入本地配置文件,但缺少防泄漏指引。建议补充:不要提交该文件到 Git、加入 .gitignore、限制文件权限(如 chmod 600)。这能显著降低密钥泄露风险。

建议补充文案(示例)
 开启后:
 
 - 配置会保存到独立的 `ccbsettings.json`,不再写入共享的 `settings.json`
@@
 - 每个模型族都可以单独保存自己的 provider、Base URL、API Key 和模型名
+
+> 🔐 安全提示:`ccbsettings.json` 包含 API Key,请勿提交到仓库。
+> 建议将其加入 `.gitignore`,并在类 Unix 系统执行 `chmod 600 ccbsettings.json` 限制读取权限。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 167 - 188, Add a short API Key security notice to the
README right after the paragraph that explains ccbsettings.json (the section
describing /mix and /login), stating that API keys are stored locally in
ccbsettings.json and must not be committed to source control; instruct to add
ccbsettings.json to .gitignore, set restrictive file permissions (e.g., chmod
600) or equivalent on the platform, and recommend rotating/regenerating keys and
limiting key scope if exposed. Reference the ccbsettings.json filename and the
commands /mix and /login so readers know this applies when they enable mix mode
and create per-model credentials.


> ℹ️ 支持所有 Anthropic API 兼容服务(如 OpenRouter、AWS Bedrock 代理等),只要接口兼容 Messages API 即可。

## Feature Flags
Expand Down Expand Up @@ -217,21 +243,21 @@ TUI (REPL) 模式需要真实终端,无法直接通过 VS Code launch 启动
## 相关文档及网站

- **在线文档(Mintlify)**: [ccb.agent-aura.top](https://ccb.agent-aura.top/) — 文档源码位于 [`docs/`](docs/) 目录,欢迎投稿 PR
- **DeepWiki**: [https://deepwiki.com/claude-code-best/claude-code](https://deepwiki.com/claude-code-best/claude-code)
- **DeepWiki**: [https://deepwiki.com/claude-code-best/claude-code-mix](https://deepwiki.com/claude-code-best/claude-code-mix)

## Contributors

<a href="https://github.com/claude-code-best/claude-code/graphs/contributors">
<a href="https://github.com/claude-code-best/claude-code-mix/graphs/contributors">
<img src="contributors.svg" alt="Contributors" />
</a>

## Star History

<a href="https://www.star-history.com/?repos=claude-code-best%2Fclaude-code&type=date&legend=top-left">
<a href="https://www.star-history.com/?repos=claude-code-best%2Fclaude-code-mix&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=claude-code-best/claude-code&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=claude-code-best/claude-code&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=claude-code-best/claude-code&type=date&legend=top-left" />
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=claude-code-best/claude-code-mix&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=claude-code-best/claude-code-mix&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=claude-code-best/claude-code-mix&type=date&legend=top-left" />
</picture>
</a>

Expand Down
52 changes: 39 additions & 13 deletions README_EN.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Claude Code Best V5 (CCB)

[![GitHub Stars](https://img.shields.io/github/stars/claude-code-best/claude-code?style=flat-square&logo=github&color=yellow)](https://github.com/claude-code-best/claude-code/stargazers)
[![GitHub Contributors](https://img.shields.io/github/contributors/claude-code-best/claude-code?style=flat-square&color=green)](https://github.com/claude-code-best/claude-code/graphs/contributors)
[![GitHub Issues](https://img.shields.io/github/issues/claude-code-best/claude-code?style=flat-square&color=orange)](https://github.com/claude-code-best/claude-code/issues)
[![GitHub License](https://img.shields.io/github/license/claude-code-best/claude-code?style=flat-square)](https://github.com/claude-code-best/claude-code/blob/main/LICENSE)
[![Last Commit](https://img.shields.io/github/last-commit/claude-code-best/claude-code?style=flat-square&color=blue)](https://github.com/claude-code-best/claude-code/commits/main)
[![GitHub Stars](https://img.shields.io/github/stars/claude-code-best/claude-code-mix?style=flat-square&logo=github&color=yellow)](https://github.com/claude-code-best/claude-code-mix/stargazers)
[![GitHub Contributors](https://img.shields.io/github/contributors/claude-code-best/claude-code-mix?style=flat-square&color=green)](https://github.com/claude-code-best/claude-code-mix/graphs/contributors)
[![GitHub Issues](https://img.shields.io/github/issues/claude-code-best/claude-code-mix?style=flat-square&color=orange)](https://github.com/claude-code-best/claude-code-mix/issues)
[![GitHub License](https://img.shields.io/github/license/claude-code-best/claude-code-mix?style=flat-square)](https://github.com/claude-code-best/claude-code-mix/blob/main/LICENSE)
[![Last Commit](https://img.shields.io/github/last-commit/claude-code-best/claude-code-mix?style=flat-square&color=blue)](https://github.com/claude-code-best/claude-code-mix/commits/main)
[![Bun](https://img.shields.io/badge/runtime-Bun-black?style=flat-square&logo=bun)](https://bun.sh/)

> Which Claude do you like? The open source one is the best.
Expand Down Expand Up @@ -32,6 +32,7 @@ Sponsor placeholder.
- [x] Custom Sentry error reporting support [Docs](https://ccb.agent-aura.top/docs/internals/sentry-setup)
- [x] Custom GrowthBook support (GB is open source — configure your own feature flag platform) [Docs](https://ccb.agent-aura.top/docs/internals/growthbook-adapter)
- [x] Custom login mode — configure Claude models your way
- [x] `/mix` mixed model mode — use an independent `ccbsettings.json` so Opus, Sonnet, and Haiku can each have their own provider, Base URL, API key, and model name
- [ ] V6: Large-scale refactoring, full modular packaging
- [ ] V6 will be a new branch; main branch will be archived as a historical version

Expand Down Expand Up @@ -105,7 +106,7 @@ powershell -c "irm bun.sh/install.ps1 | iex"
### Install

```bash
cd /path/to/claude-code
cd /path/to/claude-code-mix
bun install
```

Expand Down Expand Up @@ -143,6 +144,31 @@ Fields to fill in:
- Model fields auto-fill from current environment variables
- Configuration saves to `~/.claude/settings.json` under the `env` key, effective immediately

### `/mix` Mixed Model Mode

By default, `/login` saves provider settings to the shared `settings.json` file, so Opus, Sonnet, and Haiku use the same provider, API URL, and API key.

If you want each model family to use a different API endpoint, key, or protocol, enable mixed model mode in the REPL first:

```text
/mix true
```

After enabling it:

- Configuration is saved to the independent `ccbsettings.json` file instead of the shared `settings.json`
- Running `/login` first asks which model family to configure: `Opus`, `Sonnet`, or `Haiku`
- After selecting the model family, the existing provider menu appears, such as Anthropic Compatible, OpenAI Compatible, or Gemini API
- Each model family can store its own provider, Base URL, API key, and model name

Common commands:

```text
/mix true # Enable mixed model mode with independent ccbsettings.json
/mix status # Show whether mix mode is enabled and which config file is active
/mix false # Disable mixed model mode and return to shared settings.json
```

You can also edit `~/.claude/settings.json` directly:

```json
Expand Down Expand Up @@ -188,21 +214,21 @@ The TUI (REPL) mode requires a real terminal and cannot be launched directly via
## Documentation & Links

- **Online docs (Mintlify)**: [ccb.agent-aura.top](https://ccb.agent-aura.top/) — source in [`docs/`](docs/), PR contributions welcome
- **DeepWiki**: https://deepwiki.com/claude-code-best/claude-code
- **DeepWiki**: https://deepwiki.com/claude-code-best/claude-code-mix

## Contributors

<a href="https://github.com/claude-code-best/claude-code/graphs/contributors">
<img src="https://contrib.rocks/image?repo=claude-code-best/claude-code" />
<a href="https://github.com/claude-code-best/claude-code-mix/graphs/contributors">
<img src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
</a>
Comment on lines +221 to 223
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add missing alt text for the contributors image (MD045).

At Line 222, the <img> tag has no alt attribute, which hurts accessibility and triggers markdownlint.

Suggested patch
 <a href="https://github.com/claude-code-best/claude-code-mix/graphs/contributors">
-  <img src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
+  <img alt="Contributors list for claude-code-best/claude-code-mix" src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
 </a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a href="https://github.com/claude-code-best/claude-code-mix/graphs/contributors">
<img src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
</a>
<a href="https://github.com/claude-code-best/claude-code-mix/graphs/contributors">
<img alt="Contributors list for claude-code-best/claude-code-mix" src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
</a>
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 222-222: Images should have alternate text (alt text)

(MD045, no-alt-text)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README_EN.md` around lines 221 - 223, Add a meaningful alt attribute to the
contributors image tag to satisfy MD045 and improve accessibility; locate the
<img src="https://contrib.rocks/image?repo=claude-code-best/claude-code-mix" />
tag and update it to include an appropriate alt text (e.g., alt="Contributors to
claude-code-mix") so the image element is not missing its alt attribute.


## Star History

<a href="https://www.star-history.com/?repos=claude-code-best%2Fclaude-code&type=date&legend=top-left">
<a href="https://www.star-history.com/?repos=claude-code-best%2Fclaude-code-mix&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code&type=date&legend=top-left" />
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code-mix&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code-mix&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=claude-code-best%2Fclaude-code-mix&type=date&legend=top-left" />
</picture>
</a>

Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
"author": "claude-code-best <claude-code-best@proton.me>",
"repository": {
"type": "git",
"url": "git+https://github.com/claude-code-best/claude-code.git"
"url": "git+https://github.com/claude-code-best/claude-code-mix.git"
},
"homepage": "https://github.com/claude-code-best/claude-code#readme",
"homepage": "https://github.com/claude-code-best/claude-code-mix#readme",
"bugs": {
"url": "https://github.com/claude-code-best/claude-code/issues"
"url": "https://github.com/claude-code-best/claude-code-mix/issues"
},
"keywords": [
"claude",
Expand Down
5 changes: 4 additions & 1 deletion src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ import stickers from './commands/stickers/index.js'
import advisor from './commands/advisor.js'
import autonomy from './commands/autonomy.js'
import provider from './commands/provider.js'
import mix from './commands/mix.js'
import { logError } from './utils/log.js'
import { toError } from './utils/errors.js'
import { logForDebugging } from './utils/debug.js'
Expand All @@ -212,6 +213,7 @@ import {
import memoize from 'lodash-es/memoize.js'
import { isUsing3PServices, isClaudeAISubscriber } from './utils/auth.js'
import { isFirstPartyAnthropicBaseUrl } from './utils/model/providers.js'
import { isMixModeEnabled } from './utils/model/mix.js'
import env from './commands/env/index.js'
import exit from './commands/exit/index.js'
import exportCommand from './commands/export/index.js'
Expand Down Expand Up @@ -300,6 +302,7 @@ const COMMANDS = memoize((): Command[] => [
advisor,
autonomy,
provider,
mix,
agents,
branch,
btw,
Expand Down Expand Up @@ -380,7 +383,7 @@ const COMMANDS = memoize((): Command[] => [
hooks,
exportCommand,
sandboxToggle,
...(!isUsing3PServices() ? [logout, login()] : []),
...(!isUsing3PServices() || isMixModeEnabled() ? [logout, login()] : []),
passes,
...(peersCmd ? [peersCmd] : []),
...(attachCmd ? [attachCmd] : []),
Expand Down
99 changes: 99 additions & 0 deletions src/commands/mix.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import type { Command } from '../commands.js'
import type { LocalCommandCall } from '../types/command.js'
import { MIX_MODE_ENV, isMixModeEnabled } from '../utils/model/mix.js'
import {
getSettings_DEPRECATED,
getSettingsFilePathForSource,
updateSettingsForSource,
} from '../utils/settings/settings.js'

const TRUE_VALUES = new Set(['true', 'on', 'enable', 'enabled', '1', 'yes'])
const FALSE_VALUES = new Set(['false', 'off', 'disable', 'disabled', '0', 'no'])

function getMixUsageText(
enabled: boolean,
settingsPath: string | undefined,
): string {
return [
`Mix mode is ${enabled ? 'enabled' : 'disabled'}.`,
`Settings file: ${settingsPath ?? 'unknown'}`,
'',
'Usage:',
' /mix true Enable mixed model mode',
' /mix false Disable mixed model mode',
' /mix status Show current mixed model mode status',
'',
'Mixed model mode uses the independent ccbsettings.json config file instead of the shared settings.json.',
'When mixed model mode is enabled, Opus, Sonnet, and Haiku can each be configured separately.',
'After running /mix true, run /login and choose which model family you want to configure first.',
'Each model family stores its own provider, API URL, API key, and model name in ccbsettings.json.',
].join('\n')
}

const call: LocalCommandCall = async args => {
const arg = args.trim().toLowerCase()
const settingsPath = getSettingsFilePathForSource('userSettings')

if (!arg || arg === 'status') {
const settings = getSettings_DEPRECATED() || {}
const enabled = isMixModeEnabled(settings)
return {
type: 'text',
value: getMixUsageText(enabled, settingsPath),
}
}

if (!TRUE_VALUES.has(arg) && !FALSE_VALUES.has(arg)) {
return {
type: 'text',
value: getMixUsageText(
isMixModeEnabled(getSettings_DEPRECATED() || {}),
settingsPath,
),
}
}

const enabled = TRUE_VALUES.has(arg)
const previousMixEnv = process.env[MIX_MODE_ENV]
if (enabled) {
process.env[MIX_MODE_ENV] = '1'
}
const { error } = updateSettingsForSource('userSettings', { mix: enabled })
if (error) {
if (previousMixEnv === undefined) {
delete process.env[MIX_MODE_ENV]
} else {
process.env[MIX_MODE_ENV] = previousMixEnv
}
return {
type: 'text',
value: `Failed to update mix mode: ${error.message}`,
}
}

process.env[MIX_MODE_ENV] = enabled ? '1' : '0'
return {
type: 'text',
value: enabled
? [
'Mix mode enabled.',
'',
'Mixed model mode uses the independent ccbsettings.json config file.',
'Next step: run /login, then select Opus, Sonnet, or Haiku to configure that model family.',
'Each family can use its own provider, API URL, API key, and model name.',
].join('\n')
: 'Mix mode disabled. /login will use the shared API configuration flow.',
}
}

const mix = {
type: 'local',
name: 'mix',
description:
'Enable or disable mixed model mode using an independent config file; Opus, Sonnet, and Haiku can be configured separately',
argumentHint: '[true|false|status]',
supportsNonInteractive: true,
load: () => Promise.resolve({ call }),
} satisfies Command

export default mix
Loading