shine-code-submit 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shine-code-submit",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "description": "Claude Code Hook → 本地常驻 Daemon 的状态/持久化底座。Hook 只做采集+落盘+转发立即退出,重活交给后台 Daemon 异步处理,不拖慢 Claude Code。",
5
5
  "author": {
6
6
  "name": "renguifeng"
package/dist/install.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var w=require("node:fs"),Xb=require("node:path"),Yb=require("node:child_process");var f=require("node:fs"),m=require("node:os"),y=require("node:path"),j=require("node:child_process"),Gb=[1,1,0],Hb=300000;function D(){let b=j.spawnSync("bun",["--version"],{shell:process.platform==="win32",encoding:"utf8"});if(b.status===0&&(b.stdout??"").trim())return"bun";let q=m.homedir(),z=process.platform==="win32"?[y.join(q,".bun","bin","bun.exe")]:[y.join(q,".bun","bin","bun"),"/usr/local/bin/bun","/opt/homebrew/bin/bun"];for(let Q of z)if(f.existsSync(Q))return Q;return null}function Wb(b){return b.trim().split(".").map((q)=>parseInt(q,10)||0)}function Jb(b,q){let z=Wb(b);for(let Q=0;Q<q.length;Q++){let X=z[Q]??0,J=q[Q]??0;if(X>J)return!0;if(X<J)return!1}return!0}function Kb(){let b=process.env.npm_config_registry??"";return/npmmirror|taobao/i.test(b)}function M(b){return j.spawnSync(b,{shell:!0,encoding:"utf8",timeout:Hb,stdio:"inherit"}).status??1}async function E(){let b=D();if(b){let z=j.spawnSync(b,["--version"],{shell:process.platform==="win32",encoding:"utf8"}).stdout?.trim()??"";if(z&&Jb(z,Gb))return console.log(`[shine-code-submit] bun ${z} detected`),b}if(console.log("[shine-code-submit] bun 未找到或版本过低,开始自动安装..."),Kb()){if(console.log("[shine-code-submit] 检测到国内 npm 镜像,先尝试 npm install -g bun"),M("npm install -g bun")===0){let z=D();if(z)return console.log("[shine-code-submit] ✓ bun 安装成功(via npm 镜像)"),z}console.log("[shine-code-submit] npm 镜像方式失败,回退官方脚本")}if(process.platform==="win32")M('powershell -c "irm bun.sh/install.ps1 | iex"');else M("curl -fsSL https://bun.sh/install | bash");let q=D();if(!q)throw console.error("[shine-code-submit] bun 自动安装失败。请手动安装后重试:"),console.error(" Windows: winget install Oven-sh.Bun 或 npm install -g bun"),console.error(" macOS: brew install oven-sh/bun/bun"),console.error(" Linux: curl -fsSL https://bun.sh/install | bash"),Error("bun installation failed");return console.log("[shine-code-submit] ✓ bun 安装成功"),q}var Z=require("node:fs"),Y=require("node:path"),g=require("node:child_process");var S=require("node:os"),V=require("node:path");function p(){return process.env.CLAUDE_CONFIG_DIR||V.join(S.homedir(),".claude")}function u(){return V.join(p(),"plugins")}function x(){return V.join(u(),"known_marketplaces.json")}function O(){return V.join(u(),"installed_plugins.json")}function v(){return V.join(p(),"settings.json")}var A={name:"shine-code-submit",version:"0.2.9",private:!1,type:"module",description:"Claude Code Hook -> 本地常驻 Daemon 的状态/持久化底座",author:"renguifeng",license:"MIT",repository:{type:"git",url:"https://github.com/renguifeng/shine-code-submit.git"},homepage:"https://github.com/renguifeng/shine-code-submit",bugs:{url:"https://github.com/renguifeng/shine-code-submit/issues"},keywords:["claude","claude-code","plugin","hooks","daemon","dashboard"],bin:{"shine-code-submit":"dist/install.cjs"},files:["dist/install.cjs",".claude-plugin","hooks/hooks.json","bin/launcher.cjs","src","ui","package.json","bun.lock","README.md"],engines:{node:">=18"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},scripts:{daemon:"bun run src/daemon/main.ts",hook:"bun run src/hook/main.ts",cli:"bun run src/cli/main.ts",build:"bun run scripts/build.ts","build:all":"bun run scripts/build.ts --all","build:install":"bun run scripts/build-install.ts","build:dist":"bun run scripts/build.ts && bun run scripts/build-install.ts",prepublishOnly:"bun run build:dist",typecheck:"tsc --noEmit"},devDependencies:{"@types/bun":"^1.3.14","@types/react":"^19.2.17","@types/react-dom":"^19.2.3",typescript:"^6.0.3"},dependencies:{marked:"^18.0.5",react:"^19.2.7","react-dom":"^19.2.7"}};var P=require("node:os"),h="shine-code-submit",W=A.version,Rb=process.env.SHINE_CODE_SUBMIT_HOST??"0.0.0.0",Vb="127.0.0.1",c=36666,B=`http://${Vb}:${c}`;function Ub(){let b=["vethernet","vmware","virtualbox","docker","veth","br-","virbr","vnet","utun"],q=(z)=>{let Q=z.toLowerCase();return b.some((X)=>Q.includes(X))};try{let z=P.networkInterfaces();for(let Q of Object.keys(z)){if(q(Q))continue;for(let X of z[Q]??[])if(X.family==="IPv4"&&!X.internal)return X.address}for(let Q of Object.keys(z))for(let X of z[Q]??[])if(X.family==="IPv4"&&!X.internal)return X.address}catch{}return"localhost"}var N=`http://${Ub()}:${c}`;var G="shine-code-submit",I="shine-code-submit";function L(b=W){return Y.join(u(),"cache",G,I,b)}function Cb(){let b=process.argv[1],q=process.cwd();if(b)try{q=Y.dirname(Z.realpathSync(Y.resolve(b)))}catch{q=Y.dirname(Y.resolve(b))}let z=q;for(let Q=0;Q<12;Q++){if(Z.existsSync(Y.join(z,"package.json"))&&Z.existsSync(Y.join(z,".claude-plugin")))return z;let X=Y.dirname(z);if(X===z)break;z=X}return Y.dirname(q)}var jb=[".claude-plugin","hooks","bin","src","ui","package.json","bun.lock","README.md"];function l(b){let q=L();if(Z.existsSync(q))Z.rmSync(q,{recursive:!0,force:!0});Z.mkdirSync(q,{recursive:!0});let z=Cb();console.log(`[shine-code-submit] 部署源:${z}`);for(let X of jb){let J=Y.join(z,X);if(!Z.existsSync(J))continue;Z.cpSync(J,Y.join(q,X),{recursive:!0})}console.log("[shine-code-submit] 安装运行时依赖(bun install)...");let Q=g.spawnSync(b,["install","--frozen-lockfile"],{cwd:q,shell:process.platform==="win32",encoding:"utf8",stdio:"inherit"}).status;if(Q!==0){if(console.log("[shine-code-submit] --frozen-lockfile 失败,重试普通 bun install"),Q=g.spawnSync(b,["install"],{cwd:q,shell:process.platform==="win32",encoding:"utf8",stdio:"inherit"}).status,Q!==0)throw Error(`bun install 失败(exit ${Q})。请手动在 ${q} 跑 bun install`)}return Z.writeFileSync(Y.join(q,".install-version"),JSON.stringify({version:W,installedAt:Date.now()}),"utf8"),console.log(`[shine-code-submit] 已部署到 ${q}`),q}var $=require("node:fs"),d=require("node:path");function K(b,q){if(!$.existsSync(b))return q;let z;try{z=$.readFileSync(b,"utf8")}catch{return q}try{return JSON.parse(z)}catch{let Q=`${b}.bak-corrupt-${Date.now()}`;try{$.copyFileSync(b,Q),console.error(`[shine-code-submit] WARNING: ${b} JSON 损坏,已备份到 ${Q},用默认值继续`)}catch{}return q}}function F(b,q){let z=`${b}.bak-pre-install`;if($.existsSync(b)&&!$.existsSync(z))try{$.copyFileSync(b,z)}catch{}$.mkdirSync(d.dirname(b),{recursive:!0});let Q=`${b}.tmp-${process.pid}`;$.writeFileSync(Q,JSON.stringify(q,null,2),"utf8"),$.renameSync(Q,b)}function R(){return`${I}@${G}`}function o(b){let q=x(),z=K(q,{}),Q=z[G];if(Q?.source&&Q.source.source!=="directory")console.log(`[shine-code-submit] WARNING: marketplace "${G}" 已存在(source=${Q.source.source}),将覆盖为 directory 源(原文件已备份)`);z[G]={source:{source:"directory",path:b},installLocation:b,lastUpdated:new Date().toISOString(),autoUpdate:!1},F(q,z),console.log(`[shine-code-submit] marketplace 已注册 → ${q}`)}function s(b){let q=O(),z=K(q,{version:2,plugins:{}});if(!z.version)z.version=2;if(!z.plugins)z.plugins={};let Q=R(),X=new Date().toISOString(),J=z.plugins[Q]?.[0];z.plugins[Q]=[{scope:"user",installPath:b,version:W,installedAt:J?.installedAt??X,lastUpdated:X}],F(q,z),console.log(`[shine-code-submit] plugin 已注册 → ${q}`)}function r(b){let q=v(),z=K(q,{});if(!z.enabledPlugins)z.enabledPlugins={};let Q=R();if(z.enabledPlugins[Q]=!0,!z.extraKnownMarketplaces)z.extraKnownMarketplaces={};if(!z.extraKnownMarketplaces[G])z.extraKnownMarketplaces[G]={source:{source:"directory",path:b}};F(q,z),console.log(`[shine-code-submit] 已启用(enabledPlugins)→ ${q}`)}function i(){let b=R(),q=K(x(),{});if(q[G])delete q[G],F(x(),q);let z=K(O(),{plugins:{}});if(z.plugins&&z.plugins[b])delete z.plugins[b],F(O(),z);let Q=K(v(),{}),X=!1;if(Q.enabledPlugins&&Q.enabledPlugins[b])delete Q.enabledPlugins[b],X=!0;if(Q.extraKnownMarketplaces&&Q.extraKnownMarketplaces[G])delete Q.extraKnownMarketplaces[G],X=!0;if(X)F(v(),Q);console.log("[shine-code-submit] 已从三处 JSON 移除注册")}var t=require("node:child_process"),_=require("node:fs");async function U(b=400){try{let q=await fetch(`${B}/api/health`,{signal:AbortSignal.timeout(b)});if(!q.ok)return!1;return(await q.json())?.service===h}catch{return!1}}function n(b){let q=process.platform,z,Q;if(q==="win32")z="cmd",Q=["/c","start","",b];else if(q==="darwin")z="open",Q=[b];else if(ub())z="cmd.exe",Q=["/c","start","",b];else z="xdg-open",Q=[b];try{t.spawn(z,Q,{detached:!0,stdio:"ignore"}).unref()}catch{}}function ub(){if(process.platform!=="linux")return!1;try{return _.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")}catch{return!1}}var H=require("node:path"),a=require("node:fs"),e=require("node:os"),xb=process.env.LOCALAPPDATA??H.join(e.homedir(),".local","share"),C=H.join(xb,"shine-code-submit"),Ob=H.join(C,"spool"),bb=H.join(C,"log"),qb=H.join(C,"db"),zb=H.join(C,"daemon.pid"),rb=H.join(bb,"daemon.log"),ib=H.join(qb,"events.sqlite");function Qb(){for(let b of[C,Ob,bb,qb])a.mkdirSync(b,{recursive:!0})}var k=require("node:fs");function T(){try{let b=k.readFileSync(zb,"utf8");return JSON.parse(b)}catch{return null}}var[,,Zb]=process.argv;vb().catch((b)=>{console.error(`[shine-code-submit] ${b instanceof Error?b.message:String(b)}`),process.exit(1)});async function vb(){switch(Zb){case void 0:case"install":await Bb();break;case"uninstall":await Nb();break;case"status":await kb();break;case"--version":case"-v":console.log(W);break;default:Mb()}}async function Bb(){console.log(`=== shine-code-submit installer v${W} ===`);let b=await E(),q=l(b);o(q),s(q),r(q),Qb(),await Tb(b,q),Db(),console.log(""),console.log("✓ 安装完成。"),console.log(" · 重启 Claude Code 后,/plugin 列表会显示 shine-code-submit(已启用)。"),console.log(" · 开新会话即触发 SessionStart hook,事件出现在 dashboard。")}async function Nb(){console.log("=== shine-code-submit uninstaller ==="),await wb(),i();let b=L();if(w.existsSync(b))w.rmSync(b,{recursive:!0,force:!0}),console.log(`[shine-code-submit] 已删除 ${b}`);console.log("✓ 已卸载。重启 Claude Code 后 /plugin 不再显示。")}async function kb(){let b=await U(),q=T();if(b&&q)console.log(`daemon: running pid=${q.pid} ${N}`);else console.log("daemon: not running")}async function Tb(b,q){if(await U()){console.log("[shine-code-submit] daemon 已在运行,跳过启动");return}let z=Xb.join(q,"src","daemon","main.ts");console.log("[shine-code-submit] 启动 daemon...");try{Yb.spawn(b,["run",z],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:q,shell:process.platform==="win32"}).unref()}catch(X){console.error(`[shine-code-submit] 启动 daemon 失败:${X instanceof Error?X.message:X}`),console.error(" plugin 已注册,Claude Code 重启后 hook 会自动拉起 daemon");return}let Q=Date.now()+1e4;while(Date.now()<Q)if(await $b(200),await U()){console.log("[shine-code-submit] daemon 已就绪");return}console.error("[shine-code-submit] daemon 启动超时(10s)。plugin 已注册,可稍后手动 `shine-code-submit start` 或重启 claude。")}async function wb(){let b=T();if(!b){console.log("[shine-code-submit] daemon 未运行(无 pid 文件)");return}if(await U()){try{await fetch(`${B}/api/shutdown`,{method:"POST",headers:{authorization:`Bearer ${b.token}`}})}catch{}if(await $b(1000),await U())try{process.kill(b.pid)}catch{}}console.log("[shine-code-submit] daemon 已停止")}function Db(){let b=T(),q=b?`${N}/ui?t=${b.token}`:`${N}/ui`;console.log(`[shine-code-submit] Dashboard: ${q}`);try{n(q)}catch{}}function $b(b){return new Promise((q)=>setTimeout(q,b))}function Mb(){console.log(`shine-code-submit <command>
2
+ var D=require("node:fs"),qb=require("node:path"),zb=require("node:child_process");var _=require("node:fs"),m=require("node:os"),y=require("node:path"),C=require("node:child_process"),Yb=[1,1,0],Zb=300000;function T(){let b=C.spawnSync("bun",["--version"],{shell:process.platform==="win32",encoding:"utf8"});if(b.status===0&&(b.stdout??"").trim())return"bun";let q=m.homedir(),z=process.platform==="win32"?[y.join(q,".bun","bin","bun.exe")]:[y.join(q,".bun","bin","bun"),"/usr/local/bin/bun","/opt/homebrew/bin/bun"];for(let Q of z)if(_.existsSync(Q))return Q;return null}function $b(b){return b.trim().split(".").map((q)=>parseInt(q,10)||0)}function Gb(b,q){let z=$b(b);for(let Q=0;Q<q.length;Q++){let X=z[Q]??0,J=q[Q]??0;if(X>J)return!0;if(X<J)return!1}return!0}function Hb(){let b=process.env.npm_config_registry??"";return/npmmirror|taobao/i.test(b)}function M(b){return C.spawnSync(b,{shell:!0,encoding:"utf8",timeout:Zb,stdio:"inherit"}).status??1}async function f(){let b=T();if(b){let z=C.spawnSync(b,["--version"],{shell:process.platform==="win32",encoding:"utf8"}).stdout?.trim()??"";if(z&&Gb(z,Yb))return console.log(`[shine-code-submit] bun ${z} detected`),b}if(console.log("[shine-code-submit] bun 未找到或版本过低,开始自动安装..."),Hb()){if(console.log("[shine-code-submit] 检测到国内 npm 镜像,先尝试 npm install -g bun"),M("npm install -g bun")===0){let z=T();if(z)return console.log("[shine-code-submit] ✓ bun 安装成功(via npm 镜像)"),z}console.log("[shine-code-submit] npm 镜像方式失败,回退官方脚本")}if(process.platform==="win32")M('powershell -c "irm bun.sh/install.ps1 | iex"');else M("curl -fsSL https://bun.sh/install | bash");let q=T();if(!q)throw console.error("[shine-code-submit] bun 自动安装失败。请手动安装后重试:"),console.error(" Windows: winget install Oven-sh.Bun 或 npm install -g bun"),console.error(" macOS: brew install oven-sh/bun/bun"),console.error(" Linux: curl -fsSL https://bun.sh/install | bash"),Error("bun installation failed");return console.log("[shine-code-submit] ✓ bun 安装成功"),q}var Z=require("node:fs"),Y=require("node:path"),g=require("node:child_process");var p=require("node:os"),V=require("node:path");function E(){return process.env.CLAUDE_CONFIG_DIR||V.join(p.homedir(),".claude")}function x(){return V.join(E(),"plugins")}function j(){return V.join(x(),"known_marketplaces.json")}function B(){return V.join(x(),"installed_plugins.json")}function O(){return V.join(E(),"settings.json")}var S={name:"shine-code-submit",version:"0.2.10",private:!1,type:"module",description:"Claude Code Hook -> 本地常驻 Daemon 的状态/持久化底座",author:"renguifeng",license:"MIT",repository:{type:"git",url:"https://github.com/renguifeng/shine-code-submit.git"},homepage:"https://github.com/renguifeng/shine-code-submit",bugs:{url:"https://github.com/renguifeng/shine-code-submit/issues"},keywords:["claude","claude-code","plugin","hooks","daemon","dashboard"],bin:{"shine-code-submit":"dist/install.cjs"},files:["dist/install.cjs",".claude-plugin","hooks/hooks.json","bin/launcher.cjs","src","ui","package.json","bun.lock","README.md"],engines:{node:">=18"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},scripts:{daemon:"bun run src/daemon/main.ts",hook:"bun run src/hook/main.ts",cli:"bun run src/cli/main.ts",build:"bun run scripts/build.ts","build:all":"bun run scripts/build.ts --all","build:install":"bun run scripts/build-install.ts","build:dist":"bun run scripts/build.ts && bun run scripts/build-install.ts",prepublishOnly:"bun run build:dist",typecheck:"tsc --noEmit"},devDependencies:{"@types/bun":"^1.3.14","@types/react":"^19.2.17","@types/react-dom":"^19.2.3",typescript:"^6.0.3"},dependencies:{marked:"^18.0.5",react:"^19.2.7","react-dom":"^19.2.7"}};var A=require("node:os"),P="shine-code-submit",W=S.version,yb=process.env.SHINE_CODE_SUBMIT_HOST??"0.0.0.0",Jb="127.0.0.1",h=36666,v=`http://${Jb}:${h}`;function Kb(){let b=["vethernet","vmware","virtualbox","docker","veth","br-","virbr","vnet","utun"],q=(z)=>{let Q=z.toLowerCase();return b.some((X)=>Q.includes(X))};try{let z=A.networkInterfaces();for(let Q of Object.keys(z)){if(q(Q))continue;for(let X of z[Q]??[])if(X.family==="IPv4"&&!X.internal)return X.address}for(let Q of Object.keys(z))for(let X of z[Q]??[])if(X.family==="IPv4"&&!X.internal)return X.address}catch{}return"localhost"}var N=`http://${Kb()}:${h}`;var G="shine-code-submit",I="shine-code-submit";function L(b=W){return Y.join(x(),"cache",G,I,b)}function Fb(){let b=process.argv[1],q=process.cwd();if(b)try{q=Y.dirname(Z.realpathSync(Y.resolve(b)))}catch{q=Y.dirname(Y.resolve(b))}let z=q;for(let Q=0;Q<12;Q++){if(Z.existsSync(Y.join(z,"package.json"))&&Z.existsSync(Y.join(z,".claude-plugin")))return z;let X=Y.dirname(z);if(X===z)break;z=X}return Y.dirname(q)}var Vb=[".claude-plugin","hooks","bin","src","ui","package.json","bun.lock","README.md"];function c(b){let q=L();if(Z.existsSync(q))Z.rmSync(q,{recursive:!0,force:!0});Z.mkdirSync(q,{recursive:!0});let z=Fb();console.log(`[shine-code-submit] 部署源:${z}`);for(let X of Vb){let J=Y.join(z,X);if(!Z.existsSync(J))continue;Z.cpSync(J,Y.join(q,X),{recursive:!0})}console.log("[shine-code-submit] 安装运行时依赖(bun install)...");let Q=g.spawnSync(b,["install","--frozen-lockfile"],{cwd:q,shell:process.platform==="win32",encoding:"utf8",stdio:"inherit"}).status;if(Q!==0){if(console.log("[shine-code-submit] --frozen-lockfile 失败,重试普通 bun install"),Q=g.spawnSync(b,["install"],{cwd:q,shell:process.platform==="win32",encoding:"utf8",stdio:"inherit"}).status,Q!==0)throw Error(`bun install 失败(exit ${Q})。请手动在 ${q} 跑 bun install`)}return Z.writeFileSync(Y.join(q,".install-version"),JSON.stringify({version:W,installedAt:Date.now()}),"utf8"),console.log(`[shine-code-submit] 已部署到 ${q}`),q}var $=require("node:fs"),l=require("node:path");function K(b,q){if(!$.existsSync(b))return q;let z;try{z=$.readFileSync(b,"utf8")}catch{return q}try{return JSON.parse(z)}catch{let Q=`${b}.bak-corrupt-${Date.now()}`;try{$.copyFileSync(b,Q),console.error(`[shine-code-submit] WARNING: ${b} JSON 损坏,已备份到 ${Q},用默认值继续`)}catch{}return q}}function F(b,q){let z=`${b}.bak-pre-install`;if($.existsSync(b)&&!$.existsSync(z))try{$.copyFileSync(b,z)}catch{}$.mkdirSync(l.dirname(b),{recursive:!0});let Q=`${b}.tmp-${process.pid}`;$.writeFileSync(Q,JSON.stringify(q,null,2),"utf8"),$.renameSync(Q,b)}function R(){return`${I}@${G}`}function d(b){let q=j(),z=K(q,{}),Q=z[G];if(Q?.source&&Q.source.source!=="directory")console.log(`[shine-code-submit] WARNING: marketplace "${G}" 已存在(source=${Q.source.source}),将覆盖为 directory 源(原文件已备份)`);z[G]={source:{source:"directory",path:b},installLocation:b,lastUpdated:new Date().toISOString(),autoUpdate:!1},F(q,z),console.log(`[shine-code-submit] marketplace 已注册 → ${q}`)}function o(b){let q=B(),z=K(q,{version:2,plugins:{}});if(!z.version)z.version=2;if(!z.plugins)z.plugins={};let Q=R(),X=new Date().toISOString(),J=z.plugins[Q]?.[0];z.plugins[Q]=[{scope:"user",installPath:b,version:W,installedAt:J?.installedAt??X,lastUpdated:X}],F(q,z),console.log(`[shine-code-submit] plugin 已注册 → ${q}`)}function s(b){let q=O(),z=K(q,{});if(!z.enabledPlugins)z.enabledPlugins={};let Q=R();if(z.enabledPlugins[Q]=!0,!z.extraKnownMarketplaces)z.extraKnownMarketplaces={};if(!z.extraKnownMarketplaces[G])z.extraKnownMarketplaces[G]={source:{source:"directory",path:b}};F(q,z),console.log(`[shine-code-submit] 已启用(enabledPlugins)→ ${q}`)}function r(){let b=R(),q=K(j(),{});if(q[G])delete q[G],F(j(),q);let z=K(B(),{plugins:{}});if(z.plugins&&z.plugins[b])delete z.plugins[b],F(B(),z);let Q=K(O(),{}),X=!1;if(Q.enabledPlugins&&Q.enabledPlugins[b])delete Q.enabledPlugins[b],X=!0;if(Q.extraKnownMarketplaces&&Q.extraKnownMarketplaces[G])delete Q.extraKnownMarketplaces[G],X=!0;if(X)F(O(),Q);console.log("[shine-code-submit] 已从三处 JSON 移除注册")}async function U(b=400){try{let q=await fetch(`${v}/api/health`,{signal:AbortSignal.timeout(b)});if(!q.ok)return!1;return(await q.json())?.service===P}catch{return!1}}var H=require("node:path"),i=require("node:fs"),t=require("node:os"),Ub=process.env.LOCALAPPDATA??H.join(t.homedir(),".local","share"),u=H.join(Ub,"shine-code-submit"),ub=H.join(u,"spool"),n=H.join(u,"log"),a=H.join(u,"db"),e=H.join(u,"daemon.pid"),lb=H.join(n,"daemon.log"),db=H.join(a,"events.sqlite");function bb(){for(let b of[u,ub,n,a])i.mkdirSync(b,{recursive:!0})}var w=require("node:fs");function k(){try{let b=w.readFileSync(e,"utf8");return JSON.parse(b)}catch{return null}}var[,,Qb]=process.argv;Cb().catch((b)=>{console.error(`[shine-code-submit] ${b instanceof Error?b.message:String(b)}`),process.exit(1)});async function Cb(){switch(Qb){case void 0:case"install":await xb();break;case"uninstall":await jb();break;case"status":await Bb();break;case"--version":case"-v":console.log(W);break;default:wb()}}async function xb(){console.log(`=== shine-code-submit installer v${W} ===`);let b=await f(),q=c(b);d(q),o(q),s(q),bb(),await Ob(b,q),Nb(),console.log(""),console.log("✓ 安装完成。"),console.log(" · 重启 Claude Code 后,/plugin 列表会显示 shine-code-submit(已启用)。"),console.log(" · 开新会话即触发 SessionStart hook,事件出现在 dashboard。")}async function jb(){console.log("=== shine-code-submit uninstaller ==="),await vb(),r();let b=L();if(D.existsSync(b))D.rmSync(b,{recursive:!0,force:!0}),console.log(`[shine-code-submit] 已删除 ${b}`);console.log("✓ 已卸载。重启 Claude Code 后 /plugin 不再显示。")}async function Bb(){let b=await U(),q=k();if(b&&q)console.log(`daemon: running pid=${q.pid} ${N}`);else console.log("daemon: not running")}async function Ob(b,q){if(await U()){console.log("[shine-code-submit] daemon 已在运行,跳过启动");return}let z=qb.join(q,"src","daemon","main.ts");console.log("[shine-code-submit] 启动 daemon...");try{zb.spawn(b,["run",z],{detached:!0,stdio:"ignore",windowsHide:!0,cwd:q,shell:process.platform==="win32"}).unref()}catch(X){console.error(`[shine-code-submit] 启动 daemon 失败:${X instanceof Error?X.message:X}`),console.error(" plugin 已注册,Claude Code 重启后 hook 会自动拉起 daemon");return}let Q=Date.now()+1e4;while(Date.now()<Q)if(await Xb(200),await U()){console.log("[shine-code-submit] daemon 已就绪");return}console.error("[shine-code-submit] daemon 启动超时(10s)。plugin 已注册,可稍后手动 `shine-code-submit start` 或重启 claude。")}async function vb(){let b=k();if(!b){console.log("[shine-code-submit] daemon 未运行(无 pid 文件)");return}if(await U()){try{await fetch(`${v}/api/shutdown`,{method:"POST",headers:{authorization:`Bearer ${b.token}`}})}catch{}if(await Xb(1000),await U())try{process.kill(b.pid)}catch{}}console.log("[shine-code-submit] daemon 已停止")}function Nb(){let b=k(),q=b?`${N}/ui?t=${b.token}`:`${N}/ui`;console.log(`[shine-code-submit] Dashboard: ${q}`)}function Xb(b){return new Promise((q)=>setTimeout(q,b))}function wb(){console.log(`shine-code-submit <command>
3
3
 
4
4
  install 安装插件(自动装 bun + 部署 + 注册 + 启 daemon + 开 dashboard)
5
5
  uninstall 卸载(停 daemon + 反注册 + 删文件)
6
6
  status 显示 daemon 状态
7
7
 
8
- 通常通过 npx 跑:npx shine-code-submit install`),process.exit(Zb?1:0)}
8
+ 通常通过 npx 跑:npx shine-code-submit install`),process.exit(Qb?1:0)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shine-code-submit",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Claude Code Hook -> 本地常驻 Daemon 的状态/持久化底座",
package/src/hook/main.ts CHANGED
@@ -59,7 +59,7 @@ async function main(): Promise<void> {
59
59
  if (token) {
60
60
  const url = `${PUBLIC_BASE_URL}/ui?t=${token}`; // 网卡 IP:显示与打开浏览器用同一地址,局域网通用
61
61
  process.stdout.write(JSON.stringify({ systemMessage: `Shine Dashboard: ${url}` }));
62
- openBrowser(url);
62
+ // openBrowser(url); // 自动弹浏览器暂时关闭——链接仍作 systemMessage 打印,用户可点开
63
63
  }
64
64
  }
65
65
  }
@@ -144,11 +144,13 @@ function openDashboard(): void {
144
144
  const pid = readPidFile();
145
145
  const url = pid ? `${PUBLIC_BASE_URL}/ui?t=${pid.token}` : `${PUBLIC_BASE_URL}/ui`;
146
146
  console.log(`[shine-code-submit] Dashboard: ${url}`);
147
- try {
148
- openBrowser(url);
149
- } catch {
150
- /* 打开失败不阻塞 */
151
- }
147
+ // 自动弹浏览器暂时关闭——Dashboard 链接仍打印在上一行,用户可自行点开。
148
+ // 想恢复:把下面 try/catch 取消注释(openBrowser(url))。
149
+ // try {
150
+ // openBrowser(url);
151
+ // } catch {
152
+ // /* 打开失败不阻塞 */
153
+ // }
152
154
  }
153
155
 
154
156
  function sleep(ms: number): Promise<void> {