Skip to content
Merged
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
18 changes: 18 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
cff-version: 1.2.0
message: "If Agent Switch supports your work, please cite the software using these metadata."
title: "Agent Switch"
type: software
authors:
- name: "JNHFlow21"
repository-code: "https://github.com/JNHFlow21/agent-switch"
url: "https://github.com/JNHFlow21/agent-switch"
license: MIT
version: 0.2.0
date-released: 2026-07-26
keywords:
- MCP
- macOS
- AI agents
- secret management
- Codex
- Claude Code
25 changes: 24 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,15 @@
</p>

<p align="center">
<img src="docs/assets/agent-switch-dashboard.jpg" width="820" alt="Agent Switch dashboard showing health, configuration drift, MCP routes, and credential availability">
<a href="https://github.com/JNHFlow21/agent-switch/stargazers"><img src="https://img.shields.io/github/stars/JNHFlow21/agent-switch?style=flat-square&label=stars" alt="GitHub stars"></a>
<a href="https://github.com/JNHFlow21/agent-switch/forks"><img src="https://img.shields.io/github/forks/JNHFlow21/agent-switch?style=flat-square&label=forks" alt="GitHub forks"></a>
<a href="https://github.com/JNHFlow21/agent-switch/commits/main"><img src="https://img.shields.io/github/commit-activity/t/JNHFlow21/agent-switch?style=flat-square&label=commits" alt="GitHub commit activity"></a>
<a href="https://github.com/JNHFlow21/agent-switch/releases"><img src="https://img.shields.io/github/downloads/JNHFlow21/agent-switch/total?style=flat-square&label=downloads" alt="Release downloads"></a>
<img src="https://visitor-badge.laobi.icu/badge?page_id=JNHFlow21.agent-switch&left_text=README%20visits" alt="README visit counter">
</p>

<p align="center">
<img src="docs/assets/agent-switch-dashboard-en.png" width="820" alt="Agent Switch dashboard showing health, configuration drift, MCP routes, and credential availability">
</p>

