{"_id":"@adrian-zephyr/compulsive","_rev":"6-a4c711cc6d530f94675b6e71ccd2fe00","name":"@adrian-zephyr/compulsive","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@adrian-zephyr/compulsive","version":"0.1.0","keywords":["cli","developer-tools","git","repository-manager","workspace"],"author":{"name":"Adrian Zephyr"},"license":"MIT","_id":"@adrian-zephyr/compulsive@0.1.0","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"bin":{"cpl":"dist/bin.mjs"},"dist":{"shasum":"11491a4516b290465dca068abb98b762a913f3a2","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.0.tgz","fileCount":14,"integrity":"sha512-7vasKNRn0LF8AiI5fCi8C5E8s8CLkHJH0IsUjC2BKDMsf+dtHqlG9JjIICFVj3PkwKxGUrMggCqnIeQlx42ClQ==","signatures":[{"sig":"MEYCIQDeW/AZhX502vZG18C+8Hp2+LerC/MMAggLPg2cWUGxFQIhAMhMZeGdFZpXBKNt+OhFr6u/wIV2dI4GcTYHQxC3uqTd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189466},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"5d7dfca891b76d243264057cfca88f237faf802b","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack","check":"vp check","prepublishOnly":"vp check && vp test --run && vp pack --publint --attw"},"_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.11.0","description":"A safe local Git repository organizer and CLI.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.0","dependencies":{"mri":"^1.2.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/compulsive_0.1.0_1787939226380_0.5813333473184048","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adrian-zephyr/compulsive","version":"0.1.1","keywords":["cli","developer-tools","git","repository-manager","workspace"],"author":{"name":"Adrian Zephyr"},"license":"MIT","_id":"@adrian-zephyr/compulsive@0.1.1","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"bin":{"cpl":"dist/bin.mjs"},"dist":{"shasum":"1c8889092cb723eff78e1b1aeea43d59aeb661cb","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.1.tgz","fileCount":14,"integrity":"sha512-GCNAIXKTjGw/gozZqtOUa1dWsbWVn/1h4jSMD1ipB/MoXz0iNT/JM588RGReehHcIPC3+uEwe2fS1Jw4oZ0A7w==","signatures":[{"sig":"MEYCIQCBnEsnkrQLwGuV0YSwXdE6JcFSznLahPGPhAd7XG970wIhALl9S4aNOXWAczj38LPOebkLPUziDnzq2+plt8zneAYd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189775},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"ccb5b25927212864a74cb6b5679dd279be5d4877","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack","check":"vp check","prepublishOnly":"vp check && vp test --run && vp pack --publint --attw"},"_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.11.0","description":"A safe local Git repository organizer and CLI.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.0","dependencies":{"mri":"^1.2.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/compulsive_0.1.1_1787971810782_0.382274850108953","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adrian-zephyr/compulsive","version":"0.1.2","keywords":["cli","developer-tools","git","repository-manager","workspace"],"author":{"name":"Adrian Zephyr"},"license":"MIT","_id":"@adrian-zephyr/compulsive@0.1.2","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"bin":{"cpl":"dist/bin.mjs"},"dist":{"shasum":"6d36efbec5f96c0ee8b3827bdade00285f706928","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.2.tgz","fileCount":14,"integrity":"sha512-QYCVFMf2/E57tBSCchz7PLbXAxKw1Yle1Le12G07Tcj/cSoEWoYvCyz4TvSP86BAl5fWV9v8oJRlH8Zq4kPVCw==","signatures":[{"sig":"MEUCIDl8waw/+qK+5ZIXcjePQkp3Utvwk5EwkjoSmyHfOUhmAiEAx4xj/m9Nqi1TVAJV5KuzYeQeyPIZ+G1gHpKYXyyFJ0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191374},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"584d6341e183f0bddfdd6e5652d69cc90c6513ca","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack","check":"vp check","prepublishOnly":"vp check && vp test --run && vp pack --publint --attw"},"_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.11.0","description":"A safe local Git repository organizer and CLI.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.0","dependencies":{"mri":"^1.2.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/compulsive_0.1.2_1787972505726_0.41547671251122775","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@adrian-zephyr/compulsive","version":"0.1.3","keywords":["cli","developer-tools","git","repository-manager","workspace"],"author":{"name":"Adrian Zephyr"},"license":"MIT","_id":"@adrian-zephyr/compulsive@0.1.3","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"bin":{"cpl":"dist/bin.mjs"},"dist":{"shasum":"d536b2873fbbe96b6fc86cead784b26eed1e3e92","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.3.tgz","fileCount":14,"integrity":"sha512-8G1EH1WbbXl98pABEMQjFjsb3XRp94n6Z/glPRMHTqYifs+iB/HxqYAXzaEFeU6GWDvBXAaxTC7WdFgoJa5D4A==","signatures":[{"sig":"MEUCIQCUjydeeuDu3iOd18qrlTucj3oawHZPLPpHwp/36MltPgIgRKYAaIXWn4gGqnLmYNZ3GDSpH7243FX86gTReajsvxA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200188},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"b9a0c889e333c19e632fe2a740a6404e596d705e","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack","check":"vp check","prepublishOnly":"vp check && vp test --run && vp pack --publint --attw"},"_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.11.0","description":"A safe local Git repository organizer and CLI.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.0","dependencies":{"mri":"^1.2.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/compulsive_0.1.3_1787974098300_0.9947943924099572","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@adrian-zephyr/compulsive","version":"0.1.4","keywords":["cli","developer-tools","git","repository-manager","workspace"],"author":{"name":"Adrian Zephyr"},"license":"MIT","_id":"@adrian-zephyr/compulsive@0.1.4","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"bin":{"cpl":"dist/bin.mjs"},"dist":{"shasum":"3430ca49cc6754c9eb988bed4db6bf8930ecea69","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.4.tgz","fileCount":14,"integrity":"sha512-vT6iPWEKOpFgOWj7vC4TOYlAcmYQ9oZzRXv3IKYZa9rqdxE8Y7DuW313AicqBourWEiBYBdjbZ/Wpz8vMBH3uw==","signatures":[{"sig":"MEUCIQDCzYJ8PYyiPAC7e+xRAQ64Q9ntjwqjFzdWfWmommEFsAIgJZ53i+ePrQ+Zv65vi/VUhNzfkSez9MmGJgvqT8Pu12Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDBWx4I3I9//WijpACzjsXyH5zPwH5NcUnjC3nhn4eJigIhAJq3IQ9Ji5/HgOhqlqn8gJPo4i4oy0+dfX6DkaJVI7Xv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231372},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"cb240a123c94d5a933ecabf79824bb82c66bb56a","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack","check":"vp check","prepublishOnly":"vp check && vp test --run && vp pack --publint --attw"},"_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.19.0","description":"A safe local Git repository organizer and CLI.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"mri":"^1.2.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"tmp":"tmp/compulsive_0.1.4_1789099627680_0.10842149679536695","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"_id":"@adrian-zephyr/compulsive@0.1.5","bin":{"cpl":"dist/bin.mjs"},"bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"dist":{"shasum":"b705dd12144fd2c5aac54a5cab6328a988a2ce9e","tarball":"https://registry.npmjs.org/@adrian-zephyr/compulsive/-/compulsive-0.1.5.tgz","fileCount":18,"integrity":"sha512-3REpoK7vsYqBSZklrGHR/LMphMOAAm+w/g9hxRue6Q5UdKGo5vGxxZX+fNLBKtozrdQeaZKtQVhglqIEDbvmpw==","signatures":[{"sig":"MEUCIQDThaC1rcGYcz0myo7167lMKAJd2K+4tp8uXR33x2s+9AIgUMCJpZuv7g7qkgth0JKChIBoVsBTjZ9dl7EP2ZIDKm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHNlXeKQH41YTe3RW/wCYYt/MLERxPWgnjMvkMLfqOihAiBHnimoIXQcpqzOAQPG2HkXmbWMnmF2JSt7O/nXi2wbfw=="}],"unpackedSize":557274},"main":"./dist/index.cjs","name":"@adrian-zephyr/compulsive","type":"module","types":"./dist/index.d.cts","author":{"name":"Adrian Zephyr"},"module":"./dist/index.mjs","engines":{"node":">=22.18.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"ec26d6952d66f876f59967df4c34e91ddfaf91cc","license":"MIT","scripts":{"dev":"vp pack --watch","test":"vp test --run","build":"vp pack && pnpm run build:devtool","check":"vp check","prepack":"vp pack --publint --attw && pnpm run build:devtool","build:devtool":"vp build --config vite.devtool.config.ts","prepublishOnly":"vp check && vp test --run"},"version":"0.1.5","_npmUser":{"name":"rainy_liao","email":"liaowenrun@gmail.com"},"homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","keywords":["cli","developer-tools","git","repository-manager","workspace"],"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"_npmVersion":"11.19.0","description":"A safe local Git repository organizer and CLI.","directories":{},"maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"mri":"^1.2.0","devframe":"^1.0.0","picocolors":"^1.1.1","@clack/prompts":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vue":"^3.5.43","vite":"npm:@voidzero-dev/vite-plus-core@^0.2.8","unocss":"^66.10.5","vitest":"^4.1.10","publint":"0.3.24","vite-plus":"^0.2.8","typescript":"^7.0.0","@types/node":"^24.3.0","floating-vue":"^5.4.0","@iconify-json/ph":"^1.2.2","@vitejs/plugin-vue":"^6.0.9","@arethetypeswrong/cli":"0.18.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/compulsive_0.1.5_1790079057921_0.21823743019655373"}}},"time":{"created":"2026-08-28T17:47:06.220Z","modified":"2026-09-22T12:10:58.420Z","0.1.0":"2026-08-28T17:47:06.505Z","0.1.1":"2026-08-29T02:50:10.933Z","0.1.2":"2026-08-29T03:01:45.892Z","0.1.3":"2026-08-29T03:28:18.438Z","0.1.4":"2026-09-11T04:07:07.767Z","0.1.5":"2026-09-22T12:10:58.033Z"},"bugs":{"url":"https://github.com/Adrian-Zephyr-Liao/compulsive/issues"},"author":{"name":"Adrian Zephyr"},"license":"MIT","homepage":"https://github.com/Adrian-Zephyr-Liao/compulsive#readme","keywords":["cli","developer-tools","git","repository-manager","workspace"],"repository":{"url":"git+https://github.com/Adrian-Zephyr-Liao/compulsive.git","type":"git"},"description":"A safe local Git repository organizer and CLI.","maintainers":[{"name":"rainy_liao","email":"liaowenrun@gmail.com"}],"readme":"# Compulsive\n\n[English](./README.md) · 简体中文\n\n**AI 时代的仓库管家。**\n\nAI 已经改变了软件开发。一个开发者现在可以同时探索更多框架、运行更多实验，并维护大量\n由 Agent 协助生成的项目。瓶颈不再是创建仓库，而是记住每个仓库放在哪里、需要时快速找到\n它，以及在不重复 clone、不丢失工作的前提下组织相关项目。\n\nCompulsive 是一个面向 macOS 的本地 Git 仓库管理工具。它通过 `cpl` 命令为每个仓库提供\n可预测的 canonical 位置，让所有仓库都可搜索，并允许多个 Workspace 通过链接或隔离的\nGit worktree 复用同一个仓库。\n\n## 核心能力\n\n- 按 `<host>/<owner...>/<repo>` 自动分类远程仓库。\n- 将无 remote 仓库统一归入 `local/<repo>`。\n- 发现和登记已有仓库，不擅自移动文件。\n- 移动前预演，并保护脏仓库、嵌套仓库和已占用目标。\n- 在脚本或交互终端中搜索仓库与 Workspace。\n- 让多个 Workspace 复用同一个 canonical 仓库，避免重复 clone。\n- clone、跳转或整理后复制安全的 `cd -- 'path'` 命令。\n\n## 安装\n\n```bash\nnpm install --global @adrian-zephyr/compulsive\ncpl init\n```\n\n初始化还会向 `~/.codex/AGENTS.md` 写入一段带标记的 CPL 工作流说明。标记外的已有内容会原样\n保留；重复执行 `cpl init` 会安全刷新这段说明。\n\n首次初始化时可以指定管理根目录：\n\n```bash\ncpl init --root /Users/your-name/Code\n```\n\n初始化操作是幂等的。重复执行不会覆盖现有根目录或仓库索引。\n\n## 目录规则\n\n远程仓库按照主机、所有者路径和仓库名称分类：\n\n```text\n/Users/your-name/Code/github.com/vuejs/core\n/Users/your-name/Code/gitlab.com/group/subgroup/project\n```\n\n没有 `origin` 远程地址的仓库使用 `local/<repository>` 逻辑分类。在明确确认\n`cpl organize` 之前，仓库始终保留在原位置。\n\n## 命令\n\n```bash\ncpl clone https://github.com/vuejs/core.git\ncpl add /Users/your-name/Projects/my-local-tool\ncpl scan /Users/your-name/Projects\ncpl scan /Users/your-name/Projects --register\ncpl list\ncpl list core --json\ncpl search core\ncpl search core --json\ncpl search frontend --workspace Product\ncpl go core\ncpl organize my-local-tool --dry-run\ncpl organize my-local-tool --yes\ncpl organize --all --dry-run\ncpl organize --all --yes\ncpl forget my-local-tool --yes\ncpl doctor\n```\n\n`clone`、`go` 和执行成功的 `organize` 会把安全转义后的 `cd -- 'path'` 命令复制到\nmacOS 剪贴板并打印出来。剪贴板不可用时只会显示警告，不会把成功的 Git 操作判定为失败。\n\n`scan` 默认只预览，只有传入 `--register` 才会登记仓库。扫描结果只显示尚未登记的新仓库，\n因此迁移完成后重复执行不会再次列出已经归位的仓库。`forget` 仅删除索引记录，绝不删除仓库文件。\n\n在交互终端中直接运行 `cpl`，会打开支持键入过滤的仓库与 Workspace 混合选择器；\n`cpl search` 只搜索仓库，`cpl workspace` 只搜索 Workspace。选择目标后会复制并打印安全的\n`cd` 命令。脚本和管道环境不会显示交互提示。\n\n运行本地 Workspace DevTool，可以创建 Workspace、按任务加入所需仓库、同步 worktree，并复制\n最终的 `cd` 命令：\n\n```bash\ncpl ui\n```\n\nDevTool 通过 Devframe 在 localhost 提供带认证的页面，并自动打开浏览器。使用\n`cpl ui --no-open` 可以只启动服务、不新开标签页。\n\n批量迁移时，先登记扫描结果，再统一预演全部目标路径：\n\n```bash\ncpl scan /Users/your-name/Projects --register\ncpl organize --all --dry-run\ncpl organize --all --yes\n```\n\n`organize --all` 会重新读取每个仓库当前的 `origin`，但只输出规范目标发生变化、确实需要移动的\n仓库。原先登记在 `local/` 下的项目新增 `origin` 后，会自动提升到 `github.com/...` 分类。\ndry-run 不会更新索引；只有确认移动成功后才会保存新分类。所有仓库仍会参与预检，因此任意目标\n冲突都会在第一次移动前中止批次。执行过程中遇到意外文件系统错误时会停止处理后续仓库，批量模式\n也不会反复覆盖剪贴板。\n\n## Workspace\n\nWorkspace 是相关项目的组合目录，不改变仓库的规范存储位置。默认目录是仓库管理根目录的\n同级 `Workspaces`，例如 `/Users/your-name/Code` 对应\n`/Users/your-name/Workspaces`。\n\nWorkspace 成员默认使用独立 Git worktree。不传 `--branch` 时，Compulsive 会从 canonical\n仓库当前提交创建 `workspace/<workspace>/<alias>` 分支：\n\n```bash\ncpl workspace create Product\ncpl workspace create Platform\ncpl workspace add Product api\ncpl workspace add Platform api --alias shared-api\ncpl workspace list\ncpl workspace show Product\ncpl workspace go Product\ncpl search shared --workspace Platform\n```\n\n复用现有分支时显式传入 `--branch`：\n\n```bash\ncpl workspace add Product web --branch feature/product-web\n```\n\n创建新分支必须同时提供 `--create-branch`，分支名会严格使用 `--branch` 的原值：\n\n```bash\ncpl workspace add Product worker \\\n  --branch feature/product-worker \\\n  --create-branch\n```\n\n实体 worktree 保存在 `<canonical-repository>/.worktrees/<workspace>`，Workspace 成员只是指向\n它的绝对软链接。使用 `--create-branch` 时，如果源仓库当前分支配置了 upstream，新分支会继承\n该 upstream。\n\n常用维护命令：\n\n```bash\ncpl workspace sync Product\ncpl workspace migrate --yes\ncpl workspace remove Product api --yes\ncpl workspace delete Product --yes\n```\n\n`workspace remove` 和 `workspace delete` 只删除由 Compulsive 管理的精确链接或干净 worktree，\n绝不删除 canonical 仓库。脏 worktree、意外文件、目录或被替换的链接都会阻止操作；\nWorkspace 中无关的用户文件会原样保留。`workspace` 可以缩写为 `ws`。\n旧版本直接建在 Workspace 下的 worktree 可用 `workspace migrate` 原位迁移；命令保留未提交\n修改，并在成功移动后把旧路径替换为软链接。旧分支没有 upstream 时，会继承源仓库当前分支的\nupstream；已经配置过的不会改动。\n\n## 配置\n\nCompulsive 只维护一份本地持久化配置，通过 CLI 管理：\n\n```bash\ncpl config show\ncpl config set-root /Users/your-name/Code\ncpl config set-workspace-root /Users/your-name/Workspaces\ncpl config add-scan-root /Users/your-name/Projects\ncpl config remove-scan-root /Users/your-name/Projects\n```\n\n在 macOS 上，配置以 `config.json` 保存在\n`/Users/your-name/Library/Application Support/compulsive`。自动化和隔离测试可以通过\n`CPL_HOME` 修改应用数据目录。Compulsive 不再加载项目级 TypeScript、JavaScript、JSONC\n或 `compulsive.config.*` 文件。\n\n## 终端体验\n\n人类可读输出包含紧凑的仓库卡片、状态符号、彩色诊断、交互选择、确认提示和加载动画。\n颜色会在非 TTY 环境中自动关闭，并遵循 `NO_COLOR`；也可以使用 `--color` 或\n`--no-color` 强制指定。`--json` 始终输出单个纯 JSON 值，不包含提示、动画或 ANSI\n控制字符。\n\nCLI 使用职责单一的轻量工具：`mri` 负责参数解析，`picocolors` 负责 ANSI 样式，\n`@clack/prompts` 负责交互。\n\n## 结构化输出与退出码\n\n支持 `--json` 的命令会把一个 JSON 值写入 stdout，并把诊断信息写入 stderr。\n\n| 退出码 | 含义                     |\n| -----: | ------------------------ |\n|    `0` | 成功                     |\n|    `2` | 输入、远程地址或配置错误 |\n|    `3` | 未找到仓库               |\n|    `4` | 匹配歧义或路径冲突       |\n|    `5` | Git 或文件系统失败       |\n\n## 库 API\n\n```ts\nimport { createRepositoryManager } from \"@adrian-zephyr/compulsive\";\n\nconst manager = createRepositoryManager();\nawait manager.initialize({ rootDir: \"/Users/your-name/Code\" });\n\nconst repository = await manager.clone({\n  remote: \"git@github.com:vuejs/core.git\",\n});\n\nconsole.log(repository.absolutePath);\n```\n\n包同时提供 ESM、CommonJS 入口和 TypeScript 类型声明。公开操作会抛出\n`CompulsiveError`，其中 `code` 是稳定且可供程序读取的错误码。\n\n## 安全模型\n\n- Git 始终通过参数数组启动，不拼接 shell 命令。\n- 远程地址写入索引前会移除凭据。\n- 扫描不会进入仓库内部、`node_modules`、构建产物目录或符号链接。\n- 整理操作会拒绝目标占用、嵌套仓库、过期路径和跨磁盘移动。\n- 移动后必须重新验证为 Git 仓库，才会更新索引。\n- Workspace link 在仓库移动后会自动同步；路径冲突时保留用户内容并返回诊断。\n- Workspace 删除只移除受管链接和干净 worktree，绝不删除 canonical 仓库。\n- `forget` 和仓库整理流程都不会删除仓库目录。\n\n## 开发\n\nCompulsive 使用 Vite+：\n\n```bash\nvp install\nvp check\nvp test --run\nvp pack --publint --attw\n```\n\n## 许可证\n\nMIT\n","readmeFilename":"README.zh-CN.md"}