{"_id":"@cqjjb/project-mcp-server","_rev":"7-4406e2b619869c860a17078f5e1f2d19","name":"@cqjjb/project-mcp-server","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@cqjjb/project-mcp-server","version":"1.0.0","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.0.0","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"396f4ca6f3da1ba9f27002c24d743774f4e8db07","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.0.0.tgz","fileCount":16,"integrity":"sha512-Z9Qc2VDIjogfpSnmvyAQEzIV5N7nVyGh+bAeSVoRTbhuNNQbJGWWiEywihQ8t7iOX0Fr2ncIAodGZco7AjVEIg==","signatures":[{"sig":"MEQCIAuMp+tVleXId4sRVnB2VWgtqbgbWesAA+/fCUeR+acVAiBTKRKjC1U4wIdNTdJua+xcgkcNCLYQ81DC0OtMSWRgPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91910},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.0.0_1788760769866_0.9377400764148842","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@cqjjb/project-mcp-server","version":"1.1.0","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.1.0","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"2741d93293c41c6e0044d525fef3d62c17360150","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.1.0.tgz","fileCount":16,"integrity":"sha512-/+YJBy8sjjXA7KQevuXJddW3bj2KIyLVyrPdjDygjNBHrSmMHRwqlUU271c762Mh91wcGHjkCf/CyinNgVZDjA==","signatures":[{"sig":"MEUCIBDV0bGA5v8x4idjaLcG2K61IamN4hL0KvgZQGaxwKhaAiEAsvofNOElOSqzBEpAkhlw1V+g8iuM7SN/oWTuYQW9Vvg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDRAkMT+wSr9mzt/nFzEk5wUPCqSAuz2OpWgx68Vy2IYAiEAxFaCXDIbAgJKR4gx/KtGm41mmok9RusNhsZc4Q6CYpI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107175},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.1.0_1788765081748_0.7948795289210457","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@cqjjb/project-mcp-server","version":"1.1.1","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.1.1","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"3f92913ab2eee3fbec4cf78bd1ab1716270faf3e","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.1.1.tgz","fileCount":17,"integrity":"sha512-WhkXKCZ/Au4t20tpYWFDAbdFb+CJi++dXIycRp4+fXVlzl+yBYepWFaX05jb49sHvD8G24A2gK+D0qc5uqk4iw==","signatures":[{"sig":"MEYCIQCdvEOtp+SFzZfPOsCFcMfmcrJey1nprr3lO0m/16qWMwIhAOEvh/Ygj8IpaMmU69JA3aqAbZxCLT0xBcPLj0cmjJI6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDo0p1XAnzMVud7OgqlfAlaJY4KiDWg9JHyzWNF1Ud82QIgGaQX02omAMY/LKz37LC5xxhoNud9eMaGCZ1R0Gv1RZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109989},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.1.1_1788767459454_0.8663555865980919","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@cqjjb/project-mcp-server","version":"1.2.0","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.2.0","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"99e19bd3aaab20ebec96c36cc384924c6105450d","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.2.0.tgz","fileCount":17,"integrity":"sha512-2eieWCSISpfRzMDkfn+THCq42+6VhKSqw2uRiBG6CJE41cFY+CSrLB+T02aFFNeLp3Ik1QeMo8nOkU+TPG+z9Q==","signatures":[{"sig":"MEUCIQDXKNJEi140NWWX78+tW2+5jcKL9UmUeWEMhENWa7Ab5QIgP15RFTBrSIAeWhehBkslbtDFbPAOvnks129OajdTGdE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDNgqljBBc9hzJQES8/31vylsVvjE9zNkiDqLLf1g9ltwIhAKYreDSo02ZSffgy1JIqp2ZnrTuib6DajazJuj41dNlb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112900},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.2.0_1788773106181_0.03586163389646457","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@cqjjb/project-mcp-server","version":"1.2.1","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.2.1","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"0b331dc763ee8f145396247ab080e685e8a6ba91","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.2.1.tgz","fileCount":17,"integrity":"sha512-WrZycSKUoEaK7H7nCIuW/wzGskweggBi/UXk2pEBJlq3RF0Wuz8ml8icydYiJgOSsy+8LY2eCmJd0LrPNoXIdg==","signatures":[{"sig":"MEUCIQDsjbYlErVozADmvQtLZr8UjKu4jfjwSaU5kCSu9sdxGgIgDOM2bd+cn2mIqdPXps3RU6HkvNzukrL6l10FnlBL1wg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDCYBD/6FOMzCw0+ZjVp4QKoY8hdO4gr5YCIMadkvTnHAiAsBkPB+I3RBll8bn9yFICurhK+FGV6tvFHNYqDnKX+RQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113035},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.2.1_1788776351352_0.9384199190267515","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@cqjjb/project-mcp-server","version":"1.3.0","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"license":"MIT","_id":"@cqjjb/project-mcp-server@1.3.0","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"ec6c54f6fb075adefb8162801852946ae8aeb1b1","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.3.0.tgz","fileCount":17,"integrity":"sha512-hJfnfQhIpNJaoXuRkV5AIVulUPXeVmyq0kV9oxQgB2eEycErRBgc32QyIynFJxnEntJiaDTWWKeXtK7Xz/vxrQ==","signatures":[{"sig":"MEUCIBnsZPDgEASTpMPvPtpfcoYE8tjZ+cgLRw3oakp4UZbiAiEA7Wjea1ifR9HZTzs2ET55o6ai9/sn7MsiSEDf/Kj1H30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH01cAHFY45FSFwn5hSTLCFdqzyVsV3yeAZB7e/pybxIAiAEEG/7a4I62OK/gXfRZXt3mPXWJHEz5rbjDNs1AxF8iw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114388},"main":"src/index.js","type":"commonjs","engines":{"node":">=18"},"scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/project-mcp-server_1.3.0_1788777212624_0.5930074795460645","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"_id":"@cqjjb/project-mcp-server@1.4.0","bin":{"project-mcp-server":"src/index.js"},"dist":{"shasum":"1ed13f011831c7b41b09ef6275bb45de874f9343","tarball":"https://registry.npmjs.org/@cqjjb/project-mcp-server/-/project-mcp-server-1.4.0.tgz","fileCount":17,"integrity":"sha512-vaORrJRwl9KC2fg8iPFaRi5826ZfVhww3Z0Z6IhRFa2zo7BBP54CyaeoVwR38r6XUaJjh0VI9Gg7Ub9oBdkIwQ==","signatures":[{"sig":"MEUCIAMFHzFILT9Z6Nnu9f5rK4Eye082RbnmlYIYaGQsYUAbAiEAmg4vD5HGhFUcix+qtUbnZOA06TVjgn7HP/sSG92ImSY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFMv/FqHXY7U2b6uBdyPrn0L0ZBTmcaEurocH0LEei76AiBWvpCErAvarMwpE0o52uUIE1XVwW/8lTzICqv03uwy6A=="}],"unpackedSize":137144},"main":"src/index.js","name":"@cqjjb/project-mcp-server","type":"commonjs","engines":{"node":">=18"},"license":"MIT","scripts":{"smoke":"node scripts/smoke-test.js","start":"node src/index.js"},"version":"1.4.0","_npmUser":{"name":"cqjjb","email":"995934055@qq.com"},"keywords":["mcp","gitlab","project","项目地图","mcp-server"],"_npmVersion":"10.9.3","description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","directories":{},"maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.5.4","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/project-mcp-server_1.4.0_1789372489496_0.39411680122494874"}}},"time":{"created":"2026-09-07T05:59:29.744Z","modified":"2026-09-14T07:54:49.923Z","1.0.0":"2026-09-07T05:59:30.015Z","1.1.0":"2026-09-07T07:11:21.829Z","1.1.1":"2026-09-07T07:50:59.553Z","1.2.0":"2026-09-07T09:25:06.274Z","1.2.1":"2026-09-07T10:19:11.442Z","1.3.0":"2026-09-07T10:33:32.725Z","1.4.0":"2026-09-14T07:54:49.565Z"},"license":"MIT","keywords":["mcp","gitlab","project","项目地图","mcp-server"],"description":"项目地图 MCP：GitLab 组/项目查询 + 本地项目定位，项目地图 JSON 落盘（越用越聪明）","maintainers":[{"name":"cqjjb","email":"995934055@qq.com"}],"readme":"# @cqjjb/project-mcp-server —— 项目地图 MCP\n\n让 AI 一句话找到公司项目：GitLab 组/项目查询 + 本地项目定位，**项目地图 JSON 落盘，越用越聪明**。\n\n## 特性\n\n- **一张地图**：项目地图 JSON 是唯一数据层——组规则（路径前缀）+ 全量项目快照 + 本地路径 + 别名。\n- **规则分组，不逐条维护**：项目组用路径规则覆盖全部项目；特殊项目（建错组、别名）用 `overrides` 单独定义。\n- **文件即权威**：组的增删改直接编辑地图 JSON 的 `groups` 数组（顺序即优先级），重启生效。\n- **组带描述**：每个组有 `description` 字段告诉 AI 这组是干啥的。\n- **用到才对齐**：find/clone 在地图里 miss 时自动实时搜 GitLab 并学进地图；另有 `refresh` 全量对齐。\n- **纯本地项目也进地图**（v1.4.0）：没有 `.git`、但有 `package.json` 的目录会被收录为项目，同样能被 find 检索。\n- **中英混排可搜**（v1.4.0）：`项目地图MCP` 这类无空格写法会按中英边界切词；稀有词权重高于 `mcp` 这类大众词（IDF）。\n- **零命中就澄清，不瞎试**（v1.4.0）：find 全图零命中时返回【兜底澄清协议】——结构性诊断 + 4 条可选线索 + 明确停止条件，把\"无限换词\"变成\"有界收敛\"。\n- **可检索性体检**（v1.4.0）：`project_memory` 直接报\"结构性不可达（文本零中文）\"项目数——这批项目对纯中文查询数学上不可能命中，只能靠补描述/别名解决。\n- **本地定位**：工作区扫描 + 地图记忆，clone 自动登记，下次直接命中；扫描会自动清理已消失的目录条目。\n\n## 快速开始\n\n```bash\n# 1. 安装\nnpm install -g @cqjjb/project-mcp-server\n\n# 2. 配置环境变量（或写 .env）\n#   GITLAB_URL      你的 GitLab 实例，如 http://gitlab.example.com\n#   GITLAB_USERNAME / GITLAB_PASSWORD   登录账号（或 GITLAB_TOKEN 个人令牌）\n#   LOCAL_ROOT      本地工作区根目录（clone/scan 都基于它）\n#   （数据目录固定为 用户主目录/.project-mcp-server，由 os.homedir() 跨平台自动判断，无需也不能配置）\n\n# 3. 首次建图（可选，两个途径）\n#   a) 全量：node scripts/fetch-all.js 抓全量 → 在地图 JSON 里定义 groups → node scripts/build-map.js\n#   b) 按需：什么都不做，直接用——find/clone 时自动实时搜 GitLab 并学习\n\n# 4. 挂进你的 MCP 客户端（stdio），如 DSH / Claude Desktop：\n#   command: project-mcp-server\n```\n\n## 工具（4 个）\n\n| 工具 | 说明 |\n|---|---|\n| `projects_group_by_gitlab` | GitLab 项目地图：list / find / branches / branch / clone / create / refresh，`group` 参数选组 |\n| `projects_group_by_local` | 本地项目：find（记忆优先）/ list / scan / register。收录 git 仓库 **+ 无 .git 但有 package.json 的纯本地项目** |\n| `project_map_edit` | **编辑项目地图**：show / add_group / update_group / remove_group / add_override / remove_override / add_alias / remove_alias / remove_project / reload——带校验、立即落盘生效、免重启。`add_alias` 的 project 也接受**本地绝对路径**（给纯本地项目起中文别名） |\n| `project_memory` | 查看地图状态（各组项目数、本地仓库数、别名）+ **可检索性体检**（结构性不可达项目数） |\n\n## 零命中时的兜底协议（v1.4.0）\n\n地图里确实没有时，find 不再返回\"可换关键词\"这种会诱发无限重试的提示，而是返回：\n\n```\n❌ 没找到「XXX」——不要再换关键词重试了，换词不会改变结果。\n已检索：…共 N 个项目 → 0 命中；GitLab 实时搜索 → 0 命中。\n🔍 诊断：你搜的是纯中文，而地图里 M / N 个项目（X%）的可检索文本里一个中文字符都没有\n        —— 纯中文查询对它们数学上不可能命中。\n   这类项目的名字长这样：xxx、yyy、zzz …\n请从下面给我任意一条线索（给一条就能定位）：\n   A. 你记得的英文单词/缩写   B. 所属组 key（回一个我就列出该组全部项目）\n   C. 一句话功能描述/中文俗称  D. 本地目录大概叫什么\n💡 也可以直接说「列 tools 组」。✅ 定位到后我会记成别名，下次一句话直接命中。\n```\n\n设计要点：**MCP 工具不能直接问用户**，所以它把\"该问什么\"返回给 AI，由 AI 去问。收敛次数有界：典型 2 次调用，最坏 1+1+ceil(最大组/60) 次。\n\n## 项目地图 JSON\n\n`~/.project-mcp-server/project-map.json`（固定路径，跨平台自动判断：Windows `C:\\Users\\<用户>\\.project-mcp-server`，macOS/Linux `/Users|home/<用户>/.project-mcp-server`）。组定义示例：\n\n```jsonc\n{\n  \"groups\": [\n    {\n      \"key\": \"train\",                // 组 key（group 参数用）\n      \"name\": \"培训产品组\",           // 中文名（AI 展示/匹配用）\n      \"description\": \"培训产品线：学员端、管理端、H5\",   // 告诉 AI 这组是干啥的\n      \"gitlabPath\": \"your-ns/train\", // create 动作建项目的位置\n      \"rules\": [\"your-ns/train/**\"], // 路径规则（前缀匹配，顺序即优先级）\n      \"aliases\": [\"培训\", \"training\"]\n    }\n    // ... 最后放兜底组 { \"key\": \"other\", \"name\": \"其他\", \"rules\": [\"**\"] }\n  ],\n  \"overrides\": {                     // 单项目纠错（建错组的项目）\n    \"your-ns/train/xx\": { \"group\": \"train\", \"aliases\": [\"某个中文名\"] }\n  },\n  \"projects\": { /* 全量快照，自动维护 */ },\n  \"local\": { /* 本地仓库记忆，自动维护 */ },\n  \"aliases\": {}\n}\n```\n\n- **新增组**：两种方式——① AI 用 `project_map_edit` 的 `add_group`（默认插到兜底组之前，带校验）；② 人工编辑 JSON 后调 `reload`（或重启）。越靠前优先级越高。\n- **改组**：`update_group` 改 rules/name/aliases/description，**改 rules 自动重算全部项目归属**。\n- **单项目纠正**：`add_override`（project + group），`remove_override` 撤销。\n- **删除**：`remove_group`（项目自动落到其它组）/ `remove_project` / `remove_alias` 均支持。\n\n## v1.4.0 变更\n\n| 变更 | 说明 |\n|---|---|\n| 收录纯本地项目 | 无 `.git` 但有 `package.json` 的目录成为可检索项目；`register` 不再要求 `.git` |\n| 收录无 remote 的 git 仓库 | v1.3 里这些仓库被 `if (ns)` 静默丢弃，现在按本地项目收录 |\n| 中英边界分词 | `项目地图MCP` → `项目地图` + `mcp`（修复无空格混排整串零命中） |\n| IDF 加权 | 稀有词权重高、`mcp` 这类大众词权重低，减少\"top10 被同一个词刷屏\" |\n| 长词 n-gram 兜底 | 仅当整词零命中、且中文块 ≥5 字时拆词，并要求 **≥2 个碎片命中** —— 短词不拆，避免误命中 |\n| 兜底澄清协议 | 零命中时返回诊断 + 线索 + 停止条件（见上） |\n| 别名可挂本地路径 | `add_alias` 的 `project` 支持本地绝对路径，纯本地项目也能被中文别名命中 |\n| 可检索性体检 | `project_memory` 报\"结构性不可达（零中文）\"项目数与占比 |\n| 脏条目清理 | 扫描时清理工作区内已消失的目录条目 |\n| 一次性迁移 | 升级后**第一次 find 会自动重扫一次**（`local.scanVersion` 标记，约 20 ms），此后不再重扫 |\n\n### 已知边界\n\n- **同一项目的多份拷贝会各占一条**：例如把项目备份到工作区内，备份目录（有 package.json）也会被收录为一条本地项目。建议把备份放在工作区之外。\n- **中文语义桥不在算法能力内**：项目名是英文/拼音、描述为空时，纯中文查询无法命中它——这是数据问题，请补 `description` 或加中文别名。体检指标就是为量化这批项目而加的。\n\n## 脚本\n\n| 脚本 | 用途 |\n|---|---|\n| `scripts/fetch-all.js` | 全量抓取 GitLab 组+项目 → `all-projects.json` / `all-projects.csv`（Excel 可开） |\n| `scripts/build-map.js` | 按组规则生成项目地图 |\n| `scripts/analyze-structure.js` / `analyze-deep.js` | 结构分析（分组决策用） |\n| `scripts/smoke-test.js` | 冒烟测试（`npm run smoke`，无公司数据时自动降级为通用检查） |\n\n## 安全边界\n\nclone/切分支/commit/push 属于正常开发动作；合并、删远端一律人工确认。\n建议给 MCP 使用专用账号或 PAT（只读+受限），而非管理员账号。\n\n## License\n\nMIT\n","readmeFilename":"README.md"}