<p align="center">
Expand All @@ -40,6 +48,21 @@ credential store, and deterministic per-agent projections.
> and [release checksums](https://github.com/JNHFlow21/agent-switch/releases/tag/v0.2.0)
> before installing.


## Project activity

| Public signal | Live or latest owner-visible value |
| --- | ---: |
| Stars / forks / commits / release downloads | Live badges above |
| README visits | Public counter above; may include bots and repeat visits |
| Unique repository visitors | **0** in the rolling 14-day GitHub Traffic window |
| Unique Git cloners | **11** (**12** total clones) in the rolling 14-day window |

<sub>Traffic snapshot: 2026-08-10. GitHub exposes clone and unique-visitor analytics only to maintainers, so those values are a dated, transparent snapshot rather than a token-backed public badge.</sub>

The native app follows the macOS language preference and ships complete
**English** and **Simplified Chinese** interface catalogs.

## Quick start

### Prerequisites
Expand Down
24 changes: 23 additions & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,15 @@
</p>

<p align="center">
<img src="docs/assets/agent-switch-dashboard.jpg" width="820" alt="Agent Switch 仪表板,展示健康状态、配置漂移、MCP 路由和密钥可用状态">
<a href="https://github.com/JNHFlow21/agent-switch/stargazers"><img src="https://img.shields.io/github/stars/JNHFlow21/agent-switch?style=flat-square&label=stars" alt="GitHub stars"></a>
<a href="https://github.com/JNHFlow21/agent-switch/forks"><img src="https://img.shields.io/github/forks/JNHFlow21/agent-switch?style=flat-square&label=forks" alt="GitHub forks"></a>
<a href="https://github.com/JNHFlow21/agent-switch/commits/main"><img src="https://img.shields.io/github/commit-activity/t/JNHFlow21/agent-switch?style=flat-square&label=commits" alt="GitHub commit activity"></a>
<a href="https://github.com/JNHFlow21/agent-switch/releases"><img src="https://img.shields.io/github/downloads/JNHFlow21/agent-switch/total?style=flat-square&label=downloads" alt="Release downloads"></a>
<img src="https://visitor-badge.laobi.icu/badge?page_id=JNHFlow21.agent-switch&left_text=README%20visits" alt="README visit counter">
</p>

<p align="center">
<img src="docs/assets/agent-switch-dashboard-en.png" width="820" alt="Agent Switch 仪表板,展示健康状态、配置漂移、MCP 路由和密钥可用状态">
</p>

<p align="center">
Expand All @@ -38,6 +46,20 @@ Agent Switch 用一个本地 MCP 注册表、一个私密凭据存储和可重
> quarantine。安装前请先检查[公开源码](https://github.com/JNHFlow21/agent-switch)
> 和[发行校验和](https://github.com/JNHFlow21/agent-switch/releases/tag/v0.2.0)。


## 项目数据

| 公开指标 | 实时数据或最近一次维护者可见数据 |
| --- | ---: |
| Star / Fork / Commit / 发行下载量 | 见上方实时徽章 |
| README 访问量 | 见上方公开计数器;可能包含机器人和重复访问 |
| 仓库独立访客 | GitHub Traffic 最近 14 天滚动窗口内为 **0** |
| 独立克隆者 | 最近 14 天滚动窗口内为 **11**(共 **12** 次克隆) |

<sub>数据快照日期:2026-08-10。GitHub 只向仓库维护者提供克隆与独立访客数据,因此这里采用注明日期的透明快照,而不是需要私密 Token 的公开徽章。</sub>

原生应用会跟随 macOS 的语言偏好,并完整提供**英文**与**简体中文**界面。

## 快速开始

### 前置条件
Expand Down
Binary file added docs/assets/agent-switch-dashboard-en.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/assets/agent-switch-dashboard.jpg
Binary file not shown.
2 changes: 2 additions & 0 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
Canonical repository: https://github.com/JNHFlow21/agent-switch
License: MIT
Platform: macOS 14+ for the native app; Python 3.11+ for the CLI
Interface languages: English and Simplified Chinese

## Primary purpose

Expand All @@ -21,6 +22,7 @@ Agent Switch prevents configuration drift across local AI coding agents. It cent
- Diagnostics list secret names only.
- Downloaded Skills are dormant until explicitly activated for a project or the global profile.
- Skill source updates never activate Skills.
- The native interface is localized in English and Simplified Chinese and follows the macOS language preference.
- `doctor` previews and validates; `reconcile` writes atomically and creates backups.

## Supported integrations
Expand Down
5 changes: 5 additions & 0 deletions macos-app/AgentSwitch/AgentSwitch.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
A1000001000000000000000F /* AgentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2000001000000000000000F; };
A10000010000000000000010 /* CLIsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000010000000000000010; };
A10000010000000000000011 /* SkillsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20000010000000000000011; };
A10000010000000000000012 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = A20000010000000000000012; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand All @@ -44,6 +45,7 @@
A2000001000000000000000F /* AgentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentsView.swift; sourceTree = "<group>"; };
A20000010000000000000010 /* CLIsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CLIsView.swift; sourceTree = "<group>"; };
A20000010000000000000011 /* SkillsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillsView.swift; sourceTree = "<group>"; };
A20000010000000000000012 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
A30000010000000000000001 /* Agent Switch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Agent Switch.app"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -179,6 +181,7 @@
isa = PBXGroup;
children = (
A2000001000000000000000D /* L10n.swift */,
A20000010000000000000012 /* Localizable.xcstrings */,
A2000001000000000000000E /* Assets.xcassets */,
);
path = Resources;
Expand Down Expand Up @@ -243,6 +246,7 @@
hasScannedForEncodings = 0;
knownRegions = (
en,
"zh-Hans",
Base,
);
mainGroup = A40000010000000000000001;
Expand All @@ -261,6 +265,7 @@
buildActionMask = 2147483647;
files = (
A1000001000000000000000E /* Assets.xcassets in Resources */,
A10000010000000000000012 /* Localizable.xcstrings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
10 changes: 5 additions & 5 deletions macos-app/AgentSwitch/AgentSwitch/AgentSwitchApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate {

let appMenuItem = NSMenuItem()
let appMenu = NSMenu(title: L10n.appName)
appMenu.addItem(NSMenuItem(title: "About \(L10n.appName)", action: #selector(NSApplication.orderFrontStandardAboutPanel(_:)), keyEquivalent: ""))
appMenu.addItem(NSMenuItem(title: L10n.aboutAgentSwitch, action: #selector(NSApplication.orderFrontStandardAboutPanel(_:)), keyEquivalent: ""))
appMenu.addItem(NSMenuItem.separator())
appMenu.addItem(NSMenuItem(title: "Quit \(L10n.appName)", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
appMenu.addItem(NSMenuItem(title: L10n.quitAgentSwitch, action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
appMenuItem.submenu = appMenu
mainMenu.addItem(appMenuItem)

Expand All @@ -93,9 +93,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
mainMenu.addItem(actionsMenuItem)

let windowMenuItem = NSMenuItem()
let windowMenu = NSMenu(title: "Window")
windowMenu.addItem(menuItem(title: "Show \(L10n.appName)", action: #selector(showMainWindowFromMenu), key: "0"))
windowMenu.addItem(NSMenuItem(title: "Minimize", action: #selector(NSWindow.miniaturize(_:)), keyEquivalent: "m"))
let windowMenu = NSMenu(title: L10n.window)
windowMenu.addItem(menuItem(title: L10n.showAgentSwitch, action: #selector(showMainWindowFromMenu), key: "0"))
windowMenu.addItem(NSMenuItem(title: L10n.minimize, action: #selector(NSWindow.miniaturize(_:)), keyEquivalent: "m"))
windowMenuItem.submenu = windowMenu
mainMenu.addItem(windowMenuItem)
NSApp.windowsMenu = windowMenu
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ struct DashboardView: View {
DSMetricCard(
label: L10n.runtimeState,
value: report.map { $0.blocked ? L10n.blocked : L10n.ready } ?? "—",
note: report.map { $0.driftCount == 0 ? L10n.noDriftDetected : L10n.reviewPlannedChanges } ?? "加载中..."
note: report.map { $0.driftCount == 0 ? L10n.noDriftDetected : L10n.reviewPlannedChanges } ?? L10n.loadingTools
)
DSMetricCard(
label: L10n.driftChanges,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ private enum SkillFilter: String, CaseIterable, Identifiable {
var id: String { rawValue }
var label: String {
switch self {
case .all: return "全部"
case .all: return L10n.allSkills
case .dormant: return L10n.dormant
case .project: return L10n.projectActive
case .global: return L10n.globalActive
Expand Down
Loading