{"_id":"@bobcgn/skill-central","_rev":"9-0757b40ad725863b88435e678d0b6962","name":"@bobcgn/skill-central","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@bobcgn/skill-central","version":"0.1.0","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.1.0","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"9b45ea58722d8ba2adf4d29266c6d8a77f670130","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.1.0.tgz","fileCount":60,"integrity":"sha512-11ZqnHHy95DKDk+86kv7TUYKarhYC7k+MHfJlYSdp+c6OXqvfQe40eKSN3sl/PYu2GGCCLS0CdKGprFadWuYfw==","signatures":[{"sig":"MEUCIQDvaNscu71aDVTrrczoXtvn1N4GRbI4d58tTKxTYEyuBAIgQwRCfzEExR41b7dMihLaWjhA1+fME8TRYTHC6B40o70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111802},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"b7f35d09781957718bcd044972f8cff905c3b094","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:init":"tsx src/index.ts init","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"js-yaml":"^4.1.1","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.1.0_1779327394284_0.3560583478143906","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bobcgn/skill-central","version":"0.2.0","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.0","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"ac9d00922bb4ac1d1bcc93e95b77e0d42de41559","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.0.tgz","fileCount":119,"integrity":"sha512-8BgkFm2DrlstmTKZU2GhC7poYnD06562DMlaWh9Hpt30tItINQp6Rp6Ojpu7ttm4C+rOMn5koLzqdNrfGXntnw==","signatures":[{"sig":"MEQCHyx6qa7Lw4C3stu6PeC0RDD+Q2eJL9bxSmhASlY8/bkCIQCK0dJYG8h3xgmzxcri811JVWEQwvyY01PghXYefJLIdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310189},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2577e42e76911aa31f3fee8c4162a1055ff1533a","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.0_1781544404471_0.2959434448929914","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bobcgn/skill-central","version":"0.2.1","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.1","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"990e22175511eb24b52328c37bc6c8df9178020f","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.1.tgz","fileCount":123,"integrity":"sha512-QjRaiw2KlKmLLEWW3vRyd9UnY/XjSsOuDoRyLmRb4U6g2Q4nsF91TvEWAheULk84tku84jMAAFC+ziGK3Nio/Q==","signatures":[{"sig":"MEUCIQDy4HPH/KnE14pxbMlq/EYJBnif3HYLsdcdTRaULRe9VwIgS7buEqnICPAE623LWBIl8mumxzajka0w+QLbVDlIOUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315060},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"bf8428e6d2c61090ca35c63261320d1c7f2132b6","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.1_1781546227358_0.91052534441017","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bobcgn/skill-central","version":"0.2.2","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.2","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"6fb8d0659f88699ce0dae16c02acd96debab0ed6","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.2.tgz","fileCount":123,"integrity":"sha512-bsl1FWYHs4mLN5PpGBw155ngL190+NXNcMmqCSDczbx8B5hjuzvLMzJAmfTnS9dwnUqOrgLG3ezBoE4449Svkg==","signatures":[{"sig":"MEYCIQDjKizqfLHBKXLDQqc1rRi7RcX70s/VI+FIky+QHz+B2AIhAPbvuNxf0TtK85APhPKzgwB15N/eK07V42JUdPMKtAml","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":325001},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"96bb306bf641609a466724d4f0d36f31e2217fd7","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.2_1781558550139_0.21447929351904227","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bobcgn/skill-central","version":"0.2.3","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.3","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"b927911ee81ede9dbc1913634761b8636378685c","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.3.tgz","fileCount":123,"integrity":"sha512-Lu6umRsrr4KrhE1O4mosYHytlofIdY2z0yWfdANk0w/mUBHr3Wf4SKeB2ZwqT077kX2BXR8zZ/tFXWoydl0m/g==","signatures":[{"sig":"MEUCIG3s2teKuslQUOp4Ab320prjyyM4y5+xigmO5G9+r3DSAiEArbvWrs/SuxtX+8LWPVjs+uWCSHO/hF/s0NKczo51Q8s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":325001},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"048761c6f6946e1946926506d39f324786185752","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.3_1781559114373_0.18907284851360373","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bobcgn/skill-central","version":"0.2.4","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.4","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"681a197b71e5008848f7d846232f5a8edebac055","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.4.tgz","fileCount":123,"integrity":"sha512-b2wZ8eJcQm5IJjFPoGTlezvjflR8wruswi84hhFsRXFl3kso5eviIxiatgAhdgIRQR8DpObmZ+IZpUvFujvn2Q==","signatures":[{"sig":"MEUCIQCJGxkRvIPlorrd1tq5raNpb6H3pS/VrV2k8L95VLpo/gIgWkOznwWMWUcYYpgFPnN2nvitWMn6W/rmPwsRD4kF4wY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":325001},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"9b5c0f3d4a4a12e090fe52a7546549ca5ae43b86","private":false,"scripts":{"build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"bobcgn","email":"1483901658@qq.com"},"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"10.9.4","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"22.22.1","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.4_1781559486034_0.135876882630676","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@bobcgn/skill-central","version":"0.2.5","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.2.5","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"e05edfc07b6a644c9f1cb8408d024a13ee36b49f","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.2.5.tgz","fileCount":119,"integrity":"sha512-mbP5T5XAVatCqdEXWBpIugMiHXt4pglfGcvKsqFBIjLAL7H61AU2N45u7GM+rS4SR4xzMQN6VspjAaJ43k9Zdg==","signatures":[{"sig":"MEQCIGZAFaUju+ozMakmsa0zc/LzNpcq0xbQGfMkVzyh8pHaAiBid0xkA5Aiz4N7iWsen1KnzpwB9FjU9Beno4Jmy0OQMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bobcgn%2fskill-central@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":320628},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"3198379caa66b689554c28d04d878d084352d66a","private":false,"scripts":{"lint":"tsc --noEmit","test":"bash scripts/test.sh","build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","pretest":"npm run build && npm run build:web","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9ecc6f8-ea9f-4dbc-9f51-8cc63c493152"}},"provenance":true,"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"11.13.0","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.2.5_1781564113216_0.16889848432072374","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bobcgn/skill-central","version":"0.3.0","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","_id":"@bobcgn/skill-central@0.3.0","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"bin":{"skill-central":"dist/index.js"},"dist":{"shasum":"7af2a9c38eb8c4aa68ace8b7d62b6dc6f0cd467f","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.3.0.tgz","fileCount":119,"integrity":"sha512-3q5nFIXqt0lZRq4aCt+poG3eQuEyhwHi5uOksZpIzM7A7v9nN+Q0kXx4CzfPn5DYrbYCdOziF+dK6mvGgdy7yA==","signatures":[{"sig":"MEQCIEVYnjFpPbWJWuRkg1W9LSurD1UOBaWKqGpPFgVrBbhSAiANBWcv9M59/y1ygvy1pYv2Va1kUtexixVZAo8xI1xtUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bobcgn%2fskill-central@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":325157},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"535e1599374be55bc3f0e2cadbd0e32e227a693a","private":false,"scripts":{"lint":"tsc --noEmit","test":"bash scripts/test.sh","build":"tsc","start":"node dist/index.js mcp","dev:mcp":"tsx watch src/index.ts mcp","dev:web":"tsx watch src/index.ts board","pretest":"npm run build && npm run build:web","dev:init":"tsx src/index.ts init","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","dev:board":"tsx src/index.ts board","prepublishOnly":"npm run build && npm run build:web"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9ecc6f8-ea9f-4dbc-9f51-8cc63c493152"}},"provenance":true,"repository":{"url":"git+https://github.com/BobcGn/skill-central.git","type":"git"},"_npmVersion":"11.16.0","description":"Local MCP Server for cross-IDE AI skill distribution and reuse","directories":{},"_nodeVersion":"24.18.0","dependencies":{"hono":"^4.12.25","js-yaml":"^4.1.1","commander":"^14.0.3","tar-stream":"^3.2.0","@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.3","@types/node":"^22.14.1","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/skill-central_0.3.0_1784387039813_0.6060121527298146","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bobcgn/skill-central","version":"0.4.0","private":false,"description":"Local MCP Server for cross-IDE AI skill distribution and reuse","type":"module","main":"dist/index.js","bin":{"skill-central":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/BobcGn/skill-central.git"},"homepage":"https://github.com/BobcGn/skill-central#readme","bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"license":"MIT","provenance":true,"publishConfig":{"access":"public","provenance":true},"scripts":{"dev:mcp":"tsx watch src/index.ts mcp","dev:board":"tsx src/index.ts board","dev:init":"tsx src/index.ts init","dev:web":"tsx watch src/index.ts board","build":"tsc","build:web":"mkdir -p dist/web && cp -R src/web/static/. dist/web/","lint":"tsc --noEmit","pretest":"npm run build && npm run build:web","test":"bash scripts/test.sh","prepublishOnly":"npm run build && npm run build:web","start":"node dist/index.js mcp"},"dependencies":{"@hono/node-server":"^2.0.4","@modelcontextprotocol/sdk":"^1.9.0","commander":"^14.0.3","hono":"^4.12.25","js-yaml":"^4.1.1","tar-stream":"^3.2.0"},"devDependencies":{"@types/js-yaml":"^4.0.9","@types/node":"^22.14.1","tsx":"^4.19.3","typescript":"^5.8.3"},"gitHead":"9d0a0dc6272d91e6c4a326ae32f3747ae1dac37b","types":"./dist/index.d.ts","_id":"@bobcgn/skill-central@0.4.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-5QkyXtUij8RmSJyccJ3cdU5JZ6r5t41u9de0v8TDVdZtLZqf/Db2cg+34Se8tn3FbRNKSuURC6LMLreAoLX/hw==","shasum":"f46b99c02f7567a984cc77359e6d5dbfea8f66e8","tarball":"https://registry.npmjs.org/@bobcgn/skill-central/-/skill-central-0.4.0.tgz","fileCount":123,"unpackedSize":353405,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bobcgn%2fskill-central@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICoRoKo5whrgfv0bGwlhKgfKszK/8ZuYLdyV98vD+maTAiEAmXvYlB06yyO51lUC5jhbY6+ulN3LFP9+S+T9G8tZD38="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9ecc6f8-ea9f-4dbc-9f51-8cc63c493152"}},"directories":{},"maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/skill-central_0.4.0_1784532305255_0.21664950400896976"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-21T01:36:34.121Z","modified":"2026-07-20T07:25:05.656Z","0.1.0":"2026-05-21T01:36:34.440Z","0.2.0":"2026-06-15T17:26:44.618Z","0.2.1":"2026-06-15T17:57:07.522Z","0.2.2":"2026-06-15T21:22:30.282Z","0.2.3":"2026-06-15T21:31:54.507Z","0.2.4":"2026-06-15T21:38:06.260Z","0.2.5":"2026-06-15T22:55:13.361Z","0.3.0":"2026-07-18T15:04:00.066Z","0.4.0":"2026-07-20T07:25:05.382Z"},"bugs":{"url":"https://github.com/BobcGn/skill-central/issues"},"license":"MIT","homepage":"https://github.com/BobcGn/skill-central#readme","keywords":["mcp","model-context-protocol","ai","skills","prompts","cursor","windsurf","claude"],"repository":{"type":"git","url":"git+https://github.com/BobcGn/skill-central.git"},"description":"Local MCP Server for cross-IDE AI skill distribution and reuse","maintainers":[{"name":"bobcgn","email":"1483901658@qq.com"}],"readme":"# skill-central\n\n**跨 IDE 的 AI 技能分发中心 · 本地 MCP 服务器**\n\nskill-central 是一个本地 [MCP (Model Context Protocol)](https://modelcontextprotocol.io) 服务器，通过 Stdio 协议与各类 AI IDE（Cursor、Windsurf、Claude Code 等）通信，实现**跨 IDE 的 AI 技能（Prompt/Tools）分发与复用**。\n\n> **技能（Skill）** 是一段结构化的提示词或工具定义，按主题组织、按层级管理、按标签匹配。你可以像管理代码一样管理 AI 的能力边界。\n\n自 **v0.2.0** 起，skill-central 提供了完整的本地 CRUD 命令行、基于 Hono 的 **Web 看板**（支持浏览器内预览和编辑），以及从 GitHub raw URL 和 npm 包远程安装的能力。\n\n---\n\n## 目录\n\n- [快速开始](#快速开始)\n- [架构](#架构)\n- [CLI 命令](#cli-命令)\n- [本地 CRUD](#本地-crud)\n- [Web 看板](#web-看板)\n- [远程安装](#远程安装)\n- [JSON-RPC 接口](#json-rpc-接口)\n- [技能文件格式](#技能文件格式)\n- [标签组合](#标签组合)\n- [层级覆写](#层级覆写)\n- [配置加载顺序](#配置加载顺序)\n- [IDE 集成](#ide-集成)\n- [自定义技能开发](#自定义技能开发)\n- [部署与常见问题排查](#部署与常见问题排查)\n- [参考文档](#参考文档)\n- [发布前自检](#发布前自检)\n- [Trusted Publishing 自动发布](./docs/ch/trusted-publishing.md) / [Trusted Publishing](./docs/en/trusted-publishing.md)\n- [手动发布指南](./docs/ch/manual-publishing.md) / [Manual Publishing](./docs/en/manual-publishing.md)\n- [开发指南](#开发指南)\n- [许可](#许可)\n\n---\n\n## 快速开始\n\n> **提示：** `skill-central` 是一个模板仓库。你可以直接使用我已经发布的服务（`@bobcgn/skill-central`），也可以使用本模板自行构建和发布你的专属版本。\n\n### 安装与初始化\n\n```bash\n# 若使用我发布的默认服务：\nnpx @bobcgn/skill-central init\n\n# 若使用你自己发布的包：\n# npx your-package-name init\n\n# 若在本地克隆代码库后使用：\n# npm run build && npm link\n# skill-central init\n```\n\n这将创建一个 `.skills/` 目录（包含 4 层层级文件夹）和一个 `skill-central.yaml` 配置文件。\n\n### 打开 Web 看板\n\n```bash\n# 使用默认发布的包\nnpx @bobcgn/skill-central board\n```\n\n终端会打印 `http://127.0.0.1:5417/` 并启动一个 Hono 仪表盘——在浏览器中浏览、预览、编辑、恢复技能。也可以用 `board --cli`（或 `--no-web`）回到 v0.1.0 的终端表格。\n\n### 启动 MCP Server\n\n```bash\nnpx @bobcgn/skill-central mcp\n```\n\n服务器通过 **stdin** 监听 JSON-RPC 消息，将响应写入 **stdout**。所有诊断日志走 **stderr**，保障协议通道纯净。\n\n---\n\n## 架构\n\n```\n┌────────────────────────────────────────────────────────┐\n│               AI IDE (Cursor / Windsurf / 等)           │\n│                        │  Stdio (JSON-RPC)              │\n└────────────────────────┼──────────────────────────────┘\n                         │\n┌────────────────────────┼──────────────────────────────┐\n│  skill-central         ▼                               │\n│  ┌────────────┐  ┌─────────────────┐  ┌───────────┐   │\n│  │  CLI       │  │  Protocol       │  │  Core     │   │\n│  │  mcp/init  │→│  handler.ts     │→│  engine   │   │\n│  │  add/list  │  │  prompts.ts     │  │  override-│   │\n│  │  show/...  │  │  tools.ts       │  │  tree     │   │\n│  │  install   │  └─────────────────┘  │  composer │   │\n│  │  board     │  ┌─────────────────┐  └─────┬─────┘   │\n│  │  (Hono)    │  │  Web 看板       │        │         │\n│  │            │  │  server.ts      │  ┌──────▼──────┐  │\n│  │            │  │  router.ts      │  │  Storage    │  │\n│  │            │  │  backup.ts      │  │  reader.ts  │  │\n│  └────────────┘  └─────────────────┘  │  parser.ts  │  │\n│                                       │  config.ts  │  │\n│                                       └─────────────┘  │\n└─────────────────────────────────────────────────────────┘\n```\n\n### 默认技能层级\n\n| 层 | 优先级 | 作用域 |\n|----|--------|--------|\n| `01-global` | 10 | 全局上下文 — 适用于所有交互 |\n| `02-workflows` | 20 | 跨领域工作流（排错、审查、规划） |\n| `03-domains` | 30 | 领域知识（基础设施、安全、数据） |\n| `04-tech-stack/languages` | 40 | 语言约定（TypeScript、Python、Kotlin…） |\n| `04-tech-stack/frameworks` | 40 | 框架约定（React、Vue、Spring…） |\n\n遇到 id 冲突时优先级高者胜出。详见 [层级覆写](#层级覆写)。\n\n---\n\n## CLI 命令\n\n```bash\nnpx @bobcgn/skill-central <command>\n```\n\n| 命令 | 说明 |\n|------|------|\n| `mcp` | 启动 Stdio MCP Server（IDE 集成用，stdout 静默） |\n| `board` | 打开 **Web 看板**（默认），或打印终端表格（`--cli`） |\n| `init` | 生成 `.skills/` 示例目录和层级配置 |\n| `add` | 创建新技能（基于 tags 自动推断 layer） |\n| `list` | 列出已加载技能（过滤项：`--layer`、`--tag`、`--type`） |\n| `show <id>` | 打印技能完整信息和 prompt 正文 |\n| `remove <id>` | 删除技能文件（多 layer 时需 `--layer` 消歧） |\n| `validate <files…>` | 解析并校验一个或多个技能文件 |\n| `doctor` | 扫描各 layer：缺失目录、解析错误、id 冲突、孤立备份 |\n| `install <source>` | 从 `github:` 或 `npm:` URL 安装技能 |\n| `update [id]` | 重新拉取已安装技能，保留原始 scope |\n| `uninstall <id>` | 删除已安装技能（文件 + lock 条目） |\n\n全局安装：\n\n```bash\nnpm install -g @bobcgn/skill-central\nskill-central init\nskill-central board          # 打开 Web 看板\nskill-central mcp            # 或启动 MCP Server\n```\n\n完整 flag 参考见 [`docs/ch/cli-reference.md`](./docs/ch/cli-reference.md) / [`docs/en/cli-reference.md`](./docs/en/cli-reference.md)。\n\n---\n\n## 本地 CRUD\n\n```bash\n# 创建技能 — layer 由 tags 自动推断\nskill-central add review-pr \\\n  --name \"PR Review\" \\\n  --description \"Review pull requests against team conventions\" \\\n  --tags \"review,workflow,git\" \\\n  --prompt-file ./review.md\n\n# 查看\nskill-central list --tag review\nskill-central show review-pr\n\n# 提交前校验\nskill-central validate .skills/02-workflows/review-pr.yaml\n\n# 清理\nskill-central remove review-pr --force\n```\n\n`add` 按以下优先级选择目标 layer：\n\n1. 显式 `--layer` 标志（最高优先级）\n2. 同 id 已存在文件的位置（幂等 re-add）\n3. tags 经 [`LAYER_RULES`](./docs/ch/cli-reference.md#layer-inference) 推断\n4. 无匹配时 fallback 到 `02-workflows`\n\n`doctor` 是诊断安全的兜底：\n\n```bash\n$ skill-central doctor\n...\n▸ Layers\n  01-global     ✓   1 file\n  02-workflows  ✓   9 files\n  03-domains    ✓   3 files\n  04-tech-stack ✓   3 files\n▸ ✓ All skill files parse cleanly\n▸ ✓ No id collisions\n▸ ✓ No orphan backups\n```\n\n---\n\n## Web 看板\n\n`skill-central board` 启动本地 Hono 服务并打印 URL：\n\n```\n  ✓ skill-central web board\n    http://127.0.0.1:5417/\n\n  Press Ctrl+C to stop.\n```\n\n仪表盘按 layer 分组显示技能列表。点击任意技能可在右侧预览完整 prompt。点击 **Edit** 打开浏览器内 textarea；**Save** 通过 `PUT /api/skills/:id` 将变更写回磁盘。\n\n每次保存都会把旧内容挪到 `<file>.yaml.bak.<ISO-no-colons>`。并发编辑由 sha256 冲突检测捕获——若客户端的 expected sha 与当前文件不一致，服务端返回 `409` 并附上当前内容。\n\n### 安全模型\n\n- **默认仅监听 loopback**。`--host 0.0.0.0` 需要加 `--i-understand-nonlocal` 因为 Web 看板没有身份验证。\n- **端口冲突重试**。`+1..+10` 自动尝试。\n- **静态资源路径遍历防御**。`GET /*` 解析到 `dist/web/`；`..` 一律返回 404。\n\n完整的 HTTP API 和编辑流程见 [`docs/ch/web-board.md`](./docs/ch/web-board.md) / [`docs/en/web-board.md`](./docs/en/web-board.md)。\n\n---\n\n## 远程安装\n\n从远程 URL 安装技能到本地 layer：\n\n```bash\n# 从 GitHub raw 文件（任何 branch / tag / SHA）\nskill-central install \\\n  github:BobcGn/skill-central/.skills/02-workflows/review-pr.yaml@v1.0.0\n\n# 从 npm 包（需要在 package.json 中声明 skill-central.paths）\nskill-central install npm:@bobcgn/some-skills@1.2.3\n\n# 按需重新拉取\nskill-central update                 # 全部已安装\nskill-central update review-pr       # 单个\n\n# 卸载\nskill-central uninstall review-pr --purge-backups\n```\n\n每次安装都会写入 `~/.skill-central/lock.json` 一条记录，包含 source URL、解析后的版本、sha256、layer、绝对文件路径。`update` 重新拉取后比对 sha256，仅在上游真正变化时落盘。\n\n### 安全模型\n\n- **HTTPS-only**。`http://` 直接拒绝。\n- **禁止 loopback 主机**。tarball 来源若指向 `localhost`、`127.0.0.0/8`、`::1`、`0.0.0.0` 一律拒绝（tar-slip / SSRF 防御）。\n- **Tar-slip 防御**。npm tarball 条目必须以 `package/` 开头；`..` 和 `\\` 被拒绝。\n- **sha256 校验**。每次 install + update 都计算并存入 sha256。\n\n完整的 URL 语法和 manifest 约定见 [`docs/ch/remote-sources.md`](./docs/ch/remote-sources.md) / [`docs/en/remote-sources.md`](./docs/en/remote-sources.md)。\n\n---\n\n## JSON-RPC 接口\n\n### `prompts/list` — 列出所有 Prompt 技能\n\n```json\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"prompts/list\"}\n```\n\n### `prompts/get` — 获取单个技能\n\n```json\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"prompts/get\",\"params\":{\"name\":\"container-infra\"}}\n```\n\n支持占位符插值：`{{name}}` 会被替换为参数值：\n\n```json\n{\"method\":\"prompts/get\",\"params\":{\"name\":\"my-skill\",\"arguments\":{\"name\":\"Alice\"}}}\n```\n\n### `prompts/get` (skills:compose) — 标签组合\n\n```json\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"prompts/get\",\"params\":{\"name\":\"skills:compose\",\"arguments\":{\"tags\":\"global,debug,docker\"}}}\n```\n\n> `tags` 为逗号分隔的字符串。MCP 规范约束 arguments 类型为 `Record<string, string>`，不支持 JSON 数组。\n\n### `tools/list` / `tools/call` — 工具调用\n\n```json\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"commit-conventions\",\"arguments\":{\"type\":\"feat\",\"summary\":\"add login page\"}}}\n```\n\n工具参数会根据 `inputSchema` 进行校验 — 缺少必填字段或类型不匹配会返回 `isError: true`。\n\n完整规范见 [`docs/ch/mcp-protocol.md`](./docs/ch/mcp-protocol.md) / [`docs/en/mcp-protocol.md`](./docs/en/mcp-protocol.md)。\n\n---\n\n## 技能文件格式\n\n技能支持 **YAML**（推荐）和 **JSON** 两种格式。\n\n```yaml\n# .skills/04-tech-stack/languages/typescript.yaml\nid: typescript-conventions\nname: TypeScript Conventions\ndescription: TypeScript 编码规范\ntype: prompt\ntags:\n  - typescript\nprompt: |\n  你是 TypeScript 专家，请遵守以下规范：\n\n  ## 代码风格\n  - 开启 strict 模式（tsconfig 中 `strict: true`）\n  - 对象结构优先用 interface 而非 type alias\n  - 公共函数必须标注显式返回类型\n```\n\n| 字段 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `id` | string | ✓ | 全局唯一标识符（kebab-case），作为 prompt name |\n| `name` | string | ✓ | 人类可读名称 |\n| `description` | string | ✓ | 简短描述 |\n| `type` | \"prompt\"/\"tool\" | ✓ | 技能类型 |\n| `tags` | string[] | | 分类标签，用于组合 + layer 推断 |\n| `prompt` | string | prompt 必填 | 发送给 AI 的 Markdown 指令，支持 `{{占位符}}` 插值 |\n| `inputSchema` | object | tool 必填 | JSON Schema 输入定义，调用 tool 时会校验 |\n| `arguments` | object[] | | 声明的参数（供 IDE UI 参考） |\n| `version` | string | | 版本号 |\n\n完整 schema 参考 [`docs/ch/skill-schema.md`](./docs/ch/skill-schema.md) / [`docs/en/skill-schema.md`](./docs/en/skill-schema.md)。\n\n---\n\n## 标签组合\n\n当 IDE 通过 `skills:compose` 请求时，引擎执行：\n\n1. **匹配** — 找出所有与请求标签重叠的技能\n2. **排序** — 按层优先级升序排列（低→高）\n3. **拼接** — 用 `---` 分隔符合并每个技能的 prompt 内容\n\n示例 `tags: \"debug,docker\"`：\n\n```\n[docker, nginx, infra, devops]  ← container-infra (priority 30)\n                                   通过 \"docker\" 匹配\n[debug, fix, error]              ← debugging-expert (priority 20)\n                                   通过 \"debug\" 匹配\n```\n\n结果：排错指导在前，基础设施标准在后——按优先级从低到高逐层叠加。\n\n---\n\n## 层级覆写\n\n当多层定义了**相同的 `id`**，高优先级胜出。`init` 生成的 `skill-central.yaml` 形如：\n\n```yaml\nlayers:\n  - name: \"01-global\"\n    path: \".skills/01-global\"\n    priority: 10\n  - name: \"02-workflows\"\n    path: \".skills/02-workflows\"\n    priority: 20\n  - name: \"03-domains\"\n    path: \".skills/03-domains\"\n    priority: 30\n  - name: \"04-tech-stack\"\n    path: \".skills/04-tech-stack\"\n    priority: 40\n```\n\n团队共享技能库的同时，允许个人叠加自定义覆盖——无需复制文件。\n\n### 用户级基线（v0.2.0 起）\n\n`add --user` 和 `install`（默认 scope）写入 `~/.skill-central/skills/`。四个子目录与项目 1:1 对应，优先级为 `5 / 15 / 25 / 35`——始终低于项目层，因此项目可以随时覆盖全局基线。详见 [`docs/ch/layered-override.md`](./docs/ch/layered-override.md) / [`docs/en/layered-override.md`](./docs/en/layered-override.md)。\n\n---\n\n## 配置加载顺序\n\n```\n1. ~/.skill-central/config.yaml       ← 机器级默认\n2. <project>/skill-central.yaml       ← 项目级（覆盖同名 layer 的 path/priority）\n3. 内置默认                           ← { name: \"project\", path: \".skills\", priority: 100 }\n```\n\n---\n\n## IDE 集成\n\n将 skill-central 作为 MCP 工具接入你的 AI IDE。\n\n> **提示：** 如果你使用了该模板自行发布，请把 `@bobcgn/skill-central` 替换成你自己的 npm 包名。如果在本地 link，可以直接填写 `skill-central mcp` 命令。\n\n### Cursor — `.cursor/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"skill-central\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bobcgn/skill-central\", \"mcp\"]\n    }\n  }\n}\n```\n\n### Windsurf — `.windsurf/mcp_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"skill-central\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bobcgn/skill-central\", \"mcp\"]\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add skill-central -- npx -y @bobcgn/skill-central mcp\n```\n\n---\n\n## 自定义技能开发\n\n### 方案 A — 用 `add`（推荐）\n\n```bash\nskill-central add typescript-conventions \\\n  --name \"TypeScript Conventions\" \\\n  --description \"Coding standards for this project\" \\\n  --tags \"typescript,lang-ts\" \\\n  --prompt-file ./ts-conventions.md\n```\n\nLayer 推断会从 `typescript` tag 选择 `04-tech-stack/languages/`。验证：\n\n```bash\nskill-central show typescript-conventions\n```\n\n### 方案 B — 手写 YAML\n\n```bash\nmkdir -p .skills/04-tech-stack/languages\n```\n\n`.skills/04-tech-stack/languages/typescript.yaml`：\n\n```yaml\nid: typescript-conventions\nname: TypeScript Conventions\ndescription: TypeScript 编码规范\ntype: prompt\ntags:\n  - typescript\nprompt: |\n  你是 TypeScript 专家...\n```\n\n### 验证 + 使用\n\n```bash\nskill-central doctor                       # 抓取解析错误 + id 冲突\nskill-central show typescript-conventions  # 检查渲染结果\n```\n\n参考 `.skills/04-tech-stack/_template.yaml` 获取带完整注释的模板。\n\n---\n\n## 部署与常见问题排查\n\n> **本节内容至关重要。** MCP 客户端（Cursor、Windsurf、Claude Code 等）通过 **stdio（标准输入/输出）** 与服务进程通信，stdout 是唯一的 JSON-RPC 数据通道。任何非协议数据混入 stdout 都会导致连接静默失败——没有报错，没有提示，只是工具列表为空。以下两个问题是最常见的\"隐形杀手\"。\n\n### 问题一：`npx` 首次运行的交互式提示\n\n#### 现象\n\n当你在 MCP 配置中使用 `npx @bobcgn/skill-central mcp` 启动服务时，如果本地尚未缓存该包，`npx` 会在 stdout 打印如下交互提示：\n\n```\nNeed to install the following packages:\n  @bobcgn/skill-central@0.3.0\nOk to proceed? (y)\n```\n\n#### 为什么致命\n\n这个提示出现在 **stdout** 上。MCP 客户端正在等待一个合法的 JSON-RPC 响应，却收到了一段纯文本。严格模式的解析器（如 Claude Code、Cursor 的 MCP 客户端）会直接判定连接异常并**静默丢弃整个工具列表**——你的 IDE 不会报错，只是\"看不到任何工具\"。\n\n#### 解决方案\n\n**方案 A（推荐）：在 args 中强制传入 `-y`**\n\n`-y` 告诉 `npx` 自动确认安装，跳过交互提示：\n\n```json\n{\n  \"mcpServers\": {\n    \"skill-central\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@bobcgn/skill-central\", \"mcp\"]\n    }\n  }\n}\n```\n\n> ⚠️ **注意：** `-y` 必须是 args 数组的第一个元素，排在包名之前。\n\n**方案 B（生产环境推荐）：直接指定 node 路径运行**\n\n绕过 `npx`，从根本上消除交互提示的可能：\n\n```json\n{\n  \"mcpServers\": {\n    \"skill-central\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/skill-central/dist/index.js\", \"mcp\"]\n    }\n  }\n}\n```\n\n获取绝对路径：\n\n```bash\n# 查找全局安装路径\nnpm root -g\n# 或查找当前项目路径\nnpm list -g @bobcgn/skill-central --depth=0\n```\n\n**方案 C：预先全局安装**\n\n```bash\nnpm install -g @bobcgn/skill-central\n```\n\n然后在配置中直接使用 `skill-central mcp` 作为 command，无需 `npx`。\n\n---\n\n### 问题二：严禁使用 `console.log` 污染标准输出\n\n#### 现象\n\n开发者习惯性地在代码中加入调试日志：\n\n```typescript\n// ❌ 绝对禁止\nconsole.log(\"Starting MCP server...\");\nconsole.log(\"Loaded 12 skills\");\nconsole.log(\"Connection established\");\n```\n\n#### 为什么致命\n\nMCP stdio 模式下，**stdout 是一个纯粹的 JSON-RPC 通道**。客户端通过 stdout 读取每一行，期望全部是合法的 JSON-RPC 消息。一行非 JSON 文本（比如 `\"Starting MCP server...\"`）会立即破坏协议帧，导致：\n\n- JSON 解析器抛出异常\n- 客户端断开连接\n- 工具列表返回为空\n- 在某些实现中，之前的合法消息也会被丢弃\n\n#### 解决方案\n\n**硬性规范：所有调试/状态输出必须使用 `console.error()`，绝对禁止向 stdout 输出非协议数据。**\n\n```typescript\n// ✅ 正确：输出到 stderr，不影响 JSON-RPC 通道\nconsole.error(\"[skill-central] Starting MCP server...\");\nconsole.error(\"[skill-central] Loaded 12 skills\");\n\n// ❌ 错误：污染 stdout，破坏 JSON-RPC 协议\nconsole.log(\"Starting MCP server...\");\n```\n\n**第三方库的 `console.log` 同样危险。** 如果你引入的依赖包内部使用了 `console.log`，同样会污染 stdout。`skill-central` 在 MCP 模式下已内置防护（将 `console.log` 重定向到 `stderr`），但如果你基于此项目二次开发，务必注意这一风险。\n\n---\n\n### 架构原理：为什么 stdio 模式如此脆弱\n\n```\n┌──────────────────────────────────────────────────────────┐\n│              MCP 客户端（Cursor / Windsurf / Claude）      │\n│                                                          │\n│  读取 stdout ──→ JSON 解析器 ──→ 工具/提示列表            │\n│  写入 stdin  ──→ JSON-RPC 请求                            │\n└──────────────┬───────────────────────┬───────────────────┘\n               │ stdin                 │ stdout\n               ▼                       ▲\n┌──────────────────────────────────────────────────────────┐\n│              MCP Server 进程                              │\n│                                                          │\n│  stdin  ──→ 协议处理器 ──→ JSON-RPC 响应 ──→ stdout       │\n│                                                          │\n│  ⚠️ 任何 console.log / 进程日志 / npx 提示               │\n│     都会混入 stdout，破坏协议帧                            │\n└──────────────────────────────────────────────────────────┘\n```\n\n**核心约束：** stdio 是一个**字节流通道**，没有消息边界。JSON-RPC 协议通过换行符分隔消息，客户端逐行解析。一旦某一行不是合法 JSON，后续所有消息都会被错位解析或直接丢弃。这就是为什么一个 `console.log` 就能毁掉整个连接。\n\n**与 HTTP 模式的对比：** 如果 MCP 未来支持 HTTP/SSE 传输，这个问题会大幅缓解（HTTP 有天然的消息边界和多路复用能力）。但在当前的 stdio 模式下，这是每个 MCP 服务开发者都必须严格遵守的铁律。\n\n---\n\n### 快速诊断清单\n\n| 现象 | 可能原因 | 解决 |\n|------|---------|------|\n| Server 启动但无响应 / 工具列表为空 | stdout 被非 JSON 数据污染 | 检查所有 `console.log` 调用，全部改为 `console.error()`。确认 npx args 中有 `-y`。 |\n| IDE 无法连接 | MCP 配置命令错误 | 使用 `npx -y @bobcgn/skill-central mcp` 或指定绝对路径。 |\n| 首次连接成功，重启后失败 | npx 缓存已存在，但包版本已更新 | 清除 npx 缓存：`npx clear-npx-cache`，或使用 `-y` 强制更新。 |\n| 技能未加载 | YAML 语法错误 | 运行 `skill-central doctor` 查看带文件路径的解析错误。 |\n| 标签组合无返回 | 标签缺失或不匹配 | 确认技能 YAML 中有 `tags` 字段，用 `list --tag X` 验证。传参使用逗号字符串。 |\n| 工具调用返回错误 | 参数缺失或类型错误 | 检查 `inputSchema.required`。参数会按声明类型校验。 |\n| Web 看板拒绝绑定 0.0.0.0 | 防误用护栏 | 若确实需要，加 `--i-understand-nonlocal`。 |\n| `install github:...` 返回 404 | 路径 / 分支错误 | 在浏览器中确认该 ref 下存在该路径。 |\n| `Package X has no \"skill-central.paths\"` | npm 包作者漏写 manifest | 作者需在 package.json 中声明 `\"skill-central\": { \"paths\": [...] }`。 |\n| Web 看板提示 \"web assets not found\" | 漏了 `npm run build:web` | 先执行构建步骤，再启动 `board`。 |\n\n---\n\n## 参考文档\n\n详细参考页位于 [`docs/`](./docs/)：\n\n- [`docs/ch/cli-reference.md`](./docs/ch/cli-reference.md) / [`docs/en/cli-reference.md`](./docs/en/cli-reference.md) — 每个命令、每个 flag\n- [`docs/ch/web-board.md`](./docs/ch/web-board.md) / [`docs/en/web-board.md`](./docs/en/web-board.md) — Web 仪表盘使用 + API\n- [`docs/ch/remote-sources.md`](./docs/ch/remote-sources.md) / [`docs/en/remote-sources.md`](./docs/en/remote-sources.md) — 源 URL 语法 + manifest\n- [`docs/ch/skill-schema.md`](./docs/ch/skill-schema.md) / [`docs/en/skill-schema.md`](./docs/en/skill-schema.md) — `SkillSchema` 字段参考\n- [`docs/ch/layered-override.md`](./docs/ch/layered-override.md) / [`docs/en/layered-override.md`](./docs/en/layered-override.md) — 层级机制详解\n- [`docs/ch/mcp-protocol.md`](./docs/ch/mcp-protocol.md) / [`docs/en/mcp-protocol.md`](./docs/en/mcp-protocol.md) — JSON-RPC 示例\n\n发布历史见 [`CHANGELOG.md`](./CHANGELOG.md)。发布前自检清单：[`docs/ch/release-testing.md`](./docs/ch/release-testing.md) / [`docs/en/release-testing.md`](./docs/en/release-testing.md)。推荐的发布路径（tag push → 自动 npm publish + provenance + 自动 GitHub Release）：[`docs/ch/trusted-publishing.md`](./docs/ch/trusted-publishing.md) / [`docs/en/trusted-publishing.md`](./docs/en/trusted-publishing.md)。若 Trusted Publishing 尚未配置，回退到：[`docs/ch/manual-publishing.md`](./docs/ch/manual-publishing.md) / [`docs/en/manual-publishing.md`](./docs/en/manual-publishing.md)。\n\n---\n\n## 开发指南\n\n```bash\n# 克隆项目\ngit clone https://github.com/BobcGn/skill-central.git\ncd skill-central\nnpm install\n\n# 开发命令\nnpm run dev:mcp       # MCP Server（watch 模式）\nnpm run dev:board     # Web 看板\nnpm run dev:init      # （重新）生成示例技能\n\n# 构建\nnpm run build         # tsc → dist/\nnpm run build:web     # 拷贝前端静态资源到 dist/web/\n\n# 仅类型检查\nnpx tsc --noEmit\n```\n\n### 技术栈\n\n| 组件 | 选型 |\n|------|------|\n| **运行时** | Node.js 22+ (ESM) |\n| **语言** | TypeScript 5.8 (ES2022, NodeNext) |\n| **MCP SDK** | `@modelcontextprotocol/sdk` ^1.9.0 |\n| **CLI** | `commander` ^14.0.0 |\n| **YAML** | `js-yaml` ^4.1.1 |\n| **Web 服务器** | `hono` ^4.12 + `@hono/node-server` ^2.0 |\n| **Tarball** | `tar-stream` ^3.2（支持 npm 安装） |\n| **开发运行器** | `tsx` ^4.19.3 |\n\n---\n\n## 许可\n\nMIT\n\n---\n\n## 作为模板使用与多设备同步（最佳实践）\n\n管理和在多台设备间同步 AI 技能的最稳妥方式，是将本仓库作为模板，创建一个你的私有技能仓库。\n\n### 1. 创建你的私有仓库\n1. 点击本仓库顶部的 **\"Use this template\"** 按钮，创建一个你自己的私有仓库。\n2. 将其克隆到本地：`git clone https://github.com/你的用户名/skill-central.git`\n3. 进入目录：`cd skill-central`\n\n### 2. 在专属分支中隔离你的技能数据\n为了避免未来拉取上游引擎代码更新时产生冲突，请保持 `main` 分支的纯净（作为引擎代码模板），并将你的个人技能存放在一个独立的分支（例如 `my-skills`）中：\n\n```bash\n# 创建并切换到你的技能分支\ngit checkout -b my-skills\n\n# 修改 .gitignore 以允许追踪技能文件\n# 在 .gitignore 中删除或注释掉 '.skills/' 和 'skill-central.yaml' 这两行\n\n# 添加你的技能并提交\ngit add .gitignore .skills/ skill-central.yaml\ngit commit -m \"feat: track personal skills\"\ngit push -u origin my-skills\n```\n\n### 3. 在新设备上初始化与链接\n当你在新设备上配置环境时，只需执行以下步骤即可完美还原你的技能环境：\n\n```bash\n# 1. 克隆你的私有仓库\ngit clone https://github.com/你的用户名/skill-central.git ~/Projects/skill-central\ncd ~/Projects/skill-central\n\n# 2. 切换到你的技能分支\ngit checkout my-skills\n\n# 3. 安装依赖并构建代码\nnpm install\nnpm run build && npm run build:web\n\n# 4. 将命令暴露到全局\nnpm link\n\n# 5. 设置为全局技能库（关键：让 Claude 等 IDE 能够识别到你的技能）\nln -s \"$(pwd)\" ~/.skill-central\n```\n\n执行完第 5 步后，任何 MCP 客户端（如 Claude Desktop）在后台启动 `skill-central mcp` 时，无论它从哪个目录启动，都能自动顺着软链接找到并加载你的所有技能！","readmeFilename":"README.zh-CN.md"}