@lunora/cli 1.0.0-alpha.409 → 1.0.0-alpha.410

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,9 +1,9 @@
1
- import{V as M}from"../packem_shared/cli-CPcfZdt0.mjs";import{d as A}from"../packem_shared/command-CB4JM-Jl.mjs";import{EXIT_CODE as d}from"../packem_shared/EXIT_CODE-D_XCixv8.mjs";import{existsSync as h,readFileSync as N}from"node:fs";import{homedir as y}from"node:os";import{findWranglerFile as D}from"@lunora/config/cloudflare";import{join as c,relative as T}from"@visulima/path";import{stringify as I}from"smol-toml";import{h as P,u as F,i as R,r as G}from"../packem_shared/mcp-config-file-CcDTeXIq.mjs";import{detectPackageManager as W,execArgsFor as J}from"@lunora/config/cli";import{readLiveDevServerState as v,DEV_STATE_DIR as V}from"@lunora/config";import{resolveAdminToken as H}from"@lunora/config/studio-host";import{connectLocalStdio as z}from"@lunora/mcp";import{resolve as p}from"node:path";import{i as K}from"../packem_shared/path-containment-CgxYZggb.mjs";const m=e=>({args:[...e.args],command:e.command,...e.env===void 0?{}:{env:e.env}}),g=e=>e.transport==="http"?{type:"http",url:e.url}:m(e),q=e=>e.transport==="http"?{httpUrl:e.url}:m(e),X=e=>e.transport==="http"?{serverUrl:e.url}:m(e),B=e=>({args:["-y","mcp-remote",e],command:"npx"}),Z=e=>e.transport==="http"?B(e.url):m(e),Q=e=>e.transport==="http"?{url:e.url}:m(e),Y=e=>e.transport==="http"?{enabled:!0,type:"remote",url:e.url}:{command:[e.command,...e.args],enabled:!0,type:"local",...e.env===void 0?{}:{environment:e.env}},ee=e=>e.transport==="http"?{disabled:!1,type:"streamableHttp",url:e.url}:{disabled:!1,...m(e)},re=({home:e,platform:r})=>{if(r==="darwin")return{global:c(e,"Library","Application Support","Claude","claude_desktop_config.json")};if(r==="win32"){const t=process.env.APPDATA;return t===void 0||t===""?{}:{global:c(t,"Claude","claude_desktop_config.json")}}return r==="linux"?{global:c(e,".config","Claude","claude_desktop_config.json")}:{}},te=(e,r)=>I({mcp_servers:{[e]:r.transport==="http"?{url:r.url}:{args:[...r.args],command:r.command,...r.env===void 0?{}:{env:r.env}}}}),f=[{buildEntry:g,paths:({projectRoot:e})=>({project:c(e,".mcp.json")}),format:"json",id:"claude-code",key:"mcpServers",label:"Claude Code"},{buildEntry:g,paths:({home:e,projectRoot:r})=>({global:c(e,".cursor","mcp.json"),project:c(r,".cursor","mcp.json")}),format:"json",id:"cursor",key:"mcpServers",label:"Cursor"},{buildEntry:g,paths:({projectRoot:e})=>({project:c(e,".vscode","mcp.json")}),format:"json",id:"vscode",key:"servers",label:"VS Code (GitHub Copilot)"},{buildEntry:q,paths:({home:e,projectRoot:r})=>({global:c(e,".gemini","settings.json"),project:c(r,".gemini","settings.json")}),format:"json",id:"gemini",key:"mcpServers",label:"Gemini CLI"},{buildEntry:Z,paths:re,format:"json",id:"claude-desktop",key:"mcpServers",label:"Claude Desktop"},{buildEntry:X,paths:({home:e})=>({global:c(e,".codeium","windsurf","mcp_config.json")}),format:"json",id:"windsurf",key:"mcpServers",label:"Windsurf"},{buildEntry:Y,paths:({home:e,projectRoot:r})=>({global:c(e,".config","opencode","opencode.json"),project:c(r,"opencode.json")}),format:"json",id:"opencode",key:"mcp",label:"OpenCode"},{buildEntry:ee,paths:({home:e})=>({global:c(e,".cline","mcp.json")}),format:"json",id:"cline",key:"mcpServers",label:"Cline"},{buildEntry:Q,paths:({home:e})=>({global:c(e,".config","zed","settings.json")}),format:"json",id:"zed",key:"context_servers",label:"Zed"},{paths:({home:e,projectRoot:r})=>({global:c(e,".codex","config.toml"),project:c(r,".codex","config.toml")}),format:"manual",id:"codex",label:"Codex CLI",renderSnippet:te}],$=f.map(e=>e.id),ne=e=>f.find(r=>r.id===e.toLowerCase()),oe=["global","project"],u=(e,r)=>{const t=T(r,e);return t.length>0&&!t.startsWith("..")?t:e},le=(e,r)=>{const t=e.paths(r);return oe.flatMap(n=>{const o=t[n];return o===void 0?[]:[{client:e,path:o,scope:n}]})},ae=(e,r,t,n)=>{const o=e.paths(r),l=t==="global"?"project":"global",a=o[t]??(n?void 0:o[l]);if(a!==void 0)return{client:e,path:a,scope:o[t]===void 0?l:t}},se=e=>f.filter(r=>Object.values(r.paths(e)).some(t=>h(t))),j=(e,r,t,n)=>{if(e.length===0)return r();const o=[];for(const l of e){const a=ne(l);if(a===void 0){t.error(`mcp ${n}: unknown client "${l}". Known clients: ${$.join(", ")}.`);return}o.push(a)}return o},ce=e=>e.client.format==="json",ie="https://lunora.sh/mcp",C="lunora-docs",O="lunora",de=e=>h(c(e,"lunora"))&&D(e)!==void 0,ue=e=>{const{args:r,command:t}=J(e,"lunora",["mcp","serve"]);return{args:r,command:t,transport:"stdio"}},me=e=>({transport:"http",url:e}),fe=e=>({home:e.home,platform:e.platform,projectRoot:e.cwd}),_=(e,r,t)=>ae(e,fe(t),t.scope??r.preferredScope,t.scope!==void 0||!r.allowScopeFallback),pe=(e,r,t)=>{const n=_(e,r,t);if(n===void 0){t.logger.warn(`${e.label}: has no ${t.scope??r.preferredScope}-scoped config — skipped "${r.name}".`);return}const{path:o}=n,l=e.buildEntry(r.spec);if(t.print===!0){const i=u(o,t.cwd);return t.force!==!0&&P({key:e.key,name:r.name,path:o})?(t.logger.info(`${e.label}: "${r.name}" already configured in ${i} — a real install would skip it (re-run with --force to replace).`),{action:"printed",path:o}):(t.logger.info(`${e.label} → ${i}
1
+ import{V as M}from"../packem_shared/cli-CPcfZdt0.mjs";import{d as A}from"../packem_shared/command-CB4JM-Jl.mjs";import{EXIT_CODE as d}from"../packem_shared/EXIT_CODE-D_XCixv8.mjs";import{existsSync as h,readFileSync as N}from"node:fs";import{homedir as y}from"node:os";import{findWranglerFile as D}from"@lunora/config/cloudflare";import{join as c,relative as T}from"@visulima/path";import{stringify as I}from"smol-toml";import{h as P,u as F,i as R,r as H}from"../packem_shared/mcp-config-file-CcDTeXIq.mjs";import{detectPackageManager as W,execArgsFor as G}from"@lunora/config/cli";import{readLiveDevServerState as v,DEV_STATE_DIR as J}from"@lunora/config";import{resolveAdminToken as V}from"@lunora/config/studio-host";import{connectLocalStdio as z}from"@lunora/mcp";import{resolve as p}from"node:path";import{i as K}from"../packem_shared/path-containment-CgxYZggb.mjs";const m=e=>({args:[...e.args],command:e.command,...e.env===void 0?{}:{env:e.env}}),g=e=>e.transport==="http"?{type:"http",url:e.url}:m(e),q=e=>e.transport==="http"?{httpUrl:e.url}:m(e),X=e=>e.transport==="http"?{serverUrl:e.url}:m(e),B=e=>({args:["-y","mcp-remote",e],command:"npx"}),Z=e=>e.transport==="http"?B(e.url):m(e),Q=e=>e.transport==="http"?{url:e.url}:m(e),Y=e=>e.transport==="http"?{enabled:!0,type:"remote",url:e.url}:{command:[e.command,...e.args],enabled:!0,type:"local",...e.env===void 0?{}:{environment:e.env}},ee=e=>e.transport==="http"?{disabled:!1,type:"streamableHttp",url:e.url}:{disabled:!1,...m(e)},re=({home:e,platform:r})=>{if(r==="darwin")return{global:c(e,"Library","Application Support","Claude","claude_desktop_config.json")};if(r==="win32"){const t=process.env.APPDATA;return t===void 0||t===""?{}:{global:c(t,"Claude","claude_desktop_config.json")}}return r==="linux"?{global:c(e,".config","Claude","claude_desktop_config.json")}:{}},te=(e,r)=>I({mcp_servers:{[e]:r.transport==="http"?{url:r.url}:{args:[...r.args],command:r.command,...r.env===void 0?{}:{env:r.env}}}}),f=[{buildEntry:g,paths:({projectRoot:e})=>({project:c(e,".mcp.json")}),format:"json",id:"claude-code",key:"mcpServers",label:"Claude Code"},{buildEntry:g,paths:({home:e,projectRoot:r})=>({global:c(e,".cursor","mcp.json"),project:c(r,".cursor","mcp.json")}),format:"json",id:"cursor",key:"mcpServers",label:"Cursor"},{buildEntry:g,paths:({projectRoot:e})=>({project:c(e,".vscode","mcp.json")}),format:"json",id:"vscode",key:"servers",label:"VS Code (GitHub Copilot)"},{buildEntry:q,paths:({home:e,projectRoot:r})=>({global:c(e,".gemini","settings.json"),project:c(r,".gemini","settings.json")}),format:"json",id:"gemini",key:"mcpServers",label:"Gemini CLI"},{buildEntry:Z,paths:re,format:"json",id:"claude-desktop",key:"mcpServers",label:"Claude Desktop"},{buildEntry:X,paths:({home:e})=>({global:c(e,".codeium","windsurf","mcp_config.json")}),format:"json",id:"windsurf",key:"mcpServers",label:"Windsurf"},{buildEntry:Y,paths:({home:e,projectRoot:r})=>({global:c(e,".config","opencode","opencode.json"),project:c(r,"opencode.json")}),format:"json",id:"opencode",key:"mcp",label:"OpenCode"},{buildEntry:ee,paths:({home:e})=>({global:c(e,".cline","mcp.json")}),format:"json",id:"cline",key:"mcpServers",label:"Cline"},{buildEntry:Q,paths:({home:e})=>({global:c(e,".config","zed","settings.json")}),format:"json",id:"zed",key:"context_servers",label:"Zed"},{paths:({home:e,projectRoot:r})=>({global:c(e,".codex","config.toml"),project:c(r,".codex","config.toml")}),format:"manual",id:"codex",label:"Codex CLI",renderSnippet:te}],$=f.map(e=>e.id),ne=e=>f.find(r=>r.id===e.toLowerCase()),oe=["global","project"],u=(e,r)=>{const t=T(r,e);return t.length>0&&!t.startsWith("..")?t:e},le=(e,r)=>{const t=e.paths(r);return oe.flatMap(n=>{const o=t[n];return o===void 0?[]:[{client:e,path:o,scope:n}]})},ae=(e,r,t,n)=>{const o=e.paths(r),l=t==="global"?"project":"global",a=o[t]??(n?void 0:o[l]);if(a!==void 0)return{client:e,path:a,scope:o[t]===void 0?l:t}},se=e=>f.filter(r=>Object.values(r.paths(e)).some(t=>h(t))),j=(e,r,t,n)=>{if(e.length===0)return r();const o=[];for(const l of e){const a=ne(l);if(a===void 0){t.error(`mcp ${n}: unknown client "${l}". Known clients: ${$.join(", ")}.`);return}o.push(a)}return o},ce=e=>e.client.format==="json",ie="https://lunora.sh/mcp",O="lunora-docs",C="lunora",de=e=>h(c(e,"lunora"))&&D(e)!==void 0,ue=e=>{const{args:r,command:t}=G(e,"lunora",["mcp","serve"]);return{args:r,command:t,transport:"stdio"}},me=e=>({transport:"http",url:e}),fe=e=>({home:e.home,platform:e.platform,projectRoot:e.cwd}),_=(e,r,t)=>ae(e,fe(t),t.scope??r.preferredScope,t.scope!==void 0||!r.allowScopeFallback),pe=(e,r,t)=>{const n=_(e,r,t);if(n===void 0){t.logger.warn(`${e.label}: has no ${t.scope??r.preferredScope}-scoped config — skipped "${r.name}".`);return}const{path:o}=n,l=e.buildEntry(r.spec);if(t.print===!0){const i=u(o,t.cwd);return t.force!==!0&&P({key:e.key,name:r.name,path:o})?(t.logger.info(`${e.label}: "${r.name}" already configured in ${i} — a real install would skip it (re-run with --force to replace).`),{action:"printed",path:o}):(t.logger.info(`${e.label} → ${i}
2
2
  ${JSON.stringify({[e.key]:{[r.name]:l}},void 0,4)}`),{action:"printed",path:o})}const a=F({entry:l,force:t.force===!0,key:e.key,name:r.name,path:o}),s=u(o,t.cwd);return a.action==="invalid"?t.logger.error(`${e.label}: ${s} is not valid JSON (${a.error??"unknown error"}) — left untouched.`):a.action==="skipped"?t.logger.info(`${e.label}: "${r.name}" already configured in ${s} — re-run with --force to replace it.`):t.logger.success(`${e.label}: ${a.action==="created"?"created":"updated"} ${s} with "${r.name}".`),{action:a.action,path:o}},ge=(e,r,t)=>{const n=_(e,r,t)?.path;if(n===void 0){t.logger.warn(`${e.label}: no known config location on ${t.platform} — skipped.`);return}return t.logger.info(`${e.label}: add this to ${u(n,t.cwd)}
3
3
 
4
- ${e.renderSnippet(r.name,r.spec)}`),{action:"printed",path:n}},ve=e=>{const r=[];return e.localOnly!==!0&&r.push({allowScopeFallback:!0,name:C,preferredScope:"global",spec:me(e.docsUrl??ie)}),e.docsOnly!==!0&&de(e.cwd)&&r.push({allowScopeFallback:!1,name:O,preferredScope:"project",spec:ue(W(e.cwd))}),r},he=e=>{const r=e.home??y(),t=e.platform??process.platform;e.logger.info("Supported MCP clients:");for(const n of f){const o=n.paths({home:r,platform:t,projectRoot:e.cwd}),l=a=>{const s=o[a];return s===void 0?"—":u(s,e.cwd)};e.logger.info(` ${n.id.padEnd(15)} ${n.label.padEnd(24)} project: ${l("project").padEnd(30)} global: ${l("global")}`)}return{code:0,written:[]}},ye=e=>e.docsOnly===!0&&e.localOnly===!0?"`--docs-only` and `--local-only` are mutually exclusive — pass at most one.":"`--local-only` was set but this directory is not a Lunora project (no `lunora/` directory and wrangler config).",be=(e,r,t)=>{const n=[];for(const o of e)for(const l of r){const a=o.format==="json"?pe(o,l,t):ge(o,l,t);a!==void 0&&n.push({action:a.action,client:o.id,path:a.path,server:l.name})}return n},we=e=>{const r=e.home??y(),t=e.platform??process.platform,n=j(e.clients,()=>se({home:r,platform:t,projectRoot:e.cwd}),e.logger,"install");if(n===void 0)return{code:d.USAGE,written:[]};if(n.length===0)return e.logger.error(`mcp install: no MCP client config found — name one explicitly, e.g. \`lunora mcp install claude-code\`. Known clients: ${$.join(", ")}.`),{code:d.NOT_FOUND,written:[]};e.clients.length===0&&e.logger.info(`Detected ${String(n.length)} configured client(s): ${n.map(a=>a.label).join(", ")}.`);const o=ve(e);if(o.length===0)return e.logger.error(`mcp install: nothing to install — ${ye(e)}`),{code:d.USAGE,written:[]};const l=be(n,o,{...e,home:r,platform:t});return l.some(a=>a.action==="created"||a.action==="updated")&&e.logger.info("Restart your editor (or reload its MCP servers) to pick up the change."),{code:l.some(a=>a.action==="invalid")?1:0,written:l}},x=100,L=1e3,w=e=>({content:[{text:JSON.stringify(e,void 0,2),type:"text"}]}),Se=e=>({content:[{text:e,type:"text"}]}),ke=e=>{const r=typeof e=="string"?Number(e):e;return typeof r!="number"||!Number.isFinite(r)?x:Math.min(L,Math.max(1,Math.floor(r)))},S=(e,r)=>{if(r===void 0)return;const t=p(e,V);return K(t,p(e,r))?p(e,r):void 0},Ee=(e,r)=>{const t=N(e,"utf8").split(`
4
+ ${e.renderSnippet(r.name,r.spec)}`),{action:"printed",path:n}},ve=e=>{const r=[];return e.localOnly!==!0&&r.push({allowScopeFallback:!0,name:O,preferredScope:"global",spec:me(e.docsUrl??ie)}),e.docsOnly!==!0&&de(e.cwd)&&r.push({allowScopeFallback:!1,name:C,preferredScope:"project",spec:ue(W(e.cwd))}),r},he=e=>{const r=e.home??y(),t=e.platform??process.platform;e.logger.info("Supported MCP clients:");for(const n of f){const o=n.paths({home:r,platform:t,projectRoot:e.cwd}),l=a=>{const s=o[a];return s===void 0?"—":u(s,e.cwd)};e.logger.info(` ${n.id.padEnd(15)} ${n.label.padEnd(24)} project: ${l("project").padEnd(30)} global: ${l("global")}`)}return{code:0,written:[]}},ye=e=>e.docsOnly===!0&&e.localOnly===!0?"`--docs-only` and `--local-only` are mutually exclusive — pass at most one.":"`--local-only` was set but this directory is not a Lunora project (no `lunora/` directory and wrangler config).",be=(e,r,t)=>{const n=[];for(const o of e)for(const l of r){const a=o.format==="json"?pe(o,l,t):ge(o,l,t);a!==void 0&&n.push({action:a.action,client:o.id,path:a.path,server:l.name})}return n},we=e=>{const r=e.home??y(),t=e.platform??process.platform,n=j(e.clients,()=>se({home:r,platform:t,projectRoot:e.cwd}),e.logger,"install");if(n===void 0)return{code:d.USAGE,written:[]};if(n.length===0)return e.logger.error(`mcp install: no MCP client config found — name one explicitly, e.g. \`lunora mcp install claude-code\`. Known clients: ${$.join(", ")}.`),{code:d.NOT_FOUND,written:[]};e.clients.length===0&&e.logger.info(`Detected ${String(n.length)} configured client(s): ${n.map(a=>a.label).join(", ")}.`);const o=ve(e);if(o.length===0)return e.logger.error(`mcp install: nothing to install — ${ye(e)}`),{code:d.USAGE,written:[]};const l=be(n,o,{...e,home:r,platform:t});return l.some(a=>a.action==="created"||a.action==="updated")&&e.logger.info("Restart your editor (or reload its MCP servers) to pick up the change."),{code:l.some(a=>a.action==="invalid")?1:0,written:l}},x=100,L=1e3,w=e=>({content:[{text:JSON.stringify(e,void 0,2),type:"text"}]}),Se=e=>({content:[{text:e,type:"text"}]}),ke=e=>{const r=typeof e=="string"?Number(e):e;return typeof r!="number"||!Number.isFinite(r)?x:Math.min(L,Math.max(1,Math.floor(r)))},S=(e,r)=>{if(r===void 0)return;const t=p(e,J);return K(t,p(e,r))?p(e,r):void 0},Ee=(e,r)=>{const t=N(e,"utf8").split(`
5
5
  `);return t.at(-1)===""&&t.pop(),t.slice(-r).join(`
6
- `)},$e=e=>[{definition:{description:"Report whether a `lunora dev` server is running for this project, and its URL, studio URL, mode and uptime. Call this first when a query or mutation tool fails to connect.",inputSchema:{properties:{},type:"object"},name:"lunora_dev_status"},handle:async()=>{const r=v(e);return w(r===void 0?{hint:"Start it with `lunora dev` in the project directory.",running:!1}:{background:r.background===!0,logFile:S(e,r.logFile),mode:r.mode,pid:r.pid,running:!0,startedAt:r.startedAt,studioUrl:r.studioUrl,url:r.url})}},{definition:{description:"Return the tail of the running dev server's captured log — worker output, request errors, and stack traces. Only available when the server was started in the background (`lunora dev --background`); a foreground server prints to its own terminal.",inputSchema:{properties:{lines:{description:`How many trailing lines to return (default ${String(x)}, max ${String(L)})`,type:"number"}},type:"object"},name:"lunora_dev_logs"},handle:async r=>{const t=v(e);if(t===void 0)return{content:[{text:"no dev server is running — start one with `lunora dev`",type:"text"}],isError:!0};const n=S(e,t.logFile);if(n===void 0||!h(n))return{content:[{text:"this dev server is not capturing its output to a file (it runs in the foreground) — restart it with `lunora dev --background` to make its logs readable here",type:"text"}],isError:!0};const o=ke(r.lines),l=Ee(n,o);return Se(l.length===0?"(the dev server log is empty)":l)}}],je=new Set(["127.0.0.1","::1","localhost"]),U=e=>{try{const{hostname:r}=new URL(e);return je.has(r.startsWith("[")?r.slice(1,-1):r)}catch{return!1}},k=e=>{const r=e.url??v(e.cwd)?.url;if(r===void 0||r.length===0)return;if(e.token!==void 0&&e.token.length>0)return{token:e.token,url:r};if(!U(r))return{url:r};const t=H(e.cwd);return t===void 0||t.length===0?{url:r}:{token:t,url:r}},Ce=async e=>{await new Promise(r=>{const t=()=>{r()};e.onclose=t,process.stdin.once("close",t),process.stdin.once("end",t)})},Oe=e=>{if(e===void 0)return"lunora mcp serve: ready (documentation tools). No dev server running yet — start `lunora dev` and the deployment tools start working, no restart needed.\n";if(e.token!==void 0)return`lunora mcp serve: ready — deployment at ${e.url}
6
+ `)},$e=e=>[{definition:{annotations:{destructiveHint:!1,idempotentHint:!0,openWorldHint:!1,readOnlyHint:!0,title:"Check the local dev server"},description:"Report whether a `lunora dev` server is running for this project, and its URL, studio URL, mode and uptime. Call this first when a query or mutation tool fails to connect.",inputSchema:{properties:{},type:"object"},name:"lunora_dev_status"},handle:async()=>{const r=v(e);return w(r===void 0?{hint:"Start it with `lunora dev` in the project directory.",running:!1}:{background:r.background===!0,logFile:S(e,r.logFile),mode:r.mode,pid:r.pid,running:!0,startedAt:r.startedAt,studioUrl:r.studioUrl,url:r.url})}},{definition:{annotations:{destructiveHint:!1,idempotentHint:!0,openWorldHint:!1,readOnlyHint:!0,title:"Read the local dev server log"},description:"Return the tail of the running dev server's captured log — worker output, request errors, and stack traces. Only available when the server was started in the background (`lunora dev --background`); a foreground server prints to its own terminal.",inputSchema:{properties:{lines:{description:`How many trailing lines to return (default ${String(x)}, max ${String(L)})`,type:"number"}},type:"object"},name:"lunora_dev_logs"},handle:async r=>{const t=v(e);if(t===void 0)return{content:[{text:"no dev server is running — start one with `lunora dev`",type:"text"}],isError:!0};const n=S(e,t.logFile);if(n===void 0||!h(n))return{content:[{text:"this dev server is not capturing its output to a file (it runs in the foreground) — restart it with `lunora dev --background` to make its logs readable here",type:"text"}],isError:!0};const o=ke(r.lines),l=Ee(n,o);return Se(l.length===0?"(the dev server log is empty)":l)}}],je=new Set(["127.0.0.1","::1","localhost"]),U=e=>{try{const{hostname:r}=new URL(e);return je.has(r.startsWith("[")?r.slice(1,-1):r)}catch{return!1}},k=e=>{const r=e.url??v(e.cwd)?.url;if(r===void 0||r.length===0)return;if(e.token!==void 0&&e.token.length>0)return{token:e.token,url:r};if(!U(r))return{url:r};const t=V(e.cwd);return t===void 0||t.length===0?{url:r}:{token:t,url:r}},Oe=async e=>{await new Promise(r=>{const t=()=>{r()};e.onclose=t,process.stdin.once("close",t),process.stdin.once("end",t)})},Ce=e=>{if(e===void 0)return"lunora mcp serve: ready (documentation tools). No dev server running yet — start `lunora dev` and the deployment tools start working, no restart needed.\n";if(e.token!==void 0)return`lunora mcp serve: ready — deployment at ${e.url}
7
7
  `;const t=!U(e.url)?"the project's admin token was NOT sent to this non-local url; pass --token to authenticate deliberately":"no LUNORA_ADMIN_TOKEN in the environment or .dev.vars; the deployment tools will be refused until one is set";return`lunora mcp serve: ready — deployment at ${e.url} (${t})
8
8
  `},_e=async(e,r=z)=>{const t=e.writeError??(l=>{process.stderr.write(l)});let n;try{n=await r({allowWrites:e.allowWrites===!0,deployment:()=>k(e),docs:e.noDocs===!0?!1:{...e.docsUrl===void 0?{}:{baseUrl:e.docsUrl}},extraTools:$e(e.cwd),version:e.version})}catch(l){const a=l instanceof Error?l.message:String(l);return t(`lunora mcp serve: failed to start — ${a}
9
- `),{code:1,deployment:void 0}}const o=k(e);return t(Oe(o)),await Ce(n),{code:0,deployment:o}},xe=e=>{const r=[];return e.localOnly!==!0&&r.push(C),e.docsOnly!==!0&&r.push(O),r},Le=(e,r,t,n)=>{const o=G({key:e.key,name:r,path:t}),l=u(t,n.cwd);return o.action==="removed"?n.logger.success(`${e.label}: removed "${r}" from ${l}.`):o.action==="invalid"&&n.logger.error(`${e.label}: ${l} is not valid JSON (${o.error??"unknown error"}) — left untouched.`),{action:o.action,path:t}},Ue=(e,r,t,n)=>{const o=R({key:e.key,name:r,path:t}),l=u(t,n.cwd);return o==="invalid"?(n.logger.error(`${e.label}: ${l} is not valid JSON — a real run would report it and exit non-zero.`),{action:"invalid",path:t}):o==="absent"?{action:"absent",path:t}:(n.logger.info(`${e.label}: would remove "${r}" from ${l}.`),{action:"removed",path:t})},Me=(e,r,t)=>e.flatMap(n=>le(n,r)).filter(ce).filter(n=>t===void 0||n.scope===t),Ae=e=>{const r=e.home??y(),t=e.platform??process.platform,n=j(e.clients,()=>f,e.logger,"uninstall");if(n===void 0)return{code:d.USAGE,removed:[]};const o=xe(e);if(o.length===0)return e.logger.error("mcp uninstall: nothing to remove — `--docs-only` and `--local-only` are mutually exclusive, pass at most one."),{code:d.USAGE,removed:[]};const l=[],a={home:r,platform:t,projectRoot:e.cwd};for(const s of Me(n,a,e.scope))for(const i of o){const b=e.print===!0?Ue(s.client,i,s.path,e):Le(s.client,i,s.path,e);b.action!=="absent"&&l.push({...b,client:s.client.id,server:i})}return l.length===0?e.logger.info("Nothing to remove — no Lunora MCP servers were configured in the clients checked."):e.print===!0&&e.logger.info("Nothing was changed — re-run without --print to remove these."),{code:l.some(s=>s.action==="invalid")?1:0,removed:l}},E=e=>e.global===!0?"global":e.project===!0?"project":void 0,Ne=async(e,r)=>{const{code:t}=await _e({allowWrites:r.allowWrites===!0,cwd:e,noDocs:r.docs===!1,version:M,...r.docsUrl===void 0?{}:{docsUrl:r.docsUrl},...r.token===void 0?{}:{token:r.token},...r.url===void 0?{}:{url:r.url}});return{code:t}},Be=A(async({argument:e,cwd:r,logger:t,options:n})=>{const[o,...l]=e;if(o==="serve")return Ne(r,n);if(o==="uninstall"){const a=E(n),{code:s}=Ae({clients:l,cwd:r,docsOnly:n.docsOnly===!0,localOnly:n.localOnly===!0,logger:t,print:n.print===!0,...a===void 0?{}:{scope:a}});return{code:s}}if(o==="install"){if(n.list===!0)return he({cwd:r,logger:t});const a=E(n),{code:s}=we({clients:l,cwd:r,docsOnly:n.docsOnly===!0,force:n.force===!0,localOnly:n.localOnly===!0,logger:t,print:n.print===!0,...a===void 0?{}:{scope:a},...n.docsUrl===void 0?{}:{docsUrl:n.docsUrl}});return{code:s}}return t.error("mcp: unknown subcommand. Usage: lunora mcp <install|uninstall|serve>"),{code:d.USAGE}});export{Be as execute};
9
+ `),{code:1,deployment:void 0}}const o=k(e);return t(Ce(o)),await Oe(n),{code:0,deployment:o}},xe=e=>{const r=[];return e.localOnly!==!0&&r.push(O),e.docsOnly!==!0&&r.push(C),r},Le=(e,r,t,n)=>{const o=H({key:e.key,name:r,path:t}),l=u(t,n.cwd);return o.action==="removed"?n.logger.success(`${e.label}: removed "${r}" from ${l}.`):o.action==="invalid"&&n.logger.error(`${e.label}: ${l} is not valid JSON (${o.error??"unknown error"}) — left untouched.`),{action:o.action,path:t}},Ue=(e,r,t,n)=>{const o=R({key:e.key,name:r,path:t}),l=u(t,n.cwd);return o==="invalid"?(n.logger.error(`${e.label}: ${l} is not valid JSON — a real run would report it and exit non-zero.`),{action:"invalid",path:t}):o==="absent"?{action:"absent",path:t}:(n.logger.info(`${e.label}: would remove "${r}" from ${l}.`),{action:"removed",path:t})},Me=(e,r,t)=>e.flatMap(n=>le(n,r)).filter(ce).filter(n=>t===void 0||n.scope===t),Ae=e=>{const r=e.home??y(),t=e.platform??process.platform,n=j(e.clients,()=>f,e.logger,"uninstall");if(n===void 0)return{code:d.USAGE,removed:[]};const o=xe(e);if(o.length===0)return e.logger.error("mcp uninstall: nothing to remove — `--docs-only` and `--local-only` are mutually exclusive, pass at most one."),{code:d.USAGE,removed:[]};const l=[],a={home:r,platform:t,projectRoot:e.cwd};for(const s of Me(n,a,e.scope))for(const i of o){const b=e.print===!0?Ue(s.client,i,s.path,e):Le(s.client,i,s.path,e);b.action!=="absent"&&l.push({...b,client:s.client.id,server:i})}return l.length===0?e.logger.info("Nothing to remove — no Lunora MCP servers were configured in the clients checked."):e.print===!0&&e.logger.info("Nothing was changed — re-run without --print to remove these."),{code:l.some(s=>s.action==="invalid")?1:0,removed:l}},E=e=>e.global===!0?"global":e.project===!0?"project":void 0,Ne=async(e,r)=>{const{code:t}=await _e({allowWrites:r.allowWrites===!0,cwd:e,noDocs:r.docs===!1,version:M,...r.docsUrl===void 0?{}:{docsUrl:r.docsUrl},...r.token===void 0?{}:{token:r.token},...r.url===void 0?{}:{url:r.url}});return{code:t}},Be=A(async({argument:e,cwd:r,logger:t,options:n})=>{const[o,...l]=e;if(o==="serve")return Ne(r,n);if(o==="uninstall"){const a=E(n),{code:s}=Ae({clients:l,cwd:r,docsOnly:n.docsOnly===!0,localOnly:n.localOnly===!0,logger:t,print:n.print===!0,...a===void 0?{}:{scope:a}});return{code:s}}if(o==="install"){if(n.list===!0)return he({cwd:r,logger:t});const a=E(n),{code:s}=we({clients:l,cwd:r,docsOnly:n.docsOnly===!0,force:n.force===!0,localOnly:n.localOnly===!0,logger:t,print:n.print===!0,...a===void 0?{}:{scope:a},...n.docsUrl===void 0?{}:{docsUrl:n.docsUrl}});return{code:s}}return t.error("mcp: unknown subcommand. Usage: lunora mcp <install|uninstall|serve>"),{code:d.USAGE}});export{Be as execute};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/cli",
3
- "version": "1.0.0-alpha.409",
3
+ "version": "1.0.0-alpha.410",
4
4
  "description": "The Lunora CLI: init, dev, deploy, codegen, migrate, seed, doctor, insights, logs, registry, and the rest of the project commands",
5
5
  "keywords": [
6
6
  "agent-skills",
@@ -52,16 +52,16 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@bomb.sh/tab": "0.0.22",
55
- "@lunora/advisor": "1.0.0-alpha.242",
56
- "@lunora/bindings": "1.0.0-alpha.127",
57
- "@lunora/codegen": "1.0.0-alpha.335",
58
- "@lunora/config": "1.0.0-alpha.385",
59
- "@lunora/container": "1.0.0-alpha.86",
60
- "@lunora/d1": "1.0.0-alpha.194",
55
+ "@lunora/advisor": "1.0.0-alpha.243",
56
+ "@lunora/bindings": "1.0.0-alpha.128",
57
+ "@lunora/codegen": "1.0.0-alpha.336",
58
+ "@lunora/config": "1.0.0-alpha.386",
59
+ "@lunora/container": "1.0.0-alpha.87",
60
+ "@lunora/d1": "1.0.0-alpha.195",
61
61
  "@lunora/errors": ">=1.0.0-alpha.51 <2.0.0-0",
62
- "@lunora/mcp": "1.0.0-alpha.248",
63
- "@lunora/runtime": "1.0.0-alpha.224",
64
- "@lunora/seed": "1.0.0-alpha.242",
62
+ "@lunora/mcp": "1.0.0-alpha.249",
63
+ "@lunora/runtime": "1.0.0-alpha.225",
64
+ "@lunora/seed": "1.0.0-alpha.243",
65
65
  "@visulima/cerebro": "3.1.2",
66
66
  "@visulima/error": "6.1.0",
67
67
  "@visulima/fs": "6.0.29",